]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
platform/chrome: Centralize common cros_ec_device initialization
authorTzung-Bi Shih <tzungbi@kernel.org>
Thu, 28 Aug 2025 08:35:58 +0000 (08:35 +0000)
committerTzung-Bi Shih <tzungbi@kernel.org>
Sun, 14 Sep 2025 03:34:41 +0000 (11:34 +0800)
Move the common initialization from protocol device drivers into central
cros_ec_device_alloc().

This removes duplicated code from each driver's probe function.
The buffer sizes are now calculated once, using the maximum possible
overhead required by any of the transport protocols, ensuring the
allocated buffers are sufficient for all cases.

Link: https://lore.kernel.org/r/20250828083601.856083-3-tzungbi@kernel.org
Signed-off-by: Tzung-Bi Shih <tzungbi@kernel.org>
drivers/platform/chrome/cros_ec.c
drivers/platform/chrome/cros_ec_i2c.c
drivers/platform/chrome/cros_ec_ishtp.c
drivers/platform/chrome/cros_ec_lpc.c
drivers/platform/chrome/cros_ec_rpmsg.c
drivers/platform/chrome/cros_ec_spi.c
drivers/platform/chrome/cros_ec_uart.c
include/linux/platform_data/cros_ec_proto.h

index 25283a148ab9c041aba9b14fc1d4c5c48d700c5e..da049068b6e9e1c54b571c9ffe032a1821ca5287 100644 (file)
@@ -38,6 +38,15 @@ struct cros_ec_device *cros_ec_device_alloc(struct device *dev)
        if (!ec_dev)
                return NULL;
 
+       ec_dev->din_size = sizeof(struct ec_host_response) +
+                          sizeof(struct ec_response_get_protocol_info) +
+                          EC_MAX_RESPONSE_OVERHEAD;
+       ec_dev->dout_size = sizeof(struct ec_host_request) +
+                           sizeof(struct ec_params_rwsig_action) +
+                           EC_MAX_REQUEST_OVERHEAD;
+
+       ec_dev->dev = dev;
+
        return ec_dev;
 }
 EXPORT_SYMBOL(cros_ec_device_alloc);
index ee3c5130ec3f7f09ae653e312903478ad6abc3f0..def1144a077ea633324c65d59c9bf03c034f6403 100644 (file)
@@ -297,16 +297,11 @@ static int cros_ec_i2c_probe(struct i2c_client *client)
                return -ENOMEM;
 
        i2c_set_clientdata(client, ec_dev);
-       ec_dev->dev = dev;
        ec_dev->priv = client;
        ec_dev->irq = client->irq;
        ec_dev->cmd_xfer = cros_ec_cmd_xfer_i2c;
        ec_dev->pkt_xfer = cros_ec_pkt_xfer_i2c;
        ec_dev->phys_name = client->adapter->name;
-       ec_dev->din_size = sizeof(struct ec_host_response_i2c) +
-                          sizeof(struct ec_response_get_protocol_info);
-       ec_dev->dout_size = sizeof(struct ec_host_request_i2c) +
-                           sizeof(struct ec_params_rwsig_action);
 
        err = cros_ec_register(ec_dev);
        if (err) {
index c102a796670c642fd648810c7ef9e6e3d9657e12..4e74e702c5a24d115e81e6e14942efc174c06c80 100644 (file)
@@ -550,14 +550,10 @@ static int cros_ec_dev_init(struct ishtp_cl_data *client_data)
        client_data->ec_dev = ec_dev;
        dev->driver_data = ec_dev;
 
-       ec_dev->dev = dev;
        ec_dev->priv = client_data->cros_ish_cl;
        ec_dev->cmd_xfer = NULL;
        ec_dev->pkt_xfer = cros_ec_pkt_xfer_ish;
        ec_dev->phys_name = dev_name(dev);
-       ec_dev->din_size = sizeof(struct cros_ish_in_msg) +
-                          sizeof(struct ec_response_get_protocol_info);
-       ec_dev->dout_size = sizeof(struct cros_ish_out_msg) + sizeof(struct ec_params_rwsig_action);
 
        return cros_ec_register(ec_dev);
 }
index 30fa89b81666cff767176f01642c8b6cec41e112..78cfff80cdeafe2ba1520c01ee63047160a7b8e8 100644 (file)
@@ -642,14 +642,10 @@ static int cros_ec_lpc_probe(struct platform_device *pdev)
                return -ENOMEM;
 
        platform_set_drvdata(pdev, ec_dev);
-       ec_dev->dev = dev;
        ec_dev->phys_name = dev_name(dev);
        ec_dev->cmd_xfer = cros_ec_cmd_xfer_lpc;
        ec_dev->pkt_xfer = cros_ec_pkt_xfer_lpc;
        ec_dev->cmd_readmem = cros_ec_lpc_readmem;
-       ec_dev->din_size = sizeof(struct ec_host_response) +
-                          sizeof(struct ec_response_get_protocol_info);
-       ec_dev->dout_size = sizeof(struct ec_host_request) + sizeof(struct ec_params_rwsig_action);
        ec_dev->priv = ec_lpc;
 
        /*
index 9ac2b923db6ded6988980691ec6e67838df4ac51..09bd9e49464e6287e16c51b7fef8d3bb84278bed 100644 (file)
@@ -224,14 +224,10 @@ static int cros_ec_rpmsg_probe(struct rpmsg_device *rpdev)
        if (!ec_rpmsg)
                return -ENOMEM;
 
-       ec_dev->dev = dev;
        ec_dev->priv = ec_rpmsg;
        ec_dev->cmd_xfer = cros_ec_cmd_xfer_rpmsg;
        ec_dev->pkt_xfer = cros_ec_pkt_xfer_rpmsg;
        ec_dev->phys_name = dev_name(&rpdev->dev);
-       ec_dev->din_size = sizeof(struct ec_host_response) +
-                          sizeof(struct ec_response_get_protocol_info);
-       ec_dev->dout_size = sizeof(struct ec_host_request) + sizeof(struct ec_params_rwsig_action);
        dev_set_drvdata(dev, ec_dev);
 
        ec_rpmsg->rpdev = rpdev;
index c778300a4145d444092030afb1c5ceb29c8a10d3..28fa82f8cb07e078ca99835ad749d6d4c6bffcfd 100644 (file)
@@ -757,16 +757,11 @@ static int cros_ec_spi_probe(struct spi_device *spi)
        cros_ec_spi_dt_probe(ec_spi, dev);
 
        spi_set_drvdata(spi, ec_dev);
-       ec_dev->dev = dev;
        ec_dev->priv = ec_spi;
        ec_dev->irq = spi->irq;
        ec_dev->cmd_xfer = cros_ec_cmd_xfer_spi;
        ec_dev->pkt_xfer = cros_ec_pkt_xfer_spi;
        ec_dev->phys_name = dev_name(&ec_spi->spi->dev);
-       ec_dev->din_size = EC_MSG_PREAMBLE_COUNT +
-                          sizeof(struct ec_host_response) +
-                          sizeof(struct ec_response_get_protocol_info);
-       ec_dev->dout_size = sizeof(struct ec_host_request) + sizeof(struct ec_params_rwsig_action);
 
        ec_spi->last_transfer_ns = ktime_get_ns();
 
index 1a7511b1bbe378d9b9502345cbf425dbc5f529a8..d5b37414ff1245f49a43edd06c294c012b33da9b 100644 (file)
@@ -276,14 +276,10 @@ static int cros_ec_uart_probe(struct serdev_device *serdev)
 
        /* Initialize ec_dev for cros_ec  */
        ec_dev->phys_name = dev_name(dev);
-       ec_dev->dev = dev;
        ec_dev->priv = ec_uart;
        ec_dev->irq = ec_uart->irq;
        ec_dev->cmd_xfer = NULL;
        ec_dev->pkt_xfer = cros_ec_uart_pkt_xfer;
-       ec_dev->din_size = sizeof(struct ec_host_response) +
-                          sizeof(struct ec_response_get_protocol_info);
-       ec_dev->dout_size = sizeof(struct ec_host_request) + sizeof(struct ec_params_rwsig_action);
 
        serdev_device_set_client_ops(serdev, &cros_ec_uart_client_ops);
 
index 3ec24f445c29cdf0ebfb3139d7eff807b27b3d72..4d96cffbb9e32c2c674a66a4f921f4ee6af98292 100644 (file)
 
 /*
  * Max bus-specific overhead incurred by request/responses.
- * I2C requires 1 additional byte for requests.
- * I2C requires 2 additional bytes for responses.
- * SPI requires up to 32 additional bytes for responses.
+ *
+ * Request:
+ * - I2C requires 1 byte (see struct ec_host_request_i2c).
+ * - ISHTP requires 4 bytes (see struct cros_ish_out_msg).
+ *
+ * Response:
+ * - I2C requires 2 bytes (see struct ec_host_response_i2c).
+ * - ISHTP requires 4 bytes (see struct cros_ish_in_msg).
+ * - SPI requires 32 bytes (see EC_MSG_PREAMBLE_COUNT).
  */
 #define EC_PROTO_VERSION_UNKNOWN       0
-#define EC_MAX_REQUEST_OVERHEAD                1
+#define EC_MAX_REQUEST_OVERHEAD                4
 #define EC_MAX_RESPONSE_OVERHEAD       32
 
 /*