From: Stephen Boyd <sboyd@kernel.org>
To: Brian Masney <masneyb@onstation.org>,
andy.gross@linaro.org, bjorn.andersson@linaro.org,
lee.jones@linaro.org, linus.walleij@linaro.org
Cc: marc.zyngier@arm.com, shawnguo@kernel.org, dianders@chromium.org,
linux-gpio@vger.kernel.org, nicolas.dechesne@linaro.org,
niklas.cassel@linaro.org, david.brown@linaro.org,
robh+dt@kernel.org, mark.rutland@arm.com,
thierry.reding@gmail.com, linux-arm-msm@vger.kernel.org,
linux-kernel@vger.kernel.org, devicetree@vger.kernel.org
Subject: Re: [PATCH v2 4/5] qcom: spmi-gpio: add support for hierarchical IRQ chip
Date: Mon, 07 Jan 2019 13:55:42 -0800 [thread overview]
Message-ID: <154689814280.15366.2705028033847856491@swboyd.mtv.corp.google.com> (raw)
In-Reply-To: <20190107021145.6370-5-masneyb@onstation.org>
Quoting Brian Masney (2019-01-06 18:11:44)
> @@ -762,11 +763,14 @@ static int pmic_gpio_of_xlate(struct gpio_chip *chip,
> static int pmic_gpio_to_irq(struct gpio_chip *chip, unsigned pin)
> {
> struct pmic_gpio_state *state = gpiochip_get_data(chip);
> - struct pmic_gpio_pad *pad;
> + struct irq_fwspec fwspec;
>
> - pad = state->ctrl->desc->pins[pin].drv_data;
> + fwspec.fwnode = state->fwnode;
> + fwspec.param_count = 2;
> + fwspec.param[0] = pin + 1;
There seems to be PMIC_GPIO_PHYSICAL_OFFSET for these purposes.
> + fwspec.param[1] = IRQ_TYPE_NONE;
>
> - return pad->irq;
> + return irq_create_fwspec_mapping(&fwspec);
> }
>
> static void pmic_gpio_dbg_show(struct seq_file *s, struct gpio_chip *chip)
> @@ -936,6 +940,86 @@ static int pmic_gpio_populate(struct pmic_gpio_state *state,
> return 0;
> }
>
> +static struct irq_chip pmic_gpio_irq_chip = {
> + .name = "spmi-gpio",
> + .irq_ack = irq_chip_ack_parent,
> + .irq_mask = irq_chip_mask_parent,
> + .irq_unmask = irq_chip_unmask_parent,
> + .irq_set_type = irq_chip_set_type_parent,
> + .irq_set_wake = irq_chip_set_wake_parent,
> + .flags = IRQCHIP_MASK_ON_SUSPEND,
> +};
> +
> +static int pmic_gpio_irq_activate(struct irq_domain *domain,
> + struct irq_data *data, bool reserve)
> +{
> + struct pmic_gpio_state *state = domain->host_data;
> +
> + return gpiochip_lock_as_irq(&state->chip, data->hwirq);
> +}
> +
> +static void pmic_gpio_irq_deactivate(struct irq_domain *domain,
> + struct irq_data *data)
> +{
> + struct pmic_gpio_state *state = domain->host_data;
> +
> + gpiochip_unlock_as_irq(&state->chip, data->hwirq);
> +}
I meant these sorts of wrappers that could be used by other drivers
possibly, if all they need to store in their domain->host_data is the
gpiochip structure (they can probably indirect through the gpiochip
again to get their driver specific structure).
int gpiochip_irq_domain_activate(struct irq_domain *domain,
struct irq_data *data, bool reserve)
{
struct gpiochip *chip = domain->host_data;
return gpiochip_lock_as_irq(chip, data->hwirq);
}
void gpiochip_irq_domain_deactivate(struct irq_domain *domain,
struct irq_data *data)
{
struct gpiochip *chip = domain->host_data;
return gpiochip_unlock_as_irq(chip, data->hwirq);
}
> +
> +static int pmic_gpio_domain_translate(struct irq_domain *domain,
> + struct irq_fwspec *fwspec,
> + unsigned long *hwirq,
> + unsigned int *type)
> +{
> + struct pmic_gpio_state *state = domain->host_data;
> +
> + if (fwspec->param_count != 2 || fwspec->param[0] >= state->chip.ngpio)
> + return -EINVAL;
> +
> + *hwirq = fwspec->param[0] - 1;
There seems to be PMIC_GPIO_PHYSICAL_OFFSET for these purposes.
> + *type = fwspec->param[1];
> +
> + return 0;
> +}
> +
> +static int pmic_gpio_domain_alloc(struct irq_domain *domain, unsigned int virq,
> + unsigned int nr_irqs, void *data)
> +{
> + struct pmic_gpio_state *state = domain->host_data;
> + struct irq_fwspec *fwspec = data;
> + struct irq_fwspec parent_fwspec;
> + irq_hw_number_t hwirq;
> + unsigned int type;
> + int ret, i;
> +
> + ret = pmic_gpio_domain_translate(domain, fwspec, &hwirq, &type);
> + if (ret)
> + return ret;
> +
> + for (i = 0; i < nr_irqs; i++)
> + irq_domain_set_info(domain, virq + i, hwirq + i,
> + &pmic_gpio_irq_chip, state,
> + handle_level_irq, NULL, NULL);
> +
> + parent_fwspec.fwnode = domain->parent->fwnode;
> + parent_fwspec.param_count = 4;
> + parent_fwspec.param[0] = 0;
> + parent_fwspec.param[1] = fwspec->param[0] + 0xc0 - 1;
Is the -1 there twice, once in pmic_gpio_domain_translate() and then
here?
> + parent_fwspec.param[2] = 0;
> + parent_fwspec.param[3] = fwspec->param[1];
> +
> + return irq_domain_alloc_irqs_parent(domain, virq, nr_irqs,
> + &parent_fwspec);
> +}
> +
next prev parent reply other threads:[~2019-01-07 21:55 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-01-07 2:11 [PATCH v2 0/5] qcom: spmi: " Brian Masney
2019-01-07 2:11 ` [PATCH v2 1/5] spmi: pmic-arb: hardcode IRQ counts Brian Masney
2019-01-07 7:13 ` kbuild test robot
2019-01-07 10:47 ` Linus Walleij
2019-01-07 21:26 ` Stephen Boyd
2019-01-07 2:11 ` [PATCH v2 2/5] mfd: qcom-spmi-pmic: use devm_mfd_add_devices instead of devm_of_platform_populate Brian Masney
2019-01-07 10:53 ` Linus Walleij
2019-01-07 11:30 ` Brian Masney
2019-01-07 21:41 ` Stephen Boyd
2019-01-08 10:32 ` Brian Masney
2019-01-07 2:11 ` [PATCH v2 3/5] spmi: pmic-arb: convert to v2 irq interfaces to support hierarchical IRQ chips Brian Masney
2019-01-07 2:11 ` [PATCH v2 4/5] qcom: spmi-gpio: add support for hierarchical IRQ chip Brian Masney
2019-01-07 21:55 ` Stephen Boyd [this message]
2019-01-08 10:35 ` Brian Masney
2019-01-07 2:11 ` [PATCH v2 5/5] ARM: dts: qcom: msm8974: add interrupt controller properties Brian Masney
2019-01-07 23:51 ` Stephen Boyd
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=154689814280.15366.2705028033847856491@swboyd.mtv.corp.google.com \
--to=sboyd@kernel.org \
--cc=andy.gross@linaro.org \
--cc=bjorn.andersson@linaro.org \
--cc=david.brown@linaro.org \
--cc=devicetree@vger.kernel.org \
--cc=dianders@chromium.org \
--cc=lee.jones@linaro.org \
--cc=linus.walleij@linaro.org \
--cc=linux-arm-msm@vger.kernel.org \
--cc=linux-gpio@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=marc.zyngier@arm.com \
--cc=mark.rutland@arm.com \
--cc=masneyb@onstation.org \
--cc=nicolas.dechesne@linaro.org \
--cc=niklas.cassel@linaro.org \
--cc=robh+dt@kernel.org \
--cc=shawnguo@kernel.org \
--cc=thierry.reding@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®