Lines Matching +full:clkdiv +full:- +full:-
2 * i2c.c - driver for ADI TWI/I2C
4 * Copyright (c) 2006-2014 Analog Devices Inc.
6 * Licensed under the GPL-2 or later.
9 * Please see doc/driver-model/i2c-howto.txt for instructions.
25 ureg(clkdiv);
66 # error "The I2C hardware can only operate 20KHz - 400KHz"
85 * wait_for_completion - manage the actual i2c transfer
94 int_stat = readw(&twi->int_stat); in wait_for_completion()
97 writew(XMTSERV, &twi->int_stat); in wait_for_completion()
98 if (msg->alen) { in wait_for_completion()
99 writew(*(msg->abuf++), &twi->xmt_data8); in wait_for_completion()
100 --msg->alen; in wait_for_completion()
101 } else if (!(msg->flags & I2C_M_COMBO) && msg->len) { in wait_for_completion()
102 writew(*(msg->buf++), &twi->xmt_data8); in wait_for_completion()
103 --msg->len; in wait_for_completion()
105 ctl = readw(&twi->master_ctl); in wait_for_completion()
106 if (msg->flags & I2C_M_COMBO) in wait_for_completion()
108 &twi->master_ctl); in wait_for_completion()
110 writew(ctl | STOP, &twi->master_ctl); in wait_for_completion()
114 writew(RCVSERV, &twi->int_stat); in wait_for_completion()
115 if (msg->len) { in wait_for_completion()
116 *(msg->buf++) = readw(&twi->rcv_data8); in wait_for_completion()
117 --msg->len; in wait_for_completion()
118 } else if (msg->flags & I2C_M_STOP) { in wait_for_completion()
119 ctl = readw(&twi->master_ctl); in wait_for_completion()
120 writew(ctl | STOP, &twi->master_ctl); in wait_for_completion()
124 writew(MERR, &twi->int_stat); in wait_for_completion()
125 return msg->len; in wait_for_completion()
128 writew(MCOMP, &twi->int_stat); in wait_for_completion()
129 if (msg->flags & I2C_M_COMBO && msg->len) { in wait_for_completion()
130 ctl = readw(&twi->master_ctl); in wait_for_completion()
132 (min(msg->len, 0xff) << 6) | MEN | MDIR; in wait_for_completion()
133 writew(ctl, &twi->master_ctl); in wait_for_completion()
144 return msg->len; in wait_for_completion()
167 while (readw(&twi->master_stat) & BUSBUSY) in i2c_transfer()
172 writew(chip, &twi->master_addr); in i2c_transfer()
175 writew(XMTFLUSH | RCVFLUSH, &twi->fifo_ctl); in i2c_transfer()
176 writew(0, &twi->fifo_ctl); in i2c_transfer()
181 writew(*(msg.abuf++), &twi->xmt_data8); in i2c_transfer()
182 --msg.alen; in i2c_transfer()
184 writew(*(msg.buf++), &twi->xmt_data8); in i2c_transfer()
185 --msg.len; in i2c_transfer()
189 writew(-1, &twi->master_stat); in i2c_transfer()
190 writew(-1, &twi->int_stat); in i2c_transfer()
191 writew(0, &twi->int_mask); in i2c_transfer()
194 ctl = readw(&twi->master_ctl); in i2c_transfer()
197 writew(ctl, &twi->master_ctl); in i2c_transfer()
203 ctl = readw(&twi->master_ctl) & ~MEN; in i2c_transfer()
204 writew(ctl, &twi->master_ctl); in i2c_transfer()
205 ctl = readw(&twi->control) & ~TWI_ENA; in i2c_transfer()
206 writew(ctl, &twi->control); in i2c_transfer()
207 ctl = readw(&twi->control) | TWI_ENA; in i2c_transfer()
208 writew(ctl, &twi->control); in i2c_transfer()
217 u16 clkdiv = I2C_SPEED_TO_DUTY(speed); in adi_i2c_setspeed() local
220 if (clkdiv < I2C_DUTY_MAX || clkdiv > I2C_DUTY_MIN) in adi_i2c_setspeed()
221 return -1; in adi_i2c_setspeed()
222 clkdiv = (clkdiv << 8) | (clkdiv & 0xff); in adi_i2c_setspeed()
223 writew(clkdiv, &twi->clkdiv); in adi_i2c_setspeed()
226 writew(speed > 100000 ? FAST : 0, &twi->master_ctl); in adi_i2c_setspeed()
237 writew(prescale, &twi->control); in adi_i2c_init()
243 writew(TWI_ENA | prescale, &twi->control); in adi_i2c_init()
267 switch (adap->hwadapnr) { in i2c_get_base()
280 printf("wrong hwadapnr: %d\n", adap->hwadapnr); in i2c_get_base()