1 | /* SPDX-License-Identifier: GPL-2.0 */ |
2 | /* |
3 | * Pinctrl / GPIO driver for StarFive JH7110 SoC |
4 | * |
5 | * Copyright (C) 2022 StarFive Technology Co., Ltd. |
6 | */ |
7 | |
8 | #ifndef __PINCTRL_STARFIVE_JH7110_H__ |
9 | #define __PINCTRL_STARFIVE_JH7110_H__ |
10 | |
11 | #include <linux/pinctrl/pinconf-generic.h> |
12 | #include <linux/pinctrl/pinmux.h> |
13 | |
14 | struct jh7110_pinctrl { |
15 | struct device *dev; |
16 | struct gpio_chip gc; |
17 | struct pinctrl_gpio_range gpios; |
18 | raw_spinlock_t lock; |
19 | void __iomem *base; |
20 | struct pinctrl_dev *pctl; |
21 | /* register read/write mutex */ |
22 | struct mutex mutex; |
23 | const struct jh7110_pinctrl_soc_info *info; |
24 | u32 *saved_regs; |
25 | }; |
26 | |
27 | struct jh7110_gpio_irq_reg { |
28 | unsigned int is_reg_base; |
29 | unsigned int ic_reg_base; |
30 | unsigned int ibe_reg_base; |
31 | unsigned int iev_reg_base; |
32 | unsigned int ie_reg_base; |
33 | unsigned int ris_reg_base; |
34 | unsigned int mis_reg_base; |
35 | }; |
36 | |
37 | struct jh7110_pinctrl_soc_info { |
38 | const struct pinctrl_pin_desc *pins; |
39 | unsigned int npins; |
40 | unsigned int ngpios; |
41 | unsigned int gc_base; |
42 | |
43 | /* gpio dout/doen/din/gpioinput register */ |
44 | unsigned int dout_reg_base; |
45 | unsigned int dout_mask; |
46 | unsigned int doen_reg_base; |
47 | unsigned int doen_mask; |
48 | unsigned int gpi_reg_base; |
49 | unsigned int gpi_mask; |
50 | unsigned int gpioin_reg_base; |
51 | |
52 | const struct jh7110_gpio_irq_reg *irq_reg; |
53 | |
54 | unsigned int nsaved_regs; |
55 | |
56 | /* generic pinmux */ |
57 | int (*jh7110_set_one_pin_mux)(struct jh7110_pinctrl *sfp, |
58 | unsigned int pin, |
59 | unsigned int din, u32 dout, |
60 | u32 doen, u32 func); |
61 | /* gpio chip */ |
62 | int (*jh7110_get_padcfg_base)(struct jh7110_pinctrl *sfp, |
63 | unsigned int pin); |
64 | void (*jh7110_gpio_irq_handler)(struct irq_desc *desc); |
65 | int (*jh7110_gpio_init_hw)(struct gpio_chip *gc); |
66 | }; |
67 | |
68 | void jh7110_set_gpiomux(struct jh7110_pinctrl *sfp, unsigned int pin, |
69 | unsigned int din, u32 dout, u32 doen); |
70 | int jh7110_pinctrl_probe(struct platform_device *pdev); |
71 | struct jh7110_pinctrl *jh7110_from_irq_desc(struct irq_desc *desc); |
72 | extern const struct dev_pm_ops jh7110_pinctrl_pm_ops; |
73 | |
74 | #endif /* __PINCTRL_STARFIVE_JH7110_H__ */ |
75 | |