diff options
author | Ksenija Stanojevic <ksenija.stanojevic@gmail.com> | 2015-10-02 19:24:05 +0200 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2015-10-04 09:32:56 +0100 |
commit | 851f7c0e62dc564bf99e295b3c498d3d96a73b4a (patch) | |
tree | 53e90ab77e040afa5947e754fcf6e9acb2fe34d7 | |
parent | 51abf45c23872df0a43dbe849eb4439ebda6145f (diff) | |
download | talos-obmc-linux-851f7c0e62dc564bf99e295b3c498d3d96a73b4a.tar.gz talos-obmc-linux-851f7c0e62dc564bf99e295b3c498d3d96a73b4a.zip |
Staging: olpc_dcon: Replace timespec with ktime_t
Struct timespec will overflow in year 2038, here it will not cause an
overflow because it is used with timespec_sub, but still has to be
removed as part of y2038 changes. Replace it with ktime_t. Also use
monotonic instead of real-time by replacing functions getnstimeofday
with ktime_get.
Signed-off-by: Ksenija Stanojevic <ksenija.stanojevic@gmail.com>
Reviewed-by: Arnd Bergmann <arnd@arndb.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-rw-r--r-- | drivers/staging/olpc_dcon/olpc_dcon.c | 27 | ||||
-rw-r--r-- | drivers/staging/olpc_dcon/olpc_dcon.h | 4 |
2 files changed, 15 insertions, 16 deletions
diff --git a/drivers/staging/olpc_dcon/olpc_dcon.c b/drivers/staging/olpc_dcon/olpc_dcon.c index d115f5c0e341..9038e0b3f113 100644 --- a/drivers/staging/olpc_dcon/olpc_dcon.c +++ b/drivers/staging/olpc_dcon/olpc_dcon.c @@ -238,13 +238,12 @@ static void dcon_sleep(struct dcon_priv *dcon, bool sleep) */ static void dcon_load_holdoff(struct dcon_priv *dcon) { - struct timespec delta_t, now; + ktime_t delta_t, now; while (1) { - getnstimeofday(&now); - delta_t = timespec_sub(now, dcon->load_time); - if (delta_t.tv_sec != 0 || - delta_t.tv_nsec > NSEC_PER_MSEC * 20) { + now = ktime_get(); + delta_t = ktime_sub(now, dcon->load_time); + if (ktime_to_ns(delta_t) > NSEC_PER_MSEC * 20) { break; } mdelay(4); @@ -325,19 +324,19 @@ static void dcon_source_switch(struct work_struct *work) /* And turn off the DCON */ pdata->set_dconload(1); - getnstimeofday(&dcon->load_time); + dcon->load_time = ktime_get(); pr_info("The CPU has control\n"); break; case DCON_SOURCE_DCON: { - struct timespec delta_t; + ktime_t delta_t; pr_info("dcon_source_switch to DCON\n"); /* Clear DCONLOAD - this implies that the DCON is in control */ pdata->set_dconload(0); - getnstimeofday(&dcon->load_time); + dcon->load_time = ktime_get(); wait_event_timeout(dcon->waitq, dcon->switched, HZ/2); @@ -355,14 +354,14 @@ static void dcon_source_switch(struct work_struct *work) * deassert and reassert, and hope for the best. * see http://dev.laptop.org/ticket/9664 */ - delta_t = timespec_sub(dcon->irq_time, dcon->load_time); - if (dcon->switched && delta_t.tv_sec == 0 && - delta_t.tv_nsec < NSEC_PER_MSEC * 20) { + delta_t = ktime_sub(dcon->irq_time, dcon->load_time); + if (dcon->switched && ktime_to_ns(delta_t) + < NSEC_PER_MSEC * 20) { pr_err("missed loading, retrying\n"); pdata->set_dconload(1); mdelay(41); pdata->set_dconload(0); - getnstimeofday(&dcon->load_time); + dcon->load_time = ktime_get(); mdelay(41); } } @@ -742,7 +741,7 @@ irqreturn_t dcon_interrupt(int irq, void *id) case 2: /* switch to DCON mode */ case 1: /* switch to CPU mode */ dcon->switched = true; - getnstimeofday(&dcon->irq_time); + dcon->irq_time = ktime_get(); wake_up(&dcon->waitq); break; @@ -756,7 +755,7 @@ irqreturn_t dcon_interrupt(int irq, void *id) */ if (dcon->curr_src != dcon->pending_src && !dcon->switched) { dcon->switched = true; - getnstimeofday(&dcon->irq_time); + dcon->irq_time = ktime_get(); wake_up(&dcon->waitq); pr_debug("switching w/ status 0/0\n"); } else { diff --git a/drivers/staging/olpc_dcon/olpc_dcon.h b/drivers/staging/olpc_dcon/olpc_dcon.h index d06e19db1b80..215e7ec4dea2 100644 --- a/drivers/staging/olpc_dcon/olpc_dcon.h +++ b/drivers/staging/olpc_dcon/olpc_dcon.h @@ -79,8 +79,8 @@ struct dcon_priv { /* Variables used during switches */ bool switched; - struct timespec irq_time; - struct timespec load_time; + ktime_t irq_time; + ktime_t load_time; /* Current output type; true == mono, false == color */ bool mono; |