1*4bded3a3SDarwin Rambo /* 2*4bded3a3SDarwin Rambo * Copyright 2013 Broadcom Corporation. 3*4bded3a3SDarwin Rambo * 4*4bded3a3SDarwin Rambo * SPDX-License-Identifier: GPL-2.0+ 5*4bded3a3SDarwin Rambo */ 6*4bded3a3SDarwin Rambo 7*4bded3a3SDarwin Rambo #include <common.h> 8*4bded3a3SDarwin Rambo #include <asm/io.h> 9*4bded3a3SDarwin Rambo #include <asm/errno.h> 10*4bded3a3SDarwin Rambo #include <asm/arch/sysmap.h> 11*4bded3a3SDarwin Rambo #include <asm/kona-common/clk.h> 12*4bded3a3SDarwin Rambo #include <i2c.h> 13*4bded3a3SDarwin Rambo 14*4bded3a3SDarwin Rambo /* Hardware register offsets and field defintions */ 15*4bded3a3SDarwin Rambo #define CS_OFFSET 0x00000020 16*4bded3a3SDarwin Rambo #define CS_ACK_SHIFT 3 17*4bded3a3SDarwin Rambo #define CS_ACK_MASK 0x00000008 18*4bded3a3SDarwin Rambo #define CS_ACK_CMD_GEN_START 0x00000000 19*4bded3a3SDarwin Rambo #define CS_ACK_CMD_GEN_RESTART 0x00000001 20*4bded3a3SDarwin Rambo #define CS_CMD_SHIFT 1 21*4bded3a3SDarwin Rambo #define CS_CMD_CMD_NO_ACTION 0x00000000 22*4bded3a3SDarwin Rambo #define CS_CMD_CMD_START_RESTART 0x00000001 23*4bded3a3SDarwin Rambo #define CS_CMD_CMD_STOP 0x00000002 24*4bded3a3SDarwin Rambo #define CS_EN_SHIFT 0 25*4bded3a3SDarwin Rambo #define CS_EN_CMD_ENABLE_BSC 0x00000001 26*4bded3a3SDarwin Rambo 27*4bded3a3SDarwin Rambo #define TIM_OFFSET 0x00000024 28*4bded3a3SDarwin Rambo #define TIM_PRESCALE_SHIFT 6 29*4bded3a3SDarwin Rambo #define TIM_P_SHIFT 3 30*4bded3a3SDarwin Rambo #define TIM_NO_DIV_SHIFT 2 31*4bded3a3SDarwin Rambo #define TIM_DIV_SHIFT 0 32*4bded3a3SDarwin Rambo 33*4bded3a3SDarwin Rambo #define DAT_OFFSET 0x00000028 34*4bded3a3SDarwin Rambo 35*4bded3a3SDarwin Rambo #define TOUT_OFFSET 0x0000002c 36*4bded3a3SDarwin Rambo 37*4bded3a3SDarwin Rambo #define TXFCR_OFFSET 0x0000003c 38*4bded3a3SDarwin Rambo #define TXFCR_FIFO_FLUSH_MASK 0x00000080 39*4bded3a3SDarwin Rambo #define TXFCR_FIFO_EN_MASK 0x00000040 40*4bded3a3SDarwin Rambo 41*4bded3a3SDarwin Rambo #define IER_OFFSET 0x00000044 42*4bded3a3SDarwin Rambo #define IER_READ_COMPLETE_INT_MASK 0x00000010 43*4bded3a3SDarwin Rambo #define IER_I2C_INT_EN_MASK 0x00000008 44*4bded3a3SDarwin Rambo #define IER_FIFO_INT_EN_MASK 0x00000002 45*4bded3a3SDarwin Rambo #define IER_NOACK_EN_MASK 0x00000001 46*4bded3a3SDarwin Rambo 47*4bded3a3SDarwin Rambo #define ISR_OFFSET 0x00000048 48*4bded3a3SDarwin Rambo #define ISR_RESERVED_MASK 0xffffff60 49*4bded3a3SDarwin Rambo #define ISR_CMDBUSY_MASK 0x00000080 50*4bded3a3SDarwin Rambo #define ISR_READ_COMPLETE_MASK 0x00000010 51*4bded3a3SDarwin Rambo #define ISR_SES_DONE_MASK 0x00000008 52*4bded3a3SDarwin Rambo #define ISR_ERR_MASK 0x00000004 53*4bded3a3SDarwin Rambo #define ISR_TXFIFOEMPTY_MASK 0x00000002 54*4bded3a3SDarwin Rambo #define ISR_NOACK_MASK 0x00000001 55*4bded3a3SDarwin Rambo 56*4bded3a3SDarwin Rambo #define CLKEN_OFFSET 0x0000004c 57*4bded3a3SDarwin Rambo #define CLKEN_AUTOSENSE_OFF_MASK 0x00000080 58*4bded3a3SDarwin Rambo #define CLKEN_M_SHIFT 4 59*4bded3a3SDarwin Rambo #define CLKEN_N_SHIFT 1 60*4bded3a3SDarwin Rambo #define CLKEN_CLKEN_MASK 0x00000001 61*4bded3a3SDarwin Rambo 62*4bded3a3SDarwin Rambo #define FIFO_STATUS_OFFSET 0x00000054 63*4bded3a3SDarwin Rambo #define FIFO_STATUS_RXFIFO_EMPTY_MASK 0x00000004 64*4bded3a3SDarwin Rambo #define FIFO_STATUS_TXFIFO_EMPTY_MASK 0x00000010 65*4bded3a3SDarwin Rambo 66*4bded3a3SDarwin Rambo #define HSTIM_OFFSET 0x00000058 67*4bded3a3SDarwin Rambo #define HSTIM_HS_MODE_MASK 0x00008000 68*4bded3a3SDarwin Rambo #define HSTIM_HS_HOLD_SHIFT 10 69*4bded3a3SDarwin Rambo #define HSTIM_HS_HIGH_PHASE_SHIFT 5 70*4bded3a3SDarwin Rambo #define HSTIM_HS_SETUP_SHIFT 0 71*4bded3a3SDarwin Rambo 72*4bded3a3SDarwin Rambo #define PADCTL_OFFSET 0x0000005c 73*4bded3a3SDarwin Rambo #define PADCTL_PAD_OUT_EN_MASK 0x00000004 74*4bded3a3SDarwin Rambo 75*4bded3a3SDarwin Rambo #define RXFCR_OFFSET 0x00000068 76*4bded3a3SDarwin Rambo #define RXFCR_NACK_EN_SHIFT 7 77*4bded3a3SDarwin Rambo #define RXFCR_READ_COUNT_SHIFT 0 78*4bded3a3SDarwin Rambo #define RXFIFORDOUT_OFFSET 0x0000006c 79*4bded3a3SDarwin Rambo 80*4bded3a3SDarwin Rambo /* Locally used constants */ 81*4bded3a3SDarwin Rambo #define MAX_RX_FIFO_SIZE 64U /* bytes */ 82*4bded3a3SDarwin Rambo #define MAX_TX_FIFO_SIZE 64U /* bytes */ 83*4bded3a3SDarwin Rambo 84*4bded3a3SDarwin Rambo #define I2C_TIMEOUT 100000 /* usecs */ 85*4bded3a3SDarwin Rambo 86*4bded3a3SDarwin Rambo #define WAIT_INT_CHK 100 /* usecs */ 87*4bded3a3SDarwin Rambo #if I2C_TIMEOUT % WAIT_INT_CHK 88*4bded3a3SDarwin Rambo #error I2C_TIMEOUT must be a multiple of WAIT_INT_CHK 89*4bded3a3SDarwin Rambo #endif 90*4bded3a3SDarwin Rambo 91*4bded3a3SDarwin Rambo /* Operations that can be commanded to the controller */ 92*4bded3a3SDarwin Rambo enum bcm_kona_cmd_t { 93*4bded3a3SDarwin Rambo BCM_CMD_NOACTION = 0, 94*4bded3a3SDarwin Rambo BCM_CMD_START, 95*4bded3a3SDarwin Rambo BCM_CMD_RESTART, 96*4bded3a3SDarwin Rambo BCM_CMD_STOP, 97*4bded3a3SDarwin Rambo }; 98*4bded3a3SDarwin Rambo 99*4bded3a3SDarwin Rambo enum bus_speed_index { 100*4bded3a3SDarwin Rambo BCM_SPD_100K = 0, 101*4bded3a3SDarwin Rambo BCM_SPD_400K, 102*4bded3a3SDarwin Rambo BCM_SPD_1MHZ, 103*4bded3a3SDarwin Rambo }; 104*4bded3a3SDarwin Rambo 105*4bded3a3SDarwin Rambo /* Internal divider settings for standard mode, fast mode and fast mode plus */ 106*4bded3a3SDarwin Rambo struct bus_speed_cfg { 107*4bded3a3SDarwin Rambo uint8_t time_m; /* Number of cycles for setup time */ 108*4bded3a3SDarwin Rambo uint8_t time_n; /* Number of cycles for hold time */ 109*4bded3a3SDarwin Rambo uint8_t prescale; /* Prescale divider */ 110*4bded3a3SDarwin Rambo uint8_t time_p; /* Timing coefficient */ 111*4bded3a3SDarwin Rambo uint8_t no_div; /* Disable clock divider */ 112*4bded3a3SDarwin Rambo uint8_t time_div; /* Post-prescale divider */ 113*4bded3a3SDarwin Rambo }; 114*4bded3a3SDarwin Rambo 115*4bded3a3SDarwin Rambo static const struct bus_speed_cfg std_cfg_table[] = { 116*4bded3a3SDarwin Rambo [BCM_SPD_100K] = {0x01, 0x01, 0x03, 0x06, 0x00, 0x02}, 117*4bded3a3SDarwin Rambo [BCM_SPD_400K] = {0x05, 0x01, 0x03, 0x05, 0x01, 0x02}, 118*4bded3a3SDarwin Rambo [BCM_SPD_1MHZ] = {0x01, 0x01, 0x03, 0x01, 0x01, 0x03}, 119*4bded3a3SDarwin Rambo }; 120*4bded3a3SDarwin Rambo 121*4bded3a3SDarwin Rambo struct bcm_kona_i2c_dev { 122*4bded3a3SDarwin Rambo void *base; 123*4bded3a3SDarwin Rambo uint speed; 124*4bded3a3SDarwin Rambo const struct bus_speed_cfg *std_cfg; 125*4bded3a3SDarwin Rambo }; 126*4bded3a3SDarwin Rambo 127*4bded3a3SDarwin Rambo /* Keep these two defines in sync */ 128*4bded3a3SDarwin Rambo #define DEF_SPD 100000 129*4bded3a3SDarwin Rambo #define DEF_SPD_ENUM BCM_SPD_100K 130*4bded3a3SDarwin Rambo 131*4bded3a3SDarwin Rambo #define DEF_DEVICE(num) \ 132*4bded3a3SDarwin Rambo {(void *)CONFIG_SYS_I2C_BASE##num, DEF_SPD, &std_cfg_table[DEF_SPD_ENUM]} 133*4bded3a3SDarwin Rambo 134*4bded3a3SDarwin Rambo static struct bcm_kona_i2c_dev g_i2c_devs[CONFIG_SYS_MAX_I2C_BUS] = { 135*4bded3a3SDarwin Rambo #ifdef CONFIG_SYS_I2C_BASE0 136*4bded3a3SDarwin Rambo DEF_DEVICE(0), 137*4bded3a3SDarwin Rambo #endif 138*4bded3a3SDarwin Rambo #ifdef CONFIG_SYS_I2C_BASE1 139*4bded3a3SDarwin Rambo DEF_DEVICE(1), 140*4bded3a3SDarwin Rambo #endif 141*4bded3a3SDarwin Rambo #ifdef CONFIG_SYS_I2C_BASE2 142*4bded3a3SDarwin Rambo DEF_DEVICE(2), 143*4bded3a3SDarwin Rambo #endif 144*4bded3a3SDarwin Rambo #ifdef CONFIG_SYS_I2C_BASE3 145*4bded3a3SDarwin Rambo DEF_DEVICE(3), 146*4bded3a3SDarwin Rambo #endif 147*4bded3a3SDarwin Rambo #ifdef CONFIG_SYS_I2C_BASE4 148*4bded3a3SDarwin Rambo DEF_DEVICE(4), 149*4bded3a3SDarwin Rambo #endif 150*4bded3a3SDarwin Rambo #ifdef CONFIG_SYS_I2C_BASE5 151*4bded3a3SDarwin Rambo DEF_DEVICE(5), 152*4bded3a3SDarwin Rambo #endif 153*4bded3a3SDarwin Rambo }; 154*4bded3a3SDarwin Rambo 155*4bded3a3SDarwin Rambo #define I2C_M_TEN 0x0010 /* ten bit address */ 156*4bded3a3SDarwin Rambo #define I2C_M_RD 0x0001 /* read data */ 157*4bded3a3SDarwin Rambo #define I2C_M_NOSTART 0x4000 /* no restart between msgs */ 158*4bded3a3SDarwin Rambo 159*4bded3a3SDarwin Rambo struct i2c_msg { 160*4bded3a3SDarwin Rambo uint16_t addr; 161*4bded3a3SDarwin Rambo uint16_t flags; 162*4bded3a3SDarwin Rambo uint16_t len; 163*4bded3a3SDarwin Rambo uint8_t *buf; 164*4bded3a3SDarwin Rambo }; 165*4bded3a3SDarwin Rambo 166*4bded3a3SDarwin Rambo static void bcm_kona_i2c_send_cmd_to_ctrl(struct bcm_kona_i2c_dev *dev, 167*4bded3a3SDarwin Rambo enum bcm_kona_cmd_t cmd) 168*4bded3a3SDarwin Rambo { 169*4bded3a3SDarwin Rambo debug("%s, %d\n", __func__, cmd); 170*4bded3a3SDarwin Rambo 171*4bded3a3SDarwin Rambo switch (cmd) { 172*4bded3a3SDarwin Rambo case BCM_CMD_NOACTION: 173*4bded3a3SDarwin Rambo writel((CS_CMD_CMD_NO_ACTION << CS_CMD_SHIFT) | 174*4bded3a3SDarwin Rambo (CS_EN_CMD_ENABLE_BSC << CS_EN_SHIFT), 175*4bded3a3SDarwin Rambo dev->base + CS_OFFSET); 176*4bded3a3SDarwin Rambo break; 177*4bded3a3SDarwin Rambo 178*4bded3a3SDarwin Rambo case BCM_CMD_START: 179*4bded3a3SDarwin Rambo writel((CS_ACK_CMD_GEN_START << CS_ACK_SHIFT) | 180*4bded3a3SDarwin Rambo (CS_CMD_CMD_START_RESTART << CS_CMD_SHIFT) | 181*4bded3a3SDarwin Rambo (CS_EN_CMD_ENABLE_BSC << CS_EN_SHIFT), 182*4bded3a3SDarwin Rambo dev->base + CS_OFFSET); 183*4bded3a3SDarwin Rambo break; 184*4bded3a3SDarwin Rambo 185*4bded3a3SDarwin Rambo case BCM_CMD_RESTART: 186*4bded3a3SDarwin Rambo writel((CS_ACK_CMD_GEN_RESTART << CS_ACK_SHIFT) | 187*4bded3a3SDarwin Rambo (CS_CMD_CMD_START_RESTART << CS_CMD_SHIFT) | 188*4bded3a3SDarwin Rambo (CS_EN_CMD_ENABLE_BSC << CS_EN_SHIFT), 189*4bded3a3SDarwin Rambo dev->base + CS_OFFSET); 190*4bded3a3SDarwin Rambo break; 191*4bded3a3SDarwin Rambo 192*4bded3a3SDarwin Rambo case BCM_CMD_STOP: 193*4bded3a3SDarwin Rambo writel((CS_CMD_CMD_STOP << CS_CMD_SHIFT) | 194*4bded3a3SDarwin Rambo (CS_EN_CMD_ENABLE_BSC << CS_EN_SHIFT), 195*4bded3a3SDarwin Rambo dev->base + CS_OFFSET); 196*4bded3a3SDarwin Rambo break; 197*4bded3a3SDarwin Rambo 198*4bded3a3SDarwin Rambo default: 199*4bded3a3SDarwin Rambo printf("Unknown command %d\n", cmd); 200*4bded3a3SDarwin Rambo } 201*4bded3a3SDarwin Rambo } 202*4bded3a3SDarwin Rambo 203*4bded3a3SDarwin Rambo static void bcm_kona_i2c_enable_clock(struct bcm_kona_i2c_dev *dev) 204*4bded3a3SDarwin Rambo { 205*4bded3a3SDarwin Rambo writel(readl(dev->base + CLKEN_OFFSET) | CLKEN_CLKEN_MASK, 206*4bded3a3SDarwin Rambo dev->base + CLKEN_OFFSET); 207*4bded3a3SDarwin Rambo } 208*4bded3a3SDarwin Rambo 209*4bded3a3SDarwin Rambo static void bcm_kona_i2c_disable_clock(struct bcm_kona_i2c_dev *dev) 210*4bded3a3SDarwin Rambo { 211*4bded3a3SDarwin Rambo writel(readl(dev->base + CLKEN_OFFSET) & ~CLKEN_CLKEN_MASK, 212*4bded3a3SDarwin Rambo dev->base + CLKEN_OFFSET); 213*4bded3a3SDarwin Rambo } 214*4bded3a3SDarwin Rambo 215*4bded3a3SDarwin Rambo /* Wait until at least one of the mask bit(s) are set */ 216*4bded3a3SDarwin Rambo static unsigned long wait_for_int_timeout(struct bcm_kona_i2c_dev *dev, 217*4bded3a3SDarwin Rambo unsigned long time_left, 218*4bded3a3SDarwin Rambo uint32_t mask) 219*4bded3a3SDarwin Rambo { 220*4bded3a3SDarwin Rambo uint32_t status; 221*4bded3a3SDarwin Rambo 222*4bded3a3SDarwin Rambo while (time_left) { 223*4bded3a3SDarwin Rambo status = readl(dev->base + ISR_OFFSET); 224*4bded3a3SDarwin Rambo 225*4bded3a3SDarwin Rambo if ((status & ~ISR_RESERVED_MASK) == 0) { 226*4bded3a3SDarwin Rambo debug("Bogus I2C interrupt 0x%x\n", status); 227*4bded3a3SDarwin Rambo continue; 228*4bded3a3SDarwin Rambo } 229*4bded3a3SDarwin Rambo 230*4bded3a3SDarwin Rambo /* Must flush the TX FIFO when NAK detected */ 231*4bded3a3SDarwin Rambo if (status & ISR_NOACK_MASK) 232*4bded3a3SDarwin Rambo writel(TXFCR_FIFO_FLUSH_MASK | TXFCR_FIFO_EN_MASK, 233*4bded3a3SDarwin Rambo dev->base + TXFCR_OFFSET); 234*4bded3a3SDarwin Rambo 235*4bded3a3SDarwin Rambo writel(status & ~ISR_RESERVED_MASK, dev->base + ISR_OFFSET); 236*4bded3a3SDarwin Rambo 237*4bded3a3SDarwin Rambo if (status & mask) { 238*4bded3a3SDarwin Rambo /* We are done since one of the mask bits are set */ 239*4bded3a3SDarwin Rambo return time_left; 240*4bded3a3SDarwin Rambo } 241*4bded3a3SDarwin Rambo udelay(WAIT_INT_CHK); 242*4bded3a3SDarwin Rambo time_left -= WAIT_INT_CHK; 243*4bded3a3SDarwin Rambo } 244*4bded3a3SDarwin Rambo return 0; 245*4bded3a3SDarwin Rambo } 246*4bded3a3SDarwin Rambo 247*4bded3a3SDarwin Rambo /* Send command to I2C bus */ 248*4bded3a3SDarwin Rambo static int bcm_kona_send_i2c_cmd(struct bcm_kona_i2c_dev *dev, 249*4bded3a3SDarwin Rambo enum bcm_kona_cmd_t cmd) 250*4bded3a3SDarwin Rambo { 251*4bded3a3SDarwin Rambo int rc = 0; 252*4bded3a3SDarwin Rambo unsigned long time_left = I2C_TIMEOUT; 253*4bded3a3SDarwin Rambo 254*4bded3a3SDarwin Rambo /* Send the command */ 255*4bded3a3SDarwin Rambo bcm_kona_i2c_send_cmd_to_ctrl(dev, cmd); 256*4bded3a3SDarwin Rambo 257*4bded3a3SDarwin Rambo /* Wait for transaction to finish or timeout */ 258*4bded3a3SDarwin Rambo time_left = wait_for_int_timeout(dev, time_left, IER_I2C_INT_EN_MASK); 259*4bded3a3SDarwin Rambo 260*4bded3a3SDarwin Rambo if (!time_left) { 261*4bded3a3SDarwin Rambo printf("controller timed out\n"); 262*4bded3a3SDarwin Rambo rc = -ETIMEDOUT; 263*4bded3a3SDarwin Rambo } 264*4bded3a3SDarwin Rambo 265*4bded3a3SDarwin Rambo /* Clear command */ 266*4bded3a3SDarwin Rambo bcm_kona_i2c_send_cmd_to_ctrl(dev, BCM_CMD_NOACTION); 267*4bded3a3SDarwin Rambo 268*4bded3a3SDarwin Rambo return rc; 269*4bded3a3SDarwin Rambo } 270*4bded3a3SDarwin Rambo 271*4bded3a3SDarwin Rambo /* Read a single RX FIFO worth of data from the i2c bus */ 272*4bded3a3SDarwin Rambo static int bcm_kona_i2c_read_fifo_single(struct bcm_kona_i2c_dev *dev, 273*4bded3a3SDarwin Rambo uint8_t *buf, unsigned int len, 274*4bded3a3SDarwin Rambo unsigned int last_byte_nak) 275*4bded3a3SDarwin Rambo { 276*4bded3a3SDarwin Rambo unsigned long time_left = I2C_TIMEOUT; 277*4bded3a3SDarwin Rambo 278*4bded3a3SDarwin Rambo /* Start the RX FIFO */ 279*4bded3a3SDarwin Rambo writel((last_byte_nak << RXFCR_NACK_EN_SHIFT) | 280*4bded3a3SDarwin Rambo (len << RXFCR_READ_COUNT_SHIFT), dev->base + RXFCR_OFFSET); 281*4bded3a3SDarwin Rambo 282*4bded3a3SDarwin Rambo /* Wait for FIFO read to complete */ 283*4bded3a3SDarwin Rambo time_left = 284*4bded3a3SDarwin Rambo wait_for_int_timeout(dev, time_left, IER_READ_COMPLETE_INT_MASK); 285*4bded3a3SDarwin Rambo 286*4bded3a3SDarwin Rambo if (!time_left) { 287*4bded3a3SDarwin Rambo printf("RX FIFO time out\n"); 288*4bded3a3SDarwin Rambo return -EREMOTEIO; 289*4bded3a3SDarwin Rambo } 290*4bded3a3SDarwin Rambo 291*4bded3a3SDarwin Rambo /* Read data from FIFO */ 292*4bded3a3SDarwin Rambo for (; len > 0; len--, buf++) 293*4bded3a3SDarwin Rambo *buf = readl(dev->base + RXFIFORDOUT_OFFSET); 294*4bded3a3SDarwin Rambo 295*4bded3a3SDarwin Rambo return 0; 296*4bded3a3SDarwin Rambo } 297*4bded3a3SDarwin Rambo 298*4bded3a3SDarwin Rambo /* Read any amount of data using the RX FIFO from the i2c bus */ 299*4bded3a3SDarwin Rambo static int bcm_kona_i2c_read_fifo(struct bcm_kona_i2c_dev *dev, 300*4bded3a3SDarwin Rambo struct i2c_msg *msg) 301*4bded3a3SDarwin Rambo { 302*4bded3a3SDarwin Rambo unsigned int bytes_to_read = MAX_RX_FIFO_SIZE; 303*4bded3a3SDarwin Rambo unsigned int last_byte_nak = 0; 304*4bded3a3SDarwin Rambo unsigned int bytes_read = 0; 305*4bded3a3SDarwin Rambo int rc; 306*4bded3a3SDarwin Rambo 307*4bded3a3SDarwin Rambo uint8_t *tmp_buf = msg->buf; 308*4bded3a3SDarwin Rambo 309*4bded3a3SDarwin Rambo while (bytes_read < msg->len) { 310*4bded3a3SDarwin Rambo if (msg->len - bytes_read <= MAX_RX_FIFO_SIZE) { 311*4bded3a3SDarwin Rambo last_byte_nak = 1; /* NAK last byte of transfer */ 312*4bded3a3SDarwin Rambo bytes_to_read = msg->len - bytes_read; 313*4bded3a3SDarwin Rambo } 314*4bded3a3SDarwin Rambo 315*4bded3a3SDarwin Rambo rc = bcm_kona_i2c_read_fifo_single(dev, tmp_buf, bytes_to_read, 316*4bded3a3SDarwin Rambo last_byte_nak); 317*4bded3a3SDarwin Rambo if (rc < 0) 318*4bded3a3SDarwin Rambo return -EREMOTEIO; 319*4bded3a3SDarwin Rambo 320*4bded3a3SDarwin Rambo bytes_read += bytes_to_read; 321*4bded3a3SDarwin Rambo tmp_buf += bytes_to_read; 322*4bded3a3SDarwin Rambo } 323*4bded3a3SDarwin Rambo 324*4bded3a3SDarwin Rambo return 0; 325*4bded3a3SDarwin Rambo } 326*4bded3a3SDarwin Rambo 327*4bded3a3SDarwin Rambo /* Write a single byte of data to the i2c bus */ 328*4bded3a3SDarwin Rambo static int bcm_kona_i2c_write_byte(struct bcm_kona_i2c_dev *dev, uint8_t data, 329*4bded3a3SDarwin Rambo unsigned int nak_expected) 330*4bded3a3SDarwin Rambo { 331*4bded3a3SDarwin Rambo unsigned long time_left = I2C_TIMEOUT; 332*4bded3a3SDarwin Rambo unsigned int nak_received; 333*4bded3a3SDarwin Rambo 334*4bded3a3SDarwin Rambo /* Clear pending session done interrupt */ 335*4bded3a3SDarwin Rambo writel(ISR_SES_DONE_MASK, dev->base + ISR_OFFSET); 336*4bded3a3SDarwin Rambo 337*4bded3a3SDarwin Rambo /* Send one byte of data */ 338*4bded3a3SDarwin Rambo writel(data, dev->base + DAT_OFFSET); 339*4bded3a3SDarwin Rambo 340*4bded3a3SDarwin Rambo time_left = wait_for_int_timeout(dev, time_left, IER_I2C_INT_EN_MASK); 341*4bded3a3SDarwin Rambo 342*4bded3a3SDarwin Rambo if (!time_left) { 343*4bded3a3SDarwin Rambo debug("controller timed out\n"); 344*4bded3a3SDarwin Rambo return -ETIMEDOUT; 345*4bded3a3SDarwin Rambo } 346*4bded3a3SDarwin Rambo 347*4bded3a3SDarwin Rambo nak_received = readl(dev->base + CS_OFFSET) & CS_ACK_MASK ? 1 : 0; 348*4bded3a3SDarwin Rambo 349*4bded3a3SDarwin Rambo if (nak_received ^ nak_expected) { 350*4bded3a3SDarwin Rambo debug("unexpected NAK/ACK\n"); 351*4bded3a3SDarwin Rambo return -EREMOTEIO; 352*4bded3a3SDarwin Rambo } 353*4bded3a3SDarwin Rambo 354*4bded3a3SDarwin Rambo return 0; 355*4bded3a3SDarwin Rambo } 356*4bded3a3SDarwin Rambo 357*4bded3a3SDarwin Rambo /* Write a single TX FIFO worth of data to the i2c bus */ 358*4bded3a3SDarwin Rambo static int bcm_kona_i2c_write_fifo_single(struct bcm_kona_i2c_dev *dev, 359*4bded3a3SDarwin Rambo uint8_t *buf, unsigned int len) 360*4bded3a3SDarwin Rambo { 361*4bded3a3SDarwin Rambo int k; 362*4bded3a3SDarwin Rambo unsigned long time_left = I2C_TIMEOUT; 363*4bded3a3SDarwin Rambo unsigned int fifo_status; 364*4bded3a3SDarwin Rambo 365*4bded3a3SDarwin Rambo /* Write data into FIFO */ 366*4bded3a3SDarwin Rambo for (k = 0; k < len; k++) 367*4bded3a3SDarwin Rambo writel(buf[k], (dev->base + DAT_OFFSET)); 368*4bded3a3SDarwin Rambo 369*4bded3a3SDarwin Rambo /* Wait for FIFO to empty */ 370*4bded3a3SDarwin Rambo do { 371*4bded3a3SDarwin Rambo time_left = 372*4bded3a3SDarwin Rambo wait_for_int_timeout(dev, time_left, 373*4bded3a3SDarwin Rambo (IER_FIFO_INT_EN_MASK | 374*4bded3a3SDarwin Rambo IER_NOACK_EN_MASK)); 375*4bded3a3SDarwin Rambo fifo_status = readl(dev->base + FIFO_STATUS_OFFSET); 376*4bded3a3SDarwin Rambo } while (time_left && !(fifo_status & FIFO_STATUS_TXFIFO_EMPTY_MASK)); 377*4bded3a3SDarwin Rambo 378*4bded3a3SDarwin Rambo /* Check if there was a NAK */ 379*4bded3a3SDarwin Rambo if (readl(dev->base + CS_OFFSET) & CS_ACK_MASK) { 380*4bded3a3SDarwin Rambo printf("unexpected NAK\n"); 381*4bded3a3SDarwin Rambo return -EREMOTEIO; 382*4bded3a3SDarwin Rambo } 383*4bded3a3SDarwin Rambo 384*4bded3a3SDarwin Rambo /* Check if a timeout occured */ 385*4bded3a3SDarwin Rambo if (!time_left) { 386*4bded3a3SDarwin Rambo printf("completion timed out\n"); 387*4bded3a3SDarwin Rambo return -EREMOTEIO; 388*4bded3a3SDarwin Rambo } 389*4bded3a3SDarwin Rambo 390*4bded3a3SDarwin Rambo return 0; 391*4bded3a3SDarwin Rambo } 392*4bded3a3SDarwin Rambo 393*4bded3a3SDarwin Rambo /* Write any amount of data using TX FIFO to the i2c bus */ 394*4bded3a3SDarwin Rambo static int bcm_kona_i2c_write_fifo(struct bcm_kona_i2c_dev *dev, 395*4bded3a3SDarwin Rambo struct i2c_msg *msg) 396*4bded3a3SDarwin Rambo { 397*4bded3a3SDarwin Rambo unsigned int bytes_to_write = MAX_TX_FIFO_SIZE; 398*4bded3a3SDarwin Rambo unsigned int bytes_written = 0; 399*4bded3a3SDarwin Rambo int rc; 400*4bded3a3SDarwin Rambo 401*4bded3a3SDarwin Rambo uint8_t *tmp_buf = msg->buf; 402*4bded3a3SDarwin Rambo 403*4bded3a3SDarwin Rambo while (bytes_written < msg->len) { 404*4bded3a3SDarwin Rambo if (msg->len - bytes_written <= MAX_TX_FIFO_SIZE) 405*4bded3a3SDarwin Rambo bytes_to_write = msg->len - bytes_written; 406*4bded3a3SDarwin Rambo 407*4bded3a3SDarwin Rambo rc = bcm_kona_i2c_write_fifo_single(dev, tmp_buf, 408*4bded3a3SDarwin Rambo bytes_to_write); 409*4bded3a3SDarwin Rambo if (rc < 0) 410*4bded3a3SDarwin Rambo return -EREMOTEIO; 411*4bded3a3SDarwin Rambo 412*4bded3a3SDarwin Rambo bytes_written += bytes_to_write; 413*4bded3a3SDarwin Rambo tmp_buf += bytes_to_write; 414*4bded3a3SDarwin Rambo } 415*4bded3a3SDarwin Rambo 416*4bded3a3SDarwin Rambo return 0; 417*4bded3a3SDarwin Rambo } 418*4bded3a3SDarwin Rambo 419*4bded3a3SDarwin Rambo /* Send i2c address */ 420*4bded3a3SDarwin Rambo static int bcm_kona_i2c_do_addr(struct bcm_kona_i2c_dev *dev, 421*4bded3a3SDarwin Rambo struct i2c_msg *msg) 422*4bded3a3SDarwin Rambo { 423*4bded3a3SDarwin Rambo unsigned char addr; 424*4bded3a3SDarwin Rambo 425*4bded3a3SDarwin Rambo if (msg->flags & I2C_M_TEN) { 426*4bded3a3SDarwin Rambo /* First byte is 11110XX0 where XX is upper 2 bits */ 427*4bded3a3SDarwin Rambo addr = 0xf0 | ((msg->addr & 0x300) >> 7); 428*4bded3a3SDarwin Rambo if (bcm_kona_i2c_write_byte(dev, addr, 0) < 0) 429*4bded3a3SDarwin Rambo return -EREMOTEIO; 430*4bded3a3SDarwin Rambo 431*4bded3a3SDarwin Rambo /* Second byte is the remaining 8 bits */ 432*4bded3a3SDarwin Rambo addr = msg->addr & 0xff; 433*4bded3a3SDarwin Rambo if (bcm_kona_i2c_write_byte(dev, addr, 0) < 0) 434*4bded3a3SDarwin Rambo return -EREMOTEIO; 435*4bded3a3SDarwin Rambo 436*4bded3a3SDarwin Rambo if (msg->flags & I2C_M_RD) { 437*4bded3a3SDarwin Rambo /* For read, send restart command */ 438*4bded3a3SDarwin Rambo if (bcm_kona_send_i2c_cmd(dev, BCM_CMD_RESTART) < 0) 439*4bded3a3SDarwin Rambo return -EREMOTEIO; 440*4bded3a3SDarwin Rambo 441*4bded3a3SDarwin Rambo /* Then re-send the first byte with the read bit set */ 442*4bded3a3SDarwin Rambo addr = 0xf0 | ((msg->addr & 0x300) >> 7) | 0x01; 443*4bded3a3SDarwin Rambo if (bcm_kona_i2c_write_byte(dev, addr, 0) < 0) 444*4bded3a3SDarwin Rambo return -EREMOTEIO; 445*4bded3a3SDarwin Rambo } 446*4bded3a3SDarwin Rambo } else { 447*4bded3a3SDarwin Rambo addr = msg->addr << 1; 448*4bded3a3SDarwin Rambo 449*4bded3a3SDarwin Rambo if (msg->flags & I2C_M_RD) 450*4bded3a3SDarwin Rambo addr |= 1; 451*4bded3a3SDarwin Rambo 452*4bded3a3SDarwin Rambo if (bcm_kona_i2c_write_byte(dev, addr, 0) < 0) 453*4bded3a3SDarwin Rambo return -EREMOTEIO; 454*4bded3a3SDarwin Rambo } 455*4bded3a3SDarwin Rambo 456*4bded3a3SDarwin Rambo return 0; 457*4bded3a3SDarwin Rambo } 458*4bded3a3SDarwin Rambo 459*4bded3a3SDarwin Rambo static void bcm_kona_i2c_enable_autosense(struct bcm_kona_i2c_dev *dev) 460*4bded3a3SDarwin Rambo { 461*4bded3a3SDarwin Rambo writel(readl(dev->base + CLKEN_OFFSET) & ~CLKEN_AUTOSENSE_OFF_MASK, 462*4bded3a3SDarwin Rambo dev->base + CLKEN_OFFSET); 463*4bded3a3SDarwin Rambo } 464*4bded3a3SDarwin Rambo 465*4bded3a3SDarwin Rambo static void bcm_kona_i2c_config_timing(struct bcm_kona_i2c_dev *dev) 466*4bded3a3SDarwin Rambo { 467*4bded3a3SDarwin Rambo writel(readl(dev->base + HSTIM_OFFSET) & ~HSTIM_HS_MODE_MASK, 468*4bded3a3SDarwin Rambo dev->base + HSTIM_OFFSET); 469*4bded3a3SDarwin Rambo 470*4bded3a3SDarwin Rambo writel((dev->std_cfg->prescale << TIM_PRESCALE_SHIFT) | 471*4bded3a3SDarwin Rambo (dev->std_cfg->time_p << TIM_P_SHIFT) | 472*4bded3a3SDarwin Rambo (dev->std_cfg->no_div << TIM_NO_DIV_SHIFT) | 473*4bded3a3SDarwin Rambo (dev->std_cfg->time_div << TIM_DIV_SHIFT), 474*4bded3a3SDarwin Rambo dev->base + TIM_OFFSET); 475*4bded3a3SDarwin Rambo 476*4bded3a3SDarwin Rambo writel((dev->std_cfg->time_m << CLKEN_M_SHIFT) | 477*4bded3a3SDarwin Rambo (dev->std_cfg->time_n << CLKEN_N_SHIFT) | 478*4bded3a3SDarwin Rambo CLKEN_CLKEN_MASK, dev->base + CLKEN_OFFSET); 479*4bded3a3SDarwin Rambo } 480*4bded3a3SDarwin Rambo 481*4bded3a3SDarwin Rambo /* Master transfer function */ 482*4bded3a3SDarwin Rambo static int bcm_kona_i2c_xfer(struct bcm_kona_i2c_dev *dev, 483*4bded3a3SDarwin Rambo struct i2c_msg msgs[], int num) 484*4bded3a3SDarwin Rambo { 485*4bded3a3SDarwin Rambo struct i2c_msg *pmsg; 486*4bded3a3SDarwin Rambo int rc = 0; 487*4bded3a3SDarwin Rambo int i; 488*4bded3a3SDarwin Rambo 489*4bded3a3SDarwin Rambo /* Enable pad output */ 490*4bded3a3SDarwin Rambo writel(0, dev->base + PADCTL_OFFSET); 491*4bded3a3SDarwin Rambo 492*4bded3a3SDarwin Rambo /* Enable internal clocks */ 493*4bded3a3SDarwin Rambo bcm_kona_i2c_enable_clock(dev); 494*4bded3a3SDarwin Rambo 495*4bded3a3SDarwin Rambo /* Send start command */ 496*4bded3a3SDarwin Rambo rc = bcm_kona_send_i2c_cmd(dev, BCM_CMD_START); 497*4bded3a3SDarwin Rambo if (rc < 0) { 498*4bded3a3SDarwin Rambo printf("Start command failed rc = %d\n", rc); 499*4bded3a3SDarwin Rambo goto xfer_disable_pad; 500*4bded3a3SDarwin Rambo } 501*4bded3a3SDarwin Rambo 502*4bded3a3SDarwin Rambo /* Loop through all messages */ 503*4bded3a3SDarwin Rambo for (i = 0; i < num; i++) { 504*4bded3a3SDarwin Rambo pmsg = &msgs[i]; 505*4bded3a3SDarwin Rambo 506*4bded3a3SDarwin Rambo /* Send restart for subsequent messages */ 507*4bded3a3SDarwin Rambo if ((i != 0) && ((pmsg->flags & I2C_M_NOSTART) == 0)) { 508*4bded3a3SDarwin Rambo rc = bcm_kona_send_i2c_cmd(dev, BCM_CMD_RESTART); 509*4bded3a3SDarwin Rambo if (rc < 0) { 510*4bded3a3SDarwin Rambo printf("restart cmd failed rc = %d\n", rc); 511*4bded3a3SDarwin Rambo goto xfer_send_stop; 512*4bded3a3SDarwin Rambo } 513*4bded3a3SDarwin Rambo } 514*4bded3a3SDarwin Rambo 515*4bded3a3SDarwin Rambo /* Send slave address */ 516*4bded3a3SDarwin Rambo if (!(pmsg->flags & I2C_M_NOSTART)) { 517*4bded3a3SDarwin Rambo rc = bcm_kona_i2c_do_addr(dev, pmsg); 518*4bded3a3SDarwin Rambo if (rc < 0) { 519*4bded3a3SDarwin Rambo debug("NAK from addr %2.2x msg#%d rc = %d\n", 520*4bded3a3SDarwin Rambo pmsg->addr, i, rc); 521*4bded3a3SDarwin Rambo goto xfer_send_stop; 522*4bded3a3SDarwin Rambo } 523*4bded3a3SDarwin Rambo } 524*4bded3a3SDarwin Rambo 525*4bded3a3SDarwin Rambo /* Perform data transfer */ 526*4bded3a3SDarwin Rambo if (pmsg->flags & I2C_M_RD) { 527*4bded3a3SDarwin Rambo rc = bcm_kona_i2c_read_fifo(dev, pmsg); 528*4bded3a3SDarwin Rambo if (rc < 0) { 529*4bded3a3SDarwin Rambo printf("read failure\n"); 530*4bded3a3SDarwin Rambo goto xfer_send_stop; 531*4bded3a3SDarwin Rambo } 532*4bded3a3SDarwin Rambo } else { 533*4bded3a3SDarwin Rambo rc = bcm_kona_i2c_write_fifo(dev, pmsg); 534*4bded3a3SDarwin Rambo if (rc < 0) { 535*4bded3a3SDarwin Rambo printf("write failure"); 536*4bded3a3SDarwin Rambo goto xfer_send_stop; 537*4bded3a3SDarwin Rambo } 538*4bded3a3SDarwin Rambo } 539*4bded3a3SDarwin Rambo } 540*4bded3a3SDarwin Rambo 541*4bded3a3SDarwin Rambo rc = num; 542*4bded3a3SDarwin Rambo 543*4bded3a3SDarwin Rambo xfer_send_stop: 544*4bded3a3SDarwin Rambo /* Send a STOP command */ 545*4bded3a3SDarwin Rambo bcm_kona_send_i2c_cmd(dev, BCM_CMD_STOP); 546*4bded3a3SDarwin Rambo 547*4bded3a3SDarwin Rambo xfer_disable_pad: 548*4bded3a3SDarwin Rambo /* Disable pad output */ 549*4bded3a3SDarwin Rambo writel(PADCTL_PAD_OUT_EN_MASK, dev->base + PADCTL_OFFSET); 550*4bded3a3SDarwin Rambo 551*4bded3a3SDarwin Rambo /* Stop internal clock */ 552*4bded3a3SDarwin Rambo bcm_kona_i2c_disable_clock(dev); 553*4bded3a3SDarwin Rambo 554*4bded3a3SDarwin Rambo return rc; 555*4bded3a3SDarwin Rambo } 556*4bded3a3SDarwin Rambo 557*4bded3a3SDarwin Rambo static uint bcm_kona_i2c_assign_bus_speed(struct bcm_kona_i2c_dev *dev, 558*4bded3a3SDarwin Rambo uint speed) 559*4bded3a3SDarwin Rambo { 560*4bded3a3SDarwin Rambo switch (speed) { 561*4bded3a3SDarwin Rambo case 100000: 562*4bded3a3SDarwin Rambo dev->std_cfg = &std_cfg_table[BCM_SPD_100K]; 563*4bded3a3SDarwin Rambo break; 564*4bded3a3SDarwin Rambo case 400000: 565*4bded3a3SDarwin Rambo dev->std_cfg = &std_cfg_table[BCM_SPD_400K]; 566*4bded3a3SDarwin Rambo break; 567*4bded3a3SDarwin Rambo case 1000000: 568*4bded3a3SDarwin Rambo dev->std_cfg = &std_cfg_table[BCM_SPD_1MHZ]; 569*4bded3a3SDarwin Rambo break; 570*4bded3a3SDarwin Rambo default: 571*4bded3a3SDarwin Rambo printf("%d hz bus speed not supported\n", speed); 572*4bded3a3SDarwin Rambo return -EINVAL; 573*4bded3a3SDarwin Rambo } 574*4bded3a3SDarwin Rambo dev->speed = speed; 575*4bded3a3SDarwin Rambo return 0; 576*4bded3a3SDarwin Rambo } 577*4bded3a3SDarwin Rambo 578*4bded3a3SDarwin Rambo static void bcm_kona_i2c_init(struct bcm_kona_i2c_dev *dev) 579*4bded3a3SDarwin Rambo { 580*4bded3a3SDarwin Rambo /* Parse bus speed */ 581*4bded3a3SDarwin Rambo bcm_kona_i2c_assign_bus_speed(dev, dev->speed); 582*4bded3a3SDarwin Rambo 583*4bded3a3SDarwin Rambo /* Enable internal clocks */ 584*4bded3a3SDarwin Rambo bcm_kona_i2c_enable_clock(dev); 585*4bded3a3SDarwin Rambo 586*4bded3a3SDarwin Rambo /* Configure internal dividers */ 587*4bded3a3SDarwin Rambo bcm_kona_i2c_config_timing(dev); 588*4bded3a3SDarwin Rambo 589*4bded3a3SDarwin Rambo /* Disable timeout */ 590*4bded3a3SDarwin Rambo writel(0, dev->base + TOUT_OFFSET); 591*4bded3a3SDarwin Rambo 592*4bded3a3SDarwin Rambo /* Enable autosense */ 593*4bded3a3SDarwin Rambo bcm_kona_i2c_enable_autosense(dev); 594*4bded3a3SDarwin Rambo 595*4bded3a3SDarwin Rambo /* Enable TX FIFO */ 596*4bded3a3SDarwin Rambo writel(TXFCR_FIFO_FLUSH_MASK | TXFCR_FIFO_EN_MASK, 597*4bded3a3SDarwin Rambo dev->base + TXFCR_OFFSET); 598*4bded3a3SDarwin Rambo 599*4bded3a3SDarwin Rambo /* Mask all interrupts */ 600*4bded3a3SDarwin Rambo writel(0, dev->base + IER_OFFSET); 601*4bded3a3SDarwin Rambo 602*4bded3a3SDarwin Rambo /* Clear all pending interrupts */ 603*4bded3a3SDarwin Rambo writel(ISR_CMDBUSY_MASK | 604*4bded3a3SDarwin Rambo ISR_READ_COMPLETE_MASK | 605*4bded3a3SDarwin Rambo ISR_SES_DONE_MASK | 606*4bded3a3SDarwin Rambo ISR_ERR_MASK | 607*4bded3a3SDarwin Rambo ISR_TXFIFOEMPTY_MASK | ISR_NOACK_MASK, dev->base + ISR_OFFSET); 608*4bded3a3SDarwin Rambo 609*4bded3a3SDarwin Rambo /* Enable the controller but leave it idle */ 610*4bded3a3SDarwin Rambo bcm_kona_i2c_send_cmd_to_ctrl(dev, BCM_CMD_NOACTION); 611*4bded3a3SDarwin Rambo 612*4bded3a3SDarwin Rambo /* Disable pad output */ 613*4bded3a3SDarwin Rambo writel(PADCTL_PAD_OUT_EN_MASK, dev->base + PADCTL_OFFSET); 614*4bded3a3SDarwin Rambo } 615*4bded3a3SDarwin Rambo 616*4bded3a3SDarwin Rambo /* 617*4bded3a3SDarwin Rambo * uboot layer 618*4bded3a3SDarwin Rambo */ 619*4bded3a3SDarwin Rambo struct bcm_kona_i2c_dev *kona_get_dev(struct i2c_adapter *adap) 620*4bded3a3SDarwin Rambo { 621*4bded3a3SDarwin Rambo return &g_i2c_devs[adap->hwadapnr]; 622*4bded3a3SDarwin Rambo } 623*4bded3a3SDarwin Rambo 624*4bded3a3SDarwin Rambo static void kona_i2c_init(struct i2c_adapter *adap, int speed, int slaveaddr) 625*4bded3a3SDarwin Rambo { 626*4bded3a3SDarwin Rambo struct bcm_kona_i2c_dev *dev = kona_get_dev(adap); 627*4bded3a3SDarwin Rambo 628*4bded3a3SDarwin Rambo if (clk_bsc_enable(dev->base)) 629*4bded3a3SDarwin Rambo return; 630*4bded3a3SDarwin Rambo 631*4bded3a3SDarwin Rambo bcm_kona_i2c_init(dev); 632*4bded3a3SDarwin Rambo } 633*4bded3a3SDarwin Rambo 634*4bded3a3SDarwin Rambo static int kona_i2c_read(struct i2c_adapter *adap, uchar chip, uint addr, 635*4bded3a3SDarwin Rambo int alen, uchar *buffer, int len) 636*4bded3a3SDarwin Rambo { 637*4bded3a3SDarwin Rambo /* msg[0] writes the addr, msg[1] reads the data */ 638*4bded3a3SDarwin Rambo struct i2c_msg msg[2]; 639*4bded3a3SDarwin Rambo unsigned char msgbuf0[64]; 640*4bded3a3SDarwin Rambo struct bcm_kona_i2c_dev *dev = kona_get_dev(adap); 641*4bded3a3SDarwin Rambo 642*4bded3a3SDarwin Rambo msg[0].addr = chip; 643*4bded3a3SDarwin Rambo msg[0].flags = 0; 644*4bded3a3SDarwin Rambo msg[0].len = 1; 645*4bded3a3SDarwin Rambo msg[0].buf = msgbuf0; /* msgbuf0 contains incrementing reg addr */ 646*4bded3a3SDarwin Rambo 647*4bded3a3SDarwin Rambo msg[1].addr = chip; 648*4bded3a3SDarwin Rambo msg[1].flags = I2C_M_RD; 649*4bded3a3SDarwin Rambo /* msg[1].buf dest ptr increments each read */ 650*4bded3a3SDarwin Rambo 651*4bded3a3SDarwin Rambo msgbuf0[0] = (unsigned char)addr; 652*4bded3a3SDarwin Rambo msg[1].buf = buffer; 653*4bded3a3SDarwin Rambo msg[1].len = len; 654*4bded3a3SDarwin Rambo if (bcm_kona_i2c_xfer(dev, msg, 2) < 0) { 655*4bded3a3SDarwin Rambo /* Sending 2 i2c messages */ 656*4bded3a3SDarwin Rambo kona_i2c_init(adap, adap->speed, adap->slaveaddr); 657*4bded3a3SDarwin Rambo debug("I2C read: I/O error\n"); 658*4bded3a3SDarwin Rambo return -EIO; 659*4bded3a3SDarwin Rambo } 660*4bded3a3SDarwin Rambo return 0; 661*4bded3a3SDarwin Rambo } 662*4bded3a3SDarwin Rambo 663*4bded3a3SDarwin Rambo static int kona_i2c_write(struct i2c_adapter *adap, uchar chip, uint addr, 664*4bded3a3SDarwin Rambo int alen, uchar *buffer, int len) 665*4bded3a3SDarwin Rambo { 666*4bded3a3SDarwin Rambo struct i2c_msg msg[0]; 667*4bded3a3SDarwin Rambo unsigned char msgbuf0[64]; 668*4bded3a3SDarwin Rambo unsigned int i; 669*4bded3a3SDarwin Rambo struct bcm_kona_i2c_dev *dev = kona_get_dev(adap); 670*4bded3a3SDarwin Rambo 671*4bded3a3SDarwin Rambo msg[0].addr = chip; 672*4bded3a3SDarwin Rambo msg[0].flags = 0; 673*4bded3a3SDarwin Rambo msg[0].len = 2; /* addr byte plus data */ 674*4bded3a3SDarwin Rambo msg[0].buf = msgbuf0; 675*4bded3a3SDarwin Rambo 676*4bded3a3SDarwin Rambo for (i = 0; i < len; i++) { 677*4bded3a3SDarwin Rambo msgbuf0[0] = addr++; 678*4bded3a3SDarwin Rambo msgbuf0[1] = buffer[i]; 679*4bded3a3SDarwin Rambo if (bcm_kona_i2c_xfer(dev, msg, 1) < 0) { 680*4bded3a3SDarwin Rambo kona_i2c_init(adap, adap->speed, adap->slaveaddr); 681*4bded3a3SDarwin Rambo debug("I2C write: I/O error\n"); 682*4bded3a3SDarwin Rambo return -EIO; 683*4bded3a3SDarwin Rambo } 684*4bded3a3SDarwin Rambo } 685*4bded3a3SDarwin Rambo return 0; 686*4bded3a3SDarwin Rambo } 687*4bded3a3SDarwin Rambo 688*4bded3a3SDarwin Rambo static int kona_i2c_probe(struct i2c_adapter *adap, uchar chip) 689*4bded3a3SDarwin Rambo { 690*4bded3a3SDarwin Rambo uchar tmp; 691*4bded3a3SDarwin Rambo 692*4bded3a3SDarwin Rambo /* 693*4bded3a3SDarwin Rambo * read addr 0x0 of the given chip. 694*4bded3a3SDarwin Rambo */ 695*4bded3a3SDarwin Rambo return kona_i2c_read(adap, chip, 0x0, 1, &tmp, 1); 696*4bded3a3SDarwin Rambo } 697*4bded3a3SDarwin Rambo 698*4bded3a3SDarwin Rambo static uint kona_i2c_set_bus_speed(struct i2c_adapter *adap, uint speed) 699*4bded3a3SDarwin Rambo { 700*4bded3a3SDarwin Rambo struct bcm_kona_i2c_dev *dev = kona_get_dev(adap); 701*4bded3a3SDarwin Rambo return bcm_kona_i2c_assign_bus_speed(dev, speed); 702*4bded3a3SDarwin Rambo } 703*4bded3a3SDarwin Rambo 704*4bded3a3SDarwin Rambo /* 705*4bded3a3SDarwin Rambo * Register kona i2c adapters. Keep the order below so 706*4bded3a3SDarwin Rambo * that the bus number matches the adapter number. 707*4bded3a3SDarwin Rambo */ 708*4bded3a3SDarwin Rambo #define DEF_ADAPTER(num) \ 709*4bded3a3SDarwin Rambo U_BOOT_I2C_ADAP_COMPLETE(kona##num, kona_i2c_init, kona_i2c_probe, \ 710*4bded3a3SDarwin Rambo kona_i2c_read, kona_i2c_write, \ 711*4bded3a3SDarwin Rambo kona_i2c_set_bus_speed, DEF_SPD, 0x00, num) 712*4bded3a3SDarwin Rambo 713*4bded3a3SDarwin Rambo #ifdef CONFIG_SYS_I2C_BASE0 714*4bded3a3SDarwin Rambo DEF_ADAPTER(0) 715*4bded3a3SDarwin Rambo #endif 716*4bded3a3SDarwin Rambo #ifdef CONFIG_SYS_I2C_BASE1 717*4bded3a3SDarwin Rambo DEF_ADAPTER(1) 718*4bded3a3SDarwin Rambo #endif 719*4bded3a3SDarwin Rambo #ifdef CONFIG_SYS_I2C_BASE2 720*4bded3a3SDarwin Rambo DEF_ADAPTER(2) 721*4bded3a3SDarwin Rambo #endif 722*4bded3a3SDarwin Rambo #ifdef CONFIG_SYS_I2C_BASE3 723*4bded3a3SDarwin Rambo DEF_ADAPTER(3) 724*4bded3a3SDarwin Rambo #endif 725*4bded3a3SDarwin Rambo #ifdef CONFIG_SYS_I2C_BASE4 726*4bded3a3SDarwin Rambo DEF_ADAPTER(4) 727*4bded3a3SDarwin Rambo #endif 728*4bded3a3SDarwin Rambo #ifdef CONFIG_SYS_I2C_BASE5 729*4bded3a3SDarwin Rambo DEF_ADAPTER(5) 730*4bded3a3SDarwin Rambo #endif 731