Merge tag '4.16-minor-rc-SMB3-fixes' of git://git.samba.org/sfrench/cifs-2.6
[sfrench/cifs-2.6.git] / drivers / media / platform / vivid / vivid-radio-rx.c
index 71f3ebb7aecf22b52e872dbce054b17b23b66838..fcb7a9f015b6bf1250821f7a7fb4f8abd324fb45 100644 (file)
@@ -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;