linux/drivers/media/usb/au0828/au0828-core.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-or-later
   2/*
   3 *  Driver for the Auvitek USB bridge
   4 *
   5 *  Copyright (c) 2008 Steven Toth <stoth@linuxtv.org>
   6 */
   7
   8#include "au0828.h"
   9#include "au8522.h"
  10
  11#include <linux/module.h>
  12#include <linux/slab.h>
  13#include <linux/videodev2.h>
  14#include <media/v4l2-common.h>
  15#include <linux/mutex.h>
  16
  17/* Due to enum tuner_pad_index */
  18#include <media/tuner.h>
  19
  20/*
  21 * 1 = General debug messages
  22 * 2 = USB handling
  23 * 4 = I2C related
  24 * 8 = Bridge related
  25 * 16 = IR related
  26 */
  27int au0828_debug;
  28module_param_named(debug, au0828_debug, int, 0644);
  29MODULE_PARM_DESC(debug,
  30                 "set debug bitmask: 1=general, 2=USB, 4=I2C, 8=bridge, 16=IR");
  31
  32static unsigned int disable_usb_speed_check;
  33module_param(disable_usb_speed_check, int, 0444);
  34MODULE_PARM_DESC(disable_usb_speed_check,
  35                 "override min bandwidth requirement of 480M bps");
  36
  37#define _AU0828_BULKPIPE 0x03
  38#define _BULKPIPESIZE 0xffff
  39
  40static int send_control_msg(struct au0828_dev *dev, u16 request, u32 value,
  41                            u16 index);
  42static int recv_control_msg(struct au0828_dev *dev, u16 request, u32 value,
  43        u16 index, unsigned char *cp, u16 size);
  44
  45/* USB Direction */
  46#define CMD_REQUEST_IN          0x00
  47#define CMD_REQUEST_OUT         0x01
  48
  49u32 au0828_readreg(struct au0828_dev *dev, u16 reg)
  50{
  51        u8 result = 0;
  52
  53        recv_control_msg(dev, CMD_REQUEST_IN, 0, reg, &result, 1);
  54        dprintk(8, "%s(0x%04x) = 0x%02x\n", __func__, reg, result);
  55
  56        return result;
  57}
  58
  59u32 au0828_writereg(struct au0828_dev *dev, u16 reg, u32 val)
  60{
  61        dprintk(8, "%s(0x%04x, 0x%02x)\n", __func__, reg, val);
  62        return send_control_msg(dev, CMD_REQUEST_OUT, val, reg);
  63}
  64
  65static int send_control_msg(struct au0828_dev *dev, u16 request, u32 value,
  66        u16 index)
  67{
  68        int status = -ENODEV;
  69
  70        if (dev->usbdev) {
  71
  72                /* cp must be memory that has been allocated by kmalloc */
  73                status = usb_control_msg(dev->usbdev,
  74                                usb_sndctrlpipe(dev->usbdev, 0),
  75                                request,
  76                                USB_DIR_OUT | USB_TYPE_VENDOR |
  77                                        USB_RECIP_DEVICE,
  78                                value, index, NULL, 0, 1000);
  79
  80                status = min(status, 0);
  81
  82                if (status < 0) {
  83                        pr_err("%s() Failed sending control message, error %d.\n",
  84                                __func__, status);
  85                }
  86
  87        }
  88
  89        return status;
  90}
  91
  92static int recv_control_msg(struct au0828_dev *dev, u16 request, u32 value,
  93        u16 index, unsigned char *cp, u16 size)
  94{
  95        int status = -ENODEV;
  96        mutex_lock(&dev->mutex);
  97        if (dev->usbdev) {
  98                status = usb_control_msg(dev->usbdev,
  99                                usb_rcvctrlpipe(dev->usbdev, 0),
 100                                request,
 101                                USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
 102                                value, index,
 103                                dev->ctrlmsg, size, 1000);
 104
 105                status = min(status, 0);
 106
 107                if (status < 0) {
 108                        pr_err("%s() Failed receiving control message, error %d.\n",
 109                                __func__, status);
 110                }
 111
 112                /* the host controller requires heap allocated memory, which
 113                   is why we didn't just pass "cp" into usb_control_msg */
 114                memcpy(cp, dev->ctrlmsg, size);
 115        }
 116        mutex_unlock(&dev->mutex);
 117        return status;
 118}
 119
 120#ifdef CONFIG_MEDIA_CONTROLLER
 121static void au0828_media_graph_notify(struct media_entity *new,
 122                                      void *notify_data);
 123#endif
 124
 125static void au0828_unregister_media_device(struct au0828_dev *dev)
 126{
 127#ifdef CONFIG_MEDIA_CONTROLLER
 128        struct media_device *mdev = dev->media_dev;
 129        struct media_entity_notify *notify, *nextp;
 130
 131        if (!mdev || !media_devnode_is_registered(mdev->devnode))
 132                return;
 133
 134        /* Remove au0828 entity_notify callbacks */
 135        list_for_each_entry_safe(notify, nextp, &mdev->entity_notify, list) {
 136                if (notify->notify != au0828_media_graph_notify)
 137                        continue;
 138                media_device_unregister_entity_notify(mdev, notify);
 139        }
 140
 141        /* clear enable_source, disable_source */
 142        mutex_lock(&mdev->graph_mutex);
 143        dev->media_dev->source_priv = NULL;
 144        dev->media_dev->enable_source = NULL;
 145        dev->media_dev->disable_source = NULL;
 146        mutex_unlock(&mdev->graph_mutex);
 147
 148        media_device_delete(dev->media_dev, KBUILD_MODNAME, THIS_MODULE);
 149        dev->media_dev = NULL;
 150#endif
 151}
 152
 153void au0828_usb_release(struct au0828_dev *dev)
 154{
 155        au0828_unregister_media_device(dev);
 156
 157        /* I2C */
 158        au0828_i2c_unregister(dev);
 159
 160        kfree(dev);
 161}
 162
 163static void au0828_usb_disconnect(struct usb_interface *interface)
 164{
 165        struct au0828_dev *dev = usb_get_intfdata(interface);
 166
 167        dprintk(1, "%s()\n", __func__);
 168
 169        /* there is a small window after disconnect, before
 170           dev->usbdev is NULL, for poll (e.g: IR) try to access
 171           the device and fill the dmesg with error messages.
 172           Set the status so poll routines can check and avoid
 173           access after disconnect.
 174        */
 175        set_bit(DEV_DISCONNECTED, &dev->dev_state);
 176
 177        au0828_rc_unregister(dev);
 178        /* Digital TV */
 179        au0828_dvb_unregister(dev);
 180
 181        usb_set_intfdata(interface, NULL);
 182        mutex_lock(&dev->mutex);
 183        dev->usbdev = NULL;
 184        mutex_unlock(&dev->mutex);
 185        if (au0828_analog_unregister(dev)) {
 186                /*
 187                 * No need to call au0828_usb_release() if V4L2 is enabled,
 188                 * as this is already called via au0828_usb_v4l2_release()
 189                 */
 190                return;
 191        }
 192        au0828_usb_release(dev);
 193}
 194
 195static int au0828_media_device_init(struct au0828_dev *dev,
 196                                    struct usb_device *udev)
 197{
 198#ifdef CONFIG_MEDIA_CONTROLLER
 199        struct media_device *mdev;
 200
 201        mdev = media_device_usb_allocate(udev, KBUILD_MODNAME, THIS_MODULE);
 202        if (!mdev)
 203                return -ENOMEM;
 204
 205        dev->media_dev = mdev;
 206#endif
 207        return 0;
 208}
 209
 210#ifdef CONFIG_MEDIA_CONTROLLER
 211static void au0828_media_graph_notify(struct media_entity *new,
 212                                      void *notify_data)
 213{
 214        struct au0828_dev *dev = (struct au0828_dev *) notify_data;
 215        int ret;
 216        struct media_entity *entity, *mixer = NULL, *decoder = NULL;
 217
 218        if (!new) {
 219                /*
 220                 * Called during au0828 probe time to connect
 221                 * entities that were created prior to registering
 222                 * the notify handler. Find mixer and decoder.
 223                */
 224                media_device_for_each_entity(entity, dev->media_dev) {
 225                        if (entity->function == MEDIA_ENT_F_AUDIO_MIXER)
 226                                mixer = entity;
 227                        else if (entity->function == MEDIA_ENT_F_ATV_DECODER)
 228                                decoder = entity;
 229                }
 230                goto create_link;
 231        }
 232
 233        switch (new->function) {
 234        case MEDIA_ENT_F_AUDIO_MIXER:
 235                mixer = new;
 236                if (dev->decoder)
 237                        decoder = dev->decoder;
 238                break;
 239        case MEDIA_ENT_F_ATV_DECODER:
 240                /* In case, Mixer is added first, find mixer and create link */
 241                media_device_for_each_entity(entity, dev->media_dev) {
 242                        if (entity->function == MEDIA_ENT_F_AUDIO_MIXER)
 243                                mixer = entity;
 244                }
 245                decoder = new;
 246                break;
 247        default:
 248                break;
 249        }
 250
 251create_link:
 252        if (decoder && mixer) {
 253                ret = media_get_pad_index(decoder, false,
 254                                          PAD_SIGNAL_AUDIO);
 255                if (ret >= 0)
 256                        ret = media_create_pad_link(decoder, ret,
 257                                                    mixer, 0,
 258                                                    MEDIA_LNK_FL_ENABLED);
 259                if (ret < 0)
 260                        dev_err(&dev->usbdev->dev,
 261                                "Mixer Pad Link Create Error: %d\n", ret);
 262        }
 263}
 264
 265static bool au0828_is_link_shareable(struct media_entity *owner,
 266                                     struct media_entity *entity)
 267{
 268        bool shareable = false;
 269
 270        /* Tuner link can be shared by audio, video, and VBI */
 271        switch (owner->function) {
 272        case MEDIA_ENT_F_IO_V4L:
 273        case MEDIA_ENT_F_AUDIO_CAPTURE:
 274        case MEDIA_ENT_F_IO_VBI:
 275                if (entity->function == MEDIA_ENT_F_IO_V4L ||
 276                    entity->function == MEDIA_ENT_F_AUDIO_CAPTURE ||
 277                    entity->function == MEDIA_ENT_F_IO_VBI)
 278                        shareable = true;
 279                break;
 280        case MEDIA_ENT_F_DTV_DEMOD:
 281        default:
 282                break;
 283        }
 284        return shareable;
 285}
 286
 287/* Callers should hold graph_mutex */
 288static int au0828_enable_source(struct media_entity *entity,
 289                                struct media_pipeline *pipe)
 290{
 291        struct media_entity  *source, *find_source;
 292        struct media_entity *sink;
 293        struct media_link *link, *found_link = NULL;
 294        int ret = 0;
 295        struct media_device *mdev = entity->graph_obj.mdev;
 296        struct au0828_dev *dev;
 297
 298        if (!mdev)
 299                return -ENODEV;
 300
 301        dev = mdev->source_priv;
 302
 303        /*
 304         * For Audio and V4L2 entity, find the link to which decoder
 305         * is the sink. Look for an active link between decoder and
 306         * source (tuner/s-video/Composite), if one exists, nothing
 307         * to do. If not, look for any  active links between source
 308         * and any other entity. If one exists, source is busy. If
 309         * source is free, setup link and start pipeline from source.
 310         * For DVB FE entity, the source for the link is the tuner.
 311         * Check if tuner is available and setup link and start
 312         * pipeline.
 313        */
 314        if (entity->function == MEDIA_ENT_F_DTV_DEMOD) {
 315                sink = entity;
 316                find_source = dev->tuner;
 317        } else {
 318                /* Analog isn't configured or register failed */
 319                if (!dev->decoder) {
 320                        ret = -ENODEV;
 321                        goto end;
 322                }
 323
 324                sink = dev->decoder;
 325
 326                /*
 327                 * Default input is tuner and default input_type
 328                 * is AU0828_VMUX_TELEVISION.
 329                 *
 330                 * There is a problem when s_input is called to
 331                 * change the default input. s_input will try to
 332                 * enable_source before attempting to change the
 333                 * input on the device, and will end up enabling
 334                 * default source which is tuner.
 335                 *
 336                 * Additional logic is necessary in au0828 to detect
 337                 * that the input has changed and enable the right
 338                 * source. au0828 handles this case in its s_input.
 339                 * It will disable the old source and enable the new
 340                 * source.
 341                 *
 342                */
 343                if (dev->input_type == AU0828_VMUX_TELEVISION)
 344                        find_source = dev->tuner;
 345                else if (dev->input_type == AU0828_VMUX_SVIDEO ||
 346                         dev->input_type == AU0828_VMUX_COMPOSITE)
 347                        find_source = &dev->input_ent[dev->input_type];
 348                else {
 349                        /* unknown input - let user select input */
 350                        ret = 0;
 351                        goto end;
 352                }
 353        }
 354
 355        /* Is there an active link between sink and source */
 356        if (dev->active_link) {
 357                if (dev->active_link_owner == entity) {
 358                        /* This check is necessary to handle multiple
 359                         * enable_source calls from v4l_ioctls during
 360                         * the course of video/vbi application run-time.
 361                        */
 362                        pr_debug("%s already owns the tuner\n", entity->name);
 363                        ret = 0;
 364                        goto end;
 365                } else if (au0828_is_link_shareable(dev->active_link_owner,
 366                           entity)) {
 367                        /* Either ALSA or Video own tuner. Sink is the same
 368                         * for both. Allow sharing the active link between
 369                         * their common source (tuner) and sink (decoder).
 370                         * Starting pipeline between sharing entity and sink
 371                         * will fail with pipe mismatch, while owner has an
 372                         * active pipeline. Switch pipeline ownership from
 373                         * user to owner when owner disables the source.
 374                         */
 375                        dev->active_link_shared = true;
 376                        /* save the user info to use from disable */
 377                        dev->active_link_user = entity;
 378                        dev->active_link_user_pipe = pipe;
 379                        pr_debug("%s owns the tuner %s can share!\n",
 380                                 dev->active_link_owner->name,
 381                                 entity->name);
 382                        ret = 0;
 383                        goto end;
 384                } else {
 385                        ret = -EBUSY;
 386                        goto end;
 387                }
 388        }
 389
 390        list_for_each_entry(link, &sink->links, list) {
 391                /* Check sink, and source */
 392                if (link->sink->entity == sink &&
 393                    link->source->entity == find_source) {
 394                        found_link = link;
 395                        break;
 396                }
 397        }
 398
 399        if (!found_link) {
 400                ret = -ENODEV;
 401                goto end;
 402        }
 403
 404        /* activate link between source and sink and start pipeline */
 405        source = found_link->source->entity;
 406        ret = __media_entity_setup_link(found_link, MEDIA_LNK_FL_ENABLED);
 407        if (ret) {
 408                pr_err("Activate link from %s->%s. Error %d\n",
 409                        source->name, sink->name, ret);
 410                goto end;
 411        }
 412
 413        ret = __media_pipeline_start(entity, pipe);
 414        if (ret) {
 415                pr_err("Start Pipeline: %s->%s Error %d\n",
 416                        source->name, entity->name, ret);
 417                ret = __media_entity_setup_link(found_link, 0);
 418                if (ret)
 419                        pr_err("Deactivate link Error %d\n", ret);
 420                goto end;
 421        }
 422
 423        /* save link state to allow audio and video share the link
 424         * and not disable the link while the other is using it.
 425         * active_link_owner is used to deactivate the link.
 426        */
 427        dev->active_link = found_link;
 428        dev->active_link_owner = entity;
 429        dev->active_source = source;
 430        dev->active_sink = sink;
 431
 432        pr_info("Enabled Source: %s->%s->%s Ret %d\n",
 433                 dev->active_source->name, dev->active_sink->name,
 434                 dev->active_link_owner->name, ret);
 435end:
 436        pr_debug("%s end: ent:%s fnc:%d ret %d\n",
 437                 __func__, entity->name, entity->function, ret);
 438        return ret;
 439}
 440
 441/* Callers should hold graph_mutex */
 442static void au0828_disable_source(struct media_entity *entity)
 443{
 444        int ret = 0;
 445        struct media_device *mdev = entity->graph_obj.mdev;
 446        struct au0828_dev *dev;
 447
 448        if (!mdev)
 449                return;
 450
 451        dev = mdev->source_priv;
 452
 453        if (!dev->active_link)
 454                return;
 455
 456        /* link is active - stop pipeline from source
 457         * (tuner/s-video/Composite) to the entity
 458         * When DVB/s-video/Composite owns tuner, it won't be in
 459         * shared state.
 460         */
 461        if (dev->active_link->sink->entity == dev->active_sink &&
 462            dev->active_link->source->entity == dev->active_source) {
 463                /*
 464                 * Prevent video from deactivating link when audio
 465                 * has active pipeline and vice versa. In addition
 466                 * handle the case when more than one video/vbi
 467                 * application is sharing the link.
 468                */
 469                bool owner_is_audio = false;
 470
 471                if (dev->active_link_owner->function ==
 472                    MEDIA_ENT_F_AUDIO_CAPTURE)
 473                        owner_is_audio = true;
 474
 475                if (dev->active_link_shared) {
 476                        pr_debug("Shared link owner %s user %s %d\n",
 477                                 dev->active_link_owner->name,
 478                                 entity->name, dev->users);
 479
 480                        /* Handle video device users > 1
 481                         * When audio owns the shared link with
 482                         * more than one video users, avoid
 483                         * disabling the source and/or switching
 484                         * the owner until the last disable_source
 485                         * call from video _close(). Use dev->users to
 486                         * determine when to switch/disable.
 487                         */
 488                        if (dev->active_link_owner != entity) {
 489                                /* video device has users > 1 */
 490                                if (owner_is_audio && dev->users > 1)
 491                                        return;
 492
 493                                dev->active_link_user = NULL;
 494                                dev->active_link_user_pipe = NULL;
 495                                dev->active_link_shared = false;
 496                                return;
 497                        }
 498
 499                        /* video owns the link and has users > 1 */
 500                        if (!owner_is_audio && dev->users > 1)
 501                                return;
 502
 503                        /* stop pipeline */
 504                        __media_pipeline_stop(dev->active_link_owner);
 505                        pr_debug("Pipeline stop for %s\n",
 506                                dev->active_link_owner->name);
 507
 508                        ret = __media_pipeline_start(
 509                                        dev->active_link_user,
 510                                        dev->active_link_user_pipe);
 511                        if (ret) {
 512                                pr_err("Start Pipeline: %s->%s %d\n",
 513                                        dev->active_source->name,
 514                                        dev->active_link_user->name,
 515                                        ret);
 516                                goto deactivate_link;
 517                        }
 518                        /* link user is now the owner */
 519                        dev->active_link_owner = dev->active_link_user;
 520                        dev->active_link_user = NULL;
 521                        dev->active_link_user_pipe = NULL;
 522                        dev->active_link_shared = false;
 523
 524                        pr_debug("Pipeline started for %s\n",
 525                                dev->active_link_owner->name);
 526                        return;
 527                } else if (!owner_is_audio && dev->users > 1)
 528                        /* video/vbi owns the link and has users > 1 */
 529                        return;
 530
 531                if (dev->active_link_owner != entity)
 532                        return;
 533
 534                /* stop pipeline */
 535                __media_pipeline_stop(dev->active_link_owner);
 536                pr_debug("Pipeline stop for %s\n",
 537                        dev->active_link_owner->name);
 538
 539deactivate_link:
 540                ret = __media_entity_setup_link(dev->active_link, 0);
 541                if (ret)
 542                        pr_err("Deactivate link Error %d\n", ret);
 543
 544                pr_info("Disabled Source: %s->%s->%s Ret %d\n",
 545                         dev->active_source->name, dev->active_sink->name,
 546                         dev->active_link_owner->name, ret);
 547
 548                dev->active_link = NULL;
 549                dev->active_link_owner = NULL;
 550                dev->active_source = NULL;
 551                dev->active_sink = NULL;
 552                dev->active_link_shared = false;
 553                dev->active_link_user = NULL;
 554        }
 555}
 556#endif
 557
 558static int au0828_media_device_register(struct au0828_dev *dev,
 559                                        struct usb_device *udev)
 560{
 561#ifdef CONFIG_MEDIA_CONTROLLER
 562        int ret;
 563        struct media_entity *entity, *demod = NULL;
 564        struct media_link *link;
 565
 566        if (!dev->media_dev)
 567                return 0;
 568
 569        if (!media_devnode_is_registered(dev->media_dev->devnode)) {
 570
 571                /* register media device */
 572                ret = media_device_register(dev->media_dev);
 573                if (ret) {
 574                        media_device_delete(dev->media_dev, KBUILD_MODNAME,
 575                                            THIS_MODULE);
 576                        dev->media_dev = NULL;
 577                        dev_err(&udev->dev,
 578                                "Media Device Register Error: %d\n", ret);
 579                        return ret;
 580                }
 581        } else {
 582                /*
 583                 * Call au0828_media_graph_notify() to connect
 584                 * audio graph to our graph. In this case, audio
 585                 * driver registered the device and there is no
 586                 * entity_notify to be called when new entities
 587                 * are added. Invoke it now.
 588                */
 589                au0828_media_graph_notify(NULL, (void *) dev);
 590        }
 591
 592        /*
 593         * Find tuner, decoder and demod.
 594         *
 595         * The tuner and decoder should be cached, as they'll be used by
 596         *      au0828_enable_source.
 597         *
 598         * It also needs to disable the link between tuner and
 599         * decoder/demod, to avoid disable step when tuner is requested
 600         * by video or audio. Note that this step can't be done until dvb
 601         * graph is created during dvb register.
 602        */
 603        media_device_for_each_entity(entity, dev->media_dev) {
 604                switch (entity->function) {
 605                case MEDIA_ENT_F_TUNER:
 606                        dev->tuner = entity;
 607                        break;
 608                case MEDIA_ENT_F_ATV_DECODER:
 609                        dev->decoder = entity;
 610                        break;
 611                case MEDIA_ENT_F_DTV_DEMOD:
 612                        demod = entity;
 613                        break;
 614                }
 615        }
 616
 617        /* Disable link between tuner->demod and/or tuner->decoder */
 618        if (dev->tuner) {
 619                list_for_each_entry(link, &dev->tuner->links, list) {
 620                        if (demod && link->sink->entity == demod)
 621                                media_entity_setup_link(link, 0);
 622                        if (dev->decoder && link->sink->entity == dev->decoder)
 623                                media_entity_setup_link(link, 0);
 624                }
 625        }
 626
 627        /* register entity_notify callback */
 628        dev->entity_notify.notify_data = (void *) dev;
 629        dev->entity_notify.notify = (void *) au0828_media_graph_notify;
 630        ret = media_device_register_entity_notify(dev->media_dev,
 631                                                  &dev->entity_notify);
 632        if (ret) {
 633                dev_err(&udev->dev,
 634                        "Media Device register entity_notify Error: %d\n",
 635                        ret);
 636                return ret;
 637        }
 638        /* set enable_source */
 639        mutex_lock(&dev->media_dev->graph_mutex);
 640        dev->media_dev->source_priv = (void *) dev;
 641        dev->media_dev->enable_source = au0828_enable_source;
 642        dev->media_dev->disable_source = au0828_disable_source;
 643        mutex_unlock(&dev->media_dev->graph_mutex);
 644#endif
 645        return 0;
 646}
 647
 648static int au0828_usb_probe(struct usb_interface *interface,
 649        const struct usb_device_id *id)
 650{
 651        int ifnum;
 652        int retval = 0;
 653
 654        struct au0828_dev *dev;
 655        struct usb_device *usbdev = interface_to_usbdev(interface);
 656
 657        ifnum = interface->altsetting->desc.bInterfaceNumber;
 658
 659        if (ifnum != 0)
 660                return -ENODEV;
 661
 662        dprintk(1, "%s() vendor id 0x%x device id 0x%x ifnum:%d\n", __func__,
 663                le16_to_cpu(usbdev->descriptor.idVendor),
 664                le16_to_cpu(usbdev->descriptor.idProduct),
 665                ifnum);
 666
 667        /*
 668         * Make sure we have 480 Mbps of bandwidth, otherwise things like
 669         * video stream wouldn't likely work, since 12 Mbps is generally
 670         * not enough even for most Digital TV streams.
 671         */
 672        if (usbdev->speed != USB_SPEED_HIGH && disable_usb_speed_check == 0) {
 673                pr_err("au0828: Device initialization failed.\n");
 674                pr_err("au0828: Device must be connected to a high-speed USB 2.0 port.\n");
 675                return -ENODEV;
 676        }
 677
 678        dev = kzalloc(sizeof(*dev), GFP_KERNEL);
 679        if (dev == NULL) {
 680                pr_err("%s() Unable to allocate memory\n", __func__);
 681                return -ENOMEM;
 682        }
 683
 684        mutex_init(&dev->lock);
 685        mutex_lock(&dev->lock);
 686        mutex_init(&dev->mutex);
 687        mutex_init(&dev->dvb.lock);
 688        dev->usbdev = usbdev;
 689        dev->boardnr = id->driver_info;
 690        dev->board = au0828_boards[dev->boardnr];
 691
 692        /* Initialize the media controller */
 693        retval = au0828_media_device_init(dev, usbdev);
 694        if (retval) {
 695                pr_err("%s() au0828_media_device_init failed\n",
 696                       __func__);
 697                mutex_unlock(&dev->lock);
 698                kfree(dev);
 699                return retval;
 700        }
 701
 702        retval = au0828_v4l2_device_register(interface, dev);
 703        if (retval) {
 704                au0828_usb_v4l2_media_release(dev);
 705                mutex_unlock(&dev->lock);
 706                kfree(dev);
 707                return retval;
 708        }
 709
 710        /* Power Up the bridge */
 711        au0828_write(dev, REG_600, 1 << 4);
 712
 713        /* Bring up the GPIO's and supporting devices */
 714        au0828_gpio_setup(dev);
 715
 716        /* I2C */
 717        au0828_i2c_register(dev);
 718
 719        /* Setup */
 720        au0828_card_setup(dev);
 721
 722        /*
 723         * Store the pointer to the au0828_dev so it can be accessed in
 724         * au0828_usb_disconnect
 725         */
 726        usb_set_intfdata(interface, dev);
 727
 728        /* Analog TV */
 729        retval = au0828_analog_register(dev, interface);
 730        if (retval) {
 731                pr_err("%s() au0828_analog_register failed to register on V4L2\n",
 732                        __func__);
 733                mutex_unlock(&dev->lock);
 734                goto done;
 735        }
 736
 737        /* Digital TV */
 738        retval = au0828_dvb_register(dev);
 739        if (retval)
 740                pr_err("%s() au0828_dvb_register failed\n",
 741                       __func__);
 742
 743        /* Remote controller */
 744        au0828_rc_register(dev);
 745
 746        pr_info("Registered device AU0828 [%s]\n",
 747                dev->board.name == NULL ? "Unset" : dev->board.name);
 748
 749        mutex_unlock(&dev->lock);
 750
 751        retval = au0828_media_device_register(dev, usbdev);
 752
 753done:
 754        if (retval < 0)
 755                au0828_usb_disconnect(interface);
 756
 757        return retval;
 758}
 759
 760static int au0828_suspend(struct usb_interface *interface,
 761                                pm_message_t message)
 762{
 763        struct au0828_dev *dev = usb_get_intfdata(interface);
 764
 765        if (!dev)
 766                return 0;
 767
 768        pr_info("Suspend\n");
 769
 770        au0828_rc_suspend(dev);
 771        au0828_v4l2_suspend(dev);
 772        au0828_dvb_suspend(dev);
 773
 774        /* FIXME: should suspend also ATV/DTV */
 775
 776        return 0;
 777}
 778
 779static int au0828_resume(struct usb_interface *interface)
 780{
 781        struct au0828_dev *dev = usb_get_intfdata(interface);
 782        if (!dev)
 783                return 0;
 784
 785        pr_info("Resume\n");
 786
 787        /* Power Up the bridge */
 788        au0828_write(dev, REG_600, 1 << 4);
 789
 790        /* Bring up the GPIO's and supporting devices */
 791        au0828_gpio_setup(dev);
 792
 793        au0828_rc_resume(dev);
 794        au0828_v4l2_resume(dev);
 795        au0828_dvb_resume(dev);
 796
 797        /* FIXME: should resume also ATV/DTV */
 798
 799        return 0;
 800}
 801
 802static struct usb_driver au0828_usb_driver = {
 803        .name           = KBUILD_MODNAME,
 804        .probe          = au0828_usb_probe,
 805        .disconnect     = au0828_usb_disconnect,
 806        .id_table       = au0828_usb_id_table,
 807        .suspend        = au0828_suspend,
 808        .resume         = au0828_resume,
 809        .reset_resume   = au0828_resume,
 810};
 811
 812static int __init au0828_init(void)
 813{
 814        int ret;
 815
 816        if (au0828_debug & 1)
 817                pr_info("%s() Debugging is enabled\n", __func__);
 818
 819        if (au0828_debug & 2)
 820                pr_info("%s() USB Debugging is enabled\n", __func__);
 821
 822        if (au0828_debug & 4)
 823                pr_info("%s() I2C Debugging is enabled\n", __func__);
 824
 825        if (au0828_debug & 8)
 826                pr_info("%s() Bridge Debugging is enabled\n",
 827                       __func__);
 828
 829        if (au0828_debug & 16)
 830                pr_info("%s() IR Debugging is enabled\n",
 831                       __func__);
 832
 833        pr_info("au0828 driver loaded\n");
 834
 835        ret = usb_register(&au0828_usb_driver);
 836        if (ret)
 837                pr_err("usb_register failed, error = %d\n", ret);
 838
 839        return ret;
 840}
 841
 842static void __exit au0828_exit(void)
 843{
 844        usb_deregister(&au0828_usb_driver);
 845}
 846
 847module_init(au0828_init);
 848module_exit(au0828_exit);
 849
 850MODULE_DESCRIPTION("Driver for Auvitek AU0828 based products");
 851MODULE_AUTHOR("Steven Toth <stoth@linuxtv.org>");
 852MODULE_LICENSE("GPL");
 853MODULE_VERSION("0.0.3");
 854