summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrian Wood <brian.j.wood@intel.com>2015-10-02 11:11:06 -0700
committerBrian Wood <brian.j.wood@intel.com>2015-10-06 13:07:22 -0700
commit0b247ec2a0e8a2e5509064a222ba1cf9cac977bd (patch)
tree1ff346329ad0f56b1712bb929e6a72df790b3f34
parentd9c7b6e6842c49936f3dec06b4d6962ed4874f78 (diff)
downloadintel-0b247ec2a0e8a2e5509064a222ba1cf9cac977bd.tar.gz
Adjust Intel SCU and Watchdog drivers for Edison
This workaround adjusts the Intel SCU code to align with what the upstream Intel MID watchdog driver expects to function appropriately with userspace watchdog daemon's Change-Id: Iff8dcb18e802e1acbac30dff7c2107ae181bf3ee Signed-off-by: Brian Wood <brian.j.wood@intel.com>
-rw-r--r--arch/x86/include/asm/intel_scu_ipc.h4
-rw-r--r--drivers/platform/x86/intel_scu_ipc.c53
2 files changed, 13 insertions, 44 deletions
diff --git a/arch/x86/include/asm/intel_scu_ipc.h b/arch/x86/include/asm/intel_scu_ipc.h
index 3055f5147ef..e10f5ae329b 100644
--- a/arch/x86/include/asm/intel_scu_ipc.h
+++ b/arch/x86/include/asm/intel_scu_ipc.h
@@ -64,8 +64,8 @@ int intel_scu_ipc_check_status(void);
/* Issue commands to the SCU with or without data */
int intel_scu_ipc_simple_command(int cmd, int sub);
-int intel_scu_ipc_command(u32 cmd, u32 sub, u8 *in, u32 inlen,
- u32 *out, u32 outlen);
+int intel_scu_ipc_command(int cmd, int sub, u32 *in, int inlen,
+ u32 *out, int outlen);
/* I2C control api */
int intel_scu_ipc_i2c_cntrl(u32 addr, u32 *data);
diff --git a/drivers/platform/x86/intel_scu_ipc.c b/drivers/platform/x86/intel_scu_ipc.c
index d8d251f05f9..f19ad213672 100644
--- a/drivers/platform/x86/intel_scu_ipc.c
+++ b/drivers/platform/x86/intel_scu_ipc.c
@@ -339,11 +339,10 @@ EXPORT_SYMBOL(intel_scu_ipc_simple_command);
* data copies under the lock but leave it for the caller to interpret
* Note: This function should be called with the holding of ipclock
*/
-int intel_scu_ipc_raw_cmd(u32 cmd, u32 sub, u8 *in, u32 inlen, u32 *out,
- u32 outlen, u32 dptr, u32 sptr)
+int intel_scu_ipc_raw_cmd(int cmd, int sub, u32 *in, int inlen, u32 *out,
+ int outlen, u32 dptr, u32 sptr)
{
int i, err;
- u32 wbuf[4] = { 0 };
if (ipcdev.pdev == NULL)
return -ENODEV;
@@ -351,53 +350,23 @@ int intel_scu_ipc_raw_cmd(u32 cmd, u32 sub, u8 *in, u32 inlen, u32 *out,
if (inlen > 16)
return -EINVAL;
- memcpy(wbuf, in, inlen);
-
- writel(dptr, ipcdev.ipc_base + IPC_DPTR_ADDR);
- writel(sptr, ipcdev.ipc_base + IPC_SPTR_ADDR);
-
- /**
- * SRAM controller doesn't support 8bit write, it only supports
- * 32bit write, so we have to write into the WBUF in 32bit,
- * and SCU FW will use the inlen to determine the actual input
- * data length in the WBUF.
- */
- for (i = 0; i < ((inlen + 3) / 4); i++)
- ipc_data_writel(wbuf[i], 4 * i);
-
- /**
- * Watchdog IPC command is an exception here using double word
- * as the unit of input data size because of historical reasons
- * and SCU FW is doing so.
- */
- if ((cmd & 0xFF) == IPCMSG_WATCHDOG_TIMER)
- inlen = (inlen + 3) / 4;
- /*
- * In case of 3 pmic writes or read-modify-writes
- * there are holes in the middle of the buffer which are
- * ignored by SCU. These bytes should not be included into
- * size of the ipc msg. Holes are as follows:
- * write: wbuf[6 & 7]
- * read-modifu-write: wbuf[6 & 7 & 11]
- */
- else if ((cmd & 0xFF) == IPCMSG_PCNTRL) {
- if (sub == IPC_CMD_PCNTRL_W && inlen == 11)
- inlen -= 2;
- else if (sub == IPC_CMD_PCNTRL_M && inlen == 15)
- inlen -= 3;
- }
+ for (i = 0; i < inlen; i++)
+ ipc_data_writel(*in++, 4 * i);
+
intel_scu_ipc_send_command((inlen << 16) | (sub << 12) | cmd);
err = intel_scu_ipc_check_status();
- for (i = 0; i < outlen; i++)
- *out++ = ipc_data_readl(4 * i);
+ if (!err) {
+ for (i = 0; i < outlen; i++)
+ *out++ = ipc_data_readl(4 * i);
+ }
return err;
}
EXPORT_SYMBOL_GPL(intel_scu_ipc_raw_cmd);
-int intel_scu_ipc_command(u32 cmd, u32 sub, u8 *in, u32 inlen,
- u32 *out, u32 outlen)
+int intel_scu_ipc_command(int cmd, int sub, u32 *in, int inlen,
+ u32 *out, int outlen)
{
int ret;
intel_scu_ipc_lock();