Merge tag 'drm-next-2023-11-10' of git://anongit.freedesktop.org/drm/drm
[linux-2.6-microblaze.git] / drivers / pinctrl / qcom / pinctrl-lpass-lpi.h
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/bits.h>
10 #include <linux/kernel.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                 .group.name = "gpio" #id,                       \
49                 .group.pins = gpio##id##_pins,          \
50                 .pin = id,                              \
51                 .slew_offset = soff,                    \
52                 .group.num_pins = ARRAY_SIZE(gpio##id##_pins),  \
53                 .funcs = (int[]){                       \
54                         LPI_MUX_gpio,                   \
55                         LPI_MUX_##f1,                   \
56                         LPI_MUX_##f2,                   \
57                         LPI_MUX_##f3,                   \
58                         LPI_MUX_##f4,                   \
59                 },                                      \
60                 .nfuncs = 5,                            \
61         }
62
63 struct lpi_pingroup {
64         struct group_desc group;
65         unsigned int pin;
66         /* Bit offset in slew register for SoundWire pins only */
67         int slew_offset;
68         unsigned int *funcs;
69         unsigned int nfuncs;
70 };
71
72 struct lpi_function {
73         const char *name;
74         const char * const *groups;
75         unsigned int ngroups;
76 };
77
78 struct lpi_pinctrl_variant_data {
79         const struct pinctrl_pin_desc *pins;
80         int npins;
81         const struct lpi_pingroup *groups;
82         int ngroups;
83         const struct lpi_function *functions;
84         int nfunctions;
85 };
86
87 int lpi_pinctrl_probe(struct platform_device *pdev);
88 void lpi_pinctrl_remove(struct platform_device *pdev);
89
90 #endif /*__PINCTRL_LPASS_LPI_H__*/