Lines Matching +full:cmd +full:- +full:timeout +full:- +full:ms
1 // SPDX-License-Identifier: GPL-2.0
56 iowrite16(ioread16(dev->base + SMCR) | SMCR_IEIC, dev->base + SMCR); in highlander_i2c_irq_enable()
61 iowrite16(ioread16(dev->base + SMCR) & ~SMCR_IEIC, dev->base + SMCR); in highlander_i2c_irq_disable()
66 iowrite16(ioread16(dev->base + SMCR) | SMCR_START, dev->base + SMCR); in highlander_i2c_start()
71 iowrite16(ioread16(dev->base + SMCR) | SMCR_IRIC, dev->base + SMCR); in highlander_i2c_done()
78 smmr = ioread16(dev->base + SMMR); in highlander_i2c_setup()
86 iowrite16(smmr, dev->base + SMMR); in highlander_i2c_setup()
91 for (; len > 1; len -= 2) { in smbus_write_data()
102 for (; len > 1; len -= 2) { in smbus_read_data()
115 u16 cmd = (command << 8) | command; in highlander_i2c_command() local
118 if (len - i == 1) in highlander_i2c_command()
119 cmd = command << 8; in highlander_i2c_command()
120 iowrite16(cmd, dev->base + SMSADR + i); in highlander_i2c_command()
121 dev_dbg(dev->dev, "command data[%x] 0x%04x\n", i/2, cmd); in highlander_i2c_command()
127 unsigned long timeout; in highlander_i2c_wait_for_bbsy() local
129 timeout = jiffies + msecs_to_jiffies(iic_timeout); in highlander_i2c_wait_for_bbsy()
130 while (ioread16(dev->base + SMCR) & SMCR_BBSY) { in highlander_i2c_wait_for_bbsy()
131 if (time_after(jiffies, timeout)) { in highlander_i2c_wait_for_bbsy()
132 dev_warn(dev->dev, "timeout waiting for bus ready\n"); in highlander_i2c_wait_for_bbsy()
133 return -ETIMEDOUT; in highlander_i2c_wait_for_bbsy()
144 iowrite16(ioread16(dev->base + SMCR) | SMCR_RST, dev->base + SMCR); in highlander_i2c_reset()
150 u16 tmp = ioread16(dev->base + SMCR); in highlander_i2c_wait_for_ack()
153 dev_warn(dev->dev, "ack abnormality\n"); in highlander_i2c_wait_for_ack()
165 complete(&dev->cmd_complete); in highlander_i2c_irq()
172 unsigned long timeout; in highlander_i2c_poll() local
175 timeout = jiffies + msecs_to_jiffies(iic_timeout); in highlander_i2c_poll()
177 smcr = ioread16(dev->base + SMCR); in highlander_i2c_poll()
187 if (time_after(jiffies, timeout)) in highlander_i2c_poll()
194 dev_err(dev->dev, "polling timed out\n"); in highlander_i2c_poll()
199 if (dev->irq) in highlander_i2c_wait_xfer_done()
200 wait_for_completion_timeout(&dev->cmd_complete, in highlander_i2c_wait_xfer_done()
215 return -EAGAIN; in highlander_i2c_read()
220 dev_err(dev->dev, "Arbitration loss\n"); in highlander_i2c_read()
221 return -EAGAIN; in highlander_i2c_read()
231 * While this generally only applies to the older SH7780-based in highlander_i2c_read()
233 * albeit less frequently. SH7780-based Highlanders may need in highlander_i2c_read()
234 * this to be as high as 1000 ms. in highlander_i2c_read()
236 if (iic_read_delay && time_before(jiffies, dev->last_read_time + in highlander_i2c_read()
238 msleep(jiffies_to_msecs((dev->last_read_time + in highlander_i2c_read()
239 msecs_to_jiffies(iic_read_delay)) - jiffies)); in highlander_i2c_read()
241 cnt = (dev->buf_len + 1) >> 1; in highlander_i2c_read()
243 data[i] = ioread16(dev->base + SMTRDR + (i * sizeof(u16))); in highlander_i2c_read()
244 dev_dbg(dev->dev, "read data[%x] 0x%04x\n", i, data[i]); in highlander_i2c_read()
247 smbus_read_data(data, dev->buf, dev->buf_len); in highlander_i2c_read()
249 dev->last_read_time = jiffies; in highlander_i2c_read()
259 smbus_write_data(dev->buf, data, dev->buf_len); in highlander_i2c_write()
261 cnt = (dev->buf_len + 1) >> 1; in highlander_i2c_write()
263 iowrite16(data[i], dev->base + SMTRDR + (i * sizeof(u16))); in highlander_i2c_write()
264 dev_dbg(dev->dev, "write data[%x] 0x%04x\n", i, data[i]); in highlander_i2c_write()
268 return -EAGAIN; in highlander_i2c_write()
283 init_completion(&dev->cmd_complete); in highlander_i2c_smbus_xfer()
285 dev_dbg(dev->dev, "addr %04x, command %02x, read_write %d, size %d\n", in highlander_i2c_smbus_xfer()
293 dev->buf = &data->byte; in highlander_i2c_smbus_xfer()
294 dev->buf_len = 1; in highlander_i2c_smbus_xfer()
297 dev->buf = &data->block[1]; in highlander_i2c_smbus_xfer()
298 dev->buf_len = data->block[0]; in highlander_i2c_smbus_xfer()
301 dev_err(dev->dev, "unsupported command %d\n", size); in highlander_i2c_smbus_xfer()
302 return -EINVAL; in highlander_i2c_smbus_xfer()
308 tmp = ioread16(dev->base + SMMR); in highlander_i2c_smbus_xfer()
311 switch (dev->buf_len) { in highlander_i2c_smbus_xfer()
325 dev_err(dev->dev, "unsupported xfer size %zu\n", dev->buf_len); in highlander_i2c_smbus_xfer()
326 return -EINVAL; in highlander_i2c_smbus_xfer()
329 iowrite16(tmp, dev->base + SMMR); in highlander_i2c_smbus_xfer()
335 iowrite16((addr << 1) | read_write, dev->base + SMSMADR); in highlander_i2c_smbus_xfer()
337 highlander_i2c_command(dev, command, dev->buf_len); in highlander_i2c_smbus_xfer()
364 dev_err(&pdev->dev, "no mem resource\n"); in highlander_i2c_probe()
365 return -ENODEV; in highlander_i2c_probe()
370 return -ENOMEM; in highlander_i2c_probe()
372 dev->base = ioremap(res->start, resource_size(res)); in highlander_i2c_probe()
373 if (unlikely(!dev->base)) { in highlander_i2c_probe()
374 ret = -ENXIO; in highlander_i2c_probe()
378 dev->dev = &pdev->dev; in highlander_i2c_probe()
381 dev->irq = platform_get_irq(pdev, 0); in highlander_i2c_probe()
382 if (dev->irq < 0 || iic_force_poll) in highlander_i2c_probe()
383 dev->irq = 0; in highlander_i2c_probe()
385 if (dev->irq) { in highlander_i2c_probe()
386 ret = request_irq(dev->irq, highlander_i2c_irq, 0, in highlander_i2c_probe()
387 pdev->name, dev); in highlander_i2c_probe()
393 dev_notice(&pdev->dev, "no IRQ, using polling mode\n"); in highlander_i2c_probe()
397 dev->last_read_time = jiffies; /* initial read jiffies */ in highlander_i2c_probe()
401 adap = &dev->adapter; in highlander_i2c_probe()
403 adap->owner = THIS_MODULE; in highlander_i2c_probe()
404 adap->class = I2C_CLASS_HWMON; in highlander_i2c_probe()
405 strscpy(adap->name, "HL FPGA I2C adapter", sizeof(adap->name)); in highlander_i2c_probe()
406 adap->algo = &highlander_i2c_algo; in highlander_i2c_probe()
407 adap->dev.parent = &pdev->dev; in highlander_i2c_probe()
408 adap->nr = pdev->id; in highlander_i2c_probe()
415 dev_err(&pdev->dev, "controller didn't come up\n"); in highlander_i2c_probe()
421 dev_err(&pdev->dev, "failure adding adapter\n"); in highlander_i2c_probe()
428 if (dev->irq) in highlander_i2c_probe()
429 free_irq(dev->irq, dev); in highlander_i2c_probe()
431 iounmap(dev->base); in highlander_i2c_probe()
442 i2c_del_adapter(&dev->adapter); in highlander_i2c_remove()
444 if (dev->irq) in highlander_i2c_remove()
445 free_irq(dev->irq, dev); in highlander_i2c_remove()
447 iounmap(dev->base); in highlander_i2c_remove()
453 .name = "i2c-highlander",
474 MODULE_PARM_DESC(iic_timeout, "Set timeout value in msecs (default 1000 ms)");
476 "Delay between data read cycles (default 0 ms)");