platform/chrome: Centralize common cros_ec_device initialization

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>
This commit is contained in:
Tzung-Bi Shih 2025-08-28 08:35:58 +00:00
parent 9188569860
commit e19ceeb1c0
8 changed files with 19 additions and 30 deletions

View File

@ -38,6 +38,15 @@ struct cros_ec_device *cros_ec_device_alloc(struct device *dev)
if (!ec_dev) if (!ec_dev)
return NULL; 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; return ec_dev;
} }
EXPORT_SYMBOL(cros_ec_device_alloc); EXPORT_SYMBOL(cros_ec_device_alloc);

View File

@ -297,16 +297,11 @@ static int cros_ec_i2c_probe(struct i2c_client *client)
return -ENOMEM; return -ENOMEM;
i2c_set_clientdata(client, ec_dev); i2c_set_clientdata(client, ec_dev);
ec_dev->dev = dev;
ec_dev->priv = client; ec_dev->priv = client;
ec_dev->irq = client->irq; ec_dev->irq = client->irq;
ec_dev->cmd_xfer = cros_ec_cmd_xfer_i2c; ec_dev->cmd_xfer = cros_ec_cmd_xfer_i2c;
ec_dev->pkt_xfer = cros_ec_pkt_xfer_i2c; ec_dev->pkt_xfer = cros_ec_pkt_xfer_i2c;
ec_dev->phys_name = client->adapter->name; 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); err = cros_ec_register(ec_dev);
if (err) { if (err) {

View File

@ -550,14 +550,10 @@ static int cros_ec_dev_init(struct ishtp_cl_data *client_data)
client_data->ec_dev = ec_dev; client_data->ec_dev = ec_dev;
dev->driver_data = ec_dev; dev->driver_data = ec_dev;
ec_dev->dev = dev;
ec_dev->priv = client_data->cros_ish_cl; ec_dev->priv = client_data->cros_ish_cl;
ec_dev->cmd_xfer = NULL; ec_dev->cmd_xfer = NULL;
ec_dev->pkt_xfer = cros_ec_pkt_xfer_ish; ec_dev->pkt_xfer = cros_ec_pkt_xfer_ish;
ec_dev->phys_name = dev_name(dev); 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); return cros_ec_register(ec_dev);
} }

View File

@ -642,14 +642,10 @@ static int cros_ec_lpc_probe(struct platform_device *pdev)
return -ENOMEM; return -ENOMEM;
platform_set_drvdata(pdev, ec_dev); platform_set_drvdata(pdev, ec_dev);
ec_dev->dev = dev;
ec_dev->phys_name = dev_name(dev); ec_dev->phys_name = dev_name(dev);
ec_dev->cmd_xfer = cros_ec_cmd_xfer_lpc; ec_dev->cmd_xfer = cros_ec_cmd_xfer_lpc;
ec_dev->pkt_xfer = cros_ec_pkt_xfer_lpc; ec_dev->pkt_xfer = cros_ec_pkt_xfer_lpc;
ec_dev->cmd_readmem = cros_ec_lpc_readmem; 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; ec_dev->priv = ec_lpc;
/* /*

View File

@ -224,14 +224,10 @@ static int cros_ec_rpmsg_probe(struct rpmsg_device *rpdev)
if (!ec_rpmsg) if (!ec_rpmsg)
return -ENOMEM; return -ENOMEM;
ec_dev->dev = dev;
ec_dev->priv = ec_rpmsg; ec_dev->priv = ec_rpmsg;
ec_dev->cmd_xfer = cros_ec_cmd_xfer_rpmsg; ec_dev->cmd_xfer = cros_ec_cmd_xfer_rpmsg;
ec_dev->pkt_xfer = cros_ec_pkt_xfer_rpmsg; ec_dev->pkt_xfer = cros_ec_pkt_xfer_rpmsg;
ec_dev->phys_name = dev_name(&rpdev->dev); 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); dev_set_drvdata(dev, ec_dev);
ec_rpmsg->rpdev = rpdev; ec_rpmsg->rpdev = rpdev;

View File

@ -757,16 +757,11 @@ static int cros_ec_spi_probe(struct spi_device *spi)
cros_ec_spi_dt_probe(ec_spi, dev); cros_ec_spi_dt_probe(ec_spi, dev);
spi_set_drvdata(spi, ec_dev); spi_set_drvdata(spi, ec_dev);
ec_dev->dev = dev;
ec_dev->priv = ec_spi; ec_dev->priv = ec_spi;
ec_dev->irq = spi->irq; ec_dev->irq = spi->irq;
ec_dev->cmd_xfer = cros_ec_cmd_xfer_spi; ec_dev->cmd_xfer = cros_ec_cmd_xfer_spi;
ec_dev->pkt_xfer = cros_ec_pkt_xfer_spi; ec_dev->pkt_xfer = cros_ec_pkt_xfer_spi;
ec_dev->phys_name = dev_name(&ec_spi->spi->dev); 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(); ec_spi->last_transfer_ns = ktime_get_ns();

View File

@ -276,14 +276,10 @@ static int cros_ec_uart_probe(struct serdev_device *serdev)
/* Initialize ec_dev for cros_ec */ /* Initialize ec_dev for cros_ec */
ec_dev->phys_name = dev_name(dev); ec_dev->phys_name = dev_name(dev);
ec_dev->dev = dev;
ec_dev->priv = ec_uart; ec_dev->priv = ec_uart;
ec_dev->irq = ec_uart->irq; ec_dev->irq = ec_uart->irq;
ec_dev->cmd_xfer = NULL; ec_dev->cmd_xfer = NULL;
ec_dev->pkt_xfer = cros_ec_uart_pkt_xfer; 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); serdev_device_set_client_ops(serdev, &cros_ec_uart_client_ops);

View File

@ -33,12 +33,18 @@
/* /*
* Max bus-specific overhead incurred by request/responses. * Max bus-specific overhead incurred by request/responses.
* I2C requires 1 additional byte for requests. *
* I2C requires 2 additional bytes for responses. * Request:
* SPI requires up to 32 additional bytes for responses. * - 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_PROTO_VERSION_UNKNOWN 0
#define EC_MAX_REQUEST_OVERHEAD 1 #define EC_MAX_REQUEST_OVERHEAD 4
#define EC_MAX_RESPONSE_OVERHEAD 32 #define EC_MAX_RESPONSE_OVERHEAD 32
/* /*