Re: [RFC/RFT PATCH 2/2] mfd: max14577: Allow driver to be built as a module

From: Javier Martinez Canillas
Date: Thu Mar 17 2016 - 11:37:50 EST


Hello Chanwoo,

On 03/16/2016 10:58 PM, Chanwoo Choi wrote:
> On 2016ë 03ì 17ì 01:48, Javier Martinez Canillas wrote:
>> The driver's Kconfig symbol is a boolean but nothing prevents the driver
>> to be built as a module instead of built-in. It is true that most system
>> integrators will choose the latter but the config should not restrict it.
>>
>> Suggested-by: Krzysztof Kozlowski <k.kozlowski@xxxxxxxxxxx>
>> Signed-off-by: Javier Martinez Canillas <javier@xxxxxxxxxxxxxxx>
>>
>> ---
>>
>> drivers/mfd/Kconfig | 4 ++--
>> 1 file changed, 2 insertions(+), 2 deletions(-)
>>
>> diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig
>> index eea61e349e26..be0ff820621b 100644
>> --- a/drivers/mfd/Kconfig
>> +++ b/drivers/mfd/Kconfig
>> @@ -514,8 +514,8 @@ config MFD_88PM860X
>> battery-charger under the corresponding menus.
>>
>> config MFD_MAX14577
>> - bool "Maxim Semiconductor MAX14577/77836 MUIC + Charger Support"
>> - depends on I2C=y
>> + tristate "Maxim Semiconductor MAX14577/77836 MUIC + Charger Support"
>> + depends on I2C
>> select MFD_CORE
>> select REGMAP_I2C
>> select REGMAP_IRQ
>>
>
> When I test the kernel build with these patch-set on next-20160316 tag,
> the following errors happen.
>

You are absolutely right, there was an error on my test script and always
built it as built-in instead of as a module. I'm so sorry about that...

> ERROR: "maxim_charger_calc_reg_current" [drivers/regulator/max14577.ko] undefined!
> ERROR: "maxim_charger_currents" [drivers/regulator/max14577.ko] undefined!
> ERROR: "maxim_charger_currents" [drivers/power/max14577_charger.ko] undefined!
> ERROR: "maxim_charger_calc_reg_current" [drivers/power/max14577_charger.ko] undefined!
>

This seems to be a latent bug that was exposed by making the max14577 MFD
Kconfig symbol tristate. Since I'm able to reproduce it even without the
patches by enabling the max14577 regulator and power drivers as a module.

These steps reproduce it on just next-20160316 without any other changes:

$ make exynos_defconfig
$ ./scripts/config --module CONFIG_REGULATOR_MAX14577
$ ./scripts/config --module CONFIG_CHARGER_MAX14577
$ make modules_prepare

$ make M=drivers/regulator/
...
CC [M] drivers/regulator//max14577.o
Building modules, stage 2.
MODPOST 1 modules
WARNING: "maxim_charger_calc_reg_current" [drivers/regulator//max14577.ko] undefined!
WARNING: "maxim_charger_currents" [drivers/regulator//max14577.ko] undefined!

$ make M=drivers/power
...
CC [M] drivers/power/max14577_charger.o
Building modules, stage 2.
MODPOST 1 modules
WARNING: "maxim_charger_calc_reg_current" [drivers/power/max14577_charger.ko] undefined!
WARNING: "maxim_charger_currents" [drivers/power/max14577_charger.ko] undefined!

Now, from a quick look the functions have EXPORT_SYMBOL_GPL() and the
function prototype declaration is in include/linux/mfd/max14577.h so
that should work AFAICT...

I'll take a look to this since it has to be fixed before the other patches.

> Best Regards,
> Chanwoo Choi
>

Best regards,
--
Javier Martinez Canillas
Open Source Group
Samsung Research America