[media] media: davinci: vpif_capture: move the freeing of irq and global variables to remove()
Ideally the freeing of irq's and the global variables needs to be done in the remove() rather than module_exit(), this patch moves the freeing up of irq's and freeing the memory allocated to channel objects to remove() callback of struct platform_driver. Signed-off-by: Lad, Prabhakar <prabhakar.csengg@gmail.com> Acked-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
This commit is contained in:
parent
079b3852b7
commit
410ca6053e
|
@ -2159,17 +2159,27 @@ vpif_int_err:
|
||||||
*/
|
*/
|
||||||
static int vpif_remove(struct platform_device *device)
|
static int vpif_remove(struct platform_device *device)
|
||||||
{
|
{
|
||||||
int i;
|
|
||||||
struct channel_obj *ch;
|
struct channel_obj *ch;
|
||||||
|
struct resource *res;
|
||||||
|
int irq_num, i = 0;
|
||||||
|
|
||||||
|
while ((res = platform_get_resource(device, IORESOURCE_IRQ, i))) {
|
||||||
|
for (irq_num = res->start; irq_num <= res->end; irq_num++)
|
||||||
|
free_irq(irq_num,
|
||||||
|
(void *)(&vpif_obj.dev[i]->channel_id));
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
|
||||||
v4l2_device_unregister(&vpif_obj.v4l2_dev);
|
v4l2_device_unregister(&vpif_obj.v4l2_dev);
|
||||||
|
|
||||||
|
kfree(vpif_obj.sd);
|
||||||
/* un-register device */
|
/* un-register device */
|
||||||
for (i = 0; i < VPIF_CAPTURE_MAX_DEVICES; i++) {
|
for (i = 0; i < VPIF_CAPTURE_MAX_DEVICES; i++) {
|
||||||
/* Get the pointer to the channel object */
|
/* Get the pointer to the channel object */
|
||||||
ch = vpif_obj.dev[i];
|
ch = vpif_obj.dev[i];
|
||||||
/* Unregister video device */
|
/* Unregister video device */
|
||||||
video_unregister_device(ch->video_dev);
|
video_unregister_device(ch->video_dev);
|
||||||
|
kfree(vpif_obj.dev[i]);
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -2281,24 +2291,7 @@ static __init int vpif_init(void)
|
||||||
*/
|
*/
|
||||||
static void vpif_cleanup(void)
|
static void vpif_cleanup(void)
|
||||||
{
|
{
|
||||||
struct platform_device *pdev;
|
|
||||||
struct resource *res;
|
|
||||||
int irq_num;
|
|
||||||
int i = 0;
|
|
||||||
|
|
||||||
pdev = container_of(vpif_dev, struct platform_device, dev);
|
|
||||||
while ((res = platform_get_resource(pdev, IORESOURCE_IRQ, i))) {
|
|
||||||
for (irq_num = res->start; irq_num <= res->end; irq_num++)
|
|
||||||
free_irq(irq_num,
|
|
||||||
(void *)(&vpif_obj.dev[i]->channel_id));
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
|
|
||||||
platform_driver_unregister(&vpif_driver);
|
platform_driver_unregister(&vpif_driver);
|
||||||
|
|
||||||
kfree(vpif_obj.sd);
|
|
||||||
for (i = 0; i < VPIF_CAPTURE_MAX_DEVICES; i++)
|
|
||||||
kfree(vpif_obj.dev[i]);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Function for module initialization and cleanup */
|
/* Function for module initialization and cleanup */
|
||||||
|
|
Loading…
Reference in New Issue