|
@@ -49,6 +49,7 @@ MODULE_PARM_DESC(clear_wait,
|
|
" zero turns clear edge capture off entirely");
|
|
" zero turns clear edge capture off entirely");
|
|
module_param(clear_wait, uint, 0);
|
|
module_param(clear_wait, uint, 0);
|
|
|
|
|
|
|
|
+static DEFINE_IDA(pps_client_index);
|
|
|
|
|
|
/* internal per port structure */
|
|
/* internal per port structure */
|
|
struct pps_client_pp {
|
|
struct pps_client_pp {
|
|
@@ -56,6 +57,7 @@ struct pps_client_pp {
|
|
struct pps_device *pps; /* PPS device */
|
|
struct pps_device *pps; /* PPS device */
|
|
unsigned int cw; /* port clear timeout */
|
|
unsigned int cw; /* port clear timeout */
|
|
unsigned int cw_err; /* number of timeouts */
|
|
unsigned int cw_err; /* number of timeouts */
|
|
|
|
+ int index; /* device number */
|
|
};
|
|
};
|
|
|
|
|
|
static inline int signal_is_set(struct parport *port)
|
|
static inline int signal_is_set(struct parport *port)
|
|
@@ -136,6 +138,8 @@ out_both:
|
|
|
|
|
|
static void parport_attach(struct parport *port)
|
|
static void parport_attach(struct parport *port)
|
|
{
|
|
{
|
|
|
|
+ struct pardev_cb pps_client_cb;
|
|
|
|
+ int index;
|
|
struct pps_client_pp *device;
|
|
struct pps_client_pp *device;
|
|
struct pps_source_info info = {
|
|
struct pps_source_info info = {
|
|
.name = KBUILD_MODNAME,
|
|
.name = KBUILD_MODNAME,
|
|
@@ -154,8 +158,15 @@ static void parport_attach(struct parport *port)
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
|
|
|
|
- device->pardev = parport_register_device(port, KBUILD_MODNAME,
|
|
|
|
- NULL, NULL, parport_irq, PARPORT_FLAG_EXCL, device);
|
|
|
|
|
|
+ index = ida_simple_get(&pps_client_index, 0, 0, GFP_KERNEL);
|
|
|
|
+ memset(&pps_client_cb, 0, sizeof(pps_client_cb));
|
|
|
|
+ pps_client_cb.private = device;
|
|
|
|
+ pps_client_cb.irq_func = parport_irq;
|
|
|
|
+ pps_client_cb.flags = PARPORT_FLAG_EXCL;
|
|
|
|
+ device->pardev = parport_register_dev_model(port,
|
|
|
|
+ KBUILD_MODNAME,
|
|
|
|
+ &pps_client_cb,
|
|
|
|
+ index);
|
|
if (!device->pardev) {
|
|
if (!device->pardev) {
|
|
pr_err("couldn't register with %s\n", port->name);
|
|
pr_err("couldn't register with %s\n", port->name);
|
|
goto err_free;
|
|
goto err_free;
|
|
@@ -176,6 +187,7 @@ static void parport_attach(struct parport *port)
|
|
device->cw = clear_wait;
|
|
device->cw = clear_wait;
|
|
|
|
|
|
port->ops->enable_irq(port);
|
|
port->ops->enable_irq(port);
|
|
|
|
+ device->index = index;
|
|
|
|
|
|
pr_info("attached to %s\n", port->name);
|
|
pr_info("attached to %s\n", port->name);
|
|
|
|
|
|
@@ -186,6 +198,7 @@ err_release_dev:
|
|
err_unregister_dev:
|
|
err_unregister_dev:
|
|
parport_unregister_device(device->pardev);
|
|
parport_unregister_device(device->pardev);
|
|
err_free:
|
|
err_free:
|
|
|
|
+ ida_simple_remove(&pps_client_index, index);
|
|
kfree(device);
|
|
kfree(device);
|
|
}
|
|
}
|
|
|
|
|
|
@@ -205,13 +218,15 @@ static void parport_detach(struct parport *port)
|
|
pps_unregister_source(device->pps);
|
|
pps_unregister_source(device->pps);
|
|
parport_release(pardev);
|
|
parport_release(pardev);
|
|
parport_unregister_device(pardev);
|
|
parport_unregister_device(pardev);
|
|
|
|
+ ida_simple_remove(&pps_client_index, device->index);
|
|
kfree(device);
|
|
kfree(device);
|
|
}
|
|
}
|
|
|
|
|
|
static struct parport_driver pps_parport_driver = {
|
|
static struct parport_driver pps_parport_driver = {
|
|
.name = KBUILD_MODNAME,
|
|
.name = KBUILD_MODNAME,
|
|
- .attach = parport_attach,
|
|
|
|
|
|
+ .match_port = parport_attach,
|
|
.detach = parport_detach,
|
|
.detach = parport_detach,
|
|
|
|
+ .devmodel = true,
|
|
};
|
|
};
|
|
|
|
|
|
/* module staff */
|
|
/* module staff */
|