1*68af512aSJan Glauber /* 2*68af512aSJan Glauber * (C) Copyright 2009-2010 3*68af512aSJan Glauber * Nokia Siemens Networks, michael.lawnick.ext@nsn.com 4*68af512aSJan Glauber * 5*68af512aSJan Glauber * Portions Copyright (C) 2010 - 2016 Cavium, Inc. 6*68af512aSJan Glauber * 7*68af512aSJan Glauber * This is a driver for the i2c adapter in Cavium Networks' OCTEON processors. 8*68af512aSJan Glauber * 9*68af512aSJan Glauber * This file is licensed under the terms of the GNU General Public 10*68af512aSJan Glauber * License version 2. This program is licensed "as is" without any 11*68af512aSJan Glauber * warranty of any kind, whether express or implied. 12*68af512aSJan Glauber */ 13*68af512aSJan Glauber 14*68af512aSJan Glauber #include <linux/atomic.h> 15*68af512aSJan Glauber #include <linux/platform_device.h> 16*68af512aSJan Glauber #include <linux/interrupt.h> 17*68af512aSJan Glauber #include <linux/kernel.h> 18*68af512aSJan Glauber #include <linux/module.h> 19*68af512aSJan Glauber #include <linux/delay.h> 20*68af512aSJan Glauber #include <linux/sched.h> 21*68af512aSJan Glauber #include <linux/slab.h> 22*68af512aSJan Glauber #include <linux/i2c.h> 23*68af512aSJan Glauber #include <linux/io.h> 24*68af512aSJan Glauber #include <linux/of.h> 25*68af512aSJan Glauber 26*68af512aSJan Glauber #include <asm/octeon/octeon.h> 27*68af512aSJan Glauber 28*68af512aSJan Glauber #define DRV_NAME "i2c-octeon" 29*68af512aSJan Glauber 30*68af512aSJan Glauber /* Register offsets */ 31*68af512aSJan Glauber #define SW_TWSI 0x00 32*68af512aSJan Glauber #define TWSI_INT 0x10 33*68af512aSJan Glauber #define SW_TWSI_EXT 0x18 34*68af512aSJan Glauber 35*68af512aSJan Glauber /* Controller command patterns */ 36*68af512aSJan Glauber #define SW_TWSI_V BIT_ULL(63) /* Valid bit */ 37*68af512aSJan Glauber #define SW_TWSI_EIA BIT_ULL(61) /* Extended internal address */ 38*68af512aSJan Glauber #define SW_TWSI_R BIT_ULL(56) /* Result or read bit */ 39*68af512aSJan Glauber #define SW_TWSI_SOVR BIT_ULL(55) /* Size override */ 40*68af512aSJan Glauber #define SW_TWSI_SIZE_SHIFT 52 41*68af512aSJan Glauber #define SW_TWSI_ADDR_SHIFT 40 42*68af512aSJan Glauber #define SW_TWSI_IA_SHIFT 32 /* Internal address */ 43*68af512aSJan Glauber 44*68af512aSJan Glauber /* Controller opcode word (bits 60:57) */ 45*68af512aSJan Glauber #define SW_TWSI_OP_SHIFT 57 46*68af512aSJan Glauber #define SW_TWSI_OP_7 (0ULL << SW_TWSI_OP_SHIFT) 47*68af512aSJan Glauber #define SW_TWSI_OP_7_IA (1ULL << SW_TWSI_OP_SHIFT) 48*68af512aSJan Glauber #define SW_TWSI_OP_10 (2ULL << SW_TWSI_OP_SHIFT) 49*68af512aSJan Glauber #define SW_TWSI_OP_10_IA (3ULL << SW_TWSI_OP_SHIFT) 50*68af512aSJan Glauber #define SW_TWSI_OP_TWSI_CLK (4ULL << SW_TWSI_OP_SHIFT) 51*68af512aSJan Glauber #define SW_TWSI_OP_EOP (6ULL << SW_TWSI_OP_SHIFT) /* Extended opcode */ 52*68af512aSJan Glauber 53*68af512aSJan Glauber /* Controller extended opcode word (bits 34:32) */ 54*68af512aSJan Glauber #define SW_TWSI_EOP_SHIFT 32 55*68af512aSJan Glauber #define SW_TWSI_EOP_TWSI_DATA (SW_TWSI_OP_EOP | 1ULL << SW_TWSI_EOP_SHIFT) 56*68af512aSJan Glauber #define SW_TWSI_EOP_TWSI_CTL (SW_TWSI_OP_EOP | 2ULL << SW_TWSI_EOP_SHIFT) 57*68af512aSJan Glauber #define SW_TWSI_EOP_TWSI_CLKCTL (SW_TWSI_OP_EOP | 3ULL << SW_TWSI_EOP_SHIFT) 58*68af512aSJan Glauber #define SW_TWSI_EOP_TWSI_STAT (SW_TWSI_OP_EOP | 3ULL << SW_TWSI_EOP_SHIFT) 59*68af512aSJan Glauber #define SW_TWSI_EOP_TWSI_RST (SW_TWSI_OP_EOP | 7ULL << SW_TWSI_EOP_SHIFT) 60*68af512aSJan Glauber 61*68af512aSJan Glauber /* Controller command and status bits */ 62*68af512aSJan Glauber #define TWSI_CTL_CE 0x80 /* High level controller enable */ 63*68af512aSJan Glauber #define TWSI_CTL_ENAB 0x40 /* Bus enable */ 64*68af512aSJan Glauber #define TWSI_CTL_STA 0x20 /* Master-mode start, HW clears when done */ 65*68af512aSJan Glauber #define TWSI_CTL_STP 0x10 /* Master-mode stop, HW clears when done */ 66*68af512aSJan Glauber #define TWSI_CTL_IFLG 0x08 /* HW event, SW writes 0 to ACK */ 67*68af512aSJan Glauber #define TWSI_CTL_AAK 0x04 /* Assert ACK */ 68*68af512aSJan Glauber 69*68af512aSJan Glauber /* Status values */ 70*68af512aSJan Glauber #define STAT_ERROR 0x00 71*68af512aSJan Glauber #define STAT_START 0x08 72*68af512aSJan Glauber #define STAT_REP_START 0x10 73*68af512aSJan Glauber #define STAT_TXADDR_ACK 0x18 74*68af512aSJan Glauber #define STAT_TXADDR_NAK 0x20 75*68af512aSJan Glauber #define STAT_TXDATA_ACK 0x28 76*68af512aSJan Glauber #define STAT_TXDATA_NAK 0x30 77*68af512aSJan Glauber #define STAT_LOST_ARB_38 0x38 78*68af512aSJan Glauber #define STAT_RXADDR_ACK 0x40 79*68af512aSJan Glauber #define STAT_RXADDR_NAK 0x48 80*68af512aSJan Glauber #define STAT_RXDATA_ACK 0x50 81*68af512aSJan Glauber #define STAT_RXDATA_NAK 0x58 82*68af512aSJan Glauber #define STAT_SLAVE_60 0x60 83*68af512aSJan Glauber #define STAT_LOST_ARB_68 0x68 84*68af512aSJan Glauber #define STAT_SLAVE_70 0x70 85*68af512aSJan Glauber #define STAT_LOST_ARB_78 0x78 86*68af512aSJan Glauber #define STAT_SLAVE_80 0x80 87*68af512aSJan Glauber #define STAT_SLAVE_88 0x88 88*68af512aSJan Glauber #define STAT_GENDATA_ACK 0x90 89*68af512aSJan Glauber #define STAT_GENDATA_NAK 0x98 90*68af512aSJan Glauber #define STAT_SLAVE_A0 0xA0 91*68af512aSJan Glauber #define STAT_SLAVE_A8 0xA8 92*68af512aSJan Glauber #define STAT_LOST_ARB_B0 0xB0 93*68af512aSJan Glauber #define STAT_SLAVE_LOST 0xB8 94*68af512aSJan Glauber #define STAT_SLAVE_NAK 0xC0 95*68af512aSJan Glauber #define STAT_SLAVE_ACK 0xC8 96*68af512aSJan Glauber #define STAT_AD2W_ACK 0xD0 97*68af512aSJan Glauber #define STAT_AD2W_NAK 0xD8 98*68af512aSJan Glauber #define STAT_IDLE 0xF8 99*68af512aSJan Glauber 100*68af512aSJan Glauber /* TWSI_INT values */ 101*68af512aSJan Glauber #define TWSI_INT_ST_INT BIT_ULL(0) 102*68af512aSJan Glauber #define TWSI_INT_TS_INT BIT_ULL(1) 103*68af512aSJan Glauber #define TWSI_INT_CORE_INT BIT_ULL(2) 104*68af512aSJan Glauber #define TWSI_INT_ST_EN BIT_ULL(4) 105*68af512aSJan Glauber #define TWSI_INT_TS_EN BIT_ULL(5) 106*68af512aSJan Glauber #define TWSI_INT_CORE_EN BIT_ULL(6) 107*68af512aSJan Glauber #define TWSI_INT_SDA_OVR BIT_ULL(8) 108*68af512aSJan Glauber #define TWSI_INT_SCL_OVR BIT_ULL(9) 109*68af512aSJan Glauber #define TWSI_INT_SDA BIT_ULL(10) 110*68af512aSJan Glauber #define TWSI_INT_SCL BIT_ULL(11) 111*68af512aSJan Glauber 112*68af512aSJan Glauber #define I2C_OCTEON_EVENT_WAIT 80 /* microseconds */ 113*68af512aSJan Glauber 114*68af512aSJan Glauber struct octeon_i2c { 115*68af512aSJan Glauber wait_queue_head_t queue; 116*68af512aSJan Glauber struct i2c_adapter adap; 117*68af512aSJan Glauber int irq; 118*68af512aSJan Glauber int hlc_irq; /* For cn7890 only */ 119*68af512aSJan Glauber u32 twsi_freq; 120*68af512aSJan Glauber int sys_freq; 121*68af512aSJan Glauber void __iomem *twsi_base; 122*68af512aSJan Glauber struct device *dev; 123*68af512aSJan Glauber bool hlc_enabled; 124*68af512aSJan Glauber bool broken_irq_mode; 125*68af512aSJan Glauber bool broken_irq_check; 126*68af512aSJan Glauber void (*int_enable)(struct octeon_i2c *); 127*68af512aSJan Glauber void (*int_disable)(struct octeon_i2c *); 128*68af512aSJan Glauber void (*hlc_int_enable)(struct octeon_i2c *); 129*68af512aSJan Glauber void (*hlc_int_disable)(struct octeon_i2c *); 130*68af512aSJan Glauber atomic_t int_enable_cnt; 131*68af512aSJan Glauber atomic_t hlc_int_enable_cnt; 132*68af512aSJan Glauber }; 133*68af512aSJan Glauber 134*68af512aSJan Glauber static void octeon_i2c_writeq_flush(u64 val, void __iomem *addr) 135*68af512aSJan Glauber { 136*68af512aSJan Glauber __raw_writeq(val, addr); 137*68af512aSJan Glauber __raw_readq(addr); /* wait for write to land */ 138*68af512aSJan Glauber } 139*68af512aSJan Glauber 140*68af512aSJan Glauber /** 141*68af512aSJan Glauber * octeon_i2c_reg_write - write an I2C core register 142*68af512aSJan Glauber * @i2c: The struct octeon_i2c 143*68af512aSJan Glauber * @eop_reg: Register selector 144*68af512aSJan Glauber * @data: Value to be written 145*68af512aSJan Glauber * 146*68af512aSJan Glauber * The I2C core registers are accessed indirectly via the SW_TWSI CSR. 147*68af512aSJan Glauber */ 148*68af512aSJan Glauber static void octeon_i2c_reg_write(struct octeon_i2c *i2c, u64 eop_reg, u8 data) 149*68af512aSJan Glauber { 150*68af512aSJan Glauber u64 tmp; 151*68af512aSJan Glauber 152*68af512aSJan Glauber __raw_writeq(SW_TWSI_V | eop_reg | data, i2c->twsi_base + SW_TWSI); 153*68af512aSJan Glauber do { 154*68af512aSJan Glauber tmp = __raw_readq(i2c->twsi_base + SW_TWSI); 155*68af512aSJan Glauber } while ((tmp & SW_TWSI_V) != 0); 156*68af512aSJan Glauber } 157*68af512aSJan Glauber 158*68af512aSJan Glauber #define octeon_i2c_ctl_write(i2c, val) \ 159*68af512aSJan Glauber octeon_i2c_reg_write(i2c, SW_TWSI_EOP_TWSI_CTL, val) 160*68af512aSJan Glauber #define octeon_i2c_data_write(i2c, val) \ 161*68af512aSJan Glauber octeon_i2c_reg_write(i2c, SW_TWSI_EOP_TWSI_DATA, val) 162*68af512aSJan Glauber 163*68af512aSJan Glauber /** 164*68af512aSJan Glauber * octeon_i2c_reg_read - read lower bits of an I2C core register 165*68af512aSJan Glauber * @i2c: The struct octeon_i2c 166*68af512aSJan Glauber * @eop_reg: Register selector 167*68af512aSJan Glauber * 168*68af512aSJan Glauber * Returns the data. 169*68af512aSJan Glauber * 170*68af512aSJan Glauber * The I2C core registers are accessed indirectly via the SW_TWSI CSR. 171*68af512aSJan Glauber */ 172*68af512aSJan Glauber static u8 octeon_i2c_reg_read(struct octeon_i2c *i2c, u64 eop_reg) 173*68af512aSJan Glauber { 174*68af512aSJan Glauber u64 tmp; 175*68af512aSJan Glauber 176*68af512aSJan Glauber __raw_writeq(SW_TWSI_V | eop_reg | SW_TWSI_R, i2c->twsi_base + SW_TWSI); 177*68af512aSJan Glauber do { 178*68af512aSJan Glauber tmp = __raw_readq(i2c->twsi_base + SW_TWSI); 179*68af512aSJan Glauber } while ((tmp & SW_TWSI_V) != 0); 180*68af512aSJan Glauber 181*68af512aSJan Glauber return tmp & 0xFF; 182*68af512aSJan Glauber } 183*68af512aSJan Glauber 184*68af512aSJan Glauber #define octeon_i2c_ctl_read(i2c) \ 185*68af512aSJan Glauber octeon_i2c_reg_read(i2c, SW_TWSI_EOP_TWSI_CTL) 186*68af512aSJan Glauber #define octeon_i2c_data_read(i2c) \ 187*68af512aSJan Glauber octeon_i2c_reg_read(i2c, SW_TWSI_EOP_TWSI_DATA) 188*68af512aSJan Glauber #define octeon_i2c_stat_read(i2c) \ 189*68af512aSJan Glauber octeon_i2c_reg_read(i2c, SW_TWSI_EOP_TWSI_STAT) 190*68af512aSJan Glauber 191*68af512aSJan Glauber /** 192*68af512aSJan Glauber * octeon_i2c_read_int - read the TWSI_INT register 193*68af512aSJan Glauber * @i2c: The struct octeon_i2c 194*68af512aSJan Glauber * 195*68af512aSJan Glauber * Returns the value of the register. 196*68af512aSJan Glauber */ 197*68af512aSJan Glauber static u64 octeon_i2c_read_int(struct octeon_i2c *i2c) 198*68af512aSJan Glauber { 199*68af512aSJan Glauber return __raw_readq(i2c->twsi_base + TWSI_INT); 200*68af512aSJan Glauber } 201*68af512aSJan Glauber 202*68af512aSJan Glauber /** 203*68af512aSJan Glauber * octeon_i2c_write_int - write the TWSI_INT register 204*68af512aSJan Glauber * @i2c: The struct octeon_i2c 205*68af512aSJan Glauber * @data: Value to be written 206*68af512aSJan Glauber */ 207*68af512aSJan Glauber static void octeon_i2c_write_int(struct octeon_i2c *i2c, u64 data) 208*68af512aSJan Glauber { 209*68af512aSJan Glauber octeon_i2c_writeq_flush(data, i2c->twsi_base + TWSI_INT); 210*68af512aSJan Glauber } 211*68af512aSJan Glauber 212*68af512aSJan Glauber /** 213*68af512aSJan Glauber * octeon_i2c_int_enable - enable the CORE interrupt 214*68af512aSJan Glauber * @i2c: The struct octeon_i2c 215*68af512aSJan Glauber * 216*68af512aSJan Glauber * The interrupt will be asserted when there is non-STAT_IDLE state in 217*68af512aSJan Glauber * the SW_TWSI_EOP_TWSI_STAT register. 218*68af512aSJan Glauber */ 219*68af512aSJan Glauber static void octeon_i2c_int_enable(struct octeon_i2c *i2c) 220*68af512aSJan Glauber { 221*68af512aSJan Glauber octeon_i2c_write_int(i2c, TWSI_INT_CORE_EN); 222*68af512aSJan Glauber } 223*68af512aSJan Glauber 224*68af512aSJan Glauber /* disable the CORE interrupt */ 225*68af512aSJan Glauber static void octeon_i2c_int_disable(struct octeon_i2c *i2c) 226*68af512aSJan Glauber { 227*68af512aSJan Glauber /* clear TS/ST/IFLG events */ 228*68af512aSJan Glauber octeon_i2c_write_int(i2c, 0); 229*68af512aSJan Glauber } 230*68af512aSJan Glauber 231*68af512aSJan Glauber /** 232*68af512aSJan Glauber * octeon_i2c_int_enable78 - enable the CORE interrupt 233*68af512aSJan Glauber * @i2c: The struct octeon_i2c 234*68af512aSJan Glauber * 235*68af512aSJan Glauber * The interrupt will be asserted when there is non-STAT_IDLE state in the 236*68af512aSJan Glauber * SW_TWSI_EOP_TWSI_STAT register. 237*68af512aSJan Glauber */ 238*68af512aSJan Glauber static void octeon_i2c_int_enable78(struct octeon_i2c *i2c) 239*68af512aSJan Glauber { 240*68af512aSJan Glauber atomic_inc_return(&i2c->int_enable_cnt); 241*68af512aSJan Glauber enable_irq(i2c->irq); 242*68af512aSJan Glauber } 243*68af512aSJan Glauber 244*68af512aSJan Glauber static void __octeon_i2c_irq_disable(atomic_t *cnt, int irq) 245*68af512aSJan Glauber { 246*68af512aSJan Glauber int count; 247*68af512aSJan Glauber 248*68af512aSJan Glauber /* 249*68af512aSJan Glauber * The interrupt can be disabled in two places, but we only 250*68af512aSJan Glauber * want to make the disable_irq_nosync() call once, so keep 251*68af512aSJan Glauber * track with the atomic variable. 252*68af512aSJan Glauber */ 253*68af512aSJan Glauber count = atomic_dec_if_positive(cnt); 254*68af512aSJan Glauber if (count >= 0) 255*68af512aSJan Glauber disable_irq_nosync(irq); 256*68af512aSJan Glauber } 257*68af512aSJan Glauber 258*68af512aSJan Glauber /* disable the CORE interrupt */ 259*68af512aSJan Glauber static void octeon_i2c_int_disable78(struct octeon_i2c *i2c) 260*68af512aSJan Glauber { 261*68af512aSJan Glauber __octeon_i2c_irq_disable(&i2c->int_enable_cnt, i2c->irq); 262*68af512aSJan Glauber } 263*68af512aSJan Glauber 264*68af512aSJan Glauber /** 265*68af512aSJan Glauber * octeon_i2c_hlc_int_enable78 - enable the ST interrupt 266*68af512aSJan Glauber * @i2c: The struct octeon_i2c 267*68af512aSJan Glauber * 268*68af512aSJan Glauber * The interrupt will be asserted when there is non-STAT_IDLE state in 269*68af512aSJan Glauber * the SW_TWSI_EOP_TWSI_STAT register. 270*68af512aSJan Glauber */ 271*68af512aSJan Glauber static void octeon_i2c_hlc_int_enable78(struct octeon_i2c *i2c) 272*68af512aSJan Glauber { 273*68af512aSJan Glauber atomic_inc_return(&i2c->hlc_int_enable_cnt); 274*68af512aSJan Glauber enable_irq(i2c->hlc_irq); 275*68af512aSJan Glauber } 276*68af512aSJan Glauber 277*68af512aSJan Glauber /* disable the ST interrupt */ 278*68af512aSJan Glauber static void octeon_i2c_hlc_int_disable78(struct octeon_i2c *i2c) 279*68af512aSJan Glauber { 280*68af512aSJan Glauber __octeon_i2c_irq_disable(&i2c->hlc_int_enable_cnt, i2c->hlc_irq); 281*68af512aSJan Glauber } 282*68af512aSJan Glauber 283*68af512aSJan Glauber /* 284*68af512aSJan Glauber * Cleanup low-level state & enable high-level controller. 285*68af512aSJan Glauber */ 286*68af512aSJan Glauber static void octeon_i2c_hlc_enable(struct octeon_i2c *i2c) 287*68af512aSJan Glauber { 288*68af512aSJan Glauber int try = 0; 289*68af512aSJan Glauber u64 val; 290*68af512aSJan Glauber 291*68af512aSJan Glauber if (i2c->hlc_enabled) 292*68af512aSJan Glauber return; 293*68af512aSJan Glauber i2c->hlc_enabled = true; 294*68af512aSJan Glauber 295*68af512aSJan Glauber while (1) { 296*68af512aSJan Glauber val = octeon_i2c_ctl_read(i2c); 297*68af512aSJan Glauber if (!(val & (TWSI_CTL_STA | TWSI_CTL_STP))) 298*68af512aSJan Glauber break; 299*68af512aSJan Glauber 300*68af512aSJan Glauber /* clear IFLG event */ 301*68af512aSJan Glauber if (val & TWSI_CTL_IFLG) 302*68af512aSJan Glauber octeon_i2c_ctl_write(i2c, TWSI_CTL_ENAB); 303*68af512aSJan Glauber 304*68af512aSJan Glauber if (try++ > 100) { 305*68af512aSJan Glauber pr_err("%s: giving up\n", __func__); 306*68af512aSJan Glauber break; 307*68af512aSJan Glauber } 308*68af512aSJan Glauber 309*68af512aSJan Glauber /* spin until any start/stop has finished */ 310*68af512aSJan Glauber udelay(10); 311*68af512aSJan Glauber } 312*68af512aSJan Glauber octeon_i2c_ctl_write(i2c, TWSI_CTL_CE | TWSI_CTL_AAK | TWSI_CTL_ENAB); 313*68af512aSJan Glauber } 314*68af512aSJan Glauber 315*68af512aSJan Glauber static void octeon_i2c_hlc_disable(struct octeon_i2c *i2c) 316*68af512aSJan Glauber { 317*68af512aSJan Glauber if (!i2c->hlc_enabled) 318*68af512aSJan Glauber return; 319*68af512aSJan Glauber 320*68af512aSJan Glauber i2c->hlc_enabled = false; 321*68af512aSJan Glauber octeon_i2c_ctl_write(i2c, TWSI_CTL_ENAB); 322*68af512aSJan Glauber } 323*68af512aSJan Glauber 324*68af512aSJan Glauber /* interrupt service routine */ 325*68af512aSJan Glauber static irqreturn_t octeon_i2c_isr(int irq, void *dev_id) 326*68af512aSJan Glauber { 327*68af512aSJan Glauber struct octeon_i2c *i2c = dev_id; 328*68af512aSJan Glauber 329*68af512aSJan Glauber i2c->int_disable(i2c); 330*68af512aSJan Glauber wake_up(&i2c->queue); 331*68af512aSJan Glauber 332*68af512aSJan Glauber return IRQ_HANDLED; 333*68af512aSJan Glauber } 334*68af512aSJan Glauber 335*68af512aSJan Glauber /* HLC interrupt service routine */ 336*68af512aSJan Glauber static irqreturn_t octeon_i2c_hlc_isr78(int irq, void *dev_id) 337*68af512aSJan Glauber { 338*68af512aSJan Glauber struct octeon_i2c *i2c = dev_id; 339*68af512aSJan Glauber 340*68af512aSJan Glauber i2c->hlc_int_disable(i2c); 341*68af512aSJan Glauber wake_up(&i2c->queue); 342*68af512aSJan Glauber 343*68af512aSJan Glauber return IRQ_HANDLED; 344*68af512aSJan Glauber } 345*68af512aSJan Glauber 346*68af512aSJan Glauber static bool octeon_i2c_test_iflg(struct octeon_i2c *i2c) 347*68af512aSJan Glauber { 348*68af512aSJan Glauber return (octeon_i2c_ctl_read(i2c) & TWSI_CTL_IFLG); 349*68af512aSJan Glauber } 350*68af512aSJan Glauber 351*68af512aSJan Glauber static bool octeon_i2c_test_ready(struct octeon_i2c *i2c, bool *first) 352*68af512aSJan Glauber { 353*68af512aSJan Glauber if (octeon_i2c_test_iflg(i2c)) 354*68af512aSJan Glauber return true; 355*68af512aSJan Glauber 356*68af512aSJan Glauber if (*first) { 357*68af512aSJan Glauber *first = false; 358*68af512aSJan Glauber return false; 359*68af512aSJan Glauber } 360*68af512aSJan Glauber 361*68af512aSJan Glauber /* 362*68af512aSJan Glauber * IRQ has signaled an event but IFLG hasn't changed. 363*68af512aSJan Glauber * Sleep and retry once. 364*68af512aSJan Glauber */ 365*68af512aSJan Glauber usleep_range(I2C_OCTEON_EVENT_WAIT, 2 * I2C_OCTEON_EVENT_WAIT); 366*68af512aSJan Glauber return octeon_i2c_test_iflg(i2c); 367*68af512aSJan Glauber } 368*68af512aSJan Glauber 369*68af512aSJan Glauber /** 370*68af512aSJan Glauber * octeon_i2c_wait - wait for the IFLG to be set 371*68af512aSJan Glauber * @i2c: The struct octeon_i2c 372*68af512aSJan Glauber * 373*68af512aSJan Glauber * Returns 0 on success, otherwise a negative errno. 374*68af512aSJan Glauber */ 375*68af512aSJan Glauber static int octeon_i2c_wait(struct octeon_i2c *i2c) 376*68af512aSJan Glauber { 377*68af512aSJan Glauber long time_left; 378*68af512aSJan Glauber bool first = 1; 379*68af512aSJan Glauber 380*68af512aSJan Glauber /* 381*68af512aSJan Glauber * Some chip revisions don't assert the irq in the interrupt 382*68af512aSJan Glauber * controller. So we must poll for the IFLG change. 383*68af512aSJan Glauber */ 384*68af512aSJan Glauber if (i2c->broken_irq_mode) { 385*68af512aSJan Glauber u64 end = get_jiffies_64() + i2c->adap.timeout; 386*68af512aSJan Glauber 387*68af512aSJan Glauber while (!octeon_i2c_test_iflg(i2c) && 388*68af512aSJan Glauber time_before64(get_jiffies_64(), end)) 389*68af512aSJan Glauber usleep_range(I2C_OCTEON_EVENT_WAIT / 2, I2C_OCTEON_EVENT_WAIT); 390*68af512aSJan Glauber 391*68af512aSJan Glauber return octeon_i2c_test_iflg(i2c) ? 0 : -ETIMEDOUT; 392*68af512aSJan Glauber } 393*68af512aSJan Glauber 394*68af512aSJan Glauber i2c->int_enable(i2c); 395*68af512aSJan Glauber time_left = wait_event_timeout(i2c->queue, octeon_i2c_test_ready(i2c, &first), 396*68af512aSJan Glauber i2c->adap.timeout); 397*68af512aSJan Glauber i2c->int_disable(i2c); 398*68af512aSJan Glauber 399*68af512aSJan Glauber if (i2c->broken_irq_check && !time_left && 400*68af512aSJan Glauber octeon_i2c_test_iflg(i2c)) { 401*68af512aSJan Glauber dev_err(i2c->dev, "broken irq connection detected, switching to polling mode.\n"); 402*68af512aSJan Glauber i2c->broken_irq_mode = true; 403*68af512aSJan Glauber return 0; 404*68af512aSJan Glauber } 405*68af512aSJan Glauber 406*68af512aSJan Glauber if (!time_left) 407*68af512aSJan Glauber return -ETIMEDOUT; 408*68af512aSJan Glauber 409*68af512aSJan Glauber return 0; 410*68af512aSJan Glauber } 411*68af512aSJan Glauber 412*68af512aSJan Glauber static int octeon_i2c_check_status(struct octeon_i2c *i2c, int final_read) 413*68af512aSJan Glauber { 414*68af512aSJan Glauber u8 stat = octeon_i2c_stat_read(i2c); 415*68af512aSJan Glauber 416*68af512aSJan Glauber switch (stat) { 417*68af512aSJan Glauber /* Everything is fine */ 418*68af512aSJan Glauber case STAT_IDLE: 419*68af512aSJan Glauber case STAT_AD2W_ACK: 420*68af512aSJan Glauber case STAT_RXADDR_ACK: 421*68af512aSJan Glauber case STAT_TXADDR_ACK: 422*68af512aSJan Glauber case STAT_TXDATA_ACK: 423*68af512aSJan Glauber return 0; 424*68af512aSJan Glauber 425*68af512aSJan Glauber /* ACK allowed on pre-terminal bytes only */ 426*68af512aSJan Glauber case STAT_RXDATA_ACK: 427*68af512aSJan Glauber if (!final_read) 428*68af512aSJan Glauber return 0; 429*68af512aSJan Glauber return -EIO; 430*68af512aSJan Glauber 431*68af512aSJan Glauber /* NAK allowed on terminal byte only */ 432*68af512aSJan Glauber case STAT_RXDATA_NAK: 433*68af512aSJan Glauber if (final_read) 434*68af512aSJan Glauber return 0; 435*68af512aSJan Glauber return -EIO; 436*68af512aSJan Glauber 437*68af512aSJan Glauber /* Arbitration lost */ 438*68af512aSJan Glauber case STAT_LOST_ARB_38: 439*68af512aSJan Glauber case STAT_LOST_ARB_68: 440*68af512aSJan Glauber case STAT_LOST_ARB_78: 441*68af512aSJan Glauber case STAT_LOST_ARB_B0: 442*68af512aSJan Glauber return -EAGAIN; 443*68af512aSJan Glauber 444*68af512aSJan Glauber /* Being addressed as slave, should back off & listen */ 445*68af512aSJan Glauber case STAT_SLAVE_60: 446*68af512aSJan Glauber case STAT_SLAVE_70: 447*68af512aSJan Glauber case STAT_GENDATA_ACK: 448*68af512aSJan Glauber case STAT_GENDATA_NAK: 449*68af512aSJan Glauber return -EOPNOTSUPP; 450*68af512aSJan Glauber 451*68af512aSJan Glauber /* Core busy as slave */ 452*68af512aSJan Glauber case STAT_SLAVE_80: 453*68af512aSJan Glauber case STAT_SLAVE_88: 454*68af512aSJan Glauber case STAT_SLAVE_A0: 455*68af512aSJan Glauber case STAT_SLAVE_A8: 456*68af512aSJan Glauber case STAT_SLAVE_LOST: 457*68af512aSJan Glauber case STAT_SLAVE_NAK: 458*68af512aSJan Glauber case STAT_SLAVE_ACK: 459*68af512aSJan Glauber return -EOPNOTSUPP; 460*68af512aSJan Glauber 461*68af512aSJan Glauber case STAT_TXDATA_NAK: 462*68af512aSJan Glauber return -EIO; 463*68af512aSJan Glauber case STAT_TXADDR_NAK: 464*68af512aSJan Glauber case STAT_RXADDR_NAK: 465*68af512aSJan Glauber case STAT_AD2W_NAK: 466*68af512aSJan Glauber return -ENXIO; 467*68af512aSJan Glauber default: 468*68af512aSJan Glauber dev_err(i2c->dev, "unhandled state: %d\n", stat); 469*68af512aSJan Glauber return -EIO; 470*68af512aSJan Glauber } 471*68af512aSJan Glauber } 472*68af512aSJan Glauber 473*68af512aSJan Glauber static bool octeon_i2c_hlc_test_valid(struct octeon_i2c *i2c) 474*68af512aSJan Glauber { 475*68af512aSJan Glauber return (__raw_readq(i2c->twsi_base + SW_TWSI) & SW_TWSI_V) == 0; 476*68af512aSJan Glauber } 477*68af512aSJan Glauber 478*68af512aSJan Glauber static bool octeon_i2c_hlc_test_ready(struct octeon_i2c *i2c, bool *first) 479*68af512aSJan Glauber { 480*68af512aSJan Glauber /* check if valid bit is cleared */ 481*68af512aSJan Glauber if (octeon_i2c_hlc_test_valid(i2c)) 482*68af512aSJan Glauber return true; 483*68af512aSJan Glauber 484*68af512aSJan Glauber if (*first) { 485*68af512aSJan Glauber *first = false; 486*68af512aSJan Glauber return false; 487*68af512aSJan Glauber } 488*68af512aSJan Glauber 489*68af512aSJan Glauber /* 490*68af512aSJan Glauber * IRQ has signaled an event but valid bit isn't cleared. 491*68af512aSJan Glauber * Sleep and retry once. 492*68af512aSJan Glauber */ 493*68af512aSJan Glauber usleep_range(I2C_OCTEON_EVENT_WAIT, 2 * I2C_OCTEON_EVENT_WAIT); 494*68af512aSJan Glauber return octeon_i2c_hlc_test_valid(i2c); 495*68af512aSJan Glauber } 496*68af512aSJan Glauber 497*68af512aSJan Glauber static void octeon_i2c_hlc_int_enable(struct octeon_i2c *i2c) 498*68af512aSJan Glauber { 499*68af512aSJan Glauber octeon_i2c_write_int(i2c, TWSI_INT_ST_EN); 500*68af512aSJan Glauber } 501*68af512aSJan Glauber 502*68af512aSJan Glauber static void octeon_i2c_hlc_int_clear(struct octeon_i2c *i2c) 503*68af512aSJan Glauber { 504*68af512aSJan Glauber /* clear ST/TS events, listen for neither */ 505*68af512aSJan Glauber octeon_i2c_write_int(i2c, TWSI_INT_ST_INT | TWSI_INT_TS_INT); 506*68af512aSJan Glauber } 507*68af512aSJan Glauber 508*68af512aSJan Glauber /** 509*68af512aSJan Glauber * octeon_i2c_hlc_wait - wait for an HLC operation to complete 510*68af512aSJan Glauber * @i2c: The struct octeon_i2c 511*68af512aSJan Glauber * 512*68af512aSJan Glauber * Returns 0 on success, otherwise -ETIMEDOUT. 513*68af512aSJan Glauber */ 514*68af512aSJan Glauber static int octeon_i2c_hlc_wait(struct octeon_i2c *i2c) 515*68af512aSJan Glauber { 516*68af512aSJan Glauber bool first = 1; 517*68af512aSJan Glauber int time_left; 518*68af512aSJan Glauber 519*68af512aSJan Glauber /* 520*68af512aSJan Glauber * Some cn38xx boards don't assert the irq in the interrupt 521*68af512aSJan Glauber * controller. So we must poll for the valid bit change. 522*68af512aSJan Glauber */ 523*68af512aSJan Glauber if (i2c->broken_irq_mode) { 524*68af512aSJan Glauber u64 end = get_jiffies_64() + i2c->adap.timeout; 525*68af512aSJan Glauber 526*68af512aSJan Glauber while (!octeon_i2c_hlc_test_valid(i2c) && 527*68af512aSJan Glauber time_before64(get_jiffies_64(), end)) 528*68af512aSJan Glauber usleep_range(I2C_OCTEON_EVENT_WAIT / 2, I2C_OCTEON_EVENT_WAIT); 529*68af512aSJan Glauber 530*68af512aSJan Glauber return octeon_i2c_hlc_test_valid(i2c) ? 0 : -ETIMEDOUT; 531*68af512aSJan Glauber } 532*68af512aSJan Glauber 533*68af512aSJan Glauber i2c->hlc_int_enable(i2c); 534*68af512aSJan Glauber time_left = wait_event_timeout(i2c->queue, 535*68af512aSJan Glauber octeon_i2c_hlc_test_ready(i2c, &first), 536*68af512aSJan Glauber i2c->adap.timeout); 537*68af512aSJan Glauber i2c->hlc_int_disable(i2c); 538*68af512aSJan Glauber if (!time_left) 539*68af512aSJan Glauber octeon_i2c_hlc_int_clear(i2c); 540*68af512aSJan Glauber 541*68af512aSJan Glauber if (i2c->broken_irq_check && !time_left && 542*68af512aSJan Glauber octeon_i2c_hlc_test_valid(i2c)) { 543*68af512aSJan Glauber dev_err(i2c->dev, "broken irq connection detected, switching to polling mode.\n"); 544*68af512aSJan Glauber i2c->broken_irq_mode = true; 545*68af512aSJan Glauber return 0; 546*68af512aSJan Glauber } 547*68af512aSJan Glauber 548*68af512aSJan Glauber if (!time_left) 549*68af512aSJan Glauber return -ETIMEDOUT; 550*68af512aSJan Glauber return 0; 551*68af512aSJan Glauber } 552*68af512aSJan Glauber 553*68af512aSJan Glauber /* high-level-controller pure read of up to 8 bytes */ 554*68af512aSJan Glauber static int octeon_i2c_hlc_read(struct octeon_i2c *i2c, struct i2c_msg *msgs) 555*68af512aSJan Glauber { 556*68af512aSJan Glauber int i, j, ret = 0; 557*68af512aSJan Glauber u64 cmd; 558*68af512aSJan Glauber 559*68af512aSJan Glauber octeon_i2c_hlc_enable(i2c); 560*68af512aSJan Glauber octeon_i2c_hlc_int_clear(i2c); 561*68af512aSJan Glauber 562*68af512aSJan Glauber cmd = SW_TWSI_V | SW_TWSI_R | SW_TWSI_SOVR; 563*68af512aSJan Glauber /* SIZE */ 564*68af512aSJan Glauber cmd |= (u64)(msgs[0].len - 1) << SW_TWSI_SIZE_SHIFT; 565*68af512aSJan Glauber /* A */ 566*68af512aSJan Glauber cmd |= (u64)(msgs[0].addr & 0x7full) << SW_TWSI_ADDR_SHIFT; 567*68af512aSJan Glauber 568*68af512aSJan Glauber if (msgs[0].flags & I2C_M_TEN) 569*68af512aSJan Glauber cmd |= SW_TWSI_OP_10; 570*68af512aSJan Glauber else 571*68af512aSJan Glauber cmd |= SW_TWSI_OP_7; 572*68af512aSJan Glauber 573*68af512aSJan Glauber octeon_i2c_writeq_flush(cmd, i2c->twsi_base + SW_TWSI); 574*68af512aSJan Glauber ret = octeon_i2c_hlc_wait(i2c); 575*68af512aSJan Glauber if (ret) 576*68af512aSJan Glauber goto err; 577*68af512aSJan Glauber 578*68af512aSJan Glauber cmd = __raw_readq(i2c->twsi_base + SW_TWSI); 579*68af512aSJan Glauber if ((cmd & SW_TWSI_R) == 0) 580*68af512aSJan Glauber return -EAGAIN; 581*68af512aSJan Glauber 582*68af512aSJan Glauber for (i = 0, j = msgs[0].len - 1; i < msgs[0].len && i < 4; i++, j--) 583*68af512aSJan Glauber msgs[0].buf[j] = (cmd >> (8 * i)) & 0xff; 584*68af512aSJan Glauber 585*68af512aSJan Glauber if (msgs[0].len > 4) { 586*68af512aSJan Glauber cmd = __raw_readq(i2c->twsi_base + SW_TWSI_EXT); 587*68af512aSJan Glauber for (i = 0; i < msgs[0].len - 4 && i < 4; i++, j--) 588*68af512aSJan Glauber msgs[0].buf[j] = (cmd >> (8 * i)) & 0xff; 589*68af512aSJan Glauber } 590*68af512aSJan Glauber 591*68af512aSJan Glauber err: 592*68af512aSJan Glauber return ret; 593*68af512aSJan Glauber } 594*68af512aSJan Glauber 595*68af512aSJan Glauber /* high-level-controller pure write of up to 8 bytes */ 596*68af512aSJan Glauber static int octeon_i2c_hlc_write(struct octeon_i2c *i2c, struct i2c_msg *msgs) 597*68af512aSJan Glauber { 598*68af512aSJan Glauber int i, j, ret = 0; 599*68af512aSJan Glauber u64 cmd; 600*68af512aSJan Glauber 601*68af512aSJan Glauber octeon_i2c_hlc_enable(i2c); 602*68af512aSJan Glauber octeon_i2c_hlc_int_clear(i2c); 603*68af512aSJan Glauber 604*68af512aSJan Glauber cmd = SW_TWSI_V | SW_TWSI_SOVR; 605*68af512aSJan Glauber /* SIZE */ 606*68af512aSJan Glauber cmd |= (u64)(msgs[0].len - 1) << SW_TWSI_SIZE_SHIFT; 607*68af512aSJan Glauber /* A */ 608*68af512aSJan Glauber cmd |= (u64)(msgs[0].addr & 0x7full) << SW_TWSI_ADDR_SHIFT; 609*68af512aSJan Glauber 610*68af512aSJan Glauber if (msgs[0].flags & I2C_M_TEN) 611*68af512aSJan Glauber cmd |= SW_TWSI_OP_10; 612*68af512aSJan Glauber else 613*68af512aSJan Glauber cmd |= SW_TWSI_OP_7; 614*68af512aSJan Glauber 615*68af512aSJan Glauber for (i = 0, j = msgs[0].len - 1; i < msgs[0].len && i < 4; i++, j--) 616*68af512aSJan Glauber cmd |= (u64)msgs[0].buf[j] << (8 * i); 617*68af512aSJan Glauber 618*68af512aSJan Glauber if (msgs[0].len > 4) { 619*68af512aSJan Glauber u64 ext = 0; 620*68af512aSJan Glauber 621*68af512aSJan Glauber for (i = 0; i < msgs[0].len - 4 && i < 4; i++, j--) 622*68af512aSJan Glauber ext |= (u64)msgs[0].buf[j] << (8 * i); 623*68af512aSJan Glauber octeon_i2c_writeq_flush(ext, i2c->twsi_base + SW_TWSI_EXT); 624*68af512aSJan Glauber } 625*68af512aSJan Glauber 626*68af512aSJan Glauber octeon_i2c_writeq_flush(cmd, i2c->twsi_base + SW_TWSI); 627*68af512aSJan Glauber ret = octeon_i2c_hlc_wait(i2c); 628*68af512aSJan Glauber if (ret) 629*68af512aSJan Glauber goto err; 630*68af512aSJan Glauber 631*68af512aSJan Glauber cmd = __raw_readq(i2c->twsi_base + SW_TWSI); 632*68af512aSJan Glauber if ((cmd & SW_TWSI_R) == 0) 633*68af512aSJan Glauber return -EAGAIN; 634*68af512aSJan Glauber 635*68af512aSJan Glauber ret = octeon_i2c_check_status(i2c, false); 636*68af512aSJan Glauber 637*68af512aSJan Glauber err: 638*68af512aSJan Glauber return ret; 639*68af512aSJan Glauber } 640*68af512aSJan Glauber 641*68af512aSJan Glauber /* high-level-controller composite write+read, msg0=addr, msg1=data */ 642*68af512aSJan Glauber static int octeon_i2c_hlc_comp_read(struct octeon_i2c *i2c, struct i2c_msg *msgs) 643*68af512aSJan Glauber { 644*68af512aSJan Glauber int i, j, ret = 0; 645*68af512aSJan Glauber u64 cmd; 646*68af512aSJan Glauber 647*68af512aSJan Glauber octeon_i2c_hlc_enable(i2c); 648*68af512aSJan Glauber 649*68af512aSJan Glauber cmd = SW_TWSI_V | SW_TWSI_R | SW_TWSI_SOVR; 650*68af512aSJan Glauber /* SIZE */ 651*68af512aSJan Glauber cmd |= (u64)(msgs[1].len - 1) << SW_TWSI_SIZE_SHIFT; 652*68af512aSJan Glauber /* A */ 653*68af512aSJan Glauber cmd |= (u64)(msgs[0].addr & 0x7full) << SW_TWSI_ADDR_SHIFT; 654*68af512aSJan Glauber 655*68af512aSJan Glauber if (msgs[0].flags & I2C_M_TEN) 656*68af512aSJan Glauber cmd |= SW_TWSI_OP_10_IA; 657*68af512aSJan Glauber else 658*68af512aSJan Glauber cmd |= SW_TWSI_OP_7_IA; 659*68af512aSJan Glauber 660*68af512aSJan Glauber if (msgs[0].len == 2) { 661*68af512aSJan Glauber u64 ext = 0; 662*68af512aSJan Glauber 663*68af512aSJan Glauber cmd |= SW_TWSI_EIA; 664*68af512aSJan Glauber ext = (u64)msgs[0].buf[0] << SW_TWSI_IA_SHIFT; 665*68af512aSJan Glauber cmd |= (u64)msgs[0].buf[1] << SW_TWSI_IA_SHIFT; 666*68af512aSJan Glauber octeon_i2c_writeq_flush(ext, i2c->twsi_base + SW_TWSI_EXT); 667*68af512aSJan Glauber } else { 668*68af512aSJan Glauber cmd |= (u64)msgs[0].buf[0] << SW_TWSI_IA_SHIFT; 669*68af512aSJan Glauber } 670*68af512aSJan Glauber 671*68af512aSJan Glauber octeon_i2c_hlc_int_clear(i2c); 672*68af512aSJan Glauber octeon_i2c_writeq_flush(cmd, i2c->twsi_base + SW_TWSI); 673*68af512aSJan Glauber 674*68af512aSJan Glauber ret = octeon_i2c_hlc_wait(i2c); 675*68af512aSJan Glauber if (ret) 676*68af512aSJan Glauber goto err; 677*68af512aSJan Glauber 678*68af512aSJan Glauber cmd = __raw_readq(i2c->twsi_base + SW_TWSI); 679*68af512aSJan Glauber if ((cmd & SW_TWSI_R) == 0) 680*68af512aSJan Glauber return -EAGAIN; 681*68af512aSJan Glauber 682*68af512aSJan Glauber for (i = 0, j = msgs[1].len - 1; i < msgs[1].len && i < 4; i++, j--) 683*68af512aSJan Glauber msgs[1].buf[j] = (cmd >> (8 * i)) & 0xff; 684*68af512aSJan Glauber 685*68af512aSJan Glauber if (msgs[1].len > 4) { 686*68af512aSJan Glauber cmd = __raw_readq(i2c->twsi_base + SW_TWSI_EXT); 687*68af512aSJan Glauber for (i = 0; i < msgs[1].len - 4 && i < 4; i++, j--) 688*68af512aSJan Glauber msgs[1].buf[j] = (cmd >> (8 * i)) & 0xff; 689*68af512aSJan Glauber } 690*68af512aSJan Glauber 691*68af512aSJan Glauber err: 692*68af512aSJan Glauber return ret; 693*68af512aSJan Glauber } 694*68af512aSJan Glauber 695*68af512aSJan Glauber /* high-level-controller composite write+write, m[0]len<=2, m[1]len<=8 */ 696*68af512aSJan Glauber static int octeon_i2c_hlc_comp_write(struct octeon_i2c *i2c, struct i2c_msg *msgs) 697*68af512aSJan Glauber { 698*68af512aSJan Glauber bool set_ext = false; 699*68af512aSJan Glauber int i, j, ret = 0; 700*68af512aSJan Glauber u64 cmd, ext = 0; 701*68af512aSJan Glauber 702*68af512aSJan Glauber octeon_i2c_hlc_enable(i2c); 703*68af512aSJan Glauber 704*68af512aSJan Glauber cmd = SW_TWSI_V | SW_TWSI_SOVR; 705*68af512aSJan Glauber /* SIZE */ 706*68af512aSJan Glauber cmd |= (u64)(msgs[1].len - 1) << SW_TWSI_SIZE_SHIFT; 707*68af512aSJan Glauber /* A */ 708*68af512aSJan Glauber cmd |= (u64)(msgs[0].addr & 0x7full) << SW_TWSI_ADDR_SHIFT; 709*68af512aSJan Glauber 710*68af512aSJan Glauber if (msgs[0].flags & I2C_M_TEN) 711*68af512aSJan Glauber cmd |= SW_TWSI_OP_10_IA; 712*68af512aSJan Glauber else 713*68af512aSJan Glauber cmd |= SW_TWSI_OP_7_IA; 714*68af512aSJan Glauber 715*68af512aSJan Glauber if (msgs[0].len == 2) { 716*68af512aSJan Glauber cmd |= SW_TWSI_EIA; 717*68af512aSJan Glauber ext |= (u64)msgs[0].buf[0] << SW_TWSI_IA_SHIFT; 718*68af512aSJan Glauber set_ext = true; 719*68af512aSJan Glauber cmd |= (u64)msgs[0].buf[1] << SW_TWSI_IA_SHIFT; 720*68af512aSJan Glauber } else { 721*68af512aSJan Glauber cmd |= (u64)msgs[0].buf[0] << SW_TWSI_IA_SHIFT; 722*68af512aSJan Glauber } 723*68af512aSJan Glauber 724*68af512aSJan Glauber for (i = 0, j = msgs[1].len - 1; i < msgs[1].len && i < 4; i++, j--) 725*68af512aSJan Glauber cmd |= (u64)msgs[1].buf[j] << (8 * i); 726*68af512aSJan Glauber 727*68af512aSJan Glauber if (msgs[1].len > 4) { 728*68af512aSJan Glauber for (i = 0; i < msgs[1].len - 4 && i < 4; i++, j--) 729*68af512aSJan Glauber ext |= (u64)msgs[1].buf[j] << (8 * i); 730*68af512aSJan Glauber set_ext = true; 731*68af512aSJan Glauber } 732*68af512aSJan Glauber if (set_ext) 733*68af512aSJan Glauber octeon_i2c_writeq_flush(ext, i2c->twsi_base + SW_TWSI_EXT); 734*68af512aSJan Glauber 735*68af512aSJan Glauber octeon_i2c_hlc_int_clear(i2c); 736*68af512aSJan Glauber octeon_i2c_writeq_flush(cmd, i2c->twsi_base + SW_TWSI); 737*68af512aSJan Glauber 738*68af512aSJan Glauber ret = octeon_i2c_hlc_wait(i2c); 739*68af512aSJan Glauber if (ret) 740*68af512aSJan Glauber goto err; 741*68af512aSJan Glauber 742*68af512aSJan Glauber cmd = __raw_readq(i2c->twsi_base + SW_TWSI); 743*68af512aSJan Glauber if ((cmd & SW_TWSI_R) == 0) 744*68af512aSJan Glauber return -EAGAIN; 745*68af512aSJan Glauber 746*68af512aSJan Glauber ret = octeon_i2c_check_status(i2c, false); 747*68af512aSJan Glauber 748*68af512aSJan Glauber err: 749*68af512aSJan Glauber return ret; 750*68af512aSJan Glauber } 751*68af512aSJan Glauber 752*68af512aSJan Glauber /* calculate and set clock divisors */ 753*68af512aSJan Glauber static void octeon_i2c_set_clock(struct octeon_i2c *i2c) 754*68af512aSJan Glauber { 755*68af512aSJan Glauber int tclk, thp_base, inc, thp_idx, mdiv_idx, ndiv_idx, foscl, diff; 756*68af512aSJan Glauber int thp = 0x18, mdiv = 2, ndiv = 0, delta_hz = 1000000; 757*68af512aSJan Glauber 758*68af512aSJan Glauber for (ndiv_idx = 0; ndiv_idx < 8 && delta_hz != 0; ndiv_idx++) { 759*68af512aSJan Glauber /* 760*68af512aSJan Glauber * An mdiv value of less than 2 seems to not work well 761*68af512aSJan Glauber * with ds1337 RTCs, so we constrain it to larger values. 762*68af512aSJan Glauber */ 763*68af512aSJan Glauber for (mdiv_idx = 15; mdiv_idx >= 2 && delta_hz != 0; mdiv_idx--) { 764*68af512aSJan Glauber /* 765*68af512aSJan Glauber * For given ndiv and mdiv values check the 766*68af512aSJan Glauber * two closest thp values. 767*68af512aSJan Glauber */ 768*68af512aSJan Glauber tclk = i2c->twsi_freq * (mdiv_idx + 1) * 10; 769*68af512aSJan Glauber tclk *= (1 << ndiv_idx); 770*68af512aSJan Glauber thp_base = (i2c->sys_freq / (tclk * 2)) - 1; 771*68af512aSJan Glauber 772*68af512aSJan Glauber for (inc = 0; inc <= 1; inc++) { 773*68af512aSJan Glauber thp_idx = thp_base + inc; 774*68af512aSJan Glauber if (thp_idx < 5 || thp_idx > 0xff) 775*68af512aSJan Glauber continue; 776*68af512aSJan Glauber 777*68af512aSJan Glauber foscl = i2c->sys_freq / (2 * (thp_idx + 1)); 778*68af512aSJan Glauber foscl = foscl / (1 << ndiv_idx); 779*68af512aSJan Glauber foscl = foscl / (mdiv_idx + 1) / 10; 780*68af512aSJan Glauber diff = abs(foscl - i2c->twsi_freq); 781*68af512aSJan Glauber if (diff < delta_hz) { 782*68af512aSJan Glauber delta_hz = diff; 783*68af512aSJan Glauber thp = thp_idx; 784*68af512aSJan Glauber mdiv = mdiv_idx; 785*68af512aSJan Glauber ndiv = ndiv_idx; 786*68af512aSJan Glauber } 787*68af512aSJan Glauber } 788*68af512aSJan Glauber } 789*68af512aSJan Glauber } 790*68af512aSJan Glauber octeon_i2c_reg_write(i2c, SW_TWSI_OP_TWSI_CLK, thp); 791*68af512aSJan Glauber octeon_i2c_reg_write(i2c, SW_TWSI_EOP_TWSI_CLKCTL, (mdiv << 3) | ndiv); 792*68af512aSJan Glauber } 793*68af512aSJan Glauber 794*68af512aSJan Glauber static int octeon_i2c_init_lowlevel(struct octeon_i2c *i2c) 795*68af512aSJan Glauber { 796*68af512aSJan Glauber u8 status = 0; 797*68af512aSJan Glauber int tries; 798*68af512aSJan Glauber 799*68af512aSJan Glauber /* reset controller */ 800*68af512aSJan Glauber octeon_i2c_reg_write(i2c, SW_TWSI_EOP_TWSI_RST, 0); 801*68af512aSJan Glauber 802*68af512aSJan Glauber for (tries = 10; tries && status != STAT_IDLE; tries--) { 803*68af512aSJan Glauber udelay(1); 804*68af512aSJan Glauber status = octeon_i2c_stat_read(i2c); 805*68af512aSJan Glauber if (status == STAT_IDLE) 806*68af512aSJan Glauber break; 807*68af512aSJan Glauber } 808*68af512aSJan Glauber 809*68af512aSJan Glauber if (status != STAT_IDLE) { 810*68af512aSJan Glauber dev_err(i2c->dev, "%s: TWSI_RST failed! (0x%x)\n", 811*68af512aSJan Glauber __func__, status); 812*68af512aSJan Glauber return -EIO; 813*68af512aSJan Glauber } 814*68af512aSJan Glauber 815*68af512aSJan Glauber /* toggle twice to force both teardowns */ 816*68af512aSJan Glauber octeon_i2c_hlc_enable(i2c); 817*68af512aSJan Glauber octeon_i2c_hlc_disable(i2c); 818*68af512aSJan Glauber return 0; 819*68af512aSJan Glauber } 820*68af512aSJan Glauber 821*68af512aSJan Glauber static int octeon_i2c_recovery(struct octeon_i2c *i2c) 822*68af512aSJan Glauber { 823*68af512aSJan Glauber int ret; 824*68af512aSJan Glauber 825*68af512aSJan Glauber ret = i2c_recover_bus(&i2c->adap); 826*68af512aSJan Glauber if (ret) 827*68af512aSJan Glauber /* recover failed, try hardware re-init */ 828*68af512aSJan Glauber ret = octeon_i2c_init_lowlevel(i2c); 829*68af512aSJan Glauber return ret; 830*68af512aSJan Glauber } 831*68af512aSJan Glauber 832*68af512aSJan Glauber /** 833*68af512aSJan Glauber * octeon_i2c_start - send START to the bus 834*68af512aSJan Glauber * @i2c: The struct octeon_i2c 835*68af512aSJan Glauber * 836*68af512aSJan Glauber * Returns 0 on success, otherwise a negative errno. 837*68af512aSJan Glauber */ 838*68af512aSJan Glauber static int octeon_i2c_start(struct octeon_i2c *i2c) 839*68af512aSJan Glauber { 840*68af512aSJan Glauber int ret; 841*68af512aSJan Glauber u8 stat; 842*68af512aSJan Glauber 843*68af512aSJan Glauber octeon_i2c_hlc_disable(i2c); 844*68af512aSJan Glauber 845*68af512aSJan Glauber octeon_i2c_ctl_write(i2c, TWSI_CTL_ENAB | TWSI_CTL_STA); 846*68af512aSJan Glauber ret = octeon_i2c_wait(i2c); 847*68af512aSJan Glauber if (ret) 848*68af512aSJan Glauber goto error; 849*68af512aSJan Glauber 850*68af512aSJan Glauber stat = octeon_i2c_stat_read(i2c); 851*68af512aSJan Glauber if (stat == STAT_START || stat == STAT_REP_START) 852*68af512aSJan Glauber /* START successful, bail out */ 853*68af512aSJan Glauber return 0; 854*68af512aSJan Glauber 855*68af512aSJan Glauber error: 856*68af512aSJan Glauber /* START failed, try to recover */ 857*68af512aSJan Glauber ret = octeon_i2c_recovery(i2c); 858*68af512aSJan Glauber return (ret) ? ret : -EAGAIN; 859*68af512aSJan Glauber } 860*68af512aSJan Glauber 861*68af512aSJan Glauber /* send STOP to the bus */ 862*68af512aSJan Glauber static void octeon_i2c_stop(struct octeon_i2c *i2c) 863*68af512aSJan Glauber { 864*68af512aSJan Glauber octeon_i2c_ctl_write(i2c, TWSI_CTL_ENAB | TWSI_CTL_STP); 865*68af512aSJan Glauber } 866*68af512aSJan Glauber 867*68af512aSJan Glauber /** 868*68af512aSJan Glauber * octeon_i2c_write - send data to the bus via low-level controller 869*68af512aSJan Glauber * @i2c: The struct octeon_i2c 870*68af512aSJan Glauber * @target: Target address 871*68af512aSJan Glauber * @data: Pointer to the data to be sent 872*68af512aSJan Glauber * @length: Length of the data 873*68af512aSJan Glauber * 874*68af512aSJan Glauber * The address is sent over the bus, then the data. 875*68af512aSJan Glauber * 876*68af512aSJan Glauber * Returns 0 on success, otherwise a negative errno. 877*68af512aSJan Glauber */ 878*68af512aSJan Glauber static int octeon_i2c_write(struct octeon_i2c *i2c, int target, 879*68af512aSJan Glauber const u8 *data, int length) 880*68af512aSJan Glauber { 881*68af512aSJan Glauber int i, result; 882*68af512aSJan Glauber 883*68af512aSJan Glauber octeon_i2c_data_write(i2c, target << 1); 884*68af512aSJan Glauber octeon_i2c_ctl_write(i2c, TWSI_CTL_ENAB); 885*68af512aSJan Glauber 886*68af512aSJan Glauber result = octeon_i2c_wait(i2c); 887*68af512aSJan Glauber if (result) 888*68af512aSJan Glauber return result; 889*68af512aSJan Glauber 890*68af512aSJan Glauber for (i = 0; i < length; i++) { 891*68af512aSJan Glauber result = octeon_i2c_check_status(i2c, false); 892*68af512aSJan Glauber if (result) 893*68af512aSJan Glauber return result; 894*68af512aSJan Glauber 895*68af512aSJan Glauber octeon_i2c_data_write(i2c, data[i]); 896*68af512aSJan Glauber octeon_i2c_ctl_write(i2c, TWSI_CTL_ENAB); 897*68af512aSJan Glauber 898*68af512aSJan Glauber result = octeon_i2c_wait(i2c); 899*68af512aSJan Glauber if (result) 900*68af512aSJan Glauber return result; 901*68af512aSJan Glauber } 902*68af512aSJan Glauber 903*68af512aSJan Glauber return 0; 904*68af512aSJan Glauber } 905*68af512aSJan Glauber 906*68af512aSJan Glauber /** 907*68af512aSJan Glauber * octeon_i2c_read - receive data from the bus via low-level controller 908*68af512aSJan Glauber * @i2c: The struct octeon_i2c 909*68af512aSJan Glauber * @target: Target address 910*68af512aSJan Glauber * @data: Pointer to the location to store the data 911*68af512aSJan Glauber * @rlength: Length of the data 912*68af512aSJan Glauber * @recv_len: flag for length byte 913*68af512aSJan Glauber * 914*68af512aSJan Glauber * The address is sent over the bus, then the data is read. 915*68af512aSJan Glauber * 916*68af512aSJan Glauber * Returns 0 on success, otherwise a negative errno. 917*68af512aSJan Glauber */ 918*68af512aSJan Glauber static int octeon_i2c_read(struct octeon_i2c *i2c, int target, 919*68af512aSJan Glauber u8 *data, u16 *rlength, bool recv_len) 920*68af512aSJan Glauber { 921*68af512aSJan Glauber int i, result, length = *rlength; 922*68af512aSJan Glauber bool final_read = false; 923*68af512aSJan Glauber 924*68af512aSJan Glauber octeon_i2c_data_write(i2c, (target << 1) | 1); 925*68af512aSJan Glauber octeon_i2c_ctl_write(i2c, TWSI_CTL_ENAB); 926*68af512aSJan Glauber 927*68af512aSJan Glauber result = octeon_i2c_wait(i2c); 928*68af512aSJan Glauber if (result) 929*68af512aSJan Glauber return result; 930*68af512aSJan Glauber 931*68af512aSJan Glauber /* address OK ? */ 932*68af512aSJan Glauber result = octeon_i2c_check_status(i2c, false); 933*68af512aSJan Glauber if (result) 934*68af512aSJan Glauber return result; 935*68af512aSJan Glauber 936*68af512aSJan Glauber for (i = 0; i < length; i++) { 937*68af512aSJan Glauber /* 938*68af512aSJan Glauber * For the last byte to receive TWSI_CTL_AAK must not be set. 939*68af512aSJan Glauber * 940*68af512aSJan Glauber * A special case is I2C_M_RECV_LEN where we don't know the 941*68af512aSJan Glauber * additional length yet. If recv_len is set we assume we're 942*68af512aSJan Glauber * not reading the final byte and therefore need to set 943*68af512aSJan Glauber * TWSI_CTL_AAK. 944*68af512aSJan Glauber */ 945*68af512aSJan Glauber if ((i + 1 == length) && !(recv_len && i == 0)) 946*68af512aSJan Glauber final_read = true; 947*68af512aSJan Glauber 948*68af512aSJan Glauber /* clear iflg to allow next event */ 949*68af512aSJan Glauber if (final_read) 950*68af512aSJan Glauber octeon_i2c_ctl_write(i2c, TWSI_CTL_ENAB); 951*68af512aSJan Glauber else 952*68af512aSJan Glauber octeon_i2c_ctl_write(i2c, TWSI_CTL_ENAB | TWSI_CTL_AAK); 953*68af512aSJan Glauber 954*68af512aSJan Glauber result = octeon_i2c_wait(i2c); 955*68af512aSJan Glauber if (result) 956*68af512aSJan Glauber return result; 957*68af512aSJan Glauber 958*68af512aSJan Glauber data[i] = octeon_i2c_data_read(i2c); 959*68af512aSJan Glauber if (recv_len && i == 0) { 960*68af512aSJan Glauber if (data[i] > I2C_SMBUS_BLOCK_MAX + 1) 961*68af512aSJan Glauber return -EPROTO; 962*68af512aSJan Glauber length += data[i]; 963*68af512aSJan Glauber } 964*68af512aSJan Glauber 965*68af512aSJan Glauber result = octeon_i2c_check_status(i2c, final_read); 966*68af512aSJan Glauber if (result) 967*68af512aSJan Glauber return result; 968*68af512aSJan Glauber } 969*68af512aSJan Glauber *rlength = length; 970*68af512aSJan Glauber return 0; 971*68af512aSJan Glauber } 972*68af512aSJan Glauber 973*68af512aSJan Glauber /** 974*68af512aSJan Glauber * octeon_i2c_xfer - The driver's master_xfer function 975*68af512aSJan Glauber * @adap: Pointer to the i2c_adapter structure 976*68af512aSJan Glauber * @msgs: Pointer to the messages to be processed 977*68af512aSJan Glauber * @num: Length of the MSGS array 978*68af512aSJan Glauber * 979*68af512aSJan Glauber * Returns the number of messages processed, or a negative errno on failure. 980*68af512aSJan Glauber */ 981*68af512aSJan Glauber static int octeon_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg *msgs, 982*68af512aSJan Glauber int num) 983*68af512aSJan Glauber { 984*68af512aSJan Glauber struct octeon_i2c *i2c = i2c_get_adapdata(adap); 985*68af512aSJan Glauber int i, ret = 0; 986*68af512aSJan Glauber 987*68af512aSJan Glauber if (num == 1) { 988*68af512aSJan Glauber if (msgs[0].len > 0 && msgs[0].len <= 8) { 989*68af512aSJan Glauber if (msgs[0].flags & I2C_M_RD) 990*68af512aSJan Glauber ret = octeon_i2c_hlc_read(i2c, msgs); 991*68af512aSJan Glauber else 992*68af512aSJan Glauber ret = octeon_i2c_hlc_write(i2c, msgs); 993*68af512aSJan Glauber goto out; 994*68af512aSJan Glauber } 995*68af512aSJan Glauber } else if (num == 2) { 996*68af512aSJan Glauber if ((msgs[0].flags & I2C_M_RD) == 0 && 997*68af512aSJan Glauber (msgs[1].flags & I2C_M_RECV_LEN) == 0 && 998*68af512aSJan Glauber msgs[0].len > 0 && msgs[0].len <= 2 && 999*68af512aSJan Glauber msgs[1].len > 0 && msgs[1].len <= 8 && 1000*68af512aSJan Glauber msgs[0].addr == msgs[1].addr) { 1001*68af512aSJan Glauber if (msgs[1].flags & I2C_M_RD) 1002*68af512aSJan Glauber ret = octeon_i2c_hlc_comp_read(i2c, msgs); 1003*68af512aSJan Glauber else 1004*68af512aSJan Glauber ret = octeon_i2c_hlc_comp_write(i2c, msgs); 1005*68af512aSJan Glauber goto out; 1006*68af512aSJan Glauber } 1007*68af512aSJan Glauber } 1008*68af512aSJan Glauber 1009*68af512aSJan Glauber for (i = 0; ret == 0 && i < num; i++) { 1010*68af512aSJan Glauber struct i2c_msg *pmsg = &msgs[i]; 1011*68af512aSJan Glauber 1012*68af512aSJan Glauber /* zero-length messages are not supported */ 1013*68af512aSJan Glauber if (!pmsg->len) { 1014*68af512aSJan Glauber ret = -EOPNOTSUPP; 1015*68af512aSJan Glauber break; 1016*68af512aSJan Glauber } 1017*68af512aSJan Glauber 1018*68af512aSJan Glauber ret = octeon_i2c_start(i2c); 1019*68af512aSJan Glauber if (ret) 1020*68af512aSJan Glauber return ret; 1021*68af512aSJan Glauber 1022*68af512aSJan Glauber if (pmsg->flags & I2C_M_RD) 1023*68af512aSJan Glauber ret = octeon_i2c_read(i2c, pmsg->addr, pmsg->buf, 1024*68af512aSJan Glauber &pmsg->len, pmsg->flags & I2C_M_RECV_LEN); 1025*68af512aSJan Glauber else 1026*68af512aSJan Glauber ret = octeon_i2c_write(i2c, pmsg->addr, pmsg->buf, 1027*68af512aSJan Glauber pmsg->len); 1028*68af512aSJan Glauber } 1029*68af512aSJan Glauber octeon_i2c_stop(i2c); 1030*68af512aSJan Glauber out: 1031*68af512aSJan Glauber return (ret != 0) ? ret : num; 1032*68af512aSJan Glauber } 1033*68af512aSJan Glauber 1034*68af512aSJan Glauber static int octeon_i2c_get_scl(struct i2c_adapter *adap) 1035*68af512aSJan Glauber { 1036*68af512aSJan Glauber struct octeon_i2c *i2c = i2c_get_adapdata(adap); 1037*68af512aSJan Glauber u64 state; 1038*68af512aSJan Glauber 1039*68af512aSJan Glauber state = octeon_i2c_read_int(i2c); 1040*68af512aSJan Glauber return state & TWSI_INT_SCL; 1041*68af512aSJan Glauber } 1042*68af512aSJan Glauber 1043*68af512aSJan Glauber static void octeon_i2c_set_scl(struct i2c_adapter *adap, int val) 1044*68af512aSJan Glauber { 1045*68af512aSJan Glauber struct octeon_i2c *i2c = i2c_get_adapdata(adap); 1046*68af512aSJan Glauber 1047*68af512aSJan Glauber octeon_i2c_write_int(i2c, TWSI_INT_SCL_OVR); 1048*68af512aSJan Glauber } 1049*68af512aSJan Glauber 1050*68af512aSJan Glauber static int octeon_i2c_get_sda(struct i2c_adapter *adap) 1051*68af512aSJan Glauber { 1052*68af512aSJan Glauber struct octeon_i2c *i2c = i2c_get_adapdata(adap); 1053*68af512aSJan Glauber u64 state; 1054*68af512aSJan Glauber 1055*68af512aSJan Glauber state = octeon_i2c_read_int(i2c); 1056*68af512aSJan Glauber return state & TWSI_INT_SDA; 1057*68af512aSJan Glauber } 1058*68af512aSJan Glauber 1059*68af512aSJan Glauber static void octeon_i2c_prepare_recovery(struct i2c_adapter *adap) 1060*68af512aSJan Glauber { 1061*68af512aSJan Glauber struct octeon_i2c *i2c = i2c_get_adapdata(adap); 1062*68af512aSJan Glauber 1063*68af512aSJan Glauber /* 1064*68af512aSJan Glauber * The stop resets the state machine, does not _transmit_ STOP unless 1065*68af512aSJan Glauber * engine was active. 1066*68af512aSJan Glauber */ 1067*68af512aSJan Glauber octeon_i2c_stop(i2c); 1068*68af512aSJan Glauber 1069*68af512aSJan Glauber octeon_i2c_hlc_disable(i2c); 1070*68af512aSJan Glauber octeon_i2c_write_int(i2c, 0); 1071*68af512aSJan Glauber } 1072*68af512aSJan Glauber 1073*68af512aSJan Glauber static void octeon_i2c_unprepare_recovery(struct i2c_adapter *adap) 1074*68af512aSJan Glauber { 1075*68af512aSJan Glauber struct octeon_i2c *i2c = i2c_get_adapdata(adap); 1076*68af512aSJan Glauber 1077*68af512aSJan Glauber octeon_i2c_write_int(i2c, 0); 1078*68af512aSJan Glauber } 1079*68af512aSJan Glauber 1080*68af512aSJan Glauber static struct i2c_bus_recovery_info octeon_i2c_recovery_info = { 1081*68af512aSJan Glauber .recover_bus = i2c_generic_scl_recovery, 1082*68af512aSJan Glauber .get_scl = octeon_i2c_get_scl, 1083*68af512aSJan Glauber .set_scl = octeon_i2c_set_scl, 1084*68af512aSJan Glauber .get_sda = octeon_i2c_get_sda, 1085*68af512aSJan Glauber .prepare_recovery = octeon_i2c_prepare_recovery, 1086*68af512aSJan Glauber .unprepare_recovery = octeon_i2c_unprepare_recovery, 1087*68af512aSJan Glauber }; 1088*68af512aSJan Glauber 1089*68af512aSJan Glauber static u32 octeon_i2c_functionality(struct i2c_adapter *adap) 1090*68af512aSJan Glauber { 1091*68af512aSJan Glauber return I2C_FUNC_I2C | (I2C_FUNC_SMBUS_EMUL & ~I2C_FUNC_SMBUS_QUICK) | 1092*68af512aSJan Glauber I2C_FUNC_SMBUS_READ_BLOCK_DATA | I2C_SMBUS_BLOCK_PROC_CALL; 1093*68af512aSJan Glauber } 1094*68af512aSJan Glauber 1095*68af512aSJan Glauber static const struct i2c_algorithm octeon_i2c_algo = { 1096*68af512aSJan Glauber .master_xfer = octeon_i2c_xfer, 1097*68af512aSJan Glauber .functionality = octeon_i2c_functionality, 1098*68af512aSJan Glauber }; 1099*68af512aSJan Glauber 1100*68af512aSJan Glauber static struct i2c_adapter octeon_i2c_ops = { 1101*68af512aSJan Glauber .owner = THIS_MODULE, 1102*68af512aSJan Glauber .name = "OCTEON adapter", 1103*68af512aSJan Glauber .algo = &octeon_i2c_algo, 1104*68af512aSJan Glauber }; 1105*68af512aSJan Glauber 1106*68af512aSJan Glauber static int octeon_i2c_probe(struct platform_device *pdev) 1107*68af512aSJan Glauber { 1108*68af512aSJan Glauber struct device_node *node = pdev->dev.of_node; 1109*68af512aSJan Glauber int irq, result = 0, hlc_irq = 0; 1110*68af512aSJan Glauber struct resource *res_mem; 1111*68af512aSJan Glauber struct octeon_i2c *i2c; 1112*68af512aSJan Glauber bool cn78xx_style; 1113*68af512aSJan Glauber 1114*68af512aSJan Glauber cn78xx_style = of_device_is_compatible(node, "cavium,octeon-7890-twsi"); 1115*68af512aSJan Glauber if (cn78xx_style) { 1116*68af512aSJan Glauber hlc_irq = platform_get_irq(pdev, 0); 1117*68af512aSJan Glauber if (hlc_irq < 0) 1118*68af512aSJan Glauber return hlc_irq; 1119*68af512aSJan Glauber 1120*68af512aSJan Glauber irq = platform_get_irq(pdev, 2); 1121*68af512aSJan Glauber if (irq < 0) 1122*68af512aSJan Glauber return irq; 1123*68af512aSJan Glauber } else { 1124*68af512aSJan Glauber /* All adaptors have an irq. */ 1125*68af512aSJan Glauber irq = platform_get_irq(pdev, 0); 1126*68af512aSJan Glauber if (irq < 0) 1127*68af512aSJan Glauber return irq; 1128*68af512aSJan Glauber } 1129*68af512aSJan Glauber 1130*68af512aSJan Glauber i2c = devm_kzalloc(&pdev->dev, sizeof(*i2c), GFP_KERNEL); 1131*68af512aSJan Glauber if (!i2c) { 1132*68af512aSJan Glauber result = -ENOMEM; 1133*68af512aSJan Glauber goto out; 1134*68af512aSJan Glauber } 1135*68af512aSJan Glauber i2c->dev = &pdev->dev; 1136*68af512aSJan Glauber 1137*68af512aSJan Glauber res_mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); 1138*68af512aSJan Glauber i2c->twsi_base = devm_ioremap_resource(&pdev->dev, res_mem); 1139*68af512aSJan Glauber if (IS_ERR(i2c->twsi_base)) { 1140*68af512aSJan Glauber result = PTR_ERR(i2c->twsi_base); 1141*68af512aSJan Glauber goto out; 1142*68af512aSJan Glauber } 1143*68af512aSJan Glauber 1144*68af512aSJan Glauber /* 1145*68af512aSJan Glauber * "clock-rate" is a legacy binding, the official binding is 1146*68af512aSJan Glauber * "clock-frequency". Try the official one first and then 1147*68af512aSJan Glauber * fall back if it doesn't exist. 1148*68af512aSJan Glauber */ 1149*68af512aSJan Glauber if (of_property_read_u32(node, "clock-frequency", &i2c->twsi_freq) && 1150*68af512aSJan Glauber of_property_read_u32(node, "clock-rate", &i2c->twsi_freq)) { 1151*68af512aSJan Glauber dev_err(i2c->dev, 1152*68af512aSJan Glauber "no I2C 'clock-rate' or 'clock-frequency' property\n"); 1153*68af512aSJan Glauber result = -ENXIO; 1154*68af512aSJan Glauber goto out; 1155*68af512aSJan Glauber } 1156*68af512aSJan Glauber 1157*68af512aSJan Glauber i2c->sys_freq = octeon_get_io_clock_rate(); 1158*68af512aSJan Glauber 1159*68af512aSJan Glauber init_waitqueue_head(&i2c->queue); 1160*68af512aSJan Glauber 1161*68af512aSJan Glauber i2c->irq = irq; 1162*68af512aSJan Glauber 1163*68af512aSJan Glauber if (cn78xx_style) { 1164*68af512aSJan Glauber i2c->hlc_irq = hlc_irq; 1165*68af512aSJan Glauber 1166*68af512aSJan Glauber i2c->int_enable = octeon_i2c_int_enable78; 1167*68af512aSJan Glauber i2c->int_disable = octeon_i2c_int_disable78; 1168*68af512aSJan Glauber i2c->hlc_int_enable = octeon_i2c_hlc_int_enable78; 1169*68af512aSJan Glauber i2c->hlc_int_disable = octeon_i2c_hlc_int_disable78; 1170*68af512aSJan Glauber 1171*68af512aSJan Glauber irq_set_status_flags(i2c->irq, IRQ_NOAUTOEN); 1172*68af512aSJan Glauber irq_set_status_flags(i2c->hlc_irq, IRQ_NOAUTOEN); 1173*68af512aSJan Glauber 1174*68af512aSJan Glauber result = devm_request_irq(&pdev->dev, i2c->hlc_irq, 1175*68af512aSJan Glauber octeon_i2c_hlc_isr78, 0, 1176*68af512aSJan Glauber DRV_NAME, i2c); 1177*68af512aSJan Glauber if (result < 0) { 1178*68af512aSJan Glauber dev_err(i2c->dev, "failed to attach interrupt\n"); 1179*68af512aSJan Glauber goto out; 1180*68af512aSJan Glauber } 1181*68af512aSJan Glauber } else { 1182*68af512aSJan Glauber i2c->int_enable = octeon_i2c_int_enable; 1183*68af512aSJan Glauber i2c->int_disable = octeon_i2c_int_disable; 1184*68af512aSJan Glauber i2c->hlc_int_enable = octeon_i2c_hlc_int_enable; 1185*68af512aSJan Glauber i2c->hlc_int_disable = octeon_i2c_int_disable; 1186*68af512aSJan Glauber } 1187*68af512aSJan Glauber 1188*68af512aSJan Glauber result = devm_request_irq(&pdev->dev, i2c->irq, 1189*68af512aSJan Glauber octeon_i2c_isr, 0, DRV_NAME, i2c); 1190*68af512aSJan Glauber if (result < 0) { 1191*68af512aSJan Glauber dev_err(i2c->dev, "failed to attach interrupt\n"); 1192*68af512aSJan Glauber goto out; 1193*68af512aSJan Glauber } 1194*68af512aSJan Glauber 1195*68af512aSJan Glauber if (OCTEON_IS_MODEL(OCTEON_CN38XX)) 1196*68af512aSJan Glauber i2c->broken_irq_check = true; 1197*68af512aSJan Glauber 1198*68af512aSJan Glauber result = octeon_i2c_init_lowlevel(i2c); 1199*68af512aSJan Glauber if (result) { 1200*68af512aSJan Glauber dev_err(i2c->dev, "init low level failed\n"); 1201*68af512aSJan Glauber goto out; 1202*68af512aSJan Glauber } 1203*68af512aSJan Glauber 1204*68af512aSJan Glauber octeon_i2c_set_clock(i2c); 1205*68af512aSJan Glauber 1206*68af512aSJan Glauber i2c->adap = octeon_i2c_ops; 1207*68af512aSJan Glauber i2c->adap.timeout = msecs_to_jiffies(2); 1208*68af512aSJan Glauber i2c->adap.retries = 5; 1209*68af512aSJan Glauber i2c->adap.bus_recovery_info = &octeon_i2c_recovery_info; 1210*68af512aSJan Glauber i2c->adap.dev.parent = &pdev->dev; 1211*68af512aSJan Glauber i2c->adap.dev.of_node = node; 1212*68af512aSJan Glauber i2c_set_adapdata(&i2c->adap, i2c); 1213*68af512aSJan Glauber platform_set_drvdata(pdev, i2c); 1214*68af512aSJan Glauber 1215*68af512aSJan Glauber result = i2c_add_adapter(&i2c->adap); 1216*68af512aSJan Glauber if (result < 0) 1217*68af512aSJan Glauber goto out; 1218*68af512aSJan Glauber dev_info(i2c->dev, "probed\n"); 1219*68af512aSJan Glauber return 0; 1220*68af512aSJan Glauber 1221*68af512aSJan Glauber out: 1222*68af512aSJan Glauber return result; 1223*68af512aSJan Glauber }; 1224*68af512aSJan Glauber 1225*68af512aSJan Glauber static int octeon_i2c_remove(struct platform_device *pdev) 1226*68af512aSJan Glauber { 1227*68af512aSJan Glauber struct octeon_i2c *i2c = platform_get_drvdata(pdev); 1228*68af512aSJan Glauber 1229*68af512aSJan Glauber i2c_del_adapter(&i2c->adap); 1230*68af512aSJan Glauber return 0; 1231*68af512aSJan Glauber }; 1232*68af512aSJan Glauber 1233*68af512aSJan Glauber static const struct of_device_id octeon_i2c_match[] = { 1234*68af512aSJan Glauber { .compatible = "cavium,octeon-3860-twsi", }, 1235*68af512aSJan Glauber { .compatible = "cavium,octeon-7890-twsi", }, 1236*68af512aSJan Glauber {}, 1237*68af512aSJan Glauber }; 1238*68af512aSJan Glauber MODULE_DEVICE_TABLE(of, octeon_i2c_match); 1239*68af512aSJan Glauber 1240*68af512aSJan Glauber static struct platform_driver octeon_i2c_driver = { 1241*68af512aSJan Glauber .probe = octeon_i2c_probe, 1242*68af512aSJan Glauber .remove = octeon_i2c_remove, 1243*68af512aSJan Glauber .driver = { 1244*68af512aSJan Glauber .name = DRV_NAME, 1245*68af512aSJan Glauber .of_match_table = octeon_i2c_match, 1246*68af512aSJan Glauber }, 1247*68af512aSJan Glauber }; 1248*68af512aSJan Glauber 1249*68af512aSJan Glauber module_platform_driver(octeon_i2c_driver); 1250*68af512aSJan Glauber 1251*68af512aSJan Glauber MODULE_AUTHOR("Michael Lawnick <michael.lawnick.ext@nsn.com>"); 1252*68af512aSJan Glauber MODULE_DESCRIPTION("I2C-Bus adapter for Cavium OCTEON processors"); 1253*68af512aSJan Glauber MODULE_LICENSE("GPL"); 1254