Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751871AbdCNOGE (ORCPT ); Tue, 14 Mar 2017 10:06:04 -0400 Received: from mail-io0-f178.google.com ([209.85.223.178]:34067 "EHLO mail-io0-f178.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750849AbdCNOFa (ORCPT ); Tue, 14 Mar 2017 10:05:30 -0400 MIME-Version: 1.0 In-Reply-To: <1488203368-13574-1-git-send-email-patrice.chotard@st.com> References: <1488203368-13574-1-git-send-email-patrice.chotard@st.com> From: Linus Walleij Date: Tue, 14 Mar 2017 15:05:27 +0100 Message-ID: Subject: Re: [PATCH 1/1] pinctrl: st: add irq_request_resources callback To: Patrice CHOTARD Cc: "linux-kernel@vger.kernel.org" , "linux-arm-kernel@lists.infradead.org" , Peter Griffin , Lee Jones Content-Type: text/plain; charset=UTF-8 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 1425 Lines: 44 On Mon, Feb 27, 2017 at 2:49 PM, wrote: > From: Patrice Chotard > > When using GPIO as IRQ source, the GPIO must be configured > in INPUT. The callback dedicated for this was missing in > pinctrl-st driver. > > This fix the following kernel error when trying to lock a gpio > as IRQ: > > [ 7.521095] gpio gpiochip7: (PIO11): gpiochip_lock_as_irq: tried to flag a GPIO set as output for IRQ > [ 7.526018] gpio gpiochip7: (PIO11): unable to lock HW IRQ 6 for IRQ > [ 7.529405] genirq: Failed to request resources for 0-0053 (irq 81) on irqchip GPIO > > Signed-off-by: Patrice Chotard I see what problem you are trying to solve. > +static int st_gpio_irq_request_resources(struct irq_data *d) > +{ > + struct gpio_chip *gc = irq_data_get_irq_chip_data(d); > + int pin = d->hwirq; > + > + return st_gpio_direction_input(gc, pin); > +} (...) > + .irq_request_resources = st_gpio_irq_request_resources, But this is just hiding the problem I'm afraid. Now thay you override .irq_request_resources() gpiochip_irq_reqres() will not be called, so then you have to lock the irq in the driver, with something like: ret = gpiochip_lock_as_irq(&chip->gc, d->hwirq); if (ret) goto out; You also have to implement the .irq_release_resources() callback and unlock the IRQ there. Yours, Linus Walleij