提交 a6551a76 编写于 作者: A Andrew Bresticker 提交者: Lee Jones

mfd: cros_ec: stop calling ->cmd_xfer() directly

Instead of having users of the ChromeOS EC call the interface-specific
cmd_xfer() callback directly, introduce a central cros_ec_cmd_xfer()
to use instead.  This will allow us to put all the locking and retry
logic in one place instead of duplicating it across the different
drivers.
Signed-off-by: NAndrew Bresticker <abrestic@chromium.org>
Reviewed-by: NSimon Glass <sjg@chromium.org>
Signed-off-by: NJavier Martinez Canillas <javier.martinez@collabora.co.uk>
Reviewed-by: NDoug Anderson <dianders@chromium.org>
Signed-off-by: NLee Jones <lee.jones@linaro.org>
上级 659e142b
...@@ -227,7 +227,7 @@ static int ec_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg i2c_msgs[], ...@@ -227,7 +227,7 @@ static int ec_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg i2c_msgs[],
msg.indata = response; msg.indata = response;
msg.insize = response_len; msg.insize = response_len;
result = bus->ec->cmd_xfer(bus->ec, &msg); result = cros_ec_cmd_xfer(bus->ec, &msg);
if (result < 0) if (result < 0)
goto exit; goto exit;
......
...@@ -182,7 +182,7 @@ static int cros_ec_keyb_get_state(struct cros_ec_keyb *ckdev, uint8_t *kb_state) ...@@ -182,7 +182,7 @@ static int cros_ec_keyb_get_state(struct cros_ec_keyb *ckdev, uint8_t *kb_state)
.insize = ckdev->cols, .insize = ckdev->cols,
}; };
return ckdev->ec->cmd_xfer(ckdev->ec, &msg); return cros_ec_cmd_xfer(ckdev->ec, &msg);
} }
static irqreturn_t cros_ec_keyb_irq(int irq, void *data) static irqreturn_t cros_ec_keyb_irq(int irq, void *data)
......
...@@ -62,6 +62,13 @@ int cros_ec_check_result(struct cros_ec_device *ec_dev, ...@@ -62,6 +62,13 @@ int cros_ec_check_result(struct cros_ec_device *ec_dev,
} }
EXPORT_SYMBOL(cros_ec_check_result); EXPORT_SYMBOL(cros_ec_check_result);
int cros_ec_cmd_xfer(struct cros_ec_device *ec_dev,
struct cros_ec_command *msg)
{
return ec_dev->cmd_xfer(ec_dev, msg);
}
EXPORT_SYMBOL(cros_ec_cmd_xfer);
static const struct mfd_cell cros_devs[] = { static const struct mfd_cell cros_devs[] = {
{ {
.name = "cros-ec-keyb", .name = "cros-ec-keyb",
......
...@@ -62,10 +62,6 @@ struct cros_ec_command { ...@@ -62,10 +62,6 @@ struct cros_ec_command {
* @dev: Device pointer * @dev: Device pointer
* @was_wake_device: true if this device was set to wake the system from * @was_wake_device: true if this device was set to wake the system from
* sleep at the last suspend * sleep at the last suspend
* @cmd_xfer: send command to EC and get response
* Returns the number of bytes received if the communication succeeded, but
* that doesn't mean the EC was happy with the command. The caller
* should check msg.result for the EC's result code.
* *
* @priv: Private data * @priv: Private data
* @irq: Interrupt to use * @irq: Interrupt to use
...@@ -82,6 +78,10 @@ struct cros_ec_command { ...@@ -82,6 +78,10 @@ struct cros_ec_command {
* @dout_size: size of dout buffer to allocate (zero to use static dout) * @dout_size: size of dout buffer to allocate (zero to use static dout)
* @parent: pointer to parent device (e.g. i2c or spi device) * @parent: pointer to parent device (e.g. i2c or spi device)
* @wake_enabled: true if this device can wake the system from sleep * @wake_enabled: true if this device can wake the system from sleep
* @cmd_xfer: send command to EC and get response
* Returns the number of bytes received if the communication succeeded, but
* that doesn't mean the EC was happy with the command. The caller
* should check msg.result for the EC's result code.
* @lock: one transaction at a time * @lock: one transaction at a time
*/ */
struct cros_ec_device { struct cros_ec_device {
...@@ -92,8 +92,6 @@ struct cros_ec_device { ...@@ -92,8 +92,6 @@ struct cros_ec_device {
struct device *dev; struct device *dev;
bool was_wake_device; bool was_wake_device;
struct class *cros_class; struct class *cros_class;
int (*cmd_xfer)(struct cros_ec_device *ec,
struct cros_ec_command *msg);
/* These are used to implement the platform-specific interface */ /* These are used to implement the platform-specific interface */
void *priv; void *priv;
...@@ -104,6 +102,8 @@ struct cros_ec_device { ...@@ -104,6 +102,8 @@ struct cros_ec_device {
int dout_size; int dout_size;
struct device *parent; struct device *parent;
bool wake_enabled; bool wake_enabled;
int (*cmd_xfer)(struct cros_ec_device *ec,
struct cros_ec_command *msg);
struct mutex lock; struct mutex lock;
}; };
...@@ -152,6 +152,18 @@ int cros_ec_prepare_tx(struct cros_ec_device *ec_dev, ...@@ -152,6 +152,18 @@ int cros_ec_prepare_tx(struct cros_ec_device *ec_dev,
int cros_ec_check_result(struct cros_ec_device *ec_dev, int cros_ec_check_result(struct cros_ec_device *ec_dev,
struct cros_ec_command *msg); struct cros_ec_command *msg);
/**
* cros_ec_cmd_xfer - Send a command to the ChromeOS EC
*
* Call this to send a command to the ChromeOS EC. This should be used
* instead of calling the EC's cmd_xfer() callback directly.
*
* @ec_dev: EC device
* @msg: Message to write
*/
int cros_ec_cmd_xfer(struct cros_ec_device *ec_dev,
struct cros_ec_command *msg);
/** /**
* cros_ec_remove - Remove a ChromeOS EC * cros_ec_remove - Remove a ChromeOS EC
* *
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册