diff options
author | Sudip Mukherjee <sudipm.mukherjee@gmail.com> | 2016-06-01 08:20:08 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2016-08-31 08:22:49 -0400 |
commit | 8b7d3a9d903ee1d1f5febc8e74223e4e72720e35 (patch) | |
tree | 22da0ef873e14d51b31ef96eea917e6fbad84d4d /drivers/char/ppdev.c | |
parent | 5ed22cebbacc3d434fe4df5e7178cb2b79042d41 (diff) |
ppdev: use new parport device model
Modify ppdev driver to use the new parallel port device model.
Initially submitted and committed as:
e7223f186033 ("ppdev: use new parport device model")
But due to some regression it was reverted by:
1701f680407c ("Revert "ppdev: use new parport device model"")
Now that the original source of regression is fixed by:
bbca503b2ee0 ("parport: use subsys_initcall") we can again modify ppdev
to use device model.
Signed-off-by: Sudip Mukherjee <sudip.mukherjee@codethink.co.uk>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/char/ppdev.c')
-rw-r--r-- | drivers/char/ppdev.c | 25 |
1 files changed, 20 insertions, 5 deletions
diff --git a/drivers/char/ppdev.c b/drivers/char/ppdev.c index f8a483c67b07..d23368874710 100644 --- a/drivers/char/ppdev.c +++ b/drivers/char/ppdev.c | |||
@@ -286,7 +286,7 @@ static int register_device(int minor, struct pp_struct *pp) | |||
286 | struct parport *port; | 286 | struct parport *port; |
287 | struct pardevice *pdev = NULL; | 287 | struct pardevice *pdev = NULL; |
288 | char *name; | 288 | char *name; |
289 | int fl; | 289 | struct pardev_cb ppdev_cb; |
290 | 290 | ||
291 | name = kasprintf(GFP_KERNEL, CHRDEV "%x", minor); | 291 | name = kasprintf(GFP_KERNEL, CHRDEV "%x", minor); |
292 | if (name == NULL) | 292 | if (name == NULL) |
@@ -299,9 +299,11 @@ static int register_device(int minor, struct pp_struct *pp) | |||
299 | return -ENXIO; | 299 | return -ENXIO; |
300 | } | 300 | } |
301 | 301 | ||
302 | fl = (pp->flags & PP_EXCL) ? PARPORT_FLAG_EXCL : 0; | 302 | memset(&ppdev_cb, 0, sizeof(ppdev_cb)); |
303 | pdev = parport_register_device(port, name, NULL, | 303 | ppdev_cb.irq_func = pp_irq; |
304 | NULL, pp_irq, fl, pp); | 304 | ppdev_cb.flags = (pp->flags & PP_EXCL) ? PARPORT_FLAG_EXCL : 0; |
305 | ppdev_cb.private = pp; | ||
306 | pdev = parport_register_dev_model(port, name, &ppdev_cb, minor); | ||
305 | parport_put_port(port); | 307 | parport_put_port(port); |
306 | 308 | ||
307 | if (!pdev) { | 309 | if (!pdev) { |
@@ -799,10 +801,23 @@ static void pp_detach(struct parport *port) | |||
799 | device_destroy(ppdev_class, MKDEV(PP_MAJOR, port->number)); | 801 | device_destroy(ppdev_class, MKDEV(PP_MAJOR, port->number)); |
800 | } | 802 | } |
801 | 803 | ||
804 | static int pp_probe(struct pardevice *par_dev) | ||
805 | { | ||
806 | struct device_driver *drv = par_dev->dev.driver; | ||
807 | int len = strlen(drv->name); | ||
808 | |||
809 | if (strncmp(par_dev->name, drv->name, len)) | ||
810 | return -ENODEV; | ||
811 | |||
812 | return 0; | ||
813 | } | ||
814 | |||
802 | static struct parport_driver pp_driver = { | 815 | static struct parport_driver pp_driver = { |
803 | .name = CHRDEV, | 816 | .name = CHRDEV, |
804 | .attach = pp_attach, | 817 | .probe = pp_probe, |
818 | .match_port = pp_attach, | ||
805 | .detach = pp_detach, | 819 | .detach = pp_detach, |
820 | .devmodel = true, | ||
806 | }; | 821 | }; |
807 | 822 | ||
808 | static int __init ppdev_init(void) | 823 | static int __init ppdev_init(void) |