|
@@ -20,12 +20,11 @@
|
|
|
*/
|
|
|
|
|
|
#include <linux/delay.h>
|
|
|
-#include <linux/gpio.h>
|
|
|
+#include <linux/gpio/consumer.h>
|
|
|
#include <linux/i2c.h>
|
|
|
#include <linux/module.h>
|
|
|
#include <linux/nls.h>
|
|
|
#include <linux/of_device.h>
|
|
|
-#include <linux/of_gpio.h>
|
|
|
#include <linux/slab.h>
|
|
|
|
|
|
/* Internal Register Set Addresses & Default Values acc. to DS00001692C */
|
|
@@ -126,7 +125,7 @@ struct usb251xb {
|
|
|
struct device *dev;
|
|
|
struct i2c_client *i2c;
|
|
|
u8 skip_config;
|
|
|
- int gpio_reset;
|
|
|
+ struct gpio_desc *gpio_reset;
|
|
|
u16 vendor_id;
|
|
|
u16 product_id;
|
|
|
u16 device_id;
|
|
@@ -234,13 +233,13 @@ static const struct usb251xb_data usb2517i_data = {
|
|
|
|
|
|
static void usb251xb_reset(struct usb251xb *hub, int state)
|
|
|
{
|
|
|
- if (!gpio_is_valid(hub->gpio_reset))
|
|
|
+ if (!hub->gpio_reset)
|
|
|
return;
|
|
|
|
|
|
- gpio_set_value_cansleep(hub->gpio_reset, state);
|
|
|
+ gpiod_set_value_cansleep(hub->gpio_reset, state);
|
|
|
|
|
|
/* wait for hub recovery/stabilization */
|
|
|
- if (state)
|
|
|
+ if (!state)
|
|
|
usleep_range(500, 750); /* >=500us at power on */
|
|
|
else
|
|
|
usleep_range(1, 10); /* >=1us at power down */
|
|
@@ -259,7 +258,7 @@ static int usb251xb_connect(struct usb251xb *hub)
|
|
|
i2c_wb[0] = 0x01;
|
|
|
i2c_wb[1] = USB251XB_STATUS_COMMAND_ATTACH;
|
|
|
|
|
|
- usb251xb_reset(hub, 1);
|
|
|
+ usb251xb_reset(hub, 0);
|
|
|
|
|
|
err = i2c_smbus_write_i2c_block_data(hub->i2c,
|
|
|
USB251XB_ADDR_STATUS_COMMAND, 2, i2c_wb);
|
|
@@ -309,7 +308,7 @@ static int usb251xb_connect(struct usb251xb *hub)
|
|
|
i2c_wb[USB251XB_ADDR_PORT_MAP_7] = hub->port_map7;
|
|
|
i2c_wb[USB251XB_ADDR_STATUS_COMMAND] = USB251XB_STATUS_COMMAND_ATTACH;
|
|
|
|
|
|
- usb251xb_reset(hub, 1);
|
|
|
+ usb251xb_reset(hub, 0);
|
|
|
|
|
|
/* write registers */
|
|
|
for (i = 0; i < (USB251XB_I2C_REG_SZ / USB251XB_I2C_WRITE_SZ); i++) {
|
|
@@ -362,19 +361,13 @@ static int usb251xb_get_ofdata(struct usb251xb *hub,
|
|
|
else
|
|
|
hub->skip_config = 0;
|
|
|
|
|
|
- hub->gpio_reset = of_get_named_gpio(np, "reset-gpios", 0);
|
|
|
- if (hub->gpio_reset == -EPROBE_DEFER)
|
|
|
+ hub->gpio_reset = devm_gpiod_get_optional(dev, "reset", GPIOD_OUT_HIGH);
|
|
|
+ if (PTR_ERR(hub->gpio_reset) == -EPROBE_DEFER) {
|
|
|
return -EPROBE_DEFER;
|
|
|
- if (gpio_is_valid(hub->gpio_reset)) {
|
|
|
- err = devm_gpio_request_one(dev, hub->gpio_reset,
|
|
|
- GPIOF_OUT_INIT_LOW,
|
|
|
- "usb251xb reset");
|
|
|
- if (err) {
|
|
|
- dev_err(dev,
|
|
|
- "unable to request GPIO %d as reset pin (%d)\n",
|
|
|
- hub->gpio_reset, err);
|
|
|
- return err;
|
|
|
- }
|
|
|
+ } else if (IS_ERR(hub->gpio_reset)) {
|
|
|
+ err = PTR_ERR(hub->gpio_reset);
|
|
|
+ dev_err(dev, "unable to request GPIO reset pin (%d)\n", err);
|
|
|
+ return err;
|
|
|
}
|
|
|
|
|
|
if (of_property_read_u16_array(np, "vendor-id", &hub->vendor_id, 1))
|