From: Jaehoon Chung <jh80.chung@samsung.com>
To: Seungwon Jeon <tgih.jun@samsung.com>
Cc: 'Jaehoon Chung' <jh80.chung@samsung.com>,
'linux-mmc' <linux-mmc@vger.kernel.org>,
linux-samsung-soc@vger.kernel.org, 'Chris Ball' <cjb@laptop.org>,
'Kyungmin Park' <kyungmin.park@samsung.com>,
'kgene kim' <kgene.kim@samsung.com>,
'Thomas Abraham' <thomas.abraham@linaro.org>
Subject: Re: [PATCH v2 1/4] mmc: sdhci-s3c: use the sdhci-pltfm for Samsung-SoC
Date: Fri, 02 Mar 2012 14:07:58 +0900 [thread overview]
Message-ID: <4F5055AE.8090904@samsung.com> (raw)
In-Reply-To: <004a01ccf82f$b51a68e0$1f4f3aa0$%jun@samsung.com>
>>>>>> sc->clk_bus[ptr] = clk;
>>>>>> @@ -613,7 +609,10 @@ static int __devinit sdhci_s3c_probe(struct platform_device *pdev)
>>>>>> * save current clock index to know which clock bus
>>>>>> * is used later in overriding functions.
>>>>>> */
>>>>>> - sc->cur_clk = ptr;
>>>>>> + if (host->quirks & SDHCI_QUIRK_NONSTANDARD_CLOCK)
>>>>>> + pltfm_host->clk = clk;
>>>>>> + else
>>>>> We need to keep below?
>>>>> According to two commits, this seems to be relevant to SDHCI_QUIRK_NONSTANDARD_CLOCK.
>>>>> mmc: sdhci-s3c: Support controllers with no internal clock divider(253e0a7c3dc4b)
>>>>> mmc: sdhci-s3c: Remove usage of clk_type member in platform data(b77d777eeb0a086)
>>>>
>>>> Right, it's related with them.
>>>> I want to remove the sc->cur_clk.But in c110 case, it seems to need them.
>>>> In c110, clk_src is used the one of four.
>>>> If you want to remove the quirks, i will use only sc->cur_clk.
>>>> How about this?
>>> I mean "sc->cur_clk = ptr" can be removed here.
>>
>> I think that can remove "sc->cur_clk = ptr" at first time.
>> But in sdhci_s3c_set_clock(), it's used for selecting the new clock sources.
>> (If my understanding is wrong, i will also check this.)
>
> As we know, ptr indicates the index of clock candidates if not SDHCI_QUIRK_NONSTANDARD_CLOCK.
> cur_clk is just updated during loop and finally it will be finished by last ptr.
> I wonder if this is a selected index.
You're right. i have considered too much about this.
It can be removed. Then it needs not to use SDHCI_QUIRK_NONSTANDARD_CLOCK.
Best Regards,
Jaehoon Chung
>
> Thanks,
> Seungwon Jeon.
>>
>> Best Regards,
>> Jaehoon Chung
>>
>>> And about quirks..., I think compatibility should be considered.
>>>
>>> Thanks,
>>> Seungwon Jeon.
>>>>
>>>> And any comment?
>>>>
>>>> Best Regards,
>>>> Jaehoon Chung
>>>>
>>>>>
>>>>> Thanks,
>>>>> Seungwon Jeon.
>>>>>
>>>>>> + sc->cur_clk = ptr;
>>>>>>
>>>>>> clk_enable(clk);
>>>>>>
>>>>>> @@ -627,63 +626,25 @@ static int __devinit sdhci_s3c_probe(struct platform_device *pdev)
>>>>>> goto err_no_busclks;
>>>>>> }
>>>>>>
>>>>>> - sc->ioarea = request_mem_region(res->start, resource_size(res),
>>>>>> - mmc_hostname(host->mmc));
>>>>>> - if (!sc->ioarea) {
>>>>>> - dev_err(dev, "failed to reserve register area\n");
>>>>>> - ret = -ENXIO;
>>>>>> - goto err_req_regs;
>>>>>> - }
>>>>>> -
>>>>>> - host->ioaddr = ioremap_nocache(res->start, resource_size(res));
>>>>>> - if (!host->ioaddr) {
>>>>>> - dev_err(dev, "failed to map registers\n");
>>>>>> - ret = -ENXIO;
>>>>>> - goto err_req_regs;
>>>>>> - }
>>>>>> -
>>>>>> /* Ensure we have minimal gpio selected CMD/CLK/Detect */
>>>>>> - if (pdata->cfg_gpio)
>>>>>> - pdata->cfg_gpio(pdev, pdata->max_width);
>>>>>> -
>>>>>> - host->hw_name = "samsung-hsmmc";
>>>>>> - host->ops = &sdhci_s3c_ops;
>>>>>> - host->quirks = 0;
>>>>>> - host->irq = irq;
>>>>>> -
>>>>>> - /* Setup quirks for the controller */
>>>>>> - host->quirks |= SDHCI_QUIRK_NO_ENDATTR_IN_NOPDESC;
>>>>>> - host->quirks |= SDHCI_QUIRK_NO_HISPD_BIT;
>>>>>> - if (drv_data)
>>>>>> - host->quirks |= drv_data->sdhci_quirks;
>>>>>> + if (sc->pdata->cfg_gpio)
>>>>>> + sc->pdata->cfg_gpio(pdev, sc->pdata->max_width);
>>>>>>
>>>>>> #ifndef CONFIG_MMC_SDHCI_S3C_DMA
>>>>>> -
>>>>>> /* we currently see overruns on errors, so disable the SDMA
>>>>>> * support as well. */
>>>>>> host->quirks |= SDHCI_QUIRK_BROKEN_DMA;
>>>>>>
>>>>>> #endif /* CONFIG_MMC_SDHCI_S3C_DMA */
>>>>>>
>>>>>> - /* It seems we do not get an DATA transfer complete on non-busy
>>>>>> - * transfers, not sure if this is a problem with this specific
>>>>>> - * SDHCI block, or a missing configuration that needs to be set. */
>>>>>> - host->quirks |= SDHCI_QUIRK_NO_BUSY_IRQ;
>>>>>> -
>>>>>> - /* This host supports the Auto CMD12 */
>>>>>> - host->quirks |= SDHCI_QUIRK_MULTIBLOCK_READ_ACMD12;
>>>>>> -
>>>>>> - /* Samsung SoCs need BROKEN_ADMA_ZEROLEN_DESC */
>>>>>> - host->quirks |= SDHCI_QUIRK_BROKEN_ADMA_ZEROLEN_DESC;
>>>>>> -
>>>>>> - if (pdata->cd_type == S3C_SDHCI_CD_NONE ||
>>>>>> - pdata->cd_type == S3C_SDHCI_CD_PERMANENT)
>>>>>> + if (sc->pdata->cd_type == S3C_SDHCI_CD_NONE ||
>>>>>> + sc->pdata->cd_type == S3C_SDHCI_CD_PERMANENT)
>>>>>> host->quirks |= SDHCI_QUIRK_BROKEN_CARD_DETECTION;
>>>>>>
>>>>>> - if (pdata->cd_type == S3C_SDHCI_CD_PERMANENT)
>>>>>> + if (sc->pdata->cd_type == S3C_SDHCI_CD_PERMANENT)
>>>>>> host->mmc->caps = MMC_CAP_NONREMOVABLE;
>>>>>>
>>>>>> - switch (pdata->max_width) {
>>>>>> + switch (sc->pdata->max_width) {
>>>>>> case 8:
>>>>>> host->mmc->caps |= MMC_CAP_8_BIT_DATA;
>>>>>> case 4:
>>>>>> @@ -691,17 +652,12 @@ static int __devinit sdhci_s3c_probe(struct platform_device *pdev)
>>>>>> break;
>>>>>> }
>>>>>>
>>>>>> - if (pdata->host_caps)
>>>>>> - host->mmc->caps |= pdata->host_caps;
>>>>>> -
>>>>>> - if (pdata->pm_caps)
>>>>>> - host->mmc->pm_caps |= pdata->pm_caps;
>>>>>> -
>>>>>> - host->quirks |= (SDHCI_QUIRK_32BIT_DMA_ADDR |
>>>>>> - SDHCI_QUIRK_32BIT_DMA_SIZE);
>>>>>> + /* It supports additional host capabilities if needed */
>>>>>> + if (sc->pdata->host_caps)
>>>>>> + host->mmc->caps |= sc->pdata->host_caps;
>>>>>>
>>>>>> - /* HSMMC on Samsung SoCs uses SDCLK as timeout clock */
>>>>>> - host->quirks |= SDHCI_QUIRK_DATA_TIMEOUT_USES_SDCLK;
>>>>>> + if (sc->pdata->pm_caps)
>>>>>> + host->mmc->pm_caps |= sc->pdata->pm_caps;
>>>>>>
>>>>>> /*
>>>>>> * If controller does not have internal clock divider,
>>>>>> @@ -713,10 +669,6 @@ static int __devinit sdhci_s3c_probe(struct platform_device *pdev)
>>>>>> sdhci_s3c_ops.get_max_clock = sdhci_cmu_get_max_clock;
>>>>>> }
>>>>>>
>>>>>> - /* It supports additional host capabilities if needed */
>>>>>> - if (pdata->host_caps)
>>>>>> - host->mmc->caps |= pdata->host_caps;
>>>>>> -
>>>>>> ret = sdhci_add_host(host);
>>>>>> if (ret) {
>>>>>> dev_err(dev, "sdhci_add_host() failed\n");
>>>>>> @@ -726,38 +678,35 @@ static int __devinit sdhci_s3c_probe(struct platform_device *pdev)
>>>>>> /* The following two methods of card detection might call
>>>>>> sdhci_s3c_notify_change() immediately, so they can be called
>>>>>> only after sdhci_add_host(). Setup errors are ignored. */
>>>>>> - if (pdata->cd_type == S3C_SDHCI_CD_EXTERNAL && pdata->ext_cd_init)
>>>>>> - pdata->ext_cd_init(&sdhci_s3c_notify_change);
>>>>>> - if (pdata->cd_type == S3C_SDHCI_CD_GPIO &&
>>>>>> - gpio_is_valid(pdata->ext_cd_gpio))
>>>>>> + if (sc->pdata->cd_type == S3C_SDHCI_CD_EXTERNAL &&
>>>>>> + sc->pdata->ext_cd_init)
>>>>>> + sc->pdata->ext_cd_init(&sdhci_s3c_notify_change);
>>>>>> + if (sc->pdata->cd_type == S3C_SDHCI_CD_GPIO &&
>>>>>> + gpio_is_valid(sc->pdata->ext_cd_gpio))
>>>>>> sdhci_s3c_setup_card_detect_gpio(sc);
>>>>>>
>>>>>> return 0;
>>>>>>
>>>>>> - err_add_host:
>>>>>> - release_resource(sc->ioarea);
>>>>>> - kfree(sc->ioarea);
>>>>>> -
>>>>>> - err_req_regs:
>>>>>> +err_add_host:
>>>>>> for (ptr = 0; ptr < MAX_BUS_CLK; ptr++) {
>>>>>> if (sc->clk_bus[ptr]) {
>>>>>> clk_disable(sc->clk_bus[ptr]);
>>>>>> clk_put(sc->clk_bus[ptr]);
>>>>>> }
>>>>>> }
>>>>>> -
>>>>>> - err_no_busclks:
>>>>>> +err_no_busclks:
>>>>>> clk_disable(sc->clk_io);
>>>>>> clk_put(sc->clk_io);
>>>>>>
>>>>>> - err_io_clk:
>>>>>> +err_io_clk:
>>>>>> for (ptr = 0; ptr < NUM_GPIOS(sc->pdata->max_width); ptr++)
>>>>>> gpio_free(sc->gpios[ptr]);
>>>>>> - if (pdata->cd_type == S3C_SDHCI_CD_INTERNAL)
>>>>>> + if (sc->pdata->cd_type == S3C_SDHCI_CD_INTERNAL)
>>>>>> gpio_free(sc->ext_cd_gpio);
>>>>>>
>>>>>> - err_pdata:
>>>>>> - sdhci_free_host(host);
>>>>>> +err_alloc_host:
>>>>>> + sdhci_pltfm_free(pdev);
>>>>>> + dev_err(&pdev->dev, "%s failed %d\n", __func__, ret);
>>>>>>
>>>>>> return ret;
>>>>>> }
>>>>>> @@ -765,12 +714,13 @@ static int __devinit sdhci_s3c_probe(struct platform_device *pdev)
>>>>>> static int __devexit sdhci_s3c_remove(struct platform_device *pdev)
>>>>>> {
>>>>>> struct sdhci_host *host = platform_get_drvdata(pdev);
>>>>>> - struct sdhci_s3c *sc = sdhci_priv(host);
>>>>>> - struct s3c_sdhci_platdata *pdata = sc->pdata;
>>>>>> - int ptr;
>>>>>> + struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
>>>>>> + struct sdhci_s3c *sc = pltfm_host->priv;
>>>>>> + int ptr, ret;
>>>>>>
>>>>>> - if (pdata->cd_type == S3C_SDHCI_CD_EXTERNAL && pdata->ext_cd_cleanup)
>>>>>> - pdata->ext_cd_cleanup(&sdhci_s3c_notify_change);
>>>>>> + if (sc->pdata->cd_type == S3C_SDHCI_CD_EXTERNAL &&
>>>>>> + sc->pdata->ext_cd_cleanup)
>>>>>> + sc->pdata->ext_cd_cleanup(&sdhci_s3c_notify_change);
>>>>>>
>>>>>> if (sc->ext_cd_irq)
>>>>>> free_irq(sc->ext_cd_irq, sc);
>>>>>> @@ -778,9 +728,9 @@ static int __devexit sdhci_s3c_remove(struct platform_device *pdev)
>>>>>> if (gpio_is_valid(sc->ext_cd_gpio))
>>>>>> gpio_free(sc->ext_cd_gpio);
>>>>>>
>>>>>> - sdhci_remove_host(host, 1);
>>>>>> + ret = sdhci_pltfm_unregister(pdev);
>>>>>>
>>>>>> - for (ptr = 0; ptr < 3; ptr++) {
>>>>>> + for (ptr = 0; ptr < MAX_BUS_CLK; ptr++) {
>>>>>> if (sc->clk_bus[ptr]) {
>>>>>> clk_disable(sc->clk_bus[ptr]);
>>>>>> clk_put(sc->clk_bus[ptr]);
>>>>>> @@ -789,48 +739,14 @@ static int __devexit sdhci_s3c_remove(struct platform_device *pdev)
>>>>>> clk_disable(sc->clk_io);
>>>>>> clk_put(sc->clk_io);
>>>>>>
>>>>>> - iounmap(host->ioaddr);
>>>>>> - release_resource(sc->ioarea);
>>>>>> - kfree(sc->ioarea);
>>>>>> -
>>>>>> if (pdev->dev.of_node) {
>>>>>> for (ptr = 0; ptr < NUM_GPIOS(sc->pdata->max_width); ptr++)
>>>>>> gpio_free(sc->gpios[ptr]);
>>>>>> }
>>>>>>
>>>>>> - sdhci_free_host(host);
>>>>>> - platform_set_drvdata(pdev, NULL);
>>>>>> -
>>>>>> - return 0;
>>>>>> -}
>>>>>> -
>>>>>> -#ifdef CONFIG_PM
>>>>>> -
>>>>>> -static int sdhci_s3c_suspend(struct device *dev)
>>>>>> -{
>>>>>> - struct sdhci_host *host = dev_get_drvdata(dev);
>>>>>> -
>>>>>> - return sdhci_suspend_host(host);
>>>>>> -}
>>>>>> -
>>>>>> -static int sdhci_s3c_resume(struct device *dev)
>>>>>> -{
>>>>>> - struct sdhci_host *host = dev_get_drvdata(dev);
>>>>>> -
>>>>>> - return sdhci_resume_host(host);
>>>>>> + return ret;
>>>>>> }
>>>>>>
>>>>>> -static const struct dev_pm_ops sdhci_s3c_pmops = {
>>>>>> - .suspend = sdhci_s3c_suspend,
>>>>>> - .resume = sdhci_s3c_resume,
>>>>>> -};
>>>>>> -
>>>>>> -#define SDHCI_S3C_PMOPS (&sdhci_s3c_pmops)
>>>>>> -
>>>>>> -#else
>>>>>> -#define SDHCI_S3C_PMOPS NULL
>>>>>> -#endif
>>>>>> -
>>>>>> #if defined(CONFIG_CPU_EXYNOS4210) || defined(CONFIG_SOC_EXYNOS4212)
>>>>>> static struct sdhci_s3c_drv_data exynos4_sdhci_drv_data = {
>>>>>> .sdhci_quirks = SDHCI_QUIRK_NONSTANDARD_CLOCK,
>>>>>> @@ -870,7 +786,7 @@ static struct platform_driver sdhci_s3c_driver = {
>>>>>> .owner = THIS_MODULE,
>>>>>> .name = "s3c-sdhci",
>>>>>> .of_match_table = of_match_ptr(sdhci_s3c_dt_match),
>>>>>> - .pm = SDHCI_S3C_PMOPS,
>>>>>> + .pm = SDHCI_PLTFM_PMOPS,
>>>>>> },
>>>>>> };
>>>>>>
>>>>>> --
>>>>>> To unsubscribe from this list: send the line "unsubscribe linux-mmc" in
>>>>>> the body of a message to majordomo@vger.kernel.org
>>>>>> 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@vger.kernel.org
>>>>> 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@vger.kernel.org
>>>> 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@vger.kernel.org
>>> 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@vger.kernel.org
>> 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@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
>
prev parent reply other threads:[~2012-03-02 5:07 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-02-27 7:58 [PATCH v2 1/4] mmc: sdhci-s3c: use the sdhci-pltfm for Samsung-SoC Jaehoon Chung
2012-02-29 6:33 ` Seungwon Jeon
2012-03-01 23:58 ` Jaehoon Chung
2012-03-02 2:15 ` Seungwon Jeon
2012-03-02 2:50 ` Jaehoon Chung
2012-03-02 4:48 ` Seungwon Jeon
2012-03-02 5:07 ` Jaehoon Chung [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4F5055AE.8090904@samsung.com \
--to=jh80.chung@samsung.com \
--cc=cjb@laptop.org \
--cc=kgene.kim@samsung.com \
--cc=kyungmin.park@samsung.com \
--cc=linux-mmc@vger.kernel.org \
--cc=linux-samsung-soc@vger.kernel.org \
--cc=tgih.jun@samsung.com \
--cc=thomas.abraham@linaro.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.