#include <linux/wait.h>
 #include <linux/timer.h>
 
+#include <media/media-device.h>
+
 #include <asm/page.h>
 
 #include "smsir.h"
        bool is_usb_device;
 
        int led_state;
+
+#if defined(CONFIG_MEDIA_CONTROLLER_DVB)
+       struct media_device *media_dev;
+#endif
 };
 
 /* GPIO definitions for antenna frequency domain control (SMS8021) */
 
        return 0;
 }
 
+static void smsdvb_media_device_unregister(struct smsdvb_client_t *client)
+{
+       struct smscore_device_t *coredev = client->coredev;
+
+#ifdef CONFIG_MEDIA_CONTROLLER_DVB
+       if (!coredev->media_dev)
+               return;
+       media_device_unregister(coredev->media_dev);
+       kfree(coredev->media_dev);
+       coredev->media_dev = NULL;
+#endif
+}
+
 static void smsdvb_unregister_client(struct smsdvb_client_t *client)
 {
        /* must be called under clientslock */
        dvb_unregister_frontend(&client->frontend);
        dvb_dmxdev_release(&client->dmxdev);
        dvb_dmx_release(&client->demux);
+       smsdvb_media_device_unregister(client);
        dvb_unregister_adapter(&client->adapter);
        kfree(client);
 }
                sms_err("dvb_register_adapter() failed %d", rc);
                goto adapter_error;
        }
+#ifdef CONFIG_MEDIA_CONTROLLER_DVB
+       client->adapter.mdev = coredev->media_dev;
+#endif
 
        /* init dvb demux */
        client->demux.dmx.capabilities = DMX_TS_FILTERING;
        if (smsdvb_debugfs_create(client) < 0)
                sms_info("failed to create debugfs node");
 
+       dvb_create_media_graph(coredev->media_dev);
+
        return 0;
 
 client_error:
        dvb_dmx_release(&client->demux);
 
 dvbdmx_error:
+       smsdvb_media_device_unregister(client);
        dvb_unregister_adapter(&client->adapter);
 
 adapter_error:
 
        usb_set_intfdata(intf, NULL);
 }
 
+static void siano_media_device_register(struct smsusb_device_t *dev)
+{
+#ifdef CONFIG_MEDIA_CONTROLLER_DVB
+       struct media_device *mdev;
+       struct usb_device *udev = dev->udev;
+       int board_id = smscore_get_board_id(dev->coredev);
+       struct sms_board *board = sms_get_board(board_id);
+       int ret;
+
+       mdev = kzalloc(sizeof(*mdev), GFP_KERNEL);
+       if (!mdev)
+               return;
+
+       mdev->dev = &udev->dev;
+       strlcpy(mdev->model, board->name, sizeof(mdev->model));
+       if (udev->serial)
+               strlcpy(mdev->serial, udev->serial, sizeof(mdev->serial));
+       strcpy(mdev->bus_info, udev->devpath);
+       mdev->hw_revision = le16_to_cpu(udev->descriptor.bcdDevice);
+       mdev->driver_version = LINUX_VERSION_CODE;
+
+       ret = media_device_register(mdev);
+       if (ret) {
+               sms_err("Couldn't create a media device. Error: %d\n",
+                       ret);
+               kfree(mdev);
+               return;
+       }
+
+       dev->coredev->media_dev = mdev;
+
+       sms_info("media controller created");
+
+#endif
+}
+
 static int smsusb_init_device(struct usb_interface *intf, int board_id)
 {
        struct smsdevice_params_t params;
        }
 
        sms_info("device 0x%p created", dev);
+       siano_media_device_register(dev);
 
        return rc;
 }