Commit 1701f680 authored by Linus Torvalds's avatar Linus Torvalds

Revert "ppdev: use new parport device model"

This reverts commit e7223f18.

It causes problems when a ppdev tries to register before the parport
driver has been registered with the device model. That will trigger the

        BUG_ON(!drv->bus->p);

at drivers/base/driver.c:153. The call chain is

  kernel_init ->
    kernel_init_freeable ->
      do_one_initcall ->
        ppdev_init ->
          __parport_register_driver ->
            driver_register *BOOM*
Reported-by: default avatarkernel test robot <fengguang.wu@intel.com>
Reported-by: default avatarRoss Zwisler <zwisler@gmail.com>
Reported-by: default avatarPetr Mladek <pmladek@suse.com>
Cc: Sudip Mukherjee <sudipm.mukherjee@gmail.com>
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 3b3b3bd9
...@@ -286,7 +286,7 @@ static int register_device(int minor, struct pp_struct *pp) ...@@ -286,7 +286,7 @@ static int register_device(int minor, struct pp_struct *pp)
struct parport *port; struct parport *port;
struct pardevice *pdev = NULL; struct pardevice *pdev = NULL;
char *name; char *name;
struct pardev_cb ppdev_cb; int fl;
name = kasprintf(GFP_KERNEL, CHRDEV "%x", minor); name = kasprintf(GFP_KERNEL, CHRDEV "%x", minor);
if (name == NULL) if (name == NULL)
...@@ -299,11 +299,9 @@ static int register_device(int minor, struct pp_struct *pp) ...@@ -299,11 +299,9 @@ static int register_device(int minor, struct pp_struct *pp)
return -ENXIO; return -ENXIO;
} }
memset(&ppdev_cb, 0, sizeof(ppdev_cb)); fl = (pp->flags & PP_EXCL) ? PARPORT_FLAG_EXCL : 0;
ppdev_cb.irq_func = pp_irq; pdev = parport_register_device(port, name, NULL,
ppdev_cb.flags = (pp->flags & PP_EXCL) ? PARPORT_FLAG_EXCL : 0; NULL, pp_irq, fl, pp);
ppdev_cb.private = pp;
pdev = parport_register_dev_model(port, name, &ppdev_cb, minor);
parport_put_port(port); parport_put_port(port);
if (!pdev) { if (!pdev) {
...@@ -801,23 +799,10 @@ static void pp_detach(struct parport *port) ...@@ -801,23 +799,10 @@ static void pp_detach(struct parport *port)
device_destroy(ppdev_class, MKDEV(PP_MAJOR, port->number)); device_destroy(ppdev_class, MKDEV(PP_MAJOR, port->number));
} }
static int pp_probe(struct pardevice *par_dev)
{
struct device_driver *drv = par_dev->dev.driver;
int len = strlen(drv->name);
if (strncmp(par_dev->name, drv->name, len))
return -ENODEV;
return 0;
}
static struct parport_driver pp_driver = { static struct parport_driver pp_driver = {
.name = CHRDEV, .name = CHRDEV,
.probe = pp_probe, .attach = pp_attach,
.match_port = pp_attach,
.detach = pp_detach, .detach = pp_detach,
.devmodel = true,
}; };
static int __init ppdev_init(void) static int __init ppdev_init(void)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment