Message ID | 20250120184728.18325-2-ansuelsmth@gmail.com (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | [v2,1/2] dt-bindings: mmc: mtk-sd: Add eMMC for AN7581 | expand |
On Mon, Jan 20, 2025 at 07:47:02PM +0100, Christian Marangi wrote: > - 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); > } > @@ -2816,9 +2835,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")) { Please avoid coding compatible in multiple places. Not only because above check is slow comparing to check on integer, but it just scales poorly and leads to less readable further code. Use driver data with model name or flags/quirks bitmask. Best regards, Krzysztof
On Tue, Jan 21, 2025 at 08:59:19AM +0100, Krzysztof Kozlowski wrote: > On Mon, Jan 20, 2025 at 07:47:02PM +0100, Christian Marangi wrote: > > - 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); > > } > > @@ -2816,9 +2835,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")) { > > Please avoid coding compatible in multiple places. Not only because > above check is slow comparing to check on integer, but it just scales > poorly and leads to less readable further code. Use driver data with > model name or flags/quirks bitmask. > I implemented this in a more compatible way so we don't need an additional compatible anymore. Soo this series is not needed anymore. Should I flag these as not applicable anywhere in the patchwork systems?
On Mon, 27 Jan 2025 at 12:41, Christian Marangi <ansuelsmth@gmail.com> wrote: > > On Tue, Jan 21, 2025 at 08:59:19AM +0100, Krzysztof Kozlowski wrote: > > On Mon, Jan 20, 2025 at 07:47:02PM +0100, Christian Marangi wrote: > > > - 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); > > > } > > > @@ -2816,9 +2835,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")) { > > > > Please avoid coding compatible in multiple places. Not only because > > above check is slow comparing to check on integer, but it just scales > > poorly and leads to less readable further code. Use driver data with > > model name or flags/quirks bitmask. > > > > I implemented this in a more compatible way so we don't need an > additional compatible anymore. Soo this series is not needed anymore. > > Should I flag these as not applicable anywhere in the patchwork systems? No need to, just send new versions. Kind regards Uffe
diff --git a/drivers/mmc/host/mtk-sd.c b/drivers/mmc/host/mtk-sd.c index efb0d2d5716b..f76f20502409 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); @@ -1614,12 +1628,15 @@ static int msdc_ops_switch_volt(struct mmc_host *mmc, struct mmc_ios *ios) return ret; } - /* Apply different pinctrl settings for different signal voltage */ - if (ios->signal_voltage == MMC_SIGNAL_VOLTAGE_180) - pinctrl_select_state(host->pinctrl, host->pins_uhs); - else - pinctrl_select_state(host->pinctrl, host->pins_default); } + + /* Apply different pinctrl settings for different signal voltage */ + if (!IS_ERR(mmc->supply.vqmmc) && + ios->signal_voltage == MMC_SIGNAL_VOLTAGE_180) + pinctrl_select_state(host->pinctrl, host->pins_uhs); + else + pinctrl_select_state(host->pinctrl, host->pins_default); + return 0; } @@ -1699,7 +1716,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); } @@ -2816,9 +2835,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); + } host->bus_clk = devm_clk_get_optional(&pdev->dev, "bus_clk"); if (IS_ERR(host->bus_clk)) @@ -2926,10 +2948,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); + } } /* Support for SDIO eint irq ? */ @@ -3010,6 +3035,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; + msdc_init_hw(host); if (mmc->caps2 & MMC_CAP2_CQE) {
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> --- Changes v2: - Drop redundant if condition where regulator is not supported - Correctly set pin in msdc_ops_switch_volt drivers/mmc/host/mtk-sd.c | 59 +++++++++++++++++++++++++++++---------- 1 file changed, 45 insertions(+), 14 deletions(-)