lkml.org 
[lkml]   [2013]   [Jun]   [17]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v4 08/11] media: davinci: vpif_display: move the freeing of irq and global variables to remove()
    Date
    From: "Lad, Prabhakar" <prabhakar.csengg@gmail.com>

    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>
    ---
    drivers/media/platform/davinci/vpif_display.c | 30 ++++++++++---------------
    1 file changed, 12 insertions(+), 18 deletions(-)

    diff --git a/drivers/media/platform/davinci/vpif_display.c b/drivers/media/platform/davinci/vpif_display.c
    index 6c521f2..371af34 100644
    --- a/drivers/media/platform/davinci/vpif_display.c
    +++ b/drivers/media/platform/davinci/vpif_display.c
    @@ -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);
    --
    1.7.9.5


    \
     
     \ /
      Last update: 2013-06-17 18:41    [W:4.486 / U:0.076 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site