Re: [PATCH v2 5/8] usb: ohci-da8xx: add vbus and overcurrent gpios

2019-02-12 Thread Sekhar Nori
On 11/02/19 4:06 PM, Bartosz Golaszewski wrote:
> From: Bartosz Golaszewski 
> 
> There are two users upstream which register external callbacks for
> switching the port power on/off and overcurrent protection. Both
> users only use two GPIOs for that. Instead of having that functionality
> in the board files, move the logic into the OHCI driver - including
> the interrupt handler for overcurrent detection.
> 
> Signed-off-by: Bartosz Golaszewski 
> Acked-by: Alan Stern 
> ---
>  drivers/usb/host/ohci-da8xx.c | 99 ++-
>  1 file changed, 50 insertions(+), 49 deletions(-)
> 
> diff --git a/drivers/usb/host/ohci-da8xx.c b/drivers/usb/host/ohci-da8xx.c
> index e8ede0b5e3f0..80c23307fbfe 100644
> --- a/drivers/usb/host/ohci-da8xx.c
> +++ b/drivers/usb/host/ohci-da8xx.c
> @@ -12,6 +12,7 @@
>  #include 
>  #include 
>  #include 
> +#include 
>  #include 
>  #include 
>  #include 

Added the new include in alphabetical order. With that minor fix, series
is applied to my v5.1/soc branch.

Thanks,
Sekhar


[PATCH v2 5/8] usb: ohci-da8xx: add vbus and overcurrent gpios

2019-02-11 Thread Bartosz Golaszewski
From: Bartosz Golaszewski 

There are two users upstream which register external callbacks for
switching the port power on/off and overcurrent protection. Both
users only use two GPIOs for that. Instead of having that functionality
in the board files, move the logic into the OHCI driver - including
the interrupt handler for overcurrent detection.

Signed-off-by: Bartosz Golaszewski 
Acked-by: Alan Stern 
---
 drivers/usb/host/ohci-da8xx.c | 99 ++-
 1 file changed, 50 insertions(+), 49 deletions(-)

diff --git a/drivers/usb/host/ohci-da8xx.c b/drivers/usb/host/ohci-da8xx.c
index e8ede0b5e3f0..80c23307fbfe 100644
--- a/drivers/usb/host/ohci-da8xx.c
+++ b/drivers/usb/host/ohci-da8xx.c
@@ -12,6 +12,7 @@
 #include 
 #include 
 #include 
+#include 
 #include 
 #include 
 #include 
@@ -40,6 +41,8 @@ struct da8xx_ohci_hcd {
struct regulator *vbus_reg;
struct notifier_block nb;
unsigned int reg_enabled;
+   struct gpio_desc *vbus_gpio;
+   struct gpio_desc *oc_gpio;
 };
 
 #define to_da8xx_ohci(hcd) (struct da8xx_ohci_hcd *)(hcd_to_ohci(hcd)->priv)
@@ -86,12 +89,13 @@ static void ohci_da8xx_disable(struct usb_hcd *hcd)
 static int ohci_da8xx_set_power(struct usb_hcd *hcd, int on)
 {
struct da8xx_ohci_hcd *da8xx_ohci = to_da8xx_ohci(hcd);
-   struct device *dev  = hcd->self.controller;
-   struct da8xx_ohci_root_hub *hub = dev_get_platdata(dev);
+   struct device *dev = hcd->self.controller;
int ret;
 
-   if (hub && hub->set_power)
-   return hub->set_power(1, on);
+   if (da8xx_ohci->vbus_gpio) {
+   gpiod_set_value_cansleep(da8xx_ohci->vbus_gpio, on);
+   return 0;
+   }
 
if (!da8xx_ohci->vbus_reg)
return 0;
@@ -119,11 +123,9 @@ static int ohci_da8xx_set_power(struct usb_hcd *hcd, int 
on)
 static int ohci_da8xx_get_power(struct usb_hcd *hcd)
 {
struct da8xx_ohci_hcd *da8xx_ohci = to_da8xx_ohci(hcd);
-   struct device *dev  = hcd->self.controller;
-   struct da8xx_ohci_root_hub *hub = dev_get_platdata(dev);
 
-   if (hub && hub->get_power)
-   return hub->get_power(1);
+   if (da8xx_ohci->vbus_gpio)
+   return gpiod_get_value_cansleep(da8xx_ohci->vbus_gpio);
 
if (da8xx_ohci->vbus_reg)
return regulator_is_enabled(da8xx_ohci->vbus_reg);
@@ -134,13 +136,11 @@ static int ohci_da8xx_get_power(struct usb_hcd *hcd)
 static int ohci_da8xx_get_oci(struct usb_hcd *hcd)
 {
struct da8xx_ohci_hcd *da8xx_ohci = to_da8xx_ohci(hcd);
-   struct device *dev  = hcd->self.controller;
-   struct da8xx_ohci_root_hub *hub = dev_get_platdata(dev);
unsigned int flags;
int ret;
 
-   if (hub && hub->get_oci)
-   return hub->get_oci(1);
+   if (da8xx_ohci->oc_gpio)
+   return gpiod_get_value_cansleep(da8xx_ohci->oc_gpio);
 
if (!da8xx_ohci->vbus_reg)
return 0;
@@ -158,10 +158,8 @@ static int ohci_da8xx_get_oci(struct usb_hcd *hcd)
 static int ohci_da8xx_has_set_power(struct usb_hcd *hcd)
 {
struct da8xx_ohci_hcd *da8xx_ohci = to_da8xx_ohci(hcd);
-   struct device *dev  = hcd->self.controller;
-   struct da8xx_ohci_root_hub *hub = dev_get_platdata(dev);
 
-   if (hub && hub->set_power)
+   if (da8xx_ohci->vbus_gpio)
return 1;
 
if (da8xx_ohci->vbus_reg)
@@ -173,10 +171,8 @@ static int ohci_da8xx_has_set_power(struct usb_hcd *hcd)
 static int ohci_da8xx_has_oci(struct usb_hcd *hcd)
 {
struct da8xx_ohci_hcd *da8xx_ohci = to_da8xx_ohci(hcd);
-   struct device *dev  = hcd->self.controller;
-   struct da8xx_ohci_root_hub *hub = dev_get_platdata(dev);
 
-   if (hub && hub->get_oci)
+   if (da8xx_ohci->oc_gpio)
return 1;
 
if (da8xx_ohci->vbus_reg)
@@ -196,19 +192,6 @@ static int ohci_da8xx_has_potpgt(struct usb_hcd *hcd)
return 0;
 }
 
-/*
- * Handle the port over-current indicator change.
- */
-static void ohci_da8xx_ocic_handler(struct da8xx_ohci_root_hub *hub,
-   unsigned port)
-{
-   ocic_mask |= 1 << port;
-
-   /* Once over-current is detected, the port needs to be powered down */
-   if (hub->get_oci(port) > 0)
-   hub->set_power(port, 0);
-}
-
 static int ohci_da8xx_regulator_event(struct notifier_block *nb,
unsigned long event, void *data)
 {
@@ -223,16 +206,23 @@ static int ohci_da8xx_regulator_event(struct 
notifier_block *nb,
return 0;
 }
 
+static irqreturn_t ohci_da8xx_oc_handler(int irq, void *data)
+{
+   struct da8xx_ohci_hcd *da8xx_ohci = data;
+
+   if (gpiod_get_value(da8xx_ohci->oc_gpio))
+   gpiod_set_value(da8xx_ohci->vbus_gpio, 0);
+
+   return IRQ_HANDLED;
+}
+
 static int ohci_da8xx_register_notify(struct usb_hcd *hcd)