1ffd4e739SLakshmi Sowjanya D // SPDX-License-Identifier: GPL-2.0
2ffd4e739SLakshmi Sowjanya D /* Copyright (C) 2020 Intel Corporation */
3ffd4e739SLakshmi Sowjanya D 
4ffd4e739SLakshmi Sowjanya D #include <linux/bitfield.h>
5ffd4e739SLakshmi Sowjanya D #include <linux/bitops.h>
6ffd4e739SLakshmi Sowjanya D #include <linux/gpio/driver.h>
7ffd4e739SLakshmi Sowjanya D #include <linux/interrupt.h>
8ffd4e739SLakshmi Sowjanya D #include <linux/io.h>
9ffd4e739SLakshmi Sowjanya D #include <linux/module.h>
10ffd4e739SLakshmi Sowjanya D 
11ffd4e739SLakshmi Sowjanya D #include <linux/pinctrl/pinconf.h>
12ffd4e739SLakshmi Sowjanya D #include <linux/pinctrl/pinconf-generic.h>
13ffd4e739SLakshmi Sowjanya D #include <linux/pinctrl/pinctrl.h>
14ffd4e739SLakshmi Sowjanya D #include <linux/pinctrl/pinmux.h>
15ffd4e739SLakshmi Sowjanya D 
16ffd4e739SLakshmi Sowjanya D #include <linux/platform_device.h>
17ffd4e739SLakshmi Sowjanya D 
18ffd4e739SLakshmi Sowjanya D #include "core.h"
19ffd4e739SLakshmi Sowjanya D #include "pinmux.h"
20ffd4e739SLakshmi Sowjanya D 
21ffd4e739SLakshmi Sowjanya D /* GPIO data registers' offsets */
22ffd4e739SLakshmi Sowjanya D #define KEEMBAY_GPIO_DATA_OUT		0x000
23ffd4e739SLakshmi Sowjanya D #define KEEMBAY_GPIO_DATA_IN		0x020
24ffd4e739SLakshmi Sowjanya D #define KEEMBAY_GPIO_DATA_IN_RAW	0x040
25ffd4e739SLakshmi Sowjanya D #define KEEMBAY_GPIO_DATA_HIGH		0x060
26ffd4e739SLakshmi Sowjanya D #define KEEMBAY_GPIO_DATA_LOW		0x080
27ffd4e739SLakshmi Sowjanya D 
28ffd4e739SLakshmi Sowjanya D /* GPIO Interrupt and mode registers' offsets */
29ffd4e739SLakshmi Sowjanya D #define KEEMBAY_GPIO_INT_CFG		0x000
30ffd4e739SLakshmi Sowjanya D #define KEEMBAY_GPIO_MODE		0x070
31ffd4e739SLakshmi Sowjanya D 
32ffd4e739SLakshmi Sowjanya D /* GPIO mode register bit fields */
33ffd4e739SLakshmi Sowjanya D #define KEEMBAY_GPIO_MODE_PULLUP_MASK	GENMASK(13, 12)
34ffd4e739SLakshmi Sowjanya D #define KEEMBAY_GPIO_MODE_DRIVE_MASK	GENMASK(8, 7)
35ffd4e739SLakshmi Sowjanya D #define KEEMBAY_GPIO_MODE_INV_MASK	GENMASK(5, 4)
36ffd4e739SLakshmi Sowjanya D #define KEEMBAY_GPIO_MODE_SELECT_MASK	GENMASK(2, 0)
37ffd4e739SLakshmi Sowjanya D #define KEEMBAY_GPIO_MODE_DIR_OVR	BIT(15)
38ffd4e739SLakshmi Sowjanya D #define KEEMBAY_GPIO_MODE_REN		BIT(11)
39ffd4e739SLakshmi Sowjanya D #define KEEMBAY_GPIO_MODE_SCHMITT_EN	BIT(10)
40ffd4e739SLakshmi Sowjanya D #define KEEMBAY_GPIO_MODE_SLEW_RATE	BIT(9)
41ffd4e739SLakshmi Sowjanya D #define KEEMBAY_GPIO_IRQ_ENABLE		BIT(7)
42ffd4e739SLakshmi Sowjanya D #define KEEMBAY_GPIO_MODE_DIR		BIT(3)
43ffd4e739SLakshmi Sowjanya D #define KEEMBAY_GPIO_MODE_DEFAULT	0x7
44ffd4e739SLakshmi Sowjanya D #define KEEMBAY_GPIO_MODE_INV_VAL	0x3
45ffd4e739SLakshmi Sowjanya D 
46ffd4e739SLakshmi Sowjanya D #define KEEMBAY_GPIO_DISABLE		0
47ffd4e739SLakshmi Sowjanya D #define KEEMBAY_GPIO_PULL_UP		1
48ffd4e739SLakshmi Sowjanya D #define KEEMBAY_GPIO_PULL_DOWN		2
49ffd4e739SLakshmi Sowjanya D #define KEEMBAY_GPIO_BUS_HOLD		3
50ffd4e739SLakshmi Sowjanya D #define KEEMBAY_GPIO_NUM_IRQ		8
51ffd4e739SLakshmi Sowjanya D #define KEEMBAY_GPIO_MAX_PER_IRQ	4
52ffd4e739SLakshmi Sowjanya D #define KEEMBAY_GPIO_MAX_PER_REG	32
53ffd4e739SLakshmi Sowjanya D #define KEEMBAY_GPIO_MIN_STRENGTH	2
54ffd4e739SLakshmi Sowjanya D #define KEEMBAY_GPIO_MAX_STRENGTH	12
55ffd4e739SLakshmi Sowjanya D #define KEEMBAY_GPIO_SENSE_LOW		(IRQ_TYPE_LEVEL_LOW | IRQ_TYPE_EDGE_FALLING)
56ffd4e739SLakshmi Sowjanya D 
57ffd4e739SLakshmi Sowjanya D /* GPIO reg address calculation */
58ffd4e739SLakshmi Sowjanya D #define KEEMBAY_GPIO_REG_OFFSET(pin)	((pin) * 4)
59ffd4e739SLakshmi Sowjanya D 
60ffd4e739SLakshmi Sowjanya D /**
61ffd4e739SLakshmi Sowjanya D  * struct keembay_mux_desc - Mux properties of each GPIO pin
62ffd4e739SLakshmi Sowjanya D  * @mode: Pin mode when operating in this function
63ffd4e739SLakshmi Sowjanya D  * @name: Pin function name
64ffd4e739SLakshmi Sowjanya D  */
65ffd4e739SLakshmi Sowjanya D struct keembay_mux_desc {
66ffd4e739SLakshmi Sowjanya D 	u8 mode;
67ffd4e739SLakshmi Sowjanya D 	const char *name;
68ffd4e739SLakshmi Sowjanya D };
69ffd4e739SLakshmi Sowjanya D 
70ffd4e739SLakshmi Sowjanya D #define KEEMBAY_PIN_DESC(pin_number, pin_name, ...) {	\
71ffd4e739SLakshmi Sowjanya D 	.number = pin_number,				\
72ffd4e739SLakshmi Sowjanya D 	.name = pin_name,				\
73ffd4e739SLakshmi Sowjanya D 	.drv_data = &(struct keembay_mux_desc[]) {	\
74ffd4e739SLakshmi Sowjanya D 		    __VA_ARGS__, { } },			\
75ffd4e739SLakshmi Sowjanya D }							\
76ffd4e739SLakshmi Sowjanya D 
77ffd4e739SLakshmi Sowjanya D #define KEEMBAY_MUX(pin_mode, pin_function) {		\
78ffd4e739SLakshmi Sowjanya D 	.mode = pin_mode,				\
79ffd4e739SLakshmi Sowjanya D 	.name = pin_function,				\
80ffd4e739SLakshmi Sowjanya D }							\
81ffd4e739SLakshmi Sowjanya D 
82ffd4e739SLakshmi Sowjanya D /**
83ffd4e739SLakshmi Sowjanya D  * struct keembay_gpio_irq - Config of each GPIO Interrupt sources
84ffd4e739SLakshmi Sowjanya D  * @source: Interrupt source number (0 - 7)
85ffd4e739SLakshmi Sowjanya D  * @line: Actual Interrupt line number
86ffd4e739SLakshmi Sowjanya D  * @pins: Array of GPIO pins using this Interrupt line
87ffd4e739SLakshmi Sowjanya D  * @trigger: Interrupt trigger type for this line
88ffd4e739SLakshmi Sowjanya D  * @num_share: Number of pins currently using this Interrupt line
89ffd4e739SLakshmi Sowjanya D  */
90ffd4e739SLakshmi Sowjanya D struct keembay_gpio_irq {
91ffd4e739SLakshmi Sowjanya D 	unsigned int source;
92ffd4e739SLakshmi Sowjanya D 	unsigned int line;
93ffd4e739SLakshmi Sowjanya D 	unsigned int pins[KEEMBAY_GPIO_MAX_PER_IRQ];
94ffd4e739SLakshmi Sowjanya D 	unsigned int trigger;
95ffd4e739SLakshmi Sowjanya D 	unsigned int num_share;
96ffd4e739SLakshmi Sowjanya D };
97ffd4e739SLakshmi Sowjanya D 
98ffd4e739SLakshmi Sowjanya D /**
99ffd4e739SLakshmi Sowjanya D  * struct keembay_pinctrl - Intel Keembay pinctrl structure
100ffd4e739SLakshmi Sowjanya D  * @pctrl: Pointer to the pin controller device
101ffd4e739SLakshmi Sowjanya D  * @base0: First register base address
102ffd4e739SLakshmi Sowjanya D  * @base1: Second register base address
103ffd4e739SLakshmi Sowjanya D  * @dev: Pointer to the device structure
104ffd4e739SLakshmi Sowjanya D  * @chip: GPIO chip used by this pin controller
105ffd4e739SLakshmi Sowjanya D  * @soc: Pin control configuration data based on SoC
106ffd4e739SLakshmi Sowjanya D  * @lock: Spinlock to protect various gpio config register access
107ffd4e739SLakshmi Sowjanya D  * @ngroups: Number of pin groups available
108ffd4e739SLakshmi Sowjanya D  * @nfuncs: Number of pin functions available
109ffd4e739SLakshmi Sowjanya D  * @npins: Number of GPIO pins available
110ffd4e739SLakshmi Sowjanya D  * @irq: Store Interrupt source
111ffd4e739SLakshmi Sowjanya D  * @max_gpios_level_type: Store max level trigger type
112ffd4e739SLakshmi Sowjanya D  * @max_gpios_edge_type: Store max edge trigger type
113ffd4e739SLakshmi Sowjanya D  */
114ffd4e739SLakshmi Sowjanya D struct keembay_pinctrl {
115ffd4e739SLakshmi Sowjanya D 	struct pinctrl_dev *pctrl;
116ffd4e739SLakshmi Sowjanya D 	void __iomem *base0;
117ffd4e739SLakshmi Sowjanya D 	void __iomem *base1;
118ffd4e739SLakshmi Sowjanya D 	struct device *dev;
119ffd4e739SLakshmi Sowjanya D 	struct gpio_chip chip;
120ffd4e739SLakshmi Sowjanya D 	const struct keembay_pin_soc *soc;
121ffd4e739SLakshmi Sowjanya D 	raw_spinlock_t lock;
122ffd4e739SLakshmi Sowjanya D 	unsigned int ngroups;
123ffd4e739SLakshmi Sowjanya D 	unsigned int nfuncs;
124ffd4e739SLakshmi Sowjanya D 	unsigned int npins;
125ffd4e739SLakshmi Sowjanya D 	struct keembay_gpio_irq irq[KEEMBAY_GPIO_NUM_IRQ];
126ffd4e739SLakshmi Sowjanya D 	int max_gpios_level_type;
127ffd4e739SLakshmi Sowjanya D 	int max_gpios_edge_type;
128ffd4e739SLakshmi Sowjanya D };
129ffd4e739SLakshmi Sowjanya D 
130ffd4e739SLakshmi Sowjanya D /**
131ffd4e739SLakshmi Sowjanya D  * struct keembay_pin_soc - Pin control config data based on SoC
132ffd4e739SLakshmi Sowjanya D  * @pins: Pin description structure
133ffd4e739SLakshmi Sowjanya D  */
134ffd4e739SLakshmi Sowjanya D struct keembay_pin_soc {
135ffd4e739SLakshmi Sowjanya D 	const struct pinctrl_pin_desc *pins;
136ffd4e739SLakshmi Sowjanya D };
137ffd4e739SLakshmi Sowjanya D 
138ffd4e739SLakshmi Sowjanya D static const struct pinctrl_pin_desc keembay_pins[] = {
139ffd4e739SLakshmi Sowjanya D 	KEEMBAY_PIN_DESC(0, "GPIO0",
140ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x0, "I2S0_M0"),
141ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x1, "SD0_M1"),
142ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x2, "SLVDS0_M2"),
143ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x3, "I2C0_M3"),
144ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x4, "CAM_M4"),
145ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x5, "ETH_M5"),
146ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x6, "LCD_M6"),
147ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x7, "GPIO_M7")),
148ffd4e739SLakshmi Sowjanya D 	KEEMBAY_PIN_DESC(1, "GPIO1",
149ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x0, "I2S0_M0"),
150ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x1, "SD0_M1"),
151ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x2, "SLVDS0_M2"),
152ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x3, "I2C0_M3"),
153ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x4, "CAM_M4"),
154ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x5, "ETH_M5"),
155ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x6, "LCD_M6"),
156ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x7, "GPIO_M7")),
157ffd4e739SLakshmi Sowjanya D 	KEEMBAY_PIN_DESC(2, "GPIO2",
158ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x0, "I2S0_M0"),
159ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x1, "I2S0_M1"),
160ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x2, "SLVDS0_M2"),
161ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x3, "I2C1_M3"),
162ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x4, "CAM_M4"),
163ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x5, "ETH_M5"),
164ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x6, "LCD_M6"),
165ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x7, "GPIO_M7")),
166ffd4e739SLakshmi Sowjanya D 	KEEMBAY_PIN_DESC(3, "GPIO3",
167ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x0, "I2S0_M0"),
168ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x1, "I2S0_M1"),
169ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x2, "SLVDS0_M2"),
170ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x3, "I2C1_M3"),
171ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x4, "CAM_M4"),
172ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x5, "ETH_M5"),
173ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x6, "LCD_M6"),
174ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x7, "GPIO_M7")),
175ffd4e739SLakshmi Sowjanya D 	KEEMBAY_PIN_DESC(4, "GPIO4",
176ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x0, "I2S0_M0"),
177ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x1, "I2S0_M1"),
178ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x2, "SLVDS0_M2"),
179ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x3, "I2C2_M3"),
180ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x4, "CAM_M4"),
181ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x5, "ETH_M5"),
182ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x6, "LCD_M6"),
183ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x7, "GPIO_M7")),
184ffd4e739SLakshmi Sowjanya D 	KEEMBAY_PIN_DESC(5, "GPIO5",
185ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x0, "I2S0_M0"),
186ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x1, "I2S0_M1"),
187ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x2, "SLVDS0_M2"),
188ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x3, "I2C2_M3"),
189ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x4, "CAM_M4"),
190ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x5, "ETH_M5"),
191ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x6, "LCD_M6"),
192ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x7, "GPIO_M7")),
193ffd4e739SLakshmi Sowjanya D 	KEEMBAY_PIN_DESC(6, "GPIO6",
194ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x0, "I2S1_M0"),
195ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x1, "SD0_M1"),
196ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x2, "SLVDS0_M2"),
197ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x3, "I2C3_M3"),
198ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x4, "CAM_M4"),
199ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x5, "ETH_M5"),
200ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x6, "LCD_M6"),
201ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x7, "GPIO_M7")),
202ffd4e739SLakshmi Sowjanya D 	KEEMBAY_PIN_DESC(7, "GPIO7",
203ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x0, "I2S1_M0"),
204ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x1, "SD0_M1"),
205ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x2, "SLVDS0_M2"),
206ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x3, "I2C3_M3"),
207ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x4, "CAM_M4"),
208ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x5, "ETH_M5"),
209ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x6, "LCD_M6"),
210ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x7, "GPIO_M7")),
211ffd4e739SLakshmi Sowjanya D 	KEEMBAY_PIN_DESC(8, "GPIO8",
212ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x0, "I2S1_M0"),
213ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x1, "I2S1_M1"),
214ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x2, "SLVDS0_M2"),
215ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x3, "UART0_M3"),
216ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x4, "CAM_M4"),
217ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x5, "ETH_M5"),
218ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x6, "LCD_M6"),
219ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x7, "GPIO_M7")),
220ffd4e739SLakshmi Sowjanya D 	KEEMBAY_PIN_DESC(9, "GPIO9",
221ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x0, "I2S1_M0"),
222ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x1, "I2S1_M1"),
223ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x2, "PWM_M2"),
224ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x3, "UART0_M3"),
225ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x4, "CAM_M4"),
226ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x5, "ETH_M5"),
227ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x6, "LCD_M6"),
228ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x7, "GPIO_M7")),
229ffd4e739SLakshmi Sowjanya D 	KEEMBAY_PIN_DESC(10, "GPIO10",
230ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x0, "I2S2_M0"),
231ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x1, "SD0_M1"),
232ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x2, "PWM_M2"),
233ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x3, "UART0_M3"),
234ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x4, "CAM_M4"),
235ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x5, "ETH_M5"),
236ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x6, "LCD_M6"),
237ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x7, "GPIO_M7")),
238ffd4e739SLakshmi Sowjanya D 	KEEMBAY_PIN_DESC(11, "GPIO11",
239ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x0, "I2S2_M0"),
240ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x1, "SD0_M1"),
241ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x2, "PWM_M2"),
242ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x3, "UART0_M3"),
243ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x4, "CAM_M4"),
244ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x5, "ETH_M5"),
245ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x6, "LCD_M6"),
246ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x7, "GPIO_M7")),
247ffd4e739SLakshmi Sowjanya D 	KEEMBAY_PIN_DESC(12, "GPIO12",
248ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x0, "I2S2_M0"),
249ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x1, "I2S2_M1"),
250ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x2, "PWM_M2"),
251ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x3, "SPI0_M3"),
252ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x4, "CAM_M4"),
253ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x5, "ETH_M5"),
254ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x6, "LCD_M6"),
255ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x7, "GPIO_M7")),
256ffd4e739SLakshmi Sowjanya D 	KEEMBAY_PIN_DESC(13, "GPIO13",
257ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x0, "I2S2_M0"),
258ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x1, "I2S2_M1"),
259ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x2, "PWM_M2"),
260ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x3, "SPI0_M3"),
261ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x4, "CAM_M4"),
262ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x5, "ETH_M5"),
263ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x6, "LCD_M6"),
264ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x7, "GPIO_M7")),
265ffd4e739SLakshmi Sowjanya D 	KEEMBAY_PIN_DESC(14, "GPIO14",
266ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x0, "UART0_M0"),
267ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x1, "I2S3_M1"),
268ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x2, "PWM_M2"),
269ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x3, "SD1_M3"),
270ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x4, "CAM_M4"),
271ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x5, "ETH_M5"),
272ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x6, "LCD_M6"),
273ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x7, "GPIO_M7")),
274ffd4e739SLakshmi Sowjanya D 	KEEMBAY_PIN_DESC(15, "GPIO15",
275ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x0, "UART0_M0"),
276ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x1, "I2S3_M1"),
277ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x2, "UART0_M2"),
278ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x3, "SD1_M3"),
279ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x4, "CAM_M4"),
280ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x5, "SPI1_M5"),
281ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x6, "LCD_M6"),
282ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x7, "GPIO_M7")),
283ffd4e739SLakshmi Sowjanya D 	KEEMBAY_PIN_DESC(16, "GPIO16",
284ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x0, "UART0_M0"),
285ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x1, "I2S3_M1"),
286ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x2, "UART0_M2"),
287ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x3, "SD1_M3"),
288ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x4, "CAM_M4"),
289ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x5, "SPI1_M5"),
290ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x6, "LCD_M6"),
291ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x7, "GPIO_M7")),
292ffd4e739SLakshmi Sowjanya D 	KEEMBAY_PIN_DESC(17, "GPIO17",
293ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x0, "UART0_M0"),
294ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x1, "I2S3_M1"),
295ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x2, "I2S3_M2"),
296ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x3, "SD1_M3"),
297ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x4, "CAM_M4"),
298ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x5, "SPI1_M5"),
299ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x6, "LCD_M6"),
300ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x7, "GPIO_M7")),
301ffd4e739SLakshmi Sowjanya D 	KEEMBAY_PIN_DESC(18, "GPIO18",
302ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x0, "UART1_M0"),
303ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x1, "SPI0_M1"),
304ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x2, "I2S3_M2"),
305ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x3, "SD1_M3"),
306ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x4, "CAM_M4"),
307ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x5, "SPI1_M5"),
308ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x6, "LCD_M6"),
309ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x7, "GPIO_M7")),
310ffd4e739SLakshmi Sowjanya D 	KEEMBAY_PIN_DESC(19, "GPIO19",
311ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x0, "UART1_M0"),
312ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x1, "LCD_M1"),
313ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x2, "DEBUG_M2"),
314ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x3, "SD1_M3"),
315ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x4, "CAM_M4"),
316ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x5, "SPI1_M5"),
317ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x6, "LCD_M6"),
318ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x7, "GPIO_M7")),
319ffd4e739SLakshmi Sowjanya D 	KEEMBAY_PIN_DESC(20, "GPIO20",
320ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x0, "UART1_M0"),
321ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x1, "LCD_M1"),
322ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x2, "DEBUG_M2"),
323ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x3, "CPR_M3"),
324ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x4, "CAM_M4"),
325ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x5, "SPI1_M5"),
326ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x6, "SLVDS0_M6"),
327ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x7, "GPIO_M7")),
328ffd4e739SLakshmi Sowjanya D 	KEEMBAY_PIN_DESC(21, "GPIO21",
329ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x0, "UART1_M0"),
330ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x1, "LCD_M1"),
331ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x2, "DEBUG_M2"),
332ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x3, "CPR_M3"),
333ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x4, "CAM_M4"),
334ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x5, "I3C0_M5"),
335ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x6, "SLVDS0_M6"),
336ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x7, "GPIO_M7")),
337ffd4e739SLakshmi Sowjanya D 	KEEMBAY_PIN_DESC(22, "GPIO22",
338ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x0, "I2C0_M0"),
339ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x1, "UART2_M1"),
340ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x2, "DEBUG_M2"),
341ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x3, "CPR_M3"),
342ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x4, "CAM_M4"),
343ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x5, "I3C0_M5"),
344ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x6, "SLVDS0_M6"),
345ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x7, "GPIO_M7")),
346ffd4e739SLakshmi Sowjanya D 	KEEMBAY_PIN_DESC(23, "GPIO23",
347ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x0, "I2C0_M0"),
348ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x1, "UART2_M1"),
349ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x2, "DEBUG_M2"),
350ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x3, "CPR_M3"),
351ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x4, "CAM_M4"),
352ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x5, "I3C1_M5"),
353ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x6, "SLVDS0_M6"),
354ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x7, "GPIO_M7")),
355ffd4e739SLakshmi Sowjanya D 	KEEMBAY_PIN_DESC(24, "GPIO24",
356ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x0, "I2C1_M0"),
357ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x1, "UART2_M1"),
358ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x2, "DEBUG_M2"),
359ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x3, "CPR_M3"),
360ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x4, "CAM_M4"),
361ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x5, "I3C1_M5"),
362ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x6, "SLVDS0_M6"),
363ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x7, "GPIO_M7")),
364ffd4e739SLakshmi Sowjanya D 	KEEMBAY_PIN_DESC(25, "GPIO25",
365ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x0, "I2C1_M0"),
366ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x1, "UART2_M1"),
367ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x2, "SPI0_M2"),
368ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x3, "CPR_M3"),
369ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x4, "CAM_M4"),
370ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x5, "I3C2_M5"),
371ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x6, "SLVDS0_M6"),
372ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x7, "GPIO_M7")),
373ffd4e739SLakshmi Sowjanya D 	KEEMBAY_PIN_DESC(26, "GPIO26",
374ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x0, "SPI0_M0"),
375ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x1, "I2C2_M1"),
376ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x2, "UART0_M2"),
377ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x3, "DSU_M3"),
378ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x4, "CAM_M4"),
379ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x5, "I3C2_M5"),
380ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x6, "SLVDS0_M6"),
381ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x7, "GPIO_M7")),
382ffd4e739SLakshmi Sowjanya D 	KEEMBAY_PIN_DESC(27, "GPIO27",
383ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x0, "SPI0_M0"),
384ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x1, "I2C2_M1"),
385ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x2, "UART0_M2"),
386ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x3, "DSU_M3"),
387ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x4, "CAM_M4"),
388ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x5, "I3C0_M5"),
389ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x6, "SLVDS0_M6"),
390ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x7, "GPIO_M7")),
391ffd4e739SLakshmi Sowjanya D 	KEEMBAY_PIN_DESC(28, "GPIO28",
392ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x0, "SPI0_M0"),
393ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x1, "I2C3_M1"),
394ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x2, "UART0_M2"),
395ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x3, "PWM_M3"),
396ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x4, "CAM_M4"),
397ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x5, "I3C1_M5"),
398ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x6, "SLVDS0_M6"),
399ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x7, "GPIO_M7")),
400ffd4e739SLakshmi Sowjanya D 	KEEMBAY_PIN_DESC(29, "GPIO29",
401ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x0, "SPI0_M0"),
402ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x1, "I2C3_M1"),
403ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x2, "UART0_M2"),
404ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x3, "PWM_M3"),
405ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x4, "CAM_M4"),
406ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x5, "I3C2_M5"),
407ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x6, "SLVDS1_M6"),
408ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x7, "GPIO_M7")),
409ffd4e739SLakshmi Sowjanya D 	KEEMBAY_PIN_DESC(30, "GPIO30",
410ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x0, "SPI0_M0"),
411ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x1, "I2S0_M1"),
412ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x2, "I2C4_M2"),
413ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x3, "PWM_M3"),
414ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x4, "CAM_M4"),
415ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x5, "LCD_M5"),
416ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x6, "SLVDS1_M6"),
417ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x7, "GPIO_M7")),
418ffd4e739SLakshmi Sowjanya D 	KEEMBAY_PIN_DESC(31, "GPIO31",
419ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x0, "SPI0_M0"),
420ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x1, "I2S0_M1"),
421ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x2, "I2C4_M2"),
422ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x3, "PWM_M3"),
423ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x4, "CAM_M4"),
424ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x5, "UART1_M5"),
425ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x6, "SLVDS1_M6"),
426ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x7, "GPIO_M7")),
427ffd4e739SLakshmi Sowjanya D 	KEEMBAY_PIN_DESC(32, "GPIO32",
428ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x0, "SD0_M0"),
429ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x1, "SPI0_M1"),
430ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x2, "UART1_M2"),
431ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x3, "PWM_M3"),
432ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x4, "CAM_M4"),
433ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x5, "PCIE_M5"),
434ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x6, "SLVDS1_M6"),
435ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x7, "GPIO_M7")),
436ffd4e739SLakshmi Sowjanya D 	KEEMBAY_PIN_DESC(33, "GPIO33",
437ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x0, "SD0_M0"),
438ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x1, "SPI0_M1"),
439ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x2, "UART1_M2"),
440ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x3, "PWM_M3"),
441ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x4, "CAM_M4"),
442ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x5, "PCIE_M5"),
443ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x6, "SLVDS1_M6"),
444ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x7, "GPIO_M7")),
445ffd4e739SLakshmi Sowjanya D 	KEEMBAY_PIN_DESC(34, "GPIO34",
446ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x0, "SD0_M0"),
447ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x1, "SPI0_M1"),
448ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x2, "I2C0_M2"),
449ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x3, "UART1_M3"),
450ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x4, "CAM_M4"),
451ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x5, "I2S0_M5"),
452ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x6, "SLVDS1_M6"),
453ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x7, "GPIO_M7")),
454ffd4e739SLakshmi Sowjanya D 	KEEMBAY_PIN_DESC(35, "GPIO35",
455ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x0, "SD0_M0"),
456ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x1, "PCIE_M1"),
457ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x2, "I2C0_M2"),
458ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x3, "UART1_M3"),
459ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x4, "CAM_M4"),
460ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x5, "I2S0_M5"),
461ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x6, "SLVDS1_M6"),
462ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x7, "GPIO_M7")),
463ffd4e739SLakshmi Sowjanya D 	KEEMBAY_PIN_DESC(36, "GPIO36",
464ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x0, "SD0_M0"),
465ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x1, "SPI3_M1"),
466ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x2, "I2C1_M2"),
467ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x3, "DEBUG_M3"),
468ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x4, "CAM_M4"),
469ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x5, "I2S0_M5"),
470ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x6, "SLVDS1_M6"),
471ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x7, "GPIO_M7")),
472ffd4e739SLakshmi Sowjanya D 	KEEMBAY_PIN_DESC(37, "GPIO37",
473ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x0, "SD0_M0"),
474ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x1, "SPI3_M1"),
475ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x2, "I2C1_M2"),
476ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x3, "DEBUG_M3"),
477ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x4, "CAM_M4"),
478ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x5, "I2S0_M5"),
479ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x6, "SLVDS1_M6"),
480ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x7, "GPIO_M7")),
481ffd4e739SLakshmi Sowjanya D 	KEEMBAY_PIN_DESC(38, "GPIO38",
482ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x0, "I3C1_M0"),
483ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x1, "SPI3_M1"),
484ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x2, "UART3_M2"),
485ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x3, "DEBUG_M3"),
486ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x4, "CAM_M4"),
487ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x5, "LCD_M5"),
488ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x6, "I2C2_M6"),
489ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x7, "GPIO_M7")),
490ffd4e739SLakshmi Sowjanya D 	KEEMBAY_PIN_DESC(39, "GPIO39",
491ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x0, "I3C1_M0"),
492ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x1, "SPI3_M1"),
493ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x2, "UART3_M2"),
494ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x3, "DEBUG_M3"),
495ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x4, "CAM_M4"),
496ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x5, "LCD_M5"),
497ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x6, "I2C2_M6"),
498ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x7, "GPIO_M7")),
499ffd4e739SLakshmi Sowjanya D 	KEEMBAY_PIN_DESC(40, "GPIO40",
500ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x0, "I2S2_M0"),
501ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x1, "SPI3_M1"),
502ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x2, "UART3_M2"),
503ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x3, "DEBUG_M3"),
504ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x4, "CAM_M4"),
505ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x5, "LCD_M5"),
506ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x6, "I2C3_M6"),
507ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x7, "GPIO_M7")),
508ffd4e739SLakshmi Sowjanya D 	KEEMBAY_PIN_DESC(41, "GPIO41",
509ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x0, "ETH_M0"),
510ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x1, "SPI3_M1"),
511ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x2, "SPI3_M2"),
512ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x3, "DEBUG_M3"),
513ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x4, "CAM_M4"),
514ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x5, "LCD_M5"),
515ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x6, "I2C3_M6"),
516ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x7, "GPIO_M7")),
517ffd4e739SLakshmi Sowjanya D 	KEEMBAY_PIN_DESC(42, "GPIO42",
518ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x0, "ETH_M0"),
519ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x1, "SD1_M1"),
520ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x2, "SPI3_M2"),
521ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x3, "CPR_M3"),
522ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x4, "CAM_M4"),
523ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x5, "LCD_M5"),
524ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x6, "I2C4_M6"),
525ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x7, "GPIO_M7")),
526ffd4e739SLakshmi Sowjanya D 	KEEMBAY_PIN_DESC(43, "GPIO43",
527ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x0, "ETH_M0"),
528ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x1, "SD1_M1"),
529ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x2, "SPI3_M2"),
530ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x3, "CPR_M3"),
531ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x4, "I2S0_M4"),
532ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x5, "LCD_M5"),
533ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x6, "I2C4_M6"),
534ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x7, "GPIO_M7")),
535ffd4e739SLakshmi Sowjanya D 	KEEMBAY_PIN_DESC(44, "GPIO44",
536ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x0, "ETH_M0"),
537ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x1, "SD1_M1"),
538ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x2, "SPI0_M2"),
539ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x3, "CPR_M3"),
540ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x4, "I2S0_M4"),
541ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x5, "LCD_M5"),
542ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x6, "CAM_M6"),
543ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x7, "GPIO_M7")),
544ffd4e739SLakshmi Sowjanya D 	KEEMBAY_PIN_DESC(45, "GPIO45",
545ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x0, "ETH_M0"),
546ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x1, "SD1_M1"),
547ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x2, "SPI0_M2"),
548ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x3, "CPR_M3"),
549ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x4, "I2S0_M4"),
550ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x5, "LCD_M5"),
551ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x6, "CAM_M6"),
552ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x7, "GPIO_M7")),
553ffd4e739SLakshmi Sowjanya D 	KEEMBAY_PIN_DESC(46, "GPIO46",
554ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x0, "ETH_M0"),
555ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x1, "SD1_M1"),
556ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x2, "SPI0_M2"),
557ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x3, "TPIU_M3"),
558ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x4, "I2S0_M4"),
559ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x5, "LCD_M5"),
560ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x6, "CAM_M6"),
561ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x7, "GPIO_M7")),
562ffd4e739SLakshmi Sowjanya D 	KEEMBAY_PIN_DESC(47, "GPIO47",
563ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x0, "ETH_M0"),
564ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x1, "SD1_M1"),
565ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x2, "SPI0_M2"),
566ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x3, "TPIU_M3"),
567ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x4, "I2S0_M4"),
568ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x5, "LCD_M5"),
569ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x6, "CAM_M6"),
570ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x7, "GPIO_M7")),
571ffd4e739SLakshmi Sowjanya D 	KEEMBAY_PIN_DESC(48, "GPIO48",
572ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x0, "ETH_M0"),
573ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x1, "SPI2_M1"),
574ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x2, "UART2_M2"),
575ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x3, "TPIU_M3"),
576ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x4, "I2S0_M4"),
577ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x5, "LCD_M5"),
578ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x6, "CAM_M6"),
579ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x7, "GPIO_M7")),
580ffd4e739SLakshmi Sowjanya D 	KEEMBAY_PIN_DESC(49, "GPIO49",
581ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x0, "ETH_M0"),
582ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x1, "SPI2_M1"),
583ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x2, "UART2_M2"),
584ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x3, "TPIU_M3"),
585ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x4, "I2S1_M4"),
586ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x5, "LCD_M5"),
587ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x6, "CAM_M6"),
588ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x7, "GPIO_M7")),
589ffd4e739SLakshmi Sowjanya D 	KEEMBAY_PIN_DESC(50, "GPIO50",
590ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x0, "ETH_M0"),
591ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x1, "SPI2_M1"),
592ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x2, "UART2_M2"),
593ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x3, "TPIU_M3"),
594ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x4, "I2S1_M4"),
595ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x5, "LCD_M5"),
596ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x6, "CAM_M6"),
597ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x7, "GPIO_M7")),
598ffd4e739SLakshmi Sowjanya D 	KEEMBAY_PIN_DESC(51, "GPIO51",
599ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x0, "ETH_M0"),
600ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x1, "SPI2_M1"),
601ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x2, "UART2_M2"),
602ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x3, "TPIU_M3"),
603ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x4, "I2S1_M4"),
604ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x5, "LCD_M5"),
605ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x6, "CAM_M6"),
606ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x7, "GPIO_M7")),
607ffd4e739SLakshmi Sowjanya D 	KEEMBAY_PIN_DESC(52, "GPIO52",
608ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x0, "ETH_M0"),
609ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x1, "SPI2_M1"),
610ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x2, "SD0_M2"),
611ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x3, "TPIU_M3"),
612ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x4, "I2S1_M4"),
613ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x5, "LCD_M5"),
614ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x6, "CAM_M6"),
615ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x7, "GPIO_M7")),
616ffd4e739SLakshmi Sowjanya D 	KEEMBAY_PIN_DESC(53, "GPIO53",
617ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x0, "ETH_M0"),
618ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x1, "SPI2_M1"),
619ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x2, "SD0_M2"),
620ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x3, "TPIU_M3"),
621ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x4, "I2S2_M4"),
622ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x5, "LCD_M5"),
623ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x6, "CAM_M6"),
624ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x7, "GPIO_M7")),
625ffd4e739SLakshmi Sowjanya D 	KEEMBAY_PIN_DESC(54, "GPIO54",
626ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x0, "ETH_M0"),
627ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x1, "SPI2_M1"),
628ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x2, "SD0_M2"),
629ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x3, "TPIU_M3"),
630ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x4, "I2S2_M4"),
631ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x5, "LCD_M5"),
632ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x6, "CAM_M6"),
633ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x7, "GPIO_M7")),
634ffd4e739SLakshmi Sowjanya D 	KEEMBAY_PIN_DESC(55, "GPIO55",
635ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x0, "ETH_M0"),
636ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x1, "SPI2_M1"),
637ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x2, "SD1_M2"),
638ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x3, "TPIU_M3"),
639ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x4, "I2S2_M4"),
640ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x5, "LCD_M5"),
641ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x6, "CAM_M6"),
642ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x7, "GPIO_M7")),
643ffd4e739SLakshmi Sowjanya D 	KEEMBAY_PIN_DESC(56, "GPIO56",
644ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x0, "ETH_M0"),
645ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x1, "SPI2_M1"),
646ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x2, "SD1_M2"),
647ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x3, "TPIU_M3"),
648ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x4, "I2S2_M4"),
649ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x5, "LCD_M5"),
650ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x6, "CAM_M6"),
651ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x7, "GPIO_M7")),
652ffd4e739SLakshmi Sowjanya D 	KEEMBAY_PIN_DESC(57, "GPIO57",
653ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x0, "SPI1_M0"),
654ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x1, "I2S1_M1"),
655ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x2, "SD1_M2"),
656ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x3, "TPIU_M3"),
657ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x4, "UART0_M4"),
658ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x5, "LCD_M5"),
659ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x6, "CAM_M6"),
660ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x7, "GPIO_M7")),
661ffd4e739SLakshmi Sowjanya D 	KEEMBAY_PIN_DESC(58, "GPIO58",
662ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x0, "SPI1_M0"),
663ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x1, "ETH_M1"),
664ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x2, "SD0_M2"),
665ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x3, "TPIU_M3"),
666ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x4, "UART0_M4"),
667ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x5, "LCD_M5"),
668ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x6, "CAM_M6"),
669ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x7, "GPIO_M7")),
670ffd4e739SLakshmi Sowjanya D 	KEEMBAY_PIN_DESC(59, "GPIO59",
671ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x0, "SPI1_M0"),
672ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x1, "ETH_M1"),
673ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x2, "SD0_M2"),
674ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x3, "TPIU_M3"),
675ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x4, "UART0_M4"),
676ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x5, "LCD_M5"),
677ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x6, "CAM_M6"),
678ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x7, "GPIO_M7")),
679ffd4e739SLakshmi Sowjanya D 	KEEMBAY_PIN_DESC(60, "GPIO60",
680ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x0, "SPI1_M0"),
681ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x1, "ETH_M1"),
682ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x2, "I3C1_M2"),
683ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x3, "TPIU_M3"),
684ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x4, "UART0_M4"),
685ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x5, "LCD_M5"),
686ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x6, "CAM_M6"),
687ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x7, "GPIO_M7")),
688ffd4e739SLakshmi Sowjanya D 	KEEMBAY_PIN_DESC(61, "GPIO61",
689ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x0, "SPI1_M0"),
690ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x1, "ETH_M1"),
691ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x2, "SD0_M2"),
692ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x3, "TPIU_M3"),
693ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x4, "UART1_M4"),
694ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x5, "LCD_M5"),
695ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x6, "CAM_M6"),
696ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x7, "GPIO_M7")),
697ffd4e739SLakshmi Sowjanya D 	KEEMBAY_PIN_DESC(62, "GPIO62",
698ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x0, "SPI1_M0"),
699ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x1, "ETH_M1"),
700ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x2, "SD1_M2"),
701ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x3, "TPIU_M3"),
702ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x4, "UART1_M4"),
703ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x5, "LCD_M5"),
704ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x6, "CAM_M6"),
705ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x7, "GPIO_M7")),
706ffd4e739SLakshmi Sowjanya D 	KEEMBAY_PIN_DESC(63, "GPIO63",
707ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x0, "I2S1_M0"),
708ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x1, "SPI1_M1"),
709ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x2, "SD1_M2"),
710ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x3, "TPIU_M3"),
711ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x4, "UART1_M4"),
712ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x5, "LCD_M5"),
713ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x6, "CAM_M6"),
714ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x7, "GPIO_M7")),
715ffd4e739SLakshmi Sowjanya D 	KEEMBAY_PIN_DESC(64, "GPIO64",
716ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x0, "I2S2_M0"),
717ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x1, "SPI1_M1"),
718ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x2, "ETH_M2"),
719ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x3, "TPIU_M3"),
720ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x4, "UART1_M4"),
721ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x5, "LCD_M5"),
722ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x6, "CAM_M6"),
723ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x7, "GPIO_M7")),
724ffd4e739SLakshmi Sowjanya D 	KEEMBAY_PIN_DESC(65, "GPIO65",
725ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x0, "I3C0_M0"),
726ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x1, "SPI1_M1"),
727ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x2, "SD1_M2"),
728ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x3, "TPIU_M3"),
729ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x4, "SPI0_M4"),
730ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x5, "LCD_M5"),
731ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x6, "CAM_M6"),
732ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x7, "GPIO_M7")),
733ffd4e739SLakshmi Sowjanya D 	KEEMBAY_PIN_DESC(66, "GPIO66",
734ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x0, "I3C0_M0"),
735ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x1, "ETH_M1"),
736ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x2, "I2C0_M2"),
737ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x3, "TPIU_M3"),
738ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x4, "SPI0_M4"),
739ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x5, "LCD_M5"),
740ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x6, "CAM_M6"),
741ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x7, "GPIO_M7")),
742ffd4e739SLakshmi Sowjanya D 	KEEMBAY_PIN_DESC(67, "GPIO67",
743ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x0, "I3C1_M0"),
744ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x1, "ETH_M1"),
745ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x2, "I2C0_M2"),
746ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x3, "TPIU_M3"),
747ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x4, "SPI0_M4"),
748ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x5, "LCD_M5"),
749ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x6, "I2S3_M6"),
750ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x7, "GPIO_M7")),
751ffd4e739SLakshmi Sowjanya D 	KEEMBAY_PIN_DESC(68, "GPIO68",
752ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x0, "I3C1_M0"),
753ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x1, "ETH_M1"),
754ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x2, "I2C1_M2"),
755ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x3, "TPIU_M3"),
756ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x4, "SPI0_M4"),
757ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x5, "LCD_M5"),
758ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x6, "I2S3_M6"),
759ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x7, "GPIO_M7")),
760ffd4e739SLakshmi Sowjanya D 	KEEMBAY_PIN_DESC(69, "GPIO69",
761ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x0, "I3C2_M0"),
762ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x1, "ETH_M1"),
763ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x2, "I2C1_M2"),
764ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x3, "TPIU_M3"),
765ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x4, "SPI0_M4"),
766ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x5, "LCD_M5"),
767ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x6, "I2S3_M6"),
768ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x7, "GPIO_M7")),
769ffd4e739SLakshmi Sowjanya D 	KEEMBAY_PIN_DESC(70, "GPIO70",
770ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x0, "I3C2_M0"),
771ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x1, "ETH_M1"),
772ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x2, "SPI0_M2"),
773ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x3, "TPIU_M3"),
774ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x4, "SD0_M4"),
775ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x5, "LCD_M5"),
776ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x6, "I2S3_M6"),
777ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x7, "GPIO_M7")),
778ffd4e739SLakshmi Sowjanya D 	KEEMBAY_PIN_DESC(71, "GPIO71",
779ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x0, "I3C0_M0"),
780ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x1, "ETH_M1"),
781ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x2, "SLVDS1_M2"),
782ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x3, "TPIU_M3"),
783ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x4, "SD0_M4"),
784ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x5, "LCD_M5"),
785ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x6, "I2S3_M6"),
786ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x7, "GPIO_M7")),
787ffd4e739SLakshmi Sowjanya D 	KEEMBAY_PIN_DESC(72, "GPIO72",
788ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x0, "I3C1_M0"),
789ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x1, "ETH_M1"),
790ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x2, "SLVDS1_M2"),
791ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x3, "TPIU_M3"),
792ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x4, "SD0_M4"),
793ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x5, "LCD_M5"),
794ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x6, "UART2_M6"),
795ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x7, "GPIO_M7")),
796ffd4e739SLakshmi Sowjanya D 	KEEMBAY_PIN_DESC(73, "GPIO73",
797ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x0, "I3C2_M0"),
798ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x1, "ETH_M1"),
799ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x2, "SLVDS1_M2"),
800ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x3, "TPIU_M3"),
801ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x4, "SD0_M4"),
802ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x5, "LCD_M5"),
803ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x6, "UART2_M6"),
804ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x7, "GPIO_M7")),
805ffd4e739SLakshmi Sowjanya D 	KEEMBAY_PIN_DESC(74, "GPIO74",
806ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x0, "I3C0_M0"),
807ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x1, "ETH_M1"),
808ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x2, "SLVDS1_M2"),
809ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x3, "TPIU_M3"),
810ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x4, "SD0_M4"),
811ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x5, "LCD_M5"),
812ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x6, "UART2_M6"),
813ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x7, "GPIO_M7")),
814ffd4e739SLakshmi Sowjanya D 	KEEMBAY_PIN_DESC(75, "GPIO75",
815ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x0, "I3C0_M0"),
816ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x1, "ETH_M1"),
817ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x2, "SLVDS1_M2"),
818ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x3, "TPIU_M3"),
819ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x4, "SD0_M4"),
820ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x5, "LCD_M5"),
821ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x6, "UART2_M6"),
822ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x7, "GPIO_M7")),
823ffd4e739SLakshmi Sowjanya D 	KEEMBAY_PIN_DESC(76, "GPIO76",
824ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x0, "I2C2_M0"),
825ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x1, "I3C0_M1"),
826ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x2, "SLVDS1_M2"),
827ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x3, "TPIU_M3"),
828ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x4, "ETH_M4"),
829ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x5, "LCD_M5"),
830ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x6, "UART3_M6"),
831ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x7, "GPIO_M7")),
832ffd4e739SLakshmi Sowjanya D 	KEEMBAY_PIN_DESC(77, "GPIO77",
833ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x0, "PCIE_M0"),
834ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x1, "I3C1_M1"),
835ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x2, "SLVDS1_M2"),
836ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x3, "TPIU_M3"),
837ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x4, "I3C2_M4"),
838ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x5, "LCD_M5"),
839ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x6, "UART3_M6"),
840ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x7, "GPIO_M7")),
841ffd4e739SLakshmi Sowjanya D 	KEEMBAY_PIN_DESC(78, "GPIO78",
842ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x0, "PCIE_M0"),
843ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x1, "I3C2_M1"),
844ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x2, "SLVDS1_M2"),
845ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x3, "TPIU_M3"),
846ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x4, "I3C2_M4"),
847ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x5, "LCD_M5"),
848ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x6, "UART3_M6"),
849ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x7, "GPIO_M7")),
850ffd4e739SLakshmi Sowjanya D 	KEEMBAY_PIN_DESC(79, "GPIO79",
851ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x0, "PCIE_M0"),
852ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x1, "I2C2_M1"),
853ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x2, "SLVDS1_M2"),
854ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x3, "TPIU_M3"),
855ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x4, "I3C2_M4"),
856ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x5, "LCD_M5"),
857ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x6, "UART3_M6"),
858ffd4e739SLakshmi Sowjanya D 			 KEEMBAY_MUX(0x7, "GPIO_M7")),
859ffd4e739SLakshmi Sowjanya D };
860ffd4e739SLakshmi Sowjanya D 
keembay_read_reg(void __iomem * base,unsigned int pin)861ffd4e739SLakshmi Sowjanya D static inline u32 keembay_read_reg(void __iomem *base, unsigned int pin)
862ffd4e739SLakshmi Sowjanya D {
863ffd4e739SLakshmi Sowjanya D 	return readl(base + KEEMBAY_GPIO_REG_OFFSET(pin));
864ffd4e739SLakshmi Sowjanya D }
865ffd4e739SLakshmi Sowjanya D 
keembay_read_gpio_reg(void __iomem * base,unsigned int pin)866ffd4e739SLakshmi Sowjanya D static inline u32 keembay_read_gpio_reg(void __iomem *base, unsigned int pin)
867ffd4e739SLakshmi Sowjanya D {
868ffd4e739SLakshmi Sowjanya D 	return keembay_read_reg(base, pin / KEEMBAY_GPIO_MAX_PER_REG);
869ffd4e739SLakshmi Sowjanya D }
870ffd4e739SLakshmi Sowjanya D 
keembay_read_pin(void __iomem * base,unsigned int pin)871ffd4e739SLakshmi Sowjanya D static inline u32 keembay_read_pin(void __iomem *base, unsigned int pin)
872ffd4e739SLakshmi Sowjanya D {
873ffd4e739SLakshmi Sowjanya D 	u32 val = keembay_read_gpio_reg(base, pin);
874ffd4e739SLakshmi Sowjanya D 
875ffd4e739SLakshmi Sowjanya D 	return !!(val & BIT(pin % KEEMBAY_GPIO_MAX_PER_REG));
876ffd4e739SLakshmi Sowjanya D }
877ffd4e739SLakshmi Sowjanya D 
keembay_write_reg(u32 val,void __iomem * base,unsigned int pin)878ffd4e739SLakshmi Sowjanya D static inline void keembay_write_reg(u32 val, void __iomem *base, unsigned int pin)
879ffd4e739SLakshmi Sowjanya D {
880ffd4e739SLakshmi Sowjanya D 	writel(val, base + KEEMBAY_GPIO_REG_OFFSET(pin));
881ffd4e739SLakshmi Sowjanya D }
882ffd4e739SLakshmi Sowjanya D 
keembay_write_gpio_reg(u32 val,void __iomem * base,unsigned int pin)883ffd4e739SLakshmi Sowjanya D static inline void keembay_write_gpio_reg(u32 val, void __iomem *base, unsigned int pin)
884ffd4e739SLakshmi Sowjanya D {
885ffd4e739SLakshmi Sowjanya D 	keembay_write_reg(val, base, pin / KEEMBAY_GPIO_MAX_PER_REG);
886ffd4e739SLakshmi Sowjanya D }
887ffd4e739SLakshmi Sowjanya D 
keembay_gpio_invert(struct keembay_pinctrl * kpc,unsigned int pin)888ffd4e739SLakshmi Sowjanya D static void keembay_gpio_invert(struct keembay_pinctrl *kpc, unsigned int pin)
889ffd4e739SLakshmi Sowjanya D {
890ffd4e739SLakshmi Sowjanya D 	unsigned int val = keembay_read_reg(kpc->base1 + KEEMBAY_GPIO_MODE, pin);
891ffd4e739SLakshmi Sowjanya D 
892ffd4e739SLakshmi Sowjanya D 	/*
893ffd4e739SLakshmi Sowjanya D 	 * This IP doesn't support the falling edge and low level interrupt
894ffd4e739SLakshmi Sowjanya D 	 * trigger. Invert API is used to mimic the falling edge and low
895ffd4e739SLakshmi Sowjanya D 	 * level support
896ffd4e739SLakshmi Sowjanya D 	 */
897ffd4e739SLakshmi Sowjanya D 
898ffd4e739SLakshmi Sowjanya D 	val |= FIELD_PREP(KEEMBAY_GPIO_MODE_INV_MASK, KEEMBAY_GPIO_MODE_INV_VAL);
899ffd4e739SLakshmi Sowjanya D 	keembay_write_reg(val, kpc->base1 + KEEMBAY_GPIO_MODE, pin);
900ffd4e739SLakshmi Sowjanya D }
901ffd4e739SLakshmi Sowjanya D 
keembay_gpio_restore_default(struct keembay_pinctrl * kpc,unsigned int pin)902ffd4e739SLakshmi Sowjanya D static void keembay_gpio_restore_default(struct keembay_pinctrl *kpc, unsigned int pin)
903ffd4e739SLakshmi Sowjanya D {
904ffd4e739SLakshmi Sowjanya D 	unsigned int val = keembay_read_reg(kpc->base1 + KEEMBAY_GPIO_MODE, pin);
905ffd4e739SLakshmi Sowjanya D 
906ffd4e739SLakshmi Sowjanya D 	val &= FIELD_PREP(KEEMBAY_GPIO_MODE_INV_MASK, 0);
907ffd4e739SLakshmi Sowjanya D 	keembay_write_reg(val, kpc->base1 + KEEMBAY_GPIO_MODE, pin);
908ffd4e739SLakshmi Sowjanya D }
909ffd4e739SLakshmi Sowjanya D 
keembay_request_gpio(struct pinctrl_dev * pctldev,struct pinctrl_gpio_range * range,unsigned int pin)910ffd4e739SLakshmi Sowjanya D static int keembay_request_gpio(struct pinctrl_dev *pctldev,
911ffd4e739SLakshmi Sowjanya D 				struct pinctrl_gpio_range *range, unsigned int pin)
912ffd4e739SLakshmi Sowjanya D {
913ffd4e739SLakshmi Sowjanya D 	struct keembay_pinctrl *kpc = pinctrl_dev_get_drvdata(pctldev);
914ffd4e739SLakshmi Sowjanya D 	unsigned int val;
915ffd4e739SLakshmi Sowjanya D 
916ffd4e739SLakshmi Sowjanya D 	if (pin >= kpc->npins)
917ffd4e739SLakshmi Sowjanya D 		return -EINVAL;
918ffd4e739SLakshmi Sowjanya D 
919ffd4e739SLakshmi Sowjanya D 	val = keembay_read_reg(kpc->base1 + KEEMBAY_GPIO_MODE, pin);
920ffd4e739SLakshmi Sowjanya D 	val = FIELD_GET(KEEMBAY_GPIO_MODE_SELECT_MASK, val);
921ffd4e739SLakshmi Sowjanya D 
922ffd4e739SLakshmi Sowjanya D 	/* As per Pin Mux Map, Modes 0 to 6 are for peripherals */
923ffd4e739SLakshmi Sowjanya D 	if (val != KEEMBAY_GPIO_MODE_DEFAULT)
924ffd4e739SLakshmi Sowjanya D 		return -EBUSY;
925ffd4e739SLakshmi Sowjanya D 
926ffd4e739SLakshmi Sowjanya D 	return 0;
927ffd4e739SLakshmi Sowjanya D }
928ffd4e739SLakshmi Sowjanya D 
keembay_set_mux(struct pinctrl_dev * pctldev,unsigned int fun_sel,unsigned int grp_sel)929ffd4e739SLakshmi Sowjanya D static int keembay_set_mux(struct pinctrl_dev *pctldev, unsigned int fun_sel,
930ffd4e739SLakshmi Sowjanya D 			   unsigned int grp_sel)
931ffd4e739SLakshmi Sowjanya D {
932ffd4e739SLakshmi Sowjanya D 	struct keembay_pinctrl *kpc = pinctrl_dev_get_drvdata(pctldev);
933ffd4e739SLakshmi Sowjanya D 	struct function_desc *func;
934ffd4e739SLakshmi Sowjanya D 	struct group_desc *grp;
935ffd4e739SLakshmi Sowjanya D 	unsigned int val;
936ffd4e739SLakshmi Sowjanya D 	u8 pin_mode;
937ffd4e739SLakshmi Sowjanya D 	int pin;
938ffd4e739SLakshmi Sowjanya D 
939ffd4e739SLakshmi Sowjanya D 	grp = pinctrl_generic_get_group(pctldev, grp_sel);
940ffd4e739SLakshmi Sowjanya D 	if (!grp)
941ffd4e739SLakshmi Sowjanya D 		return -EINVAL;
942ffd4e739SLakshmi Sowjanya D 
943ffd4e739SLakshmi Sowjanya D 	func = pinmux_generic_get_function(pctldev, fun_sel);
944ffd4e739SLakshmi Sowjanya D 	if (!func)
945ffd4e739SLakshmi Sowjanya D 		return -EINVAL;
946ffd4e739SLakshmi Sowjanya D 
947ffd4e739SLakshmi Sowjanya D 	/* Change modes for pins in the selected group */
948ffd4e739SLakshmi Sowjanya D 	pin = *grp->pins;
949ffd4e739SLakshmi Sowjanya D 	pin_mode = *(u8 *)(func->data);
950ffd4e739SLakshmi Sowjanya D 
951ffd4e739SLakshmi Sowjanya D 	val = keembay_read_reg(kpc->base1 + KEEMBAY_GPIO_MODE, pin);
952ffd4e739SLakshmi Sowjanya D 	val = u32_replace_bits(val, pin_mode, KEEMBAY_GPIO_MODE_SELECT_MASK);
953ffd4e739SLakshmi Sowjanya D 	keembay_write_reg(val, kpc->base1 + KEEMBAY_GPIO_MODE, pin);
954ffd4e739SLakshmi Sowjanya D 
955ffd4e739SLakshmi Sowjanya D 	return 0;
956ffd4e739SLakshmi Sowjanya D }
957ffd4e739SLakshmi Sowjanya D 
keembay_pinconf_get_pull(struct keembay_pinctrl * kpc,unsigned int pin)958ffd4e739SLakshmi Sowjanya D static u32 keembay_pinconf_get_pull(struct keembay_pinctrl *kpc, unsigned int pin)
959ffd4e739SLakshmi Sowjanya D {
960ffd4e739SLakshmi Sowjanya D 	unsigned int val = keembay_read_reg(kpc->base1 + KEEMBAY_GPIO_MODE, pin);
961ffd4e739SLakshmi Sowjanya D 
962ffd4e739SLakshmi Sowjanya D 	return FIELD_GET(KEEMBAY_GPIO_MODE_PULLUP_MASK, val);
963ffd4e739SLakshmi Sowjanya D }
964ffd4e739SLakshmi Sowjanya D 
keembay_pinconf_set_pull(struct keembay_pinctrl * kpc,unsigned int pin,unsigned int pull)965ffd4e739SLakshmi Sowjanya D static int keembay_pinconf_set_pull(struct keembay_pinctrl *kpc, unsigned int pin,
966ffd4e739SLakshmi Sowjanya D 				    unsigned int pull)
967ffd4e739SLakshmi Sowjanya D {
968ffd4e739SLakshmi Sowjanya D 	unsigned int val = keembay_read_reg(kpc->base1 + KEEMBAY_GPIO_MODE, pin);
969ffd4e739SLakshmi Sowjanya D 
970ffd4e739SLakshmi Sowjanya D 	val = u32_replace_bits(val, pull, KEEMBAY_GPIO_MODE_PULLUP_MASK);
971ffd4e739SLakshmi Sowjanya D 	keembay_write_reg(val, kpc->base1 + KEEMBAY_GPIO_MODE, pin);
972ffd4e739SLakshmi Sowjanya D 
973ffd4e739SLakshmi Sowjanya D 	return 0;
974ffd4e739SLakshmi Sowjanya D }
975ffd4e739SLakshmi Sowjanya D 
keembay_pinconf_get_drive(struct keembay_pinctrl * kpc,unsigned int pin)976ffd4e739SLakshmi Sowjanya D static int keembay_pinconf_get_drive(struct keembay_pinctrl *kpc, unsigned int pin)
977ffd4e739SLakshmi Sowjanya D {
978ffd4e739SLakshmi Sowjanya D 	unsigned int val = keembay_read_reg(kpc->base1 + KEEMBAY_GPIO_MODE, pin);
979ffd4e739SLakshmi Sowjanya D 
980ffd4e739SLakshmi Sowjanya D 	val = FIELD_GET(KEEMBAY_GPIO_MODE_DRIVE_MASK, val) * 4;
981ffd4e739SLakshmi Sowjanya D 	if (val)
982ffd4e739SLakshmi Sowjanya D 		return val;
983ffd4e739SLakshmi Sowjanya D 
984ffd4e739SLakshmi Sowjanya D 	return KEEMBAY_GPIO_MIN_STRENGTH;
985ffd4e739SLakshmi Sowjanya D }
986ffd4e739SLakshmi Sowjanya D 
keembay_pinconf_set_drive(struct keembay_pinctrl * kpc,unsigned int pin,unsigned int drive)987ffd4e739SLakshmi Sowjanya D static int keembay_pinconf_set_drive(struct keembay_pinctrl *kpc, unsigned int pin,
988ffd4e739SLakshmi Sowjanya D 				     unsigned int drive)
989ffd4e739SLakshmi Sowjanya D {
990ffd4e739SLakshmi Sowjanya D 	unsigned int val = keembay_read_reg(kpc->base1 + KEEMBAY_GPIO_MODE, pin);
991ffd4e739SLakshmi Sowjanya D 	unsigned int strength = clamp_val(drive, KEEMBAY_GPIO_MIN_STRENGTH,
992ffd4e739SLakshmi Sowjanya D 				 KEEMBAY_GPIO_MAX_STRENGTH) / 4;
993ffd4e739SLakshmi Sowjanya D 
994ffd4e739SLakshmi Sowjanya D 	val = u32_replace_bits(val, strength, KEEMBAY_GPIO_MODE_DRIVE_MASK);
995ffd4e739SLakshmi Sowjanya D 	keembay_write_reg(val, kpc->base1 + KEEMBAY_GPIO_MODE, pin);
996ffd4e739SLakshmi Sowjanya D 
997ffd4e739SLakshmi Sowjanya D 	return 0;
998ffd4e739SLakshmi Sowjanya D }
999ffd4e739SLakshmi Sowjanya D 
keembay_pinconf_get_slew_rate(struct keembay_pinctrl * kpc,unsigned int pin)1000ffd4e739SLakshmi Sowjanya D static int keembay_pinconf_get_slew_rate(struct keembay_pinctrl *kpc, unsigned int pin)
1001ffd4e739SLakshmi Sowjanya D {
1002ffd4e739SLakshmi Sowjanya D 	unsigned int val = keembay_read_reg(kpc->base1 + KEEMBAY_GPIO_MODE, pin);
1003ffd4e739SLakshmi Sowjanya D 
1004ffd4e739SLakshmi Sowjanya D 	return !!(val & KEEMBAY_GPIO_MODE_SLEW_RATE);
1005ffd4e739SLakshmi Sowjanya D }
1006ffd4e739SLakshmi Sowjanya D 
keembay_pinconf_set_slew_rate(struct keembay_pinctrl * kpc,unsigned int pin,unsigned int slew_rate)1007ffd4e739SLakshmi Sowjanya D static int keembay_pinconf_set_slew_rate(struct keembay_pinctrl *kpc, unsigned int pin,
1008ffd4e739SLakshmi Sowjanya D 					 unsigned int slew_rate)
1009ffd4e739SLakshmi Sowjanya D {
1010ffd4e739SLakshmi Sowjanya D 	unsigned int val = keembay_read_reg(kpc->base1 + KEEMBAY_GPIO_MODE, pin);
1011ffd4e739SLakshmi Sowjanya D 
1012ffd4e739SLakshmi Sowjanya D 	if (slew_rate)
1013ffd4e739SLakshmi Sowjanya D 		val |= KEEMBAY_GPIO_MODE_SLEW_RATE;
1014ffd4e739SLakshmi Sowjanya D 	else
1015ffd4e739SLakshmi Sowjanya D 		val &= ~KEEMBAY_GPIO_MODE_SLEW_RATE;
1016ffd4e739SLakshmi Sowjanya D 
1017ffd4e739SLakshmi Sowjanya D 	keembay_write_reg(val, kpc->base1 + KEEMBAY_GPIO_MODE, pin);
1018ffd4e739SLakshmi Sowjanya D 
1019ffd4e739SLakshmi Sowjanya D 	return 0;
1020ffd4e739SLakshmi Sowjanya D }
1021ffd4e739SLakshmi Sowjanya D 
keembay_pinconf_get_schmitt(struct keembay_pinctrl * kpc,unsigned int pin)1022ffd4e739SLakshmi Sowjanya D static int keembay_pinconf_get_schmitt(struct keembay_pinctrl *kpc, unsigned int pin)
1023ffd4e739SLakshmi Sowjanya D {
1024ffd4e739SLakshmi Sowjanya D 	unsigned int val = keembay_read_reg(kpc->base1 + KEEMBAY_GPIO_MODE, pin);
1025ffd4e739SLakshmi Sowjanya D 
1026ffd4e739SLakshmi Sowjanya D 	return !!(val & KEEMBAY_GPIO_MODE_SCHMITT_EN);
1027ffd4e739SLakshmi Sowjanya D }
1028ffd4e739SLakshmi Sowjanya D 
keembay_pinconf_set_schmitt(struct keembay_pinctrl * kpc,unsigned int pin,unsigned int schmitt_en)1029ffd4e739SLakshmi Sowjanya D static int keembay_pinconf_set_schmitt(struct keembay_pinctrl *kpc, unsigned int pin,
1030ffd4e739SLakshmi Sowjanya D 				       unsigned int schmitt_en)
1031ffd4e739SLakshmi Sowjanya D {
1032ffd4e739SLakshmi Sowjanya D 	unsigned int val = keembay_read_reg(kpc->base1 + KEEMBAY_GPIO_MODE, pin);
1033ffd4e739SLakshmi Sowjanya D 
1034ffd4e739SLakshmi Sowjanya D 	if (schmitt_en)
1035ffd4e739SLakshmi Sowjanya D 		val |= KEEMBAY_GPIO_MODE_SCHMITT_EN;
1036ffd4e739SLakshmi Sowjanya D 	else
1037ffd4e739SLakshmi Sowjanya D 		val &= ~KEEMBAY_GPIO_MODE_SCHMITT_EN;
1038ffd4e739SLakshmi Sowjanya D 
1039ffd4e739SLakshmi Sowjanya D 	keembay_write_reg(val, kpc->base1 + KEEMBAY_GPIO_MODE, pin);
1040ffd4e739SLakshmi Sowjanya D 
1041ffd4e739SLakshmi Sowjanya D 	return 0;
1042ffd4e739SLakshmi Sowjanya D }
1043ffd4e739SLakshmi Sowjanya D 
keembay_pinconf_get(struct pinctrl_dev * pctldev,unsigned int pin,unsigned long * cfg)1044ffd4e739SLakshmi Sowjanya D static int keembay_pinconf_get(struct pinctrl_dev *pctldev, unsigned int pin,
1045ffd4e739SLakshmi Sowjanya D 			       unsigned long *cfg)
1046ffd4e739SLakshmi Sowjanya D {
1047ffd4e739SLakshmi Sowjanya D 	struct keembay_pinctrl *kpc = pinctrl_dev_get_drvdata(pctldev);
1048ffd4e739SLakshmi Sowjanya D 	unsigned int param = pinconf_to_config_param(*cfg);
1049ffd4e739SLakshmi Sowjanya D 	unsigned int val;
1050ffd4e739SLakshmi Sowjanya D 
1051ffd4e739SLakshmi Sowjanya D 	if (pin >= kpc->npins)
1052ffd4e739SLakshmi Sowjanya D 		return -EINVAL;
1053ffd4e739SLakshmi Sowjanya D 
1054ffd4e739SLakshmi Sowjanya D 	switch (param) {
1055ffd4e739SLakshmi Sowjanya D 	case PIN_CONFIG_BIAS_DISABLE:
1056ffd4e739SLakshmi Sowjanya D 		if (keembay_pinconf_get_pull(kpc, pin) != KEEMBAY_GPIO_DISABLE)
1057ffd4e739SLakshmi Sowjanya D 			return -EINVAL;
1058ffd4e739SLakshmi Sowjanya D 		break;
1059ffd4e739SLakshmi Sowjanya D 
1060ffd4e739SLakshmi Sowjanya D 	case PIN_CONFIG_BIAS_PULL_UP:
1061ffd4e739SLakshmi Sowjanya D 		if (keembay_pinconf_get_pull(kpc, pin) != KEEMBAY_GPIO_PULL_UP)
1062ffd4e739SLakshmi Sowjanya D 			return -EINVAL;
1063ffd4e739SLakshmi Sowjanya D 		break;
1064ffd4e739SLakshmi Sowjanya D 
1065ffd4e739SLakshmi Sowjanya D 	case PIN_CONFIG_BIAS_PULL_DOWN:
1066ffd4e739SLakshmi Sowjanya D 		if (keembay_pinconf_get_pull(kpc, pin) != KEEMBAY_GPIO_PULL_DOWN)
1067ffd4e739SLakshmi Sowjanya D 			return -EINVAL;
1068ffd4e739SLakshmi Sowjanya D 		break;
1069ffd4e739SLakshmi Sowjanya D 
1070ffd4e739SLakshmi Sowjanya D 	case PIN_CONFIG_BIAS_BUS_HOLD:
1071ffd4e739SLakshmi Sowjanya D 		if (keembay_pinconf_get_pull(kpc, pin) != KEEMBAY_GPIO_BUS_HOLD)
1072ffd4e739SLakshmi Sowjanya D 			return -EINVAL;
1073ffd4e739SLakshmi Sowjanya D 		break;
1074ffd4e739SLakshmi Sowjanya D 
1075ffd4e739SLakshmi Sowjanya D 	case PIN_CONFIG_INPUT_SCHMITT_ENABLE:
1076ffd4e739SLakshmi Sowjanya D 		if (!keembay_pinconf_get_schmitt(kpc, pin))
1077ffd4e739SLakshmi Sowjanya D 			return -EINVAL;
1078ffd4e739SLakshmi Sowjanya D 		break;
1079ffd4e739SLakshmi Sowjanya D 
1080ffd4e739SLakshmi Sowjanya D 	case PIN_CONFIG_SLEW_RATE:
1081ffd4e739SLakshmi Sowjanya D 		val = keembay_pinconf_get_slew_rate(kpc, pin);
1082ffd4e739SLakshmi Sowjanya D 		*cfg = pinconf_to_config_packed(param, val);
1083ffd4e739SLakshmi Sowjanya D 		break;
1084ffd4e739SLakshmi Sowjanya D 
1085ffd4e739SLakshmi Sowjanya D 	case PIN_CONFIG_DRIVE_STRENGTH:
1086ffd4e739SLakshmi Sowjanya D 		val = keembay_pinconf_get_drive(kpc, pin);
1087ffd4e739SLakshmi Sowjanya D 		*cfg = pinconf_to_config_packed(param, val);
1088ffd4e739SLakshmi Sowjanya D 		break;
1089ffd4e739SLakshmi Sowjanya D 
1090ffd4e739SLakshmi Sowjanya D 	default:
1091ffd4e739SLakshmi Sowjanya D 		return -ENOTSUPP;
1092ffd4e739SLakshmi Sowjanya D 	}
1093ffd4e739SLakshmi Sowjanya D 
1094ffd4e739SLakshmi Sowjanya D 	return 0;
1095ffd4e739SLakshmi Sowjanya D }
1096ffd4e739SLakshmi Sowjanya D 
keembay_pinconf_set(struct pinctrl_dev * pctldev,unsigned int pin,unsigned long * cfg,unsigned int num_configs)1097ffd4e739SLakshmi Sowjanya D static int keembay_pinconf_set(struct pinctrl_dev *pctldev, unsigned int pin,
1098ffd4e739SLakshmi Sowjanya D 			       unsigned long *cfg, unsigned int num_configs)
1099ffd4e739SLakshmi Sowjanya D {
1100ffd4e739SLakshmi Sowjanya D 	struct keembay_pinctrl *kpc = pinctrl_dev_get_drvdata(pctldev);
1101ffd4e739SLakshmi Sowjanya D 	enum pin_config_param param;
1102ffd4e739SLakshmi Sowjanya D 	unsigned int arg, i;
1103ffd4e739SLakshmi Sowjanya D 	int ret = 0;
1104ffd4e739SLakshmi Sowjanya D 
1105ffd4e739SLakshmi Sowjanya D 	if (pin >= kpc->npins)
1106ffd4e739SLakshmi Sowjanya D 		return -EINVAL;
1107ffd4e739SLakshmi Sowjanya D 
1108ffd4e739SLakshmi Sowjanya D 	for (i = 0; i < num_configs; i++) {
1109ffd4e739SLakshmi Sowjanya D 		param = pinconf_to_config_param(cfg[i]);
1110ffd4e739SLakshmi Sowjanya D 		arg = pinconf_to_config_argument(cfg[i]);
1111ffd4e739SLakshmi Sowjanya D 
1112ffd4e739SLakshmi Sowjanya D 		switch (param) {
1113ffd4e739SLakshmi Sowjanya D 		case PIN_CONFIG_BIAS_DISABLE:
1114ffd4e739SLakshmi Sowjanya D 			ret = keembay_pinconf_set_pull(kpc, pin, KEEMBAY_GPIO_DISABLE);
1115ffd4e739SLakshmi Sowjanya D 			break;
1116ffd4e739SLakshmi Sowjanya D 
1117ffd4e739SLakshmi Sowjanya D 		case PIN_CONFIG_BIAS_PULL_UP:
1118ffd4e739SLakshmi Sowjanya D 			ret = keembay_pinconf_set_pull(kpc, pin, KEEMBAY_GPIO_PULL_UP);
1119ffd4e739SLakshmi Sowjanya D 			break;
1120ffd4e739SLakshmi Sowjanya D 
1121ffd4e739SLakshmi Sowjanya D 		case PIN_CONFIG_BIAS_PULL_DOWN:
1122ffd4e739SLakshmi Sowjanya D 			ret = keembay_pinconf_set_pull(kpc, pin, KEEMBAY_GPIO_PULL_DOWN);
1123ffd4e739SLakshmi Sowjanya D 			break;
1124ffd4e739SLakshmi Sowjanya D 
1125ffd4e739SLakshmi Sowjanya D 		case PIN_CONFIG_BIAS_BUS_HOLD:
1126ffd4e739SLakshmi Sowjanya D 			ret = keembay_pinconf_set_pull(kpc, pin, KEEMBAY_GPIO_BUS_HOLD);
1127ffd4e739SLakshmi Sowjanya D 			break;
1128ffd4e739SLakshmi Sowjanya D 
1129ffd4e739SLakshmi Sowjanya D 		case PIN_CONFIG_INPUT_SCHMITT_ENABLE:
1130ffd4e739SLakshmi Sowjanya D 			ret = keembay_pinconf_set_schmitt(kpc, pin, arg);
1131ffd4e739SLakshmi Sowjanya D 			break;
1132ffd4e739SLakshmi Sowjanya D 
1133ffd4e739SLakshmi Sowjanya D 		case PIN_CONFIG_SLEW_RATE:
1134ffd4e739SLakshmi Sowjanya D 			ret = keembay_pinconf_set_slew_rate(kpc, pin, arg);
1135ffd4e739SLakshmi Sowjanya D 			break;
1136ffd4e739SLakshmi Sowjanya D 
1137ffd4e739SLakshmi Sowjanya D 		case PIN_CONFIG_DRIVE_STRENGTH:
1138ffd4e739SLakshmi Sowjanya D 			ret = keembay_pinconf_set_drive(kpc, pin, arg);
1139ffd4e739SLakshmi Sowjanya D 			break;
1140ffd4e739SLakshmi Sowjanya D 
1141ffd4e739SLakshmi Sowjanya D 		default:
1142ffd4e739SLakshmi Sowjanya D 			return -ENOTSUPP;
1143ffd4e739SLakshmi Sowjanya D 		}
1144ffd4e739SLakshmi Sowjanya D 		if (ret)
1145ffd4e739SLakshmi Sowjanya D 			return ret;
1146ffd4e739SLakshmi Sowjanya D 	}
1147ffd4e739SLakshmi Sowjanya D 	return ret;
1148ffd4e739SLakshmi Sowjanya D }
1149ffd4e739SLakshmi Sowjanya D 
1150ffd4e739SLakshmi Sowjanya D static const struct pinctrl_ops keembay_pctlops = {
1151ffd4e739SLakshmi Sowjanya D 	.get_groups_count	= pinctrl_generic_get_group_count,
1152ffd4e739SLakshmi Sowjanya D 	.get_group_name		= pinctrl_generic_get_group_name,
1153ffd4e739SLakshmi Sowjanya D 	.get_group_pins		= pinctrl_generic_get_group_pins,
1154ffd4e739SLakshmi Sowjanya D 	.dt_node_to_map		= pinconf_generic_dt_node_to_map_all,
1155ffd4e739SLakshmi Sowjanya D 	.dt_free_map		= pinconf_generic_dt_free_map,
1156ffd4e739SLakshmi Sowjanya D };
1157ffd4e739SLakshmi Sowjanya D 
1158ffd4e739SLakshmi Sowjanya D static const struct pinmux_ops keembay_pmxops = {
1159ffd4e739SLakshmi Sowjanya D 	.get_functions_count	= pinmux_generic_get_function_count,
1160ffd4e739SLakshmi Sowjanya D 	.get_function_name	= pinmux_generic_get_function_name,
1161ffd4e739SLakshmi Sowjanya D 	.get_function_groups	= pinmux_generic_get_function_groups,
1162ffd4e739SLakshmi Sowjanya D 	.gpio_request_enable	= keembay_request_gpio,
1163ffd4e739SLakshmi Sowjanya D 	.set_mux		= keembay_set_mux,
1164ffd4e739SLakshmi Sowjanya D };
1165ffd4e739SLakshmi Sowjanya D 
1166ffd4e739SLakshmi Sowjanya D static const struct pinconf_ops keembay_confops = {
1167ffd4e739SLakshmi Sowjanya D 	.is_generic	= true,
1168ffd4e739SLakshmi Sowjanya D 	.pin_config_get	= keembay_pinconf_get,
1169ffd4e739SLakshmi Sowjanya D 	.pin_config_set	= keembay_pinconf_set,
1170ffd4e739SLakshmi Sowjanya D };
1171ffd4e739SLakshmi Sowjanya D 
1172ffd4e739SLakshmi Sowjanya D static struct pinctrl_desc keembay_pinctrl_desc = {
1173ffd4e739SLakshmi Sowjanya D 	.name		= "keembay-pinmux",
1174ffd4e739SLakshmi Sowjanya D 	.pctlops	= &keembay_pctlops,
1175ffd4e739SLakshmi Sowjanya D 	.pmxops		= &keembay_pmxops,
1176ffd4e739SLakshmi Sowjanya D 	.confops	= &keembay_confops,
1177ffd4e739SLakshmi Sowjanya D 	.owner		= THIS_MODULE,
1178ffd4e739SLakshmi Sowjanya D };
1179ffd4e739SLakshmi Sowjanya D 
keembay_gpio_get(struct gpio_chip * gc,unsigned int pin)1180ffd4e739SLakshmi Sowjanya D static int keembay_gpio_get(struct gpio_chip *gc, unsigned int pin)
1181ffd4e739SLakshmi Sowjanya D {
1182ffd4e739SLakshmi Sowjanya D 	struct keembay_pinctrl *kpc = gpiochip_get_data(gc);
1183ffd4e739SLakshmi Sowjanya D 	unsigned int val, offset;
1184ffd4e739SLakshmi Sowjanya D 
1185ffd4e739SLakshmi Sowjanya D 	val = keembay_read_reg(kpc->base1 + KEEMBAY_GPIO_MODE, pin);
1186ffd4e739SLakshmi Sowjanya D 	offset = (val & KEEMBAY_GPIO_MODE_DIR) ? KEEMBAY_GPIO_DATA_IN : KEEMBAY_GPIO_DATA_OUT;
1187ffd4e739SLakshmi Sowjanya D 
1188ffd4e739SLakshmi Sowjanya D 	return keembay_read_pin(kpc->base0 + offset, pin);
1189ffd4e739SLakshmi Sowjanya D }
1190ffd4e739SLakshmi Sowjanya D 
keembay_gpio_set(struct gpio_chip * gc,unsigned int pin,int val)1191ffd4e739SLakshmi Sowjanya D static void keembay_gpio_set(struct gpio_chip *gc, unsigned int pin, int val)
1192ffd4e739SLakshmi Sowjanya D {
1193ffd4e739SLakshmi Sowjanya D 	struct keembay_pinctrl *kpc = gpiochip_get_data(gc);
1194ffd4e739SLakshmi Sowjanya D 	unsigned int reg_val;
1195ffd4e739SLakshmi Sowjanya D 
1196ffd4e739SLakshmi Sowjanya D 	reg_val = keembay_read_gpio_reg(kpc->base0 + KEEMBAY_GPIO_DATA_OUT, pin);
1197ffd4e739SLakshmi Sowjanya D 	if (val)
1198ffd4e739SLakshmi Sowjanya D 		keembay_write_gpio_reg(reg_val | BIT(pin % KEEMBAY_GPIO_MAX_PER_REG),
1199ffd4e739SLakshmi Sowjanya D 				       kpc->base0 + KEEMBAY_GPIO_DATA_HIGH, pin);
1200ffd4e739SLakshmi Sowjanya D 	else
1201ffd4e739SLakshmi Sowjanya D 		keembay_write_gpio_reg(~reg_val | BIT(pin % KEEMBAY_GPIO_MAX_PER_REG),
1202ffd4e739SLakshmi Sowjanya D 				       kpc->base0 + KEEMBAY_GPIO_DATA_LOW, pin);
1203ffd4e739SLakshmi Sowjanya D }
1204ffd4e739SLakshmi Sowjanya D 
keembay_gpio_get_direction(struct gpio_chip * gc,unsigned int pin)1205ffd4e739SLakshmi Sowjanya D static int keembay_gpio_get_direction(struct gpio_chip *gc, unsigned int pin)
1206ffd4e739SLakshmi Sowjanya D {
1207ffd4e739SLakshmi Sowjanya D 	struct keembay_pinctrl *kpc = gpiochip_get_data(gc);
1208ffd4e739SLakshmi Sowjanya D 	unsigned int val = keembay_read_reg(kpc->base1 + KEEMBAY_GPIO_MODE, pin);
1209ffd4e739SLakshmi Sowjanya D 
1210ffd4e739SLakshmi Sowjanya D 	return !!(val & KEEMBAY_GPIO_MODE_DIR);
1211ffd4e739SLakshmi Sowjanya D }
1212ffd4e739SLakshmi Sowjanya D 
keembay_gpio_set_direction_in(struct gpio_chip * gc,unsigned int pin)1213ffd4e739SLakshmi Sowjanya D static int keembay_gpio_set_direction_in(struct gpio_chip *gc, unsigned int pin)
1214ffd4e739SLakshmi Sowjanya D {
1215ffd4e739SLakshmi Sowjanya D 	struct keembay_pinctrl *kpc = gpiochip_get_data(gc);
1216ffd4e739SLakshmi Sowjanya D 	unsigned int val;
1217ffd4e739SLakshmi Sowjanya D 
1218ffd4e739SLakshmi Sowjanya D 	val = keembay_read_reg(kpc->base1 + KEEMBAY_GPIO_MODE, pin);
1219ffd4e739SLakshmi Sowjanya D 	val |= KEEMBAY_GPIO_MODE_DIR;
1220ffd4e739SLakshmi Sowjanya D 	keembay_write_reg(val, kpc->base1 + KEEMBAY_GPIO_MODE, pin);
1221ffd4e739SLakshmi Sowjanya D 
1222ffd4e739SLakshmi Sowjanya D 	return 0;
1223ffd4e739SLakshmi Sowjanya D }
1224ffd4e739SLakshmi Sowjanya D 
keembay_gpio_set_direction_out(struct gpio_chip * gc,unsigned int pin,int value)1225ffd4e739SLakshmi Sowjanya D static int keembay_gpio_set_direction_out(struct gpio_chip *gc,
1226ffd4e739SLakshmi Sowjanya D 					  unsigned int pin, int value)
1227ffd4e739SLakshmi Sowjanya D {
1228ffd4e739SLakshmi Sowjanya D 	struct keembay_pinctrl *kpc = gpiochip_get_data(gc);
1229ffd4e739SLakshmi Sowjanya D 	unsigned int val;
1230ffd4e739SLakshmi Sowjanya D 
1231ffd4e739SLakshmi Sowjanya D 	val = keembay_read_reg(kpc->base1 + KEEMBAY_GPIO_MODE, pin);
1232ffd4e739SLakshmi Sowjanya D 	val &= ~KEEMBAY_GPIO_MODE_DIR;
1233ffd4e739SLakshmi Sowjanya D 	keembay_write_reg(val, kpc->base1 + KEEMBAY_GPIO_MODE, pin);
1234ffd4e739SLakshmi Sowjanya D 	keembay_gpio_set(gc, pin, value);
1235ffd4e739SLakshmi Sowjanya D 
1236ffd4e739SLakshmi Sowjanya D 	return 0;
1237ffd4e739SLakshmi Sowjanya D }
1238ffd4e739SLakshmi Sowjanya D 
keembay_gpio_irq_handler(struct irq_desc * desc)1239ffd4e739SLakshmi Sowjanya D static void keembay_gpio_irq_handler(struct irq_desc *desc)
1240ffd4e739SLakshmi Sowjanya D {
1241ffd4e739SLakshmi Sowjanya D 	struct gpio_chip *gc = irq_desc_get_handler_data(desc);
1242ffd4e739SLakshmi Sowjanya D 	unsigned int kmb_irq = irq_desc_get_irq(desc);
1243ffd4e739SLakshmi Sowjanya D 	unsigned long reg, clump = 0, bit = 0;
1244ffd4e739SLakshmi Sowjanya D 	struct irq_chip *parent_chip;
1245ffd4e739SLakshmi Sowjanya D 	struct keembay_pinctrl *kpc;
1246ffd4e739SLakshmi Sowjanya D 	unsigned int src, pin, val;
1247ffd4e739SLakshmi Sowjanya D 
1248ffd4e739SLakshmi Sowjanya D 	/* Identify GPIO interrupt number from GIC interrupt number */
1249ffd4e739SLakshmi Sowjanya D 	for (src = 0; src < KEEMBAY_GPIO_NUM_IRQ; src++) {
1250ffd4e739SLakshmi Sowjanya D 		if (kmb_irq == gc->irq.parents[src])
1251ffd4e739SLakshmi Sowjanya D 			break;
1252ffd4e739SLakshmi Sowjanya D 	}
1253ffd4e739SLakshmi Sowjanya D 
1254ffd4e739SLakshmi Sowjanya D 	if (src == KEEMBAY_GPIO_NUM_IRQ)
1255ffd4e739SLakshmi Sowjanya D 		return;
1256ffd4e739SLakshmi Sowjanya D 
1257ffd4e739SLakshmi Sowjanya D 	parent_chip = irq_desc_get_chip(desc);
1258ffd4e739SLakshmi Sowjanya D 	kpc = gpiochip_get_data(gc);
1259ffd4e739SLakshmi Sowjanya D 
1260ffd4e739SLakshmi Sowjanya D 	chained_irq_enter(parent_chip, desc);
1261ffd4e739SLakshmi Sowjanya D 	reg = keembay_read_reg(kpc->base1 + KEEMBAY_GPIO_INT_CFG, src);
1262ffd4e739SLakshmi Sowjanya D 
1263ffd4e739SLakshmi Sowjanya D 	/*
1264ffd4e739SLakshmi Sowjanya D 	 * Each Interrupt line can be shared by up to 4 GPIO pins. Enable bit
1265ffd4e739SLakshmi Sowjanya D 	 * and input values were checked to identify the source of the
1266ffd4e739SLakshmi Sowjanya D 	 * Interrupt. The checked enable bit positions are 7, 15, 23 and 31.
1267ffd4e739SLakshmi Sowjanya D 	 */
1268ffd4e739SLakshmi Sowjanya D 	for_each_set_clump8(bit, clump, &reg, BITS_PER_TYPE(typeof(reg))) {
1269ffd4e739SLakshmi Sowjanya D 		pin = clump & ~KEEMBAY_GPIO_IRQ_ENABLE;
1270ffd4e739SLakshmi Sowjanya D 		val = keembay_read_pin(kpc->base0 + KEEMBAY_GPIO_DATA_IN, pin);
1271ffd4e739SLakshmi Sowjanya D 		kmb_irq = irq_linear_revmap(gc->irq.domain, pin);
1272ffd4e739SLakshmi Sowjanya D 
1273ffd4e739SLakshmi Sowjanya D 		/* Checks if the interrupt is enabled */
1274ffd4e739SLakshmi Sowjanya D 		if (val && (clump & KEEMBAY_GPIO_IRQ_ENABLE))
1275ffd4e739SLakshmi Sowjanya D 			generic_handle_irq(kmb_irq);
1276ffd4e739SLakshmi Sowjanya D 	}
1277ffd4e739SLakshmi Sowjanya D 	chained_irq_exit(parent_chip, desc);
1278ffd4e739SLakshmi Sowjanya D }
1279ffd4e739SLakshmi Sowjanya D 
keembay_gpio_clear_irq(struct irq_data * data,unsigned long pos,u32 src,irq_hw_number_t pin)1280ffd4e739SLakshmi Sowjanya D static void keembay_gpio_clear_irq(struct irq_data *data, unsigned long pos,
1281ffd4e739SLakshmi Sowjanya D 				   u32 src, irq_hw_number_t pin)
1282ffd4e739SLakshmi Sowjanya D {
1283ffd4e739SLakshmi Sowjanya D 	struct gpio_chip *gc = irq_data_get_irq_chip_data(data);
1284ffd4e739SLakshmi Sowjanya D 	struct keembay_pinctrl *kpc = gpiochip_get_data(gc);
1285ffd4e739SLakshmi Sowjanya D 	unsigned long trig = irqd_get_trigger_type(data);
1286ffd4e739SLakshmi Sowjanya D 	struct keembay_gpio_irq *irq = &kpc->irq[src];
1287ffd4e739SLakshmi Sowjanya D 	unsigned long val;
1288ffd4e739SLakshmi Sowjanya D 
1289ffd4e739SLakshmi Sowjanya D 	/* Check if the value of pos/KEEMBAY_GPIO_NUM_IRQ is in valid range. */
1290ffd4e739SLakshmi Sowjanya D 	if ((pos / KEEMBAY_GPIO_NUM_IRQ) >= KEEMBAY_GPIO_MAX_PER_IRQ)
1291ffd4e739SLakshmi Sowjanya D 		return;
1292ffd4e739SLakshmi Sowjanya D 
1293ffd4e739SLakshmi Sowjanya D 	/* Retains val register as it handles other interrupts as well. */
1294ffd4e739SLakshmi Sowjanya D 	val = keembay_read_reg(kpc->base1 + KEEMBAY_GPIO_INT_CFG, src);
1295ffd4e739SLakshmi Sowjanya D 
1296ffd4e739SLakshmi Sowjanya D 	bitmap_set_value8(&val, 0, pos);
1297ffd4e739SLakshmi Sowjanya D 	keembay_write_reg(val, kpc->base1 + KEEMBAY_GPIO_INT_CFG, src);
1298ffd4e739SLakshmi Sowjanya D 
1299ffd4e739SLakshmi Sowjanya D 	irq->num_share--;
1300ffd4e739SLakshmi Sowjanya D 	irq->pins[pos / KEEMBAY_GPIO_NUM_IRQ] = 0;
1301ffd4e739SLakshmi Sowjanya D 
1302ffd4e739SLakshmi Sowjanya D 	if (trig & IRQ_TYPE_LEVEL_MASK)
1303ffd4e739SLakshmi Sowjanya D 		keembay_gpio_restore_default(kpc, pin);
1304ffd4e739SLakshmi Sowjanya D 
1305ffd4e739SLakshmi Sowjanya D 	if (irq->trigger == IRQ_TYPE_LEVEL_HIGH)
1306ffd4e739SLakshmi Sowjanya D 		kpc->max_gpios_level_type++;
1307ffd4e739SLakshmi Sowjanya D 	else if (irq->trigger == IRQ_TYPE_EDGE_RISING)
1308ffd4e739SLakshmi Sowjanya D 		kpc->max_gpios_edge_type++;
1309ffd4e739SLakshmi Sowjanya D }
1310ffd4e739SLakshmi Sowjanya D 
keembay_find_free_slot(struct keembay_pinctrl * kpc,unsigned int src)1311ffd4e739SLakshmi Sowjanya D static int keembay_find_free_slot(struct keembay_pinctrl *kpc, unsigned int src)
1312ffd4e739SLakshmi Sowjanya D {
1313ffd4e739SLakshmi Sowjanya D 	unsigned long val = keembay_read_reg(kpc->base1 + KEEMBAY_GPIO_INT_CFG, src);
1314ffd4e739SLakshmi Sowjanya D 
1315ffd4e739SLakshmi Sowjanya D 	return bitmap_find_free_region(&val, KEEMBAY_GPIO_MAX_PER_REG, 3) / KEEMBAY_GPIO_NUM_IRQ;
1316ffd4e739SLakshmi Sowjanya D }
1317ffd4e739SLakshmi Sowjanya D 
keembay_find_free_src(struct keembay_pinctrl * kpc,unsigned int trig)1318ffd4e739SLakshmi Sowjanya D static int keembay_find_free_src(struct keembay_pinctrl *kpc, unsigned int trig)
1319ffd4e739SLakshmi Sowjanya D {
1320ffd4e739SLakshmi Sowjanya D 	int src, type = 0;
1321ffd4e739SLakshmi Sowjanya D 
1322ffd4e739SLakshmi Sowjanya D 	if (trig & IRQ_TYPE_LEVEL_MASK)
1323ffd4e739SLakshmi Sowjanya D 		type = IRQ_TYPE_LEVEL_HIGH;
1324ffd4e739SLakshmi Sowjanya D 	else if (trig & IRQ_TYPE_EDGE_BOTH)
1325ffd4e739SLakshmi Sowjanya D 		type = IRQ_TYPE_EDGE_RISING;
1326ffd4e739SLakshmi Sowjanya D 
1327ffd4e739SLakshmi Sowjanya D 	for (src = 0; src < KEEMBAY_GPIO_NUM_IRQ; src++) {
1328ffd4e739SLakshmi Sowjanya D 		if (kpc->irq[src].trigger != type)
1329ffd4e739SLakshmi Sowjanya D 			continue;
1330ffd4e739SLakshmi Sowjanya D 
1331ffd4e739SLakshmi Sowjanya D 		if (!keembay_read_reg(kpc->base1 + KEEMBAY_GPIO_INT_CFG, src) ||
1332ffd4e739SLakshmi Sowjanya D 		    kpc->irq[src].num_share < KEEMBAY_GPIO_MAX_PER_IRQ)
1333ffd4e739SLakshmi Sowjanya D 			return src;
1334ffd4e739SLakshmi Sowjanya D 	}
1335ffd4e739SLakshmi Sowjanya D 
1336ffd4e739SLakshmi Sowjanya D 	return -EBUSY;
1337ffd4e739SLakshmi Sowjanya D }
1338ffd4e739SLakshmi Sowjanya D 
keembay_gpio_set_irq(struct keembay_pinctrl * kpc,int src,int slot,irq_hw_number_t pin)1339ffd4e739SLakshmi Sowjanya D static void keembay_gpio_set_irq(struct keembay_pinctrl *kpc, int src,
1340ffd4e739SLakshmi Sowjanya D 				 int slot, irq_hw_number_t pin)
1341ffd4e739SLakshmi Sowjanya D {
1342ffd4e739SLakshmi Sowjanya D 	unsigned long val = pin | KEEMBAY_GPIO_IRQ_ENABLE;
1343ffd4e739SLakshmi Sowjanya D 	struct keembay_gpio_irq *irq = &kpc->irq[src];
1344ffd4e739SLakshmi Sowjanya D 	unsigned long flags, reg;
1345ffd4e739SLakshmi Sowjanya D 
1346ffd4e739SLakshmi Sowjanya D 	raw_spin_lock_irqsave(&kpc->lock, flags);
1347ffd4e739SLakshmi Sowjanya D 	reg = keembay_read_reg(kpc->base1 + KEEMBAY_GPIO_INT_CFG, src);
1348ffd4e739SLakshmi Sowjanya D 	bitmap_set_value8(&reg, val, slot * 8);
1349ffd4e739SLakshmi Sowjanya D 	keembay_write_reg(reg, kpc->base1 + KEEMBAY_GPIO_INT_CFG, src);
1350ffd4e739SLakshmi Sowjanya D 	raw_spin_unlock_irqrestore(&kpc->lock, flags);
1351ffd4e739SLakshmi Sowjanya D 
1352ffd4e739SLakshmi Sowjanya D 	if (irq->trigger == IRQ_TYPE_LEVEL_HIGH)
1353ffd4e739SLakshmi Sowjanya D 		kpc->max_gpios_level_type--;
1354ffd4e739SLakshmi Sowjanya D 	else if (irq->trigger == IRQ_TYPE_EDGE_RISING)
1355ffd4e739SLakshmi Sowjanya D 		kpc->max_gpios_edge_type--;
1356ffd4e739SLakshmi Sowjanya D 
1357ffd4e739SLakshmi Sowjanya D 	irq->source = src;
1358ffd4e739SLakshmi Sowjanya D 	irq->pins[slot] = pin;
1359ffd4e739SLakshmi Sowjanya D 	irq->num_share++;
1360ffd4e739SLakshmi Sowjanya D }
1361ffd4e739SLakshmi Sowjanya D 
keembay_gpio_irq_enable(struct irq_data * data)1362ffd4e739SLakshmi Sowjanya D static void keembay_gpio_irq_enable(struct irq_data *data)
1363ffd4e739SLakshmi Sowjanya D {
1364ffd4e739SLakshmi Sowjanya D 	struct gpio_chip *gc = irq_data_get_irq_chip_data(data);
1365ffd4e739SLakshmi Sowjanya D 	struct keembay_pinctrl *kpc = gpiochip_get_data(gc);
1366ffd4e739SLakshmi Sowjanya D 	unsigned int trig = irqd_get_trigger_type(data);
1367ffd4e739SLakshmi Sowjanya D 	irq_hw_number_t pin = irqd_to_hwirq(data);
1368ffd4e739SLakshmi Sowjanya D 	int src, slot;
1369ffd4e739SLakshmi Sowjanya D 
1370ffd4e739SLakshmi Sowjanya D 	/* Check which Interrupt source and slot is available */
1371ffd4e739SLakshmi Sowjanya D 	src = keembay_find_free_src(kpc, trig);
1372ffd4e739SLakshmi Sowjanya D 	slot = keembay_find_free_slot(kpc, src);
1373ffd4e739SLakshmi Sowjanya D 
1374ffd4e739SLakshmi Sowjanya D 	if (src < 0 || slot < 0)
1375ffd4e739SLakshmi Sowjanya D 		return;
1376ffd4e739SLakshmi Sowjanya D 
1377ffd4e739SLakshmi Sowjanya D 	if (trig & KEEMBAY_GPIO_SENSE_LOW)
1378ffd4e739SLakshmi Sowjanya D 		keembay_gpio_invert(kpc, pin);
1379ffd4e739SLakshmi Sowjanya D 
1380ffd4e739SLakshmi Sowjanya D 	keembay_gpio_set_irq(kpc, src, slot, pin);
1381ffd4e739SLakshmi Sowjanya D }
1382ffd4e739SLakshmi Sowjanya D 
keembay_gpio_irq_ack(struct irq_data * data)1383ffd4e739SLakshmi Sowjanya D static void keembay_gpio_irq_ack(struct irq_data *data)
1384ffd4e739SLakshmi Sowjanya D {
1385ffd4e739SLakshmi Sowjanya D 	/*
1386ffd4e739SLakshmi Sowjanya D 	 * The keembay_gpio_irq_ack function is needed to handle_edge_irq.
1387ffd4e739SLakshmi Sowjanya D 	 * IRQ ack is not possible from the SOC perspective. The IP by itself
1388ffd4e739SLakshmi Sowjanya D 	 * is used for handling interrupts which do not come in short-time and
1389ffd4e739SLakshmi Sowjanya D 	 * not used as protocol or communication interrupts. All the interrupts
1390ffd4e739SLakshmi Sowjanya D 	 * are threaded IRQ interrupts. But this function is expected to be
1391ffd4e739SLakshmi Sowjanya D 	 * present as the gpio IP is registered with irq framework. Otherwise
1392ffd4e739SLakshmi Sowjanya D 	 * handle_edge_irq() fails.
1393ffd4e739SLakshmi Sowjanya D 	 */
1394ffd4e739SLakshmi Sowjanya D }
1395ffd4e739SLakshmi Sowjanya D 
keembay_gpio_irq_disable(struct irq_data * data)1396ffd4e739SLakshmi Sowjanya D static void keembay_gpio_irq_disable(struct irq_data *data)
1397ffd4e739SLakshmi Sowjanya D {
1398ffd4e739SLakshmi Sowjanya D 	struct gpio_chip *gc = irq_data_get_irq_chip_data(data);
1399ffd4e739SLakshmi Sowjanya D 	struct keembay_pinctrl *kpc = gpiochip_get_data(gc);
1400ffd4e739SLakshmi Sowjanya D 	irq_hw_number_t pin = irqd_to_hwirq(data);
1401ffd4e739SLakshmi Sowjanya D 	unsigned long reg, clump = 0, pos = 0;
1402ffd4e739SLakshmi Sowjanya D 	unsigned int src;
1403ffd4e739SLakshmi Sowjanya D 
1404ffd4e739SLakshmi Sowjanya D 	for (src = 0; src < KEEMBAY_GPIO_NUM_IRQ; src++) {
1405ffd4e739SLakshmi Sowjanya D 		reg = keembay_read_reg(kpc->base1 + KEEMBAY_GPIO_INT_CFG, src);
1406ffd4e739SLakshmi Sowjanya D 		for_each_set_clump8(pos, clump, &reg, BITS_PER_TYPE(typeof(reg))) {
1407ffd4e739SLakshmi Sowjanya D 			if ((clump & ~KEEMBAY_GPIO_IRQ_ENABLE) == pin) {
1408ffd4e739SLakshmi Sowjanya D 				keembay_gpio_clear_irq(data, pos, src, pin);
1409ffd4e739SLakshmi Sowjanya D 				return;
1410ffd4e739SLakshmi Sowjanya D 			}
1411ffd4e739SLakshmi Sowjanya D 		}
1412ffd4e739SLakshmi Sowjanya D 	}
1413ffd4e739SLakshmi Sowjanya D }
1414ffd4e739SLakshmi Sowjanya D 
keembay_gpio_irq_set_type(struct irq_data * data,unsigned int type)1415ffd4e739SLakshmi Sowjanya D static int keembay_gpio_irq_set_type(struct irq_data *data, unsigned int type)
1416ffd4e739SLakshmi Sowjanya D {
1417ffd4e739SLakshmi Sowjanya D 	struct gpio_chip *gc = irq_data_get_irq_chip_data(data);
1418ffd4e739SLakshmi Sowjanya D 	struct keembay_pinctrl *kpc = gpiochip_get_data(gc);
1419ffd4e739SLakshmi Sowjanya D 
1420ffd4e739SLakshmi Sowjanya D 	/* Change EDGE_BOTH as EDGE_RISING in order to claim the IRQ for power button */
1421ffd4e739SLakshmi Sowjanya D 	if (!kpc->max_gpios_edge_type && (type & IRQ_TYPE_EDGE_BOTH))
1422ffd4e739SLakshmi Sowjanya D 		type = IRQ_TYPE_EDGE_RISING;
1423ffd4e739SLakshmi Sowjanya D 
1424ffd4e739SLakshmi Sowjanya D 	if (!kpc->max_gpios_level_type && (type & IRQ_TYPE_LEVEL_MASK))
1425ffd4e739SLakshmi Sowjanya D 		type = IRQ_TYPE_NONE;
1426ffd4e739SLakshmi Sowjanya D 
1427ffd4e739SLakshmi Sowjanya D 	if (type & IRQ_TYPE_EDGE_BOTH)
1428ffd4e739SLakshmi Sowjanya D 		irq_set_handler_locked(data, handle_edge_irq);
1429ffd4e739SLakshmi Sowjanya D 	else if (type & IRQ_TYPE_LEVEL_MASK)
1430ffd4e739SLakshmi Sowjanya D 		irq_set_handler_locked(data, handle_level_irq);
1431ffd4e739SLakshmi Sowjanya D 	else
1432ffd4e739SLakshmi Sowjanya D 		return -EINVAL;
1433ffd4e739SLakshmi Sowjanya D 
1434ffd4e739SLakshmi Sowjanya D 	return 0;
1435ffd4e739SLakshmi Sowjanya D }
1436ffd4e739SLakshmi Sowjanya D 
keembay_gpio_add_pin_ranges(struct gpio_chip * chip)1437ffd4e739SLakshmi Sowjanya D static int keembay_gpio_add_pin_ranges(struct gpio_chip *chip)
1438ffd4e739SLakshmi Sowjanya D {
1439ffd4e739SLakshmi Sowjanya D 	struct keembay_pinctrl *kpc = gpiochip_get_data(chip);
1440ffd4e739SLakshmi Sowjanya D 	int ret;
1441ffd4e739SLakshmi Sowjanya D 
1442ffd4e739SLakshmi Sowjanya D 	ret = gpiochip_add_pin_range(chip, dev_name(kpc->dev), 0, 0, chip->ngpio);
1443ffd4e739SLakshmi Sowjanya D 	if (ret)
1444ffd4e739SLakshmi Sowjanya D 		dev_err_probe(kpc->dev, ret, "failed to add GPIO pin range\n");
1445ffd4e739SLakshmi Sowjanya D 	return ret;
1446ffd4e739SLakshmi Sowjanya D }
1447ffd4e739SLakshmi Sowjanya D 
1448ffd4e739SLakshmi Sowjanya D static struct irq_chip keembay_gpio_irqchip = {
1449ffd4e739SLakshmi Sowjanya D 	.name = "keembay-gpio",
1450ffd4e739SLakshmi Sowjanya D 	.irq_enable = keembay_gpio_irq_enable,
1451ffd4e739SLakshmi Sowjanya D 	.irq_disable = keembay_gpio_irq_disable,
1452ffd4e739SLakshmi Sowjanya D 	.irq_set_type = keembay_gpio_irq_set_type,
1453ffd4e739SLakshmi Sowjanya D 	.irq_ack = keembay_gpio_irq_ack,
1454ffd4e739SLakshmi Sowjanya D };
1455ffd4e739SLakshmi Sowjanya D 
keembay_gpiochip_probe(struct keembay_pinctrl * kpc,struct platform_device * pdev)1456ffd4e739SLakshmi Sowjanya D static int keembay_gpiochip_probe(struct keembay_pinctrl *kpc,
1457ffd4e739SLakshmi Sowjanya D 				  struct platform_device *pdev)
1458ffd4e739SLakshmi Sowjanya D {
1459ffd4e739SLakshmi Sowjanya D 	unsigned int i, level_line = 0, edge_line = 0;
1460ffd4e739SLakshmi Sowjanya D 	struct gpio_chip *gc = &kpc->chip;
1461ffd4e739SLakshmi Sowjanya D 	struct gpio_irq_chip *girq;
1462ffd4e739SLakshmi Sowjanya D 
1463ffd4e739SLakshmi Sowjanya D 	/* Setup GPIO IRQ chip */
1464ffd4e739SLakshmi Sowjanya D 	girq			= &kpc->chip.irq;
1465ffd4e739SLakshmi Sowjanya D 	girq->chip		= &keembay_gpio_irqchip;
1466ffd4e739SLakshmi Sowjanya D 	girq->parent_handler	= keembay_gpio_irq_handler;
1467ffd4e739SLakshmi Sowjanya D 	girq->num_parents	= KEEMBAY_GPIO_NUM_IRQ;
1468ffd4e739SLakshmi Sowjanya D 	girq->parents		= devm_kcalloc(kpc->dev, girq->num_parents,
1469ffd4e739SLakshmi Sowjanya D 					       sizeof(*girq->parents), GFP_KERNEL);
1470ffd4e739SLakshmi Sowjanya D 
1471ffd4e739SLakshmi Sowjanya D 	if (!girq->parents)
1472ffd4e739SLakshmi Sowjanya D 		return -ENOMEM;
1473ffd4e739SLakshmi Sowjanya D 
1474ffd4e739SLakshmi Sowjanya D 	/* Setup GPIO chip */
1475ffd4e739SLakshmi Sowjanya D 	gc->label		= dev_name(kpc->dev);
1476ffd4e739SLakshmi Sowjanya D 	gc->parent		= kpc->dev;
1477ffd4e739SLakshmi Sowjanya D 	gc->request		= gpiochip_generic_request;
1478ffd4e739SLakshmi Sowjanya D 	gc->free		= gpiochip_generic_free;
1479ffd4e739SLakshmi Sowjanya D 	gc->get_direction	= keembay_gpio_get_direction;
1480ffd4e739SLakshmi Sowjanya D 	gc->direction_input	= keembay_gpio_set_direction_in;
1481ffd4e739SLakshmi Sowjanya D 	gc->direction_output	= keembay_gpio_set_direction_out;
1482ffd4e739SLakshmi Sowjanya D 	gc->get			= keembay_gpio_get;
1483ffd4e739SLakshmi Sowjanya D 	gc->set			= keembay_gpio_set;
1484ffd4e739SLakshmi Sowjanya D 	gc->set_config		= gpiochip_generic_config;
1485ffd4e739SLakshmi Sowjanya D 	gc->base		= -1;
1486ffd4e739SLakshmi Sowjanya D 	gc->ngpio		= kpc->npins;
1487ffd4e739SLakshmi Sowjanya D 	gc->add_pin_ranges	= keembay_gpio_add_pin_ranges;
1488ffd4e739SLakshmi Sowjanya D 
1489ffd4e739SLakshmi Sowjanya D 	for (i = 0; i < KEEMBAY_GPIO_NUM_IRQ; i++) {
1490ffd4e739SLakshmi Sowjanya D 		struct keembay_gpio_irq *kmb_irq = &kpc->irq[i];
1491ffd4e739SLakshmi Sowjanya D 		int irq;
1492ffd4e739SLakshmi Sowjanya D 
1493ffd4e739SLakshmi Sowjanya D 		irq = platform_get_irq_optional(pdev, i);
1494ffd4e739SLakshmi Sowjanya D 		if (irq <= 0)
1495ffd4e739SLakshmi Sowjanya D 			continue;
1496ffd4e739SLakshmi Sowjanya D 
1497ffd4e739SLakshmi Sowjanya D 		girq->parents[i]	= irq;
1498ffd4e739SLakshmi Sowjanya D 		kmb_irq->line	= girq->parents[i];
1499ffd4e739SLakshmi Sowjanya D 		kmb_irq->source	= i;
1500ffd4e739SLakshmi Sowjanya D 		kmb_irq->trigger	= irq_get_trigger_type(girq->parents[i]);
1501ffd4e739SLakshmi Sowjanya D 		kmb_irq->num_share	= 0;
1502ffd4e739SLakshmi Sowjanya D 
1503ffd4e739SLakshmi Sowjanya D 		if (kmb_irq->trigger == IRQ_TYPE_LEVEL_HIGH)
1504ffd4e739SLakshmi Sowjanya D 			level_line++;
1505ffd4e739SLakshmi Sowjanya D 		else
1506ffd4e739SLakshmi Sowjanya D 			edge_line++;
1507ffd4e739SLakshmi Sowjanya D 	}
1508ffd4e739SLakshmi Sowjanya D 
1509ffd4e739SLakshmi Sowjanya D 	kpc->max_gpios_level_type = level_line * KEEMBAY_GPIO_MAX_PER_IRQ;
1510ffd4e739SLakshmi Sowjanya D 	kpc->max_gpios_edge_type = edge_line * KEEMBAY_GPIO_MAX_PER_IRQ;
1511ffd4e739SLakshmi Sowjanya D 
1512ffd4e739SLakshmi Sowjanya D 	girq->default_type = IRQ_TYPE_NONE;
1513ffd4e739SLakshmi Sowjanya D 	girq->handler = handle_bad_irq;
1514ffd4e739SLakshmi Sowjanya D 
1515ffd4e739SLakshmi Sowjanya D 	return devm_gpiochip_add_data(kpc->dev, gc, kpc);
1516ffd4e739SLakshmi Sowjanya D }
1517ffd4e739SLakshmi Sowjanya D 
keembay_build_groups(struct keembay_pinctrl * kpc)1518ffd4e739SLakshmi Sowjanya D static int keembay_build_groups(struct keembay_pinctrl *kpc)
1519ffd4e739SLakshmi Sowjanya D {
1520ffd4e739SLakshmi Sowjanya D 	struct group_desc *grp;
1521ffd4e739SLakshmi Sowjanya D 	unsigned int i;
1522ffd4e739SLakshmi Sowjanya D 
1523ffd4e739SLakshmi Sowjanya D 	kpc->ngroups = kpc->npins;
1524ffd4e739SLakshmi Sowjanya D 	grp = devm_kcalloc(kpc->dev, kpc->ngroups, sizeof(*grp), GFP_KERNEL);
1525ffd4e739SLakshmi Sowjanya D 	if (!grp)
1526ffd4e739SLakshmi Sowjanya D 		return -ENOMEM;
1527ffd4e739SLakshmi Sowjanya D 
1528ffd4e739SLakshmi Sowjanya D 	/* Each pin is categorised as one group */
1529ffd4e739SLakshmi Sowjanya D 	for (i = 0; i < kpc->ngroups; i++) {
1530ffd4e739SLakshmi Sowjanya D 		const struct pinctrl_pin_desc *pdesc = keembay_pins + i;
1531ffd4e739SLakshmi Sowjanya D 		struct group_desc *kmb_grp = grp + i;
1532ffd4e739SLakshmi Sowjanya D 
1533ffd4e739SLakshmi Sowjanya D 		kmb_grp->name = pdesc->name;
1534ffd4e739SLakshmi Sowjanya D 		kmb_grp->pins = (int *)&pdesc->number;
1535ffd4e739SLakshmi Sowjanya D 		pinctrl_generic_add_group(kpc->pctrl, kmb_grp->name,
1536ffd4e739SLakshmi Sowjanya D 					  kmb_grp->pins, 1, NULL);
1537ffd4e739SLakshmi Sowjanya D 	}
1538ffd4e739SLakshmi Sowjanya D 
1539ffd4e739SLakshmi Sowjanya D 	return 0;
1540ffd4e739SLakshmi Sowjanya D }
1541ffd4e739SLakshmi Sowjanya D 
keembay_pinctrl_reg(struct keembay_pinctrl * kpc,struct device * dev)1542ffd4e739SLakshmi Sowjanya D static int keembay_pinctrl_reg(struct keembay_pinctrl *kpc,  struct device *dev)
1543ffd4e739SLakshmi Sowjanya D {
1544ffd4e739SLakshmi Sowjanya D 	int ret;
1545ffd4e739SLakshmi Sowjanya D 
1546ffd4e739SLakshmi Sowjanya D 	keembay_pinctrl_desc.pins = keembay_pins;
1547ffd4e739SLakshmi Sowjanya D 	ret = of_property_read_u32(dev->of_node, "ngpios", &kpc->npins);
1548ffd4e739SLakshmi Sowjanya D 	if (ret < 0)
1549ffd4e739SLakshmi Sowjanya D 		return ret;
1550ffd4e739SLakshmi Sowjanya D 	keembay_pinctrl_desc.npins = kpc->npins;
1551ffd4e739SLakshmi Sowjanya D 
1552ffd4e739SLakshmi Sowjanya D 	kpc->pctrl = devm_pinctrl_register(kpc->dev, &keembay_pinctrl_desc, kpc);
1553ffd4e739SLakshmi Sowjanya D 
1554ffd4e739SLakshmi Sowjanya D 	return PTR_ERR_OR_ZERO(kpc->pctrl);
1555ffd4e739SLakshmi Sowjanya D }
1556ffd4e739SLakshmi Sowjanya D 
keembay_add_functions(struct keembay_pinctrl * kpc,struct function_desc * functions)1557ffd4e739SLakshmi Sowjanya D static int keembay_add_functions(struct keembay_pinctrl *kpc,
1558*c26c4bfcSRafał Miłecki 				 struct function_desc *functions)
1559ffd4e739SLakshmi Sowjanya D {
1560ffd4e739SLakshmi Sowjanya D 	unsigned int i;
1561ffd4e739SLakshmi Sowjanya D 
1562ffd4e739SLakshmi Sowjanya D 	/* Assign the groups for each function */
1563*c26c4bfcSRafał Miłecki 	for (i = 0; i < kpc->nfuncs; i++) {
1564*c26c4bfcSRafał Miłecki 		struct function_desc *func = &functions[i];
1565*c26c4bfcSRafał Miłecki 		const char **group_names;
1566*c26c4bfcSRafał Miłecki 		unsigned int grp_idx = 0;
1567*c26c4bfcSRafał Miłecki 		int j;
1568ffd4e739SLakshmi Sowjanya D 
1569*c26c4bfcSRafał Miłecki 		group_names = devm_kcalloc(kpc->dev, func->num_group_names,
1570*c26c4bfcSRafał Miłecki 					   sizeof(*group_names), GFP_KERNEL);
1571*c26c4bfcSRafał Miłecki 		if (!group_names)
1572ffd4e739SLakshmi Sowjanya D 			return -ENOMEM;
1573*c26c4bfcSRafał Miłecki 
1574*c26c4bfcSRafał Miłecki 		for (j = 0; j < kpc->npins; j++) {
1575*c26c4bfcSRafał Miłecki 			const struct pinctrl_pin_desc *pdesc = &keembay_pins[j];
1576*c26c4bfcSRafał Miłecki 			struct keembay_mux_desc *mux;
1577*c26c4bfcSRafał Miłecki 
1578*c26c4bfcSRafał Miłecki 			for (mux = pdesc->drv_data; mux->name; mux++) {
1579*c26c4bfcSRafał Miłecki 				if (!strcmp(mux->name, func->name))
1580*c26c4bfcSRafał Miłecki 					group_names[grp_idx++] = pdesc->name;
1581*c26c4bfcSRafał Miłecki 			}
1582ffd4e739SLakshmi Sowjanya D 		}
1583ffd4e739SLakshmi Sowjanya D 
1584*c26c4bfcSRafał Miłecki 		func->group_names = group_names;
1585ffd4e739SLakshmi Sowjanya D 	}
1586ffd4e739SLakshmi Sowjanya D 
1587ffd4e739SLakshmi Sowjanya D 	/* Add all functions */
1588ffd4e739SLakshmi Sowjanya D 	for (i = 0; i < kpc->nfuncs; i++) {
1589ffd4e739SLakshmi Sowjanya D 		pinmux_generic_add_function(kpc->pctrl,
1590*c26c4bfcSRafał Miłecki 					    functions[i].name,
1591*c26c4bfcSRafał Miłecki 					    functions[i].group_names,
1592*c26c4bfcSRafał Miłecki 					    functions[i].num_group_names,
1593*c26c4bfcSRafał Miłecki 					    functions[i].data);
1594ffd4e739SLakshmi Sowjanya D 	}
1595ffd4e739SLakshmi Sowjanya D 
1596ffd4e739SLakshmi Sowjanya D 	return 0;
1597ffd4e739SLakshmi Sowjanya D }
1598ffd4e739SLakshmi Sowjanya D 
keembay_build_functions(struct keembay_pinctrl * kpc)1599ffd4e739SLakshmi Sowjanya D static int keembay_build_functions(struct keembay_pinctrl *kpc)
1600ffd4e739SLakshmi Sowjanya D {
1601ffd4e739SLakshmi Sowjanya D 	struct function_desc *keembay_funcs, *new_funcs;
1602ffd4e739SLakshmi Sowjanya D 	int i;
1603ffd4e739SLakshmi Sowjanya D 
16045d067499SRafał Miłecki 	/*
16055d067499SRafał Miłecki 	 * Allocate maximum possible number of functions. Assume every pin
16065d067499SRafał Miłecki 	 * being part of 8 (hw maximum) globally unique muxes.
16075d067499SRafał Miłecki 	 */
1608ffd4e739SLakshmi Sowjanya D 	kpc->nfuncs = 0;
1609ffd4e739SLakshmi Sowjanya D 	keembay_funcs = kcalloc(kpc->npins * 8, sizeof(*keembay_funcs), GFP_KERNEL);
1610ffd4e739SLakshmi Sowjanya D 	if (!keembay_funcs)
1611ffd4e739SLakshmi Sowjanya D 		return -ENOMEM;
1612ffd4e739SLakshmi Sowjanya D 
16135d067499SRafał Miłecki 	/* Setup 1 function for each unique mux */
1614ffd4e739SLakshmi Sowjanya D 	for (i = 0; i < kpc->npins; i++) {
1615ffd4e739SLakshmi Sowjanya D 		const struct pinctrl_pin_desc *pdesc = keembay_pins + i;
16165d067499SRafał Miłecki 		struct keembay_mux_desc *mux;
1617ffd4e739SLakshmi Sowjanya D 
16185d067499SRafał Miłecki 		for (mux = pdesc->drv_data; mux->name; mux++) {
16195d067499SRafał Miłecki 			struct function_desc *fdesc;
1620ffd4e739SLakshmi Sowjanya D 
16215d067499SRafał Miłecki 			/* Check if we already have function for this mux */
16225d067499SRafał Miłecki 			for (fdesc = keembay_funcs; fdesc->name; fdesc++) {
1623ffd4e739SLakshmi Sowjanya D 				if (!strcmp(mux->name, fdesc->name)) {
1624ffd4e739SLakshmi Sowjanya D 					fdesc->num_group_names++;
1625ffd4e739SLakshmi Sowjanya D 					break;
1626ffd4e739SLakshmi Sowjanya D 				}
1627ffd4e739SLakshmi Sowjanya D 			}
1628ffd4e739SLakshmi Sowjanya D 
16295d067499SRafał Miłecki 			/* Setup new function for this mux we didn't see before */
1630ffd4e739SLakshmi Sowjanya D 			if (!fdesc->name) {
1631ffd4e739SLakshmi Sowjanya D 				fdesc->name = mux->name;
1632ffd4e739SLakshmi Sowjanya D 				fdesc->num_group_names = 1;
1633ffd4e739SLakshmi Sowjanya D 				fdesc->data = &mux->mode;
1634ffd4e739SLakshmi Sowjanya D 				kpc->nfuncs++;
1635ffd4e739SLakshmi Sowjanya D 			}
1636ffd4e739SLakshmi Sowjanya D 		}
1637ffd4e739SLakshmi Sowjanya D 	}
1638ffd4e739SLakshmi Sowjanya D 
1639ffd4e739SLakshmi Sowjanya D 	/* Reallocate memory based on actual number of functions */
1640ffd4e739SLakshmi Sowjanya D 	new_funcs = krealloc(keembay_funcs, kpc->nfuncs * sizeof(*new_funcs), GFP_KERNEL);
1641ffd4e739SLakshmi Sowjanya D 	if (!new_funcs) {
1642ffd4e739SLakshmi Sowjanya D 		kfree(keembay_funcs);
1643ffd4e739SLakshmi Sowjanya D 		return -ENOMEM;
1644ffd4e739SLakshmi Sowjanya D 	}
1645ffd4e739SLakshmi Sowjanya D 
1646ffd4e739SLakshmi Sowjanya D 	return keembay_add_functions(kpc, new_funcs);
1647ffd4e739SLakshmi Sowjanya D }
1648ffd4e739SLakshmi Sowjanya D 
1649ffd4e739SLakshmi Sowjanya D static const struct keembay_pin_soc keembay_data = {
1650ffd4e739SLakshmi Sowjanya D 	.pins    = keembay_pins,
1651ffd4e739SLakshmi Sowjanya D };
1652ffd4e739SLakshmi Sowjanya D 
1653ffd4e739SLakshmi Sowjanya D static const struct of_device_id keembay_pinctrl_match[] = {
1654ffd4e739SLakshmi Sowjanya D 	{ .compatible = "intel,keembay-pinctrl", .data = &keembay_data },
1655ffd4e739SLakshmi Sowjanya D 	{ }
1656ffd4e739SLakshmi Sowjanya D };
1657ffd4e739SLakshmi Sowjanya D MODULE_DEVICE_TABLE(of, keembay_pinctrl_match);
1658ffd4e739SLakshmi Sowjanya D 
keembay_pinctrl_probe(struct platform_device * pdev)1659ffd4e739SLakshmi Sowjanya D static int keembay_pinctrl_probe(struct platform_device *pdev)
1660ffd4e739SLakshmi Sowjanya D {
1661ffd4e739SLakshmi Sowjanya D 	struct device *dev = &pdev->dev;
1662ffd4e739SLakshmi Sowjanya D 	struct keembay_pinctrl *kpc;
1663ffd4e739SLakshmi Sowjanya D 	int ret;
1664ffd4e739SLakshmi Sowjanya D 
1665ffd4e739SLakshmi Sowjanya D 	kpc = devm_kzalloc(dev, sizeof(*kpc), GFP_KERNEL);
1666ffd4e739SLakshmi Sowjanya D 	if (!kpc)
1667ffd4e739SLakshmi Sowjanya D 		return -ENOMEM;
1668ffd4e739SLakshmi Sowjanya D 
1669ffd4e739SLakshmi Sowjanya D 	kpc->dev = dev;
1670ffd4e739SLakshmi Sowjanya D 	kpc->soc = device_get_match_data(dev);
1671ffd4e739SLakshmi Sowjanya D 
1672ffd4e739SLakshmi Sowjanya D 	kpc->base0 = devm_platform_ioremap_resource(pdev, 0);
1673ffd4e739SLakshmi Sowjanya D 	if (IS_ERR(kpc->base0))
1674ffd4e739SLakshmi Sowjanya D 		return PTR_ERR(kpc->base0);
1675ffd4e739SLakshmi Sowjanya D 
1676ffd4e739SLakshmi Sowjanya D 	kpc->base1 = devm_platform_ioremap_resource(pdev, 1);
1677ffd4e739SLakshmi Sowjanya D 	if (IS_ERR(kpc->base1))
1678ffd4e739SLakshmi Sowjanya D 		return PTR_ERR(kpc->base1);
1679ffd4e739SLakshmi Sowjanya D 
1680ffd4e739SLakshmi Sowjanya D 	raw_spin_lock_init(&kpc->lock);
1681ffd4e739SLakshmi Sowjanya D 
1682ffd4e739SLakshmi Sowjanya D 	ret = keembay_pinctrl_reg(kpc, dev);
1683ffd4e739SLakshmi Sowjanya D 	if (ret)
1684ffd4e739SLakshmi Sowjanya D 		return ret;
1685ffd4e739SLakshmi Sowjanya D 
1686ffd4e739SLakshmi Sowjanya D 	ret = keembay_build_groups(kpc);
1687ffd4e739SLakshmi Sowjanya D 	if (ret)
1688ffd4e739SLakshmi Sowjanya D 		return ret;
1689ffd4e739SLakshmi Sowjanya D 
1690ffd4e739SLakshmi Sowjanya D 	ret = keembay_build_functions(kpc);
1691ffd4e739SLakshmi Sowjanya D 	if (ret)
1692ffd4e739SLakshmi Sowjanya D 		return ret;
1693ffd4e739SLakshmi Sowjanya D 
1694ffd4e739SLakshmi Sowjanya D 	ret = keembay_gpiochip_probe(kpc, pdev);
1695ffd4e739SLakshmi Sowjanya D 	if (ret)
1696ffd4e739SLakshmi Sowjanya D 		return ret;
1697ffd4e739SLakshmi Sowjanya D 
1698ffd4e739SLakshmi Sowjanya D 	platform_set_drvdata(pdev, kpc);
1699ffd4e739SLakshmi Sowjanya D 
1700ffd4e739SLakshmi Sowjanya D 	return 0;
1701ffd4e739SLakshmi Sowjanya D }
1702ffd4e739SLakshmi Sowjanya D 
1703ffd4e739SLakshmi Sowjanya D static struct platform_driver keembay_pinctrl_driver = {
1704ffd4e739SLakshmi Sowjanya D 	.probe = keembay_pinctrl_probe,
1705ffd4e739SLakshmi Sowjanya D 	.driver = {
1706ffd4e739SLakshmi Sowjanya D 		.name = "keembay-pinctrl",
1707ffd4e739SLakshmi Sowjanya D 		.of_match_table = keembay_pinctrl_match,
1708ffd4e739SLakshmi Sowjanya D 	},
1709ffd4e739SLakshmi Sowjanya D };
1710ffd4e739SLakshmi Sowjanya D module_platform_driver(keembay_pinctrl_driver);
1711ffd4e739SLakshmi Sowjanya D 
1712ffd4e739SLakshmi Sowjanya D MODULE_AUTHOR("Muhammad Husaini Zulkifli <muhammad.husaini.zulkifli@intel.com>");
1713ffd4e739SLakshmi Sowjanya D MODULE_AUTHOR("Vijayakannan Ayyathurai <vijayakannan.ayyathurai@intel.com>");
1714ffd4e739SLakshmi Sowjanya D MODULE_AUTHOR("Lakshmi Sowjanya D <lakshmi.sowjanya.d@intel.com>");
1715ffd4e739SLakshmi Sowjanya D MODULE_DESCRIPTION("Intel Keem Bay SoC pinctrl/GPIO driver");
1716ffd4e739SLakshmi Sowjanya D MODULE_LICENSE("GPL");
1717