0001
0002
0003
0004
0005
0006
0007 extern struct mutex pnp_lock;
0008 extern const struct attribute_group *pnp_dev_groups[];
0009
0010 int pnp_register_protocol(struct pnp_protocol *protocol);
0011 void pnp_unregister_protocol(struct pnp_protocol *protocol);
0012
0013 #define PNP_EISA_ID_MASK 0x7fffffff
0014 void pnp_eisa_id_to_string(u32 id, char *str);
0015 struct pnp_dev *pnp_alloc_dev(struct pnp_protocol *, int id,
0016 const char *pnpid);
0017 struct pnp_card *pnp_alloc_card(struct pnp_protocol *, int id, char *pnpid);
0018
0019 int pnp_add_device(struct pnp_dev *dev);
0020 struct pnp_id *pnp_add_id(struct pnp_dev *dev, const char *id);
0021
0022 int pnp_add_card(struct pnp_card *card);
0023 void pnp_remove_card(struct pnp_card *card);
0024 int pnp_add_card_device(struct pnp_card *card, struct pnp_dev *dev);
0025 void pnp_remove_card_device(struct pnp_dev *dev);
0026
0027 struct pnp_port {
0028 resource_size_t min;
0029 resource_size_t max;
0030 resource_size_t align;
0031 resource_size_t size;
0032 unsigned char flags;
0033 };
0034
0035 #define PNP_IRQ_NR 256
0036 typedef struct { DECLARE_BITMAP(bits, PNP_IRQ_NR); } pnp_irq_mask_t;
0037
0038 struct pnp_irq {
0039 pnp_irq_mask_t map;
0040 unsigned char flags;
0041 };
0042
0043 struct pnp_dma {
0044 unsigned char map;
0045 unsigned char flags;
0046 };
0047
0048 struct pnp_mem {
0049 resource_size_t min;
0050 resource_size_t max;
0051 resource_size_t align;
0052 resource_size_t size;
0053 unsigned char flags;
0054 };
0055
0056 #define PNP_OPTION_DEPENDENT 0x80000000
0057 #define PNP_OPTION_SET_MASK 0xffff
0058 #define PNP_OPTION_SET_SHIFT 12
0059 #define PNP_OPTION_PRIORITY_MASK 0xfff
0060 #define PNP_OPTION_PRIORITY_SHIFT 0
0061
0062 #define PNP_RES_PRIORITY_PREFERRED 0
0063 #define PNP_RES_PRIORITY_ACCEPTABLE 1
0064 #define PNP_RES_PRIORITY_FUNCTIONAL 2
0065 #define PNP_RES_PRIORITY_INVALID PNP_OPTION_PRIORITY_MASK
0066
0067 struct pnp_option {
0068 struct list_head list;
0069 unsigned int flags;
0070
0071 unsigned long type;
0072 union {
0073 struct pnp_port port;
0074 struct pnp_irq irq;
0075 struct pnp_dma dma;
0076 struct pnp_mem mem;
0077 } u;
0078 };
0079
0080 int pnp_register_irq_resource(struct pnp_dev *dev, unsigned int option_flags,
0081 pnp_irq_mask_t *map, unsigned char flags);
0082 int pnp_register_dma_resource(struct pnp_dev *dev, unsigned int option_flags,
0083 unsigned char map, unsigned char flags);
0084 int pnp_register_port_resource(struct pnp_dev *dev, unsigned int option_flags,
0085 resource_size_t min, resource_size_t max,
0086 resource_size_t align, resource_size_t size,
0087 unsigned char flags);
0088 int pnp_register_mem_resource(struct pnp_dev *dev, unsigned int option_flags,
0089 resource_size_t min, resource_size_t max,
0090 resource_size_t align, resource_size_t size,
0091 unsigned char flags);
0092
0093 static inline int pnp_option_is_dependent(struct pnp_option *option)
0094 {
0095 return option->flags & PNP_OPTION_DEPENDENT ? 1 : 0;
0096 }
0097
0098 static inline unsigned int pnp_option_set(struct pnp_option *option)
0099 {
0100 return (option->flags >> PNP_OPTION_SET_SHIFT) & PNP_OPTION_SET_MASK;
0101 }
0102
0103 static inline unsigned int pnp_option_priority(struct pnp_option *option)
0104 {
0105 return (option->flags >> PNP_OPTION_PRIORITY_SHIFT) &
0106 PNP_OPTION_PRIORITY_MASK;
0107 }
0108
0109 static inline unsigned int pnp_new_dependent_set(struct pnp_dev *dev,
0110 int priority)
0111 {
0112 unsigned int flags;
0113
0114 if (priority > PNP_RES_PRIORITY_FUNCTIONAL) {
0115 dev_warn(&dev->dev, "invalid dependent option priority %d "
0116 "clipped to %d", priority,
0117 PNP_RES_PRIORITY_INVALID);
0118 priority = PNP_RES_PRIORITY_INVALID;
0119 }
0120
0121 flags = PNP_OPTION_DEPENDENT |
0122 ((dev->num_dependent_sets & PNP_OPTION_SET_MASK) <<
0123 PNP_OPTION_SET_SHIFT) |
0124 ((priority & PNP_OPTION_PRIORITY_MASK) <<
0125 PNP_OPTION_PRIORITY_SHIFT);
0126
0127 dev->num_dependent_sets++;
0128
0129 return flags;
0130 }
0131
0132 char *pnp_option_priority_name(struct pnp_option *option);
0133 void dbg_pnp_show_option(struct pnp_dev *dev, struct pnp_option *option);
0134
0135 void pnp_init_resources(struct pnp_dev *dev);
0136
0137 void pnp_fixup_device(struct pnp_dev *dev);
0138 void pnp_free_options(struct pnp_dev *dev);
0139 int __pnp_add_device(struct pnp_dev *dev);
0140 void __pnp_remove_device(struct pnp_dev *dev);
0141
0142 int pnp_check_port(struct pnp_dev *dev, struct resource *res);
0143 int pnp_check_mem(struct pnp_dev *dev, struct resource *res);
0144 int pnp_check_irq(struct pnp_dev *dev, struct resource *res);
0145 #ifdef CONFIG_ISA_DMA_API
0146 int pnp_check_dma(struct pnp_dev *dev, struct resource *res);
0147 #endif
0148
0149 char *pnp_resource_type_name(struct resource *res);
0150 void dbg_pnp_show_resources(struct pnp_dev *dev, char *desc);
0151
0152 void pnp_free_resources(struct pnp_dev *dev);
0153 unsigned long pnp_resource_type(struct resource *res);
0154
0155 struct pnp_resource {
0156 struct list_head list;
0157 struct resource res;
0158 };
0159
0160 void pnp_free_resource(struct pnp_resource *pnp_res);
0161
0162 struct pnp_resource *pnp_add_resource(struct pnp_dev *dev,
0163 struct resource *res);
0164 struct pnp_resource *pnp_add_irq_resource(struct pnp_dev *dev, int irq,
0165 int flags);
0166 struct pnp_resource *pnp_add_dma_resource(struct pnp_dev *dev, int dma,
0167 int flags);
0168 struct pnp_resource *pnp_add_io_resource(struct pnp_dev *dev,
0169 resource_size_t start,
0170 resource_size_t end, int flags);
0171 struct pnp_resource *pnp_add_mem_resource(struct pnp_dev *dev,
0172 resource_size_t start,
0173 resource_size_t end, int flags);
0174 struct pnp_resource *pnp_add_bus_resource(struct pnp_dev *dev,
0175 resource_size_t start,
0176 resource_size_t end);
0177
0178 extern int pnp_debug;
0179
0180 #if defined(CONFIG_PNP_DEBUG_MESSAGES)
0181 #define pnp_dbg(dev, format, arg...) \
0182 ({ if (pnp_debug) dev_printk(KERN_DEBUG, dev, format, ## arg); 0; })
0183 #else
0184 #define pnp_dbg(dev, format, arg...) \
0185 ({ if (0) dev_printk(KERN_DEBUG, dev, format, ## arg); 0; })
0186 #endif