Lines Matching refs:i2c_dev
67 static inline void bcm2835_i2c_writel(struct bcm2835_i2c_dev *i2c_dev, in bcm2835_i2c_writel() argument
70 writel(val, i2c_dev->regs + reg); in bcm2835_i2c_writel()
73 static inline u32 bcm2835_i2c_readl(struct bcm2835_i2c_dev *i2c_dev, u32 reg) in bcm2835_i2c_readl() argument
75 return readl(i2c_dev->regs + reg); in bcm2835_i2c_readl()
81 struct bcm2835_i2c_dev *i2c_dev; member
113 bcm2835_i2c_writel(div->i2c_dev, BCM2835_I2C_DIV, divider); in clk_bcm2835_i2c_set_rate()
128 bcm2835_i2c_writel(div->i2c_dev, BCM2835_I2C_DEL, in clk_bcm2835_i2c_set_rate()
146 u32 divider = bcm2835_i2c_readl(div->i2c_dev, BCM2835_I2C_DIV); in clk_bcm2835_i2c_recalc_rate()
159 struct bcm2835_i2c_dev *i2c_dev) in bcm2835_i2c_register_div() argument
181 priv->i2c_dev = i2c_dev; in bcm2835_i2c_register_div()
187 static void bcm2835_fill_txfifo(struct bcm2835_i2c_dev *i2c_dev) in bcm2835_fill_txfifo() argument
191 while (i2c_dev->msg_buf_remaining) { in bcm2835_fill_txfifo()
192 val = bcm2835_i2c_readl(i2c_dev, BCM2835_I2C_S); in bcm2835_fill_txfifo()
195 bcm2835_i2c_writel(i2c_dev, BCM2835_I2C_FIFO, in bcm2835_fill_txfifo()
196 *i2c_dev->msg_buf); in bcm2835_fill_txfifo()
197 i2c_dev->msg_buf++; in bcm2835_fill_txfifo()
198 i2c_dev->msg_buf_remaining--; in bcm2835_fill_txfifo()
202 static void bcm2835_drain_rxfifo(struct bcm2835_i2c_dev *i2c_dev) in bcm2835_drain_rxfifo() argument
206 while (i2c_dev->msg_buf_remaining) { in bcm2835_drain_rxfifo()
207 val = bcm2835_i2c_readl(i2c_dev, BCM2835_I2C_S); in bcm2835_drain_rxfifo()
210 *i2c_dev->msg_buf = bcm2835_i2c_readl(i2c_dev, in bcm2835_drain_rxfifo()
212 i2c_dev->msg_buf++; in bcm2835_drain_rxfifo()
213 i2c_dev->msg_buf_remaining--; in bcm2835_drain_rxfifo()
230 static void bcm2835_i2c_start_transfer(struct bcm2835_i2c_dev *i2c_dev) in bcm2835_i2c_start_transfer() argument
233 struct i2c_msg *msg = i2c_dev->curr_msg; in bcm2835_i2c_start_transfer()
234 bool last_msg = (i2c_dev->num_msgs == 1); in bcm2835_i2c_start_transfer()
236 if (!i2c_dev->num_msgs) in bcm2835_i2c_start_transfer()
239 i2c_dev->num_msgs--; in bcm2835_i2c_start_transfer()
240 i2c_dev->msg_buf = msg->buf; in bcm2835_i2c_start_transfer()
241 i2c_dev->msg_buf_remaining = msg->len; in bcm2835_i2c_start_transfer()
251 bcm2835_i2c_writel(i2c_dev, BCM2835_I2C_A, msg->addr); in bcm2835_i2c_start_transfer()
252 bcm2835_i2c_writel(i2c_dev, BCM2835_I2C_DLEN, msg->len); in bcm2835_i2c_start_transfer()
253 bcm2835_i2c_writel(i2c_dev, BCM2835_I2C_C, c); in bcm2835_i2c_start_transfer()
256 static void bcm2835_i2c_finish_transfer(struct bcm2835_i2c_dev *i2c_dev) in bcm2835_i2c_finish_transfer() argument
258 i2c_dev->curr_msg = NULL; in bcm2835_i2c_finish_transfer()
259 i2c_dev->num_msgs = 0; in bcm2835_i2c_finish_transfer()
261 i2c_dev->msg_buf = NULL; in bcm2835_i2c_finish_transfer()
262 i2c_dev->msg_buf_remaining = 0; in bcm2835_i2c_finish_transfer()
276 struct bcm2835_i2c_dev *i2c_dev = data; in bcm2835_i2c_isr() local
279 val = bcm2835_i2c_readl(i2c_dev, BCM2835_I2C_S); in bcm2835_i2c_isr()
283 i2c_dev->msg_err = err; in bcm2835_i2c_isr()
288 if (!i2c_dev->curr_msg) { in bcm2835_i2c_isr()
289 dev_err(i2c_dev->dev, "Got unexpected interrupt (from firmware?)\n"); in bcm2835_i2c_isr()
290 } else if (i2c_dev->curr_msg->flags & I2C_M_RD) { in bcm2835_i2c_isr()
291 bcm2835_drain_rxfifo(i2c_dev); in bcm2835_i2c_isr()
292 val = bcm2835_i2c_readl(i2c_dev, BCM2835_I2C_S); in bcm2835_i2c_isr()
295 if ((val & BCM2835_I2C_S_RXD) || i2c_dev->msg_buf_remaining) in bcm2835_i2c_isr()
296 i2c_dev->msg_err = BCM2835_I2C_S_LEN; in bcm2835_i2c_isr()
298 i2c_dev->msg_err = 0; in bcm2835_i2c_isr()
303 if (!i2c_dev->msg_buf_remaining) { in bcm2835_i2c_isr()
304 i2c_dev->msg_err = val | BCM2835_I2C_S_LEN; in bcm2835_i2c_isr()
308 bcm2835_fill_txfifo(i2c_dev); in bcm2835_i2c_isr()
310 if (i2c_dev->num_msgs && !i2c_dev->msg_buf_remaining) { in bcm2835_i2c_isr()
311 i2c_dev->curr_msg++; in bcm2835_i2c_isr()
312 bcm2835_i2c_start_transfer(i2c_dev); in bcm2835_i2c_isr()
319 if (!i2c_dev->msg_buf_remaining) { in bcm2835_i2c_isr()
320 i2c_dev->msg_err = val | BCM2835_I2C_S_LEN; in bcm2835_i2c_isr()
324 bcm2835_drain_rxfifo(i2c_dev); in bcm2835_i2c_isr()
331 bcm2835_i2c_writel(i2c_dev, BCM2835_I2C_C, BCM2835_I2C_C_CLEAR); in bcm2835_i2c_isr()
332 bcm2835_i2c_writel(i2c_dev, BCM2835_I2C_S, BCM2835_I2C_S_CLKT | in bcm2835_i2c_isr()
334 complete(&i2c_dev->completion); in bcm2835_i2c_isr()
342 struct bcm2835_i2c_dev *i2c_dev = i2c_get_adapdata(adap); in bcm2835_i2c_xfer() local
348 dev_warn_once(i2c_dev->dev, in bcm2835_i2c_xfer()
353 i2c_dev->curr_msg = msgs; in bcm2835_i2c_xfer()
354 i2c_dev->num_msgs = num; in bcm2835_i2c_xfer()
355 reinit_completion(&i2c_dev->completion); in bcm2835_i2c_xfer()
357 bcm2835_i2c_start_transfer(i2c_dev); in bcm2835_i2c_xfer()
359 time_left = wait_for_completion_timeout(&i2c_dev->completion, in bcm2835_i2c_xfer()
362 bcm2835_i2c_finish_transfer(i2c_dev); in bcm2835_i2c_xfer()
365 bcm2835_i2c_writel(i2c_dev, BCM2835_I2C_C, in bcm2835_i2c_xfer()
367 dev_err(i2c_dev->dev, "i2c transfer timed out\n"); in bcm2835_i2c_xfer()
371 if (!i2c_dev->msg_err) in bcm2835_i2c_xfer()
374 dev_dbg(i2c_dev->dev, "i2c transfer failed: %x\n", i2c_dev->msg_err); in bcm2835_i2c_xfer()
376 if (i2c_dev->msg_err & BCM2835_I2C_S_ERR) in bcm2835_i2c_xfer()
403 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()
430 bus_clk = bcm2835_i2c_register_div(&pdev->dev, mclk, i2c_dev); in bcm2835_i2c_probe()
462 i2c_dev->irq = irq->start; 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()
482 bcm2835_i2c_writel(i2c_dev, BCM2835_I2C_C, 0); in bcm2835_i2c_probe()
486 free_irq(i2c_dev->irq, i2c_dev); in bcm2835_i2c_probe()
493 struct bcm2835_i2c_dev *i2c_dev = platform_get_drvdata(pdev); in bcm2835_i2c_remove() local
494 struct clk *bus_clk = devm_clk_get(i2c_dev->dev, "div"); in bcm2835_i2c_remove()
499 free_irq(i2c_dev->irq, i2c_dev); in bcm2835_i2c_remove()
500 i2c_del_adapter(&i2c_dev->adapter); in bcm2835_i2c_remove()