From mboxrd@z Thu Jan 1 00:00:00 1970 From: Alan Cox Subject: [PATCH 5/6] fix channel allocation in the touch screen driver Date: Fri, 23 Jul 2010 14:52:30 +0100 Message-ID: <20100723135228.19151.8558.stgit@localhost.localdomain> References: <20100723134852.19151.6999.stgit@localhost.localdomain> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit Return-path: Received: from mga09.intel.com ([134.134.136.24]:41747 "EHLO mga09.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1760231Ab0GWOY5 (ORCPT ); Fri, 23 Jul 2010 10:24:57 -0400 In-Reply-To: <20100723134852.19151.6999.stgit@localhost.localdomain> Sender: linux-input-owner@vger.kernel.org List-Id: linux-input@vger.kernel.org To: greg@kroah.com, linux-input@vger.kernel.org, dmitry.torokhov@gmail.com From: Arjan van de Ven the touch screen driver tries to find a range of free channels (which are an array of bytes), by scanning for the "end of used channel" marker. however it tries to be WAAAAY too smart and does 32 bit logic on 8 bit quantities, and in the process completely gets it wrong (repeatedly read the same register instead of incrementing in the loop, assuming that if any of the 4 bytes in the 32 byte quantity is free, all four are free, returning the channel number divided by 4 rather than the actual first free channel number) On the setting side, the same mistakes are made by and large; changed this to just use the byte SCU write functions.... with these fixes we go from a completely non detected touchscreen to something that appears to completely get detected. (after also fixing the ordering issue that Jacobs patch should solve) Signed-off-by: Arjan van de Ven Signed-off-by: Alan Cox --- drivers/staging/mrst-touchscreen/intel-mid-touch.c | 29 ++++++++------------ 1 files changed, 12 insertions(+), 17 deletions(-) diff --git a/drivers/staging/mrst-touchscreen/intel-mid-touch.c b/drivers/staging/mrst-touchscreen/intel-mid-touch.c index db286eb..760bc7b 100644 --- a/drivers/staging/mrst-touchscreen/intel-mid-touch.c +++ b/drivers/staging/mrst-touchscreen/intel-mid-touch.c @@ -496,8 +496,8 @@ static int __devinit mrstouch_read_pmic_id(uint *vendor, uint *rev) */ static int __devinit mrstouch_chan_parse(struct mrstouch_dev *tsdev) { - int err, i, j, found; - u32 r32; + int err, i, found; + u8 r8; found = -1; @@ -505,15 +505,13 @@ static int __devinit mrstouch_chan_parse(struct mrstouch_dev *tsdev) if (found >= 0) break; - err = intel_scu_ipc_ioread32(PMICADDR0, &r32); + err = intel_scu_ipc_ioread8(PMICADDR0 + i, &r8); if (err) return err; - for (j = 0; j < 32; j+= 8) { - if (((r32 >> j) & 0xFF) == END_OF_CHANNEL) { - found = i; - break; - } + if (r8 == END_OF_CHANNEL) { + found = i; + break; } } if (found < 0) @@ -535,20 +533,17 @@ static int __devinit mrstouch_chan_parse(struct mrstouch_dev *tsdev) */ static int __devinit mrstouch_ts_chan_set(uint offset) { - int count; u16 chan; - u16 reg[5]; - u8 data[5]; + + int ret, count; chan = PMICADDR0 + offset; for (count = 0; count <= 3; count++) { - reg[count] = chan++; - data[count] = MRST_TS_CHAN10 + count; + ret = intel_scu_ipc_iowrite8(chan++, MRST_TS_CHAN10 + count); + if (ret) + return ret; } - reg[count] = chan; - data[count] = END_OF_CHANNEL; - - return intel_scu_ipc_writev(reg, data, 5); + return intel_scu_ipc_iowrite8(chan++, END_OF_CHANNEL); } /* Initialize ADC */