* [PATCH 0/2] [PART 3/4] USB: ohci-da8xx: Remove platform callbacks @ 2016-11-08 18:57 ` Axel Haslam 0 siblings, 0 replies; 6+ messages in thread From: Axel Haslam @ 2016-11-08 18:57 UTC (permalink / raw) To: linux-arm-kernel There are no more users of the platform callbacks as all of them have been converted to use a regulator. We can now remove the plafrom callbacks from the driver and the platform data structure. DEPENDENCIES: 1. [PATCH 0/3] fix ohci phy name https://lkml.org/lkml/2016/11/2/208 2. [PATCH/RFC v2 0/3] regulator: handling of error conditions for usb drivers https://lkml.org/lkml/2016/11/3/188 3. [PATCH v4 0/3] [PART 1/4] USB: ohci-da8xx: Allow a regulator for VBUS and over current 4. [PATCH 0/3] [PART 2/4] ARM: davinci: OHCI: Use a regulator instead of callbacks A branch with all the dependencies can be found here: https://github.com/axelhaslamx/linux-axel/commits/ohci-da8xx-dt-v4 Axel Haslam (2): USB: ohci: da8xx: Remove ohci platform callbacks USB: ohci: da8xx: use a flag instead of mask for ocic drivers/usb/host/ohci-da8xx.c | 101 ++++-------------------------- include/linux/platform_data/usb-davinci.h | 20 ------ 2 files changed, 12 insertions(+), 109 deletions(-) -- 2.10.1 ^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH 0/2] [PART 3/4] USB: ohci-da8xx: Remove platform callbacks @ 2016-11-08 18:57 ` Axel Haslam 0 siblings, 0 replies; 6+ messages in thread From: Axel Haslam @ 2016-11-08 18:57 UTC (permalink / raw) To: gregkh, stern, nsekhar, khilman, david Cc: linux-usb, linux-kernel, linux-arm-kernel, Axel Haslam There are no more users of the platform callbacks as all of them have been converted to use a regulator. We can now remove the plafrom callbacks from the driver and the platform data structure. DEPENDENCIES: 1. [PATCH 0/3] fix ohci phy name https://lkml.org/lkml/2016/11/2/208 2. [PATCH/RFC v2 0/3] regulator: handling of error conditions for usb drivers https://lkml.org/lkml/2016/11/3/188 3. [PATCH v4 0/3] [PART 1/4] USB: ohci-da8xx: Allow a regulator for VBUS and over current 4. [PATCH 0/3] [PART 2/4] ARM: davinci: OHCI: Use a regulator instead of callbacks A branch with all the dependencies can be found here: https://github.com/axelhaslamx/linux-axel/commits/ohci-da8xx-dt-v4 Axel Haslam (2): USB: ohci: da8xx: Remove ohci platform callbacks USB: ohci: da8xx: use a flag instead of mask for ocic drivers/usb/host/ohci-da8xx.c | 101 ++++-------------------------- include/linux/platform_data/usb-davinci.h | 20 ------ 2 files changed, 12 insertions(+), 109 deletions(-) -- 2.10.1 ^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH 1/2] USB: ohci: da8xx: Remove ohci platform callbacks 2016-11-08 18:57 ` Axel Haslam @ 2016-11-08 18:57 ` Axel Haslam -1 siblings, 0 replies; 6+ messages in thread From: Axel Haslam @ 2016-11-08 18:57 UTC (permalink / raw) To: linux-arm-kernel Now that all ohci users are are using a regulator, we can remove the platform callbacks and data. potpgt is no longer necessary as a power on delay time can be specified for the regulator itself. Signed-off-by: Axel Haslam <ahaslam@baylibre.com> --- drivers/usb/host/ohci-da8xx.c | 84 ++----------------------------- include/linux/platform_data/usb-davinci.h | 20 -------- 2 files changed, 5 insertions(+), 99 deletions(-) diff --git a/drivers/usb/host/ohci-da8xx.c b/drivers/usb/host/ohci-da8xx.c index 0a4b885..3dcbf1f 100644 --- a/drivers/usb/host/ohci-da8xx.c +++ b/drivers/usb/host/ohci-da8xx.c @@ -89,12 +89,8 @@ 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); int ret; - if (hub && hub->set_power) - return hub->set_power(1, on); - if (!da8xx_ohci->vbus_reg) return 0; @@ -121,11 +117,6 @@ 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_reg) return regulator_is_enabled(da8xx_ohci->vbus_reg); @@ -137,13 +128,9 @@ 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->vbus_reg) return 0; @@ -159,29 +146,9 @@ static int ohci_da8xx_get_oci(struct usb_hcd *hcd) return 0; } -static int ohci_da8xx_has_set_power(struct usb_hcd *hcd) +static int ohci_da8xx_has_regulator(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) - return 1; - - if (da8xx_ohci->vbus_reg) - return 1; - - return 0; -} - -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) - return 1; if (da8xx_ohci->vbus_reg) return 1; @@ -189,30 +156,9 @@ static int ohci_da8xx_has_oci(struct usb_hcd *hcd) return 0; } -static int ohci_da8xx_has_potpgt(struct usb_hcd *hcd) -{ - struct device *dev = hcd->self.controller; - struct da8xx_ohci_root_hub *hub = dev_get_platdata(dev); - - if (hub && hub->potpgt) - return 1; - - 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) { @@ -233,12 +179,9 @@ static int ohci_da8xx_register_notify(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); int ret = 0; - if (hub && hub->ocic_notify) - ret = hub->ocic_notify(ohci_da8xx_ocic_handler); - else if (da8xx_ohci->vbus_reg) { + if (da8xx_ohci->vbus_reg) { da8xx_ohci->nb.notifier_call = ohci_da8xx_regulator_event; ret = devm_regulator_register_notifier(da8xx_ohci->vbus_reg, &da8xx_ohci->nb); @@ -250,19 +193,9 @@ static int ohci_da8xx_register_notify(struct usb_hcd *hcd) return ret; } -static void ohci_da8xx_unregister_notify(struct usb_hcd *hcd) -{ - struct device *dev = hcd->self.controller; - struct da8xx_ohci_root_hub *hub = dev_get_platdata(dev); - - if (hub && hub->ocic_notify) - hub->ocic_notify(NULL); -} - static int ohci_da8xx_reset(struct usb_hcd *hcd) { struct device *dev = hcd->self.controller; - struct da8xx_ohci_root_hub *hub = dev_get_platdata(dev); struct ohci_hcd *ohci = hcd_to_ohci(hcd); int result; u32 rh_a; @@ -291,20 +224,14 @@ static int ohci_da8xx_reset(struct usb_hcd *hcd) * register's default value, so that ohci_hub_control() could return * the correct hub descriptor... */ - rh_a = ohci_readl(ohci, &ohci->regs->roothub.a); - if (ohci_da8xx_has_set_power(hcd)) { + if (ohci_da8xx_has_regulator(hcd)) { + rh_a = ohci_readl(ohci, &ohci->regs->roothub.a); rh_a &= ~RH_A_NPS; rh_a |= RH_A_PSM; - } - if (ohci_da8xx_has_oci(hcd)) { rh_a &= ~RH_A_NOCP; rh_a |= RH_A_OCPM; + ohci_writel(ohci, rh_a, &ohci->regs->roothub.a); } - if (ohci_da8xx_has_potpgt(hcd)) { - rh_a &= ~RH_A_POTPGT; - rh_a |= hub->potpgt << 24; - } - ohci_writel(ohci, rh_a, &ohci->regs->roothub.a); return result; } @@ -479,7 +406,6 @@ static int ohci_da8xx_remove(struct platform_device *pdev) { struct usb_hcd *hcd = platform_get_drvdata(pdev); - ohci_da8xx_unregister_notify(hcd); usb_remove_hcd(hcd); usb_put_hcd(hcd); diff --git a/include/linux/platform_data/usb-davinci.h b/include/linux/platform_data/usb-davinci.h index 0926e99..58f4be0 100644 --- a/include/linux/platform_data/usb-davinci.h +++ b/include/linux/platform_data/usb-davinci.h @@ -11,26 +11,6 @@ #ifndef __ASM_ARCH_USB_H #define __ASM_ARCH_USB_H -struct da8xx_ohci_root_hub; - -typedef void (*da8xx_ocic_handler_t)(struct da8xx_ohci_root_hub *hub, - unsigned port); - -/* Passed as the platform data to the OHCI driver */ -struct da8xx_ohci_root_hub { - /* Switch the port power on/off */ - int (*set_power)(unsigned port, int on); - /* Read the port power status */ - int (*get_power)(unsigned port); - /* Read the port over-current indicator */ - int (*get_oci)(unsigned port); - /* Over-current indicator change notification (pass NULL to disable) */ - int (*ocic_notify)(da8xx_ocic_handler_t handler); - - /* Time from power on to power good (in 2 ms units) */ - u8 potpgt; -}; - void davinci_setup_usb(unsigned mA, unsigned potpgt_ms); #endif /* ifndef __ASM_ARCH_USB_H */ -- 2.10.1 ^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH 1/2] USB: ohci: da8xx: Remove ohci platform callbacks @ 2016-11-08 18:57 ` Axel Haslam 0 siblings, 0 replies; 6+ messages in thread From: Axel Haslam @ 2016-11-08 18:57 UTC (permalink / raw) To: gregkh, stern, nsekhar, khilman, david Cc: linux-usb, linux-kernel, linux-arm-kernel, Axel Haslam Now that all ohci users are are using a regulator, we can remove the platform callbacks and data. potpgt is no longer necessary as a power on delay time can be specified for the regulator itself. Signed-off-by: Axel Haslam <ahaslam@baylibre.com> --- drivers/usb/host/ohci-da8xx.c | 84 ++----------------------------- include/linux/platform_data/usb-davinci.h | 20 -------- 2 files changed, 5 insertions(+), 99 deletions(-) diff --git a/drivers/usb/host/ohci-da8xx.c b/drivers/usb/host/ohci-da8xx.c index 0a4b885..3dcbf1f 100644 --- a/drivers/usb/host/ohci-da8xx.c +++ b/drivers/usb/host/ohci-da8xx.c @@ -89,12 +89,8 @@ 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); int ret; - if (hub && hub->set_power) - return hub->set_power(1, on); - if (!da8xx_ohci->vbus_reg) return 0; @@ -121,11 +117,6 @@ 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_reg) return regulator_is_enabled(da8xx_ohci->vbus_reg); @@ -137,13 +128,9 @@ 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->vbus_reg) return 0; @@ -159,29 +146,9 @@ static int ohci_da8xx_get_oci(struct usb_hcd *hcd) return 0; } -static int ohci_da8xx_has_set_power(struct usb_hcd *hcd) +static int ohci_da8xx_has_regulator(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) - return 1; - - if (da8xx_ohci->vbus_reg) - return 1; - - return 0; -} - -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) - return 1; if (da8xx_ohci->vbus_reg) return 1; @@ -189,30 +156,9 @@ static int ohci_da8xx_has_oci(struct usb_hcd *hcd) return 0; } -static int ohci_da8xx_has_potpgt(struct usb_hcd *hcd) -{ - struct device *dev = hcd->self.controller; - struct da8xx_ohci_root_hub *hub = dev_get_platdata(dev); - - if (hub && hub->potpgt) - return 1; - - 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) { @@ -233,12 +179,9 @@ static int ohci_da8xx_register_notify(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); int ret = 0; - if (hub && hub->ocic_notify) - ret = hub->ocic_notify(ohci_da8xx_ocic_handler); - else if (da8xx_ohci->vbus_reg) { + if (da8xx_ohci->vbus_reg) { da8xx_ohci->nb.notifier_call = ohci_da8xx_regulator_event; ret = devm_regulator_register_notifier(da8xx_ohci->vbus_reg, &da8xx_ohci->nb); @@ -250,19 +193,9 @@ static int ohci_da8xx_register_notify(struct usb_hcd *hcd) return ret; } -static void ohci_da8xx_unregister_notify(struct usb_hcd *hcd) -{ - struct device *dev = hcd->self.controller; - struct da8xx_ohci_root_hub *hub = dev_get_platdata(dev); - - if (hub && hub->ocic_notify) - hub->ocic_notify(NULL); -} - static int ohci_da8xx_reset(struct usb_hcd *hcd) { struct device *dev = hcd->self.controller; - struct da8xx_ohci_root_hub *hub = dev_get_platdata(dev); struct ohci_hcd *ohci = hcd_to_ohci(hcd); int result; u32 rh_a; @@ -291,20 +224,14 @@ static int ohci_da8xx_reset(struct usb_hcd *hcd) * register's default value, so that ohci_hub_control() could return * the correct hub descriptor... */ - rh_a = ohci_readl(ohci, &ohci->regs->roothub.a); - if (ohci_da8xx_has_set_power(hcd)) { + if (ohci_da8xx_has_regulator(hcd)) { + rh_a = ohci_readl(ohci, &ohci->regs->roothub.a); rh_a &= ~RH_A_NPS; rh_a |= RH_A_PSM; - } - if (ohci_da8xx_has_oci(hcd)) { rh_a &= ~RH_A_NOCP; rh_a |= RH_A_OCPM; + ohci_writel(ohci, rh_a, &ohci->regs->roothub.a); } - if (ohci_da8xx_has_potpgt(hcd)) { - rh_a &= ~RH_A_POTPGT; - rh_a |= hub->potpgt << 24; - } - ohci_writel(ohci, rh_a, &ohci->regs->roothub.a); return result; } @@ -479,7 +406,6 @@ static int ohci_da8xx_remove(struct platform_device *pdev) { struct usb_hcd *hcd = platform_get_drvdata(pdev); - ohci_da8xx_unregister_notify(hcd); usb_remove_hcd(hcd); usb_put_hcd(hcd); diff --git a/include/linux/platform_data/usb-davinci.h b/include/linux/platform_data/usb-davinci.h index 0926e99..58f4be0 100644 --- a/include/linux/platform_data/usb-davinci.h +++ b/include/linux/platform_data/usb-davinci.h @@ -11,26 +11,6 @@ #ifndef __ASM_ARCH_USB_H #define __ASM_ARCH_USB_H -struct da8xx_ohci_root_hub; - -typedef void (*da8xx_ocic_handler_t)(struct da8xx_ohci_root_hub *hub, - unsigned port); - -/* Passed as the platform data to the OHCI driver */ -struct da8xx_ohci_root_hub { - /* Switch the port power on/off */ - int (*set_power)(unsigned port, int on); - /* Read the port power status */ - int (*get_power)(unsigned port); - /* Read the port over-current indicator */ - int (*get_oci)(unsigned port); - /* Over-current indicator change notification (pass NULL to disable) */ - int (*ocic_notify)(da8xx_ocic_handler_t handler); - - /* Time from power on to power good (in 2 ms units) */ - u8 potpgt; -}; - void davinci_setup_usb(unsigned mA, unsigned potpgt_ms); #endif /* ifndef __ASM_ARCH_USB_H */ -- 2.10.1 ^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH 2/2] USB: ohci: da8xx: use a flag instead of mask for ocic 2016-11-08 18:57 ` Axel Haslam @ 2016-11-08 18:57 ` Axel Haslam -1 siblings, 0 replies; 6+ messages in thread From: Axel Haslam @ 2016-11-08 18:57 UTC (permalink / raw) To: linux-arm-kernel Now that the platform callback is removed, we can move the over current indictor changed flag to the private data structure. Since the driver only handles a single port, there is no need for ocic to be a mask, we can use a simple flag instead. Signed-off-by: Axel Haslam <ahaslam@baylibre.com> --- drivers/usb/host/ohci-da8xx.c | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/drivers/usb/host/ohci-da8xx.c b/drivers/usb/host/ohci-da8xx.c index 3dcbf1f..83b182e 100644 --- a/drivers/usb/host/ohci-da8xx.c +++ b/drivers/usb/host/ohci-da8xx.c @@ -43,12 +43,10 @@ struct da8xx_ohci_hcd { struct regulator *vbus_reg; struct notifier_block nb; unsigned int is_powered; + unsigned int oc_changed; }; #define to_da8xx_ohci(hcd) (struct da8xx_ohci_hcd *)(hcd_to_ohci(hcd)->priv) -/* Over-current indicator change bitmask */ -static volatile u16 ocic_mask; - static int ohci_da8xx_enable(struct usb_hcd *hcd) { struct da8xx_ohci_hcd *da8xx_ohci = to_da8xx_ohci(hcd); @@ -168,7 +166,7 @@ static int ohci_da8xx_regulator_event(struct notifier_block *nb, if (event & REGULATOR_EVENT_OVER_CURRENT) { dev_warn(dev, "over current event\n"); - ocic_mask |= 1; + da8xx_ohci->oc_changed = 1; ohci_da8xx_set_power(da8xx_ohci->hcd, 0); } @@ -241,10 +239,11 @@ static int ohci_da8xx_reset(struct usb_hcd *hcd) */ static int ohci_da8xx_hub_status_data(struct usb_hcd *hcd, char *buf) { + struct da8xx_ohci_hcd *da8xx_ohci = to_da8xx_ohci(hcd); int length = orig_ohci_hub_status_data(hcd, buf); /* See if we have OCIC bit set on port 1 */ - if (ocic_mask & (1 << 1)) { + if (da8xx_ohci->oc_changed) { dev_dbg(hcd->self.controller, "over-current indicator change " "on port 1\n"); @@ -262,6 +261,7 @@ static int ohci_da8xx_hub_status_data(struct usb_hcd *hcd, char *buf) static int ohci_da8xx_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, u16 wIndex, char *buf, u16 wLength) { + struct da8xx_ohci_hcd *da8xx_ohci = to_da8xx_ohci(hcd); struct device *dev = hcd->self.controller; int temp; @@ -284,7 +284,7 @@ static int ohci_da8xx_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, temp |= RH_PS_POCI; /* The over-current indicator change (OCIC) bit is 0 too */ - if (ocic_mask & (1 << wIndex)) + if (da8xx_ohci->oc_changed) temp |= RH_PS_OCIC; put_unaligned(cpu_to_le32(temp), (__le32 *)buf); @@ -311,10 +311,7 @@ static int ohci_da8xx_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, temp ? "Set" : "Clear", wIndex, "C_OVER_CURRENT"); - if (temp) - ocic_mask |= 1 << wIndex; - else - ocic_mask &= ~(1 << wIndex); + da8xx_ohci->oc_changed = temp; return 0; } } -- 2.10.1 ^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH 2/2] USB: ohci: da8xx: use a flag instead of mask for ocic @ 2016-11-08 18:57 ` Axel Haslam 0 siblings, 0 replies; 6+ messages in thread From: Axel Haslam @ 2016-11-08 18:57 UTC (permalink / raw) To: gregkh, stern, nsekhar, khilman, david Cc: linux-usb, linux-kernel, linux-arm-kernel, Axel Haslam Now that the platform callback is removed, we can move the over current indictor changed flag to the private data structure. Since the driver only handles a single port, there is no need for ocic to be a mask, we can use a simple flag instead. Signed-off-by: Axel Haslam <ahaslam@baylibre.com> --- drivers/usb/host/ohci-da8xx.c | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/drivers/usb/host/ohci-da8xx.c b/drivers/usb/host/ohci-da8xx.c index 3dcbf1f..83b182e 100644 --- a/drivers/usb/host/ohci-da8xx.c +++ b/drivers/usb/host/ohci-da8xx.c @@ -43,12 +43,10 @@ struct da8xx_ohci_hcd { struct regulator *vbus_reg; struct notifier_block nb; unsigned int is_powered; + unsigned int oc_changed; }; #define to_da8xx_ohci(hcd) (struct da8xx_ohci_hcd *)(hcd_to_ohci(hcd)->priv) -/* Over-current indicator change bitmask */ -static volatile u16 ocic_mask; - static int ohci_da8xx_enable(struct usb_hcd *hcd) { struct da8xx_ohci_hcd *da8xx_ohci = to_da8xx_ohci(hcd); @@ -168,7 +166,7 @@ static int ohci_da8xx_regulator_event(struct notifier_block *nb, if (event & REGULATOR_EVENT_OVER_CURRENT) { dev_warn(dev, "over current event\n"); - ocic_mask |= 1; + da8xx_ohci->oc_changed = 1; ohci_da8xx_set_power(da8xx_ohci->hcd, 0); } @@ -241,10 +239,11 @@ static int ohci_da8xx_reset(struct usb_hcd *hcd) */ static int ohci_da8xx_hub_status_data(struct usb_hcd *hcd, char *buf) { + struct da8xx_ohci_hcd *da8xx_ohci = to_da8xx_ohci(hcd); int length = orig_ohci_hub_status_data(hcd, buf); /* See if we have OCIC bit set on port 1 */ - if (ocic_mask & (1 << 1)) { + if (da8xx_ohci->oc_changed) { dev_dbg(hcd->self.controller, "over-current indicator change " "on port 1\n"); @@ -262,6 +261,7 @@ static int ohci_da8xx_hub_status_data(struct usb_hcd *hcd, char *buf) static int ohci_da8xx_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, u16 wIndex, char *buf, u16 wLength) { + struct da8xx_ohci_hcd *da8xx_ohci = to_da8xx_ohci(hcd); struct device *dev = hcd->self.controller; int temp; @@ -284,7 +284,7 @@ static int ohci_da8xx_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, temp |= RH_PS_POCI; /* The over-current indicator change (OCIC) bit is 0 too */ - if (ocic_mask & (1 << wIndex)) + if (da8xx_ohci->oc_changed) temp |= RH_PS_OCIC; put_unaligned(cpu_to_le32(temp), (__le32 *)buf); @@ -311,10 +311,7 @@ static int ohci_da8xx_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, temp ? "Set" : "Clear", wIndex, "C_OVER_CURRENT"); - if (temp) - ocic_mask |= 1 << wIndex; - else - ocic_mask &= ~(1 << wIndex); + da8xx_ohci->oc_changed = temp; return 0; } } -- 2.10.1 ^ permalink raw reply related [flat|nested] 6+ messages in thread
end of thread, other threads:[~2016-11-08 19:02 UTC | newest] Thread overview: 6+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2016-11-08 18:57 [PATCH 0/2] [PART 3/4] USB: ohci-da8xx: Remove platform callbacks Axel Haslam 2016-11-08 18:57 ` Axel Haslam 2016-11-08 18:57 ` [PATCH 1/2] USB: ohci: da8xx: Remove ohci " Axel Haslam 2016-11-08 18:57 ` Axel Haslam 2016-11-08 18:57 ` [PATCH 2/2] USB: ohci: da8xx: use a flag instead of mask for ocic Axel Haslam 2016-11-08 18:57 ` Axel Haslam
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.