diff options
author | Brian Wood <brian.j.wood@intel.com> | 2015-10-02 11:11:06 -0700 |
---|---|---|
committer | Brian Wood <brian.j.wood@intel.com> | 2015-10-06 13:07:22 -0700 |
commit | 0b247ec2a0e8a2e5509064a222ba1cf9cac977bd (patch) | |
tree | 1ff346329ad0f56b1712bb929e6a72df790b3f34 | |
parent | d9c7b6e6842c49936f3dec06b4d6962ed4874f78 (diff) | |
download | edison-v3.10-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.h | 4 | ||||
-rw-r--r-- | drivers/platform/x86/intel_scu_ipc.c | 53 |
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(); |