forked from luck/tmp_suning_uos_patched
usb: phy: generic: migrate to gpio_desc
Change internal gpio handling from integer gpios into gpio descriptors. This change only addresses the internal API and device-tree/ACPI, while the legacy platform data remains integer space based. This change is only build compile tested, and very prone to error. I leave this comment for now in the commit message so that this patch gets some testing as I'm pretty sure it's buggy. Signed-off-by: Robert Jarzmik <robert.jarzmik@free.fr> Acked-by: Linus Walleij <linus.walleij@linaro.org> Signed-off-by: Felipe Balbi <balbi@ti.com>
This commit is contained in:
parent
e3a912a124
commit
e9f2cefb0c
@ -59,16 +59,8 @@ static int nop_set_suspend(struct usb_phy *x, int suspend)
|
|||||||
|
|
||||||
static void nop_reset_set(struct usb_phy_generic *nop, int asserted)
|
static void nop_reset_set(struct usb_phy_generic *nop, int asserted)
|
||||||
{
|
{
|
||||||
int value;
|
if (nop->gpiod_reset)
|
||||||
|
gpiod_set_value(nop->gpiod_reset, asserted);
|
||||||
if (!gpio_is_valid(nop->gpio_reset))
|
|
||||||
return;
|
|
||||||
|
|
||||||
value = asserted;
|
|
||||||
if (nop->reset_active_low)
|
|
||||||
value = !value;
|
|
||||||
|
|
||||||
gpio_set_value_cansleep(nop->gpio_reset, value);
|
|
||||||
|
|
||||||
if (!asserted)
|
if (!asserted)
|
||||||
usleep_range(10000, 20000);
|
usleep_range(10000, 20000);
|
||||||
@ -143,35 +135,38 @@ int usb_phy_gen_create_phy(struct device *dev, struct usb_phy_generic *nop,
|
|||||||
struct usb_phy_generic_platform_data *pdata)
|
struct usb_phy_generic_platform_data *pdata)
|
||||||
{
|
{
|
||||||
enum usb_phy_type type = USB_PHY_TYPE_USB2;
|
enum usb_phy_type type = USB_PHY_TYPE_USB2;
|
||||||
int err;
|
int err = 0;
|
||||||
|
|
||||||
u32 clk_rate = 0;
|
u32 clk_rate = 0;
|
||||||
bool needs_vcc = false;
|
bool needs_vcc = false;
|
||||||
|
|
||||||
nop->reset_active_low = true; /* default behaviour */
|
|
||||||
|
|
||||||
if (dev->of_node) {
|
if (dev->of_node) {
|
||||||
struct device_node *node = dev->of_node;
|
struct device_node *node = dev->of_node;
|
||||||
enum of_gpio_flags flags = 0;
|
|
||||||
|
|
||||||
if (of_property_read_u32(node, "clock-frequency", &clk_rate))
|
if (of_property_read_u32(node, "clock-frequency", &clk_rate))
|
||||||
clk_rate = 0;
|
clk_rate = 0;
|
||||||
|
|
||||||
needs_vcc = of_property_read_bool(node, "vcc-supply");
|
needs_vcc = of_property_read_bool(node, "vcc-supply");
|
||||||
nop->gpio_reset = of_get_named_gpio_flags(node, "reset-gpios",
|
nop->gpiod_reset = devm_gpiod_get(dev, "reset-gpios");
|
||||||
0, &flags);
|
err = PTR_ERR(nop->gpiod_reset);
|
||||||
if (nop->gpio_reset == -EPROBE_DEFER)
|
|
||||||
return -EPROBE_DEFER;
|
|
||||||
|
|
||||||
nop->reset_active_low = flags & OF_GPIO_ACTIVE_LOW;
|
|
||||||
|
|
||||||
} else if (pdata) {
|
} else if (pdata) {
|
||||||
type = pdata->type;
|
type = pdata->type;
|
||||||
clk_rate = pdata->clk_rate;
|
clk_rate = pdata->clk_rate;
|
||||||
needs_vcc = pdata->needs_vcc;
|
needs_vcc = pdata->needs_vcc;
|
||||||
nop->gpio_reset = pdata->gpio_reset;
|
if (gpio_is_valid(gpio->gpio_reset)) {
|
||||||
} else {
|
err = devm_gpio_request_one(dev, pdata->gpio_reset, 0,
|
||||||
nop->gpio_reset = -1;
|
dev_name(dev));
|
||||||
|
if (!err)
|
||||||
|
nop->gpiod_reset =
|
||||||
|
gpio_to_desc(pdata->gpio_reset);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (err == -EPROBE_DEFER)
|
||||||
|
return -EPROBE_DEFER;
|
||||||
|
if (err) {
|
||||||
|
dev_err(dev, "Error requesting RESET GPIO\n");
|
||||||
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
nop->phy.otg = devm_kzalloc(dev, sizeof(*nop->phy.otg),
|
nop->phy.otg = devm_kzalloc(dev, sizeof(*nop->phy.otg),
|
||||||
@ -201,24 +196,6 @@ int usb_phy_gen_create_phy(struct device *dev, struct usb_phy_generic *nop,
|
|||||||
return -EPROBE_DEFER;
|
return -EPROBE_DEFER;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (gpio_is_valid(nop->gpio_reset)) {
|
|
||||||
unsigned long gpio_flags;
|
|
||||||
|
|
||||||
/* Assert RESET */
|
|
||||||
if (nop->reset_active_low)
|
|
||||||
gpio_flags = GPIOF_OUT_INIT_LOW;
|
|
||||||
else
|
|
||||||
gpio_flags = GPIOF_OUT_INIT_HIGH;
|
|
||||||
|
|
||||||
err = devm_gpio_request_one(dev, nop->gpio_reset,
|
|
||||||
gpio_flags, dev_name(dev));
|
|
||||||
if (err) {
|
|
||||||
dev_err(dev, "Error requesting RESET GPIO %d\n",
|
|
||||||
nop->gpio_reset);
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
nop->dev = dev;
|
nop->dev = dev;
|
||||||
nop->phy.dev = nop->dev;
|
nop->phy.dev = nop->dev;
|
||||||
nop->phy.label = "nop-xceiv";
|
nop->phy.label = "nop-xceiv";
|
||||||
|
@ -2,14 +2,14 @@
|
|||||||
#define _PHY_GENERIC_H_
|
#define _PHY_GENERIC_H_
|
||||||
|
|
||||||
#include <linux/usb/usb_phy_generic.h>
|
#include <linux/usb/usb_phy_generic.h>
|
||||||
|
#include <linux/gpio/consumer.h>
|
||||||
|
|
||||||
struct usb_phy_generic {
|
struct usb_phy_generic {
|
||||||
struct usb_phy phy;
|
struct usb_phy phy;
|
||||||
struct device *dev;
|
struct device *dev;
|
||||||
struct clk *clk;
|
struct clk *clk;
|
||||||
struct regulator *vcc;
|
struct regulator *vcc;
|
||||||
int gpio_reset;
|
struct gpio_desc *gpiod_reset;
|
||||||
bool reset_active_low;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
int usb_gen_phy_init(struct usb_phy *phy);
|
int usb_gen_phy_init(struct usb_phy *phy);
|
||||||
|
Loading…
Reference in New Issue
Block a user