[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