[PATCH 4/7] fix-lis302dl-issues.patch

Andy Green andy at openmoko.com
Tue Sep 23 01:17:35 CEST 2008


From: Sean McNeil <sean at mcneil.com>

Move to level from edge, fix local_save... to local_irq...
simplify bitbang sequence

Signed-off-by: Sean McNeil <sean at mcneil.com>
---

 arch/arm/mach-s3c2440/mach-gta02.c |   18 ++----------------
 drivers/input/misc/lis302dl.c      |    8 +-------
 2 files changed, 3 insertions(+), 23 deletions(-)

diff --git a/arch/arm/mach-s3c2440/mach-gta02.c b/arch/arm/mach-s3c2440/mach-gta02.c
index 1658fa0..e4b2b9e 100644
--- a/arch/arm/mach-s3c2440/mach-gta02.c
+++ b/arch/arm/mach-s3c2440/mach-gta02.c
@@ -1058,13 +1058,12 @@ void gat02_lis302dl_bitbang_read(struct lis302dl_info *lis)
 	struct lis302dl_platform_data *pdata = lis->pdata;
 	u8 shifter = 0xc0 | LIS302DL_REG_OUT_X; /* read, autoincrement */
 	int n, n1;
-	unsigned long other_cs;
 	unsigned long flags;
 #ifdef DEBUG_SPEW_MS
 	s8 x, y, z;
 #endif
 
-	local_save_flags(flags);
+	local_irq_save(flags);
 
 	/*
 	 * Huh.. "quirk"... CS on this device is not really "CS" like you can
@@ -1076,33 +1075,21 @@ void gat02_lis302dl_bitbang_read(struct lis302dl_info *lis)
 	 * ensure this is never issued.
 	 */
 
-	if (&lis302_pdata[0] == pdata)
-		other_cs = lis302_pdata[1].pin_chip_select;
-	else
-		other_cs = lis302_pdata[0].pin_chip_select;
-
-	s3c2410_gpio_setpin(other_cs, 1);
-	s3c2410_gpio_setpin(pdata->pin_chip_select, 1);
 	s3c2410_gpio_setpin(pdata->pin_clk, 1);
 	s3c2410_gpio_setpin(pdata->pin_chip_select, 0);
 	for (n = 0; n < 8; n++) { /* write the r/w, inc and address */
 		s3c2410_gpio_setpin(pdata->pin_clk, 0);
-		s3c2410_gpio_setpin(pdata->pin_mosi, (shifter >> 7) & 1);
-		s3c2410_gpio_setpin(pdata->pin_clk, 0);
+		s3c2410_gpio_setpin(pdata->pin_mosi, (shifter >> (7 - n)) & 1);
 		s3c2410_gpio_setpin(pdata->pin_clk, 1);
-		s3c2410_gpio_setpin(pdata->pin_clk, 1);
-		shifter <<= 1;
 	}
 
 	for (n = 0; n < 5; n++) { /* 5 consequetive registers */
 		for (n1 = 0; n1 < 8; n1++) { /* 8 bits each */
 			s3c2410_gpio_setpin(pdata->pin_clk, 0);
-			s3c2410_gpio_setpin(pdata->pin_clk, 0);
 			shifter <<= 1;
 			if (s3c2410_gpio_getpin(pdata->pin_miso))
 				shifter |= 1;
 			s3c2410_gpio_setpin(pdata->pin_clk, 1);
-			s3c2410_gpio_setpin(pdata->pin_clk, 1);
 		}
 		switch (n) {
 		case 0:
@@ -1126,7 +1113,6 @@ void gat02_lis302dl_bitbang_read(struct lis302dl_info *lis)
 		}
 	}
 	s3c2410_gpio_setpin(pdata->pin_chip_select, 1);
-	s3c2410_gpio_setpin(other_cs, 1);
 	local_irq_restore(flags);
 
 	input_sync(lis->input_dev);
diff --git a/drivers/input/misc/lis302dl.c b/drivers/input/misc/lis302dl.c
index 553a731..d01e153 100644
--- a/drivers/input/misc/lis302dl.c
+++ b/drivers/input/misc/lis302dl.c
@@ -274,10 +274,6 @@ static int lis302dl_input_open(struct input_dev *inp)
 	reg_set_bit_mask(lis, LIS302DL_REG_CTRL1, ctrl1, ctrl1);
 	local_irq_restore(flags);
 
-	/* kick it off -- since we are edge triggered, if we missed the edge
-	 * permanent low interrupt is death for us */
-	(lis->pdata->lis302dl_bitbang_read)(lis);
-
 	return 0;
 }
 
@@ -404,8 +400,6 @@ static int __devinit lis302dl_probe(struct spi_device *spi)
 	mdelay(1);
 
 	reg_write(lis, LIS302DL_REG_CTRL2, 0);
-	reg_write(lis, LIS302DL_REG_CTRL3, LIS302DL_CTRL3_PP_OD |
-							    LIS302DL_CTRL3_IHL);
 	reg_write(lis, LIS302DL_REG_FF_WU_THS_1, 0x14);
 	reg_write(lis, LIS302DL_REG_FF_WU_DURATION_1, 0x00);
 	reg_write(lis, LIS302DL_REG_FF_WU_CFG_1, 0x95);
@@ -436,7 +430,7 @@ static int __devinit lis302dl_probe(struct spi_device *spi)
 	lis->pdata = pdata;
 
 	rc = request_irq(lis->spi_dev->irq, lis302dl_interrupt,
-			 IRQF_TRIGGER_FALLING, "lis302dl", lis);
+			 IRQF_TRIGGER_LOW, "lis302dl", lis);
 	if (rc < 0) {
 		dev_err(&spi->dev, "error requesting IRQ %d\n",
 			lis->spi_dev->irq);




More information about the openmoko-kernel mailing list