[PATCH 2/3] usb: mtu3: introduce platform data

AngeloGioacchino Del Regno angelogioacchino.delregno at collabora.com
Thu Sep 17 06:41:14 PDT 2026


On 9/17/26 09:32, Roman Vivchar via B4 Relay wrote:
> From: Roman Vivchar <rva333 at protonmail.com>
> 

That's good, but the commit title doesn't explain anything.

usb: mtu3: Add SoC platform data for FIFO slots ?

...or anything else that actually explains what you're doing.

> Some SoCs, such as mt6595, require specific quirks for the MTU3 to
> function properly.
> 
> The mt6595 IP block doesn't support multiple slots for the FIFO,
> resulting FIFO wrap.
> 
> Fix this by adding platform data with a field to handle FIFO limitation.

Well, also say that this commit brings no functional differences for the
currently supported SoCs :-)

> 
> Assisted-by: LLM (debugging)
> Signed-off-by: Roman Vivchar <rva333 at protonmail.com>
> ---
>   drivers/usb/mtu3/mtu3.h        | 9 +++++++++
>   drivers/usb/mtu3/mtu3_core.c   | 5 +++++
>   drivers/usb/mtu3/mtu3_gadget.c | 8 ++++++--
>   drivers/usb/mtu3/mtu3_plat.c   | 8 ++++++--
>   4 files changed, 26 insertions(+), 4 deletions(-)
> 
> diff --git a/drivers/usb/mtu3/mtu3.h b/drivers/usb/mtu3/mtu3.h
> index ba5a63669e5f..1258aa7483aa 100644
> --- a/drivers/usb/mtu3/mtu3.h
> +++ b/drivers/usb/mtu3/mtu3.h
> @@ -315,6 +315,14 @@ static inline struct ssusb_mtk *dev_to_ssusb(struct device *dev)
>   	return dev_get_drvdata(dev);
>   }
>   
> +/**
> + * struct mtu3_platform_data - platform data for the driver.
> + * @single_slot: the IP can handle only one buffer for bulk transfers
> + */
> +struct mtu3_platform_data {
> +	bool single_slot;

bool fifo_single_slot ?

> +};
> +
>   /**
>    * struct mtu3 - device driver instance data.
>    * @slot: MTU3_U2_IP_SLOT_DEFAULT for U2 IP only,
> @@ -369,6 +377,7 @@ struct mtu3 {
>   	unsigned connected:1;
>   	unsigned async_callbacks:1;
>   	unsigned separate_fifo:1;
> +	unsigned single_slot:1;

unsigned fifo_single_slot:1 ?

...or you can bring the entire pdata structure in there for easy future extension.
Your choice.

>   
>   	u8 address;
>   	u8 test_mode_nr;
> diff --git a/drivers/usb/mtu3/mtu3_core.c b/drivers/usb/mtu3/mtu3_core.c
> index 66dbfe1705d5..03e28c93bc51 100644
> --- a/drivers/usb/mtu3/mtu3_core.c
> +++ b/drivers/usb/mtu3/mtu3_core.c
> @@ -923,6 +923,7 @@ int ssusb_gadget_init(struct ssusb_mtk *ssusb)
>   {
>   	struct device *dev = ssusb->dev;
>   	struct platform_device *pdev = to_platform_device(dev);
> +	const struct mtu3_platform_data *pdata = NULL;
>   	struct mtu3 *mtu = NULL;
>   	int ret = -ENOMEM;
>   
> @@ -930,6 +931,10 @@ int ssusb_gadget_init(struct ssusb_mtk *ssusb)
>   	if (mtu == NULL)
>   		return -ENOMEM;
>   
> +	pdata = device_get_match_data(dev);
> +	if (pdata)

Checking if there's any pdata is redundant, since you have already correctly
assigned pdata to all of the of_match entries.

Cheers,
Angelo

> +		mtu->single_slot = pdata->single_slot;
> +
>   	mtu->irq = platform_get_irq_byname_optional(pdev, "device");
>   	if (mtu->irq < 0) {
>   		if (mtu->irq == -EPROBE_DEFER)
> diff --git a/drivers/usb/mtu3/mtu3_gadget.c b/drivers/usb/mtu3/mtu3_gadget.c
> index f224f2ee379a..bfacb1ba152e 100644
> --- a/drivers/usb/mtu3/mtu3_gadget.c
> +++ b/drivers/usb/mtu3/mtu3_gadget.c
> @@ -112,8 +112,12 @@ static int mtu3_ep_enable(struct mtu3_ep *mep)
>   	mep->ep.desc = desc;
>   	mep->ep.comp_desc = comp_desc;
>   
> -	/* slot mainly affects bulk/isoc transfer, so ignore int */
> -	mep->slot = usb_endpoint_xfer_int(desc) ? 0 : mtu->slot;
> +	if (mtu->single_slot)
> +		/* older IPs can handle only one slot reliably */
> +		mep->slot = 0;
> +	else
> +		/* slot mainly affects bulk/isoc transfer, so ignore int */
> +		mep->slot = usb_endpoint_xfer_int(desc) ? 0 : mtu->slot;
>   
>   	ret = mtu3_config_ep(mtu, mep, interval, burst, mult);
>   	if (ret < 0)
> diff --git a/drivers/usb/mtu3/mtu3_plat.c b/drivers/usb/mtu3/mtu3_plat.c
> index cc8a864dbd63..bc65acdfb0de 100644
> --- a/drivers/usb/mtu3/mtu3_plat.c
> +++ b/drivers/usb/mtu3/mtu3_plat.c
> @@ -611,9 +611,13 @@ static const struct dev_pm_ops mtu3_pm_ops = {
>   
>   #define DEV_PM_OPS (IS_ENABLED(CONFIG_PM) ? &mtu3_pm_ops : NULL)
>   
> +static const struct mtu3_platform_data mt8173_platform_data = {
> +	.single_slot = false,
> +};
> +
>   static const struct of_device_id mtu3_of_match[] = {
> -	{.compatible = "mediatek,mt8173-mtu3",},
> -	{.compatible = "mediatek,mtu3",},
> +	{ .compatible = "mediatek,mt8173-mtu3", .data = &mt8173_platform_data },
> +	{ .compatible = "mediatek,mtu3", .data = &mt8173_platform_data },
>   	{},
>   };
>   MODULE_DEVICE_TABLE(of, mtu3_of_match);
> 




More information about the linux-arm-kernel mailing list