usb: misc: usb3503: Add to select the ports to disable
authorDongjin Kim <tobetter@gmail.com>
Tue, 21 May 2013 20:20:08 +0000 (05:20 +0900)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 30 May 2013 12:32:52 +0000 (21:32 +0900)
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: Dongjin Kim <tobetter@gmail.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/usb/misc/usb3503.c
include/linux/platform_data/usb3503.h

index d3a1cce1bf9c511710993002d83391f8f6a6fb35..ab24bb345979f3beec5c2c00a956523da0a99f15 100644 (file)
@@ -42,9 +42,6 @@
 #define USB3503_NRD            0x09
 
 #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_SPILOCK_CONNECT        (1 << 1)
@@ -56,6 +53,7 @@
 struct usb3503 {
        enum usb3503_mode       mode;
        struct i2c_client       *client;
+       u8      port_off_mask;
        int     gpio_intn;
        int     gpio_reset;
        int     gpio_connect;
@@ -134,12 +132,14 @@ static int usb3503_switch_mode(struct usb3503 *hub, enum usb3503_mode mode)
                        goto err_hubmode;
                }
 
-               /* PDS : Port2,3 Disable For Self Powered Operation */
-               err = usb3503_set_bits(i2c, USB3503_PDS,
-                               (USB3503_PORT2 | USB3503_PORT3));
-               if (err < 0) {
-                       dev_err(&i2c->dev, "PDS failed (%d)\n", err);
-                       goto err_hubmode;
+               /* PDS : Disable For Self Powered Operation */
+               if (hub->port_off_mask) {
+                       err = usb3503_set_bits(i2c, USB3503_PDS,
+                                       hub->port_off_mask);
+                       if (err < 0) {
+                               dev_err(&i2c->dev, "PDS failed (%d)\n", err);
+                               goto err_hubmode;
+                       }
                }
 
                /* CFG1 : SELF_BUS_PWR -> Self-Powerd operation */
@@ -197,6 +197,7 @@ static int usb3503_probe(struct i2c_client *i2c, const struct i2c_device_id *id)
        hub->client = i2c;
 
        if (pdata) {
+               hub->port_off_mask      = pdata->port_off_mask;
                hub->gpio_intn          = pdata->gpio_intn;
                hub->gpio_connect       = pdata->gpio_connect;
                hub->gpio_reset         = pdata->gpio_reset;
index 85dcc709f7e92007c0a5d753c3efc3cea443f0b8..1d1b6ef871f6ace33196cc893a1c8b45d1375b40 100644 (file)
@@ -3,6 +3,10 @@
 
 #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 {
        USB3503_MODE_UNKNOWN,
        USB3503_MODE_HUB,
@@ -11,6 +15,7 @@ enum usb3503_mode {
 
 struct usb3503_platform_data {
        enum usb3503_mode       initial_mode;
+       u8      port_off_mask;
        int     gpio_intn;
        int     gpio_connect;
        int     gpio_reset;