#include <linux/string.h>
#include <linux/module.h>
static int compare_func(const char *ida, const char *idb)
for (i = 3; i < 7; i++) {
idb[i] != 'X' && toupper(ida[i]) != toupper(idb[i]))
int compare_pnp_id(struct pnp_id *pos, const char *id)
if (!pos || !id || (strlen(id) != 7))
if (memcmp(id, "ANYDEVS", 7) == 0)
if (memcmp(pos->id, id, 3) == 0)
if (compare_func(pos->id, id) == 1)
static const struct pnp_device_id *match_device(struct pnp_driver *drv,
const struct pnp_device_id *drv_id = drv->id_table;
if (compare_pnp_id(dev->id, drv_id->id))
int pnp_device_attach(struct pnp_dev *pnp_dev)
if (pnp_dev->status != PNP_READY) {
pnp_dev->status = PNP_ATTACHED;
void pnp_device_detach(struct pnp_dev *pnp_dev)
if (pnp_dev->status == PNP_ATTACHED)
pnp_dev->status = PNP_READY;
static int pnp_device_probe(struct device *dev)
struct pnp_driver *pnp_drv;
const struct pnp_device_id *dev_id = NULL;
pnp_dev = to_pnp_dev(dev);
pnp_drv = to_pnp_driver(dev->driver);
error = pnp_device_attach(pnp_dev);