2019/10/31

linux dtsi, gpio

因為 dts 裡,touch ic 的 device tree 有一個 property..
              irq-gpios = <&pio 2 0x2800>;

include/linux/of_gpio.h:
static inline int of_get_named_gpio(struct device_node *np,
                                   const char *propname, int index)
{
        return of_get_named_gpio_flags(np, propname, index, NULL);
}
drivers/gpio/gpiolib-of.c
int of_get_named_gpio_flags(struct device_node *np, const char *list_name,
                            int index, enum of_gpio_flags *flags)
{
        struct gpio_desc *desc;

        desc = of_get_named_gpiod_flags(np, list_name, index, flags);

        if (IS_ERR(desc))
                return PTR_ERR(desc);
        else
                return desc_to_gpio(desc);
}
...
..
struct gpio_desc *of_get_named_gpiod_flags(struct device_node *np,
                     const char *propname, int index, enum of_gpio_flags *flags)
{
        struct of_phandle_args gpiospec;
        struct gpio_chip *chip;
        struct gpio_desc *desc;
        int ret;

        ret = of_parse_phandle_with_args(np, propname, "#gpio-cells", index,
                                         &gpiospec);
        if (ret) {
                pr_debug("%s: can't parse '%s' property of node '%s[%d]'\n",
                        __func__, propname, np->full_name, index);
                return ERR_PTR(ret);
        }

        chip = of_find_gpiochip_by_xlate(&gpiospec);
        if (!chip) {
                desc = ERR_PTR(-EPROBE_DEFER);
                goto out;
        }

        desc = of_xlate_and_get_gpiod_flags(chip, &gpiospec, flags);
        if (IS_ERR(desc))
                goto out;

        pr_debug("%s: parsed '%s' property of node '%s[%d]' - status (%d)\n",
                 __func__, propname, np->full_name, index,
                 PTR_ERR_OR_ZERO(desc));

out:
        of_node_put(gpiospec.np);

        return desc;
}
後面哪個..implement 在 kernel/irq/irqdomain.c
int irq_domain_xlate_twocell(struct irq_domain *d, struct device_node *ctrlr,
                        const u32 *intspec, unsigned int intsize,
                        irq_hw_number_t *out_hwirq, unsigned int *out_type)
{
        if (WARN_ON(intsize < 2))
                return -EINVAL;
        *out_hwirq = intspec[0];
        *out_type = intspec[1] & IRQ_TYPE_SENSE_MASK;
        return 0;
}
EXPORT_SYMBOL_GPL(irq_domain_xlate_twocell);

沒有留言:

張貼留言