pca953x: Probing too early
Fabio Estevam
festevam at gmail.com
Tue Aug 20 13:47:27 PDT 2024
Adding the i2c-folks on Cc.
On Tue, Aug 20, 2024 at 5:02 PM Fabio Estevam <festevam at gmail.com> wrote:
>
> Hi,
>
> I am seeing an issue with the PCA935X driver in 6.6.41 and
> 6.11.0-rc4-next-20240820.
>
> The pca953x is getting probed before its I2C parent (i2c-2):
>
> [ 1.872917] pca953x 2-0020: supply vcc not found, using dummy regulator
> [ 1.889195] pca953x 2-0020: using no AI
> [ 1.893260] pca953x 2-0020: failed writing register
> [ 1.898258] pca953x 2-0020: probe with driver pca953x failed with error -11
> [ 1.905575] i2c i2c-2: IMX I2C adapter registered
>
> This problem is seen on a custom imx8mp board.
> I am not able to reproduce it on an imx8mm-evk.
>
> If I select the pca953x as a module or insert a delay inside its
> probe() function, it probes successfully.
>
> The drivers/gpio/gpio-pca953x.c has the following comments:
>
> /* register after i2c postcore initcall and before
> * subsys initcalls that may rely on these GPIOs
> */
> subsys_initcall(pca953x_init);
>
> but it seems this is not happening.
>
> I have also tried to register it like this:
>
> --- a/drivers/gpio/gpio-pca953x.c
> +++ b/drivers/gpio/gpio-pca953x.c
> @@ -1369,21 +1369,7 @@ static struct i2c_driver pca953x_driver = {
> .remove = pca953x_remove,
> .id_table = pca953x_id,
> };
> -
> -static int __init pca953x_init(void)
> -{
> - return i2c_add_driver(&pca953x_driver);
> -}
> -/* register after i2c postcore initcall and before
> - * subsys initcalls that may rely on these GPIOs
> - */
> -subsys_initcall(pca953x_init);
> -
> -static void __exit pca953x_exit(void)
> -{
> - i2c_del_driver(&pca953x_driver);
> -}
> -module_exit(pca953x_exit);
> +module_i2c_driver(pca953x_driver);
> )
>
> but this did not help either.
>
> Does anyone have any suggestions on how to fix this problem when the
> pca953x driver is built-in?
If I register the i2c-imx driver like this:
--- a/drivers/i2c/busses/i2c-imx.c
+++ b/drivers/i2c/busses/i2c-imx.c
@@ -1638,18 +1638,7 @@ static struct platform_driver i2c_imx_driver = {
},
.id_table = imx_i2c_devtype,
};
-
-static int __init i2c_adap_imx_init(void)
-{
- return platform_driver_register(&i2c_imx_driver);
-}
-subsys_initcall(i2c_adap_imx_init);
-
-static void __exit i2c_adap_imx_exit(void)
-{
- platform_driver_unregister(&i2c_imx_driver);
-}
-module_exit(i2c_adap_imx_exit);
+module_platform_driver(i2c_imx_driver);
then the pca953x driver probes correctly.
:~/stable/linux$ git grep subsys_initcall drivers/i2c/ | wc -l
15
:~/stable/linux$ git grep module_platform_driver drivers/i2c/ | wc -l
75
Most of the I2C drivers are registered as module_platform_driver().
More information about the linux-arm-kernel
mailing list