1 // SPDX-License-Identifier: GPL-2.0
3 * PEF2256 also known as FALC56 driver
5 * Copyright 2023 CS GROUP France
7 * Author: Herve Codina <herve.codina@bootlin.com>
10 #include <linux/bitfield.h>
11 #include <linux/framer/pef2256.h>
12 #include <linux/module.h>
14 #include <linux/pinctrl/pinctrl.h>
15 #include <linux/pinctrl/pinconf-generic.h>
16 #include <linux/pinctrl/pinmux.h>
17 #include <linux/platform_device.h>
18 #include <linux/regmap.h>
19 #include <linux/slab.h>
21 /* Port Configuration 1..4 */
22 #define PEF2256_PC1 0x80
23 #define PEF2256_PC2 0x81
24 #define PEF2256_PC3 0x82
25 #define PEF2256_PC4 0x83
26 #define PEF2256_12_PC_RPC_MASK GENMASK(6, 4)
27 #define PEF2256_12_PC_RPC_SYPR FIELD_PREP_CONST(PEF2256_12_PC_RPC_MASK, 0x0)
28 #define PEF2256_12_PC_RPC_RFM FIELD_PREP_CONST(PEF2256_12_PC_RPC_MASK, 0x1)
29 #define PEF2256_12_PC_RPC_RFMB FIELD_PREP_CONST(PEF2256_12_PC_RPC_MASK, 0x2)
30 #define PEF2256_12_PC_RPC_RSIGM FIELD_PREP_CONST(PEF2256_12_PC_RPC_MASK, 0x3)
31 #define PEF2256_12_PC_RPC_RSIG FIELD_PREP_CONST(PEF2256_12_PC_RPC_MASK, 0x4)
32 #define PEF2256_12_PC_RPC_DLR FIELD_PREP_CONST(PEF2256_12_PC_RPC_MASK, 0x5)
33 #define PEF2256_12_PC_RPC_FREEZE FIELD_PREP_CONST(PEF2256_12_PC_RPC_MASK, 0x6)
34 #define PEF2256_12_PC_RPC_RFSP FIELD_PREP_CONST(PEF2256_12_PC_RPC_MASK, 0x7)
35 #define PEF2256_12_PC_XPC_MASK GENMASK(4, 0)
36 #define PEF2256_12_PC_XPC_SYPX FIELD_PREP_CONST(PEF2256_12_PC_XPC_MASK, 0x0)
37 #define PEF2256_12_PC_XPC_XFMS FIELD_PREP_CONST(PEF2256_12_PC_XPC_MASK, 0x1)
38 #define PEF2256_12_PC_XPC_XSIG FIELD_PREP_CONST(PEF2256_12_PC_XPC_MASK, 0x2)
39 #define PEF2256_12_PC_XPC_TCLK FIELD_PREP_CONST(PEF2256_12_PC_XPC_MASK, 0x3)
40 #define PEF2256_12_PC_XPC_XMFB FIELD_PREP_CONST(PEF2256_12_PC_XPC_MASK, 0x4)
41 #define PEF2256_12_PC_XPC_XSIGM FIELD_PREP_CONST(PEF2256_12_PC_XPC_MASK, 0x5)
42 #define PEF2256_12_PC_XPC_DLX FIELD_PREP_CONST(PEF2256_12_PC_XPC_MASK, 0x6)
43 #define PEF2256_12_PC_XPC_XCLK FIELD_PREP_CONST(PEF2256_12_PC_XPC_MASK, 0x7)
44 #define PEF2256_12_PC_XPC_XLT FIELD_PREP_CONST(PEF2256_12_PC_XPC_MASK, 0x8)
45 #define PEF2256_2X_PC_RPC_MASK GENMASK(7, 4)
46 #define PEF2256_2X_PC_RPC_SYPR FIELD_PREP_CONST(PEF2256_2X_PC_RPC_MASK, 0x0)
47 #define PEF2256_2X_PC_RPC_RFM FIELD_PREP_CONST(PEF2256_2X_PC_RPC_MASK, 0x1)
48 #define PEF2256_2X_PC_RPC_RFMB FIELD_PREP_CONST(PEF2256_2X_PC_RPC_MASK, 0x2)
49 #define PEF2256_2X_PC_RPC_RSIGM FIELD_PREP_CONST(PEF2256_2X_PC_RPC_MASK, 0x3)
50 #define PEF2256_2X_PC_RPC_RSIG FIELD_PREP_CONST(PEF2256_2X_PC_RPC_MASK, 0x4)
51 #define PEF2256_2X_PC_RPC_DLR FIELD_PREP_CONST(PEF2256_2X_PC_RPC_MASK, 0x5)
52 #define PEF2256_2X_PC_RPC_FREEZE FIELD_PREP_CONST(PEF2256_2X_PC_RPC_MASK, 0x6)
53 #define PEF2256_2X_PC_RPC_RFSP FIELD_PREP_CONST(PEF2256_2X_PC_RPC_MASK, 0x7)
54 #define PEF2256_2X_PC_RPC_GPI FIELD_PREP_CONST(PEF2256_2X_PC_RPC_MASK, 0x9)
55 #define PEF2256_2X_PC_RPC_GPOH FIELD_PREP_CONST(PEF2256_2X_PC_RPC_MASK, 0xa)
56 #define PEF2256_2X_PC_RPC_GPOL FIELD_PREP_CONST(PEF2256_2X_PC_RPC_MASK, 0xb)
57 #define PEF2256_2X_PC_RPC_LOS FIELD_PREP_CONST(PEF2256_2X_PC_RPC_MASK, 0xc)
58 #define PEF2256_2X_PC_XPC_MASK GENMASK(3, 0)
59 #define PEF2256_2X_PC_XPC_SYPX FIELD_PREP_CONST(PEF2256_2X_PC_XPC_MASK, 0x0)
60 #define PEF2256_2X_PC_XPC_XFMS FIELD_PREP_CONST(PEF2256_2X_PC_XPC_MASK, 0x1)
61 #define PEF2256_2X_PC_XPC_XSIG FIELD_PREP_CONST(PEF2256_2X_PC_XPC_MASK, 0x2)
62 #define PEF2256_2X_PC_XPC_TCLK FIELD_PREP_CONST(PEF2256_2X_PC_XPC_MASK, 0x3)
63 #define PEF2256_2X_PC_XPC_XMFB FIELD_PREP_CONST(PEF2256_2X_PC_XPC_MASK, 0x4)
64 #define PEF2256_2X_PC_XPC_XSIGM FIELD_PREP_CONST(PEF2256_2X_PC_XPC_MASK, 0x5)
65 #define PEF2256_2X_PC_XPC_DLX FIELD_PREP_CONST(PEF2256_2X_PC_XPC_MASK, 0x6)
66 #define PEF2256_2X_PC_XPC_XCLK FIELD_PREP_CONST(PEF2256_2X_PC_XPC_MASK, 0x7)
67 #define PEF2256_2X_PC_XPC_XLT FIELD_PREP_CONST(PEF2256_2X_PC_XPC_MASK, 0x8)
68 #define PEF2256_2X_PC_XPC_GPI FIELD_PREP_CONST(PEF2256_2X_PC_XPC_MASK, 0x9)
69 #define PEF2256_2X_PC_XPC_GPOH FIELD_PREP_CONST(PEF2256_2X_PC_XPC_MASK, 0xa)
70 #define PEF2256_2X_PC_XPC_GPOL FIELD_PREP_CONST(PEF2256_2X_PC_XPC_MASK, 0xb)
72 struct pef2256_pinreg_desc
{
77 struct pef2256_function_desc
{
79 const char * const*groups
;
84 struct pef2256_pinctrl
{
86 struct regmap
*regmap
;
87 enum pef2256_version version
;
88 struct pinctrl_desc pctrl_desc
;
89 const struct pef2256_function_desc
*functions
;
90 unsigned int nfunctions
;
93 static int pef2256_get_groups_count(struct pinctrl_dev
*pctldev
)
95 struct pef2256_pinctrl
*pef2256
= pinctrl_dev_get_drvdata(pctldev
);
97 /* We map 1 group <-> 1 pin */
98 return pef2256
->pctrl_desc
.npins
;
101 static const char *pef2256_get_group_name(struct pinctrl_dev
*pctldev
,
102 unsigned int selector
)
104 struct pef2256_pinctrl
*pef2256
= pinctrl_dev_get_drvdata(pctldev
);
106 /* We map 1 group <-> 1 pin */
107 return pef2256
->pctrl_desc
.pins
[selector
].name
;
110 static int pef2256_get_group_pins(struct pinctrl_dev
*pctldev
, unsigned int selector
,
111 const unsigned int **pins
,
112 unsigned int *num_pins
)
114 struct pef2256_pinctrl
*pef2256
= pinctrl_dev_get_drvdata(pctldev
);
116 /* We map 1 group <-> 1 pin */
117 *pins
= &pef2256
->pctrl_desc
.pins
[selector
].number
;
123 static const struct pinctrl_ops pef2256_pctlops
= {
124 .get_groups_count
= pef2256_get_groups_count
,
125 .get_group_name
= pef2256_get_group_name
,
126 .get_group_pins
= pef2256_get_group_pins
,
127 .dt_node_to_map
= pinconf_generic_dt_node_to_map_pin
,
128 .dt_free_map
= pinconf_generic_dt_free_map
,
131 static int pef2256_get_functions_count(struct pinctrl_dev
*pctldev
)
133 struct pef2256_pinctrl
*pef2256
= pinctrl_dev_get_drvdata(pctldev
);
135 return pef2256
->nfunctions
;
138 static const char *pef2256_get_function_name(struct pinctrl_dev
*pctldev
,
139 unsigned int selector
)
141 struct pef2256_pinctrl
*pef2256
= pinctrl_dev_get_drvdata(pctldev
);
143 return pef2256
->functions
[selector
].name
;
146 static int pef2256_get_function_groups(struct pinctrl_dev
*pctldev
, unsigned int selector
,
147 const char * const **groups
,
148 unsigned * const num_groups
)
150 struct pef2256_pinctrl
*pef2256
= pinctrl_dev_get_drvdata(pctldev
);
152 *groups
= pef2256
->functions
[selector
].groups
;
153 *num_groups
= pef2256
->functions
[selector
].ngroups
;
157 static int pef2256_set_mux(struct pinctrl_dev
*pctldev
, unsigned int func_selector
,
158 unsigned int group_selector
)
160 struct pef2256_pinctrl
*pef2256
= pinctrl_dev_get_drvdata(pctldev
);
161 const struct pef2256_pinreg_desc
*pinreg_desc
;
164 /* We map 1 group <-> 1 pin */
165 pinreg_desc
= pef2256
->pctrl_desc
.pins
[group_selector
].drv_data
;
166 func_val
= pef2256
->functions
[func_selector
].func_val
;
168 return regmap_update_bits(pef2256
->regmap
, pinreg_desc
->offset
,
169 pinreg_desc
->mask
, func_val
);
172 static const struct pinmux_ops pef2256_pmxops
= {
173 .get_functions_count
= pef2256_get_functions_count
,
174 .get_function_name
= pef2256_get_function_name
,
175 .get_function_groups
= pef2256_get_function_groups
,
176 .set_mux
= pef2256_set_mux
,
179 #define PEF2256_PINCTRL_PIN(_number, _name, _offset, _mask) { \
182 .drv_data = &(struct pef2256_pinreg_desc) { \
188 static const struct pinctrl_pin_desc pef2256_v12_pins
[] = {
189 PEF2256_PINCTRL_PIN(0, "RPA", PEF2256_PC1
, PEF2256_12_PC_RPC_MASK
),
190 PEF2256_PINCTRL_PIN(1, "RPB", PEF2256_PC2
, PEF2256_12_PC_RPC_MASK
),
191 PEF2256_PINCTRL_PIN(2, "RPC", PEF2256_PC3
, PEF2256_12_PC_RPC_MASK
),
192 PEF2256_PINCTRL_PIN(3, "RPD", PEF2256_PC4
, PEF2256_12_PC_RPC_MASK
),
193 PEF2256_PINCTRL_PIN(4, "XPA", PEF2256_PC1
, PEF2256_12_PC_XPC_MASK
),
194 PEF2256_PINCTRL_PIN(5, "XPB", PEF2256_PC2
, PEF2256_12_PC_XPC_MASK
),
195 PEF2256_PINCTRL_PIN(6, "XPC", PEF2256_PC3
, PEF2256_12_PC_XPC_MASK
),
196 PEF2256_PINCTRL_PIN(7, "XPD", PEF2256_PC4
, PEF2256_12_PC_XPC_MASK
),
199 static const struct pinctrl_pin_desc pef2256_v2x_pins
[] = {
200 PEF2256_PINCTRL_PIN(0, "RPA", PEF2256_PC1
, PEF2256_2X_PC_RPC_MASK
),
201 PEF2256_PINCTRL_PIN(1, "RPB", PEF2256_PC2
, PEF2256_2X_PC_RPC_MASK
),
202 PEF2256_PINCTRL_PIN(2, "RPC", PEF2256_PC3
, PEF2256_2X_PC_RPC_MASK
),
203 PEF2256_PINCTRL_PIN(3, "RPD", PEF2256_PC4
, PEF2256_2X_PC_RPC_MASK
),
204 PEF2256_PINCTRL_PIN(4, "XPA", PEF2256_PC1
, PEF2256_2X_PC_XPC_MASK
),
205 PEF2256_PINCTRL_PIN(5, "XPB", PEF2256_PC2
, PEF2256_2X_PC_XPC_MASK
),
206 PEF2256_PINCTRL_PIN(6, "XPC", PEF2256_PC3
, PEF2256_2X_PC_XPC_MASK
),
207 PEF2256_PINCTRL_PIN(7, "XPD", PEF2256_PC4
, PEF2256_2X_PC_XPC_MASK
),
210 static const char *const pef2256_rp_groups
[] = { "RPA", "RPB", "RPC", "RPD" };
211 static const char *const pef2256_xp_groups
[] = { "XPA", "XPB", "XPC", "XPD" };
212 static const char *const pef2256_all_groups
[] = { "RPA", "RPB", "RPC", "RPD",
213 "XPA", "XPB", "XPC", "XPD" };
215 #define PEF2256_FUNCTION(_name, _func_val, _groups) { \
218 .ngroups = ARRAY_SIZE(_groups), \
219 .func_val = _func_val, \
222 static const struct pef2256_function_desc pef2256_v2x_functions
[] = {
223 PEF2256_FUNCTION("SYPR", PEF2256_2X_PC_RPC_SYPR
, pef2256_rp_groups
),
224 PEF2256_FUNCTION("RFM", PEF2256_2X_PC_RPC_RFM
, pef2256_rp_groups
),
225 PEF2256_FUNCTION("RFMB", PEF2256_2X_PC_RPC_RFMB
, pef2256_rp_groups
),
226 PEF2256_FUNCTION("RSIGM", PEF2256_2X_PC_RPC_RSIGM
, pef2256_rp_groups
),
227 PEF2256_FUNCTION("RSIG", PEF2256_2X_PC_RPC_RSIG
, pef2256_rp_groups
),
228 PEF2256_FUNCTION("DLR", PEF2256_2X_PC_RPC_DLR
, pef2256_rp_groups
),
229 PEF2256_FUNCTION("FREEZE", PEF2256_2X_PC_RPC_FREEZE
, pef2256_rp_groups
),
230 PEF2256_FUNCTION("RFSP", PEF2256_2X_PC_RPC_RFSP
, pef2256_rp_groups
),
231 PEF2256_FUNCTION("LOS", PEF2256_2X_PC_RPC_LOS
, pef2256_rp_groups
),
233 PEF2256_FUNCTION("SYPX", PEF2256_2X_PC_XPC_SYPX
, pef2256_xp_groups
),
234 PEF2256_FUNCTION("XFMS", PEF2256_2X_PC_XPC_XFMS
, pef2256_xp_groups
),
235 PEF2256_FUNCTION("XSIG", PEF2256_2X_PC_XPC_XSIG
, pef2256_xp_groups
),
236 PEF2256_FUNCTION("TCLK", PEF2256_2X_PC_XPC_TCLK
, pef2256_xp_groups
),
237 PEF2256_FUNCTION("XMFB", PEF2256_2X_PC_XPC_XMFB
, pef2256_xp_groups
),
238 PEF2256_FUNCTION("XSIGM", PEF2256_2X_PC_XPC_XSIGM
, pef2256_xp_groups
),
239 PEF2256_FUNCTION("DLX", PEF2256_2X_PC_XPC_DLX
, pef2256_xp_groups
),
240 PEF2256_FUNCTION("XCLK", PEF2256_2X_PC_XPC_XCLK
, pef2256_xp_groups
),
241 PEF2256_FUNCTION("XLT", PEF2256_2X_PC_XPC_XLT
, pef2256_xp_groups
),
243 PEF2256_FUNCTION("GPI", PEF2256_2X_PC_RPC_GPI
| PEF2256_2X_PC_XPC_GPI
,
245 PEF2256_FUNCTION("GPOH", PEF2256_2X_PC_RPC_GPOH
| PEF2256_2X_PC_XPC_GPOH
,
247 PEF2256_FUNCTION("GPOL", PEF2256_2X_PC_RPC_GPOL
| PEF2256_2X_PC_XPC_GPOL
,
251 static const struct pef2256_function_desc pef2256_v12_functions
[] = {
252 PEF2256_FUNCTION("SYPR", PEF2256_12_PC_RPC_SYPR
, pef2256_rp_groups
),
253 PEF2256_FUNCTION("RFM", PEF2256_12_PC_RPC_RFM
, pef2256_rp_groups
),
254 PEF2256_FUNCTION("RFMB", PEF2256_12_PC_RPC_RFMB
, pef2256_rp_groups
),
255 PEF2256_FUNCTION("RSIGM", PEF2256_12_PC_RPC_RSIGM
, pef2256_rp_groups
),
256 PEF2256_FUNCTION("RSIG", PEF2256_12_PC_RPC_RSIG
, pef2256_rp_groups
),
257 PEF2256_FUNCTION("DLR", PEF2256_12_PC_RPC_DLR
, pef2256_rp_groups
),
258 PEF2256_FUNCTION("FREEZE", PEF2256_12_PC_RPC_FREEZE
, pef2256_rp_groups
),
259 PEF2256_FUNCTION("RFSP", PEF2256_12_PC_RPC_RFSP
, pef2256_rp_groups
),
261 PEF2256_FUNCTION("SYPX", PEF2256_12_PC_XPC_SYPX
, pef2256_xp_groups
),
262 PEF2256_FUNCTION("XFMS", PEF2256_12_PC_XPC_XFMS
, pef2256_xp_groups
),
263 PEF2256_FUNCTION("XSIG", PEF2256_12_PC_XPC_XSIG
, pef2256_xp_groups
),
264 PEF2256_FUNCTION("TCLK", PEF2256_12_PC_XPC_TCLK
, pef2256_xp_groups
),
265 PEF2256_FUNCTION("XMFB", PEF2256_12_PC_XPC_XMFB
, pef2256_xp_groups
),
266 PEF2256_FUNCTION("XSIGM", PEF2256_12_PC_XPC_XSIGM
, pef2256_xp_groups
),
267 PEF2256_FUNCTION("DLX", PEF2256_12_PC_XPC_DLX
, pef2256_xp_groups
),
268 PEF2256_FUNCTION("XCLK", PEF2256_12_PC_XPC_XCLK
, pef2256_xp_groups
),
269 PEF2256_FUNCTION("XLT", PEF2256_12_PC_XPC_XLT
, pef2256_xp_groups
),
272 static int pef2256_register_pinctrl(struct pef2256_pinctrl
*pef2256
)
274 struct pinctrl_dev
*pctrl
;
276 pef2256
->pctrl_desc
.name
= dev_name(pef2256
->dev
);
277 pef2256
->pctrl_desc
.owner
= THIS_MODULE
;
278 pef2256
->pctrl_desc
.pctlops
= &pef2256_pctlops
;
279 pef2256
->pctrl_desc
.pmxops
= &pef2256_pmxops
;
280 if (pef2256
->version
== PEF2256_VERSION_1_2
) {
281 pef2256
->pctrl_desc
.pins
= pef2256_v12_pins
;
282 pef2256
->pctrl_desc
.npins
= ARRAY_SIZE(pef2256_v12_pins
);
283 pef2256
->functions
= pef2256_v12_functions
;
284 pef2256
->nfunctions
= ARRAY_SIZE(pef2256_v12_functions
);
286 pef2256
->pctrl_desc
.pins
= pef2256_v2x_pins
;
287 pef2256
->pctrl_desc
.npins
= ARRAY_SIZE(pef2256_v2x_pins
);
288 pef2256
->functions
= pef2256_v2x_functions
;
289 pef2256
->nfunctions
= ARRAY_SIZE(pef2256_v2x_functions
);
292 pctrl
= devm_pinctrl_register(pef2256
->dev
, &pef2256
->pctrl_desc
, pef2256
);
294 return dev_err_probe(pef2256
->dev
, PTR_ERR(pctrl
),
295 "pinctrl driver registration failed\n");
300 static void pef2256_reset_pinmux(struct pef2256_pinctrl
*pef2256
)
304 * Reset values cannot be used.
305 * They define the SYPR/SYPX pin mux for all the RPx and XPx pins and
306 * Only one pin can be muxed to SYPR and one pin can be muxed to SYPX.
307 * Choose here an other reset value.
309 if (pef2256
->version
== PEF2256_VERSION_1_2
)
310 val
= PEF2256_12_PC_XPC_XCLK
| PEF2256_12_PC_RPC_RFSP
;
312 val
= PEF2256_2X_PC_XPC_GPI
| PEF2256_2X_PC_RPC_GPI
;
314 regmap_write(pef2256
->regmap
, PEF2256_PC1
, val
);
315 regmap_write(pef2256
->regmap
, PEF2256_PC2
, val
);
316 regmap_write(pef2256
->regmap
, PEF2256_PC3
, val
);
317 regmap_write(pef2256
->regmap
, PEF2256_PC4
, val
);
320 static int pef2256_pinctrl_probe(struct platform_device
*pdev
)
322 struct pef2256_pinctrl
*pef2256_pinctrl
;
323 struct pef2256
*pef2256
;
326 pef2256_pinctrl
= devm_kzalloc(&pdev
->dev
, sizeof(*pef2256_pinctrl
), GFP_KERNEL
);
327 if (!pef2256_pinctrl
)
330 device_set_node(&pdev
->dev
, dev_fwnode(pdev
->dev
.parent
));
332 pef2256
= dev_get_drvdata(pdev
->dev
.parent
);
334 pef2256_pinctrl
->dev
= &pdev
->dev
;
335 pef2256_pinctrl
->regmap
= pef2256_get_regmap(pef2256
);
336 pef2256_pinctrl
->version
= pef2256_get_version(pef2256
);
338 platform_set_drvdata(pdev
, pef2256_pinctrl
);
340 pef2256_reset_pinmux(pef2256_pinctrl
);
341 ret
= pef2256_register_pinctrl(pef2256_pinctrl
);
348 static struct platform_driver pef2256_pinctrl_driver
= {
350 .name
= "lantiq-pef2256-pinctrl",
352 .probe
= pef2256_pinctrl_probe
,
354 module_platform_driver(pef2256_pinctrl_driver
);
356 MODULE_AUTHOR("Herve Codina <herve.codina@bootlin.com>");
357 MODULE_DESCRIPTION("PEF2256 pin controller driver");
358 MODULE_LICENSE("GPL");