Lines Matching refs:priv

133 static void rcar_i2c_write(struct rcar_i2c_priv *priv, int reg, u32 val)  in rcar_i2c_write()  argument
135 writel(val, priv->io + reg); in rcar_i2c_write()
138 static u32 rcar_i2c_read(struct rcar_i2c_priv *priv, int reg) in rcar_i2c_read() argument
140 return readl(priv->io + reg); in rcar_i2c_read()
143 static void rcar_i2c_init(struct rcar_i2c_priv *priv) in rcar_i2c_init() argument
146 rcar_i2c_write(priv, ICMIER, 0); in rcar_i2c_init()
147 rcar_i2c_write(priv, ICMCR, 0); in rcar_i2c_init()
148 rcar_i2c_write(priv, ICMSR, 0); in rcar_i2c_init()
149 rcar_i2c_write(priv, ICMAR, 0); in rcar_i2c_init()
152 static int rcar_i2c_bus_barrier(struct rcar_i2c_priv *priv) in rcar_i2c_bus_barrier() argument
158 if (!(rcar_i2c_read(priv, ICMCR) & FSDA)) in rcar_i2c_bus_barrier()
166 static int rcar_i2c_clock_calculate(struct rcar_i2c_priv *priv, in rcar_i2c_clock_calculate() argument
176 switch (priv->devtype) { in rcar_i2c_clock_calculate()
204 rate = clk_get_rate(priv->clk); in rcar_i2c_clock_calculate()
246 scl, bus_speed, clk_get_rate(priv->clk), round, cdf, scgd); in rcar_i2c_clock_calculate()
251 priv->icccr = scgd << cdf_width | cdf; in rcar_i2c_clock_calculate()
256 static void rcar_i2c_prepare_msg(struct rcar_i2c_priv *priv) in rcar_i2c_prepare_msg() argument
258 int read = !!rcar_i2c_is_recv(priv); in rcar_i2c_prepare_msg()
260 rcar_i2c_write(priv, ICMAR, (priv->msg->addr << 1) | read); in rcar_i2c_prepare_msg()
261 rcar_i2c_write(priv, ICMSR, 0); in rcar_i2c_prepare_msg()
262 rcar_i2c_write(priv, ICMCR, RCAR_BUS_PHASE_START); in rcar_i2c_prepare_msg()
263 rcar_i2c_write(priv, ICMIER, read ? RCAR_IRQ_RECV : RCAR_IRQ_SEND); in rcar_i2c_prepare_msg()
269 static int rcar_i2c_irq_send(struct rcar_i2c_priv *priv, u32 msr) in rcar_i2c_irq_send() argument
271 struct i2c_msg *msg = priv->msg; in rcar_i2c_irq_send()
286 rcar_i2c_write(priv, ICMCR, RCAR_BUS_PHASE_DATA); in rcar_i2c_irq_send()
288 if (priv->pos < msg->len) { in rcar_i2c_irq_send()
296 rcar_i2c_write(priv, ICRXTX, msg->buf[priv->pos]); in rcar_i2c_irq_send()
297 priv->pos++; in rcar_i2c_irq_send()
308 if (priv->flags & ID_LAST_MSG) in rcar_i2c_irq_send()
314 rcar_i2c_write(priv, ICMCR, RCAR_BUS_PHASE_STOP); in rcar_i2c_irq_send()
325 rcar_i2c_write(priv, ICMSR, RCAR_IRQ_ACK_SEND); in rcar_i2c_irq_send()
330 static int rcar_i2c_irq_recv(struct rcar_i2c_priv *priv, u32 msr) in rcar_i2c_irq_recv() argument
332 struct i2c_msg *msg = priv->msg; in rcar_i2c_irq_recv()
348 } else if (priv->pos < msg->len) { in rcar_i2c_irq_recv()
352 msg->buf[priv->pos] = rcar_i2c_read(priv, ICRXTX); in rcar_i2c_irq_recv()
353 priv->pos++; in rcar_i2c_irq_recv()
361 if (priv->pos + 1 >= msg->len) in rcar_i2c_irq_recv()
362 rcar_i2c_write(priv, ICMCR, RCAR_BUS_PHASE_STOP); in rcar_i2c_irq_recv()
364 rcar_i2c_write(priv, ICMCR, RCAR_BUS_PHASE_DATA); in rcar_i2c_irq_recv()
366 rcar_i2c_write(priv, ICMSR, RCAR_IRQ_ACK_RECV); in rcar_i2c_irq_recv()
371 static bool rcar_i2c_slave_irq(struct rcar_i2c_priv *priv) in rcar_i2c_slave_irq() argument
376 ssr_raw = rcar_i2c_read(priv, ICSSR) & 0xff; in rcar_i2c_slave_irq()
377 ssr_filtered = ssr_raw & rcar_i2c_read(priv, ICSIER); in rcar_i2c_slave_irq()
386 i2c_slave_event(priv->slave, I2C_SLAVE_READ_REQUESTED, &value); in rcar_i2c_slave_irq()
387 rcar_i2c_write(priv, ICRXTX, value); in rcar_i2c_slave_irq()
388 rcar_i2c_write(priv, ICSIER, SDE | SSR | SAR); in rcar_i2c_slave_irq()
390 i2c_slave_event(priv->slave, I2C_SLAVE_WRITE_REQUESTED, &value); in rcar_i2c_slave_irq()
391 rcar_i2c_read(priv, ICRXTX); /* dummy read */ in rcar_i2c_slave_irq()
392 rcar_i2c_write(priv, ICSIER, SDR | SSR | SAR); in rcar_i2c_slave_irq()
395 rcar_i2c_write(priv, ICSSR, ~SAR & 0xff); in rcar_i2c_slave_irq()
400 i2c_slave_event(priv->slave, I2C_SLAVE_STOP, &value); in rcar_i2c_slave_irq()
401 rcar_i2c_write(priv, ICSIER, SAR | SSR); in rcar_i2c_slave_irq()
402 rcar_i2c_write(priv, ICSSR, ~SSR & 0xff); in rcar_i2c_slave_irq()
409 value = rcar_i2c_read(priv, ICRXTX); in rcar_i2c_slave_irq()
410 ret = i2c_slave_event(priv->slave, I2C_SLAVE_WRITE_RECEIVED, &value); in rcar_i2c_slave_irq()
412 rcar_i2c_write(priv, ICSCR, SIE | SDBS | (ret < 0 ? FNA : 0)); in rcar_i2c_slave_irq()
413 rcar_i2c_write(priv, ICSSR, ~SDR & 0xff); in rcar_i2c_slave_irq()
418 i2c_slave_event(priv->slave, I2C_SLAVE_READ_PROCESSED, &value); in rcar_i2c_slave_irq()
419 rcar_i2c_write(priv, ICRXTX, value); in rcar_i2c_slave_irq()
420 rcar_i2c_write(priv, ICSSR, ~SDE & 0xff); in rcar_i2c_slave_irq()
428 struct rcar_i2c_priv *priv = ptr; in rcar_i2c_irq() local
433 spin_lock(&priv->lock); in rcar_i2c_irq()
435 if (rcar_i2c_slave_irq(priv)) in rcar_i2c_irq()
438 msr = rcar_i2c_read(priv, ICMSR); in rcar_i2c_irq()
441 msr &= rcar_i2c_read(priv, ICMIER); in rcar_i2c_irq()
449 rcar_i2c_flags_set(priv, (ID_DONE | ID_ARBLOST)); in rcar_i2c_irq()
456 rcar_i2c_write(priv, ICMCR, RCAR_BUS_PHASE_STOP); in rcar_i2c_irq()
457 rcar_i2c_write(priv, ICMIER, RCAR_IRQ_STOP); in rcar_i2c_irq()
458 rcar_i2c_flags_set(priv, ID_NACK); in rcar_i2c_irq()
464 rcar_i2c_flags_set(priv, ID_DONE); in rcar_i2c_irq()
468 if (rcar_i2c_is_recv(priv)) in rcar_i2c_irq()
469 rcar_i2c_flags_set(priv, rcar_i2c_irq_recv(priv, msr)); in rcar_i2c_irq()
471 rcar_i2c_flags_set(priv, rcar_i2c_irq_send(priv, msr)); in rcar_i2c_irq()
474 if (rcar_i2c_flags_has(priv, ID_DONE)) { in rcar_i2c_irq()
475 rcar_i2c_write(priv, ICMIER, 0); in rcar_i2c_irq()
476 rcar_i2c_write(priv, ICMSR, 0); in rcar_i2c_irq()
477 wake_up(&priv->wait); in rcar_i2c_irq()
481 spin_unlock(&priv->lock); in rcar_i2c_irq()
491 struct rcar_i2c_priv *priv = i2c_get_adapdata(adap); in rcar_i2c_master_xfer() local
492 struct device *dev = rcar_i2c_priv_to_dev(priv); in rcar_i2c_master_xfer()
500 spin_lock_irqsave(&priv->lock, flags); in rcar_i2c_master_xfer()
502 rcar_i2c_init(priv); in rcar_i2c_master_xfer()
504 rcar_i2c_write(priv, ICCCR, priv->icccr); in rcar_i2c_master_xfer()
506 spin_unlock_irqrestore(&priv->lock, flags); in rcar_i2c_master_xfer()
509 ret = rcar_i2c_bus_barrier(priv); in rcar_i2c_master_xfer()
521 spin_lock_irqsave(&priv->lock, flags); in rcar_i2c_master_xfer()
524 priv->msg = &msgs[i]; in rcar_i2c_master_xfer()
525 priv->pos = 0; in rcar_i2c_master_xfer()
526 priv->flags = 0; in rcar_i2c_master_xfer()
528 rcar_i2c_flags_set(priv, ID_LAST_MSG); in rcar_i2c_master_xfer()
530 rcar_i2c_prepare_msg(priv); in rcar_i2c_master_xfer()
532 spin_unlock_irqrestore(&priv->lock, flags); in rcar_i2c_master_xfer()
535 timeout = wait_event_timeout(priv->wait, in rcar_i2c_master_xfer()
536 rcar_i2c_flags_has(priv, ID_DONE), in rcar_i2c_master_xfer()
543 if (rcar_i2c_flags_has(priv, ID_NACK)) { in rcar_i2c_master_xfer()
548 if (rcar_i2c_flags_has(priv, ID_ARBLOST)) { in rcar_i2c_master_xfer()
553 if (rcar_i2c_flags_has(priv, ID_IOERROR)) { in rcar_i2c_master_xfer()
564 dev_err(dev, "error %d : %x\n", ret, priv->flags); in rcar_i2c_master_xfer()
571 struct rcar_i2c_priv *priv = i2c_get_adapdata(slave->adapter); in rcar_reg_slave() local
573 if (priv->slave) in rcar_reg_slave()
579 pm_runtime_get_sync(rcar_i2c_priv_to_dev(priv)); in rcar_reg_slave()
581 priv->slave = slave; in rcar_reg_slave()
582 rcar_i2c_write(priv, ICSAR, slave->addr); in rcar_reg_slave()
583 rcar_i2c_write(priv, ICSSR, 0); in rcar_reg_slave()
584 rcar_i2c_write(priv, ICSIER, SAR | SSR); in rcar_reg_slave()
585 rcar_i2c_write(priv, ICSCR, SIE | SDBS); in rcar_reg_slave()
592 struct rcar_i2c_priv *priv = i2c_get_adapdata(slave->adapter); in rcar_unreg_slave() local
594 WARN_ON(!priv->slave); in rcar_unreg_slave()
596 rcar_i2c_write(priv, ICSIER, 0); in rcar_unreg_slave()
597 rcar_i2c_write(priv, ICSCR, 0); in rcar_unreg_slave()
599 priv->slave = NULL; in rcar_unreg_slave()
601 pm_runtime_put(rcar_i2c_priv_to_dev(priv)); in rcar_unreg_slave()
636 struct rcar_i2c_priv *priv; in rcar_i2c_probe() local
643 priv = devm_kzalloc(dev, sizeof(struct rcar_i2c_priv), GFP_KERNEL); in rcar_i2c_probe()
644 if (!priv) in rcar_i2c_probe()
647 priv->clk = devm_clk_get(dev, NULL); in rcar_i2c_probe()
648 if (IS_ERR(priv->clk)) { in rcar_i2c_probe()
650 return PTR_ERR(priv->clk); in rcar_i2c_probe()
656 priv->devtype = (enum rcar_i2c_type)of_match_device(rcar_i2c_dt_ids, dev)->data; in rcar_i2c_probe()
658 ret = rcar_i2c_clock_calculate(priv, bus_speed, dev); in rcar_i2c_probe()
663 priv->io = devm_ioremap_resource(dev, res); in rcar_i2c_probe()
664 if (IS_ERR(priv->io)) in rcar_i2c_probe()
665 return PTR_ERR(priv->io); in rcar_i2c_probe()
668 init_waitqueue_head(&priv->wait); in rcar_i2c_probe()
669 spin_lock_init(&priv->lock); in rcar_i2c_probe()
671 adap = &priv->adap; in rcar_i2c_probe()
678 i2c_set_adapdata(adap, priv); in rcar_i2c_probe()
682 dev_name(dev), priv); in rcar_i2c_probe()
689 platform_set_drvdata(pdev, priv); in rcar_i2c_probe()
705 struct rcar_i2c_priv *priv = platform_get_drvdata(pdev); in rcar_i2c_remove() local
708 i2c_del_adapter(&priv->adap); in rcar_i2c_remove()