Commit 062476f2 authored by Javier Martinez Canillas's avatar Javier Martinez Canillas Committed by Lee Jones
Browse files

mfd: cros_ec: Move protocol helpers out of the MFD driver



The MFD driver should only have the logic to instantiate its child devices
and setup any shared resources that will be used by the subdevices drivers.

The cros_ec MFD is more complex than expected since it also has helpers to
communicate with the EC. So the driver will only get more bigger as other
protocols are supported in the future. So move the communication protocol
helpers to its own driver as drivers/platform/chrome/cros_ec_proto.c.

Suggested-by: default avatarLee Jones <lee.jones@linaro.org>
Signed-off-by: default avatarJavier Martinez Canillas <javier.martinez@collabora.co.uk>
Tested-by: default avatarHeiko Stuebner <heiko@sntech.de>
Acked-by: default avatarLee Jones <lee.jones@linaro.org>
Acked-by: default avatarOlof Johansson <olof@lixom.net>
Signed-off-by: default avatarLee Jones <lee.jones@linaro.org>
parent 256ab950
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -1103,7 +1103,7 @@ config I2C_SIBYTE

config I2C_CROS_EC_TUNNEL
	tristate "ChromeOS EC tunnel I2C bus"
	depends on MFD_CROS_EC
	depends on CROS_EC_PROTO
	help
	  If you say yes here you get an I2C bus that will tunnel i2c commands
	  through to the other side of the ChromeOS EC to the i2c bus
+1 −1
Original line number Diff line number Diff line
@@ -677,7 +677,7 @@ config KEYBOARD_W90P910
config KEYBOARD_CROS_EC
	tristate "ChromeOS EC keyboard"
	select INPUT_MATRIXKMAP
	depends on MFD_CROS_EC
	depends on CROS_EC_PROTO
	help
	  Say Y here to enable the matrix keyboard used by ChromeOS devices
	  and implemented on the ChromeOS EC. You must enable one bus option
+4 −2
Original line number Diff line number Diff line
@@ -94,6 +94,8 @@ config MFD_AXP20X
config MFD_CROS_EC
	tristate "ChromeOS Embedded Controller"
	select MFD_CORE
	select CHROME_PLATFORMS
	select CROS_EC_PROTO
	help
	  If you say Y here you get support for the ChromeOS Embedded
	  Controller (EC) providing keyboard, battery and power services.
@@ -102,7 +104,7 @@ config MFD_CROS_EC

config MFD_CROS_EC_I2C
	tristate "ChromeOS Embedded Controller (I2C)"
	depends on MFD_CROS_EC && I2C
	depends on MFD_CROS_EC && CROS_EC_PROTO && I2C

	help
	  If you say Y here, you get support for talking to the ChromeOS
@@ -112,7 +114,7 @@ config MFD_CROS_EC_I2C

config MFD_CROS_EC_SPI
	tristate "ChromeOS Embedded Controller (SPI)"
	depends on MFD_CROS_EC && SPI && OF
	depends on MFD_CROS_EC && CROS_EC_PROTO && SPI && OF

	---help---
	  If you say Y here, you get support for talking to the ChromeOS EC
+0 −96
Original line number Diff line number Diff line
@@ -23,102 +23,6 @@
#include <linux/module.h>
#include <linux/mfd/core.h>
#include <linux/mfd/cros_ec.h>
#include <linux/mfd/cros_ec_commands.h>
#include <linux/delay.h>

#define EC_COMMAND_RETRIES	50

int cros_ec_prepare_tx(struct cros_ec_device *ec_dev,
		       struct cros_ec_command *msg)
{
	uint8_t *out;
	int csum, i;

	BUG_ON(msg->outsize > EC_PROTO2_MAX_PARAM_SIZE);
	out = ec_dev->dout;
	out[0] = EC_CMD_VERSION0 + msg->version;
	out[1] = msg->command;
	out[2] = msg->outsize;
	csum = out[0] + out[1] + out[2];
	for (i = 0; i < msg->outsize; i++)
		csum += out[EC_MSG_TX_HEADER_BYTES + i] = msg->data[i];
	out[EC_MSG_TX_HEADER_BYTES + msg->outsize] = (uint8_t)(csum & 0xff);

	return EC_MSG_TX_PROTO_BYTES + msg->outsize;
}
EXPORT_SYMBOL(cros_ec_prepare_tx);

int cros_ec_check_result(struct cros_ec_device *ec_dev,
			 struct cros_ec_command *msg)
{
	switch (msg->result) {
	case EC_RES_SUCCESS:
		return 0;
	case EC_RES_IN_PROGRESS:
		dev_dbg(ec_dev->dev, "command 0x%02x in progress\n",
			msg->command);
		return -EAGAIN;
	default:
		dev_dbg(ec_dev->dev, "command 0x%02x returned %d\n",
			msg->command, msg->result);
		return 0;
	}
}
EXPORT_SYMBOL(cros_ec_check_result);

int cros_ec_cmd_xfer(struct cros_ec_device *ec_dev,
		     struct cros_ec_command *msg)
{
	int ret;

	mutex_lock(&ec_dev->lock);
	ret = ec_dev->cmd_xfer(ec_dev, msg);
	if (msg->result == EC_RES_IN_PROGRESS) {
		int i;
		struct cros_ec_command *status_msg;
		struct ec_response_get_comms_status *status;

		status_msg = kmalloc(sizeof(*status_msg) + sizeof(*status),
				     GFP_KERNEL);
		if (!status_msg) {
			ret = -ENOMEM;
			goto exit;
		}

		status_msg->version = 0;
		status_msg->command = EC_CMD_GET_COMMS_STATUS;
		status_msg->insize = sizeof(*status);
		status_msg->outsize = 0;

		/*
		 * Query the EC's status until it's no longer busy or
		 * we encounter an error.
		 */
		for (i = 0; i < EC_COMMAND_RETRIES; i++) {
			usleep_range(10000, 11000);

			ret = ec_dev->cmd_xfer(ec_dev, status_msg);
			if (ret < 0)
				break;

			msg->result = status_msg->result;
			if (status_msg->result != EC_RES_SUCCESS)
				break;

			status = (struct ec_response_get_comms_status *)
				 status_msg->data;
			if (!(status->flags & EC_COMMS_STATUS_PROCESSING))
				break;
		}

		kfree(status_msg);
	}
exit:
	mutex_unlock(&ec_dev->lock);

	return ret;
}
EXPORT_SYMBOL(cros_ec_cmd_xfer);

static const struct mfd_cell cros_devs[] = {
	{
+7 −2
Original line number Diff line number Diff line
@@ -40,7 +40,7 @@ config CHROMEOS_PSTORE

config CROS_EC_CHARDEV
        tristate "Chrome OS Embedded Controller userspace device interface"
        depends on MFD_CROS_EC
        depends on CROS_EC_PROTO
        ---help---
          This driver adds support to talk with the ChromeOS EC from userspace.

@@ -49,7 +49,7 @@ config CROS_EC_CHARDEV

config CROS_EC_LPC
        tristate "ChromeOS Embedded Controller (LPC)"
        depends on MFD_CROS_EC && (X86 || COMPILE_TEST)
        depends on MFD_CROS_EC && CROS_EC_PROTO && (X86 || COMPILE_TEST)
        help
          If you say Y here, you get support for talking to the ChromeOS EC
          over an LPC bus. This uses a simple byte-level protocol with a
@@ -59,4 +59,9 @@ config CROS_EC_LPC
          To compile this driver as a module, choose M here: the
          module will be called cros_ec_lpc.

config CROS_EC_PROTO
        bool
        help
          ChromeOS EC communication protocol helpers.

endif # CHROMEOS_PLATFORMS
Loading