1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun * drivers/i2c/busses/i2c-tegra.c
4*4882a593Smuzhiyun *
5*4882a593Smuzhiyun * Copyright (C) 2010 Google, Inc.
6*4882a593Smuzhiyun * Author: Colin Cross <ccross@android.com>
7*4882a593Smuzhiyun */
8*4882a593Smuzhiyun
9*4882a593Smuzhiyun #include <linux/bitfield.h>
10*4882a593Smuzhiyun #include <linux/clk.h>
11*4882a593Smuzhiyun #include <linux/delay.h>
12*4882a593Smuzhiyun #include <linux/dmaengine.h>
13*4882a593Smuzhiyun #include <linux/dma-mapping.h>
14*4882a593Smuzhiyun #include <linux/err.h>
15*4882a593Smuzhiyun #include <linux/i2c.h>
16*4882a593Smuzhiyun #include <linux/init.h>
17*4882a593Smuzhiyun #include <linux/interrupt.h>
18*4882a593Smuzhiyun #include <linux/io.h>
19*4882a593Smuzhiyun #include <linux/iopoll.h>
20*4882a593Smuzhiyun #include <linux/irq.h>
21*4882a593Smuzhiyun #include <linux/kernel.h>
22*4882a593Smuzhiyun #include <linux/ktime.h>
23*4882a593Smuzhiyun #include <linux/module.h>
24*4882a593Smuzhiyun #include <linux/of_device.h>
25*4882a593Smuzhiyun #include <linux/pinctrl/consumer.h>
26*4882a593Smuzhiyun #include <linux/platform_device.h>
27*4882a593Smuzhiyun #include <linux/pm_runtime.h>
28*4882a593Smuzhiyun #include <linux/reset.h>
29*4882a593Smuzhiyun
30*4882a593Smuzhiyun #define BYTES_PER_FIFO_WORD 4
31*4882a593Smuzhiyun
32*4882a593Smuzhiyun #define I2C_CNFG 0x000
33*4882a593Smuzhiyun #define I2C_CNFG_DEBOUNCE_CNT GENMASK(14, 12)
34*4882a593Smuzhiyun #define I2C_CNFG_PACKET_MODE_EN BIT(10)
35*4882a593Smuzhiyun #define I2C_CNFG_NEW_MASTER_FSM BIT(11)
36*4882a593Smuzhiyun #define I2C_CNFG_MULTI_MASTER_MODE BIT(17)
37*4882a593Smuzhiyun #define I2C_STATUS 0x01c
38*4882a593Smuzhiyun #define I2C_SL_CNFG 0x020
39*4882a593Smuzhiyun #define I2C_SL_CNFG_NACK BIT(1)
40*4882a593Smuzhiyun #define I2C_SL_CNFG_NEWSL BIT(2)
41*4882a593Smuzhiyun #define I2C_SL_ADDR1 0x02c
42*4882a593Smuzhiyun #define I2C_SL_ADDR2 0x030
43*4882a593Smuzhiyun #define I2C_TLOW_SEXT 0x034
44*4882a593Smuzhiyun #define I2C_TX_FIFO 0x050
45*4882a593Smuzhiyun #define I2C_RX_FIFO 0x054
46*4882a593Smuzhiyun #define I2C_PACKET_TRANSFER_STATUS 0x058
47*4882a593Smuzhiyun #define I2C_FIFO_CONTROL 0x05c
48*4882a593Smuzhiyun #define I2C_FIFO_CONTROL_TX_FLUSH BIT(1)
49*4882a593Smuzhiyun #define I2C_FIFO_CONTROL_RX_FLUSH BIT(0)
50*4882a593Smuzhiyun #define I2C_FIFO_CONTROL_TX_TRIG(x) (((x) - 1) << 5)
51*4882a593Smuzhiyun #define I2C_FIFO_CONTROL_RX_TRIG(x) (((x) - 1) << 2)
52*4882a593Smuzhiyun #define I2C_FIFO_STATUS 0x060
53*4882a593Smuzhiyun #define I2C_FIFO_STATUS_TX GENMASK(7, 4)
54*4882a593Smuzhiyun #define I2C_FIFO_STATUS_RX GENMASK(3, 0)
55*4882a593Smuzhiyun #define I2C_INT_MASK 0x064
56*4882a593Smuzhiyun #define I2C_INT_STATUS 0x068
57*4882a593Smuzhiyun #define I2C_INT_BUS_CLR_DONE BIT(11)
58*4882a593Smuzhiyun #define I2C_INT_PACKET_XFER_COMPLETE BIT(7)
59*4882a593Smuzhiyun #define I2C_INT_NO_ACK BIT(3)
60*4882a593Smuzhiyun #define I2C_INT_ARBITRATION_LOST BIT(2)
61*4882a593Smuzhiyun #define I2C_INT_TX_FIFO_DATA_REQ BIT(1)
62*4882a593Smuzhiyun #define I2C_INT_RX_FIFO_DATA_REQ BIT(0)
63*4882a593Smuzhiyun #define I2C_CLK_DIVISOR 0x06c
64*4882a593Smuzhiyun #define I2C_CLK_DIVISOR_STD_FAST_MODE GENMASK(31, 16)
65*4882a593Smuzhiyun #define I2C_CLK_DIVISOR_HSMODE GENMASK(15, 0)
66*4882a593Smuzhiyun
67*4882a593Smuzhiyun #define DVC_CTRL_REG1 0x000
68*4882a593Smuzhiyun #define DVC_CTRL_REG1_INTR_EN BIT(10)
69*4882a593Smuzhiyun #define DVC_CTRL_REG3 0x008
70*4882a593Smuzhiyun #define DVC_CTRL_REG3_SW_PROG BIT(26)
71*4882a593Smuzhiyun #define DVC_CTRL_REG3_I2C_DONE_INTR_EN BIT(30)
72*4882a593Smuzhiyun #define DVC_STATUS 0x00c
73*4882a593Smuzhiyun #define DVC_STATUS_I2C_DONE_INTR BIT(30)
74*4882a593Smuzhiyun
75*4882a593Smuzhiyun #define I2C_ERR_NONE 0x00
76*4882a593Smuzhiyun #define I2C_ERR_NO_ACK BIT(0)
77*4882a593Smuzhiyun #define I2C_ERR_ARBITRATION_LOST BIT(1)
78*4882a593Smuzhiyun #define I2C_ERR_UNKNOWN_INTERRUPT BIT(2)
79*4882a593Smuzhiyun #define I2C_ERR_RX_BUFFER_OVERFLOW BIT(3)
80*4882a593Smuzhiyun
81*4882a593Smuzhiyun #define PACKET_HEADER0_HEADER_SIZE GENMASK(29, 28)
82*4882a593Smuzhiyun #define PACKET_HEADER0_PACKET_ID GENMASK(23, 16)
83*4882a593Smuzhiyun #define PACKET_HEADER0_CONT_ID GENMASK(15, 12)
84*4882a593Smuzhiyun #define PACKET_HEADER0_PROTOCOL GENMASK(7, 4)
85*4882a593Smuzhiyun #define PACKET_HEADER0_PROTOCOL_I2C 1
86*4882a593Smuzhiyun
87*4882a593Smuzhiyun #define I2C_HEADER_CONT_ON_NAK BIT(21)
88*4882a593Smuzhiyun #define I2C_HEADER_READ BIT(19)
89*4882a593Smuzhiyun #define I2C_HEADER_10BIT_ADDR BIT(18)
90*4882a593Smuzhiyun #define I2C_HEADER_IE_ENABLE BIT(17)
91*4882a593Smuzhiyun #define I2C_HEADER_REPEAT_START BIT(16)
92*4882a593Smuzhiyun #define I2C_HEADER_CONTINUE_XFER BIT(15)
93*4882a593Smuzhiyun #define I2C_HEADER_SLAVE_ADDR_SHIFT 1
94*4882a593Smuzhiyun
95*4882a593Smuzhiyun #define I2C_BUS_CLEAR_CNFG 0x084
96*4882a593Smuzhiyun #define I2C_BC_SCLK_THRESHOLD GENMASK(23, 16)
97*4882a593Smuzhiyun #define I2C_BC_STOP_COND BIT(2)
98*4882a593Smuzhiyun #define I2C_BC_TERMINATE BIT(1)
99*4882a593Smuzhiyun #define I2C_BC_ENABLE BIT(0)
100*4882a593Smuzhiyun #define I2C_BUS_CLEAR_STATUS 0x088
101*4882a593Smuzhiyun #define I2C_BC_STATUS BIT(0)
102*4882a593Smuzhiyun
103*4882a593Smuzhiyun #define I2C_CONFIG_LOAD 0x08c
104*4882a593Smuzhiyun #define I2C_MSTR_CONFIG_LOAD BIT(0)
105*4882a593Smuzhiyun
106*4882a593Smuzhiyun #define I2C_CLKEN_OVERRIDE 0x090
107*4882a593Smuzhiyun #define I2C_MST_CORE_CLKEN_OVR BIT(0)
108*4882a593Smuzhiyun
109*4882a593Smuzhiyun #define I2C_INTERFACE_TIMING_0 0x094
110*4882a593Smuzhiyun #define I2C_INTERFACE_TIMING_THIGH GENMASK(13, 8)
111*4882a593Smuzhiyun #define I2C_INTERFACE_TIMING_TLOW GENMASK(5, 0)
112*4882a593Smuzhiyun #define I2C_INTERFACE_TIMING_1 0x098
113*4882a593Smuzhiyun #define I2C_INTERFACE_TIMING_TBUF GENMASK(29, 24)
114*4882a593Smuzhiyun #define I2C_INTERFACE_TIMING_TSU_STO GENMASK(21, 16)
115*4882a593Smuzhiyun #define I2C_INTERFACE_TIMING_THD_STA GENMASK(13, 8)
116*4882a593Smuzhiyun #define I2C_INTERFACE_TIMING_TSU_STA GENMASK(5, 0)
117*4882a593Smuzhiyun
118*4882a593Smuzhiyun #define I2C_HS_INTERFACE_TIMING_0 0x09c
119*4882a593Smuzhiyun #define I2C_HS_INTERFACE_TIMING_THIGH GENMASK(13, 8)
120*4882a593Smuzhiyun #define I2C_HS_INTERFACE_TIMING_TLOW GENMASK(5, 0)
121*4882a593Smuzhiyun #define I2C_HS_INTERFACE_TIMING_1 0x0a0
122*4882a593Smuzhiyun #define I2C_HS_INTERFACE_TIMING_TSU_STO GENMASK(21, 16)
123*4882a593Smuzhiyun #define I2C_HS_INTERFACE_TIMING_THD_STA GENMASK(13, 8)
124*4882a593Smuzhiyun #define I2C_HS_INTERFACE_TIMING_TSU_STA GENMASK(5, 0)
125*4882a593Smuzhiyun
126*4882a593Smuzhiyun #define I2C_MST_FIFO_CONTROL 0x0b4
127*4882a593Smuzhiyun #define I2C_MST_FIFO_CONTROL_RX_FLUSH BIT(0)
128*4882a593Smuzhiyun #define I2C_MST_FIFO_CONTROL_TX_FLUSH BIT(1)
129*4882a593Smuzhiyun #define I2C_MST_FIFO_CONTROL_RX_TRIG(x) (((x) - 1) << 4)
130*4882a593Smuzhiyun #define I2C_MST_FIFO_CONTROL_TX_TRIG(x) (((x) - 1) << 16)
131*4882a593Smuzhiyun
132*4882a593Smuzhiyun #define I2C_MST_FIFO_STATUS 0x0b8
133*4882a593Smuzhiyun #define I2C_MST_FIFO_STATUS_TX GENMASK(23, 16)
134*4882a593Smuzhiyun #define I2C_MST_FIFO_STATUS_RX GENMASK(7, 0)
135*4882a593Smuzhiyun
136*4882a593Smuzhiyun /* configuration load timeout in microseconds */
137*4882a593Smuzhiyun #define I2C_CONFIG_LOAD_TIMEOUT 1000000
138*4882a593Smuzhiyun
139*4882a593Smuzhiyun /* packet header size in bytes */
140*4882a593Smuzhiyun #define I2C_PACKET_HEADER_SIZE 12
141*4882a593Smuzhiyun
142*4882a593Smuzhiyun /*
143*4882a593Smuzhiyun * I2C Controller will use PIO mode for transfers up to 32 bytes in order to
144*4882a593Smuzhiyun * avoid DMA overhead, otherwise external APB DMA controller will be used.
145*4882a593Smuzhiyun * Note that the actual MAX PIO length is 20 bytes because 32 bytes include
146*4882a593Smuzhiyun * I2C_PACKET_HEADER_SIZE.
147*4882a593Smuzhiyun */
148*4882a593Smuzhiyun #define I2C_PIO_MODE_PREFERRED_LEN 32
149*4882a593Smuzhiyun
150*4882a593Smuzhiyun /*
151*4882a593Smuzhiyun * msg_end_type: The bus control which needs to be sent at end of transfer.
152*4882a593Smuzhiyun * @MSG_END_STOP: Send stop pulse.
153*4882a593Smuzhiyun * @MSG_END_REPEAT_START: Send repeat-start.
154*4882a593Smuzhiyun * @MSG_END_CONTINUE: Don't send stop or repeat-start.
155*4882a593Smuzhiyun */
156*4882a593Smuzhiyun enum msg_end_type {
157*4882a593Smuzhiyun MSG_END_STOP,
158*4882a593Smuzhiyun MSG_END_REPEAT_START,
159*4882a593Smuzhiyun MSG_END_CONTINUE,
160*4882a593Smuzhiyun };
161*4882a593Smuzhiyun
162*4882a593Smuzhiyun /**
163*4882a593Smuzhiyun * struct tegra_i2c_hw_feature : per hardware generation features
164*4882a593Smuzhiyun * @has_continue_xfer_support: continue-transfer supported
165*4882a593Smuzhiyun * @has_per_pkt_xfer_complete_irq: Has enable/disable capability for transfer
166*4882a593Smuzhiyun * completion interrupt on per packet basis.
167*4882a593Smuzhiyun * @has_config_load_reg: Has the config load register to load the new
168*4882a593Smuzhiyun * configuration.
169*4882a593Smuzhiyun * @clk_divisor_hs_mode: Clock divisor in HS mode.
170*4882a593Smuzhiyun * @clk_divisor_std_mode: Clock divisor in standard mode. It is
171*4882a593Smuzhiyun * applicable if there is no fast clock source i.e. single clock
172*4882a593Smuzhiyun * source.
173*4882a593Smuzhiyun * @clk_divisor_fast_mode: Clock divisor in fast mode. It is
174*4882a593Smuzhiyun * applicable if there is no fast clock source i.e. single clock
175*4882a593Smuzhiyun * source.
176*4882a593Smuzhiyun * @clk_divisor_fast_plus_mode: Clock divisor in fast mode plus. It is
177*4882a593Smuzhiyun * applicable if there is no fast clock source (i.e. single
178*4882a593Smuzhiyun * clock source).
179*4882a593Smuzhiyun * @has_multi_master_mode: The I2C controller supports running in single-master
180*4882a593Smuzhiyun * or multi-master mode.
181*4882a593Smuzhiyun * @has_slcg_override_reg: The I2C controller supports a register that
182*4882a593Smuzhiyun * overrides the second level clock gating.
183*4882a593Smuzhiyun * @has_mst_fifo: The I2C controller contains the new MST FIFO interface that
184*4882a593Smuzhiyun * provides additional features and allows for longer messages to
185*4882a593Smuzhiyun * be transferred in one go.
186*4882a593Smuzhiyun * @quirks: I2C adapter quirks for limiting write/read transfer size and not
187*4882a593Smuzhiyun * allowing 0 length transfers.
188*4882a593Smuzhiyun * @supports_bus_clear: Bus Clear support to recover from bus hang during
189*4882a593Smuzhiyun * SDA stuck low from device for some unknown reasons.
190*4882a593Smuzhiyun * @has_apb_dma: Support of APBDMA on corresponding Tegra chip.
191*4882a593Smuzhiyun * @tlow_std_mode: Low period of the clock in standard mode.
192*4882a593Smuzhiyun * @thigh_std_mode: High period of the clock in standard mode.
193*4882a593Smuzhiyun * @tlow_fast_fastplus_mode: Low period of the clock in fast/fast-plus modes.
194*4882a593Smuzhiyun * @thigh_fast_fastplus_mode: High period of the clock in fast/fast-plus modes.
195*4882a593Smuzhiyun * @setup_hold_time_std_mode: Setup and hold time for start and stop conditions
196*4882a593Smuzhiyun * in standard mode.
197*4882a593Smuzhiyun * @setup_hold_time_fast_fast_plus_mode: Setup and hold time for start and stop
198*4882a593Smuzhiyun * conditions in fast/fast-plus modes.
199*4882a593Smuzhiyun * @setup_hold_time_hs_mode: Setup and hold time for start and stop conditions
200*4882a593Smuzhiyun * in HS mode.
201*4882a593Smuzhiyun * @has_interface_timing_reg: Has interface timing register to program the tuned
202*4882a593Smuzhiyun * timing settings.
203*4882a593Smuzhiyun */
204*4882a593Smuzhiyun struct tegra_i2c_hw_feature {
205*4882a593Smuzhiyun bool has_continue_xfer_support;
206*4882a593Smuzhiyun bool has_per_pkt_xfer_complete_irq;
207*4882a593Smuzhiyun bool has_config_load_reg;
208*4882a593Smuzhiyun u32 clk_divisor_hs_mode;
209*4882a593Smuzhiyun u32 clk_divisor_std_mode;
210*4882a593Smuzhiyun u32 clk_divisor_fast_mode;
211*4882a593Smuzhiyun u32 clk_divisor_fast_plus_mode;
212*4882a593Smuzhiyun bool has_multi_master_mode;
213*4882a593Smuzhiyun bool has_slcg_override_reg;
214*4882a593Smuzhiyun bool has_mst_fifo;
215*4882a593Smuzhiyun const struct i2c_adapter_quirks *quirks;
216*4882a593Smuzhiyun bool supports_bus_clear;
217*4882a593Smuzhiyun bool has_apb_dma;
218*4882a593Smuzhiyun u32 tlow_std_mode;
219*4882a593Smuzhiyun u32 thigh_std_mode;
220*4882a593Smuzhiyun u32 tlow_fast_fastplus_mode;
221*4882a593Smuzhiyun u32 thigh_fast_fastplus_mode;
222*4882a593Smuzhiyun u32 setup_hold_time_std_mode;
223*4882a593Smuzhiyun u32 setup_hold_time_fast_fast_plus_mode;
224*4882a593Smuzhiyun u32 setup_hold_time_hs_mode;
225*4882a593Smuzhiyun bool has_interface_timing_reg;
226*4882a593Smuzhiyun };
227*4882a593Smuzhiyun
228*4882a593Smuzhiyun /**
229*4882a593Smuzhiyun * struct tegra_i2c_dev - per device I2C context
230*4882a593Smuzhiyun * @dev: device reference for power management
231*4882a593Smuzhiyun * @hw: Tegra I2C HW feature
232*4882a593Smuzhiyun * @adapter: core I2C layer adapter information
233*4882a593Smuzhiyun * @div_clk: clock reference for div clock of I2C controller
234*4882a593Smuzhiyun * @clocks: array of I2C controller clocks
235*4882a593Smuzhiyun * @nclocks: number of clocks in the array
236*4882a593Smuzhiyun * @rst: reset control for the I2C controller
237*4882a593Smuzhiyun * @base: ioremapped registers cookie
238*4882a593Smuzhiyun * @base_phys: physical base address of the I2C controller
239*4882a593Smuzhiyun * @cont_id: I2C controller ID, used for packet header
240*4882a593Smuzhiyun * @irq: IRQ number of transfer complete interrupt
241*4882a593Smuzhiyun * @is_dvc: identifies the DVC I2C controller, has a different register layout
242*4882a593Smuzhiyun * @is_vi: identifies the VI I2C controller, has a different register layout
243*4882a593Smuzhiyun * @msg_complete: transfer completion notifier
244*4882a593Smuzhiyun * @msg_err: error code for completed message
245*4882a593Smuzhiyun * @msg_buf: pointer to current message data
246*4882a593Smuzhiyun * @msg_buf_remaining: size of unsent data in the message buffer
247*4882a593Smuzhiyun * @msg_read: indicates that the transfer is a read access
248*4882a593Smuzhiyun * @bus_clk_rate: current I2C bus clock rate
249*4882a593Smuzhiyun * @multimaster_mode: indicates that I2C controller is in multi-master mode
250*4882a593Smuzhiyun * @tx_dma_chan: DMA transmit channel
251*4882a593Smuzhiyun * @rx_dma_chan: DMA receive channel
252*4882a593Smuzhiyun * @dma_phys: handle to DMA resources
253*4882a593Smuzhiyun * @dma_buf: pointer to allocated DMA buffer
254*4882a593Smuzhiyun * @dma_buf_size: DMA buffer size
255*4882a593Smuzhiyun * @dma_mode: indicates active DMA transfer
256*4882a593Smuzhiyun * @dma_complete: DMA completion notifier
257*4882a593Smuzhiyun * @atomic_mode: indicates active atomic transfer
258*4882a593Smuzhiyun */
259*4882a593Smuzhiyun struct tegra_i2c_dev {
260*4882a593Smuzhiyun struct device *dev;
261*4882a593Smuzhiyun struct i2c_adapter adapter;
262*4882a593Smuzhiyun
263*4882a593Smuzhiyun const struct tegra_i2c_hw_feature *hw;
264*4882a593Smuzhiyun struct reset_control *rst;
265*4882a593Smuzhiyun unsigned int cont_id;
266*4882a593Smuzhiyun unsigned int irq;
267*4882a593Smuzhiyun
268*4882a593Smuzhiyun phys_addr_t base_phys;
269*4882a593Smuzhiyun void __iomem *base;
270*4882a593Smuzhiyun
271*4882a593Smuzhiyun struct clk_bulk_data clocks[2];
272*4882a593Smuzhiyun unsigned int nclocks;
273*4882a593Smuzhiyun
274*4882a593Smuzhiyun struct clk *div_clk;
275*4882a593Smuzhiyun u32 bus_clk_rate;
276*4882a593Smuzhiyun
277*4882a593Smuzhiyun struct completion msg_complete;
278*4882a593Smuzhiyun size_t msg_buf_remaining;
279*4882a593Smuzhiyun int msg_err;
280*4882a593Smuzhiyun u8 *msg_buf;
281*4882a593Smuzhiyun
282*4882a593Smuzhiyun struct completion dma_complete;
283*4882a593Smuzhiyun struct dma_chan *tx_dma_chan;
284*4882a593Smuzhiyun struct dma_chan *rx_dma_chan;
285*4882a593Smuzhiyun unsigned int dma_buf_size;
286*4882a593Smuzhiyun struct device *dma_dev;
287*4882a593Smuzhiyun dma_addr_t dma_phys;
288*4882a593Smuzhiyun void *dma_buf;
289*4882a593Smuzhiyun
290*4882a593Smuzhiyun bool multimaster_mode;
291*4882a593Smuzhiyun bool atomic_mode;
292*4882a593Smuzhiyun bool dma_mode;
293*4882a593Smuzhiyun bool msg_read;
294*4882a593Smuzhiyun bool is_dvc;
295*4882a593Smuzhiyun bool is_vi;
296*4882a593Smuzhiyun };
297*4882a593Smuzhiyun
dvc_writel(struct tegra_i2c_dev * i2c_dev,u32 val,unsigned int reg)298*4882a593Smuzhiyun static void dvc_writel(struct tegra_i2c_dev *i2c_dev, u32 val,
299*4882a593Smuzhiyun unsigned int reg)
300*4882a593Smuzhiyun {
301*4882a593Smuzhiyun writel_relaxed(val, i2c_dev->base + reg);
302*4882a593Smuzhiyun }
303*4882a593Smuzhiyun
dvc_readl(struct tegra_i2c_dev * i2c_dev,unsigned int reg)304*4882a593Smuzhiyun static u32 dvc_readl(struct tegra_i2c_dev *i2c_dev, unsigned int reg)
305*4882a593Smuzhiyun {
306*4882a593Smuzhiyun return readl_relaxed(i2c_dev->base + reg);
307*4882a593Smuzhiyun }
308*4882a593Smuzhiyun
309*4882a593Smuzhiyun /*
310*4882a593Smuzhiyun * If necessary, i2c_writel() and i2c_readl() will offset the register
311*4882a593Smuzhiyun * in order to talk to the I2C block inside the DVC block.
312*4882a593Smuzhiyun */
tegra_i2c_reg_addr(struct tegra_i2c_dev * i2c_dev,unsigned int reg)313*4882a593Smuzhiyun static u32 tegra_i2c_reg_addr(struct tegra_i2c_dev *i2c_dev, unsigned int reg)
314*4882a593Smuzhiyun {
315*4882a593Smuzhiyun if (i2c_dev->is_dvc)
316*4882a593Smuzhiyun reg += (reg >= I2C_TX_FIFO) ? 0x10 : 0x40;
317*4882a593Smuzhiyun else if (i2c_dev->is_vi)
318*4882a593Smuzhiyun reg = 0xc00 + (reg << 2);
319*4882a593Smuzhiyun
320*4882a593Smuzhiyun return reg;
321*4882a593Smuzhiyun }
322*4882a593Smuzhiyun
i2c_writel(struct tegra_i2c_dev * i2c_dev,u32 val,unsigned int reg)323*4882a593Smuzhiyun static void i2c_writel(struct tegra_i2c_dev *i2c_dev, u32 val, unsigned int reg)
324*4882a593Smuzhiyun {
325*4882a593Smuzhiyun writel_relaxed(val, i2c_dev->base + tegra_i2c_reg_addr(i2c_dev, reg));
326*4882a593Smuzhiyun
327*4882a593Smuzhiyun /* read back register to make sure that register writes completed */
328*4882a593Smuzhiyun if (reg != I2C_TX_FIFO)
329*4882a593Smuzhiyun readl_relaxed(i2c_dev->base + tegra_i2c_reg_addr(i2c_dev, reg));
330*4882a593Smuzhiyun else if (i2c_dev->is_vi)
331*4882a593Smuzhiyun readl_relaxed(i2c_dev->base + tegra_i2c_reg_addr(i2c_dev, I2C_INT_STATUS));
332*4882a593Smuzhiyun }
333*4882a593Smuzhiyun
i2c_readl(struct tegra_i2c_dev * i2c_dev,unsigned int reg)334*4882a593Smuzhiyun static u32 i2c_readl(struct tegra_i2c_dev *i2c_dev, unsigned int reg)
335*4882a593Smuzhiyun {
336*4882a593Smuzhiyun return readl_relaxed(i2c_dev->base + tegra_i2c_reg_addr(i2c_dev, reg));
337*4882a593Smuzhiyun }
338*4882a593Smuzhiyun
i2c_writesl(struct tegra_i2c_dev * i2c_dev,void * data,unsigned int reg,unsigned int len)339*4882a593Smuzhiyun static void i2c_writesl(struct tegra_i2c_dev *i2c_dev, void *data,
340*4882a593Smuzhiyun unsigned int reg, unsigned int len)
341*4882a593Smuzhiyun {
342*4882a593Smuzhiyun writesl(i2c_dev->base + tegra_i2c_reg_addr(i2c_dev, reg), data, len);
343*4882a593Smuzhiyun }
344*4882a593Smuzhiyun
i2c_writesl_vi(struct tegra_i2c_dev * i2c_dev,void * data,unsigned int reg,unsigned int len)345*4882a593Smuzhiyun static void i2c_writesl_vi(struct tegra_i2c_dev *i2c_dev, void *data,
346*4882a593Smuzhiyun unsigned int reg, unsigned int len)
347*4882a593Smuzhiyun {
348*4882a593Smuzhiyun u32 *data32 = data;
349*4882a593Smuzhiyun
350*4882a593Smuzhiyun /*
351*4882a593Smuzhiyun * VI I2C controller has known hardware bug where writes get stuck
352*4882a593Smuzhiyun * when immediate multiple writes happen to TX_FIFO register.
353*4882a593Smuzhiyun * Recommended software work around is to read I2C register after
354*4882a593Smuzhiyun * each write to TX_FIFO register to flush out the data.
355*4882a593Smuzhiyun */
356*4882a593Smuzhiyun while (len--)
357*4882a593Smuzhiyun i2c_writel(i2c_dev, *data32++, reg);
358*4882a593Smuzhiyun }
359*4882a593Smuzhiyun
i2c_readsl(struct tegra_i2c_dev * i2c_dev,void * data,unsigned int reg,unsigned int len)360*4882a593Smuzhiyun static void i2c_readsl(struct tegra_i2c_dev *i2c_dev, void *data,
361*4882a593Smuzhiyun unsigned int reg, unsigned int len)
362*4882a593Smuzhiyun {
363*4882a593Smuzhiyun readsl(i2c_dev->base + tegra_i2c_reg_addr(i2c_dev, reg), data, len);
364*4882a593Smuzhiyun }
365*4882a593Smuzhiyun
tegra_i2c_mask_irq(struct tegra_i2c_dev * i2c_dev,u32 mask)366*4882a593Smuzhiyun static void tegra_i2c_mask_irq(struct tegra_i2c_dev *i2c_dev, u32 mask)
367*4882a593Smuzhiyun {
368*4882a593Smuzhiyun u32 int_mask;
369*4882a593Smuzhiyun
370*4882a593Smuzhiyun int_mask = i2c_readl(i2c_dev, I2C_INT_MASK) & ~mask;
371*4882a593Smuzhiyun i2c_writel(i2c_dev, int_mask, I2C_INT_MASK);
372*4882a593Smuzhiyun }
373*4882a593Smuzhiyun
tegra_i2c_unmask_irq(struct tegra_i2c_dev * i2c_dev,u32 mask)374*4882a593Smuzhiyun static void tegra_i2c_unmask_irq(struct tegra_i2c_dev *i2c_dev, u32 mask)
375*4882a593Smuzhiyun {
376*4882a593Smuzhiyun u32 int_mask;
377*4882a593Smuzhiyun
378*4882a593Smuzhiyun int_mask = i2c_readl(i2c_dev, I2C_INT_MASK) | mask;
379*4882a593Smuzhiyun i2c_writel(i2c_dev, int_mask, I2C_INT_MASK);
380*4882a593Smuzhiyun }
381*4882a593Smuzhiyun
tegra_i2c_dma_complete(void * args)382*4882a593Smuzhiyun static void tegra_i2c_dma_complete(void *args)
383*4882a593Smuzhiyun {
384*4882a593Smuzhiyun struct tegra_i2c_dev *i2c_dev = args;
385*4882a593Smuzhiyun
386*4882a593Smuzhiyun complete(&i2c_dev->dma_complete);
387*4882a593Smuzhiyun }
388*4882a593Smuzhiyun
tegra_i2c_dma_submit(struct tegra_i2c_dev * i2c_dev,size_t len)389*4882a593Smuzhiyun static int tegra_i2c_dma_submit(struct tegra_i2c_dev *i2c_dev, size_t len)
390*4882a593Smuzhiyun {
391*4882a593Smuzhiyun struct dma_async_tx_descriptor *dma_desc;
392*4882a593Smuzhiyun enum dma_transfer_direction dir;
393*4882a593Smuzhiyun struct dma_chan *chan;
394*4882a593Smuzhiyun
395*4882a593Smuzhiyun dev_dbg(i2c_dev->dev, "starting DMA for length: %zu\n", len);
396*4882a593Smuzhiyun
397*4882a593Smuzhiyun reinit_completion(&i2c_dev->dma_complete);
398*4882a593Smuzhiyun
399*4882a593Smuzhiyun dir = i2c_dev->msg_read ? DMA_DEV_TO_MEM : DMA_MEM_TO_DEV;
400*4882a593Smuzhiyun chan = i2c_dev->msg_read ? i2c_dev->rx_dma_chan : i2c_dev->tx_dma_chan;
401*4882a593Smuzhiyun
402*4882a593Smuzhiyun dma_desc = dmaengine_prep_slave_single(chan, i2c_dev->dma_phys,
403*4882a593Smuzhiyun len, dir, DMA_PREP_INTERRUPT |
404*4882a593Smuzhiyun DMA_CTRL_ACK);
405*4882a593Smuzhiyun if (!dma_desc) {
406*4882a593Smuzhiyun dev_err(i2c_dev->dev, "failed to get %s DMA descriptor\n",
407*4882a593Smuzhiyun i2c_dev->msg_read ? "RX" : "TX");
408*4882a593Smuzhiyun return -EINVAL;
409*4882a593Smuzhiyun }
410*4882a593Smuzhiyun
411*4882a593Smuzhiyun dma_desc->callback = tegra_i2c_dma_complete;
412*4882a593Smuzhiyun dma_desc->callback_param = i2c_dev;
413*4882a593Smuzhiyun
414*4882a593Smuzhiyun dmaengine_submit(dma_desc);
415*4882a593Smuzhiyun dma_async_issue_pending(chan);
416*4882a593Smuzhiyun
417*4882a593Smuzhiyun return 0;
418*4882a593Smuzhiyun }
419*4882a593Smuzhiyun
tegra_i2c_release_dma(struct tegra_i2c_dev * i2c_dev)420*4882a593Smuzhiyun static void tegra_i2c_release_dma(struct tegra_i2c_dev *i2c_dev)
421*4882a593Smuzhiyun {
422*4882a593Smuzhiyun if (i2c_dev->dma_buf) {
423*4882a593Smuzhiyun dma_free_coherent(i2c_dev->dma_dev, i2c_dev->dma_buf_size,
424*4882a593Smuzhiyun i2c_dev->dma_buf, i2c_dev->dma_phys);
425*4882a593Smuzhiyun i2c_dev->dma_buf = NULL;
426*4882a593Smuzhiyun }
427*4882a593Smuzhiyun
428*4882a593Smuzhiyun if (i2c_dev->tx_dma_chan) {
429*4882a593Smuzhiyun dma_release_channel(i2c_dev->tx_dma_chan);
430*4882a593Smuzhiyun i2c_dev->tx_dma_chan = NULL;
431*4882a593Smuzhiyun }
432*4882a593Smuzhiyun
433*4882a593Smuzhiyun if (i2c_dev->rx_dma_chan) {
434*4882a593Smuzhiyun dma_release_channel(i2c_dev->rx_dma_chan);
435*4882a593Smuzhiyun i2c_dev->rx_dma_chan = NULL;
436*4882a593Smuzhiyun }
437*4882a593Smuzhiyun }
438*4882a593Smuzhiyun
tegra_i2c_init_dma(struct tegra_i2c_dev * i2c_dev)439*4882a593Smuzhiyun static int tegra_i2c_init_dma(struct tegra_i2c_dev *i2c_dev)
440*4882a593Smuzhiyun {
441*4882a593Smuzhiyun struct dma_chan *chan;
442*4882a593Smuzhiyun dma_addr_t dma_phys;
443*4882a593Smuzhiyun u32 *dma_buf;
444*4882a593Smuzhiyun int err;
445*4882a593Smuzhiyun
446*4882a593Smuzhiyun if (!i2c_dev->hw->has_apb_dma || i2c_dev->is_vi)
447*4882a593Smuzhiyun return 0;
448*4882a593Smuzhiyun
449*4882a593Smuzhiyun if (!IS_ENABLED(CONFIG_TEGRA20_APB_DMA)) {
450*4882a593Smuzhiyun dev_dbg(i2c_dev->dev, "DMA support not enabled\n");
451*4882a593Smuzhiyun return 0;
452*4882a593Smuzhiyun }
453*4882a593Smuzhiyun
454*4882a593Smuzhiyun chan = dma_request_chan(i2c_dev->dev, "rx");
455*4882a593Smuzhiyun if (IS_ERR(chan)) {
456*4882a593Smuzhiyun err = PTR_ERR(chan);
457*4882a593Smuzhiyun goto err_out;
458*4882a593Smuzhiyun }
459*4882a593Smuzhiyun
460*4882a593Smuzhiyun i2c_dev->rx_dma_chan = chan;
461*4882a593Smuzhiyun
462*4882a593Smuzhiyun chan = dma_request_chan(i2c_dev->dev, "tx");
463*4882a593Smuzhiyun if (IS_ERR(chan)) {
464*4882a593Smuzhiyun err = PTR_ERR(chan);
465*4882a593Smuzhiyun goto err_out;
466*4882a593Smuzhiyun }
467*4882a593Smuzhiyun
468*4882a593Smuzhiyun i2c_dev->tx_dma_chan = chan;
469*4882a593Smuzhiyun
470*4882a593Smuzhiyun WARN_ON(i2c_dev->tx_dma_chan->device != i2c_dev->rx_dma_chan->device);
471*4882a593Smuzhiyun i2c_dev->dma_dev = chan->device->dev;
472*4882a593Smuzhiyun
473*4882a593Smuzhiyun i2c_dev->dma_buf_size = i2c_dev->hw->quirks->max_write_len +
474*4882a593Smuzhiyun I2C_PACKET_HEADER_SIZE;
475*4882a593Smuzhiyun
476*4882a593Smuzhiyun dma_buf = dma_alloc_coherent(i2c_dev->dma_dev, i2c_dev->dma_buf_size,
477*4882a593Smuzhiyun &dma_phys, GFP_KERNEL | __GFP_NOWARN);
478*4882a593Smuzhiyun if (!dma_buf) {
479*4882a593Smuzhiyun dev_err(i2c_dev->dev, "failed to allocate DMA buffer\n");
480*4882a593Smuzhiyun err = -ENOMEM;
481*4882a593Smuzhiyun goto err_out;
482*4882a593Smuzhiyun }
483*4882a593Smuzhiyun
484*4882a593Smuzhiyun i2c_dev->dma_buf = dma_buf;
485*4882a593Smuzhiyun i2c_dev->dma_phys = dma_phys;
486*4882a593Smuzhiyun
487*4882a593Smuzhiyun return 0;
488*4882a593Smuzhiyun
489*4882a593Smuzhiyun err_out:
490*4882a593Smuzhiyun tegra_i2c_release_dma(i2c_dev);
491*4882a593Smuzhiyun if (err != -EPROBE_DEFER) {
492*4882a593Smuzhiyun dev_err(i2c_dev->dev, "cannot use DMA: %d\n", err);
493*4882a593Smuzhiyun dev_err(i2c_dev->dev, "falling back to PIO\n");
494*4882a593Smuzhiyun return 0;
495*4882a593Smuzhiyun }
496*4882a593Smuzhiyun
497*4882a593Smuzhiyun return err;
498*4882a593Smuzhiyun }
499*4882a593Smuzhiyun
500*4882a593Smuzhiyun /*
501*4882a593Smuzhiyun * One of the Tegra I2C blocks is inside the DVC (Digital Voltage Controller)
502*4882a593Smuzhiyun * block. This block is identical to the rest of the I2C blocks, except that
503*4882a593Smuzhiyun * it only supports master mode, it has registers moved around, and it needs
504*4882a593Smuzhiyun * some extra init to get it into I2C mode. The register moves are handled
505*4882a593Smuzhiyun * by i2c_readl() and i2c_writel().
506*4882a593Smuzhiyun */
tegra_dvc_init(struct tegra_i2c_dev * i2c_dev)507*4882a593Smuzhiyun static void tegra_dvc_init(struct tegra_i2c_dev *i2c_dev)
508*4882a593Smuzhiyun {
509*4882a593Smuzhiyun u32 val;
510*4882a593Smuzhiyun
511*4882a593Smuzhiyun val = dvc_readl(i2c_dev, DVC_CTRL_REG3);
512*4882a593Smuzhiyun val |= DVC_CTRL_REG3_SW_PROG;
513*4882a593Smuzhiyun val |= DVC_CTRL_REG3_I2C_DONE_INTR_EN;
514*4882a593Smuzhiyun dvc_writel(i2c_dev, val, DVC_CTRL_REG3);
515*4882a593Smuzhiyun
516*4882a593Smuzhiyun val = dvc_readl(i2c_dev, DVC_CTRL_REG1);
517*4882a593Smuzhiyun val |= DVC_CTRL_REG1_INTR_EN;
518*4882a593Smuzhiyun dvc_writel(i2c_dev, val, DVC_CTRL_REG1);
519*4882a593Smuzhiyun }
520*4882a593Smuzhiyun
tegra_i2c_vi_init(struct tegra_i2c_dev * i2c_dev)521*4882a593Smuzhiyun static void tegra_i2c_vi_init(struct tegra_i2c_dev *i2c_dev)
522*4882a593Smuzhiyun {
523*4882a593Smuzhiyun u32 value;
524*4882a593Smuzhiyun
525*4882a593Smuzhiyun value = FIELD_PREP(I2C_INTERFACE_TIMING_THIGH, 2) |
526*4882a593Smuzhiyun FIELD_PREP(I2C_INTERFACE_TIMING_TLOW, 4);
527*4882a593Smuzhiyun i2c_writel(i2c_dev, value, I2C_INTERFACE_TIMING_0);
528*4882a593Smuzhiyun
529*4882a593Smuzhiyun value = FIELD_PREP(I2C_INTERFACE_TIMING_TBUF, 4) |
530*4882a593Smuzhiyun FIELD_PREP(I2C_INTERFACE_TIMING_TSU_STO, 7) |
531*4882a593Smuzhiyun FIELD_PREP(I2C_INTERFACE_TIMING_THD_STA, 4) |
532*4882a593Smuzhiyun FIELD_PREP(I2C_INTERFACE_TIMING_TSU_STA, 4);
533*4882a593Smuzhiyun i2c_writel(i2c_dev, value, I2C_INTERFACE_TIMING_1);
534*4882a593Smuzhiyun
535*4882a593Smuzhiyun value = FIELD_PREP(I2C_HS_INTERFACE_TIMING_THIGH, 3) |
536*4882a593Smuzhiyun FIELD_PREP(I2C_HS_INTERFACE_TIMING_TLOW, 8);
537*4882a593Smuzhiyun i2c_writel(i2c_dev, value, I2C_HS_INTERFACE_TIMING_0);
538*4882a593Smuzhiyun
539*4882a593Smuzhiyun value = FIELD_PREP(I2C_HS_INTERFACE_TIMING_TSU_STO, 11) |
540*4882a593Smuzhiyun FIELD_PREP(I2C_HS_INTERFACE_TIMING_THD_STA, 11) |
541*4882a593Smuzhiyun FIELD_PREP(I2C_HS_INTERFACE_TIMING_TSU_STA, 11);
542*4882a593Smuzhiyun i2c_writel(i2c_dev, value, I2C_HS_INTERFACE_TIMING_1);
543*4882a593Smuzhiyun
544*4882a593Smuzhiyun value = FIELD_PREP(I2C_BC_SCLK_THRESHOLD, 9) | I2C_BC_STOP_COND;
545*4882a593Smuzhiyun i2c_writel(i2c_dev, value, I2C_BUS_CLEAR_CNFG);
546*4882a593Smuzhiyun
547*4882a593Smuzhiyun i2c_writel(i2c_dev, 0x0, I2C_TLOW_SEXT);
548*4882a593Smuzhiyun }
549*4882a593Smuzhiyun
tegra_i2c_poll_register(struct tegra_i2c_dev * i2c_dev,u32 reg,u32 mask,u32 delay_us,u32 timeout_us)550*4882a593Smuzhiyun static int tegra_i2c_poll_register(struct tegra_i2c_dev *i2c_dev,
551*4882a593Smuzhiyun u32 reg, u32 mask, u32 delay_us,
552*4882a593Smuzhiyun u32 timeout_us)
553*4882a593Smuzhiyun {
554*4882a593Smuzhiyun void __iomem *addr = i2c_dev->base + tegra_i2c_reg_addr(i2c_dev, reg);
555*4882a593Smuzhiyun u32 val;
556*4882a593Smuzhiyun
557*4882a593Smuzhiyun if (!i2c_dev->atomic_mode && !in_irq())
558*4882a593Smuzhiyun return readl_relaxed_poll_timeout(addr, val, !(val & mask),
559*4882a593Smuzhiyun delay_us, timeout_us);
560*4882a593Smuzhiyun
561*4882a593Smuzhiyun return readl_relaxed_poll_timeout_atomic(addr, val, !(val & mask),
562*4882a593Smuzhiyun delay_us, timeout_us);
563*4882a593Smuzhiyun }
564*4882a593Smuzhiyun
tegra_i2c_flush_fifos(struct tegra_i2c_dev * i2c_dev)565*4882a593Smuzhiyun static int tegra_i2c_flush_fifos(struct tegra_i2c_dev *i2c_dev)
566*4882a593Smuzhiyun {
567*4882a593Smuzhiyun u32 mask, val, offset;
568*4882a593Smuzhiyun int err;
569*4882a593Smuzhiyun
570*4882a593Smuzhiyun if (i2c_dev->hw->has_mst_fifo) {
571*4882a593Smuzhiyun mask = I2C_MST_FIFO_CONTROL_TX_FLUSH |
572*4882a593Smuzhiyun I2C_MST_FIFO_CONTROL_RX_FLUSH;
573*4882a593Smuzhiyun offset = I2C_MST_FIFO_CONTROL;
574*4882a593Smuzhiyun } else {
575*4882a593Smuzhiyun mask = I2C_FIFO_CONTROL_TX_FLUSH |
576*4882a593Smuzhiyun I2C_FIFO_CONTROL_RX_FLUSH;
577*4882a593Smuzhiyun offset = I2C_FIFO_CONTROL;
578*4882a593Smuzhiyun }
579*4882a593Smuzhiyun
580*4882a593Smuzhiyun val = i2c_readl(i2c_dev, offset);
581*4882a593Smuzhiyun val |= mask;
582*4882a593Smuzhiyun i2c_writel(i2c_dev, val, offset);
583*4882a593Smuzhiyun
584*4882a593Smuzhiyun err = tegra_i2c_poll_register(i2c_dev, offset, mask, 1000, 1000000);
585*4882a593Smuzhiyun if (err) {
586*4882a593Smuzhiyun dev_err(i2c_dev->dev, "failed to flush FIFO\n");
587*4882a593Smuzhiyun return err;
588*4882a593Smuzhiyun }
589*4882a593Smuzhiyun
590*4882a593Smuzhiyun return 0;
591*4882a593Smuzhiyun }
592*4882a593Smuzhiyun
tegra_i2c_wait_for_config_load(struct tegra_i2c_dev * i2c_dev)593*4882a593Smuzhiyun static int tegra_i2c_wait_for_config_load(struct tegra_i2c_dev *i2c_dev)
594*4882a593Smuzhiyun {
595*4882a593Smuzhiyun int err;
596*4882a593Smuzhiyun
597*4882a593Smuzhiyun if (!i2c_dev->hw->has_config_load_reg)
598*4882a593Smuzhiyun return 0;
599*4882a593Smuzhiyun
600*4882a593Smuzhiyun i2c_writel(i2c_dev, I2C_MSTR_CONFIG_LOAD, I2C_CONFIG_LOAD);
601*4882a593Smuzhiyun
602*4882a593Smuzhiyun err = tegra_i2c_poll_register(i2c_dev, I2C_CONFIG_LOAD, 0xffffffff,
603*4882a593Smuzhiyun 1000, I2C_CONFIG_LOAD_TIMEOUT);
604*4882a593Smuzhiyun if (err) {
605*4882a593Smuzhiyun dev_err(i2c_dev->dev, "failed to load config\n");
606*4882a593Smuzhiyun return err;
607*4882a593Smuzhiyun }
608*4882a593Smuzhiyun
609*4882a593Smuzhiyun return 0;
610*4882a593Smuzhiyun }
611*4882a593Smuzhiyun
tegra_i2c_init(struct tegra_i2c_dev * i2c_dev)612*4882a593Smuzhiyun static int tegra_i2c_init(struct tegra_i2c_dev *i2c_dev)
613*4882a593Smuzhiyun {
614*4882a593Smuzhiyun u32 val, clk_divisor, clk_multiplier, tsu_thd, tlow, thigh, non_hs_mode;
615*4882a593Smuzhiyun int err;
616*4882a593Smuzhiyun
617*4882a593Smuzhiyun /*
618*4882a593Smuzhiyun * The reset shouldn't ever fail in practice. The failure will be a
619*4882a593Smuzhiyun * sign of a severe problem that needs to be resolved. Still we don't
620*4882a593Smuzhiyun * want to fail the initialization completely because this may break
621*4882a593Smuzhiyun * kernel boot up since voltage regulators use I2C. Hence, we will
622*4882a593Smuzhiyun * emit a noisy warning on error, which won't stay unnoticed and
623*4882a593Smuzhiyun * won't hose machine entirely.
624*4882a593Smuzhiyun */
625*4882a593Smuzhiyun err = reset_control_reset(i2c_dev->rst);
626*4882a593Smuzhiyun WARN_ON_ONCE(err);
627*4882a593Smuzhiyun
628*4882a593Smuzhiyun if (i2c_dev->is_dvc)
629*4882a593Smuzhiyun tegra_dvc_init(i2c_dev);
630*4882a593Smuzhiyun
631*4882a593Smuzhiyun val = I2C_CNFG_NEW_MASTER_FSM | I2C_CNFG_PACKET_MODE_EN |
632*4882a593Smuzhiyun FIELD_PREP(I2C_CNFG_DEBOUNCE_CNT, 2);
633*4882a593Smuzhiyun
634*4882a593Smuzhiyun if (i2c_dev->hw->has_multi_master_mode)
635*4882a593Smuzhiyun val |= I2C_CNFG_MULTI_MASTER_MODE;
636*4882a593Smuzhiyun
637*4882a593Smuzhiyun i2c_writel(i2c_dev, val, I2C_CNFG);
638*4882a593Smuzhiyun i2c_writel(i2c_dev, 0, I2C_INT_MASK);
639*4882a593Smuzhiyun
640*4882a593Smuzhiyun if (i2c_dev->is_vi)
641*4882a593Smuzhiyun tegra_i2c_vi_init(i2c_dev);
642*4882a593Smuzhiyun
643*4882a593Smuzhiyun switch (i2c_dev->bus_clk_rate) {
644*4882a593Smuzhiyun case I2C_MAX_STANDARD_MODE_FREQ + 1 ... I2C_MAX_FAST_MODE_PLUS_FREQ:
645*4882a593Smuzhiyun default:
646*4882a593Smuzhiyun tlow = i2c_dev->hw->tlow_fast_fastplus_mode;
647*4882a593Smuzhiyun thigh = i2c_dev->hw->thigh_fast_fastplus_mode;
648*4882a593Smuzhiyun tsu_thd = i2c_dev->hw->setup_hold_time_fast_fast_plus_mode;
649*4882a593Smuzhiyun
650*4882a593Smuzhiyun if (i2c_dev->bus_clk_rate > I2C_MAX_FAST_MODE_FREQ)
651*4882a593Smuzhiyun non_hs_mode = i2c_dev->hw->clk_divisor_fast_plus_mode;
652*4882a593Smuzhiyun else
653*4882a593Smuzhiyun non_hs_mode = i2c_dev->hw->clk_divisor_fast_mode;
654*4882a593Smuzhiyun break;
655*4882a593Smuzhiyun
656*4882a593Smuzhiyun case 0 ... I2C_MAX_STANDARD_MODE_FREQ:
657*4882a593Smuzhiyun tlow = i2c_dev->hw->tlow_std_mode;
658*4882a593Smuzhiyun thigh = i2c_dev->hw->thigh_std_mode;
659*4882a593Smuzhiyun tsu_thd = i2c_dev->hw->setup_hold_time_std_mode;
660*4882a593Smuzhiyun non_hs_mode = i2c_dev->hw->clk_divisor_std_mode;
661*4882a593Smuzhiyun break;
662*4882a593Smuzhiyun }
663*4882a593Smuzhiyun
664*4882a593Smuzhiyun /* make sure clock divisor programmed correctly */
665*4882a593Smuzhiyun clk_divisor = FIELD_PREP(I2C_CLK_DIVISOR_HSMODE,
666*4882a593Smuzhiyun i2c_dev->hw->clk_divisor_hs_mode) |
667*4882a593Smuzhiyun FIELD_PREP(I2C_CLK_DIVISOR_STD_FAST_MODE, non_hs_mode);
668*4882a593Smuzhiyun i2c_writel(i2c_dev, clk_divisor, I2C_CLK_DIVISOR);
669*4882a593Smuzhiyun
670*4882a593Smuzhiyun if (i2c_dev->hw->has_interface_timing_reg) {
671*4882a593Smuzhiyun val = FIELD_PREP(I2C_INTERFACE_TIMING_THIGH, thigh) |
672*4882a593Smuzhiyun FIELD_PREP(I2C_INTERFACE_TIMING_TLOW, tlow);
673*4882a593Smuzhiyun i2c_writel(i2c_dev, val, I2C_INTERFACE_TIMING_0);
674*4882a593Smuzhiyun }
675*4882a593Smuzhiyun
676*4882a593Smuzhiyun /*
677*4882a593Smuzhiyun * Configure setup and hold times only when tsu_thd is non-zero.
678*4882a593Smuzhiyun * Otherwise, preserve the chip default values.
679*4882a593Smuzhiyun */
680*4882a593Smuzhiyun if (i2c_dev->hw->has_interface_timing_reg && tsu_thd)
681*4882a593Smuzhiyun i2c_writel(i2c_dev, tsu_thd, I2C_INTERFACE_TIMING_1);
682*4882a593Smuzhiyun
683*4882a593Smuzhiyun clk_multiplier = (tlow + thigh + 2) * (non_hs_mode + 1);
684*4882a593Smuzhiyun
685*4882a593Smuzhiyun err = clk_set_rate(i2c_dev->div_clk,
686*4882a593Smuzhiyun i2c_dev->bus_clk_rate * clk_multiplier);
687*4882a593Smuzhiyun if (err) {
688*4882a593Smuzhiyun dev_err(i2c_dev->dev, "failed to set div-clk rate: %d\n", err);
689*4882a593Smuzhiyun return err;
690*4882a593Smuzhiyun }
691*4882a593Smuzhiyun
692*4882a593Smuzhiyun if (!i2c_dev->is_dvc && !i2c_dev->is_vi) {
693*4882a593Smuzhiyun u32 sl_cfg = i2c_readl(i2c_dev, I2C_SL_CNFG);
694*4882a593Smuzhiyun
695*4882a593Smuzhiyun sl_cfg |= I2C_SL_CNFG_NACK | I2C_SL_CNFG_NEWSL;
696*4882a593Smuzhiyun i2c_writel(i2c_dev, sl_cfg, I2C_SL_CNFG);
697*4882a593Smuzhiyun i2c_writel(i2c_dev, 0xfc, I2C_SL_ADDR1);
698*4882a593Smuzhiyun i2c_writel(i2c_dev, 0x00, I2C_SL_ADDR2);
699*4882a593Smuzhiyun }
700*4882a593Smuzhiyun
701*4882a593Smuzhiyun err = tegra_i2c_flush_fifos(i2c_dev);
702*4882a593Smuzhiyun if (err)
703*4882a593Smuzhiyun return err;
704*4882a593Smuzhiyun
705*4882a593Smuzhiyun if (i2c_dev->multimaster_mode && i2c_dev->hw->has_slcg_override_reg)
706*4882a593Smuzhiyun i2c_writel(i2c_dev, I2C_MST_CORE_CLKEN_OVR, I2C_CLKEN_OVERRIDE);
707*4882a593Smuzhiyun
708*4882a593Smuzhiyun err = tegra_i2c_wait_for_config_load(i2c_dev);
709*4882a593Smuzhiyun if (err)
710*4882a593Smuzhiyun return err;
711*4882a593Smuzhiyun
712*4882a593Smuzhiyun return 0;
713*4882a593Smuzhiyun }
714*4882a593Smuzhiyun
tegra_i2c_disable_packet_mode(struct tegra_i2c_dev * i2c_dev)715*4882a593Smuzhiyun static int tegra_i2c_disable_packet_mode(struct tegra_i2c_dev *i2c_dev)
716*4882a593Smuzhiyun {
717*4882a593Smuzhiyun u32 cnfg;
718*4882a593Smuzhiyun
719*4882a593Smuzhiyun /*
720*4882a593Smuzhiyun * NACK interrupt is generated before the I2C controller generates
721*4882a593Smuzhiyun * the STOP condition on the bus. So, wait for 2 clock periods
722*4882a593Smuzhiyun * before disabling the controller so that the STOP condition has
723*4882a593Smuzhiyun * been delivered properly.
724*4882a593Smuzhiyun */
725*4882a593Smuzhiyun udelay(DIV_ROUND_UP(2 * 1000000, i2c_dev->bus_clk_rate));
726*4882a593Smuzhiyun
727*4882a593Smuzhiyun cnfg = i2c_readl(i2c_dev, I2C_CNFG);
728*4882a593Smuzhiyun if (cnfg & I2C_CNFG_PACKET_MODE_EN)
729*4882a593Smuzhiyun i2c_writel(i2c_dev, cnfg & ~I2C_CNFG_PACKET_MODE_EN, I2C_CNFG);
730*4882a593Smuzhiyun
731*4882a593Smuzhiyun return tegra_i2c_wait_for_config_load(i2c_dev);
732*4882a593Smuzhiyun }
733*4882a593Smuzhiyun
tegra_i2c_empty_rx_fifo(struct tegra_i2c_dev * i2c_dev)734*4882a593Smuzhiyun static int tegra_i2c_empty_rx_fifo(struct tegra_i2c_dev *i2c_dev)
735*4882a593Smuzhiyun {
736*4882a593Smuzhiyun size_t buf_remaining = i2c_dev->msg_buf_remaining;
737*4882a593Smuzhiyun unsigned int words_to_transfer, rx_fifo_avail;
738*4882a593Smuzhiyun u8 *buf = i2c_dev->msg_buf;
739*4882a593Smuzhiyun u32 val;
740*4882a593Smuzhiyun
741*4882a593Smuzhiyun /*
742*4882a593Smuzhiyun * Catch overflow due to message fully sent before the check for
743*4882a593Smuzhiyun * RX FIFO availability.
744*4882a593Smuzhiyun */
745*4882a593Smuzhiyun if (WARN_ON_ONCE(!(i2c_dev->msg_buf_remaining)))
746*4882a593Smuzhiyun return -EINVAL;
747*4882a593Smuzhiyun
748*4882a593Smuzhiyun if (i2c_dev->hw->has_mst_fifo) {
749*4882a593Smuzhiyun val = i2c_readl(i2c_dev, I2C_MST_FIFO_STATUS);
750*4882a593Smuzhiyun rx_fifo_avail = FIELD_GET(I2C_MST_FIFO_STATUS_RX, val);
751*4882a593Smuzhiyun } else {
752*4882a593Smuzhiyun val = i2c_readl(i2c_dev, I2C_FIFO_STATUS);
753*4882a593Smuzhiyun rx_fifo_avail = FIELD_GET(I2C_FIFO_STATUS_RX, val);
754*4882a593Smuzhiyun }
755*4882a593Smuzhiyun
756*4882a593Smuzhiyun /* round down to exclude partial word at the end of buffer */
757*4882a593Smuzhiyun words_to_transfer = buf_remaining / BYTES_PER_FIFO_WORD;
758*4882a593Smuzhiyun if (words_to_transfer > rx_fifo_avail)
759*4882a593Smuzhiyun words_to_transfer = rx_fifo_avail;
760*4882a593Smuzhiyun
761*4882a593Smuzhiyun i2c_readsl(i2c_dev, buf, I2C_RX_FIFO, words_to_transfer);
762*4882a593Smuzhiyun
763*4882a593Smuzhiyun buf += words_to_transfer * BYTES_PER_FIFO_WORD;
764*4882a593Smuzhiyun buf_remaining -= words_to_transfer * BYTES_PER_FIFO_WORD;
765*4882a593Smuzhiyun rx_fifo_avail -= words_to_transfer;
766*4882a593Smuzhiyun
767*4882a593Smuzhiyun /*
768*4882a593Smuzhiyun * If there is a partial word at the end of buffer, handle it
769*4882a593Smuzhiyun * manually to prevent overwriting past the end of buffer.
770*4882a593Smuzhiyun */
771*4882a593Smuzhiyun if (rx_fifo_avail > 0 && buf_remaining > 0) {
772*4882a593Smuzhiyun /*
773*4882a593Smuzhiyun * buf_remaining > 3 check not needed as rx_fifo_avail == 0
774*4882a593Smuzhiyun * when (words_to_transfer was > rx_fifo_avail) earlier
775*4882a593Smuzhiyun * in this function.
776*4882a593Smuzhiyun */
777*4882a593Smuzhiyun val = i2c_readl(i2c_dev, I2C_RX_FIFO);
778*4882a593Smuzhiyun val = cpu_to_le32(val);
779*4882a593Smuzhiyun memcpy(buf, &val, buf_remaining);
780*4882a593Smuzhiyun buf_remaining = 0;
781*4882a593Smuzhiyun rx_fifo_avail--;
782*4882a593Smuzhiyun }
783*4882a593Smuzhiyun
784*4882a593Smuzhiyun /* RX FIFO must be drained, otherwise it's an Overflow case. */
785*4882a593Smuzhiyun if (WARN_ON_ONCE(rx_fifo_avail))
786*4882a593Smuzhiyun return -EINVAL;
787*4882a593Smuzhiyun
788*4882a593Smuzhiyun i2c_dev->msg_buf_remaining = buf_remaining;
789*4882a593Smuzhiyun i2c_dev->msg_buf = buf;
790*4882a593Smuzhiyun
791*4882a593Smuzhiyun return 0;
792*4882a593Smuzhiyun }
793*4882a593Smuzhiyun
tegra_i2c_fill_tx_fifo(struct tegra_i2c_dev * i2c_dev)794*4882a593Smuzhiyun static int tegra_i2c_fill_tx_fifo(struct tegra_i2c_dev *i2c_dev)
795*4882a593Smuzhiyun {
796*4882a593Smuzhiyun size_t buf_remaining = i2c_dev->msg_buf_remaining;
797*4882a593Smuzhiyun unsigned int words_to_transfer, tx_fifo_avail;
798*4882a593Smuzhiyun u8 *buf = i2c_dev->msg_buf;
799*4882a593Smuzhiyun u32 val;
800*4882a593Smuzhiyun
801*4882a593Smuzhiyun if (i2c_dev->hw->has_mst_fifo) {
802*4882a593Smuzhiyun val = i2c_readl(i2c_dev, I2C_MST_FIFO_STATUS);
803*4882a593Smuzhiyun tx_fifo_avail = FIELD_GET(I2C_MST_FIFO_STATUS_TX, val);
804*4882a593Smuzhiyun } else {
805*4882a593Smuzhiyun val = i2c_readl(i2c_dev, I2C_FIFO_STATUS);
806*4882a593Smuzhiyun tx_fifo_avail = FIELD_GET(I2C_FIFO_STATUS_TX, val);
807*4882a593Smuzhiyun }
808*4882a593Smuzhiyun
809*4882a593Smuzhiyun /* round down to exclude partial word at the end of buffer */
810*4882a593Smuzhiyun words_to_transfer = buf_remaining / BYTES_PER_FIFO_WORD;
811*4882a593Smuzhiyun
812*4882a593Smuzhiyun /*
813*4882a593Smuzhiyun * This hunk pushes 4 bytes at a time into the TX FIFO.
814*4882a593Smuzhiyun *
815*4882a593Smuzhiyun * It's very common to have < 4 bytes, hence there is no word
816*4882a593Smuzhiyun * to push if we have less than 4 bytes to transfer.
817*4882a593Smuzhiyun */
818*4882a593Smuzhiyun if (words_to_transfer) {
819*4882a593Smuzhiyun if (words_to_transfer > tx_fifo_avail)
820*4882a593Smuzhiyun words_to_transfer = tx_fifo_avail;
821*4882a593Smuzhiyun
822*4882a593Smuzhiyun /*
823*4882a593Smuzhiyun * Update state before writing to FIFO. Note that this may
824*4882a593Smuzhiyun * cause us to finish writing all bytes (AKA buf_remaining
825*4882a593Smuzhiyun * goes to 0), hence we have a potential for an interrupt
826*4882a593Smuzhiyun * (PACKET_XFER_COMPLETE is not maskable), but GIC interrupt
827*4882a593Smuzhiyun * is disabled at this point.
828*4882a593Smuzhiyun */
829*4882a593Smuzhiyun buf_remaining -= words_to_transfer * BYTES_PER_FIFO_WORD;
830*4882a593Smuzhiyun tx_fifo_avail -= words_to_transfer;
831*4882a593Smuzhiyun
832*4882a593Smuzhiyun i2c_dev->msg_buf_remaining = buf_remaining;
833*4882a593Smuzhiyun i2c_dev->msg_buf = buf + words_to_transfer * BYTES_PER_FIFO_WORD;
834*4882a593Smuzhiyun
835*4882a593Smuzhiyun if (i2c_dev->is_vi)
836*4882a593Smuzhiyun i2c_writesl_vi(i2c_dev, buf, I2C_TX_FIFO, words_to_transfer);
837*4882a593Smuzhiyun else
838*4882a593Smuzhiyun i2c_writesl(i2c_dev, buf, I2C_TX_FIFO, words_to_transfer);
839*4882a593Smuzhiyun
840*4882a593Smuzhiyun buf += words_to_transfer * BYTES_PER_FIFO_WORD;
841*4882a593Smuzhiyun }
842*4882a593Smuzhiyun
843*4882a593Smuzhiyun /*
844*4882a593Smuzhiyun * If there is a partial word at the end of buffer, handle it manually
845*4882a593Smuzhiyun * to prevent reading past the end of buffer, which could cross a page
846*4882a593Smuzhiyun * boundary and fault.
847*4882a593Smuzhiyun */
848*4882a593Smuzhiyun if (tx_fifo_avail > 0 && buf_remaining > 0) {
849*4882a593Smuzhiyun /*
850*4882a593Smuzhiyun * buf_remaining > 3 check not needed as tx_fifo_avail == 0
851*4882a593Smuzhiyun * when (words_to_transfer was > tx_fifo_avail) earlier
852*4882a593Smuzhiyun * in this function for non-zero words_to_transfer.
853*4882a593Smuzhiyun */
854*4882a593Smuzhiyun memcpy(&val, buf, buf_remaining);
855*4882a593Smuzhiyun val = le32_to_cpu(val);
856*4882a593Smuzhiyun
857*4882a593Smuzhiyun i2c_dev->msg_buf_remaining = 0;
858*4882a593Smuzhiyun i2c_dev->msg_buf = NULL;
859*4882a593Smuzhiyun
860*4882a593Smuzhiyun i2c_writel(i2c_dev, val, I2C_TX_FIFO);
861*4882a593Smuzhiyun }
862*4882a593Smuzhiyun
863*4882a593Smuzhiyun return 0;
864*4882a593Smuzhiyun }
865*4882a593Smuzhiyun
tegra_i2c_isr(int irq,void * dev_id)866*4882a593Smuzhiyun static irqreturn_t tegra_i2c_isr(int irq, void *dev_id)
867*4882a593Smuzhiyun {
868*4882a593Smuzhiyun const u32 status_err = I2C_INT_NO_ACK | I2C_INT_ARBITRATION_LOST;
869*4882a593Smuzhiyun struct tegra_i2c_dev *i2c_dev = dev_id;
870*4882a593Smuzhiyun u32 status;
871*4882a593Smuzhiyun
872*4882a593Smuzhiyun status = i2c_readl(i2c_dev, I2C_INT_STATUS);
873*4882a593Smuzhiyun
874*4882a593Smuzhiyun if (status == 0) {
875*4882a593Smuzhiyun dev_warn(i2c_dev->dev, "IRQ status 0 %08x %08x %08x\n",
876*4882a593Smuzhiyun i2c_readl(i2c_dev, I2C_PACKET_TRANSFER_STATUS),
877*4882a593Smuzhiyun i2c_readl(i2c_dev, I2C_STATUS),
878*4882a593Smuzhiyun i2c_readl(i2c_dev, I2C_CNFG));
879*4882a593Smuzhiyun i2c_dev->msg_err |= I2C_ERR_UNKNOWN_INTERRUPT;
880*4882a593Smuzhiyun goto err;
881*4882a593Smuzhiyun }
882*4882a593Smuzhiyun
883*4882a593Smuzhiyun if (status & status_err) {
884*4882a593Smuzhiyun tegra_i2c_disable_packet_mode(i2c_dev);
885*4882a593Smuzhiyun if (status & I2C_INT_NO_ACK)
886*4882a593Smuzhiyun i2c_dev->msg_err |= I2C_ERR_NO_ACK;
887*4882a593Smuzhiyun if (status & I2C_INT_ARBITRATION_LOST)
888*4882a593Smuzhiyun i2c_dev->msg_err |= I2C_ERR_ARBITRATION_LOST;
889*4882a593Smuzhiyun goto err;
890*4882a593Smuzhiyun }
891*4882a593Smuzhiyun
892*4882a593Smuzhiyun /*
893*4882a593Smuzhiyun * I2C transfer is terminated during the bus clear, so skip
894*4882a593Smuzhiyun * processing the other interrupts.
895*4882a593Smuzhiyun */
896*4882a593Smuzhiyun if (i2c_dev->hw->supports_bus_clear && (status & I2C_INT_BUS_CLR_DONE))
897*4882a593Smuzhiyun goto err;
898*4882a593Smuzhiyun
899*4882a593Smuzhiyun if (!i2c_dev->dma_mode) {
900*4882a593Smuzhiyun if (i2c_dev->msg_read && (status & I2C_INT_RX_FIFO_DATA_REQ)) {
901*4882a593Smuzhiyun if (tegra_i2c_empty_rx_fifo(i2c_dev)) {
902*4882a593Smuzhiyun /*
903*4882a593Smuzhiyun * Overflow error condition: message fully sent,
904*4882a593Smuzhiyun * with no XFER_COMPLETE interrupt but hardware
905*4882a593Smuzhiyun * asks to transfer more.
906*4882a593Smuzhiyun */
907*4882a593Smuzhiyun i2c_dev->msg_err |= I2C_ERR_RX_BUFFER_OVERFLOW;
908*4882a593Smuzhiyun goto err;
909*4882a593Smuzhiyun }
910*4882a593Smuzhiyun }
911*4882a593Smuzhiyun
912*4882a593Smuzhiyun if (!i2c_dev->msg_read && (status & I2C_INT_TX_FIFO_DATA_REQ)) {
913*4882a593Smuzhiyun if (i2c_dev->msg_buf_remaining)
914*4882a593Smuzhiyun tegra_i2c_fill_tx_fifo(i2c_dev);
915*4882a593Smuzhiyun else
916*4882a593Smuzhiyun tegra_i2c_mask_irq(i2c_dev,
917*4882a593Smuzhiyun I2C_INT_TX_FIFO_DATA_REQ);
918*4882a593Smuzhiyun }
919*4882a593Smuzhiyun }
920*4882a593Smuzhiyun
921*4882a593Smuzhiyun i2c_writel(i2c_dev, status, I2C_INT_STATUS);
922*4882a593Smuzhiyun if (i2c_dev->is_dvc)
923*4882a593Smuzhiyun dvc_writel(i2c_dev, DVC_STATUS_I2C_DONE_INTR, DVC_STATUS);
924*4882a593Smuzhiyun
925*4882a593Smuzhiyun /*
926*4882a593Smuzhiyun * During message read XFER_COMPLETE interrupt is triggered prior to
927*4882a593Smuzhiyun * DMA completion and during message write XFER_COMPLETE interrupt is
928*4882a593Smuzhiyun * triggered after DMA completion.
929*4882a593Smuzhiyun *
930*4882a593Smuzhiyun * PACKETS_XFER_COMPLETE indicates completion of all bytes of transfer,
931*4882a593Smuzhiyun * so forcing msg_buf_remaining to 0 in DMA mode.
932*4882a593Smuzhiyun */
933*4882a593Smuzhiyun if (status & I2C_INT_PACKET_XFER_COMPLETE) {
934*4882a593Smuzhiyun if (i2c_dev->dma_mode)
935*4882a593Smuzhiyun i2c_dev->msg_buf_remaining = 0;
936*4882a593Smuzhiyun /*
937*4882a593Smuzhiyun * Underflow error condition: XFER_COMPLETE before message
938*4882a593Smuzhiyun * fully sent.
939*4882a593Smuzhiyun */
940*4882a593Smuzhiyun if (WARN_ON_ONCE(i2c_dev->msg_buf_remaining)) {
941*4882a593Smuzhiyun i2c_dev->msg_err |= I2C_ERR_UNKNOWN_INTERRUPT;
942*4882a593Smuzhiyun goto err;
943*4882a593Smuzhiyun }
944*4882a593Smuzhiyun complete(&i2c_dev->msg_complete);
945*4882a593Smuzhiyun }
946*4882a593Smuzhiyun goto done;
947*4882a593Smuzhiyun err:
948*4882a593Smuzhiyun /* mask all interrupts on error */
949*4882a593Smuzhiyun tegra_i2c_mask_irq(i2c_dev,
950*4882a593Smuzhiyun I2C_INT_NO_ACK |
951*4882a593Smuzhiyun I2C_INT_ARBITRATION_LOST |
952*4882a593Smuzhiyun I2C_INT_PACKET_XFER_COMPLETE |
953*4882a593Smuzhiyun I2C_INT_TX_FIFO_DATA_REQ |
954*4882a593Smuzhiyun I2C_INT_RX_FIFO_DATA_REQ);
955*4882a593Smuzhiyun
956*4882a593Smuzhiyun if (i2c_dev->hw->supports_bus_clear)
957*4882a593Smuzhiyun tegra_i2c_mask_irq(i2c_dev, I2C_INT_BUS_CLR_DONE);
958*4882a593Smuzhiyun
959*4882a593Smuzhiyun i2c_writel(i2c_dev, status, I2C_INT_STATUS);
960*4882a593Smuzhiyun
961*4882a593Smuzhiyun if (i2c_dev->is_dvc)
962*4882a593Smuzhiyun dvc_writel(i2c_dev, DVC_STATUS_I2C_DONE_INTR, DVC_STATUS);
963*4882a593Smuzhiyun
964*4882a593Smuzhiyun if (i2c_dev->dma_mode) {
965*4882a593Smuzhiyun if (i2c_dev->msg_read)
966*4882a593Smuzhiyun dmaengine_terminate_async(i2c_dev->rx_dma_chan);
967*4882a593Smuzhiyun else
968*4882a593Smuzhiyun dmaengine_terminate_async(i2c_dev->tx_dma_chan);
969*4882a593Smuzhiyun
970*4882a593Smuzhiyun complete(&i2c_dev->dma_complete);
971*4882a593Smuzhiyun }
972*4882a593Smuzhiyun
973*4882a593Smuzhiyun complete(&i2c_dev->msg_complete);
974*4882a593Smuzhiyun done:
975*4882a593Smuzhiyun return IRQ_HANDLED;
976*4882a593Smuzhiyun }
977*4882a593Smuzhiyun
tegra_i2c_config_fifo_trig(struct tegra_i2c_dev * i2c_dev,size_t len)978*4882a593Smuzhiyun static void tegra_i2c_config_fifo_trig(struct tegra_i2c_dev *i2c_dev,
979*4882a593Smuzhiyun size_t len)
980*4882a593Smuzhiyun {
981*4882a593Smuzhiyun struct dma_slave_config slv_config = {0};
982*4882a593Smuzhiyun u32 val, reg, dma_burst, reg_offset;
983*4882a593Smuzhiyun struct dma_chan *chan;
984*4882a593Smuzhiyun int err;
985*4882a593Smuzhiyun
986*4882a593Smuzhiyun if (i2c_dev->hw->has_mst_fifo)
987*4882a593Smuzhiyun reg = I2C_MST_FIFO_CONTROL;
988*4882a593Smuzhiyun else
989*4882a593Smuzhiyun reg = I2C_FIFO_CONTROL;
990*4882a593Smuzhiyun
991*4882a593Smuzhiyun if (i2c_dev->dma_mode) {
992*4882a593Smuzhiyun if (len & 0xF)
993*4882a593Smuzhiyun dma_burst = 1;
994*4882a593Smuzhiyun else if (len & 0x10)
995*4882a593Smuzhiyun dma_burst = 4;
996*4882a593Smuzhiyun else
997*4882a593Smuzhiyun dma_burst = 8;
998*4882a593Smuzhiyun
999*4882a593Smuzhiyun if (i2c_dev->msg_read) {
1000*4882a593Smuzhiyun chan = i2c_dev->rx_dma_chan;
1001*4882a593Smuzhiyun reg_offset = tegra_i2c_reg_addr(i2c_dev, I2C_RX_FIFO);
1002*4882a593Smuzhiyun
1003*4882a593Smuzhiyun slv_config.src_addr = i2c_dev->base_phys + reg_offset;
1004*4882a593Smuzhiyun slv_config.src_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES;
1005*4882a593Smuzhiyun slv_config.src_maxburst = dma_burst;
1006*4882a593Smuzhiyun
1007*4882a593Smuzhiyun if (i2c_dev->hw->has_mst_fifo)
1008*4882a593Smuzhiyun val = I2C_MST_FIFO_CONTROL_RX_TRIG(dma_burst);
1009*4882a593Smuzhiyun else
1010*4882a593Smuzhiyun val = I2C_FIFO_CONTROL_RX_TRIG(dma_burst);
1011*4882a593Smuzhiyun } else {
1012*4882a593Smuzhiyun chan = i2c_dev->tx_dma_chan;
1013*4882a593Smuzhiyun reg_offset = tegra_i2c_reg_addr(i2c_dev, I2C_TX_FIFO);
1014*4882a593Smuzhiyun
1015*4882a593Smuzhiyun slv_config.dst_addr = i2c_dev->base_phys + reg_offset;
1016*4882a593Smuzhiyun slv_config.dst_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES;
1017*4882a593Smuzhiyun slv_config.dst_maxburst = dma_burst;
1018*4882a593Smuzhiyun
1019*4882a593Smuzhiyun if (i2c_dev->hw->has_mst_fifo)
1020*4882a593Smuzhiyun val = I2C_MST_FIFO_CONTROL_TX_TRIG(dma_burst);
1021*4882a593Smuzhiyun else
1022*4882a593Smuzhiyun val = I2C_FIFO_CONTROL_TX_TRIG(dma_burst);
1023*4882a593Smuzhiyun }
1024*4882a593Smuzhiyun
1025*4882a593Smuzhiyun slv_config.device_fc = true;
1026*4882a593Smuzhiyun err = dmaengine_slave_config(chan, &slv_config);
1027*4882a593Smuzhiyun if (err) {
1028*4882a593Smuzhiyun dev_err(i2c_dev->dev, "DMA config failed: %d\n", err);
1029*4882a593Smuzhiyun dev_err(i2c_dev->dev, "falling back to PIO\n");
1030*4882a593Smuzhiyun
1031*4882a593Smuzhiyun tegra_i2c_release_dma(i2c_dev);
1032*4882a593Smuzhiyun i2c_dev->dma_mode = false;
1033*4882a593Smuzhiyun } else {
1034*4882a593Smuzhiyun goto out;
1035*4882a593Smuzhiyun }
1036*4882a593Smuzhiyun }
1037*4882a593Smuzhiyun
1038*4882a593Smuzhiyun if (i2c_dev->hw->has_mst_fifo)
1039*4882a593Smuzhiyun val = I2C_MST_FIFO_CONTROL_TX_TRIG(8) |
1040*4882a593Smuzhiyun I2C_MST_FIFO_CONTROL_RX_TRIG(1);
1041*4882a593Smuzhiyun else
1042*4882a593Smuzhiyun val = I2C_FIFO_CONTROL_TX_TRIG(8) |
1043*4882a593Smuzhiyun I2C_FIFO_CONTROL_RX_TRIG(1);
1044*4882a593Smuzhiyun out:
1045*4882a593Smuzhiyun i2c_writel(i2c_dev, val, reg);
1046*4882a593Smuzhiyun }
1047*4882a593Smuzhiyun
tegra_i2c_poll_completion(struct tegra_i2c_dev * i2c_dev,struct completion * complete,unsigned int timeout_ms)1048*4882a593Smuzhiyun static unsigned long tegra_i2c_poll_completion(struct tegra_i2c_dev *i2c_dev,
1049*4882a593Smuzhiyun struct completion *complete,
1050*4882a593Smuzhiyun unsigned int timeout_ms)
1051*4882a593Smuzhiyun {
1052*4882a593Smuzhiyun ktime_t ktime = ktime_get();
1053*4882a593Smuzhiyun ktime_t ktimeout = ktime_add_ms(ktime, timeout_ms);
1054*4882a593Smuzhiyun
1055*4882a593Smuzhiyun do {
1056*4882a593Smuzhiyun u32 status = i2c_readl(i2c_dev, I2C_INT_STATUS);
1057*4882a593Smuzhiyun
1058*4882a593Smuzhiyun if (status)
1059*4882a593Smuzhiyun tegra_i2c_isr(i2c_dev->irq, i2c_dev);
1060*4882a593Smuzhiyun
1061*4882a593Smuzhiyun if (completion_done(complete)) {
1062*4882a593Smuzhiyun s64 delta = ktime_ms_delta(ktimeout, ktime);
1063*4882a593Smuzhiyun
1064*4882a593Smuzhiyun return msecs_to_jiffies(delta) ?: 1;
1065*4882a593Smuzhiyun }
1066*4882a593Smuzhiyun
1067*4882a593Smuzhiyun ktime = ktime_get();
1068*4882a593Smuzhiyun
1069*4882a593Smuzhiyun } while (ktime_before(ktime, ktimeout));
1070*4882a593Smuzhiyun
1071*4882a593Smuzhiyun return 0;
1072*4882a593Smuzhiyun }
1073*4882a593Smuzhiyun
tegra_i2c_wait_completion(struct tegra_i2c_dev * i2c_dev,struct completion * complete,unsigned int timeout_ms)1074*4882a593Smuzhiyun static unsigned long tegra_i2c_wait_completion(struct tegra_i2c_dev *i2c_dev,
1075*4882a593Smuzhiyun struct completion *complete,
1076*4882a593Smuzhiyun unsigned int timeout_ms)
1077*4882a593Smuzhiyun {
1078*4882a593Smuzhiyun unsigned long ret;
1079*4882a593Smuzhiyun
1080*4882a593Smuzhiyun if (i2c_dev->atomic_mode) {
1081*4882a593Smuzhiyun ret = tegra_i2c_poll_completion(i2c_dev, complete, timeout_ms);
1082*4882a593Smuzhiyun } else {
1083*4882a593Smuzhiyun enable_irq(i2c_dev->irq);
1084*4882a593Smuzhiyun ret = wait_for_completion_timeout(complete,
1085*4882a593Smuzhiyun msecs_to_jiffies(timeout_ms));
1086*4882a593Smuzhiyun disable_irq(i2c_dev->irq);
1087*4882a593Smuzhiyun
1088*4882a593Smuzhiyun /*
1089*4882a593Smuzhiyun * Under some rare circumstances (like running KASAN +
1090*4882a593Smuzhiyun * NFS root) CPU, which handles interrupt, may stuck in
1091*4882a593Smuzhiyun * uninterruptible state for a significant time. In this
1092*4882a593Smuzhiyun * case we will get timeout if I2C transfer is running on
1093*4882a593Smuzhiyun * a sibling CPU, despite of IRQ being raised.
1094*4882a593Smuzhiyun *
1095*4882a593Smuzhiyun * In order to handle this rare condition, the IRQ status
1096*4882a593Smuzhiyun * needs to be checked after timeout.
1097*4882a593Smuzhiyun */
1098*4882a593Smuzhiyun if (ret == 0)
1099*4882a593Smuzhiyun ret = tegra_i2c_poll_completion(i2c_dev, complete, 0);
1100*4882a593Smuzhiyun }
1101*4882a593Smuzhiyun
1102*4882a593Smuzhiyun return ret;
1103*4882a593Smuzhiyun }
1104*4882a593Smuzhiyun
tegra_i2c_issue_bus_clear(struct i2c_adapter * adap)1105*4882a593Smuzhiyun static int tegra_i2c_issue_bus_clear(struct i2c_adapter *adap)
1106*4882a593Smuzhiyun {
1107*4882a593Smuzhiyun struct tegra_i2c_dev *i2c_dev = i2c_get_adapdata(adap);
1108*4882a593Smuzhiyun u32 val, time_left;
1109*4882a593Smuzhiyun int err;
1110*4882a593Smuzhiyun
1111*4882a593Smuzhiyun reinit_completion(&i2c_dev->msg_complete);
1112*4882a593Smuzhiyun
1113*4882a593Smuzhiyun val = FIELD_PREP(I2C_BC_SCLK_THRESHOLD, 9) | I2C_BC_STOP_COND |
1114*4882a593Smuzhiyun I2C_BC_TERMINATE;
1115*4882a593Smuzhiyun i2c_writel(i2c_dev, val, I2C_BUS_CLEAR_CNFG);
1116*4882a593Smuzhiyun
1117*4882a593Smuzhiyun err = tegra_i2c_wait_for_config_load(i2c_dev);
1118*4882a593Smuzhiyun if (err)
1119*4882a593Smuzhiyun return err;
1120*4882a593Smuzhiyun
1121*4882a593Smuzhiyun val |= I2C_BC_ENABLE;
1122*4882a593Smuzhiyun i2c_writel(i2c_dev, val, I2C_BUS_CLEAR_CNFG);
1123*4882a593Smuzhiyun tegra_i2c_unmask_irq(i2c_dev, I2C_INT_BUS_CLR_DONE);
1124*4882a593Smuzhiyun
1125*4882a593Smuzhiyun time_left = tegra_i2c_wait_completion(i2c_dev, &i2c_dev->msg_complete, 50);
1126*4882a593Smuzhiyun tegra_i2c_mask_irq(i2c_dev, I2C_INT_BUS_CLR_DONE);
1127*4882a593Smuzhiyun
1128*4882a593Smuzhiyun if (time_left == 0) {
1129*4882a593Smuzhiyun dev_err(i2c_dev->dev, "failed to clear bus\n");
1130*4882a593Smuzhiyun return -ETIMEDOUT;
1131*4882a593Smuzhiyun }
1132*4882a593Smuzhiyun
1133*4882a593Smuzhiyun val = i2c_readl(i2c_dev, I2C_BUS_CLEAR_STATUS);
1134*4882a593Smuzhiyun if (!(val & I2C_BC_STATUS)) {
1135*4882a593Smuzhiyun dev_err(i2c_dev->dev, "un-recovered arbitration lost\n");
1136*4882a593Smuzhiyun return -EIO;
1137*4882a593Smuzhiyun }
1138*4882a593Smuzhiyun
1139*4882a593Smuzhiyun return -EAGAIN;
1140*4882a593Smuzhiyun }
1141*4882a593Smuzhiyun
tegra_i2c_push_packet_header(struct tegra_i2c_dev * i2c_dev,struct i2c_msg * msg,enum msg_end_type end_state)1142*4882a593Smuzhiyun static void tegra_i2c_push_packet_header(struct tegra_i2c_dev *i2c_dev,
1143*4882a593Smuzhiyun struct i2c_msg *msg,
1144*4882a593Smuzhiyun enum msg_end_type end_state)
1145*4882a593Smuzhiyun {
1146*4882a593Smuzhiyun u32 *dma_buf = i2c_dev->dma_buf;
1147*4882a593Smuzhiyun u32 packet_header;
1148*4882a593Smuzhiyun
1149*4882a593Smuzhiyun packet_header = FIELD_PREP(PACKET_HEADER0_HEADER_SIZE, 0) |
1150*4882a593Smuzhiyun FIELD_PREP(PACKET_HEADER0_PROTOCOL,
1151*4882a593Smuzhiyun PACKET_HEADER0_PROTOCOL_I2C) |
1152*4882a593Smuzhiyun FIELD_PREP(PACKET_HEADER0_CONT_ID, i2c_dev->cont_id) |
1153*4882a593Smuzhiyun FIELD_PREP(PACKET_HEADER0_PACKET_ID, 1);
1154*4882a593Smuzhiyun
1155*4882a593Smuzhiyun if (i2c_dev->dma_mode && !i2c_dev->msg_read)
1156*4882a593Smuzhiyun *dma_buf++ = packet_header;
1157*4882a593Smuzhiyun else
1158*4882a593Smuzhiyun i2c_writel(i2c_dev, packet_header, I2C_TX_FIFO);
1159*4882a593Smuzhiyun
1160*4882a593Smuzhiyun packet_header = msg->len - 1;
1161*4882a593Smuzhiyun
1162*4882a593Smuzhiyun if (i2c_dev->dma_mode && !i2c_dev->msg_read)
1163*4882a593Smuzhiyun *dma_buf++ = packet_header;
1164*4882a593Smuzhiyun else
1165*4882a593Smuzhiyun i2c_writel(i2c_dev, packet_header, I2C_TX_FIFO);
1166*4882a593Smuzhiyun
1167*4882a593Smuzhiyun packet_header = I2C_HEADER_IE_ENABLE;
1168*4882a593Smuzhiyun
1169*4882a593Smuzhiyun if (end_state == MSG_END_CONTINUE)
1170*4882a593Smuzhiyun packet_header |= I2C_HEADER_CONTINUE_XFER;
1171*4882a593Smuzhiyun else if (end_state == MSG_END_REPEAT_START)
1172*4882a593Smuzhiyun packet_header |= I2C_HEADER_REPEAT_START;
1173*4882a593Smuzhiyun
1174*4882a593Smuzhiyun if (msg->flags & I2C_M_TEN) {
1175*4882a593Smuzhiyun packet_header |= msg->addr;
1176*4882a593Smuzhiyun packet_header |= I2C_HEADER_10BIT_ADDR;
1177*4882a593Smuzhiyun } else {
1178*4882a593Smuzhiyun packet_header |= msg->addr << I2C_HEADER_SLAVE_ADDR_SHIFT;
1179*4882a593Smuzhiyun }
1180*4882a593Smuzhiyun
1181*4882a593Smuzhiyun if (msg->flags & I2C_M_IGNORE_NAK)
1182*4882a593Smuzhiyun packet_header |= I2C_HEADER_CONT_ON_NAK;
1183*4882a593Smuzhiyun
1184*4882a593Smuzhiyun if (msg->flags & I2C_M_RD)
1185*4882a593Smuzhiyun packet_header |= I2C_HEADER_READ;
1186*4882a593Smuzhiyun
1187*4882a593Smuzhiyun if (i2c_dev->dma_mode && !i2c_dev->msg_read)
1188*4882a593Smuzhiyun *dma_buf++ = packet_header;
1189*4882a593Smuzhiyun else
1190*4882a593Smuzhiyun i2c_writel(i2c_dev, packet_header, I2C_TX_FIFO);
1191*4882a593Smuzhiyun }
1192*4882a593Smuzhiyun
tegra_i2c_error_recover(struct tegra_i2c_dev * i2c_dev,struct i2c_msg * msg)1193*4882a593Smuzhiyun static int tegra_i2c_error_recover(struct tegra_i2c_dev *i2c_dev,
1194*4882a593Smuzhiyun struct i2c_msg *msg)
1195*4882a593Smuzhiyun {
1196*4882a593Smuzhiyun if (i2c_dev->msg_err == I2C_ERR_NONE)
1197*4882a593Smuzhiyun return 0;
1198*4882a593Smuzhiyun
1199*4882a593Smuzhiyun tegra_i2c_init(i2c_dev);
1200*4882a593Smuzhiyun
1201*4882a593Smuzhiyun /* start recovery upon arbitration loss in single master mode */
1202*4882a593Smuzhiyun if (i2c_dev->msg_err == I2C_ERR_ARBITRATION_LOST) {
1203*4882a593Smuzhiyun if (!i2c_dev->multimaster_mode)
1204*4882a593Smuzhiyun return i2c_recover_bus(&i2c_dev->adapter);
1205*4882a593Smuzhiyun
1206*4882a593Smuzhiyun return -EAGAIN;
1207*4882a593Smuzhiyun }
1208*4882a593Smuzhiyun
1209*4882a593Smuzhiyun if (i2c_dev->msg_err == I2C_ERR_NO_ACK) {
1210*4882a593Smuzhiyun if (msg->flags & I2C_M_IGNORE_NAK)
1211*4882a593Smuzhiyun return 0;
1212*4882a593Smuzhiyun
1213*4882a593Smuzhiyun return -EREMOTEIO;
1214*4882a593Smuzhiyun }
1215*4882a593Smuzhiyun
1216*4882a593Smuzhiyun return -EIO;
1217*4882a593Smuzhiyun }
1218*4882a593Smuzhiyun
tegra_i2c_xfer_msg(struct tegra_i2c_dev * i2c_dev,struct i2c_msg * msg,enum msg_end_type end_state)1219*4882a593Smuzhiyun static int tegra_i2c_xfer_msg(struct tegra_i2c_dev *i2c_dev,
1220*4882a593Smuzhiyun struct i2c_msg *msg,
1221*4882a593Smuzhiyun enum msg_end_type end_state)
1222*4882a593Smuzhiyun {
1223*4882a593Smuzhiyun unsigned long time_left, xfer_time = 100;
1224*4882a593Smuzhiyun size_t xfer_size;
1225*4882a593Smuzhiyun u32 int_mask;
1226*4882a593Smuzhiyun int err;
1227*4882a593Smuzhiyun
1228*4882a593Smuzhiyun err = tegra_i2c_flush_fifos(i2c_dev);
1229*4882a593Smuzhiyun if (err)
1230*4882a593Smuzhiyun return err;
1231*4882a593Smuzhiyun
1232*4882a593Smuzhiyun i2c_dev->msg_buf = msg->buf;
1233*4882a593Smuzhiyun i2c_dev->msg_buf_remaining = msg->len;
1234*4882a593Smuzhiyun i2c_dev->msg_err = I2C_ERR_NONE;
1235*4882a593Smuzhiyun i2c_dev->msg_read = !!(msg->flags & I2C_M_RD);
1236*4882a593Smuzhiyun reinit_completion(&i2c_dev->msg_complete);
1237*4882a593Smuzhiyun
1238*4882a593Smuzhiyun if (i2c_dev->msg_read)
1239*4882a593Smuzhiyun xfer_size = msg->len;
1240*4882a593Smuzhiyun else
1241*4882a593Smuzhiyun xfer_size = msg->len + I2C_PACKET_HEADER_SIZE;
1242*4882a593Smuzhiyun
1243*4882a593Smuzhiyun xfer_size = ALIGN(xfer_size, BYTES_PER_FIFO_WORD);
1244*4882a593Smuzhiyun
1245*4882a593Smuzhiyun i2c_dev->dma_mode = xfer_size > I2C_PIO_MODE_PREFERRED_LEN &&
1246*4882a593Smuzhiyun i2c_dev->dma_buf && !i2c_dev->atomic_mode;
1247*4882a593Smuzhiyun
1248*4882a593Smuzhiyun tegra_i2c_config_fifo_trig(i2c_dev, xfer_size);
1249*4882a593Smuzhiyun
1250*4882a593Smuzhiyun /*
1251*4882a593Smuzhiyun * Transfer time in mSec = Total bits / transfer rate
1252*4882a593Smuzhiyun * Total bits = 9 bits per byte (including ACK bit) + Start & stop bits
1253*4882a593Smuzhiyun */
1254*4882a593Smuzhiyun xfer_time += DIV_ROUND_CLOSEST(((xfer_size * 9) + 2) * MSEC_PER_SEC,
1255*4882a593Smuzhiyun i2c_dev->bus_clk_rate);
1256*4882a593Smuzhiyun
1257*4882a593Smuzhiyun int_mask = I2C_INT_NO_ACK | I2C_INT_ARBITRATION_LOST;
1258*4882a593Smuzhiyun tegra_i2c_unmask_irq(i2c_dev, int_mask);
1259*4882a593Smuzhiyun
1260*4882a593Smuzhiyun if (i2c_dev->dma_mode) {
1261*4882a593Smuzhiyun if (i2c_dev->msg_read) {
1262*4882a593Smuzhiyun dma_sync_single_for_device(i2c_dev->dma_dev,
1263*4882a593Smuzhiyun i2c_dev->dma_phys,
1264*4882a593Smuzhiyun xfer_size, DMA_FROM_DEVICE);
1265*4882a593Smuzhiyun
1266*4882a593Smuzhiyun err = tegra_i2c_dma_submit(i2c_dev, xfer_size);
1267*4882a593Smuzhiyun if (err)
1268*4882a593Smuzhiyun return err;
1269*4882a593Smuzhiyun } else {
1270*4882a593Smuzhiyun dma_sync_single_for_cpu(i2c_dev->dma_dev,
1271*4882a593Smuzhiyun i2c_dev->dma_phys,
1272*4882a593Smuzhiyun xfer_size, DMA_TO_DEVICE);
1273*4882a593Smuzhiyun }
1274*4882a593Smuzhiyun }
1275*4882a593Smuzhiyun
1276*4882a593Smuzhiyun tegra_i2c_push_packet_header(i2c_dev, msg, end_state);
1277*4882a593Smuzhiyun
1278*4882a593Smuzhiyun if (!i2c_dev->msg_read) {
1279*4882a593Smuzhiyun if (i2c_dev->dma_mode) {
1280*4882a593Smuzhiyun memcpy(i2c_dev->dma_buf + I2C_PACKET_HEADER_SIZE,
1281*4882a593Smuzhiyun msg->buf, msg->len);
1282*4882a593Smuzhiyun
1283*4882a593Smuzhiyun dma_sync_single_for_device(i2c_dev->dma_dev,
1284*4882a593Smuzhiyun i2c_dev->dma_phys,
1285*4882a593Smuzhiyun xfer_size, DMA_TO_DEVICE);
1286*4882a593Smuzhiyun
1287*4882a593Smuzhiyun err = tegra_i2c_dma_submit(i2c_dev, xfer_size);
1288*4882a593Smuzhiyun if (err)
1289*4882a593Smuzhiyun return err;
1290*4882a593Smuzhiyun } else {
1291*4882a593Smuzhiyun tegra_i2c_fill_tx_fifo(i2c_dev);
1292*4882a593Smuzhiyun }
1293*4882a593Smuzhiyun }
1294*4882a593Smuzhiyun
1295*4882a593Smuzhiyun if (i2c_dev->hw->has_per_pkt_xfer_complete_irq)
1296*4882a593Smuzhiyun int_mask |= I2C_INT_PACKET_XFER_COMPLETE;
1297*4882a593Smuzhiyun
1298*4882a593Smuzhiyun if (!i2c_dev->dma_mode) {
1299*4882a593Smuzhiyun if (msg->flags & I2C_M_RD)
1300*4882a593Smuzhiyun int_mask |= I2C_INT_RX_FIFO_DATA_REQ;
1301*4882a593Smuzhiyun else if (i2c_dev->msg_buf_remaining)
1302*4882a593Smuzhiyun int_mask |= I2C_INT_TX_FIFO_DATA_REQ;
1303*4882a593Smuzhiyun }
1304*4882a593Smuzhiyun
1305*4882a593Smuzhiyun tegra_i2c_unmask_irq(i2c_dev, int_mask);
1306*4882a593Smuzhiyun dev_dbg(i2c_dev->dev, "unmasked IRQ: %02x\n",
1307*4882a593Smuzhiyun i2c_readl(i2c_dev, I2C_INT_MASK));
1308*4882a593Smuzhiyun
1309*4882a593Smuzhiyun if (i2c_dev->dma_mode) {
1310*4882a593Smuzhiyun time_left = tegra_i2c_wait_completion(i2c_dev,
1311*4882a593Smuzhiyun &i2c_dev->dma_complete,
1312*4882a593Smuzhiyun xfer_time);
1313*4882a593Smuzhiyun
1314*4882a593Smuzhiyun /*
1315*4882a593Smuzhiyun * Synchronize DMA first, since dmaengine_terminate_sync()
1316*4882a593Smuzhiyun * performs synchronization after the transfer's termination
1317*4882a593Smuzhiyun * and we want to get a completion if transfer succeeded.
1318*4882a593Smuzhiyun */
1319*4882a593Smuzhiyun dmaengine_synchronize(i2c_dev->msg_read ?
1320*4882a593Smuzhiyun i2c_dev->rx_dma_chan :
1321*4882a593Smuzhiyun i2c_dev->tx_dma_chan);
1322*4882a593Smuzhiyun
1323*4882a593Smuzhiyun dmaengine_terminate_sync(i2c_dev->msg_read ?
1324*4882a593Smuzhiyun i2c_dev->rx_dma_chan :
1325*4882a593Smuzhiyun i2c_dev->tx_dma_chan);
1326*4882a593Smuzhiyun
1327*4882a593Smuzhiyun if (!time_left && !completion_done(&i2c_dev->dma_complete)) {
1328*4882a593Smuzhiyun dev_err(i2c_dev->dev, "DMA transfer timed out\n");
1329*4882a593Smuzhiyun tegra_i2c_init(i2c_dev);
1330*4882a593Smuzhiyun return -ETIMEDOUT;
1331*4882a593Smuzhiyun }
1332*4882a593Smuzhiyun
1333*4882a593Smuzhiyun if (i2c_dev->msg_read && i2c_dev->msg_err == I2C_ERR_NONE) {
1334*4882a593Smuzhiyun dma_sync_single_for_cpu(i2c_dev->dma_dev,
1335*4882a593Smuzhiyun i2c_dev->dma_phys,
1336*4882a593Smuzhiyun xfer_size, DMA_FROM_DEVICE);
1337*4882a593Smuzhiyun
1338*4882a593Smuzhiyun memcpy(i2c_dev->msg_buf, i2c_dev->dma_buf, msg->len);
1339*4882a593Smuzhiyun }
1340*4882a593Smuzhiyun }
1341*4882a593Smuzhiyun
1342*4882a593Smuzhiyun time_left = tegra_i2c_wait_completion(i2c_dev, &i2c_dev->msg_complete,
1343*4882a593Smuzhiyun xfer_time);
1344*4882a593Smuzhiyun
1345*4882a593Smuzhiyun tegra_i2c_mask_irq(i2c_dev, int_mask);
1346*4882a593Smuzhiyun
1347*4882a593Smuzhiyun if (time_left == 0) {
1348*4882a593Smuzhiyun dev_err(i2c_dev->dev, "I2C transfer timed out\n");
1349*4882a593Smuzhiyun tegra_i2c_init(i2c_dev);
1350*4882a593Smuzhiyun return -ETIMEDOUT;
1351*4882a593Smuzhiyun }
1352*4882a593Smuzhiyun
1353*4882a593Smuzhiyun dev_dbg(i2c_dev->dev, "transfer complete: %lu %d %d\n",
1354*4882a593Smuzhiyun time_left, completion_done(&i2c_dev->msg_complete),
1355*4882a593Smuzhiyun i2c_dev->msg_err);
1356*4882a593Smuzhiyun
1357*4882a593Smuzhiyun i2c_dev->dma_mode = false;
1358*4882a593Smuzhiyun
1359*4882a593Smuzhiyun err = tegra_i2c_error_recover(i2c_dev, msg);
1360*4882a593Smuzhiyun if (err)
1361*4882a593Smuzhiyun return err;
1362*4882a593Smuzhiyun
1363*4882a593Smuzhiyun return 0;
1364*4882a593Smuzhiyun }
1365*4882a593Smuzhiyun
tegra_i2c_xfer(struct i2c_adapter * adap,struct i2c_msg msgs[],int num)1366*4882a593Smuzhiyun static int tegra_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[],
1367*4882a593Smuzhiyun int num)
1368*4882a593Smuzhiyun {
1369*4882a593Smuzhiyun struct tegra_i2c_dev *i2c_dev = i2c_get_adapdata(adap);
1370*4882a593Smuzhiyun int i, ret;
1371*4882a593Smuzhiyun
1372*4882a593Smuzhiyun ret = pm_runtime_get_sync(i2c_dev->dev);
1373*4882a593Smuzhiyun if (ret < 0) {
1374*4882a593Smuzhiyun dev_err(i2c_dev->dev, "runtime resume failed %d\n", ret);
1375*4882a593Smuzhiyun pm_runtime_put_noidle(i2c_dev->dev);
1376*4882a593Smuzhiyun return ret;
1377*4882a593Smuzhiyun }
1378*4882a593Smuzhiyun
1379*4882a593Smuzhiyun for (i = 0; i < num; i++) {
1380*4882a593Smuzhiyun enum msg_end_type end_type = MSG_END_STOP;
1381*4882a593Smuzhiyun
1382*4882a593Smuzhiyun if (i < (num - 1)) {
1383*4882a593Smuzhiyun /* check whether follow up message is coming */
1384*4882a593Smuzhiyun if (msgs[i + 1].flags & I2C_M_NOSTART)
1385*4882a593Smuzhiyun end_type = MSG_END_CONTINUE;
1386*4882a593Smuzhiyun else
1387*4882a593Smuzhiyun end_type = MSG_END_REPEAT_START;
1388*4882a593Smuzhiyun }
1389*4882a593Smuzhiyun ret = tegra_i2c_xfer_msg(i2c_dev, &msgs[i], end_type);
1390*4882a593Smuzhiyun if (ret)
1391*4882a593Smuzhiyun break;
1392*4882a593Smuzhiyun }
1393*4882a593Smuzhiyun
1394*4882a593Smuzhiyun pm_runtime_put(i2c_dev->dev);
1395*4882a593Smuzhiyun
1396*4882a593Smuzhiyun return ret ?: i;
1397*4882a593Smuzhiyun }
1398*4882a593Smuzhiyun
tegra_i2c_xfer_atomic(struct i2c_adapter * adap,struct i2c_msg msgs[],int num)1399*4882a593Smuzhiyun static int tegra_i2c_xfer_atomic(struct i2c_adapter *adap,
1400*4882a593Smuzhiyun struct i2c_msg msgs[], int num)
1401*4882a593Smuzhiyun {
1402*4882a593Smuzhiyun struct tegra_i2c_dev *i2c_dev = i2c_get_adapdata(adap);
1403*4882a593Smuzhiyun int ret;
1404*4882a593Smuzhiyun
1405*4882a593Smuzhiyun i2c_dev->atomic_mode = true;
1406*4882a593Smuzhiyun ret = tegra_i2c_xfer(adap, msgs, num);
1407*4882a593Smuzhiyun i2c_dev->atomic_mode = false;
1408*4882a593Smuzhiyun
1409*4882a593Smuzhiyun return ret;
1410*4882a593Smuzhiyun }
1411*4882a593Smuzhiyun
tegra_i2c_func(struct i2c_adapter * adap)1412*4882a593Smuzhiyun static u32 tegra_i2c_func(struct i2c_adapter *adap)
1413*4882a593Smuzhiyun {
1414*4882a593Smuzhiyun struct tegra_i2c_dev *i2c_dev = i2c_get_adapdata(adap);
1415*4882a593Smuzhiyun u32 ret = I2C_FUNC_I2C | (I2C_FUNC_SMBUS_EMUL & ~I2C_FUNC_SMBUS_QUICK) |
1416*4882a593Smuzhiyun I2C_FUNC_10BIT_ADDR | I2C_FUNC_PROTOCOL_MANGLING;
1417*4882a593Smuzhiyun
1418*4882a593Smuzhiyun if (i2c_dev->hw->has_continue_xfer_support)
1419*4882a593Smuzhiyun ret |= I2C_FUNC_NOSTART;
1420*4882a593Smuzhiyun
1421*4882a593Smuzhiyun return ret;
1422*4882a593Smuzhiyun }
1423*4882a593Smuzhiyun
1424*4882a593Smuzhiyun static const struct i2c_algorithm tegra_i2c_algo = {
1425*4882a593Smuzhiyun .master_xfer = tegra_i2c_xfer,
1426*4882a593Smuzhiyun .master_xfer_atomic = tegra_i2c_xfer_atomic,
1427*4882a593Smuzhiyun .functionality = tegra_i2c_func,
1428*4882a593Smuzhiyun };
1429*4882a593Smuzhiyun
1430*4882a593Smuzhiyun /* payload size is only 12 bit */
1431*4882a593Smuzhiyun static const struct i2c_adapter_quirks tegra_i2c_quirks = {
1432*4882a593Smuzhiyun .flags = I2C_AQ_NO_ZERO_LEN,
1433*4882a593Smuzhiyun .max_read_len = SZ_4K,
1434*4882a593Smuzhiyun .max_write_len = SZ_4K - I2C_PACKET_HEADER_SIZE,
1435*4882a593Smuzhiyun };
1436*4882a593Smuzhiyun
1437*4882a593Smuzhiyun static const struct i2c_adapter_quirks tegra194_i2c_quirks = {
1438*4882a593Smuzhiyun .flags = I2C_AQ_NO_ZERO_LEN,
1439*4882a593Smuzhiyun .max_write_len = SZ_64K - I2C_PACKET_HEADER_SIZE,
1440*4882a593Smuzhiyun };
1441*4882a593Smuzhiyun
1442*4882a593Smuzhiyun static struct i2c_bus_recovery_info tegra_i2c_recovery_info = {
1443*4882a593Smuzhiyun .recover_bus = tegra_i2c_issue_bus_clear,
1444*4882a593Smuzhiyun };
1445*4882a593Smuzhiyun
1446*4882a593Smuzhiyun static const struct tegra_i2c_hw_feature tegra20_i2c_hw = {
1447*4882a593Smuzhiyun .has_continue_xfer_support = false,
1448*4882a593Smuzhiyun .has_per_pkt_xfer_complete_irq = false,
1449*4882a593Smuzhiyun .clk_divisor_hs_mode = 3,
1450*4882a593Smuzhiyun .clk_divisor_std_mode = 0,
1451*4882a593Smuzhiyun .clk_divisor_fast_mode = 0,
1452*4882a593Smuzhiyun .clk_divisor_fast_plus_mode = 0,
1453*4882a593Smuzhiyun .has_config_load_reg = false,
1454*4882a593Smuzhiyun .has_multi_master_mode = false,
1455*4882a593Smuzhiyun .has_slcg_override_reg = false,
1456*4882a593Smuzhiyun .has_mst_fifo = false,
1457*4882a593Smuzhiyun .quirks = &tegra_i2c_quirks,
1458*4882a593Smuzhiyun .supports_bus_clear = false,
1459*4882a593Smuzhiyun .has_apb_dma = true,
1460*4882a593Smuzhiyun .tlow_std_mode = 0x4,
1461*4882a593Smuzhiyun .thigh_std_mode = 0x2,
1462*4882a593Smuzhiyun .tlow_fast_fastplus_mode = 0x4,
1463*4882a593Smuzhiyun .thigh_fast_fastplus_mode = 0x2,
1464*4882a593Smuzhiyun .setup_hold_time_std_mode = 0x0,
1465*4882a593Smuzhiyun .setup_hold_time_fast_fast_plus_mode = 0x0,
1466*4882a593Smuzhiyun .setup_hold_time_hs_mode = 0x0,
1467*4882a593Smuzhiyun .has_interface_timing_reg = false,
1468*4882a593Smuzhiyun };
1469*4882a593Smuzhiyun
1470*4882a593Smuzhiyun static const struct tegra_i2c_hw_feature tegra30_i2c_hw = {
1471*4882a593Smuzhiyun .has_continue_xfer_support = true,
1472*4882a593Smuzhiyun .has_per_pkt_xfer_complete_irq = false,
1473*4882a593Smuzhiyun .clk_divisor_hs_mode = 3,
1474*4882a593Smuzhiyun .clk_divisor_std_mode = 0,
1475*4882a593Smuzhiyun .clk_divisor_fast_mode = 0,
1476*4882a593Smuzhiyun .clk_divisor_fast_plus_mode = 0,
1477*4882a593Smuzhiyun .has_config_load_reg = false,
1478*4882a593Smuzhiyun .has_multi_master_mode = false,
1479*4882a593Smuzhiyun .has_slcg_override_reg = false,
1480*4882a593Smuzhiyun .has_mst_fifo = false,
1481*4882a593Smuzhiyun .quirks = &tegra_i2c_quirks,
1482*4882a593Smuzhiyun .supports_bus_clear = false,
1483*4882a593Smuzhiyun .has_apb_dma = true,
1484*4882a593Smuzhiyun .tlow_std_mode = 0x4,
1485*4882a593Smuzhiyun .thigh_std_mode = 0x2,
1486*4882a593Smuzhiyun .tlow_fast_fastplus_mode = 0x4,
1487*4882a593Smuzhiyun .thigh_fast_fastplus_mode = 0x2,
1488*4882a593Smuzhiyun .setup_hold_time_std_mode = 0x0,
1489*4882a593Smuzhiyun .setup_hold_time_fast_fast_plus_mode = 0x0,
1490*4882a593Smuzhiyun .setup_hold_time_hs_mode = 0x0,
1491*4882a593Smuzhiyun .has_interface_timing_reg = false,
1492*4882a593Smuzhiyun };
1493*4882a593Smuzhiyun
1494*4882a593Smuzhiyun static const struct tegra_i2c_hw_feature tegra114_i2c_hw = {
1495*4882a593Smuzhiyun .has_continue_xfer_support = true,
1496*4882a593Smuzhiyun .has_per_pkt_xfer_complete_irq = true,
1497*4882a593Smuzhiyun .clk_divisor_hs_mode = 1,
1498*4882a593Smuzhiyun .clk_divisor_std_mode = 0x19,
1499*4882a593Smuzhiyun .clk_divisor_fast_mode = 0x19,
1500*4882a593Smuzhiyun .clk_divisor_fast_plus_mode = 0x10,
1501*4882a593Smuzhiyun .has_config_load_reg = false,
1502*4882a593Smuzhiyun .has_multi_master_mode = false,
1503*4882a593Smuzhiyun .has_slcg_override_reg = false,
1504*4882a593Smuzhiyun .has_mst_fifo = false,
1505*4882a593Smuzhiyun .quirks = &tegra_i2c_quirks,
1506*4882a593Smuzhiyun .supports_bus_clear = true,
1507*4882a593Smuzhiyun .has_apb_dma = true,
1508*4882a593Smuzhiyun .tlow_std_mode = 0x4,
1509*4882a593Smuzhiyun .thigh_std_mode = 0x2,
1510*4882a593Smuzhiyun .tlow_fast_fastplus_mode = 0x4,
1511*4882a593Smuzhiyun .thigh_fast_fastplus_mode = 0x2,
1512*4882a593Smuzhiyun .setup_hold_time_std_mode = 0x0,
1513*4882a593Smuzhiyun .setup_hold_time_fast_fast_plus_mode = 0x0,
1514*4882a593Smuzhiyun .setup_hold_time_hs_mode = 0x0,
1515*4882a593Smuzhiyun .has_interface_timing_reg = false,
1516*4882a593Smuzhiyun };
1517*4882a593Smuzhiyun
1518*4882a593Smuzhiyun static const struct tegra_i2c_hw_feature tegra124_i2c_hw = {
1519*4882a593Smuzhiyun .has_continue_xfer_support = true,
1520*4882a593Smuzhiyun .has_per_pkt_xfer_complete_irq = true,
1521*4882a593Smuzhiyun .clk_divisor_hs_mode = 1,
1522*4882a593Smuzhiyun .clk_divisor_std_mode = 0x19,
1523*4882a593Smuzhiyun .clk_divisor_fast_mode = 0x19,
1524*4882a593Smuzhiyun .clk_divisor_fast_plus_mode = 0x10,
1525*4882a593Smuzhiyun .has_config_load_reg = true,
1526*4882a593Smuzhiyun .has_multi_master_mode = false,
1527*4882a593Smuzhiyun .has_slcg_override_reg = true,
1528*4882a593Smuzhiyun .has_mst_fifo = false,
1529*4882a593Smuzhiyun .quirks = &tegra_i2c_quirks,
1530*4882a593Smuzhiyun .supports_bus_clear = true,
1531*4882a593Smuzhiyun .has_apb_dma = true,
1532*4882a593Smuzhiyun .tlow_std_mode = 0x4,
1533*4882a593Smuzhiyun .thigh_std_mode = 0x2,
1534*4882a593Smuzhiyun .tlow_fast_fastplus_mode = 0x4,
1535*4882a593Smuzhiyun .thigh_fast_fastplus_mode = 0x2,
1536*4882a593Smuzhiyun .setup_hold_time_std_mode = 0x0,
1537*4882a593Smuzhiyun .setup_hold_time_fast_fast_plus_mode = 0x0,
1538*4882a593Smuzhiyun .setup_hold_time_hs_mode = 0x0,
1539*4882a593Smuzhiyun .has_interface_timing_reg = true,
1540*4882a593Smuzhiyun };
1541*4882a593Smuzhiyun
1542*4882a593Smuzhiyun static const struct tegra_i2c_hw_feature tegra210_i2c_hw = {
1543*4882a593Smuzhiyun .has_continue_xfer_support = true,
1544*4882a593Smuzhiyun .has_per_pkt_xfer_complete_irq = true,
1545*4882a593Smuzhiyun .clk_divisor_hs_mode = 1,
1546*4882a593Smuzhiyun .clk_divisor_std_mode = 0x19,
1547*4882a593Smuzhiyun .clk_divisor_fast_mode = 0x19,
1548*4882a593Smuzhiyun .clk_divisor_fast_plus_mode = 0x10,
1549*4882a593Smuzhiyun .has_config_load_reg = true,
1550*4882a593Smuzhiyun .has_multi_master_mode = false,
1551*4882a593Smuzhiyun .has_slcg_override_reg = true,
1552*4882a593Smuzhiyun .has_mst_fifo = false,
1553*4882a593Smuzhiyun .quirks = &tegra_i2c_quirks,
1554*4882a593Smuzhiyun .supports_bus_clear = true,
1555*4882a593Smuzhiyun .has_apb_dma = true,
1556*4882a593Smuzhiyun .tlow_std_mode = 0x4,
1557*4882a593Smuzhiyun .thigh_std_mode = 0x2,
1558*4882a593Smuzhiyun .tlow_fast_fastplus_mode = 0x4,
1559*4882a593Smuzhiyun .thigh_fast_fastplus_mode = 0x2,
1560*4882a593Smuzhiyun .setup_hold_time_std_mode = 0,
1561*4882a593Smuzhiyun .setup_hold_time_fast_fast_plus_mode = 0,
1562*4882a593Smuzhiyun .setup_hold_time_hs_mode = 0,
1563*4882a593Smuzhiyun .has_interface_timing_reg = true,
1564*4882a593Smuzhiyun };
1565*4882a593Smuzhiyun
1566*4882a593Smuzhiyun static const struct tegra_i2c_hw_feature tegra186_i2c_hw = {
1567*4882a593Smuzhiyun .has_continue_xfer_support = true,
1568*4882a593Smuzhiyun .has_per_pkt_xfer_complete_irq = true,
1569*4882a593Smuzhiyun .clk_divisor_hs_mode = 1,
1570*4882a593Smuzhiyun .clk_divisor_std_mode = 0x16,
1571*4882a593Smuzhiyun .clk_divisor_fast_mode = 0x19,
1572*4882a593Smuzhiyun .clk_divisor_fast_plus_mode = 0x10,
1573*4882a593Smuzhiyun .has_config_load_reg = true,
1574*4882a593Smuzhiyun .has_multi_master_mode = false,
1575*4882a593Smuzhiyun .has_slcg_override_reg = true,
1576*4882a593Smuzhiyun .has_mst_fifo = false,
1577*4882a593Smuzhiyun .quirks = &tegra_i2c_quirks,
1578*4882a593Smuzhiyun .supports_bus_clear = true,
1579*4882a593Smuzhiyun .has_apb_dma = false,
1580*4882a593Smuzhiyun .tlow_std_mode = 0x4,
1581*4882a593Smuzhiyun .thigh_std_mode = 0x3,
1582*4882a593Smuzhiyun .tlow_fast_fastplus_mode = 0x4,
1583*4882a593Smuzhiyun .thigh_fast_fastplus_mode = 0x2,
1584*4882a593Smuzhiyun .setup_hold_time_std_mode = 0,
1585*4882a593Smuzhiyun .setup_hold_time_fast_fast_plus_mode = 0,
1586*4882a593Smuzhiyun .setup_hold_time_hs_mode = 0,
1587*4882a593Smuzhiyun .has_interface_timing_reg = true,
1588*4882a593Smuzhiyun };
1589*4882a593Smuzhiyun
1590*4882a593Smuzhiyun static const struct tegra_i2c_hw_feature tegra194_i2c_hw = {
1591*4882a593Smuzhiyun .has_continue_xfer_support = true,
1592*4882a593Smuzhiyun .has_per_pkt_xfer_complete_irq = true,
1593*4882a593Smuzhiyun .clk_divisor_hs_mode = 1,
1594*4882a593Smuzhiyun .clk_divisor_std_mode = 0x4f,
1595*4882a593Smuzhiyun .clk_divisor_fast_mode = 0x3c,
1596*4882a593Smuzhiyun .clk_divisor_fast_plus_mode = 0x16,
1597*4882a593Smuzhiyun .has_config_load_reg = true,
1598*4882a593Smuzhiyun .has_multi_master_mode = true,
1599*4882a593Smuzhiyun .has_slcg_override_reg = true,
1600*4882a593Smuzhiyun .has_mst_fifo = true,
1601*4882a593Smuzhiyun .quirks = &tegra194_i2c_quirks,
1602*4882a593Smuzhiyun .supports_bus_clear = true,
1603*4882a593Smuzhiyun .has_apb_dma = false,
1604*4882a593Smuzhiyun .tlow_std_mode = 0x8,
1605*4882a593Smuzhiyun .thigh_std_mode = 0x7,
1606*4882a593Smuzhiyun .tlow_fast_fastplus_mode = 0x2,
1607*4882a593Smuzhiyun .thigh_fast_fastplus_mode = 0x2,
1608*4882a593Smuzhiyun .setup_hold_time_std_mode = 0x08080808,
1609*4882a593Smuzhiyun .setup_hold_time_fast_fast_plus_mode = 0x02020202,
1610*4882a593Smuzhiyun .setup_hold_time_hs_mode = 0x090909,
1611*4882a593Smuzhiyun .has_interface_timing_reg = true,
1612*4882a593Smuzhiyun };
1613*4882a593Smuzhiyun
1614*4882a593Smuzhiyun static const struct of_device_id tegra_i2c_of_match[] = {
1615*4882a593Smuzhiyun { .compatible = "nvidia,tegra194-i2c", .data = &tegra194_i2c_hw, },
1616*4882a593Smuzhiyun { .compatible = "nvidia,tegra186-i2c", .data = &tegra186_i2c_hw, },
1617*4882a593Smuzhiyun { .compatible = "nvidia,tegra210-i2c-vi", .data = &tegra210_i2c_hw, },
1618*4882a593Smuzhiyun { .compatible = "nvidia,tegra210-i2c", .data = &tegra210_i2c_hw, },
1619*4882a593Smuzhiyun { .compatible = "nvidia,tegra124-i2c", .data = &tegra124_i2c_hw, },
1620*4882a593Smuzhiyun { .compatible = "nvidia,tegra114-i2c", .data = &tegra114_i2c_hw, },
1621*4882a593Smuzhiyun { .compatible = "nvidia,tegra30-i2c", .data = &tegra30_i2c_hw, },
1622*4882a593Smuzhiyun { .compatible = "nvidia,tegra20-i2c", .data = &tegra20_i2c_hw, },
1623*4882a593Smuzhiyun { .compatible = "nvidia,tegra20-i2c-dvc", .data = &tegra20_i2c_hw, },
1624*4882a593Smuzhiyun {},
1625*4882a593Smuzhiyun };
1626*4882a593Smuzhiyun MODULE_DEVICE_TABLE(of, tegra_i2c_of_match);
1627*4882a593Smuzhiyun
tegra_i2c_parse_dt(struct tegra_i2c_dev * i2c_dev)1628*4882a593Smuzhiyun static void tegra_i2c_parse_dt(struct tegra_i2c_dev *i2c_dev)
1629*4882a593Smuzhiyun {
1630*4882a593Smuzhiyun struct device_node *np = i2c_dev->dev->of_node;
1631*4882a593Smuzhiyun bool multi_mode;
1632*4882a593Smuzhiyun int err;
1633*4882a593Smuzhiyun
1634*4882a593Smuzhiyun err = of_property_read_u32(np, "clock-frequency",
1635*4882a593Smuzhiyun &i2c_dev->bus_clk_rate);
1636*4882a593Smuzhiyun if (err)
1637*4882a593Smuzhiyun i2c_dev->bus_clk_rate = I2C_MAX_STANDARD_MODE_FREQ;
1638*4882a593Smuzhiyun
1639*4882a593Smuzhiyun multi_mode = of_property_read_bool(np, "multi-master");
1640*4882a593Smuzhiyun i2c_dev->multimaster_mode = multi_mode;
1641*4882a593Smuzhiyun
1642*4882a593Smuzhiyun if (of_device_is_compatible(np, "nvidia,tegra20-i2c-dvc"))
1643*4882a593Smuzhiyun i2c_dev->is_dvc = true;
1644*4882a593Smuzhiyun
1645*4882a593Smuzhiyun if (of_device_is_compatible(np, "nvidia,tegra210-i2c-vi"))
1646*4882a593Smuzhiyun i2c_dev->is_vi = true;
1647*4882a593Smuzhiyun }
1648*4882a593Smuzhiyun
tegra_i2c_init_clocks(struct tegra_i2c_dev * i2c_dev)1649*4882a593Smuzhiyun static int tegra_i2c_init_clocks(struct tegra_i2c_dev *i2c_dev)
1650*4882a593Smuzhiyun {
1651*4882a593Smuzhiyun int err;
1652*4882a593Smuzhiyun
1653*4882a593Smuzhiyun i2c_dev->clocks[i2c_dev->nclocks++].id = "div-clk";
1654*4882a593Smuzhiyun
1655*4882a593Smuzhiyun if (i2c_dev->hw == &tegra20_i2c_hw || i2c_dev->hw == &tegra30_i2c_hw)
1656*4882a593Smuzhiyun i2c_dev->clocks[i2c_dev->nclocks++].id = "fast-clk";
1657*4882a593Smuzhiyun
1658*4882a593Smuzhiyun if (i2c_dev->is_vi)
1659*4882a593Smuzhiyun i2c_dev->clocks[i2c_dev->nclocks++].id = "slow";
1660*4882a593Smuzhiyun
1661*4882a593Smuzhiyun err = devm_clk_bulk_get(i2c_dev->dev, i2c_dev->nclocks,
1662*4882a593Smuzhiyun i2c_dev->clocks);
1663*4882a593Smuzhiyun if (err)
1664*4882a593Smuzhiyun return err;
1665*4882a593Smuzhiyun
1666*4882a593Smuzhiyun err = clk_bulk_prepare(i2c_dev->nclocks, i2c_dev->clocks);
1667*4882a593Smuzhiyun if (err)
1668*4882a593Smuzhiyun return err;
1669*4882a593Smuzhiyun
1670*4882a593Smuzhiyun i2c_dev->div_clk = i2c_dev->clocks[0].clk;
1671*4882a593Smuzhiyun
1672*4882a593Smuzhiyun if (!i2c_dev->multimaster_mode)
1673*4882a593Smuzhiyun return 0;
1674*4882a593Smuzhiyun
1675*4882a593Smuzhiyun err = clk_enable(i2c_dev->div_clk);
1676*4882a593Smuzhiyun if (err) {
1677*4882a593Smuzhiyun dev_err(i2c_dev->dev, "failed to enable div-clk: %d\n", err);
1678*4882a593Smuzhiyun goto unprepare_clocks;
1679*4882a593Smuzhiyun }
1680*4882a593Smuzhiyun
1681*4882a593Smuzhiyun return 0;
1682*4882a593Smuzhiyun
1683*4882a593Smuzhiyun unprepare_clocks:
1684*4882a593Smuzhiyun clk_bulk_unprepare(i2c_dev->nclocks, i2c_dev->clocks);
1685*4882a593Smuzhiyun
1686*4882a593Smuzhiyun return err;
1687*4882a593Smuzhiyun }
1688*4882a593Smuzhiyun
tegra_i2c_release_clocks(struct tegra_i2c_dev * i2c_dev)1689*4882a593Smuzhiyun static void tegra_i2c_release_clocks(struct tegra_i2c_dev *i2c_dev)
1690*4882a593Smuzhiyun {
1691*4882a593Smuzhiyun if (i2c_dev->multimaster_mode)
1692*4882a593Smuzhiyun clk_disable(i2c_dev->div_clk);
1693*4882a593Smuzhiyun
1694*4882a593Smuzhiyun clk_bulk_unprepare(i2c_dev->nclocks, i2c_dev->clocks);
1695*4882a593Smuzhiyun }
1696*4882a593Smuzhiyun
tegra_i2c_init_hardware(struct tegra_i2c_dev * i2c_dev)1697*4882a593Smuzhiyun static int tegra_i2c_init_hardware(struct tegra_i2c_dev *i2c_dev)
1698*4882a593Smuzhiyun {
1699*4882a593Smuzhiyun int ret;
1700*4882a593Smuzhiyun
1701*4882a593Smuzhiyun ret = pm_runtime_get_sync(i2c_dev->dev);
1702*4882a593Smuzhiyun if (ret < 0)
1703*4882a593Smuzhiyun dev_err(i2c_dev->dev, "runtime resume failed: %d\n", ret);
1704*4882a593Smuzhiyun else
1705*4882a593Smuzhiyun ret = tegra_i2c_init(i2c_dev);
1706*4882a593Smuzhiyun
1707*4882a593Smuzhiyun pm_runtime_put(i2c_dev->dev);
1708*4882a593Smuzhiyun
1709*4882a593Smuzhiyun return ret;
1710*4882a593Smuzhiyun }
1711*4882a593Smuzhiyun
tegra_i2c_probe(struct platform_device * pdev)1712*4882a593Smuzhiyun static int tegra_i2c_probe(struct platform_device *pdev)
1713*4882a593Smuzhiyun {
1714*4882a593Smuzhiyun struct tegra_i2c_dev *i2c_dev;
1715*4882a593Smuzhiyun struct resource *res;
1716*4882a593Smuzhiyun int err;
1717*4882a593Smuzhiyun
1718*4882a593Smuzhiyun i2c_dev = devm_kzalloc(&pdev->dev, sizeof(*i2c_dev), GFP_KERNEL);
1719*4882a593Smuzhiyun if (!i2c_dev)
1720*4882a593Smuzhiyun return -ENOMEM;
1721*4882a593Smuzhiyun
1722*4882a593Smuzhiyun platform_set_drvdata(pdev, i2c_dev);
1723*4882a593Smuzhiyun
1724*4882a593Smuzhiyun init_completion(&i2c_dev->msg_complete);
1725*4882a593Smuzhiyun init_completion(&i2c_dev->dma_complete);
1726*4882a593Smuzhiyun
1727*4882a593Smuzhiyun i2c_dev->hw = of_device_get_match_data(&pdev->dev);
1728*4882a593Smuzhiyun i2c_dev->cont_id = pdev->id;
1729*4882a593Smuzhiyun i2c_dev->dev = &pdev->dev;
1730*4882a593Smuzhiyun
1731*4882a593Smuzhiyun i2c_dev->base = devm_platform_get_and_ioremap_resource(pdev, 0, &res);
1732*4882a593Smuzhiyun if (IS_ERR(i2c_dev->base))
1733*4882a593Smuzhiyun return PTR_ERR(i2c_dev->base);
1734*4882a593Smuzhiyun
1735*4882a593Smuzhiyun i2c_dev->base_phys = res->start;
1736*4882a593Smuzhiyun
1737*4882a593Smuzhiyun err = platform_get_irq(pdev, 0);
1738*4882a593Smuzhiyun if (err < 0)
1739*4882a593Smuzhiyun return err;
1740*4882a593Smuzhiyun
1741*4882a593Smuzhiyun i2c_dev->irq = err;
1742*4882a593Smuzhiyun
1743*4882a593Smuzhiyun /* interrupt will be enabled during of transfer time */
1744*4882a593Smuzhiyun irq_set_status_flags(i2c_dev->irq, IRQ_NOAUTOEN);
1745*4882a593Smuzhiyun
1746*4882a593Smuzhiyun err = devm_request_irq(i2c_dev->dev, i2c_dev->irq, tegra_i2c_isr,
1747*4882a593Smuzhiyun IRQF_NO_SUSPEND, dev_name(i2c_dev->dev),
1748*4882a593Smuzhiyun i2c_dev);
1749*4882a593Smuzhiyun if (err)
1750*4882a593Smuzhiyun return err;
1751*4882a593Smuzhiyun
1752*4882a593Smuzhiyun i2c_dev->rst = devm_reset_control_get_exclusive(i2c_dev->dev, "i2c");
1753*4882a593Smuzhiyun if (IS_ERR(i2c_dev->rst)) {
1754*4882a593Smuzhiyun dev_err_probe(i2c_dev->dev, PTR_ERR(i2c_dev->rst),
1755*4882a593Smuzhiyun "failed to get reset control\n");
1756*4882a593Smuzhiyun return PTR_ERR(i2c_dev->rst);
1757*4882a593Smuzhiyun }
1758*4882a593Smuzhiyun
1759*4882a593Smuzhiyun tegra_i2c_parse_dt(i2c_dev);
1760*4882a593Smuzhiyun
1761*4882a593Smuzhiyun err = tegra_i2c_init_clocks(i2c_dev);
1762*4882a593Smuzhiyun if (err)
1763*4882a593Smuzhiyun return err;
1764*4882a593Smuzhiyun
1765*4882a593Smuzhiyun err = tegra_i2c_init_dma(i2c_dev);
1766*4882a593Smuzhiyun if (err)
1767*4882a593Smuzhiyun goto release_clocks;
1768*4882a593Smuzhiyun
1769*4882a593Smuzhiyun /*
1770*4882a593Smuzhiyun * VI I2C is in VE power domain which is not always ON and not
1771*4882a593Smuzhiyun * IRQ-safe. Thus, IRQ-safe device shouldn't be attached to a
1772*4882a593Smuzhiyun * non IRQ-safe domain because this prevents powering off the power
1773*4882a593Smuzhiyun * domain.
1774*4882a593Smuzhiyun *
1775*4882a593Smuzhiyun * VI I2C device shouldn't be marked as IRQ-safe because VI I2C won't
1776*4882a593Smuzhiyun * be used for atomic transfers.
1777*4882a593Smuzhiyun */
1778*4882a593Smuzhiyun if (!i2c_dev->is_vi)
1779*4882a593Smuzhiyun pm_runtime_irq_safe(i2c_dev->dev);
1780*4882a593Smuzhiyun
1781*4882a593Smuzhiyun pm_runtime_enable(i2c_dev->dev);
1782*4882a593Smuzhiyun
1783*4882a593Smuzhiyun err = tegra_i2c_init_hardware(i2c_dev);
1784*4882a593Smuzhiyun if (err)
1785*4882a593Smuzhiyun goto release_rpm;
1786*4882a593Smuzhiyun
1787*4882a593Smuzhiyun i2c_set_adapdata(&i2c_dev->adapter, i2c_dev);
1788*4882a593Smuzhiyun i2c_dev->adapter.dev.of_node = i2c_dev->dev->of_node;
1789*4882a593Smuzhiyun i2c_dev->adapter.dev.parent = i2c_dev->dev;
1790*4882a593Smuzhiyun i2c_dev->adapter.retries = 1;
1791*4882a593Smuzhiyun i2c_dev->adapter.timeout = 6 * HZ;
1792*4882a593Smuzhiyun i2c_dev->adapter.quirks = i2c_dev->hw->quirks;
1793*4882a593Smuzhiyun i2c_dev->adapter.owner = THIS_MODULE;
1794*4882a593Smuzhiyun i2c_dev->adapter.class = I2C_CLASS_DEPRECATED;
1795*4882a593Smuzhiyun i2c_dev->adapter.algo = &tegra_i2c_algo;
1796*4882a593Smuzhiyun i2c_dev->adapter.nr = pdev->id;
1797*4882a593Smuzhiyun
1798*4882a593Smuzhiyun if (i2c_dev->hw->supports_bus_clear)
1799*4882a593Smuzhiyun i2c_dev->adapter.bus_recovery_info = &tegra_i2c_recovery_info;
1800*4882a593Smuzhiyun
1801*4882a593Smuzhiyun strlcpy(i2c_dev->adapter.name, dev_name(i2c_dev->dev),
1802*4882a593Smuzhiyun sizeof(i2c_dev->adapter.name));
1803*4882a593Smuzhiyun
1804*4882a593Smuzhiyun err = i2c_add_numbered_adapter(&i2c_dev->adapter);
1805*4882a593Smuzhiyun if (err)
1806*4882a593Smuzhiyun goto release_rpm;
1807*4882a593Smuzhiyun
1808*4882a593Smuzhiyun return 0;
1809*4882a593Smuzhiyun
1810*4882a593Smuzhiyun release_rpm:
1811*4882a593Smuzhiyun pm_runtime_disable(i2c_dev->dev);
1812*4882a593Smuzhiyun
1813*4882a593Smuzhiyun tegra_i2c_release_dma(i2c_dev);
1814*4882a593Smuzhiyun release_clocks:
1815*4882a593Smuzhiyun tegra_i2c_release_clocks(i2c_dev);
1816*4882a593Smuzhiyun
1817*4882a593Smuzhiyun return err;
1818*4882a593Smuzhiyun }
1819*4882a593Smuzhiyun
tegra_i2c_remove(struct platform_device * pdev)1820*4882a593Smuzhiyun static int tegra_i2c_remove(struct platform_device *pdev)
1821*4882a593Smuzhiyun {
1822*4882a593Smuzhiyun struct tegra_i2c_dev *i2c_dev = platform_get_drvdata(pdev);
1823*4882a593Smuzhiyun
1824*4882a593Smuzhiyun i2c_del_adapter(&i2c_dev->adapter);
1825*4882a593Smuzhiyun pm_runtime_disable(i2c_dev->dev);
1826*4882a593Smuzhiyun
1827*4882a593Smuzhiyun tegra_i2c_release_dma(i2c_dev);
1828*4882a593Smuzhiyun tegra_i2c_release_clocks(i2c_dev);
1829*4882a593Smuzhiyun
1830*4882a593Smuzhiyun return 0;
1831*4882a593Smuzhiyun }
1832*4882a593Smuzhiyun
tegra_i2c_runtime_resume(struct device * dev)1833*4882a593Smuzhiyun static int __maybe_unused tegra_i2c_runtime_resume(struct device *dev)
1834*4882a593Smuzhiyun {
1835*4882a593Smuzhiyun struct tegra_i2c_dev *i2c_dev = dev_get_drvdata(dev);
1836*4882a593Smuzhiyun int err;
1837*4882a593Smuzhiyun
1838*4882a593Smuzhiyun err = pinctrl_pm_select_default_state(dev);
1839*4882a593Smuzhiyun if (err)
1840*4882a593Smuzhiyun return err;
1841*4882a593Smuzhiyun
1842*4882a593Smuzhiyun err = clk_bulk_enable(i2c_dev->nclocks, i2c_dev->clocks);
1843*4882a593Smuzhiyun if (err)
1844*4882a593Smuzhiyun return err;
1845*4882a593Smuzhiyun
1846*4882a593Smuzhiyun /*
1847*4882a593Smuzhiyun * VI I2C device is attached to VE power domain which goes through
1848*4882a593Smuzhiyun * power ON/OFF during runtime PM resume/suspend, meaning that
1849*4882a593Smuzhiyun * controller needs to be re-initialized after power ON.
1850*4882a593Smuzhiyun */
1851*4882a593Smuzhiyun if (i2c_dev->is_vi) {
1852*4882a593Smuzhiyun err = tegra_i2c_init(i2c_dev);
1853*4882a593Smuzhiyun if (err)
1854*4882a593Smuzhiyun goto disable_clocks;
1855*4882a593Smuzhiyun }
1856*4882a593Smuzhiyun
1857*4882a593Smuzhiyun return 0;
1858*4882a593Smuzhiyun
1859*4882a593Smuzhiyun disable_clocks:
1860*4882a593Smuzhiyun clk_bulk_disable(i2c_dev->nclocks, i2c_dev->clocks);
1861*4882a593Smuzhiyun
1862*4882a593Smuzhiyun return err;
1863*4882a593Smuzhiyun }
1864*4882a593Smuzhiyun
tegra_i2c_runtime_suspend(struct device * dev)1865*4882a593Smuzhiyun static int __maybe_unused tegra_i2c_runtime_suspend(struct device *dev)
1866*4882a593Smuzhiyun {
1867*4882a593Smuzhiyun struct tegra_i2c_dev *i2c_dev = dev_get_drvdata(dev);
1868*4882a593Smuzhiyun
1869*4882a593Smuzhiyun clk_bulk_disable(i2c_dev->nclocks, i2c_dev->clocks);
1870*4882a593Smuzhiyun
1871*4882a593Smuzhiyun return pinctrl_pm_select_idle_state(dev);
1872*4882a593Smuzhiyun }
1873*4882a593Smuzhiyun
tegra_i2c_suspend(struct device * dev)1874*4882a593Smuzhiyun static int __maybe_unused tegra_i2c_suspend(struct device *dev)
1875*4882a593Smuzhiyun {
1876*4882a593Smuzhiyun struct tegra_i2c_dev *i2c_dev = dev_get_drvdata(dev);
1877*4882a593Smuzhiyun int err;
1878*4882a593Smuzhiyun
1879*4882a593Smuzhiyun i2c_mark_adapter_suspended(&i2c_dev->adapter);
1880*4882a593Smuzhiyun
1881*4882a593Smuzhiyun if (!pm_runtime_status_suspended(dev)) {
1882*4882a593Smuzhiyun err = tegra_i2c_runtime_suspend(dev);
1883*4882a593Smuzhiyun if (err)
1884*4882a593Smuzhiyun return err;
1885*4882a593Smuzhiyun }
1886*4882a593Smuzhiyun
1887*4882a593Smuzhiyun return 0;
1888*4882a593Smuzhiyun }
1889*4882a593Smuzhiyun
tegra_i2c_resume(struct device * dev)1890*4882a593Smuzhiyun static int __maybe_unused tegra_i2c_resume(struct device *dev)
1891*4882a593Smuzhiyun {
1892*4882a593Smuzhiyun struct tegra_i2c_dev *i2c_dev = dev_get_drvdata(dev);
1893*4882a593Smuzhiyun int err;
1894*4882a593Smuzhiyun
1895*4882a593Smuzhiyun /*
1896*4882a593Smuzhiyun * We need to ensure that clocks are enabled so that registers can be
1897*4882a593Smuzhiyun * restored in tegra_i2c_init().
1898*4882a593Smuzhiyun */
1899*4882a593Smuzhiyun err = tegra_i2c_runtime_resume(dev);
1900*4882a593Smuzhiyun if (err)
1901*4882a593Smuzhiyun return err;
1902*4882a593Smuzhiyun
1903*4882a593Smuzhiyun err = tegra_i2c_init(i2c_dev);
1904*4882a593Smuzhiyun if (err)
1905*4882a593Smuzhiyun return err;
1906*4882a593Smuzhiyun
1907*4882a593Smuzhiyun /*
1908*4882a593Smuzhiyun * In case we are runtime suspended, disable clocks again so that we
1909*4882a593Smuzhiyun * don't unbalance the clock reference counts during the next runtime
1910*4882a593Smuzhiyun * resume transition.
1911*4882a593Smuzhiyun */
1912*4882a593Smuzhiyun if (pm_runtime_status_suspended(dev)) {
1913*4882a593Smuzhiyun err = tegra_i2c_runtime_suspend(dev);
1914*4882a593Smuzhiyun if (err)
1915*4882a593Smuzhiyun return err;
1916*4882a593Smuzhiyun }
1917*4882a593Smuzhiyun
1918*4882a593Smuzhiyun i2c_mark_adapter_resumed(&i2c_dev->adapter);
1919*4882a593Smuzhiyun
1920*4882a593Smuzhiyun return 0;
1921*4882a593Smuzhiyun }
1922*4882a593Smuzhiyun
1923*4882a593Smuzhiyun static const struct dev_pm_ops tegra_i2c_pm = {
1924*4882a593Smuzhiyun SET_NOIRQ_SYSTEM_SLEEP_PM_OPS(tegra_i2c_suspend, tegra_i2c_resume)
1925*4882a593Smuzhiyun SET_RUNTIME_PM_OPS(tegra_i2c_runtime_suspend, tegra_i2c_runtime_resume,
1926*4882a593Smuzhiyun NULL)
1927*4882a593Smuzhiyun };
1928*4882a593Smuzhiyun
1929*4882a593Smuzhiyun static struct platform_driver tegra_i2c_driver = {
1930*4882a593Smuzhiyun .probe = tegra_i2c_probe,
1931*4882a593Smuzhiyun .remove = tegra_i2c_remove,
1932*4882a593Smuzhiyun .driver = {
1933*4882a593Smuzhiyun .name = "tegra-i2c",
1934*4882a593Smuzhiyun .of_match_table = tegra_i2c_of_match,
1935*4882a593Smuzhiyun .pm = &tegra_i2c_pm,
1936*4882a593Smuzhiyun },
1937*4882a593Smuzhiyun };
1938*4882a593Smuzhiyun module_platform_driver(tegra_i2c_driver);
1939*4882a593Smuzhiyun
1940*4882a593Smuzhiyun MODULE_DESCRIPTION("NVIDIA Tegra I2C Bus Controller driver");
1941*4882a593Smuzhiyun MODULE_AUTHOR("Colin Cross");
1942*4882a593Smuzhiyun MODULE_LICENSE("GPL v2");
1943