1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun * Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
3*4882a593Smuzhiyun * Copyright (c) 2010-2011 NVIDIA Corporation
4*4882a593Smuzhiyun * NVIDIA Corporation <www.nvidia.com>
5*4882a593Smuzhiyun *
6*4882a593Smuzhiyun * SPDX-License-Identifier: GPL-2.0+
7*4882a593Smuzhiyun */
8*4882a593Smuzhiyun
9*4882a593Smuzhiyun #include <common.h>
10*4882a593Smuzhiyun #include <dm.h>
11*4882a593Smuzhiyun #include <errno.h>
12*4882a593Smuzhiyun #include <i2c.h>
13*4882a593Smuzhiyun #include <asm/io.h>
14*4882a593Smuzhiyun #include <clk.h>
15*4882a593Smuzhiyun #include <reset.h>
16*4882a593Smuzhiyun #ifndef CONFIG_TEGRA186
17*4882a593Smuzhiyun #include <asm/arch/clock.h>
18*4882a593Smuzhiyun #include <asm/arch/funcmux.h>
19*4882a593Smuzhiyun #endif
20*4882a593Smuzhiyun #include <asm/arch/gpio.h>
21*4882a593Smuzhiyun #include <asm/arch-tegra/tegra_i2c.h>
22*4882a593Smuzhiyun
23*4882a593Smuzhiyun DECLARE_GLOBAL_DATA_PTR;
24*4882a593Smuzhiyun
25*4882a593Smuzhiyun enum i2c_type {
26*4882a593Smuzhiyun TYPE_114,
27*4882a593Smuzhiyun TYPE_STD,
28*4882a593Smuzhiyun TYPE_DVC,
29*4882a593Smuzhiyun };
30*4882a593Smuzhiyun
31*4882a593Smuzhiyun /* Information about i2c controller */
32*4882a593Smuzhiyun struct i2c_bus {
33*4882a593Smuzhiyun int id;
34*4882a593Smuzhiyun struct reset_ctl reset_ctl;
35*4882a593Smuzhiyun struct clk clk;
36*4882a593Smuzhiyun int speed;
37*4882a593Smuzhiyun int pinmux_config;
38*4882a593Smuzhiyun struct i2c_control *control;
39*4882a593Smuzhiyun struct i2c_ctlr *regs;
40*4882a593Smuzhiyun enum i2c_type type;
41*4882a593Smuzhiyun int inited; /* bus is inited */
42*4882a593Smuzhiyun };
43*4882a593Smuzhiyun
set_packet_mode(struct i2c_bus * i2c_bus)44*4882a593Smuzhiyun static void set_packet_mode(struct i2c_bus *i2c_bus)
45*4882a593Smuzhiyun {
46*4882a593Smuzhiyun u32 config;
47*4882a593Smuzhiyun
48*4882a593Smuzhiyun config = I2C_CNFG_NEW_MASTER_FSM_MASK | I2C_CNFG_PACKET_MODE_MASK;
49*4882a593Smuzhiyun
50*4882a593Smuzhiyun if (i2c_bus->type == TYPE_DVC) {
51*4882a593Smuzhiyun struct dvc_ctlr *dvc = (struct dvc_ctlr *)i2c_bus->regs;
52*4882a593Smuzhiyun
53*4882a593Smuzhiyun writel(config, &dvc->cnfg);
54*4882a593Smuzhiyun } else {
55*4882a593Smuzhiyun writel(config, &i2c_bus->regs->cnfg);
56*4882a593Smuzhiyun /*
57*4882a593Smuzhiyun * program I2C_SL_CNFG.NEWSL to ENABLE. This fixes probe
58*4882a593Smuzhiyun * issues, i.e., some slaves may be wrongly detected.
59*4882a593Smuzhiyun */
60*4882a593Smuzhiyun setbits_le32(&i2c_bus->regs->sl_cnfg, I2C_SL_CNFG_NEWSL_MASK);
61*4882a593Smuzhiyun }
62*4882a593Smuzhiyun }
63*4882a593Smuzhiyun
i2c_reset_controller(struct i2c_bus * i2c_bus)64*4882a593Smuzhiyun static void i2c_reset_controller(struct i2c_bus *i2c_bus)
65*4882a593Smuzhiyun {
66*4882a593Smuzhiyun /* Reset I2C controller. */
67*4882a593Smuzhiyun reset_assert(&i2c_bus->reset_ctl);
68*4882a593Smuzhiyun udelay(1);
69*4882a593Smuzhiyun reset_deassert(&i2c_bus->reset_ctl);
70*4882a593Smuzhiyun udelay(1);
71*4882a593Smuzhiyun
72*4882a593Smuzhiyun /* re-program config register to packet mode */
73*4882a593Smuzhiyun set_packet_mode(i2c_bus);
74*4882a593Smuzhiyun }
75*4882a593Smuzhiyun
i2c_init_clock(struct i2c_bus * i2c_bus,unsigned rate)76*4882a593Smuzhiyun static int i2c_init_clock(struct i2c_bus *i2c_bus, unsigned rate)
77*4882a593Smuzhiyun {
78*4882a593Smuzhiyun int ret;
79*4882a593Smuzhiyun
80*4882a593Smuzhiyun ret = reset_assert(&i2c_bus->reset_ctl);
81*4882a593Smuzhiyun if (ret)
82*4882a593Smuzhiyun return ret;
83*4882a593Smuzhiyun ret = clk_enable(&i2c_bus->clk);
84*4882a593Smuzhiyun if (ret)
85*4882a593Smuzhiyun return ret;
86*4882a593Smuzhiyun ret = clk_set_rate(&i2c_bus->clk, rate);
87*4882a593Smuzhiyun if (IS_ERR_VALUE(ret))
88*4882a593Smuzhiyun return ret;
89*4882a593Smuzhiyun ret = reset_deassert(&i2c_bus->reset_ctl);
90*4882a593Smuzhiyun if (ret)
91*4882a593Smuzhiyun return ret;
92*4882a593Smuzhiyun
93*4882a593Smuzhiyun return 0;
94*4882a593Smuzhiyun }
95*4882a593Smuzhiyun
i2c_init_controller(struct i2c_bus * i2c_bus)96*4882a593Smuzhiyun static void i2c_init_controller(struct i2c_bus *i2c_bus)
97*4882a593Smuzhiyun {
98*4882a593Smuzhiyun if (!i2c_bus->speed)
99*4882a593Smuzhiyun return;
100*4882a593Smuzhiyun debug("%s: speed=%d\n", __func__, i2c_bus->speed);
101*4882a593Smuzhiyun /*
102*4882a593Smuzhiyun * Use PLLP - DP-04508-001_v06 datasheet indicates a divisor of 8
103*4882a593Smuzhiyun * here, in section 23.3.1, but in fact we seem to need a factor of
104*4882a593Smuzhiyun * 16 to get the right frequency.
105*4882a593Smuzhiyun */
106*4882a593Smuzhiyun i2c_init_clock(i2c_bus, i2c_bus->speed * 2 * 8);
107*4882a593Smuzhiyun
108*4882a593Smuzhiyun if (i2c_bus->type == TYPE_114) {
109*4882a593Smuzhiyun /*
110*4882a593Smuzhiyun * T114 I2C went to a single clock source for standard/fast and
111*4882a593Smuzhiyun * HS clock speeds. The new clock rate setting calculation is:
112*4882a593Smuzhiyun * SCL = CLK_SOURCE.I2C /
113*4882a593Smuzhiyun * (CLK_MULT_STD_FAST_MODE * (I2C_CLK_DIV_STD_FAST_MODE+1) *
114*4882a593Smuzhiyun * I2C FREQUENCY DIVISOR) as per the T114 TRM (sec 30.3.1).
115*4882a593Smuzhiyun *
116*4882a593Smuzhiyun * NOTE: We do this here, after the initial clock/pll start,
117*4882a593Smuzhiyun * because if we read the clk_div reg before the controller
118*4882a593Smuzhiyun * is running, we hang, and we need it for the new calc.
119*4882a593Smuzhiyun */
120*4882a593Smuzhiyun int clk_div_stdfst_mode = readl(&i2c_bus->regs->clk_div) >> 16;
121*4882a593Smuzhiyun unsigned rate = CLK_MULT_STD_FAST_MODE *
122*4882a593Smuzhiyun (clk_div_stdfst_mode + 1) * i2c_bus->speed * 2;
123*4882a593Smuzhiyun debug("%s: CLK_DIV_STD_FAST_MODE setting = %d\n", __func__,
124*4882a593Smuzhiyun clk_div_stdfst_mode);
125*4882a593Smuzhiyun
126*4882a593Smuzhiyun i2c_init_clock(i2c_bus, rate);
127*4882a593Smuzhiyun }
128*4882a593Smuzhiyun
129*4882a593Smuzhiyun /* Reset I2C controller. */
130*4882a593Smuzhiyun i2c_reset_controller(i2c_bus);
131*4882a593Smuzhiyun
132*4882a593Smuzhiyun /* Configure I2C controller. */
133*4882a593Smuzhiyun if (i2c_bus->type == TYPE_DVC) { /* only for DVC I2C */
134*4882a593Smuzhiyun struct dvc_ctlr *dvc = (struct dvc_ctlr *)i2c_bus->regs;
135*4882a593Smuzhiyun
136*4882a593Smuzhiyun setbits_le32(&dvc->ctrl3, DVC_CTRL_REG3_I2C_HW_SW_PROG_MASK);
137*4882a593Smuzhiyun }
138*4882a593Smuzhiyun
139*4882a593Smuzhiyun #ifndef CONFIG_TEGRA186
140*4882a593Smuzhiyun funcmux_select(i2c_bus->clk.id, i2c_bus->pinmux_config);
141*4882a593Smuzhiyun #endif
142*4882a593Smuzhiyun }
143*4882a593Smuzhiyun
send_packet_headers(struct i2c_bus * i2c_bus,struct i2c_trans_info * trans,u32 packet_id,bool end_with_repeated_start)144*4882a593Smuzhiyun static void send_packet_headers(
145*4882a593Smuzhiyun struct i2c_bus *i2c_bus,
146*4882a593Smuzhiyun struct i2c_trans_info *trans,
147*4882a593Smuzhiyun u32 packet_id,
148*4882a593Smuzhiyun bool end_with_repeated_start)
149*4882a593Smuzhiyun {
150*4882a593Smuzhiyun u32 data;
151*4882a593Smuzhiyun
152*4882a593Smuzhiyun /* prepare header1: Header size = 0 Protocol = I2C, pktType = 0 */
153*4882a593Smuzhiyun data = PROTOCOL_TYPE_I2C << PKT_HDR1_PROTOCOL_SHIFT;
154*4882a593Smuzhiyun data |= packet_id << PKT_HDR1_PKT_ID_SHIFT;
155*4882a593Smuzhiyun data |= i2c_bus->id << PKT_HDR1_CTLR_ID_SHIFT;
156*4882a593Smuzhiyun writel(data, &i2c_bus->control->tx_fifo);
157*4882a593Smuzhiyun debug("pkt header 1 sent (0x%x)\n", data);
158*4882a593Smuzhiyun
159*4882a593Smuzhiyun /* prepare header2 */
160*4882a593Smuzhiyun data = (trans->num_bytes - 1) << PKT_HDR2_PAYLOAD_SIZE_SHIFT;
161*4882a593Smuzhiyun writel(data, &i2c_bus->control->tx_fifo);
162*4882a593Smuzhiyun debug("pkt header 2 sent (0x%x)\n", data);
163*4882a593Smuzhiyun
164*4882a593Smuzhiyun /* prepare IO specific header: configure the slave address */
165*4882a593Smuzhiyun data = trans->address << PKT_HDR3_SLAVE_ADDR_SHIFT;
166*4882a593Smuzhiyun
167*4882a593Smuzhiyun /* Enable Read if it is not a write transaction */
168*4882a593Smuzhiyun if (!(trans->flags & I2C_IS_WRITE))
169*4882a593Smuzhiyun data |= PKT_HDR3_READ_MODE_MASK;
170*4882a593Smuzhiyun if (end_with_repeated_start)
171*4882a593Smuzhiyun data |= PKT_HDR3_REPEAT_START_MASK;
172*4882a593Smuzhiyun
173*4882a593Smuzhiyun /* Write I2C specific header */
174*4882a593Smuzhiyun writel(data, &i2c_bus->control->tx_fifo);
175*4882a593Smuzhiyun debug("pkt header 3 sent (0x%x)\n", data);
176*4882a593Smuzhiyun }
177*4882a593Smuzhiyun
wait_for_tx_fifo_empty(struct i2c_control * control)178*4882a593Smuzhiyun static int wait_for_tx_fifo_empty(struct i2c_control *control)
179*4882a593Smuzhiyun {
180*4882a593Smuzhiyun u32 count;
181*4882a593Smuzhiyun int timeout_us = I2C_TIMEOUT_USEC;
182*4882a593Smuzhiyun
183*4882a593Smuzhiyun while (timeout_us >= 0) {
184*4882a593Smuzhiyun count = (readl(&control->fifo_status) & TX_FIFO_EMPTY_CNT_MASK)
185*4882a593Smuzhiyun >> TX_FIFO_EMPTY_CNT_SHIFT;
186*4882a593Smuzhiyun if (count == I2C_FIFO_DEPTH)
187*4882a593Smuzhiyun return 1;
188*4882a593Smuzhiyun udelay(10);
189*4882a593Smuzhiyun timeout_us -= 10;
190*4882a593Smuzhiyun }
191*4882a593Smuzhiyun
192*4882a593Smuzhiyun return 0;
193*4882a593Smuzhiyun }
194*4882a593Smuzhiyun
wait_for_rx_fifo_notempty(struct i2c_control * control)195*4882a593Smuzhiyun static int wait_for_rx_fifo_notempty(struct i2c_control *control)
196*4882a593Smuzhiyun {
197*4882a593Smuzhiyun u32 count;
198*4882a593Smuzhiyun int timeout_us = I2C_TIMEOUT_USEC;
199*4882a593Smuzhiyun
200*4882a593Smuzhiyun while (timeout_us >= 0) {
201*4882a593Smuzhiyun count = (readl(&control->fifo_status) & TX_FIFO_FULL_CNT_MASK)
202*4882a593Smuzhiyun >> TX_FIFO_FULL_CNT_SHIFT;
203*4882a593Smuzhiyun if (count)
204*4882a593Smuzhiyun return 1;
205*4882a593Smuzhiyun udelay(10);
206*4882a593Smuzhiyun timeout_us -= 10;
207*4882a593Smuzhiyun }
208*4882a593Smuzhiyun
209*4882a593Smuzhiyun return 0;
210*4882a593Smuzhiyun }
211*4882a593Smuzhiyun
wait_for_transfer_complete(struct i2c_control * control)212*4882a593Smuzhiyun static int wait_for_transfer_complete(struct i2c_control *control)
213*4882a593Smuzhiyun {
214*4882a593Smuzhiyun int int_status;
215*4882a593Smuzhiyun int timeout_us = I2C_TIMEOUT_USEC;
216*4882a593Smuzhiyun
217*4882a593Smuzhiyun while (timeout_us >= 0) {
218*4882a593Smuzhiyun int_status = readl(&control->int_status);
219*4882a593Smuzhiyun if (int_status & I2C_INT_NO_ACK_MASK)
220*4882a593Smuzhiyun return -int_status;
221*4882a593Smuzhiyun if (int_status & I2C_INT_ARBITRATION_LOST_MASK)
222*4882a593Smuzhiyun return -int_status;
223*4882a593Smuzhiyun if (int_status & I2C_INT_XFER_COMPLETE_MASK)
224*4882a593Smuzhiyun return 0;
225*4882a593Smuzhiyun
226*4882a593Smuzhiyun udelay(10);
227*4882a593Smuzhiyun timeout_us -= 10;
228*4882a593Smuzhiyun }
229*4882a593Smuzhiyun
230*4882a593Smuzhiyun return -1;
231*4882a593Smuzhiyun }
232*4882a593Smuzhiyun
send_recv_packets(struct i2c_bus * i2c_bus,struct i2c_trans_info * trans)233*4882a593Smuzhiyun static int send_recv_packets(struct i2c_bus *i2c_bus,
234*4882a593Smuzhiyun struct i2c_trans_info *trans)
235*4882a593Smuzhiyun {
236*4882a593Smuzhiyun struct i2c_control *control = i2c_bus->control;
237*4882a593Smuzhiyun u32 int_status;
238*4882a593Smuzhiyun u32 words;
239*4882a593Smuzhiyun u8 *dptr;
240*4882a593Smuzhiyun u32 local;
241*4882a593Smuzhiyun uchar last_bytes;
242*4882a593Smuzhiyun int error = 0;
243*4882a593Smuzhiyun int is_write = trans->flags & I2C_IS_WRITE;
244*4882a593Smuzhiyun
245*4882a593Smuzhiyun /* clear status from previous transaction, XFER_COMPLETE, NOACK, etc. */
246*4882a593Smuzhiyun int_status = readl(&control->int_status);
247*4882a593Smuzhiyun writel(int_status, &control->int_status);
248*4882a593Smuzhiyun
249*4882a593Smuzhiyun send_packet_headers(i2c_bus, trans, 1,
250*4882a593Smuzhiyun trans->flags & I2C_USE_REPEATED_START);
251*4882a593Smuzhiyun
252*4882a593Smuzhiyun words = DIV_ROUND_UP(trans->num_bytes, 4);
253*4882a593Smuzhiyun last_bytes = trans->num_bytes & 3;
254*4882a593Smuzhiyun dptr = trans->buf;
255*4882a593Smuzhiyun
256*4882a593Smuzhiyun while (words) {
257*4882a593Smuzhiyun u32 *wptr = (u32 *)dptr;
258*4882a593Smuzhiyun
259*4882a593Smuzhiyun if (is_write) {
260*4882a593Smuzhiyun /* deal with word alignment */
261*4882a593Smuzhiyun if ((words == 1) && last_bytes) {
262*4882a593Smuzhiyun local = 0;
263*4882a593Smuzhiyun memcpy(&local, dptr, last_bytes);
264*4882a593Smuzhiyun } else if ((unsigned long)dptr & 3) {
265*4882a593Smuzhiyun memcpy(&local, dptr, sizeof(u32));
266*4882a593Smuzhiyun } else {
267*4882a593Smuzhiyun local = *wptr;
268*4882a593Smuzhiyun }
269*4882a593Smuzhiyun writel(local, &control->tx_fifo);
270*4882a593Smuzhiyun debug("pkt data sent (0x%x)\n", local);
271*4882a593Smuzhiyun if (!wait_for_tx_fifo_empty(control)) {
272*4882a593Smuzhiyun error = -1;
273*4882a593Smuzhiyun goto exit;
274*4882a593Smuzhiyun }
275*4882a593Smuzhiyun } else {
276*4882a593Smuzhiyun if (!wait_for_rx_fifo_notempty(control)) {
277*4882a593Smuzhiyun error = -1;
278*4882a593Smuzhiyun goto exit;
279*4882a593Smuzhiyun }
280*4882a593Smuzhiyun /*
281*4882a593Smuzhiyun * for the last word, we read into our local buffer,
282*4882a593Smuzhiyun * in case that caller did not provide enough buffer.
283*4882a593Smuzhiyun */
284*4882a593Smuzhiyun local = readl(&control->rx_fifo);
285*4882a593Smuzhiyun if ((words == 1) && last_bytes)
286*4882a593Smuzhiyun memcpy(dptr, (char *)&local, last_bytes);
287*4882a593Smuzhiyun else if ((unsigned long)dptr & 3)
288*4882a593Smuzhiyun memcpy(dptr, &local, sizeof(u32));
289*4882a593Smuzhiyun else
290*4882a593Smuzhiyun *wptr = local;
291*4882a593Smuzhiyun debug("pkt data received (0x%x)\n", local);
292*4882a593Smuzhiyun }
293*4882a593Smuzhiyun words--;
294*4882a593Smuzhiyun dptr += sizeof(u32);
295*4882a593Smuzhiyun }
296*4882a593Smuzhiyun
297*4882a593Smuzhiyun if (wait_for_transfer_complete(control)) {
298*4882a593Smuzhiyun error = -1;
299*4882a593Smuzhiyun goto exit;
300*4882a593Smuzhiyun }
301*4882a593Smuzhiyun return 0;
302*4882a593Smuzhiyun exit:
303*4882a593Smuzhiyun /* error, reset the controller. */
304*4882a593Smuzhiyun i2c_reset_controller(i2c_bus);
305*4882a593Smuzhiyun
306*4882a593Smuzhiyun return error;
307*4882a593Smuzhiyun }
308*4882a593Smuzhiyun
tegra_i2c_write_data(struct i2c_bus * i2c_bus,u32 addr,u8 * data,u32 len,bool end_with_repeated_start)309*4882a593Smuzhiyun static int tegra_i2c_write_data(struct i2c_bus *i2c_bus, u32 addr, u8 *data,
310*4882a593Smuzhiyun u32 len, bool end_with_repeated_start)
311*4882a593Smuzhiyun {
312*4882a593Smuzhiyun int error;
313*4882a593Smuzhiyun struct i2c_trans_info trans_info;
314*4882a593Smuzhiyun
315*4882a593Smuzhiyun trans_info.address = addr;
316*4882a593Smuzhiyun trans_info.buf = data;
317*4882a593Smuzhiyun trans_info.flags = I2C_IS_WRITE;
318*4882a593Smuzhiyun if (end_with_repeated_start)
319*4882a593Smuzhiyun trans_info.flags |= I2C_USE_REPEATED_START;
320*4882a593Smuzhiyun trans_info.num_bytes = len;
321*4882a593Smuzhiyun trans_info.is_10bit_address = 0;
322*4882a593Smuzhiyun
323*4882a593Smuzhiyun error = send_recv_packets(i2c_bus, &trans_info);
324*4882a593Smuzhiyun if (error)
325*4882a593Smuzhiyun debug("tegra_i2c_write_data: Error (%d) !!!\n", error);
326*4882a593Smuzhiyun
327*4882a593Smuzhiyun return error;
328*4882a593Smuzhiyun }
329*4882a593Smuzhiyun
tegra_i2c_read_data(struct i2c_bus * i2c_bus,u32 addr,u8 * data,u32 len)330*4882a593Smuzhiyun static int tegra_i2c_read_data(struct i2c_bus *i2c_bus, u32 addr, u8 *data,
331*4882a593Smuzhiyun u32 len)
332*4882a593Smuzhiyun {
333*4882a593Smuzhiyun int error;
334*4882a593Smuzhiyun struct i2c_trans_info trans_info;
335*4882a593Smuzhiyun
336*4882a593Smuzhiyun trans_info.address = addr | 1;
337*4882a593Smuzhiyun trans_info.buf = data;
338*4882a593Smuzhiyun trans_info.flags = 0;
339*4882a593Smuzhiyun trans_info.num_bytes = len;
340*4882a593Smuzhiyun trans_info.is_10bit_address = 0;
341*4882a593Smuzhiyun
342*4882a593Smuzhiyun error = send_recv_packets(i2c_bus, &trans_info);
343*4882a593Smuzhiyun if (error)
344*4882a593Smuzhiyun debug("tegra_i2c_read_data: Error (%d) !!!\n", error);
345*4882a593Smuzhiyun
346*4882a593Smuzhiyun return error;
347*4882a593Smuzhiyun }
348*4882a593Smuzhiyun
tegra_i2c_set_bus_speed(struct udevice * dev,unsigned int speed)349*4882a593Smuzhiyun static int tegra_i2c_set_bus_speed(struct udevice *dev, unsigned int speed)
350*4882a593Smuzhiyun {
351*4882a593Smuzhiyun struct i2c_bus *i2c_bus = dev_get_priv(dev);
352*4882a593Smuzhiyun
353*4882a593Smuzhiyun i2c_bus->speed = speed;
354*4882a593Smuzhiyun i2c_init_controller(i2c_bus);
355*4882a593Smuzhiyun
356*4882a593Smuzhiyun return 0;
357*4882a593Smuzhiyun }
358*4882a593Smuzhiyun
tegra_i2c_probe(struct udevice * dev)359*4882a593Smuzhiyun static int tegra_i2c_probe(struct udevice *dev)
360*4882a593Smuzhiyun {
361*4882a593Smuzhiyun struct i2c_bus *i2c_bus = dev_get_priv(dev);
362*4882a593Smuzhiyun int ret;
363*4882a593Smuzhiyun bool is_dvc;
364*4882a593Smuzhiyun
365*4882a593Smuzhiyun i2c_bus->id = dev->seq;
366*4882a593Smuzhiyun i2c_bus->type = dev_get_driver_data(dev);
367*4882a593Smuzhiyun i2c_bus->regs = (struct i2c_ctlr *)dev_read_addr(dev);
368*4882a593Smuzhiyun if ((ulong)i2c_bus->regs == FDT_ADDR_T_NONE) {
369*4882a593Smuzhiyun debug("%s: Cannot get regs address\n", __func__);
370*4882a593Smuzhiyun return -EINVAL;
371*4882a593Smuzhiyun }
372*4882a593Smuzhiyun
373*4882a593Smuzhiyun ret = reset_get_by_name(dev, "i2c", &i2c_bus->reset_ctl);
374*4882a593Smuzhiyun if (ret) {
375*4882a593Smuzhiyun pr_err("reset_get_by_name() failed: %d\n", ret);
376*4882a593Smuzhiyun return ret;
377*4882a593Smuzhiyun }
378*4882a593Smuzhiyun ret = clk_get_by_name(dev, "div-clk", &i2c_bus->clk);
379*4882a593Smuzhiyun if (ret) {
380*4882a593Smuzhiyun pr_err("clk_get_by_name() failed: %d\n", ret);
381*4882a593Smuzhiyun return ret;
382*4882a593Smuzhiyun }
383*4882a593Smuzhiyun
384*4882a593Smuzhiyun #ifndef CONFIG_TEGRA186
385*4882a593Smuzhiyun /*
386*4882a593Smuzhiyun * We don't have a binding for pinmux yet. Leave it out for now. So
387*4882a593Smuzhiyun * far no one needs anything other than the default.
388*4882a593Smuzhiyun */
389*4882a593Smuzhiyun i2c_bus->pinmux_config = FUNCMUX_DEFAULT;
390*4882a593Smuzhiyun
391*4882a593Smuzhiyun /*
392*4882a593Smuzhiyun * We can't specify the pinmux config in the fdt, so I2C2 will not
393*4882a593Smuzhiyun * work on Seaboard. It normally has no devices on it anyway.
394*4882a593Smuzhiyun * You could add in this little hack if you need to use it.
395*4882a593Smuzhiyun * The correct solution is a pinmux binding in the fdt.
396*4882a593Smuzhiyun *
397*4882a593Smuzhiyun * if (i2c_bus->clk.id == PERIPH_ID_I2C2)
398*4882a593Smuzhiyun * i2c_bus->pinmux_config = FUNCMUX_I2C2_PTA;
399*4882a593Smuzhiyun */
400*4882a593Smuzhiyun #endif
401*4882a593Smuzhiyun
402*4882a593Smuzhiyun is_dvc = dev_get_driver_data(dev) == TYPE_DVC;
403*4882a593Smuzhiyun if (is_dvc) {
404*4882a593Smuzhiyun i2c_bus->control =
405*4882a593Smuzhiyun &((struct dvc_ctlr *)i2c_bus->regs)->control;
406*4882a593Smuzhiyun } else {
407*4882a593Smuzhiyun i2c_bus->control = &i2c_bus->regs->control;
408*4882a593Smuzhiyun }
409*4882a593Smuzhiyun i2c_init_controller(i2c_bus);
410*4882a593Smuzhiyun debug("%s: controller bus %d at %p, speed %d: ",
411*4882a593Smuzhiyun is_dvc ? "dvc" : "i2c", dev->seq, i2c_bus->regs, i2c_bus->speed);
412*4882a593Smuzhiyun
413*4882a593Smuzhiyun return 0;
414*4882a593Smuzhiyun }
415*4882a593Smuzhiyun
416*4882a593Smuzhiyun /* i2c write version without the register address */
i2c_write_data(struct i2c_bus * i2c_bus,uchar chip,uchar * buffer,int len,bool end_with_repeated_start)417*4882a593Smuzhiyun static int i2c_write_data(struct i2c_bus *i2c_bus, uchar chip, uchar *buffer,
418*4882a593Smuzhiyun int len, bool end_with_repeated_start)
419*4882a593Smuzhiyun {
420*4882a593Smuzhiyun int rc;
421*4882a593Smuzhiyun
422*4882a593Smuzhiyun debug("i2c_write_data: chip=0x%x, len=0x%x\n", chip, len);
423*4882a593Smuzhiyun debug("write_data: ");
424*4882a593Smuzhiyun /* use rc for counter */
425*4882a593Smuzhiyun for (rc = 0; rc < len; ++rc)
426*4882a593Smuzhiyun debug(" 0x%02x", buffer[rc]);
427*4882a593Smuzhiyun debug("\n");
428*4882a593Smuzhiyun
429*4882a593Smuzhiyun /* Shift 7-bit address over for lower-level i2c functions */
430*4882a593Smuzhiyun rc = tegra_i2c_write_data(i2c_bus, chip << 1, buffer, len,
431*4882a593Smuzhiyun end_with_repeated_start);
432*4882a593Smuzhiyun if (rc)
433*4882a593Smuzhiyun debug("i2c_write_data(): rc=%d\n", rc);
434*4882a593Smuzhiyun
435*4882a593Smuzhiyun return rc;
436*4882a593Smuzhiyun }
437*4882a593Smuzhiyun
438*4882a593Smuzhiyun /* i2c read version without the register address */
i2c_read_data(struct i2c_bus * i2c_bus,uchar chip,uchar * buffer,int len)439*4882a593Smuzhiyun static int i2c_read_data(struct i2c_bus *i2c_bus, uchar chip, uchar *buffer,
440*4882a593Smuzhiyun int len)
441*4882a593Smuzhiyun {
442*4882a593Smuzhiyun int rc;
443*4882a593Smuzhiyun
444*4882a593Smuzhiyun debug("inside i2c_read_data():\n");
445*4882a593Smuzhiyun /* Shift 7-bit address over for lower-level i2c functions */
446*4882a593Smuzhiyun rc = tegra_i2c_read_data(i2c_bus, chip << 1, buffer, len);
447*4882a593Smuzhiyun if (rc) {
448*4882a593Smuzhiyun debug("i2c_read_data(): rc=%d\n", rc);
449*4882a593Smuzhiyun return rc;
450*4882a593Smuzhiyun }
451*4882a593Smuzhiyun
452*4882a593Smuzhiyun debug("i2c_read_data: ");
453*4882a593Smuzhiyun /* reuse rc for counter*/
454*4882a593Smuzhiyun for (rc = 0; rc < len; ++rc)
455*4882a593Smuzhiyun debug(" 0x%02x", buffer[rc]);
456*4882a593Smuzhiyun debug("\n");
457*4882a593Smuzhiyun
458*4882a593Smuzhiyun return 0;
459*4882a593Smuzhiyun }
460*4882a593Smuzhiyun
461*4882a593Smuzhiyun /* Probe to see if a chip is present. */
tegra_i2c_probe_chip(struct udevice * bus,uint chip_addr,uint chip_flags)462*4882a593Smuzhiyun static int tegra_i2c_probe_chip(struct udevice *bus, uint chip_addr,
463*4882a593Smuzhiyun uint chip_flags)
464*4882a593Smuzhiyun {
465*4882a593Smuzhiyun struct i2c_bus *i2c_bus = dev_get_priv(bus);
466*4882a593Smuzhiyun int rc;
467*4882a593Smuzhiyun u8 reg;
468*4882a593Smuzhiyun
469*4882a593Smuzhiyun /* Shift 7-bit address over for lower-level i2c functions */
470*4882a593Smuzhiyun rc = tegra_i2c_write_data(i2c_bus, chip_addr << 1, ®, sizeof(reg),
471*4882a593Smuzhiyun false);
472*4882a593Smuzhiyun
473*4882a593Smuzhiyun return rc;
474*4882a593Smuzhiyun }
475*4882a593Smuzhiyun
tegra_i2c_xfer(struct udevice * bus,struct i2c_msg * msg,int nmsgs)476*4882a593Smuzhiyun static int tegra_i2c_xfer(struct udevice *bus, struct i2c_msg *msg,
477*4882a593Smuzhiyun int nmsgs)
478*4882a593Smuzhiyun {
479*4882a593Smuzhiyun struct i2c_bus *i2c_bus = dev_get_priv(bus);
480*4882a593Smuzhiyun int ret;
481*4882a593Smuzhiyun
482*4882a593Smuzhiyun debug("i2c_xfer: %d messages\n", nmsgs);
483*4882a593Smuzhiyun for (; nmsgs > 0; nmsgs--, msg++) {
484*4882a593Smuzhiyun bool next_is_read = nmsgs > 1 && (msg[1].flags & I2C_M_RD);
485*4882a593Smuzhiyun
486*4882a593Smuzhiyun debug("i2c_xfer: chip=0x%x, len=0x%x\n", msg->addr, msg->len);
487*4882a593Smuzhiyun if (msg->flags & I2C_M_RD) {
488*4882a593Smuzhiyun ret = i2c_read_data(i2c_bus, msg->addr, msg->buf,
489*4882a593Smuzhiyun msg->len);
490*4882a593Smuzhiyun } else {
491*4882a593Smuzhiyun ret = i2c_write_data(i2c_bus, msg->addr, msg->buf,
492*4882a593Smuzhiyun msg->len, next_is_read);
493*4882a593Smuzhiyun }
494*4882a593Smuzhiyun if (ret) {
495*4882a593Smuzhiyun debug("i2c_write: error sending\n");
496*4882a593Smuzhiyun return -EREMOTEIO;
497*4882a593Smuzhiyun }
498*4882a593Smuzhiyun }
499*4882a593Smuzhiyun
500*4882a593Smuzhiyun return 0;
501*4882a593Smuzhiyun }
502*4882a593Smuzhiyun
tegra_i2c_get_dvc_bus(struct udevice ** busp)503*4882a593Smuzhiyun int tegra_i2c_get_dvc_bus(struct udevice **busp)
504*4882a593Smuzhiyun {
505*4882a593Smuzhiyun struct udevice *bus;
506*4882a593Smuzhiyun
507*4882a593Smuzhiyun for (uclass_first_device(UCLASS_I2C, &bus);
508*4882a593Smuzhiyun bus;
509*4882a593Smuzhiyun uclass_next_device(&bus)) {
510*4882a593Smuzhiyun if (dev_get_driver_data(bus) == TYPE_DVC) {
511*4882a593Smuzhiyun *busp = bus;
512*4882a593Smuzhiyun return 0;
513*4882a593Smuzhiyun }
514*4882a593Smuzhiyun }
515*4882a593Smuzhiyun
516*4882a593Smuzhiyun return -ENODEV;
517*4882a593Smuzhiyun }
518*4882a593Smuzhiyun
519*4882a593Smuzhiyun static const struct dm_i2c_ops tegra_i2c_ops = {
520*4882a593Smuzhiyun .xfer = tegra_i2c_xfer,
521*4882a593Smuzhiyun .probe_chip = tegra_i2c_probe_chip,
522*4882a593Smuzhiyun .set_bus_speed = tegra_i2c_set_bus_speed,
523*4882a593Smuzhiyun };
524*4882a593Smuzhiyun
525*4882a593Smuzhiyun static const struct udevice_id tegra_i2c_ids[] = {
526*4882a593Smuzhiyun { .compatible = "nvidia,tegra114-i2c", .data = TYPE_114 },
527*4882a593Smuzhiyun { .compatible = "nvidia,tegra20-i2c", .data = TYPE_STD },
528*4882a593Smuzhiyun { .compatible = "nvidia,tegra20-i2c-dvc", .data = TYPE_DVC },
529*4882a593Smuzhiyun { }
530*4882a593Smuzhiyun };
531*4882a593Smuzhiyun
532*4882a593Smuzhiyun U_BOOT_DRIVER(i2c_tegra) = {
533*4882a593Smuzhiyun .name = "i2c_tegra",
534*4882a593Smuzhiyun .id = UCLASS_I2C,
535*4882a593Smuzhiyun .of_match = tegra_i2c_ids,
536*4882a593Smuzhiyun .probe = tegra_i2c_probe,
537*4882a593Smuzhiyun .priv_auto_alloc_size = sizeof(struct i2c_bus),
538*4882a593Smuzhiyun .ops = &tegra_i2c_ops,
539*4882a593Smuzhiyun };
540