Adding the i2c-folks on Cc. On Tue, Aug 20, 2024 at 5:02 PM Fabio Estevam <festevam@xxxxxxxxx> 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().