1*83d290c5STom Rini // SPDX-License-Identifier: GPL-2.0+
24bded3a3SDarwin Rambo /*
34bded3a3SDarwin Rambo * Copyright 2013 Broadcom Corporation.
44bded3a3SDarwin Rambo *
528527096SSimon Glass * NOTE: This driver should be converted to driver model before June 2017.
628527096SSimon Glass * Please see doc/driver-model/i2c-howto.txt for instructions.
74bded3a3SDarwin Rambo */
84bded3a3SDarwin Rambo
94bded3a3SDarwin Rambo #include <common.h>
104bded3a3SDarwin Rambo #include <asm/io.h>
111221ce45SMasahiro Yamada #include <linux/errno.h>
124bded3a3SDarwin Rambo #include <asm/arch/sysmap.h>
134bded3a3SDarwin Rambo #include <asm/kona-common/clk.h>
144bded3a3SDarwin Rambo #include <i2c.h>
154bded3a3SDarwin Rambo
164bded3a3SDarwin Rambo /* Hardware register offsets and field defintions */
174bded3a3SDarwin Rambo #define CS_OFFSET 0x00000020
184bded3a3SDarwin Rambo #define CS_ACK_SHIFT 3
194bded3a3SDarwin Rambo #define CS_ACK_MASK 0x00000008
204bded3a3SDarwin Rambo #define CS_ACK_CMD_GEN_START 0x00000000
214bded3a3SDarwin Rambo #define CS_ACK_CMD_GEN_RESTART 0x00000001
224bded3a3SDarwin Rambo #define CS_CMD_SHIFT 1
234bded3a3SDarwin Rambo #define CS_CMD_CMD_NO_ACTION 0x00000000
244bded3a3SDarwin Rambo #define CS_CMD_CMD_START_RESTART 0x00000001
254bded3a3SDarwin Rambo #define CS_CMD_CMD_STOP 0x00000002
264bded3a3SDarwin Rambo #define CS_EN_SHIFT 0
274bded3a3SDarwin Rambo #define CS_EN_CMD_ENABLE_BSC 0x00000001
284bded3a3SDarwin Rambo
294bded3a3SDarwin Rambo #define TIM_OFFSET 0x00000024
304bded3a3SDarwin Rambo #define TIM_PRESCALE_SHIFT 6
314bded3a3SDarwin Rambo #define TIM_P_SHIFT 3
324bded3a3SDarwin Rambo #define TIM_NO_DIV_SHIFT 2
334bded3a3SDarwin Rambo #define TIM_DIV_SHIFT 0
344bded3a3SDarwin Rambo
354bded3a3SDarwin Rambo #define DAT_OFFSET 0x00000028
364bded3a3SDarwin Rambo
374bded3a3SDarwin Rambo #define TOUT_OFFSET 0x0000002c
384bded3a3SDarwin Rambo
394bded3a3SDarwin Rambo #define TXFCR_OFFSET 0x0000003c
404bded3a3SDarwin Rambo #define TXFCR_FIFO_FLUSH_MASK 0x00000080
414bded3a3SDarwin Rambo #define TXFCR_FIFO_EN_MASK 0x00000040
424bded3a3SDarwin Rambo
434bded3a3SDarwin Rambo #define IER_OFFSET 0x00000044
444bded3a3SDarwin Rambo #define IER_READ_COMPLETE_INT_MASK 0x00000010
454bded3a3SDarwin Rambo #define IER_I2C_INT_EN_MASK 0x00000008
464bded3a3SDarwin Rambo #define IER_FIFO_INT_EN_MASK 0x00000002
474bded3a3SDarwin Rambo #define IER_NOACK_EN_MASK 0x00000001
484bded3a3SDarwin Rambo
494bded3a3SDarwin Rambo #define ISR_OFFSET 0x00000048
504bded3a3SDarwin Rambo #define ISR_RESERVED_MASK 0xffffff60
514bded3a3SDarwin Rambo #define ISR_CMDBUSY_MASK 0x00000080
524bded3a3SDarwin Rambo #define ISR_READ_COMPLETE_MASK 0x00000010
534bded3a3SDarwin Rambo #define ISR_SES_DONE_MASK 0x00000008
544bded3a3SDarwin Rambo #define ISR_ERR_MASK 0x00000004
554bded3a3SDarwin Rambo #define ISR_TXFIFOEMPTY_MASK 0x00000002
564bded3a3SDarwin Rambo #define ISR_NOACK_MASK 0x00000001
574bded3a3SDarwin Rambo
584bded3a3SDarwin Rambo #define CLKEN_OFFSET 0x0000004c
594bded3a3SDarwin Rambo #define CLKEN_AUTOSENSE_OFF_MASK 0x00000080
604bded3a3SDarwin Rambo #define CLKEN_M_SHIFT 4
614bded3a3SDarwin Rambo #define CLKEN_N_SHIFT 1
624bded3a3SDarwin Rambo #define CLKEN_CLKEN_MASK 0x00000001
634bded3a3SDarwin Rambo
644bded3a3SDarwin Rambo #define FIFO_STATUS_OFFSET 0x00000054
654bded3a3SDarwin Rambo #define FIFO_STATUS_RXFIFO_EMPTY_MASK 0x00000004
664bded3a3SDarwin Rambo #define FIFO_STATUS_TXFIFO_EMPTY_MASK 0x00000010
674bded3a3SDarwin Rambo
684bded3a3SDarwin Rambo #define HSTIM_OFFSET 0x00000058
694bded3a3SDarwin Rambo #define HSTIM_HS_MODE_MASK 0x00008000
704bded3a3SDarwin Rambo #define HSTIM_HS_HOLD_SHIFT 10
714bded3a3SDarwin Rambo #define HSTIM_HS_HIGH_PHASE_SHIFT 5
724bded3a3SDarwin Rambo #define HSTIM_HS_SETUP_SHIFT 0
734bded3a3SDarwin Rambo
744bded3a3SDarwin Rambo #define PADCTL_OFFSET 0x0000005c
754bded3a3SDarwin Rambo #define PADCTL_PAD_OUT_EN_MASK 0x00000004
764bded3a3SDarwin Rambo
774bded3a3SDarwin Rambo #define RXFCR_OFFSET 0x00000068
784bded3a3SDarwin Rambo #define RXFCR_NACK_EN_SHIFT 7
794bded3a3SDarwin Rambo #define RXFCR_READ_COUNT_SHIFT 0
804bded3a3SDarwin Rambo #define RXFIFORDOUT_OFFSET 0x0000006c
814bded3a3SDarwin Rambo
824bded3a3SDarwin Rambo /* Locally used constants */
834bded3a3SDarwin Rambo #define MAX_RX_FIFO_SIZE 64U /* bytes */
844bded3a3SDarwin Rambo #define MAX_TX_FIFO_SIZE 64U /* bytes */
854bded3a3SDarwin Rambo
864bded3a3SDarwin Rambo #define I2C_TIMEOUT 100000 /* usecs */
874bded3a3SDarwin Rambo
884bded3a3SDarwin Rambo #define WAIT_INT_CHK 100 /* usecs */
894bded3a3SDarwin Rambo #if I2C_TIMEOUT % WAIT_INT_CHK
904bded3a3SDarwin Rambo #error I2C_TIMEOUT must be a multiple of WAIT_INT_CHK
914bded3a3SDarwin Rambo #endif
924bded3a3SDarwin Rambo
934bded3a3SDarwin Rambo /* Operations that can be commanded to the controller */
944bded3a3SDarwin Rambo enum bcm_kona_cmd_t {
954bded3a3SDarwin Rambo BCM_CMD_NOACTION = 0,
964bded3a3SDarwin Rambo BCM_CMD_START,
974bded3a3SDarwin Rambo BCM_CMD_RESTART,
984bded3a3SDarwin Rambo BCM_CMD_STOP,
994bded3a3SDarwin Rambo };
1004bded3a3SDarwin Rambo
1014bded3a3SDarwin Rambo enum bus_speed_index {
1024bded3a3SDarwin Rambo BCM_SPD_100K = 0,
1034bded3a3SDarwin Rambo BCM_SPD_400K,
1044bded3a3SDarwin Rambo BCM_SPD_1MHZ,
1054bded3a3SDarwin Rambo };
1064bded3a3SDarwin Rambo
1074bded3a3SDarwin Rambo /* Internal divider settings for standard mode, fast mode and fast mode plus */
1084bded3a3SDarwin Rambo struct bus_speed_cfg {
1094bded3a3SDarwin Rambo uint8_t time_m; /* Number of cycles for setup time */
1104bded3a3SDarwin Rambo uint8_t time_n; /* Number of cycles for hold time */
1114bded3a3SDarwin Rambo uint8_t prescale; /* Prescale divider */
1124bded3a3SDarwin Rambo uint8_t time_p; /* Timing coefficient */
1134bded3a3SDarwin Rambo uint8_t no_div; /* Disable clock divider */
1144bded3a3SDarwin Rambo uint8_t time_div; /* Post-prescale divider */
1154bded3a3SDarwin Rambo };
1164bded3a3SDarwin Rambo
1174bded3a3SDarwin Rambo static const struct bus_speed_cfg std_cfg_table[] = {
1184bded3a3SDarwin Rambo [BCM_SPD_100K] = {0x01, 0x01, 0x03, 0x06, 0x00, 0x02},
1194bded3a3SDarwin Rambo [BCM_SPD_400K] = {0x05, 0x01, 0x03, 0x05, 0x01, 0x02},
1204bded3a3SDarwin Rambo [BCM_SPD_1MHZ] = {0x01, 0x01, 0x03, 0x01, 0x01, 0x03},
1214bded3a3SDarwin Rambo };
1224bded3a3SDarwin Rambo
1234bded3a3SDarwin Rambo struct bcm_kona_i2c_dev {
1244bded3a3SDarwin Rambo void *base;
1254bded3a3SDarwin Rambo uint speed;
1264bded3a3SDarwin Rambo const struct bus_speed_cfg *std_cfg;
1274bded3a3SDarwin Rambo };
1284bded3a3SDarwin Rambo
1294bded3a3SDarwin Rambo /* Keep these two defines in sync */
1304bded3a3SDarwin Rambo #define DEF_SPD 100000
1314bded3a3SDarwin Rambo #define DEF_SPD_ENUM BCM_SPD_100K
1324bded3a3SDarwin Rambo
1334bded3a3SDarwin Rambo #define DEF_DEVICE(num) \
1344bded3a3SDarwin Rambo {(void *)CONFIG_SYS_I2C_BASE##num, DEF_SPD, &std_cfg_table[DEF_SPD_ENUM]}
1354bded3a3SDarwin Rambo
1364bded3a3SDarwin Rambo static struct bcm_kona_i2c_dev g_i2c_devs[CONFIG_SYS_MAX_I2C_BUS] = {
1374bded3a3SDarwin Rambo #ifdef CONFIG_SYS_I2C_BASE0
1384bded3a3SDarwin Rambo DEF_DEVICE(0),
1394bded3a3SDarwin Rambo #endif
1404bded3a3SDarwin Rambo #ifdef CONFIG_SYS_I2C_BASE1
1414bded3a3SDarwin Rambo DEF_DEVICE(1),
1424bded3a3SDarwin Rambo #endif
1434bded3a3SDarwin Rambo #ifdef CONFIG_SYS_I2C_BASE2
1444bded3a3SDarwin Rambo DEF_DEVICE(2),
1454bded3a3SDarwin Rambo #endif
1464bded3a3SDarwin Rambo #ifdef CONFIG_SYS_I2C_BASE3
1474bded3a3SDarwin Rambo DEF_DEVICE(3),
1484bded3a3SDarwin Rambo #endif
1494bded3a3SDarwin Rambo #ifdef CONFIG_SYS_I2C_BASE4
1504bded3a3SDarwin Rambo DEF_DEVICE(4),
1514bded3a3SDarwin Rambo #endif
1524bded3a3SDarwin Rambo #ifdef CONFIG_SYS_I2C_BASE5
1534bded3a3SDarwin Rambo DEF_DEVICE(5),
1544bded3a3SDarwin Rambo #endif
1554bded3a3SDarwin Rambo };
1564bded3a3SDarwin Rambo
1574bded3a3SDarwin Rambo #define I2C_M_TEN 0x0010 /* ten bit address */
1584bded3a3SDarwin Rambo #define I2C_M_RD 0x0001 /* read data */
1594bded3a3SDarwin Rambo #define I2C_M_NOSTART 0x4000 /* no restart between msgs */
1604bded3a3SDarwin Rambo
161fffff726SSimon Glass struct kona_i2c_msg {
1624bded3a3SDarwin Rambo uint16_t addr;
1634bded3a3SDarwin Rambo uint16_t flags;
1644bded3a3SDarwin Rambo uint16_t len;
1654bded3a3SDarwin Rambo uint8_t *buf;
1664bded3a3SDarwin Rambo };
1674bded3a3SDarwin Rambo
bcm_kona_i2c_send_cmd_to_ctrl(struct bcm_kona_i2c_dev * dev,enum bcm_kona_cmd_t cmd)1684bded3a3SDarwin Rambo static void bcm_kona_i2c_send_cmd_to_ctrl(struct bcm_kona_i2c_dev *dev,
1694bded3a3SDarwin Rambo enum bcm_kona_cmd_t cmd)
1704bded3a3SDarwin Rambo {
1714bded3a3SDarwin Rambo debug("%s, %d\n", __func__, cmd);
1724bded3a3SDarwin Rambo
1734bded3a3SDarwin Rambo switch (cmd) {
1744bded3a3SDarwin Rambo case BCM_CMD_NOACTION:
1754bded3a3SDarwin Rambo writel((CS_CMD_CMD_NO_ACTION << CS_CMD_SHIFT) |
1764bded3a3SDarwin Rambo (CS_EN_CMD_ENABLE_BSC << CS_EN_SHIFT),
1774bded3a3SDarwin Rambo dev->base + CS_OFFSET);
1784bded3a3SDarwin Rambo break;
1794bded3a3SDarwin Rambo
1804bded3a3SDarwin Rambo case BCM_CMD_START:
1814bded3a3SDarwin Rambo writel((CS_ACK_CMD_GEN_START << CS_ACK_SHIFT) |
1824bded3a3SDarwin Rambo (CS_CMD_CMD_START_RESTART << CS_CMD_SHIFT) |
1834bded3a3SDarwin Rambo (CS_EN_CMD_ENABLE_BSC << CS_EN_SHIFT),
1844bded3a3SDarwin Rambo dev->base + CS_OFFSET);
1854bded3a3SDarwin Rambo break;
1864bded3a3SDarwin Rambo
1874bded3a3SDarwin Rambo case BCM_CMD_RESTART:
1884bded3a3SDarwin Rambo writel((CS_ACK_CMD_GEN_RESTART << CS_ACK_SHIFT) |
1894bded3a3SDarwin Rambo (CS_CMD_CMD_START_RESTART << CS_CMD_SHIFT) |
1904bded3a3SDarwin Rambo (CS_EN_CMD_ENABLE_BSC << CS_EN_SHIFT),
1914bded3a3SDarwin Rambo dev->base + CS_OFFSET);
1924bded3a3SDarwin Rambo break;
1934bded3a3SDarwin Rambo
1944bded3a3SDarwin Rambo case BCM_CMD_STOP:
1954bded3a3SDarwin Rambo writel((CS_CMD_CMD_STOP << CS_CMD_SHIFT) |
1964bded3a3SDarwin Rambo (CS_EN_CMD_ENABLE_BSC << CS_EN_SHIFT),
1974bded3a3SDarwin Rambo dev->base + CS_OFFSET);
1984bded3a3SDarwin Rambo break;
1994bded3a3SDarwin Rambo
2004bded3a3SDarwin Rambo default:
2014bded3a3SDarwin Rambo printf("Unknown command %d\n", cmd);
2024bded3a3SDarwin Rambo }
2034bded3a3SDarwin Rambo }
2044bded3a3SDarwin Rambo
bcm_kona_i2c_enable_clock(struct bcm_kona_i2c_dev * dev)2054bded3a3SDarwin Rambo static void bcm_kona_i2c_enable_clock(struct bcm_kona_i2c_dev *dev)
2064bded3a3SDarwin Rambo {
2074bded3a3SDarwin Rambo writel(readl(dev->base + CLKEN_OFFSET) | CLKEN_CLKEN_MASK,
2084bded3a3SDarwin Rambo dev->base + CLKEN_OFFSET);
2094bded3a3SDarwin Rambo }
2104bded3a3SDarwin Rambo
bcm_kona_i2c_disable_clock(struct bcm_kona_i2c_dev * dev)2114bded3a3SDarwin Rambo static void bcm_kona_i2c_disable_clock(struct bcm_kona_i2c_dev *dev)
2124bded3a3SDarwin Rambo {
2134bded3a3SDarwin Rambo writel(readl(dev->base + CLKEN_OFFSET) & ~CLKEN_CLKEN_MASK,
2144bded3a3SDarwin Rambo dev->base + CLKEN_OFFSET);
2154bded3a3SDarwin Rambo }
2164bded3a3SDarwin Rambo
2174bded3a3SDarwin Rambo /* Wait until at least one of the mask bit(s) are set */
wait_for_int_timeout(struct bcm_kona_i2c_dev * dev,unsigned long time_left,uint32_t mask)2184bded3a3SDarwin Rambo static unsigned long wait_for_int_timeout(struct bcm_kona_i2c_dev *dev,
2194bded3a3SDarwin Rambo unsigned long time_left,
2204bded3a3SDarwin Rambo uint32_t mask)
2214bded3a3SDarwin Rambo {
2224bded3a3SDarwin Rambo uint32_t status;
2234bded3a3SDarwin Rambo
2244bded3a3SDarwin Rambo while (time_left) {
2254bded3a3SDarwin Rambo status = readl(dev->base + ISR_OFFSET);
2264bded3a3SDarwin Rambo
2274bded3a3SDarwin Rambo if ((status & ~ISR_RESERVED_MASK) == 0) {
2284bded3a3SDarwin Rambo debug("Bogus I2C interrupt 0x%x\n", status);
2294bded3a3SDarwin Rambo continue;
2304bded3a3SDarwin Rambo }
2314bded3a3SDarwin Rambo
2324bded3a3SDarwin Rambo /* Must flush the TX FIFO when NAK detected */
2334bded3a3SDarwin Rambo if (status & ISR_NOACK_MASK)
2344bded3a3SDarwin Rambo writel(TXFCR_FIFO_FLUSH_MASK | TXFCR_FIFO_EN_MASK,
2354bded3a3SDarwin Rambo dev->base + TXFCR_OFFSET);
2364bded3a3SDarwin Rambo
2374bded3a3SDarwin Rambo writel(status & ~ISR_RESERVED_MASK, dev->base + ISR_OFFSET);
2384bded3a3SDarwin Rambo
2394bded3a3SDarwin Rambo if (status & mask) {
2404bded3a3SDarwin Rambo /* We are done since one of the mask bits are set */
2414bded3a3SDarwin Rambo return time_left;
2424bded3a3SDarwin Rambo }
2434bded3a3SDarwin Rambo udelay(WAIT_INT_CHK);
2444bded3a3SDarwin Rambo time_left -= WAIT_INT_CHK;
2454bded3a3SDarwin Rambo }
2464bded3a3SDarwin Rambo return 0;
2474bded3a3SDarwin Rambo }
2484bded3a3SDarwin Rambo
2494bded3a3SDarwin Rambo /* Send command to I2C bus */
bcm_kona_send_i2c_cmd(struct bcm_kona_i2c_dev * dev,enum bcm_kona_cmd_t cmd)2504bded3a3SDarwin Rambo static int bcm_kona_send_i2c_cmd(struct bcm_kona_i2c_dev *dev,
2514bded3a3SDarwin Rambo enum bcm_kona_cmd_t cmd)
2524bded3a3SDarwin Rambo {
2534bded3a3SDarwin Rambo int rc = 0;
2544bded3a3SDarwin Rambo unsigned long time_left = I2C_TIMEOUT;
2554bded3a3SDarwin Rambo
2564bded3a3SDarwin Rambo /* Send the command */
2574bded3a3SDarwin Rambo bcm_kona_i2c_send_cmd_to_ctrl(dev, cmd);
2584bded3a3SDarwin Rambo
2594bded3a3SDarwin Rambo /* Wait for transaction to finish or timeout */
2604bded3a3SDarwin Rambo time_left = wait_for_int_timeout(dev, time_left, IER_I2C_INT_EN_MASK);
2614bded3a3SDarwin Rambo
2624bded3a3SDarwin Rambo if (!time_left) {
2634bded3a3SDarwin Rambo printf("controller timed out\n");
2644bded3a3SDarwin Rambo rc = -ETIMEDOUT;
2654bded3a3SDarwin Rambo }
2664bded3a3SDarwin Rambo
2674bded3a3SDarwin Rambo /* Clear command */
2684bded3a3SDarwin Rambo bcm_kona_i2c_send_cmd_to_ctrl(dev, BCM_CMD_NOACTION);
2694bded3a3SDarwin Rambo
2704bded3a3SDarwin Rambo return rc;
2714bded3a3SDarwin Rambo }
2724bded3a3SDarwin Rambo
2734bded3a3SDarwin Rambo /* Read a single RX FIFO worth of data from the i2c bus */
bcm_kona_i2c_read_fifo_single(struct bcm_kona_i2c_dev * dev,uint8_t * buf,unsigned int len,unsigned int last_byte_nak)2744bded3a3SDarwin Rambo static int bcm_kona_i2c_read_fifo_single(struct bcm_kona_i2c_dev *dev,
2754bded3a3SDarwin Rambo uint8_t *buf, unsigned int len,
2764bded3a3SDarwin Rambo unsigned int last_byte_nak)
2774bded3a3SDarwin Rambo {
2784bded3a3SDarwin Rambo unsigned long time_left = I2C_TIMEOUT;
2794bded3a3SDarwin Rambo
2804bded3a3SDarwin Rambo /* Start the RX FIFO */
2814bded3a3SDarwin Rambo writel((last_byte_nak << RXFCR_NACK_EN_SHIFT) |
2824bded3a3SDarwin Rambo (len << RXFCR_READ_COUNT_SHIFT), dev->base + RXFCR_OFFSET);
2834bded3a3SDarwin Rambo
2844bded3a3SDarwin Rambo /* Wait for FIFO read to complete */
2854bded3a3SDarwin Rambo time_left =
2864bded3a3SDarwin Rambo wait_for_int_timeout(dev, time_left, IER_READ_COMPLETE_INT_MASK);
2874bded3a3SDarwin Rambo
2884bded3a3SDarwin Rambo if (!time_left) {
2894bded3a3SDarwin Rambo printf("RX FIFO time out\n");
2904bded3a3SDarwin Rambo return -EREMOTEIO;
2914bded3a3SDarwin Rambo }
2924bded3a3SDarwin Rambo
2934bded3a3SDarwin Rambo /* Read data from FIFO */
2944bded3a3SDarwin Rambo for (; len > 0; len--, buf++)
2954bded3a3SDarwin Rambo *buf = readl(dev->base + RXFIFORDOUT_OFFSET);
2964bded3a3SDarwin Rambo
2974bded3a3SDarwin Rambo return 0;
2984bded3a3SDarwin Rambo }
2994bded3a3SDarwin Rambo
3004bded3a3SDarwin Rambo /* Read any amount of data using the RX FIFO from the i2c bus */
bcm_kona_i2c_read_fifo(struct bcm_kona_i2c_dev * dev,struct kona_i2c_msg * msg)3014bded3a3SDarwin Rambo static int bcm_kona_i2c_read_fifo(struct bcm_kona_i2c_dev *dev,
302fffff726SSimon Glass struct kona_i2c_msg *msg)
3034bded3a3SDarwin Rambo {
3044bded3a3SDarwin Rambo unsigned int bytes_to_read = MAX_RX_FIFO_SIZE;
3054bded3a3SDarwin Rambo unsigned int last_byte_nak = 0;
3064bded3a3SDarwin Rambo unsigned int bytes_read = 0;
3074bded3a3SDarwin Rambo int rc;
3084bded3a3SDarwin Rambo
3094bded3a3SDarwin Rambo uint8_t *tmp_buf = msg->buf;
3104bded3a3SDarwin Rambo
3114bded3a3SDarwin Rambo while (bytes_read < msg->len) {
3124bded3a3SDarwin Rambo if (msg->len - bytes_read <= MAX_RX_FIFO_SIZE) {
3134bded3a3SDarwin Rambo last_byte_nak = 1; /* NAK last byte of transfer */
3144bded3a3SDarwin Rambo bytes_to_read = msg->len - bytes_read;
3154bded3a3SDarwin Rambo }
3164bded3a3SDarwin Rambo
3174bded3a3SDarwin Rambo rc = bcm_kona_i2c_read_fifo_single(dev, tmp_buf, bytes_to_read,
3184bded3a3SDarwin Rambo last_byte_nak);
3194bded3a3SDarwin Rambo if (rc < 0)
3204bded3a3SDarwin Rambo return -EREMOTEIO;
3214bded3a3SDarwin Rambo
3224bded3a3SDarwin Rambo bytes_read += bytes_to_read;
3234bded3a3SDarwin Rambo tmp_buf += bytes_to_read;
3244bded3a3SDarwin Rambo }
3254bded3a3SDarwin Rambo
3264bded3a3SDarwin Rambo return 0;
3274bded3a3SDarwin Rambo }
3284bded3a3SDarwin Rambo
3294bded3a3SDarwin Rambo /* Write a single byte of data to the i2c bus */
bcm_kona_i2c_write_byte(struct bcm_kona_i2c_dev * dev,uint8_t data,unsigned int nak_expected)3304bded3a3SDarwin Rambo static int bcm_kona_i2c_write_byte(struct bcm_kona_i2c_dev *dev, uint8_t data,
3314bded3a3SDarwin Rambo unsigned int nak_expected)
3324bded3a3SDarwin Rambo {
3334bded3a3SDarwin Rambo unsigned long time_left = I2C_TIMEOUT;
3344bded3a3SDarwin Rambo unsigned int nak_received;
3354bded3a3SDarwin Rambo
3364bded3a3SDarwin Rambo /* Clear pending session done interrupt */
3374bded3a3SDarwin Rambo writel(ISR_SES_DONE_MASK, dev->base + ISR_OFFSET);
3384bded3a3SDarwin Rambo
3394bded3a3SDarwin Rambo /* Send one byte of data */
3404bded3a3SDarwin Rambo writel(data, dev->base + DAT_OFFSET);
3414bded3a3SDarwin Rambo
3424bded3a3SDarwin Rambo time_left = wait_for_int_timeout(dev, time_left, IER_I2C_INT_EN_MASK);
3434bded3a3SDarwin Rambo
3444bded3a3SDarwin Rambo if (!time_left) {
3454bded3a3SDarwin Rambo debug("controller timed out\n");
3464bded3a3SDarwin Rambo return -ETIMEDOUT;
3474bded3a3SDarwin Rambo }
3484bded3a3SDarwin Rambo
3494bded3a3SDarwin Rambo nak_received = readl(dev->base + CS_OFFSET) & CS_ACK_MASK ? 1 : 0;
3504bded3a3SDarwin Rambo
3514bded3a3SDarwin Rambo if (nak_received ^ nak_expected) {
3524bded3a3SDarwin Rambo debug("unexpected NAK/ACK\n");
3534bded3a3SDarwin Rambo return -EREMOTEIO;
3544bded3a3SDarwin Rambo }
3554bded3a3SDarwin Rambo
3564bded3a3SDarwin Rambo return 0;
3574bded3a3SDarwin Rambo }
3584bded3a3SDarwin Rambo
3594bded3a3SDarwin Rambo /* Write a single TX FIFO worth of data to the i2c bus */
bcm_kona_i2c_write_fifo_single(struct bcm_kona_i2c_dev * dev,uint8_t * buf,unsigned int len)3604bded3a3SDarwin Rambo static int bcm_kona_i2c_write_fifo_single(struct bcm_kona_i2c_dev *dev,
3614bded3a3SDarwin Rambo uint8_t *buf, unsigned int len)
3624bded3a3SDarwin Rambo {
3634bded3a3SDarwin Rambo int k;
3644bded3a3SDarwin Rambo unsigned long time_left = I2C_TIMEOUT;
3654bded3a3SDarwin Rambo unsigned int fifo_status;
3664bded3a3SDarwin Rambo
3674bded3a3SDarwin Rambo /* Write data into FIFO */
3684bded3a3SDarwin Rambo for (k = 0; k < len; k++)
3694bded3a3SDarwin Rambo writel(buf[k], (dev->base + DAT_OFFSET));
3704bded3a3SDarwin Rambo
3714bded3a3SDarwin Rambo /* Wait for FIFO to empty */
3724bded3a3SDarwin Rambo do {
3734bded3a3SDarwin Rambo time_left =
3744bded3a3SDarwin Rambo wait_for_int_timeout(dev, time_left,
3754bded3a3SDarwin Rambo (IER_FIFO_INT_EN_MASK |
3764bded3a3SDarwin Rambo IER_NOACK_EN_MASK));
3774bded3a3SDarwin Rambo fifo_status = readl(dev->base + FIFO_STATUS_OFFSET);
3784bded3a3SDarwin Rambo } while (time_left && !(fifo_status & FIFO_STATUS_TXFIFO_EMPTY_MASK));
3794bded3a3SDarwin Rambo
3804bded3a3SDarwin Rambo /* Check if there was a NAK */
3814bded3a3SDarwin Rambo if (readl(dev->base + CS_OFFSET) & CS_ACK_MASK) {
3824bded3a3SDarwin Rambo printf("unexpected NAK\n");
3834bded3a3SDarwin Rambo return -EREMOTEIO;
3844bded3a3SDarwin Rambo }
3854bded3a3SDarwin Rambo
386eae4b2b6SVagrant Cascadian /* Check if a timeout occurred */
3874bded3a3SDarwin Rambo if (!time_left) {
3884bded3a3SDarwin Rambo printf("completion timed out\n");
3894bded3a3SDarwin Rambo return -EREMOTEIO;
3904bded3a3SDarwin Rambo }
3914bded3a3SDarwin Rambo
3924bded3a3SDarwin Rambo return 0;
3934bded3a3SDarwin Rambo }
3944bded3a3SDarwin Rambo
3954bded3a3SDarwin Rambo /* Write any amount of data using TX FIFO to the i2c bus */
bcm_kona_i2c_write_fifo(struct bcm_kona_i2c_dev * dev,struct kona_i2c_msg * msg)3964bded3a3SDarwin Rambo static int bcm_kona_i2c_write_fifo(struct bcm_kona_i2c_dev *dev,
397fffff726SSimon Glass struct kona_i2c_msg *msg)
3984bded3a3SDarwin Rambo {
3994bded3a3SDarwin Rambo unsigned int bytes_to_write = MAX_TX_FIFO_SIZE;
4004bded3a3SDarwin Rambo unsigned int bytes_written = 0;
4014bded3a3SDarwin Rambo int rc;
4024bded3a3SDarwin Rambo
4034bded3a3SDarwin Rambo uint8_t *tmp_buf = msg->buf;
4044bded3a3SDarwin Rambo
4054bded3a3SDarwin Rambo while (bytes_written < msg->len) {
4064bded3a3SDarwin Rambo if (msg->len - bytes_written <= MAX_TX_FIFO_SIZE)
4074bded3a3SDarwin Rambo bytes_to_write = msg->len - bytes_written;
4084bded3a3SDarwin Rambo
4094bded3a3SDarwin Rambo rc = bcm_kona_i2c_write_fifo_single(dev, tmp_buf,
4104bded3a3SDarwin Rambo bytes_to_write);
4114bded3a3SDarwin Rambo if (rc < 0)
4124bded3a3SDarwin Rambo return -EREMOTEIO;
4134bded3a3SDarwin Rambo
4144bded3a3SDarwin Rambo bytes_written += bytes_to_write;
4154bded3a3SDarwin Rambo tmp_buf += bytes_to_write;
4164bded3a3SDarwin Rambo }
4174bded3a3SDarwin Rambo
4184bded3a3SDarwin Rambo return 0;
4194bded3a3SDarwin Rambo }
4204bded3a3SDarwin Rambo
4214bded3a3SDarwin Rambo /* Send i2c address */
bcm_kona_i2c_do_addr(struct bcm_kona_i2c_dev * dev,struct kona_i2c_msg * msg)4224bded3a3SDarwin Rambo static int bcm_kona_i2c_do_addr(struct bcm_kona_i2c_dev *dev,
423fffff726SSimon Glass struct kona_i2c_msg *msg)
4244bded3a3SDarwin Rambo {
4254bded3a3SDarwin Rambo unsigned char addr;
4264bded3a3SDarwin Rambo
4274bded3a3SDarwin Rambo if (msg->flags & I2C_M_TEN) {
4284bded3a3SDarwin Rambo /* First byte is 11110XX0 where XX is upper 2 bits */
4294bded3a3SDarwin Rambo addr = 0xf0 | ((msg->addr & 0x300) >> 7);
4304bded3a3SDarwin Rambo if (bcm_kona_i2c_write_byte(dev, addr, 0) < 0)
4314bded3a3SDarwin Rambo return -EREMOTEIO;
4324bded3a3SDarwin Rambo
4334bded3a3SDarwin Rambo /* Second byte is the remaining 8 bits */
4344bded3a3SDarwin Rambo addr = msg->addr & 0xff;
4354bded3a3SDarwin Rambo if (bcm_kona_i2c_write_byte(dev, addr, 0) < 0)
4364bded3a3SDarwin Rambo return -EREMOTEIO;
4374bded3a3SDarwin Rambo
4384bded3a3SDarwin Rambo if (msg->flags & I2C_M_RD) {
4394bded3a3SDarwin Rambo /* For read, send restart command */
4404bded3a3SDarwin Rambo if (bcm_kona_send_i2c_cmd(dev, BCM_CMD_RESTART) < 0)
4414bded3a3SDarwin Rambo return -EREMOTEIO;
4424bded3a3SDarwin Rambo
4434bded3a3SDarwin Rambo /* Then re-send the first byte with the read bit set */
4444bded3a3SDarwin Rambo addr = 0xf0 | ((msg->addr & 0x300) >> 7) | 0x01;
4454bded3a3SDarwin Rambo if (bcm_kona_i2c_write_byte(dev, addr, 0) < 0)
4464bded3a3SDarwin Rambo return -EREMOTEIO;
4474bded3a3SDarwin Rambo }
4484bded3a3SDarwin Rambo } else {
4494bded3a3SDarwin Rambo addr = msg->addr << 1;
4504bded3a3SDarwin Rambo
4514bded3a3SDarwin Rambo if (msg->flags & I2C_M_RD)
4524bded3a3SDarwin Rambo addr |= 1;
4534bded3a3SDarwin Rambo
4544bded3a3SDarwin Rambo if (bcm_kona_i2c_write_byte(dev, addr, 0) < 0)
4554bded3a3SDarwin Rambo return -EREMOTEIO;
4564bded3a3SDarwin Rambo }
4574bded3a3SDarwin Rambo
4584bded3a3SDarwin Rambo return 0;
4594bded3a3SDarwin Rambo }
4604bded3a3SDarwin Rambo
bcm_kona_i2c_enable_autosense(struct bcm_kona_i2c_dev * dev)4614bded3a3SDarwin Rambo static void bcm_kona_i2c_enable_autosense(struct bcm_kona_i2c_dev *dev)
4624bded3a3SDarwin Rambo {
4634bded3a3SDarwin Rambo writel(readl(dev->base + CLKEN_OFFSET) & ~CLKEN_AUTOSENSE_OFF_MASK,
4644bded3a3SDarwin Rambo dev->base + CLKEN_OFFSET);
4654bded3a3SDarwin Rambo }
4664bded3a3SDarwin Rambo
bcm_kona_i2c_config_timing(struct bcm_kona_i2c_dev * dev)4674bded3a3SDarwin Rambo static void bcm_kona_i2c_config_timing(struct bcm_kona_i2c_dev *dev)
4684bded3a3SDarwin Rambo {
4694bded3a3SDarwin Rambo writel(readl(dev->base + HSTIM_OFFSET) & ~HSTIM_HS_MODE_MASK,
4704bded3a3SDarwin Rambo dev->base + HSTIM_OFFSET);
4714bded3a3SDarwin Rambo
4724bded3a3SDarwin Rambo writel((dev->std_cfg->prescale << TIM_PRESCALE_SHIFT) |
4734bded3a3SDarwin Rambo (dev->std_cfg->time_p << TIM_P_SHIFT) |
4744bded3a3SDarwin Rambo (dev->std_cfg->no_div << TIM_NO_DIV_SHIFT) |
4754bded3a3SDarwin Rambo (dev->std_cfg->time_div << TIM_DIV_SHIFT),
4764bded3a3SDarwin Rambo dev->base + TIM_OFFSET);
4774bded3a3SDarwin Rambo
4784bded3a3SDarwin Rambo writel((dev->std_cfg->time_m << CLKEN_M_SHIFT) |
4794bded3a3SDarwin Rambo (dev->std_cfg->time_n << CLKEN_N_SHIFT) |
4804bded3a3SDarwin Rambo CLKEN_CLKEN_MASK, dev->base + CLKEN_OFFSET);
4814bded3a3SDarwin Rambo }
4824bded3a3SDarwin Rambo
4834bded3a3SDarwin Rambo /* Master transfer function */
bcm_kona_i2c_xfer(struct bcm_kona_i2c_dev * dev,struct kona_i2c_msg msgs[],int num)4844bded3a3SDarwin Rambo static int bcm_kona_i2c_xfer(struct bcm_kona_i2c_dev *dev,
485fffff726SSimon Glass struct kona_i2c_msg msgs[], int num)
4864bded3a3SDarwin Rambo {
487fffff726SSimon Glass struct kona_i2c_msg *pmsg;
4884bded3a3SDarwin Rambo int rc = 0;
4894bded3a3SDarwin Rambo int i;
4904bded3a3SDarwin Rambo
4914bded3a3SDarwin Rambo /* Enable pad output */
4924bded3a3SDarwin Rambo writel(0, dev->base + PADCTL_OFFSET);
4934bded3a3SDarwin Rambo
4944bded3a3SDarwin Rambo /* Enable internal clocks */
4954bded3a3SDarwin Rambo bcm_kona_i2c_enable_clock(dev);
4964bded3a3SDarwin Rambo
4974bded3a3SDarwin Rambo /* Send start command */
4984bded3a3SDarwin Rambo rc = bcm_kona_send_i2c_cmd(dev, BCM_CMD_START);
4994bded3a3SDarwin Rambo if (rc < 0) {
5004bded3a3SDarwin Rambo printf("Start command failed rc = %d\n", rc);
5014bded3a3SDarwin Rambo goto xfer_disable_pad;
5024bded3a3SDarwin Rambo }
5034bded3a3SDarwin Rambo
5044bded3a3SDarwin Rambo /* Loop through all messages */
5054bded3a3SDarwin Rambo for (i = 0; i < num; i++) {
5064bded3a3SDarwin Rambo pmsg = &msgs[i];
5074bded3a3SDarwin Rambo
5084bded3a3SDarwin Rambo /* Send restart for subsequent messages */
5094bded3a3SDarwin Rambo if ((i != 0) && ((pmsg->flags & I2C_M_NOSTART) == 0)) {
5104bded3a3SDarwin Rambo rc = bcm_kona_send_i2c_cmd(dev, BCM_CMD_RESTART);
5114bded3a3SDarwin Rambo if (rc < 0) {
5124bded3a3SDarwin Rambo printf("restart cmd failed rc = %d\n", rc);
5134bded3a3SDarwin Rambo goto xfer_send_stop;
5144bded3a3SDarwin Rambo }
5154bded3a3SDarwin Rambo }
5164bded3a3SDarwin Rambo
5174bded3a3SDarwin Rambo /* Send slave address */
5184bded3a3SDarwin Rambo if (!(pmsg->flags & I2C_M_NOSTART)) {
5194bded3a3SDarwin Rambo rc = bcm_kona_i2c_do_addr(dev, pmsg);
5204bded3a3SDarwin Rambo if (rc < 0) {
5214bded3a3SDarwin Rambo debug("NAK from addr %2.2x msg#%d rc = %d\n",
5224bded3a3SDarwin Rambo pmsg->addr, i, rc);
5234bded3a3SDarwin Rambo goto xfer_send_stop;
5244bded3a3SDarwin Rambo }
5254bded3a3SDarwin Rambo }
5264bded3a3SDarwin Rambo
5274bded3a3SDarwin Rambo /* Perform data transfer */
5284bded3a3SDarwin Rambo if (pmsg->flags & I2C_M_RD) {
5294bded3a3SDarwin Rambo rc = bcm_kona_i2c_read_fifo(dev, pmsg);
5304bded3a3SDarwin Rambo if (rc < 0) {
5314bded3a3SDarwin Rambo printf("read failure\n");
5324bded3a3SDarwin Rambo goto xfer_send_stop;
5334bded3a3SDarwin Rambo }
5344bded3a3SDarwin Rambo } else {
5354bded3a3SDarwin Rambo rc = bcm_kona_i2c_write_fifo(dev, pmsg);
5364bded3a3SDarwin Rambo if (rc < 0) {
5374bded3a3SDarwin Rambo printf("write failure");
5384bded3a3SDarwin Rambo goto xfer_send_stop;
5394bded3a3SDarwin Rambo }
5404bded3a3SDarwin Rambo }
5414bded3a3SDarwin Rambo }
5424bded3a3SDarwin Rambo
5434bded3a3SDarwin Rambo rc = num;
5444bded3a3SDarwin Rambo
5454bded3a3SDarwin Rambo xfer_send_stop:
5464bded3a3SDarwin Rambo /* Send a STOP command */
5474bded3a3SDarwin Rambo bcm_kona_send_i2c_cmd(dev, BCM_CMD_STOP);
5484bded3a3SDarwin Rambo
5494bded3a3SDarwin Rambo xfer_disable_pad:
5504bded3a3SDarwin Rambo /* Disable pad output */
5514bded3a3SDarwin Rambo writel(PADCTL_PAD_OUT_EN_MASK, dev->base + PADCTL_OFFSET);
5524bded3a3SDarwin Rambo
5534bded3a3SDarwin Rambo /* Stop internal clock */
5544bded3a3SDarwin Rambo bcm_kona_i2c_disable_clock(dev);
5554bded3a3SDarwin Rambo
5564bded3a3SDarwin Rambo return rc;
5574bded3a3SDarwin Rambo }
5584bded3a3SDarwin Rambo
bcm_kona_i2c_assign_bus_speed(struct bcm_kona_i2c_dev * dev,uint speed)5594bded3a3SDarwin Rambo static uint bcm_kona_i2c_assign_bus_speed(struct bcm_kona_i2c_dev *dev,
5604bded3a3SDarwin Rambo uint speed)
5614bded3a3SDarwin Rambo {
5624bded3a3SDarwin Rambo switch (speed) {
5634bded3a3SDarwin Rambo case 100000:
5644bded3a3SDarwin Rambo dev->std_cfg = &std_cfg_table[BCM_SPD_100K];
5654bded3a3SDarwin Rambo break;
5664bded3a3SDarwin Rambo case 400000:
5674bded3a3SDarwin Rambo dev->std_cfg = &std_cfg_table[BCM_SPD_400K];
5684bded3a3SDarwin Rambo break;
5694bded3a3SDarwin Rambo case 1000000:
5704bded3a3SDarwin Rambo dev->std_cfg = &std_cfg_table[BCM_SPD_1MHZ];
5714bded3a3SDarwin Rambo break;
5724bded3a3SDarwin Rambo default:
5734bded3a3SDarwin Rambo printf("%d hz bus speed not supported\n", speed);
5744bded3a3SDarwin Rambo return -EINVAL;
5754bded3a3SDarwin Rambo }
5764bded3a3SDarwin Rambo dev->speed = speed;
5774bded3a3SDarwin Rambo return 0;
5784bded3a3SDarwin Rambo }
5794bded3a3SDarwin Rambo
bcm_kona_i2c_init(struct bcm_kona_i2c_dev * dev)5804bded3a3SDarwin Rambo static void bcm_kona_i2c_init(struct bcm_kona_i2c_dev *dev)
5814bded3a3SDarwin Rambo {
5824bded3a3SDarwin Rambo /* Parse bus speed */
5834bded3a3SDarwin Rambo bcm_kona_i2c_assign_bus_speed(dev, dev->speed);
5844bded3a3SDarwin Rambo
5854bded3a3SDarwin Rambo /* Enable internal clocks */
5864bded3a3SDarwin Rambo bcm_kona_i2c_enable_clock(dev);
5874bded3a3SDarwin Rambo
5884bded3a3SDarwin Rambo /* Configure internal dividers */
5894bded3a3SDarwin Rambo bcm_kona_i2c_config_timing(dev);
5904bded3a3SDarwin Rambo
5914bded3a3SDarwin Rambo /* Disable timeout */
5924bded3a3SDarwin Rambo writel(0, dev->base + TOUT_OFFSET);
5934bded3a3SDarwin Rambo
5944bded3a3SDarwin Rambo /* Enable autosense */
5954bded3a3SDarwin Rambo bcm_kona_i2c_enable_autosense(dev);
5964bded3a3SDarwin Rambo
5974bded3a3SDarwin Rambo /* Enable TX FIFO */
5984bded3a3SDarwin Rambo writel(TXFCR_FIFO_FLUSH_MASK | TXFCR_FIFO_EN_MASK,
5994bded3a3SDarwin Rambo dev->base + TXFCR_OFFSET);
6004bded3a3SDarwin Rambo
6014bded3a3SDarwin Rambo /* Mask all interrupts */
6024bded3a3SDarwin Rambo writel(0, dev->base + IER_OFFSET);
6034bded3a3SDarwin Rambo
6044bded3a3SDarwin Rambo /* Clear all pending interrupts */
6054bded3a3SDarwin Rambo writel(ISR_CMDBUSY_MASK |
6064bded3a3SDarwin Rambo ISR_READ_COMPLETE_MASK |
6074bded3a3SDarwin Rambo ISR_SES_DONE_MASK |
6084bded3a3SDarwin Rambo ISR_ERR_MASK |
6094bded3a3SDarwin Rambo ISR_TXFIFOEMPTY_MASK | ISR_NOACK_MASK, dev->base + ISR_OFFSET);
6104bded3a3SDarwin Rambo
6114bded3a3SDarwin Rambo /* Enable the controller but leave it idle */
6124bded3a3SDarwin Rambo bcm_kona_i2c_send_cmd_to_ctrl(dev, BCM_CMD_NOACTION);
6134bded3a3SDarwin Rambo
6144bded3a3SDarwin Rambo /* Disable pad output */
6154bded3a3SDarwin Rambo writel(PADCTL_PAD_OUT_EN_MASK, dev->base + PADCTL_OFFSET);
6164bded3a3SDarwin Rambo }
6174bded3a3SDarwin Rambo
6184bded3a3SDarwin Rambo /*
6194bded3a3SDarwin Rambo * uboot layer
6204bded3a3SDarwin Rambo */
kona_get_dev(struct i2c_adapter * adap)6214bded3a3SDarwin Rambo struct bcm_kona_i2c_dev *kona_get_dev(struct i2c_adapter *adap)
6224bded3a3SDarwin Rambo {
6234bded3a3SDarwin Rambo return &g_i2c_devs[adap->hwadapnr];
6244bded3a3SDarwin Rambo }
6254bded3a3SDarwin Rambo
kona_i2c_init(struct i2c_adapter * adap,int speed,int slaveaddr)6264bded3a3SDarwin Rambo static void kona_i2c_init(struct i2c_adapter *adap, int speed, int slaveaddr)
6274bded3a3SDarwin Rambo {
6284bded3a3SDarwin Rambo struct bcm_kona_i2c_dev *dev = kona_get_dev(adap);
6294bded3a3SDarwin Rambo
6304bded3a3SDarwin Rambo if (clk_bsc_enable(dev->base))
6314bded3a3SDarwin Rambo return;
6324bded3a3SDarwin Rambo
6334bded3a3SDarwin Rambo bcm_kona_i2c_init(dev);
6344bded3a3SDarwin Rambo }
6354bded3a3SDarwin Rambo
kona_i2c_read(struct i2c_adapter * adap,uchar chip,uint addr,int alen,uchar * buffer,int len)6364bded3a3SDarwin Rambo static int kona_i2c_read(struct i2c_adapter *adap, uchar chip, uint addr,
6374bded3a3SDarwin Rambo int alen, uchar *buffer, int len)
6384bded3a3SDarwin Rambo {
6394bded3a3SDarwin Rambo /* msg[0] writes the addr, msg[1] reads the data */
640fffff726SSimon Glass struct kona_i2c_msg msg[2];
6414bded3a3SDarwin Rambo unsigned char msgbuf0[64];
6424bded3a3SDarwin Rambo struct bcm_kona_i2c_dev *dev = kona_get_dev(adap);
6434bded3a3SDarwin Rambo
6444bded3a3SDarwin Rambo msg[0].addr = chip;
6454bded3a3SDarwin Rambo msg[0].flags = 0;
6464bded3a3SDarwin Rambo msg[0].len = 1;
6474bded3a3SDarwin Rambo msg[0].buf = msgbuf0; /* msgbuf0 contains incrementing reg addr */
6484bded3a3SDarwin Rambo
6494bded3a3SDarwin Rambo msg[1].addr = chip;
6504bded3a3SDarwin Rambo msg[1].flags = I2C_M_RD;
6514bded3a3SDarwin Rambo /* msg[1].buf dest ptr increments each read */
6524bded3a3SDarwin Rambo
6534bded3a3SDarwin Rambo msgbuf0[0] = (unsigned char)addr;
6544bded3a3SDarwin Rambo msg[1].buf = buffer;
6554bded3a3SDarwin Rambo msg[1].len = len;
6564bded3a3SDarwin Rambo if (bcm_kona_i2c_xfer(dev, msg, 2) < 0) {
6574bded3a3SDarwin Rambo /* Sending 2 i2c messages */
6584bded3a3SDarwin Rambo kona_i2c_init(adap, adap->speed, adap->slaveaddr);
6594bded3a3SDarwin Rambo debug("I2C read: I/O error\n");
6604bded3a3SDarwin Rambo return -EIO;
6614bded3a3SDarwin Rambo }
6624bded3a3SDarwin Rambo return 0;
6634bded3a3SDarwin Rambo }
6644bded3a3SDarwin Rambo
kona_i2c_write(struct i2c_adapter * adap,uchar chip,uint addr,int alen,uchar * buffer,int len)6654bded3a3SDarwin Rambo static int kona_i2c_write(struct i2c_adapter *adap, uchar chip, uint addr,
6664bded3a3SDarwin Rambo int alen, uchar *buffer, int len)
6674bded3a3SDarwin Rambo {
668fffff726SSimon Glass struct kona_i2c_msg msg[1];
6694bded3a3SDarwin Rambo unsigned char msgbuf0[64];
6704bded3a3SDarwin Rambo unsigned int i;
6714bded3a3SDarwin Rambo struct bcm_kona_i2c_dev *dev = kona_get_dev(adap);
6724bded3a3SDarwin Rambo
6734bded3a3SDarwin Rambo msg[0].addr = chip;
6744bded3a3SDarwin Rambo msg[0].flags = 0;
6754bded3a3SDarwin Rambo msg[0].len = 2; /* addr byte plus data */
6764bded3a3SDarwin Rambo msg[0].buf = msgbuf0;
6774bded3a3SDarwin Rambo
6784bded3a3SDarwin Rambo for (i = 0; i < len; i++) {
6794bded3a3SDarwin Rambo msgbuf0[0] = addr++;
6804bded3a3SDarwin Rambo msgbuf0[1] = buffer[i];
6814bded3a3SDarwin Rambo if (bcm_kona_i2c_xfer(dev, msg, 1) < 0) {
6824bded3a3SDarwin Rambo kona_i2c_init(adap, adap->speed, adap->slaveaddr);
6834bded3a3SDarwin Rambo debug("I2C write: I/O error\n");
6844bded3a3SDarwin Rambo return -EIO;
6854bded3a3SDarwin Rambo }
6864bded3a3SDarwin Rambo }
6874bded3a3SDarwin Rambo return 0;
6884bded3a3SDarwin Rambo }
6894bded3a3SDarwin Rambo
kona_i2c_probe(struct i2c_adapter * adap,uchar chip)6904bded3a3SDarwin Rambo static int kona_i2c_probe(struct i2c_adapter *adap, uchar chip)
6914bded3a3SDarwin Rambo {
6924bded3a3SDarwin Rambo uchar tmp;
6934bded3a3SDarwin Rambo
6944bded3a3SDarwin Rambo /*
6954bded3a3SDarwin Rambo * read addr 0x0 of the given chip.
6964bded3a3SDarwin Rambo */
6974bded3a3SDarwin Rambo return kona_i2c_read(adap, chip, 0x0, 1, &tmp, 1);
6984bded3a3SDarwin Rambo }
6994bded3a3SDarwin Rambo
kona_i2c_set_bus_speed(struct i2c_adapter * adap,uint speed)7004bded3a3SDarwin Rambo static uint kona_i2c_set_bus_speed(struct i2c_adapter *adap, uint speed)
7014bded3a3SDarwin Rambo {
7024bded3a3SDarwin Rambo struct bcm_kona_i2c_dev *dev = kona_get_dev(adap);
7034bded3a3SDarwin Rambo return bcm_kona_i2c_assign_bus_speed(dev, speed);
7044bded3a3SDarwin Rambo }
7054bded3a3SDarwin Rambo
7064bded3a3SDarwin Rambo /*
7074bded3a3SDarwin Rambo * Register kona i2c adapters. Keep the order below so
7084bded3a3SDarwin Rambo * that the bus number matches the adapter number.
7094bded3a3SDarwin Rambo */
7104bded3a3SDarwin Rambo #define DEF_ADAPTER(num) \
7114bded3a3SDarwin Rambo U_BOOT_I2C_ADAP_COMPLETE(kona##num, kona_i2c_init, kona_i2c_probe, \
7124bded3a3SDarwin Rambo kona_i2c_read, kona_i2c_write, \
7134bded3a3SDarwin Rambo kona_i2c_set_bus_speed, DEF_SPD, 0x00, num)
7144bded3a3SDarwin Rambo
7154bded3a3SDarwin Rambo #ifdef CONFIG_SYS_I2C_BASE0
7164bded3a3SDarwin Rambo DEF_ADAPTER(0)
7174bded3a3SDarwin Rambo #endif
7184bded3a3SDarwin Rambo #ifdef CONFIG_SYS_I2C_BASE1
7194bded3a3SDarwin Rambo DEF_ADAPTER(1)
7204bded3a3SDarwin Rambo #endif
7214bded3a3SDarwin Rambo #ifdef CONFIG_SYS_I2C_BASE2
7224bded3a3SDarwin Rambo DEF_ADAPTER(2)
7234bded3a3SDarwin Rambo #endif
7244bded3a3SDarwin Rambo #ifdef CONFIG_SYS_I2C_BASE3
7254bded3a3SDarwin Rambo DEF_ADAPTER(3)
7264bded3a3SDarwin Rambo #endif
7274bded3a3SDarwin Rambo #ifdef CONFIG_SYS_I2C_BASE4
7284bded3a3SDarwin Rambo DEF_ADAPTER(4)
7294bded3a3SDarwin Rambo #endif
7304bded3a3SDarwin Rambo #ifdef CONFIG_SYS_I2C_BASE5
7314bded3a3SDarwin Rambo DEF_ADAPTER(5)
7324bded3a3SDarwin Rambo #endif
733