[PATCH v2 2/4] mmc: meson-gx: enable the bus pipeline clock on T7
Neil Armstrong
neil.armstrong at linaro.org
Thu Sep 10 00:13:06 PDT 2026
On 9/5/26 17:32, Lucas Tanure wrote:
> On the T7 SoC, the bus path between the SD/eMMC controllers and the
> NIC_MATRIX fabric goes through a pipeline stage inserted by the hardware
> design to help timing closure. The stage has its own gate clock and,
> when that clock is disabled, a controller that starts a DMA transfer can
> never complete it, hanging the storage devices and, from there, the
> whole system.
>
> Add a dedicated match data for the amlogic,t7-mmc compatible that makes
> the driver claim and enable the "pipeline" clock for as long as the
> device is bound.
>
> The clock is deliberately not optional: the hardware cannot do DMA
> without it, and failing the probe with a clear error is preferable to
> booting and hitting an undiagnosable DMA hang later.
>
> Assisted-by: Claude:claude-fable-5
> Signed-off-by: Lucas Tanure <tanure at linux.com>
> ---
> drivers/mmc/host/meson-gx-mmc.c | 20 ++++++++++++++++++++
> 1 file changed, 20 insertions(+)
>
> diff --git a/drivers/mmc/host/meson-gx-mmc.c b/drivers/mmc/host/meson-gx-mmc.c
> index 694bb443d5f3..c0f1e929fc13 100644
> --- a/drivers/mmc/host/meson-gx-mmc.c
> +++ b/drivers/mmc/host/meson-gx-mmc.c
> @@ -139,6 +139,7 @@ struct meson_mmc_data {
> unsigned int always_on;
> unsigned int adjust;
> unsigned int irq_sdio_sleep;
> + bool has_pipeline_clk;
> };
>
> struct sd_emmc_desc {
> @@ -1204,6 +1205,15 @@ static int meson_mmc_probe(struct platform_device *pdev)
> if (IS_ERR(core_clk))
> return PTR_ERR(core_clk);
>
> + if (host->data->has_pipeline_clk) {
> + struct clk *pipe_clk;
> +
> + pipe_clk = devm_clk_get_enabled(&pdev->dev, "pipeline");
> + if (IS_ERR(pipe_clk))
> + return dev_err_probe(&pdev->dev, PTR_ERR(pipe_clk),
> + "missing pipeline clock\n");
> + }
> +
> ret = meson_mmc_clk_init(host);
> if (ret)
> return ret;
> @@ -1322,12 +1332,22 @@ static const struct meson_mmc_data meson_axg_data = {
> .irq_sdio_sleep = CLK_V3_IRQ_SDIO_SLEEP,
> };
>
> +static const struct meson_mmc_data meson_t7_data = {
> + .tx_delay_mask = CLK_V3_TX_DELAY_MASK,
> + .rx_delay_mask = CLK_V3_RX_DELAY_MASK,
> + .always_on = CLK_V3_ALWAYS_ON,
> + .adjust = SD_EMMC_V3_ADJUST,
> + .irq_sdio_sleep = CLK_V3_IRQ_SDIO_SLEEP,
> + .has_pipeline_clk = true,
> +};
> +
> static const struct of_device_id meson_mmc_of_match[] = {
> { .compatible = "amlogic,meson-gx-mmc", .data = &meson_gx_data },
> { .compatible = "amlogic,meson-gxbb-mmc", .data = &meson_gx_data },
> { .compatible = "amlogic,meson-gxl-mmc", .data = &meson_gx_data },
> { .compatible = "amlogic,meson-gxm-mmc", .data = &meson_gx_data },
> { .compatible = "amlogic,meson-axg-mmc", .data = &meson_axg_data },
> + { .compatible = "amlogic,t7-mmc", .data = &meson_t7_data },
> {}
> };
> MODULE_DEVICE_TABLE(of, meson_mmc_of_match);
Reviewed-by: Neil Armstrong <neil.armstrong at linaro.org>
Thanks,
Neil
More information about the linux-arm-kernel
mailing list