OpenCloudOS-Kernel/drivers/i2c/busses
Simon Glass 069a9502dd i2c: s3c2410: Leave the bus disabled unless it is in use
There is a rather odd feature of the exynos i2c controller that if it
is left enabled, it can lock itself up with the clk line held low.
This makes the bus unusable.

Unfortunately, the s3c24xx_i2c_set_master() function does not notice
this, and reports a timeout. From then on the bus cannot be used until
the AP is rebooted.

The problem happens when any sort of interrupt occurs (e.g. due to a
bus transition) when we are not in the middle of a transaction. We
have seen many instances of this when U-Boot leaves the bus apparently
happy, but Linux cannot access it.

The current code is therefore pretty fragile.

This fixes things by leaving the bus disabled unless we are actually
in a transaction. We enable the bus at the start of the transaction and
disable it at the end. That way we won't get interrupts and will not
lock up the bus.

It might be possible to clear pending interrupts on start-up, but this
seems to be a more robust solution. We can't service interrupts when
we are not in a transaction, and anyway would rather not lock up the
bus while we try.

Signed-off-by: Simon Glass <sjg@chromium.org>
Signed-off-by: Naveen Krishna Chatradhi <ch.naveen@samsung.com>
Acked-by: Kyungmin Park <kyungmin.park@samsung.com>
Signed-off-by: Wolfram Sang <wsa@the-dreams.de>
2014-03-12 20:45:17 +01:00
..
Kconfig i2c: i801: enable Intel BayTrail SMBUS 2014-03-09 21:40:25 +01:00
Makefile i2c: Add bus driver for for OSIF USB i2c device. 2014-01-13 13:56:56 +01:00
i2c-acorn.c i2c: acorn: is tristate and should use module.h 2014-01-24 18:21:11 +01:00
i2c-ali15x3.c i2c: delete non-required instances of include <linux/init.h> 2014-01-24 18:24:31 +01:00
i2c-ali1535.c i2c: delete non-required instances of include <linux/init.h> 2014-01-24 18:24:31 +01:00
i2c-ali1563.c i2c: delete non-required instances of include <linux/init.h> 2014-01-24 18:24:31 +01:00
i2c-amd756-s4882.c Update Jean Delvare's e-mail address 2014-01-29 20:40:08 +01:00
i2c-amd756.c i2c: delete non-required instances of include <linux/init.h> 2014-01-24 18:24:31 +01:00
i2c-amd8111.c i2c: delete non-required instances of include <linux/init.h> 2014-01-24 18:24:31 +01:00
i2c-at91.c i2c: at91: Add device tree property to set clock-frequency 2014-03-12 08:26:04 +01:00
i2c-au1550.c i2c: delete non-required instances of include <linux/init.h> 2014-01-24 18:24:31 +01:00
i2c-bcm-kona.c i2c: i2c-bcm-kona: Fix module build 2013-11-26 14:00:57 +01:00
i2c-bcm2835.c i2c: bcm2835: Use devm_ioremap_resource() 2014-03-09 21:43:20 +01:00
i2c-bfin-twi.c i2c: bfin-twi: remove unnecessary Blackfin SSYNC from the driver 2014-03-09 08:41:18 +01:00
i2c-cbus-gpio.c i2c: delete non-required instances of include <linux/init.h> 2014-01-24 18:24:31 +01:00
i2c-cpm.c i2c: delete non-required instances of include <linux/init.h> 2014-01-24 18:24:31 +01:00
i2c-davinci.c i2c: davinci: raw read and write endian fix 2013-11-26 13:38:44 +01:00
i2c-designware-core.c i2c: designware: make SCL and SDA falling time configurable 2014-03-09 09:29:08 +01:00
i2c-designware-core.h i2c: designware: make SCL and SDA falling time configurable 2014-03-09 09:29:08 +01:00
i2c-designware-pcidrv.c i2c: designware-pci: set ideal HCNT, LCNT and SDA hold time value 2014-03-12 08:14:04 +01:00
i2c-designware-platdrv.c i2c: designware: make SCL and SDA falling time configurable 2014-03-09 09:29:08 +01:00
i2c-diolan-u2c.c i2c: i2c-diolan-u2c: different usb endpoints for DLN-2-U2C 2013-11-26 13:49:33 +01:00
i2c-eg20t.c i2c: delete non-required instances of include <linux/init.h> 2014-01-24 18:24:31 +01:00
i2c-elektor.c i2c: remove __dev* attributes from subsystem 2012-12-22 20:13:45 +01:00
i2c-exynos5.c i2c: delete non-required instances of include <linux/init.h> 2014-01-24 18:24:31 +01:00
i2c-gpio.c i2c: Include linux/of.h header 2013-10-30 16:46:30 +01:00
i2c-highlander.c i2c: delete non-required instances of include <linux/init.h> 2014-01-24 18:24:31 +01:00
i2c-hydra.c i2c: delete non-required instances of include <linux/init.h> 2014-01-24 18:24:31 +01:00
i2c-i801.c i2c: i801: enable Intel BayTrail SMBUS 2014-03-09 21:40:25 +01:00
i2c-ibm_iic.c i2c: delete non-required instances of include <linux/init.h> 2014-01-24 18:24:31 +01:00
i2c-ibm_iic.h i2c-ibm_iic: Whitespace cleanup 2008-01-27 18:14:45 +01:00
i2c-imx.c i2c: imx: propagate irq error code in probe 2014-01-03 17:40:38 +01:00
i2c-iop3xx.c i2c: delete non-required instances of include <linux/init.h> 2014-01-24 18:24:31 +01:00
i2c-iop3xx.h i2c-iop3xx: add iomem annotation 2011-01-04 00:53:37 +00:00
i2c-isch.c i2c: delete non-required instances of include <linux/init.h> 2014-01-24 18:24:31 +01:00
i2c-ismt.c i2c: delete non-required instances of include <linux/init.h> 2014-01-24 18:24:31 +01:00
i2c-kempld.c i2c: Fix Kontron PLD prescaler calculation 2013-08-05 10:31:18 +02:00
i2c-mpc.c i2c: delete non-required instances of include <linux/init.h> 2014-01-24 18:24:31 +01:00
i2c-mv64xxx.c i2c: mv64xxx: refactor initialization for new msgs 2014-03-10 17:23:23 +01:00
i2c-mxs.c i2c: mxs: Use devm_ioremap_resource() 2014-03-10 08:29:37 +01:00
i2c-nforce2-s4985.c Update Jean Delvare's e-mail address 2014-01-29 20:40:08 +01:00
i2c-nforce2.c i2c: delete non-required instances of include <linux/init.h> 2014-01-24 18:24:31 +01:00
i2c-nomadik.c i2c: i2c-nomadik: deprecate class based instantiation 2014-03-05 17:17:03 +01:00
i2c-nuc900.c i2c: use dev_get_platdata() 2013-08-19 19:46:30 +02:00
i2c-ocores.c i2c: i2c-ocores: deprecate class based instantiation 2014-03-05 17:17:06 +01:00
i2c-octeon.c i2c: delete non-required instances of include <linux/init.h> 2014-01-24 18:24:31 +01:00
i2c-omap.c i2c: i2c-omap: deprecate class based instantiation 2014-03-05 17:16:48 +01:00
i2c-parport-light.c Update Jean Delvare's e-mail address 2014-01-29 20:40:08 +01:00
i2c-parport.c Update Jean Delvare's e-mail address 2014-01-29 20:40:08 +01:00
i2c-parport.h Update Jean Delvare's e-mail address 2014-01-29 20:40:08 +01:00
i2c-pasemi.c i2c: remove __dev* attributes from subsystem 2012-12-22 20:13:45 +01:00
i2c-pca-isa.c i2c: remove __dev* attributes from subsystem 2012-12-22 20:13:45 +01:00
i2c-pca-platform.c i2c: delete non-required instances of include <linux/init.h> 2014-01-24 18:24:31 +01:00
i2c-piix4.c i2c: delete non-required instances of include <linux/init.h> 2014-01-24 18:24:31 +01:00
i2c-pmcmsp.c i2c: delete non-required instances of include <linux/init.h> 2014-01-24 18:24:31 +01:00
i2c-pnx.c i2c: pnx: Use devm_*() functions 2014-01-16 11:15:50 +01:00
i2c-powermac.c i2c: delete non-required instances of include <linux/init.h> 2014-01-24 18:24:31 +01:00
i2c-puv3.c i2c: delete non-required instances of include <linux/init.h> 2014-01-24 18:24:31 +01:00
i2c-pxa-pci.c i2c: Remove unneeded xxx_set_drvdata(..., NULL) calls 2013-02-22 00:25:50 +01:00
i2c-pxa.c i2c: move OF helpers into the core 2013-08-23 10:22:20 +02:00
i2c-rcar.c i2c: i2c-rcar: deprecate class based instantiation 2014-03-05 17:17:15 +01:00
i2c-riic.c i2c: riic: add driver 2014-01-02 15:56:52 +01:00
i2c-robotfuzz-osif.c i2c: Add bus driver for for OSIF USB i2c device. 2014-01-13 13:56:56 +01:00
i2c-s3c2410.c i2c: s3c2410: Leave the bus disabled unless it is in use 2014-03-12 20:45:17 +01:00
i2c-s6000.c i2c: use dev_get_platdata() 2013-08-19 19:46:30 +02:00
i2c-s6000.h i2c: Change mail address of Oskar Schirmer 2012-05-17 15:15:56 +02:00
i2c-scmi.c i2c: delete non-required instances of include <linux/init.h> 2014-01-24 18:24:31 +01:00
i2c-sh7760.c i2c: delete non-required instances of include <linux/init.h> 2014-01-24 18:24:31 +01:00
i2c-sh_mobile.c i2c: sh_mobile: Convert to clk_prepare/unprepare 2013-10-31 12:45:44 +01:00
i2c-sibyte.c i2c/mips: Fix error return codes from Sibyte i2c bus driver 2010-07-10 09:42:47 +02:00
i2c-simtec.c i2c: delete non-required instances of include <linux/init.h> 2014-01-24 18:24:31 +01:00
i2c-sirf.c i2c: sirf: retry 3 times as sometimes we get random noack and timeout 2013-08-28 11:46:03 +02:00
i2c-sis96x.c i2c: delete non-required instances of include <linux/init.h> 2014-01-24 18:24:31 +01:00
i2c-sis630.c i2c: delete non-required instances of include <linux/init.h> 2014-01-24 18:24:31 +01:00
i2c-sis5595.c i2c: remove __dev* attributes from subsystem 2012-12-22 20:13:45 +01:00
i2c-st.c i2c: st: Fix return in case of arbitration lost 2014-03-10 17:35:08 +01:00
i2c-stu300.c i2c: i2c-stu300: deprecate class based instantiation 2014-03-05 17:17:09 +01:00
i2c-taos-evm.c Update Jean Delvare's e-mail address 2014-01-29 20:40:08 +01:00
i2c-tegra.c i2c: i2c-tegra: deprecate class based instantiation 2014-03-05 17:17:12 +01:00
i2c-tiny-usb.c i2c: i2c-tiny-usb: Remove RobotFuzz USB vendor:product ID 2014-01-13 13:56:52 +01:00
i2c-versatile.c i2c: move OF helpers into the core 2013-08-23 10:22:20 +02:00
i2c-via.c i2c: delete non-required instances of include <linux/init.h> 2014-01-24 18:24:31 +01:00
i2c-viapro.c Update Jean Delvare's e-mail address 2014-01-29 20:40:08 +01:00
i2c-viperboard.c i2c: viperboard: remove superfluous assignment 2014-01-09 22:18:33 +01:00
i2c-wmt.c Merge branch 'i2c/for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/wsa/linux 2013-11-18 15:50:07 -08:00
i2c-xiic.c i2c: delete non-required instances of include <linux/init.h> 2014-01-24 18:24:31 +01:00
i2c-xlr.c i2c: delete non-required instances of include <linux/init.h> 2014-01-24 18:24:31 +01:00
scx200_acb.c i2c: Remove unneeded xxx_set_drvdata(..., NULL) calls 2013-02-22 00:25:50 +01:00
scx200_i2c.c i2c: delete non-required instances of include <linux/init.h> 2014-01-24 18:24:31 +01:00