usb: chipidea: udc: implement get_frame
The chipidea udc core is capable of reading the current frame index from hardware. This patch adds the get_frame callback to the driver. Acked-by: Peter Chen <peter.chen@kernel.org> Signed-off-by: Michael Grzeschik <m.grzeschik@pengutronix.de> Link: https://lore.kernel.org/r/20220616194459.2981519-1-m.grzeschik@pengutronix.de Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
5c586db846
commit
8709115180
3 changed files with 17 additions and 0 deletions
|
@ -49,6 +49,7 @@ enum ci_hw_regs {
|
|||
OP_USBCMD,
|
||||
OP_USBSTS,
|
||||
OP_USBINTR,
|
||||
OP_FRINDEX,
|
||||
OP_DEVICEADDR,
|
||||
OP_ENDPTLISTADDR,
|
||||
OP_TTCTRL,
|
||||
|
|
|
@ -53,6 +53,7 @@ static const u8 ci_regs_nolpm[] = {
|
|||
[OP_USBCMD] = 0x00U,
|
||||
[OP_USBSTS] = 0x04U,
|
||||
[OP_USBINTR] = 0x08U,
|
||||
[OP_FRINDEX] = 0x0CU,
|
||||
[OP_DEVICEADDR] = 0x14U,
|
||||
[OP_ENDPTLISTADDR] = 0x18U,
|
||||
[OP_TTCTRL] = 0x1CU,
|
||||
|
@ -78,6 +79,7 @@ static const u8 ci_regs_lpm[] = {
|
|||
[OP_USBCMD] = 0x00U,
|
||||
[OP_USBSTS] = 0x04U,
|
||||
[OP_USBINTR] = 0x08U,
|
||||
[OP_FRINDEX] = 0x0CU,
|
||||
[OP_DEVICEADDR] = 0x14U,
|
||||
[OP_ENDPTLISTADDR] = 0x18U,
|
||||
[OP_TTCTRL] = 0x1CU,
|
||||
|
|
|
@ -1651,6 +1651,19 @@ static const struct usb_ep_ops usb_ep_ops = {
|
|||
/******************************************************************************
|
||||
* GADGET block
|
||||
*****************************************************************************/
|
||||
|
||||
static int ci_udc_get_frame(struct usb_gadget *_gadget)
|
||||
{
|
||||
struct ci_hdrc *ci = container_of(_gadget, struct ci_hdrc, gadget);
|
||||
unsigned long flags;
|
||||
int ret;
|
||||
|
||||
spin_lock_irqsave(&ci->lock, flags);
|
||||
ret = hw_read(ci, OP_FRINDEX, 0x3fff);
|
||||
spin_unlock_irqrestore(&ci->lock, flags);
|
||||
return ret >> 3;
|
||||
}
|
||||
|
||||
/*
|
||||
* ci_hdrc_gadget_connect: caller makes sure gadget driver is binded
|
||||
*/
|
||||
|
@ -1807,6 +1820,7 @@ static struct usb_ep *ci_udc_match_ep(struct usb_gadget *gadget,
|
|||
* Check "usb_gadget.h" for details
|
||||
*/
|
||||
static const struct usb_gadget_ops usb_gadget_ops = {
|
||||
.get_frame = ci_udc_get_frame,
|
||||
.vbus_session = ci_udc_vbus_session,
|
||||
.wakeup = ci_udc_wakeup,
|
||||
.set_selfpowered = ci_udc_selfpowered,
|
||||
|
|
Loading…
Add table
Reference in a new issue