Пример #1
0
static int au0828_usb_probe(struct usb_interface *interface,
    const struct usb_device_id *id)
{
    int ifnum;
    struct au0828_dev *dev;
    struct usb_device *usbdev = interface_to_usbdev(interface);

    ifnum = interface->altsetting->desc.bInterfaceNumber;

    if (ifnum != 0)
        return -ENODEV;

    dprintk(1, "%s() vendor id 0x%x device id 0x%x ifnum:%d\n", __func__,
        le16_to_cpu(usbdev->descriptor.idVendor),
        le16_to_cpu(usbdev->descriptor.idProduct),
        ifnum);

    dev = kzalloc(sizeof(*dev), GFP_KERNEL);
    if (dev == NULL) {
        printk(KERN_ERR "%s() Unable to allocate memory\n", __func__);
        return -ENOMEM;
    }

    mutex_init(&dev->mutex);
    mutex_init(&dev->dvb.lock);
    dev->usbdev = usbdev;
    dev->board = id->driver_info;

    usb_set_intfdata(interface, dev);

    /* Power Up the bridge */
    au0828_write(dev, REG_600, 1 << 4);

    /* Bring up the GPIO's and supporting devices */
    au0828_gpio_setup(dev);

    /* I2C */
    au0828_i2c_register(dev);

    /* Setup */
    au0828_card_setup(dev);

    /* Digital TV */
    au0828_dvb_register(dev);

    printk(KERN_INFO "Registered device AU0828 [%s]\n",
        au0828_boards[dev->board].name == NULL ? "Unset" :
        au0828_boards[dev->board].name);

    return 0;
}
Пример #2
0
static int au0828_usb_probe(struct usb_interface *interface,
	const struct usb_device_id *id)
{
	int ifnum;
	int retval = 0;

	struct au0828_dev *dev;
	struct usb_device *usbdev = interface_to_usbdev(interface);

	ifnum = interface->altsetting->desc.bInterfaceNumber;

	if (ifnum != 0)
		return -ENODEV;

	dprintk(1, "%s() vendor id 0x%x device id 0x%x ifnum:%d\n", __func__,
		le16_to_cpu(usbdev->descriptor.idVendor),
		le16_to_cpu(usbdev->descriptor.idProduct),
		ifnum);

	/*
	 * Make sure we have 480 Mbps of bandwidth, otherwise things like
	 * video stream wouldn't likely work, since 12 Mbps is generally
	 * not enough even for most Digital TV streams.
	 */
	if (usbdev->speed != USB_SPEED_HIGH && disable_usb_speed_check == 0) {
		pr_err("au0828: Device initialization failed.\n");
		pr_err("au0828: Device must be connected to a high-speed USB 2.0 port.\n");
		return -ENODEV;
	}

	dev = kzalloc(sizeof(*dev), GFP_KERNEL);
	if (dev == NULL) {
		pr_err("%s() Unable to allocate memory\n", __func__);
		return -ENOMEM;
	}

	mutex_init(&dev->lock);
	mutex_lock(&dev->lock);
	mutex_init(&dev->mutex);
	mutex_init(&dev->dvb.lock);
	dev->usbdev = usbdev;
	dev->boardnr = id->driver_info;

#ifdef CPTCFG_VIDEO_AU0828_V4L2
	dev->v4l2_dev.release = au0828_usb_v4l2_release;

	/* Create the v4l2_device */
	retval = v4l2_device_register(&interface->dev, &dev->v4l2_dev);
	if (retval) {
		pr_err("%s() v4l2_device_register failed\n",
		       __func__);
		mutex_unlock(&dev->lock);
		kfree(dev);
		return retval;
	}
	/* This control handler will inherit the controls from au8522 */
	retval = v4l2_ctrl_handler_init(&dev->v4l2_ctrl_hdl, 4);
	if (retval) {
		pr_err("%s() v4l2_ctrl_handler_init failed\n",
		       __func__);
		mutex_unlock(&dev->lock);
		kfree(dev);
		return retval;
	}
	dev->v4l2_dev.ctrl_handler = &dev->v4l2_ctrl_hdl;
#endif

	/* Power Up the bridge */
	au0828_write(dev, REG_600, 1 << 4);

	/* Bring up the GPIO's and supporting devices */
	au0828_gpio_setup(dev);

	/* I2C */
	au0828_i2c_register(dev);

	/* Setup */
	au0828_card_setup(dev);

#ifdef CPTCFG_VIDEO_AU0828_V4L2
	/* Analog TV */
	if (AUVI_INPUT(0).type != AU0828_VMUX_UNDEFINED)
		au0828_analog_register(dev, interface);
#endif

	/* Digital TV */
	retval = au0828_dvb_register(dev);
	if (retval)
		pr_err("%s() au0282_dev_register failed\n",
		       __func__);

	/* Remote controller */
	au0828_rc_register(dev);

	/*
	 * Store the pointer to the au0828_dev so it can be accessed in
	 * au0828_usb_disconnect
	 */
	usb_set_intfdata(interface, dev);

	pr_info("Registered device AU0828 [%s]\n",
		dev->board.name == NULL ? "Unset" : dev->board.name);

	mutex_unlock(&dev->lock);

	return retval;
}