On 17 July 2012 15:43, Jaehoon Chung <jh80.chung@xxxxxxxxxxx> wrote: > Hi Girish.. > > i tested with your patch and applied the device tree patch. > But i found the didn't compare with the MMC_CAP2_CONFIG_BROKEN. > > I think that host->drv_data->caps2 just denote address. > So if running the your code, > Maybe it's compared like "0xc02a6e54 & 0x00001000". > Is it wrong? i got your point Thanks for pointing it. > > Best Regards, > Jaehoon Chung > > On 07/17/2012 06:54 PM, Girish K S wrote: >> On 17 July 2012 15:18, Jaehoon Chung <jh80.chung@xxxxxxxxxxx> wrote: >>> On 07/17/2012 06:17 PM, Girish K S wrote: >>>> On 17 July 2012 13:16, Jaehoon Chung <jh80.chung@xxxxxxxxxxx> wrote: >>>>> Hi Girish, >>>>> >>>>> On 07/16/2012 05:45 PM, Girish K S wrote: >>>>>> In some Soc'S that integrate Designware mmc host controllers, the >>>>>> HCON register is broken. The hardware configuration is not >>>>>> updated. One specific usecase is the IDMAC. In Exysons5 SoC >>>>>> there exist a internal DMA, but the HCON register's DMA_INTERFACE >>>>>> field is not set to indicate its existance. >>>>>> >>>>>> This quirk can be used in such case to force the existance broken >>>>>> HCON field. >>>>>> >>>>>> Signed-off-by: Girish K S <girish.shivananjappa@xxxxxxxxxx> >>>>>> --- >>>>>> drivers/mmc/host/dw_mmc-pltfm.c | 5 +++++ >>>>>> drivers/mmc/host/dw_mmc.c | 11 ++++++++++- >>>>>> drivers/mmc/host/dw_mmc.h | 1 + >>>>>> include/linux/mmc/host.h | 1 + >>>>>> 4 files changed, 17 insertions(+), 1 deletions(-) >>>>>> >>>>>> diff --git a/drivers/mmc/host/dw_mmc-pltfm.c b/drivers/mmc/host/dw_mmc-pltfm.c >>>>>> index 900f412..24ea485 100644 >>>>>> --- a/drivers/mmc/host/dw_mmc-pltfm.c >>>>>> +++ b/drivers/mmc/host/dw_mmc-pltfm.c >>>>>> @@ -35,9 +35,14 @@ static unsigned long exynos5250_dwmmc_caps[4] = { >>>>>> MMC_CAP_CMD23, >>>>>> }; >>>>>> >>>>>> +static unsigned long exynos5250_dwmmc_caps2[1] = { >>>>>> + MMC_CAP2_CONFIG_BROKEN, >>>>>> +}; >>>>>> + >>>>>> static struct dw_mci_drv_data exynos5250_drv_data = { >>>>>> .ctrl_type = DW_MCI_TYPE_EXYNOS5250, >>>>>> .caps = exynos5250_dwmmc_caps, >>>>>> + .caps2 = exynos5250_dwmmc_caps2, >>>>>> }; >>>>>> >>>>>> static const struct of_device_id dw_mci_pltfm_match[] = { >>>>>> diff --git a/drivers/mmc/host/dw_mmc.c b/drivers/mmc/host/dw_mmc.c >>>>>> index 1a59a92..030224c 100644 >>>>>> --- a/drivers/mmc/host/dw_mmc.c >>>>>> +++ b/drivers/mmc/host/dw_mmc.c >>>>>> @@ -431,7 +431,13 @@ static int dw_mci_idmac_init(struct dw_mci *host) >>>>>> /* Check if Hardware Configuration Register has support for DMA */ >>>>>> dma_support = (mci_readl(host, HCON) >> 16) & 0x3; >>>>>> >>>>>> - if (!dma_support || dma_support > 2) { >>>>>> + /* >>>>>> + * In Some of the Soc's the HCON Register is broken. Even though the >>>>>> + * Soc's has a internal DMA the HCON register's DMA field doesnt >>>>>> + * show it. So additional quirk is added for such Soc's >>>>>> + */ >>>>>> + if ((!dma_support || dma_support > 2) && >>>>>> + !((u32)host->drv_data->caps2 & MMC_CAP2_CONFIG_BROKEN)) { >>>>> Just caps2? if use the device tree, need to get ctrl_id? >>>> but i found one thing. I have initialized only one channel. are you >>>> mentioning to initialize all 4 channels of exynos5 >>> You're defined "unsigned long *caps2"..host->drv_data->caps2?? what's value? >> >> .caps2 = exynos5250_dwmmc_caps2 >> and >> static unsigned long exynos5250_dwmmc_caps2[1] = { >> MMC_CAP2_CONFIG_BROKEN, >> }; >> hope i answered it >>>>> It didn't work.. >>>>>> dev_err(&host->dev, >>>>>> "Host Controller does not support IDMA Tx.\n"); >>>>>> host->dma_ops = NULL; >>>>>> @@ -1957,6 +1963,9 @@ static int __init dw_mci_init_slot(struct dw_mci *host, unsigned int id) >>>>>> if (host->pdata->caps2) >>>>>> mmc->caps2 = host->pdata->caps2; >>>>>> >>>>>> + if (host->drv_data->caps2) >>>>>> + mmc->caps2 |= host->drv_data->caps2[ctrl_id]; >>>>>> + >>>>>> if (host->pdata->get_bus_wd) { >>>>>> if (host->pdata->get_bus_wd(slot->id) >= 4) >>>>>> mmc->caps |= MMC_CAP_4_BIT_DATA; >>>>>> diff --git a/drivers/mmc/host/dw_mmc.h b/drivers/mmc/host/dw_mmc.h >>>>>> index 6c17282..8c4810a 100644 >>>>>> --- a/drivers/mmc/host/dw_mmc.h >>>>>> +++ b/drivers/mmc/host/dw_mmc.h >>>>>> @@ -203,6 +203,7 @@ extern int dw_mci_resume(struct dw_mci *host); >>>>>> struct dw_mci_drv_data { >>>>>> unsigned long ctrl_type; >>>>>> unsigned long *caps; >>>>>> + unsigned long *caps2; >>>>>> }; >>>>>> >>>>>> #endif /* _DW_MMC_H_ */ >>>>>> diff --git a/include/linux/mmc/host.h b/include/linux/mmc/host.h >>>>>> index 65c64ee..ab5c7f9 100644 >>>>>> --- a/include/linux/mmc/host.h >>>>>> +++ b/include/linux/mmc/host.h >>>>>> @@ -261,6 +261,7 @@ struct mmc_host { >>>>>> #define MMC_CAP2_HC_ERASE_SZ (1 << 9) /* High-capacity erase size */ >>>>>> #define MMC_CAP2_CD_ACTIVE_HIGH (1 << 10) /* Card-detect signal active high */ >>>>>> #define MMC_CAP2_RO_ACTIVE_HIGH (1 << 11) /* Write-protect signal active high */ >>>>>> +#define MMC_CAP2_CONFIG_BROKEN (1 << 12) /* Broken Config Register */ >>>>>> >>>>>> mmc_pm_flag_t pm_caps; /* supported pm features */ >>>>>> unsigned int power_notify_type; >>>>>> >>>>> >>>>> >>>> -- >>>> To unsubscribe from this list: send the line "unsubscribe linux-mmc" in >>>> the body of a message to majordomo@xxxxxxxxxxxxxxx >>>> More majordomo info at http://vger.kernel.org/majordomo-info.html >>>> >>> >>> >> -- >> To unsubscribe from this list: send the line "unsubscribe linux-mmc" in >> the body of a message to majordomo@xxxxxxxxxxxxxxx >> More majordomo info at http://vger.kernel.org/majordomo-info.html >> > > -- To unsubscribe from this list: send the line "unsubscribe linux-mmc" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html