mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-16 15:34:48 +08:00
[media] media: davinci: vpif_display: 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
a76a0b3381
commit
0b361583a5
@ -1829,10 +1829,20 @@ vpif_int_err:
|
||||
static int vpif_remove(struct platform_device *device)
|
||||
{
|
||||
struct channel_obj *ch;
|
||||
int i;
|
||||
struct resource *res;
|
||||
int irq_num;
|
||||
int 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);
|
||||
|
||||
kfree(vpif_obj.sd);
|
||||
/* un-register device */
|
||||
for (i = 0; i < VPIF_DISPLAY_MAX_DEVICES; i++) {
|
||||
/* Get the pointer to the channel object */
|
||||
@ -1841,6 +1851,7 @@ static int vpif_remove(struct platform_device *device)
|
||||
video_unregister_device(ch->video_dev);
|
||||
|
||||
ch->video_dev = NULL;
|
||||
kfree(vpif_obj.dev[i]);
|
||||
}
|
||||
|
||||
return 0;
|
||||
@ -1938,24 +1949,7 @@ static __init int vpif_init(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);
|
||||
kfree(vpif_obj.sd);
|
||||
for (i = 0; i < VPIF_DISPLAY_MAX_DEVICES; i++)
|
||||
kfree(vpif_obj.dev[i]);
|
||||
}
|
||||
|
||||
module_init(vpif_init);
|
||||
|
Loading…
Reference in New Issue
Block a user