staging: most: i2c: prevent zero delay polling
authorChristian Gromm <christian.gromm@microchip.com>
Tue, 8 May 2018 09:44:58 +0000 (11:44 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 8 May 2018 11:41:49 +0000 (13:41 +0200)
This patch avoids that a configured scan_rate of more than MSEC_PER_SEC
might result in a polling delay of zero.

Signed-off-by: Christian Gromm <christian.gromm@microchip.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/staging/most/i2c/i2c.c

index e03cb6c65c88475d41edeaf2b6cc20c45bcbef6a..30d18cc5f0720b6cbb59431f674f29d4dd99a7de 100644 (file)
@@ -49,6 +49,7 @@ struct hdm_i2c {
                struct list_head list;
                struct mutex list_mutex;
                bool int_disabled;
+               unsigned int delay;
        } rx;
        char name[64];
 };
@@ -75,6 +76,7 @@ static int configure_channel(struct most_interface *most_iface,
 {
        int ret;
        struct hdm_i2c *dev = to_hdm(most_iface);
+       unsigned int delay;
 
        BUG_ON(ch_idx < 0 || ch_idx >= NUM_CHANNELS);
        BUG_ON(dev->is_open[ch_idx]);
@@ -105,6 +107,8 @@ static int configure_channel(struct most_interface *most_iface,
                                return ret;
                        }
                } else if (scan_rate) {
+                       delay = msecs_to_jiffies(MSEC_PER_SEC / scan_rate);
+                       dev->rx.delay = delay ? delay : 1;
                        pr_info("polling rate is %d Hz\n", scan_rate);
                }
        }
@@ -265,9 +269,7 @@ static void pending_rx_work(struct work_struct *work)
 
        if (dev->polling_mode) {
                if (dev->is_open[CH_RX] && scan_rate)
-                       schedule_delayed_work(&dev->rx.dwork,
-                                             msecs_to_jiffies(MSEC_PER_SEC
-                                                              / scan_rate));
+                       schedule_delayed_work(&dev->rx.dwork, dev->rx.delay);
        } else {
                dev->rx.int_disabled = false;
                enable_irq(dev->client->irq);