Lines Matching refs:i2c_dev

68 static inline void bcm2835_i2c_writel(struct bcm2835_i2c_dev *i2c_dev,  in bcm2835_i2c_writel()  argument
71 writel(val, i2c_dev->regs + reg); in bcm2835_i2c_writel()
74 static inline u32 bcm2835_i2c_readl(struct bcm2835_i2c_dev *i2c_dev, u32 reg) in bcm2835_i2c_readl() argument
76 return readl(i2c_dev->regs + reg); in bcm2835_i2c_readl()
82 struct bcm2835_i2c_dev *i2c_dev; member
114 bcm2835_i2c_writel(div->i2c_dev, BCM2835_I2C_DIV, divider); in clk_bcm2835_i2c_set_rate()
129 bcm2835_i2c_writel(div->i2c_dev, BCM2835_I2C_DEL, in clk_bcm2835_i2c_set_rate()
147 u32 divider = bcm2835_i2c_readl(div->i2c_dev, BCM2835_I2C_DIV); in clk_bcm2835_i2c_recalc_rate()
160 struct bcm2835_i2c_dev *i2c_dev) in bcm2835_i2c_register_div() argument
182 priv->i2c_dev = i2c_dev; in bcm2835_i2c_register_div()
188 static void bcm2835_fill_txfifo(struct bcm2835_i2c_dev *i2c_dev) in bcm2835_fill_txfifo() argument
192 while (i2c_dev->msg_buf_remaining) { in bcm2835_fill_txfifo()
193 val = bcm2835_i2c_readl(i2c_dev, BCM2835_I2C_S); in bcm2835_fill_txfifo()
196 bcm2835_i2c_writel(i2c_dev, BCM2835_I2C_FIFO, in bcm2835_fill_txfifo()
197 *i2c_dev->msg_buf); in bcm2835_fill_txfifo()
198 i2c_dev->msg_buf++; in bcm2835_fill_txfifo()
199 i2c_dev->msg_buf_remaining--; in bcm2835_fill_txfifo()
203 static void bcm2835_drain_rxfifo(struct bcm2835_i2c_dev *i2c_dev) in bcm2835_drain_rxfifo() argument
207 while (i2c_dev->msg_buf_remaining) { in bcm2835_drain_rxfifo()
208 val = bcm2835_i2c_readl(i2c_dev, BCM2835_I2C_S); in bcm2835_drain_rxfifo()
211 *i2c_dev->msg_buf = bcm2835_i2c_readl(i2c_dev, in bcm2835_drain_rxfifo()
213 i2c_dev->msg_buf++; in bcm2835_drain_rxfifo()
214 i2c_dev->msg_buf_remaining--; in bcm2835_drain_rxfifo()
231 static void bcm2835_i2c_start_transfer(struct bcm2835_i2c_dev *i2c_dev) in bcm2835_i2c_start_transfer() argument
234 struct i2c_msg *msg = i2c_dev->curr_msg; in bcm2835_i2c_start_transfer()
235 bool last_msg = (i2c_dev->num_msgs == 1); in bcm2835_i2c_start_transfer()
237 if (!i2c_dev->num_msgs) in bcm2835_i2c_start_transfer()
240 i2c_dev->num_msgs--; in bcm2835_i2c_start_transfer()
241 i2c_dev->msg_buf = msg->buf; in bcm2835_i2c_start_transfer()
242 i2c_dev->msg_buf_remaining = msg->len; in bcm2835_i2c_start_transfer()
252 bcm2835_i2c_writel(i2c_dev, BCM2835_I2C_A, msg->addr); in bcm2835_i2c_start_transfer()
253 bcm2835_i2c_writel(i2c_dev, BCM2835_I2C_DLEN, msg->len); in bcm2835_i2c_start_transfer()
254 bcm2835_i2c_writel(i2c_dev, BCM2835_I2C_C, c); in bcm2835_i2c_start_transfer()
257 static void bcm2835_i2c_finish_transfer(struct bcm2835_i2c_dev *i2c_dev) in bcm2835_i2c_finish_transfer() argument
259 i2c_dev->curr_msg = NULL; in bcm2835_i2c_finish_transfer()
260 i2c_dev->num_msgs = 0; in bcm2835_i2c_finish_transfer()
262 i2c_dev->msg_buf = NULL; in bcm2835_i2c_finish_transfer()
263 i2c_dev->msg_buf_remaining = 0; in bcm2835_i2c_finish_transfer()
277 struct bcm2835_i2c_dev *i2c_dev = data; in bcm2835_i2c_isr() local
280 val = bcm2835_i2c_readl(i2c_dev, BCM2835_I2C_S); in bcm2835_i2c_isr()
284 i2c_dev->msg_err = err; in bcm2835_i2c_isr()
289 if (!i2c_dev->curr_msg) { in bcm2835_i2c_isr()
290 dev_err(i2c_dev->dev, "Got unexpected interrupt (from firmware?)\n"); in bcm2835_i2c_isr()
291 } else if (i2c_dev->curr_msg->flags & I2C_M_RD) { in bcm2835_i2c_isr()
292 bcm2835_drain_rxfifo(i2c_dev); in bcm2835_i2c_isr()
293 val = bcm2835_i2c_readl(i2c_dev, BCM2835_I2C_S); in bcm2835_i2c_isr()
296 if ((val & BCM2835_I2C_S_RXD) || i2c_dev->msg_buf_remaining) in bcm2835_i2c_isr()
297 i2c_dev->msg_err = BCM2835_I2C_S_LEN; in bcm2835_i2c_isr()
299 i2c_dev->msg_err = 0; in bcm2835_i2c_isr()
304 if (!i2c_dev->msg_buf_remaining) { in bcm2835_i2c_isr()
305 i2c_dev->msg_err = val | BCM2835_I2C_S_LEN; in bcm2835_i2c_isr()
309 bcm2835_fill_txfifo(i2c_dev); in bcm2835_i2c_isr()
311 if (i2c_dev->num_msgs && !i2c_dev->msg_buf_remaining) { in bcm2835_i2c_isr()
312 i2c_dev->curr_msg++; in bcm2835_i2c_isr()
313 bcm2835_i2c_start_transfer(i2c_dev); in bcm2835_i2c_isr()
320 if (!i2c_dev->msg_buf_remaining) { in bcm2835_i2c_isr()
321 i2c_dev->msg_err = val | BCM2835_I2C_S_LEN; in bcm2835_i2c_isr()
325 bcm2835_drain_rxfifo(i2c_dev); in bcm2835_i2c_isr()
332 bcm2835_i2c_writel(i2c_dev, BCM2835_I2C_C, BCM2835_I2C_C_CLEAR); in bcm2835_i2c_isr()
333 bcm2835_i2c_writel(i2c_dev, BCM2835_I2C_S, BCM2835_I2C_S_CLKT | in bcm2835_i2c_isr()
335 complete(&i2c_dev->completion); in bcm2835_i2c_isr()
343 struct bcm2835_i2c_dev *i2c_dev = i2c_get_adapdata(adap); in bcm2835_i2c_xfer() local
349 dev_warn_once(i2c_dev->dev, in bcm2835_i2c_xfer()
354 i2c_dev->curr_msg = msgs; in bcm2835_i2c_xfer()
355 i2c_dev->num_msgs = num; in bcm2835_i2c_xfer()
356 reinit_completion(&i2c_dev->completion); in bcm2835_i2c_xfer()
358 bcm2835_i2c_start_transfer(i2c_dev); in bcm2835_i2c_xfer()
360 time_left = wait_for_completion_timeout(&i2c_dev->completion, in bcm2835_i2c_xfer()
363 bcm2835_i2c_finish_transfer(i2c_dev); in bcm2835_i2c_xfer()
366 bcm2835_i2c_writel(i2c_dev, BCM2835_I2C_C, in bcm2835_i2c_xfer()
368 dev_err(i2c_dev->dev, "i2c transfer timed out\n"); in bcm2835_i2c_xfer()
372 if (!i2c_dev->msg_err) in bcm2835_i2c_xfer()
375 dev_dbg(i2c_dev->dev, "i2c transfer failed: %x\n", i2c_dev->msg_err); in bcm2835_i2c_xfer()
377 if (i2c_dev->msg_err & BCM2835_I2C_S_ERR) in bcm2835_i2c_xfer()
404 struct bcm2835_i2c_dev *i2c_dev; in bcm2835_i2c_probe() local
411 i2c_dev = devm_kzalloc(&pdev->dev, sizeof(*i2c_dev), GFP_KERNEL); in bcm2835_i2c_probe()
412 if (!i2c_dev) in bcm2835_i2c_probe()
414 platform_set_drvdata(pdev, i2c_dev); in bcm2835_i2c_probe()
415 i2c_dev->dev = &pdev->dev; in bcm2835_i2c_probe()
416 init_completion(&i2c_dev->completion); in bcm2835_i2c_probe()
419 i2c_dev->regs = devm_ioremap_resource(&pdev->dev, mem); in bcm2835_i2c_probe()
420 if (IS_ERR(i2c_dev->regs)) in bcm2835_i2c_probe()
421 return PTR_ERR(i2c_dev->regs); in bcm2835_i2c_probe()
428 i2c_dev->bus_clk = bcm2835_i2c_register_div(&pdev->dev, mclk, i2c_dev); in bcm2835_i2c_probe()
430 if (IS_ERR(i2c_dev->bus_clk)) { in bcm2835_i2c_probe()
432 return PTR_ERR(i2c_dev->bus_clk); in bcm2835_i2c_probe()
443 ret = clk_set_rate_exclusive(i2c_dev->bus_clk, bus_clk_rate); in bcm2835_i2c_probe()
449 ret = clk_prepare_enable(i2c_dev->bus_clk); in bcm2835_i2c_probe()
460 i2c_dev->irq = irq->start; in bcm2835_i2c_probe()
462 ret = request_irq(i2c_dev->irq, bcm2835_i2c_isr, IRQF_SHARED, in bcm2835_i2c_probe()
463 dev_name(&pdev->dev), i2c_dev); in bcm2835_i2c_probe()
469 adap = &i2c_dev->adapter; in bcm2835_i2c_probe()
470 i2c_set_adapdata(adap, i2c_dev); in bcm2835_i2c_probe()
480 bcm2835_i2c_writel(i2c_dev, BCM2835_I2C_C, 0); in bcm2835_i2c_probe()
484 free_irq(i2c_dev->irq, i2c_dev); in bcm2835_i2c_probe()
491 struct bcm2835_i2c_dev *i2c_dev = platform_get_drvdata(pdev); in bcm2835_i2c_remove() local
493 clk_rate_exclusive_put(i2c_dev->bus_clk); in bcm2835_i2c_remove()
494 clk_disable_unprepare(i2c_dev->bus_clk); in bcm2835_i2c_remove()
496 free_irq(i2c_dev->irq, i2c_dev); in bcm2835_i2c_remove()
497 i2c_del_adapter(&i2c_dev->adapter); in bcm2835_i2c_remove()