driver/usbdev: Use small lock to protect composite device

Use spin lock to replace enter_critical_section

Signed-off-by: yangsong8 <yangsong8@xiaomi.com>
This commit is contained in:
yangsong8
2025-04-03 21:41:33 +08:00
committed by Xiang Xiao
parent f93a1b34e5
commit a1f5c269d7
2 changed files with 11 additions and 8 deletions
+9 -8
View File
@@ -537,7 +537,7 @@ static void composite_unbind(FAR struct usbdevclass_driver_s *driver,
/* Unbind the constituent class drivers */ /* Unbind the constituent class drivers */
flags = enter_critical_section(); flags = spin_lock_irqsave_nopreempt(&priv->lock);
for (i = 0; i < priv->ndevices; i++) for (i = 0; i < priv->ndevices; i++)
{ {
CLASS_UNBIND(priv->device[i].dev, dev); CLASS_UNBIND(priv->device[i].dev, dev);
@@ -552,7 +552,7 @@ static void composite_unbind(FAR struct usbdevclass_driver_s *driver,
priv->ctrlreq = NULL; priv->ctrlreq = NULL;
} }
leave_critical_section(flags); spin_unlock_irqrestore_nopreempt(&priv->lock, flags);
} }
} }
@@ -864,7 +864,7 @@ static void composite_disconnect(FAR struct usbdevclass_driver_s *driver,
* the disconnection. * the disconnection.
*/ */
flags = enter_critical_section(); flags = spin_lock_irqsave_nopreempt(&priv->lock);
for (i = 0; i < priv->ndevices; i++) for (i = 0; i < priv->ndevices; i++)
{ {
@@ -872,7 +872,7 @@ static void composite_disconnect(FAR struct usbdevclass_driver_s *driver,
} }
priv->config = COMPOSITE_CONFIGIDNONE; priv->config = COMPOSITE_CONFIGIDNONE;
leave_critical_section(flags); spin_unlock_irqrestore_nopreempt(&priv->lock, flags);
/* Perform the soft connect function so that we will we can be /* Perform the soft connect function so that we will we can be
* re-enumerated. * re-enumerated.
@@ -920,14 +920,14 @@ static void composite_suspend(FAR struct usbdevclass_driver_s *driver,
/* Forward the suspend event to the constituent devices */ /* Forward the suspend event to the constituent devices */
flags = enter_critical_section(); flags = spin_lock_irqsave_nopreempt(&priv->lock);
for (i = 0; i < priv->ndevices; i++) for (i = 0; i < priv->ndevices; i++)
{ {
CLASS_SUSPEND(priv->device[i].dev, priv->usbdev); CLASS_SUSPEND(priv->device[i].dev, priv->usbdev);
} }
leave_critical_section(flags); spin_unlock_irqrestore_nopreempt(&priv->lock, flags);
} }
/**************************************************************************** /****************************************************************************
@@ -967,14 +967,14 @@ static void composite_resume(FAR struct usbdevclass_driver_s *driver,
/* Forward the resume event to the constituent devices */ /* Forward the resume event to the constituent devices */
flags = enter_critical_section(); flags = spin_lock_irqsave_nopreempt(&priv->lock);
for (i = 0; i < priv->ndevices; i++) for (i = 0; i < priv->ndevices; i++)
{ {
CLASS_RESUME(priv->device[i].dev, priv->usbdev); CLASS_RESUME(priv->device[i].dev, priv->usbdev);
} }
leave_critical_section(flags); spin_unlock_irqrestore_nopreempt(&priv->lock, flags);
} }
/**************************************************************************** /****************************************************************************
@@ -1040,6 +1040,7 @@ FAR void *composite_initialize(FAR const struct usbdev_devdescs_s *devdescs,
priv->descs = devdescs; priv->descs = devdescs;
priv->cfgdescsize = USB_SIZEOF_CFGDESC; priv->cfgdescsize = USB_SIZEOF_CFGDESC;
priv->ninterfaces = 0; priv->ninterfaces = 0;
spin_lock_init(&priv->lock);
/* Get the constituent class driver objects */ /* Get the constituent class driver objects */
+2
View File
@@ -36,6 +36,7 @@
#include <nuttx/usb/usb.h> #include <nuttx/usb/usb.h>
#include <nuttx/usb/usbdev.h> #include <nuttx/usb/usbdev.h>
#include <nuttx/usb/usbdev_trace.h> #include <nuttx/usb/usbdev_trace.h>
#include <nuttx/spinlock.h>
/**************************************************************************** /****************************************************************************
* Pre-processor Definitions * Pre-processor Definitions
@@ -88,6 +89,7 @@ struct composite_dev_s
uint8_t ndevices; /* Num devices in this composite device */ uint8_t ndevices; /* Num devices in this composite device */
struct composite_devobj_s device[NUM_DEVICES_TO_HANDLE]; /* Device class object */ struct composite_devobj_s device[NUM_DEVICES_TO_HANDLE]; /* Device class object */
FAR const struct usbdev_devdescs_s *descs; /* Device descriptors */ FAR const struct usbdev_devdescs_s *descs; /* Device descriptors */
spinlock_t lock;
}; };
#endif /* __DRIVERS_USBDEV_COMPOSITE_H */ #endif /* __DRIVERS_USBDEV_COMPOSITE_H */