aboutsummaryrefslogtreecommitdiff
path: root/hw/p8-i2c.c
diff options
context:
space:
mode:
authorBenjamin Herrenschmidt <benh@kernel.crashing.org>2015-09-10 10:08:56 +1000
committerStewart Smith <stewart@linux.vnet.ibm.com>2015-09-11 16:32:37 +1000
commitb5f05ac337b3495cf506f5492fd053e90ae0bda3 (patch)
tree13430c290a130c3f777736abec56173f987416b2 /hw/p8-i2c.c
parentebf9084d8a4d2f70e4e7d2c6a35cac2c7f6e2681 (diff)
downloadskiboot-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.c17
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);
}