Lines Matching refs:dev
140 static void i2c_recover_bus(struct davinci_i2c_dev *dev) in i2c_recover_bus() argument
146 flag = davinci_i2c_read_reg(dev, DAVINCI_I2C_MDR_REG); in i2c_recover_bus()
149 davinci_i2c_write_reg(dev, DAVINCI_I2C_MDR_REG, flag); in i2c_recover_bus()
155 flag = davinci_i2c_read_reg(dev, DAVINCI_I2C_MDR_REG); in i2c_recover_bus()
157 davinci_i2c_write_reg(dev, DAVINCI_I2C_MDR_REG, flag); in i2c_recover_bus()
174 static void i2c_davinci_calc_clk_dividers(struct davinci_i2c_dev *dev) in i2c_davinci_calc_clk_dividers() argument
181 rt_uint32_t input_clock = clk_get_rate(dev->clk); in i2c_davinci_calc_clk_dividers()
205 clk = ((input_clock / (psc + 1)) / (dev->bus_freq * 1000)) - (d << 1); in i2c_davinci_calc_clk_dividers()
209 davinci_i2c_write_reg(dev, DAVINCI_I2C_PSC_REG, psc); in i2c_davinci_calc_clk_dividers()
210 davinci_i2c_write_reg(dev, DAVINCI_I2C_CLKH_REG, clkh); in i2c_davinci_calc_clk_dividers()
211 davinci_i2c_write_reg(dev, DAVINCI_I2C_CLKL_REG, clkl); in i2c_davinci_calc_clk_dividers()
221 static int i2c_davinci_init(struct davinci_i2c_dev *dev) in i2c_davinci_init() argument
224 davinci_i2c_reset_ctrl(dev, 0); in i2c_davinci_init()
227 i2c_davinci_calc_clk_dividers(dev); in i2c_davinci_init()
232 davinci_i2c_write_reg(dev, DAVINCI_I2C_OAR_REG, 0x08); in i2c_davinci_init()
235 davinci_i2c_read_reg(dev, DAVINCI_I2C_PSC_REG)); in i2c_davinci_init()
237 davinci_i2c_read_reg(dev, DAVINCI_I2C_CLKL_REG)); in i2c_davinci_init()
239 davinci_i2c_read_reg(dev, DAVINCI_I2C_CLKH_REG)); in i2c_davinci_init()
241 dev->bus_freq, dev->bus_delay); in i2c_davinci_init()
244 davinci_i2c_reset_ctrl(dev, 1); in i2c_davinci_init()
247 davinci_i2c_write_reg(dev, DAVINCI_I2C_IMR_REG, I2C_DAVINCI_INTR_ALL); in i2c_davinci_init()
255 static int i2c_davinci_wait_bus_not_busy(struct davinci_i2c_dev *dev, in i2c_davinci_wait_bus_not_busy() argument
260 RT_ASSERT(dev != RT_NULL); in i2c_davinci_wait_bus_not_busy()
261 RT_ASSERT(dev->bus != RT_NULL); in i2c_davinci_wait_bus_not_busy()
263 timeout = rt_tick_get() + dev->bus->timeout; in i2c_davinci_wait_bus_not_busy()
264 while (davinci_i2c_read_reg(dev, DAVINCI_I2C_STR_REG) in i2c_davinci_wait_bus_not_busy()
273 i2c_recover_bus(dev); in i2c_davinci_wait_bus_not_busy()
274 i2c_davinci_init(dev); in i2c_davinci_wait_bus_not_busy()
291 struct davinci_i2c_dev *dev = bus->priv; in i2c_davinci_xfer_msg() local
297 if (dev->bus_delay) in i2c_davinci_xfer_msg()
298 udelay(dev->bus_delay); in i2c_davinci_xfer_msg()
301 davinci_i2c_write_reg(dev, DAVINCI_I2C_SAR_REG, msg->addr); in i2c_davinci_xfer_msg()
303 dev->buf = msg->buf; in i2c_davinci_xfer_msg()
304 dev->buf_len = msg->len; in i2c_davinci_xfer_msg()
305 dev->stop = stop; in i2c_davinci_xfer_msg()
307 davinci_i2c_write_reg(dev, DAVINCI_I2C_CNT_REG, dev->buf_len); in i2c_davinci_xfer_msg()
310 dev->cmd_err = 0; in i2c_davinci_xfer_msg()
324 w = davinci_i2c_read_reg(dev, DAVINCI_I2C_IMR_REG); in i2c_davinci_xfer_msg()
329 davinci_i2c_write_reg(dev, DAVINCI_I2C_IMR_REG, w); in i2c_davinci_xfer_msg()
331 dev->terminate = 0; in i2c_davinci_xfer_msg()
338 davinci_i2c_write_reg(dev, DAVINCI_I2C_MDR_REG, flag); in i2c_davinci_xfer_msg()
347 if ((!(msg->flags & RT_I2C_RD)) && dev->buf_len) in i2c_davinci_xfer_msg()
349 davinci_i2c_write_reg(dev, DAVINCI_I2C_DXR_REG, *dev->buf++); in i2c_davinci_xfer_msg()
350 dev->buf_len--; in i2c_davinci_xfer_msg()
357 davinci_i2c_write_reg(dev, DAVINCI_I2C_MDR_REG, flag); in i2c_davinci_xfer_msg()
359 r = rt_sem_take(&dev->completion, dev->bus->timeout); in i2c_davinci_xfer_msg()
363 i2c_recover_bus(dev); in i2c_davinci_xfer_msg()
364 i2c_davinci_init(dev); in i2c_davinci_xfer_msg()
365 dev->buf_len = 0; in i2c_davinci_xfer_msg()
368 if (dev->buf_len) in i2c_davinci_xfer_msg()
377 dev->buf_len); in i2c_davinci_xfer_msg()
380 dev->terminate = 1; in i2c_davinci_xfer_msg()
381 dev->buf_len = 0; in i2c_davinci_xfer_msg()
387 if (!dev->cmd_err) in i2c_davinci_xfer_msg()
391 if (dev->cmd_err & DAVINCI_I2C_STR_AL) in i2c_davinci_xfer_msg()
393 i2c_davinci_init(dev); in i2c_davinci_xfer_msg()
397 if (dev->cmd_err & DAVINCI_I2C_STR_NACK) in i2c_davinci_xfer_msg()
403 w = davinci_i2c_read_reg(dev, DAVINCI_I2C_MDR_REG); in i2c_davinci_xfer_msg()
405 davinci_i2c_write_reg(dev, DAVINCI_I2C_MDR_REG, w); in i2c_davinci_xfer_msg()
418 struct davinci_i2c_dev *dev = bus->priv; in i2c_davinci_xfer() local
424 ret = i2c_davinci_wait_bus_not_busy(dev, 1); in i2c_davinci_xfer()
445 static void terminate_read(struct davinci_i2c_dev *dev) in terminate_read() argument
447 rt_uint16_t w = davinci_i2c_read_reg(dev, DAVINCI_I2C_MDR_REG); in terminate_read()
449 davinci_i2c_write_reg(dev, DAVINCI_I2C_MDR_REG, w); in terminate_read()
452 davinci_i2c_read_reg(dev, DAVINCI_I2C_DRR_REG); in terminate_read()
453 if (!dev->terminate) in terminate_read()
456 static void terminate_write(struct davinci_i2c_dev *dev) in terminate_write() argument
458 rt_uint16_t w = davinci_i2c_read_reg(dev, DAVINCI_I2C_MDR_REG); in terminate_write()
460 davinci_i2c_write_reg(dev, DAVINCI_I2C_MDR_REG, w); in terminate_write()
462 if (!dev->terminate) in terminate_write()
472 struct davinci_i2c_dev *dev = (struct davinci_i2c_dev *)param; in i2c_davinci_isr() local
477 while ((stat = davinci_i2c_read_reg(dev, DAVINCI_I2C_IVR_REG))) { in i2c_davinci_isr()
487 dev->cmd_err |= DAVINCI_I2C_STR_AL; in i2c_davinci_isr()
488 dev->buf_len = 0; in i2c_davinci_isr()
489 rt_sem_release(&dev->completion); in i2c_davinci_isr()
493 dev->cmd_err |= DAVINCI_I2C_STR_NACK; in i2c_davinci_isr()
494 dev->buf_len = 0; in i2c_davinci_isr()
495 rt_sem_release(&dev->completion); in i2c_davinci_isr()
499 davinci_i2c_write_reg(dev, in i2c_davinci_isr()
501 if (((dev->buf_len == 0) && (dev->stop != 0)) || in i2c_davinci_isr()
502 (dev->cmd_err & DAVINCI_I2C_STR_NACK)) { in i2c_davinci_isr()
503 w = davinci_i2c_read_reg(dev, in i2c_davinci_isr()
506 davinci_i2c_write_reg(dev, in i2c_davinci_isr()
509 rt_sem_release(&dev->completion); in i2c_davinci_isr()
513 if (dev->buf_len) { in i2c_davinci_isr()
514 *dev->buf++ = in i2c_davinci_isr()
515 davinci_i2c_read_reg(dev, in i2c_davinci_isr()
517 dev->buf_len--; in i2c_davinci_isr()
518 if (dev->buf_len) in i2c_davinci_isr()
521 davinci_i2c_write_reg(dev, in i2c_davinci_isr()
526 terminate_read(dev); in i2c_davinci_isr()
531 if (dev->buf_len) { in i2c_davinci_isr()
532 davinci_i2c_write_reg(dev, DAVINCI_I2C_DXR_REG, in i2c_davinci_isr()
533 *dev->buf++); in i2c_davinci_isr()
534 dev->buf_len--; in i2c_davinci_isr()
535 if (dev->buf_len) in i2c_davinci_isr()
538 w = davinci_i2c_read_reg(dev, in i2c_davinci_isr()
541 davinci_i2c_write_reg(dev, in i2c_davinci_isr()
546 terminate_write(dev); in i2c_davinci_isr()
551 davinci_i2c_write_reg(dev, in i2c_davinci_isr()
553 rt_sem_release(&dev->completion); in i2c_davinci_isr()
577 struct davinci_i2c_dev *dev; in davinci_i2c_init() local
592 dev = rt_malloc(sizeof(struct davinci_i2c_dev)); in davinci_i2c_init()
593 if (!dev) in davinci_i2c_init()
599 rt_memset((void *)dev, 0, sizeof(struct davinci_i2c_dev)); in davinci_i2c_init()
601 rt_sem_init(&dev->completion, "i2c_ack", 0, RT_IPC_FLAG_FIFO); in davinci_i2c_init()
603 dev->irq = IRQ_I2C; in davinci_i2c_init()
605 dev->clk = clk_get("I2CCLK"); in davinci_i2c_init()
606 if (dev->clk == RT_NULL) { in davinci_i2c_init()
613 dev->base = DAVINCI_I2C_BASE; in davinci_i2c_init()
614 dev->bus_freq = 100; in davinci_i2c_init()
615 dev->bus_delay = 0; in davinci_i2c_init()
616 dev->bus = bus; in davinci_i2c_init()
618 bus->priv = dev; in davinci_i2c_init()
620 i2c_davinci_init(dev); in davinci_i2c_init()
622 rt_hw_interrupt_install(dev->irq, i2c_davinci_isr, (void *)dev, "I2C"); in davinci_i2c_init()
623 rt_hw_interrupt_umask(dev->irq); in davinci_i2c_init()
628 rt_free(dev); in davinci_i2c_init()