xref: /openbmc/linux/drivers/pnp/base.h (revision b15fc7c2)
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