[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