From patchwork Sat Aug 20 11:28:17 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Chris Rankin X-Patchwork-Id: 272 Return-path: Envelope-to: mchehab@infradead.org Delivery-date: Sat, 20 Aug 2011 11:28:46 +0000 Received: from casper.infradead.org [85.118.1.10] by gaivota with IMAP (fetchmail-6.3.20) for (single-drop); Sat, 20 Aug 2011 04:50:32 -0700 (PDT) Received: from vger.kernel.org ([209.132.180.67]) by casper.infradead.org with esmtp (Exim 4.76 #1 (Red Hat Linux)) id 1QujjJ-0007MZ-PT; Sat, 20 Aug 2011 11:28:46 +0000 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753423Ab1HTL2W (ORCPT + 1 other); Sat, 20 Aug 2011 07:28:22 -0400 Received: from nm4.bt.bullet.mail.ukl.yahoo.com ([217.146.183.202]:43529 "HELO nm4.bt.bullet.mail.ukl.yahoo.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with SMTP id S1752456Ab1HTL2V (ORCPT ); Sat, 20 Aug 2011 07:28:21 -0400 Received: from [217.146.183.197] by nm4.bt.bullet.mail.ukl.yahoo.com with NNFMP; 20 Aug 2011 11:28:20 -0000 Received: from [217.146.183.203] by tm3.bt.bullet.mail.ukl.yahoo.com with NNFMP; 20 Aug 2011 11:28:20 -0000 Received: from [127.0.0.1] by omp1001.bt.mail.ukl.yahoo.com with NNFMP; 20 Aug 2011 11:28:20 -0000 X-Yahoo-Newman-Id: 399500.47469.bm@omp1001.bt.mail.ukl.yahoo.com Received: (qmail 49234 invoked from network); 20 Aug 2011 11:28:20 -0000 DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws; s=s1024; d=yahoo.com; h=DKIM-Signature:X-Yahoo-Newman-Property:X-YMail-OSG:X-Yahoo-SMTP:Received:Received:Message-ID:Date:From:User-Agent:MIME-Version:To:CC:Subject:References:In-Reply-To:Content-Type; b=nXpHqunw5ypgdfkFGpGCXt2IIXEKl76gFjGBhgVQOipyD+YfcoVKngY/7y/68YLxjGy8LdHowZkO7EWy3NjZ8UphytatA0rVlGqlwJRi4aqjpvM1Ol4kdP2ulluRPVUni0kvKfRWVq1YTEHhumIUenpnNAzVnbSeFMlUMdEJ1KM= ; DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s1024; t=1313839700; bh=3S5h9te+PyDdE2PdCEk8E/ogr7gUhWBX6E0zqjvBHOw=; h=X-Yahoo-Newman-Property:X-YMail-OSG:X-Yahoo-SMTP:Received:Received:Message-ID:Date:From:User-Agent:MIME-Version:To:CC:Subject:References:In-Reply-To:Content-Type; b=0xsPyLqmCwLS25C5raHhUFNo0kwWMpXfreuGEEp34ZsxspQUNThT0FbJnCvHAWIh+yHK1YC5WNn/e+XXpYGjwSveOR0m8E8tPZ1InWFpDVzUntSuUgZByTe5XcL2qm7sjt6vItXbojv4RGnWqjE276q2PiE5LKrhRhVhAEb11wk= X-Yahoo-Newman-Property: ymail-3 X-YMail-OSG: q.sTukwVM1mr6Qyj8ezYtkkDzFRTBerpkkQGH0ACnP52Tke yxggedb7.R8q0mFwaGJ8.SDp5X9aAqgve9_ysarviz_giLQy7xl5DhlNg2cp Kx5T.ZgdxuhT3ik4C45Pszt_cM8BY9_8B5mPDvlpXEk6FpR2hZnEmDU8ADqT nOzB3obHvOBUMFDMO85zh5juKisI.ZLz_08aRsxMIKkbEgoPMYBiwYDJ0kTj WIkwh7Fg2J5XSHAlBDxiOtYlIewjJgiNrkl_MgQii8RYDZzGF5m0D3zPpeuz ADQWbsaFF2kBimg9ehq9T92OD.2pSxRNH0n3SL7jSdZy_.9t6TSUedNK4lGk JudCp3aGz1mB7AtF1Q_6PsSJtLLoVx6rwgF5DinzQiQj5viZ1MC_VLIoYJR8 3Nw-- X-Yahoo-SMTP: dMK34oyswBBlfKesWTI5ovDjFOUFE6shtILt.ZXnUEjQHhWq Received: from wellhouse.underworld (rankincj@86.182.26.38 with login) by smtp822.mail.ukl.yahoo.com with SMTP; 20 Aug 2011 11:28:19 +0000 GMT Received: from volcano.underworld (volcano.underworld [192.168.0.3]) by wellhouse.underworld (8.14.3/8.14.3/Debian-5+lenny1) with ESMTP id p7KBSHo0011464 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NOT); Sat, 20 Aug 2011 12:28:18 +0100 Message-ID: <4E4F9A51.5000301@yahoo.com> Date: Sat, 20 Aug 2011 12:28:17 +0100 From: Chris Rankin User-Agent: Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20110707 Thunderbird/5.0 MIME-Version: 1.0 To: Mauro Carvalho Chehab CC: Devin Heitmueller , linux-media@vger.kernel.org, Antti Palosaari Subject: [PATCH 4/6] EM28xx - clean up resources should init fail References: <4E4D5157.2080406@yahoo.com> <4E4D8DFD.5060800@yahoo.com> <4E4DFA65.4090508@redhat.com> In-Reply-To: <4E4DFA65.4090508@redhat.com> Sender: linux-media-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-media@vger.kernel.org This patch ensures that the em28xx_init_dev() function cleans up after itself, in the event that it fails. This isimportant because the struct em28xx will be deallocated if em28xx_init_dev() returns an error. Signed-off-by: Chris Rankin --- linux-3.0/drivers/media/video/em28xx/em28xx-cards.c.orig 2011-08-18 22:42:03.000000000 +0100 +++ linux-3.0/drivers/media/video/em28xx/em28xx-cards.c 2011-08-18 22:55:52.000000000 +0100 @@ -2776,7 +2776,6 @@ { struct em28xx *dev = *devhandle; int retval; - int errCode; dev->udev = udev; mutex_init(&dev->ctrl_urb_lock); @@ -2858,7 +2857,7 @@ /* Resets I2C speed */ em28xx_write_reg(dev, EM28XX_R06_I2C_CLK, dev->board.i2c_speed); if (retval < 0) { - em28xx_errdev("%s: em28xx_write_regs_req failed!" + em28xx_errdev("%s: em28xx_write_reg failed!" " retval [%d]\n", __func__, retval); return retval; @@ -2872,12 +2871,11 @@ } /* register i2c bus */ - errCode = em28xx_i2c_register(dev); - if (errCode < 0) { - v4l2_device_unregister(&dev->v4l2_dev); + retval = em28xx_i2c_register(dev); + if (retval < 0) { em28xx_errdev("%s: em28xx_i2c_register - errCode [%d]!\n", - __func__, errCode); - return errCode; + __func__, retval); + goto fail_reg_i2c; } /* @@ -2891,11 +2889,11 @@ em28xx_card_setup(dev); /* Configure audio */ - errCode = em28xx_audio_setup(dev); - if (errCode < 0) { - v4l2_device_unregister(&dev->v4l2_dev); + retval = em28xx_audio_setup(dev); + if (retval < 0) { em28xx_errdev("%s: Error while setting audio - errCode [%d]!\n", - __func__, errCode); + __func__, retval); + goto fail_setup_audio; } /* wake i2c devices */ @@ -2909,31 +2907,28 @@ if (dev->board.has_msp34xx) { /* Send a reset to other chips via gpio */ - errCode = em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xf7); - if (errCode < 0) { - em28xx_errdev("%s: em28xx_write_regs_req - " + retval = em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xf7); + if (retval < 0) { + em28xx_errdev("%s: em28xx_write_reg - " "msp34xx(1) failed! errCode [%d]\n", - __func__, errCode); - return errCode; + __func__, retval); + goto fail_write_reg; } msleep(3); - errCode = em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xff); - if (errCode < 0) { - em28xx_errdev("%s: em28xx_write_regs_req - " + retval = em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xff); + if (retval < 0) { + em28xx_errdev("%s: em28xx_write_reg - " "msp34xx(2) failed! errCode [%d]\n", - __func__, errCode); - return errCode; + __func__, retval); + goto fail_write_reg; } msleep(3); } - em28xx_add_into_devlist(dev); - retval = em28xx_register_analog_devices(dev); if (retval < 0) { - em28xx_release_resources(dev); - goto fail_reg_devices; + goto fail_reg_analog_devices; } em28xx_init_extension(dev); @@ -2943,7 +2938,14 @@ return 0; -fail_reg_devices: +fail_setup_audio: +fail_write_reg: +fail_reg_analog_devices: + em28xx_i2c_unregister(dev); + +fail_reg_i2c: + v4l2_device_unregister(&dev->v4l2_dev); + return retval; } --- linux-3.0/drivers/media/video/em28xx/em28xx-core.c.orig 2011-08-17 08:52:25.000000000 +0100 +++ linux-3.0/drivers/media/video/em28xx/em28xx-core.c 2011-08-18 22:51:59.000000000 +0100 @@ -1171,13 +1171,6 @@ mutex_unlock(&em28xx_devlist_mutex); }; -void em28xx_add_into_devlist(struct em28xx *dev) -{ - mutex_lock(&em28xx_devlist_mutex); - list_add_tail(&dev->devlist, &em28xx_devlist); - mutex_unlock(&em28xx_devlist_mutex); -}; - /* * Extension interface */ @@ -1215,14 +1208,13 @@ void em28xx_init_extension(struct em28xx *dev) { - struct em28xx_ops *ops = NULL; + const struct em28xx_ops *ops = NULL; mutex_lock(&em28xx_devlist_mutex); - if (!list_empty(&em28xx_extension_devlist)) { - list_for_each_entry(ops, &em28xx_extension_devlist, next) { - if (ops->init) - ops->init(dev); - } + list_add_tail(&dev->devlist, &em28xx_devlist); + list_for_each_entry(ops, &em28xx_extension_devlist, next) { + if (ops->init) + ops->init(dev); } mutex_unlock(&em28xx_devlist_mutex); }