forked from mirrors/linux
		
	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
					
				
					 2 changed files with 21 additions and 44 deletions
				
			
		| 
						 | 
					@ -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 a new issue