Patchwork [U-Boot] USB: move keyboard polling from EHCI driver into kbd driver

login
register
mail settings
Submitter Allen Martin
Date Dec. 16, 2011, 9:33 p.m.
Message ID <1324071224-15181-1-git-send-email-amartin@nvidia.com>
Download mbox | patch
Permalink /patch/131909/
State Changes Requested
Delegated to: Remy Bohmer
Headers show

Comments

Allen Martin - Dec. 16, 2011, 9:33 p.m.
This removes dependency on global variable "new" from EHCI driver with
CONFIG_SYS_USB_EVENT_POLL turned on and gets USB keyboard working with
EHCI driver again.

Signed-off-by: Allen Martin <amartin@nvidia.com>
---
 common/usb_kbd.c            |   18 +++++++++++++++++-
 drivers/usb/host/ehci-hcd.c |   30 ------------------------------
 2 files changed, 17 insertions(+), 31 deletions(-)
Remy Bohmer - Dec. 17, 2011, 2:15 p.m.
Hi,

2011/12/16 Allen Martin <amartin@nvidia.com>:
> This removes dependency on global variable "new" from EHCI driver with
> CONFIG_SYS_USB_EVENT_POLL turned on and gets USB keyboard working with
> EHCI driver again.
>
> Signed-off-by: Allen Martin <amartin@nvidia.com>
> ---
>  common/usb_kbd.c            |   18 +++++++++++++++++-
>  drivers/usb/host/ehci-hcd.c |   30 ------------------------------
>  2 files changed, 17 insertions(+), 31 deletions(-)
>
> diff --git a/common/usb_kbd.c b/common/usb_kbd.c
> index 75107c9..e94bb7e 100644
> --- a/common/usb_kbd.c
> +++ b/common/usb_kbd.c
> @@ -313,7 +313,23 @@ static int usb_kbd_irq(struct usb_device *dev)
>  static inline void usb_kbd_poll_for_event(struct usb_device *dev)
>  {
>  #if    defined(CONFIG_SYS_USB_EVENT_POLL)
> -       usb_event_poll();
> +       struct usb_interface *iface;
> +       struct usb_endpoint_descriptor *ep;
> +       struct usb_kbd_pdata *data;
> +       int pipe;
> +       int maxp;
> +
> +       /* Get the pointer to USB Keyboard device pointer */
> +       data = dev->privptr;
> +       iface = &dev->config.if_desc[0];
> +       ep = &iface->ep_desc[0];
> +       pipe = usb_rcvintpipe(dev, ep->bEndpointAddress);
> +
> +       /* Submit a interrupt transfer request */
> +       maxp = usb_maxpacket(dev, pipe);
> +       usb_submit_int_msg(dev, pipe, &data->new[0],
> +                       maxp > 8 ? 8 : maxp, ep->bInterval);
> +
>        usb_kbd_irq_worker(dev);
>  #elif  defined(CONFIG_SYS_USB_EVENT_POLL_VIA_CONTROL_EP)
>        struct usb_interface *iface;
> diff --git a/drivers/usb/host/ehci-hcd.c b/drivers/usb/host/ehci-hcd.c
> index db10316..94a5eed 100644
> --- a/drivers/usb/host/ehci-hcd.c
> +++ b/drivers/usb/host/ehci-hcd.c
> @@ -26,10 +26,6 @@
>  #include <asm/io.h>
>  #include <malloc.h>
>  #include <watchdog.h>
> -#ifdef CONFIG_USB_KEYBOARD
> -#include <stdio_dev.h>
> -extern unsigned char new[];
> -#endif
>
>  #include "ehci.h"
>
> @@ -946,29 +942,3 @@ submit_int_msg(struct usb_device *dev, unsigned long pipe, void *buffer,
>        return ehci_submit_async(dev, pipe, buffer, length, NULL);
>  }
>
> -#ifdef CONFIG_SYS_USB_EVENT_POLL
> -/*
> - * This function polls for USB keyboard data.
> - */
> -void usb_event_poll()
> -{
> -       struct stdio_dev *dev;
> -       struct usb_device *usb_kbd_dev;
> -       struct usb_interface *iface;
> -       struct usb_endpoint_descriptor *ep;
> -       int pipe;
> -       int maxp;
> -
> -       /* Get the pointer to USB Keyboard device pointer */
> -       dev = stdio_get_by_name("usbkbd");
> -       usb_kbd_dev = (struct usb_device *)dev->priv;
> -       iface = &usb_kbd_dev->config.if_desc[0];
> -       ep = &iface->ep_desc[0];
> -       pipe = usb_rcvintpipe(usb_kbd_dev, ep->bEndpointAddress);
> -
> -       /* Submit a interrupt transfer request */
> -       maxp = usb_maxpacket(usb_kbd_dev, pipe);
> -       usb_submit_int_msg(usb_kbd_dev, pipe, &new[0],
> -                       maxp > 8 ? 8 : maxp, ep->bInterval);
> -}
> -#endif /* CONFIG_SYS_USB_EVENT_POLL */

The usb_event_poll() is implemented in more drivers. This is not only
limited to the EHCI driver.
Please update the other drivers as well.

drivers/usb/musb/musb_hcd.c:1274:void usb_event_poll()
drivers/usb/host/r8a66597-hcd.c:911:void usb_event_poll(void)
drivers/usb/host/ohci-hcd.c:1775:void usb_event_poll(void)
include/usb.h:152:void usb_event_poll(void);

Kind regards,

Remy

Patch

diff --git a/common/usb_kbd.c b/common/usb_kbd.c
index 75107c9..e94bb7e 100644
--- a/common/usb_kbd.c
+++ b/common/usb_kbd.c
@@ -313,7 +313,23 @@  static int usb_kbd_irq(struct usb_device *dev)
 static inline void usb_kbd_poll_for_event(struct usb_device *dev)
 {
 #if	defined(CONFIG_SYS_USB_EVENT_POLL)
-	usb_event_poll();
+	struct usb_interface *iface;
+	struct usb_endpoint_descriptor *ep;
+	struct usb_kbd_pdata *data;
+	int pipe;
+	int maxp;
+
+	/* Get the pointer to USB Keyboard device pointer */
+	data = dev->privptr;
+	iface = &dev->config.if_desc[0];
+	ep = &iface->ep_desc[0];
+	pipe = usb_rcvintpipe(dev, ep->bEndpointAddress);
+
+	/* Submit a interrupt transfer request */
+	maxp = usb_maxpacket(dev, pipe);
+	usb_submit_int_msg(dev, pipe, &data->new[0],
+			maxp > 8 ? 8 : maxp, ep->bInterval);
+
 	usb_kbd_irq_worker(dev);
 #elif	defined(CONFIG_SYS_USB_EVENT_POLL_VIA_CONTROL_EP)
 	struct usb_interface *iface;
diff --git a/drivers/usb/host/ehci-hcd.c b/drivers/usb/host/ehci-hcd.c
index db10316..94a5eed 100644
--- a/drivers/usb/host/ehci-hcd.c
+++ b/drivers/usb/host/ehci-hcd.c
@@ -26,10 +26,6 @@ 
 #include <asm/io.h>
 #include <malloc.h>
 #include <watchdog.h>
-#ifdef CONFIG_USB_KEYBOARD
-#include <stdio_dev.h>
-extern unsigned char new[];
-#endif
 
 #include "ehci.h"
 
@@ -946,29 +942,3 @@  submit_int_msg(struct usb_device *dev, unsigned long pipe, void *buffer,
 	return ehci_submit_async(dev, pipe, buffer, length, NULL);
 }
 
-#ifdef CONFIG_SYS_USB_EVENT_POLL
-/*
- * This function polls for USB keyboard data.
- */
-void usb_event_poll()
-{
-	struct stdio_dev *dev;
-	struct usb_device *usb_kbd_dev;
-	struct usb_interface *iface;
-	struct usb_endpoint_descriptor *ep;
-	int pipe;
-	int maxp;
-
-	/* Get the pointer to USB Keyboard device pointer */
-	dev = stdio_get_by_name("usbkbd");
-	usb_kbd_dev = (struct usb_device *)dev->priv;
-	iface = &usb_kbd_dev->config.if_desc[0];
-	ep = &iface->ep_desc[0];
-	pipe = usb_rcvintpipe(usb_kbd_dev, ep->bEndpointAddress);
-
-	/* Submit a interrupt transfer request */
-	maxp = usb_maxpacket(usb_kbd_dev, pipe);
-	usb_submit_int_msg(usb_kbd_dev, pipe, &new[0],
-			maxp > 8 ? 8 : maxp, ep->bInterval);
-}
-#endif /* CONFIG_SYS_USB_EVENT_POLL */