summaryrefslogtreecommitdiff
path: root/drivers/staging/olpc_dcon
diff options
context:
space:
mode:
authorKsenija Stanojevic <ksenija.stanojevic@gmail.com>2015-10-02 19:24:05 +0200
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2015-10-04 09:32:56 +0100
commit851f7c0e62dc564bf99e295b3c498d3d96a73b4a (patch)
tree53e90ab77e040afa5947e754fcf6e9acb2fe34d7 /drivers/staging/olpc_dcon
parent51abf45c23872df0a43dbe849eb4439ebda6145f (diff)
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>
Diffstat (limited to 'drivers/staging/olpc_dcon')
-rw-r--r--drivers/staging/olpc_dcon/olpc_dcon.c27
-rw-r--r--drivers/staging/olpc_dcon/olpc_dcon.h4
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;