diff options
author | Benjamin Herrenschmidt <benh@kernel.crashing.org> | 2015-09-10 10:08:56 +1000 |
---|---|---|
committer | Stewart Smith <stewart@linux.vnet.ibm.com> | 2015-09-11 16:32:37 +1000 |
commit | b5f05ac337b3495cf506f5492fd053e90ae0bda3 (patch) | |
tree | 13430c290a130c3f777736abec56173f987416b2 /hw/p8-i2c.c | |
parent | ebf9084d8a4d2f70e4e7d2c6a35cac2c7f6e2681 (diff) | |
download | skiboot-b5f05ac337b3495cf506f5492fd053e90ae0bda3.zip skiboot-b5f05ac337b3495cf506f5492fd053e90ae0bda3.tar.gz skiboot-b5f05ac337b3495cf506f5492fd053e90ae0bda3.tar.bz2 |
timer: Pass current timer to timer callbacks
The caller usually has it and it avoids additional mftb() which
can be expensive.
Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
[stewart@linux.vnet.ibm.com: fix run-timer unit test]
Signed-off-by: Stewart Smith <stewart@linux.vnet.ibm.com>
Diffstat (limited to 'hw/p8-i2c.c')
-rw-r--r-- | hw/p8-i2c.c | 17 |
1 files changed, 10 insertions, 7 deletions
diff --git a/hw/p8-i2c.c b/hw/p8-i2c.c index dfb26d4..848d400 100644 --- a/hw/p8-i2c.c +++ b/hw/p8-i2c.c @@ -1048,7 +1048,7 @@ static inline uint64_t p8_i2c_get_poll_interval(uint32_t bus_speed) return usecs_to_tb(usec); } -static void p8_i2c_timeout(struct timer *t __unused, void *data) +static void p8_i2c_timeout(struct timer *t __unused, void *data, uint64_t now) { struct p8_i2c_master_port *port; struct p8_i2c_master *master = data; @@ -1073,7 +1073,7 @@ static void p8_i2c_timeout(struct timer *t __unused, void *data) goto exit; } request = container_of(req, struct p8_i2c_request, req); - if (tb_compare(mftb(), request->timeout) == TB_ABEFOREB) { + if (tb_compare(now, request->timeout) == TB_ABEFOREB) { DBG("I2C: Timeout with request not expired\n"); goto exit; } @@ -1094,12 +1094,14 @@ static void p8_i2c_timeout(struct timer *t __unused, void *data) unlock(&master->lock); } -static void p8_i2c_recover(struct timer *t __unused, void *data) +static void p8_i2c_recover(struct timer *t __unused, void *data, + uint64_t now __unused) { struct p8_i2c_master *master = data; lock(&master->lock); - assert(master->state == state_recovery || master->state == state_occache_dis); + assert(master->state == state_recovery || + master->state == state_occache_dis); master->state = state_idle; /* We may or may not still have work pending, re-enable the sensor cache @@ -1117,7 +1119,8 @@ static void p8_i2c_recover(struct timer *t __unused, void *data) unlock(&master->lock); } -static void p8_i2c_enable_scache(struct timer *t __unused, void *data) +static void p8_i2c_enable_scache(struct timer *t __unused, void *data, + uint64_t now __unused) { struct p8_i2c_master *master = data; @@ -1132,7 +1135,7 @@ static void p8_i2c_enable_scache(struct timer *t __unused, void *data) unlock(&master->lock); } -static void p8_i2c_poll(struct timer *t __unused, void *data) +static void p8_i2c_poll(struct timer *t __unused, void *data, uint64_t now) { struct p8_i2c_master *master = data; @@ -1149,7 +1152,7 @@ static void p8_i2c_poll(struct timer *t __unused, void *data) lock(&master->lock); p8_i2c_check_status(master); if (master->state != state_idle) - schedule_timer(&master->poller, master->poll_interval); + schedule_timer_at(&master->poller, now + master->poll_interval); p8_i2c_check_work(master); unlock(&master->lock); } |