Lines Matching refs:i2c_dev
73 static inline void bcm2835_i2c_writel(struct bcm2835_i2c_dev *i2c_dev, in bcm2835_i2c_writel() argument
76 writel(val, i2c_dev->regs + reg); in bcm2835_i2c_writel()
79 static inline u32 bcm2835_i2c_readl(struct bcm2835_i2c_dev *i2c_dev, u32 reg) in bcm2835_i2c_readl() argument
81 return readl(i2c_dev->regs + reg); in bcm2835_i2c_readl()
87 struct bcm2835_i2c_dev *i2c_dev; member
119 bcm2835_i2c_writel(div->i2c_dev, BCM2835_I2C_DIV, divider); in clk_bcm2835_i2c_set_rate()
134 bcm2835_i2c_writel(div->i2c_dev, BCM2835_I2C_DEL, in clk_bcm2835_i2c_set_rate()
152 u32 divider = bcm2835_i2c_readl(div->i2c_dev, BCM2835_I2C_DIV); in clk_bcm2835_i2c_recalc_rate()
165 struct bcm2835_i2c_dev *i2c_dev) in bcm2835_i2c_register_div() argument
187 priv->i2c_dev = i2c_dev; in bcm2835_i2c_register_div()
193 static void bcm2835_fill_txfifo(struct bcm2835_i2c_dev *i2c_dev) in bcm2835_fill_txfifo() argument
197 while (i2c_dev->msg_buf_remaining) { in bcm2835_fill_txfifo()
198 val = bcm2835_i2c_readl(i2c_dev, BCM2835_I2C_S); in bcm2835_fill_txfifo()
201 bcm2835_i2c_writel(i2c_dev, BCM2835_I2C_FIFO, in bcm2835_fill_txfifo()
202 *i2c_dev->msg_buf); in bcm2835_fill_txfifo()
203 i2c_dev->msg_buf++; in bcm2835_fill_txfifo()
204 i2c_dev->msg_buf_remaining--; in bcm2835_fill_txfifo()
208 static void bcm2835_drain_rxfifo(struct bcm2835_i2c_dev *i2c_dev) in bcm2835_drain_rxfifo() argument
212 while (i2c_dev->msg_buf_remaining) { in bcm2835_drain_rxfifo()
213 val = bcm2835_i2c_readl(i2c_dev, BCM2835_I2C_S); in bcm2835_drain_rxfifo()
216 *i2c_dev->msg_buf = bcm2835_i2c_readl(i2c_dev, in bcm2835_drain_rxfifo()
218 i2c_dev->msg_buf++; in bcm2835_drain_rxfifo()
219 i2c_dev->msg_buf_remaining--; in bcm2835_drain_rxfifo()
236 static void bcm2835_i2c_start_transfer(struct bcm2835_i2c_dev *i2c_dev) in bcm2835_i2c_start_transfer() argument
239 struct i2c_msg *msg = i2c_dev->curr_msg; in bcm2835_i2c_start_transfer()
240 bool last_msg = (i2c_dev->num_msgs == 1); in bcm2835_i2c_start_transfer()
242 if (!i2c_dev->num_msgs) in bcm2835_i2c_start_transfer()
245 i2c_dev->num_msgs--; in bcm2835_i2c_start_transfer()
246 i2c_dev->msg_buf = msg->buf; in bcm2835_i2c_start_transfer()
247 i2c_dev->msg_buf_remaining = msg->len; in bcm2835_i2c_start_transfer()
257 bcm2835_i2c_writel(i2c_dev, BCM2835_I2C_A, msg->addr); in bcm2835_i2c_start_transfer()
258 bcm2835_i2c_writel(i2c_dev, BCM2835_I2C_DLEN, msg->len); in bcm2835_i2c_start_transfer()
259 bcm2835_i2c_writel(i2c_dev, BCM2835_I2C_C, c); in bcm2835_i2c_start_transfer()
262 static void bcm2835_i2c_finish_transfer(struct bcm2835_i2c_dev *i2c_dev) in bcm2835_i2c_finish_transfer() argument
264 i2c_dev->curr_msg = NULL; in bcm2835_i2c_finish_transfer()
265 i2c_dev->num_msgs = 0; in bcm2835_i2c_finish_transfer()
267 i2c_dev->msg_buf = NULL; in bcm2835_i2c_finish_transfer()
268 i2c_dev->msg_buf_remaining = 0; in bcm2835_i2c_finish_transfer()
282 struct bcm2835_i2c_dev *i2c_dev = data; in bcm2835_i2c_isr() local
285 val = bcm2835_i2c_readl(i2c_dev, BCM2835_I2C_S); in bcm2835_i2c_isr()
289 i2c_dev->msg_err = err; in bcm2835_i2c_isr()
294 if (!i2c_dev->curr_msg) { in bcm2835_i2c_isr()
295 dev_err(i2c_dev->dev, "Got unexpected interrupt (from firmware?)\n"); in bcm2835_i2c_isr()
296 } else if (i2c_dev->curr_msg->flags & I2C_M_RD) { in bcm2835_i2c_isr()
297 bcm2835_drain_rxfifo(i2c_dev); in bcm2835_i2c_isr()
298 val = bcm2835_i2c_readl(i2c_dev, BCM2835_I2C_S); in bcm2835_i2c_isr()
301 if ((val & BCM2835_I2C_S_RXD) || i2c_dev->msg_buf_remaining) in bcm2835_i2c_isr()
302 i2c_dev->msg_err = BCM2835_I2C_S_LEN; in bcm2835_i2c_isr()
304 i2c_dev->msg_err = 0; in bcm2835_i2c_isr()
309 if (!i2c_dev->msg_buf_remaining) { in bcm2835_i2c_isr()
310 i2c_dev->msg_err = val | BCM2835_I2C_S_LEN; in bcm2835_i2c_isr()
314 bcm2835_fill_txfifo(i2c_dev); in bcm2835_i2c_isr()
316 if (i2c_dev->num_msgs && !i2c_dev->msg_buf_remaining) { in bcm2835_i2c_isr()
317 i2c_dev->curr_msg++; in bcm2835_i2c_isr()
318 bcm2835_i2c_start_transfer(i2c_dev); in bcm2835_i2c_isr()
325 if (!i2c_dev->msg_buf_remaining) { in bcm2835_i2c_isr()
326 i2c_dev->msg_err = val | BCM2835_I2C_S_LEN; in bcm2835_i2c_isr()
330 bcm2835_drain_rxfifo(i2c_dev); in bcm2835_i2c_isr()
337 bcm2835_i2c_writel(i2c_dev, BCM2835_I2C_C, BCM2835_I2C_C_CLEAR); in bcm2835_i2c_isr()
338 bcm2835_i2c_writel(i2c_dev, BCM2835_I2C_S, BCM2835_I2C_S_CLKT | in bcm2835_i2c_isr()
340 complete(&i2c_dev->completion); in bcm2835_i2c_isr()
348 struct bcm2835_i2c_dev *i2c_dev = i2c_get_adapdata(adap); in bcm2835_i2c_xfer() local
354 dev_warn_once(i2c_dev->dev, in bcm2835_i2c_xfer()
359 i2c_dev->curr_msg = msgs; in bcm2835_i2c_xfer()
360 i2c_dev->num_msgs = num; in bcm2835_i2c_xfer()
361 reinit_completion(&i2c_dev->completion); in bcm2835_i2c_xfer()
363 bcm2835_i2c_start_transfer(i2c_dev); in bcm2835_i2c_xfer()
365 time_left = wait_for_completion_timeout(&i2c_dev->completion, in bcm2835_i2c_xfer()
368 bcm2835_i2c_finish_transfer(i2c_dev); in bcm2835_i2c_xfer()
371 bcm2835_i2c_writel(i2c_dev, BCM2835_I2C_C, in bcm2835_i2c_xfer()
373 dev_err(i2c_dev->dev, "i2c transfer timed out\n"); in bcm2835_i2c_xfer()
377 if (!i2c_dev->msg_err) in bcm2835_i2c_xfer()
380 dev_dbg(i2c_dev->dev, "i2c transfer failed: %x\n", i2c_dev->msg_err); in bcm2835_i2c_xfer()
382 if (i2c_dev->msg_err & BCM2835_I2C_S_ERR) in bcm2835_i2c_xfer()
409 struct bcm2835_i2c_dev *i2c_dev; in bcm2835_i2c_probe() local
415 i2c_dev = devm_kzalloc(&pdev->dev, sizeof(*i2c_dev), GFP_KERNEL); in bcm2835_i2c_probe()
416 if (!i2c_dev) in bcm2835_i2c_probe()
418 platform_set_drvdata(pdev, i2c_dev); in bcm2835_i2c_probe()
419 i2c_dev->dev = &pdev->dev; in bcm2835_i2c_probe()
420 init_completion(&i2c_dev->completion); in bcm2835_i2c_probe()
422 i2c_dev->regs = devm_platform_get_and_ioremap_resource(pdev, 0, NULL); in bcm2835_i2c_probe()
423 if (IS_ERR(i2c_dev->regs)) in bcm2835_i2c_probe()
424 return PTR_ERR(i2c_dev->regs); in bcm2835_i2c_probe()
431 i2c_dev->bus_clk = bcm2835_i2c_register_div(&pdev->dev, mclk, i2c_dev); in bcm2835_i2c_probe()
433 if (IS_ERR(i2c_dev->bus_clk)) { in bcm2835_i2c_probe()
435 return PTR_ERR(i2c_dev->bus_clk); in bcm2835_i2c_probe()
446 ret = clk_set_rate_exclusive(i2c_dev->bus_clk, bus_clk_rate); in bcm2835_i2c_probe()
452 ret = clk_prepare_enable(i2c_dev->bus_clk); in bcm2835_i2c_probe()
458 i2c_dev->irq = platform_get_irq(pdev, 0); in bcm2835_i2c_probe()
459 if (i2c_dev->irq < 0) { in bcm2835_i2c_probe()
460 ret = i2c_dev->irq; in bcm2835_i2c_probe()
464 ret = request_irq(i2c_dev->irq, bcm2835_i2c_isr, IRQF_SHARED, in bcm2835_i2c_probe()
465 dev_name(&pdev->dev), i2c_dev); in bcm2835_i2c_probe()
471 adap = &i2c_dev->adapter; in bcm2835_i2c_probe()
472 i2c_set_adapdata(adap, i2c_dev); in bcm2835_i2c_probe()
487 bcm2835_i2c_writel(i2c_dev, BCM2835_I2C_CLKT, 0); in bcm2835_i2c_probe()
488 bcm2835_i2c_writel(i2c_dev, BCM2835_I2C_C, 0); in bcm2835_i2c_probe()
497 free_irq(i2c_dev->irq, i2c_dev); in bcm2835_i2c_probe()
499 clk_disable_unprepare(i2c_dev->bus_clk); in bcm2835_i2c_probe()
501 clk_rate_exclusive_put(i2c_dev->bus_clk); in bcm2835_i2c_probe()
508 struct bcm2835_i2c_dev *i2c_dev = platform_get_drvdata(pdev); in bcm2835_i2c_remove() local
510 clk_rate_exclusive_put(i2c_dev->bus_clk); in bcm2835_i2c_remove()
511 clk_disable_unprepare(i2c_dev->bus_clk); in bcm2835_i2c_remove()
513 free_irq(i2c_dev->irq, i2c_dev); in bcm2835_i2c_remove()
514 i2c_del_adapter(&i2c_dev->adapter); in bcm2835_i2c_remove()