• Home
  • Raw
  • Download

Lines Matching +full:uniphier +full:- +full:i2c

16 #include <linux/i2c.h>
68 complete(&priv->comp); in uniphier_i2c_interrupt()
80 reinit_completion(&priv->comp); in uniphier_i2c_xfer_byte()
83 dev_dbg(&adap->dev, "write data: 0x%04x\n", txdata); in uniphier_i2c_xfer_byte()
84 writel(txdata, priv->membase + UNIPHIER_I2C_DTRM); in uniphier_i2c_xfer_byte()
86 time_left = wait_for_completion_timeout(&priv->comp, adap->timeout); in uniphier_i2c_xfer_byte()
88 dev_err(&adap->dev, "transaction timeout\n"); in uniphier_i2c_xfer_byte()
89 return -ETIMEDOUT; in uniphier_i2c_xfer_byte()
92 rxdata = readl(priv->membase + UNIPHIER_I2C_DREC); in uniphier_i2c_xfer_byte()
93 dev_dbg(&adap->dev, "read data: 0x%04x\n", rxdata); in uniphier_i2c_xfer_byte()
111 dev_dbg(&adap->dev, "arbitration lost\n"); in uniphier_i2c_send_byte()
112 return -EAGAIN; in uniphier_i2c_send_byte()
115 dev_dbg(&adap->dev, "could not get ACK\n"); in uniphier_i2c_send_byte()
116 return -ENXIO; in uniphier_i2c_send_byte()
127 dev_dbg(&adap->dev, "start condition\n"); in uniphier_i2c_tx()
134 while (len--) { in uniphier_i2c_tx()
149 dev_dbg(&adap->dev, "start condition\n"); in uniphier_i2c_rx()
157 while (len--) { in uniphier_i2c_rx()
173 dev_dbg(&adap->dev, "stop condition\n"); in uniphier_i2c_stop()
181 bool is_read = msg->flags & I2C_M_RD; in uniphier_i2c_master_xfer_one()
185 dev_dbg(&adap->dev, "%s: addr=0x%02x, len=%d, stop=%d\n", in uniphier_i2c_master_xfer_one()
186 is_read ? "receive" : "transmit", msg->addr, msg->len, stop); in uniphier_i2c_master_xfer_one()
189 ret = uniphier_i2c_rx(adap, msg->addr, msg->len, msg->buf); in uniphier_i2c_master_xfer_one()
191 ret = uniphier_i2c_tx(adap, msg->addr, msg->len, msg->buf); in uniphier_i2c_master_xfer_one()
193 if (ret == -EAGAIN) /* could not acquire bus. bail out without STOP */ in uniphier_i2c_master_xfer_one()
196 if (ret == -ETIMEDOUT) { in uniphier_i2c_master_xfer_one()
222 if (!(readl(priv->membase + UNIPHIER_I2C_DREC) & in uniphier_i2c_check_bus_busy()
224 if (priv->busy_cnt++ > 3) { in uniphier_i2c_check_bus_busy()
230 priv->busy_cnt = 0; in uniphier_i2c_check_bus_busy()
233 return -EAGAIN; in uniphier_i2c_check_bus_busy()
236 priv->busy_cnt = 0; in uniphier_i2c_check_bus_busy()
252 bool stop = (msg + 1 == emsg) || (msg->flags & I2C_M_STOP); in uniphier_i2c_master_xfer()
277 writel(val, priv->membase + UNIPHIER_I2C_BRST); in uniphier_i2c_reset()
284 return !!(readl(priv->membase + UNIPHIER_I2C_BSTS) & in uniphier_i2c_get_scl()
293 priv->membase + UNIPHIER_I2C_BRST); in uniphier_i2c_set_scl()
300 return !!(readl(priv->membase + UNIPHIER_I2C_BSTS) & in uniphier_i2c_get_sda()
319 unsigned int cyc = priv->clk_cycle; in uniphier_i2c_hw_init()
324 * Bit30-16: clock cycles of tLOW. in uniphier_i2c_hw_init()
325 * Standard-mode: tLOW = 4.7 us, tHIGH = 4.0 us in uniphier_i2c_hw_init()
326 * Fast-mode: tLOW = 1.3 us, tHIGH = 0.6 us in uniphier_i2c_hw_init()
329 writel((cyc * 5 / 9 << 16) | cyc, priv->membase + UNIPHIER_I2C_CLK); in uniphier_i2c_hw_init()
336 struct device *dev = &pdev->dev; in uniphier_i2c_probe()
345 return -ENOMEM; in uniphier_i2c_probe()
348 priv->membase = devm_ioremap_resource(dev, regs); in uniphier_i2c_probe()
349 if (IS_ERR(priv->membase)) in uniphier_i2c_probe()
350 return PTR_ERR(priv->membase); in uniphier_i2c_probe()
358 if (of_property_read_u32(dev->of_node, "clock-frequency", &bus_speed)) in uniphier_i2c_probe()
362 dev_err(dev, "invalid clock-frequency %d\n", bus_speed); in uniphier_i2c_probe()
363 return -EINVAL; in uniphier_i2c_probe()
366 priv->clk = devm_clk_get(dev, NULL); in uniphier_i2c_probe()
367 if (IS_ERR(priv->clk)) { in uniphier_i2c_probe()
369 return PTR_ERR(priv->clk); in uniphier_i2c_probe()
372 ret = clk_prepare_enable(priv->clk); in uniphier_i2c_probe()
376 clk_rate = clk_get_rate(priv->clk); in uniphier_i2c_probe()
379 ret = -EINVAL; in uniphier_i2c_probe()
383 priv->clk_cycle = clk_rate / bus_speed; in uniphier_i2c_probe()
384 init_completion(&priv->comp); in uniphier_i2c_probe()
385 priv->adap.owner = THIS_MODULE; in uniphier_i2c_probe()
386 priv->adap.algo = &uniphier_i2c_algo; in uniphier_i2c_probe()
387 priv->adap.dev.parent = dev; in uniphier_i2c_probe()
388 priv->adap.dev.of_node = dev->of_node; in uniphier_i2c_probe()
389 strlcpy(priv->adap.name, "UniPhier I2C", sizeof(priv->adap.name)); in uniphier_i2c_probe()
390 priv->adap.bus_recovery_info = &uniphier_i2c_bus_recovery_info; in uniphier_i2c_probe()
391 i2c_set_adapdata(&priv->adap, priv); in uniphier_i2c_probe()
396 ret = devm_request_irq(dev, irq, uniphier_i2c_interrupt, 0, pdev->name, in uniphier_i2c_probe()
403 ret = i2c_add_adapter(&priv->adap); in uniphier_i2c_probe()
406 clk_disable_unprepare(priv->clk); in uniphier_i2c_probe()
415 i2c_del_adapter(&priv->adap); in uniphier_i2c_remove()
416 clk_disable_unprepare(priv->clk); in uniphier_i2c_remove()
425 clk_disable_unprepare(priv->clk); in uniphier_i2c_suspend()
435 ret = clk_prepare_enable(priv->clk); in uniphier_i2c_resume()
449 { .compatible = "socionext,uniphier-i2c" },
458 .name = "uniphier-i2c",
466 MODULE_DESCRIPTION("UniPhier I2C bus driver");