2 * Copyright 2013 Broadcom Corporation.
4 * SPDX-License-Identifier: GPL-2.0+
10 #include <asm/arch/sysmap.h>
11 #include <asm/kona-common/clk.h>
14 /* Hardware register offsets and field defintions */
15 #define CS_OFFSET 0x00000020
16 #define CS_ACK_SHIFT 3
17 #define CS_ACK_MASK 0x00000008
18 #define CS_ACK_CMD_GEN_START 0x00000000
19 #define CS_ACK_CMD_GEN_RESTART 0x00000001
20 #define CS_CMD_SHIFT 1
21 #define CS_CMD_CMD_NO_ACTION 0x00000000
22 #define CS_CMD_CMD_START_RESTART 0x00000001
23 #define CS_CMD_CMD_STOP 0x00000002
25 #define CS_EN_CMD_ENABLE_BSC 0x00000001
27 #define TIM_OFFSET 0x00000024
28 #define TIM_PRESCALE_SHIFT 6
30 #define TIM_NO_DIV_SHIFT 2
31 #define TIM_DIV_SHIFT 0
33 #define DAT_OFFSET 0x00000028
35 #define TOUT_OFFSET 0x0000002c
37 #define TXFCR_OFFSET 0x0000003c
38 #define TXFCR_FIFO_FLUSH_MASK 0x00000080
39 #define TXFCR_FIFO_EN_MASK 0x00000040
41 #define IER_OFFSET 0x00000044
42 #define IER_READ_COMPLETE_INT_MASK 0x00000010
43 #define IER_I2C_INT_EN_MASK 0x00000008
44 #define IER_FIFO_INT_EN_MASK 0x00000002
45 #define IER_NOACK_EN_MASK 0x00000001
47 #define ISR_OFFSET 0x00000048
48 #define ISR_RESERVED_MASK 0xffffff60
49 #define ISR_CMDBUSY_MASK 0x00000080
50 #define ISR_READ_COMPLETE_MASK 0x00000010
51 #define ISR_SES_DONE_MASK 0x00000008
52 #define ISR_ERR_MASK 0x00000004
53 #define ISR_TXFIFOEMPTY_MASK 0x00000002
54 #define ISR_NOACK_MASK 0x00000001
56 #define CLKEN_OFFSET 0x0000004c
57 #define CLKEN_AUTOSENSE_OFF_MASK 0x00000080
58 #define CLKEN_M_SHIFT 4
59 #define CLKEN_N_SHIFT 1
60 #define CLKEN_CLKEN_MASK 0x00000001
62 #define FIFO_STATUS_OFFSET 0x00000054
63 #define FIFO_STATUS_RXFIFO_EMPTY_MASK 0x00000004
64 #define FIFO_STATUS_TXFIFO_EMPTY_MASK 0x00000010
66 #define HSTIM_OFFSET 0x00000058
67 #define HSTIM_HS_MODE_MASK 0x00008000
68 #define HSTIM_HS_HOLD_SHIFT 10
69 #define HSTIM_HS_HIGH_PHASE_SHIFT 5
70 #define HSTIM_HS_SETUP_SHIFT 0
72 #define PADCTL_OFFSET 0x0000005c
73 #define PADCTL_PAD_OUT_EN_MASK 0x00000004
75 #define RXFCR_OFFSET 0x00000068
76 #define RXFCR_NACK_EN_SHIFT 7
77 #define RXFCR_READ_COUNT_SHIFT 0
78 #define RXFIFORDOUT_OFFSET 0x0000006c
80 /* Locally used constants */
81 #define MAX_RX_FIFO_SIZE 64U /* bytes */
82 #define MAX_TX_FIFO_SIZE 64U /* bytes */
84 #define I2C_TIMEOUT 100000 /* usecs */
86 #define WAIT_INT_CHK 100 /* usecs */
87 #if I2C_TIMEOUT % WAIT_INT_CHK
88 #error I2C_TIMEOUT must be a multiple of WAIT_INT_CHK
91 /* Operations that can be commanded to the controller */
99 enum bus_speed_index
{
105 /* Internal divider settings for standard mode, fast mode and fast mode plus */
106 struct bus_speed_cfg
{
107 uint8_t time_m
; /* Number of cycles for setup time */
108 uint8_t time_n
; /* Number of cycles for hold time */
109 uint8_t prescale
; /* Prescale divider */
110 uint8_t time_p
; /* Timing coefficient */
111 uint8_t no_div
; /* Disable clock divider */
112 uint8_t time_div
; /* Post-prescale divider */
115 static const struct bus_speed_cfg std_cfg_table
[] = {
116 [BCM_SPD_100K
] = {0x01, 0x01, 0x03, 0x06, 0x00, 0x02},
117 [BCM_SPD_400K
] = {0x05, 0x01, 0x03, 0x05, 0x01, 0x02},
118 [BCM_SPD_1MHZ
] = {0x01, 0x01, 0x03, 0x01, 0x01, 0x03},
121 struct bcm_kona_i2c_dev
{
124 const struct bus_speed_cfg
*std_cfg
;
127 /* Keep these two defines in sync */
128 #define DEF_SPD 100000
129 #define DEF_SPD_ENUM BCM_SPD_100K
131 #define DEF_DEVICE(num) \
132 {(void *)CONFIG_SYS_I2C_BASE##num, DEF_SPD, &std_cfg_table[DEF_SPD_ENUM]}
134 static struct bcm_kona_i2c_dev g_i2c_devs
[CONFIG_SYS_MAX_I2C_BUS
] = {
135 #ifdef CONFIG_SYS_I2C_BASE0
138 #ifdef CONFIG_SYS_I2C_BASE1
141 #ifdef CONFIG_SYS_I2C_BASE2
144 #ifdef CONFIG_SYS_I2C_BASE3
147 #ifdef CONFIG_SYS_I2C_BASE4
150 #ifdef CONFIG_SYS_I2C_BASE5
155 #define I2C_M_TEN 0x0010 /* ten bit address */
156 #define I2C_M_RD 0x0001 /* read data */
157 #define I2C_M_NOSTART 0x4000 /* no restart between msgs */
166 static void bcm_kona_i2c_send_cmd_to_ctrl(struct bcm_kona_i2c_dev
*dev
,
167 enum bcm_kona_cmd_t cmd
)
169 debug("%s, %d\n", __func__
, cmd
);
172 case BCM_CMD_NOACTION
:
173 writel((CS_CMD_CMD_NO_ACTION
<< CS_CMD_SHIFT
) |
174 (CS_EN_CMD_ENABLE_BSC
<< CS_EN_SHIFT
),
175 dev
->base
+ CS_OFFSET
);
179 writel((CS_ACK_CMD_GEN_START
<< CS_ACK_SHIFT
) |
180 (CS_CMD_CMD_START_RESTART
<< CS_CMD_SHIFT
) |
181 (CS_EN_CMD_ENABLE_BSC
<< CS_EN_SHIFT
),
182 dev
->base
+ CS_OFFSET
);
185 case BCM_CMD_RESTART
:
186 writel((CS_ACK_CMD_GEN_RESTART
<< CS_ACK_SHIFT
) |
187 (CS_CMD_CMD_START_RESTART
<< CS_CMD_SHIFT
) |
188 (CS_EN_CMD_ENABLE_BSC
<< CS_EN_SHIFT
),
189 dev
->base
+ CS_OFFSET
);
193 writel((CS_CMD_CMD_STOP
<< CS_CMD_SHIFT
) |
194 (CS_EN_CMD_ENABLE_BSC
<< CS_EN_SHIFT
),
195 dev
->base
+ CS_OFFSET
);
199 printf("Unknown command %d\n", cmd
);
203 static void bcm_kona_i2c_enable_clock(struct bcm_kona_i2c_dev
*dev
)
205 writel(readl(dev
->base
+ CLKEN_OFFSET
) | CLKEN_CLKEN_MASK
,
206 dev
->base
+ CLKEN_OFFSET
);
209 static void bcm_kona_i2c_disable_clock(struct bcm_kona_i2c_dev
*dev
)
211 writel(readl(dev
->base
+ CLKEN_OFFSET
) & ~CLKEN_CLKEN_MASK
,
212 dev
->base
+ CLKEN_OFFSET
);
215 /* Wait until at least one of the mask bit(s) are set */
216 static unsigned long wait_for_int_timeout(struct bcm_kona_i2c_dev
*dev
,
217 unsigned long time_left
,
223 status
= readl(dev
->base
+ ISR_OFFSET
);
225 if ((status
& ~ISR_RESERVED_MASK
) == 0) {
226 debug("Bogus I2C interrupt 0x%x\n", status
);
230 /* Must flush the TX FIFO when NAK detected */
231 if (status
& ISR_NOACK_MASK
)
232 writel(TXFCR_FIFO_FLUSH_MASK
| TXFCR_FIFO_EN_MASK
,
233 dev
->base
+ TXFCR_OFFSET
);
235 writel(status
& ~ISR_RESERVED_MASK
, dev
->base
+ ISR_OFFSET
);
238 /* We are done since one of the mask bits are set */
241 udelay(WAIT_INT_CHK
);
242 time_left
-= WAIT_INT_CHK
;
247 /* Send command to I2C bus */
248 static int bcm_kona_send_i2c_cmd(struct bcm_kona_i2c_dev
*dev
,
249 enum bcm_kona_cmd_t cmd
)
252 unsigned long time_left
= I2C_TIMEOUT
;
254 /* Send the command */
255 bcm_kona_i2c_send_cmd_to_ctrl(dev
, cmd
);
257 /* Wait for transaction to finish or timeout */
258 time_left
= wait_for_int_timeout(dev
, time_left
, IER_I2C_INT_EN_MASK
);
261 printf("controller timed out\n");
266 bcm_kona_i2c_send_cmd_to_ctrl(dev
, BCM_CMD_NOACTION
);
271 /* Read a single RX FIFO worth of data from the i2c bus */
272 static int bcm_kona_i2c_read_fifo_single(struct bcm_kona_i2c_dev
*dev
,
273 uint8_t *buf
, unsigned int len
,
274 unsigned int last_byte_nak
)
276 unsigned long time_left
= I2C_TIMEOUT
;
278 /* Start the RX FIFO */
279 writel((last_byte_nak
<< RXFCR_NACK_EN_SHIFT
) |
280 (len
<< RXFCR_READ_COUNT_SHIFT
), dev
->base
+ RXFCR_OFFSET
);
282 /* Wait for FIFO read to complete */
284 wait_for_int_timeout(dev
, time_left
, IER_READ_COMPLETE_INT_MASK
);
287 printf("RX FIFO time out\n");
291 /* Read data from FIFO */
292 for (; len
> 0; len
--, buf
++)
293 *buf
= readl(dev
->base
+ RXFIFORDOUT_OFFSET
);
298 /* Read any amount of data using the RX FIFO from the i2c bus */
299 static int bcm_kona_i2c_read_fifo(struct bcm_kona_i2c_dev
*dev
,
302 unsigned int bytes_to_read
= MAX_RX_FIFO_SIZE
;
303 unsigned int last_byte_nak
= 0;
304 unsigned int bytes_read
= 0;
307 uint8_t *tmp_buf
= msg
->buf
;
309 while (bytes_read
< msg
->len
) {
310 if (msg
->len
- bytes_read
<= MAX_RX_FIFO_SIZE
) {
311 last_byte_nak
= 1; /* NAK last byte of transfer */
312 bytes_to_read
= msg
->len
- bytes_read
;
315 rc
= bcm_kona_i2c_read_fifo_single(dev
, tmp_buf
, bytes_to_read
,
320 bytes_read
+= bytes_to_read
;
321 tmp_buf
+= bytes_to_read
;
327 /* Write a single byte of data to the i2c bus */
328 static int bcm_kona_i2c_write_byte(struct bcm_kona_i2c_dev
*dev
, uint8_t data
,
329 unsigned int nak_expected
)
331 unsigned long time_left
= I2C_TIMEOUT
;
332 unsigned int nak_received
;
334 /* Clear pending session done interrupt */
335 writel(ISR_SES_DONE_MASK
, dev
->base
+ ISR_OFFSET
);
337 /* Send one byte of data */
338 writel(data
, dev
->base
+ DAT_OFFSET
);
340 time_left
= wait_for_int_timeout(dev
, time_left
, IER_I2C_INT_EN_MASK
);
343 debug("controller timed out\n");
347 nak_received
= readl(dev
->base
+ CS_OFFSET
) & CS_ACK_MASK
? 1 : 0;
349 if (nak_received
^ nak_expected
) {
350 debug("unexpected NAK/ACK\n");
357 /* Write a single TX FIFO worth of data to the i2c bus */
358 static int bcm_kona_i2c_write_fifo_single(struct bcm_kona_i2c_dev
*dev
,
359 uint8_t *buf
, unsigned int len
)
362 unsigned long time_left
= I2C_TIMEOUT
;
363 unsigned int fifo_status
;
365 /* Write data into FIFO */
366 for (k
= 0; k
< len
; k
++)
367 writel(buf
[k
], (dev
->base
+ DAT_OFFSET
));
369 /* Wait for FIFO to empty */
372 wait_for_int_timeout(dev
, time_left
,
373 (IER_FIFO_INT_EN_MASK
|
375 fifo_status
= readl(dev
->base
+ FIFO_STATUS_OFFSET
);
376 } while (time_left
&& !(fifo_status
& FIFO_STATUS_TXFIFO_EMPTY_MASK
));
378 /* Check if there was a NAK */
379 if (readl(dev
->base
+ CS_OFFSET
) & CS_ACK_MASK
) {
380 printf("unexpected NAK\n");
384 /* Check if a timeout occured */
386 printf("completion timed out\n");
393 /* Write any amount of data using TX FIFO to the i2c bus */
394 static int bcm_kona_i2c_write_fifo(struct bcm_kona_i2c_dev
*dev
,
397 unsigned int bytes_to_write
= MAX_TX_FIFO_SIZE
;
398 unsigned int bytes_written
= 0;
401 uint8_t *tmp_buf
= msg
->buf
;
403 while (bytes_written
< msg
->len
) {
404 if (msg
->len
- bytes_written
<= MAX_TX_FIFO_SIZE
)
405 bytes_to_write
= msg
->len
- bytes_written
;
407 rc
= bcm_kona_i2c_write_fifo_single(dev
, tmp_buf
,
412 bytes_written
+= bytes_to_write
;
413 tmp_buf
+= bytes_to_write
;
419 /* Send i2c address */
420 static int bcm_kona_i2c_do_addr(struct bcm_kona_i2c_dev
*dev
,
425 if (msg
->flags
& I2C_M_TEN
) {
426 /* First byte is 11110XX0 where XX is upper 2 bits */
427 addr
= 0xf0 | ((msg
->addr
& 0x300) >> 7);
428 if (bcm_kona_i2c_write_byte(dev
, addr
, 0) < 0)
431 /* Second byte is the remaining 8 bits */
432 addr
= msg
->addr
& 0xff;
433 if (bcm_kona_i2c_write_byte(dev
, addr
, 0) < 0)
436 if (msg
->flags
& I2C_M_RD
) {
437 /* For read, send restart command */
438 if (bcm_kona_send_i2c_cmd(dev
, BCM_CMD_RESTART
) < 0)
441 /* Then re-send the first byte with the read bit set */
442 addr
= 0xf0 | ((msg
->addr
& 0x300) >> 7) | 0x01;
443 if (bcm_kona_i2c_write_byte(dev
, addr
, 0) < 0)
447 addr
= msg
->addr
<< 1;
449 if (msg
->flags
& I2C_M_RD
)
452 if (bcm_kona_i2c_write_byte(dev
, addr
, 0) < 0)
459 static void bcm_kona_i2c_enable_autosense(struct bcm_kona_i2c_dev
*dev
)
461 writel(readl(dev
->base
+ CLKEN_OFFSET
) & ~CLKEN_AUTOSENSE_OFF_MASK
,
462 dev
->base
+ CLKEN_OFFSET
);
465 static void bcm_kona_i2c_config_timing(struct bcm_kona_i2c_dev
*dev
)
467 writel(readl(dev
->base
+ HSTIM_OFFSET
) & ~HSTIM_HS_MODE_MASK
,
468 dev
->base
+ HSTIM_OFFSET
);
470 writel((dev
->std_cfg
->prescale
<< TIM_PRESCALE_SHIFT
) |
471 (dev
->std_cfg
->time_p
<< TIM_P_SHIFT
) |
472 (dev
->std_cfg
->no_div
<< TIM_NO_DIV_SHIFT
) |
473 (dev
->std_cfg
->time_div
<< TIM_DIV_SHIFT
),
474 dev
->base
+ TIM_OFFSET
);
476 writel((dev
->std_cfg
->time_m
<< CLKEN_M_SHIFT
) |
477 (dev
->std_cfg
->time_n
<< CLKEN_N_SHIFT
) |
478 CLKEN_CLKEN_MASK
, dev
->base
+ CLKEN_OFFSET
);
481 /* Master transfer function */
482 static int bcm_kona_i2c_xfer(struct bcm_kona_i2c_dev
*dev
,
483 struct i2c_msg msgs
[], int num
)
485 struct i2c_msg
*pmsg
;
489 /* Enable pad output */
490 writel(0, dev
->base
+ PADCTL_OFFSET
);
492 /* Enable internal clocks */
493 bcm_kona_i2c_enable_clock(dev
);
495 /* Send start command */
496 rc
= bcm_kona_send_i2c_cmd(dev
, BCM_CMD_START
);
498 printf("Start command failed rc = %d\n", rc
);
499 goto xfer_disable_pad
;
502 /* Loop through all messages */
503 for (i
= 0; i
< num
; i
++) {
506 /* Send restart for subsequent messages */
507 if ((i
!= 0) && ((pmsg
->flags
& I2C_M_NOSTART
) == 0)) {
508 rc
= bcm_kona_send_i2c_cmd(dev
, BCM_CMD_RESTART
);
510 printf("restart cmd failed rc = %d\n", rc
);
515 /* Send slave address */
516 if (!(pmsg
->flags
& I2C_M_NOSTART
)) {
517 rc
= bcm_kona_i2c_do_addr(dev
, pmsg
);
519 debug("NAK from addr %2.2x msg#%d rc = %d\n",
525 /* Perform data transfer */
526 if (pmsg
->flags
& I2C_M_RD
) {
527 rc
= bcm_kona_i2c_read_fifo(dev
, pmsg
);
529 printf("read failure\n");
533 rc
= bcm_kona_i2c_write_fifo(dev
, pmsg
);
535 printf("write failure");
544 /* Send a STOP command */
545 bcm_kona_send_i2c_cmd(dev
, BCM_CMD_STOP
);
548 /* Disable pad output */
549 writel(PADCTL_PAD_OUT_EN_MASK
, dev
->base
+ PADCTL_OFFSET
);
551 /* Stop internal clock */
552 bcm_kona_i2c_disable_clock(dev
);
557 static uint
bcm_kona_i2c_assign_bus_speed(struct bcm_kona_i2c_dev
*dev
,
562 dev
->std_cfg
= &std_cfg_table
[BCM_SPD_100K
];
565 dev
->std_cfg
= &std_cfg_table
[BCM_SPD_400K
];
568 dev
->std_cfg
= &std_cfg_table
[BCM_SPD_1MHZ
];
571 printf("%d hz bus speed not supported\n", speed
);
578 static void bcm_kona_i2c_init(struct bcm_kona_i2c_dev
*dev
)
580 /* Parse bus speed */
581 bcm_kona_i2c_assign_bus_speed(dev
, dev
->speed
);
583 /* Enable internal clocks */
584 bcm_kona_i2c_enable_clock(dev
);
586 /* Configure internal dividers */
587 bcm_kona_i2c_config_timing(dev
);
589 /* Disable timeout */
590 writel(0, dev
->base
+ TOUT_OFFSET
);
592 /* Enable autosense */
593 bcm_kona_i2c_enable_autosense(dev
);
596 writel(TXFCR_FIFO_FLUSH_MASK
| TXFCR_FIFO_EN_MASK
,
597 dev
->base
+ TXFCR_OFFSET
);
599 /* Mask all interrupts */
600 writel(0, dev
->base
+ IER_OFFSET
);
602 /* Clear all pending interrupts */
603 writel(ISR_CMDBUSY_MASK
|
604 ISR_READ_COMPLETE_MASK
|
607 ISR_TXFIFOEMPTY_MASK
| ISR_NOACK_MASK
, dev
->base
+ ISR_OFFSET
);
609 /* Enable the controller but leave it idle */
610 bcm_kona_i2c_send_cmd_to_ctrl(dev
, BCM_CMD_NOACTION
);
612 /* Disable pad output */
613 writel(PADCTL_PAD_OUT_EN_MASK
, dev
->base
+ PADCTL_OFFSET
);
619 struct bcm_kona_i2c_dev
*kona_get_dev(struct i2c_adapter
*adap
)
621 return &g_i2c_devs
[adap
->hwadapnr
];
624 static void kona_i2c_init(struct i2c_adapter
*adap
, int speed
, int slaveaddr
)
626 struct bcm_kona_i2c_dev
*dev
= kona_get_dev(adap
);
628 if (clk_bsc_enable(dev
->base
))
631 bcm_kona_i2c_init(dev
);
634 static int kona_i2c_read(struct i2c_adapter
*adap
, uchar chip
, uint addr
,
635 int alen
, uchar
*buffer
, int len
)
637 /* msg[0] writes the addr, msg[1] reads the data */
638 struct i2c_msg msg
[2];
639 unsigned char msgbuf0
[64];
640 struct bcm_kona_i2c_dev
*dev
= kona_get_dev(adap
);
645 msg
[0].buf
= msgbuf0
; /* msgbuf0 contains incrementing reg addr */
648 msg
[1].flags
= I2C_M_RD
;
649 /* msg[1].buf dest ptr increments each read */
651 msgbuf0
[0] = (unsigned char)addr
;
654 if (bcm_kona_i2c_xfer(dev
, msg
, 2) < 0) {
655 /* Sending 2 i2c messages */
656 kona_i2c_init(adap
, adap
->speed
, adap
->slaveaddr
);
657 debug("I2C read: I/O error\n");
663 static int kona_i2c_write(struct i2c_adapter
*adap
, uchar chip
, uint addr
,
664 int alen
, uchar
*buffer
, int len
)
666 struct i2c_msg msg
[0];
667 unsigned char msgbuf0
[64];
669 struct bcm_kona_i2c_dev
*dev
= kona_get_dev(adap
);
673 msg
[0].len
= 2; /* addr byte plus data */
674 msg
[0].buf
= msgbuf0
;
676 for (i
= 0; i
< len
; i
++) {
678 msgbuf0
[1] = buffer
[i
];
679 if (bcm_kona_i2c_xfer(dev
, msg
, 1) < 0) {
680 kona_i2c_init(adap
, adap
->speed
, adap
->slaveaddr
);
681 debug("I2C write: I/O error\n");
688 static int kona_i2c_probe(struct i2c_adapter
*adap
, uchar chip
)
693 * read addr 0x0 of the given chip.
695 return kona_i2c_read(adap
, chip
, 0x0, 1, &tmp
, 1);
698 static uint
kona_i2c_set_bus_speed(struct i2c_adapter
*adap
, uint speed
)
700 struct bcm_kona_i2c_dev
*dev
= kona_get_dev(adap
);
701 return bcm_kona_i2c_assign_bus_speed(dev
, speed
);
705 * Register kona i2c adapters. Keep the order below so
706 * that the bus number matches the adapter number.
708 #define DEF_ADAPTER(num) \
709 U_BOOT_I2C_ADAP_COMPLETE(kona##num, kona_i2c_init, kona_i2c_probe, \
710 kona_i2c_read, kona_i2c_write, \
711 kona_i2c_set_bus_speed, DEF_SPD, 0x00, num)
713 #ifdef CONFIG_SYS_I2C_BASE0
716 #ifdef CONFIG_SYS_I2C_BASE1
719 #ifdef CONFIG_SYS_I2C_BASE2
722 #ifdef CONFIG_SYS_I2C_BASE3
725 #ifdef CONFIG_SYS_I2C_BASE4
728 #ifdef CONFIG_SYS_I2C_BASE5