cb0c8da7c2
compat-wireless/backports now contains a bcm47xx_nvram.h file to backport some of the functions in it which are used by the bcmfmac driver. This file just checks for the kernel versions and provide an empty implementations on older kernel versions. This is OK on most systems, but on bcm47xx / bcm53xx systems we want to call the real functions here. This commit removes the file from backports in our build process like we do it with the bcma and ssb header files. Instead we add a recent version into our kernel so all code uses only one header file. On bcm47xx / bcm53xx the real implementations of this code will be used. Reported-by: Hante Meuleman <meuleman@broadcom.com> Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de> SVN-Revision: 47467
74 lines
2.3 KiB
Diff
74 lines
2.3 KiB
Diff
From 0cb136f9882e4649ad6160bb7b48955ff728888c Mon Sep 17 00:00:00 2001
|
|
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <zajec5@gmail.com>
|
|
Date: Sun, 1 Nov 2015 08:17:21 +0100
|
|
Subject: [PATCH V2] USB: bcma: switch to GPIO descriptor for power control
|
|
MIME-Version: 1.0
|
|
Content-Type: text/plain; charset=UTF-8
|
|
Content-Transfer-Encoding: 8bit
|
|
|
|
So far we were using simple (legacy) GPIO functions & some poor logic to
|
|
control power. It got many drawbacks: we were ignoring OF flags
|
|
(GPIO_ACTIVE_LOW), we were not setting direction to output and we were
|
|
assuming gpio_request success all the time.
|
|
Fix it by switching to gpiod functions and adding appropriate checks.
|
|
|
|
Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
|
|
---
|
|
drivers/usb/host/bcma-hcd.c | 21 ++++++++++-----------
|
|
1 file changed, 10 insertions(+), 11 deletions(-)
|
|
|
|
--- a/drivers/usb/host/bcma-hcd.c
|
|
+++ b/drivers/usb/host/bcma-hcd.c
|
|
@@ -21,6 +21,7 @@
|
|
*/
|
|
#include <linux/bcma/bcma.h>
|
|
#include <linux/delay.h>
|
|
+#include <linux/gpio/consumer.h>
|
|
#include <linux/platform_device.h>
|
|
#include <linux/module.h>
|
|
#include <linux/slab.h>
|
|
@@ -36,6 +37,7 @@ MODULE_LICENSE("GPL");
|
|
struct bcma_hcd_device {
|
|
struct platform_device *ehci_dev;
|
|
struct platform_device *ohci_dev;
|
|
+ struct gpio_desc *gpio_desc;
|
|
};
|
|
|
|
/* Wait for bitmask in a register to get set or cleared.
|
|
@@ -228,19 +230,12 @@ static void bcma_hcd_init_chip_arm(struc
|
|
|
|
static void bcma_hci_platform_power_gpio(struct bcma_device *dev, bool val)
|
|
{
|
|
- int gpio;
|
|
+ struct bcma_hcd_device *usb_dev = bcma_get_drvdata(dev);
|
|
|
|
- gpio = of_get_named_gpio(dev->dev.of_node, "vcc-gpio", 0);
|
|
- if (!gpio_is_valid(gpio))
|
|
+ if (IS_ERR_OR_NULL(usb_dev->gpio_desc))
|
|
return;
|
|
|
|
- if (val) {
|
|
- gpio_request(gpio, "bcma-hcd-gpio");
|
|
- gpio_set_value(gpio, 1);
|
|
- } else {
|
|
- gpio_set_value(gpio, 0);
|
|
- gpio_free(gpio);
|
|
- }
|
|
+ gpiod_set_value(usb_dev->gpio_desc, val);
|
|
}
|
|
|
|
static const struct usb_ehci_pdata ehci_pdata = {
|
|
@@ -314,7 +309,11 @@ static int bcma_hcd_probe(struct bcma_de
|
|
if (!usb_dev)
|
|
return -ENOMEM;
|
|
|
|
- bcma_hci_platform_power_gpio(dev, true);
|
|
+ if (dev->dev.of_node)
|
|
+ usb_dev->gpio_desc = devm_get_gpiod_from_child(&dev->dev, "vcc",
|
|
+ &dev->dev.of_node->fwnode);
|
|
+ if (!IS_ERR_OR_NULL(usb_dev->gpio_desc))
|
|
+ gpiod_direction_output(usb_dev->gpio_desc, 1);
|
|
|
|
switch (dev->id.id) {
|
|
case BCMA_CORE_NS_USB20:
|