All of lore.kernel.org
 help / color / mirror / Atom feed
From: Christian Marangi <ansuelsmth@gmail.com>
To: "Andy-ld Lu (卢东)" <Andy-ld.Lu@mediatek.com>
Cc: "linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
	"linux-mediatek@lists.infradead.org"
	<linux-mediatek@lists.infradead.org>,
	"linux-mmc@vger.kernel.org" <linux-mmc@vger.kernel.org>,
	"devicetree@vger.kernel.org" <devicetree@vger.kernel.org>,
	"Wenbin Mei (梅文彬)" <Wenbin.Mei@mediatek.com>,
	"Chaotian Jing (井朝天)" <Chaotian.Jing@mediatek.com>,
	"conor+dt@kernel.org" <conor+dt@kernel.org>,
	"robh@kernel.org" <robh@kernel.org>,
	"linux-arm-kernel@lists.infradead.org"
	<linux-arm-kernel@lists.infradead.org>,
	"matthias.bgg@gmail.com" <matthias.bgg@gmail.com>,
	"ulf.hansson@linaro.org" <ulf.hansson@linaro.org>,
	"krzk+dt@kernel.org" <krzk+dt@kernel.org>,
	"AngeloGioacchino Del Regno"
	<angelogioacchino.delregno@collabora.com>,
	upstream <upstream@airoha.com>
Subject: Re: [PATCH 2/2] mmc: mtk-sd: add support for AN7581 MMC Host
Date: Mon, 27 Jan 2025 12:41:55 +0100	[thread overview]
Message-ID: <67977105.5d0a0220.3b7c2.faad@mx.google.com> (raw)
In-Reply-To: <362d66661fcafc09c8d8d15be9e81823caa4ad1b.camel@mediatek.com>

On Thu, Jan 23, 2025 at 01:42:03AM +0000, Andy-ld Lu (卢东) wrote:
> On Wed, 2025-01-22 at 10:32 +0100, Christian Marangi wrote:
> > External email : Please do not click links or open attachments until
> > you have verified the sender or the content.
> > 
> > 
> > On Tue, Jan 21, 2025 at 06:25:48AM +0000, Andy-ld Lu (卢东) wrote:
> > > On Mon, 2025-01-20 at 18:29 +0100, Christian Marangi wrote:
> > > > External email : Please do not click links or open attachments
> > > > until
> > > > you have verified the sender or the content.
> > > > 
> > > > 
> > > > On Thu, Jan 16, 2025 at 07:01:13AM +0000, Andy-ld Lu (卢东) wrote:
> > > > > On Wed, 2025-01-15 at 08:29 +0100, Christian Marangi wrote:
> > > > > > Add support for AN7581 MMC Host. The MMC Host controller is
> > > > > > based
> > > > > > on
> > > > > > mt7622 with the difference of not having regulator supply and
> > > > > > state_uhs
> > > > > > pins and hclk clock.
> > > > > > 
> > > > > > Some minor fixes are applied to check if the state_uhs pins
> > > > > > are
> > > > > > defined
> > > > > > and make hclk optional for the new airoha compatible.
> > > > > > 
> > > > > > Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
> > > > > > ---
> > > > > >  drivers/mmc/host/mtk-sd.c | 55
> > > > > > ++++++++++++++++++++++++++++++++-
> > > > > > ----
> > > > > > --
> > > > > >  1 file changed, 46 insertions(+), 9 deletions(-)
> > > > > > 
> > > > > > diff --git a/drivers/mmc/host/mtk-sd.c
> > > > > > b/drivers/mmc/host/mtk-
> > > > > > sd.c
> > > > > > index efb0d2d5716b..9d6868883c91 100644
> > > > > > --- a/drivers/mmc/host/mtk-sd.c
> > > > > > +++ b/drivers/mmc/host/mtk-sd.c
> > > > > > @@ -666,6 +666,20 @@ static const struct mtk_mmc_compatible
> > > > > > mt8196_compat = {
> > > > > >     .support_new_rx = true,
> > > > > >  };
> > > > > > 
> > > > > > +static const struct mtk_mmc_compatible an7581_compat = {
> > > > > > +   .clk_div_bits = 12,
> > > > > > +   .recheck_sdio_irq = true,
> > > > > > +   .hs400_tune = false,
> > > > > > +   .pad_tune_reg = MSDC_PAD_TUNE0,
> > > > > > +   .async_fifo = true,
> > > > > > +   .data_tune = true,
> > > > > > +   .busy_check = true,
> > > > > > +   .stop_clk_fix = true,
> > > > > > +   .stop_dly_sel = 3,
> > > > > > +   .enhance_rx = true,
> > > > > > +   .support_64g = false,
> > > > > > +};
> > > > > > +
> > > > > >  static const struct of_device_id msdc_of_ids[] = {
> > > > > >     { .compatible = "mediatek,mt2701-mmc", .data =
> > > > > > &mt2701_compat},
> > > > > >     { .compatible = "mediatek,mt2712-mmc", .data =
> > > > > > &mt2712_compat},
> > > > > > @@ -680,7 +694,7 @@ static const struct of_device_id
> > > > > > msdc_of_ids[] =
> > > > > > {
> > > > > >     { .compatible = "mediatek,mt8183-mmc", .data =
> > > > > > &mt8183_compat},
> > > > > >     { .compatible = "mediatek,mt8196-mmc", .data =
> > > > > > &mt8196_compat},
> > > > > >     { .compatible = "mediatek,mt8516-mmc", .data =
> > > > > > &mt8516_compat},
> > > > > > -
> > > > > > +   { .compatible = "airoha,an7581-mmc", .data =
> > > > > > &an7581_compat},
> > > > > >     {}
> > > > > >  };
> > > > > >  MODULE_DEVICE_TABLE(of, msdc_of_ids);
> > > > > > @@ -1600,6 +1614,10 @@ static int msdc_ops_switch_volt(struct
> > > > > > mmc_host *mmc, struct mmc_ios *ios)
> > > > > >     struct msdc_host *host = mmc_priv(mmc);
> > > > > >     int ret;
> > > > > > 
> > > > > > +   /* Skip setting supply if not supported */
> > > > > > +   if (!mmc->supply.vqmmc)
> > > > > > +           return 0;
> > > > > > +
> > > > > 
> > > > > Hi Christian,
> > > > > 
> > > > > I think here is no need. If you have not 'vqmmc' in the
> > > > > dts, IS_ERR(mmc->supply.vqmmc) would be -ENODEV and the
> > > > > corresponding
> > > > > flow would not be executed.
> > > > > 
> > > > > And another question, host->pins_default is just selected here,
> > > > > that
> > > > > would be lost.
> > > > > 
> > > > > >     if (!IS_ERR(mmc->supply.vqmmc)) {
> > > > > >             if (ios->signal_voltage != MMC_SIGNAL_VOLTAGE_330
> > > > > > &&
> > > > > >                 ios->signal_voltage !=
> > > > > > MMC_SIGNAL_VOLTAGE_180) {
> > > > > > @@ -1699,7 +1717,9 @@ static void msdc_enable_sdio_irq(struct
> > > > > > mmc_host *mmc, int enb)
> > > > > >                             dev_dbg(host->dev, "SDIO eint
> > > > > > irq:
> > > > > > %d!\n", host->eint_irq);
> > > > > >                     }
> > > > > > 
> > > > > > -                   pinctrl_select_state(host->pinctrl, host-
> > > > > > > pins_uhs);
> > > > > > 
> > > > > > +                   /* Skip setting uhs pins if not supported
> > > > > > */
> > > > > > +                   if (host->pins_uhs)
> > > > > > +                           pinctrl_select_state(host-
> > > > > > >pinctrl,
> > > > > > host->pins_uhs);
> > > > > >             } else {
> > > > > >                     dev_pm_clear_wake_irq(host->dev);
> > > > > >             }
> > > > > > @@ -2036,6 +2056,10 @@ static void msdc_ops_set_ios(struct
> > > > > > mmc_host
> > > > > > *mmc, struct mmc_ios *ios)
> > > > > > 
> > > > > >     msdc_set_buswidth(host, ios->bus_width);
> > > > > > 
> > > > > > +   /* Skip regulator if not supported */
> > > > > > +   if (!mmc->supply.vmmc)
> > > > > > +           goto skip_regulator;
> > > > > > +
> > > > > 
> > > > > No need too.
> > > > > 
> > > > > >     /* Suspend/Resume will do power off/on */
> > > > > >     switch (ios->power_mode) {
> > > > > >     case MMC_POWER_UP:
> > > > > > @@ -2071,6 +2095,7 @@ static void msdc_ops_set_ios(struct
> > > > > > mmc_host
> > > > > > *mmc, struct mmc_ios *ios)
> > > > > >             break;
> > > > > >     }
> > > > > > 
> > > > > > +skip_regulator:
> > > > > >     if (host->mclk != ios->clock || host->timing != ios-
> > > > > > >timing)
> > > > > >             msdc_set_mclk(host, ios->timing, ios->clock);
> > > > > >  }
> > > > > > @@ -2816,9 +2841,12 @@ static int msdc_of_clock_parse(struct
> > > > > > platform_device *pdev,
> > > > > >     if (IS_ERR(host->src_clk))
> > > > > >             return PTR_ERR(host->src_clk);
> > > > > > 
> > > > > > -   host->h_clk = devm_clk_get(&pdev->dev, "hclk");
> > > > > > -   if (IS_ERR(host->h_clk))
> > > > > > -           return PTR_ERR(host->h_clk);
> > > > > > +   /* AN7581 SoC doesn't have hclk */
> > > > > > +   if (!device_is_compatible(&pdev->dev, "airoha,an7581-
> > > > > > mmc")) {
> > > > > > +           host->h_clk = devm_clk_get(&pdev->dev, "hclk");
> > > > > > +           if (IS_ERR(host->h_clk))
> > > > > > +                   return PTR_ERR(host->h_clk);
> > > > > > +   }
> > > > > 
> > > > > devm_clk_get_optional could be used to instead here, no need to
> > > > > use
> > > > > compatible to distinguish.
> > > > > 
> > > > 
> > > > I can make the hclk optional but I think this would affect also
> > > > every
> > > > other compatible by hiding broken clock configuration.
> > > > 
> > > > > >     host->bus_clk = devm_clk_get_optional(&pdev->dev,
> > > > > > "bus_clk");
> > > > > >     if (IS_ERR(host->bus_clk))
> > > > > > @@ -2926,10 +2954,13 @@ static int msdc_drv_probe(struct
> > > > > > platform_device *pdev)
> > > > > >             return PTR_ERR(host->pins_default);
> > > > > >     }
> > > > > > 
> > > > > > -   host->pins_uhs = pinctrl_lookup_state(host->pinctrl,
> > > > > > "state_uhs");
> > > > > > -   if (IS_ERR(host->pins_uhs)) {
> > > > > > -           dev_err(&pdev->dev, "Cannot find pinctrl
> > > > > > uhs!\n");
> > > > > > -           return PTR_ERR(host->pins_uhs);
> > > > > > +   /* AN7581 doesn't have state_uhs pins */
> > > > > > +   if (!device_is_compatible(&pdev->dev, "airoha,an7581-
> > > > > > mmc")) {
> > > > > > +           host->pins_uhs = pinctrl_lookup_state(host-
> > > > > > >pinctrl,
> > > > > > "state_uhs");
> > > > > > +           if (IS_ERR(host->pins_uhs)) {
> > > > > > +                   dev_err(&pdev->dev, "Cannot find pinctrl
> > > > > > uhs!\n");
> > > > > > +                   return PTR_ERR(host->pins_uhs);
> > > > > > +           }
> > > > > >     }
> > > > > 
> > > > > Could you consider to set a dummy 'state_uhs' same as
> > > > > 'state_default'
> > > > > in the dts, that you could not use compatible to distinguish
> > > > > here.
> > > > > 
> > > > 
> > > > This is problematic, correct me if I'm wrong, you are suggesting
> > > > to
> > > > assign the emmc pins to both default and uhs? This is problematic
> > > > as
> > > > the
> > > > pinctrl driver would complain that such pins are already assigned
> > > > to
> > > > something. Also I don't think it's possible to assign these pins
> > > > to a
> > > > dummy pin.
> > > > 
> > > 
> > > Maybe I have not expressed clearly...What I mean is that you could
> > > set
> > > as below, and the content of &mmc_pins_uhs is just copied from
> > > &mmc_pins_default.
> > > 
> > > mmc@1fa0e000 {
> > >       ...
> > >       pinctrl-names = "default", "state_uhs";
> > >       pinctrl-0 = <&mmc_pins_default>;
> > >       pinctrl-1 = <&mmc_pins_uhs>;
> > > }
> > 
> > Ok my bad. I did declared the second pin to pinctrl-0 instead of
> > adding
> > pinctrl-1. With that it does work correctly.
> > 
> > > > > > 
> > > > > >     /* Support for SDIO eint irq ? */
> > > > > > @@ -3010,6 +3041,12 @@ static int msdc_drv_probe(struct
> > > > > > platform_device *pdev)
> > > > > >             dev_err(&pdev->dev, "Cannot ungate clocks!\n");
> > > > > >             goto release_clk;
> > > > > >     }
> > > > > > +
> > > > > > +   /* AN7581 without regulator require tune to OCR values */
> > > > > > +   if (device_is_compatible(&pdev->dev, "airoha,an7581-mmc") 
> > > > > > &&
> > > > > > +       !mmc->ocr_avail)
> > > > > > +           mmc->ocr_avail = MMC_VDD_32_33 | MMC_VDD_33_34;
> > > > > > +
> > > > > 
> > > > > Maybe you could use regulator-fixed in the dts and configure
> > > > > min/max
> > > > > voltage to get ocr_avail, no need to set hard code here.
> > > > > 
> > > > 
> > > > Also suggested by Wenbin Mei (梅文彬) and I just tried this.
> > > > 
> > > > This can't be done, fixed-regulator needs to have the same min
> > > > and
> > > > max
> > > > voltage or they fail to probe sooo fixed-regulator saddly can't
> > > > be
> > > > used
> > > > :(
> > > > 
> > > > I will send a new version of this with the other point corrected
> > > > but
> > > > I
> > > > think a compatible and these additional if is a must :(
> > > 
> > > If use the fixed regulator such as below, you will get the same
> > > ocr_avail as 'MMC_VDD_32_33 | MMC_VDD_33_34' through
> > > mmc_regulator_get_ocrmask().
> > > 
> > > vmmc_3v3: regulator-vmmc-3v3 {
> > >       compatible = "regulator-fixed";
> > >       regulator-name = "vmmc";
> > >       regulator-min-microvolt = <3300000>;
> > >       regulator-max-microvolt = <3300000>;
> > >       regulator-always-on;
> > > }
> > 
> > Ok the code was a bit confusing but yes I can confirm that a 3.3
> > fixed
> > regulator define those 2 flags so also this is OK.
> > 
> > There is still the discussion about clock. You are totally against a
> > new
> > compatible for the hclk?
> > 
> As the comment in the v2 patches, the better way is to add a bool
> variable like 'needs_not_hclk' in the compat data, which is just true
> for you, and use !host->dev_comp->needs_not_hclk as the condition to
> get 'hclk'.
> 
> But I would like to confirm if the 'fixed-clock' could be supported in
> your project, which is also used in mt7622.dtsi, you may align 'hclk'
> to a dummy fixed-clock... 
>

Thanks I implemented with dummy clock + dummy regulator + dummy state so
we don't need an additional compatible. Thanks for the suggestions!

> > > > 
> > > > > >     msdc_init_hw(host);
> > > > > > 
> > > > > >     if (mmc->caps2 & MMC_CAP2_CQE) {
> > > > 
> > > > --
> > > >         Ansuel
> > 
> > --
> >         Ansuel

-- 
	Ansuel


  reply	other threads:[~2025-01-27 11:44 UTC|newest]

Thread overview: 14+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-01-15  7:29 [PATCH 1/2] dt-bindings: mmc: mtk-sd: Add eMMC for AN7581 Christian Marangi
2025-01-15  7:29 ` [PATCH 2/2] mmc: mtk-sd: add support for AN7581 MMC Host Christian Marangi
2025-01-15  9:33   ` Wenbin Mei (梅文彬)
2025-01-15  9:35     ` Christian Marangi
2025-01-16  7:01   ` Andy-ld Lu (卢东)
2025-01-20 17:29     ` Christian Marangi
2025-01-21  6:25       ` Andy-ld Lu (卢东)
2025-01-22  9:32         ` Christian Marangi
2025-01-23  1:42           ` Andy-ld Lu (卢东)
2025-01-27 11:41             ` Christian Marangi [this message]
2025-01-15  8:37 ` [PATCH 1/2] dt-bindings: mmc: mtk-sd: Add eMMC for AN7581 Rob Herring (Arm)
2025-01-15  8:39   ` Christian Marangi
2025-01-15  8:48     ` Krzysztof Kozlowski
2025-01-15  8:51 ` Krzysztof Kozlowski

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=67977105.5d0a0220.3b7c2.faad@mx.google.com \
    --to=ansuelsmth@gmail.com \
    --cc=Andy-ld.Lu@mediatek.com \
    --cc=Chaotian.Jing@mediatek.com \
    --cc=Wenbin.Mei@mediatek.com \
    --cc=angelogioacchino.delregno@collabora.com \
    --cc=conor+dt@kernel.org \
    --cc=devicetree@vger.kernel.org \
    --cc=krzk+dt@kernel.org \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mediatek@lists.infradead.org \
    --cc=linux-mmc@vger.kernel.org \
    --cc=matthias.bgg@gmail.com \
    --cc=robh@kernel.org \
    --cc=ulf.hansson@linaro.org \
    --cc=upstream@airoha.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.