aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndy Ross <andy.ross@windriver.com>2010-07-26 10:05:03 +0100
committerMatthew Garrett <mjg@redhat.com>2010-08-03 09:50:32 -0400
commit6c8d0fdbe88e8bb1a07fa9a2830767cc180f7d1b (patch)
tree498f41d73ee97d633c6f7cea6a3db726eb88bc51
parentzero the stack buffer before giving random garbage to the SCU (diff)
Clean up command packing on MRST.
Don't pass more bytes in the command length field than we filled. Signed-off-by: Andy Ross <andy.ross@windriver.com> Signed-off-by: Alan Cox <alan@linux.intel.com> Signed-off-by: Matthew Garrett <mjg@redhat.com>
-rw-r--r--drivers/platform/x86/intel_scu_ipc.c29
1 files changed, 11 insertions, 18 deletions
diff --git a/drivers/platform/x86/intel_scu_ipc.c b/drivers/platform/x86/intel_scu_ipc.c
index b903420fa973..5055c523c5e2 100644
--- a/drivers/platform/x86/intel_scu_ipc.c
+++ b/drivers/platform/x86/intel_scu_ipc.c
@@ -154,7 +154,7 @@ static inline int busy_loop(void) /* Wait till scu status is busy */
/* Read/Write power control(PMIC in Langwell, MSIC in PenWell) registers */
static int pwr_reg_rdwr(u16 *addr, u8 *data, u32 count, u32 op, u32 id)
{
- int nc;
+ int i, nc, bytes;
u32 offset = 0;
u32 err = 0;
u8 cbuf[IPC_WWBUF_SIZE] = { };
@@ -170,25 +170,18 @@ static int pwr_reg_rdwr(u16 *addr, u8 *data, u32 count, u32 op, u32 id)
}
if (platform != MRST_CPU_CHIP_PENWELL) {
- /* Entry is 4 bytes for read/write, 5 bytes for read modify */
- for (nc = 0; nc < count; nc++, offset += 3) {
- cbuf[offset] = addr[nc];
- cbuf[offset + 1] = addr[nc] >> 8;
+ bytes = 0;
+ for(i=0; i<count; i++) {
+ cbuf[bytes++] = addr[i];
+ cbuf[bytes++] = addr[i] >> 8;
if (id != IPC_CMD_PCNTRL_R)
- cbuf[offset + 2] = data[nc];
- if (id == IPC_CMD_PCNTRL_M) {
- cbuf[offset + 3] = data[nc + 1];
- offset += 1;
- }
+ cbuf[bytes++] = data[i];
+ if (id == IPC_CMD_PCNTRL_M)
+ cbuf[bytes++] = data[i + 1];
}
- for (nc = 0, offset = 0; nc < count; nc++, offset += 4)
- ipc_data_writel(wbuf[nc], offset); /* Write wbuff */
-
- if (id != IPC_CMD_PCNTRL_M)
- ipc_command((count*4) << 16 | id << 12 | 0 << 8 | op);
- else
- ipc_command((count*5) << 16 | id << 12 | 0 << 8 | op);
-
+ for(i=0; i<bytes; i+=4)
+ ipc_data_writel(wbuf[i/4], i);
+ ipc_command(bytes << 16 | id << 12 | 0 << 8 | op);
} else {
for (nc = 0; nc < count; nc++, offset += 2) {
cbuf[offset] = addr[nc];