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()
203 rate = clk_get_rate(priv->clk); in rcar_i2c_clock_calculate()
245 scl, bus_speed, clk_get_rate(priv->clk), round, cdf, scgd); in rcar_i2c_clock_calculate()
250 priv->icccr = scgd << cdf_width | cdf; in rcar_i2c_clock_calculate()
255 static void rcar_i2c_prepare_msg(struct rcar_i2c_priv *priv) in rcar_i2c_prepare_msg() argument
257 int read = !!rcar_i2c_is_recv(priv); in rcar_i2c_prepare_msg()
259 rcar_i2c_write(priv, ICMAR, (priv->msg->addr << 1) | read); in rcar_i2c_prepare_msg()
260 rcar_i2c_write(priv, ICMSR, 0); in rcar_i2c_prepare_msg()
261 rcar_i2c_write(priv, ICMCR, RCAR_BUS_PHASE_START); in rcar_i2c_prepare_msg()
262 rcar_i2c_write(priv, ICMIER, read ? RCAR_IRQ_RECV : RCAR_IRQ_SEND); in rcar_i2c_prepare_msg()
268 static int rcar_i2c_irq_send(struct rcar_i2c_priv *priv, u32 msr) in rcar_i2c_irq_send() argument
270 struct i2c_msg *msg = priv->msg; in rcar_i2c_irq_send()
285 rcar_i2c_write(priv, ICMCR, RCAR_BUS_PHASE_DATA); in rcar_i2c_irq_send()
287 if (priv->pos < msg->len) { in rcar_i2c_irq_send()
295 rcar_i2c_write(priv, ICRXTX, msg->buf[priv->pos]); in rcar_i2c_irq_send()
296 priv->pos++; in rcar_i2c_irq_send()
307 if (priv->flags & ID_LAST_MSG) in rcar_i2c_irq_send()
313 rcar_i2c_write(priv, ICMCR, RCAR_BUS_PHASE_STOP); in rcar_i2c_irq_send()
324 rcar_i2c_write(priv, ICMSR, RCAR_IRQ_ACK_SEND); in rcar_i2c_irq_send()
329 static int rcar_i2c_irq_recv(struct rcar_i2c_priv *priv, u32 msr) in rcar_i2c_irq_recv() argument
331 struct i2c_msg *msg = priv->msg; in rcar_i2c_irq_recv()
347 } else if (priv->pos < msg->len) { in rcar_i2c_irq_recv()
351 msg->buf[priv->pos] = rcar_i2c_read(priv, ICRXTX); in rcar_i2c_irq_recv()
352 priv->pos++; in rcar_i2c_irq_recv()
360 if (priv->pos + 1 >= msg->len) in rcar_i2c_irq_recv()
361 rcar_i2c_write(priv, ICMCR, RCAR_BUS_PHASE_STOP); in rcar_i2c_irq_recv()
363 rcar_i2c_write(priv, ICMCR, RCAR_BUS_PHASE_DATA); in rcar_i2c_irq_recv()
365 rcar_i2c_write(priv, ICMSR, RCAR_IRQ_ACK_RECV); in rcar_i2c_irq_recv()
370 static bool rcar_i2c_slave_irq(struct rcar_i2c_priv *priv) in rcar_i2c_slave_irq() argument
375 ssr_raw = rcar_i2c_read(priv, ICSSR) & 0xff; in rcar_i2c_slave_irq()
376 ssr_filtered = ssr_raw & rcar_i2c_read(priv, ICSIER); in rcar_i2c_slave_irq()
385 i2c_slave_event(priv->slave, I2C_SLAVE_READ_REQUESTED, &value); in rcar_i2c_slave_irq()
386 rcar_i2c_write(priv, ICRXTX, value); in rcar_i2c_slave_irq()
387 rcar_i2c_write(priv, ICSIER, SDE | SSR | SAR); in rcar_i2c_slave_irq()
389 i2c_slave_event(priv->slave, I2C_SLAVE_WRITE_REQUESTED, &value); in rcar_i2c_slave_irq()
390 rcar_i2c_read(priv, ICRXTX); /* dummy read */ in rcar_i2c_slave_irq()
391 rcar_i2c_write(priv, ICSIER, SDR | SSR | SAR); in rcar_i2c_slave_irq()
394 rcar_i2c_write(priv, ICSSR, ~SAR & 0xff); in rcar_i2c_slave_irq()
399 i2c_slave_event(priv->slave, I2C_SLAVE_STOP, &value); in rcar_i2c_slave_irq()
400 rcar_i2c_write(priv, ICSIER, SAR | SSR); in rcar_i2c_slave_irq()
401 rcar_i2c_write(priv, ICSSR, ~SSR & 0xff); in rcar_i2c_slave_irq()
408 value = rcar_i2c_read(priv, ICRXTX); in rcar_i2c_slave_irq()
409 ret = i2c_slave_event(priv->slave, I2C_SLAVE_WRITE_RECEIVED, &value); in rcar_i2c_slave_irq()
411 rcar_i2c_write(priv, ICSCR, SIE | SDBS | (ret < 0 ? FNA : 0)); in rcar_i2c_slave_irq()
412 rcar_i2c_write(priv, ICSSR, ~SDR & 0xff); in rcar_i2c_slave_irq()
417 i2c_slave_event(priv->slave, I2C_SLAVE_READ_PROCESSED, &value); in rcar_i2c_slave_irq()
418 rcar_i2c_write(priv, ICRXTX, value); in rcar_i2c_slave_irq()
419 rcar_i2c_write(priv, ICSSR, ~SDE & 0xff); in rcar_i2c_slave_irq()
427 struct rcar_i2c_priv *priv = ptr; in rcar_i2c_irq() local
432 spin_lock(&priv->lock); in rcar_i2c_irq()
434 if (rcar_i2c_slave_irq(priv)) in rcar_i2c_irq()
437 msr = rcar_i2c_read(priv, ICMSR); in rcar_i2c_irq()
440 msr &= rcar_i2c_read(priv, ICMIER); in rcar_i2c_irq()
448 rcar_i2c_flags_set(priv, (ID_DONE | ID_ARBLOST)); in rcar_i2c_irq()
455 rcar_i2c_write(priv, ICMCR, RCAR_BUS_PHASE_STOP); in rcar_i2c_irq()
456 rcar_i2c_write(priv, ICMIER, RCAR_IRQ_STOP); in rcar_i2c_irq()
457 rcar_i2c_flags_set(priv, ID_NACK); in rcar_i2c_irq()
463 rcar_i2c_flags_set(priv, ID_DONE); in rcar_i2c_irq()
467 if (rcar_i2c_is_recv(priv)) in rcar_i2c_irq()
468 rcar_i2c_flags_set(priv, rcar_i2c_irq_recv(priv, msr)); in rcar_i2c_irq()
470 rcar_i2c_flags_set(priv, rcar_i2c_irq_send(priv, msr)); in rcar_i2c_irq()
473 if (rcar_i2c_flags_has(priv, ID_DONE)) { in rcar_i2c_irq()
474 rcar_i2c_write(priv, ICMIER, 0); in rcar_i2c_irq()
475 rcar_i2c_write(priv, ICMSR, 0); in rcar_i2c_irq()
476 wake_up(&priv->wait); in rcar_i2c_irq()
480 spin_unlock(&priv->lock); in rcar_i2c_irq()
490 struct rcar_i2c_priv *priv = i2c_get_adapdata(adap); in rcar_i2c_master_xfer() local
491 struct device *dev = rcar_i2c_priv_to_dev(priv); in rcar_i2c_master_xfer()
498 spin_lock_irqsave(&priv->lock, flags); in rcar_i2c_master_xfer()
500 rcar_i2c_init(priv); in rcar_i2c_master_xfer()
502 rcar_i2c_write(priv, ICCCR, priv->icccr); in rcar_i2c_master_xfer()
504 spin_unlock_irqrestore(&priv->lock, flags); in rcar_i2c_master_xfer()
507 ret = rcar_i2c_bus_barrier(priv); in rcar_i2c_master_xfer()
519 spin_lock_irqsave(&priv->lock, flags); in rcar_i2c_master_xfer()
522 priv->msg = &msgs[i]; in rcar_i2c_master_xfer()
523 priv->pos = 0; in rcar_i2c_master_xfer()
524 priv->flags = 0; in rcar_i2c_master_xfer()
526 rcar_i2c_flags_set(priv, ID_LAST_MSG); in rcar_i2c_master_xfer()
528 rcar_i2c_prepare_msg(priv); in rcar_i2c_master_xfer()
530 spin_unlock_irqrestore(&priv->lock, flags); in rcar_i2c_master_xfer()
533 timeout = wait_event_timeout(priv->wait, in rcar_i2c_master_xfer()
534 rcar_i2c_flags_has(priv, ID_DONE), in rcar_i2c_master_xfer()
541 if (rcar_i2c_flags_has(priv, ID_NACK)) { in rcar_i2c_master_xfer()
546 if (rcar_i2c_flags_has(priv, ID_ARBLOST)) { in rcar_i2c_master_xfer()
551 if (rcar_i2c_flags_has(priv, ID_IOERROR)) { in rcar_i2c_master_xfer()
562 dev_err(dev, "error %d : %x\n", ret, priv->flags); in rcar_i2c_master_xfer()
569 struct rcar_i2c_priv *priv = i2c_get_adapdata(slave->adapter); in rcar_reg_slave() local
571 if (priv->slave) in rcar_reg_slave()
577 pm_runtime_forbid(rcar_i2c_priv_to_dev(priv)); in rcar_reg_slave()
579 priv->slave = slave; in rcar_reg_slave()
580 rcar_i2c_write(priv, ICSAR, slave->addr); in rcar_reg_slave()
581 rcar_i2c_write(priv, ICSSR, 0); in rcar_reg_slave()
582 rcar_i2c_write(priv, ICSIER, SAR | SSR); in rcar_reg_slave()
583 rcar_i2c_write(priv, ICSCR, SIE | SDBS); in rcar_reg_slave()
590 struct rcar_i2c_priv *priv = i2c_get_adapdata(slave->adapter); in rcar_unreg_slave() local
592 WARN_ON(!priv->slave); in rcar_unreg_slave()
594 rcar_i2c_write(priv, ICSIER, 0); in rcar_unreg_slave()
595 rcar_i2c_write(priv, ICSCR, 0); in rcar_unreg_slave()
597 priv->slave = NULL; in rcar_unreg_slave()
599 pm_runtime_allow(rcar_i2c_priv_to_dev(priv)); in rcar_unreg_slave()
633 struct rcar_i2c_priv *priv; in rcar_i2c_probe() local
640 priv = devm_kzalloc(dev, sizeof(struct rcar_i2c_priv), GFP_KERNEL); in rcar_i2c_probe()
641 if (!priv) in rcar_i2c_probe()
644 priv->clk = devm_clk_get(dev, NULL); in rcar_i2c_probe()
645 if (IS_ERR(priv->clk)) { in rcar_i2c_probe()
647 return PTR_ERR(priv->clk); in rcar_i2c_probe()
656 priv->devtype = (long)of_match_device(rcar_i2c_dt_ids, in rcar_i2c_probe()
659 priv->devtype = platform_get_device_id(pdev)->driver_data; in rcar_i2c_probe()
661 ret = rcar_i2c_clock_calculate(priv, bus_speed, dev); in rcar_i2c_probe()
666 priv->io = devm_ioremap_resource(dev, res); in rcar_i2c_probe()
667 if (IS_ERR(priv->io)) in rcar_i2c_probe()
668 return PTR_ERR(priv->io); in rcar_i2c_probe()
671 init_waitqueue_head(&priv->wait); in rcar_i2c_probe()
672 spin_lock_init(&priv->lock); in rcar_i2c_probe()
674 adap = &priv->adap; in rcar_i2c_probe()
681 i2c_set_adapdata(adap, priv); in rcar_i2c_probe()
685 dev_name(dev), priv); in rcar_i2c_probe()
692 platform_set_drvdata(pdev, priv); in rcar_i2c_probe()
708 struct rcar_i2c_priv *priv = platform_get_drvdata(pdev); in rcar_i2c_remove() local
711 i2c_del_adapter(&priv->adap); in rcar_i2c_remove()