1 | /* SPDX-License-Identifier: GPL-2.0-only */ |
2 | /* |
3 | * Copyright (c) 2016-2019, The Linux Foundation. All rights reserved. |
4 | * Copyright (c) 2020 Linaro Ltd. |
5 | */ |
6 | #ifndef __PINCTRL_LPASS_LPI_H__ |
7 | #define __PINCTRL_LPASS_LPI_H__ |
8 | |
9 | #include <linux/array_size.h> |
10 | #include <linux/bits.h> |
11 | |
12 | #include "../core.h" |
13 | |
14 | struct platform_device; |
15 | |
16 | struct pinctrl_pin_desc; |
17 | |
18 | #define LPI_SLEW_RATE_CTL_REG 0xa000 |
19 | #define LPI_TLMM_REG_OFFSET 0x1000 |
20 | #define LPI_SLEW_RATE_MAX 0x03 |
21 | #define LPI_SLEW_BITS_SIZE 0x02 |
22 | #define LPI_SLEW_RATE_MASK GENMASK(1, 0) |
23 | #define LPI_GPIO_CFG_REG 0x00 |
24 | #define LPI_GPIO_PULL_MASK GENMASK(1, 0) |
25 | #define LPI_GPIO_FUNCTION_MASK GENMASK(5, 2) |
26 | #define LPI_GPIO_OUT_STRENGTH_MASK GENMASK(8, 6) |
27 | #define LPI_GPIO_OE_MASK BIT(9) |
28 | #define LPI_GPIO_VALUE_REG 0x04 |
29 | #define LPI_GPIO_VALUE_IN_MASK BIT(0) |
30 | #define LPI_GPIO_VALUE_OUT_MASK BIT(1) |
31 | |
32 | #define LPI_GPIO_BIAS_DISABLE 0x0 |
33 | #define LPI_GPIO_PULL_DOWN 0x1 |
34 | #define LPI_GPIO_KEEPER 0x2 |
35 | #define LPI_GPIO_PULL_UP 0x3 |
36 | #define LPI_GPIO_DS_TO_VAL(v) (v / 2 - 1) |
37 | #define LPI_NO_SLEW -1 |
38 | |
39 | #define LPI_FUNCTION(fname) \ |
40 | [LPI_MUX_##fname] = { \ |
41 | .name = #fname, \ |
42 | .groups = fname##_groups, \ |
43 | .ngroups = ARRAY_SIZE(fname##_groups), \ |
44 | } |
45 | |
46 | #define LPI_PINGROUP(id, soff, f1, f2, f3, f4) \ |
47 | { \ |
48 | .pin = id, \ |
49 | .slew_offset = soff, \ |
50 | .funcs = (int[]){ \ |
51 | LPI_MUX_gpio, \ |
52 | LPI_MUX_##f1, \ |
53 | LPI_MUX_##f2, \ |
54 | LPI_MUX_##f3, \ |
55 | LPI_MUX_##f4, \ |
56 | }, \ |
57 | .nfuncs = 5, \ |
58 | } |
59 | |
60 | /* |
61 | * Slew rate control is done in the same register as rest of the |
62 | * pin configuration. |
63 | */ |
64 | #define LPI_FLAG_SLEW_RATE_SAME_REG BIT(0) |
65 | |
66 | struct lpi_pingroup { |
67 | unsigned int pin; |
68 | /* Bit offset in slew register for SoundWire pins only */ |
69 | int slew_offset; |
70 | unsigned int *funcs; |
71 | unsigned int nfuncs; |
72 | }; |
73 | |
74 | struct lpi_function { |
75 | const char *name; |
76 | const char * const *groups; |
77 | unsigned int ngroups; |
78 | }; |
79 | |
80 | struct lpi_pinctrl_variant_data { |
81 | const struct pinctrl_pin_desc *pins; |
82 | int npins; |
83 | const struct lpi_pingroup *groups; |
84 | int ngroups; |
85 | const struct lpi_function *functions; |
86 | int nfunctions; |
87 | unsigned int flags; |
88 | }; |
89 | |
90 | int lpi_pinctrl_probe(struct platform_device *pdev); |
91 | void lpi_pinctrl_remove(struct platform_device *pdev); |
92 | |
93 | #endif /*__PINCTRL_LPASS_LPI_H__*/ |
94 | |