diff mbox series

[01/11] usb: gadget: Introduce handle_interrupts ops to USB_GADGET_GENERIC uclass

Message ID 20240614005309.34433-2-marek.vasut+renesas@mailbox.org
State Accepted
Commit d36ef5cbedd08e9a11c6a719d853f1003173133e
Delegated to: Mattijs Korpershoek
Headers show
Series usb: gadget: Introduce handle_interrupts ops to USB_GADGET_GENERIC uclass | expand

Commit Message

Marek Vasut June 14, 2024, 12:51 a.m. UTC
Introduce .ops for USB_GADGET_GENERIC uclass. The first new ops is
.handle_interrupts which must be implemented by DM capable USB gadget
controller drivers and must implement interrupt handling similar to
dm_usb_gadget_handle_interrupts(). This patch currently provides weak
dm_usb_gadget_handle_interrupts() implementation which is overriden by
the drivers, but this will be removed once conversion to handle_interrupts
callback is complete.

Signed-off-by: Marek Vasut <marek.vasut+renesas@mailbox.org>
---
Cc: Alexander Sverdlin <alexander.sverdlin@siemens.com>
Cc: Felipe Balbi <felipe.balbi@linux.intel.com>
Cc: Lukasz Majewski <lukma@denx.de>
Cc: Mattijs Korpershoek <mkorpershoek@baylibre.com>
Cc: Nishanth Menon <nm@ti.com>
Cc: Simon Glass <sjg@chromium.org>
Cc: Thinh Nguyen <Thinh.Nguyen@synopsys.com>
Cc: Tom Rini <trini@konsulko.com>
Cc: u-boot@lists.denx.de
---
 drivers/usb/gadget/udc/udc-uclass.c | 24 ++++++++++++++++++++++++
 include/linux/usb/gadget.h          |  8 ++++++++
 2 files changed, 32 insertions(+)

Comments

Mattijs Korpershoek June 18, 2024, 7:12 a.m. UTC | #1
Hi Marek,

Thank you for the patch.

On ven., juin 14, 2024 at 02:51, Marek Vasut <marek.vasut+renesas@mailbox.org> wrote:

> Introduce .ops for USB_GADGET_GENERIC uclass. The first new ops is
> .handle_interrupts which must be implemented by DM capable USB gadget
> controller drivers and must implement interrupt handling similar to
> dm_usb_gadget_handle_interrupts(). This patch currently provides weak
> dm_usb_gadget_handle_interrupts() implementation which is overriden by
> the drivers, but this will be removed once conversion to handle_interrupts
> callback is complete.
>
> Signed-off-by: Marek Vasut <marek.vasut+renesas@mailbox.org>

Reviewed-by: Mattijs Korpershoek <mkorpershoek@baylibre.com>

> ---
> Cc: Alexander Sverdlin <alexander.sverdlin@siemens.com>
> Cc: Felipe Balbi <felipe.balbi@linux.intel.com>
> Cc: Lukasz Majewski <lukma@denx.de>
> Cc: Mattijs Korpershoek <mkorpershoek@baylibre.com>
> Cc: Nishanth Menon <nm@ti.com>
> Cc: Simon Glass <sjg@chromium.org>
> Cc: Thinh Nguyen <Thinh.Nguyen@synopsys.com>
> Cc: Tom Rini <trini@konsulko.com>
> Cc: u-boot@lists.denx.de
> ---
>  drivers/usb/gadget/udc/udc-uclass.c | 24 ++++++++++++++++++++++++
>  include/linux/usb/gadget.h          |  8 ++++++++
>  2 files changed, 32 insertions(+)
>
> diff --git a/drivers/usb/gadget/udc/udc-uclass.c b/drivers/usb/gadget/udc/udc-uclass.c
> index 5dc23a55bb5..2320039fe3b 100644
> --- a/drivers/usb/gadget/udc/udc-uclass.c
> +++ b/drivers/usb/gadget/udc/udc-uclass.c
> @@ -12,6 +12,25 @@
>  #include <linux/usb/gadget.h>
>  
>  #if CONFIG_IS_ENABLED(DM_USB_GADGET)
> +static inline const struct usb_gadget_generic_ops *
> +usb_gadget_generic_dev_ops(struct udevice *dev)
> +{
> +	return (const struct usb_gadget_generic_ops *)dev->driver->ops;
> +}
> +
> +__weak int dm_usb_gadget_handle_interrupts(struct udevice *dev)
> +{
> +	const struct usb_gadget_generic_ops *ops;
> +
> +	ops = usb_gadget_generic_dev_ops(dev);
> +	if (!ops)
> +		return -EFAULT;
> +	if (!ops->handle_interrupts)
> +		return -ENOSYS;
> +
> +	return ops->handle_interrupts(dev);
> +}
> +
>  int udc_device_get_by_index(int index, struct udevice **udev)
>  {
>  	struct udevice *dev = NULL;
> @@ -54,6 +73,11 @@ int udc_device_put(struct udevice *udev)
>  {
>  	return board_usb_cleanup(legacy_index, USB_INIT_DEVICE);
>  }
> +
> +__weak int dm_usb_gadget_handle_interrupts(struct udevice *dev)
> +{
> +	return 0;
> +}
>  #endif
>  
>  #if CONFIG_IS_ENABLED(DM)
> diff --git a/include/linux/usb/gadget.h b/include/linux/usb/gadget.h
> index 36572be89e6..cf2161603d6 100644
> --- a/include/linux/usb/gadget.h
> +++ b/include/linux/usb/gadget.h
> @@ -970,6 +970,14 @@ extern void usb_ep_autoconfig_reset(struct usb_gadget *);
>  
>  extern int dm_usb_gadget_handle_interrupts(struct udevice *);
>  
> +/**
> + * struct usb_gadget_generic_ops - The functions that a gadget driver must implement.
> + * @handle_interrupts: Handle UDC interrupts.
> + */
> +struct usb_gadget_generic_ops {
> +	int (*handle_interrupts)(struct udevice *udevice);
> +};
> +
>  /**
>   * udc_device_get_by_index() - Get UDC udevice by index
>   * @index: UDC device index
> -- 
> 2.43.0
diff mbox series

Patch

diff --git a/drivers/usb/gadget/udc/udc-uclass.c b/drivers/usb/gadget/udc/udc-uclass.c
index 5dc23a55bb5..2320039fe3b 100644
--- a/drivers/usb/gadget/udc/udc-uclass.c
+++ b/drivers/usb/gadget/udc/udc-uclass.c
@@ -12,6 +12,25 @@ 
 #include <linux/usb/gadget.h>
 
 #if CONFIG_IS_ENABLED(DM_USB_GADGET)
+static inline const struct usb_gadget_generic_ops *
+usb_gadget_generic_dev_ops(struct udevice *dev)
+{
+	return (const struct usb_gadget_generic_ops *)dev->driver->ops;
+}
+
+__weak int dm_usb_gadget_handle_interrupts(struct udevice *dev)
+{
+	const struct usb_gadget_generic_ops *ops;
+
+	ops = usb_gadget_generic_dev_ops(dev);
+	if (!ops)
+		return -EFAULT;
+	if (!ops->handle_interrupts)
+		return -ENOSYS;
+
+	return ops->handle_interrupts(dev);
+}
+
 int udc_device_get_by_index(int index, struct udevice **udev)
 {
 	struct udevice *dev = NULL;
@@ -54,6 +73,11 @@  int udc_device_put(struct udevice *udev)
 {
 	return board_usb_cleanup(legacy_index, USB_INIT_DEVICE);
 }
+
+__weak int dm_usb_gadget_handle_interrupts(struct udevice *dev)
+{
+	return 0;
+}
 #endif
 
 #if CONFIG_IS_ENABLED(DM)
diff --git a/include/linux/usb/gadget.h b/include/linux/usb/gadget.h
index 36572be89e6..cf2161603d6 100644
--- a/include/linux/usb/gadget.h
+++ b/include/linux/usb/gadget.h
@@ -970,6 +970,14 @@  extern void usb_ep_autoconfig_reset(struct usb_gadget *);
 
 extern int dm_usb_gadget_handle_interrupts(struct udevice *);
 
+/**
+ * struct usb_gadget_generic_ops - The functions that a gadget driver must implement.
+ * @handle_interrupts: Handle UDC interrupts.
+ */
+struct usb_gadget_generic_ops {
+	int (*handle_interrupts)(struct udevice *udevice);
+};
+
 /**
  * udc_device_get_by_index() - Get UDC udevice by index
  * @index: UDC device index