| 1 | /* SPDX-License-Identifier: GPL-2.0 */ | 
|---|
| 2 | /* | 
|---|
| 3 | * Linux Plug and Play Support | 
|---|
| 4 | * Copyright by Adam Belay <ambx1@neo.rr.com> | 
|---|
| 5 | * Copyright (C) 2008 Hewlett-Packard Development Company, L.P. | 
|---|
| 6 | *	Bjorn Helgaas <bjorn.helgaas@hp.com> | 
|---|
| 7 | */ | 
|---|
| 8 |  | 
|---|
| 9 | #ifndef _LINUX_PNP_H | 
|---|
| 10 | #define _LINUX_PNP_H | 
|---|
| 11 |  | 
|---|
| 12 | #include <linux/device.h> | 
|---|
| 13 | #include <linux/list.h> | 
|---|
| 14 | #include <linux/errno.h> | 
|---|
| 15 | #include <linux/mod_devicetable.h> | 
|---|
| 16 | #include <linux/console.h> | 
|---|
| 17 |  | 
|---|
| 18 | #define PNP_NAME_LEN		50 | 
|---|
| 19 |  | 
|---|
| 20 | struct pnp_protocol; | 
|---|
| 21 | struct pnp_dev; | 
|---|
| 22 |  | 
|---|
| 23 | /* | 
|---|
| 24 | * Resource Management | 
|---|
| 25 | */ | 
|---|
| 26 | #ifdef CONFIG_PNP | 
|---|
| 27 | struct resource *pnp_get_resource(struct pnp_dev *dev, unsigned long type, | 
|---|
| 28 | unsigned int num); | 
|---|
| 29 | #else | 
|---|
| 30 | static inline struct resource *pnp_get_resource(struct pnp_dev *dev, | 
|---|
| 31 | unsigned long type, unsigned int num) | 
|---|
| 32 | { | 
|---|
| 33 | return NULL; | 
|---|
| 34 | } | 
|---|
| 35 | #endif | 
|---|
| 36 |  | 
|---|
| 37 | static inline int pnp_resource_valid(struct resource *res) | 
|---|
| 38 | { | 
|---|
| 39 | if (res) | 
|---|
| 40 | return 1; | 
|---|
| 41 | return 0; | 
|---|
| 42 | } | 
|---|
| 43 |  | 
|---|
| 44 | static inline int pnp_resource_enabled(struct resource *res) | 
|---|
| 45 | { | 
|---|
| 46 | if (res && !(res->flags & IORESOURCE_DISABLED)) | 
|---|
| 47 | return 1; | 
|---|
| 48 | return 0; | 
|---|
| 49 | } | 
|---|
| 50 |  | 
|---|
| 51 | static inline resource_size_t pnp_resource_len(struct resource *res) | 
|---|
| 52 | { | 
|---|
| 53 | if (res->start == 0 && res->end == 0) | 
|---|
| 54 | return 0; | 
|---|
| 55 | return resource_size(res); | 
|---|
| 56 | } | 
|---|
| 57 |  | 
|---|
| 58 |  | 
|---|
| 59 | static inline resource_size_t pnp_port_start(struct pnp_dev *dev, | 
|---|
| 60 | unsigned int bar) | 
|---|
| 61 | { | 
|---|
| 62 | struct resource *res = pnp_get_resource(dev, IORESOURCE_IO, num: bar); | 
|---|
| 63 |  | 
|---|
| 64 | if (pnp_resource_valid(res)) | 
|---|
| 65 | return res->start; | 
|---|
| 66 | return 0; | 
|---|
| 67 | } | 
|---|
| 68 |  | 
|---|
| 69 | static inline resource_size_t pnp_port_end(struct pnp_dev *dev, | 
|---|
| 70 | unsigned int bar) | 
|---|
| 71 | { | 
|---|
| 72 | struct resource *res = pnp_get_resource(dev, IORESOURCE_IO, num: bar); | 
|---|
| 73 |  | 
|---|
| 74 | if (pnp_resource_valid(res)) | 
|---|
| 75 | return res->end; | 
|---|
| 76 | return 0; | 
|---|
| 77 | } | 
|---|
| 78 |  | 
|---|
| 79 | static inline unsigned long pnp_port_flags(struct pnp_dev *dev, | 
|---|
| 80 | unsigned int bar) | 
|---|
| 81 | { | 
|---|
| 82 | struct resource *res = pnp_get_resource(dev, IORESOURCE_IO, num: bar); | 
|---|
| 83 |  | 
|---|
| 84 | if (pnp_resource_valid(res)) | 
|---|
| 85 | return res->flags; | 
|---|
| 86 | return IORESOURCE_IO | IORESOURCE_AUTO; | 
|---|
| 87 | } | 
|---|
| 88 |  | 
|---|
| 89 | static inline int pnp_port_valid(struct pnp_dev *dev, unsigned int bar) | 
|---|
| 90 | { | 
|---|
| 91 | return pnp_resource_valid(res: pnp_get_resource(dev, IORESOURCE_IO, num: bar)); | 
|---|
| 92 | } | 
|---|
| 93 |  | 
|---|
| 94 | static inline resource_size_t pnp_port_len(struct pnp_dev *dev, | 
|---|
| 95 | unsigned int bar) | 
|---|
| 96 | { | 
|---|
| 97 | struct resource *res = pnp_get_resource(dev, IORESOURCE_IO, num: bar); | 
|---|
| 98 |  | 
|---|
| 99 | if (pnp_resource_valid(res)) | 
|---|
| 100 | return pnp_resource_len(res); | 
|---|
| 101 | return 0; | 
|---|
| 102 | } | 
|---|
| 103 |  | 
|---|
| 104 |  | 
|---|
| 105 | static inline resource_size_t pnp_mem_start(struct pnp_dev *dev, | 
|---|
| 106 | unsigned int bar) | 
|---|
| 107 | { | 
|---|
| 108 | struct resource *res = pnp_get_resource(dev, IORESOURCE_MEM, num: bar); | 
|---|
| 109 |  | 
|---|
| 110 | if (pnp_resource_valid(res)) | 
|---|
| 111 | return res->start; | 
|---|
| 112 | return 0; | 
|---|
| 113 | } | 
|---|
| 114 |  | 
|---|
| 115 | static inline resource_size_t pnp_mem_end(struct pnp_dev *dev, | 
|---|
| 116 | unsigned int bar) | 
|---|
| 117 | { | 
|---|
| 118 | struct resource *res = pnp_get_resource(dev, IORESOURCE_MEM, num: bar); | 
|---|
| 119 |  | 
|---|
| 120 | if (pnp_resource_valid(res)) | 
|---|
| 121 | return res->end; | 
|---|
| 122 | return 0; | 
|---|
| 123 | } | 
|---|
| 124 |  | 
|---|
| 125 | static inline unsigned long pnp_mem_flags(struct pnp_dev *dev, unsigned int bar) | 
|---|
| 126 | { | 
|---|
| 127 | struct resource *res = pnp_get_resource(dev, IORESOURCE_MEM, num: bar); | 
|---|
| 128 |  | 
|---|
| 129 | if (pnp_resource_valid(res)) | 
|---|
| 130 | return res->flags; | 
|---|
| 131 | return IORESOURCE_MEM | IORESOURCE_AUTO; | 
|---|
| 132 | } | 
|---|
| 133 |  | 
|---|
| 134 | static inline int pnp_mem_valid(struct pnp_dev *dev, unsigned int bar) | 
|---|
| 135 | { | 
|---|
| 136 | return pnp_resource_valid(res: pnp_get_resource(dev, IORESOURCE_MEM, num: bar)); | 
|---|
| 137 | } | 
|---|
| 138 |  | 
|---|
| 139 | static inline resource_size_t pnp_mem_len(struct pnp_dev *dev, | 
|---|
| 140 | unsigned int bar) | 
|---|
| 141 | { | 
|---|
| 142 | struct resource *res = pnp_get_resource(dev, IORESOURCE_MEM, num: bar); | 
|---|
| 143 |  | 
|---|
| 144 | if (pnp_resource_valid(res)) | 
|---|
| 145 | return pnp_resource_len(res); | 
|---|
| 146 | return 0; | 
|---|
| 147 | } | 
|---|
| 148 |  | 
|---|
| 149 |  | 
|---|
| 150 | static inline resource_size_t pnp_irq(struct pnp_dev *dev, unsigned int bar) | 
|---|
| 151 | { | 
|---|
| 152 | struct resource *res = pnp_get_resource(dev, IORESOURCE_IRQ, num: bar); | 
|---|
| 153 |  | 
|---|
| 154 | if (pnp_resource_valid(res)) | 
|---|
| 155 | return res->start; | 
|---|
| 156 | return -1; | 
|---|
| 157 | } | 
|---|
| 158 |  | 
|---|
| 159 | static inline unsigned long pnp_irq_flags(struct pnp_dev *dev, unsigned int bar) | 
|---|
| 160 | { | 
|---|
| 161 | struct resource *res = pnp_get_resource(dev, IORESOURCE_IRQ, num: bar); | 
|---|
| 162 |  | 
|---|
| 163 | if (pnp_resource_valid(res)) | 
|---|
| 164 | return res->flags; | 
|---|
| 165 | return IORESOURCE_IRQ | IORESOURCE_AUTO; | 
|---|
| 166 | } | 
|---|
| 167 |  | 
|---|
| 168 | static inline int pnp_irq_valid(struct pnp_dev *dev, unsigned int bar) | 
|---|
| 169 | { | 
|---|
| 170 | return pnp_resource_valid(res: pnp_get_resource(dev, IORESOURCE_IRQ, num: bar)); | 
|---|
| 171 | } | 
|---|
| 172 |  | 
|---|
| 173 |  | 
|---|
| 174 | static inline resource_size_t pnp_dma(struct pnp_dev *dev, unsigned int bar) | 
|---|
| 175 | { | 
|---|
| 176 | struct resource *res = pnp_get_resource(dev, IORESOURCE_DMA, num: bar); | 
|---|
| 177 |  | 
|---|
| 178 | if (pnp_resource_valid(res)) | 
|---|
| 179 | return res->start; | 
|---|
| 180 | return -1; | 
|---|
| 181 | } | 
|---|
| 182 |  | 
|---|
| 183 | static inline unsigned long pnp_dma_flags(struct pnp_dev *dev, unsigned int bar) | 
|---|
| 184 | { | 
|---|
| 185 | struct resource *res = pnp_get_resource(dev, IORESOURCE_DMA, num: bar); | 
|---|
| 186 |  | 
|---|
| 187 | if (pnp_resource_valid(res)) | 
|---|
| 188 | return res->flags; | 
|---|
| 189 | return IORESOURCE_DMA | IORESOURCE_AUTO; | 
|---|
| 190 | } | 
|---|
| 191 |  | 
|---|
| 192 | static inline int pnp_dma_valid(struct pnp_dev *dev, unsigned int bar) | 
|---|
| 193 | { | 
|---|
| 194 | return pnp_resource_valid(res: pnp_get_resource(dev, IORESOURCE_DMA, num: bar)); | 
|---|
| 195 | } | 
|---|
| 196 |  | 
|---|
| 197 |  | 
|---|
| 198 | /* | 
|---|
| 199 | * Device Management | 
|---|
| 200 | */ | 
|---|
| 201 |  | 
|---|
| 202 | struct pnp_card { | 
|---|
| 203 | struct device dev;		/* Driver Model device interface */ | 
|---|
| 204 | unsigned char number;		/* used as an index, must be unique */ | 
|---|
| 205 | struct list_head global_list;	/* node in global list of cards */ | 
|---|
| 206 | struct list_head protocol_list;	/* node in protocol's list of cards */ | 
|---|
| 207 | struct list_head devices;	/* devices attached to the card */ | 
|---|
| 208 |  | 
|---|
| 209 | struct pnp_protocol *protocol; | 
|---|
| 210 | struct pnp_id *id;		/* contains supported EISA IDs */ | 
|---|
| 211 |  | 
|---|
| 212 | char name[PNP_NAME_LEN];	/* contains a human-readable name */ | 
|---|
| 213 | unsigned char pnpver;		/* Plug & Play version */ | 
|---|
| 214 | unsigned char productver;	/* product version */ | 
|---|
| 215 | unsigned int serial;		/* serial number */ | 
|---|
| 216 | unsigned char checksum;		/* if zero - checksum passed */ | 
|---|
| 217 | struct proc_dir_entry *procdir;	/* directory entry in /proc/bus/isapnp */ | 
|---|
| 218 | }; | 
|---|
| 219 |  | 
|---|
| 220 | #define global_to_pnp_card(n) list_entry(n, struct pnp_card, global_list) | 
|---|
| 221 | #define protocol_to_pnp_card(n) list_entry(n, struct pnp_card, protocol_list) | 
|---|
| 222 | #define to_pnp_card(n) container_of(n, struct pnp_card, dev) | 
|---|
| 223 | #define pnp_for_each_card(card)	\ | 
|---|
| 224 | list_for_each_entry(card, &pnp_cards, global_list) | 
|---|
| 225 |  | 
|---|
| 226 | struct pnp_card_link { | 
|---|
| 227 | struct pnp_card *card; | 
|---|
| 228 | struct pnp_card_driver *driver; | 
|---|
| 229 | void *driver_data; | 
|---|
| 230 | pm_message_t pm_state; | 
|---|
| 231 | }; | 
|---|
| 232 |  | 
|---|
| 233 | static inline void *pnp_get_card_drvdata(struct pnp_card_link *pcard) | 
|---|
| 234 | { | 
|---|
| 235 | return pcard->driver_data; | 
|---|
| 236 | } | 
|---|
| 237 |  | 
|---|
| 238 | static inline void pnp_set_card_drvdata(struct pnp_card_link *pcard, void *data) | 
|---|
| 239 | { | 
|---|
| 240 | pcard->driver_data = data; | 
|---|
| 241 | } | 
|---|
| 242 |  | 
|---|
| 243 | struct pnp_dev { | 
|---|
| 244 | struct device dev;		/* Driver Model device interface */ | 
|---|
| 245 | u64 dma_mask; | 
|---|
| 246 | unsigned int number;		/* used as an index, must be unique */ | 
|---|
| 247 | int status; | 
|---|
| 248 |  | 
|---|
| 249 | struct list_head global_list;	/* node in global list of devices */ | 
|---|
| 250 | struct list_head protocol_list;	/* node in list of device's protocol */ | 
|---|
| 251 | struct list_head card_list;	/* node in card's list of devices */ | 
|---|
| 252 | struct list_head rdev_list;	/* node in cards list of requested devices */ | 
|---|
| 253 |  | 
|---|
| 254 | struct pnp_protocol *protocol; | 
|---|
| 255 | struct pnp_card *card;	/* card the device is attached to, none if NULL */ | 
|---|
| 256 | struct pnp_driver *driver; | 
|---|
| 257 | struct pnp_card_link *card_link; | 
|---|
| 258 |  | 
|---|
| 259 | struct pnp_id *id;		/* supported EISA IDs */ | 
|---|
| 260 |  | 
|---|
| 261 | int active; | 
|---|
| 262 | int capabilities; | 
|---|
| 263 | unsigned int num_dependent_sets; | 
|---|
| 264 | struct list_head resources; | 
|---|
| 265 | struct list_head options; | 
|---|
| 266 |  | 
|---|
| 267 | char name[PNP_NAME_LEN];	/* contains a human-readable name */ | 
|---|
| 268 | int flags;			/* used by protocols */ | 
|---|
| 269 | struct proc_dir_entry *procent;	/* device entry in /proc/bus/isapnp */ | 
|---|
| 270 | void *data; | 
|---|
| 271 | }; | 
|---|
| 272 |  | 
|---|
| 273 | #define global_to_pnp_dev(n) list_entry(n, struct pnp_dev, global_list) | 
|---|
| 274 | #define card_to_pnp_dev(n) list_entry(n, struct pnp_dev, card_list) | 
|---|
| 275 | #define protocol_to_pnp_dev(n) list_entry(n, struct pnp_dev, protocol_list) | 
|---|
| 276 | #define	to_pnp_dev(n) container_of(n, struct pnp_dev, dev) | 
|---|
| 277 | #define pnp_for_each_dev(dev) list_for_each_entry(dev, &pnp_global, global_list) | 
|---|
| 278 | #define card_for_each_dev(card, dev)	\ | 
|---|
| 279 | list_for_each_entry(dev, &(card)->devices, card_list) | 
|---|
| 280 | #define pnp_dev_name(dev) (dev)->name | 
|---|
| 281 |  | 
|---|
| 282 | static inline void *pnp_get_drvdata(struct pnp_dev *pdev) | 
|---|
| 283 | { | 
|---|
| 284 | return dev_get_drvdata(dev: &pdev->dev); | 
|---|
| 285 | } | 
|---|
| 286 |  | 
|---|
| 287 | static inline void pnp_set_drvdata(struct pnp_dev *pdev, void *data) | 
|---|
| 288 | { | 
|---|
| 289 | dev_set_drvdata(dev: &pdev->dev, data); | 
|---|
| 290 | } | 
|---|
| 291 |  | 
|---|
| 292 | struct pnp_fixup { | 
|---|
| 293 | char id[8]; | 
|---|
| 294 | void (*quirk_function) (struct pnp_dev *dev);	/* fixup function */ | 
|---|
| 295 | }; | 
|---|
| 296 |  | 
|---|
| 297 | /* config parameters */ | 
|---|
| 298 | #define PNP_CONFIG_NORMAL	0x0001 | 
|---|
| 299 | #define PNP_CONFIG_FORCE	0x0002	/* disables validity checking */ | 
|---|
| 300 |  | 
|---|
| 301 | /* capabilities */ | 
|---|
| 302 | #define PNP_READ		0x0001 | 
|---|
| 303 | #define PNP_WRITE		0x0002 | 
|---|
| 304 | #define PNP_DISABLE		0x0004 | 
|---|
| 305 | #define PNP_CONFIGURABLE	0x0008 | 
|---|
| 306 | #define PNP_REMOVABLE		0x0010 | 
|---|
| 307 | #define PNP_CONSOLE		0x0020 | 
|---|
| 308 |  | 
|---|
| 309 | #define pnp_can_read(dev)	(((dev)->protocol->get) && \ | 
|---|
| 310 | ((dev)->capabilities & PNP_READ)) | 
|---|
| 311 | #define pnp_can_write(dev)	(((dev)->protocol->set) && \ | 
|---|
| 312 | ((dev)->capabilities & PNP_WRITE)) | 
|---|
| 313 | #define pnp_can_disable(dev)	(((dev)->protocol->disable) &&		  \ | 
|---|
| 314 | ((dev)->capabilities & PNP_DISABLE) &&	  \ | 
|---|
| 315 | (!((dev)->capabilities & PNP_CONSOLE) || \ | 
|---|
| 316 | console_suspend_enabled)) | 
|---|
| 317 | #define pnp_can_configure(dev)	((!(dev)->active) && \ | 
|---|
| 318 | ((dev)->capabilities & PNP_CONFIGURABLE)) | 
|---|
| 319 | #define pnp_can_suspend(dev)	(((dev)->protocol->suspend) &&		  \ | 
|---|
| 320 | (!((dev)->capabilities & PNP_CONSOLE) || \ | 
|---|
| 321 | console_suspend_enabled)) | 
|---|
| 322 |  | 
|---|
| 323 |  | 
|---|
| 324 | #ifdef CONFIG_ISAPNP | 
|---|
| 325 | extern struct pnp_protocol isapnp_protocol; | 
|---|
| 326 | #define pnp_device_is_isapnp(dev) ((dev)->protocol == (&isapnp_protocol)) | 
|---|
| 327 | #else | 
|---|
| 328 | #define pnp_device_is_isapnp(dev) 0 | 
|---|
| 329 | #endif | 
|---|
| 330 | extern struct mutex pnp_res_mutex; | 
|---|
| 331 |  | 
|---|
| 332 | #ifdef CONFIG_PNPBIOS | 
|---|
| 333 | extern struct pnp_protocol pnpbios_protocol; | 
|---|
| 334 | extern bool arch_pnpbios_disabled(void); | 
|---|
| 335 | #define pnp_device_is_pnpbios(dev) ((dev)->protocol == (&pnpbios_protocol)) | 
|---|
| 336 | #else | 
|---|
| 337 | #define pnp_device_is_pnpbios(dev) 0 | 
|---|
| 338 | #define arch_pnpbios_disabled()	false | 
|---|
| 339 | #endif | 
|---|
| 340 |  | 
|---|
| 341 | #ifdef CONFIG_PNPACPI | 
|---|
| 342 | extern struct pnp_protocol pnpacpi_protocol; | 
|---|
| 343 |  | 
|---|
| 344 | static inline struct acpi_device *pnp_acpi_device(struct pnp_dev *dev) | 
|---|
| 345 | { | 
|---|
| 346 | if (dev->protocol == &pnpacpi_protocol) | 
|---|
| 347 | return dev->data; | 
|---|
| 348 | return NULL; | 
|---|
| 349 | } | 
|---|
| 350 | #else | 
|---|
| 351 | #define pnp_acpi_device(dev) 0 | 
|---|
| 352 | #endif | 
|---|
| 353 |  | 
|---|
| 354 | /* status */ | 
|---|
| 355 | #define PNP_READY		0x0000 | 
|---|
| 356 | #define PNP_ATTACHED		0x0001 | 
|---|
| 357 | #define PNP_BUSY		0x0002 | 
|---|
| 358 | #define PNP_FAULTY		0x0004 | 
|---|
| 359 |  | 
|---|
| 360 | /* isapnp specific macros */ | 
|---|
| 361 |  | 
|---|
| 362 | #define isapnp_card_number(dev)	((dev)->card ? (dev)->card->number : -1) | 
|---|
| 363 | #define isapnp_csn_number(dev)  ((dev)->number) | 
|---|
| 364 |  | 
|---|
| 365 | /* | 
|---|
| 366 | * Driver Management | 
|---|
| 367 | */ | 
|---|
| 368 |  | 
|---|
| 369 | struct pnp_id { | 
|---|
| 370 | char id[PNP_ID_LEN]; | 
|---|
| 371 | struct pnp_id *next; | 
|---|
| 372 | }; | 
|---|
| 373 |  | 
|---|
| 374 | struct pnp_driver { | 
|---|
| 375 | const char *name; | 
|---|
| 376 | const struct pnp_device_id *id_table; | 
|---|
| 377 | unsigned int flags; | 
|---|
| 378 | int (*probe) (struct pnp_dev *dev, const struct pnp_device_id *dev_id); | 
|---|
| 379 | void (*remove) (struct pnp_dev *dev); | 
|---|
| 380 | void (*shutdown) (struct pnp_dev *dev); | 
|---|
| 381 | int (*suspend) (struct pnp_dev *dev, pm_message_t state); | 
|---|
| 382 | int (*resume) (struct pnp_dev *dev); | 
|---|
| 383 | struct device_driver driver; | 
|---|
| 384 | }; | 
|---|
| 385 |  | 
|---|
| 386 | #define	to_pnp_driver(drv) container_of_const(drv, struct pnp_driver, driver) | 
|---|
| 387 |  | 
|---|
| 388 | struct pnp_card_driver { | 
|---|
| 389 | struct list_head global_list; | 
|---|
| 390 | char *name; | 
|---|
| 391 | const struct pnp_card_device_id *id_table; | 
|---|
| 392 | unsigned int flags; | 
|---|
| 393 | int (*probe) (struct pnp_card_link *card, | 
|---|
| 394 | const struct pnp_card_device_id *card_id); | 
|---|
| 395 | void (*remove) (struct pnp_card_link *card); | 
|---|
| 396 | int (*suspend) (struct pnp_card_link *card, pm_message_t state); | 
|---|
| 397 | int (*resume) (struct pnp_card_link *card); | 
|---|
| 398 | struct pnp_driver link; | 
|---|
| 399 | }; | 
|---|
| 400 |  | 
|---|
| 401 | #define	to_pnp_card_driver(drv) container_of(drv, struct pnp_card_driver, link) | 
|---|
| 402 |  | 
|---|
| 403 | /* pnp driver flags */ | 
|---|
| 404 | #define PNP_DRIVER_RES_DO_NOT_CHANGE	0x0001	/* do not change the state of the device */ | 
|---|
| 405 | #define PNP_DRIVER_RES_DISABLE		0x0003	/* ensure the device is disabled */ | 
|---|
| 406 |  | 
|---|
| 407 | /* | 
|---|
| 408 | * Protocol Management | 
|---|
| 409 | */ | 
|---|
| 410 |  | 
|---|
| 411 | struct pnp_protocol { | 
|---|
| 412 | struct list_head protocol_list; | 
|---|
| 413 | char *name; | 
|---|
| 414 |  | 
|---|
| 415 | /* resource control functions */ | 
|---|
| 416 | int (*get) (struct pnp_dev *dev); | 
|---|
| 417 | int (*set) (struct pnp_dev *dev); | 
|---|
| 418 | int (*disable) (struct pnp_dev *dev); | 
|---|
| 419 |  | 
|---|
| 420 | /* protocol specific suspend/resume */ | 
|---|
| 421 | bool (*can_wakeup) (struct pnp_dev *dev); | 
|---|
| 422 | int (*suspend) (struct pnp_dev *dev, pm_message_t state); | 
|---|
| 423 | int (*resume) (struct pnp_dev *dev); | 
|---|
| 424 |  | 
|---|
| 425 | /* used by pnp layer only (look but don't touch) */ | 
|---|
| 426 | unsigned char number;	/* protocol number */ | 
|---|
| 427 | struct device dev;	/* link to driver model */ | 
|---|
| 428 | struct list_head cards; | 
|---|
| 429 | struct list_head devices; | 
|---|
| 430 | }; | 
|---|
| 431 |  | 
|---|
| 432 | #define to_pnp_protocol(n) list_entry(n, struct pnp_protocol, protocol_list) | 
|---|
| 433 | #define protocol_for_each_card(protocol, card)	\ | 
|---|
| 434 | list_for_each_entry(card, &(protocol)->cards, protocol_list) | 
|---|
| 435 | #define protocol_for_each_dev(protocol, dev)	\ | 
|---|
| 436 | list_for_each_entry(dev, &(protocol)->devices, protocol_list) | 
|---|
| 437 |  | 
|---|
| 438 | #if defined(CONFIG_PNP) | 
|---|
| 439 |  | 
|---|
| 440 | /* device management */ | 
|---|
| 441 | int pnp_device_attach(struct pnp_dev *pnp_dev); | 
|---|
| 442 | void pnp_device_detach(struct pnp_dev *pnp_dev); | 
|---|
| 443 | extern struct list_head pnp_global; | 
|---|
| 444 | extern int pnp_platform_devices; | 
|---|
| 445 |  | 
|---|
| 446 | /* multidevice card support */ | 
|---|
| 447 | struct pnp_dev *pnp_request_card_device(struct pnp_card_link *clink, | 
|---|
| 448 | const char *id, struct pnp_dev *from); | 
|---|
| 449 | void pnp_release_card_device(struct pnp_dev *dev); | 
|---|
| 450 | int pnp_register_card_driver(struct pnp_card_driver *drv); | 
|---|
| 451 | void pnp_unregister_card_driver(struct pnp_card_driver *drv); | 
|---|
| 452 | extern struct list_head pnp_cards; | 
|---|
| 453 |  | 
|---|
| 454 | /* resource management */ | 
|---|
| 455 | int pnp_possible_config(struct pnp_dev *dev, int type, resource_size_t base, | 
|---|
| 456 | resource_size_t size); | 
|---|
| 457 | int pnp_auto_config_dev(struct pnp_dev *dev); | 
|---|
| 458 | int pnp_start_dev(struct pnp_dev *dev); | 
|---|
| 459 | int pnp_stop_dev(struct pnp_dev *dev); | 
|---|
| 460 | int pnp_activate_dev(struct pnp_dev *dev); | 
|---|
| 461 | int pnp_disable_dev(struct pnp_dev *dev); | 
|---|
| 462 | int pnp_range_reserved(resource_size_t start, resource_size_t end); | 
|---|
| 463 |  | 
|---|
| 464 | /* protocol helpers */ | 
|---|
| 465 | int pnp_is_active(struct pnp_dev *dev); | 
|---|
| 466 | int compare_pnp_id(struct pnp_id *pos, const char *id); | 
|---|
| 467 | int pnp_register_driver(struct pnp_driver *drv); | 
|---|
| 468 | void pnp_unregister_driver(struct pnp_driver *drv); | 
|---|
| 469 |  | 
|---|
| 470 | bool dev_is_pnp(const struct device *dev); | 
|---|
| 471 |  | 
|---|
| 472 | #else | 
|---|
| 473 |  | 
|---|
| 474 | /* device management */ | 
|---|
| 475 | static inline int pnp_device_attach(struct pnp_dev *pnp_dev) { return -ENODEV; } | 
|---|
| 476 | static inline void pnp_device_detach(struct pnp_dev *pnp_dev) { } | 
|---|
| 477 |  | 
|---|
| 478 | #define pnp_platform_devices 0 | 
|---|
| 479 |  | 
|---|
| 480 | /* multidevice card support */ | 
|---|
| 481 | static inline struct pnp_dev *pnp_request_card_device(struct pnp_card_link *clink, const char *id, struct pnp_dev *from) { return NULL; } | 
|---|
| 482 | static inline void pnp_release_card_device(struct pnp_dev *dev) { } | 
|---|
| 483 | static inline int pnp_register_card_driver(struct pnp_card_driver *drv) { return -ENODEV; } | 
|---|
| 484 | static inline void pnp_unregister_card_driver(struct pnp_card_driver *drv) { } | 
|---|
| 485 |  | 
|---|
| 486 | /* resource management */ | 
|---|
| 487 | static inline int pnp_possible_config(struct pnp_dev *dev, int type, | 
|---|
| 488 | resource_size_t base, | 
|---|
| 489 | resource_size_t size) { return 0; } | 
|---|
| 490 | static inline int pnp_auto_config_dev(struct pnp_dev *dev) { return -ENODEV; } | 
|---|
| 491 | static inline int pnp_start_dev(struct pnp_dev *dev) { return -ENODEV; } | 
|---|
| 492 | static inline int pnp_stop_dev(struct pnp_dev *dev) { return -ENODEV; } | 
|---|
| 493 | static inline int pnp_activate_dev(struct pnp_dev *dev) { return -ENODEV; } | 
|---|
| 494 | static inline int pnp_disable_dev(struct pnp_dev *dev) { return -ENODEV; } | 
|---|
| 495 | static inline int pnp_range_reserved(resource_size_t start, resource_size_t end) { return 0; } | 
|---|
| 496 |  | 
|---|
| 497 | /* protocol helpers */ | 
|---|
| 498 | static inline int pnp_is_active(struct pnp_dev *dev) { return 0; } | 
|---|
| 499 | static inline int compare_pnp_id(struct pnp_id *pos, const char *id) { return -ENODEV; } | 
|---|
| 500 | static inline int pnp_register_driver(struct pnp_driver *drv) { return -ENODEV; } | 
|---|
| 501 | static inline void pnp_unregister_driver(struct pnp_driver *drv) { } | 
|---|
| 502 |  | 
|---|
| 503 | static inline bool dev_is_pnp(const struct device *dev) { return false; } | 
|---|
| 504 |  | 
|---|
| 505 | #endif /* CONFIG_PNP */ | 
|---|
| 506 |  | 
|---|
| 507 | /** | 
|---|
| 508 | * module_pnp_driver() - Helper macro for registering a PnP driver | 
|---|
| 509 | * @__pnp_driver: pnp_driver struct | 
|---|
| 510 | * | 
|---|
| 511 | * Helper macro for PnP drivers which do not do anything special in module | 
|---|
| 512 | * init/exit. This eliminates a lot of boilerplate. Each module may only | 
|---|
| 513 | * use this macro once, and calling it replaces module_init() and module_exit() | 
|---|
| 514 | */ | 
|---|
| 515 | #define module_pnp_driver(__pnp_driver) \ | 
|---|
| 516 | module_driver(__pnp_driver, pnp_register_driver, \ | 
|---|
| 517 | pnp_unregister_driver) | 
|---|
| 518 |  | 
|---|
| 519 | #endif /* _LINUX_PNP_H */ | 
|---|
| 520 |  | 
|---|