• Home
  • Raw
  • Download

Lines Matching refs:i2c

74 #define MXS_I2C_DATA(i2c)	((i2c->dev_type == MXS_I2C_V1) ? 0x60 : 0xa0)  argument
76 #define MXS_I2C_DEBUG0_CLR(i2c) ((i2c->dev_type == MXS_I2C_V1) ? 0x78 : 0xb8) argument
137 static int mxs_i2c_reset(struct mxs_i2c_dev *i2c) in mxs_i2c_reset() argument
139 int ret = stmp_reset_block(i2c->regs); in mxs_i2c_reset()
150 writel(i2c->timing0, i2c->regs + MXS_I2C_TIMING0); in mxs_i2c_reset()
151 writel(i2c->timing1, i2c->regs + MXS_I2C_TIMING1); in mxs_i2c_reset()
152 writel(i2c->timing2, i2c->regs + MXS_I2C_TIMING2); in mxs_i2c_reset()
154 writel(MXS_I2C_IRQ_MASK << 8, i2c->regs + MXS_I2C_CTRL1_SET); in mxs_i2c_reset()
159 static void mxs_i2c_dma_finish(struct mxs_i2c_dev *i2c) in mxs_i2c_dma_finish() argument
161 if (i2c->dma_read) { in mxs_i2c_dma_finish()
162 dma_unmap_sg(i2c->dev, &i2c->sg_io[0], 1, DMA_TO_DEVICE); in mxs_i2c_dma_finish()
163 dma_unmap_sg(i2c->dev, &i2c->sg_io[1], 1, DMA_FROM_DEVICE); in mxs_i2c_dma_finish()
165 dma_unmap_sg(i2c->dev, i2c->sg_io, 2, DMA_TO_DEVICE); in mxs_i2c_dma_finish()
171 struct mxs_i2c_dev *i2c = param; in mxs_i2c_dma_irq_callback() local
173 complete(&i2c->cmd_complete); in mxs_i2c_dma_irq_callback()
174 mxs_i2c_dma_finish(i2c); in mxs_i2c_dma_irq_callback()
181 struct mxs_i2c_dev *i2c = i2c_get_adapdata(adap); in mxs_i2c_dma_setup_xfer() local
184 i2c->dma_read = 1; in mxs_i2c_dma_setup_xfer()
185 i2c->addr_data = (msg->addr << 1) | I2C_SMBUS_READ; in mxs_i2c_dma_setup_xfer()
192 i2c->pio_data[0] = MXS_CMD_I2C_SELECT; in mxs_i2c_dma_setup_xfer()
193 desc = dmaengine_prep_slave_sg(i2c->dmach, in mxs_i2c_dma_setup_xfer()
194 (struct scatterlist *)&i2c->pio_data[0], in mxs_i2c_dma_setup_xfer()
197 dev_err(i2c->dev, in mxs_i2c_dma_setup_xfer()
203 sg_init_one(&i2c->sg_io[0], &i2c->addr_data, 1); in mxs_i2c_dma_setup_xfer()
204 dma_map_sg(i2c->dev, &i2c->sg_io[0], 1, DMA_TO_DEVICE); in mxs_i2c_dma_setup_xfer()
205 desc = dmaengine_prep_slave_sg(i2c->dmach, &i2c->sg_io[0], 1, in mxs_i2c_dma_setup_xfer()
209 dev_err(i2c->dev, in mxs_i2c_dma_setup_xfer()
219 i2c->pio_data[1] = flags | MXS_CMD_I2C_READ | in mxs_i2c_dma_setup_xfer()
221 desc = dmaengine_prep_slave_sg(i2c->dmach, in mxs_i2c_dma_setup_xfer()
222 (struct scatterlist *)&i2c->pio_data[1], in mxs_i2c_dma_setup_xfer()
225 dev_err(i2c->dev, in mxs_i2c_dma_setup_xfer()
231 sg_init_one(&i2c->sg_io[1], msg->buf, msg->len); in mxs_i2c_dma_setup_xfer()
232 dma_map_sg(i2c->dev, &i2c->sg_io[1], 1, DMA_FROM_DEVICE); in mxs_i2c_dma_setup_xfer()
233 desc = dmaengine_prep_slave_sg(i2c->dmach, &i2c->sg_io[1], 1, in mxs_i2c_dma_setup_xfer()
237 dev_err(i2c->dev, in mxs_i2c_dma_setup_xfer()
242 i2c->dma_read = 0; in mxs_i2c_dma_setup_xfer()
243 i2c->addr_data = (msg->addr << 1) | I2C_SMBUS_WRITE; in mxs_i2c_dma_setup_xfer()
250 i2c->pio_data[0] = flags | MXS_CMD_I2C_WRITE | in mxs_i2c_dma_setup_xfer()
252 desc = dmaengine_prep_slave_sg(i2c->dmach, in mxs_i2c_dma_setup_xfer()
253 (struct scatterlist *)&i2c->pio_data[0], in mxs_i2c_dma_setup_xfer()
256 dev_err(i2c->dev, in mxs_i2c_dma_setup_xfer()
262 sg_init_table(i2c->sg_io, 2); in mxs_i2c_dma_setup_xfer()
263 sg_set_buf(&i2c->sg_io[0], &i2c->addr_data, 1); in mxs_i2c_dma_setup_xfer()
264 sg_set_buf(&i2c->sg_io[1], msg->buf, msg->len); in mxs_i2c_dma_setup_xfer()
265 dma_map_sg(i2c->dev, i2c->sg_io, 2, DMA_TO_DEVICE); in mxs_i2c_dma_setup_xfer()
266 desc = dmaengine_prep_slave_sg(i2c->dmach, i2c->sg_io, 2, in mxs_i2c_dma_setup_xfer()
270 dev_err(i2c->dev, in mxs_i2c_dma_setup_xfer()
281 desc->callback_param = i2c; in mxs_i2c_dma_setup_xfer()
285 dma_async_issue_pending(i2c->dmach); in mxs_i2c_dma_setup_xfer()
290 dma_unmap_sg(i2c->dev, &i2c->sg_io[1], 1, DMA_FROM_DEVICE); in mxs_i2c_dma_setup_xfer()
292 dma_unmap_sg(i2c->dev, &i2c->sg_io[0], 1, DMA_TO_DEVICE); in mxs_i2c_dma_setup_xfer()
294 dmaengine_terminate_all(i2c->dmach); in mxs_i2c_dma_setup_xfer()
299 dma_unmap_sg(i2c->dev, i2c->sg_io, 2, DMA_TO_DEVICE); in mxs_i2c_dma_setup_xfer()
301 dmaengine_terminate_all(i2c->dmach); in mxs_i2c_dma_setup_xfer()
305 static int mxs_i2c_pio_wait_xfer_end(struct mxs_i2c_dev *i2c) in mxs_i2c_pio_wait_xfer_end() argument
309 while (readl(i2c->regs + MXS_I2C_CTRL0) & MXS_I2C_CTRL0_RUN) { in mxs_i2c_pio_wait_xfer_end()
310 if (readl(i2c->regs + MXS_I2C_CTRL1) & in mxs_i2c_pio_wait_xfer_end()
321 static int mxs_i2c_pio_check_error_state(struct mxs_i2c_dev *i2c) in mxs_i2c_pio_check_error_state() argument
325 state = readl(i2c->regs + MXS_I2C_CTRL1_CLR) & MXS_I2C_IRQ_MASK; in mxs_i2c_pio_check_error_state()
328 i2c->cmd_err = -ENXIO; in mxs_i2c_pio_check_error_state()
333 i2c->cmd_err = -EIO; in mxs_i2c_pio_check_error_state()
335 return i2c->cmd_err; in mxs_i2c_pio_check_error_state()
338 static void mxs_i2c_pio_trigger_cmd(struct mxs_i2c_dev *i2c, u32 cmd) in mxs_i2c_pio_trigger_cmd() argument
342 writel(cmd, i2c->regs + MXS_I2C_CTRL0); in mxs_i2c_pio_trigger_cmd()
345 reg = readl(i2c->regs + MXS_I2C_CTRL0); in mxs_i2c_pio_trigger_cmd()
347 writel(reg, i2c->regs + MXS_I2C_CTRL0); in mxs_i2c_pio_trigger_cmd()
358 static void mxs_i2c_pio_trigger_write_cmd(struct mxs_i2c_dev *i2c, u32 cmd, in mxs_i2c_pio_trigger_write_cmd() argument
361 writel(cmd, i2c->regs + MXS_I2C_CTRL0); in mxs_i2c_pio_trigger_write_cmd()
363 if (i2c->dev_type == MXS_I2C_V1) in mxs_i2c_pio_trigger_write_cmd()
364 writel(MXS_I2C_CTRL0_PIO_MODE, i2c->regs + MXS_I2C_CTRL0_SET); in mxs_i2c_pio_trigger_write_cmd()
366 writel(data, i2c->regs + MXS_I2C_DATA(i2c)); in mxs_i2c_pio_trigger_write_cmd()
367 writel(MXS_I2C_CTRL0_RUN, i2c->regs + MXS_I2C_CTRL0_SET); in mxs_i2c_pio_trigger_write_cmd()
373 struct mxs_i2c_dev *i2c = i2c_get_adapdata(adap); in mxs_i2c_pio_setup_xfer() local
380 writel(MXS_I2C_IRQ_MASK << 8, i2c->regs + MXS_I2C_CTRL1_CLR); in mxs_i2c_pio_setup_xfer()
417 mxs_i2c_pio_trigger_write_cmd(i2c, MXS_CMD_I2C_SELECT, in mxs_i2c_pio_setup_xfer()
420 ret = mxs_i2c_pio_wait_xfer_end(i2c); in mxs_i2c_pio_setup_xfer()
422 dev_dbg(i2c->dev, in mxs_i2c_pio_setup_xfer()
428 mxs_i2c_pio_trigger_cmd(i2c, in mxs_i2c_pio_setup_xfer()
432 ret = mxs_i2c_pio_wait_xfer_end(i2c); in mxs_i2c_pio_setup_xfer()
434 dev_dbg(i2c->dev, in mxs_i2c_pio_setup_xfer()
439 data = readl(i2c->regs + MXS_I2C_DATA(i2c)); in mxs_i2c_pio_setup_xfer()
510 dev_dbg(i2c->dev, in mxs_i2c_pio_setup_xfer()
518 i2c->regs + MXS_I2C_DEBUG0_CLR(i2c)); in mxs_i2c_pio_setup_xfer()
520 mxs_i2c_pio_trigger_write_cmd(i2c, in mxs_i2c_pio_setup_xfer()
529 ret = mxs_i2c_pio_wait_xfer_end(i2c); in mxs_i2c_pio_setup_xfer()
531 dev_dbg(i2c->dev, in mxs_i2c_pio_setup_xfer()
537 ret = readl(i2c->regs + MXS_I2C_STAT) & in mxs_i2c_pio_setup_xfer()
547 ret = mxs_i2c_pio_check_error_state(i2c); in mxs_i2c_pio_setup_xfer()
551 writel(MXS_I2C_IRQ_MASK, i2c->regs + MXS_I2C_CTRL1_CLR); in mxs_i2c_pio_setup_xfer()
552 writel(MXS_I2C_IRQ_MASK << 8, i2c->regs + MXS_I2C_CTRL1_SET); in mxs_i2c_pio_setup_xfer()
555 if (i2c->dev_type == MXS_I2C_V1) in mxs_i2c_pio_setup_xfer()
556 writel(MXS_I2C_CTRL0_PIO_MODE, i2c->regs + MXS_I2C_CTRL0_CLR); in mxs_i2c_pio_setup_xfer()
567 struct mxs_i2c_dev *i2c = i2c_get_adapdata(adap); in mxs_i2c_xfer_msg() local
575 dev_dbg(i2c->dev, "addr: 0x%04x, len: %d, flags: 0x%x, stop: %d\n", in mxs_i2c_xfer_msg()
591 i2c->cmd_err = 0; in mxs_i2c_xfer_msg()
596 mxs_i2c_reset(i2c); in mxs_i2c_xfer_msg()
598 reinit_completion(&i2c->cmd_complete); in mxs_i2c_xfer_msg()
603 time_left = wait_for_completion_timeout(&i2c->cmd_complete, in mxs_i2c_xfer_msg()
608 ret = i2c->cmd_err; in mxs_i2c_xfer_msg()
617 i2c->regs + MXS_I2C_CTRL1_SET); in mxs_i2c_xfer_msg()
631 if (i2c->dev_type == MXS_I2C_V1) in mxs_i2c_xfer_msg()
632 mxs_i2c_reset(i2c); in mxs_i2c_xfer_msg()
634 dev_dbg(i2c->dev, "Done with err=%d\n", ret); in mxs_i2c_xfer_msg()
639 dev_dbg(i2c->dev, "Timeout!\n"); in mxs_i2c_xfer_msg()
640 mxs_i2c_dma_finish(i2c); in mxs_i2c_xfer_msg()
641 ret = mxs_i2c_reset(i2c); in mxs_i2c_xfer_msg()
670 struct mxs_i2c_dev *i2c = dev_id; in mxs_i2c_isr() local
671 u32 stat = readl(i2c->regs + MXS_I2C_CTRL1) & MXS_I2C_IRQ_MASK; in mxs_i2c_isr()
677 i2c->cmd_err = -ENXIO; in mxs_i2c_isr()
682 i2c->cmd_err = -EIO; in mxs_i2c_isr()
684 writel(stat, i2c->regs + MXS_I2C_CTRL1_CLR); in mxs_i2c_isr()
694 static void mxs_i2c_derive_timing(struct mxs_i2c_dev *i2c, uint32_t speed) in mxs_i2c_derive_timing() argument
701 struct device *dev = i2c->dev; in mxs_i2c_derive_timing()
764 i2c->timing0 = (high_count << 16) | rcv_count; in mxs_i2c_derive_timing()
765 i2c->timing1 = (low_count << 16) | xmit_count; in mxs_i2c_derive_timing()
766 i2c->timing2 = (bus_free << 16 | leadin); in mxs_i2c_derive_timing()
769 static int mxs_i2c_get_ofdata(struct mxs_i2c_dev *i2c) in mxs_i2c_get_ofdata() argument
772 struct device *dev = i2c->dev; in mxs_i2c_get_ofdata()
782 mxs_i2c_derive_timing(i2c, speed); in mxs_i2c_get_ofdata()
810 struct mxs_i2c_dev *i2c; in mxs_i2c_probe() local
815 i2c = devm_kzalloc(dev, sizeof(*i2c), GFP_KERNEL); in mxs_i2c_probe()
816 if (!i2c) in mxs_i2c_probe()
821 i2c->dev_type = device_id->driver_data; in mxs_i2c_probe()
825 i2c->regs = devm_ioremap_resource(&pdev->dev, res); in mxs_i2c_probe()
826 if (IS_ERR(i2c->regs)) in mxs_i2c_probe()
827 return PTR_ERR(i2c->regs); in mxs_i2c_probe()
833 err = devm_request_irq(dev, irq, mxs_i2c_isr, 0, dev_name(dev), i2c); in mxs_i2c_probe()
837 i2c->dev = dev; in mxs_i2c_probe()
839 init_completion(&i2c->cmd_complete); in mxs_i2c_probe()
842 err = mxs_i2c_get_ofdata(i2c); in mxs_i2c_probe()
848 i2c->dmach = dma_request_slave_channel(dev, "rx-tx"); in mxs_i2c_probe()
849 if (!i2c->dmach) { in mxs_i2c_probe()
854 platform_set_drvdata(pdev, i2c); in mxs_i2c_probe()
857 err = mxs_i2c_reset(i2c); in mxs_i2c_probe()
861 adap = &i2c->adapter; in mxs_i2c_probe()
868 i2c_set_adapdata(adap, i2c); in mxs_i2c_probe()
872 i2c->regs + MXS_I2C_CTRL0_SET); in mxs_i2c_probe()
881 struct mxs_i2c_dev *i2c = platform_get_drvdata(pdev); in mxs_i2c_remove() local
883 i2c_del_adapter(&i2c->adapter); in mxs_i2c_remove()
885 if (i2c->dmach) in mxs_i2c_remove()
886 dma_release_channel(i2c->dmach); in mxs_i2c_remove()
888 writel(MXS_I2C_CTRL0_SFTRST, i2c->regs + MXS_I2C_CTRL0_SET); in mxs_i2c_remove()