From patchwork Mon May 25 23:20:46 2009 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrew de Quincey X-Patchwork-Id: 25892 X-Patchwork-Delegate: tony@atomide.com Received: from vger.kernel.org (vger.kernel.org [209.132.176.167]) by demeter.kernel.org (8.14.2/8.14.2) with ESMTP id n4PNKnL8022722 for ; Mon, 25 May 2009 23:20:49 GMT Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752892AbZEYXUq (ORCPT ); Mon, 25 May 2009 19:20:46 -0400 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1753056AbZEYXUq (ORCPT ); Mon, 25 May 2009 19:20:46 -0400 Received: from 82-71-49-12.dsl.in-addr.zen.co.uk ([82.71.49.12]:54511 "EHLO mail.lidskialf.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752920AbZEYXUp (ORCPT ); Mon, 25 May 2009 19:20:45 -0400 Received: from lidskialf.net (beyond.lidskialf.net [172.16.1.1]) by mail.lidskialf.net (Postfix) with ESMTP id A713048A70916 for ; Tue, 26 May 2009 00:20:46 +0100 (BST) Received: from munin.lidskialf.net (munin.lidskialf.net [172.16.1.17]) by lidskialf.net (Horde Framework) with HTTP; Tue, 26 May 2009 00:20:46 +0100 Message-ID: <20090526002046.52484z9m6ufsxjb4@lidskialf.net> Date: Tue, 26 May 2009 00:20:46 +0100 From: Andrew de Quincey To: linux-omap@vger.kernel.org Subject: Patch: Init/shutdown correctness fixes for drivers/cbus/tahvo* MIME-Version: 1.0 User-Agent: Internet Messaging Program (IMP) H3 (4.3) Sender: linux-omap-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-omap@vger.kernel.org This is a companion review patch to the cbus one that fixes init/shutdown correctness in drivers/cbus/tahvo* Signed-off-by: Andrew de Quincey commit 76dfa5c81201df2340e4f5902a4552dea449d771 Author: Andrew de Quincey Date: Tue May 26 00:13:21 2009 +0100 Fix tahvo errors diff --git a/drivers/cbus/tahvo-usb.c b/drivers/cbus/tahvo-usb.c index df74d28..5f70c44 100644 --- a/drivers/cbus/tahvo-usb.c +++ b/drivers/cbus/tahvo-usb.c @@ -651,10 +651,9 @@ static int tahvo_usb_probe(struct platform_device *pdev) dev_dbg(&(pdev->dev), "probe\n"); /* Create driver data */ - tu = kmalloc(sizeof(*tu), GFP_KERNEL); + tu = kzalloc(sizeof(*tu), GFP_KERNEL); if (!tu) return -ENOMEM; - memset(tu, 0, sizeof(*tu)); tu->pt_dev = pdev; #ifdef CONFIG_USB_OTG /* Default mode */ @@ -683,11 +682,23 @@ static int tahvo_usb_probe(struct platform_device *pdev) /* Attributes */ ret = device_create_file(&(pdev->dev), &dev_attr_vbus_state); + if (ret) { + tahvo_free_irq(TAHVO_INT_VBUSON); + kfree(tu); + printk(KERN_ERR "attribute creation failed: %d\n", ret); + return ret; + } + #ifdef CONFIG_USB_OTG - ret |= device_create_file(&(pdev->dev), &dev_attr_otg_mode); -#endif - if (ret) + ret = device_create_file(&(pdev->dev), &dev_attr_otg_mode); + if (ret) { + device_remove_file(&(pdev->dev), &dev_attr_vbus_state); + tahvo_free_irq(TAHVO_INT_VBUSON); + kfree(tu); printk(KERN_ERR "attribute creation failed: %d\n", ret); + return ret; + } +#endif /* Create OTG interface */ tahvo_usb_power_off(tu); @@ -703,8 +714,12 @@ static int tahvo_usb_probe(struct platform_device *pdev) ret = otg_set_transceiver(&tu->otg); if (ret < 0) { printk(KERN_ERR "Cannot register USB transceiver\n"); - kfree(tu); tahvo_free_irq(TAHVO_INT_VBUSON); + device_remove_file(&(pdev->dev), &dev_attr_vbus_state); +#ifdef CONFIG_USB_OTG + device_remove_file(&(pdev->dev), &dev_attr_otg_mode); +#endif + kfree(tu); return ret; } @@ -718,6 +733,7 @@ static int tahvo_usb_probe(struct platform_device *pdev) static int tahvo_usb_remove(struct platform_device *pdev) { + struct tahvo_usb *tu = (struct tahvo_usb*) pdev->dev.driver_data; dev_dbg(&(pdev->dev), "remove\n"); tahvo_free_irq(TAHVO_INT_VBUSON); @@ -727,6 +743,7 @@ static int tahvo_usb_remove(struct platform_device *pdev) #ifdef CONFIG_USB_OTG device_remove_file(&(pdev->dev), &dev_attr_otg_mode); #endif + kfree(tu); return 0; } diff --git a/drivers/cbus/tahvo.c b/drivers/cbus/tahvo.c index 29fd4b8..09a69c0 100644 --- a/drivers/cbus/tahvo.c +++ b/drivers/cbus/tahvo.c @@ -298,6 +298,7 @@ static int __devinit tahvo_probe(struct platform_device *pdev) em_asic_config = omap_get_config(OMAP_TAG_EM_ASIC_BB5, struct omap_em_asic_bb5_config); if (em_asic_config == NULL) { + tasklet_kill(&tahvo_tasklet); printk(KERN_ERR PFX "Unable to retrieve config data\n"); return -ENODATA; } @@ -314,6 +315,7 @@ static int __devinit tahvo_probe(struct platform_device *pdev) tahvo_is_betty = 1; tahvo_7bit_backlight = 1; } else { + tasklet_kill(&tahvo_tasklet); printk(KERN_ERR "Tahvo/Betty chip not found"); return -ENODEV; } @@ -324,6 +326,7 @@ static int __devinit tahvo_probe(struct platform_device *pdev) tahvo_irq_pin = em_asic_config->tahvo_irq_gpio; if ((ret = gpio_request(tahvo_irq_pin, "TAHVO irq")) < 0) { + tasklet_kill(&tahvo_tasklet); printk(KERN_ERR PFX "Unable to reserve IRQ GPIO\n"); return ret; } @@ -342,6 +345,7 @@ static int __devinit tahvo_probe(struct platform_device *pdev) if (ret < 0) { printk(KERN_ERR PFX "Unable to register IRQ handler\n"); gpio_free(tahvo_irq_pin); + tasklet_kill(&tahvo_tasklet); return ret; } #ifdef CONFIG_CBUS_TAHVO_USER @@ -350,6 +354,7 @@ static int __devinit tahvo_probe(struct platform_device *pdev) printk(KERN_ERR "Unable to initialize driver\n"); free_irq(gpio_to_irq(tahvo_irq_pin), 0); gpio_free(tahvo_irq_pin); + tasklet_kill(&tahvo_tasklet); return ret; } #endif