From: Hans Verkuil Date: Sun, 17 Mar 2013 12:23:25 +0000 (-0300) Subject: [media] go7007: don't continue if firmware can't be loaded X-Git-Url: https://git.karo-electronics.de/?a=commitdiff_plain;h=59aea928d57f171453474a883f087e4fccb83e94;p=linux-beck.git [media] go7007: don't continue if firmware can't be loaded The go7007 driver would continue during probe if no firmware could be loaded. Without firmware the probe() should return an error, so do that. Also move the registration of devices to the end of the probe() sequence: once devices appear the full driver functionality should be available. Signed-off-by: Hans Verkuil Signed-off-by: Mauro Carvalho Chehab --- diff --git a/drivers/staging/media/go7007/go7007-usb.c b/drivers/staging/media/go7007/go7007-usb.c index 08235069bde7..a734ead8fc64 100644 --- a/drivers/staging/media/go7007/go7007-usb.c +++ b/drivers/staging/media/go7007/go7007-usb.c @@ -930,7 +930,11 @@ static void go7007_usb_release(struct go7007 *go) struct urb *vurb, *aurb; int i; - usb_kill_urb(usb->intr_urb); + if (usb->intr_urb) { + usb_kill_urb(usb->intr_urb); + kfree(usb->intr_urb->transfer_buffer); + usb_free_urb(usb->intr_urb); + } /* Free USB-related structs */ for (i = 0; i < 8; ++i) { @@ -947,8 +951,6 @@ static void go7007_usb_release(struct go7007 *go) usb_free_urb(aurb); } } - kfree(usb->intr_urb->transfer_buffer); - usb_free_urb(usb->intr_urb); kfree(go->hpi_context); } @@ -1141,21 +1143,16 @@ static int go7007_usb_probe(struct usb_interface *intf, return 0; } - usb = kzalloc(sizeof(struct go7007_usb), GFP_KERNEL); - if (usb == NULL) + go = go7007_alloc(&board->main_info, &intf->dev); + if (go == NULL) return -ENOMEM; - /* Allocate the URB and buffer for receiving incoming interrupts */ - usb->intr_urb = usb_alloc_urb(0, GFP_KERNEL); - if (usb->intr_urb == NULL) - goto allocfail; - usb->intr_urb->transfer_buffer = kmalloc(2*sizeof(u16), GFP_KERNEL); - if (usb->intr_urb->transfer_buffer == NULL) - goto allocfail; + usb = kzalloc(sizeof(struct go7007_usb), GFP_KERNEL); + if (usb == NULL) { + kfree(go); + return -ENOMEM; + } - go = go7007_alloc(&board->main_info, &intf->dev); - if (go == NULL) - goto allocfail; usb->board = board; usb->usbdev = usbdev; usb_make_path(usbdev, go->bus_info, sizeof(go->bus_info)); @@ -1166,6 +1163,15 @@ static int go7007_usb_probe(struct usb_interface *intf, else go->hpi_ops = &go7007_usb_onboard_hpi_ops; go->hpi_context = usb; + + /* Allocate the URB and buffer for receiving incoming interrupts */ + usb->intr_urb = usb_alloc_urb(0, GFP_KERNEL); + if (usb->intr_urb == NULL) + goto allocfail; + usb->intr_urb->transfer_buffer = kmalloc(2*sizeof(u16), GFP_KERNEL); + if (usb->intr_urb->transfer_buffer == NULL) + goto allocfail; + if (go->board_id == GO7007_BOARDID_SENSORAY_2250) usb_fill_bulk_urb(usb->intr_urb, usb->usbdev, usb_rcvbulkpipe(usb->usbdev, 4), @@ -1181,7 +1187,7 @@ static int go7007_usb_probe(struct usb_interface *intf, /* Boot the GO7007 */ if (go7007_boot_encoder(go, go->board_info->flags & GO7007_BOARD_USE_ONBOARD_I2C) < 0) - goto initfail; + goto allocfail; /* Register the EZ-USB I2C adapter, if we're using it */ if (board->flags & GO7007_USB_EZUSB_I2C) { @@ -1193,7 +1199,7 @@ static int go7007_usb_probe(struct usb_interface *intf, if (i2c_add_adapter(&go->i2c_adapter) < 0) { printk(KERN_ERR "go7007-usb: error: i2c_add_adapter failed\n"); - goto initfail; + goto allocfail; } go->i2c_adapter_online = 1; } @@ -1244,7 +1250,7 @@ static int go7007_usb_probe(struct usb_interface *intf, /* Board strapping indicates tuner model */ if (go7007_usb_vendor_request(go, 0x41, 0, 0, go->usb_buf, 3, 1) < 0) { printk(KERN_ERR "go7007-usb: GPIO read failed!\n"); - goto initfail; + goto allocfail; } switch (go->usb_buf[0] >> 6) { case 1: @@ -1276,7 +1282,7 @@ static int go7007_usb_probe(struct usb_interface *intf, if (go7007_usb_vendor_request(go, 0x40, 0x7f02, 0, NULL, 0, 0) < 0) { printk(KERN_ERR "go7007-usb: GPIO write failed!\n"); - goto initfail; + goto allocfail; } } @@ -1290,11 +1296,6 @@ static int go7007_usb_probe(struct usb_interface *intf, "port will result in stream corruption, even " "at low bitrates!\n"); - /* Do any final GO7007 initialization, then register the - * V4L2 and ALSA interfaces */ - if (go7007_register_encoder(go, num_i2c_devs) < 0) - goto initfail; - /* Allocate the URBs and buffers for receiving the video stream */ if (board->flags & GO7007_USB_EZUSB) { v_urb_len = 1024; @@ -1306,46 +1307,45 @@ static int go7007_usb_probe(struct usb_interface *intf, for (i = 0; i < 8; ++i) { usb->video_urbs[i] = usb_alloc_urb(0, GFP_KERNEL); if (usb->video_urbs[i] == NULL) - goto initfail; + goto allocfail; usb->video_urbs[i]->transfer_buffer = kmalloc(v_urb_len, GFP_KERNEL); if (usb->video_urbs[i]->transfer_buffer == NULL) - goto initfail; + goto allocfail; usb_fill_bulk_urb(usb->video_urbs[i], usb->usbdev, video_pipe, usb->video_urbs[i]->transfer_buffer, v_urb_len, go7007_usb_read_video_pipe_complete, go); } /* Allocate the URBs and buffers for receiving the audio stream */ - if ((board->flags & GO7007_USB_EZUSB) && go->audio_enabled) + if ((board->flags & GO7007_USB_EZUSB) && + (board->flags & GO7007_BOARD_HAS_AUDIO)) { for (i = 0; i < 8; ++i) { usb->audio_urbs[i] = usb_alloc_urb(0, GFP_KERNEL); if (usb->audio_urbs[i] == NULL) - goto initfail; + goto allocfail; usb->audio_urbs[i]->transfer_buffer = kmalloc(4096, GFP_KERNEL); if (usb->audio_urbs[i]->transfer_buffer == NULL) - goto initfail; + goto allocfail; usb_fill_bulk_urb(usb->audio_urbs[i], usb->usbdev, usb_rcvbulkpipe(usb->usbdev, 8), usb->audio_urbs[i]->transfer_buffer, 4096, go7007_usb_read_audio_pipe_complete, go); } + } + /* Do any final GO7007 initialization, then register the + * V4L2 and ALSA interfaces */ + if (go7007_register_encoder(go, num_i2c_devs) < 0) + goto allocfail; go->status = STATUS_ONLINE; return 0; -initfail: - go->status = STATUS_SHUTDOWN; - return 0; - allocfail: - if (usb->intr_urb) { - kfree(usb->intr_urb->transfer_buffer); - usb_free_urb(usb->intr_urb); - } - kfree(usb); + go7007_usb_release(go); + kfree(go); return -ENOMEM; } diff --git a/drivers/staging/media/go7007/saa7134-go7007.c b/drivers/staging/media/go7007/saa7134-go7007.c index 7ccbfe7784cf..d35d5c2ea1c3 100644 --- a/drivers/staging/media/go7007/saa7134-go7007.c +++ b/drivers/staging/media/go7007/saa7134-go7007.c @@ -454,9 +454,22 @@ static int saa7134_go7007_init(struct saa7134_dev *dev) printk(KERN_DEBUG "saa7134-go7007: probing new SAA713X board\n"); + go = go7007_alloc(&board_voyager, &dev->pci->dev); + if (go == NULL) + return -ENOMEM; + saa = kzalloc(sizeof(struct saa7134_go7007), GFP_KERNEL); - if (saa == NULL) + if (saa == NULL) { + kfree(go); return -ENOMEM; + } + + go->board_id = GO7007_BOARDID_PCI_VOYAGER; + snprintf(go->bus_info, sizeof(go->bus_info), "PCI:%s", pci_name(dev->pci)); + strncpy(go->name, saa7134_boards[dev->board].name, sizeof(go->name)); + go->hpi_ops = &saa7134_go7007_hpi_ops; + go->hpi_context = saa; + saa->dev = dev; /* Init the subdevice interface */ sd = &saa->sd; @@ -472,25 +485,15 @@ static int saa7134_go7007_init(struct saa7134_dev *dev) if (!saa->bottom) goto allocfail; - go = go7007_alloc(&board_voyager, &dev->pci->dev); - if (go == NULL) - goto allocfail; - go->board_id = GO7007_BOARDID_PCI_VOYAGER; - snprintf(go->bus_info, sizeof(go->bus_info), "PCI:%s", pci_name(dev->pci)); - strncpy(go->name, saa7134_boards[dev->board].name, sizeof(go->name)); - go->hpi_ops = &saa7134_go7007_hpi_ops; - go->hpi_context = saa; - saa->dev = dev; - /* Boot the GO7007 */ if (go7007_boot_encoder(go, go->board_info->flags & GO7007_BOARD_USE_ONBOARD_I2C) < 0) - goto initfail; + goto allocfail; /* Do any final GO7007 initialization, then register the * V4L2 and ALSA interfaces */ if (go7007_register_encoder(go, go->board_info->num_i2c_devs) < 0) - goto initfail; + goto allocfail; /* Register the subdevice interface with the go7007 device */ if (v4l2_device_register_subdev(&go->v4l2_dev, sd) < 0) @@ -501,16 +504,13 @@ static int saa7134_go7007_init(struct saa7134_dev *dev) go->status = STATUS_ONLINE; return 0; -initfail: - go->status = STATUS_SHUTDOWN; - return 0; - allocfail: if (saa->top) free_page((unsigned long)saa->top); if (saa->bottom) free_page((unsigned long)saa->bottom); kfree(saa); + kfree(go); return -ENOMEM; }