2 * Copyright (C) 2008 Hewlett-Packard Development Company, L.P.
3 * Bjorn Helgaas <bjorn.helgaas@hp.com>
6 extern spinlock_t pnp_lock
;
7 extern struct device_attribute pnp_interface_attrs
[];
8 void *pnp_alloc(long size
);
10 int pnp_register_protocol(struct pnp_protocol
*protocol
);
11 void pnp_unregister_protocol(struct pnp_protocol
*protocol
);
13 #define PNP_EISA_ID_MASK 0x7fffffff
14 void pnp_eisa_id_to_string(u32 id
, char *str
);
15 struct pnp_dev
*pnp_alloc_dev(struct pnp_protocol
*, int id
,
17 struct pnp_card
*pnp_alloc_card(struct pnp_protocol
*, int id
, char *pnpid
);
19 int pnp_add_device(struct pnp_dev
*dev
);
20 struct pnp_id
*pnp_add_id(struct pnp_dev
*dev
, const char *id
);
22 int pnp_add_card(struct pnp_card
*card
);
23 void pnp_remove_card(struct pnp_card
*card
);
24 int pnp_add_card_device(struct pnp_card
*card
, struct pnp_dev
*dev
);
25 void pnp_remove_card_device(struct pnp_dev
*dev
);
28 resource_size_t min
; /* min base number */
29 resource_size_t max
; /* max base number */
30 resource_size_t align
; /* align boundary */
31 resource_size_t size
; /* size of range */
32 unsigned char flags
; /* port flags */
35 #define PNP_IRQ_NR 256
36 typedef struct { DECLARE_BITMAP(bits
, PNP_IRQ_NR
); } pnp_irq_mask_t
;
39 pnp_irq_mask_t map
; /* bitmap for IRQ lines */
40 unsigned char flags
; /* IRQ flags */
44 unsigned char map
; /* bitmask for DMA channels */
45 unsigned char flags
; /* DMA flags */
49 resource_size_t min
; /* min base number */
50 resource_size_t max
; /* max base number */
51 resource_size_t align
; /* align boundary */
52 resource_size_t size
; /* size of range */
53 unsigned char flags
; /* memory flags */
56 #define PNP_OPTION_DEPENDENT 0x80000000
57 #define PNP_OPTION_SET_MASK 0xffff
58 #define PNP_OPTION_SET_SHIFT 12
59 #define PNP_OPTION_PRIORITY_MASK 0xfff
60 #define PNP_OPTION_PRIORITY_SHIFT 0
62 #define PNP_RES_PRIORITY_PREFERRED 0
63 #define PNP_RES_PRIORITY_ACCEPTABLE 1
64 #define PNP_RES_PRIORITY_FUNCTIONAL 2
65 #define PNP_RES_PRIORITY_INVALID PNP_OPTION_PRIORITY_MASK
68 struct list_head list
;
69 unsigned int flags
; /* independent/dependent, set, priority */
71 unsigned long type
; /* IORESOURCE_{IO,MEM,IRQ,DMA} */
80 int pnp_register_irq_resource(struct pnp_dev
*dev
, unsigned int option_flags
,
81 pnp_irq_mask_t
*map
, unsigned char flags
);
82 int pnp_register_dma_resource(struct pnp_dev
*dev
, unsigned int option_flags
,
83 unsigned char map
, unsigned char flags
);
84 int pnp_register_port_resource(struct pnp_dev
*dev
, unsigned int option_flags
,
85 resource_size_t min
, resource_size_t max
,
86 resource_size_t align
, resource_size_t size
,
88 int pnp_register_mem_resource(struct pnp_dev
*dev
, unsigned int option_flags
,
89 resource_size_t min
, resource_size_t max
,
90 resource_size_t align
, resource_size_t size
,
93 static inline int pnp_option_is_dependent(struct pnp_option
*option
)
95 return option
->flags
& PNP_OPTION_DEPENDENT
? 1 : 0;
98 static inline unsigned int pnp_option_set(struct pnp_option
*option
)
100 return (option
->flags
>> PNP_OPTION_SET_SHIFT
) & PNP_OPTION_SET_MASK
;
103 static inline unsigned int pnp_option_priority(struct pnp_option
*option
)
105 return (option
->flags
>> PNP_OPTION_PRIORITY_SHIFT
) &
106 PNP_OPTION_PRIORITY_MASK
;
109 static inline unsigned int pnp_new_dependent_set(struct pnp_dev
*dev
,
114 if (priority
> PNP_RES_PRIORITY_FUNCTIONAL
) {
115 dev_warn(&dev
->dev
, "invalid dependent option priority %d "
116 "clipped to %d", priority
,
117 PNP_RES_PRIORITY_INVALID
);
118 priority
= PNP_RES_PRIORITY_INVALID
;
121 flags
= PNP_OPTION_DEPENDENT
|
122 ((dev
->num_dependent_sets
& PNP_OPTION_SET_MASK
) <<
123 PNP_OPTION_SET_SHIFT
) |
124 ((priority
& PNP_OPTION_PRIORITY_MASK
) <<
125 PNP_OPTION_PRIORITY_SHIFT
);
127 dev
->num_dependent_sets
++;
132 char *pnp_option_priority_name(struct pnp_option
*option
);
133 void dbg_pnp_show_option(struct pnp_dev
*dev
, struct pnp_option
*option
);
135 void pnp_init_resources(struct pnp_dev
*dev
);
137 void pnp_fixup_device(struct pnp_dev
*dev
);
138 void pnp_free_options(struct pnp_dev
*dev
);
139 int __pnp_add_device(struct pnp_dev
*dev
);
140 void __pnp_remove_device(struct pnp_dev
*dev
);
142 int pnp_check_port(struct pnp_dev
*dev
, struct resource
*res
);
143 int pnp_check_mem(struct pnp_dev
*dev
, struct resource
*res
);
144 int pnp_check_irq(struct pnp_dev
*dev
, struct resource
*res
);
145 int pnp_check_dma(struct pnp_dev
*dev
, struct resource
*res
);
147 char *pnp_resource_type_name(struct resource
*res
);
148 void dbg_pnp_show_resources(struct pnp_dev
*dev
, char *desc
);
150 void pnp_free_resources(struct pnp_dev
*dev
);
151 unsigned long pnp_resource_type(struct resource
*res
);
153 struct pnp_resource
{
154 struct list_head list
;
158 void pnp_free_resource(struct pnp_resource
*pnp_res
);
160 struct pnp_resource
*pnp_add_irq_resource(struct pnp_dev
*dev
, int irq
,
162 struct pnp_resource
*pnp_add_dma_resource(struct pnp_dev
*dev
, int dma
,
164 struct pnp_resource
*pnp_add_io_resource(struct pnp_dev
*dev
,
165 resource_size_t start
,
166 resource_size_t end
, int flags
);
167 struct pnp_resource
*pnp_add_mem_resource(struct pnp_dev
*dev
,
168 resource_size_t start
,
169 resource_size_t end
, int flags
);
170 struct pnp_resource
*pnp_add_bus_resource(struct pnp_dev
*dev
,
171 resource_size_t start
,
172 resource_size_t end
);
174 extern int pnp_debug
;
176 #if defined(CONFIG_PNP_DEBUG_MESSAGES)
177 #define pnp_dbg(dev, format, arg...) \
178 ({ if (pnp_debug) dev_printk(KERN_DEBUG, dev, format, ## arg); 0; })
180 #define pnp_dbg(dev, format, arg...) \
181 ({ if (0) dev_printk(KERN_DEBUG, dev, format, ## arg); 0; })