[PATCH] ARM: OMAP3: hsmmc: fix MMC 2 setup for AM35x
Igor Grinberg
grinberg at compulab.co.il
Thu Dec 8 14:25:20 EST 2011
ping
Tony,
I'd like this to go into 3.3, can it?
On 11/29/11 11:37, Igor Grinberg wrote:
> AM35x MMC 2 controller has internal clock loopback setting which cannot
> be utilized without this patch and thus SDIO devices connected to this
> controller and depend on this setting will fail to initialize.
>
> Signed-off-by: Igor Grinberg <grinberg at compulab.co.il>
> ---
> arch/arm/mach-omap2/hsmmc.c | 42 ++++++++++++++++++++++++++++++------------
> 1 files changed, 30 insertions(+), 12 deletions(-)
>
> diff --git a/arch/arm/mach-omap2/hsmmc.c b/arch/arm/mach-omap2/hsmmc.c
> index ecde558..c80859e 100644
> --- a/arch/arm/mach-omap2/hsmmc.c
> +++ b/arch/arm/mach-omap2/hsmmc.c
> @@ -171,6 +171,17 @@ static void omap4_hsmmc1_after_set_reg(struct device *dev, int slot,
> }
> }
>
> +static void hsmmc2_select_input_clk_src(struct omap_mmc_platform_data *mmc)
> +{
> + u32 reg;
> +
> + if (mmc->slots[0].internal_clock) {
> + reg = omap_ctrl_readl(control_devconf1_offset);
> + reg |= OMAP2_MMCSDIO2ADPCLKISEL;
> + omap_ctrl_writel(reg, control_devconf1_offset);
> + }
> +}
> +
> static void hsmmc23_before_set_reg(struct device *dev, int slot,
> int power_on, int vdd)
> {
> @@ -179,16 +190,19 @@ static void hsmmc23_before_set_reg(struct device *dev, int slot,
> if (mmc->slots[0].remux)
> mmc->slots[0].remux(dev, slot, power_on);
>
> - if (power_on) {
> - /* Only MMC2 supports a CLKIN */
> - if (mmc->slots[0].internal_clock) {
> - u32 reg;
> + if (power_on)
> + hsmmc2_select_input_clk_src(mmc);
> +}
>
> - reg = omap_ctrl_readl(control_devconf1_offset);
> - reg |= OMAP2_MMCSDIO2ADPCLKISEL;
> - omap_ctrl_writel(reg, control_devconf1_offset);
> - }
> - }
> +static int am35x_hsmmc2_set_power(struct device *dev, int slot,
> + int power_on, int vdd)
> +{
> + struct omap_mmc_platform_data *mmc = dev->platform_data;
> +
> + if (power_on)
> + hsmmc2_select_input_clk_src(mmc);
> +
> + return 0;
> }
>
> static int nop_mmc_set_power(struct device *dev, int slot, int power_on,
> @@ -346,9 +360,7 @@ static int __init omap_hsmmc_pdata_init(struct omap2_hsmmc_info *c,
> else
> mmc->slots[0].ocr_mask = c->ocr_mask;
>
> - if (cpu_is_omap3517() || cpu_is_omap3505())
> - mmc->slots[0].set_power = nop_mmc_set_power;
> - else
> + if (!cpu_is_omap3517() && !cpu_is_omap3505())
> mmc->slots[0].features |= HSMMC_HAS_PBIAS;
>
> if (cpu_is_omap44xx() && (omap_rev() > OMAP4430_REV_ES1_0))
> @@ -371,6 +383,9 @@ static int __init omap_hsmmc_pdata_init(struct omap2_hsmmc_info *c,
> }
> }
>
> + if (cpu_is_omap3517() || cpu_is_omap3505())
> + mmc->slots[0].set_power = nop_mmc_set_power;
> +
> /* OMAP3630 HSMMC1 supports only 4-bit */
> if (cpu_is_omap3630() &&
> (c->caps & MMC_CAP_8_BIT_DATA)) {
> @@ -380,6 +395,9 @@ static int __init omap_hsmmc_pdata_init(struct omap2_hsmmc_info *c,
> }
> break;
> case 2:
> + if (cpu_is_omap3517() || cpu_is_omap3505())
> + mmc->slots[0].set_power = am35x_hsmmc2_set_power;
> +
> if (c->ext_clock)
> c->transceiver = 1;
> if (c->transceiver && (c->caps & MMC_CAP_8_BIT_DATA)) {
--
Regards,
Igor.
More information about the linux-arm-kernel
mailing list