usb: typec: fusb302: Implement start_toggling for all port-types
authorHans de Goede <hdegoede@redhat.com>
Tue, 16 Apr 2019 20:07:53 +0000 (22:07 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 19 Apr 2019 12:23:34 +0000 (14:23 +0200)
When in single-role port mode, we must start single-role toggling to
get an interrupt when a device / cable gets plugged into the port.

This commit modifies the fusb302 start_toggling implementation to
start toggling for all port-types, so that connection-detection works
on single-role ports too.

Fixes: ea3b4d5523bc("usb: typec: fusb302: Resolve fixed power role ...")
Cc: Adam Thomson <Adam.Thomson.Opensource@diasemi.com>
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Reviewed-by: Guenter Roeck <linux@roeck-us.net>
Acked-by: Heikki Krogerus <heikki.krogerus@linux.intel.com>
Tested-by: Adam Thomson <Adam.Thomson.Opensource@diasemi.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/usb/typec/tcpm/fusb302.c

index 6f274f4dd2102d78981640f7485ade86784c4df1..b102a15ff958fc909757b96de846829f33b4a68e 100644 (file)
@@ -882,10 +882,20 @@ static int tcpm_start_toggling(struct tcpc_dev *dev,
 {
        struct fusb302_chip *chip = container_of(dev, struct fusb302_chip,
                                                 tcpc_dev);
+       enum toggling_mode mode = TOGGLING_MODE_OFF;
        int ret = 0;
 
-       if (port_type != TYPEC_PORT_DRP)
-               return -EOPNOTSUPP;
+       switch (port_type) {
+       case TYPEC_PORT_SRC:
+               mode = TOGGLING_MODE_SRC;
+               break;
+       case TYPEC_PORT_SNK:
+               mode = TOGGLING_MODE_SNK;
+               break;
+       case TYPEC_PORT_DRP:
+               mode = TOGGLING_MODE_DRP;
+               break;
+       }
 
        mutex_lock(&chip->lock);
        ret = fusb302_set_src_current(chip, cc_src_current[cc]);
@@ -894,7 +904,7 @@ static int tcpm_start_toggling(struct tcpc_dev *dev,
                            typec_cc_status_name[cc], ret);
                goto done;
        }
-       ret = fusb302_set_toggling(chip, TOGGLING_MODE_DRP);
+       ret = fusb302_set_toggling(chip, mode);
        if (ret < 0) {
                fusb302_log(chip,
                            "unable to start drp toggling, ret=%d", ret);