diff options
Diffstat (limited to 'drivers/pinctrl')
-rw-r--r-- | drivers/pinctrl/sunxi/pinctrl-sun50i-h5.c | 26 |
1 files changed, 23 insertions, 3 deletions
diff --git a/drivers/pinctrl/sunxi/pinctrl-sun50i-h5.c b/drivers/pinctrl/sunxi/pinctrl-sun50i-h5.c index ccf9419e9418..97b48336f84a 100644 --- a/drivers/pinctrl/sunxi/pinctrl-sun50i-h5.c +++ b/drivers/pinctrl/sunxi/pinctrl-sun50i-h5.c @@ -19,6 +19,7 @@ #include <linux/platform_device.h> #include <linux/of.h> #include <linux/of_device.h> +#include <linux/of_irq.h> #include <linux/pinctrl/pinctrl.h> #include "pinctrl-sunxi.h" @@ -530,17 +531,36 @@ static const struct sunxi_desc_pin sun50i_h5_pins[] = { SUNXI_FUNCTION_IRQ_BANK(0x6, 2, 13)), /* PG_EINT13 */ }; -static const struct sunxi_pinctrl_desc sun50i_h5_pinctrl_data = { +static const struct sunxi_pinctrl_desc sun50i_h5_pinctrl_data_broken = { .pins = sun50i_h5_pins, .npins = ARRAY_SIZE(sun50i_h5_pins), .irq_banks = 2, .irq_read_needs_mux = true }; +static const struct sunxi_pinctrl_desc sun50i_h5_pinctrl_data = { + .pins = sun50i_h5_pins, + .npins = ARRAY_SIZE(sun50i_h5_pins), + .irq_banks = 3, + .irq_read_needs_mux = true +}; + static int sun50i_h5_pinctrl_probe(struct platform_device *pdev) { - return sunxi_pinctrl_init(pdev, - &sun50i_h5_pinctrl_data); + switch (of_irq_count(pdev->dev.of_node)) { + case 2: + dev_warn(&pdev->dev, + "Your device tree's pinctrl node is broken, which has no IRQ of PG bank routed.\n"); + dev_warn(&pdev->dev, + "Please update the device tree, otherwise PG bank IRQ won't work.\n"); + return sunxi_pinctrl_init(pdev, + &sun50i_h5_pinctrl_data_broken); + case 3: + return sunxi_pinctrl_init(pdev, + &sun50i_h5_pinctrl_data); + default: + return -EINVAL; + } } static const struct of_device_id sun50i_h5_pinctrl_match[] = { |