Merge tag 'tag-chrome-platform-for-v5.13' of git://git.kernel.org/pub/scm/linux/kerne...
authorLinus Torvalds <torvalds@linux-foundation.org>
Fri, 7 May 2021 21:49:18 +0000 (14:49 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Fri, 7 May 2021 21:49:18 +0000 (14:49 -0700)
Pull chrome platform updates from Benson Leung:
 "cros_ec_typec:

   - Changes around DP mode check, hard reset, tracking port change.

  cros_ec misc:

   - wilco_ec: Convert stream-like files from nonseekable to stream open

   - cros_usbpd_notify: Listen to EC_HSOT_EVENT_USB_MUX host event

   - fix format warning in cros_ec_typec"

* tag 'tag-chrome-platform-for-v5.13' of git://git.kernel.org/pub/scm/linux/kernel/git/chrome-platform/linux:
  platform/chrome: cros_ec_lpc: Use DEFINE_MUTEX() for mutex lock
  platform/chrome: cros_usbpd_notify: Listen to EC_HOST_EVENT_USB_MUX host event
  platform/chrome: cros_ec_typec: Add DP mode check
  platform/chrome: cros_ec_typec: Handle hard reset
  platform/chrome: cros_ec: Add Type C hard reset
  platform/chrome: cros_ec_typec: Track port role
  platform/chrome: cros_ec_typec: fix clang -Wformat warning
  platform/chrome: cros_ec_typec: Check for device within remove function
  platform/chrome: wilco_ec: convert stream-like files from nonseekable_open -> stream_open

drivers/platform/chrome/cros_ec_lpc_mec.c
drivers/platform/chrome/cros_ec_typec.c
drivers/platform/chrome/cros_usbpd_notify.c
drivers/platform/chrome/wilco_ec/telemetry.c
include/linux/platform_data/cros_ec_commands.h

index 9035b17e8c869ab08aa97b31298b86236da14277..bbc2884f5e2ff96a26b6db748912591393172c18 100644 (file)
@@ -14,7 +14,7 @@
  * This mutex must be held while accessing the EMI unit. We can't rely on the
  * EC mutex because memmap data may be accessed without it being held.
  */
-static struct mutex io_mutex;
+static DEFINE_MUTEX(io_mutex);
 static u16 mec_emi_base, mec_emi_end;
 
 /**
@@ -142,7 +142,6 @@ EXPORT_SYMBOL(cros_ec_lpc_io_bytes_mec);
 
 void cros_ec_lpc_mec_init(unsigned int base, unsigned int end)
 {
-       mutex_init(&io_mutex);
        mec_emi_base = base;
        mec_emi_end = end;
 }
index 0811562deeccac03d98a73bc824378e8c5b696f6..27c068c4c38df7deb1dd5c87a3c63876a3859a11 100644 (file)
@@ -58,6 +58,7 @@ struct cros_typec_port {
        /* Variables keeping track of switch state. */
        struct typec_mux_state state;
        uint8_t mux_flags;
+       uint8_t role;
 
        /* Port alt modes. */
        struct typec_altmode p_altmode[CROS_EC_ALTMODE_MAX];
@@ -220,6 +221,9 @@ static void cros_typec_remove_partner(struct cros_typec_data *typec,
 {
        struct cros_typec_port *port = typec->ports[port_num];
 
+       if (!port->partner)
+               return;
+
        cros_typec_unregister_altmodes(typec, port_num, true);
 
        cros_typec_usb_disconnect_state(port);
@@ -235,6 +239,9 @@ static void cros_typec_remove_cable(struct cros_typec_data *typec,
 {
        struct cros_typec_port *port = typec->ports[port_num];
 
+       if (!port->cable)
+               return;
+
        cros_typec_unregister_altmodes(typec, port_num, false);
 
        typec_unregister_plug(port->plug);
@@ -253,11 +260,8 @@ static void cros_unregister_ports(struct cros_typec_data *typec)
                if (!typec->ports[i])
                        continue;
 
-               if (typec->ports[i]->partner)
-                       cros_typec_remove_partner(typec, i);
-
-               if (typec->ports[i]->cable)
-                       cros_typec_remove_cable(typec, i);
+               cros_typec_remove_partner(typec, i);
+               cros_typec_remove_cable(typec, i);
 
                usb_role_switch_put(typec->ports[i]->role_sw);
                typec_switch_put(typec->ports[i]->ori_sw);
@@ -483,6 +487,11 @@ static int cros_typec_enable_dp(struct cros_typec_data *typec,
                return -ENOTSUPP;
        }
 
+       if (!pd_ctrl->dp_mode) {
+               dev_err(typec->dev, "No valid DP mode provided.\n");
+               return -EINVAL;
+       }
+
        /* Status VDO. */
        dp_data.status = DP_STATUS_ENABLED;
        if (port->mux_flags & USB_PD_MUX_HPD_IRQ)
@@ -647,11 +656,8 @@ static void cros_typec_set_port_params_v1(struct cros_typec_data *typec,
                                 "Failed to register partner on port: %d\n",
                                 port_num);
        } else {
-               if (typec->ports[port_num]->partner)
-                       cros_typec_remove_partner(typec, port_num);
-
-               if (typec->ports[port_num]->cable)
-                       cros_typec_remove_cable(typec, port_num);
+               cros_typec_remove_partner(typec, port_num);
+               cros_typec_remove_cable(typec, port_num);
        }
 }
 
@@ -905,6 +911,19 @@ static void cros_typec_handle_status(struct cros_typec_data *typec, int port_num
                return;
        }
 
+       /* If we got a hard reset, unregister everything and return. */
+       if (resp.events & PD_STATUS_EVENT_HARD_RESET) {
+               cros_typec_remove_partner(typec, port_num);
+               cros_typec_remove_cable(typec, port_num);
+
+               ret = cros_typec_send_clear_event(typec, port_num,
+                                                 PD_STATUS_EVENT_HARD_RESET);
+               if (ret < 0)
+                       dev_warn(typec->dev,
+                                "Failed hard reset event clear, port: %d\n", port_num);
+               return;
+       }
+
        /* Handle any events appropriately. */
        if (resp.events & PD_STATUS_EVENT_SOP_DISC_DONE && !typec->ports[port_num]->sop_disc_done) {
                u16 sop_revision;
@@ -995,10 +1014,12 @@ static int cros_typec_port_update(struct cros_typec_data *typec, int port_num)
        }
 
        /* No change needs to be made, let's exit early. */
-       if (typec->ports[port_num]->mux_flags == mux_resp.flags)
+       if (typec->ports[port_num]->mux_flags == mux_resp.flags &&
+           typec->ports[port_num]->role == resp.role)
                return 0;
 
        typec->ports[port_num]->mux_flags = mux_resp.flags;
+       typec->ports[port_num]->role = resp.role;
        ret = cros_typec_configure_mux(typec, port_num, mux_resp.flags, &resp);
        if (ret)
                dev_warn(typec->dev, "Configure muxes failed, err = %d\n", ret);
@@ -1027,8 +1048,8 @@ static int cros_typec_get_cmd_version(struct cros_typec_data *typec)
        else
                typec->pd_ctrl_ver = 0;
 
-       dev_dbg(typec->dev, "PD Control has version mask 0x%hhx\n",
-               typec->pd_ctrl_ver);
+       dev_dbg(typec->dev, "PD Control has version mask 0x%02x\n",
+               typec->pd_ctrl_ver & 0xff);
 
        return 0;
 }
index 7f36142ab12a8d1c729bfb6da038d74934168f36..48a6617aa12f3a738a17aa25c1c27763a2ee116a 100644 (file)
@@ -220,7 +220,8 @@ static int cros_usbpd_notify_plat(struct notifier_block *nb,
        if (!host_event)
                return NOTIFY_DONE;
 
-       if (host_event & EC_HOST_EVENT_MASK(EC_HOST_EVENT_PD_MCU)) {
+       if (host_event & (EC_HOST_EVENT_MASK(EC_HOST_EVENT_PD_MCU) |
+                         EC_HOST_EVENT_MASK(EC_HOST_EVENT_USB_MUX))) {
                cros_usbpd_get_event_and_notify(pdnotify->dev, ec_dev);
                return NOTIFY_OK;
        }
index e06d96fb942650bceeb59adeebbdce06354d2c7e..60da7a29f2ff2dd6ee5d18cba69949a00278afd5 100644 (file)
@@ -256,7 +256,7 @@ static int telem_open(struct inode *inode, struct file *filp)
        sess_data->dev_data = dev_data;
        sess_data->has_msg = false;
 
-       nonseekable_open(inode, filp);
+       stream_open(inode, filp);
        filp->private_data = sess_data;
 
        return 0;
index 6035d9a98fb891ed1243cbcb5c1a679a4a833aaa..45f53afc46e22473bdebfae28e956402b5248b87 100644 (file)
@@ -5679,6 +5679,7 @@ enum tcpc_cc_polarity {
 
 #define PD_STATUS_EVENT_SOP_DISC_DONE          BIT(0)
 #define PD_STATUS_EVENT_SOP_PRIME_DISC_DONE    BIT(1)
+#define PD_STATUS_EVENT_HARD_RESET             BIT(2)
 
 struct ec_params_typec_status {
        uint8_t port;