aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/mfd/cros_ec.c
diff options
context:
space:
mode:
authorJavier Martinez Canillas <javier.martinez@collabora.co.uk>2015-06-09 07:04:44 -0400
committerLee Jones <lee.jones@linaro.org>2015-06-15 08:18:20 -0400
commit062476f24aa7cf714169342cc50626fd9bbb93da (patch)
tree5af8fcb6bacea36579c79929a57b572d14982691 /drivers/mfd/cros_ec.c
parent256ab950bdaa8797b7bac8fc11a567030d486304 (diff)
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: Lee Jones <lee.jones@linaro.org> Signed-off-by: Javier Martinez Canillas <javier.martinez@collabora.co.uk> Tested-by: Heiko Stuebner <heiko@sntech.de> Acked-by: Lee Jones <lee.jones@linaro.org> Acked-by: Olof Johansson <olof@lixom.net> Signed-off-by: Lee Jones <lee.jones@linaro.org>
Diffstat (limited to 'drivers/mfd/cros_ec.c')
-rw-r--r--drivers/mfd/cros_ec.c96
1 files changed, 0 insertions, 96 deletions
diff --git a/drivers/mfd/cros_ec.c b/drivers/mfd/cros_ec.c
index 4a0f6dfcd376..d857f6a2b57b 100644
--- a/drivers/mfd/cros_ec.c
+++ b/drivers/mfd/cros_ec.c
@@ -23,102 +23,6 @@
23#include <linux/module.h> 23#include <linux/module.h>
24#include <linux/mfd/core.h> 24#include <linux/mfd/core.h>
25#include <linux/mfd/cros_ec.h> 25#include <linux/mfd/cros_ec.h>
26#include <linux/mfd/cros_ec_commands.h>
27#include <linux/delay.h>
28
29#define EC_COMMAND_RETRIES 50
30
31int cros_ec_prepare_tx(struct cros_ec_device *ec_dev,
32 struct cros_ec_command *msg)
33{
34 uint8_t *out;
35 int csum, i;
36
37 BUG_ON(msg->outsize > EC_PROTO2_MAX_PARAM_SIZE);
38 out = ec_dev->dout;
39 out[0] = EC_CMD_VERSION0 + msg->version;
40 out[1] = msg->command;
41 out[2] = msg->outsize;
42 csum = out[0] + out[1] + out[2];
43 for (i = 0; i < msg->outsize; i++)
44 csum += out[EC_MSG_TX_HEADER_BYTES + i] = msg->data[i];
45 out[EC_MSG_TX_HEADER_BYTES + msg->outsize] = (uint8_t)(csum & 0xff);
46
47 return EC_MSG_TX_PROTO_BYTES + msg->outsize;
48}
49EXPORT_SYMBOL(cros_ec_prepare_tx);
50
51int cros_ec_check_result(struct cros_ec_device *ec_dev,
52 struct cros_ec_command *msg)
53{
54 switch (msg->result) {
55 case EC_RES_SUCCESS:
56 return 0;
57 case EC_RES_IN_PROGRESS:
58 dev_dbg(ec_dev->dev, "command 0x%02x in progress\n",
59 msg->command);
60 return -EAGAIN;
61 default:
62 dev_dbg(ec_dev->dev, "command 0x%02x returned %d\n",
63 msg->command, msg->result);
64 return 0;
65 }
66}
67EXPORT_SYMBOL(cros_ec_check_result);
68
69int cros_ec_cmd_xfer(struct cros_ec_device *ec_dev,
70 struct cros_ec_command *msg)
71{
72 int ret;
73
74 mutex_lock(&ec_dev->lock);
75 ret = ec_dev->cmd_xfer(ec_dev, msg);
76 if (msg->result == EC_RES_IN_PROGRESS) {
77 int i;
78 struct cros_ec_command *status_msg;
79 struct ec_response_get_comms_status *status;
80
81 status_msg = kmalloc(sizeof(*status_msg) + sizeof(*status),
82 GFP_KERNEL);
83 if (!status_msg) {
84 ret = -ENOMEM;
85 goto exit;
86 }
87
88 status_msg->version = 0;
89 status_msg->command = EC_CMD_GET_COMMS_STATUS;
90 status_msg->insize = sizeof(*status);
91 status_msg->outsize = 0;
92
93 /*
94 * Query the EC's status until it's no longer busy or
95 * we encounter an error.
96 */
97 for (i = 0; i < EC_COMMAND_RETRIES; i++) {
98 usleep_range(10000, 11000);
99
100 ret = ec_dev->cmd_xfer(ec_dev, status_msg);
101 if (ret < 0)
102 break;
103
104 msg->result = status_msg->result;
105 if (status_msg->result != EC_RES_SUCCESS)
106 break;
107
108 status = (struct ec_response_get_comms_status *)
109 status_msg->data;
110 if (!(status->flags & EC_COMMS_STATUS_PROCESSING))
111 break;
112 }
113
114 kfree(status_msg);
115 }
116exit:
117 mutex_unlock(&ec_dev->lock);
118
119 return ret;
120}
121EXPORT_SYMBOL(cros_ec_cmd_xfer);
122 26
123static const struct mfd_cell cros_devs[] = { 27static const struct mfd_cell cros_devs[] = {
124 { 28 {