[media] dvb-frontend: Replace timeval with ktime_t
struct timeval uses a 32-bit seconds representation which will overflow in the year 2038 and beyond. This patch replaces the usage of struct timeval with ktime_t which is a 64-bit timestamp and is year 2038 safe. This patch is part of a larger attempt to remove all instances of 32-bit timekeeping variables (timeval, timespec, time_t) which are not year 2038 safe, from the kernel. [mchehab@osg.samsung.com: add a missing parenthesis, breaking compilation] Suggested-by: Arnd Bergmann <arndb@arndb.de> Signed-off-by: Tina Ruchandani <ruchandani.tina@gmail.com> Reviewed-by: Arnd Bergmann <arnd@arndb.de> Signed-off-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
This commit is contained in:
parent
d3525b632a
commit
9056a23ba1
|
@ -40,6 +40,7 @@
|
||||||
#include <linux/freezer.h>
|
#include <linux/freezer.h>
|
||||||
#include <linux/jiffies.h>
|
#include <linux/jiffies.h>
|
||||||
#include <linux/kthread.h>
|
#include <linux/kthread.h>
|
||||||
|
#include <linux/ktime.h>
|
||||||
#include <asm/processor.h>
|
#include <asm/processor.h>
|
||||||
|
|
||||||
#include "dvb_frontend.h"
|
#include "dvb_frontend.h"
|
||||||
|
@ -890,42 +891,21 @@ static void dvb_frontend_stop(struct dvb_frontend *fe)
|
||||||
fepriv->thread);
|
fepriv->thread);
|
||||||
}
|
}
|
||||||
|
|
||||||
s32 timeval_usec_diff(struct timeval lasttime, struct timeval curtime)
|
|
||||||
{
|
|
||||||
return ((curtime.tv_usec < lasttime.tv_usec) ?
|
|
||||||
1000000 - lasttime.tv_usec + curtime.tv_usec :
|
|
||||||
curtime.tv_usec - lasttime.tv_usec);
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL(timeval_usec_diff);
|
|
||||||
|
|
||||||
static inline void timeval_usec_add(struct timeval *curtime, u32 add_usec)
|
|
||||||
{
|
|
||||||
curtime->tv_usec += add_usec;
|
|
||||||
if (curtime->tv_usec >= 1000000) {
|
|
||||||
curtime->tv_usec -= 1000000;
|
|
||||||
curtime->tv_sec++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Sleep until gettimeofday() > waketime + add_usec
|
* Sleep until gettimeofday() > waketime + add_usec
|
||||||
* This needs to be as precise as possible, but as the delay is
|
* This needs to be as precise as possible, but as the delay is
|
||||||
* usually between 2ms and 32ms, it is done using a scheduled msleep
|
* usually between 2ms and 32ms, it is done using a scheduled msleep
|
||||||
* followed by usleep (normally a busy-wait loop) for the remainder
|
* followed by usleep (normally a busy-wait loop) for the remainder
|
||||||
*/
|
*/
|
||||||
void dvb_frontend_sleep_until(struct timeval *waketime, u32 add_usec)
|
void dvb_frontend_sleep_until(ktime_t *waketime, u32 add_usec)
|
||||||
{
|
{
|
||||||
struct timeval lasttime;
|
|
||||||
s32 delta, newdelta;
|
s32 delta, newdelta;
|
||||||
|
|
||||||
timeval_usec_add(waketime, add_usec);
|
ktime_add_us(*waketime, add_usec);
|
||||||
|
delta = ktime_us_delta(ktime_get_real(), *waketime);
|
||||||
do_gettimeofday(&lasttime);
|
|
||||||
delta = timeval_usec_diff(lasttime, *waketime);
|
|
||||||
if (delta > 2500) {
|
if (delta > 2500) {
|
||||||
msleep((delta - 1500) / 1000);
|
msleep((delta - 1500) / 1000);
|
||||||
do_gettimeofday(&lasttime);
|
newdelta = ktime_us_delta(ktime_get_real(), *waketime);
|
||||||
newdelta = timeval_usec_diff(lasttime, *waketime);
|
|
||||||
delta = (newdelta > delta) ? 0 : newdelta;
|
delta = (newdelta > delta) ? 0 : newdelta;
|
||||||
}
|
}
|
||||||
if (delta > 0)
|
if (delta > 0)
|
||||||
|
@ -2463,13 +2443,13 @@ static int dvb_frontend_ioctl_legacy(struct file *file,
|
||||||
* include the initialization or start bit
|
* include the initialization or start bit
|
||||||
*/
|
*/
|
||||||
unsigned long swcmd = ((unsigned long) parg) << 1;
|
unsigned long swcmd = ((unsigned long) parg) << 1;
|
||||||
struct timeval nexttime;
|
ktime_t nexttime;
|
||||||
struct timeval tv[10];
|
ktime_t tv[10];
|
||||||
int i;
|
int i;
|
||||||
u8 last = 1;
|
u8 last = 1;
|
||||||
if (dvb_frontend_debug)
|
if (dvb_frontend_debug)
|
||||||
printk("%s switch command: 0x%04lx\n", __func__, swcmd);
|
printk("%s switch command: 0x%04lx\n", __func__, swcmd);
|
||||||
do_gettimeofday(&nexttime);
|
nexttime = ktime_get_real();
|
||||||
if (dvb_frontend_debug)
|
if (dvb_frontend_debug)
|
||||||
tv[0] = nexttime;
|
tv[0] = nexttime;
|
||||||
/* before sending a command, initialize by sending
|
/* before sending a command, initialize by sending
|
||||||
|
@ -2480,7 +2460,7 @@ static int dvb_frontend_ioctl_legacy(struct file *file,
|
||||||
|
|
||||||
for (i = 0; i < 9; i++) {
|
for (i = 0; i < 9; i++) {
|
||||||
if (dvb_frontend_debug)
|
if (dvb_frontend_debug)
|
||||||
do_gettimeofday(&tv[i + 1]);
|
tv[i+1] = ktime_get_real();
|
||||||
if ((swcmd & 0x01) != last) {
|
if ((swcmd & 0x01) != last) {
|
||||||
/* set voltage to (last ? 13V : 18V) */
|
/* set voltage to (last ? 13V : 18V) */
|
||||||
fe->ops.set_voltage(fe, (last) ? SEC_VOLTAGE_13 : SEC_VOLTAGE_18);
|
fe->ops.set_voltage(fe, (last) ? SEC_VOLTAGE_13 : SEC_VOLTAGE_18);
|
||||||
|
@ -2494,7 +2474,8 @@ static int dvb_frontend_ioctl_legacy(struct file *file,
|
||||||
printk("%s(%d): switch delay (should be 32k followed by all 8k\n",
|
printk("%s(%d): switch delay (should be 32k followed by all 8k\n",
|
||||||
__func__, fe->dvb->num);
|
__func__, fe->dvb->num);
|
||||||
for (i = 1; i < 10; i++)
|
for (i = 1; i < 10; i++)
|
||||||
printk("%d: %d\n", i, timeval_usec_diff(tv[i-1] , tv[i]));
|
printk("%d: %d\n", i,
|
||||||
|
(int) ktime_us_delta(tv[i], tv[i-1]));
|
||||||
}
|
}
|
||||||
err = 0;
|
err = 0;
|
||||||
fepriv->state = FESTATE_DISEQC;
|
fepriv->state = FESTATE_DISEQC;
|
||||||
|
|
|
@ -441,7 +441,6 @@ extern void dvb_frontend_reinitialise(struct dvb_frontend *fe);
|
||||||
extern int dvb_frontend_suspend(struct dvb_frontend *fe);
|
extern int dvb_frontend_suspend(struct dvb_frontend *fe);
|
||||||
extern int dvb_frontend_resume(struct dvb_frontend *fe);
|
extern int dvb_frontend_resume(struct dvb_frontend *fe);
|
||||||
|
|
||||||
extern void dvb_frontend_sleep_until(struct timeval *waketime, u32 add_usec);
|
extern void dvb_frontend_sleep_until(ktime_t *waketime, u32 add_usec);
|
||||||
extern s32 timeval_usec_diff(struct timeval lasttime, struct timeval curtime);
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -44,6 +44,7 @@
|
||||||
|
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
|
#include <linux/ktime.h>
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
#include <linux/string.h>
|
#include <linux/string.h>
|
||||||
#include <linux/slab.h>
|
#include <linux/slab.h>
|
||||||
|
@ -407,8 +408,8 @@ static int stv0299_send_legacy_dish_cmd (struct dvb_frontend* fe, unsigned long
|
||||||
u8 lv_mask = 0x40;
|
u8 lv_mask = 0x40;
|
||||||
u8 last = 1;
|
u8 last = 1;
|
||||||
int i;
|
int i;
|
||||||
struct timeval nexttime;
|
ktime_t nexttime;
|
||||||
struct timeval tv[10];
|
ktime_t tv[10];
|
||||||
|
|
||||||
reg0x08 = stv0299_readreg (state, 0x08);
|
reg0x08 = stv0299_readreg (state, 0x08);
|
||||||
reg0x0c = stv0299_readreg (state, 0x0c);
|
reg0x0c = stv0299_readreg (state, 0x0c);
|
||||||
|
@ -421,7 +422,7 @@ static int stv0299_send_legacy_dish_cmd (struct dvb_frontend* fe, unsigned long
|
||||||
if (debug_legacy_dish_switch)
|
if (debug_legacy_dish_switch)
|
||||||
printk ("%s switch command: 0x%04lx\n",__func__, cmd);
|
printk ("%s switch command: 0x%04lx\n",__func__, cmd);
|
||||||
|
|
||||||
do_gettimeofday (&nexttime);
|
nexttime = ktime_get_real();
|
||||||
if (debug_legacy_dish_switch)
|
if (debug_legacy_dish_switch)
|
||||||
tv[0] = nexttime;
|
tv[0] = nexttime;
|
||||||
stv0299_writeregI (state, 0x0c, reg0x0c | 0x50); /* set LNB to 18V */
|
stv0299_writeregI (state, 0x0c, reg0x0c | 0x50); /* set LNB to 18V */
|
||||||
|
@ -430,7 +431,7 @@ static int stv0299_send_legacy_dish_cmd (struct dvb_frontend* fe, unsigned long
|
||||||
|
|
||||||
for (i=0; i<9; i++) {
|
for (i=0; i<9; i++) {
|
||||||
if (debug_legacy_dish_switch)
|
if (debug_legacy_dish_switch)
|
||||||
do_gettimeofday (&tv[i+1]);
|
tv[i+1] = ktime_get_real();
|
||||||
if((cmd & 0x01) != last) {
|
if((cmd & 0x01) != last) {
|
||||||
/* set voltage to (last ? 13V : 18V) */
|
/* set voltage to (last ? 13V : 18V) */
|
||||||
stv0299_writeregI (state, 0x0c, reg0x0c | (last ? lv_mask : 0x50));
|
stv0299_writeregI (state, 0x0c, reg0x0c | (last ? lv_mask : 0x50));
|
||||||
|
@ -446,7 +447,8 @@ static int stv0299_send_legacy_dish_cmd (struct dvb_frontend* fe, unsigned long
|
||||||
printk ("%s(%d): switch delay (should be 32k followed by all 8k\n",
|
printk ("%s(%d): switch delay (should be 32k followed by all 8k\n",
|
||||||
__func__, fe->dvb->num);
|
__func__, fe->dvb->num);
|
||||||
for (i = 1; i < 10; i++)
|
for (i = 1; i < 10; i++)
|
||||||
printk ("%d: %d\n", i, timeval_usec_diff(tv[i-1] , tv[i]));
|
printk("%d: %d\n", i,
|
||||||
|
(int) ktime_us_delta(tv[i], tv[i-1]));
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
Loading…
Reference in New Issue