Lines Matching refs:dd
67 static void i2c_wait_for_writes(struct qib_devdata *dd) in i2c_wait_for_writes() argument
74 dd->f_gpio_mod(dd, 0, 0, 0); in i2c_wait_for_writes()
89 static void scl_out(struct qib_devdata *dd, u8 bit) in scl_out() argument
95 mask = 1UL << dd->gpio_scl_num; in scl_out()
98 dd->f_gpio_mod(dd, 0, bit ? 0 : mask, mask); in scl_out()
110 if (mask & dd->f_gpio_mod(dd, 0, 0, 0)) in scl_out()
115 qib_dev_err(dd, "SCL interface stuck low > %d uSec\n", in scl_out()
118 i2c_wait_for_writes(dd); in scl_out()
121 static void sda_out(struct qib_devdata *dd, u8 bit) in sda_out() argument
125 mask = 1UL << dd->gpio_sda_num; in sda_out()
128 dd->f_gpio_mod(dd, 0, bit ? 0 : mask, mask); in sda_out()
130 i2c_wait_for_writes(dd); in sda_out()
134 static u8 sda_in(struct qib_devdata *dd, int wait) in sda_in() argument
139 bnum = dd->gpio_sda_num; in sda_in()
142 dd->f_gpio_mod(dd, 0, 0, mask); in sda_in()
143 read_val = dd->f_gpio_mod(dd, 0, 0, 0); in sda_in()
145 i2c_wait_for_writes(dd); in sda_in()
153 static int i2c_ackrcv(struct qib_devdata *dd) in i2c_ackrcv() argument
159 ack_received = sda_in(dd, 1); in i2c_ackrcv()
160 scl_out(dd, 1); in i2c_ackrcv()
161 ack_received = sda_in(dd, 1) == 0; in i2c_ackrcv()
162 scl_out(dd, 0); in i2c_ackrcv()
166 static void stop_cmd(struct qib_devdata *dd);
174 static int rd_byte(struct qib_devdata *dd, int last) in rd_byte() argument
182 scl_out(dd, 1); in rd_byte()
183 data |= sda_in(dd, 0); in rd_byte()
184 scl_out(dd, 0); in rd_byte()
187 scl_out(dd, 1); in rd_byte()
188 stop_cmd(dd); in rd_byte()
190 sda_out(dd, 0); in rd_byte()
191 scl_out(dd, 1); in rd_byte()
192 scl_out(dd, 0); in rd_byte()
193 sda_out(dd, 1); in rd_byte()
205 static int wr_byte(struct qib_devdata *dd, u8 data) in wr_byte() argument
212 sda_out(dd, bit); in wr_byte()
213 scl_out(dd, 1); in wr_byte()
214 scl_out(dd, 0); in wr_byte()
216 return (!i2c_ackrcv(dd)) ? 1 : 0; in wr_byte()
223 static void start_seq(struct qib_devdata *dd) in start_seq() argument
225 sda_out(dd, 1); in start_seq()
226 scl_out(dd, 1); in start_seq()
227 sda_out(dd, 0); in start_seq()
229 scl_out(dd, 0); in start_seq()
238 static void stop_seq(struct qib_devdata *dd) in stop_seq() argument
240 scl_out(dd, 0); in stop_seq()
241 sda_out(dd, 0); in stop_seq()
242 scl_out(dd, 1); in stop_seq()
243 sda_out(dd, 1); in stop_seq()
252 static void stop_cmd(struct qib_devdata *dd) in stop_cmd() argument
254 stop_seq(dd); in stop_cmd()
263 int qib_twsi_reset(struct qib_devdata *dd) in qib_twsi_reset() argument
272 mask = (1UL << dd->gpio_scl_num) | (1UL << dd->gpio_sda_num); in qib_twsi_reset()
279 dd->f_gpio_mod(dd, 0, 0, mask); in qib_twsi_reset()
292 scl_out(dd, 0); in qib_twsi_reset()
293 scl_out(dd, 1); in qib_twsi_reset()
295 was_high |= sda_in(dd, 0); in qib_twsi_reset()
304 pins = dd->f_gpio_mod(dd, 0, 0, 0); in qib_twsi_reset()
306 qib_dev_err(dd, "GPIO pins not at rest: %d\n", in qib_twsi_reset()
310 sda_out(dd, 0); in qib_twsi_reset()
313 sda_out(dd, 1); in qib_twsi_reset()
327 static int qib_twsi_wr(struct qib_devdata *dd, int data, int flags) in qib_twsi_wr() argument
332 start_seq(dd); in qib_twsi_wr()
334 ret = wr_byte(dd, data); /* Leaves SCL low (from i2c_ackrcv()) */ in qib_twsi_wr()
337 stop_cmd(dd); in qib_twsi_wr()
356 int qib_twsi_blk_rd(struct qib_devdata *dd, int dev, int addr, in qib_twsi_blk_rd() argument
367 ret = qib_twsi_wr(dd, addr, QIB_TWSI_START); in qib_twsi_blk_rd()
370 ret = qib_twsi_wr(dd, dev | WRITE_CMD, QIB_TWSI_START); in qib_twsi_blk_rd()
372 stop_cmd(dd); in qib_twsi_blk_rd()
383 ret = qib_twsi_wr(dd, addr, 0); in qib_twsi_blk_rd()
387 qib_dev_err(dd, in qib_twsi_blk_rd()
393 ret = qib_twsi_wr(dd, dev | READ_CMD, QIB_TWSI_START); in qib_twsi_blk_rd()
396 stop_cmd(dd); in qib_twsi_blk_rd()
413 *bp++ = rd_byte(dd, !len); in qib_twsi_blk_rd()
434 int qib_twsi_blk_wr(struct qib_devdata *dd, int dev, int addr, in qib_twsi_blk_wr() argument
444 if (qib_twsi_wr(dd, (addr << 1) | WRITE_CMD, in qib_twsi_blk_wr()
450 if (qib_twsi_wr(dd, dev | WRITE_CMD, QIB_TWSI_START)) in qib_twsi_blk_wr()
452 ret = qib_twsi_wr(dd, addr, 0); in qib_twsi_blk_wr()
454 qib_dev_err(dd, in qib_twsi_blk_wr()
466 if (qib_twsi_wr(dd, *bp++, 0)) in qib_twsi_blk_wr()
469 stop_cmd(dd); in qib_twsi_blk_wr()
483 while (qib_twsi_wr(dd, dev | READ_CMD, QIB_TWSI_START)) { in qib_twsi_blk_wr()
484 stop_cmd(dd); in qib_twsi_blk_wr()
489 rd_byte(dd, 1); in qib_twsi_blk_wr()
496 stop_cmd(dd); in qib_twsi_blk_wr()