Lines Matching refs:i2c_dev
73 static inline void bcm2835_i2c_writel(struct bcm2835_i2c_dev *i2c_dev,
76 writel(val, i2c_dev->regs + reg);
79 static inline u32 bcm2835_i2c_readl(struct bcm2835_i2c_dev *i2c_dev, u32 reg)
81 return readl(i2c_dev->regs + reg);
87 struct bcm2835_i2c_dev *i2c_dev;
119 bcm2835_i2c_writel(div->i2c_dev, BCM2835_I2C_DIV, divider);
134 bcm2835_i2c_writel(div->i2c_dev, BCM2835_I2C_DEL,
152 u32 divider = bcm2835_i2c_readl(div->i2c_dev, BCM2835_I2C_DIV);
165 struct bcm2835_i2c_dev *i2c_dev)
187 priv->i2c_dev = i2c_dev;
193 static void bcm2835_fill_txfifo(struct bcm2835_i2c_dev *i2c_dev)
197 while (i2c_dev->msg_buf_remaining) {
198 val = bcm2835_i2c_readl(i2c_dev, BCM2835_I2C_S);
201 bcm2835_i2c_writel(i2c_dev, BCM2835_I2C_FIFO,
202 *i2c_dev->msg_buf);
203 i2c_dev->msg_buf++;
204 i2c_dev->msg_buf_remaining--;
208 static void bcm2835_drain_rxfifo(struct bcm2835_i2c_dev *i2c_dev)
212 while (i2c_dev->msg_buf_remaining) {
213 val = bcm2835_i2c_readl(i2c_dev, BCM2835_I2C_S);
216 *i2c_dev->msg_buf = bcm2835_i2c_readl(i2c_dev,
218 i2c_dev->msg_buf++;
219 i2c_dev->msg_buf_remaining--;
236 static void bcm2835_i2c_start_transfer(struct bcm2835_i2c_dev *i2c_dev)
239 struct i2c_msg *msg = i2c_dev->curr_msg;
240 bool last_msg = (i2c_dev->num_msgs == 1);
242 if (!i2c_dev->num_msgs)
245 i2c_dev->num_msgs--;
246 i2c_dev->msg_buf = msg->buf;
247 i2c_dev->msg_buf_remaining = msg->len;
257 bcm2835_i2c_writel(i2c_dev, BCM2835_I2C_A, msg->addr);
258 bcm2835_i2c_writel(i2c_dev, BCM2835_I2C_DLEN, msg->len);
259 bcm2835_i2c_writel(i2c_dev, BCM2835_I2C_C, c);
262 static void bcm2835_i2c_finish_transfer(struct bcm2835_i2c_dev *i2c_dev)
264 i2c_dev->curr_msg = NULL;
265 i2c_dev->num_msgs = 0;
267 i2c_dev->msg_buf = NULL;
268 i2c_dev->msg_buf_remaining = 0;
282 struct bcm2835_i2c_dev *i2c_dev = data;
285 val = bcm2835_i2c_readl(i2c_dev, BCM2835_I2C_S);
289 i2c_dev->msg_err = err;
294 if (!i2c_dev->curr_msg) {
295 dev_err(i2c_dev->dev, "Got unexpected interrupt (from firmware?)\n");
296 } else if (i2c_dev->curr_msg->flags & I2C_M_RD) {
297 bcm2835_drain_rxfifo(i2c_dev);
298 val = bcm2835_i2c_readl(i2c_dev, BCM2835_I2C_S);
301 if ((val & BCM2835_I2C_S_RXD) || i2c_dev->msg_buf_remaining)
302 i2c_dev->msg_err = BCM2835_I2C_S_LEN;
304 i2c_dev->msg_err = 0;
309 if (!i2c_dev->msg_buf_remaining) {
310 i2c_dev->msg_err = val | BCM2835_I2C_S_LEN;
314 bcm2835_fill_txfifo(i2c_dev);
316 if (i2c_dev->num_msgs && !i2c_dev->msg_buf_remaining) {
317 i2c_dev->curr_msg++;
318 bcm2835_i2c_start_transfer(i2c_dev);
325 if (!i2c_dev->msg_buf_remaining) {
326 i2c_dev->msg_err = val | BCM2835_I2C_S_LEN;
330 bcm2835_drain_rxfifo(i2c_dev);
337 bcm2835_i2c_writel(i2c_dev, BCM2835_I2C_C, BCM2835_I2C_C_CLEAR);
338 bcm2835_i2c_writel(i2c_dev, BCM2835_I2C_S, BCM2835_I2C_S_CLKT |
340 complete(&i2c_dev->completion);
348 struct bcm2835_i2c_dev *i2c_dev = i2c_get_adapdata(adap);
354 dev_warn_once(i2c_dev->dev,
359 i2c_dev->curr_msg = msgs;
360 i2c_dev->num_msgs = num;
361 reinit_completion(&i2c_dev->completion);
363 bcm2835_i2c_start_transfer(i2c_dev);
365 time_left = wait_for_completion_timeout(&i2c_dev->completion,
368 bcm2835_i2c_finish_transfer(i2c_dev);
371 bcm2835_i2c_writel(i2c_dev, BCM2835_I2C_C,
373 dev_err(i2c_dev->dev, "i2c transfer timed out\n");
377 if (!i2c_dev->msg_err)
380 dev_dbg(i2c_dev->dev, "i2c transfer failed: %x\n", i2c_dev->msg_err);
382 if (i2c_dev->msg_err & BCM2835_I2C_S_ERR)
409 struct bcm2835_i2c_dev *i2c_dev;
416 i2c_dev = devm_kzalloc(&pdev->dev, sizeof(*i2c_dev), GFP_KERNEL);
417 if (!i2c_dev)
419 platform_set_drvdata(pdev, i2c_dev);
420 i2c_dev->dev = &pdev->dev;
421 init_completion(&i2c_dev->completion);
424 i2c_dev->regs = devm_ioremap_resource(&pdev->dev, mem);
425 if (IS_ERR(i2c_dev->regs))
426 return PTR_ERR(i2c_dev->regs);
433 i2c_dev->bus_clk = bcm2835_i2c_register_div(&pdev->dev, mclk, i2c_dev);
435 if (IS_ERR(i2c_dev->bus_clk)) {
437 return PTR_ERR(i2c_dev->bus_clk);
448 ret = clk_set_rate_exclusive(i2c_dev->bus_clk, bus_clk_rate);
454 ret = clk_prepare_enable(i2c_dev->bus_clk);
465 i2c_dev->irq = irq->start;
467 ret = request_irq(i2c_dev->irq, bcm2835_i2c_isr, IRQF_SHARED,
468 dev_name(&pdev->dev), i2c_dev);
474 adap = &i2c_dev->adapter;
475 i2c_set_adapdata(adap, i2c_dev);
490 bcm2835_i2c_writel(i2c_dev, BCM2835_I2C_CLKT, 0);
491 bcm2835_i2c_writel(i2c_dev, BCM2835_I2C_C, 0);
495 free_irq(i2c_dev->irq, i2c_dev);
502 struct bcm2835_i2c_dev *i2c_dev = platform_get_drvdata(pdev);
504 clk_rate_exclusive_put(i2c_dev->bus_clk);
505 clk_disable_unprepare(i2c_dev->bus_clk);
507 free_irq(i2c_dev->irq, i2c_dev);
508 i2c_del_adapter(&i2c_dev->adapter);