2
0
mirror of https://github.com/edk2-porting/linux-next.git synced 2024-12-28 15:13:55 +08:00
linux-next/drivers/mfd
Sebastian Andrzej Siewior 7ca6740cd1 mfd: input: iio: ti_amm335x: Rework TSC/ADC synchronization
The ADC driver always programs all possible ADC values and discards
them except for the value IIO asked for. On the am335x-evm the driver
programs four values and it takes 500us to gather them. Reducing the number
of conversations down to the (required) one also reduces the busy loop down
to 125us.

This leads to another error, namely the FIFOCOUNT register is sometimes
(like one out of 10 attempts) not updated in time leading to EBUSY.
The next read has the FIFOCOUNT register updated.
Checking for the ADCSTAT register for being idle isn't a good choice either.
The problem is that if TSC is used at the same time, the HW completes the
conversation for ADC *and* before the driver noticed it, the HW begins to
perform a TSC conversation and so the driver never seen the HW idle. The
next time we would have two values in the FIFO but since the driver reads
everything we always see the current one.
So instead of polling for the IDLE bit in ADCStatus register, we should
check the FIFOCOUNT register. It should be one instead of zero because we
request one value.

This change in turn leads to another error. Sometimes if TSC & ADC are
used together the TSC starts generating interrupts even if nobody
actually touched the touchscreen. The interrupts seem valid because TSC's
FIFO is filled with values for each channel of the TSC. This condition stops
after a few ADC reads but will occur again. Not good.

On top of this (even without the changes I just mentioned) there is a ADC
& TSC lockup condition which was reported to me by Jeff Lance including the
following test case:
A busy loop of "cat /sys/bus/iio/devices/iio\:device0/in_voltage4_raw"
and a mug on touch screen. With this setup, the hardware will lockup after
something between 20 minutes and it could take up to a couple of hours.
During that lockup, the ADCSTAT register says 0x30 (or 0x70) which means
STEP_ID = IDLE and FSM_BUSY = yes. That means the hardware says that it is
idle and busy at the same time which is an invalid condition.

For all this reasons I decided to rework this TSC/ADC part and add a
handshake / synchronization here:
First the ADC signals that it needs the HW and writes a 0 mask into the
SE register. The HW (if active) will complete the current conversation
and become idle. The TSC driver will gather the values from the FIFO
(woken up by an interrupt) and won't "enable" another conversation.
Instead it will wake up the ADC driver which is already waiting. The ADC
driver will start "its" conversation and once it is done, it will
enable the TSC steps so the TSC will work again.

After this rework I haven't observed the lockup so far. Plus the busy
loop has been reduced from 500us to 125us.

The continues-read mode remains unchanged.

Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Acked-by: Jonathan Cameron <jic23@kernel.org>
Signed-off-by: Lee Jones <lee.jones@linaro.org>
2014-01-07 08:45:00 +00:00
..
88pm80x.c mfd: 88pm80x: Change chip id definition and detection 2013-06-18 09:41:10 +02:00
88pm800.c mfd: 88pm800: Fix potential NULL pdata dereference 2013-09-02 10:59:57 +02:00
88pm805.c mfd: 88pm805: Fix potential NULL pdata dereference 2013-09-02 11:00:16 +02:00
88pm860x-core.c mfd: 88pm860x: Remove redundant of_match_ptr 2013-10-23 16:21:53 +01:00
88pm860x-i2c.c mfd: Convert struct i2c_msg initialization to C99 format 2012-09-21 23:40:34 +02:00
aat2870-core.c mfd: aat2870: Fix sparse error 2013-10-23 16:20:44 +01:00
ab3100-core.c mfd: Use dev_get_platdata() 2013-07-31 13:01:29 +01:00
ab3100-otp.c mfd: ab3100-otp: Convert to managed resources for allocating memory 2013-06-13 12:11:39 +02:00
ab8500-core.c mfd: ab8500-core: Add AB8500 external regulators as MFD devices 2013-06-13 10:52:00 +01:00
ab8500-debugfs.c mfd: ab8500-debugfs: Apply a check for -ENOMEM after allocating memory for event name 2013-09-02 10:22:44 +01:00
ab8500-gpadc.c mfd: ab8500-gpadc: Add CONFIG_PM_SLEEP to suspend/resume 2013-08-14 18:52:51 +01:00
ab8500-sysctrl.c mfd: ab8500-sysctrl: Let sysctrl driver work without pdata 2013-05-21 23:23:21 +02:00
abx500-core.c mfd: abx500-core: Convert to managed resources for allocating memory 2013-06-13 12:11:41 +02:00
adp5520.c mfd: Use dev_get_platdata() 2013-07-31 13:01:29 +01:00
arizona-core.c For the 3.13 merge window we have a couple of new drivers for the AMS 2013-11-15 16:37:40 -08:00
arizona-i2c.c mfd: arizona: Include linux/of.h header 2013-10-23 16:22:06 +01:00
arizona-irq.c mfd: arizona: Integrate wm8997 into Arizona mfd 2013-06-18 00:49:52 +02:00
arizona-spi.c mfd: arizona: Include linux/of.h header 2013-10-23 16:22:06 +01:00
arizona.h mfd: arizona: Integrate wm8997 into Arizona mfd 2013-06-18 00:49:52 +02:00
as3711.c mfd: as3711: Include linux/of.h header 2013-10-23 16:22:03 +01:00
as3722.c mfd: as3722: Don't export the regmap config 2013-10-26 00:28:21 +02:00
asic3.c mfd: Use dev_get_platdata() 2013-07-31 13:01:29 +01:00
cros_ec_i2c.c mfd: Add ChromeOS EC I2C driver 2013-04-05 11:20:13 +02:00
cros_ec_spi.c mfd: cros_ec_spi: Use %z to format pointer differences 2013-05-16 19:14:06 +02:00
cros_ec.c mfd: cros_ec: Convert to managed resources for allocating memory 2013-06-13 12:11:42 +02:00
cs5535-mfd.c mfd: remove use of __devexit 2012-11-28 12:22:27 -08:00
da903x.c mfd: Use dev_get_platdata() 2013-07-31 13:01:29 +01:00
da9052-core.c mfd: Use dev_get_platdata() 2013-07-31 13:01:29 +01:00
da9052-i2c.c mfd: da9052: Avoid multiwrite mode due to silicon errata 2013-10-23 16:20:32 +01:00
da9052-irq.c mfd: da9052: Introduce da9052-irq.c 2012-11-20 12:21:10 +01:00
da9052-spi.c mfd: da9052: Use spi_get_drvdata() and spi_set_drvdata() 2013-04-09 12:18:16 +02:00
da9055-core.c mfd: Use dev_get_platdata() 2013-07-31 13:01:29 +01:00
da9055-i2c.c mfd: Update DA9055 i2c device id name 2013-07-31 02:02:54 +02:00
da9063-core.c mfd: da9063: Add IRQ support 2013-08-20 03:16:00 +02:00
da9063-i2c.c mfd: da9063: Add Dialog DA9063 core driver 2013-08-20 03:15:52 +02:00
da9063-irq.c mfd: da9063: Add IRQ support 2013-08-20 03:16:00 +02:00
davinci_voicecodec.c mfd: davinci_voicecodec: Provide a regmap for register I/O 2013-09-02 10:27:49 +02:00
db8500-prcmu.c mfd: dbx500: Remove any mention of the BML8580CLK 2013-09-26 11:04:16 +02:00
dbx500-prcmu-regs.h mfd: dbx500: Remove any mention of the BML8580CLK 2013-09-26 11:04:16 +02:00
dm355evm_msp.c mfd: Use dev_get_platdata() 2013-07-31 13:01:29 +01:00
ezx-pcap.c mfd: ezx-pcap: Drop devm_free_irq of devm_ allocated irq 2013-10-23 16:21:17 +01:00
htc-egpio.c mfd: Use dev_get_platdata() 2013-07-31 13:01:29 +01:00
htc-i2cpld.c mfd: Use dev_get_platdata() 2013-07-31 13:01:29 +01:00
htc-pasic3.c mfd: Use dev_get_platdata() 2013-07-31 13:01:29 +01:00
intel_msic.c mfd: Use dev_get_platdata() 2013-07-31 13:01:29 +01:00
janz-cmodio.c mfd: janz-cmodio: Convert to managed resources for allocating memory 2013-06-13 12:11:44 +02:00
jz4740-adc.c mfd: jz4740-adc: Use clk_prepare_enable/clk_disable_unprepare 2013-06-11 19:36:59 +02:00
Kconfig Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jikos/trivial 2013-11-15 16:47:22 -08:00
kempld-core.c mfd: Add support for COMe-bHL6 and COMe-cTH6 to Kontron PLD driver 2013-08-14 18:53:19 +01:00
lm3533-core.c mfd: Use dev_get_platdata() 2013-07-31 13:01:29 +01:00
lm3533-ctrlbank.c
lp8788-irq.c mfd: Add lp8788 mfd driver 2012-09-23 20:51:34 +02:00
lp8788.c mfd: Use dev_get_platdata() 2013-07-31 13:01:29 +01:00
lpc_ich.c mfd: lpc_ich: Add Device IDs for Intel Wildcat Point-LP PCH 2013-11-04 18:38:00 +01:00
lpc_sch.c mfd: lpc_sch: Ignore resource conflicts when adding mfd cells 2013-10-23 16:22:40 +01:00
Makefile mfd: Add support for ams AS3722 PMIC 2013-10-23 16:22:33 +01:00
max8907.c mfd: max8907: Include linux/of.h header 2013-10-23 16:22:20 +01:00
max8925-core.c mfd: max8925: Fix onkey driver irq base 2013-02-14 00:23:00 +01:00
max8925-i2c.c mfd: max8925: Remove redundant of_match_ptr 2013-10-23 16:21:49 +01:00
max8997-irq.c
max8997.c mfd: max8997: Include linux/of.h header 2013-10-23 16:22:18 +01:00
max8998-irq.c mfd: max8998: Add irq domain support 2013-06-30 23:29:44 +02:00
max8998.c mfd: max8998: Use devm_*() functions 2013-08-20 08:51:23 +01:00
max77686-irq.c mfd: Allow to specify max77686 interrupt through DT or platform file also 2012-07-09 15:13:42 +02:00
max77686.c mfd: max77686: Include linux/of.h header 2013-10-23 16:22:23 +01:00
max77693-irq.c mfd: max77693: Fix up bug of wrong interrupt number 2013-11-04 09:41:19 +01:00
max77693.c mfd: max77693: Include linux/of.h header 2013-10-23 16:22:30 +01:00
mc13xxx-core.c mfd: mc13xxx: Don't require lock for simple register I/O 2013-10-23 16:21:22 +01:00
mc13xxx-i2c.c mfd: mc12xx-i2c: rtsx_pcr: ti-ssp: Remove redundant dev_set_drvdata 2013-10-23 16:21:07 +01:00
mc13xxx-spi.c mfd: mc13xxx: Move SPI erratum workaround into SPI I/O function 2013-10-23 16:21:24 +01:00
mc13xxx.h mfd: mc13xxx: Add support for mc34708 2012-11-06 23:14:08 +01:00
mcp-core.c
mcp-sa11x0.c mfd: Use dev_get_platdata() 2013-07-31 13:01:29 +01:00
menelaus.c mfd: menelaus: Use devm_*() functions 2013-08-20 08:51:32 +01:00
mfd-core.c For the 3.13 merge window we have a couple of new drivers for the AMS 2013-11-15 16:37:40 -08:00
omap-usb-host.c mfd: omap-usb: prepare/unprepare clock while enable/disable 2013-10-23 16:22:25 +01:00
omap-usb-tll.c mfd: omap-usb: prepare/unprepare clock while enable/disable 2013-10-23 16:22:25 +01:00
omap-usb.h mfd: omap-usb-tll: Move configuration code to omap_tll_init() 2013-04-09 09:46:23 +02:00
palmas.c mfd: palmas: Remove redundant of_match_ptr 2013-10-23 16:22:01 +01:00
pcf50633-adc.c mfd: pcf50633-adc: Use devm_*() functions 2013-08-20 09:27:35 +01:00
pcf50633-core.c mfd: Use dev_get_platdata() 2013-07-31 13:01:29 +01:00
pcf50633-gpio.c
pcf50633-irq.c
pm8xxx-irq.c mfd: remove use of __devexit 2012-11-28 12:22:27 -08:00
pm8921-core.c mfd: pm8921: Potential NULL dereference in pm8921_remove() 2013-11-11 11:22:19 +00:00
rc5t583-irq.c mfd: rc5t583: Fix array subscript is above array bounds 2012-11-26 12:10:51 +01:00
rc5t583.c mfd: Use dev_get_platdata() 2013-07-31 13:01:29 +01:00
rdc321x-southbridge.c mfd: remove use of __devexit 2012-11-28 12:22:27 -08:00
retu-mfd.c mfd: retu: Add Tahvo support 2013-04-19 00:45:20 +02:00
rtl8411.c mfd: mmc: rtsx: Change default tx phase 2013-08-30 14:24:07 +02:00
rts5209.c mfd: mmc: rtsx: Change default tx phase 2013-08-30 14:24:07 +02:00
rts5227.c For the 3.12 merge window we have one new driver for the DA9063 PMIC 2013-09-07 20:14:19 -07:00
rts5229.c mfd: mmc: rtsx: Change default tx phase 2013-08-30 14:24:07 +02:00
rts5249.c mfd: rtsx: Modify rts5249_optimize_phy 2013-10-23 16:20:59 +01:00
rtsx_pcr.c mfd: mc12xx-i2c: rtsx_pcr: ti-ssp: Remove redundant dev_set_drvdata 2013-10-23 16:21:07 +01:00
rtsx_pcr.h mfd: rtsx: Copyright modifications 2013-08-20 10:22:01 +02:00
sec-core.c mfd: sec-core: Include linux/of.h header 2013-10-23 16:22:15 +01:00
sec-irq.c mfd: sec: Fix reg_offset for interrupt registers 2012-11-26 00:35:08 +01:00
si476x-cmd.c mfd: si476x: Use get_unaligned_be16() for unaligned be16 loads 2013-05-16 19:15:07 +02:00
si476x-i2c.c mfd: Use dev_get_platdata() 2013-07-31 13:01:29 +01:00
si476x-prop.c mfd: si476x: Add chip properties handling code 2013-04-19 18:37:59 +02:00
sm501.c mfd: sm501: Remove unnecessary pci_set_drvdata() 2013-10-23 16:20:54 +01:00
smsc-ece1099.c mfd: smsc: Add support for smsc gpio io/keypad driver 2012-10-01 15:27:48 +02:00
ssbi.c mfd: ssbi: Use devm_* and simplify code 2013-06-18 09:41:15 +02:00
sta2x11-mfd.c mfd: Use dev_get_platdata() 2013-07-31 13:01:29 +01:00
stmpe-i2c.c mfd: support stmpe1801 18 bits enhanced port expander 2013-04-09 14:15:58 +02:00
stmpe-spi.c mfd: stmpe: Use spi_get_drvdata() 2013-04-09 12:18:16 +02:00
stmpe.c mfd: stmpe: Staticise stmpe_of_probe() 2013-07-31 13:01:45 +01:00
stmpe.h mfd: support stmpe1801 18 bits enhanced port expander 2013-04-09 14:15:58 +02:00
stw481x.c mfd: Add STw481x driver 2013-10-23 16:21:12 +01:00
syscon.c For the 3.12 merge window we have one new driver for the DA9063 PMIC 2013-09-07 20:14:19 -07:00
t7l66xb.c mfd: Use dev_get_platdata() 2013-07-31 13:01:29 +01:00
tc3589x.c mfd: tc3589x: Detect the precise version 2013-10-23 16:22:28 +01:00
tc6387xb.c mfd: Use dev_get_platdata() 2013-07-31 13:01:29 +01:00
tc6393xb.c mfd: Use dev_get_platdata() 2013-07-31 13:01:29 +01:00
ti_am335x_tscadc.c mfd: input: iio: ti_amm335x: Rework TSC/ADC synchronization 2014-01-07 08:45:00 +00:00
ti-ssp.c mfd: mc12xx-i2c: rtsx_pcr: ti-ssp: Remove redundant dev_set_drvdata 2013-10-23 16:21:07 +01:00
timberdale.c mfd: timberdale: Remove unnecessary pci_set_drvdata() 2013-10-23 16:20:56 +01:00
timberdale.h
tmio_core.c
tps6105x.c mfd: Use dev_get_platdata() 2013-07-31 13:01:29 +01:00
tps6507x.c mfd: tps6507x: Include linux/of.h header 2013-10-23 16:22:13 +01:00
tps6586x.c mfd: tps6586x: Include linux/of.h header 2013-10-23 16:22:10 +01:00
tps65010.c mfd: tps65010: Use devm_*() functions 2013-08-20 08:51:48 +01:00
tps65090.c mfd: Use dev_get_platdata() 2013-07-31 13:01:29 +01:00
tps65217.c mfd: tps65217: Remove redundant of_match_ptr 2013-10-23 16:21:51 +01:00
tps65910.c mfd-lee-3.13-1 2013-10-25 11:03:48 +02:00
tps65911-comparator.c mfd: remove use of __devexit 2012-11-28 12:22:27 -08:00
tps65912-core.c mfd: Use dev_get_platdata() 2013-07-31 13:01:29 +01:00
tps65912-i2c.c mfd: tps65912: Convert to managed resources for allocating memory 2013-06-13 12:11:39 +02:00
tps65912-irq.c
tps65912-spi.c mfd: tps65912: Convert to managed resources for allocating memory 2013-06-13 12:11:39 +02:00
tps80031.c mfd: Use dev_get_platdata() 2013-07-31 13:01:29 +01:00
twl4030-audio.c mfd: Use dev_get_platdata() 2013-07-31 13:01:29 +01:00
twl4030-irq.c For the 3.11 merge we only have one new MFD driver for the Kontron PLD. 2013-07-10 11:10:27 -07:00
twl4030-madc.c mfd: Use dev_get_platdata() 2013-07-31 13:01:29 +01:00
twl4030-power.c mfd: twl4030-power: Staticize local functions 2013-08-01 09:55:33 +01:00
twl6030-irq.c mfd: twl6030-irq: Add interrupt mapping table for the twl6032 2013-08-20 10:19:38 +02:00
twl6040.c mfd-lee-3.13-1 2013-10-25 11:03:48 +02:00
twl-core.c mfd: Use dev_get_platdata() 2013-07-31 13:01:29 +01:00
twl-core.h
ucb1x00-assabet.c
ucb1x00-core.c mfd: ucb1x00-core: Fix error return code in ucb1x00_probe() 2013-10-23 16:20:49 +01:00
ucb1x00-ts.c
ucb1400_core.c mfd: Use dev_get_platdata() 2013-07-31 13:01:29 +01:00
vexpress-config.c mfd: vexpress: Handle pending config transactions 2013-04-26 16:10:03 +02:00
vexpress-sysreg.c mfd: vexpress: Make the driver optional for arm and arm64 2013-06-19 11:32:00 +02:00
viperboard.c mfd: viperboard: Do version query in dma memory 2012-11-26 11:48:56 +01:00
vx855.c mfd: remove use of __devexit 2012-11-28 12:22:27 -08:00
wl1273-core.c mfd: wl1273: Use devm_*() functions 2013-08-20 08:51:58 +01:00
wm831x-auxadc.c
wm831x-core.c mfd: Use dev_get_platdata() 2013-07-31 13:01:29 +01:00
wm831x-i2c.c
wm831x-irq.c mfd: Use dev_get_platdata() 2013-07-31 13:01:29 +01:00
wm831x-otp.c mfd: wm831x: Feed the device UUID into device_add_randomness() 2012-07-19 10:38:31 -04:00
wm831x-spi.c mfd: wm831x: Remove erronious bits per word set 2013-07-31 13:00:53 +01:00
wm5102-tables.c mfd: arizona: Mark missing AOD registers as volatile 2013-10-23 16:21:46 +01:00
wm5110-tables.c mfd: wm5110: Enable micd clamp functionality 2013-11-11 11:22:13 +00:00
wm8350-core.c
wm8350-gpio.c
wm8350-i2c.c mfd: Use dev_get_platdata() 2013-07-31 13:01:29 +01:00
wm8350-irq.c
wm8350-regmap.c
wm8400-core.c mfd: Use dev_get_platdata() 2013-07-31 13:01:29 +01:00
wm8994-core.c mfd: wm8994: Inline register I/O functions 2013-10-23 16:20:37 +01:00
wm8994-irq.c mfd: Use dev_get_platdata() 2013-07-31 13:01:29 +01:00
wm8994-regmap.c mfd: wm8994: Implement support for WM1811 devices with higher cust_ids 2012-09-14 09:52:11 +02:00
wm8994.h
wm8997-tables.c mfd: arizona: Integrate wm8997 into Arizona mfd 2013-06-18 00:49:52 +02:00