diff mbox

[4/4] w1:slaves:bq27000: load battery driver kernel module if required

Message ID c9ee31c641a8612c49172123cd56407484e699d6.1444243358.git.hns@goldelico.com (mailing list archive)
State Not Applicable, archived
Headers show

Commit Message

H. Nikolaus Schaller Oct. 7, 2015, 6:42 p.m. UTC
Explicitly call request_module() in the wrapper so that the bq27x00_battery
driver is loded on demand, when compiled as module.

Signed-off-by: H. Nikolaus Schaller <hns@goldelico.com>
---
 drivers/w1/slaves/w1_bq27000.c | 2 ++
 1 file changed, 2 insertions(+)

Comments

Pali Rohár Oct. 7, 2015, 10:26 p.m. UTC | #1
On Wednesday 07 October 2015 20:42:39 H. Nikolaus Schaller wrote:
> Explicitly call request_module() in the wrapper so that the
> bq27x00_battery driver is loded on demand, when compiled as module.
> 
> Signed-off-by: H. Nikolaus Schaller <hns@goldelico.com>
> ---
>  drivers/w1/slaves/w1_bq27000.c | 2 ++
>  1 file changed, 2 insertions(+)
> 
> diff --git a/drivers/w1/slaves/w1_bq27000.c
> b/drivers/w1/slaves/w1_bq27000.c index caafb17..745bd6e 100644
> --- a/drivers/w1/slaves/w1_bq27000.c
> +++ b/drivers/w1/slaves/w1_bq27000.c
> @@ -49,6 +49,8 @@ static int w1_bq27000_add_slave(struct w1_slave
> *sl) int ret;
>  	struct platform_device *pdev;
> 
> +	request_module("bq27x00_battery");  /* load as module if needed */
> +
>  	pdev = platform_device_alloc("bq27000-battery", -1);
>  	if (!pdev) {
>  		ret = -ENOMEM;

Hi! Function platform_device_alloc would allocate kernel device and it 
should also load appropriate kernel driver (via platform:bq27000-battery 
alias). If that does not work, problem is somewhere else. Maybe depmod 
is not properly generated? Or bq27x00_batter.ko modules does not contain 
needed alias?

Adding request_module() here is not proper solution. Real problem is 
somewhere else... Anyway there is series of patches for bq27x00_battery 
which should cleanup some problems, so maybe they also fix your problem.
H. Nikolaus Schaller Oct. 8, 2015, 7:26 a.m. UTC | #2
Am 08.10.2015 um 00:26 schrieb Pali Rohár <pali.rohar@gmail.com>:

> On Wednesday 07 October 2015 20:42:39 H. Nikolaus Schaller wrote:
>> Explicitly call request_module() in the wrapper so that the
>> bq27x00_battery driver is loded on demand, when compiled as module.
>> 
>> Signed-off-by: H. Nikolaus Schaller <hns@goldelico.com>
>> ---
>> drivers/w1/slaves/w1_bq27000.c | 2 ++
>> 1 file changed, 2 insertions(+)
>> 
>> diff --git a/drivers/w1/slaves/w1_bq27000.c
>> b/drivers/w1/slaves/w1_bq27000.c index caafb17..745bd6e 100644
>> --- a/drivers/w1/slaves/w1_bq27000.c
>> +++ b/drivers/w1/slaves/w1_bq27000.c
>> @@ -49,6 +49,8 @@ static int w1_bq27000_add_slave(struct w1_slave
>> *sl) int ret;
>> 	struct platform_device *pdev;
>> 
>> +	request_module("bq27x00_battery");  /* load as module if needed */
>> +
>> 	pdev = platform_device_alloc("bq27000-battery", -1);
>> 	if (!pdev) {
>> 		ret = -ENOMEM;
> 
> Hi! Function platform_device_alloc would allocate kernel device and it 
> should also load appropriate kernel driver (via platform:bq27000-battery 
> alias). If that does not work, problem is somewhere else. Maybe depmod 
> is not properly generated? Or bq27x00_batter.ko modules does not contain 
> needed alias?

alias exists:

#ifdef CONFIG_BATTERY_BQ27X00_PLATFORM
MODULE_ALIAS("platform:bq27000-battery");
#endif

depmod entry exist:

root@letux:~# modprobe -c | fgrep bq27
alias i2c:bq27000_battery bq27x00_battery
alias i2c:bq27200 bq27x00_battery
alias i2c:bq27425 bq27x00_battery
alias i2c:bq27500 bq27x00_battery
alias i2c:bq27510 bq27x00_battery
alias i2c:bq27742 bq27x00_battery
alias platform:bq27000_battery bq27x00_battery
alias w1_family_0x01 w1_bq27000

And I have traced all calls to call_modprobe

[    9.969085] call_modprobe w1-family-0x01
[   10.189727] call_modprobe bq27x00_battery
[   29.879333] call_modprobe net-pf-10
[   30.530548] call_modprobe netdev-eth0
[   30.548156] call_modprobe eth0
[   30.565063] call_modprobe netdev-eth0
[   30.581420] call_modprobe eth0
[   31.301300] call_modprobe netdev-eth1
[   31.316101] call_modprobe eth1
[   32.008270] call_modprobe usbfunc:ecm
[   35.554748] call_modprobe net-pf-16-proto-9
[   36.243164] call_modprobe net-pf-31
[   36.614410] call_modprobe bt-proto-4
[   73.888122] call_modprobe net-pf-16-proto-9
[   73.921112] call_modprobe net-pf-16-proto-9
[   77.153625] call_modprobe net-pf-16-proto-9
[   77.188262] call_modprobe net-pf-16-proto-9
[   77.342895] call_modprobe net-pf-16-proto-9
[   77.389129] call_modprobe net-pf-16-proto-9
[   77.419006] call_modprobe net-pf-16-proto-9

And there is only the line I have added. I.e. I can't find an automatic attempt
to load the platform:bq27000-battery. It also doesn't help to change to 
platform_device_alloc("bq27000_battery", -1)

So I think platform_device_alloc() does only what it tells: it allocates a device
but does *not* try to load a kernel module. It only binds to a driver compiled
into the kernel. AFAIR the I2C bus driver also calls request_module() at some
stage after finding a client (i2c:bq27000_battery).

> Adding request_module() here is not proper solution. Real problem is 
> somewhere else... Anyway there is series of patches for bq27x00_battery 
> which should cleanup some problems, so maybe they also fix your problem.

Is there a tree where I can pull the patches to cross-check if they change
something?

BR,
Nikolaus

--
To unsubscribe from this list: send the line "unsubscribe linux-pm" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Pali Rohár Oct. 8, 2015, 7:54 a.m. UTC | #3
On Thursday 08 October 2015 09:26:26 H. Nikolaus Schaller wrote:
> 
> Am 08.10.2015 um 00:26 schrieb Pali Rohár <pali.rohar@gmail.com>:
> 
> > On Wednesday 07 October 2015 20:42:39 H. Nikolaus Schaller wrote:
> >> Explicitly call request_module() in the wrapper so that the
> >> bq27x00_battery driver is loded on demand, when compiled as module.
> >> 
> >> Signed-off-by: H. Nikolaus Schaller <hns@goldelico.com>
> >> ---
> >> drivers/w1/slaves/w1_bq27000.c | 2 ++
> >> 1 file changed, 2 insertions(+)
> >> 
> >> diff --git a/drivers/w1/slaves/w1_bq27000.c
> >> b/drivers/w1/slaves/w1_bq27000.c index caafb17..745bd6e 100644
> >> --- a/drivers/w1/slaves/w1_bq27000.c
> >> +++ b/drivers/w1/slaves/w1_bq27000.c
> >> @@ -49,6 +49,8 @@ static int w1_bq27000_add_slave(struct w1_slave
> >> *sl) int ret;
> >> 	struct platform_device *pdev;
> >> 
> >> +	request_module("bq27x00_battery");  /* load as module if needed */
> >> +
> >> 	pdev = platform_device_alloc("bq27000-battery", -1);
> >> 	if (!pdev) {
> >> 		ret = -ENOMEM;
> > 
> > Hi! Function platform_device_alloc would allocate kernel device and it 
> > should also load appropriate kernel driver (via platform:bq27000-battery 
> > alias). If that does not work, problem is somewhere else. Maybe depmod 
> > is not properly generated? Or bq27x00_batter.ko modules does not contain 
> > needed alias?
> 

At least driver is renaming in upstream kernel, so hardcoding driver
name is wrong approach. It will be broken... If we show that
request_module is really needed (but I believe not!) then please use
alias instead.

> alias exists:
> 
> #ifdef CONFIG_BATTERY_BQ27X00_PLATFORM
> MODULE_ALIAS("platform:bq27000-battery");
> #endif
> 
> depmod entry exist:
> 
> root@letux:~# modprobe -c | fgrep bq27
> alias i2c:bq27000_battery bq27x00_battery
> alias i2c:bq27200 bq27x00_battery
> alias i2c:bq27425 bq27x00_battery
> alias i2c:bq27500 bq27x00_battery
> alias i2c:bq27510 bq27x00_battery
> alias i2c:bq27742 bq27x00_battery
> alias platform:bq27000_battery bq27x00_battery
> alias w1_family_0x01 w1_bq27000
> 
> And I have traced all calls to call_modprobe
> 
> [    9.969085] call_modprobe w1-family-0x01
> [   10.189727] call_modprobe bq27x00_battery
> [   29.879333] call_modprobe net-pf-10
> [   30.530548] call_modprobe netdev-eth0
> [   30.548156] call_modprobe eth0
> [   30.565063] call_modprobe netdev-eth0
> [   30.581420] call_modprobe eth0
> [   31.301300] call_modprobe netdev-eth1
> [   31.316101] call_modprobe eth1
> [   32.008270] call_modprobe usbfunc:ecm
> [   35.554748] call_modprobe net-pf-16-proto-9
> [   36.243164] call_modprobe net-pf-31
> [   36.614410] call_modprobe bt-proto-4
> [   73.888122] call_modprobe net-pf-16-proto-9
> [   73.921112] call_modprobe net-pf-16-proto-9
> [   77.153625] call_modprobe net-pf-16-proto-9
> [   77.188262] call_modprobe net-pf-16-proto-9
> [   77.342895] call_modprobe net-pf-16-proto-9
> [   77.389129] call_modprobe net-pf-16-proto-9
> [   77.419006] call_modprobe net-pf-16-proto-9
> 
> And there is only the line I have added. I.e. I can't find an automatic attempt
> to load the platform:bq27000-battery. It also doesn't help to change to 
> platform_device_alloc("bq27000_battery", -1)
> 
> So I think platform_device_alloc() does only what it tells: it allocates a device
> but does *not* try to load a kernel module. It only binds to a driver compiled
> into the kernel. AFAIR the I2C bus driver also calls request_module() at some
> stage after finding a client (i2c:bq27000_battery).
> 

Try to call platform_device_register(). E.g for rx51-battery power
supply device it is working fine. Device itself is allocated and
registered in arch/arm/mach-omap2/board-rx51-peripherals.c and driver is
in drivers/power/rx51_battery.c. You can also try to reuse that code...
I see that w1 is quite different.

> > Adding request_module() here is not proper solution. Real problem is 
> > somewhere else... Anyway there is series of patches for bq27x00_battery 
> > which should cleanup some problems, so maybe they also fix your problem.
> 
> Is there a tree where I can pull the patches to cross-check if they change
> something?
> 

Sebastian? Where are those new bq27k patches now?

> BR,
> Nikolaus
>
H. Nikolaus Schaller Oct. 8, 2015, 9:58 a.m. UTC | #4
Hi,

Am 08.10.2015 um 09:54 schrieb Pali Rohár <pali.rohar@gmail.com>:

> On Thursday 08 October 2015 09:26:26 H. Nikolaus Schaller wrote:
>> 
>> Am 08.10.2015 um 00:26 schrieb Pali Rohár <pali.rohar@gmail.com>:
>> 
>>> On Wednesday 07 October 2015 20:42:39 H. Nikolaus Schaller wrote:
>>>> Explicitly call request_module() in the wrapper so that the
>>>> bq27x00_battery driver is loded on demand, when compiled as module.
>>>> 
>>>> Signed-off-by: H. Nikolaus Schaller <hns@goldelico.com>
>>>> ---
>>>> drivers/w1/slaves/w1_bq27000.c | 2 ++
>>>> 1 file changed, 2 insertions(+)
>>>> 
>>>> diff --git a/drivers/w1/slaves/w1_bq27000.c
>>>> b/drivers/w1/slaves/w1_bq27000.c index caafb17..745bd6e 100644
>>>> --- a/drivers/w1/slaves/w1_bq27000.c
>>>> +++ b/drivers/w1/slaves/w1_bq27000.c
>>>> @@ -49,6 +49,8 @@ static int w1_bq27000_add_slave(struct w1_slave
>>>> *sl) int ret;
>>>> 	struct platform_device *pdev;
>>>> 
>>>> +	request_module("bq27x00_battery");  /* load as module if needed */
>>>> +
>>>> 	pdev = platform_device_alloc("bq27000-battery", -1);
>>>> 	if (!pdev) {
>>>> 		ret = -ENOMEM;
>>> 
>>> Hi! Function platform_device_alloc would allocate kernel device and it 
>>> should also load appropriate kernel driver (via platform:bq27000-battery 
>>> alias). If that does not work, problem is somewhere else. Maybe depmod 
>>> is not properly generated? Or bq27x00_batter.ko modules does not contain 
>>> needed alias?
>> 
> 
> At least driver is renaming in upstream kernel, so hardcoding driver
> name is wrong approach. It will be broken... If we show that
> request_module is really needed (but I believe not!) then please use
> alias instead.

> 
>> alias exists:
>> 
>> #ifdef CONFIG_BATTERY_BQ27X00_PLATFORM
>> MODULE_ALIAS("platform:bq27000-battery");
>> #endif
>> 
>> depmod entry exist:
>> 
>> root@letux:~# modprobe -c | fgrep bq27
>> alias i2c:bq27000_battery bq27x00_battery
>> alias i2c:bq27200 bq27x00_battery
>> alias i2c:bq27425 bq27x00_battery
>> alias i2c:bq27500 bq27x00_battery
>> alias i2c:bq27510 bq27x00_battery
>> alias i2c:bq27742 bq27x00_battery
>> alias platform:bq27000_battery bq27x00_battery
>> alias w1_family_0x01 w1_bq27000
>> 
>> And I have traced all calls to call_modprobe
>> 
>> [    9.969085] call_modprobe w1-family-0x01
>> [   10.189727] call_modprobe bq27x00_battery

I have tried without request_module("bq27x00_battery") and this
call to call_modprobe() disappears.

But it still works, i.e. the module appears in lsmod!

I am a bit puzzled now...

What could have happened:
* there was no automatic module load when we developed
the patch (a while ago - it was sleeping in our development tree)
* when automatic load was improved somewhere else, we
did not notice (because a second request_module() does
not have a visible side-effects)
* so we just though that this is still required and did not check
that it isn't any more

So as it appears to work, we can simply drop it from the patch
set (and our development tree) v2.

Sorry for the noise and thanks for helping to find it.

>> [   29.879333] call_modprobe net-pf-10
>> [   30.530548] call_modprobe netdev-eth0
>> [   30.548156] call_modprobe eth0
>> [   30.565063] call_modprobe netdev-eth0
>> [   30.581420] call_modprobe eth0
>> [   31.301300] call_modprobe netdev-eth1
>> [   31.316101] call_modprobe eth1
>> [   32.008270] call_modprobe usbfunc:ecm
>> [   35.554748] call_modprobe net-pf-16-proto-9
>> [   36.243164] call_modprobe net-pf-31
>> [   36.614410] call_modprobe bt-proto-4
>> [   73.888122] call_modprobe net-pf-16-proto-9
>> [   73.921112] call_modprobe net-pf-16-proto-9
>> [   77.153625] call_modprobe net-pf-16-proto-9
>> [   77.188262] call_modprobe net-pf-16-proto-9
>> [   77.342895] call_modprobe net-pf-16-proto-9
>> [   77.389129] call_modprobe net-pf-16-proto-9
>> [   77.419006] call_modprobe net-pf-16-proto-9
>> 
>> And there is only the line I have added. I.e. I can't find an automatic attempt
>> to load the platform:bq27000-battery. It also doesn't help to change to 
>> platform_device_alloc("bq27000_battery", -1)
>> 
>> So I think platform_device_alloc() does only what it tells: it allocates a device
>> but does *not* try to load a kernel module. It only binds to a driver compiled
>> into the kernel. AFAIR the I2C bus driver also calls request_module() at some
>> stage after finding a client (i2c:bq27000_battery).
>> 
> 
> Try to call platform_device_register(). E.g for rx51-battery power
> supply device it is working fine. Device itself is allocated and
> registered in arch/arm/mach-omap2/board-rx51-peripherals.c and driver is
> in drivers/power/rx51_battery.c. You can also try to reuse that code...
> I see that w1 is quite different.
> 
>>> Adding request_module() here is not proper solution. Real problem is 
>>> somewhere else... Anyway there is series of patches for bq27x00_battery 
>>> which should cleanup some problems, so maybe they also fix your problem.
>> 
>> Is there a tree where I can pull the patches to cross-check if they change
>> something?
>> 
> 
> Sebastian? Where are those new bq27k patches now?
> 
>> BR,
>> Nikolaus
>> 
> 
> -- 
> Pali Rohár
> pali.rohar@gmail.com

BR,
Nikolaus

--
To unsubscribe from this list: send the line "unsubscribe linux-pm" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/drivers/w1/slaves/w1_bq27000.c b/drivers/w1/slaves/w1_bq27000.c
index caafb17..745bd6e 100644
--- a/drivers/w1/slaves/w1_bq27000.c
+++ b/drivers/w1/slaves/w1_bq27000.c
@@ -49,6 +49,8 @@  static int w1_bq27000_add_slave(struct w1_slave *sl)
 	int ret;
 	struct platform_device *pdev;
 
+	request_module("bq27x00_battery");  /* load as module if needed */
+
 	pdev = platform_device_alloc("bq27000-battery", -1);
 	if (!pdev) {
 		ret = -ENOMEM;