On Tuesday 20 of December 2011 at 19:06:11, Tony Lindgren wrote: > * Janusz Krzysztofik <jkrzyszt@xxxxxxxxxxxx> [111219 14:57]: > > Resending because of a typo in the Cc: list, sorry. > > > > 8<-------------------------- > > > > In preparation to converting Amstrad Delta on-board latches to > > basic_mmio_gpio devices, registration of platform devices which depend > > on latches and will require initialization of their GPIO pins first, > > should be moved out of .machine_init down to late_initcall level, as the > > gpio-generic driver is not available until device_initcall time. The > > latch reset operation, which will be replaced with GPIO initialization, > > must also be moved to late_initcall for the same reason. > > > > Since there was already another, separate arch_initcall function for > > setting up one of those latch dependent devices, the on-board modem > > device, reuse that function, i.e., rename it to a name that matches the > > new purpose, extend with other device setup relocated from > > .machine_init, and move down to the late_initcall level. > > > > While being at it, add missing gpio_free() in case the modem platform > > device registration fails. > > > > In addition, defer registration of the Amstrad Delta ASoC and serio > > devices, done from their device driver files, until late_initcall time, > > as those drivers will depend on their GPIO pins already requested from > > the board late_init() function until updated to register their GPIO pins > > themselves. > > > > Thanks to Tony Lindgren <tony@xxxxxxxxxxx> who suggested this approach > > instead of shifting up the gpio-generic driver initialization. > ... > > > --- a/drivers/input/serio/ams_delta_serio.c > > +++ b/drivers/input/serio/ams_delta_serio.c > > @@ -165,6 +165,9 @@ serio: > > kfree(ams_delta_serio); > > return err; > > } > > +#ifndef MODULE > > +late_initcall(ams_delta_serio_init); > > +#else > > module_init(ams_delta_serio_init); > > > > static void __exit ams_delta_serio_exit(void) > > @@ -175,3 +178,4 @@ static void __exit ams_delta_serio_exit(void) > > gpio_free(AMS_DELTA_GPIO_PIN_KEYBRD_DATA); > > } > > module_exit(ams_delta_serio_exit); > > +#endif > > diff --git a/sound/soc/omap/ams-delta.c b/sound/soc/omap/ams-delta.c > > index ccb8a6a..1764a3b 100644 > > --- a/sound/soc/omap/ams-delta.c > > +++ b/sound/soc/omap/ams-delta.c > > @@ -636,6 +636,9 @@ err: > > platform_device_put(ams_delta_audio_platform_device); > > return ret; > > } > > +#ifndef MODULE > > +late_initcall(ams_delta_module_init); > > +#else > > module_init(ams_delta_module_init); > > > > static void __exit ams_delta_module_exit(void) > > @@ -657,6 +660,7 @@ static void __exit ams_delta_module_exit(void) > > platform_device_unregister(ams_delta_audio_platform_device); > > } > > module_exit(ams_delta_module_exit); > > +#endif > > > > MODULE_AUTHOR("Janusz Krzysztofik <jkrzyszt@xxxxxxxxxxxx>"); > > MODULE_DESCRIPTION("ALSA SoC driver for Amstrad E3 (Delta) videophone"); > > This looks a bit odd.. I think these drivers should be converted to > a proper platform_driver so you can get rid of the machine_is_ams_delta > check in the init. Then you can rely on the probe to match the > device. Mostly true, but first of all, I don't pretend to solve all problems with all Amstrad Delta specific drivers in this patch series. I'm concentrating on converting latches to GPIO pins, and updating those drivers to access those pins with gpiolib API instead of accessing the latches with the board specific API. Nothing more. Now, regarding the serio driver, you are absolutely right, the device registration could be better moved out of the driver file to the board file. I'll probably do this some time in the future, once I'm ready with the latches related stuff, i.e. the ams_delta_latch_write() is finally removed from the board file as no longer used by any driver, and find some spare time again. For now, I'm moving that serio device/driver initialization to late_initcall with patch 2/7, and back to device_initcall once converted to gpiolib (patch 7/7). Is this acceptable? If not, let's drop those forward and back moves, and the driver will get broken with 2/7, but get repaired with 7/7, OK? Regarding the sound card: the sound/soc/omap/ams-delta.c file is not a device driver per se, but rather a piece of code which sets up a platform device representing the sound card, i.e., provides platform device description and platform data, including device specific callbacks, to be used by the generic 'soc-audio' driver. There is no single platform_driver_register() called from that file, only platform_device_register() or alike. That code seems to belong logically to the board setup, but was always maintained, among 12 others, and for reasons not known to me with my relatively short experience as a kernel developer, inside the sound/soc/omap/ subtree, not under arch/arm/mach- omap1/. Like all those 12 others, including sdp4430 which is quite recent I guess, it makes use of the machine_is_* function as if it was a part of a board files set. Then, the only way I can see to defer the device initialization until late_initcall time, with the soc-audio driver already loaded at the device_initcall level, is to move with that sound card platform device setup code, found in sound/soc/omap/ams- delta.c, to the late_initcall. Am I missing something? > To deal with the init order issues, you can pass a set_power > function pointer in platform_data that the driver can use. Or > set up a fixed regulator for it. I'm already working on the follow up patch series mentioned in the cover letter, and yes, I'm using the fixed regulator. Be patient, please, as my resources are somehow limited. Thanks, Janusz -- To unsubscribe from this list: send the line "unsubscribe linux-omap" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html