Commit e8e44a48 authored by Dongjin Kim's avatar Dongjin Kim Committed by Greg Kroah-Hartman

usb: misc: usb3503: Add to select the ports to disable

This patch is to disable the USB ports unconnected to USB3503. In order to
disable the port, 'port_off_mask' must be set.

* Disable PORT1 only
	.port_off_mask = USB3503_OFF_PORT1;

* Disable PORT1 and PORT3 only
	.port_off_mask = USB3503_OFF_PORT1 | USB3503_OFF_PORT3;

* Enables all ports
	.port_off_mask = 0;
Signed-off-by: default avatarDongjin Kim <tobetter@gmail.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 45f6bc5f
...@@ -42,9 +42,6 @@ ...@@ -42,9 +42,6 @@
#define USB3503_NRD 0x09 #define USB3503_NRD 0x09
#define USB3503_PDS 0x0a #define USB3503_PDS 0x0a
#define USB3503_PORT1 (1 << 1)
#define USB3503_PORT2 (1 << 2)
#define USB3503_PORT3 (1 << 3)
#define USB3503_SP_ILOCK 0xe7 #define USB3503_SP_ILOCK 0xe7
#define USB3503_SPILOCK_CONNECT (1 << 1) #define USB3503_SPILOCK_CONNECT (1 << 1)
...@@ -56,6 +53,7 @@ ...@@ -56,6 +53,7 @@
struct usb3503 { struct usb3503 {
enum usb3503_mode mode; enum usb3503_mode mode;
struct i2c_client *client; struct i2c_client *client;
u8 port_off_mask;
int gpio_intn; int gpio_intn;
int gpio_reset; int gpio_reset;
int gpio_connect; int gpio_connect;
...@@ -134,13 +132,15 @@ static int usb3503_switch_mode(struct usb3503 *hub, enum usb3503_mode mode) ...@@ -134,13 +132,15 @@ static int usb3503_switch_mode(struct usb3503 *hub, enum usb3503_mode mode)
goto err_hubmode; goto err_hubmode;
} }
/* PDS : Port2,3 Disable For Self Powered Operation */ /* PDS : Disable For Self Powered Operation */
if (hub->port_off_mask) {
err = usb3503_set_bits(i2c, USB3503_PDS, err = usb3503_set_bits(i2c, USB3503_PDS,
(USB3503_PORT2 | USB3503_PORT3)); hub->port_off_mask);
if (err < 0) { if (err < 0) {
dev_err(&i2c->dev, "PDS failed (%d)\n", err); dev_err(&i2c->dev, "PDS failed (%d)\n", err);
goto err_hubmode; goto err_hubmode;
} }
}
/* CFG1 : SELF_BUS_PWR -> Self-Powerd operation */ /* CFG1 : SELF_BUS_PWR -> Self-Powerd operation */
err = usb3503_set_bits(i2c, USB3503_CFG1, USB3503_SELF_BUS_PWR); err = usb3503_set_bits(i2c, USB3503_CFG1, USB3503_SELF_BUS_PWR);
...@@ -197,6 +197,7 @@ static int usb3503_probe(struct i2c_client *i2c, const struct i2c_device_id *id) ...@@ -197,6 +197,7 @@ static int usb3503_probe(struct i2c_client *i2c, const struct i2c_device_id *id)
hub->client = i2c; hub->client = i2c;
if (pdata) { if (pdata) {
hub->port_off_mask = pdata->port_off_mask;
hub->gpio_intn = pdata->gpio_intn; hub->gpio_intn = pdata->gpio_intn;
hub->gpio_connect = pdata->gpio_connect; hub->gpio_connect = pdata->gpio_connect;
hub->gpio_reset = pdata->gpio_reset; hub->gpio_reset = pdata->gpio_reset;
......
...@@ -3,6 +3,10 @@ ...@@ -3,6 +3,10 @@
#define USB3503_I2C_NAME "usb3503" #define USB3503_I2C_NAME "usb3503"
#define USB3503_OFF_PORT1 (1 << 1)
#define USB3503_OFF_PORT2 (1 << 2)
#define USB3503_OFF_PORT3 (1 << 3)
enum usb3503_mode { enum usb3503_mode {
USB3503_MODE_UNKNOWN, USB3503_MODE_UNKNOWN,
USB3503_MODE_HUB, USB3503_MODE_HUB,
...@@ -11,6 +15,7 @@ enum usb3503_mode { ...@@ -11,6 +15,7 @@ enum usb3503_mode {
struct usb3503_platform_data { struct usb3503_platform_data {
enum usb3503_mode initial_mode; enum usb3503_mode initial_mode;
u8 port_off_mask;
int gpio_intn; int gpio_intn;
int gpio_connect; int gpio_connect;
int gpio_reset; int gpio_reset;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment