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 |
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 --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
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(+)