These changes are the raw update to linux-4.4.6-rt14. Kernel sources
[kvmfornfv.git] / kernel / drivers / media / common / b2c2 / flexcop-hw-filter.c
index 77e4547..8220257 100644 (file)
@@ -117,6 +117,10 @@ static void flexcop_pid_control(struct flexcop_device *fc,
        deb_ts("setting pid: %5d %04x at index %d '%s'\n",
                        pid, pid, index, onoff ? "on" : "off");
 
+       /* First 6 can be buggy - skip over them if option set */
+       if (fc->skip_6_hw_pid_filter)
+               index += 6;
+
        /* We could use bit magic here to reduce source code size.
         * I decided against it, but to use the real register names */
        switch (index) {
@@ -170,7 +174,10 @@ static int flexcop_toggle_fullts_streaming(struct flexcop_device *fc, int onoff)
 int flexcop_pid_feed_control(struct flexcop_device *fc,
                struct dvb_demux_feed *dvbdmxfeed, int onoff)
 {
-       int max_pid_filter = 6 + fc->has_32_hw_pid_filter*32;
+       int max_pid_filter = 6;
+
+       max_pid_filter -= 6 * fc->skip_6_hw_pid_filter;
+       max_pid_filter += 32 * fc->has_32_hw_pid_filter;
 
        fc->feedcount += onoff ? 1 : -1; /* the number of PIDs/Feed currently requested */
        if (dvbdmxfeed->index >= max_pid_filter)
@@ -217,7 +224,12 @@ void flexcop_hw_filter_init(struct flexcop_device *fc)
 {
        int i;
        flexcop_ibi_value v;
-       for (i = 0; i < 6 + 32*fc->has_32_hw_pid_filter; i++)
+       int max_pid_filter = 6;
+
+       max_pid_filter -= 6 * fc->skip_6_hw_pid_filter;
+       max_pid_filter += 32 * fc->has_32_hw_pid_filter;
+
+       for (i = 0; i < max_pid_filter; i++)
                flexcop_pid_control(fc, i, 0x1fff, 0);
 
        flexcop_pid_group_filter(fc, 0, 0x1fe0);