0001
0002
0003
0004
0005
0006
0007
0008 #include <linux/string.h>
0009 #include <linux/list.h>
0010 #include <linux/module.h>
0011 #include <linux/ctype.h>
0012 #include <linux/slab.h>
0013 #include <linux/pnp.h>
0014 #include "base.h"
0015
0016 static int compare_func(const char *ida, const char *idb)
0017 {
0018 int i;
0019
0020
0021 for (i = 3; i < 7; i++) {
0022 if (ida[i] != 'X' &&
0023 idb[i] != 'X' && toupper(ida[i]) != toupper(idb[i]))
0024 return 0;
0025 }
0026 return 1;
0027 }
0028
0029 int compare_pnp_id(struct pnp_id *pos, const char *id)
0030 {
0031 if (!pos || !id || (strlen(id) != 7))
0032 return 0;
0033 if (memcmp(id, "ANYDEVS", 7) == 0)
0034 return 1;
0035 while (pos) {
0036 if (memcmp(pos->id, id, 3) == 0)
0037 if (compare_func(pos->id, id) == 1)
0038 return 1;
0039 pos = pos->next;
0040 }
0041 return 0;
0042 }
0043
0044 static const struct pnp_device_id *match_device(struct pnp_driver *drv,
0045 struct pnp_dev *dev)
0046 {
0047 const struct pnp_device_id *drv_id = drv->id_table;
0048
0049 if (!drv_id)
0050 return NULL;
0051
0052 while (*drv_id->id) {
0053 if (compare_pnp_id(dev->id, drv_id->id))
0054 return drv_id;
0055 drv_id++;
0056 }
0057 return NULL;
0058 }
0059
0060 int pnp_device_attach(struct pnp_dev *pnp_dev)
0061 {
0062 mutex_lock(&pnp_lock);
0063 if (pnp_dev->status != PNP_READY) {
0064 mutex_unlock(&pnp_lock);
0065 return -EBUSY;
0066 }
0067 pnp_dev->status = PNP_ATTACHED;
0068 mutex_unlock(&pnp_lock);
0069 return 0;
0070 }
0071 EXPORT_SYMBOL(pnp_device_attach);
0072
0073 void pnp_device_detach(struct pnp_dev *pnp_dev)
0074 {
0075 mutex_lock(&pnp_lock);
0076 if (pnp_dev->status == PNP_ATTACHED)
0077 pnp_dev->status = PNP_READY;
0078 mutex_unlock(&pnp_lock);
0079 }
0080 EXPORT_SYMBOL(pnp_device_detach);
0081
0082 static int pnp_device_probe(struct device *dev)
0083 {
0084 int error;
0085 struct pnp_driver *pnp_drv;
0086 struct pnp_dev *pnp_dev;
0087 const struct pnp_device_id *dev_id = NULL;
0088 pnp_dev = to_pnp_dev(dev);
0089 pnp_drv = to_pnp_driver(dev->driver);
0090
0091 error = pnp_device_attach(pnp_dev);
0092 if (error < 0)
0093 return error;
0094
0095 if (pnp_dev->active == 0) {
0096 if (!(pnp_drv->flags & PNP_DRIVER_RES_DO_NOT_CHANGE)) {
0097 error = pnp_activate_dev(pnp_dev);
0098 if (error < 0)
0099 return error;
0100 }
0101 } else if ((pnp_drv->flags & PNP_DRIVER_RES_DISABLE)
0102 == PNP_DRIVER_RES_DISABLE) {
0103 error = pnp_disable_dev(pnp_dev);
0104 if (error < 0)
0105 return error;
0106 }
0107 error = 0;
0108 if (pnp_drv->probe) {
0109 dev_id = match_device(pnp_drv, pnp_dev);
0110 if (dev_id != NULL)
0111 error = pnp_drv->probe(pnp_dev, dev_id);
0112 }
0113 if (error >= 0) {
0114 pnp_dev->driver = pnp_drv;
0115 error = 0;
0116 } else
0117 goto fail;
0118
0119 return error;
0120
0121 fail:
0122 pnp_device_detach(pnp_dev);
0123 return error;
0124 }
0125
0126 static void pnp_device_remove(struct device *dev)
0127 {
0128 struct pnp_dev *pnp_dev = to_pnp_dev(dev);
0129 struct pnp_driver *drv = pnp_dev->driver;
0130
0131 if (drv) {
0132 if (drv->remove)
0133 drv->remove(pnp_dev);
0134 pnp_dev->driver = NULL;
0135 }
0136
0137 if (pnp_dev->active &&
0138 (!drv || !(drv->flags & PNP_DRIVER_RES_DO_NOT_CHANGE)))
0139 pnp_disable_dev(pnp_dev);
0140
0141 pnp_device_detach(pnp_dev);
0142 }
0143
0144 static void pnp_device_shutdown(struct device *dev)
0145 {
0146 struct pnp_dev *pnp_dev = to_pnp_dev(dev);
0147 struct pnp_driver *drv = pnp_dev->driver;
0148
0149 if (drv && drv->shutdown)
0150 drv->shutdown(pnp_dev);
0151 }
0152
0153 static int pnp_bus_match(struct device *dev, struct device_driver *drv)
0154 {
0155 struct pnp_dev *pnp_dev = to_pnp_dev(dev);
0156 struct pnp_driver *pnp_drv = to_pnp_driver(drv);
0157
0158 if (match_device(pnp_drv, pnp_dev) == NULL)
0159 return 0;
0160 return 1;
0161 }
0162
0163 static int __pnp_bus_suspend(struct device *dev, pm_message_t state)
0164 {
0165 struct pnp_dev *pnp_dev = to_pnp_dev(dev);
0166 struct pnp_driver *pnp_drv = pnp_dev->driver;
0167 int error;
0168
0169 if (!pnp_drv)
0170 return 0;
0171
0172 if (pnp_drv->driver.pm && pnp_drv->driver.pm->suspend) {
0173 error = pnp_drv->driver.pm->suspend(dev);
0174 suspend_report_result(dev, pnp_drv->driver.pm->suspend, error);
0175 if (error)
0176 return error;
0177 }
0178
0179 if (pnp_drv->suspend) {
0180 error = pnp_drv->suspend(pnp_dev, state);
0181 if (error)
0182 return error;
0183 }
0184
0185 if (pnp_can_disable(pnp_dev)) {
0186 error = pnp_stop_dev(pnp_dev);
0187 if (error)
0188 return error;
0189 }
0190
0191 if (pnp_can_suspend(pnp_dev))
0192 pnp_dev->protocol->suspend(pnp_dev, state);
0193 return 0;
0194 }
0195
0196 static int pnp_bus_suspend(struct device *dev)
0197 {
0198 return __pnp_bus_suspend(dev, PMSG_SUSPEND);
0199 }
0200
0201 static int pnp_bus_freeze(struct device *dev)
0202 {
0203 return __pnp_bus_suspend(dev, PMSG_FREEZE);
0204 }
0205
0206 static int pnp_bus_poweroff(struct device *dev)
0207 {
0208 return __pnp_bus_suspend(dev, PMSG_HIBERNATE);
0209 }
0210
0211 static int pnp_bus_resume(struct device *dev)
0212 {
0213 struct pnp_dev *pnp_dev = to_pnp_dev(dev);
0214 struct pnp_driver *pnp_drv = pnp_dev->driver;
0215 int error;
0216
0217 if (!pnp_drv)
0218 return 0;
0219
0220 if (pnp_dev->protocol->resume) {
0221 error = pnp_dev->protocol->resume(pnp_dev);
0222 if (error)
0223 return error;
0224 }
0225
0226 if (pnp_can_write(pnp_dev)) {
0227 error = pnp_start_dev(pnp_dev);
0228 if (error)
0229 return error;
0230 }
0231
0232 if (pnp_drv->driver.pm && pnp_drv->driver.pm->resume) {
0233 error = pnp_drv->driver.pm->resume(dev);
0234 if (error)
0235 return error;
0236 }
0237
0238 if (pnp_drv->resume) {
0239 error = pnp_drv->resume(pnp_dev);
0240 if (error)
0241 return error;
0242 }
0243
0244 return 0;
0245 }
0246
0247 static const struct dev_pm_ops pnp_bus_dev_pm_ops = {
0248
0249 .suspend = pnp_bus_suspend,
0250 .resume = pnp_bus_resume,
0251
0252 .freeze = pnp_bus_freeze,
0253 .thaw = pnp_bus_resume,
0254 .poweroff = pnp_bus_poweroff,
0255 .restore = pnp_bus_resume,
0256 };
0257
0258 struct bus_type pnp_bus_type = {
0259 .name = "pnp",
0260 .match = pnp_bus_match,
0261 .probe = pnp_device_probe,
0262 .remove = pnp_device_remove,
0263 .shutdown = pnp_device_shutdown,
0264 .pm = &pnp_bus_dev_pm_ops,
0265 .dev_groups = pnp_dev_groups,
0266 };
0267
0268 int pnp_register_driver(struct pnp_driver *drv)
0269 {
0270 drv->driver.name = drv->name;
0271 drv->driver.bus = &pnp_bus_type;
0272
0273 return driver_register(&drv->driver);
0274 }
0275 EXPORT_SYMBOL(pnp_register_driver);
0276
0277 void pnp_unregister_driver(struct pnp_driver *drv)
0278 {
0279 driver_unregister(&drv->driver);
0280 }
0281 EXPORT_SYMBOL(pnp_unregister_driver);
0282
0283
0284
0285
0286
0287
0288 struct pnp_id *pnp_add_id(struct pnp_dev *dev, const char *id)
0289 {
0290 struct pnp_id *dev_id, *ptr;
0291
0292 dev_id = kzalloc(sizeof(struct pnp_id), GFP_KERNEL);
0293 if (!dev_id)
0294 return NULL;
0295
0296 dev_id->id[0] = id[0];
0297 dev_id->id[1] = id[1];
0298 dev_id->id[2] = id[2];
0299 dev_id->id[3] = tolower(id[3]);
0300 dev_id->id[4] = tolower(id[4]);
0301 dev_id->id[5] = tolower(id[5]);
0302 dev_id->id[6] = tolower(id[6]);
0303 dev_id->id[7] = '\0';
0304
0305 dev_id->next = NULL;
0306 ptr = dev->id;
0307 while (ptr && ptr->next)
0308 ptr = ptr->next;
0309 if (ptr)
0310 ptr->next = dev_id;
0311 else
0312 dev->id = dev_id;
0313
0314 return dev_id;
0315 }