From cec9117d1394c509b34532d0eb1a923a131f6df0 Mon Sep 17 00:00:00 2001 From: Ahmad Fatoum Date: Fri, 29 Jan 2021 17:11:15 +0100 Subject: usb: add fallback ->detect method for USB host drivers We already maintain a list of USB host controllers, so we can use that to implement a generic detect callback. Currently, all drivers define their own, which uses driver-specific means to arrive at the struct usb_host and then call usb_host_detect(). Signed-off-by: Ahmad Fatoum Signed-off-by: Sascha Hauer --- drivers/usb/core/usb.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) (limited to 'drivers') diff --git a/drivers/usb/core/usb.c b/drivers/usb/core/usb.c index ea244d4bcf..938a28e030 100644 --- a/drivers/usb/core/usb.c +++ b/drivers/usb/core/usb.c @@ -88,11 +88,25 @@ static inline void usb_host_release(struct usb_host *host) slice_release(&host->slice); } +static int usb_hw_detect(struct device_d *dev) +{ + struct usb_host *host; + + list_for_each_entry(host, &host_list, list) { + if (dev == host->hw_dev) + return usb_host_detect(host); + } + + return -ENODEV; +} + int usb_register_host(struct usb_host *host) { list_add_tail(&host->list, &host_list); host->busnum = host_busnum++; slice_init(&host->slice, dev_name(host->hw_dev)); + if (!host->hw_dev->detect) + host->hw_dev->detect = usb_hw_detect; return 0; } -- cgit v1.2.3 From 70ec84e1470efeea4ab100513e1241b44aa8c2ff Mon Sep 17 00:00:00 2001 From: Ahmad Fatoum Date: Fri, 29 Jan 2021 17:11:16 +0100 Subject: usb: host: ehci: remove duplicated usb_host_detect() calls With the last patch adding a fallback detect, we no longer need the duplication in the host controller drivers. Drop them. Signed-off-by: Ahmad Fatoum Signed-off-by: Sascha Hauer --- drivers/usb/dwc2/host.c | 9 --------- drivers/usb/host/ehci-atmel.c | 8 -------- drivers/usb/host/ehci-hcd.c | 13 ------------- drivers/usb/host/xhci.c | 8 -------- drivers/usb/imx/chipidea-imx.c | 9 --------- drivers/usb/musb/musb_barebox.c | 9 --------- include/usb/ehci.h | 6 ------ 7 files changed, 62 deletions(-) (limited to 'drivers') diff --git a/drivers/usb/dwc2/host.c b/drivers/usb/dwc2/host.c index 510a07dfb9..7a070d91f3 100644 --- a/drivers/usb/dwc2/host.c +++ b/drivers/usb/dwc2/host.c @@ -766,13 +766,6 @@ static int dwc2_host_init(struct usb_host *host) return 0; } -static int dwc2_detect(struct device_d *dev) -{ - struct dwc2 *dwc2 = dev->priv; - - return usb_host_detect(&dwc2->host); -} - int dwc2_register_host(struct dwc2 *dwc2) { struct usb_host *host; @@ -784,8 +777,6 @@ int dwc2_register_host(struct dwc2 *dwc2) host->submit_control_msg = dwc2_submit_control_msg; host->submit_int_msg = dwc2_submit_int_msg; - dwc2->dev->detect = dwc2_detect; - return usb_register_host(host); } diff --git a/drivers/usb/host/ehci-atmel.c b/drivers/usb/host/ehci-atmel.c index 192c5ef9d1..c3f8ab7ad5 100644 --- a/drivers/usb/host/ehci-atmel.c +++ b/drivers/usb/host/ehci-atmel.c @@ -57,13 +57,6 @@ static void atmel_stop_clock(struct atmel_ehci_priv *atehci) clk_disable(atehci->uclk); } -static int atmel_ehci_detect(struct device_d *dev) -{ - struct atmel_ehci_priv *atehci = dev->priv; - - return ehci_detect(atehci->ehci); -} - static int atmel_ehci_probe(struct device_d *dev) { int ret; @@ -78,7 +71,6 @@ static int atmel_ehci_probe(struct device_d *dev) atehci = xzalloc(sizeof(*atehci)); atehci->dev = dev; dev->priv = atehci; - dev->detect = atmel_ehci_detect; atehci->iclk = clk_get(dev, "ehci_clk"); if (IS_ERR(atehci->iclk)) { diff --git a/drivers/usb/host/ehci-hcd.c b/drivers/usb/host/ehci-hcd.c index 287849102d..8c4da9fd12 100644 --- a/drivers/usb/host/ehci-hcd.c +++ b/drivers/usb/host/ehci-hcd.c @@ -1349,11 +1349,6 @@ submit_int_msg(struct usb_device *dev, unsigned long pipe, void *buffer, return result; } -int ehci_detect(struct ehci_host *ehci) -{ - return usb_host_detect(&ehci->host); -} - struct ehci_host *ehci_register(struct device_d *dev, struct ehci_data *data) { struct usb_host *host; @@ -1411,13 +1406,6 @@ void ehci_unregister(struct ehci_host *ehci) free(ehci); } -static int ehci_dev_detect(struct device_d *dev) -{ - struct ehci_host *ehci = dev->priv; - - return ehci_detect(ehci); -} - static int ehci_probe(struct device_d *dev) { struct resource *iores; @@ -1457,7 +1445,6 @@ static int ehci_probe(struct device_d *dev) return PTR_ERR(ehci); dev->priv = ehci; - dev->detect = ehci_dev_detect; return 0; } diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c index 317000d650..caab2400d8 100644 --- a/drivers/usb/host/xhci.c +++ b/drivers/usb/host/xhci.c @@ -1389,13 +1389,6 @@ int xhci_deregister(struct xhci_ctrl *ctrl) return 0; } -static int xhci_detect(struct device_d *dev) -{ - struct xhci_ctrl *ctrl = dev->priv; - - return usb_host_detect(&ctrl->host); -} - /* * xHCI platform driver */ @@ -1417,7 +1410,6 @@ static int xhci_probe(struct device_d *dev) HC_LENGTH(xhci_readl(&(ctrl->hccr)->cr_capbase))); dev->priv = ctrl; - dev->detect = xhci_detect; return xhci_register(ctrl); } diff --git a/drivers/usb/imx/chipidea-imx.c b/drivers/usb/imx/chipidea-imx.c index b144f41437..7b87f302a9 100644 --- a/drivers/usb/imx/chipidea-imx.c +++ b/drivers/usb/imx/chipidea-imx.c @@ -178,13 +178,6 @@ static int imx_chipidea_probe_dt(struct imx_chipidea *ci) return 0; } -static int ci_ehci_detect(struct device_d *dev) -{ - struct imx_chipidea *ci = dev->priv; - - return ehci_detect(ci->ehci); -} - static int ci_set_mode(void *ctx, enum usb_dr_mode mode) { struct imx_chipidea *ci = ctx; @@ -205,8 +198,6 @@ static int ci_set_mode(void *ctx, enum usb_dr_mode mode) } ci->ehci = ehci; - - ci->dev->detect = ci_ehci_detect; } else { dev_err(ci->dev, "Host support not available\n"); return -ENODEV; diff --git a/drivers/usb/musb/musb_barebox.c b/drivers/usb/musb/musb_barebox.c index b1f38c35ac..f54ad5e6e4 100644 --- a/drivers/usb/musb/musb_barebox.c +++ b/drivers/usb/musb/musb_barebox.c @@ -121,13 +121,6 @@ submit_int_msg(struct usb_device *dev, unsigned long pipe, void *buffer, return submit_urb(dev, urb, 100); } -static int musb_detect(struct device_d *dev) -{ - struct musb *musb = dev->priv; - - return usb_host_detect(&musb->host); -} - int musb_register(struct musb *musb) { struct usb_host *host; @@ -139,8 +132,6 @@ int musb_register(struct musb *musb) host->submit_control_msg = submit_control_msg; host->submit_bulk_msg = submit_bulk_msg; - musb->controller->priv = musb; - musb->controller->detect = musb_detect; usb_register_host(host); return 0; diff --git a/include/usb/ehci.h b/include/usb/ehci.h index 9ca9252eb1..327500d49a 100644 --- a/include/usb/ehci.h +++ b/include/usb/ehci.h @@ -24,7 +24,6 @@ struct ehci_host; #ifdef CONFIG_USB_EHCI struct ehci_host *ehci_register(struct device_d *dev, struct ehci_data *data); void ehci_unregister(struct ehci_host *); -int ehci_detect(struct ehci_host *ehci); #else static inline struct ehci_host *ehci_register(struct device_d *dev, struct ehci_data *data) @@ -35,11 +34,6 @@ static inline struct ehci_host *ehci_register(struct device_d *dev, static inline void ehci_unregister(struct ehci_host *ehci) { } - -static inline int ehci_detect(struct ehci_host *ehci) -{ - return 0; -} #endif #endif /* __USB_EHCI_H */ -- cgit v1.2.3 From eb2ad9a793c7d00988e399b9b7a1ebb2a0d85b3f Mon Sep 17 00:00:00 2001 From: Michael Grzeschik Date: Tue, 2 Feb 2021 19:54:12 +0100 Subject: usb: imx: fix overcurrent polarity handling on i.MX7 The reference manual says the overcurrent polarity is changed to low with the bit set. We fix that according to the description. Signed-off-by: Michael Grzeschik Signed-off-by: Sascha Hauer --- drivers/usb/imx/imx-usb-misc.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'drivers') diff --git a/drivers/usb/imx/imx-usb-misc.c b/drivers/usb/imx/imx-usb-misc.c index b663d073aa..660ebecd78 100644 --- a/drivers/usb/imx/imx-usb-misc.c +++ b/drivers/usb/imx/imx-usb-misc.c @@ -353,7 +353,7 @@ static __maybe_unused struct imx_usb_misc_data mx5_data = { #define MX6_USB_CTRL(n) ((n) * 4) #define MX6_USB_CTRL_OVER_CUR_DIS (1 << 7) -#define MX6_USB_CTRL_OVER_CUR_ACT_HIGH (1 << 8) +#define MX6_USB_CTRL_OVER_CUR_ACT_LOW (1 << 8) #define MX6_USB_CTRL_PWR_POLARITY (1 << 9) static void mx6_hsic_pullup(unsigned long reg, int on) @@ -453,9 +453,9 @@ static int usbmisc_imx7d_init(void __iomem *base, int port, } else { reg &= ~MX6_USB_CTRL_OVER_CUR_DIS; if (flags & MXC_EHCI_OC_PIN_ACTIVE_LOW) - reg &= ~MX6_USB_CTRL_OVER_CUR_ACT_HIGH; + reg |= MX6_USB_CTRL_OVER_CUR_ACT_LOW; else - reg |= MX6_USB_CTRL_OVER_CUR_ACT_HIGH; + reg &= ~MX6_USB_CTRL_OVER_CUR_ACT_LOW; } if (flags & MXC_EHCI_PWR_PIN_ACTIVE_HIGH) reg |= MX6_USB_CTRL_PWR_POLARITY; -- cgit v1.2.3 From 9ccf645bfaee366acd8dbd6b270717dae94f5347 Mon Sep 17 00:00:00 2001 From: Michael Grzeschik Date: Tue, 2 Feb 2021 19:54:13 +0100 Subject: usb: imx: add overcurrent polarity handling on i.MX6 Signed-off-by: Michael Grzeschik Signed-off-by: Sascha Hauer --- drivers/usb/imx/imx-usb-misc.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) (limited to 'drivers') diff --git a/drivers/usb/imx/imx-usb-misc.c b/drivers/usb/imx/imx-usb-misc.c index 660ebecd78..c16b4cf0ab 100644 --- a/drivers/usb/imx/imx-usb-misc.c +++ b/drivers/usb/imx/imx-usb-misc.c @@ -379,8 +379,15 @@ static __maybe_unused int mx6_initialize_usb_hw(void __iomem *base, int port, case 0: case 1: val = readl(base + MX6_USB_CTRL(port)); - if (flags & MXC_EHCI_DISABLE_OVERCURRENT) + if (flags & MXC_EHCI_DISABLE_OVERCURRENT) { val |= MX6_USB_CTRL_OVER_CUR_DIS; + } else { + val &= ~MX6_USB_CTRL_OVER_CUR_DIS; + if (flags & MXC_EHCI_OC_PIN_ACTIVE_LOW) + val |= MX6_USB_CTRL_OVER_CUR_ACT_LOW; + else + val &= ~MX6_USB_CTRL_OVER_CUR_ACT_LOW; + } if (flags & MXC_EHCI_PWR_PIN_ACTIVE_HIGH) val |= MX6_USB_CTRL_PWR_POLARITY; writel(val, base + MX6_USB_CTRL(port)); -- cgit v1.2.3