aboutsummaryrefslogtreecommitdiff
path: root/hw/p8-i2c.c
diff options
context:
space:
mode:
authorFrederic Barrat <fbarrat@linux.ibm.com>2018-09-19 19:05:13 +0200
committerStewart Smith <stewart@linux.ibm.com>2018-09-27 00:41:48 -0500
commita800fa35b8222996a634baeec27cd2369f7619f5 (patch)
treeee900b0e359602af03667fd6d7e5884fa8566743 /hw/p8-i2c.c
parentcc4de28374c73e308cebb083f292afc21984f355 (diff)
downloadskiboot-a800fa35b8222996a634baeec27cd2369f7619f5.zip
skiboot-a800fa35b8222996a634baeec27cd2369f7619f5.tar.gz
skiboot-a800fa35b8222996a634baeec27cd2369f7619f5.tar.bz2
hw/p8-i2c: Fix i2c request timeout
Commit eb146fac9685 ("core/i2c: Move the timeout field into i2c_request") simplified a bit how a request timeout is handled. However there's now some confusion between milliseconds and timebase increments when defining or using the timeout values, which breaks i2c requests made for opencapi, and probably others too. This patch declares all the timeout in milliseconds and just converts to timebase at the end of the chain, as needed. Signed-off-by: Frederic Barrat <fbarrat@linux.ibm.com> Tested-by: Andrew Donnellan <andrew.donnellan@au1.ibm.com> Reviewed-by: Oliver O'Halloran <oohall@gmail.com> Signed-off-by: Stewart Smith <stewart@linux.ibm.com>
Diffstat (limited to 'hw/p8-i2c.c')
-rw-r--r--hw/p8-i2c.c10
1 files changed, 4 insertions, 6 deletions
diff --git a/hw/p8-i2c.c b/hw/p8-i2c.c
index fa5af7c..a45769c 100644
--- a/hw/p8-i2c.c
+++ b/hw/p8-i2c.c
@@ -374,7 +374,7 @@ static void p8_i2c_reset_timeout(struct p8_i2c_master *master,
uint64_t now = mftb();
master->last_update = now;
- schedule_timer_at(&master->timeout, now + req->timeout);
+ schedule_timer_at(&master->timeout, now + msecs_to_tb(req->timeout));
}
static int p8_i2c_prog_watermark(struct p8_i2c_master *master)
@@ -854,7 +854,7 @@ static void p8_i2c_check_status(struct p8_i2c_master *master)
port = container_of(req->bus, struct p8_i2c_master_port, bus);
now = mftb();
- deadline = master->last_update + req->timeout;
+ deadline = master->last_update + msecs_to_tb(req->timeout);
if (status & I2C_STAT_ANY_ERR)
p8_i2c_status_error(port, req, status & I2C_STAT_ANY_ERR, now);
@@ -1584,7 +1584,6 @@ static void p8_i2c_init_one(struct dt_node *i2cm, enum p8_i2c_master_type type)
I2C_TIMEOUT_POLL_MS;
dt_for_each_child(i2cm, i2cm_port) {
- uint64_t timeout_ms;
uint32_t speed;
port->port_num = dt_prop_get_u32(i2cm_port, "reg");
@@ -1598,9 +1597,8 @@ static void p8_i2c_init_one(struct dt_node *i2cm, enum p8_i2c_master_type type)
port->bus.queue_req = p8_i2c_queue_request;
port->bus.run_req = p8_i2c_run_request;
- timeout_ms = dt_prop_get_u32_def(i2cm_port, "timeout-ms",
- default_timeout);
- port->byte_timeout = msecs_to_tb(timeout_ms);
+ port->byte_timeout = dt_prop_get_u32_def(i2cm_port,
+ "timeout-ms", default_timeout);
i2c_add_bus(&port->bus);
list_add_tail(&master->ports, &port->link);