Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a6551a76 authored by Andrew Bresticker's avatar Andrew Bresticker Committed by Lee Jones
Browse files

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: default avatarAndrew Bresticker <abrestic@chromium.org>
Reviewed-by: default avatarSimon Glass <sjg@chromium.org>
Signed-off-by: default avatarJavier Martinez Canillas <javier.martinez@collabora.co.uk>
Reviewed-by: default avatarDoug Anderson <dianders@chromium.org>
Signed-off-by: default avatarLee Jones <lee.jones@linaro.org>
parent 659e142b
Loading
Loading
Loading
Loading
+1 −1
Original line number Original line Diff line number Diff line
@@ -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;


+1 −1
Original line number Original line Diff line number Diff line
@@ -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)
+7 −0
Original line number Original line Diff line number Diff line
@@ -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",
+18 −6
Original line number Original line Diff line number Diff line
@@ -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
 *
 *