Commit 231ec2f2 authored by Sudip Mukherjee's avatar Sudip Mukherjee Committed by Greg Kroah-Hartman

parport: load lowlevel driver if ports not found

Usually all the distro will load the parport low level driver as part
of their initialization. But we can get into a situation where all the
parallel port drivers are built as module and we unload all the modules
at a later time. Then if we just do "modprobe parport" it will only
load the parport module and will not load the low level driver which
will actually register the ports. So, check the bus if there is any
parport registered, if not, load the low level driver.

We can get into the above situation with all distro but only Suse has
setup the alias for "parport_lowlevel" and so it only works in Suse.
Users of Debian based distro will need to load the lowlevel module
manually.
Signed-off-by: default avatarSudip Mukherjee <sudipm.mukherjee@gmail.com>
Link: https://lore.kernel.org/r/20191016144540.18810-3-sudipm.mukherjee@gmail.comSigned-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent e962cd9c
...@@ -230,6 +230,18 @@ static int port_check(struct device *dev, void *dev_drv) ...@@ -230,6 +230,18 @@ static int port_check(struct device *dev, void *dev_drv)
return 0; return 0;
} }
/*
* Iterates through all the devices connected to the bus and return 1
* if the device is a parallel port.
*/
static int port_detect(struct device *dev, void *dev_drv)
{
if (is_parport(dev))
return 1;
return 0;
}
/** /**
* parport_register_driver - register a parallel port device driver * parport_register_driver - register a parallel port device driver
* @drv: structure describing the driver * @drv: structure describing the driver
...@@ -279,6 +291,15 @@ int __parport_register_driver(struct parport_driver *drv, struct module *owner, ...@@ -279,6 +291,15 @@ int __parport_register_driver(struct parport_driver *drv, struct module *owner,
if (ret) if (ret)
return ret; return ret;
/*
* check if bus has any parallel port registered, if
* none is found then load the lowlevel driver.
*/
ret = bus_for_each_dev(&parport_bus_type, NULL, NULL,
port_detect);
if (!ret)
get_lowlevel_driver();
mutex_lock(&registration_lock); mutex_lock(&registration_lock);
if (drv->match_port) if (drv->match_port)
bus_for_each_dev(&parport_bus_type, NULL, drv, bus_for_each_dev(&parport_bus_type, NULL, drv,
......
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