Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0 */
0002 /*
0003  * Copyright (C) 2008 Hewlett-Packard Development Company, L.P.
0004  *  Bjorn Helgaas <bjorn.helgaas@hp.com>
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;    /* min base number */
0029     resource_size_t max;    /* max base number */
0030     resource_size_t align;  /* align boundary */
0031     resource_size_t size;   /* size of range */
0032     unsigned char flags;    /* port 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; /* bitmap for IRQ lines */
0040     unsigned char flags;    /* IRQ flags */
0041 };
0042 
0043 struct pnp_dma {
0044     unsigned char map;  /* bitmask for DMA channels */
0045     unsigned char flags;    /* DMA flags */
0046 };
0047 
0048 struct pnp_mem {
0049     resource_size_t min;    /* min base number */
0050     resource_size_t max;    /* max base number */
0051     resource_size_t align;  /* align boundary */
0052     resource_size_t size;   /* size of range */
0053     unsigned char flags;    /* memory 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; /* independent/dependent, set, priority */
0070 
0071     unsigned long type; /* IORESOURCE_{IO,MEM,IRQ,DMA} */
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