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);
175 static int rd_byte(struct qib_devdata *dd, int last) in rd_byte() argument
183 scl_out(dd, 1); in rd_byte()
184 data |= sda_in(dd, 0); in rd_byte()
185 scl_out(dd, 0); in rd_byte()
188 scl_out(dd, 1); in rd_byte()
189 stop_cmd(dd); in rd_byte()
191 sda_out(dd, 0); in rd_byte()
192 scl_out(dd, 1); in rd_byte()
193 scl_out(dd, 0); in rd_byte()
194 sda_out(dd, 1); in rd_byte()
206 static int wr_byte(struct qib_devdata *dd, u8 data) in wr_byte() argument
213 sda_out(dd, bit); in wr_byte()
214 scl_out(dd, 1); in wr_byte()
215 scl_out(dd, 0); in wr_byte()
217 return (!i2c_ackrcv(dd)) ? 1 : 0; in wr_byte()
224 static void start_seq(struct qib_devdata *dd) in start_seq() argument
226 sda_out(dd, 1); in start_seq()
227 scl_out(dd, 1); in start_seq()
228 sda_out(dd, 0); in start_seq()
230 scl_out(dd, 0); in start_seq()
239 static void stop_seq(struct qib_devdata *dd) in stop_seq() argument
241 scl_out(dd, 0); in stop_seq()
242 sda_out(dd, 0); in stop_seq()
243 scl_out(dd, 1); in stop_seq()
244 sda_out(dd, 1); in stop_seq()
253 static void stop_cmd(struct qib_devdata *dd) in stop_cmd() argument
255 stop_seq(dd); in stop_cmd()
264 int qib_twsi_reset(struct qib_devdata *dd) in qib_twsi_reset() argument
273 mask = (1UL << dd->gpio_scl_num) | (1UL << dd->gpio_sda_num); in qib_twsi_reset()
280 dd->f_gpio_mod(dd, 0, 0, mask); in qib_twsi_reset()
293 scl_out(dd, 0); in qib_twsi_reset()
294 scl_out(dd, 1); in qib_twsi_reset()
296 was_high |= sda_in(dd, 0); in qib_twsi_reset()
305 pins = dd->f_gpio_mod(dd, 0, 0, 0); in qib_twsi_reset()
307 qib_dev_err(dd, "GPIO pins not at rest: %d\n", in qib_twsi_reset()
311 sda_out(dd, 0); in qib_twsi_reset()
314 sda_out(dd, 1); in qib_twsi_reset()
328 static int qib_twsi_wr(struct qib_devdata *dd, int data, int flags) in qib_twsi_wr() argument
333 start_seq(dd); in qib_twsi_wr()
335 ret = wr_byte(dd, data); /* Leaves SCL low (from i2c_ackrcv()) */ in qib_twsi_wr()
338 stop_cmd(dd); in qib_twsi_wr()
357 int qib_twsi_blk_rd(struct qib_devdata *dd, int dev, int addr, in qib_twsi_blk_rd() argument
368 ret = qib_twsi_wr(dd, addr, QIB_TWSI_START); in qib_twsi_blk_rd()
371 ret = qib_twsi_wr(dd, dev | WRITE_CMD, QIB_TWSI_START); in qib_twsi_blk_rd()
373 stop_cmd(dd); in qib_twsi_blk_rd()
384 ret = qib_twsi_wr(dd, addr, 0); in qib_twsi_blk_rd()
388 qib_dev_err(dd, in qib_twsi_blk_rd()
394 ret = qib_twsi_wr(dd, dev | READ_CMD, QIB_TWSI_START); in qib_twsi_blk_rd()
397 stop_cmd(dd); in qib_twsi_blk_rd()
414 *bp++ = rd_byte(dd, !len); in qib_twsi_blk_rd()
435 int qib_twsi_blk_wr(struct qib_devdata *dd, int dev, int addr, in qib_twsi_blk_wr() argument
445 if (qib_twsi_wr(dd, (addr << 1) | WRITE_CMD, in qib_twsi_blk_wr()
451 if (qib_twsi_wr(dd, dev | WRITE_CMD, QIB_TWSI_START)) in qib_twsi_blk_wr()
453 ret = qib_twsi_wr(dd, addr, 0); in qib_twsi_blk_wr()
455 qib_dev_err(dd, in qib_twsi_blk_wr()
467 if (qib_twsi_wr(dd, *bp++, 0)) in qib_twsi_blk_wr()
470 stop_cmd(dd); in qib_twsi_blk_wr()
484 while (qib_twsi_wr(dd, dev | READ_CMD, QIB_TWSI_START)) { in qib_twsi_blk_wr()
485 stop_cmd(dd); in qib_twsi_blk_wr()
490 rd_byte(dd, 1); in qib_twsi_blk_wr()
497 stop_cmd(dd); in qib_twsi_blk_wr()