media: cros-ec-cec: Get number of CEC ports from EC
authorReka Norman <rekanorman@chromium.org>
Fri, 25 Aug 2023 02:44:01 +0000 (12:44 +1000)
committerHans Verkuil <hverkuil-cisco@xs4all.nl>
Wed, 27 Sep 2023 07:39:55 +0000 (09:39 +0200)
Add a new CEC port count host command and use it to query the number of
CEC ports from the EC. If the host command is not supported then it must
be old EC firmware which only supports one port, so fall back to
assuming one port.

This patch completes support for multiple ports in cros-ec-cec.

Signed-off-by: Reka Norman <rekanorman@chromium.org>
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
drivers/media/cec/platform/cros-ec/cros-ec-cec.c
include/linux/platform_data/cros_ec_commands.h

index 371699d599dea2733c01c470be850483fd0fcb80..993deb85d3e28b959a42b0eccf9d32543dabeb54 100644 (file)
 
 #define DRV_NAME       "cros-ec-cec"
 
-/* Only one port is supported for now */
-#define CEC_NUM_PORTS  1
-#define CEC_PORT       0
-
 /**
  * struct cros_ec_cec_port - Driver data for a single EC CEC port
  *
@@ -358,6 +354,38 @@ static struct device *cros_ec_cec_find_hdmi_dev(struct device *dev,
 
 #endif
 
+static int cros_ec_cec_get_num_ports(struct cros_ec_cec *cros_ec_cec)
+{
+       struct ec_response_cec_port_count response;
+       int ret;
+
+       ret = cros_ec_cmd(cros_ec_cec->cros_ec, 0, EC_CMD_CEC_PORT_COUNT, NULL,
+                         0, &response, sizeof(response));
+       if (ret < 0) {
+               /*
+                * Old EC firmware only supports one port and does not support
+                * the port count command, so fall back to assuming one port.
+                */
+               cros_ec_cec->num_ports = 1;
+               return 0;
+       }
+
+       if (response.port_count == 0) {
+               dev_err(cros_ec_cec->cros_ec->dev,
+                       "EC reports 0 CEC ports\n");
+               return -ENODEV;
+       }
+
+       if (response.port_count > EC_CEC_MAX_PORTS) {
+               dev_err(cros_ec_cec->cros_ec->dev,
+                       "EC reports too many ports: %d\n", response.port_count);
+               return -EINVAL;
+       }
+
+       cros_ec_cec->num_ports = response.port_count;
+       return 0;
+}
+
 static int cros_ec_cec_get_write_cmd_version(struct cros_ec_cec *cros_ec_cec)
 {
        struct cros_ec_device *cros_ec = cros_ec_cec->cros_ec;
@@ -463,7 +491,9 @@ static int cros_ec_cec_probe(struct platform_device *pdev)
 
        device_init_wakeup(&pdev->dev, 1);
 
-       cros_ec_cec->num_ports = CEC_NUM_PORTS;
+       ret = cros_ec_cec_get_num_ports(cros_ec_cec);
+       if (ret)
+               return ret;
 
        ret = cros_ec_cec_get_write_cmd_version(cros_ec_cec);
        if (ret)
index ad61c7ff0b28506e8377d98616514256f331ac0a..7dae17b62a4d3b68fcfd9d54514c4e532b045e66 100644 (file)
@@ -4536,6 +4536,17 @@ struct ec_response_cec_get {
        uint8_t val;
 } __ec_align1;
 
+/* Get the number of CEC ports */
+#define EC_CMD_CEC_PORT_COUNT 0x00C1
+
+/**
+ * struct ec_response_cec_port_count - CEC port count response
+ * @port_count: number of CEC ports
+ */
+struct ec_response_cec_port_count {
+       uint8_t port_count;
+} __ec_align1;
+
 /* CEC parameters command */
 enum cec_command {
        /* CEC reading, writing and events enable */