Linux kernel & device driver programming

Cross-Referenced Linux and Device Driver Code

[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ]
Version: [ 2.6.11.8 ] [ 2.6.25 ] [ 2.6.25.8 ] [ 2.6.31.13 ] Architecture: [ i386 ]
  1 /*
  2  * compat.c - A series of functions to make it easier to convert drivers that use
  3  *            the old isapnp APIs. If possible use the new APIs instead.
  4  *
  5  * Copyright 2002 Adam Belay <ambx1@neo.rr.com>
  6  */
  7 
  8 #include <linux/module.h>
  9 #include <linux/isapnp.h>
 10 #include <linux/string.h>
 11 
 12 static void pnp_convert_id(char *buf, unsigned short vendor,
 13                            unsigned short device)
 14 {
 15         sprintf(buf, "%c%c%c%x%x%x%x",
 16                 'A' + ((vendor >> 2) & 0x3f) - 1,
 17                 'A' + (((vendor & 3) << 3) | ((vendor >> 13) & 7)) - 1,
 18                 'A' + ((vendor >> 8) & 0x1f) - 1,
 19                 (device >> 4) & 0x0f, device & 0x0f,
 20                 (device >> 12) & 0x0f, (device >> 8) & 0x0f);
 21 }
 22 
 23 struct pnp_card *pnp_find_card(unsigned short vendor, unsigned short device,
 24                                struct pnp_card *from)
 25 {
 26         char id[8];
 27         char any[8];
 28         struct list_head *list;
 29 
 30         pnp_convert_id(id, vendor, device);
 31         pnp_convert_id(any, ISAPNP_ANY_ID, ISAPNP_ANY_ID);
 32 
 33         list = from ? from->global_list.next : pnp_cards.next;
 34 
 35         while (list != &pnp_cards) {
 36                 struct pnp_card *card = global_to_pnp_card(list);
 37 
 38                 if (compare_pnp_id(card->id, id) || (memcmp(id, any, 7) == 0))
 39                         return card;
 40                 list = list->next;
 41         }
 42         return NULL;
 43 }
 44 
 45 struct pnp_dev *pnp_find_dev(struct pnp_card *card, unsigned short vendor,
 46                              unsigned short function, struct pnp_dev *from)
 47 {
 48         char id[8];
 49         char any[8];
 50 
 51         pnp_convert_id(id, vendor, function);
 52         pnp_convert_id(any, ISAPNP_ANY_ID, ISAPNP_ANY_ID);
 53         if (card == NULL) {     /* look for a logical device from all cards */
 54                 struct list_head *list;
 55 
 56                 list = pnp_global.next;
 57                 if (from)
 58                         list = from->global_list.next;
 59 
 60                 while (list != &pnp_global) {
 61                         struct pnp_dev *dev = global_to_pnp_dev(list);
 62 
 63                         if (compare_pnp_id(dev->id, id) ||
 64                             (memcmp(id, any, 7) == 0))
 65                                 return dev;
 66                         list = list->next;
 67                 }
 68         } else {
 69                 struct list_head *list;
 70 
 71                 list = card->devices.next;
 72                 if (from) {
 73                         list = from->card_list.next;
 74                         if (from->card != card) /* something is wrong */
 75                                 return NULL;
 76                 }
 77                 while (list != &card->devices) {
 78                         struct pnp_dev *dev = card_to_pnp_dev(list);
 79 
 80                         if (compare_pnp_id(dev->id, id))
 81                                 return dev;
 82                         list = list->next;
 83                 }
 84         }
 85         return NULL;
 86 }
 87 
 88 EXPORT_SYMBOL(pnp_find_card);
 89 EXPORT_SYMBOL(pnp_find_dev);
 90 
  This page was automatically generated by the LXR engine.