1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */
21f32ca31SBjorn Helgaas /*
31f32ca31SBjorn Helgaas * Copyright (C) 2008 Hewlett-Packard Development Company, L.P.
41f32ca31SBjorn Helgaas * Bjorn Helgaas <bjorn.helgaas@hp.com>
51f32ca31SBjorn Helgaas */
61f32ca31SBjorn Helgaas
738f6b38dSRafael J. Wysocki extern struct mutex pnp_lock;
82df43901SGreg Kroah-Hartman extern const struct attribute_group *pnp_dev_groups[];
962cfb298SBjorn Helgaas
1062cfb298SBjorn Helgaas int pnp_register_protocol(struct pnp_protocol *protocol);
1162cfb298SBjorn Helgaas void pnp_unregister_protocol(struct pnp_protocol *protocol);
1262cfb298SBjorn Helgaas
1325eb8461SBjorn Helgaas #define PNP_EISA_ID_MASK 0x7fffffff
1425eb8461SBjorn Helgaas void pnp_eisa_id_to_string(u32 id, char *str);
15620e112cSThomas Renninger struct pnp_dev *pnp_alloc_dev(struct pnp_protocol *, int id,
16620e112cSThomas Renninger const char *pnpid);
176bf2aab2SBjorn Helgaas struct pnp_card *pnp_alloc_card(struct pnp_protocol *, int id, char *pnpid);
1862cfb298SBjorn Helgaas
1962cfb298SBjorn Helgaas int pnp_add_device(struct pnp_dev *dev);
20620e112cSThomas Renninger struct pnp_id *pnp_add_id(struct pnp_dev *dev, const char *id);
2162cfb298SBjorn Helgaas
2262cfb298SBjorn Helgaas int pnp_add_card(struct pnp_card *card);
2362cfb298SBjorn Helgaas void pnp_remove_card(struct pnp_card *card);
2462cfb298SBjorn Helgaas int pnp_add_card_device(struct pnp_card *card, struct pnp_dev *dev);
2562cfb298SBjorn Helgaas void pnp_remove_card_device(struct pnp_dev *dev);
2662cfb298SBjorn Helgaas
27a1802c42SBjorn Helgaas struct pnp_port {
28169aaffeSBjorn Helgaas resource_size_t min; /* min base number */
29169aaffeSBjorn Helgaas resource_size_t max; /* max base number */
30169aaffeSBjorn Helgaas resource_size_t align; /* align boundary */
31169aaffeSBjorn Helgaas resource_size_t size; /* size of range */
32a1802c42SBjorn Helgaas unsigned char flags; /* port flags */
33a1802c42SBjorn Helgaas };
34a1802c42SBjorn Helgaas
35a1802c42SBjorn Helgaas #define PNP_IRQ_NR 256
367aefff51SBjorn Helgaas typedef struct { DECLARE_BITMAP(bits, PNP_IRQ_NR); } pnp_irq_mask_t;
377aefff51SBjorn Helgaas
38a1802c42SBjorn Helgaas struct pnp_irq {
397aefff51SBjorn Helgaas pnp_irq_mask_t map; /* bitmap for IRQ lines */
40a1802c42SBjorn Helgaas unsigned char flags; /* IRQ flags */
41a1802c42SBjorn Helgaas };
42a1802c42SBjorn Helgaas
43a1802c42SBjorn Helgaas struct pnp_dma {
44a1802c42SBjorn Helgaas unsigned char map; /* bitmask for DMA channels */
45a1802c42SBjorn Helgaas unsigned char flags; /* DMA flags */
46a1802c42SBjorn Helgaas };
47a1802c42SBjorn Helgaas
48a1802c42SBjorn Helgaas struct pnp_mem {
49169aaffeSBjorn Helgaas resource_size_t min; /* min base number */
50169aaffeSBjorn Helgaas resource_size_t max; /* max base number */
51169aaffeSBjorn Helgaas resource_size_t align; /* align boundary */
52169aaffeSBjorn Helgaas resource_size_t size; /* size of range */
53a1802c42SBjorn Helgaas unsigned char flags; /* memory flags */
54a1802c42SBjorn Helgaas };
55a1802c42SBjorn Helgaas
561f32ca31SBjorn Helgaas #define PNP_OPTION_DEPENDENT 0x80000000
571f32ca31SBjorn Helgaas #define PNP_OPTION_SET_MASK 0xffff
581f32ca31SBjorn Helgaas #define PNP_OPTION_SET_SHIFT 12
591f32ca31SBjorn Helgaas #define PNP_OPTION_PRIORITY_MASK 0xfff
601f32ca31SBjorn Helgaas #define PNP_OPTION_PRIORITY_SHIFT 0
611f32ca31SBjorn Helgaas
62a1802c42SBjorn Helgaas #define PNP_RES_PRIORITY_PREFERRED 0
63a1802c42SBjorn Helgaas #define PNP_RES_PRIORITY_ACCEPTABLE 1
64a1802c42SBjorn Helgaas #define PNP_RES_PRIORITY_FUNCTIONAL 2
651f32ca31SBjorn Helgaas #define PNP_RES_PRIORITY_INVALID PNP_OPTION_PRIORITY_MASK
66a1802c42SBjorn Helgaas
67a1802c42SBjorn Helgaas struct pnp_option {
681f32ca31SBjorn Helgaas struct list_head list;
691f32ca31SBjorn Helgaas unsigned int flags; /* independent/dependent, set, priority */
701f32ca31SBjorn Helgaas
711f32ca31SBjorn Helgaas unsigned long type; /* IORESOURCE_{IO,MEM,IRQ,DMA} */
721f32ca31SBjorn Helgaas union {
731f32ca31SBjorn Helgaas struct pnp_port port;
741f32ca31SBjorn Helgaas struct pnp_irq irq;
751f32ca31SBjorn Helgaas struct pnp_dma dma;
761f32ca31SBjorn Helgaas struct pnp_mem mem;
771f32ca31SBjorn Helgaas } u;
78a1802c42SBjorn Helgaas };
79a1802c42SBjorn Helgaas
801f32ca31SBjorn Helgaas int pnp_register_irq_resource(struct pnp_dev *dev, unsigned int option_flags,
81c227536bSBjorn Helgaas pnp_irq_mask_t *map, unsigned char flags);
821f32ca31SBjorn Helgaas int pnp_register_dma_resource(struct pnp_dev *dev, unsigned int option_flags,
83c227536bSBjorn Helgaas unsigned char map, unsigned char flags);
841f32ca31SBjorn Helgaas int pnp_register_port_resource(struct pnp_dev *dev, unsigned int option_flags,
85c227536bSBjorn Helgaas resource_size_t min, resource_size_t max,
86c227536bSBjorn Helgaas resource_size_t align, resource_size_t size,
87c227536bSBjorn Helgaas unsigned char flags);
881f32ca31SBjorn Helgaas int pnp_register_mem_resource(struct pnp_dev *dev, unsigned int option_flags,
89c227536bSBjorn Helgaas resource_size_t min, resource_size_t max,
90c227536bSBjorn Helgaas resource_size_t align, resource_size_t size,
91c227536bSBjorn Helgaas unsigned char flags);
921f32ca31SBjorn Helgaas
pnp_option_is_dependent(struct pnp_option * option)931f32ca31SBjorn Helgaas static inline int pnp_option_is_dependent(struct pnp_option *option)
941f32ca31SBjorn Helgaas {
951f32ca31SBjorn Helgaas return option->flags & PNP_OPTION_DEPENDENT ? 1 : 0;
961f32ca31SBjorn Helgaas }
971f32ca31SBjorn Helgaas
pnp_option_set(struct pnp_option * option)981f32ca31SBjorn Helgaas static inline unsigned int pnp_option_set(struct pnp_option *option)
991f32ca31SBjorn Helgaas {
1001f32ca31SBjorn Helgaas return (option->flags >> PNP_OPTION_SET_SHIFT) & PNP_OPTION_SET_MASK;
1011f32ca31SBjorn Helgaas }
1021f32ca31SBjorn Helgaas
pnp_option_priority(struct pnp_option * option)1031f32ca31SBjorn Helgaas static inline unsigned int pnp_option_priority(struct pnp_option *option)
1041f32ca31SBjorn Helgaas {
1051f32ca31SBjorn Helgaas return (option->flags >> PNP_OPTION_PRIORITY_SHIFT) &
1061f32ca31SBjorn Helgaas PNP_OPTION_PRIORITY_MASK;
1071f32ca31SBjorn Helgaas }
1081f32ca31SBjorn Helgaas
pnp_new_dependent_set(struct pnp_dev * dev,int priority)1091f32ca31SBjorn Helgaas static inline unsigned int pnp_new_dependent_set(struct pnp_dev *dev,
1101f32ca31SBjorn Helgaas int priority)
1111f32ca31SBjorn Helgaas {
1121f32ca31SBjorn Helgaas unsigned int flags;
1131f32ca31SBjorn Helgaas
1141f32ca31SBjorn Helgaas if (priority > PNP_RES_PRIORITY_FUNCTIONAL) {
1151f32ca31SBjorn Helgaas dev_warn(&dev->dev, "invalid dependent option priority %d "
1161f32ca31SBjorn Helgaas "clipped to %d", priority,
1171f32ca31SBjorn Helgaas PNP_RES_PRIORITY_INVALID);
1181f32ca31SBjorn Helgaas priority = PNP_RES_PRIORITY_INVALID;
1191f32ca31SBjorn Helgaas }
1201f32ca31SBjorn Helgaas
1211f32ca31SBjorn Helgaas flags = PNP_OPTION_DEPENDENT |
1221f32ca31SBjorn Helgaas ((dev->num_dependent_sets & PNP_OPTION_SET_MASK) <<
1231f32ca31SBjorn Helgaas PNP_OPTION_SET_SHIFT) |
1241f32ca31SBjorn Helgaas ((priority & PNP_OPTION_PRIORITY_MASK) <<
1251f32ca31SBjorn Helgaas PNP_OPTION_PRIORITY_SHIFT);
1261f32ca31SBjorn Helgaas
1271f32ca31SBjorn Helgaas dev->num_dependent_sets++;
1281f32ca31SBjorn Helgaas
1291f32ca31SBjorn Helgaas return flags;
1301f32ca31SBjorn Helgaas }
1311f32ca31SBjorn Helgaas
1321f32ca31SBjorn Helgaas char *pnp_option_priority_name(struct pnp_option *option);
1331f32ca31SBjorn Helgaas void dbg_pnp_show_option(struct pnp_dev *dev, struct pnp_option *option);
1341f32ca31SBjorn Helgaas
13562cfb298SBjorn Helgaas void pnp_init_resources(struct pnp_dev *dev);
13662cfb298SBjorn Helgaas
1371da177e4SLinus Torvalds void pnp_fixup_device(struct pnp_dev *dev);
1381f32ca31SBjorn Helgaas void pnp_free_options(struct pnp_dev *dev);
1391da177e4SLinus Torvalds int __pnp_add_device(struct pnp_dev *dev);
1401da177e4SLinus Torvalds void __pnp_remove_device(struct pnp_dev *dev);
1411da177e4SLinus Torvalds
142f5d94ff0SBjorn Helgaas int pnp_check_port(struct pnp_dev *dev, struct resource *res);
143f5d94ff0SBjorn Helgaas int pnp_check_mem(struct pnp_dev *dev, struct resource *res);
144f5d94ff0SBjorn Helgaas int pnp_check_irq(struct pnp_dev *dev, struct resource *res);
145586f83e2SDavid Rientjes #ifdef CONFIG_ISA_DMA_API
146f5d94ff0SBjorn Helgaas int pnp_check_dma(struct pnp_dev *dev, struct resource *res);
147586f83e2SDavid Rientjes #endif
14881b5c75fSBjorn Helgaas
1499fdee4e0SBjorn Helgaas char *pnp_resource_type_name(struct resource *res);
15081b5c75fSBjorn Helgaas void dbg_pnp_show_resources(struct pnp_dev *dev, char *desc);
151d948a8daSBjorn Helgaas
152aee3ad81SBjorn Helgaas void pnp_free_resources(struct pnp_dev *dev);
153b563cf59SRene Herman unsigned long pnp_resource_type(struct resource *res);
15402d83b5dSBjorn Helgaas
155784f01d5SBjorn Helgaas struct pnp_resource {
156aee3ad81SBjorn Helgaas struct list_head list;
157784f01d5SBjorn Helgaas struct resource res;
158784f01d5SBjorn Helgaas };
159784f01d5SBjorn Helgaas
160aee3ad81SBjorn Helgaas void pnp_free_resource(struct pnp_resource *pnp_res);
161dbddd038SBjorn Helgaas
162046d9ce6SRafael J. Wysocki struct pnp_resource *pnp_add_resource(struct pnp_dev *dev,
163046d9ce6SRafael J. Wysocki struct resource *res);
164dbddd038SBjorn Helgaas struct pnp_resource *pnp_add_irq_resource(struct pnp_dev *dev, int irq,
165dbddd038SBjorn Helgaas int flags);
166dc16f5f2SBjorn Helgaas struct pnp_resource *pnp_add_dma_resource(struct pnp_dev *dev, int dma,
167dc16f5f2SBjorn Helgaas int flags);
168cc8c2e30SBjorn Helgaas struct pnp_resource *pnp_add_io_resource(struct pnp_dev *dev,
169cc8c2e30SBjorn Helgaas resource_size_t start,
170cc8c2e30SBjorn Helgaas resource_size_t end, int flags);
171d6180f36SBjorn Helgaas struct pnp_resource *pnp_add_mem_resource(struct pnp_dev *dev,
172d6180f36SBjorn Helgaas resource_size_t start,
173d6180f36SBjorn Helgaas resource_size_t end, int flags);
1747e0e9c04SBjorn Helgaas struct pnp_resource *pnp_add_bus_resource(struct pnp_dev *dev,
1757e0e9c04SBjorn Helgaas resource_size_t start,
1767e0e9c04SBjorn Helgaas resource_size_t end);
17797ef062bSBjorn Helgaas
17897ef062bSBjorn Helgaas extern int pnp_debug;
17997ef062bSBjorn Helgaas
18097ef062bSBjorn Helgaas #if defined(CONFIG_PNP_DEBUG_MESSAGES)
18197ef062bSBjorn Helgaas #define pnp_dbg(dev, format, arg...) \
18297ef062bSBjorn Helgaas ({ if (pnp_debug) dev_printk(KERN_DEBUG, dev, format, ## arg); 0; })
18397ef062bSBjorn Helgaas #else
18497ef062bSBjorn Helgaas #define pnp_dbg(dev, format, arg...) \
18597ef062bSBjorn Helgaas ({ if (0) dev_printk(KERN_DEBUG, dev, format, ## arg); 0; })
18697ef062bSBjorn Helgaas #endif
187