0001
0002
0003
0004 #include <linux/bitfield.h>
0005 #include <linux/bitops.h>
0006 #include <linux/gpio/driver.h>
0007 #include <linux/interrupt.h>
0008 #include <linux/io.h>
0009 #include <linux/module.h>
0010
0011 #include <linux/pinctrl/pinconf.h>
0012 #include <linux/pinctrl/pinconf-generic.h>
0013 #include <linux/pinctrl/pinctrl.h>
0014 #include <linux/pinctrl/pinmux.h>
0015
0016 #include <linux/platform_device.h>
0017
0018 #include "core.h"
0019 #include "pinmux.h"
0020
0021
0022 #define KEEMBAY_GPIO_DATA_OUT 0x000
0023 #define KEEMBAY_GPIO_DATA_IN 0x020
0024 #define KEEMBAY_GPIO_DATA_IN_RAW 0x040
0025 #define KEEMBAY_GPIO_DATA_HIGH 0x060
0026 #define KEEMBAY_GPIO_DATA_LOW 0x080
0027
0028
0029 #define KEEMBAY_GPIO_INT_CFG 0x000
0030 #define KEEMBAY_GPIO_MODE 0x070
0031
0032
0033 #define KEEMBAY_GPIO_MODE_PULLUP_MASK GENMASK(13, 12)
0034 #define KEEMBAY_GPIO_MODE_DRIVE_MASK GENMASK(8, 7)
0035 #define KEEMBAY_GPIO_MODE_INV_MASK GENMASK(5, 4)
0036 #define KEEMBAY_GPIO_MODE_SELECT_MASK GENMASK(2, 0)
0037 #define KEEMBAY_GPIO_MODE_DIR_OVR BIT(15)
0038 #define KEEMBAY_GPIO_MODE_REN BIT(11)
0039 #define KEEMBAY_GPIO_MODE_SCHMITT_EN BIT(10)
0040 #define KEEMBAY_GPIO_MODE_SLEW_RATE BIT(9)
0041 #define KEEMBAY_GPIO_IRQ_ENABLE BIT(7)
0042 #define KEEMBAY_GPIO_MODE_DIR BIT(3)
0043 #define KEEMBAY_GPIO_MODE_DEFAULT 0x7
0044 #define KEEMBAY_GPIO_MODE_INV_VAL 0x3
0045
0046 #define KEEMBAY_GPIO_DISABLE 0
0047 #define KEEMBAY_GPIO_PULL_UP 1
0048 #define KEEMBAY_GPIO_PULL_DOWN 2
0049 #define KEEMBAY_GPIO_BUS_HOLD 3
0050 #define KEEMBAY_GPIO_NUM_IRQ 8
0051 #define KEEMBAY_GPIO_MAX_PER_IRQ 4
0052 #define KEEMBAY_GPIO_MAX_PER_REG 32
0053 #define KEEMBAY_GPIO_MIN_STRENGTH 2
0054 #define KEEMBAY_GPIO_MAX_STRENGTH 12
0055 #define KEEMBAY_GPIO_SENSE_LOW (IRQ_TYPE_LEVEL_LOW | IRQ_TYPE_EDGE_FALLING)
0056
0057
0058 #define KEEMBAY_GPIO_REG_OFFSET(pin) ((pin) * 4)
0059
0060
0061
0062
0063
0064
0065 struct keembay_mux_desc {
0066 u8 mode;
0067 const char *name;
0068 };
0069
0070 #define KEEMBAY_PIN_DESC(pin_number, pin_name, ...) { \
0071 .number = pin_number, \
0072 .name = pin_name, \
0073 .drv_data = &(struct keembay_mux_desc[]) { \
0074 __VA_ARGS__, { } }, \
0075 } \
0076
0077 #define KEEMBAY_MUX(pin_mode, pin_function) { \
0078 .mode = pin_mode, \
0079 .name = pin_function, \
0080 } \
0081
0082
0083
0084
0085
0086
0087
0088
0089
0090 struct keembay_gpio_irq {
0091 unsigned int source;
0092 unsigned int line;
0093 unsigned int pins[KEEMBAY_GPIO_MAX_PER_IRQ];
0094 unsigned int trigger;
0095 unsigned int num_share;
0096 };
0097
0098
0099
0100
0101
0102
0103
0104
0105
0106
0107
0108
0109
0110
0111
0112
0113
0114 struct keembay_pinctrl {
0115 struct pinctrl_dev *pctrl;
0116 void __iomem *base0;
0117 void __iomem *base1;
0118 struct device *dev;
0119 struct gpio_chip chip;
0120 const struct keembay_pin_soc *soc;
0121 raw_spinlock_t lock;
0122 unsigned int ngroups;
0123 unsigned int nfuncs;
0124 unsigned int npins;
0125 struct keembay_gpio_irq irq[KEEMBAY_GPIO_NUM_IRQ];
0126 int max_gpios_level_type;
0127 int max_gpios_edge_type;
0128 };
0129
0130
0131
0132
0133
0134 struct keembay_pin_soc {
0135 const struct pinctrl_pin_desc *pins;
0136 };
0137
0138 static const struct pinctrl_pin_desc keembay_pins[] = {
0139 KEEMBAY_PIN_DESC(0, "GPIO0",
0140 KEEMBAY_MUX(0x0, "I2S0_M0"),
0141 KEEMBAY_MUX(0x1, "SD0_M1"),
0142 KEEMBAY_MUX(0x2, "SLVDS0_M2"),
0143 KEEMBAY_MUX(0x3, "I2C0_M3"),
0144 KEEMBAY_MUX(0x4, "CAM_M4"),
0145 KEEMBAY_MUX(0x5, "ETH_M5"),
0146 KEEMBAY_MUX(0x6, "LCD_M6"),
0147 KEEMBAY_MUX(0x7, "GPIO_M7")),
0148 KEEMBAY_PIN_DESC(1, "GPIO1",
0149 KEEMBAY_MUX(0x0, "I2S0_M0"),
0150 KEEMBAY_MUX(0x1, "SD0_M1"),
0151 KEEMBAY_MUX(0x2, "SLVDS0_M2"),
0152 KEEMBAY_MUX(0x3, "I2C0_M3"),
0153 KEEMBAY_MUX(0x4, "CAM_M4"),
0154 KEEMBAY_MUX(0x5, "ETH_M5"),
0155 KEEMBAY_MUX(0x6, "LCD_M6"),
0156 KEEMBAY_MUX(0x7, "GPIO_M7")),
0157 KEEMBAY_PIN_DESC(2, "GPIO2",
0158 KEEMBAY_MUX(0x0, "I2S0_M0"),
0159 KEEMBAY_MUX(0x1, "I2S0_M1"),
0160 KEEMBAY_MUX(0x2, "SLVDS0_M2"),
0161 KEEMBAY_MUX(0x3, "I2C1_M3"),
0162 KEEMBAY_MUX(0x4, "CAM_M4"),
0163 KEEMBAY_MUX(0x5, "ETH_M5"),
0164 KEEMBAY_MUX(0x6, "LCD_M6"),
0165 KEEMBAY_MUX(0x7, "GPIO_M7")),
0166 KEEMBAY_PIN_DESC(3, "GPIO3",
0167 KEEMBAY_MUX(0x0, "I2S0_M0"),
0168 KEEMBAY_MUX(0x1, "I2S0_M1"),
0169 KEEMBAY_MUX(0x2, "SLVDS0_M2"),
0170 KEEMBAY_MUX(0x3, "I2C1_M3"),
0171 KEEMBAY_MUX(0x4, "CAM_M4"),
0172 KEEMBAY_MUX(0x5, "ETH_M5"),
0173 KEEMBAY_MUX(0x6, "LCD_M6"),
0174 KEEMBAY_MUX(0x7, "GPIO_M7")),
0175 KEEMBAY_PIN_DESC(4, "GPIO4",
0176 KEEMBAY_MUX(0x0, "I2S0_M0"),
0177 KEEMBAY_MUX(0x1, "I2S0_M1"),
0178 KEEMBAY_MUX(0x2, "SLVDS0_M2"),
0179 KEEMBAY_MUX(0x3, "I2C2_M3"),
0180 KEEMBAY_MUX(0x4, "CAM_M4"),
0181 KEEMBAY_MUX(0x5, "ETH_M5"),
0182 KEEMBAY_MUX(0x6, "LCD_M6"),
0183 KEEMBAY_MUX(0x7, "GPIO_M7")),
0184 KEEMBAY_PIN_DESC(5, "GPIO5",
0185 KEEMBAY_MUX(0x0, "I2S0_M0"),
0186 KEEMBAY_MUX(0x1, "I2S0_M1"),
0187 KEEMBAY_MUX(0x2, "SLVDS0_M2"),
0188 KEEMBAY_MUX(0x3, "I2C2_M3"),
0189 KEEMBAY_MUX(0x4, "CAM_M4"),
0190 KEEMBAY_MUX(0x5, "ETH_M5"),
0191 KEEMBAY_MUX(0x6, "LCD_M6"),
0192 KEEMBAY_MUX(0x7, "GPIO_M7")),
0193 KEEMBAY_PIN_DESC(6, "GPIO6",
0194 KEEMBAY_MUX(0x0, "I2S1_M0"),
0195 KEEMBAY_MUX(0x1, "SD0_M1"),
0196 KEEMBAY_MUX(0x2, "SLVDS0_M2"),
0197 KEEMBAY_MUX(0x3, "I2C3_M3"),
0198 KEEMBAY_MUX(0x4, "CAM_M4"),
0199 KEEMBAY_MUX(0x5, "ETH_M5"),
0200 KEEMBAY_MUX(0x6, "LCD_M6"),
0201 KEEMBAY_MUX(0x7, "GPIO_M7")),
0202 KEEMBAY_PIN_DESC(7, "GPIO7",
0203 KEEMBAY_MUX(0x0, "I2S1_M0"),
0204 KEEMBAY_MUX(0x1, "SD0_M1"),
0205 KEEMBAY_MUX(0x2, "SLVDS0_M2"),
0206 KEEMBAY_MUX(0x3, "I2C3_M3"),
0207 KEEMBAY_MUX(0x4, "CAM_M4"),
0208 KEEMBAY_MUX(0x5, "ETH_M5"),
0209 KEEMBAY_MUX(0x6, "LCD_M6"),
0210 KEEMBAY_MUX(0x7, "GPIO_M7")),
0211 KEEMBAY_PIN_DESC(8, "GPIO8",
0212 KEEMBAY_MUX(0x0, "I2S1_M0"),
0213 KEEMBAY_MUX(0x1, "I2S1_M1"),
0214 KEEMBAY_MUX(0x2, "SLVDS0_M2"),
0215 KEEMBAY_MUX(0x3, "UART0_M3"),
0216 KEEMBAY_MUX(0x4, "CAM_M4"),
0217 KEEMBAY_MUX(0x5, "ETH_M5"),
0218 KEEMBAY_MUX(0x6, "LCD_M6"),
0219 KEEMBAY_MUX(0x7, "GPIO_M7")),
0220 KEEMBAY_PIN_DESC(9, "GPIO9",
0221 KEEMBAY_MUX(0x0, "I2S1_M0"),
0222 KEEMBAY_MUX(0x1, "I2S1_M1"),
0223 KEEMBAY_MUX(0x2, "PWM_M2"),
0224 KEEMBAY_MUX(0x3, "UART0_M3"),
0225 KEEMBAY_MUX(0x4, "CAM_M4"),
0226 KEEMBAY_MUX(0x5, "ETH_M5"),
0227 KEEMBAY_MUX(0x6, "LCD_M6"),
0228 KEEMBAY_MUX(0x7, "GPIO_M7")),
0229 KEEMBAY_PIN_DESC(10, "GPIO10",
0230 KEEMBAY_MUX(0x0, "I2S2_M0"),
0231 KEEMBAY_MUX(0x1, "SD0_M1"),
0232 KEEMBAY_MUX(0x2, "PWM_M2"),
0233 KEEMBAY_MUX(0x3, "UART0_M3"),
0234 KEEMBAY_MUX(0x4, "CAM_M4"),
0235 KEEMBAY_MUX(0x5, "ETH_M5"),
0236 KEEMBAY_MUX(0x6, "LCD_M6"),
0237 KEEMBAY_MUX(0x7, "GPIO_M7")),
0238 KEEMBAY_PIN_DESC(11, "GPIO11",
0239 KEEMBAY_MUX(0x0, "I2S2_M0"),
0240 KEEMBAY_MUX(0x1, "SD0_M1"),
0241 KEEMBAY_MUX(0x2, "PWM_M2"),
0242 KEEMBAY_MUX(0x3, "UART0_M3"),
0243 KEEMBAY_MUX(0x4, "CAM_M4"),
0244 KEEMBAY_MUX(0x5, "ETH_M5"),
0245 KEEMBAY_MUX(0x6, "LCD_M6"),
0246 KEEMBAY_MUX(0x7, "GPIO_M7")),
0247 KEEMBAY_PIN_DESC(12, "GPIO12",
0248 KEEMBAY_MUX(0x0, "I2S2_M0"),
0249 KEEMBAY_MUX(0x1, "I2S2_M1"),
0250 KEEMBAY_MUX(0x2, "PWM_M2"),
0251 KEEMBAY_MUX(0x3, "SPI0_M3"),
0252 KEEMBAY_MUX(0x4, "CAM_M4"),
0253 KEEMBAY_MUX(0x5, "ETH_M5"),
0254 KEEMBAY_MUX(0x6, "LCD_M6"),
0255 KEEMBAY_MUX(0x7, "GPIO_M7")),
0256 KEEMBAY_PIN_DESC(13, "GPIO13",
0257 KEEMBAY_MUX(0x0, "I2S2_M0"),
0258 KEEMBAY_MUX(0x1, "I2S2_M1"),
0259 KEEMBAY_MUX(0x2, "PWM_M2"),
0260 KEEMBAY_MUX(0x3, "SPI0_M3"),
0261 KEEMBAY_MUX(0x4, "CAM_M4"),
0262 KEEMBAY_MUX(0x5, "ETH_M5"),
0263 KEEMBAY_MUX(0x6, "LCD_M6"),
0264 KEEMBAY_MUX(0x7, "GPIO_M7")),
0265 KEEMBAY_PIN_DESC(14, "GPIO14",
0266 KEEMBAY_MUX(0x0, "UART0_M0"),
0267 KEEMBAY_MUX(0x1, "I2S3_M1"),
0268 KEEMBAY_MUX(0x2, "PWM_M2"),
0269 KEEMBAY_MUX(0x3, "SD1_M3"),
0270 KEEMBAY_MUX(0x4, "CAM_M4"),
0271 KEEMBAY_MUX(0x5, "ETH_M5"),
0272 KEEMBAY_MUX(0x6, "LCD_M6"),
0273 KEEMBAY_MUX(0x7, "GPIO_M7")),
0274 KEEMBAY_PIN_DESC(15, "GPIO15",
0275 KEEMBAY_MUX(0x0, "UART0_M0"),
0276 KEEMBAY_MUX(0x1, "I2S3_M1"),
0277 KEEMBAY_MUX(0x2, "UART0_M2"),
0278 KEEMBAY_MUX(0x3, "SD1_M3"),
0279 KEEMBAY_MUX(0x4, "CAM_M4"),
0280 KEEMBAY_MUX(0x5, "SPI1_M5"),
0281 KEEMBAY_MUX(0x6, "LCD_M6"),
0282 KEEMBAY_MUX(0x7, "GPIO_M7")),
0283 KEEMBAY_PIN_DESC(16, "GPIO16",
0284 KEEMBAY_MUX(0x0, "UART0_M0"),
0285 KEEMBAY_MUX(0x1, "I2S3_M1"),
0286 KEEMBAY_MUX(0x2, "UART0_M2"),
0287 KEEMBAY_MUX(0x3, "SD1_M3"),
0288 KEEMBAY_MUX(0x4, "CAM_M4"),
0289 KEEMBAY_MUX(0x5, "SPI1_M5"),
0290 KEEMBAY_MUX(0x6, "LCD_M6"),
0291 KEEMBAY_MUX(0x7, "GPIO_M7")),
0292 KEEMBAY_PIN_DESC(17, "GPIO17",
0293 KEEMBAY_MUX(0x0, "UART0_M0"),
0294 KEEMBAY_MUX(0x1, "I2S3_M1"),
0295 KEEMBAY_MUX(0x2, "I2S3_M2"),
0296 KEEMBAY_MUX(0x3, "SD1_M3"),
0297 KEEMBAY_MUX(0x4, "CAM_M4"),
0298 KEEMBAY_MUX(0x5, "SPI1_M5"),
0299 KEEMBAY_MUX(0x6, "LCD_M6"),
0300 KEEMBAY_MUX(0x7, "GPIO_M7")),
0301 KEEMBAY_PIN_DESC(18, "GPIO18",
0302 KEEMBAY_MUX(0x0, "UART1_M0"),
0303 KEEMBAY_MUX(0x1, "SPI0_M1"),
0304 KEEMBAY_MUX(0x2, "I2S3_M2"),
0305 KEEMBAY_MUX(0x3, "SD1_M3"),
0306 KEEMBAY_MUX(0x4, "CAM_M4"),
0307 KEEMBAY_MUX(0x5, "SPI1_M5"),
0308 KEEMBAY_MUX(0x6, "LCD_M6"),
0309 KEEMBAY_MUX(0x7, "GPIO_M7")),
0310 KEEMBAY_PIN_DESC(19, "GPIO19",
0311 KEEMBAY_MUX(0x0, "UART1_M0"),
0312 KEEMBAY_MUX(0x1, "LCD_M1"),
0313 KEEMBAY_MUX(0x2, "DEBUG_M2"),
0314 KEEMBAY_MUX(0x3, "SD1_M3"),
0315 KEEMBAY_MUX(0x4, "CAM_M4"),
0316 KEEMBAY_MUX(0x5, "SPI1_M5"),
0317 KEEMBAY_MUX(0x6, "LCD_M6"),
0318 KEEMBAY_MUX(0x7, "GPIO_M7")),
0319 KEEMBAY_PIN_DESC(20, "GPIO20",
0320 KEEMBAY_MUX(0x0, "UART1_M0"),
0321 KEEMBAY_MUX(0x1, "LCD_M1"),
0322 KEEMBAY_MUX(0x2, "DEBUG_M2"),
0323 KEEMBAY_MUX(0x3, "CPR_M3"),
0324 KEEMBAY_MUX(0x4, "CAM_M4"),
0325 KEEMBAY_MUX(0x5, "SPI1_M5"),
0326 KEEMBAY_MUX(0x6, "SLVDS0_M6"),
0327 KEEMBAY_MUX(0x7, "GPIO_M7")),
0328 KEEMBAY_PIN_DESC(21, "GPIO21",
0329 KEEMBAY_MUX(0x0, "UART1_M0"),
0330 KEEMBAY_MUX(0x1, "LCD_M1"),
0331 KEEMBAY_MUX(0x2, "DEBUG_M2"),
0332 KEEMBAY_MUX(0x3, "CPR_M3"),
0333 KEEMBAY_MUX(0x4, "CAM_M4"),
0334 KEEMBAY_MUX(0x5, "I3C0_M5"),
0335 KEEMBAY_MUX(0x6, "SLVDS0_M6"),
0336 KEEMBAY_MUX(0x7, "GPIO_M7")),
0337 KEEMBAY_PIN_DESC(22, "GPIO22",
0338 KEEMBAY_MUX(0x0, "I2C0_M0"),
0339 KEEMBAY_MUX(0x1, "UART2_M1"),
0340 KEEMBAY_MUX(0x2, "DEBUG_M2"),
0341 KEEMBAY_MUX(0x3, "CPR_M3"),
0342 KEEMBAY_MUX(0x4, "CAM_M4"),
0343 KEEMBAY_MUX(0x5, "I3C0_M5"),
0344 KEEMBAY_MUX(0x6, "SLVDS0_M6"),
0345 KEEMBAY_MUX(0x7, "GPIO_M7")),
0346 KEEMBAY_PIN_DESC(23, "GPIO23",
0347 KEEMBAY_MUX(0x0, "I2C0_M0"),
0348 KEEMBAY_MUX(0x1, "UART2_M1"),
0349 KEEMBAY_MUX(0x2, "DEBUG_M2"),
0350 KEEMBAY_MUX(0x3, "CPR_M3"),
0351 KEEMBAY_MUX(0x4, "CAM_M4"),
0352 KEEMBAY_MUX(0x5, "I3C1_M5"),
0353 KEEMBAY_MUX(0x6, "SLVDS0_M6"),
0354 KEEMBAY_MUX(0x7, "GPIO_M7")),
0355 KEEMBAY_PIN_DESC(24, "GPIO24",
0356 KEEMBAY_MUX(0x0, "I2C1_M0"),
0357 KEEMBAY_MUX(0x1, "UART2_M1"),
0358 KEEMBAY_MUX(0x2, "DEBUG_M2"),
0359 KEEMBAY_MUX(0x3, "CPR_M3"),
0360 KEEMBAY_MUX(0x4, "CAM_M4"),
0361 KEEMBAY_MUX(0x5, "I3C1_M5"),
0362 KEEMBAY_MUX(0x6, "SLVDS0_M6"),
0363 KEEMBAY_MUX(0x7, "GPIO_M7")),
0364 KEEMBAY_PIN_DESC(25, "GPIO25",
0365 KEEMBAY_MUX(0x0, "I2C1_M0"),
0366 KEEMBAY_MUX(0x1, "UART2_M1"),
0367 KEEMBAY_MUX(0x2, "SPI0_M2"),
0368 KEEMBAY_MUX(0x3, "CPR_M3"),
0369 KEEMBAY_MUX(0x4, "CAM_M4"),
0370 KEEMBAY_MUX(0x5, "I3C2_M5"),
0371 KEEMBAY_MUX(0x6, "SLVDS0_M6"),
0372 KEEMBAY_MUX(0x7, "GPIO_M7")),
0373 KEEMBAY_PIN_DESC(26, "GPIO26",
0374 KEEMBAY_MUX(0x0, "SPI0_M0"),
0375 KEEMBAY_MUX(0x1, "I2C2_M1"),
0376 KEEMBAY_MUX(0x2, "UART0_M2"),
0377 KEEMBAY_MUX(0x3, "DSU_M3"),
0378 KEEMBAY_MUX(0x4, "CAM_M4"),
0379 KEEMBAY_MUX(0x5, "I3C2_M5"),
0380 KEEMBAY_MUX(0x6, "SLVDS0_M6"),
0381 KEEMBAY_MUX(0x7, "GPIO_M7")),
0382 KEEMBAY_PIN_DESC(27, "GPIO27",
0383 KEEMBAY_MUX(0x0, "SPI0_M0"),
0384 KEEMBAY_MUX(0x1, "I2C2_M1"),
0385 KEEMBAY_MUX(0x2, "UART0_M2"),
0386 KEEMBAY_MUX(0x3, "DSU_M3"),
0387 KEEMBAY_MUX(0x4, "CAM_M4"),
0388 KEEMBAY_MUX(0x5, "I3C0_M5"),
0389 KEEMBAY_MUX(0x6, "SLVDS0_M6"),
0390 KEEMBAY_MUX(0x7, "GPIO_M7")),
0391 KEEMBAY_PIN_DESC(28, "GPIO28",
0392 KEEMBAY_MUX(0x0, "SPI0_M0"),
0393 KEEMBAY_MUX(0x1, "I2C3_M1"),
0394 KEEMBAY_MUX(0x2, "UART0_M2"),
0395 KEEMBAY_MUX(0x3, "PWM_M3"),
0396 KEEMBAY_MUX(0x4, "CAM_M4"),
0397 KEEMBAY_MUX(0x5, "I3C1_M5"),
0398 KEEMBAY_MUX(0x6, "SLVDS0_M6"),
0399 KEEMBAY_MUX(0x7, "GPIO_M7")),
0400 KEEMBAY_PIN_DESC(29, "GPIO29",
0401 KEEMBAY_MUX(0x0, "SPI0_M0"),
0402 KEEMBAY_MUX(0x1, "I2C3_M1"),
0403 KEEMBAY_MUX(0x2, "UART0_M2"),
0404 KEEMBAY_MUX(0x3, "PWM_M3"),
0405 KEEMBAY_MUX(0x4, "CAM_M4"),
0406 KEEMBAY_MUX(0x5, "I3C2_M5"),
0407 KEEMBAY_MUX(0x6, "SLVDS1_M6"),
0408 KEEMBAY_MUX(0x7, "GPIO_M7")),
0409 KEEMBAY_PIN_DESC(30, "GPIO30",
0410 KEEMBAY_MUX(0x0, "SPI0_M0"),
0411 KEEMBAY_MUX(0x1, "I2S0_M1"),
0412 KEEMBAY_MUX(0x2, "I2C4_M2"),
0413 KEEMBAY_MUX(0x3, "PWM_M3"),
0414 KEEMBAY_MUX(0x4, "CAM_M4"),
0415 KEEMBAY_MUX(0x5, "LCD_M5"),
0416 KEEMBAY_MUX(0x6, "SLVDS1_M6"),
0417 KEEMBAY_MUX(0x7, "GPIO_M7")),
0418 KEEMBAY_PIN_DESC(31, "GPIO31",
0419 KEEMBAY_MUX(0x0, "SPI0_M0"),
0420 KEEMBAY_MUX(0x1, "I2S0_M1"),
0421 KEEMBAY_MUX(0x2, "I2C4_M2"),
0422 KEEMBAY_MUX(0x3, "PWM_M3"),
0423 KEEMBAY_MUX(0x4, "CAM_M4"),
0424 KEEMBAY_MUX(0x5, "UART1_M5"),
0425 KEEMBAY_MUX(0x6, "SLVDS1_M6"),
0426 KEEMBAY_MUX(0x7, "GPIO_M7")),
0427 KEEMBAY_PIN_DESC(32, "GPIO32",
0428 KEEMBAY_MUX(0x0, "SD0_M0"),
0429 KEEMBAY_MUX(0x1, "SPI0_M1"),
0430 KEEMBAY_MUX(0x2, "UART1_M2"),
0431 KEEMBAY_MUX(0x3, "PWM_M3"),
0432 KEEMBAY_MUX(0x4, "CAM_M4"),
0433 KEEMBAY_MUX(0x5, "PCIE_M5"),
0434 KEEMBAY_MUX(0x6, "SLVDS1_M6"),
0435 KEEMBAY_MUX(0x7, "GPIO_M7")),
0436 KEEMBAY_PIN_DESC(33, "GPIO33",
0437 KEEMBAY_MUX(0x0, "SD0_M0"),
0438 KEEMBAY_MUX(0x1, "SPI0_M1"),
0439 KEEMBAY_MUX(0x2, "UART1_M2"),
0440 KEEMBAY_MUX(0x3, "PWM_M3"),
0441 KEEMBAY_MUX(0x4, "CAM_M4"),
0442 KEEMBAY_MUX(0x5, "PCIE_M5"),
0443 KEEMBAY_MUX(0x6, "SLVDS1_M6"),
0444 KEEMBAY_MUX(0x7, "GPIO_M7")),
0445 KEEMBAY_PIN_DESC(34, "GPIO34",
0446 KEEMBAY_MUX(0x0, "SD0_M0"),
0447 KEEMBAY_MUX(0x1, "SPI0_M1"),
0448 KEEMBAY_MUX(0x2, "I2C0_M2"),
0449 KEEMBAY_MUX(0x3, "UART1_M3"),
0450 KEEMBAY_MUX(0x4, "CAM_M4"),
0451 KEEMBAY_MUX(0x5, "I2S0_M5"),
0452 KEEMBAY_MUX(0x6, "SLVDS1_M6"),
0453 KEEMBAY_MUX(0x7, "GPIO_M7")),
0454 KEEMBAY_PIN_DESC(35, "GPIO35",
0455 KEEMBAY_MUX(0x0, "SD0_M0"),
0456 KEEMBAY_MUX(0x1, "PCIE_M1"),
0457 KEEMBAY_MUX(0x2, "I2C0_M2"),
0458 KEEMBAY_MUX(0x3, "UART1_M3"),
0459 KEEMBAY_MUX(0x4, "CAM_M4"),
0460 KEEMBAY_MUX(0x5, "I2S0_M5"),
0461 KEEMBAY_MUX(0x6, "SLVDS1_M6"),
0462 KEEMBAY_MUX(0x7, "GPIO_M7")),
0463 KEEMBAY_PIN_DESC(36, "GPIO36",
0464 KEEMBAY_MUX(0x0, "SD0_M0"),
0465 KEEMBAY_MUX(0x1, "SPI3_M1"),
0466 KEEMBAY_MUX(0x2, "I2C1_M2"),
0467 KEEMBAY_MUX(0x3, "DEBUG_M3"),
0468 KEEMBAY_MUX(0x4, "CAM_M4"),
0469 KEEMBAY_MUX(0x5, "I2S0_M5"),
0470 KEEMBAY_MUX(0x6, "SLVDS1_M6"),
0471 KEEMBAY_MUX(0x7, "GPIO_M7")),
0472 KEEMBAY_PIN_DESC(37, "GPIO37",
0473 KEEMBAY_MUX(0x0, "SD0_M0"),
0474 KEEMBAY_MUX(0x1, "SPI3_M1"),
0475 KEEMBAY_MUX(0x2, "I2C1_M2"),
0476 KEEMBAY_MUX(0x3, "DEBUG_M3"),
0477 KEEMBAY_MUX(0x4, "CAM_M4"),
0478 KEEMBAY_MUX(0x5, "I2S0_M5"),
0479 KEEMBAY_MUX(0x6, "SLVDS1_M6"),
0480 KEEMBAY_MUX(0x7, "GPIO_M7")),
0481 KEEMBAY_PIN_DESC(38, "GPIO38",
0482 KEEMBAY_MUX(0x0, "I3C1_M0"),
0483 KEEMBAY_MUX(0x1, "SPI3_M1"),
0484 KEEMBAY_MUX(0x2, "UART3_M2"),
0485 KEEMBAY_MUX(0x3, "DEBUG_M3"),
0486 KEEMBAY_MUX(0x4, "CAM_M4"),
0487 KEEMBAY_MUX(0x5, "LCD_M5"),
0488 KEEMBAY_MUX(0x6, "I2C2_M6"),
0489 KEEMBAY_MUX(0x7, "GPIO_M7")),
0490 KEEMBAY_PIN_DESC(39, "GPIO39",
0491 KEEMBAY_MUX(0x0, "I3C1_M0"),
0492 KEEMBAY_MUX(0x1, "SPI3_M1"),
0493 KEEMBAY_MUX(0x2, "UART3_M2"),
0494 KEEMBAY_MUX(0x3, "DEBUG_M3"),
0495 KEEMBAY_MUX(0x4, "CAM_M4"),
0496 KEEMBAY_MUX(0x5, "LCD_M5"),
0497 KEEMBAY_MUX(0x6, "I2C2_M6"),
0498 KEEMBAY_MUX(0x7, "GPIO_M7")),
0499 KEEMBAY_PIN_DESC(40, "GPIO40",
0500 KEEMBAY_MUX(0x0, "I2S2_M0"),
0501 KEEMBAY_MUX(0x1, "SPI3_M1"),
0502 KEEMBAY_MUX(0x2, "UART3_M2"),
0503 KEEMBAY_MUX(0x3, "DEBUG_M3"),
0504 KEEMBAY_MUX(0x4, "CAM_M4"),
0505 KEEMBAY_MUX(0x5, "LCD_M5"),
0506 KEEMBAY_MUX(0x6, "I2C3_M6"),
0507 KEEMBAY_MUX(0x7, "GPIO_M7")),
0508 KEEMBAY_PIN_DESC(41, "GPIO41",
0509 KEEMBAY_MUX(0x0, "ETH_M0"),
0510 KEEMBAY_MUX(0x1, "SPI3_M1"),
0511 KEEMBAY_MUX(0x2, "SPI3_M2"),
0512 KEEMBAY_MUX(0x3, "DEBUG_M3"),
0513 KEEMBAY_MUX(0x4, "CAM_M4"),
0514 KEEMBAY_MUX(0x5, "LCD_M5"),
0515 KEEMBAY_MUX(0x6, "I2C3_M6"),
0516 KEEMBAY_MUX(0x7, "GPIO_M7")),
0517 KEEMBAY_PIN_DESC(42, "GPIO42",
0518 KEEMBAY_MUX(0x0, "ETH_M0"),
0519 KEEMBAY_MUX(0x1, "SD1_M1"),
0520 KEEMBAY_MUX(0x2, "SPI3_M2"),
0521 KEEMBAY_MUX(0x3, "CPR_M3"),
0522 KEEMBAY_MUX(0x4, "CAM_M4"),
0523 KEEMBAY_MUX(0x5, "LCD_M5"),
0524 KEEMBAY_MUX(0x6, "I2C4_M6"),
0525 KEEMBAY_MUX(0x7, "GPIO_M7")),
0526 KEEMBAY_PIN_DESC(43, "GPIO43",
0527 KEEMBAY_MUX(0x0, "ETH_M0"),
0528 KEEMBAY_MUX(0x1, "SD1_M1"),
0529 KEEMBAY_MUX(0x2, "SPI3_M2"),
0530 KEEMBAY_MUX(0x3, "CPR_M3"),
0531 KEEMBAY_MUX(0x4, "I2S0_M4"),
0532 KEEMBAY_MUX(0x5, "LCD_M5"),
0533 KEEMBAY_MUX(0x6, "I2C4_M6"),
0534 KEEMBAY_MUX(0x7, "GPIO_M7")),
0535 KEEMBAY_PIN_DESC(44, "GPIO44",
0536 KEEMBAY_MUX(0x0, "ETH_M0"),
0537 KEEMBAY_MUX(0x1, "SD1_M1"),
0538 KEEMBAY_MUX(0x2, "SPI0_M2"),
0539 KEEMBAY_MUX(0x3, "CPR_M3"),
0540 KEEMBAY_MUX(0x4, "I2S0_M4"),
0541 KEEMBAY_MUX(0x5, "LCD_M5"),
0542 KEEMBAY_MUX(0x6, "CAM_M6"),
0543 KEEMBAY_MUX(0x7, "GPIO_M7")),
0544 KEEMBAY_PIN_DESC(45, "GPIO45",
0545 KEEMBAY_MUX(0x0, "ETH_M0"),
0546 KEEMBAY_MUX(0x1, "SD1_M1"),
0547 KEEMBAY_MUX(0x2, "SPI0_M2"),
0548 KEEMBAY_MUX(0x3, "CPR_M3"),
0549 KEEMBAY_MUX(0x4, "I2S0_M4"),
0550 KEEMBAY_MUX(0x5, "LCD_M5"),
0551 KEEMBAY_MUX(0x6, "CAM_M6"),
0552 KEEMBAY_MUX(0x7, "GPIO_M7")),
0553 KEEMBAY_PIN_DESC(46, "GPIO46",
0554 KEEMBAY_MUX(0x0, "ETH_M0"),
0555 KEEMBAY_MUX(0x1, "SD1_M1"),
0556 KEEMBAY_MUX(0x2, "SPI0_M2"),
0557 KEEMBAY_MUX(0x3, "TPIU_M3"),
0558 KEEMBAY_MUX(0x4, "I2S0_M4"),
0559 KEEMBAY_MUX(0x5, "LCD_M5"),
0560 KEEMBAY_MUX(0x6, "CAM_M6"),
0561 KEEMBAY_MUX(0x7, "GPIO_M7")),
0562 KEEMBAY_PIN_DESC(47, "GPIO47",
0563 KEEMBAY_MUX(0x0, "ETH_M0"),
0564 KEEMBAY_MUX(0x1, "SD1_M1"),
0565 KEEMBAY_MUX(0x2, "SPI0_M2"),
0566 KEEMBAY_MUX(0x3, "TPIU_M3"),
0567 KEEMBAY_MUX(0x4, "I2S0_M4"),
0568 KEEMBAY_MUX(0x5, "LCD_M5"),
0569 KEEMBAY_MUX(0x6, "CAM_M6"),
0570 KEEMBAY_MUX(0x7, "GPIO_M7")),
0571 KEEMBAY_PIN_DESC(48, "GPIO48",
0572 KEEMBAY_MUX(0x0, "ETH_M0"),
0573 KEEMBAY_MUX(0x1, "SPI2_M1"),
0574 KEEMBAY_MUX(0x2, "UART2_M2"),
0575 KEEMBAY_MUX(0x3, "TPIU_M3"),
0576 KEEMBAY_MUX(0x4, "I2S0_M4"),
0577 KEEMBAY_MUX(0x5, "LCD_M5"),
0578 KEEMBAY_MUX(0x6, "CAM_M6"),
0579 KEEMBAY_MUX(0x7, "GPIO_M7")),
0580 KEEMBAY_PIN_DESC(49, "GPIO49",
0581 KEEMBAY_MUX(0x0, "ETH_M0"),
0582 KEEMBAY_MUX(0x1, "SPI2_M1"),
0583 KEEMBAY_MUX(0x2, "UART2_M2"),
0584 KEEMBAY_MUX(0x3, "TPIU_M3"),
0585 KEEMBAY_MUX(0x4, "I2S1_M4"),
0586 KEEMBAY_MUX(0x5, "LCD_M5"),
0587 KEEMBAY_MUX(0x6, "CAM_M6"),
0588 KEEMBAY_MUX(0x7, "GPIO_M7")),
0589 KEEMBAY_PIN_DESC(50, "GPIO50",
0590 KEEMBAY_MUX(0x0, "ETH_M0"),
0591 KEEMBAY_MUX(0x1, "SPI2_M1"),
0592 KEEMBAY_MUX(0x2, "UART2_M2"),
0593 KEEMBAY_MUX(0x3, "TPIU_M3"),
0594 KEEMBAY_MUX(0x4, "I2S1_M4"),
0595 KEEMBAY_MUX(0x5, "LCD_M5"),
0596 KEEMBAY_MUX(0x6, "CAM_M6"),
0597 KEEMBAY_MUX(0x7, "GPIO_M7")),
0598 KEEMBAY_PIN_DESC(51, "GPIO51",
0599 KEEMBAY_MUX(0x0, "ETH_M0"),
0600 KEEMBAY_MUX(0x1, "SPI2_M1"),
0601 KEEMBAY_MUX(0x2, "UART2_M2"),
0602 KEEMBAY_MUX(0x3, "TPIU_M3"),
0603 KEEMBAY_MUX(0x4, "I2S1_M4"),
0604 KEEMBAY_MUX(0x5, "LCD_M5"),
0605 KEEMBAY_MUX(0x6, "CAM_M6"),
0606 KEEMBAY_MUX(0x7, "GPIO_M7")),
0607 KEEMBAY_PIN_DESC(52, "GPIO52",
0608 KEEMBAY_MUX(0x0, "ETH_M0"),
0609 KEEMBAY_MUX(0x1, "SPI2_M1"),
0610 KEEMBAY_MUX(0x2, "SD0_M2"),
0611 KEEMBAY_MUX(0x3, "TPIU_M3"),
0612 KEEMBAY_MUX(0x4, "I2S1_M4"),
0613 KEEMBAY_MUX(0x5, "LCD_M5"),
0614 KEEMBAY_MUX(0x6, "CAM_M6"),
0615 KEEMBAY_MUX(0x7, "GPIO_M7")),
0616 KEEMBAY_PIN_DESC(53, "GPIO53",
0617 KEEMBAY_MUX(0x0, "ETH_M0"),
0618 KEEMBAY_MUX(0x1, "SPI2_M1"),
0619 KEEMBAY_MUX(0x2, "SD0_M2"),
0620 KEEMBAY_MUX(0x3, "TPIU_M3"),
0621 KEEMBAY_MUX(0x4, "I2S2_M4"),
0622 KEEMBAY_MUX(0x5, "LCD_M5"),
0623 KEEMBAY_MUX(0x6, "CAM_M6"),
0624 KEEMBAY_MUX(0x7, "GPIO_M7")),
0625 KEEMBAY_PIN_DESC(54, "GPIO54",
0626 KEEMBAY_MUX(0x0, "ETH_M0"),
0627 KEEMBAY_MUX(0x1, "SPI2_M1"),
0628 KEEMBAY_MUX(0x2, "SD0_M2"),
0629 KEEMBAY_MUX(0x3, "TPIU_M3"),
0630 KEEMBAY_MUX(0x4, "I2S2_M4"),
0631 KEEMBAY_MUX(0x5, "LCD_M5"),
0632 KEEMBAY_MUX(0x6, "CAM_M6"),
0633 KEEMBAY_MUX(0x7, "GPIO_M7")),
0634 KEEMBAY_PIN_DESC(55, "GPIO55",
0635 KEEMBAY_MUX(0x0, "ETH_M0"),
0636 KEEMBAY_MUX(0x1, "SPI2_M1"),
0637 KEEMBAY_MUX(0x2, "SD1_M2"),
0638 KEEMBAY_MUX(0x3, "TPIU_M3"),
0639 KEEMBAY_MUX(0x4, "I2S2_M4"),
0640 KEEMBAY_MUX(0x5, "LCD_M5"),
0641 KEEMBAY_MUX(0x6, "CAM_M6"),
0642 KEEMBAY_MUX(0x7, "GPIO_M7")),
0643 KEEMBAY_PIN_DESC(56, "GPIO56",
0644 KEEMBAY_MUX(0x0, "ETH_M0"),
0645 KEEMBAY_MUX(0x1, "SPI2_M1"),
0646 KEEMBAY_MUX(0x2, "SD1_M2"),
0647 KEEMBAY_MUX(0x3, "TPIU_M3"),
0648 KEEMBAY_MUX(0x4, "I2S2_M4"),
0649 KEEMBAY_MUX(0x5, "LCD_M5"),
0650 KEEMBAY_MUX(0x6, "CAM_M6"),
0651 KEEMBAY_MUX(0x7, "GPIO_M7")),
0652 KEEMBAY_PIN_DESC(57, "GPIO57",
0653 KEEMBAY_MUX(0x0, "SPI1_M0"),
0654 KEEMBAY_MUX(0x1, "I2S1_M1"),
0655 KEEMBAY_MUX(0x2, "SD1_M2"),
0656 KEEMBAY_MUX(0x3, "TPIU_M3"),
0657 KEEMBAY_MUX(0x4, "UART0_M4"),
0658 KEEMBAY_MUX(0x5, "LCD_M5"),
0659 KEEMBAY_MUX(0x6, "CAM_M6"),
0660 KEEMBAY_MUX(0x7, "GPIO_M7")),
0661 KEEMBAY_PIN_DESC(58, "GPIO58",
0662 KEEMBAY_MUX(0x0, "SPI1_M0"),
0663 KEEMBAY_MUX(0x1, "ETH_M1"),
0664 KEEMBAY_MUX(0x2, "SD0_M2"),
0665 KEEMBAY_MUX(0x3, "TPIU_M3"),
0666 KEEMBAY_MUX(0x4, "UART0_M4"),
0667 KEEMBAY_MUX(0x5, "LCD_M5"),
0668 KEEMBAY_MUX(0x6, "CAM_M6"),
0669 KEEMBAY_MUX(0x7, "GPIO_M7")),
0670 KEEMBAY_PIN_DESC(59, "GPIO59",
0671 KEEMBAY_MUX(0x0, "SPI1_M0"),
0672 KEEMBAY_MUX(0x1, "ETH_M1"),
0673 KEEMBAY_MUX(0x2, "SD0_M2"),
0674 KEEMBAY_MUX(0x3, "TPIU_M3"),
0675 KEEMBAY_MUX(0x4, "UART0_M4"),
0676 KEEMBAY_MUX(0x5, "LCD_M5"),
0677 KEEMBAY_MUX(0x6, "CAM_M6"),
0678 KEEMBAY_MUX(0x7, "GPIO_M7")),
0679 KEEMBAY_PIN_DESC(60, "GPIO60",
0680 KEEMBAY_MUX(0x0, "SPI1_M0"),
0681 KEEMBAY_MUX(0x1, "ETH_M1"),
0682 KEEMBAY_MUX(0x2, "I3C1_M2"),
0683 KEEMBAY_MUX(0x3, "TPIU_M3"),
0684 KEEMBAY_MUX(0x4, "UART0_M4"),
0685 KEEMBAY_MUX(0x5, "LCD_M5"),
0686 KEEMBAY_MUX(0x6, "CAM_M6"),
0687 KEEMBAY_MUX(0x7, "GPIO_M7")),
0688 KEEMBAY_PIN_DESC(61, "GPIO61",
0689 KEEMBAY_MUX(0x0, "SPI1_M0"),
0690 KEEMBAY_MUX(0x1, "ETH_M1"),
0691 KEEMBAY_MUX(0x2, "SD0_M2"),
0692 KEEMBAY_MUX(0x3, "TPIU_M3"),
0693 KEEMBAY_MUX(0x4, "UART1_M4"),
0694 KEEMBAY_MUX(0x5, "LCD_M5"),
0695 KEEMBAY_MUX(0x6, "CAM_M6"),
0696 KEEMBAY_MUX(0x7, "GPIO_M7")),
0697 KEEMBAY_PIN_DESC(62, "GPIO62",
0698 KEEMBAY_MUX(0x0, "SPI1_M0"),
0699 KEEMBAY_MUX(0x1, "ETH_M1"),
0700 KEEMBAY_MUX(0x2, "SD1_M2"),
0701 KEEMBAY_MUX(0x3, "TPIU_M3"),
0702 KEEMBAY_MUX(0x4, "UART1_M4"),
0703 KEEMBAY_MUX(0x5, "LCD_M5"),
0704 KEEMBAY_MUX(0x6, "CAM_M6"),
0705 KEEMBAY_MUX(0x7, "GPIO_M7")),
0706 KEEMBAY_PIN_DESC(63, "GPIO63",
0707 KEEMBAY_MUX(0x0, "I2S1_M0"),
0708 KEEMBAY_MUX(0x1, "SPI1_M1"),
0709 KEEMBAY_MUX(0x2, "SD1_M2"),
0710 KEEMBAY_MUX(0x3, "TPIU_M3"),
0711 KEEMBAY_MUX(0x4, "UART1_M4"),
0712 KEEMBAY_MUX(0x5, "LCD_M5"),
0713 KEEMBAY_MUX(0x6, "CAM_M6"),
0714 KEEMBAY_MUX(0x7, "GPIO_M7")),
0715 KEEMBAY_PIN_DESC(64, "GPIO64",
0716 KEEMBAY_MUX(0x0, "I2S2_M0"),
0717 KEEMBAY_MUX(0x1, "SPI1_M1"),
0718 KEEMBAY_MUX(0x2, "ETH_M2"),
0719 KEEMBAY_MUX(0x3, "TPIU_M3"),
0720 KEEMBAY_MUX(0x4, "UART1_M4"),
0721 KEEMBAY_MUX(0x5, "LCD_M5"),
0722 KEEMBAY_MUX(0x6, "CAM_M6"),
0723 KEEMBAY_MUX(0x7, "GPIO_M7")),
0724 KEEMBAY_PIN_DESC(65, "GPIO65",
0725 KEEMBAY_MUX(0x0, "I3C0_M0"),
0726 KEEMBAY_MUX(0x1, "SPI1_M1"),
0727 KEEMBAY_MUX(0x2, "SD1_M2"),
0728 KEEMBAY_MUX(0x3, "TPIU_M3"),
0729 KEEMBAY_MUX(0x4, "SPI0_M4"),
0730 KEEMBAY_MUX(0x5, "LCD_M5"),
0731 KEEMBAY_MUX(0x6, "CAM_M6"),
0732 KEEMBAY_MUX(0x7, "GPIO_M7")),
0733 KEEMBAY_PIN_DESC(66, "GPIO66",
0734 KEEMBAY_MUX(0x0, "I3C0_M0"),
0735 KEEMBAY_MUX(0x1, "ETH_M1"),
0736 KEEMBAY_MUX(0x2, "I2C0_M2"),
0737 KEEMBAY_MUX(0x3, "TPIU_M3"),
0738 KEEMBAY_MUX(0x4, "SPI0_M4"),
0739 KEEMBAY_MUX(0x5, "LCD_M5"),
0740 KEEMBAY_MUX(0x6, "CAM_M6"),
0741 KEEMBAY_MUX(0x7, "GPIO_M7")),
0742 KEEMBAY_PIN_DESC(67, "GPIO67",
0743 KEEMBAY_MUX(0x0, "I3C1_M0"),
0744 KEEMBAY_MUX(0x1, "ETH_M1"),
0745 KEEMBAY_MUX(0x2, "I2C0_M2"),
0746 KEEMBAY_MUX(0x3, "TPIU_M3"),
0747 KEEMBAY_MUX(0x4, "SPI0_M4"),
0748 KEEMBAY_MUX(0x5, "LCD_M5"),
0749 KEEMBAY_MUX(0x6, "I2S3_M6"),
0750 KEEMBAY_MUX(0x7, "GPIO_M7")),
0751 KEEMBAY_PIN_DESC(68, "GPIO68",
0752 KEEMBAY_MUX(0x0, "I3C1_M0"),
0753 KEEMBAY_MUX(0x1, "ETH_M1"),
0754 KEEMBAY_MUX(0x2, "I2C1_M2"),
0755 KEEMBAY_MUX(0x3, "TPIU_M3"),
0756 KEEMBAY_MUX(0x4, "SPI0_M4"),
0757 KEEMBAY_MUX(0x5, "LCD_M5"),
0758 KEEMBAY_MUX(0x6, "I2S3_M6"),
0759 KEEMBAY_MUX(0x7, "GPIO_M7")),
0760 KEEMBAY_PIN_DESC(69, "GPIO69",
0761 KEEMBAY_MUX(0x0, "I3C2_M0"),
0762 KEEMBAY_MUX(0x1, "ETH_M1"),
0763 KEEMBAY_MUX(0x2, "I2C1_M2"),
0764 KEEMBAY_MUX(0x3, "TPIU_M3"),
0765 KEEMBAY_MUX(0x4, "SPI0_M4"),
0766 KEEMBAY_MUX(0x5, "LCD_M5"),
0767 KEEMBAY_MUX(0x6, "I2S3_M6"),
0768 KEEMBAY_MUX(0x7, "GPIO_M7")),
0769 KEEMBAY_PIN_DESC(70, "GPIO70",
0770 KEEMBAY_MUX(0x0, "I3C2_M0"),
0771 KEEMBAY_MUX(0x1, "ETH_M1"),
0772 KEEMBAY_MUX(0x2, "SPI0_M2"),
0773 KEEMBAY_MUX(0x3, "TPIU_M3"),
0774 KEEMBAY_MUX(0x4, "SD0_M4"),
0775 KEEMBAY_MUX(0x5, "LCD_M5"),
0776 KEEMBAY_MUX(0x6, "I2S3_M6"),
0777 KEEMBAY_MUX(0x7, "GPIO_M7")),
0778 KEEMBAY_PIN_DESC(71, "GPIO71",
0779 KEEMBAY_MUX(0x0, "I3C0_M0"),
0780 KEEMBAY_MUX(0x1, "ETH_M1"),
0781 KEEMBAY_MUX(0x2, "SLVDS1_M2"),
0782 KEEMBAY_MUX(0x3, "TPIU_M3"),
0783 KEEMBAY_MUX(0x4, "SD0_M4"),
0784 KEEMBAY_MUX(0x5, "LCD_M5"),
0785 KEEMBAY_MUX(0x6, "I2S3_M6"),
0786 KEEMBAY_MUX(0x7, "GPIO_M7")),
0787 KEEMBAY_PIN_DESC(72, "GPIO72",
0788 KEEMBAY_MUX(0x0, "I3C1_M0"),
0789 KEEMBAY_MUX(0x1, "ETH_M1"),
0790 KEEMBAY_MUX(0x2, "SLVDS1_M2"),
0791 KEEMBAY_MUX(0x3, "TPIU_M3"),
0792 KEEMBAY_MUX(0x4, "SD0_M4"),
0793 KEEMBAY_MUX(0x5, "LCD_M5"),
0794 KEEMBAY_MUX(0x6, "UART2_M6"),
0795 KEEMBAY_MUX(0x7, "GPIO_M7")),
0796 KEEMBAY_PIN_DESC(73, "GPIO73",
0797 KEEMBAY_MUX(0x0, "I3C2_M0"),
0798 KEEMBAY_MUX(0x1, "ETH_M1"),
0799 KEEMBAY_MUX(0x2, "SLVDS1_M2"),
0800 KEEMBAY_MUX(0x3, "TPIU_M3"),
0801 KEEMBAY_MUX(0x4, "SD0_M4"),
0802 KEEMBAY_MUX(0x5, "LCD_M5"),
0803 KEEMBAY_MUX(0x6, "UART2_M6"),
0804 KEEMBAY_MUX(0x7, "GPIO_M7")),
0805 KEEMBAY_PIN_DESC(74, "GPIO74",
0806 KEEMBAY_MUX(0x0, "I3C0_M0"),
0807 KEEMBAY_MUX(0x1, "ETH_M1"),
0808 KEEMBAY_MUX(0x2, "SLVDS1_M2"),
0809 KEEMBAY_MUX(0x3, "TPIU_M3"),
0810 KEEMBAY_MUX(0x4, "SD0_M4"),
0811 KEEMBAY_MUX(0x5, "LCD_M5"),
0812 KEEMBAY_MUX(0x6, "UART2_M6"),
0813 KEEMBAY_MUX(0x7, "GPIO_M7")),
0814 KEEMBAY_PIN_DESC(75, "GPIO75",
0815 KEEMBAY_MUX(0x0, "I3C0_M0"),
0816 KEEMBAY_MUX(0x1, "ETH_M1"),
0817 KEEMBAY_MUX(0x2, "SLVDS1_M2"),
0818 KEEMBAY_MUX(0x3, "TPIU_M3"),
0819 KEEMBAY_MUX(0x4, "SD0_M4"),
0820 KEEMBAY_MUX(0x5, "LCD_M5"),
0821 KEEMBAY_MUX(0x6, "UART2_M6"),
0822 KEEMBAY_MUX(0x7, "GPIO_M7")),
0823 KEEMBAY_PIN_DESC(76, "GPIO76",
0824 KEEMBAY_MUX(0x0, "I2C2_M0"),
0825 KEEMBAY_MUX(0x1, "I3C0_M1"),
0826 KEEMBAY_MUX(0x2, "SLVDS1_M2"),
0827 KEEMBAY_MUX(0x3, "TPIU_M3"),
0828 KEEMBAY_MUX(0x4, "ETH_M4"),
0829 KEEMBAY_MUX(0x5, "LCD_M5"),
0830 KEEMBAY_MUX(0x6, "UART3_M6"),
0831 KEEMBAY_MUX(0x7, "GPIO_M7")),
0832 KEEMBAY_PIN_DESC(77, "GPIO77",
0833 KEEMBAY_MUX(0x0, "PCIE_M0"),
0834 KEEMBAY_MUX(0x1, "I3C1_M1"),
0835 KEEMBAY_MUX(0x2, "SLVDS1_M2"),
0836 KEEMBAY_MUX(0x3, "TPIU_M3"),
0837 KEEMBAY_MUX(0x4, "I3C2_M4"),
0838 KEEMBAY_MUX(0x5, "LCD_M5"),
0839 KEEMBAY_MUX(0x6, "UART3_M6"),
0840 KEEMBAY_MUX(0x7, "GPIO_M7")),
0841 KEEMBAY_PIN_DESC(78, "GPIO78",
0842 KEEMBAY_MUX(0x0, "PCIE_M0"),
0843 KEEMBAY_MUX(0x1, "I3C2_M1"),
0844 KEEMBAY_MUX(0x2, "SLVDS1_M2"),
0845 KEEMBAY_MUX(0x3, "TPIU_M3"),
0846 KEEMBAY_MUX(0x4, "I3C2_M4"),
0847 KEEMBAY_MUX(0x5, "LCD_M5"),
0848 KEEMBAY_MUX(0x6, "UART3_M6"),
0849 KEEMBAY_MUX(0x7, "GPIO_M7")),
0850 KEEMBAY_PIN_DESC(79, "GPIO79",
0851 KEEMBAY_MUX(0x0, "PCIE_M0"),
0852 KEEMBAY_MUX(0x1, "I2C2_M1"),
0853 KEEMBAY_MUX(0x2, "SLVDS1_M2"),
0854 KEEMBAY_MUX(0x3, "TPIU_M3"),
0855 KEEMBAY_MUX(0x4, "I3C2_M4"),
0856 KEEMBAY_MUX(0x5, "LCD_M5"),
0857 KEEMBAY_MUX(0x6, "UART3_M6"),
0858 KEEMBAY_MUX(0x7, "GPIO_M7")),
0859 };
0860
0861 static inline u32 keembay_read_reg(void __iomem *base, unsigned int pin)
0862 {
0863 return readl(base + KEEMBAY_GPIO_REG_OFFSET(pin));
0864 }
0865
0866 static inline u32 keembay_read_gpio_reg(void __iomem *base, unsigned int pin)
0867 {
0868 return keembay_read_reg(base, pin / KEEMBAY_GPIO_MAX_PER_REG);
0869 }
0870
0871 static inline u32 keembay_read_pin(void __iomem *base, unsigned int pin)
0872 {
0873 u32 val = keembay_read_gpio_reg(base, pin);
0874
0875 return !!(val & BIT(pin % KEEMBAY_GPIO_MAX_PER_REG));
0876 }
0877
0878 static inline void keembay_write_reg(u32 val, void __iomem *base, unsigned int pin)
0879 {
0880 writel(val, base + KEEMBAY_GPIO_REG_OFFSET(pin));
0881 }
0882
0883 static inline void keembay_write_gpio_reg(u32 val, void __iomem *base, unsigned int pin)
0884 {
0885 keembay_write_reg(val, base, pin / KEEMBAY_GPIO_MAX_PER_REG);
0886 }
0887
0888 static void keembay_gpio_invert(struct keembay_pinctrl *kpc, unsigned int pin)
0889 {
0890 unsigned int val = keembay_read_reg(kpc->base1 + KEEMBAY_GPIO_MODE, pin);
0891
0892
0893
0894
0895
0896
0897
0898 val |= FIELD_PREP(KEEMBAY_GPIO_MODE_INV_MASK, KEEMBAY_GPIO_MODE_INV_VAL);
0899 keembay_write_reg(val, kpc->base1 + KEEMBAY_GPIO_MODE, pin);
0900 }
0901
0902 static void keembay_gpio_restore_default(struct keembay_pinctrl *kpc, unsigned int pin)
0903 {
0904 unsigned int val = keembay_read_reg(kpc->base1 + KEEMBAY_GPIO_MODE, pin);
0905
0906 val &= FIELD_PREP(KEEMBAY_GPIO_MODE_INV_MASK, 0);
0907 keembay_write_reg(val, kpc->base1 + KEEMBAY_GPIO_MODE, pin);
0908 }
0909
0910 static int keembay_request_gpio(struct pinctrl_dev *pctldev,
0911 struct pinctrl_gpio_range *range, unsigned int pin)
0912 {
0913 struct keembay_pinctrl *kpc = pinctrl_dev_get_drvdata(pctldev);
0914 unsigned int val;
0915
0916 if (pin >= kpc->npins)
0917 return -EINVAL;
0918
0919 val = keembay_read_reg(kpc->base1 + KEEMBAY_GPIO_MODE, pin);
0920 val = FIELD_GET(KEEMBAY_GPIO_MODE_SELECT_MASK, val);
0921
0922
0923 if (val != KEEMBAY_GPIO_MODE_DEFAULT)
0924 return -EBUSY;
0925
0926 return 0;
0927 }
0928
0929 static int keembay_set_mux(struct pinctrl_dev *pctldev, unsigned int fun_sel,
0930 unsigned int grp_sel)
0931 {
0932 struct keembay_pinctrl *kpc = pinctrl_dev_get_drvdata(pctldev);
0933 struct function_desc *func;
0934 struct group_desc *grp;
0935 unsigned int val;
0936 u8 pin_mode;
0937 int pin;
0938
0939 grp = pinctrl_generic_get_group(pctldev, grp_sel);
0940 if (!grp)
0941 return -EINVAL;
0942
0943 func = pinmux_generic_get_function(pctldev, fun_sel);
0944 if (!func)
0945 return -EINVAL;
0946
0947
0948 pin = *grp->pins;
0949 pin_mode = *(u8 *)(func->data);
0950
0951 val = keembay_read_reg(kpc->base1 + KEEMBAY_GPIO_MODE, pin);
0952 val = u32_replace_bits(val, pin_mode, KEEMBAY_GPIO_MODE_SELECT_MASK);
0953 keembay_write_reg(val, kpc->base1 + KEEMBAY_GPIO_MODE, pin);
0954
0955 return 0;
0956 }
0957
0958 static u32 keembay_pinconf_get_pull(struct keembay_pinctrl *kpc, unsigned int pin)
0959 {
0960 unsigned int val = keembay_read_reg(kpc->base1 + KEEMBAY_GPIO_MODE, pin);
0961
0962 return FIELD_GET(KEEMBAY_GPIO_MODE_PULLUP_MASK, val);
0963 }
0964
0965 static int keembay_pinconf_set_pull(struct keembay_pinctrl *kpc, unsigned int pin,
0966 unsigned int pull)
0967 {
0968 unsigned int val = keembay_read_reg(kpc->base1 + KEEMBAY_GPIO_MODE, pin);
0969
0970 val = u32_replace_bits(val, pull, KEEMBAY_GPIO_MODE_PULLUP_MASK);
0971 keembay_write_reg(val, kpc->base1 + KEEMBAY_GPIO_MODE, pin);
0972
0973 return 0;
0974 }
0975
0976 static int keembay_pinconf_get_drive(struct keembay_pinctrl *kpc, unsigned int pin)
0977 {
0978 unsigned int val = keembay_read_reg(kpc->base1 + KEEMBAY_GPIO_MODE, pin);
0979
0980 val = FIELD_GET(KEEMBAY_GPIO_MODE_DRIVE_MASK, val) * 4;
0981 if (val)
0982 return val;
0983
0984 return KEEMBAY_GPIO_MIN_STRENGTH;
0985 }
0986
0987 static int keembay_pinconf_set_drive(struct keembay_pinctrl *kpc, unsigned int pin,
0988 unsigned int drive)
0989 {
0990 unsigned int val = keembay_read_reg(kpc->base1 + KEEMBAY_GPIO_MODE, pin);
0991 unsigned int strength = clamp_val(drive, KEEMBAY_GPIO_MIN_STRENGTH,
0992 KEEMBAY_GPIO_MAX_STRENGTH) / 4;
0993
0994 val = u32_replace_bits(val, strength, KEEMBAY_GPIO_MODE_DRIVE_MASK);
0995 keembay_write_reg(val, kpc->base1 + KEEMBAY_GPIO_MODE, pin);
0996
0997 return 0;
0998 }
0999
1000 static int keembay_pinconf_get_slew_rate(struct keembay_pinctrl *kpc, unsigned int pin)
1001 {
1002 unsigned int val = keembay_read_reg(kpc->base1 + KEEMBAY_GPIO_MODE, pin);
1003
1004 return !!(val & KEEMBAY_GPIO_MODE_SLEW_RATE);
1005 }
1006
1007 static int keembay_pinconf_set_slew_rate(struct keembay_pinctrl *kpc, unsigned int pin,
1008 unsigned int slew_rate)
1009 {
1010 unsigned int val = keembay_read_reg(kpc->base1 + KEEMBAY_GPIO_MODE, pin);
1011
1012 if (slew_rate)
1013 val |= KEEMBAY_GPIO_MODE_SLEW_RATE;
1014 else
1015 val &= ~KEEMBAY_GPIO_MODE_SLEW_RATE;
1016
1017 keembay_write_reg(val, kpc->base1 + KEEMBAY_GPIO_MODE, pin);
1018
1019 return 0;
1020 }
1021
1022 static int keembay_pinconf_get_schmitt(struct keembay_pinctrl *kpc, unsigned int pin)
1023 {
1024 unsigned int val = keembay_read_reg(kpc->base1 + KEEMBAY_GPIO_MODE, pin);
1025
1026 return !!(val & KEEMBAY_GPIO_MODE_SCHMITT_EN);
1027 }
1028
1029 static int keembay_pinconf_set_schmitt(struct keembay_pinctrl *kpc, unsigned int pin,
1030 unsigned int schmitt_en)
1031 {
1032 unsigned int val = keembay_read_reg(kpc->base1 + KEEMBAY_GPIO_MODE, pin);
1033
1034 if (schmitt_en)
1035 val |= KEEMBAY_GPIO_MODE_SCHMITT_EN;
1036 else
1037 val &= ~KEEMBAY_GPIO_MODE_SCHMITT_EN;
1038
1039 keembay_write_reg(val, kpc->base1 + KEEMBAY_GPIO_MODE, pin);
1040
1041 return 0;
1042 }
1043
1044 static int keembay_pinconf_get(struct pinctrl_dev *pctldev, unsigned int pin,
1045 unsigned long *cfg)
1046 {
1047 struct keembay_pinctrl *kpc = pinctrl_dev_get_drvdata(pctldev);
1048 unsigned int param = pinconf_to_config_param(*cfg);
1049 unsigned int val;
1050
1051 if (pin >= kpc->npins)
1052 return -EINVAL;
1053
1054 switch (param) {
1055 case PIN_CONFIG_BIAS_DISABLE:
1056 if (keembay_pinconf_get_pull(kpc, pin) != KEEMBAY_GPIO_DISABLE)
1057 return -EINVAL;
1058 break;
1059
1060 case PIN_CONFIG_BIAS_PULL_UP:
1061 if (keembay_pinconf_get_pull(kpc, pin) != KEEMBAY_GPIO_PULL_UP)
1062 return -EINVAL;
1063 break;
1064
1065 case PIN_CONFIG_BIAS_PULL_DOWN:
1066 if (keembay_pinconf_get_pull(kpc, pin) != KEEMBAY_GPIO_PULL_DOWN)
1067 return -EINVAL;
1068 break;
1069
1070 case PIN_CONFIG_BIAS_BUS_HOLD:
1071 if (keembay_pinconf_get_pull(kpc, pin) != KEEMBAY_GPIO_BUS_HOLD)
1072 return -EINVAL;
1073 break;
1074
1075 case PIN_CONFIG_INPUT_SCHMITT_ENABLE:
1076 if (!keembay_pinconf_get_schmitt(kpc, pin))
1077 return -EINVAL;
1078 break;
1079
1080 case PIN_CONFIG_SLEW_RATE:
1081 val = keembay_pinconf_get_slew_rate(kpc, pin);
1082 *cfg = pinconf_to_config_packed(param, val);
1083 break;
1084
1085 case PIN_CONFIG_DRIVE_STRENGTH:
1086 val = keembay_pinconf_get_drive(kpc, pin);
1087 *cfg = pinconf_to_config_packed(param, val);
1088 break;
1089
1090 default:
1091 return -ENOTSUPP;
1092 }
1093
1094 return 0;
1095 }
1096
1097 static int keembay_pinconf_set(struct pinctrl_dev *pctldev, unsigned int pin,
1098 unsigned long *cfg, unsigned int num_configs)
1099 {
1100 struct keembay_pinctrl *kpc = pinctrl_dev_get_drvdata(pctldev);
1101 enum pin_config_param param;
1102 unsigned int arg, i;
1103 int ret = 0;
1104
1105 if (pin >= kpc->npins)
1106 return -EINVAL;
1107
1108 for (i = 0; i < num_configs; i++) {
1109 param = pinconf_to_config_param(cfg[i]);
1110 arg = pinconf_to_config_argument(cfg[i]);
1111
1112 switch (param) {
1113 case PIN_CONFIG_BIAS_DISABLE:
1114 ret = keembay_pinconf_set_pull(kpc, pin, KEEMBAY_GPIO_DISABLE);
1115 break;
1116
1117 case PIN_CONFIG_BIAS_PULL_UP:
1118 ret = keembay_pinconf_set_pull(kpc, pin, KEEMBAY_GPIO_PULL_UP);
1119 break;
1120
1121 case PIN_CONFIG_BIAS_PULL_DOWN:
1122 ret = keembay_pinconf_set_pull(kpc, pin, KEEMBAY_GPIO_PULL_DOWN);
1123 break;
1124
1125 case PIN_CONFIG_BIAS_BUS_HOLD:
1126 ret = keembay_pinconf_set_pull(kpc, pin, KEEMBAY_GPIO_BUS_HOLD);
1127 break;
1128
1129 case PIN_CONFIG_INPUT_SCHMITT_ENABLE:
1130 ret = keembay_pinconf_set_schmitt(kpc, pin, arg);
1131 break;
1132
1133 case PIN_CONFIG_SLEW_RATE:
1134 ret = keembay_pinconf_set_slew_rate(kpc, pin, arg);
1135 break;
1136
1137 case PIN_CONFIG_DRIVE_STRENGTH:
1138 ret = keembay_pinconf_set_drive(kpc, pin, arg);
1139 break;
1140
1141 default:
1142 return -ENOTSUPP;
1143 }
1144 if (ret)
1145 return ret;
1146 }
1147 return ret;
1148 }
1149
1150 static const struct pinctrl_ops keembay_pctlops = {
1151 .get_groups_count = pinctrl_generic_get_group_count,
1152 .get_group_name = pinctrl_generic_get_group_name,
1153 .get_group_pins = pinctrl_generic_get_group_pins,
1154 .dt_node_to_map = pinconf_generic_dt_node_to_map_all,
1155 .dt_free_map = pinconf_generic_dt_free_map,
1156 };
1157
1158 static const struct pinmux_ops keembay_pmxops = {
1159 .get_functions_count = pinmux_generic_get_function_count,
1160 .get_function_name = pinmux_generic_get_function_name,
1161 .get_function_groups = pinmux_generic_get_function_groups,
1162 .gpio_request_enable = keembay_request_gpio,
1163 .set_mux = keembay_set_mux,
1164 };
1165
1166 static const struct pinconf_ops keembay_confops = {
1167 .is_generic = true,
1168 .pin_config_get = keembay_pinconf_get,
1169 .pin_config_set = keembay_pinconf_set,
1170 };
1171
1172 static struct pinctrl_desc keembay_pinctrl_desc = {
1173 .name = "keembay-pinmux",
1174 .pctlops = &keembay_pctlops,
1175 .pmxops = &keembay_pmxops,
1176 .confops = &keembay_confops,
1177 .owner = THIS_MODULE,
1178 };
1179
1180 static int keembay_gpio_get(struct gpio_chip *gc, unsigned int pin)
1181 {
1182 struct keembay_pinctrl *kpc = gpiochip_get_data(gc);
1183 unsigned int val, offset;
1184
1185 val = keembay_read_reg(kpc->base1 + KEEMBAY_GPIO_MODE, pin);
1186 offset = (val & KEEMBAY_GPIO_MODE_DIR) ? KEEMBAY_GPIO_DATA_IN : KEEMBAY_GPIO_DATA_OUT;
1187
1188 return keembay_read_pin(kpc->base0 + offset, pin);
1189 }
1190
1191 static void keembay_gpio_set(struct gpio_chip *gc, unsigned int pin, int val)
1192 {
1193 struct keembay_pinctrl *kpc = gpiochip_get_data(gc);
1194 unsigned int reg_val;
1195
1196 reg_val = keembay_read_gpio_reg(kpc->base0 + KEEMBAY_GPIO_DATA_OUT, pin);
1197 if (val)
1198 keembay_write_gpio_reg(reg_val | BIT(pin % KEEMBAY_GPIO_MAX_PER_REG),
1199 kpc->base0 + KEEMBAY_GPIO_DATA_HIGH, pin);
1200 else
1201 keembay_write_gpio_reg(~reg_val | BIT(pin % KEEMBAY_GPIO_MAX_PER_REG),
1202 kpc->base0 + KEEMBAY_GPIO_DATA_LOW, pin);
1203 }
1204
1205 static int keembay_gpio_get_direction(struct gpio_chip *gc, unsigned int pin)
1206 {
1207 struct keembay_pinctrl *kpc = gpiochip_get_data(gc);
1208 unsigned int val = keembay_read_reg(kpc->base1 + KEEMBAY_GPIO_MODE, pin);
1209
1210 return !!(val & KEEMBAY_GPIO_MODE_DIR);
1211 }
1212
1213 static int keembay_gpio_set_direction_in(struct gpio_chip *gc, unsigned int pin)
1214 {
1215 struct keembay_pinctrl *kpc = gpiochip_get_data(gc);
1216 unsigned int val;
1217
1218 val = keembay_read_reg(kpc->base1 + KEEMBAY_GPIO_MODE, pin);
1219 val |= KEEMBAY_GPIO_MODE_DIR;
1220 keembay_write_reg(val, kpc->base1 + KEEMBAY_GPIO_MODE, pin);
1221
1222 return 0;
1223 }
1224
1225 static int keembay_gpio_set_direction_out(struct gpio_chip *gc,
1226 unsigned int pin, int value)
1227 {
1228 struct keembay_pinctrl *kpc = gpiochip_get_data(gc);
1229 unsigned int val;
1230
1231 val = keembay_read_reg(kpc->base1 + KEEMBAY_GPIO_MODE, pin);
1232 val &= ~KEEMBAY_GPIO_MODE_DIR;
1233 keembay_write_reg(val, kpc->base1 + KEEMBAY_GPIO_MODE, pin);
1234 keembay_gpio_set(gc, pin, value);
1235
1236 return 0;
1237 }
1238
1239 static void keembay_gpio_irq_handler(struct irq_desc *desc)
1240 {
1241 struct gpio_chip *gc = irq_desc_get_handler_data(desc);
1242 unsigned int kmb_irq = irq_desc_get_irq(desc);
1243 unsigned long reg, clump = 0, bit = 0;
1244 struct irq_chip *parent_chip;
1245 struct keembay_pinctrl *kpc;
1246 unsigned int src, pin, val;
1247
1248
1249 for (src = 0; src < KEEMBAY_GPIO_NUM_IRQ; src++) {
1250 if (kmb_irq == gc->irq.parents[src])
1251 break;
1252 }
1253
1254 if (src == KEEMBAY_GPIO_NUM_IRQ)
1255 return;
1256
1257 parent_chip = irq_desc_get_chip(desc);
1258 kpc = gpiochip_get_data(gc);
1259
1260 chained_irq_enter(parent_chip, desc);
1261 reg = keembay_read_reg(kpc->base1 + KEEMBAY_GPIO_INT_CFG, src);
1262
1263
1264
1265
1266
1267
1268 for_each_set_clump8(bit, clump, ®, BITS_PER_TYPE(typeof(reg))) {
1269 pin = clump & ~KEEMBAY_GPIO_IRQ_ENABLE;
1270 val = keembay_read_pin(kpc->base0 + KEEMBAY_GPIO_DATA_IN, pin);
1271 kmb_irq = irq_linear_revmap(gc->irq.domain, pin);
1272
1273
1274 if (val && (clump & KEEMBAY_GPIO_IRQ_ENABLE))
1275 generic_handle_irq(kmb_irq);
1276 }
1277 chained_irq_exit(parent_chip, desc);
1278 }
1279
1280 static void keembay_gpio_clear_irq(struct irq_data *data, unsigned long pos,
1281 u32 src, irq_hw_number_t pin)
1282 {
1283 struct gpio_chip *gc = irq_data_get_irq_chip_data(data);
1284 struct keembay_pinctrl *kpc = gpiochip_get_data(gc);
1285 unsigned long trig = irqd_get_trigger_type(data);
1286 struct keembay_gpio_irq *irq = &kpc->irq[src];
1287 unsigned long val;
1288
1289
1290 if ((pos / KEEMBAY_GPIO_NUM_IRQ) >= KEEMBAY_GPIO_MAX_PER_IRQ)
1291 return;
1292
1293
1294 val = keembay_read_reg(kpc->base1 + KEEMBAY_GPIO_INT_CFG, src);
1295
1296 bitmap_set_value8(&val, 0, pos);
1297 keembay_write_reg(val, kpc->base1 + KEEMBAY_GPIO_INT_CFG, src);
1298
1299 irq->num_share--;
1300 irq->pins[pos / KEEMBAY_GPIO_NUM_IRQ] = 0;
1301
1302 if (trig & IRQ_TYPE_LEVEL_MASK)
1303 keembay_gpio_restore_default(kpc, pin);
1304
1305 if (irq->trigger == IRQ_TYPE_LEVEL_HIGH)
1306 kpc->max_gpios_level_type++;
1307 else if (irq->trigger == IRQ_TYPE_EDGE_RISING)
1308 kpc->max_gpios_edge_type++;
1309 }
1310
1311 static int keembay_find_free_slot(struct keembay_pinctrl *kpc, unsigned int src)
1312 {
1313 unsigned long val = keembay_read_reg(kpc->base1 + KEEMBAY_GPIO_INT_CFG, src);
1314
1315 return bitmap_find_free_region(&val, KEEMBAY_GPIO_MAX_PER_REG, 3) / KEEMBAY_GPIO_NUM_IRQ;
1316 }
1317
1318 static int keembay_find_free_src(struct keembay_pinctrl *kpc, unsigned int trig)
1319 {
1320 int src, type = 0;
1321
1322 if (trig & IRQ_TYPE_LEVEL_MASK)
1323 type = IRQ_TYPE_LEVEL_HIGH;
1324 else if (trig & IRQ_TYPE_EDGE_BOTH)
1325 type = IRQ_TYPE_EDGE_RISING;
1326
1327 for (src = 0; src < KEEMBAY_GPIO_NUM_IRQ; src++) {
1328 if (kpc->irq[src].trigger != type)
1329 continue;
1330
1331 if (!keembay_read_reg(kpc->base1 + KEEMBAY_GPIO_INT_CFG, src) ||
1332 kpc->irq[src].num_share < KEEMBAY_GPIO_MAX_PER_IRQ)
1333 return src;
1334 }
1335
1336 return -EBUSY;
1337 }
1338
1339 static void keembay_gpio_set_irq(struct keembay_pinctrl *kpc, int src,
1340 int slot, irq_hw_number_t pin)
1341 {
1342 unsigned long val = pin | KEEMBAY_GPIO_IRQ_ENABLE;
1343 struct keembay_gpio_irq *irq = &kpc->irq[src];
1344 unsigned long flags, reg;
1345
1346 raw_spin_lock_irqsave(&kpc->lock, flags);
1347 reg = keembay_read_reg(kpc->base1 + KEEMBAY_GPIO_INT_CFG, src);
1348 bitmap_set_value8(®, val, slot * 8);
1349 keembay_write_reg(reg, kpc->base1 + KEEMBAY_GPIO_INT_CFG, src);
1350 raw_spin_unlock_irqrestore(&kpc->lock, flags);
1351
1352 if (irq->trigger == IRQ_TYPE_LEVEL_HIGH)
1353 kpc->max_gpios_level_type--;
1354 else if (irq->trigger == IRQ_TYPE_EDGE_RISING)
1355 kpc->max_gpios_edge_type--;
1356
1357 irq->source = src;
1358 irq->pins[slot] = pin;
1359 irq->num_share++;
1360 }
1361
1362 static void keembay_gpio_irq_enable(struct irq_data *data)
1363 {
1364 struct gpio_chip *gc = irq_data_get_irq_chip_data(data);
1365 struct keembay_pinctrl *kpc = gpiochip_get_data(gc);
1366 unsigned int trig = irqd_get_trigger_type(data);
1367 irq_hw_number_t pin = irqd_to_hwirq(data);
1368 int src, slot;
1369
1370
1371 src = keembay_find_free_src(kpc, trig);
1372 slot = keembay_find_free_slot(kpc, src);
1373
1374 if (src < 0 || slot < 0)
1375 return;
1376
1377 if (trig & KEEMBAY_GPIO_SENSE_LOW)
1378 keembay_gpio_invert(kpc, pin);
1379
1380 keembay_gpio_set_irq(kpc, src, slot, pin);
1381 }
1382
1383 static void keembay_gpio_irq_ack(struct irq_data *data)
1384 {
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394 }
1395
1396 static void keembay_gpio_irq_disable(struct irq_data *data)
1397 {
1398 struct gpio_chip *gc = irq_data_get_irq_chip_data(data);
1399 struct keembay_pinctrl *kpc = gpiochip_get_data(gc);
1400 irq_hw_number_t pin = irqd_to_hwirq(data);
1401 unsigned long reg, clump = 0, pos = 0;
1402 unsigned int src;
1403
1404 for (src = 0; src < KEEMBAY_GPIO_NUM_IRQ; src++) {
1405 reg = keembay_read_reg(kpc->base1 + KEEMBAY_GPIO_INT_CFG, src);
1406 for_each_set_clump8(pos, clump, ®, BITS_PER_TYPE(typeof(reg))) {
1407 if ((clump & ~KEEMBAY_GPIO_IRQ_ENABLE) == pin) {
1408 keembay_gpio_clear_irq(data, pos, src, pin);
1409 return;
1410 }
1411 }
1412 }
1413 }
1414
1415 static int keembay_gpio_irq_set_type(struct irq_data *data, unsigned int type)
1416 {
1417 struct gpio_chip *gc = irq_data_get_irq_chip_data(data);
1418 struct keembay_pinctrl *kpc = gpiochip_get_data(gc);
1419
1420
1421 if (!kpc->max_gpios_edge_type && (type & IRQ_TYPE_EDGE_BOTH))
1422 type = IRQ_TYPE_EDGE_RISING;
1423
1424 if (!kpc->max_gpios_level_type && (type & IRQ_TYPE_LEVEL_MASK))
1425 type = IRQ_TYPE_NONE;
1426
1427 if (type & IRQ_TYPE_EDGE_BOTH)
1428 irq_set_handler_locked(data, handle_edge_irq);
1429 else if (type & IRQ_TYPE_LEVEL_MASK)
1430 irq_set_handler_locked(data, handle_level_irq);
1431 else
1432 return -EINVAL;
1433
1434 return 0;
1435 }
1436
1437 static int keembay_gpio_add_pin_ranges(struct gpio_chip *chip)
1438 {
1439 struct keembay_pinctrl *kpc = gpiochip_get_data(chip);
1440 int ret;
1441
1442 ret = gpiochip_add_pin_range(chip, dev_name(kpc->dev), 0, 0, chip->ngpio);
1443 if (ret)
1444 dev_err_probe(kpc->dev, ret, "failed to add GPIO pin range\n");
1445 return ret;
1446 }
1447
1448 static struct irq_chip keembay_gpio_irqchip = {
1449 .name = "keembay-gpio",
1450 .irq_enable = keembay_gpio_irq_enable,
1451 .irq_disable = keembay_gpio_irq_disable,
1452 .irq_set_type = keembay_gpio_irq_set_type,
1453 .irq_ack = keembay_gpio_irq_ack,
1454 };
1455
1456 static int keembay_gpiochip_probe(struct keembay_pinctrl *kpc,
1457 struct platform_device *pdev)
1458 {
1459 unsigned int i, level_line = 0, edge_line = 0;
1460 struct gpio_chip *gc = &kpc->chip;
1461 struct gpio_irq_chip *girq;
1462
1463
1464 girq = &kpc->chip.irq;
1465 girq->chip = &keembay_gpio_irqchip;
1466 girq->parent_handler = keembay_gpio_irq_handler;
1467 girq->num_parents = KEEMBAY_GPIO_NUM_IRQ;
1468 girq->parents = devm_kcalloc(kpc->dev, girq->num_parents,
1469 sizeof(*girq->parents), GFP_KERNEL);
1470
1471 if (!girq->parents)
1472 return -ENOMEM;
1473
1474
1475 gc->label = dev_name(kpc->dev);
1476 gc->parent = kpc->dev;
1477 gc->request = gpiochip_generic_request;
1478 gc->free = gpiochip_generic_free;
1479 gc->get_direction = keembay_gpio_get_direction;
1480 gc->direction_input = keembay_gpio_set_direction_in;
1481 gc->direction_output = keembay_gpio_set_direction_out;
1482 gc->get = keembay_gpio_get;
1483 gc->set = keembay_gpio_set;
1484 gc->set_config = gpiochip_generic_config;
1485 gc->base = -1;
1486 gc->ngpio = kpc->npins;
1487 gc->add_pin_ranges = keembay_gpio_add_pin_ranges;
1488
1489 for (i = 0; i < KEEMBAY_GPIO_NUM_IRQ; i++) {
1490 struct keembay_gpio_irq *kmb_irq = &kpc->irq[i];
1491 int irq;
1492
1493 irq = platform_get_irq_optional(pdev, i);
1494 if (irq <= 0)
1495 continue;
1496
1497 girq->parents[i] = irq;
1498 kmb_irq->line = girq->parents[i];
1499 kmb_irq->source = i;
1500 kmb_irq->trigger = irq_get_trigger_type(girq->parents[i]);
1501 kmb_irq->num_share = 0;
1502
1503 if (kmb_irq->trigger == IRQ_TYPE_LEVEL_HIGH)
1504 level_line++;
1505 else
1506 edge_line++;
1507 }
1508
1509 kpc->max_gpios_level_type = level_line * KEEMBAY_GPIO_MAX_PER_IRQ;
1510 kpc->max_gpios_edge_type = edge_line * KEEMBAY_GPIO_MAX_PER_IRQ;
1511
1512 girq->default_type = IRQ_TYPE_NONE;
1513 girq->handler = handle_bad_irq;
1514
1515 return devm_gpiochip_add_data(kpc->dev, gc, kpc);
1516 }
1517
1518 static int keembay_build_groups(struct keembay_pinctrl *kpc)
1519 {
1520 struct group_desc *grp;
1521 unsigned int i;
1522
1523 kpc->ngroups = kpc->npins;
1524 grp = devm_kcalloc(kpc->dev, kpc->ngroups, sizeof(*grp), GFP_KERNEL);
1525 if (!grp)
1526 return -ENOMEM;
1527
1528
1529 for (i = 0; i < kpc->ngroups; i++) {
1530 const struct pinctrl_pin_desc *pdesc = keembay_pins + i;
1531 struct group_desc *kmb_grp = grp + i;
1532
1533 kmb_grp->name = pdesc->name;
1534 kmb_grp->pins = (int *)&pdesc->number;
1535 pinctrl_generic_add_group(kpc->pctrl, kmb_grp->name,
1536 kmb_grp->pins, 1, NULL);
1537 }
1538
1539 return 0;
1540 }
1541
1542 static int keembay_pinctrl_reg(struct keembay_pinctrl *kpc, struct device *dev)
1543 {
1544 int ret;
1545
1546 keembay_pinctrl_desc.pins = keembay_pins;
1547 ret = of_property_read_u32(dev->of_node, "ngpios", &kpc->npins);
1548 if (ret < 0)
1549 return ret;
1550 keembay_pinctrl_desc.npins = kpc->npins;
1551
1552 kpc->pctrl = devm_pinctrl_register(kpc->dev, &keembay_pinctrl_desc, kpc);
1553
1554 return PTR_ERR_OR_ZERO(kpc->pctrl);
1555 }
1556
1557 static int keembay_add_functions(struct keembay_pinctrl *kpc,
1558 struct function_desc *functions)
1559 {
1560 unsigned int i;
1561
1562
1563 for (i = 0; i < kpc->nfuncs; i++) {
1564 struct function_desc *func = &functions[i];
1565 const char **group_names;
1566 unsigned int grp_idx = 0;
1567 int j;
1568
1569 group_names = devm_kcalloc(kpc->dev, func->num_group_names,
1570 sizeof(*group_names), GFP_KERNEL);
1571 if (!group_names)
1572 return -ENOMEM;
1573
1574 for (j = 0; j < kpc->npins; j++) {
1575 const struct pinctrl_pin_desc *pdesc = &keembay_pins[j];
1576 struct keembay_mux_desc *mux;
1577
1578 for (mux = pdesc->drv_data; mux->name; mux++) {
1579 if (!strcmp(mux->name, func->name))
1580 group_names[grp_idx++] = pdesc->name;
1581 }
1582 }
1583
1584 func->group_names = group_names;
1585 }
1586
1587
1588 for (i = 0; i < kpc->nfuncs; i++) {
1589 pinmux_generic_add_function(kpc->pctrl,
1590 functions[i].name,
1591 functions[i].group_names,
1592 functions[i].num_group_names,
1593 functions[i].data);
1594 }
1595
1596 return 0;
1597 }
1598
1599 static int keembay_build_functions(struct keembay_pinctrl *kpc)
1600 {
1601 struct function_desc *keembay_funcs, *new_funcs;
1602 int i;
1603
1604
1605
1606
1607
1608 kpc->nfuncs = 0;
1609 keembay_funcs = kcalloc(kpc->npins * 8, sizeof(*keembay_funcs), GFP_KERNEL);
1610 if (!keembay_funcs)
1611 return -ENOMEM;
1612
1613
1614 for (i = 0; i < kpc->npins; i++) {
1615 const struct pinctrl_pin_desc *pdesc = keembay_pins + i;
1616 struct keembay_mux_desc *mux;
1617
1618 for (mux = pdesc->drv_data; mux->name; mux++) {
1619 struct function_desc *fdesc;
1620
1621
1622 for (fdesc = keembay_funcs; fdesc->name; fdesc++) {
1623 if (!strcmp(mux->name, fdesc->name)) {
1624 fdesc->num_group_names++;
1625 break;
1626 }
1627 }
1628
1629
1630 if (!fdesc->name) {
1631 fdesc->name = mux->name;
1632 fdesc->num_group_names = 1;
1633 fdesc->data = &mux->mode;
1634 kpc->nfuncs++;
1635 }
1636 }
1637 }
1638
1639
1640 new_funcs = krealloc(keembay_funcs, kpc->nfuncs * sizeof(*new_funcs), GFP_KERNEL);
1641 if (!new_funcs) {
1642 kfree(keembay_funcs);
1643 return -ENOMEM;
1644 }
1645
1646 return keembay_add_functions(kpc, new_funcs);
1647 }
1648
1649 static const struct keembay_pin_soc keembay_data = {
1650 .pins = keembay_pins,
1651 };
1652
1653 static const struct of_device_id keembay_pinctrl_match[] = {
1654 { .compatible = "intel,keembay-pinctrl", .data = &keembay_data },
1655 { }
1656 };
1657 MODULE_DEVICE_TABLE(of, keembay_pinctrl_match);
1658
1659 static int keembay_pinctrl_probe(struct platform_device *pdev)
1660 {
1661 struct device *dev = &pdev->dev;
1662 struct keembay_pinctrl *kpc;
1663 int ret;
1664
1665 kpc = devm_kzalloc(dev, sizeof(*kpc), GFP_KERNEL);
1666 if (!kpc)
1667 return -ENOMEM;
1668
1669 kpc->dev = dev;
1670 kpc->soc = device_get_match_data(dev);
1671
1672 kpc->base0 = devm_platform_ioremap_resource(pdev, 0);
1673 if (IS_ERR(kpc->base0))
1674 return PTR_ERR(kpc->base0);
1675
1676 kpc->base1 = devm_platform_ioremap_resource(pdev, 1);
1677 if (IS_ERR(kpc->base1))
1678 return PTR_ERR(kpc->base1);
1679
1680 raw_spin_lock_init(&kpc->lock);
1681
1682 ret = keembay_pinctrl_reg(kpc, dev);
1683 if (ret)
1684 return ret;
1685
1686 ret = keembay_build_groups(kpc);
1687 if (ret)
1688 return ret;
1689
1690 ret = keembay_build_functions(kpc);
1691 if (ret)
1692 return ret;
1693
1694 ret = keembay_gpiochip_probe(kpc, pdev);
1695 if (ret)
1696 return ret;
1697
1698 platform_set_drvdata(pdev, kpc);
1699
1700 return 0;
1701 }
1702
1703 static struct platform_driver keembay_pinctrl_driver = {
1704 .probe = keembay_pinctrl_probe,
1705 .driver = {
1706 .name = "keembay-pinctrl",
1707 .of_match_table = keembay_pinctrl_match,
1708 },
1709 };
1710 module_platform_driver(keembay_pinctrl_driver);
1711
1712 MODULE_AUTHOR("Muhammad Husaini Zulkifli <muhammad.husaini.zulkifli@intel.com>");
1713 MODULE_AUTHOR("Vijayakannan Ayyathurai <vijayakannan.ayyathurai@intel.com>");
1714 MODULE_AUTHOR("Lakshmi Sowjanya D <lakshmi.sowjanya.d@intel.com>");
1715 MODULE_DESCRIPTION("Intel Keem Bay SoC pinctrl/GPIO driver");
1716 MODULE_LICENSE("GPL");