state->dual_mode = val;
        dev_dbg(&intf->dev, "ts mode %02x\n", state->dual_mode);
 
-       /* disable 2nd adapter because we don't have PID-filters */
-       if (d->udev->speed == USB_SPEED_FULL)
-               state->dual_mode = 0;
-
        state->af9013_i2c_addr[0] = AF9015_I2C_DEMOD;
 
        if (state->dual_mode) {
 
 static int af9015_pid_filter_ctrl(struct dvb_usb_adapter *adap, int onoff)
 {
-       struct dvb_usb_device *d = adap_to_d(adap);
-       struct usb_interface *intf = d->intf;
+       struct af9015_state *state = adap_to_priv(adap);
+       struct af9013_platform_data *pdata = &state->af9013_pdata[adap->id];
        int ret;
 
-       dev_dbg(&intf->dev, "onoff %d\n", onoff);
-
-       if (onoff)
-               ret = af9015_set_reg_bit(d, 0xd503, 0);
-       else
-               ret = af9015_clear_reg_bit(d, 0xd503, 0);
+       mutex_lock(&state->fe_mutex);
+       ret = pdata->pid_filter_ctrl(adap->fe[0], onoff);
+       mutex_unlock(&state->fe_mutex);
 
        return ret;
 }
 
-static int af9015_pid_filter(struct dvb_usb_adapter *adap, int index, u16 pid,
-       int onoff)
+static int af9015_pid_filter(struct dvb_usb_adapter *adap, int index,
+                            u16 pid, int onoff)
 {
-       struct dvb_usb_device *d = adap_to_d(adap);
-       struct usb_interface *intf = d->intf;
+       struct af9015_state *state = adap_to_priv(adap);
+       struct af9013_platform_data *pdata = &state->af9013_pdata[adap->id];
        int ret;
-       u8 idx;
-
-       dev_dbg(&intf->dev, "index %d, pid %04x, onoff %d\n",
-               index, pid, onoff);
 
-       ret = af9015_write_reg(d, 0xd505, (pid & 0xff));
-       if (ret)
-               goto error;
-
-       ret = af9015_write_reg(d, 0xd506, (pid >> 8));
-       if (ret)
-               goto error;
-
-       idx = ((index & 0x1f) | (1 << 5));
-       ret = af9015_write_reg(d, 0xd504, idx);
+       mutex_lock(&state->fe_mutex);
+       ret = pdata->pid_filter(adap->fe[0], index, pid, onoff);
+       mutex_unlock(&state->fe_mutex);
 
-error:
        return ret;
 }
 
 
                        .stream = DVB_USB_STREAM_BULK(0x84, 8, TS_USB20_FRAME_SIZE),
                }, {
+                       .caps = DVB_USB_ADAP_HAS_PID_FILTER |
+                               DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
+                       .pid_filter_count = 32,
+                       .pid_filter = af9015_pid_filter,
+                       .pid_filter_ctrl = af9015_pid_filter_ctrl,
+
                        .stream = DVB_USB_STREAM_BULK(0x85, 8, TS_USB20_FRAME_SIZE),
                },
        },