#include <media/tuner.h>
 
+#include "tuner-xc2028.h"
+
 static void tm6000_urb_received(struct urb *urb)
 {
        int ret;
                                                          THIS_MODULE, &dev->udev->dev);
        dvb->adapter.priv = dev;
 
-       if(dvb->frontend) {
+       if (dvb->frontend) {
+               struct xc2028_config cfg = {
+                       .i2c_adap  = &dev->i2c_adap,
+                       .video_dev = dev,
+               };
+
                ret = dvb_register_frontend(&dvb->adapter, dvb->frontend);
-               if(ret < 0) {
-                       printk("tm6000: couldn't register frontend\n");
+               if (ret < 0) {
+                       printk(KERN_ERR
+                               "tm6000: couldn't register frontend\n");
                        goto adapter_err;
                }
 
-               // attach the tuner like this for now
-               tm6000_i2c_call_clients(dev, VIDIOC_INT_DVB_TUNER_ATTACH, dvb->frontend);
-
-               printk("tm6000: XC2028/3028 asked to be attached to frontend!\n");
-       }
-       else {
-               printk("tm6000: no frontend found\n");
+               if (!dvb_attach(xc2028_attach, dvb->frontend, &cfg)) {
+                       printk(KERN_ERR "tm6000: couldn't register "
+                                       "frontend (xc3028)\n");
+                       ret = -EINVAL;
+                       goto adapter_err;
+               }
+               printk(KERN_INFO "tm6000: XC2028/3028 asked to be "
+                                "attached to frontend!\n");
+       } else {
+               printk(KERN_ERR "tm6000: no frontend found\n");
        }
 
        dvb->demux.dmx.capabilities = DMX_TS_FILTERING | DMX_SECTION_FILTERING
 frontend_err:
        if(dvb->frontend) {
                dvb_unregister_frontend(dvb->frontend);
+#ifdef CONFIG_DVB_CORE_ATTACH
+               symbol_put(xc3028_attach);
+#endif
        }
 adapter_err:
        dvb_unregister_adapter(&dvb->adapter);