* [U-Boot] [PATCH v3 0/2] mmc: Board-specific MMC power initializations @ 2014-11-01 10:52 Paul Kocialkowski 2014-11-01 10:52 ` [U-Boot] [PATCH v3 1/2] " Paul Kocialkowski 2014-11-01 10:52 ` [U-Boot] [PATCH v3 2/2] omap_hsmmc: Board-specific TWL4030 " Paul Kocialkowski 0 siblings, 2 replies; 9+ messages in thread From: Paul Kocialkowski @ 2014-11-01 10:52 UTC (permalink / raw) To: u-boot Changelog: v3: Changes to make v2 apply on master v2: Implement board_mmc_power_init instead of define ^ permalink raw reply [flat|nested] 9+ messages in thread
* [U-Boot] [PATCH v3 1/2] mmc: Board-specific MMC power initializations 2014-11-01 10:52 [U-Boot] [PATCH v3 0/2] mmc: Board-specific MMC power initializations Paul Kocialkowski @ 2014-11-01 10:52 ` Paul Kocialkowski 2014-11-02 13:23 ` Igor Grinberg 2014-11-01 10:52 ` [U-Boot] [PATCH v3 2/2] omap_hsmmc: Board-specific TWL4030 " Paul Kocialkowski 1 sibling, 1 reply; 9+ messages in thread From: Paul Kocialkowski @ 2014-11-01 10:52 UTC (permalink / raw) To: u-boot Some devices may use non-standard combinations of regulators to power MMC: this allows these devices to provide a board-specific MMC power init function to set everything up in their own way. Signed-off-by: Paul Kocialkowski <contact@paulk.fr> --- drivers/mmc/mmc.c | 8 ++++++++ include/mmc.h | 1 + 2 files changed, 9 insertions(+) diff --git a/drivers/mmc/mmc.c b/drivers/mmc/mmc.c index 44a4feb..125f347 100644 --- a/drivers/mmc/mmc.c +++ b/drivers/mmc/mmc.c @@ -1277,6 +1277,12 @@ block_dev_desc_t *mmc_get_dev(int dev) } #endif +/* board-specific MMC power initializations. */ +__weak int board_mmc_power_init(void) +{ + return -1; +} + int mmc_start_init(struct mmc *mmc) { int err; @@ -1293,6 +1299,8 @@ int mmc_start_init(struct mmc *mmc) if (mmc->has_init) return 0; + board_mmc_power_init(); + /* made sure it's not NULL earlier */ err = mmc->cfg->ops->init(mmc); diff --git a/include/mmc.h b/include/mmc.h index d74a190..aaea644 100644 --- a/include/mmc.h +++ b/include/mmc.h @@ -385,6 +385,7 @@ struct mmc *mmc_spi_init(uint bus, uint cs, uint speed, uint mode); int mmc_legacy_init(int verbose); #endif +int board_mmc_power_init(void); int board_mmc_init(bd_t *bis); int cpu_mmc_init(bd_t *bis); int mmc_get_env_addr(struct mmc *mmc, int copy, u32 *env_addr); -- 1.9.1 ^ permalink raw reply related [flat|nested] 9+ messages in thread
* [U-Boot] [PATCH v3 1/2] mmc: Board-specific MMC power initializations 2014-11-01 10:52 ` [U-Boot] [PATCH v3 1/2] " Paul Kocialkowski @ 2014-11-02 13:23 ` Igor Grinberg 2014-11-02 18:51 ` Paul Kocialkowski 0 siblings, 1 reply; 9+ messages in thread From: Igor Grinberg @ 2014-11-02 13:23 UTC (permalink / raw) To: u-boot Hi Paul, On 11/01/14 12:52, Paul Kocialkowski wrote: > Some devices may use non-standard combinations of regulators to power MMC: > this allows these devices to provide a board-specific MMC power init function > to set everything up in their own way. > > Signed-off-by: Paul Kocialkowski <contact@paulk.fr> > --- > drivers/mmc/mmc.c | 8 ++++++++ > include/mmc.h | 1 + > 2 files changed, 9 insertions(+) > > diff --git a/drivers/mmc/mmc.c b/drivers/mmc/mmc.c > index 44a4feb..125f347 100644 > --- a/drivers/mmc/mmc.c > +++ b/drivers/mmc/mmc.c > @@ -1277,6 +1277,12 @@ block_dev_desc_t *mmc_get_dev(int dev) > } > #endif > > +/* board-specific MMC power initializations. */ > +__weak int board_mmc_power_init(void) > +{ > + return -1; > +} > + > int mmc_start_init(struct mmc *mmc) > { > int err; > @@ -1293,6 +1299,8 @@ int mmc_start_init(struct mmc *mmc) > if (mmc->has_init) > return 0; > > + board_mmc_power_init(); > + Shouldn't we have some error handling here? > /* made sure it's not NULL earlier */ > err = mmc->cfg->ops->init(mmc); > > diff --git a/include/mmc.h b/include/mmc.h > index d74a190..aaea644 100644 > --- a/include/mmc.h > +++ b/include/mmc.h > @@ -385,6 +385,7 @@ struct mmc *mmc_spi_init(uint bus, uint cs, uint speed, uint mode); > int mmc_legacy_init(int verbose); > #endif > > +int board_mmc_power_init(void); > int board_mmc_init(bd_t *bis); > int cpu_mmc_init(bd_t *bis); > int mmc_get_env_addr(struct mmc *mmc, int copy, u32 *env_addr); > -- Regards, Igor. ^ permalink raw reply [flat|nested] 9+ messages in thread
* [U-Boot] [PATCH v3 1/2] mmc: Board-specific MMC power initializations 2014-11-02 13:23 ` Igor Grinberg @ 2014-11-02 18:51 ` Paul Kocialkowski 2014-11-03 7:35 ` Igor Grinberg 0 siblings, 1 reply; 9+ messages in thread From: Paul Kocialkowski @ 2014-11-02 18:51 UTC (permalink / raw) To: u-boot Hi Igor, > On 11/01/14 12:52, Paul Kocialkowski wrote: > > Some devices may use non-standard combinations of regulators to power MMC: > > this allows these devices to provide a board-specific MMC power init function > > to set everything up in their own way. > > > > Signed-off-by: Paul Kocialkowski <contact@paulk.fr> > > --- > > drivers/mmc/mmc.c | 8 ++++++++ > > include/mmc.h | 1 + > > 2 files changed, 9 insertions(+) > > > > diff --git a/drivers/mmc/mmc.c b/drivers/mmc/mmc.c > > index 44a4feb..125f347 100644 > > --- a/drivers/mmc/mmc.c > > +++ b/drivers/mmc/mmc.c > > @@ -1277,6 +1277,12 @@ block_dev_desc_t *mmc_get_dev(int dev) > > } > > #endif > > > > +/* board-specific MMC power initializations. */ > > +__weak int board_mmc_power_init(void) > > +{ > > + return -1; > > +} > > + > > int mmc_start_init(struct mmc *mmc) > > { > > int err; > > @@ -1293,6 +1299,8 @@ int mmc_start_init(struct mmc *mmc) > > if (mmc->has_init) > > return 0; > > > > + board_mmc_power_init(); > > + > > Shouldn't we have some error handling here? I noticed how weak implementations tend to return -1 and not have their return code checked so much (see the other two such functions in mmc.c). I would be fine with checking the return code and returning 0 in the weak implementation. If you think that's better, I'll make a new version with that. > > /* made sure it's not NULL earlier */ > > err = mmc->cfg->ops->init(mmc); > > > > diff --git a/include/mmc.h b/include/mmc.h > > index d74a190..aaea644 100644 > > --- a/include/mmc.h > > +++ b/include/mmc.h > > @@ -385,6 +385,7 @@ struct mmc *mmc_spi_init(uint bus, uint cs, uint speed, uint mode); > > int mmc_legacy_init(int verbose); > > #endif > > > > +int board_mmc_power_init(void); > > int board_mmc_init(bd_t *bis); > > int cpu_mmc_init(bd_t *bis); > > int mmc_get_env_addr(struct mmc *mmc, int copy, u32 *env_addr); > > > -------------- next part -------------- A non-text attachment was scrubbed... Name: signature.asc Type: application/pgp-signature Size: 819 bytes Desc: This is a digitally signed message part URL: <http://lists.denx.de/pipermail/u-boot/attachments/20141102/3aba81b0/attachment.pgp> ^ permalink raw reply [flat|nested] 9+ messages in thread
* [U-Boot] [PATCH v3 1/2] mmc: Board-specific MMC power initializations 2014-11-02 18:51 ` Paul Kocialkowski @ 2014-11-03 7:35 ` Igor Grinberg 0 siblings, 0 replies; 9+ messages in thread From: Igor Grinberg @ 2014-11-03 7:35 UTC (permalink / raw) To: u-boot -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Hi Paul, On 11/02/14 20:51, Paul Kocialkowski wrote: > Hi Igor, > >> On 11/01/14 12:52, Paul Kocialkowski wrote: >>> Some devices may use non-standard combinations of regulators to power MMC: >>> this allows these devices to provide a board-specific MMC power init function >>> to set everything up in their own way. >>> >>> Signed-off-by: Paul Kocialkowski <contact@paulk.fr> >>> --- >>> drivers/mmc/mmc.c | 8 ++++++++ >>> include/mmc.h | 1 + >>> 2 files changed, 9 insertions(+) >>> >>> diff --git a/drivers/mmc/mmc.c b/drivers/mmc/mmc.c >>> index 44a4feb..125f347 100644 >>> --- a/drivers/mmc/mmc.c >>> +++ b/drivers/mmc/mmc.c >>> @@ -1277,6 +1277,12 @@ block_dev_desc_t *mmc_get_dev(int dev) >>> } >>> #endif >>> >>> +/* board-specific MMC power initializations. */ >>> +__weak int board_mmc_power_init(void) >>> +{ >>> + return -1; >>> +} >>> + >>> int mmc_start_init(struct mmc *mmc) >>> { >>> int err; >>> @@ -1293,6 +1299,8 @@ int mmc_start_init(struct mmc *mmc) >>> if (mmc->has_init) >>> return 0; >>> >>> + board_mmc_power_init(); >>> + >> >> Shouldn't we have some error handling here? > > I noticed how weak implementations tend to return -1 and not have their > return code checked so much (see the other two such functions in mmc.c). > I would be fine with checking the return code and returning 0 in the > weak implementation. > > If you think that's better, I'll make a new version with that. Well, otherwise it does not make sense to return int, does it? IMO it is a good practice to check the return value, and may be emit a warning or something (I'm not really sure if it should abort the init sequence). Since I can't propose a good handling now, may be we should leave it for now and see if someone comes up with a good case for it. I'm fine with your decision. > >>> /* made sure it's not NULL earlier */ >>> err = mmc->cfg->ops->init(mmc); >>> >>> diff --git a/include/mmc.h b/include/mmc.h >>> index d74a190..aaea644 100644 >>> --- a/include/mmc.h >>> +++ b/include/mmc.h >>> @@ -385,6 +385,7 @@ struct mmc *mmc_spi_init(uint bus, uint cs, uint speed, uint mode); >>> int mmc_legacy_init(int verbose); >>> #endif >>> >>> +int board_mmc_power_init(void); >>> int board_mmc_init(bd_t *bis); >>> int cpu_mmc_init(bd_t *bis); >>> int mmc_get_env_addr(struct mmc *mmc, int copy, u32 *env_addr); >>> >> > - -- Regards, Igor. -----BEGIN PGP SIGNATURE----- Version: GnuPG v2 iQIcBAEBAgAGBQJUVzBHAAoJEBDE8YO64EfayhsP/jV2YAR6jH6gZJBNn/wGnHId a8U0YGG+f30RBPCdfCiraSRpL1C876wsf+InNDAHgo4HSaRdRwF4tUqWj78SpH9F QTo3qcA6S8S4GIRJ2+q+3BmtlEuYPWOZOi41erhaUF3kMLw6cMt+gL0Ggx4OXQAo 2bhSeQaaGynoFJwC0dIf0QhDjRkPCHbNh2IgROfRye0a7/0pF4tN/tvjLSxw8w54 3457N4TYreGEmMMrtNi/psekMYTjR6JFve3CwiMvOXiwOJGz/d6qj7vhw4Ba7q5i LE385Zj24Bi/+m7ls7hp5I522O0tkShGgPI3XvCiT4xrjXDBihsWG9RGsLSc5vBY EimiztfLVu3alc1cxclK9tq0p+FwyUNwXsUED+oR6t56/qr/BSWiSIDAMfN1zcfI paK9zXDoGvhg6T0pK+SsRvAE4D7vg+XT8WSU52l6/h8TRKB6r3cupSMXAyjmUpLl 1pEozVsg4qW6rJawQOiCjl0YU3ixeVwk0vmWWh+gBOMMLsuikQpFI5s6zUXteqnl IHFS6oiYW/SVppHrd95624suZQPTsrH6+4CvmBwmtBGbmErchsgfj8qjP/ilpn1a Y6Kv0mj2ndkgdFAc7zIEpwzF9yPsewVg8nc+vYLezyT7ePeTNYLpPWgQTL6qEdHH lcK7qYNEaYWIUMkbQM5P =7kRq -----END PGP SIGNATURE----- ^ permalink raw reply [flat|nested] 9+ messages in thread
* [U-Boot] [PATCH v3 2/2] omap_hsmmc: Board-specific TWL4030 MMC power initializations 2014-11-01 10:52 [U-Boot] [PATCH v3 0/2] mmc: Board-specific MMC power initializations Paul Kocialkowski 2014-11-01 10:52 ` [U-Boot] [PATCH v3 1/2] " Paul Kocialkowski @ 2014-11-01 10:52 ` Paul Kocialkowski 2014-11-02 13:40 ` Igor Grinberg 1 sibling, 1 reply; 9+ messages in thread From: Paul Kocialkowski @ 2014-11-01 10:52 UTC (permalink / raw) To: u-boot Boards using the TWL4030 regulator may not all use the LDOs the same way (e.g. MMC2 power can be controlled by another LDO than VMMC2). This delegates TWL4030 MMC power initializations to board-specific functions, that may still call twl4030_power_mmc_init for the default behavior. Signed-off-by: Paul Kocialkowski <contact@paulk.fr> --- board/comelit/dig297/dig297.c | 9 +++++++++ board/compulab/cm_t35/cm_t35.c | 11 +++++++++++ board/corscience/tricorder/tricorder.c | 11 +++++++++++ board/isee/igep00x0/igep00x0.c | 11 +++++++++++ board/logicpd/omap3som/omap3logic.c | 11 +++++++++++ board/logicpd/zoom1/zoom1.c | 9 +++++++++ board/matrix_vision/mvblx/mvblx.c | 9 +++++++++ board/nokia/rx51/rx51.c | 9 +++++++++ board/overo/overo.c | 11 +++++++++++ board/pandora/pandora.c | 9 +++++++++ board/technexion/tao3530/tao3530.c | 11 +++++++++++ board/ti/beagle/beagle.c | 11 +++++++++++ board/ti/evm/evm.c | 11 +++++++++++ board/ti/sdp3430/sdp.c | 9 +++++++++ board/timll/devkit8000/devkit8000.c | 11 +++++++++++ drivers/mmc/omap_hsmmc.c | 7 +------ 16 files changed, 154 insertions(+), 6 deletions(-) diff --git a/board/comelit/dig297/dig297.c b/board/comelit/dig297/dig297.c index 2b826df..784483b 100644 --- a/board/comelit/dig297/dig297.c +++ b/board/comelit/dig297/dig297.c @@ -133,6 +133,15 @@ int board_mmc_init(bd_t *bis) { return omap_mmc_init(0, 0, 0, -1, -1); } + +int board_mmc_power_init(void) +{ +#if defined(CONFIG_TWL4030_POWER) + twl4030_power_mmc_init(); + mdelay(100); /* ramp-up delay from Linux code */ +#endif + return 0; +} #endif #ifdef CONFIG_CMD_NET diff --git a/board/compulab/cm_t35/cm_t35.c b/board/compulab/cm_t35/cm_t35.c index d0b0930..2e59618 100644 --- a/board/compulab/cm_t35/cm_t35.c +++ b/board/compulab/cm_t35/cm_t35.c @@ -462,6 +462,17 @@ int board_mmc_init(bd_t *bis) } #endif +#if defined(CONFIG_GENERIC_MMC) +int board_mmc_power_init(void) +{ +#if defined(CONFIG_TWL4030_POWER) + twl4030_power_mmc_init(); + mdelay(100); /* ramp-up delay from Linux code */ +#endif + return 0; +} +#endif + /* * Routine: setup_net_chip_gmpc * Description: Setting up the configuration GPMC registers specific to the diff --git a/board/corscience/tricorder/tricorder.c b/board/corscience/tricorder/tricorder.c index 9e81bf3..9ade210 100644 --- a/board/corscience/tricorder/tricorder.c +++ b/board/corscience/tricorder/tricorder.c @@ -147,6 +147,17 @@ int board_mmc_init(bd_t *bis) } #endif +#if defined(CONFIG_GENERIC_MMC) +int board_mmc_power_init(void) +{ +#if defined(CONFIG_TWL4030_POWER) + twl4030_power_mmc_init(); + mdelay(100); /* ramp-up delay from Linux code */ +#endif + return 0; +} +#endif + /* * Routine: get_board_mem_timings * Description: If we use SPL then there is no x-loader nor config header diff --git a/board/isee/igep00x0/igep00x0.c b/board/isee/igep00x0/igep00x0.c index 7b87cc2..70e7ca8 100644 --- a/board/isee/igep00x0/igep00x0.c +++ b/board/isee/igep00x0/igep00x0.c @@ -150,6 +150,17 @@ int board_mmc_init(bd_t *bis) } #endif +#if defined(CONFIG_GENERIC_MMC) +int board_mmc_power_init(void) +{ +#if defined(CONFIG_TWL4030_POWER) + twl4030_power_mmc_init(); + mdelay(100); /* ramp-up delay from Linux code */ +#endif + return 0; +} +#endif + void set_fdt(void) { switch (gd->bd->bi_arch_number) { diff --git a/board/logicpd/omap3som/omap3logic.c b/board/logicpd/omap3som/omap3logic.c index 1fd9f2c..1566a3b 100644 --- a/board/logicpd/omap3som/omap3logic.c +++ b/board/logicpd/omap3som/omap3logic.c @@ -128,6 +128,17 @@ int board_mmc_init(bd_t *bis) } #endif +#if defined(CONFIG_GENERIC_MMC) +int board_mmc_power_init(void) +{ +#if defined(CONFIG_TWL4030_POWER) + twl4030_power_mmc_init(); + mdelay(100); /* ramp-up delay from Linux code */ +#endif + return 0; +} +#endif + #ifdef CONFIG_SMC911X /* GPMC CS1 settings for Logic SOM LV/Torpedo LAN92xx Ethernet chip */ static const u32 gpmc_lan92xx_config[] = { diff --git a/board/logicpd/zoom1/zoom1.c b/board/logicpd/zoom1/zoom1.c index 9ef0026..2556290 100644 --- a/board/logicpd/zoom1/zoom1.c +++ b/board/logicpd/zoom1/zoom1.c @@ -109,6 +109,15 @@ int board_mmc_init(bd_t *bis) { return omap_mmc_init(0, 0, 0, -1, -1); } + +int board_mmc_power_init(void) +{ +#if defined(CONFIG_TWL4030_POWER) + twl4030_power_mmc_init(); + mdelay(100); /* ramp-up delay from Linux code */ +#endif + return 0; +} #endif #ifdef CONFIG_CMD_NET diff --git a/board/matrix_vision/mvblx/mvblx.c b/board/matrix_vision/mvblx/mvblx.c index a69359f..1f4ca47 100644 --- a/board/matrix_vision/mvblx/mvblx.c +++ b/board/matrix_vision/mvblx/mvblx.c @@ -94,6 +94,15 @@ int board_mmc_init(bd_t *bis) omap_mmc_init(1, 0, 0, -1, -1); return 0; } + +int board_mmc_power_init(void) +{ +#if defined(CONFIG_TWL4030_POWER) + twl4030_power_mmc_init(); + mdelay(100); /* ramp-up delay from Linux code */ +#endif + return 0; +} #endif #if defined(CONFIG_CMD_NET) diff --git a/board/nokia/rx51/rx51.c b/board/nokia/rx51/rx51.c index c2e07db..e313fc2 100644 --- a/board/nokia/rx51/rx51.c +++ b/board/nokia/rx51/rx51.c @@ -659,3 +659,12 @@ int board_mmc_init(bd_t *bis) omap_mmc_init(1, 0, 0, -1, -1); return 0; } + +int board_mmc_power_init(void) +{ +#if defined(CONFIG_TWL4030_POWER) + twl4030_power_mmc_init(); + mdelay(100); /* ramp-up delay from Linux code */ +#endif + return 0; +} diff --git a/board/overo/overo.c b/board/overo/overo.c index dfb8602..64ecc28 100644 --- a/board/overo/overo.c +++ b/board/overo/overo.c @@ -493,6 +493,17 @@ int board_mmc_init(bd_t *bis) } #endif +#if defined(CONFIG_GENERIC_MMC) +int board_mmc_power_init(void) +{ +#if defined(CONFIG_TWL4030_POWER) + twl4030_power_mmc_init(); + mdelay(100); /* ramp-up delay from Linux code */ +#endif + return 0; +} +#endif + #if defined(CONFIG_USB_EHCI) && !defined(CONFIG_SPL_BUILD) static struct omap_usbhs_board_data usbhs_bdata = { .port_mode[0] = OMAP_USBHS_PORT_MODE_UNUSED, diff --git a/board/pandora/pandora.c b/board/pandora/pandora.c index 146dcea..8fa0119 100644 --- a/board/pandora/pandora.c +++ b/board/pandora/pandora.c @@ -126,4 +126,13 @@ int board_mmc_init(bd_t *bis) { return omap_mmc_init(0, 0, 0, -1, -1); } + +int board_mmc_power_init(void) +{ +#if defined(CONFIG_TWL4030_POWER) + twl4030_power_mmc_init(); + mdelay(100); /* ramp-up delay from Linux code */ +#endif + return 0; +} #endif diff --git a/board/technexion/tao3530/tao3530.c b/board/technexion/tao3530/tao3530.c index 44a8240..64f2313 100644 --- a/board/technexion/tao3530/tao3530.c +++ b/board/technexion/tao3530/tao3530.c @@ -188,6 +188,17 @@ int board_mmc_init(bd_t *bis) } #endif +#if defined(CONFIG_GENERIC_MMC) +int board_mmc_power_init(void) +{ +#if defined(CONFIG_TWL4030_POWER) + twl4030_power_mmc_init(); + mdelay(100); /* ramp-up delay from Linux code */ +#endif + return 0; +} +#endif + #if defined(CONFIG_USB_EHCI) && !defined(CONFIG_SPL_BUILD) /* Call usb_stop() before starting the kernel */ void show_boot_progress(int val) diff --git a/board/ti/beagle/beagle.c b/board/ti/beagle/beagle.c index 4c5e381..a5b7b3e 100644 --- a/board/ti/beagle/beagle.c +++ b/board/ti/beagle/beagle.c @@ -534,6 +534,17 @@ int board_mmc_init(bd_t *bis) } #endif +#if defined(CONFIG_GENERIC_MMC) +int board_mmc_power_init(void) +{ +#if defined(CONFIG_TWL4030_POWER) + twl4030_power_mmc_init(); + mdelay(100); /* ramp-up delay from Linux code */ +#endif + return 0; +} +#endif + #if defined(CONFIG_USB_EHCI) && !defined(CONFIG_SPL_BUILD) /* Call usb_stop() before starting the kernel */ void show_boot_progress(int val) diff --git a/board/ti/evm/evm.c b/board/ti/evm/evm.c index 81dd081..c41a760 100644 --- a/board/ti/evm/evm.c +++ b/board/ti/evm/evm.c @@ -264,3 +264,14 @@ int board_mmc_init(bd_t *bis) return omap_mmc_init(0, 0, 0, -1, -1); } #endif + +#if defined(CONFIG_GENERIC_MMC) +int board_mmc_power_init(void) +{ +#if defined(CONFIG_TWL4030_POWER) + twl4030_power_mmc_init(); + mdelay(100); /* ramp-up delay from Linux code */ +#endif + return 0; +} +#endif diff --git a/board/ti/sdp3430/sdp.c b/board/ti/sdp3430/sdp.c index 957940d..44e0418 100644 --- a/board/ti/sdp3430/sdp.c +++ b/board/ti/sdp3430/sdp.c @@ -195,4 +195,13 @@ int board_mmc_init(bd_t *bis) { return omap_mmc_init(0, 0, 0, -1, -1); } + +int board_mmc_power_init(void) +{ +#if defined(CONFIG_TWL4030_POWER) + twl4030_power_mmc_init(); + mdelay(100); /* ramp-up delay from Linux code */ +#endif + return 0; +} #endif diff --git a/board/timll/devkit8000/devkit8000.c b/board/timll/devkit8000/devkit8000.c index bcbee73..ef7fd0c 100644 --- a/board/timll/devkit8000/devkit8000.c +++ b/board/timll/devkit8000/devkit8000.c @@ -124,6 +124,17 @@ int board_mmc_init(bd_t *bis) } #endif +#if defined(CONFIG_GENERIC_MMC) +int board_mmc_power_init(void) +{ +#if defined(CONFIG_TWL4030_POWER) + twl4030_power_mmc_init(); + mdelay(100); /* ramp-up delay from Linux code */ +#endif + return 0; +} +#endif + #if defined(CONFIG_DRIVER_DM9000) & !defined(CONFIG_SPL_BUILD) /* * Routine: board_eth_init diff --git a/drivers/mmc/omap_hsmmc.c b/drivers/mmc/omap_hsmmc.c index ef2cbf9..6fb78b3 100644 --- a/drivers/mmc/omap_hsmmc.c +++ b/drivers/mmc/omap_hsmmc.c @@ -135,12 +135,7 @@ static unsigned char mmc_board_init(struct mmc *mmc) pbias_lite = readl(&t2_base->pbias_lite); pbias_lite &= ~(PBIASLITEPWRDNZ1 | PBIASLITEPWRDNZ0); writel(pbias_lite, &t2_base->pbias_lite); -#endif -#if defined(CONFIG_TWL4030_POWER) - twl4030_power_mmc_init(); - mdelay(100); /* ramp-up delay from Linux code */ -#endif -#if defined(CONFIG_OMAP34XX) + writel(pbias_lite | PBIASLITEPWRDNZ1 | PBIASSPEEDCTRL0 | PBIASLITEPWRDNZ0, &t2_base->pbias_lite); -- 1.9.1 ^ permalink raw reply related [flat|nested] 9+ messages in thread
* [U-Boot] [PATCH v3 2/2] omap_hsmmc: Board-specific TWL4030 MMC power initializations 2014-11-01 10:52 ` [U-Boot] [PATCH v3 2/2] omap_hsmmc: Board-specific TWL4030 " Paul Kocialkowski @ 2014-11-02 13:40 ` Igor Grinberg 2014-11-02 19:01 ` Paul Kocialkowski 0 siblings, 1 reply; 9+ messages in thread From: Igor Grinberg @ 2014-11-02 13:40 UTC (permalink / raw) To: u-boot Hi Paul, On 11/01/14 12:52, Paul Kocialkowski wrote: > Boards using the TWL4030 regulator may not all use the LDOs the same way > (e.g. MMC2 power can be controlled by another LDO than VMMC2). > This delegates TWL4030 MMC power initializations to board-specific functions, > that may still call twl4030_power_mmc_init for the default behavior. > > Signed-off-by: Paul Kocialkowski <contact@paulk.fr> This mostly looks good, several suggestions below though. > --- > board/comelit/dig297/dig297.c | 9 +++++++++ > board/compulab/cm_t35/cm_t35.c | 11 +++++++++++ > board/corscience/tricorder/tricorder.c | 11 +++++++++++ > board/isee/igep00x0/igep00x0.c | 11 +++++++++++ > board/logicpd/omap3som/omap3logic.c | 11 +++++++++++ > board/logicpd/zoom1/zoom1.c | 9 +++++++++ > board/matrix_vision/mvblx/mvblx.c | 9 +++++++++ > board/nokia/rx51/rx51.c | 9 +++++++++ > board/overo/overo.c | 11 +++++++++++ > board/pandora/pandora.c | 9 +++++++++ > board/technexion/tao3530/tao3530.c | 11 +++++++++++ > board/ti/beagle/beagle.c | 11 +++++++++++ > board/ti/evm/evm.c | 11 +++++++++++ > board/ti/sdp3430/sdp.c | 9 +++++++++ > board/timll/devkit8000/devkit8000.c | 11 +++++++++++ > drivers/mmc/omap_hsmmc.c | 7 +------ > 16 files changed, 154 insertions(+), 6 deletions(-) > > diff --git a/board/comelit/dig297/dig297.c b/board/comelit/dig297/dig297.c > index 2b826df..784483b 100644 > --- a/board/comelit/dig297/dig297.c > +++ b/board/comelit/dig297/dig297.c > @@ -133,6 +133,15 @@ int board_mmc_init(bd_t *bis) > { > return omap_mmc_init(0, 0, 0, -1, -1); > } > + > +int board_mmc_power_init(void) > +{ > +#if defined(CONFIG_TWL4030_POWER) > + twl4030_power_mmc_init(); > + mdelay(100); /* ramp-up delay from Linux code */ I guess all twl4030 based boards have to have this ramp up delay, right? If so, why don't we want to hide it inside the twl4030_power_mmc_init() function and not spread it across all boards? > +#endif > + return 0; > +} Also, what do you think of the below suggestion: Leave the twl4030_power_mmc_init() call inside the omap_hsmmc.c (as it seems that many boards want it) as it currently is. This way you will not need to patch each board file, yet a board has the ability to control that call via the CONFIG_TWL4030_POWER and have a board specific callback should it need one. I would also change envelope the call to twl4030_power_mmc_init() to something like CONFIG_TWL4030_MMC_POWER instead of CONFIG_TWL4030_POWER, so it will be more flexible, but that has little to do with this patch. > #endif > > #ifdef CONFIG_CMD_NET [...] > diff --git a/drivers/mmc/omap_hsmmc.c b/drivers/mmc/omap_hsmmc.c > index ef2cbf9..6fb78b3 100644 > --- a/drivers/mmc/omap_hsmmc.c > +++ b/drivers/mmc/omap_hsmmc.c > @@ -135,12 +135,7 @@ static unsigned char mmc_board_init(struct mmc *mmc) > pbias_lite = readl(&t2_base->pbias_lite); > pbias_lite &= ~(PBIASLITEPWRDNZ1 | PBIASLITEPWRDNZ0); > writel(pbias_lite, &t2_base->pbias_lite); > -#endif > -#if defined(CONFIG_TWL4030_POWER) > - twl4030_power_mmc_init(); > - mdelay(100); /* ramp-up delay from Linux code */ > -#endif > -#if defined(CONFIG_OMAP34XX) > + > writel(pbias_lite | PBIASLITEPWRDNZ1 | > PBIASSPEEDCTRL0 | PBIASLITEPWRDNZ0, > &t2_base->pbias_lite); > -- Regards, Igor. ^ permalink raw reply [flat|nested] 9+ messages in thread
* [U-Boot] [PATCH v3 2/2] omap_hsmmc: Board-specific TWL4030 MMC power initializations 2014-11-02 13:40 ` Igor Grinberg @ 2014-11-02 19:01 ` Paul Kocialkowski 2014-11-03 7:55 ` Igor Grinberg 0 siblings, 1 reply; 9+ messages in thread From: Paul Kocialkowski @ 2014-11-02 19:01 UTC (permalink / raw) To: u-boot Hi Igor, thanks for the review. > On 11/01/14 12:52, Paul Kocialkowski wrote: > > Boards using the TWL4030 regulator may not all use the LDOs the same way > > (e.g. MMC2 power can be controlled by another LDO than VMMC2). > > This delegates TWL4030 MMC power initializations to board-specific functions, > > that may still call twl4030_power_mmc_init for the default behavior. > > > > Signed-off-by: Paul Kocialkowski <contact@paulk.fr> > > This mostly looks good, several suggestions below though. > > > --- > > board/comelit/dig297/dig297.c | 9 +++++++++ > > board/compulab/cm_t35/cm_t35.c | 11 +++++++++++ > > board/corscience/tricorder/tricorder.c | 11 +++++++++++ > > board/isee/igep00x0/igep00x0.c | 11 +++++++++++ > > board/logicpd/omap3som/omap3logic.c | 11 +++++++++++ > > board/logicpd/zoom1/zoom1.c | 9 +++++++++ > > board/matrix_vision/mvblx/mvblx.c | 9 +++++++++ > > board/nokia/rx51/rx51.c | 9 +++++++++ > > board/overo/overo.c | 11 +++++++++++ > > board/pandora/pandora.c | 9 +++++++++ > > board/technexion/tao3530/tao3530.c | 11 +++++++++++ > > board/ti/beagle/beagle.c | 11 +++++++++++ > > board/ti/evm/evm.c | 11 +++++++++++ > > board/ti/sdp3430/sdp.c | 9 +++++++++ > > board/timll/devkit8000/devkit8000.c | 11 +++++++++++ > > drivers/mmc/omap_hsmmc.c | 7 +------ > > 16 files changed, 154 insertions(+), 6 deletions(-) > > > > diff --git a/board/comelit/dig297/dig297.c b/board/comelit/dig297/dig297.c > > index 2b826df..784483b 100644 > > --- a/board/comelit/dig297/dig297.c > > +++ b/board/comelit/dig297/dig297.c > > @@ -133,6 +133,15 @@ int board_mmc_init(bd_t *bis) > > { > > return omap_mmc_init(0, 0, 0, -1, -1); > > } > > + > > +int board_mmc_power_init(void) > > +{ > > +#if defined(CONFIG_TWL4030_POWER) > > + twl4030_power_mmc_init(); > > + mdelay(100); /* ramp-up delay from Linux code */ > > I guess all twl4030 based boards have to have this ramp up delay, right? > If so, why don't we want to hide it inside the twl4030_power_mmc_init() > function and not spread it across all boards? That makes perfect sense, thanks for the suggestion. Will do in the next version. > > +#endif > > + return 0; > > +} > > Also, what do you think of the below suggestion: > Leave the twl4030_power_mmc_init() call inside the omap_hsmmc.c > (as it seems that many boards want it) as it currently is. > This way you will not need to patch each board file, yet a board > has the ability to control that call via the CONFIG_TWL4030_POWER > and have a board specific callback should it need one. One of the initial intents of this patch set was also to remove the implication of CONFIG_TWL4030_POWER on twl4030_power_mmc_init, because my device (LG Optimus Black P970) uses TWL4030 regulators in a way that doesn't match other boards or any reference design (so I need CONFIG_TWL4030_POWER but not twl4030_power_mmc_init). > I would also change envelope the call to twl4030_power_mmc_init() > to something like CONFIG_TWL4030_MMC_POWER instead of > CONFIG_TWL4030_POWER, so it will be more flexible, but that has > little to do with this patch. That would be acceptable for me, but it would mean having two places where the same thing happens: the new board_mmc_power_init function and internally on omap_hsmmc. That's the sort of lack of consistance I definitely do not like, but if you think it's the best way to do it, I don't see any further issue with that. Patching all the boards isn't really that big a deal (identifying the boards is already done now anyway) and it makes similar sense to having multiple board_mmc_init that all look very much alike. In addition, perhaps I should add a dev_index parameter to twl4030_power_mmc_init (in a separate patch) so that only the relevant LDO is enabled (see my previous patch enabling VMMC2 too, that was accepted): most devices only use one MMC controller, so there is no need to enable all the MMC LDOs. That would give some legitimacy to having one twl4030_power_mmc_init per board, since it would reflect whether to enable one or both MMC LDOs. What do you think? > > #endif > > > > #ifdef CONFIG_CMD_NET > > [...] > > > diff --git a/drivers/mmc/omap_hsmmc.c b/drivers/mmc/omap_hsmmc.c > > index ef2cbf9..6fb78b3 100644 > > --- a/drivers/mmc/omap_hsmmc.c > > +++ b/drivers/mmc/omap_hsmmc.c > > @@ -135,12 +135,7 @@ static unsigned char mmc_board_init(struct mmc *mmc) > > pbias_lite = readl(&t2_base->pbias_lite); > > pbias_lite &= ~(PBIASLITEPWRDNZ1 | PBIASLITEPWRDNZ0); > > writel(pbias_lite, &t2_base->pbias_lite); > > -#endif > > -#if defined(CONFIG_TWL4030_POWER) > > - twl4030_power_mmc_init(); > > - mdelay(100); /* ramp-up delay from Linux code */ > > -#endif > > -#if defined(CONFIG_OMAP34XX) > > + > > writel(pbias_lite | PBIASLITEPWRDNZ1 | > > PBIASSPEEDCTRL0 | PBIASLITEPWRDNZ0, > > &t2_base->pbias_lite); > > > -------------- next part -------------- A non-text attachment was scrubbed... Name: signature.asc Type: application/pgp-signature Size: 819 bytes Desc: This is a digitally signed message part URL: <http://lists.denx.de/pipermail/u-boot/attachments/20141102/de1c266e/attachment.pgp> ^ permalink raw reply [flat|nested] 9+ messages in thread
* [U-Boot] [PATCH v3 2/2] omap_hsmmc: Board-specific TWL4030 MMC power initializations 2014-11-02 19:01 ` Paul Kocialkowski @ 2014-11-03 7:55 ` Igor Grinberg 0 siblings, 0 replies; 9+ messages in thread From: Igor Grinberg @ 2014-11-03 7:55 UTC (permalink / raw) To: u-boot -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 On 11/02/14 21:01, Paul Kocialkowski wrote: > Hi Igor, thanks for the review. > >> On 11/01/14 12:52, Paul Kocialkowski wrote: >>> Boards using the TWL4030 regulator may not all use the LDOs the same way >>> (e.g. MMC2 power can be controlled by another LDO than VMMC2). >>> This delegates TWL4030 MMC power initializations to board-specific functions, >>> that may still call twl4030_power_mmc_init for the default behavior. >>> >>> Signed-off-by: Paul Kocialkowski <contact@paulk.fr> >> >> This mostly looks good, several suggestions below though. >> >>> --- >>> board/comelit/dig297/dig297.c | 9 +++++++++ >>> board/compulab/cm_t35/cm_t35.c | 11 +++++++++++ >>> board/corscience/tricorder/tricorder.c | 11 +++++++++++ >>> board/isee/igep00x0/igep00x0.c | 11 +++++++++++ >>> board/logicpd/omap3som/omap3logic.c | 11 +++++++++++ >>> board/logicpd/zoom1/zoom1.c | 9 +++++++++ >>> board/matrix_vision/mvblx/mvblx.c | 9 +++++++++ >>> board/nokia/rx51/rx51.c | 9 +++++++++ >>> board/overo/overo.c | 11 +++++++++++ >>> board/pandora/pandora.c | 9 +++++++++ >>> board/technexion/tao3530/tao3530.c | 11 +++++++++++ >>> board/ti/beagle/beagle.c | 11 +++++++++++ >>> board/ti/evm/evm.c | 11 +++++++++++ >>> board/ti/sdp3430/sdp.c | 9 +++++++++ >>> board/timll/devkit8000/devkit8000.c | 11 +++++++++++ >>> drivers/mmc/omap_hsmmc.c | 7 +------ >>> 16 files changed, 154 insertions(+), 6 deletions(-) >>> >>> diff --git a/board/comelit/dig297/dig297.c b/board/comelit/dig297/dig297.c >>> index 2b826df..784483b 100644 >>> --- a/board/comelit/dig297/dig297.c >>> +++ b/board/comelit/dig297/dig297.c >>> @@ -133,6 +133,15 @@ int board_mmc_init(bd_t *bis) >>> { >>> return omap_mmc_init(0, 0, 0, -1, -1); >>> } >>> + >>> +int board_mmc_power_init(void) >>> +{ >>> +#if defined(CONFIG_TWL4030_POWER) >>> + twl4030_power_mmc_init(); >>> + mdelay(100); /* ramp-up delay from Linux code */ >> >> I guess all twl4030 based boards have to have this ramp up delay, right? >> If so, why don't we want to hide it inside the twl4030_power_mmc_init() >> function and not spread it across all boards? > > That makes perfect sense, thanks for the suggestion. Will do in the next > version. > >>> +#endif >>> + return 0; >>> +} >> >> Also, what do you think of the below suggestion: >> Leave the twl4030_power_mmc_init() call inside the omap_hsmmc.c >> (as it seems that many boards want it) as it currently is. >> This way you will not need to patch each board file, yet a board >> has the ability to control that call via the CONFIG_TWL4030_POWER >> and have a board specific callback should it need one. > > One of the initial intents of this patch set was also to remove the > implication of CONFIG_TWL4030_POWER on twl4030_power_mmc_init, because > my device (LG Optimus Black P970) uses TWL4030 regulators in a way that > doesn't match other boards or any reference design (so I need > CONFIG_TWL4030_POWER but not twl4030_power_mmc_init). In that case the below proposal suits you even better... > >> I would also change envelope the call to twl4030_power_mmc_init() >> to something like CONFIG_TWL4030_MMC_POWER instead of >> CONFIG_TWL4030_POWER, so it will be more flexible, but that has >> little to do with this patch. > > That would be acceptable for me, but it would mean having two places > where the same thing happens: the new board_mmc_power_init function and > internally on omap_hsmmc. That's the sort of lack of consistance I > definitely do not like, but if you think it's the best way to do it, I > don't see any further issue with that. Well, I fine with this. Having the mmc power initialized in a "centralized" manner is good. I just wanted to spare patching multiple boards, but in light of the said below I think you are right. > > Patching all the boards isn't really that big a deal (identifying the > boards is already done now anyway) and it makes similar sense to having > multiple board_mmc_init that all look very much alike. Ok. > > In addition, perhaps I should add a dev_index parameter to > twl4030_power_mmc_init (in a separate patch) so that only the relevant > LDO is enabled (see my previous patch enabling VMMC2 too, that was > accepted): most devices only use one MMC controller, so there is no need > to enable all the MMC LDOs. That is a great idea. This actually aroused in my mind when I first saw the VMMC2 patch. > > That would give some legitimacy to having one twl4030_power_mmc_init per > board, since it would reflect whether to enable one or both MMC LDOs. Yep. I think, you should do this now, just before adding the multiple instances of twl4030_power_mmc_init() call and patching it later. > > What do you think? All said above makes a good sense. So let's do this. Also, I think having a DM for MMC will make things much less "wild west" here, but that is a separate issue. > >>> #endif >>> >>> #ifdef CONFIG_CMD_NET >> >> [...] >> >>> diff --git a/drivers/mmc/omap_hsmmc.c b/drivers/mmc/omap_hsmmc.c >>> index ef2cbf9..6fb78b3 100644 >>> --- a/drivers/mmc/omap_hsmmc.c >>> +++ b/drivers/mmc/omap_hsmmc.c >>> @@ -135,12 +135,7 @@ static unsigned char mmc_board_init(struct mmc *mmc) >>> pbias_lite = readl(&t2_base->pbias_lite); >>> pbias_lite &= ~(PBIASLITEPWRDNZ1 | PBIASLITEPWRDNZ0); >>> writel(pbias_lite, &t2_base->pbias_lite); >>> -#endif >>> -#if defined(CONFIG_TWL4030_POWER) >>> - twl4030_power_mmc_init(); >>> - mdelay(100); /* ramp-up delay from Linux code */ >>> -#endif >>> -#if defined(CONFIG_OMAP34XX) >>> + >>> writel(pbias_lite | PBIASLITEPWRDNZ1 | >>> PBIASSPEEDCTRL0 | PBIASLITEPWRDNZ0, >>> &t2_base->pbias_lite); >>> >> > - -- Regards, Igor. -----BEGIN PGP SIGNATURE----- Version: GnuPG v2 iQIcBAEBAgAGBQJUVzTpAAoJEBDE8YO64EfavjcP/A0K8waMwn2XsBFgVyTLB7Q+ MUhufFKVHr/7ddFMutIQXzpG3BMzN+Q3Iwi3GzNCoJetHLBNkLAST4nqzTxYYuhu uW16d+Jru40KsNX8JD1waoW2Igdp4AWtY30KT8Khh+OUNvXXbxExkedYPdDyoRz5 gmKigvGtMMyyWpclMqyXewLT6jJjmBEOkccmvbEWbu3xXf71Oxb2SSdM4fwZtdAU PJIPW8wYHDQuYKNWhPUSsfiu/NQ63xs5/mW8YePKpwE54YCutT97Gvme05G+xUE9 ck4ZI5C49haHSq28HzVDmhXu8oAcCZke9998abqKD+3oDb5w72Hnoy6apx9ZtWSR dRFJp/TMEG3sClftxI0zvZc85430On6TnzmSEb5LlO1HnmEF6QgKTEf6dwsjqCvD WU0V1b0p3FyYxnIc+GlAWpis1pG+dtXiXkyLIEbI4Xcvnn7fo48kUVsrHGiENDcc sCR2ewcnLxVtzQfbSs7AwTiThwxO9Nb5vsQh3Y+Z+1VLrZq5jOAnEB7EbgwqI/K8 snApLZyLFwiazOh/MVzxaonYUQRGYs0mLesjhXORyyQRcCvlUUSvS3AEMDV6EHP/ sRU8iXhZ1s3qlCVEL4pkSLiqQUJSZskumbt9/qrpavz4TPWDUSqc5/b5+7yqEPLm dBofkwkw/9oqiUyPD0ps =FA1/ -----END PGP SIGNATURE----- ^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2014-11-03 7:55 UTC | newest] Thread overview: 9+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2014-11-01 10:52 [U-Boot] [PATCH v3 0/2] mmc: Board-specific MMC power initializations Paul Kocialkowski 2014-11-01 10:52 ` [U-Boot] [PATCH v3 1/2] " Paul Kocialkowski 2014-11-02 13:23 ` Igor Grinberg 2014-11-02 18:51 ` Paul Kocialkowski 2014-11-03 7:35 ` Igor Grinberg 2014-11-01 10:52 ` [U-Boot] [PATCH v3 2/2] omap_hsmmc: Board-specific TWL4030 " Paul Kocialkowski 2014-11-02 13:40 ` Igor Grinberg 2014-11-02 19:01 ` Paul Kocialkowski 2014-11-03 7:55 ` Igor Grinberg
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox