From: Adrian Hunter <adrian.hunter@intel.com>
To: Victor Shih <victorshihgli@gmail.com>, ulf.hansson@linaro.org
Cc: linux-mmc@vger.kernel.org, linux-kernel@vger.kernel.org,
benchuanggli@gmail.com, HL.Liu@genesyslogic.com.tw,
Greg.tu@genesyslogic.com.tw, takahiro.akashi@linaro.org,
dlunev@chromium.org, Ben Chuang <ben.chuang@genesyslogic.com.tw>,
Victor Shih <victor.shih@genesyslogic.com.tw>
Subject: Re: [PATCH V10 20/23] mmc: sdhci-uhs2: add add_host() and others to set up the driver
Date: Thu, 31 Aug 2023 11:34:51 +0300 [thread overview]
Message-ID: <e8ed5409-5a00-9478-5b91-85d54b7fb2bb@intel.com> (raw)
In-Reply-To: <20230818100217.12725-21-victorshihgli@gmail.com>
On 18/08/23 13:02, Victor Shih wrote:
> From: Victor Shih <victor.shih@genesyslogic.com.tw>
>
> This is a UHS-II version of sdhci's add_host/remove_host operation.
> Any sdhci drivers which are capable of handling UHS-II cards must
> call those functions instead of the corresponding sdhci's.
>
> Signed-off-by: Ben Chuang <ben.chuang@genesyslogic.com.tw>
> Signed-off-by: AKASHI Takahiro <takahiro.akashi@linaro.org>
> Signed-off-by: Victor Shih <victor.shih@genesyslogic.com.tw>
> ---
>
> Updates in V10:
> - Move some definitions of PatchV9[05/23] to PatchV10[20/23].
>
> Updates in V8:
> - Change return type to void for __sdhci_uhs2_add_host_v4().
> - Remove unused variables in __sdhci_uhs2_add_host_v4().
>
> Updates in V7:
> - __sdhci_add_host() to instead of __sdhci_uhs2_add_host()
> in sdhci_uhs2_add_host().
> - Cancel export state of some functions.
>
> Updates in V6:
> - Add complete_work_fn/thread_irq_fn variables in struct sdhci_host.
> - Use complete_work_fn/thread_irq_fn variables in
> sdhci_alloc_host() and sdhci_uhs2_add_host().
> - Use sdhci_uhs2_mode() to simplify code in __sdhci_uhs2_remove_host().
>
> ---
>
> drivers/mmc/host/sdhci-uhs2.c | 102 ++++++++++++++++++++++++++++++++++
> drivers/mmc/host/sdhci-uhs2.h | 2 +
> drivers/mmc/host/sdhci.c | 7 ++-
> drivers/mmc/host/sdhci.h | 3 +
> include/linux/mmc/host.h | 1 +
> 5 files changed, 113 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/mmc/host/sdhci-uhs2.c b/drivers/mmc/host/sdhci-uhs2.c
> index 8d1be670af49..80eafacc8b9f 100644
> --- a/drivers/mmc/host/sdhci-uhs2.c
> +++ b/drivers/mmc/host/sdhci-uhs2.c
> @@ -16,6 +16,7 @@
> #include <linux/bitfield.h>
> #include <linux/mmc/mmc.h>
> #include <linux/mmc/host.h>
> +#include <linux/regulator/consumer.h>
>
> #include "sdhci.h"
> #include "sdhci-uhs2.h"
> @@ -997,6 +998,107 @@ static irqreturn_t sdhci_uhs2_thread_irq(int irq, void *dev_id)
> return IRQ_HANDLED;
> }
>
> +/*****************************************************************************\
> + *
> + * Device allocation/registration *
> + * *
> +\*****************************************************************************/
> +
> +static void __sdhci_uhs2_add_host_v4(struct sdhci_host *host, u32 caps1)
> +{
> + struct mmc_host *mmc;
> + u32 max_current_caps2;
> +
> + mmc = host->mmc;
> +
> + /* Support UHS2 */
> + if (caps1 & SDHCI_SUPPORT_UHS2)
> + mmc->caps2 |= MMC_CAP2_SD_UHS2;
> +
> + max_current_caps2 = sdhci_readl(host, SDHCI_MAX_CURRENT_1);
> +
> + if ((caps1 & SDHCI_CAN_VDD2_180) &&
> + !max_current_caps2 &&
> + !IS_ERR(mmc->supply.vmmc2)) {
> + /* UHS2 - VDD2 */
> + int curr = regulator_get_current_limit(mmc->supply.vmmc2);
> +
> + if (curr > 0) {
> + /* convert to SDHCI_MAX_CURRENT format */
> + curr = curr / 1000; /* convert to mA */
> + curr = curr / SDHCI_MAX_CURRENT_MULTIPLIER;
> + curr = min_t(u32, curr, SDHCI_MAX_CURRENT_LIMIT);
> + max_current_caps2 = curr;
> + }
> + }
> +
> + if (caps1 & SDHCI_CAN_VDD2_180)
> + mmc->ocr_avail_uhs2 |= MMC_VDD_165_195;
> + else
> + mmc->caps2 &= ~MMC_CAP2_SD_UHS2;
> +}
> +
> +static int sdhci_uhs2_host_ops_init(struct sdhci_host *host);
> +
> +static void __sdhci_uhs2_remove_host(struct sdhci_host *host, int dead)
> +{
> + if (!sdhci_uhs2_mode(host))
> + return;
> +
> + if (!dead)
> + sdhci_uhs2_reset(host, SDHCI_UHS2_SW_RESET_FULL);
> +}
> +
> +int sdhci_uhs2_add_host(struct sdhci_host *host)
> +{
> + struct mmc_host *mmc = host->mmc;
> + int ret;
> +
> + ret = sdhci_setup_host(host);
> + if (ret)
> + return ret;
> +
> + if (host->version >= SDHCI_SPEC_400)
> + __sdhci_uhs2_add_host_v4(host, host->caps1);
> +
> + if ((mmc->caps2 & MMC_CAP2_SD_UHS2) && !host->v4_mode)
> + /* host doesn't want to enable UHS2 support */
> + mmc->caps2 &= ~MMC_CAP2_SD_UHS2;
> +
> + /* overwrite ops */
> + if (mmc->caps2 & MMC_CAP2_SD_UHS2)
> + sdhci_uhs2_host_ops_init(host);
> +
> + host->complete_work_fn = sdhci_uhs2_complete_work;
> + host->thread_irq_fn = sdhci_uhs2_thread_irq;
> +
> + /* LED support not implemented for UHS2 */
> + host->quirks |= SDHCI_QUIRK_NO_LED;
> +
> + ret = __sdhci_add_host(host);
> + if (ret)
> + goto cleanup;
> +
> + return 0;
> +
> +cleanup:
> + if (host->version >= SDHCI_SPEC_400)
> + __sdhci_uhs2_remove_host(host, 0);
> +
> + sdhci_cleanup_host(host);
> +
> + return ret;
> +}
> +EXPORT_SYMBOL_GPL(sdhci_uhs2_add_host);
> +
> +void sdhci_uhs2_remove_host(struct sdhci_host *host, int dead)
> +{
> + __sdhci_uhs2_remove_host(host, dead);
> +
> + sdhci_remove_host(host, dead);
> +}
> +EXPORT_SYMBOL_GPL(sdhci_uhs2_remove_host);
> +
> void sdhci_uhs2_request(struct mmc_host *mmc, struct mmc_request *mrq)
> {
> struct sdhci_host *host = mmc_priv(mmc);
> diff --git a/drivers/mmc/host/sdhci-uhs2.h b/drivers/mmc/host/sdhci-uhs2.h
> index 3aa2cb4b39d6..bd5aae054c6f 100644
> --- a/drivers/mmc/host/sdhci-uhs2.h
> +++ b/drivers/mmc/host/sdhci-uhs2.h
> @@ -186,5 +186,7 @@ void sdhci_uhs2_clear_set_irqs(struct sdhci_host *host, u32 clear, u32 set);
> void sdhci_uhs2_request(struct mmc_host *mmc, struct mmc_request *mrq);
> int sdhci_uhs2_request_atomic(struct mmc_host *mmc, struct mmc_request *mrq);
> u32 sdhci_uhs2_irq(struct sdhci_host *host, u32 intmask);
> +int sdhci_uhs2_add_host(struct sdhci_host *host);
> +void sdhci_uhs2_remove_host(struct sdhci_host *host, int dead);
>
> #endif /* __SDHCI_UHS2_H */
> diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c
> index 318d4830732f..b3de7e30ba54 100644
> --- a/drivers/mmc/host/sdhci.c
> +++ b/drivers/mmc/host/sdhci.c
> @@ -4104,6 +4104,9 @@ struct sdhci_host *sdhci_alloc_host(struct device *dev,
>
> host->max_timeout_count = 0xE;
>
> + host->complete_work_fn = sdhci_complete_work;
> + host->thread_irq_fn = sdhci_thread_irq;
> +
> return host;
> }
>
> @@ -4853,7 +4856,7 @@ int __sdhci_add_host(struct sdhci_host *host)
> if (!host->complete_wq)
> return -ENOMEM;
>
> - INIT_WORK(&host->complete_work, sdhci_complete_work);
> + INIT_WORK(&host->complete_work, host->complete_work_fn);
>
> timer_setup(&host->timer, sdhci_timeout_timer, 0);
> timer_setup(&host->data_timer, sdhci_timeout_data_timer, 0);
> @@ -4862,7 +4865,7 @@ int __sdhci_add_host(struct sdhci_host *host)
>
> sdhci_init(host, 0);
>
> - ret = request_threaded_irq(host->irq, sdhci_irq, sdhci_thread_irq,
> + ret = request_threaded_irq(host->irq, sdhci_irq, host->thread_irq_fn,
> IRQF_SHARED, mmc_hostname(mmc), host);
> if (ret) {
> pr_err("%s: Failed to request IRQ %d: %d\n",
> diff --git a/drivers/mmc/host/sdhci.h b/drivers/mmc/host/sdhci.h
> index 6bbb9f073f29..5235f2da6568 100644
> --- a/drivers/mmc/host/sdhci.h
> +++ b/drivers/mmc/host/sdhci.h
> @@ -626,6 +626,9 @@ struct sdhci_host {
> struct timer_list timer; /* Timer for timeouts */
> struct timer_list data_timer; /* Timer for data timeouts */
>
> + void (*complete_work_fn)(struct work_struct *work);
> + irqreturn_t (*thread_irq_fn)(int irq, void *dev_id);
> +
> #if IS_ENABLED(CONFIG_MMC_SDHCI_EXTERNAL_DMA)
> struct dma_chan *rx_chan;
> struct dma_chan *tx_chan;
> diff --git a/include/linux/mmc/host.h b/include/linux/mmc/host.h
> index 1eba64228725..918d4998c1de 100644
> --- a/include/linux/mmc/host.h
> +++ b/include/linux/mmc/host.h
> @@ -379,6 +379,7 @@ struct mmc_host {
> u32 ocr_avail_sdio; /* SDIO-specific OCR */
> u32 ocr_avail_sd; /* SD-specific OCR */
> u32 ocr_avail_mmc; /* MMC-specific OCR */
> + u32 ocr_avail_uhs2; /* UHS2-specific OCR */
ocr_avail_uhs2 gets set but doesn't seem to be used
> struct wakeup_source *ws; /* Enable consume of uevents */
> u32 max_current_330;
> u32 max_current_300;
next prev parent reply other threads:[~2023-08-31 8:36 UTC|newest]
Thread overview: 34+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-08-18 10:01 [PATCH V10 00/23] Add support UHS-II for GL9755 Victor Shih
2023-08-18 10:01 ` [PATCH V10 01/23] mmc: core: Cleanup printing of speed mode at card insertion Victor Shih
2023-08-18 10:01 ` [PATCH V10 02/23] mmc: core: Prepare to support SD UHS-II cards Victor Shih
2023-08-18 10:01 ` [PATCH V10 03/23] mmc: core: Announce successful insertion of an SD UHS-II card Victor Shih
2023-08-18 10:01 ` [PATCH V10 04/23] mmc: core: Extend support for mmc regulators with a vqmmc2 Victor Shih
2023-08-18 10:01 ` [PATCH V10 05/23] mmc: core: Add definitions for SD UHS-II cards Victor Shih
2023-08-18 10:02 ` [PATCH V10 06/23] mmc: core: Support UHS-II card control and access Victor Shih
2023-08-18 10:02 ` [PATCH V10 07/23] mmc: sdhci: add UHS-II related definitions in headers Victor Shih
2023-08-18 10:02 ` [PATCH V10 08/23] mmc: sdhci: add UHS-II module and add a kernel configuration Victor Shih
2023-08-18 10:02 ` [PATCH V10 09/23] mmc: sdhci-uhs2: dump UHS-II registers Victor Shih
2023-08-18 10:02 ` [PATCH V10 10/23] mmc: sdhci-uhs2: add reset function and uhs2_mode function Victor Shih
2023-08-18 10:02 ` [PATCH V10 11/23] mmc: sdhci-uhs2: add set_power() to support vdd2 Victor Shih
2023-08-31 8:26 ` Adrian Hunter
2023-08-18 10:02 ` [PATCH V10 12/23] mmc: sdhci-uhs2: skip signal_voltage_switch() Victor Shih
2023-08-18 10:02 ` [PATCH V10 13/23] mmc: sdhci-uhs2: add set_timeout() Victor Shih
2023-08-18 10:02 ` [PATCH V10 14/23] mmc: sdhci-uhs2: add set_ios() Victor Shih
2023-08-18 10:02 ` [PATCH V10 15/23] mmc: sdhci-uhs2: add detect_init() to detect the interface Victor Shih
2023-08-18 10:02 ` [PATCH V10 16/23] mmc: sdhci-uhs2: add clock operations Victor Shih
2023-08-18 10:02 ` [PATCH V10 17/23] mmc: sdhci-uhs2: add uhs2_control() to initialise the interface Victor Shih
2023-08-18 10:02 ` [PATCH V10 18/23] mmc: sdhci-uhs2: add request() and others Victor Shih
2023-08-31 8:33 ` Adrian Hunter
2023-08-31 10:33 ` Victor Shih
2023-08-31 11:20 ` Adrian Hunter
2023-09-06 16:14 ` Victor Shih
2023-09-12 12:39 ` Adrian Hunter
2023-09-15 9:40 ` Victor Shih
2023-08-18 10:02 ` [PATCH V10 19/23] mmc: sdhci-uhs2: add irq() " Victor Shih
2023-08-18 10:02 ` [PATCH V10 20/23] mmc: sdhci-uhs2: add add_host() and others to set up the driver Victor Shih
2023-08-31 8:34 ` Adrian Hunter [this message]
2023-09-08 9:56 ` Victor Shih
2023-08-18 10:02 ` [PATCH V10 21/23] mmc: sdhci-uhs2: add pre-detect_init hook Victor Shih
2023-08-18 10:02 ` [PATCH V10 22/23] mmc: sdhci-pci: add UHS-II support framework Victor Shih
2023-08-18 10:02 ` [PATCH V10 23/23] mmc: sdhci-pci-gli: enable UHS-II mode for GL9755 Victor Shih
2023-08-26 2:13 ` [PATCH V10 00/23] Add support UHS-II " Victor Shih
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=e8ed5409-5a00-9478-5b91-85d54b7fb2bb@intel.com \
--to=adrian.hunter@intel.com \
--cc=Greg.tu@genesyslogic.com.tw \
--cc=HL.Liu@genesyslogic.com.tw \
--cc=ben.chuang@genesyslogic.com.tw \
--cc=benchuanggli@gmail.com \
--cc=dlunev@chromium.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mmc@vger.kernel.org \
--cc=takahiro.akashi@linaro.org \
--cc=ulf.hansson@linaro.org \
--cc=victor.shih@genesyslogic.com.tw \
--cc=victorshihgli@gmail.com \
/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.