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