From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S933087AbcLIKyT (ORCPT ); Fri, 9 Dec 2016 05:54:19 -0500 Received: from mail-wm0-f50.google.com ([74.125.82.50]:36720 "EHLO mail-wm0-f50.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932963AbcLIKyR (ORCPT ); Fri, 9 Dec 2016 05:54:17 -0500 Date: Fri, 9 Dec 2016 10:57:31 +0000 From: Lee Jones To: Charles Keepax Cc: linux-kernel@vger.kernel.org, patches@opensource.wolfsonmicro.com Subject: Re: [PATCH v4 4/4] mfd: arizona: Correctly clean up after IRQs Message-ID: <20161209105731.GJ3625@dell.home> References: <1479831028-28500-1-git-send-email-ckeepax@opensource.wolfsonmicro.com> <1479831028-28500-4-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: <1479831028-28500-4-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 On Tue, 22 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 v3: > - Just included the other patches in the chain. > > Thanks > Charles > > drivers/mfd/arizona-irq.c | 59 ++++++++++++++++++++++++++++++++--------------- > 1 file changed, 41 insertions(+), 18 deletions(-) Applied for v4.11, thanks. > diff --git a/drivers/mfd/arizona-irq.c b/drivers/mfd/arizona-irq.c > index 88729cf..09cf369 100644 > --- a/drivers/mfd/arizona-irq.c > +++ b/drivers/mfd/arizona-irq.c > @@ -210,6 +210,7 @@ int arizona_irq_init(struct arizona *arizona) > int ret; > const struct regmap_irq_chip *aod, *irq; > struct irq_data *irq_data; > + unsigned int virq; > > arizona->ctrlif_error = true; > > @@ -321,26 +322,34 @@ int arizona_irq_init(struct arizona *arizona) > } > > if (aod) { > - ret = regmap_add_irq_chip(arizona->regmap, > - irq_create_mapping(arizona->virq, > - ARIZONA_AOD_IRQ_INDEX), > - IRQF_ONESHOT, 0, aod, > - &arizona->aod_irq_chip); > + virq = irq_create_mapping(arizona->virq, ARIZONA_AOD_IRQ_INDEX); > + 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, > - ARIZONA_MAIN_IRQ_INDEX), > - IRQF_ONESHOT, 0, irq, > - &arizona->irq_chip); > + virq = irq_create_mapping(arizona->virq, ARIZONA_MAIN_IRQ_INDEX); > + 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 */ > @@ -404,26 +413,40 @@ int arizona_irq_init(struct arizona *arizona) > regmap_del_irq_chip(irq_find_mapping(arizona->virq, > ARIZONA_MAIN_IRQ_INDEX), > arizona->irq_chip); > +err_map_main_irq: > + irq_dispose_mapping(irq_find_mapping(arizona->virq, > + ARIZONA_MAIN_IRQ_INDEX)); > err_aod: > regmap_del_irq_chip(irq_find_mapping(arizona->virq, > ARIZONA_AOD_IRQ_INDEX), > arizona->aod_irq_chip); > +err_map_aod: > + irq_dispose_mapping(irq_find_mapping(arizona->virq, > + ARIZONA_AOD_IRQ_INDEX)); > +err_domain: > + irq_domain_remove(arizona->virq); > err: > return ret; > } > > int arizona_irq_exit(struct arizona *arizona) > { > + unsigned int virq; > + > if (arizona->ctrlif_error) > arizona_free_irq(arizona, ARIZONA_IRQ_CTRLIF_ERR, arizona); > arizona_free_irq(arizona, ARIZONA_IRQ_BOOT_DONE, arizona); > > - regmap_del_irq_chip(irq_find_mapping(arizona->virq, > - ARIZONA_MAIN_IRQ_INDEX), > - arizona->irq_chip); > - regmap_del_irq_chip(irq_find_mapping(arizona->virq, > - ARIZONA_AOD_IRQ_INDEX), > - arizona->aod_irq_chip); > + virq = irq_find_mapping(arizona->virq, ARIZONA_MAIN_IRQ_INDEX); > + regmap_del_irq_chip(virq, arizona->irq_chip); > + irq_dispose_mapping(virq); > + > + virq = irq_find_mapping(arizona->virq, ARIZONA_AOD_IRQ_INDEX); > + 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