|
@@ -38,9 +38,9 @@ ssize_t vivid_radio_rx_read(struct file *file, char __user *buf,
|
|
|
size_t size, loff_t *offset)
|
|
|
{
|
|
|
struct vivid_dev *dev = video_drvdata(file);
|
|
|
- struct timespec ts;
|
|
|
struct v4l2_rds_data *data = dev->rds_gen.data;
|
|
|
bool use_alternates;
|
|
|
+ ktime_t timestamp;
|
|
|
unsigned blk;
|
|
|
int perc;
|
|
|
int i;
|
|
@@ -64,17 +64,16 @@ ssize_t vivid_radio_rx_read(struct file *file, char __user *buf,
|
|
|
}
|
|
|
|
|
|
retry:
|
|
|
- ktime_get_ts(&ts);
|
|
|
- use_alternates = ts.tv_sec % 10 >= 5;
|
|
|
+ timestamp = ktime_sub(ktime_get(), dev->radio_rds_init_time);
|
|
|
+ blk = ktime_divns(timestamp, VIVID_RDS_NSEC_PER_BLK);
|
|
|
+ use_alternates = (blk % VIVID_RDS_GEN_BLOCKS) & 1;
|
|
|
+
|
|
|
if (dev->radio_rx_rds_last_block == 0 ||
|
|
|
dev->radio_rx_rds_use_alternates != use_alternates) {
|
|
|
dev->radio_rx_rds_use_alternates = use_alternates;
|
|
|
/* Re-init the RDS generator */
|
|
|
vivid_radio_rds_init(dev);
|
|
|
}
|
|
|
- ts = timespec_sub(ts, dev->radio_rds_init_ts);
|
|
|
- blk = ts.tv_sec * 100 + ts.tv_nsec / 10000000;
|
|
|
- blk = (blk * VIVID_RDS_GEN_BLOCKS) / 500;
|
|
|
if (blk >= dev->radio_rx_rds_last_block + VIVID_RDS_GEN_BLOCKS)
|
|
|
dev->radio_rx_rds_last_block = blk - VIVID_RDS_GEN_BLOCKS + 1;
|
|
|
|