From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753326AbbFRHc3 (ORCPT ); Thu, 18 Jun 2015 03:32:29 -0400 Received: from foss.arm.com ([217.140.101.70]:41382 "EHLO foss.arm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751867AbbFRHcV (ORCPT ); Thu, 18 Jun 2015 03:32:21 -0400 Message-ID: <55827400.2050904@arm.com> Date: Thu, 18 Jun 2015 08:32:16 +0100 From: Marc Zyngier Organization: ARM Ltd User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Icedove/31.7.0 MIME-Version: 1.0 To: Bjorn Andersson , Kumar Gala , Andy Gross , Samuel Ortiz , Lee Jones , Linus Walleij CC: "linux-arm-msm@vger.kernel.org" , "linux-soc@vger.kernel.org" , "linux-kernel@vger.kernel.org" Subject: Re: [PATCH 7/8] mfd: pm8921: Implement irq_get_irqchip_state References: <1434610052-602-1-git-send-email-bjorn.andersson@sonymobile.com> <1434610052-602-8-git-send-email-bjorn.andersson@sonymobile.com> In-Reply-To: <1434610052-602-8-git-send-email-bjorn.andersson@sonymobile.com> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi Bjorn, On 18/06/15 07:47, Bjorn Andersson wrote: > Implement irq_chip->irq_get_irqchip_state to make it possible for PMIC > block drivers to access the IRQ real time status bits. The status bits > are used for various kinds of input signals, e.g. GPIO. > > Signed-off-by: Bjorn Andersson > --- > > This patch can be picked up independently of the rest of the series. > > drivers/mfd/pm8921-core.c | 43 +++++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 43 insertions(+) > > diff --git a/drivers/mfd/pm8921-core.c b/drivers/mfd/pm8921-core.c > index 5a92646a2ccb..5f81ba0c50f5 100644 > --- a/drivers/mfd/pm8921-core.c > +++ b/drivers/mfd/pm8921-core.c > @@ -236,11 +236,54 @@ static int pm8xxx_irq_set_type(struct irq_data *d, unsigned int flow_type) > return pm8xxx_config_irq(chip, block, config); > } > > +static int pm8xxx_irq_get_irqchip_state(struct irq_data *d, > + enum irqchip_irq_state which, > + bool *state) > +{ > + struct pm_irq_chip *chip = irq_data_get_irq_chip_data(d); > + unsigned int pmirq = irqd_to_hwirq(d); > + unsigned int bits; > + int irq_bit; > + u8 block; > + int rc; > + > + if (!chip) { > + pr_err("Failed to resolve pm_irq_chip\n"); > + return -EINVAL; > + } Why do you need to check this? Is there any code path that could actually trigger this? > + > + if (which != IRQCHIP_STATE_LINE_LEVEL) > + return -EINVAL; > + > + block = pmirq / 8; > + irq_bit = pmirq % 8; > + > + spin_lock(&chip->pm_irq_lock); > + rc = regmap_write(chip->regmap, SSBI_REG_ADDR_IRQ_BLK_SEL, block); > + if (rc) { > + pr_err("Failed Selecting Block %d rc=%d\n", block, rc); > + goto bail; > + } > + > + rc = regmap_read(chip->regmap, SSBI_REG_ADDR_IRQ_RT_STATUS, &bits); > + if (rc) { > + pr_err("Failed Reading Status rc=%d\n", rc); > + goto bail; > + } > + > + *state = !!(bits & BIT(irq_bit)); > +bail: > + spin_unlock(&chip->pm_irq_lock); > + > + return rc ? rc : 0; I think you can just have "return rc;" here. > +} > + > static struct irq_chip pm8xxx_irq_chip = { > .name = "pm8xxx", > .irq_mask_ack = pm8xxx_irq_mask_ack, > .irq_unmask = pm8xxx_irq_unmask, > .irq_set_type = pm8xxx_irq_set_type, > + .irq_get_irqchip_state = pm8xxx_irq_get_irqchip_state, > .flags = IRQCHIP_MASK_ON_SUSPEND | IRQCHIP_SKIP_SET_WAKE, > }; > > Thanks, M. -- Jazz is not dead. It just smells funny...