diff options
| author | Ingo Molnar <mingo@kernel.org> | 2014-07-16 09:10:07 -0400 |
|---|---|---|
| committer | Ingo Molnar <mingo@kernel.org> | 2014-07-16 09:10:07 -0400 |
| commit | d26fad5b38e1c4667d4f2604936e59c837caa54d (patch) | |
| tree | 04b524a69a0129c181567445bff18847a1b44721 /drivers/i2c | |
| parent | e720fff6341fe4b95e5a93c939bd3c77fa55ced4 (diff) | |
| parent | 1795cd9b3a91d4b5473c97f491d63892442212ab (diff) | |
Merge tag 'v3.16-rc5' into sched/core, to refresh the branch before applying bigger tree-wide changes
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Diffstat (limited to 'drivers/i2c')
| -rw-r--r-- | drivers/i2c/busses/Kconfig | 23 | ||||
| -rw-r--r-- | drivers/i2c/busses/Makefile | 2 | ||||
| -rw-r--r-- | drivers/i2c/busses/i2c-rk3x.c | 763 | ||||
| -rw-r--r-- | drivers/i2c/busses/i2c-sun6i-p2wi.c | 344 | ||||
| -rw-r--r-- | drivers/i2c/muxes/Kconfig | 1 |
5 files changed, 1133 insertions, 0 deletions
diff --git a/drivers/i2c/busses/Kconfig b/drivers/i2c/busses/Kconfig index 620d1004a1e7..9f7d5859cf65 100644 --- a/drivers/i2c/busses/Kconfig +++ b/drivers/i2c/busses/Kconfig | |||
| @@ -676,6 +676,16 @@ config I2C_RIIC | |||
| 676 | This driver can also be built as a module. If so, the module | 676 | This driver can also be built as a module. If so, the module |
| 677 | will be called i2c-riic. | 677 | will be called i2c-riic. |
| 678 | 678 | ||
| 679 | config I2C_RK3X | ||
| 680 | tristate "Rockchip RK3xxx I2C adapter" | ||
| 681 | depends on OF | ||
| 682 | help | ||
| 683 | Say Y here to include support for the I2C adapter in Rockchip RK3xxx | ||
| 684 | SoCs. | ||
| 685 | |||
| 686 | This driver can also be built as a module. If so, the module will | ||
| 687 | be called i2c-rk3x. | ||
| 688 | |||
| 679 | config HAVE_S3C2410_I2C | 689 | config HAVE_S3C2410_I2C |
| 680 | bool | 690 | bool |
| 681 | help | 691 | help |
| @@ -764,6 +774,19 @@ config I2C_STU300 | |||
| 764 | This driver can also be built as a module. If so, the module | 774 | This driver can also be built as a module. If so, the module |
| 765 | will be called i2c-stu300. | 775 | will be called i2c-stu300. |
| 766 | 776 | ||
| 777 | config I2C_SUN6I_P2WI | ||
| 778 | tristate "Allwinner sun6i internal P2WI controller" | ||
| 779 | depends on RESET_CONTROLLER | ||
| 780 | depends on MACH_SUN6I || COMPILE_TEST | ||
| 781 | help | ||
| 782 | If you say yes to this option, support will be included for the | ||
| 783 | P2WI (Push/Pull 2 Wire Interface) controller embedded in some sunxi | ||
| 784 | SOCs. | ||
| 785 | The P2WI looks like an SMBus controller (which supports only byte | ||
| 786 | accesses), except that it only supports one slave device. | ||
| 787 | This interface is used to connect to specific PMIC devices (like the | ||
| 788 | AXP221). | ||
| 789 | |||
| 767 | config I2C_TEGRA | 790 | config I2C_TEGRA |
| 768 | tristate "NVIDIA Tegra internal I2C controller" | 791 | tristate "NVIDIA Tegra internal I2C controller" |
| 769 | depends on ARCH_TEGRA | 792 | depends on ARCH_TEGRA |
diff --git a/drivers/i2c/busses/Makefile b/drivers/i2c/busses/Makefile index 298692cc6000..dd9a7f8e873f 100644 --- a/drivers/i2c/busses/Makefile +++ b/drivers/i2c/busses/Makefile | |||
| @@ -66,6 +66,7 @@ obj-$(CONFIG_I2C_PXA) += i2c-pxa.o | |||
| 66 | obj-$(CONFIG_I2C_PXA_PCI) += i2c-pxa-pci.o | 66 | obj-$(CONFIG_I2C_PXA_PCI) += i2c-pxa-pci.o |
| 67 | obj-$(CONFIG_I2C_QUP) += i2c-qup.o | 67 | obj-$(CONFIG_I2C_QUP) += i2c-qup.o |
| 68 | obj-$(CONFIG_I2C_RIIC) += i2c-riic.o | 68 | obj-$(CONFIG_I2C_RIIC) += i2c-riic.o |
| 69 | obj-$(CONFIG_I2C_RK3X) += i2c-rk3x.o | ||
| 69 | obj-$(CONFIG_I2C_S3C2410) += i2c-s3c2410.o | 70 | obj-$(CONFIG_I2C_S3C2410) += i2c-s3c2410.o |
| 70 | obj-$(CONFIG_I2C_S6000) += i2c-s6000.o | 71 | obj-$(CONFIG_I2C_S6000) += i2c-s6000.o |
| 71 | obj-$(CONFIG_I2C_SH7760) += i2c-sh7760.o | 72 | obj-$(CONFIG_I2C_SH7760) += i2c-sh7760.o |
| @@ -74,6 +75,7 @@ obj-$(CONFIG_I2C_SIMTEC) += i2c-simtec.o | |||
| 74 | obj-$(CONFIG_I2C_SIRF) += i2c-sirf.o | 75 | obj-$(CONFIG_I2C_SIRF) += i2c-sirf.o |
| 75 | obj-$(CONFIG_I2C_ST) += i2c-st.o | 76 | obj-$(CONFIG_I2C_ST) += i2c-st.o |
| 76 | obj-$(CONFIG_I2C_STU300) += i2c-stu300.o | 77 | obj-$(CONFIG_I2C_STU300) += i2c-stu300.o |
| 78 | obj-$(CONFIG_I2C_SUN6I_P2WI) += i2c-sun6i-p2wi.o | ||
| 77 | obj-$(CONFIG_I2C_TEGRA) += i2c-tegra.o | 79 | obj-$(CONFIG_I2C_TEGRA) += i2c-tegra.o |
| 78 | obj-$(CONFIG_I2C_VERSATILE) += i2c-versatile.o | 80 | obj-$(CONFIG_I2C_VERSATILE) += i2c-versatile.o |
| 79 | obj-$(CONFIG_I2C_WMT) += i2c-wmt.o | 81 | obj-$(CONFIG_I2C_WMT) += i2c-wmt.o |
diff --git a/drivers/i2c/busses/i2c-rk3x.c b/drivers/i2c/busses/i2c-rk3x.c new file mode 100644 index 000000000000..a9791509966a --- /dev/null +++ b/drivers/i2c/busses/i2c-rk3x.c | |||
| @@ -0,0 +1,763 @@ | |||
| 1 | /* | ||
| 2 | * Driver for I2C adapter in Rockchip RK3xxx SoC | ||
| 3 | * | ||
| 4 | * Max Schwarz <max.schwarz@online.de> | ||
| 5 | * based on the patches by Rockchip Inc. | ||
| 6 | * | ||
| 7 | * This program is free software; you can redistribute it and/or modify | ||
| 8 | * it under the terms of the GNU General Public License version 2 as | ||
| 9 | * published by the Free Software Foundation. | ||
| 10 | */ | ||
| 11 | |||
| 12 | #include <linux/kernel.h> | ||
| 13 | #include <linux/module.h> | ||
| 14 | #include <linux/i2c.h> | ||
| 15 | #include <linux/interrupt.h> | ||
| 16 | #include <linux/errno.h> | ||
| 17 | #include <linux/err.h> | ||
| 18 | #include <linux/platform_device.h> | ||
| 19 | #include <linux/io.h> | ||
| 20 | #include <linux/of_address.h> | ||
| 21 | #include <linux/of_irq.h> | ||
| 22 | #include <linux/spinlock.h> | ||
| 23 | #include <linux/clk.h> | ||
| 24 | #include <linux/wait.h> | ||
| 25 | #include <linux/mfd/syscon.h> | ||
| 26 | #include <linux/regmap.h> | ||
| 27 | |||
| 28 | |||
| 29 | /* Register Map */ | ||
| 30 | #define REG_CON 0x00 /* control register */ | ||
| 31 | #define REG_CLKDIV 0x04 /* clock divisor register */ | ||
| 32 | #define REG_MRXADDR 0x08 /* slave address for REGISTER_TX */ | ||
| 33 | #define REG_MRXRADDR 0x0c /* slave register address for REGISTER_TX */ | ||
| 34 | #define REG_MTXCNT 0x10 /* number of bytes to be transmitted */ | ||
| 35 | #define REG_MRXCNT 0x14 /* number of bytes to be received */ | ||
| 36 | #define REG_IEN 0x18 /* interrupt enable */ | ||
| 37 | #define REG_IPD 0x1c /* interrupt pending */ | ||
| 38 | #define REG_FCNT 0x20 /* finished count */ | ||
| 39 | |||
| 40 | /* Data buffer offsets */ | ||
| 41 | #define TXBUFFER_BASE 0x100 | ||
| 42 | #define RXBUFFER_BASE 0x200 | ||
| 43 | |||
| 44 | /* REG_CON bits */ | ||
| 45 | #define REG_CON_EN BIT(0) | ||
| 46 | enum { | ||
| 47 | REG_CON_MOD_TX = 0, /* transmit data */ | ||
| 48 | REG_CON_MOD_REGISTER_TX, /* select register and restart */ | ||
| 49 | REG_CON_MOD_RX, /* receive data */ | ||
| 50 | REG_CON_MOD_REGISTER_RX, /* broken: transmits read addr AND writes | ||
| 51 | * register addr */ | ||
| 52 | }; | ||
| 53 | #define REG_CON_MOD(mod) ((mod) << 1) | ||
| 54 | #define REG_CON_MOD_MASK (BIT(1) | BIT(2)) | ||
| 55 | #define REG_CON_START BIT(3) | ||
| 56 | #define REG_CON_STOP BIT(4) | ||
| 57 | #define REG_CON_LASTACK BIT(5) /* 1: send NACK after last received byte */ | ||
| 58 | #define REG_CON_ACTACK BIT(6) /* 1: stop if NACK is received */ | ||
| 59 | |||
| 60 | /* REG_MRXADDR bits */ | ||
| 61 | #define REG_MRXADDR_VALID(x) BIT(24 + (x)) /* [x*8+7:x*8] of MRX[R]ADDR valid */ | ||
| 62 | |||
| 63 | /* REG_IEN/REG_IPD bits */ | ||
| 64 | #define REG_INT_BTF BIT(0) /* a byte was transmitted */ | ||
| 65 | #define REG_INT_BRF BIT(1) /* a byte was received */ | ||
| 66 | #define REG_INT_MBTF BIT(2) /* master data transmit finished */ | ||
| 67 | #define REG_INT_MBRF BIT(3) /* master data receive finished */ | ||
| 68 | #define REG_INT_START BIT(4) /* START condition generated */ | ||
| 69 | #define REG_INT_STOP BIT(5) /* STOP condition generated */ | ||
| 70 | #define REG_INT_NAKRCV BIT(6) /* NACK received */ | ||
| 71 | #define REG_INT_ALL 0x7f | ||
| 72 | |||
| 73 | /* Constants */ | ||
| 74 | #define WAIT_TIMEOUT 200 /* ms */ | ||
| 75 | #define DEFAULT_SCL_RATE (100 * 1000) /* Hz */ | ||
| 76 | |||
| 77 | enum rk3x_i2c_state { | ||
| 78 | STATE_IDLE, | ||
| 79 | STATE_START, | ||
| 80 | STATE_READ, | ||
| 81 | STATE_WRITE, | ||
| 82 | STATE_STOP | ||
| 83 | }; | ||
| 84 | |||
| 85 | /** | ||
| 86 | * @grf_offset: offset inside the grf regmap for setting the i2c type | ||
| 87 | */ | ||
| 88 | struct rk3x_i2c_soc_data { | ||
| 89 | int grf_offset; | ||
| 90 | }; | ||
| 91 | |||
| 92 | struct rk3x_i2c { | ||
| 93 | struct i2c_adapter adap; | ||
| 94 | struct device *dev; | ||
| 95 | struct rk3x_i2c_soc_data *soc_data; | ||
| 96 | |||
| 97 | /* Hardware resources */ | ||
| 98 | void __iomem *regs; | ||
| 99 | struct clk *clk; | ||
| 100 | |||
| 101 | /* Settings */ | ||
| 102 | unsigned int scl_frequency; | ||
| 103 | |||
| 104 | /* Synchronization & notification */ | ||
| 105 | spinlock_t lock; | ||
| 106 | wait_queue_head_t wait; | ||
| 107 | bool busy; | ||
| 108 | |||
| 109 | /* Current message */ | ||
| 110 | struct i2c_msg *msg; | ||
| 111 | u8 addr; | ||
| 112 | unsigned int mode; | ||
| 113 | bool is_last_msg; | ||
| 114 | |||
| 115 | /* I2C state machine */ | ||
| 116 | enum rk3x_i2c_state state; | ||
| 117 | unsigned int processed; /* sent/received bytes */ | ||
| 118 | int error; | ||
