Lines Matching +full:mode +full:- +full:recovery

1 // SPDX-License-Identifier: GPL-2.0-or-later
56 complete(&priv->comp); in uniphier_i2c_interrupt()
68 reinit_completion(&priv->comp); in uniphier_i2c_xfer_byte()
71 writel(txdata, priv->membase + UNIPHIER_I2C_DTRM); in uniphier_i2c_xfer_byte()
73 time_left = wait_for_completion_timeout(&priv->comp, adap->timeout); in uniphier_i2c_xfer_byte()
75 dev_err(&adap->dev, "transaction timeout\n"); in uniphier_i2c_xfer_byte()
76 return -ETIMEDOUT; in uniphier_i2c_xfer_byte()
79 rxdata = readl(priv->membase + UNIPHIER_I2C_DREC); in uniphier_i2c_xfer_byte()
96 return -EAGAIN; in uniphier_i2c_send_byte()
99 return -ENXIO; in uniphier_i2c_send_byte()
115 while (len--) { in uniphier_i2c_tx()
137 while (len--) { in uniphier_i2c_rx()
160 bool is_read = msg->flags & I2C_M_RD; in uniphier_i2c_master_xfer_one()
161 bool recovery = false; in uniphier_i2c_master_xfer_one() local
165 ret = uniphier_i2c_rx(adap, msg->addr, msg->len, msg->buf); in uniphier_i2c_master_xfer_one()
167 ret = uniphier_i2c_tx(adap, msg->addr, msg->len, msg->buf); in uniphier_i2c_master_xfer_one()
169 if (ret == -EAGAIN) /* could not acquire bus. bail out without STOP */ in uniphier_i2c_master_xfer_one()
172 if (ret == -ETIMEDOUT) { in uniphier_i2c_master_xfer_one()
173 /* This error is fatal. Needs recovery. */ in uniphier_i2c_master_xfer_one()
175 recovery = true; in uniphier_i2c_master_xfer_one()
182 /* Failed to issue STOP. The bus needs recovery. */ in uniphier_i2c_master_xfer_one()
183 recovery = true; in uniphier_i2c_master_xfer_one()
188 if (recovery) in uniphier_i2c_master_xfer_one()
198 if (!(readl(priv->membase + UNIPHIER_I2C_DREC) & in uniphier_i2c_check_bus_busy()
200 if (priv->busy_cnt++ > 3) { in uniphier_i2c_check_bus_busy()
203 * in a wrong state. Try bus recovery. in uniphier_i2c_check_bus_busy()
206 priv->busy_cnt = 0; in uniphier_i2c_check_bus_busy()
209 return -EAGAIN; in uniphier_i2c_check_bus_busy()
212 priv->busy_cnt = 0; in uniphier_i2c_check_bus_busy()
228 bool stop = (msg + 1 == emsg) || (msg->flags & I2C_M_STOP); in uniphier_i2c_master_xfer()
253 writel(val, priv->membase + UNIPHIER_I2C_BRST); in uniphier_i2c_reset()
260 return !!(readl(priv->membase + UNIPHIER_I2C_BSTS) & in uniphier_i2c_get_scl()
269 priv->membase + UNIPHIER_I2C_BRST); in uniphier_i2c_set_scl()
276 return !!(readl(priv->membase + UNIPHIER_I2C_BSTS) & in uniphier_i2c_get_sda()
295 unsigned int cyc = priv->clk_cycle; in uniphier_i2c_hw_init()
300 * Bit30-16: clock cycles of tLOW. in uniphier_i2c_hw_init()
301 * Standard-mode: tLOW = 4.7 us, tHIGH = 4.0 us in uniphier_i2c_hw_init()
302 * Fast-mode: tLOW = 1.3 us, tHIGH = 0.6 us in uniphier_i2c_hw_init()
305 writel((cyc * 5 / 9 << 16) | cyc, priv->membase + UNIPHIER_I2C_CLK); in uniphier_i2c_hw_init()
312 struct device *dev = &pdev->dev; in uniphier_i2c_probe()
320 return -ENOMEM; in uniphier_i2c_probe()
322 priv->membase = devm_platform_ioremap_resource(pdev, 0); in uniphier_i2c_probe()
323 if (IS_ERR(priv->membase)) in uniphier_i2c_probe()
324 return PTR_ERR(priv->membase); in uniphier_i2c_probe()
330 if (of_property_read_u32(dev->of_node, "clock-frequency", &bus_speed)) in uniphier_i2c_probe()
334 dev_err(dev, "invalid clock-frequency %d\n", bus_speed); in uniphier_i2c_probe()
335 return -EINVAL; in uniphier_i2c_probe()
338 priv->clk = devm_clk_get(dev, NULL); in uniphier_i2c_probe()
339 if (IS_ERR(priv->clk)) { in uniphier_i2c_probe()
341 return PTR_ERR(priv->clk); in uniphier_i2c_probe()
344 ret = clk_prepare_enable(priv->clk); in uniphier_i2c_probe()
348 clk_rate = clk_get_rate(priv->clk); in uniphier_i2c_probe()
351 ret = -EINVAL; in uniphier_i2c_probe()
355 priv->clk_cycle = clk_rate / bus_speed; in uniphier_i2c_probe()
356 init_completion(&priv->comp); in uniphier_i2c_probe()
357 priv->adap.owner = THIS_MODULE; in uniphier_i2c_probe()
358 priv->adap.algo = &uniphier_i2c_algo; in uniphier_i2c_probe()
359 priv->adap.dev.parent = dev; in uniphier_i2c_probe()
360 priv->adap.dev.of_node = dev->of_node; in uniphier_i2c_probe()
361 strscpy(priv->adap.name, "UniPhier I2C", sizeof(priv->adap.name)); in uniphier_i2c_probe()
362 priv->adap.bus_recovery_info = &uniphier_i2c_bus_recovery_info; in uniphier_i2c_probe()
363 i2c_set_adapdata(&priv->adap, priv); in uniphier_i2c_probe()
368 ret = devm_request_irq(dev, irq, uniphier_i2c_interrupt, 0, pdev->name, in uniphier_i2c_probe()
375 ret = i2c_add_adapter(&priv->adap); in uniphier_i2c_probe()
378 clk_disable_unprepare(priv->clk); in uniphier_i2c_probe()
387 i2c_del_adapter(&priv->adap); in uniphier_i2c_remove()
388 clk_disable_unprepare(priv->clk); in uniphier_i2c_remove()
397 clk_disable_unprepare(priv->clk); in uniphier_i2c_suspend()
407 ret = clk_prepare_enable(priv->clk); in uniphier_i2c_resume()
421 { .compatible = "socionext,uniphier-i2c" },
430 .name = "uniphier-i2c",