Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932785AbcKVMy5 (ORCPT ); Tue, 22 Nov 2016 07:54:57 -0500 Received: from mail-wm0-f49.google.com ([74.125.82.49]:37531 "EHLO mail-wm0-f49.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753817AbcKVMy4 (ORCPT ); Tue, 22 Nov 2016 07:54:56 -0500 Date: Tue, 22 Nov 2016 12:57:54 +0000 From: Lee Jones To: Charles Keepax Cc: linux-kernel@vger.kernel.org, patches@opensource.wolfsonmicro.com Subject: Re: [PATCH v2 1/3] mfd: arizona: Correctly clean up after IRQs Message-ID: <20161122125538.GA316@dell.lan> References: <1479143757-30531-1-git-send-email-ckeepax@opensource.wolfsonmicro.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <1479143757-30531-1-git-send-email-ckeepax@opensource.wolfsonmicro.com> User-Agent: Mutt/1.6.2 (2016-07-01) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 3829 Lines: 126 On Mon, 14 Nov 2016, Charles Keepax wrote: > Currently we leak a lot of things when tearing down the IRQs this patch > fixes this cleaning up both the IRQ mappings and the IRQ domain itself. > > Signed-off-by: Charles Keepax > --- > > Changes since v1: > - Correct handling of ret and error messages from irq_create_mapping > > Thanks, > Charles > > drivers/mfd/arizona-irq.c | 54 +++++++++++++++++++++++++++++++++++------------ > 1 file changed, 40 insertions(+), 14 deletions(-) > > diff --git a/drivers/mfd/arizona-irq.c b/drivers/mfd/arizona-irq.c > index 2e01975..bc3b342 100644 > --- a/drivers/mfd/arizona-irq.c > +++ b/drivers/mfd/arizona-irq.c > @@ -207,6 +207,7 @@ int arizona_irq_init(struct arizona *arizona) > int ret, i; > const struct regmap_irq_chip *aod, *irq; > struct irq_data *irq_data; > + unsigned int virq; > > arizona->ctrlif_error = true; > > @@ -318,24 +319,34 @@ int arizona_irq_init(struct arizona *arizona) > } > > if (aod) { > - ret = regmap_add_irq_chip(arizona->regmap, > - irq_create_mapping(arizona->virq, 0), > - IRQF_ONESHOT, 0, aod, > - &arizona->aod_irq_chip); > + virq = irq_create_mapping(arizona->virq, 0); I would like to see all of the '0's and '1's defined please. > + if (!virq) { > + dev_err(arizona->dev, "Failed to map AOD IRQs\n"); > + ret = -EINVAL; > + goto err_domain; > + } > + > + ret = regmap_add_irq_chip(arizona->regmap, virq, IRQF_ONESHOT, > + 0, aod, &arizona->aod_irq_chip); > if (ret != 0) { > dev_err(arizona->dev, > "Failed to add AOD IRQs: %d\n", ret); > - goto err; > + goto err_map_aod; > } > } > > - ret = regmap_add_irq_chip(arizona->regmap, > - irq_create_mapping(arizona->virq, 1), > - IRQF_ONESHOT, 0, irq, > - &arizona->irq_chip); > + virq = irq_create_mapping(arizona->virq, 1); > + if (!virq) { > + dev_err(arizona->dev, "Failed to map main IRQs\n"); > + ret = -EINVAL; > + goto err_aod; > + } > + > + ret = regmap_add_irq_chip(arizona->regmap, virq, IRQF_ONESHOT, > + 0, irq, &arizona->irq_chip); > if (ret != 0) { > dev_err(arizona->dev, "Failed to add main IRQs: %d\n", ret); > - goto err_aod; > + goto err_map_main_irq; > } > > /* Used to emulate edge trigger and to work around broken pinmux */ > @@ -400,23 +411,38 @@ int arizona_irq_init(struct arizona *arizona) > err_main_irq: > regmap_del_irq_chip(irq_find_mapping(arizona->virq, 1), > arizona->irq_chip); > +err_map_main_irq: > + irq_dispose_mapping(irq_find_mapping(arizona->virq, 1)); > err_aod: > regmap_del_irq_chip(irq_find_mapping(arizona->virq, 0), > arizona->aod_irq_chip); > +err_map_aod: > + irq_dispose_mapping(irq_find_mapping(arizona->virq, 0)); > +err_domain: > + irq_domain_remove(arizona->virq); > err: > return ret; > } > > int arizona_irq_exit(struct arizona *arizona) > { > + unsigned int virq; > + > if (arizona->ctrlif_error) > free_irq(arizona_map_irq(arizona, ARIZONA_IRQ_CTRLIF_ERR), > arizona); > free_irq(arizona_map_irq(arizona, ARIZONA_IRQ_BOOT_DONE), arizona); > - regmap_del_irq_chip(irq_find_mapping(arizona->virq, 1), > - arizona->irq_chip); > - regmap_del_irq_chip(irq_find_mapping(arizona->virq, 0), > - arizona->aod_irq_chip); > + > + virq = irq_find_mapping(arizona->virq, 1); > + regmap_del_irq_chip(virq, arizona->irq_chip); > + irq_dispose_mapping(virq); > + > + virq = irq_find_mapping(arizona->virq, 0); > + regmap_del_irq_chip(virq, arizona->aod_irq_chip); > + irq_dispose_mapping(virq); > + > + irq_domain_remove(arizona->virq); > + > free_irq(arizona->irq, arizona); > > return 0; -- Lee Jones Linaro STMicroelectronics Landing Team Lead Linaro.org │ Open source software for ARM SoCs Follow Linaro: Facebook | Twitter | Blog