WIP: merge_config
[platform/kernel/linux-starfive.git] / drivers / pinctrl / starfive / pinctrl-starfive.h
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 __DRIVERS_PINCTRL_STARFIVE_H__
9 #define __DRIVERS_PINCTRL_STARFIVE_H__
10
11 #include <linux/pinctrl/pinconf-generic.h>
12 #include <linux/pinctrl/pinmux.h>
13
14 struct starfive_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 starfive_pinctrl_soc_info *info;
24 };
25
26 struct starfive_gpio_irq_reg {
27         unsigned int is_reg_base;
28         unsigned int ic_reg_base;
29         unsigned int ibe_reg_base;
30         unsigned int iev_reg_base;
31         unsigned int ie_reg_base;
32         unsigned int ris_reg_base;
33         unsigned int mis_reg_base;
34 };
35
36 struct starfive_pinctrl_soc_info {
37         const struct pinctrl_pin_desc *pins;
38         unsigned int npins;
39         unsigned int ngpios;
40         unsigned int gc_base;
41         unsigned int flags;
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 starfive_gpio_irq_reg *irq_reg;
53
54         /* generic pinmux */
55         int (*starfive_set_one_pin_mux)(struct starfive_pinctrl *sfp,
56                                         unsigned int pin,
57                                         unsigned int din, u32 dout,
58                                         u32 doen, u32 func);
59         /* gpio chip */
60         int (*starfive_get_padcfg_base)(struct starfive_pinctrl *sfp,
61                                         unsigned int pin);
62         void (*starfive_gpio_irq_handler)(struct irq_desc *desc);
63         int (*starfive_gpio_init_hw)(struct gpio_chip *gc);
64 };
65
66 void starfive_set_gpiomux(struct starfive_pinctrl *sfp, unsigned int pin,
67                           unsigned int din, u32 dout, u32 doen);
68 int starfive_pinctrl_probe(struct platform_device *pdev,
69                            const struct starfive_pinctrl_soc_info *info);
70 struct starfive_pinctrl *starfive_from_irq_desc(struct irq_desc *desc);
71
72 #endif /* __DRIVERS_PINCTRL_STARFIVE_H__ */