1 /* SPDX-License-Identifier: GPL-2.0 */
2 /*
3 * Copyright (C) 2024 Inochi Amaoto <inochiama@outlook.com>
4 */
5
6 #ifndef _PINCTRL_SOPHGO_CV18XX_H
7 #define _PINCTRL_SOPHGO_CV18XX_H
8
9 #include <linux/bits.h>
10 #include <linux/bitfield.h>
11 #include <linux/device.h>
12 #include <linux/mutex.h>
13 #include <linux/spinlock.h>
14 #include <linux/platform_device.h>
15 #include <linux/pinctrl/pinctrl.h>
16 #include <linux/pinctrl/pinconf.h>
17
18 enum cv1800_pin_io_type {
19 IO_TYPE_1V8_ONLY = 0,
20 IO_TYPE_1V8_OR_3V3 = 1,
21 IO_TYPE_AUDIO = 2,
22 IO_TYPE_ETH = 3
23 };
24
25 #define CV1800_PINCONF_AREA_SYS 0
26 #define CV1800_PINCONF_AREA_RTC 1
27
28 struct cv1800_pinmux {
29 u16 offset;
30 u8 area;
31 u8 max;
32 };
33
34 struct cv1800_pinmux2 {
35 u16 offset;
36 u8 area;
37 u8 max;
38 u8 pfunc;
39 };
40
41 struct cv1800_pinconf {
42 u16 offset;
43 u8 area;
44 };
45
46 #define CV1800_PIN_HAVE_MUX2 BIT(0)
47 #define CV1800_PIN_IO_TYPE GENMASK(2, 1)
48
49 #define CV1800_PIN_FLAG_IO_TYPE(type) \
50 FIELD_PREP_CONST(CV1800_PIN_IO_TYPE, type)
51 struct cv1800_pin {
52 u16 pin;
53 u16 flags;
54 u8 power_domain;
55 struct cv1800_pinmux mux;
56 struct cv1800_pinmux2 mux2;
57 struct cv1800_pinconf conf;
58 };
59
60 #define PIN_POWER_STATE_1V8 1800
61 #define PIN_POWER_STATE_3V3 3300
62
63 /**
64 * struct cv1800_vddio_cfg_ops - pin vddio operations
65 *
66 * @get_pull_up: get resistor for pull up;
67 * @get_pull_down: get resistor for pull down.
68 * @get_oc_map: get mapping for typical low level output current value to
69 * register value map.
70 * @get_schmitt_map: get mapping for register value to typical schmitt
71 * threshold.
72 */
73 struct cv1800_vddio_cfg_ops {
74 int (*get_pull_up)(struct cv1800_pin *pin, const u32 *psmap);
75 int (*get_pull_down)(struct cv1800_pin *pin, const u32 *psmap);
76 int (*get_oc_map)(struct cv1800_pin *pin, const u32 *psmap,
77 const u32 **map);
78 int (*get_schmitt_map)(struct cv1800_pin *pin, const u32 *psmap,
79 const u32 **map);
80 };
81
82 struct cv1800_pinctrl_data {
83 const struct pinctrl_pin_desc *pins;
84 const struct cv1800_pin *pindata;
85 const char * const *pdnames;
86 const struct cv1800_vddio_cfg_ops *vddio_ops;
87 u16 npins;
88 u16 npd;
89 };
90
cv1800_pin_io_type(struct cv1800_pin * pin)91 static inline enum cv1800_pin_io_type cv1800_pin_io_type(struct cv1800_pin *pin)
92 {
93 return FIELD_GET(CV1800_PIN_IO_TYPE, pin->flags);
94 };
95
96 int cv1800_pinctrl_probe(struct platform_device *pdev);
97
98 #define CV1800_FUNC_PIN(_id, _power_domain, _type, \
99 _mux_area, _mux_offset, _mux_func_max) \
100 { \
101 .pin = (_id), \
102 .power_domain = (_power_domain), \
103 .flags = CV1800_PIN_FLAG_IO_TYPE(_type), \
104 .mux = { \
105 .area = (_mux_area), \
106 .offset = (_mux_offset), \
107 .max = (_mux_func_max), \
108 }, \
109 }
110
111 #define CV1800_GENERAL_PIN(_id, _power_domain, _type, \
112 _mux_area, _mux_offset, _mux_func_max, \
113 _conf_area, _conf_offset) \
114 { \
115 .pin = (_id), \
116 .power_domain = (_power_domain), \
117 .flags = CV1800_PIN_FLAG_IO_TYPE(_type), \
118 .mux = { \
119 .area = (_mux_area), \
120 .offset = (_mux_offset), \
121 .max = (_mux_func_max), \
122 }, \
123 .conf = { \
124 .area = (_conf_area), \
125 .offset = (_conf_offset), \
126 }, \
127 }
128
129 #define CV1800_GENERATE_PIN_MUX2(_id, _power_domain, _type, \
130 _mux_area, _mux_offset, _mux_func_max, \
131 _mux2_area, _mux2_offset, \
132 _mux2_func_max, \
133 _conf_area, _conf_offset) \
134 { \
135 .pin = (_id), \
136 .power_domain = (_power_domain), \
137 .flags = CV1800_PIN_FLAG_IO_TYPE(_type) | \
138 CV1800_PIN_HAVE_MUX2, \
139 .mux = { \
140 .area = (_mux_area), \
141 .offset = (_mux_offset), \
142 .max = (_mux_func_max), \
143 }, \
144 .mux2 = { \
145 .area = (_mux2_area), \
146 .offset = (_mux2_offset), \
147 .max = (_mux2_func_max), \
148 }, \
149 .conf = { \
150 .area = (_conf_area), \
151 .offset = (_conf_offset), \
152 }, \
153 }
154
155 #endif
156