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: Andrew Bresticker <abrestic@chromium.org> Reviewed-by: Simon Glass <sjg@chromium.org> Signed-off-by: Javier Martinez Canillas <javier.martinez@collabora.co.uk> Reviewed-by: Doug Anderson <dianders@chromium.org> Signed-off-by: Lee Jones <lee.jones@linaro.org>
This commit is contained in:
committed by
Lee Jones
parent
659e142be0
commit
a6551a76ff
@@ -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)
|
|||||||
.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,
|
|||||||
}
|
}
|
||||||
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 {
|
|||||||
* @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 {
|
|||||||
* @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 {
|
|||||||
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 {
|
|||||||
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,
|
|||||||
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
|
||||||
*
|
*
|
||||||
|
|||||||
Reference in New Issue
Block a user