1af873fceSThomas Gleixner // SPDX-License-Identifier: GPL-2.0-only 2b5c23aa4SPaul Cercueil /* 3b5c23aa4SPaul Cercueil * Ingenic SoCs pinctrl driver 4b5c23aa4SPaul Cercueil * 5b5c23aa4SPaul Cercueil * Copyright (c) 2017 Paul Cercueil <paul@crapouillou.net> 6a0bb89e8SPaul Boddie * Copyright (c) 2017, 2019 Paul Boddie <paul@boddie.org.uk> 7424f3969S周琰杰 (Zhou Yanjie) * Copyright (c) 2019, 2020 周琰杰 (Zhou Yanjie) <zhouyanjie@wanyeetech.com> 8b5c23aa4SPaul Cercueil */ 9b5c23aa4SPaul Cercueil 10b5c23aa4SPaul Cercueil #include <linux/compiler.h> 1128d6eeb4SLinus Walleij #include <linux/gpio/driver.h> 12b5c23aa4SPaul Cercueil #include <linux/interrupt.h> 13b5c23aa4SPaul Cercueil #include <linux/io.h> 140ab1438bSMasahiro Yamada #include <linux/kernel.h> 15*8c943137SAndy Shevchenko #include <linux/mod_devicetable.h> 16*8c943137SAndy Shevchenko #include <linux/of.h> 17b5c23aa4SPaul Cercueil #include <linux/pinctrl/pinctrl.h> 18b5c23aa4SPaul Cercueil #include <linux/pinctrl/pinmux.h> 19b5c23aa4SPaul Cercueil #include <linux/pinctrl/pinconf.h> 20b5c23aa4SPaul Cercueil #include <linux/pinctrl/pinconf-generic.h> 21b5c23aa4SPaul Cercueil #include <linux/platform_device.h> 22*8c943137SAndy Shevchenko #include <linux/property.h> 23b5c23aa4SPaul Cercueil #include <linux/regmap.h> 2471f5e7b3SAidan MacDonald #include <linux/seq_file.h> 25b5c23aa4SPaul Cercueil #include <linux/slab.h> 26b5c23aa4SPaul Cercueil 27b5c23aa4SPaul Cercueil #include "core.h" 28b5c23aa4SPaul Cercueil #include "pinconf.h" 29b5c23aa4SPaul Cercueil #include "pinmux.h" 30b5c23aa4SPaul Cercueil 31e72394e2SPaul Cercueil #define GPIO_PIN 0x00 32e72394e2SPaul Cercueil #define GPIO_MSK 0x20 33e72394e2SPaul Cercueil 34424f3969S周琰杰 (Zhou Yanjie) #define JZ4730_GPIO_DATA 0x00 35424f3969S周琰杰 (Zhou Yanjie) #define JZ4730_GPIO_GPDIR 0x04 36424f3969S周琰杰 (Zhou Yanjie) #define JZ4730_GPIO_GPPUR 0x0c 37424f3969S周琰杰 (Zhou Yanjie) #define JZ4730_GPIO_GPALR 0x10 38424f3969S周琰杰 (Zhou Yanjie) #define JZ4730_GPIO_GPAUR 0x14 39424f3969S周琰杰 (Zhou Yanjie) #define JZ4730_GPIO_GPIDLR 0x18 40424f3969S周琰杰 (Zhou Yanjie) #define JZ4730_GPIO_GPIDUR 0x1c 41424f3969S周琰杰 (Zhou Yanjie) #define JZ4730_GPIO_GPIER 0x20 42424f3969S周琰杰 (Zhou Yanjie) #define JZ4730_GPIO_GPIMR 0x24 43424f3969S周琰杰 (Zhou Yanjie) #define JZ4730_GPIO_GPFR 0x28 44424f3969S周琰杰 (Zhou Yanjie) 45b5c23aa4SPaul Cercueil #define JZ4740_GPIO_DATA 0x10 46b5c23aa4SPaul Cercueil #define JZ4740_GPIO_PULL_DIS 0x30 47b5c23aa4SPaul Cercueil #define JZ4740_GPIO_FUNC 0x40 48b5c23aa4SPaul Cercueil #define JZ4740_GPIO_SELECT 0x50 49b5c23aa4SPaul Cercueil #define JZ4740_GPIO_DIR 0x60 50b5c23aa4SPaul Cercueil #define JZ4740_GPIO_TRIG 0x70 51b5c23aa4SPaul Cercueil #define JZ4740_GPIO_FLAG 0x80 52b5c23aa4SPaul Cercueil 53b4aa4876SPaul Cercueil #define JZ4770_GPIO_INT 0x10 54b4aa4876SPaul Cercueil #define JZ4770_GPIO_PAT1 0x30 55b4aa4876SPaul Cercueil #define JZ4770_GPIO_PAT0 0x40 56b4aa4876SPaul Cercueil #define JZ4770_GPIO_FLAG 0x50 57b4aa4876SPaul Cercueil #define JZ4770_GPIO_PEN 0x70 58b5c23aa4SPaul Cercueil 59d7da2a1eS周琰杰 (Zhou Yanjie) #define X1830_GPIO_PEL 0x110 60d7da2a1eS周琰杰 (Zhou Yanjie) #define X1830_GPIO_PEH 0x120 61943e0da1S周琰杰 (Zhou Yanjie) #define X1830_GPIO_SR 0x150 62943e0da1S周琰杰 (Zhou Yanjie) #define X1830_GPIO_SMT 0x160 63943e0da1S周琰杰 (Zhou Yanjie) 64943e0da1S周琰杰 (Zhou Yanjie) #define X2000_GPIO_EDG 0x70 65943e0da1S周琰杰 (Zhou Yanjie) #define X2000_GPIO_PEPU 0x80 66943e0da1S周琰杰 (Zhou Yanjie) #define X2000_GPIO_PEPD 0x90 67943e0da1S周琰杰 (Zhou Yanjie) #define X2000_GPIO_SR 0xd0 68943e0da1S周琰杰 (Zhou Yanjie) #define X2000_GPIO_SMT 0xe0 69fe1ad5eeSZhou Yanjie 70b5c23aa4SPaul Cercueil #define REG_SET(x) ((x) + 0x4) 71b5c23aa4SPaul Cercueil #define REG_CLEAR(x) ((x) + 0x8) 72b5c23aa4SPaul Cercueil 73d7da2a1eS周琰杰 (Zhou Yanjie) #define REG_PZ_BASE(x) ((x) * 7) 74d7da2a1eS周琰杰 (Zhou Yanjie) #define REG_PZ_GID2LD(x) ((x) * 7 + 0xf0) 75d7da2a1eS周琰杰 (Zhou Yanjie) 76d7da2a1eS周琰杰 (Zhou Yanjie) #define GPIO_PULL_DIS 0 77d7da2a1eS周琰杰 (Zhou Yanjie) #define GPIO_PULL_UP 1 78d7da2a1eS周琰杰 (Zhou Yanjie) #define GPIO_PULL_DOWN 2 79d7da2a1eS周琰杰 (Zhou Yanjie) 80b5c23aa4SPaul Cercueil #define PINS_PER_GPIO_CHIP 32 81424f3969S周琰杰 (Zhou Yanjie) #define JZ4730_PINS_PER_PAIRED_REG 16 82b5c23aa4SPaul Cercueil 83863becffS周琰杰 (Zhou Yanjie) #define INGENIC_PIN_GROUP_FUNCS(name, id, funcs) \ 84863becffS周琰杰 (Zhou Yanjie) { \ 85863becffS周琰杰 (Zhou Yanjie) name, \ 86863becffS周琰杰 (Zhou Yanjie) id##_pins, \ 87863becffS周琰杰 (Zhou Yanjie) ARRAY_SIZE(id##_pins), \ 88863becffS周琰杰 (Zhou Yanjie) funcs, \ 89863becffS周琰杰 (Zhou Yanjie) } 90863becffS周琰杰 (Zhou Yanjie) 91863becffS周琰杰 (Zhou Yanjie) #define INGENIC_PIN_GROUP(name, id, func) \ 92863becffS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP_FUNCS(name, id, (void *)(func)) 93863becffS周琰杰 (Zhou Yanjie) 94b5c23aa4SPaul Cercueil enum jz_version { 95424f3969S周琰杰 (Zhou Yanjie) ID_JZ4730, 96b5c23aa4SPaul Cercueil ID_JZ4740, 97f2a96765SPaul Cercueil ID_JZ4725B, 98215c81a3S周琰杰 (Zhou Yanjie) ID_JZ4750, 99b582b5a4S周琰杰 (Zhou Yanjie) ID_JZ4755, 1000257595aSZhou Yanjie ID_JZ4760, 101b5c23aa4SPaul Cercueil ID_JZ4770, 1020c990740S周琰杰 (Zhou Yanjie) ID_JZ4775, 103b5c23aa4SPaul Cercueil ID_JZ4780, 104fe1ad5eeSZhou Yanjie ID_X1000, 1055d21595bSZhou Yanjie ID_X1500, 106d7da2a1eS周琰杰 (Zhou Yanjie) ID_X1830, 107943e0da1S周琰杰 (Zhou Yanjie) ID_X2000, 1082a18211bS周琰杰 (Zhou Yanjie) ID_X2100, 109b5c23aa4SPaul Cercueil }; 110b5c23aa4SPaul Cercueil 111b5c23aa4SPaul Cercueil struct ingenic_chip_info { 112b5c23aa4SPaul Cercueil unsigned int num_chips; 113f742e5ebS周琰杰 (Zhou Yanjie) unsigned int reg_offset; 114baf15647SPaul Cercueil enum jz_version version; 115b5c23aa4SPaul Cercueil 116b5c23aa4SPaul Cercueil const struct group_desc *groups; 117b5c23aa4SPaul Cercueil unsigned int num_groups; 118b5c23aa4SPaul Cercueil 119b5c23aa4SPaul Cercueil const struct function_desc *functions; 120b5c23aa4SPaul Cercueil unsigned int num_functions; 121b5c23aa4SPaul Cercueil 122b5c23aa4SPaul Cercueil const u32 *pull_ups, *pull_downs; 1239279c00fSAidan MacDonald 1249279c00fSAidan MacDonald const struct regmap_access_table *access_table; 125b5c23aa4SPaul Cercueil }; 126b5c23aa4SPaul Cercueil 127b5c23aa4SPaul Cercueil struct ingenic_pinctrl { 128b5c23aa4SPaul Cercueil struct device *dev; 129b5c23aa4SPaul Cercueil struct regmap *map; 130b5c23aa4SPaul Cercueil struct pinctrl_dev *pctl; 131b5c23aa4SPaul Cercueil struct pinctrl_pin_desc *pdesc; 132b5c23aa4SPaul Cercueil 133b5c23aa4SPaul Cercueil const struct ingenic_chip_info *info; 134b5c23aa4SPaul Cercueil }; 135b5c23aa4SPaul Cercueil 136e72394e2SPaul Cercueil struct ingenic_gpio_chip { 137e72394e2SPaul Cercueil struct ingenic_pinctrl *jzpc; 138e72394e2SPaul Cercueil struct gpio_chip gc; 139e72394e2SPaul Cercueil unsigned int irq, reg_base; 140e72394e2SPaul Cercueil }; 141e72394e2SPaul Cercueil 1428d2d607cSPaul Cercueil static const unsigned long enabled_socs = 1438d2d607cSPaul Cercueil IS_ENABLED(CONFIG_MACH_JZ4730) << ID_JZ4730 | 1448d2d607cSPaul Cercueil IS_ENABLED(CONFIG_MACH_JZ4740) << ID_JZ4740 | 1458d2d607cSPaul Cercueil IS_ENABLED(CONFIG_MACH_JZ4725B) << ID_JZ4725B | 1468d2d607cSPaul Cercueil IS_ENABLED(CONFIG_MACH_JZ4750) << ID_JZ4750 | 1478d2d607cSPaul Cercueil IS_ENABLED(CONFIG_MACH_JZ4755) << ID_JZ4755 | 1488d2d607cSPaul Cercueil IS_ENABLED(CONFIG_MACH_JZ4760) << ID_JZ4760 | 1498d2d607cSPaul Cercueil IS_ENABLED(CONFIG_MACH_JZ4770) << ID_JZ4770 | 1508d2d607cSPaul Cercueil IS_ENABLED(CONFIG_MACH_JZ4775) << ID_JZ4775 | 1518d2d607cSPaul Cercueil IS_ENABLED(CONFIG_MACH_JZ4780) << ID_JZ4780 | 1528d2d607cSPaul Cercueil IS_ENABLED(CONFIG_MACH_X1000) << ID_X1000 | 1538d2d607cSPaul Cercueil IS_ENABLED(CONFIG_MACH_X1500) << ID_X1500 | 1548d2d607cSPaul Cercueil IS_ENABLED(CONFIG_MACH_X1830) << ID_X1830 | 1558d2d607cSPaul Cercueil IS_ENABLED(CONFIG_MACH_X2000) << ID_X2000 | 1568d2d607cSPaul Cercueil IS_ENABLED(CONFIG_MACH_X2100) << ID_X2100; 1578d2d607cSPaul Cercueil 1588d2d607cSPaul Cercueil static bool 1598d2d607cSPaul Cercueil is_soc_or_above(const struct ingenic_pinctrl *jzpc, enum jz_version version) 1608d2d607cSPaul Cercueil { 1618d2d607cSPaul Cercueil return (enabled_socs >> version) && 1628d2d607cSPaul Cercueil (!(enabled_socs & GENMASK(version - 1, 0)) 1638d2d607cSPaul Cercueil || jzpc->info->version >= version); 1648d2d607cSPaul Cercueil } 1658d2d607cSPaul Cercueil 166424f3969S周琰杰 (Zhou Yanjie) static const u32 jz4730_pull_ups[4] = { 167424f3969S周琰杰 (Zhou Yanjie) 0x3fa3320f, 0xf200ffff, 0xffffffff, 0xffffffff, 168424f3969S周琰杰 (Zhou Yanjie) }; 169424f3969S周琰杰 (Zhou Yanjie) 170424f3969S周琰杰 (Zhou Yanjie) static const u32 jz4730_pull_downs[4] = { 171424f3969S周琰杰 (Zhou Yanjie) 0x00000df0, 0x0dff0000, 0x00000000, 0x00000000, 172424f3969S周琰杰 (Zhou Yanjie) }; 173424f3969S周琰杰 (Zhou Yanjie) 174424f3969S周琰杰 (Zhou Yanjie) static int jz4730_mmc_1bit_pins[] = { 0x27, 0x26, 0x22, }; 175424f3969S周琰杰 (Zhou Yanjie) static int jz4730_mmc_4bit_pins[] = { 0x23, 0x24, 0x25, }; 176424f3969S周琰杰 (Zhou Yanjie) static int jz4730_uart0_data_pins[] = { 0x7e, 0x7f, }; 177424f3969S周琰杰 (Zhou Yanjie) static int jz4730_uart1_data_pins[] = { 0x18, 0x19, }; 178424f3969S周琰杰 (Zhou Yanjie) static int jz4730_uart2_data_pins[] = { 0x6f, 0x7d, }; 179424f3969S周琰杰 (Zhou Yanjie) static int jz4730_uart3_data_pins[] = { 0x10, 0x15, }; 180424f3969S周琰杰 (Zhou Yanjie) static int jz4730_uart3_hwflow_pins[] = { 0x11, 0x17, }; 181424f3969S周琰杰 (Zhou Yanjie) static int jz4730_lcd_8bit_pins[] = { 182424f3969S周琰杰 (Zhou Yanjie) 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 183424f3969S周琰杰 (Zhou Yanjie) 0x3a, 0x39, 0x38, 184424f3969S周琰杰 (Zhou Yanjie) }; 185424f3969S周琰杰 (Zhou Yanjie) static int jz4730_lcd_16bit_pins[] = { 186424f3969S周琰杰 (Zhou Yanjie) 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 187424f3969S周琰杰 (Zhou Yanjie) }; 188424f3969S周琰杰 (Zhou Yanjie) static int jz4730_lcd_special_pins[] = { 0x3d, 0x3c, 0x3e, 0x3f, }; 189424f3969S周琰杰 (Zhou Yanjie) static int jz4730_lcd_generic_pins[] = { 0x3b, }; 190424f3969S周琰杰 (Zhou Yanjie) static int jz4730_nand_cs1_pins[] = { 0x53, }; 191424f3969S周琰杰 (Zhou Yanjie) static int jz4730_nand_cs2_pins[] = { 0x54, }; 192424f3969S周琰杰 (Zhou Yanjie) static int jz4730_nand_cs3_pins[] = { 0x55, }; 193424f3969S周琰杰 (Zhou Yanjie) static int jz4730_nand_cs4_pins[] = { 0x56, }; 194424f3969S周琰杰 (Zhou Yanjie) static int jz4730_nand_cs5_pins[] = { 0x57, }; 195424f3969S周琰杰 (Zhou Yanjie) static int jz4730_pwm_pwm0_pins[] = { 0x5e, }; 196424f3969S周琰杰 (Zhou Yanjie) static int jz4730_pwm_pwm1_pins[] = { 0x5f, }; 197424f3969S周琰杰 (Zhou Yanjie) 198424f3969S周琰杰 (Zhou Yanjie) static u8 jz4730_lcd_8bit_funcs[] = { 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, }; 199424f3969S周琰杰 (Zhou Yanjie) 200424f3969S周琰杰 (Zhou Yanjie) static const struct group_desc jz4730_groups[] = { 201424f3969S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("mmc-1bit", jz4730_mmc_1bit, 1), 202424f3969S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("mmc-4bit", jz4730_mmc_4bit, 1), 203424f3969S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("uart0-data", jz4730_uart0_data, 1), 204424f3969S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("uart1-data", jz4730_uart1_data, 1), 205424f3969S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("uart2-data", jz4730_uart2_data, 1), 206424f3969S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("uart3-data", jz4730_uart3_data, 1), 207424f3969S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("uart3-hwflow", jz4730_uart3_hwflow, 1), 208424f3969S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP_FUNCS("lcd-8bit", jz4730_lcd_8bit, jz4730_lcd_8bit_funcs), 209424f3969S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("lcd-16bit", jz4730_lcd_16bit, 1), 210424f3969S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("lcd-special", jz4730_lcd_special, 1), 211424f3969S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("lcd-generic", jz4730_lcd_generic, 1), 212424f3969S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("nand-cs1", jz4730_nand_cs1, 1), 213424f3969S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("nand-cs2", jz4730_nand_cs2, 1), 214424f3969S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("nand-cs3", jz4730_nand_cs3, 1), 215424f3969S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("nand-cs4", jz4730_nand_cs4, 1), 216424f3969S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("nand-cs5", jz4730_nand_cs5, 1), 217424f3969S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("pwm0", jz4730_pwm_pwm0, 1), 218424f3969S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("pwm1", jz4730_pwm_pwm1, 1), 219424f3969S周琰杰 (Zhou Yanjie) }; 220424f3969S周琰杰 (Zhou Yanjie) 221424f3969S周琰杰 (Zhou Yanjie) static const char *jz4730_mmc_groups[] = { "mmc-1bit", "mmc-4bit", }; 222424f3969S周琰杰 (Zhou Yanjie) static const char *jz4730_uart0_groups[] = { "uart0-data", }; 223424f3969S周琰杰 (Zhou Yanjie) static const char *jz4730_uart1_groups[] = { "uart1-data", }; 224424f3969S周琰杰 (Zhou Yanjie) static const char *jz4730_uart2_groups[] = { "uart2-data", }; 225424f3969S周琰杰 (Zhou Yanjie) static const char *jz4730_uart3_groups[] = { "uart3-data", "uart3-hwflow", }; 226424f3969S周琰杰 (Zhou Yanjie) static const char *jz4730_lcd_groups[] = { 227424f3969S周琰杰 (Zhou Yanjie) "lcd-8bit", "lcd-16bit", "lcd-special", "lcd-generic", 228424f3969S周琰杰 (Zhou Yanjie) }; 229424f3969S周琰杰 (Zhou Yanjie) static const char *jz4730_nand_groups[] = { 230424f3969S周琰杰 (Zhou Yanjie) "nand-cs1", "nand-cs2", "nand-cs3", "nand-cs4", "nand-cs5", 231424f3969S周琰杰 (Zhou Yanjie) }; 232424f3969S周琰杰 (Zhou Yanjie) static const char *jz4730_pwm0_groups[] = { "pwm0", }; 233424f3969S周琰杰 (Zhou Yanjie) static const char *jz4730_pwm1_groups[] = { "pwm1", }; 234424f3969S周琰杰 (Zhou Yanjie) 235424f3969S周琰杰 (Zhou Yanjie) static const struct function_desc jz4730_functions[] = { 236424f3969S周琰杰 (Zhou Yanjie) { "mmc", jz4730_mmc_groups, ARRAY_SIZE(jz4730_mmc_groups), }, 237424f3969S周琰杰 (Zhou Yanjie) { "uart0", jz4730_uart0_groups, ARRAY_SIZE(jz4730_uart0_groups), }, 238424f3969S周琰杰 (Zhou Yanjie) { "uart1", jz4730_uart1_groups, ARRAY_SIZE(jz4730_uart1_groups), }, 239424f3969S周琰杰 (Zhou Yanjie) { "uart2", jz4730_uart2_groups, ARRAY_SIZE(jz4730_uart2_groups), }, 240424f3969S周琰杰 (Zhou Yanjie) { "uart3", jz4730_uart3_groups, ARRAY_SIZE(jz4730_uart3_groups), }, 241424f3969S周琰杰 (Zhou Yanjie) { "lcd", jz4730_lcd_groups, ARRAY_SIZE(jz4730_lcd_groups), }, 242424f3969S周琰杰 (Zhou Yanjie) { "nand", jz4730_nand_groups, ARRAY_SIZE(jz4730_nand_groups), }, 243424f3969S周琰杰 (Zhou Yanjie) { "pwm0", jz4730_pwm0_groups, ARRAY_SIZE(jz4730_pwm0_groups), }, 244424f3969S周琰杰 (Zhou Yanjie) { "pwm1", jz4730_pwm1_groups, ARRAY_SIZE(jz4730_pwm1_groups), }, 245424f3969S周琰杰 (Zhou Yanjie) }; 246424f3969S周琰杰 (Zhou Yanjie) 247424f3969S周琰杰 (Zhou Yanjie) static const struct ingenic_chip_info jz4730_chip_info = { 248424f3969S周琰杰 (Zhou Yanjie) .num_chips = 4, 249424f3969S周琰杰 (Zhou Yanjie) .reg_offset = 0x30, 250424f3969S周琰杰 (Zhou Yanjie) .version = ID_JZ4730, 251424f3969S周琰杰 (Zhou Yanjie) .groups = jz4730_groups, 252424f3969S周琰杰 (Zhou Yanjie) .num_groups = ARRAY_SIZE(jz4730_groups), 253424f3969S周琰杰 (Zhou Yanjie) .functions = jz4730_functions, 254424f3969S周琰杰 (Zhou Yanjie) .num_functions = ARRAY_SIZE(jz4730_functions), 255424f3969S周琰杰 (Zhou Yanjie) .pull_ups = jz4730_pull_ups, 256424f3969S周琰杰 (Zhou Yanjie) .pull_downs = jz4730_pull_downs, 257424f3969S周琰杰 (Zhou Yanjie) }; 258424f3969S周琰杰 (Zhou Yanjie) 259b5c23aa4SPaul Cercueil static const u32 jz4740_pull_ups[4] = { 260b5c23aa4SPaul Cercueil 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 261b5c23aa4SPaul Cercueil }; 262b5c23aa4SPaul Cercueil 263b5c23aa4SPaul Cercueil static const u32 jz4740_pull_downs[4] = { 264b5c23aa4SPaul Cercueil 0x00000000, 0x00000000, 0x00000000, 0x00000000, 265b5c23aa4SPaul Cercueil }; 266b5c23aa4SPaul Cercueil 267b5c23aa4SPaul Cercueil static int jz4740_mmc_1bit_pins[] = { 0x69, 0x68, 0x6a, }; 268b5c23aa4SPaul Cercueil static int jz4740_mmc_4bit_pins[] = { 0x6b, 0x6c, 0x6d, }; 269b5c23aa4SPaul Cercueil static int jz4740_uart0_data_pins[] = { 0x7a, 0x79, }; 270b5c23aa4SPaul Cercueil static int jz4740_uart0_hwflow_pins[] = { 0x7e, 0x7f, }; 271b5c23aa4SPaul Cercueil static int jz4740_uart1_data_pins[] = { 0x7e, 0x7f, }; 272b5c23aa4SPaul Cercueil static int jz4740_lcd_8bit_pins[] = { 2735e6332a7S周琰杰 (Zhou Yanjie) 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 2745e6332a7S周琰杰 (Zhou Yanjie) 0x52, 0x53, 0x54, 275b5c23aa4SPaul Cercueil }; 276b5c23aa4SPaul Cercueil static int jz4740_lcd_16bit_pins[] = { 2775e6332a7S周琰杰 (Zhou Yanjie) 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 278b5c23aa4SPaul Cercueil }; 279b5c23aa4SPaul Cercueil static int jz4740_lcd_18bit_pins[] = { 0x50, 0x51, }; 2805e6332a7S周琰杰 (Zhou Yanjie) static int jz4740_lcd_special_pins[] = { 0x31, 0x32, 0x56, 0x57, }; 2815e6332a7S周琰杰 (Zhou Yanjie) static int jz4740_lcd_generic_pins[] = { 0x55, }; 282b5c23aa4SPaul Cercueil static int jz4740_nand_cs1_pins[] = { 0x39, }; 283b5c23aa4SPaul Cercueil static int jz4740_nand_cs2_pins[] = { 0x3a, }; 284b5c23aa4SPaul Cercueil static int jz4740_nand_cs3_pins[] = { 0x3b, }; 285b5c23aa4SPaul Cercueil static int jz4740_nand_cs4_pins[] = { 0x3c, }; 286bcad94d7SPaul Cercueil static int jz4740_nand_fre_fwe_pins[] = { 0x5c, 0x5d, }; 287b5c23aa4SPaul Cercueil static int jz4740_pwm_pwm0_pins[] = { 0x77, }; 288b5c23aa4SPaul Cercueil static int jz4740_pwm_pwm1_pins[] = { 0x78, }; 289b5c23aa4SPaul Cercueil static int jz4740_pwm_pwm2_pins[] = { 0x79, }; 290b5c23aa4SPaul Cercueil static int jz4740_pwm_pwm3_pins[] = { 0x7a, }; 291b5c23aa4SPaul Cercueil static int jz4740_pwm_pwm4_pins[] = { 0x7b, }; 292b5c23aa4SPaul Cercueil static int jz4740_pwm_pwm5_pins[] = { 0x7c, }; 293b5c23aa4SPaul Cercueil static int jz4740_pwm_pwm6_pins[] = { 0x7e, }; 294b5c23aa4SPaul Cercueil static int jz4740_pwm_pwm7_pins[] = { 0x7f, }; 295b5c23aa4SPaul Cercueil 296b5c23aa4SPaul Cercueil static const struct group_desc jz4740_groups[] = { 297bb42b593SPaul Cercueil INGENIC_PIN_GROUP("mmc-1bit", jz4740_mmc_1bit, 0), 298bb42b593SPaul Cercueil INGENIC_PIN_GROUP("mmc-4bit", jz4740_mmc_4bit, 0), 299bb42b593SPaul Cercueil INGENIC_PIN_GROUP("uart0-data", jz4740_uart0_data, 1), 300bb42b593SPaul Cercueil INGENIC_PIN_GROUP("uart0-hwflow", jz4740_uart0_hwflow, 1), 301bb42b593SPaul Cercueil INGENIC_PIN_GROUP("uart1-data", jz4740_uart1_data, 2), 302bb42b593SPaul Cercueil INGENIC_PIN_GROUP("lcd-8bit", jz4740_lcd_8bit, 0), 303bb42b593SPaul Cercueil INGENIC_PIN_GROUP("lcd-16bit", jz4740_lcd_16bit, 0), 304bb42b593SPaul Cercueil INGENIC_PIN_GROUP("lcd-18bit", jz4740_lcd_18bit, 0), 3055e6332a7S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("lcd-special", jz4740_lcd_special, 0), 3065e6332a7S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("lcd-generic", jz4740_lcd_generic, 0), 307bb42b593SPaul Cercueil INGENIC_PIN_GROUP("nand-cs1", jz4740_nand_cs1, 0), 308bb42b593SPaul Cercueil INGENIC_PIN_GROUP("nand-cs2", jz4740_nand_cs2, 0), 309bb42b593SPaul Cercueil INGENIC_PIN_GROUP("nand-cs3", jz4740_nand_cs3, 0), 310bb42b593SPaul Cercueil INGENIC_PIN_GROUP("nand-cs4", jz4740_nand_cs4, 0), 311bb42b593SPaul Cercueil INGENIC_PIN_GROUP("nand-fre-fwe", jz4740_nand_fre_fwe, 0), 312bb42b593SPaul Cercueil INGENIC_PIN_GROUP("pwm0", jz4740_pwm_pwm0, 0), 313bb42b593SPaul Cercueil INGENIC_PIN_GROUP("pwm1", jz4740_pwm_pwm1, 0), 314bb42b593SPaul Cercueil INGENIC_PIN_GROUP("pwm2", jz4740_pwm_pwm2, 0), 315bb42b593SPaul Cercueil INGENIC_PIN_GROUP("pwm3", jz4740_pwm_pwm3, 0), 316bb42b593SPaul Cercueil INGENIC_PIN_GROUP("pwm4", jz4740_pwm_pwm4, 0), 317bb42b593SPaul Cercueil INGENIC_PIN_GROUP("pwm5", jz4740_pwm_pwm5, 0), 318bb42b593SPaul Cercueil INGENIC_PIN_GROUP("pwm6", jz4740_pwm_pwm6, 0), 319bb42b593SPaul Cercueil INGENIC_PIN_GROUP("pwm7", jz4740_pwm_pwm7, 0), 320b5c23aa4SPaul Cercueil }; 321b5c23aa4SPaul Cercueil 322b5c23aa4SPaul Cercueil static const char *jz4740_mmc_groups[] = { "mmc-1bit", "mmc-4bit", }; 323b5c23aa4SPaul Cercueil static const char *jz4740_uart0_groups[] = { "uart0-data", "uart0-hwflow", }; 324b5c23aa4SPaul Cercueil static const char *jz4740_uart1_groups[] = { "uart1-data", }; 325b5c23aa4SPaul Cercueil static const char *jz4740_lcd_groups[] = { 3265e6332a7S周琰杰 (Zhou Yanjie) "lcd-8bit", "lcd-16bit", "lcd-18bit", "lcd-special", "lcd-generic", 327b5c23aa4SPaul Cercueil }; 328b5c23aa4SPaul Cercueil static const char *jz4740_nand_groups[] = { 329bcad94d7SPaul Cercueil "nand-cs1", "nand-cs2", "nand-cs3", "nand-cs4", "nand-fre-fwe", 330b5c23aa4SPaul Cercueil }; 331b5c23aa4SPaul Cercueil static const char *jz4740_pwm0_groups[] = { "pwm0", }; 332b5c23aa4SPaul Cercueil static const char *jz4740_pwm1_groups[] = { "pwm1", }; 333b5c23aa4SPaul Cercueil static const char *jz4740_pwm2_groups[] = { "pwm2", }; 334b5c23aa4SPaul Cercueil static const char *jz4740_pwm3_groups[] = { "pwm3", }; 335b5c23aa4SPaul Cercueil static const char *jz4740_pwm4_groups[] = { "pwm4", }; 336b5c23aa4SPaul Cercueil static const char *jz4740_pwm5_groups[] = { "pwm5", }; 337b5c23aa4SPaul Cercueil static const char *jz4740_pwm6_groups[] = { "pwm6", }; 338b5c23aa4SPaul Cercueil static const char *jz4740_pwm7_groups[] = { "pwm7", }; 339b5c23aa4SPaul Cercueil 340b5c23aa4SPaul Cercueil static const struct function_desc jz4740_functions[] = { 341b5c23aa4SPaul Cercueil { "mmc", jz4740_mmc_groups, ARRAY_SIZE(jz4740_mmc_groups), }, 342b5c23aa4SPaul Cercueil { "uart0", jz4740_uart0_groups, ARRAY_SIZE(jz4740_uart0_groups), }, 343b5c23aa4SPaul Cercueil { "uart1", jz4740_uart1_groups, ARRAY_SIZE(jz4740_uart1_groups), }, 344b5c23aa4SPaul Cercueil { "lcd", jz4740_lcd_groups, ARRAY_SIZE(jz4740_lcd_groups), }, 345b5c23aa4SPaul Cercueil { "nand", jz4740_nand_groups, ARRAY_SIZE(jz4740_nand_groups), }, 346b5c23aa4SPaul Cercueil { "pwm0", jz4740_pwm0_groups, ARRAY_SIZE(jz4740_pwm0_groups), }, 347b5c23aa4SPaul Cercueil { "pwm1", jz4740_pwm1_groups, ARRAY_SIZE(jz4740_pwm1_groups), }, 348b5c23aa4SPaul Cercueil { "pwm2", jz4740_pwm2_groups, ARRAY_SIZE(jz4740_pwm2_groups), }, 349b5c23aa4SPaul Cercueil { "pwm3", jz4740_pwm3_groups, ARRAY_SIZE(jz4740_pwm3_groups), }, 350b5c23aa4SPaul Cercueil { "pwm4", jz4740_pwm4_groups, ARRAY_SIZE(jz4740_pwm4_groups), }, 351b5c23aa4SPaul Cercueil { "pwm5", jz4740_pwm5_groups, ARRAY_SIZE(jz4740_pwm5_groups), }, 352b5c23aa4SPaul Cercueil { "pwm6", jz4740_pwm6_groups, ARRAY_SIZE(jz4740_pwm6_groups), }, 353b5c23aa4SPaul Cercueil { "pwm7", jz4740_pwm7_groups, ARRAY_SIZE(jz4740_pwm7_groups), }, 354b5c23aa4SPaul Cercueil }; 355b5c23aa4SPaul Cercueil 356b5c23aa4SPaul Cercueil static const struct ingenic_chip_info jz4740_chip_info = { 357b5c23aa4SPaul Cercueil .num_chips = 4, 358f742e5ebS周琰杰 (Zhou Yanjie) .reg_offset = 0x100, 359baf15647SPaul Cercueil .version = ID_JZ4740, 360b5c23aa4SPaul Cercueil .groups = jz4740_groups, 361b5c23aa4SPaul Cercueil .num_groups = ARRAY_SIZE(jz4740_groups), 362b5c23aa4SPaul Cercueil .functions = jz4740_functions, 363b5c23aa4SPaul Cercueil .num_functions = ARRAY_SIZE(jz4740_functions), 364b5c23aa4SPaul Cercueil .pull_ups = jz4740_pull_ups, 365b5c23aa4SPaul Cercueil .pull_downs = jz4740_pull_downs, 366b5c23aa4SPaul Cercueil }; 367b5c23aa4SPaul Cercueil 368f2a96765SPaul Cercueil static int jz4725b_mmc0_1bit_pins[] = { 0x48, 0x49, 0x5c, }; 369f2a96765SPaul Cercueil static int jz4725b_mmc0_4bit_pins[] = { 0x5d, 0x5b, 0x56, }; 370f2a96765SPaul Cercueil static int jz4725b_mmc1_1bit_pins[] = { 0x7a, 0x7b, 0x7c, }; 371f2a96765SPaul Cercueil static int jz4725b_mmc1_4bit_pins[] = { 0x7d, 0x7e, 0x7f, }; 372f2a96765SPaul Cercueil static int jz4725b_uart_data_pins[] = { 0x4c, 0x4d, }; 3735e6332a7S周琰杰 (Zhou Yanjie) static int jz4725b_lcd_8bit_pins[] = { 3745e6332a7S周琰杰 (Zhou Yanjie) 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 3755e6332a7S周琰杰 (Zhou Yanjie) 0x72, 0x73, 0x74, 3765e6332a7S周琰杰 (Zhou Yanjie) }; 3775e6332a7S周琰杰 (Zhou Yanjie) static int jz4725b_lcd_16bit_pins[] = { 3785e6332a7S周琰杰 (Zhou Yanjie) 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 3795e6332a7S周琰杰 (Zhou Yanjie) }; 3805e6332a7S周琰杰 (Zhou Yanjie) static int jz4725b_lcd_18bit_pins[] = { 0x70, 0x71, }; 3815e6332a7S周琰杰 (Zhou Yanjie) static int jz4725b_lcd_24bit_pins[] = { 0x76, 0x77, 0x78, 0x79, }; 3825e6332a7S周琰杰 (Zhou Yanjie) static int jz4725b_lcd_special_pins[] = { 0x76, 0x77, 0x78, 0x79, }; 3835e6332a7S周琰杰 (Zhou Yanjie) static int jz4725b_lcd_generic_pins[] = { 0x75, }; 384f2a96765SPaul Cercueil static int jz4725b_nand_cs1_pins[] = { 0x55, }; 385f2a96765SPaul Cercueil static int jz4725b_nand_cs2_pins[] = { 0x56, }; 386f2a96765SPaul Cercueil static int jz4725b_nand_cs3_pins[] = { 0x57, }; 387f2a96765SPaul Cercueil static int jz4725b_nand_cs4_pins[] = { 0x58, }; 388f2a96765SPaul Cercueil static int jz4725b_nand_cle_ale_pins[] = { 0x48, 0x49 }; 389f2a96765SPaul Cercueil static int jz4725b_nand_fre_fwe_pins[] = { 0x5c, 0x5d }; 390f2a96765SPaul Cercueil static int jz4725b_pwm_pwm0_pins[] = { 0x4a, }; 391f2a96765SPaul Cercueil static int jz4725b_pwm_pwm1_pins[] = { 0x4b, }; 392f2a96765SPaul Cercueil static int jz4725b_pwm_pwm2_pins[] = { 0x4c, }; 393f2a96765SPaul Cercueil static int jz4725b_pwm_pwm3_pins[] = { 0x4d, }; 394f2a96765SPaul Cercueil static int jz4725b_pwm_pwm4_pins[] = { 0x4e, }; 395f2a96765SPaul Cercueil static int jz4725b_pwm_pwm5_pins[] = { 0x4f, }; 396f2a96765SPaul Cercueil 397bb42b593SPaul Cercueil static u8 jz4725b_mmc0_4bit_funcs[] = { 1, 0, 1, }; 398f2a96765SPaul Cercueil 399f2a96765SPaul Cercueil static const struct group_desc jz4725b_groups[] = { 400bb42b593SPaul Cercueil INGENIC_PIN_GROUP("mmc0-1bit", jz4725b_mmc0_1bit, 1), 401bb42b593SPaul Cercueil INGENIC_PIN_GROUP_FUNCS("mmc0-4bit", jz4725b_mmc0_4bit, 402bb42b593SPaul Cercueil jz4725b_mmc0_4bit_funcs), 403bb42b593SPaul Cercueil INGENIC_PIN_GROUP("mmc1-1bit", jz4725b_mmc1_1bit, 0), 404bb42b593SPaul Cercueil INGENIC_PIN_GROUP("mmc1-4bit", jz4725b_mmc1_4bit, 0), 405bb42b593SPaul Cercueil INGENIC_PIN_GROUP("uart-data", jz4725b_uart_data, 1), 4065e6332a7S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("lcd-8bit", jz4725b_lcd_8bit, 0), 4075e6332a7S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("lcd-16bit", jz4725b_lcd_16bit, 0), 4085e6332a7S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("lcd-18bit", jz4725b_lcd_18bit, 0), 4095e6332a7S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("lcd-24bit", jz4725b_lcd_24bit, 1), 4105e6332a7S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("lcd-special", jz4725b_lcd_special, 0), 4115e6332a7S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("lcd-generic", jz4725b_lcd_generic, 0), 412bb42b593SPaul Cercueil INGENIC_PIN_GROUP("nand-cs1", jz4725b_nand_cs1, 0), 413bb42b593SPaul Cercueil INGENIC_PIN_GROUP("nand-cs2", jz4725b_nand_cs2, 0), 414bb42b593SPaul Cercueil INGENIC_PIN_GROUP("nand-cs3", jz4725b_nand_cs3, 0), 415bb42b593SPaul Cercueil INGENIC_PIN_GROUP("nand-cs4", jz4725b_nand_cs4, 0), 416bb42b593SPaul Cercueil INGENIC_PIN_GROUP("nand-cle-ale", jz4725b_nand_cle_ale, 0), 417bb42b593SPaul Cercueil INGENIC_PIN_GROUP("nand-fre-fwe", jz4725b_nand_fre_fwe, 0), 418bb42b593SPaul Cercueil INGENIC_PIN_GROUP("pwm0", jz4725b_pwm_pwm0, 0), 419bb42b593SPaul Cercueil INGENIC_PIN_GROUP("pwm1", jz4725b_pwm_pwm1, 0), 420bb42b593SPaul Cercueil INGENIC_PIN_GROUP("pwm2", jz4725b_pwm_pwm2, 0), 421bb42b593SPaul Cercueil INGENIC_PIN_GROUP("pwm3", jz4725b_pwm_pwm3, 0), 422bb42b593SPaul Cercueil INGENIC_PIN_GROUP("pwm4", jz4725b_pwm_pwm4, 0), 423bb42b593SPaul Cercueil INGENIC_PIN_GROUP("pwm5", jz4725b_pwm_pwm5, 0), 424f2a96765SPaul Cercueil }; 425f2a96765SPaul Cercueil 426f2a96765SPaul Cercueil static const char *jz4725b_mmc0_groups[] = { "mmc0-1bit", "mmc0-4bit", }; 427f2a96765SPaul Cercueil static const char *jz4725b_mmc1_groups[] = { "mmc1-1bit", "mmc1-4bit", }; 428f2a96765SPaul Cercueil static const char *jz4725b_uart_groups[] = { "uart-data", }; 4295e6332a7S周琰杰 (Zhou Yanjie) static const char *jz4725b_lcd_groups[] = { 4305e6332a7S周琰杰 (Zhou Yanjie) "lcd-8bit", "lcd-16bit", "lcd-18bit", "lcd-24bit", 4315e6332a7S周琰杰 (Zhou Yanjie) "lcd-special", "lcd-generic", 4325e6332a7S周琰杰 (Zhou Yanjie) }; 433f2a96765SPaul Cercueil static const char *jz4725b_nand_groups[] = { 434f2a96765SPaul Cercueil "nand-cs1", "nand-cs2", "nand-cs3", "nand-cs4", 435f2a96765SPaul Cercueil "nand-cle-ale", "nand-fre-fwe", 436f2a96765SPaul Cercueil }; 437f2a96765SPaul Cercueil static const char *jz4725b_pwm0_groups[] = { "pwm0", }; 438f2a96765SPaul Cercueil static const char *jz4725b_pwm1_groups[] = { "pwm1", }; 439f2a96765SPaul Cercueil static const char *jz4725b_pwm2_groups[] = { "pwm2", }; 440f2a96765SPaul Cercueil static const char *jz4725b_pwm3_groups[] = { "pwm3", }; 441f2a96765SPaul Cercueil static const char *jz4725b_pwm4_groups[] = { "pwm4", }; 442f2a96765SPaul Cercueil static const char *jz4725b_pwm5_groups[] = { "pwm5", }; 443f2a96765SPaul Cercueil 444f2a96765SPaul Cercueil static const struct function_desc jz4725b_functions[] = { 445f2a96765SPaul Cercueil { "mmc0", jz4725b_mmc0_groups, ARRAY_SIZE(jz4725b_mmc0_groups), }, 446f2a96765SPaul Cercueil { "mmc1", jz4725b_mmc1_groups, ARRAY_SIZE(jz4725b_mmc1_groups), }, 447f2a96765SPaul Cercueil { "uart", jz4725b_uart_groups, ARRAY_SIZE(jz4725b_uart_groups), }, 448f2a96765SPaul Cercueil { "nand", jz4725b_nand_groups, ARRAY_SIZE(jz4725b_nand_groups), }, 449f2a96765SPaul Cercueil { "pwm0", jz4725b_pwm0_groups, ARRAY_SIZE(jz4725b_pwm0_groups), }, 450f2a96765SPaul Cercueil { "pwm1", jz4725b_pwm1_groups, ARRAY_SIZE(jz4725b_pwm1_groups), }, 451f2a96765SPaul Cercueil { "pwm2", jz4725b_pwm2_groups, ARRAY_SIZE(jz4725b_pwm2_groups), }, 452f2a96765SPaul Cercueil { "pwm3", jz4725b_pwm3_groups, ARRAY_SIZE(jz4725b_pwm3_groups), }, 453f2a96765SPaul Cercueil { "pwm4", jz4725b_pwm4_groups, ARRAY_SIZE(jz4725b_pwm4_groups), }, 454f2a96765SPaul Cercueil { "pwm5", jz4725b_pwm5_groups, ARRAY_SIZE(jz4725b_pwm5_groups), }, 455a3240f09SPaul Cercueil { "lcd", jz4725b_lcd_groups, ARRAY_SIZE(jz4725b_lcd_groups), }, 456f2a96765SPaul Cercueil }; 457f2a96765SPaul Cercueil 458f2a96765SPaul Cercueil static const struct ingenic_chip_info jz4725b_chip_info = { 459f2a96765SPaul Cercueil .num_chips = 4, 460f742e5ebS周琰杰 (Zhou Yanjie) .reg_offset = 0x100, 461baf15647SPaul Cercueil .version = ID_JZ4725B, 462f2a96765SPaul Cercueil .groups = jz4725b_groups, 463f2a96765SPaul Cercueil .num_groups = ARRAY_SIZE(jz4725b_groups), 464f2a96765SPaul Cercueil .functions = jz4725b_functions, 465f2a96765SPaul Cercueil .num_functions = ARRAY_SIZE(jz4725b_functions), 466f2a96765SPaul Cercueil .pull_ups = jz4740_pull_ups, 467f2a96765SPaul Cercueil .pull_downs = jz4740_pull_downs, 468f2a96765SPaul Cercueil }; 469f2a96765SPaul Cercueil 470215c81a3S周琰杰 (Zhou Yanjie) static const u32 jz4750_pull_ups[6] = { 471215c81a3S周琰杰 (Zhou Yanjie) 0xffffffff, 0xffffffff, 0x3fffffff, 0x7fffffff, 0x1fff3fff, 0x00ffffff, 472215c81a3S周琰杰 (Zhou Yanjie) }; 473215c81a3S周琰杰 (Zhou Yanjie) 474215c81a3S周琰杰 (Zhou Yanjie) static const u32 jz4750_pull_downs[6] = { 475215c81a3S周琰杰 (Zhou Yanjie) 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 476215c81a3S周琰杰 (Zhou Yanjie) }; 477215c81a3S周琰杰 (Zhou Yanjie) 478215c81a3S周琰杰 (Zhou Yanjie) static int jz4750_uart0_data_pins[] = { 0xa4, 0xa5, }; 479215c81a3S周琰杰 (Zhou Yanjie) static int jz4750_uart0_hwflow_pins[] = { 0xa6, 0xa7, }; 480215c81a3S周琰杰 (Zhou Yanjie) static int jz4750_uart1_data_pins[] = { 0x90, 0x91, }; 481215c81a3S周琰杰 (Zhou Yanjie) static int jz4750_uart1_hwflow_pins[] = { 0x92, 0x93, }; 482215c81a3S周琰杰 (Zhou Yanjie) static int jz4750_uart2_data_pins[] = { 0x9b, 0x9a, }; 483215c81a3S周琰杰 (Zhou Yanjie) static int jz4750_uart3_data_pins[] = { 0xb0, 0xb1, }; 484215c81a3S周琰杰 (Zhou Yanjie) static int jz4750_uart3_hwflow_pins[] = { 0xb2, 0xb3, }; 485215c81a3S周琰杰 (Zhou Yanjie) static int jz4750_mmc0_1bit_pins[] = { 0xa8, 0xa9, 0xa0, }; 486215c81a3S周琰杰 (Zhou Yanjie) static int jz4750_mmc0_4bit_pins[] = { 0xa1, 0xa2, 0xa3, }; 487215c81a3S周琰杰 (Zhou Yanjie) static int jz4750_mmc0_8bit_pins[] = { 0xa4, 0xa5, 0xa6, 0xa7, }; 488215c81a3S周琰杰 (Zhou Yanjie) static int jz4750_mmc1_1bit_pins[] = { 0xae, 0xaf, 0xaa, }; 489215c81a3S周琰杰 (Zhou Yanjie) static int jz4750_mmc1_4bit_pins[] = { 0xab, 0xac, 0xad, }; 490215c81a3S周琰杰 (Zhou Yanjie) static int jz4750_i2c_pins[] = { 0x8c, 0x8d, }; 491215c81a3S周琰杰 (Zhou Yanjie) static int jz4750_cim_pins[] = { 492215c81a3S周琰杰 (Zhou Yanjie) 0x89, 0x8b, 0x8a, 0x88, 493215c81a3S周琰杰 (Zhou Yanjie) 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 494215c81a3S周琰杰 (Zhou Yanjie) }; 495215c81a3S周琰杰 (Zhou Yanjie) static int jz4750_lcd_8bit_pins[] = { 496215c81a3S周琰杰 (Zhou Yanjie) 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 497215c81a3S周琰杰 (Zhou Yanjie) 0x72, 0x73, 0x74, 498215c81a3S周琰杰 (Zhou Yanjie) }; 499215c81a3S周琰杰 (Zhou Yanjie) static int jz4750_lcd_16bit_pins[] = { 500215c81a3S周琰杰 (Zhou Yanjie) 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 501215c81a3S周琰杰 (Zhou Yanjie) }; 502215c81a3S周琰杰 (Zhou Yanjie) static int jz4750_lcd_18bit_pins[] = { 0x70, 0x71, }; 503215c81a3S周琰杰 (Zhou Yanjie) static int jz4750_lcd_24bit_pins[] = { 0x76, 0x77, 0x78, 0x79, 0xb2, 0xb3, }; 504215c81a3S周琰杰 (Zhou Yanjie) static int jz4750_lcd_special_pins[] = { 0x76, 0x77, 0x78, 0x79, }; 505215c81a3S周琰杰 (Zhou Yanjie) static int jz4750_lcd_generic_pins[] = { 0x75, }; 506215c81a3S周琰杰 (Zhou Yanjie) static int jz4750_nand_cs1_pins[] = { 0x55, }; 507215c81a3S周琰杰 (Zhou Yanjie) static int jz4750_nand_cs2_pins[] = { 0x56, }; 508215c81a3S周琰杰 (Zhou Yanjie) static int jz4750_nand_cs3_pins[] = { 0x57, }; 509215c81a3S周琰杰 (Zhou Yanjie) static int jz4750_nand_cs4_pins[] = { 0x58, }; 510215c81a3S周琰杰 (Zhou Yanjie) static int jz4750_nand_fre_fwe_pins[] = { 0x5c, 0x5d, }; 511215c81a3S周琰杰 (Zhou Yanjie) static int jz4750_pwm_pwm0_pins[] = { 0x94, }; 512215c81a3S周琰杰 (Zhou Yanjie) static int jz4750_pwm_pwm1_pins[] = { 0x95, }; 513215c81a3S周琰杰 (Zhou Yanjie) static int jz4750_pwm_pwm2_pins[] = { 0x96, }; 514215c81a3S周琰杰 (Zhou Yanjie) static int jz4750_pwm_pwm3_pins[] = { 0x97, }; 515215c81a3S周琰杰 (Zhou Yanjie) static int jz4750_pwm_pwm4_pins[] = { 0x98, }; 516215c81a3S周琰杰 (Zhou Yanjie) static int jz4750_pwm_pwm5_pins[] = { 0x99, }; 517215c81a3S周琰杰 (Zhou Yanjie) 518215c81a3S周琰杰 (Zhou Yanjie) static const struct group_desc jz4750_groups[] = { 519215c81a3S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("uart0-data", jz4750_uart0_data, 1), 520215c81a3S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("uart0-hwflow", jz4750_uart0_hwflow, 1), 521215c81a3S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("uart1-data", jz4750_uart1_data, 0), 522215c81a3S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("uart1-hwflow", jz4750_uart1_hwflow, 0), 523215c81a3S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("uart2-data", jz4750_uart2_data, 1), 524215c81a3S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("uart3-data", jz4750_uart3_data, 0), 525215c81a3S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("uart3-hwflow", jz4750_uart3_hwflow, 0), 526215c81a3S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("mmc0-1bit", jz4750_mmc0_1bit, 0), 527215c81a3S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("mmc0-4bit", jz4750_mmc0_4bit, 0), 528215c81a3S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("mmc0-8bit", jz4750_mmc0_8bit, 0), 529215c81a3S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("mmc1-1bit", jz4750_mmc1_1bit, 0), 530215c81a3S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("mmc1-4bit", jz4750_mmc1_4bit, 0), 531215c81a3S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("i2c-data", jz4750_i2c, 0), 532215c81a3S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("cim-data", jz4750_cim, 0), 533215c81a3S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("lcd-8bit", jz4750_lcd_8bit, 0), 534215c81a3S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("lcd-16bit", jz4750_lcd_16bit, 0), 535215c81a3S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("lcd-18bit", jz4750_lcd_18bit, 0), 536215c81a3S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("lcd-24bit", jz4750_lcd_24bit, 1), 537215c81a3S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("lcd-special", jz4750_lcd_special, 0), 538215c81a3S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("lcd-generic", jz4750_lcd_generic, 0), 539215c81a3S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("nand-cs1", jz4750_nand_cs1, 0), 540215c81a3S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("nand-cs2", jz4750_nand_cs2, 0), 541215c81a3S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("nand-cs3", jz4750_nand_cs3, 0), 542215c81a3S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("nand-cs4", jz4750_nand_cs4, 0), 543215c81a3S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("nand-fre-fwe", jz4750_nand_fre_fwe, 0), 544215c81a3S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("pwm0", jz4750_pwm_pwm0, 0), 545215c81a3S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("pwm1", jz4750_pwm_pwm1, 0), 546215c81a3S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("pwm2", jz4750_pwm_pwm2, 0), 547215c81a3S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("pwm3", jz4750_pwm_pwm3, 0), 548215c81a3S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("pwm4", jz4750_pwm_pwm4, 0), 549215c81a3S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("pwm5", jz4750_pwm_pwm5, 0), 550215c81a3S周琰杰 (Zhou Yanjie) }; 551215c81a3S周琰杰 (Zhou Yanjie) 552215c81a3S周琰杰 (Zhou Yanjie) static const char *jz4750_uart0_groups[] = { "uart0-data", "uart0-hwflow", }; 553215c81a3S周琰杰 (Zhou Yanjie) static const char *jz4750_uart1_groups[] = { "uart1-data", "uart1-hwflow", }; 554215c81a3S周琰杰 (Zhou Yanjie) static const char *jz4750_uart2_groups[] = { "uart2-data", }; 555215c81a3S周琰杰 (Zhou Yanjie) static const char *jz4750_uart3_groups[] = { "uart3-data", "uart3-hwflow", }; 556215c81a3S周琰杰 (Zhou Yanjie) static const char *jz4750_mmc0_groups[] = { 557215c81a3S周琰杰 (Zhou Yanjie) "mmc0-1bit", "mmc0-4bit", "mmc0-8bit", 558215c81a3S周琰杰 (Zhou Yanjie) }; 559215c81a3S周琰杰 (Zhou Yanjie) static const char *jz4750_mmc1_groups[] = { "mmc0-1bit", "mmc0-4bit", }; 560215c81a3S周琰杰 (Zhou Yanjie) static const char *jz4750_i2c_groups[] = { "i2c-data", }; 561215c81a3S周琰杰 (Zhou Yanjie) static const char *jz4750_cim_groups[] = { "cim-data", }; 562215c81a3S周琰杰 (Zhou Yanjie) static const char *jz4750_lcd_groups[] = { 563215c81a3S周琰杰 (Zhou Yanjie) "lcd-8bit", "lcd-16bit", "lcd-18bit", "lcd-24bit", 564215c81a3S周琰杰 (Zhou Yanjie) "lcd-special", "lcd-generic", 565215c81a3S周琰杰 (Zhou Yanjie) }; 566215c81a3S周琰杰 (Zhou Yanjie) static const char *jz4750_nand_groups[] = { 567215c81a3S周琰杰 (Zhou Yanjie) "nand-cs1", "nand-cs2", "nand-cs3", "nand-cs4", "nand-fre-fwe", 568215c81a3S周琰杰 (Zhou Yanjie) }; 569215c81a3S周琰杰 (Zhou Yanjie) static const char *jz4750_pwm0_groups[] = { "pwm0", }; 570215c81a3S周琰杰 (Zhou Yanjie) static const char *jz4750_pwm1_groups[] = { "pwm1", }; 571215c81a3S周琰杰 (Zhou Yanjie) static const char *jz4750_pwm2_groups[] = { "pwm2", }; 572215c81a3S周琰杰 (Zhou Yanjie) static const char *jz4750_pwm3_groups[] = { "pwm3", }; 573215c81a3S周琰杰 (Zhou Yanjie) static const char *jz4750_pwm4_groups[] = { "pwm4", }; 574215c81a3S周琰杰 (Zhou Yanjie) static const char *jz4750_pwm5_groups[] = { "pwm5", }; 575215c81a3S周琰杰 (Zhou Yanjie) 576215c81a3S周琰杰 (Zhou Yanjie) static const struct function_desc jz4750_functions[] = { 577215c81a3S周琰杰 (Zhou Yanjie) { "uart0", jz4750_uart0_groups, ARRAY_SIZE(jz4750_uart0_groups), }, 578215c81a3S周琰杰 (Zhou Yanjie) { "uart1", jz4750_uart1_groups, ARRAY_SIZE(jz4750_uart1_groups), }, 579215c81a3S周琰杰 (Zhou Yanjie) { "uart2", jz4750_uart2_groups, ARRAY_SIZE(jz4750_uart2_groups), }, 580215c81a3S周琰杰 (Zhou Yanjie) { "uart3", jz4750_uart3_groups, ARRAY_SIZE(jz4750_uart3_groups), }, 581215c81a3S周琰杰 (Zhou Yanjie) { "mmc0", jz4750_mmc0_groups, ARRAY_SIZE(jz4750_mmc0_groups), }, 582215c81a3S周琰杰 (Zhou Yanjie) { "mmc1", jz4750_mmc1_groups, ARRAY_SIZE(jz4750_mmc1_groups), }, 583215c81a3S周琰杰 (Zhou Yanjie) { "i2c", jz4750_i2c_groups, ARRAY_SIZE(jz4750_i2c_groups), }, 584215c81a3S周琰杰 (Zhou Yanjie) { "cim", jz4750_cim_groups, ARRAY_SIZE(jz4750_cim_groups), }, 585215c81a3S周琰杰 (Zhou Yanjie) { "lcd", jz4750_lcd_groups, ARRAY_SIZE(jz4750_lcd_groups), }, 586215c81a3S周琰杰 (Zhou Yanjie) { "nand", jz4750_nand_groups, ARRAY_SIZE(jz4750_nand_groups), }, 587215c81a3S周琰杰 (Zhou Yanjie) { "pwm0", jz4750_pwm0_groups, ARRAY_SIZE(jz4750_pwm0_groups), }, 588215c81a3S周琰杰 (Zhou Yanjie) { "pwm1", jz4750_pwm1_groups, ARRAY_SIZE(jz4750_pwm1_groups), }, 589215c81a3S周琰杰 (Zhou Yanjie) { "pwm2", jz4750_pwm2_groups, ARRAY_SIZE(jz4750_pwm2_groups), }, 590215c81a3S周琰杰 (Zhou Yanjie) { "pwm3", jz4750_pwm3_groups, ARRAY_SIZE(jz4750_pwm3_groups), }, 591215c81a3S周琰杰 (Zhou Yanjie) { "pwm4", jz4750_pwm4_groups, ARRAY_SIZE(jz4750_pwm4_groups), }, 592215c81a3S周琰杰 (Zhou Yanjie) { "pwm5", jz4750_pwm5_groups, ARRAY_SIZE(jz4750_pwm5_groups), }, 593215c81a3S周琰杰 (Zhou Yanjie) }; 594215c81a3S周琰杰 (Zhou Yanjie) 595215c81a3S周琰杰 (Zhou Yanjie) static const struct ingenic_chip_info jz4750_chip_info = { 596215c81a3S周琰杰 (Zhou Yanjie) .num_chips = 6, 597215c81a3S周琰杰 (Zhou Yanjie) .reg_offset = 0x100, 598215c81a3S周琰杰 (Zhou Yanjie) .version = ID_JZ4750, 599215c81a3S周琰杰 (Zhou Yanjie) .groups = jz4750_groups, 600215c81a3S周琰杰 (Zhou Yanjie) .num_groups = ARRAY_SIZE(jz4750_groups), 601215c81a3S周琰杰 (Zhou Yanjie) .functions = jz4750_functions, 602215c81a3S周琰杰 (Zhou Yanjie) .num_functions = ARRAY_SIZE(jz4750_functions), 603215c81a3S周琰杰 (Zhou Yanjie) .pull_ups = jz4750_pull_ups, 604215c81a3S周琰杰 (Zhou Yanjie) .pull_downs = jz4750_pull_downs, 605215c81a3S周琰杰 (Zhou Yanjie) }; 606215c81a3S周琰杰 (Zhou Yanjie) 607b582b5a4S周琰杰 (Zhou Yanjie) static const u32 jz4755_pull_ups[6] = { 608b582b5a4S周琰杰 (Zhou Yanjie) 0xffffffff, 0xffffffff, 0x0fffffff, 0xffffffff, 0x33dc3fff, 0x0000fc00, 609b582b5a4S周琰杰 (Zhou Yanjie) }; 610b582b5a4S周琰杰 (Zhou Yanjie) 611b582b5a4S周琰杰 (Zhou Yanjie) static const u32 jz4755_pull_downs[6] = { 612b582b5a4S周琰杰 (Zhou Yanjie) 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 613b582b5a4S周琰杰 (Zhou Yanjie) }; 614b582b5a4S周琰杰 (Zhou Yanjie) 615b582b5a4S周琰杰 (Zhou Yanjie) static int jz4755_uart0_data_pins[] = { 0x7c, 0x7d, }; 616b582b5a4S周琰杰 (Zhou Yanjie) static int jz4755_uart0_hwflow_pins[] = { 0x7e, 0x7f, }; 617b582b5a4S周琰杰 (Zhou Yanjie) static int jz4755_uart1_data_pins[] = { 0x97, 0x99, }; 618b582b5a4S周琰杰 (Zhou Yanjie) static int jz4755_uart2_data_pins[] = { 0x9f, }; 619b638e0f1S周琰杰 (Zhou Yanjie) static int jz4755_ssi_dt_b_pins[] = { 0x3b, }; 620b638e0f1S周琰杰 (Zhou Yanjie) static int jz4755_ssi_dt_f_pins[] = { 0xa1, }; 621b638e0f1S周琰杰 (Zhou Yanjie) static int jz4755_ssi_dr_b_pins[] = { 0x3c, }; 622b638e0f1S周琰杰 (Zhou Yanjie) static int jz4755_ssi_dr_f_pins[] = { 0xa2, }; 623b638e0f1S周琰杰 (Zhou Yanjie) static int jz4755_ssi_clk_b_pins[] = { 0x3a, }; 624b638e0f1S周琰杰 (Zhou Yanjie) static int jz4755_ssi_clk_f_pins[] = { 0xa0, }; 625b638e0f1S周琰杰 (Zhou Yanjie) static int jz4755_ssi_gpc_b_pins[] = { 0x3e, }; 626b638e0f1S周琰杰 (Zhou Yanjie) static int jz4755_ssi_gpc_f_pins[] = { 0xa4, }; 627b638e0f1S周琰杰 (Zhou Yanjie) static int jz4755_ssi_ce0_b_pins[] = { 0x3d, }; 628b638e0f1S周琰杰 (Zhou Yanjie) static int jz4755_ssi_ce0_f_pins[] = { 0xa3, }; 629b638e0f1S周琰杰 (Zhou Yanjie) static int jz4755_ssi_ce1_b_pins[] = { 0x3f, }; 630b638e0f1S周琰杰 (Zhou Yanjie) static int jz4755_ssi_ce1_f_pins[] = { 0xa5, }; 631b582b5a4S周琰杰 (Zhou Yanjie) static int jz4755_mmc0_1bit_pins[] = { 0x2f, 0x50, 0x5c, }; 632b582b5a4S周琰杰 (Zhou Yanjie) static int jz4755_mmc0_4bit_pins[] = { 0x5d, 0x5b, 0x51, }; 633b582b5a4S周琰杰 (Zhou Yanjie) static int jz4755_mmc1_1bit_pins[] = { 0x3a, 0x3d, 0x3c, }; 634b582b5a4S周琰杰 (Zhou Yanjie) static int jz4755_mmc1_4bit_pins[] = { 0x3b, 0x3e, 0x3f, }; 635b582b5a4S周琰杰 (Zhou Yanjie) static int jz4755_i2c_pins[] = { 0x8c, 0x8d, }; 636b582b5a4S周琰杰 (Zhou Yanjie) static int jz4755_cim_pins[] = { 637b582b5a4S周琰杰 (Zhou Yanjie) 0x89, 0x8b, 0x8a, 0x88, 638b582b5a4S周琰杰 (Zhou Yanjie) 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 639b582b5a4S周琰杰 (Zhou Yanjie) }; 640b582b5a4S周琰杰 (Zhou Yanjie) static int jz4755_lcd_8bit_pins[] = { 641b582b5a4S周琰杰 (Zhou Yanjie) 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 642b582b5a4S周琰杰 (Zhou Yanjie) 0x72, 0x73, 0x74, 643b582b5a4S周琰杰 (Zhou Yanjie) }; 644b582b5a4S周琰杰 (Zhou Yanjie) static int jz4755_lcd_16bit_pins[] = { 645b582b5a4S周琰杰 (Zhou Yanjie) 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 646b582b5a4S周琰杰 (Zhou Yanjie) }; 647b582b5a4S周琰杰 (Zhou Yanjie) static int jz4755_lcd_18bit_pins[] = { 0x70, 0x71, }; 648b582b5a4S周琰杰 (Zhou Yanjie) static int jz4755_lcd_24bit_pins[] = { 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, }; 649b582b5a4S周琰杰 (Zhou Yanjie) static int jz4755_lcd_special_pins[] = { 0x76, 0x77, 0x78, 0x79, }; 650b582b5a4S周琰杰 (Zhou Yanjie) static int jz4755_lcd_generic_pins[] = { 0x75, }; 651b582b5a4S周琰杰 (Zhou Yanjie) static int jz4755_nand_cs1_pins[] = { 0x55, }; 652b582b5a4S周琰杰 (Zhou Yanjie) static int jz4755_nand_cs2_pins[] = { 0x56, }; 653b582b5a4S周琰杰 (Zhou Yanjie) static int jz4755_nand_cs3_pins[] = { 0x57, }; 654b582b5a4S周琰杰 (Zhou Yanjie) static int jz4755_nand_cs4_pins[] = { 0x58, }; 655b582b5a4S周琰杰 (Zhou Yanjie) static int jz4755_nand_fre_fwe_pins[] = { 0x5c, 0x5d, }; 656b582b5a4S周琰杰 (Zhou Yanjie) static int jz4755_pwm_pwm0_pins[] = { 0x94, }; 657b582b5a4S周琰杰 (Zhou Yanjie) static int jz4755_pwm_pwm1_pins[] = { 0xab, }; 658b582b5a4S周琰杰 (Zhou Yanjie) static int jz4755_pwm_pwm2_pins[] = { 0x96, }; 659b582b5a4S周琰杰 (Zhou Yanjie) static int jz4755_pwm_pwm3_pins[] = { 0x97, }; 660b582b5a4S周琰杰 (Zhou Yanjie) static int jz4755_pwm_pwm4_pins[] = { 0x98, }; 661b582b5a4S周琰杰 (Zhou Yanjie) static int jz4755_pwm_pwm5_pins[] = { 0x99, }; 662b582b5a4S周琰杰 (Zhou Yanjie) 663b582b5a4S周琰杰 (Zhou Yanjie) static u8 jz4755_mmc0_1bit_funcs[] = { 2, 2, 1, }; 664b582b5a4S周琰杰 (Zhou Yanjie) static u8 jz4755_mmc0_4bit_funcs[] = { 1, 0, 1, }; 665b582b5a4S周琰杰 (Zhou Yanjie) static u8 jz4755_lcd_24bit_funcs[] = { 1, 1, 1, 1, 0, 0, }; 666b582b5a4S周琰杰 (Zhou Yanjie) 667b582b5a4S周琰杰 (Zhou Yanjie) static const struct group_desc jz4755_groups[] = { 668b582b5a4S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("uart0-data", jz4755_uart0_data, 0), 669b582b5a4S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("uart0-hwflow", jz4755_uart0_hwflow, 0), 670b582b5a4S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("uart1-data", jz4755_uart1_data, 0), 671b582b5a4S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("uart2-data", jz4755_uart2_data, 1), 672b638e0f1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi-dt-b", jz4755_ssi_dt_b, 0), 673b638e0f1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi-dt-f", jz4755_ssi_dt_f, 0), 674b638e0f1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi-dr-b", jz4755_ssi_dr_b, 0), 675b638e0f1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi-dr-f", jz4755_ssi_dr_f, 0), 676b638e0f1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi-clk-b", jz4755_ssi_clk_b, 0), 677b638e0f1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi-clk-f", jz4755_ssi_clk_f, 0), 678b638e0f1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi-gpc-b", jz4755_ssi_gpc_b, 0), 679b638e0f1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi-gpc-f", jz4755_ssi_gpc_f, 0), 680b638e0f1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi-ce0-b", jz4755_ssi_ce0_b, 0), 681b638e0f1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi-ce0-f", jz4755_ssi_ce0_f, 0), 682b638e0f1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi-ce1-b", jz4755_ssi_ce1_b, 0), 683b638e0f1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi-ce1-f", jz4755_ssi_ce1_f, 0), 684b582b5a4S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP_FUNCS("mmc0-1bit", jz4755_mmc0_1bit, 685b582b5a4S周琰杰 (Zhou Yanjie) jz4755_mmc0_1bit_funcs), 686b582b5a4S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP_FUNCS("mmc0-4bit", jz4755_mmc0_4bit, 687b582b5a4S周琰杰 (Zhou Yanjie) jz4755_mmc0_4bit_funcs), 688b582b5a4S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("mmc1-1bit", jz4755_mmc1_1bit, 1), 689b582b5a4S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("mmc1-4bit", jz4755_mmc1_4bit, 1), 690b582b5a4S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("i2c-data", jz4755_i2c, 0), 691b582b5a4S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("cim-data", jz4755_cim, 0), 692b582b5a4S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("lcd-8bit", jz4755_lcd_8bit, 0), 693b582b5a4S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("lcd-16bit", jz4755_lcd_16bit, 0), 694b582b5a4S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("lcd-18bit", jz4755_lcd_18bit, 0), 695b582b5a4S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP_FUNCS("lcd-24bit", jz4755_lcd_24bit, 696b582b5a4S周琰杰 (Zhou Yanjie) jz4755_lcd_24bit_funcs), 697b582b5a4S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("lcd-special", jz4755_lcd_special, 0), 698b582b5a4S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("lcd-generic", jz4755_lcd_generic, 0), 699b582b5a4S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("nand-cs1", jz4755_nand_cs1, 0), 700b582b5a4S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("nand-cs2", jz4755_nand_cs2, 0), 701b582b5a4S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("nand-cs3", jz4755_nand_cs3, 0), 702b582b5a4S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("nand-cs4", jz4755_nand_cs4, 0), 703b582b5a4S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("nand-fre-fwe", jz4755_nand_fre_fwe, 0), 704b582b5a4S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("pwm0", jz4755_pwm_pwm0, 0), 705b582b5a4S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("pwm1", jz4755_pwm_pwm1, 1), 706b582b5a4S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("pwm2", jz4755_pwm_pwm2, 0), 707b582b5a4S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("pwm3", jz4755_pwm_pwm3, 0), 708b582b5a4S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("pwm4", jz4755_pwm_pwm4, 0), 709b582b5a4S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("pwm5", jz4755_pwm_pwm5, 0), 710b582b5a4S周琰杰 (Zhou Yanjie) }; 711b582b5a4S周琰杰 (Zhou Yanjie) 712b582b5a4S周琰杰 (Zhou Yanjie) static const char *jz4755_uart0_groups[] = { "uart0-data", "uart0-hwflow", }; 713b582b5a4S周琰杰 (Zhou Yanjie) static const char *jz4755_uart1_groups[] = { "uart1-data", }; 714b582b5a4S周琰杰 (Zhou Yanjie) static const char *jz4755_uart2_groups[] = { "uart2-data", }; 715b638e0f1S周琰杰 (Zhou Yanjie) static const char *jz4755_ssi_groups[] = { 716b638e0f1S周琰杰 (Zhou Yanjie) "ssi-dt-b", "ssi-dt-f", 717b638e0f1S周琰杰 (Zhou Yanjie) "ssi-dr-b", "ssi-dr-f", 718b638e0f1S周琰杰 (Zhou Yanjie) "ssi-clk-b", "ssi-clk-f", 719b638e0f1S周琰杰 (Zhou Yanjie) "ssi-gpc-b", "ssi-gpc-f", 720b638e0f1S周琰杰 (Zhou Yanjie) "ssi-ce0-b", "ssi-ce0-f", 721b638e0f1S周琰杰 (Zhou Yanjie) "ssi-ce1-b", "ssi-ce1-f", 722b638e0f1S周琰杰 (Zhou Yanjie) }; 723b582b5a4S周琰杰 (Zhou Yanjie) static const char *jz4755_mmc0_groups[] = { "mmc0-1bit", "mmc0-4bit", }; 724b582b5a4S周琰杰 (Zhou Yanjie) static const char *jz4755_mmc1_groups[] = { "mmc0-1bit", "mmc0-4bit", }; 725b582b5a4S周琰杰 (Zhou Yanjie) static const char *jz4755_i2c_groups[] = { "i2c-data", }; 726b582b5a4S周琰杰 (Zhou Yanjie) static const char *jz4755_cim_groups[] = { "cim-data", }; 727b582b5a4S周琰杰 (Zhou Yanjie) static const char *jz4755_lcd_groups[] = { 728b582b5a4S周琰杰 (Zhou Yanjie) "lcd-8bit", "lcd-16bit", "lcd-18bit", "lcd-24bit", 729b582b5a4S周琰杰 (Zhou Yanjie) "lcd-special", "lcd-generic", 730b582b5a4S周琰杰 (Zhou Yanjie) }; 731b582b5a4S周琰杰 (Zhou Yanjie) static const char *jz4755_nand_groups[] = { 732b582b5a4S周琰杰 (Zhou Yanjie) "nand-cs1", "nand-cs2", "nand-cs3", "nand-cs4", "nand-fre-fwe", 733b582b5a4S周琰杰 (Zhou Yanjie) }; 734b582b5a4S周琰杰 (Zhou Yanjie) static const char *jz4755_pwm0_groups[] = { "pwm0", }; 735b582b5a4S周琰杰 (Zhou Yanjie) static const char *jz4755_pwm1_groups[] = { "pwm1", }; 736b582b5a4S周琰杰 (Zhou Yanjie) static const char *jz4755_pwm2_groups[] = { "pwm2", }; 737b582b5a4S周琰杰 (Zhou Yanjie) static const char *jz4755_pwm3_groups[] = { "pwm3", }; 738b582b5a4S周琰杰 (Zhou Yanjie) static const char *jz4755_pwm4_groups[] = { "pwm4", }; 739b582b5a4S周琰杰 (Zhou Yanjie) static const char *jz4755_pwm5_groups[] = { "pwm5", }; 740b582b5a4S周琰杰 (Zhou Yanjie) 741b582b5a4S周琰杰 (Zhou Yanjie) static const struct function_desc jz4755_functions[] = { 742b582b5a4S周琰杰 (Zhou Yanjie) { "uart0", jz4755_uart0_groups, ARRAY_SIZE(jz4755_uart0_groups), }, 743b582b5a4S周琰杰 (Zhou Yanjie) { "uart1", jz4755_uart1_groups, ARRAY_SIZE(jz4755_uart1_groups), }, 744b582b5a4S周琰杰 (Zhou Yanjie) { "uart2", jz4755_uart2_groups, ARRAY_SIZE(jz4755_uart2_groups), }, 745b638e0f1S周琰杰 (Zhou Yanjie) { "ssi", jz4755_ssi_groups, ARRAY_SIZE(jz4755_ssi_groups), }, 746b582b5a4S周琰杰 (Zhou Yanjie) { "mmc0", jz4755_mmc0_groups, ARRAY_SIZE(jz4755_mmc0_groups), }, 747b582b5a4S周琰杰 (Zhou Yanjie) { "mmc1", jz4755_mmc1_groups, ARRAY_SIZE(jz4755_mmc1_groups), }, 748b582b5a4S周琰杰 (Zhou Yanjie) { "i2c", jz4755_i2c_groups, ARRAY_SIZE(jz4755_i2c_groups), }, 749b582b5a4S周琰杰 (Zhou Yanjie) { "cim", jz4755_cim_groups, ARRAY_SIZE(jz4755_cim_groups), }, 750b582b5a4S周琰杰 (Zhou Yanjie) { "lcd", jz4755_lcd_groups, ARRAY_SIZE(jz4755_lcd_groups), }, 751b582b5a4S周琰杰 (Zhou Yanjie) { "nand", jz4755_nand_groups, ARRAY_SIZE(jz4755_nand_groups), }, 752b582b5a4S周琰杰 (Zhou Yanjie) { "pwm0", jz4755_pwm0_groups, ARRAY_SIZE(jz4755_pwm0_groups), }, 753b582b5a4S周琰杰 (Zhou Yanjie) { "pwm1", jz4755_pwm1_groups, ARRAY_SIZE(jz4755_pwm1_groups), }, 754b582b5a4S周琰杰 (Zhou Yanjie) { "pwm2", jz4755_pwm2_groups, ARRAY_SIZE(jz4755_pwm2_groups), }, 755b582b5a4S周琰杰 (Zhou Yanjie) { "pwm3", jz4755_pwm3_groups, ARRAY_SIZE(jz4755_pwm3_groups), }, 756b582b5a4S周琰杰 (Zhou Yanjie) { "pwm4", jz4755_pwm4_groups, ARRAY_SIZE(jz4755_pwm4_groups), }, 757b582b5a4S周琰杰 (Zhou Yanjie) { "pwm5", jz4755_pwm5_groups, ARRAY_SIZE(jz4755_pwm5_groups), }, 758b582b5a4S周琰杰 (Zhou Yanjie) }; 759b582b5a4S周琰杰 (Zhou Yanjie) 760b582b5a4S周琰杰 (Zhou Yanjie) static const struct ingenic_chip_info jz4755_chip_info = { 761b582b5a4S周琰杰 (Zhou Yanjie) .num_chips = 6, 762b582b5a4S周琰杰 (Zhou Yanjie) .reg_offset = 0x100, 763b582b5a4S周琰杰 (Zhou Yanjie) .version = ID_JZ4755, 764b582b5a4S周琰杰 (Zhou Yanjie) .groups = jz4755_groups, 765b582b5a4S周琰杰 (Zhou Yanjie) .num_groups = ARRAY_SIZE(jz4755_groups), 766b582b5a4S周琰杰 (Zhou Yanjie) .functions = jz4755_functions, 767b582b5a4S周琰杰 (Zhou Yanjie) .num_functions = ARRAY_SIZE(jz4755_functions), 768b582b5a4S周琰杰 (Zhou Yanjie) .pull_ups = jz4755_pull_ups, 769b582b5a4S周琰杰 (Zhou Yanjie) .pull_downs = jz4755_pull_downs, 770b582b5a4S周琰杰 (Zhou Yanjie) }; 771b582b5a4S周琰杰 (Zhou Yanjie) 7720257595aSZhou Yanjie static const u32 jz4760_pull_ups[6] = { 773d5e93140SPaul Cercueil 0xffffffff, 0xfffcf3ff, 0xffffffff, 0xffffcfff, 0xfffffb7c, 0x0000000f, 7740257595aSZhou Yanjie }; 7750257595aSZhou Yanjie 7760257595aSZhou Yanjie static const u32 jz4760_pull_downs[6] = { 7770257595aSZhou Yanjie 0x00000000, 0x00030c00, 0x00000000, 0x00003000, 0x00000483, 0x00000ff0, 7780257595aSZhou Yanjie }; 7790257595aSZhou Yanjie 7800257595aSZhou Yanjie static int jz4760_uart0_data_pins[] = { 0xa0, 0xa3, }; 7810257595aSZhou Yanjie static int jz4760_uart0_hwflow_pins[] = { 0xa1, 0xa2, }; 7820257595aSZhou Yanjie static int jz4760_uart1_data_pins[] = { 0x7a, 0x7c, }; 7830257595aSZhou Yanjie static int jz4760_uart1_hwflow_pins[] = { 0x7b, 0x7d, }; 7840257595aSZhou Yanjie static int jz4760_uart2_data_pins[] = { 0x5c, 0x5e, }; 7850257595aSZhou Yanjie static int jz4760_uart2_hwflow_pins[] = { 0x5d, 0x5f, }; 7860257595aSZhou Yanjie static int jz4760_uart3_data_pins[] = { 0x6c, 0x85, }; 7870257595aSZhou Yanjie static int jz4760_uart3_hwflow_pins[] = { 0x88, 0x89, }; 788b638e0f1S周琰杰 (Zhou Yanjie) static int jz4760_ssi0_dt_a_pins[] = { 0x15, }; 789b638e0f1S周琰杰 (Zhou Yanjie) static int jz4760_ssi0_dt_b_pins[] = { 0x35, }; 790b638e0f1S周琰杰 (Zhou Yanjie) static int jz4760_ssi0_dt_d_pins[] = { 0x75, }; 791b638e0f1S周琰杰 (Zhou Yanjie) static int jz4760_ssi0_dt_e_pins[] = { 0x91, }; 792b638e0f1S周琰杰 (Zhou Yanjie) static int jz4760_ssi0_dr_a_pins[] = { 0x14, }; 793b638e0f1S周琰杰 (Zhou Yanjie) static int jz4760_ssi0_dr_b_pins[] = { 0x34, }; 794b638e0f1S周琰杰 (Zhou Yanjie) static int jz4760_ssi0_dr_d_pins[] = { 0x74, }; 795b638e0f1S周琰杰 (Zhou Yanjie) static int jz4760_ssi0_dr_e_pins[] = { 0x8e, }; 796b638e0f1S周琰杰 (Zhou Yanjie) static int jz4760_ssi0_clk_a_pins[] = { 0x12, }; 797b638e0f1S周琰杰 (Zhou Yanjie) static int jz4760_ssi0_clk_b_pins[] = { 0x3c, }; 798b638e0f1S周琰杰 (Zhou Yanjie) static int jz4760_ssi0_clk_d_pins[] = { 0x78, }; 799b638e0f1S周琰杰 (Zhou Yanjie) static int jz4760_ssi0_clk_e_pins[] = { 0x8f, }; 800b638e0f1S周琰杰 (Zhou Yanjie) static int jz4760_ssi0_gpc_b_pins[] = { 0x3e, }; 801b638e0f1S周琰杰 (Zhou Yanjie) static int jz4760_ssi0_gpc_d_pins[] = { 0x76, }; 802b638e0f1S周琰杰 (Zhou Yanjie) static int jz4760_ssi0_gpc_e_pins[] = { 0x93, }; 803b638e0f1S周琰杰 (Zhou Yanjie) static int jz4760_ssi0_ce0_a_pins[] = { 0x13, }; 804b638e0f1S周琰杰 (Zhou Yanjie) static int jz4760_ssi0_ce0_b_pins[] = { 0x3d, }; 805b638e0f1S周琰杰 (Zhou Yanjie) static int jz4760_ssi0_ce0_d_pins[] = { 0x79, }; 806b638e0f1S周琰杰 (Zhou Yanjie) static int jz4760_ssi0_ce0_e_pins[] = { 0x90, }; 807b638e0f1S周琰杰 (Zhou Yanjie) static int jz4760_ssi0_ce1_b_pins[] = { 0x3f, }; 808b638e0f1S周琰杰 (Zhou Yanjie) static int jz4760_ssi0_ce1_d_pins[] = { 0x77, }; 809b638e0f1S周琰杰 (Zhou Yanjie) static int jz4760_ssi0_ce1_e_pins[] = { 0x92, }; 810b638e0f1S周琰杰 (Zhou Yanjie) static int jz4760_ssi1_dt_b_9_pins[] = { 0x29, }; 811b638e0f1S周琰杰 (Zhou Yanjie) static int jz4760_ssi1_dt_b_21_pins[] = { 0x35, }; 812b638e0f1S周琰杰 (Zhou Yanjie) static int jz4760_ssi1_dt_d_12_pins[] = { 0x6c, }; 813b638e0f1S周琰杰 (Zhou Yanjie) static int jz4760_ssi1_dt_d_21_pins[] = { 0x75, }; 814b638e0f1S周琰杰 (Zhou Yanjie) static int jz4760_ssi1_dt_e_pins[] = { 0x91, }; 815b638e0f1S周琰杰 (Zhou Yanjie) static int jz4760_ssi1_dt_f_pins[] = { 0xa3, }; 816b638e0f1S周琰杰 (Zhou Yanjie) static int jz4760_ssi1_dr_b_6_pins[] = { 0x26, }; 817b638e0f1S周琰杰 (Zhou Yanjie) static int jz4760_ssi1_dr_b_20_pins[] = { 0x34, }; 818b638e0f1S周琰杰 (Zhou Yanjie) static int jz4760_ssi1_dr_d_13_pins[] = { 0x6d, }; 819b638e0f1S周琰杰 (Zhou Yanjie) static int jz4760_ssi1_dr_d_20_pins[] = { 0x74, }; 820b638e0f1S周琰杰 (Zhou Yanjie) static int jz4760_ssi1_dr_e_pins[] = { 0x8e, }; 821b638e0f1S周琰杰 (Zhou Yanjie) static int jz4760_ssi1_dr_f_pins[] = { 0xa0, }; 822b638e0f1S周琰杰 (Zhou Yanjie) static int jz4760_ssi1_clk_b_7_pins[] = { 0x27, }; 823b638e0f1S周琰杰 (Zhou Yanjie) static int jz4760_ssi1_clk_b_28_pins[] = { 0x3c, }; 824b638e0f1S周琰杰 (Zhou Yanjie) static int jz4760_ssi1_clk_d_pins[] = { 0x78, }; 825b638e0f1S周琰杰 (Zhou Yanjie) static int jz4760_ssi1_clk_e_7_pins[] = { 0x87, }; 826b638e0f1S周琰杰 (Zhou Yanjie) static int jz4760_ssi1_clk_e_15_pins[] = { 0x8f, }; 827b638e0f1S周琰杰 (Zhou Yanjie) static int jz4760_ssi1_clk_f_pins[] = { 0xa2, }; 828b638e0f1S周琰杰 (Zhou Yanjie) static int jz4760_ssi1_gpc_b_pins[] = { 0x3e, }; 829b638e0f1S周琰杰 (Zhou Yanjie) static int jz4760_ssi1_gpc_d_pins[] = { 0x76, }; 830b638e0f1S周琰杰 (Zhou Yanjie) static int jz4760_ssi1_gpc_e_pins[] = { 0x93, }; 831b638e0f1S周琰杰 (Zhou Yanjie) static int jz4760_ssi1_ce0_b_8_pins[] = { 0x28, }; 832b638e0f1S周琰杰 (Zhou Yanjie) static int jz4760_ssi1_ce0_b_29_pins[] = { 0x3d, }; 833b638e0f1S周琰杰 (Zhou Yanjie) static int jz4760_ssi1_ce0_d_pins[] = { 0x79, }; 834b638e0f1S周琰杰 (Zhou Yanjie) static int jz4760_ssi1_ce0_e_6_pins[] = { 0x86, }; 835b638e0f1S周琰杰 (Zhou Yanjie) static int jz4760_ssi1_ce0_e_16_pins[] = { 0x90, }; 836b638e0f1S周琰杰 (Zhou Yanjie) static int jz4760_ssi1_ce0_f_pins[] = { 0xa1, }; 837b638e0f1S周琰杰 (Zhou Yanjie) static int jz4760_ssi1_ce1_b_pins[] = { 0x3f, }; 838b638e0f1S周琰杰 (Zhou Yanjie) static int jz4760_ssi1_ce1_d_pins[] = { 0x77, }; 839b638e0f1S周琰杰 (Zhou Yanjie) static int jz4760_ssi1_ce1_e_pins[] = { 0x92, }; 8400257595aSZhou Yanjie static int jz4760_mmc0_1bit_a_pins[] = { 0x12, 0x13, 0x14, }; 8410257595aSZhou Yanjie static int jz4760_mmc0_4bit_a_pins[] = { 0x15, 0x16, 0x17, }; 8420257595aSZhou Yanjie static int jz4760_mmc0_1bit_e_pins[] = { 0x9c, 0x9d, 0x94, }; 8430257595aSZhou Yanjie static int jz4760_mmc0_4bit_e_pins[] = { 0x95, 0x96, 0x97, }; 8440257595aSZhou Yanjie static int jz4760_mmc0_8bit_e_pins[] = { 0x98, 0x99, 0x9a, 0x9b, }; 8450257595aSZhou Yanjie static int jz4760_mmc1_1bit_d_pins[] = { 0x78, 0x79, 0x74, }; 8460257595aSZhou Yanjie static int jz4760_mmc1_4bit_d_pins[] = { 0x75, 0x76, 0x77, }; 8470257595aSZhou Yanjie static int jz4760_mmc1_1bit_e_pins[] = { 0x9c, 0x9d, 0x94, }; 8480257595aSZhou Yanjie static int jz4760_mmc1_4bit_e_pins[] = { 0x95, 0x96, 0x97, }; 8490257595aSZhou Yanjie static int jz4760_mmc1_8bit_e_pins[] = { 0x98, 0x99, 0x9a, 0x9b, }; 8500257595aSZhou Yanjie static int jz4760_mmc2_1bit_b_pins[] = { 0x3c, 0x3d, 0x34, }; 8510257595aSZhou Yanjie static int jz4760_mmc2_4bit_b_pins[] = { 0x35, 0x3e, 0x3f, }; 8520257595aSZhou Yanjie static int jz4760_mmc2_1bit_e_pins[] = { 0x9c, 0x9d, 0x94, }; 8530257595aSZhou Yanjie static int jz4760_mmc2_4bit_e_pins[] = { 0x95, 0x96, 0x97, }; 8540257595aSZhou Yanjie static int jz4760_mmc2_8bit_e_pins[] = { 0x98, 0x99, 0x9a, 0x9b, }; 8550257595aSZhou Yanjie static int jz4760_nemc_8bit_data_pins[] = { 8560257595aSZhou Yanjie 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 8570257595aSZhou Yanjie }; 8580257595aSZhou Yanjie static int jz4760_nemc_16bit_data_pins[] = { 8590257595aSZhou Yanjie 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 8600257595aSZhou Yanjie }; 8610257595aSZhou Yanjie static int jz4760_nemc_cle_ale_pins[] = { 0x20, 0x21, }; 8620257595aSZhou Yanjie static int jz4760_nemc_addr_pins[] = { 0x22, 0x23, 0x24, 0x25, }; 8630257595aSZhou Yanjie static int jz4760_nemc_rd_we_pins[] = { 0x10, 0x11, }; 8640257595aSZhou Yanjie static int jz4760_nemc_frd_fwe_pins[] = { 0x12, 0x13, }; 8650257595aSZhou Yanjie static int jz4760_nemc_wait_pins[] = { 0x1b, }; 8660257595aSZhou Yanjie static int jz4760_nemc_cs1_pins[] = { 0x15, }; 8670257595aSZhou Yanjie static int jz4760_nemc_cs2_pins[] = { 0x16, }; 8680257595aSZhou Yanjie static int jz4760_nemc_cs3_pins[] = { 0x17, }; 8690257595aSZhou Yanjie static int jz4760_nemc_cs4_pins[] = { 0x18, }; 8700257595aSZhou Yanjie static int jz4760_nemc_cs5_pins[] = { 0x19, }; 8710257595aSZhou Yanjie static int jz4760_nemc_cs6_pins[] = { 0x1a, }; 8720257595aSZhou Yanjie static int jz4760_i2c0_pins[] = { 0x7e, 0x7f, }; 8730257595aSZhou Yanjie static int jz4760_i2c1_pins[] = { 0x9e, 0x9f, }; 8740257595aSZhou Yanjie static int jz4760_cim_pins[] = { 8750257595aSZhou Yanjie 0x26, 0x27, 0x28, 0x29, 8760257595aSZhou Yanjie 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 8770257595aSZhou Yanjie }; 878dd1ccfd6SPaul Cercueil static int jz4760_lcd_8bit_pins[] = { 879dd1ccfd6SPaul Cercueil 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x4c, 880dd1ccfd6SPaul Cercueil 0x4d, 0x52, 0x53, 8810257595aSZhou Yanjie }; 882dd1ccfd6SPaul Cercueil static int jz4760_lcd_16bit_pins[] = { 883dd1ccfd6SPaul Cercueil 0x4e, 0x4f, 0x50, 0x51, 0x56, 0x57, 0x58, 0x59, 884dd1ccfd6SPaul Cercueil }; 885dd1ccfd6SPaul Cercueil static int jz4760_lcd_18bit_pins[] = { 886dd1ccfd6SPaul Cercueil 0x5a, 0x5b, 887dd1ccfd6SPaul Cercueil }; 888dd1ccfd6SPaul Cercueil static int jz4760_lcd_24bit_pins[] = { 889dd1ccfd6SPaul Cercueil 0x40, 0x41, 0x4a, 0x4b, 0x54, 0x55, 890dd1ccfd6SPaul Cercueil }; 8915e6332a7S周琰杰 (Zhou Yanjie) static int jz4760_lcd_special_pins[] = { 0x54, 0x4a, 0x41, 0x40, }; 892dd1ccfd6SPaul Cercueil static int jz4760_lcd_generic_pins[] = { 0x49, }; 8930257595aSZhou Yanjie static int jz4760_pwm_pwm0_pins[] = { 0x80, }; 8940257595aSZhou Yanjie static int jz4760_pwm_pwm1_pins[] = { 0x81, }; 8950257595aSZhou Yanjie static int jz4760_pwm_pwm2_pins[] = { 0x82, }; 8960257595aSZhou Yanjie static int jz4760_pwm_pwm3_pins[] = { 0x83, }; 8970257595aSZhou Yanjie static int jz4760_pwm_pwm4_pins[] = { 0x84, }; 8980257595aSZhou Yanjie static int jz4760_pwm_pwm5_pins[] = { 0x85, }; 8990257595aSZhou Yanjie static int jz4760_pwm_pwm6_pins[] = { 0x6a, }; 9000257595aSZhou Yanjie static int jz4760_pwm_pwm7_pins[] = { 0x6b, }; 901dd1ccfd6SPaul Cercueil static int jz4760_otg_pins[] = { 0x8a, }; 9020257595aSZhou Yanjie 903bb42b593SPaul Cercueil static u8 jz4760_uart3_data_funcs[] = { 0, 1, }; 904bb42b593SPaul Cercueil static u8 jz4760_mmc0_1bit_a_funcs[] = { 1, 1, 0, }; 9050257595aSZhou Yanjie 9060257595aSZhou Yanjie static const struct group_desc jz4760_groups[] = { 907bb42b593SPaul Cercueil INGENIC_PIN_GROUP("uart0-data", jz4760_uart0_data, 0), 908bb42b593SPaul Cercueil INGENIC_PIN_GROUP("uart0-hwflow", jz4760_uart0_hwflow, 0), 909bb42b593SPaul Cercueil INGENIC_PIN_GROUP("uart1-data", jz4760_uart1_data, 0), 910bb42b593SPaul Cercueil INGENIC_PIN_GROUP("uart1-hwflow", jz4760_uart1_hwflow, 0), 911bb42b593SPaul Cercueil INGENIC_PIN_GROUP("uart2-data", jz4760_uart2_data, 0), 912bb42b593SPaul Cercueil INGENIC_PIN_GROUP("uart2-hwflow", jz4760_uart2_hwflow, 0), 913bb42b593SPaul Cercueil INGENIC_PIN_GROUP_FUNCS("uart3-data", jz4760_uart3_data, 914bb42b593SPaul Cercueil jz4760_uart3_data_funcs), 915bb42b593SPaul Cercueil INGENIC_PIN_GROUP("uart3-hwflow", jz4760_uart3_hwflow, 0), 916b638e0f1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi0-dt-a", jz4760_ssi0_dt_a, 2), 917b638e0f1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi0-dt-b", jz4760_ssi0_dt_b, 1), 918b638e0f1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi0-dt-d", jz4760_ssi0_dt_d, 1), 919b638e0f1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi0-dt-e", jz4760_ssi0_dt_e, 0), 920b638e0f1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi0-dr-a", jz4760_ssi0_dr_a, 1), 921b638e0f1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi0-dr-b", jz4760_ssi0_dr_b, 1), 922b638e0f1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi0-dr-d", jz4760_ssi0_dr_d, 1), 923b638e0f1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi0-dr-e", jz4760_ssi0_dr_e, 0), 924b638e0f1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi0-clk-a", jz4760_ssi0_clk_a, 2), 925b638e0f1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi0-clk-b", jz4760_ssi0_clk_b, 1), 926b638e0f1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi0-clk-d", jz4760_ssi0_clk_d, 1), 927b638e0f1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi0-clk-e", jz4760_ssi0_clk_e, 0), 928b638e0f1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi0-gpc-b", jz4760_ssi0_gpc_b, 1), 929b638e0f1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi0-gpc-d", jz4760_ssi0_gpc_d, 1), 930b638e0f1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi0-gpc-e", jz4760_ssi0_gpc_e, 0), 931b638e0f1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi0-ce0-a", jz4760_ssi0_ce0_a, 2), 932b638e0f1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi0-ce0-b", jz4760_ssi0_ce0_b, 1), 933b638e0f1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi0-ce0-d", jz4760_ssi0_ce0_d, 1), 934b638e0f1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi0-ce0-e", jz4760_ssi0_ce0_e, 0), 935b638e0f1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi0-ce1-b", jz4760_ssi0_ce1_b, 1), 936b638e0f1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi0-ce1-d", jz4760_ssi0_ce1_d, 1), 937b638e0f1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi0-ce1-e", jz4760_ssi0_ce1_e, 0), 938b638e0f1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi1-dt-b-9", jz4760_ssi1_dt_b_9, 2), 939b638e0f1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi1-dt-b-21", jz4760_ssi1_dt_b_21, 2), 940b638e0f1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi1-dt-d-12", jz4760_ssi1_dt_d_12, 2), 941b638e0f1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi1-dt-d-21", jz4760_ssi1_dt_d_21, 2), 942b638e0f1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi1-dt-e", jz4760_ssi1_dt_e, 1), 943b638e0f1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi1-dt-f", jz4760_ssi1_dt_f, 2), 944b638e0f1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi1-dr-b-6", jz4760_ssi1_dr_b_6, 2), 945b638e0f1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi1-dr-b-20", jz4760_ssi1_dr_b_20, 2), 946b638e0f1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi1-dr-d-13", jz4760_ssi1_dr_d_13, 2), 947b638e0f1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi1-dr-d-20", jz4760_ssi1_dr_d_20, 2), 948b638e0f1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi1-dr-e", jz4760_ssi1_dr_e, 1), 949b638e0f1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi1-dr-f", jz4760_ssi1_dr_f, 2), 950b638e0f1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi1-clk-b-7", jz4760_ssi1_clk_b_7, 2), 951b638e0f1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi1-clk-b-28", jz4760_ssi1_clk_b_28, 2), 952b638e0f1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi1-clk-d", jz4760_ssi1_clk_d, 2), 953b638e0f1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi1-clk-e-7", jz4760_ssi1_clk_e_7, 2), 954b638e0f1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi1-clk-e-15", jz4760_ssi1_clk_e_15, 1), 955b638e0f1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi1-clk-f", jz4760_ssi1_clk_f, 2), 956b638e0f1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi1-gpc-b", jz4760_ssi1_gpc_b, 2), 957b638e0f1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi1-gpc-d", jz4760_ssi1_gpc_d, 2), 958b638e0f1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi1-gpc-e", jz4760_ssi1_gpc_e, 1), 959b638e0f1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi1-ce0-b-8", jz4760_ssi1_ce0_b_8, 2), 960b638e0f1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi1-ce0-b-29", jz4760_ssi1_ce0_b_29, 2), 961b638e0f1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi1-ce0-d", jz4760_ssi1_ce0_d, 2), 962b638e0f1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi1-ce0-e-6", jz4760_ssi1_ce0_e_6, 2), 963b638e0f1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi1-ce0-e-16", jz4760_ssi1_ce0_e_16, 1), 964b638e0f1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi1-ce0-f", jz4760_ssi1_ce0_f, 2), 965b638e0f1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi1-ce1-b", jz4760_ssi1_ce1_b, 2), 966b638e0f1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi1-ce1-d", jz4760_ssi1_ce1_d, 2), 967b638e0f1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi1-ce1-e", jz4760_ssi1_ce1_e, 1), 968bb42b593SPaul Cercueil INGENIC_PIN_GROUP_FUNCS("mmc0-1bit-a", jz4760_mmc0_1bit_a, 969bb42b593SPaul Cercueil jz4760_mmc0_1bit_a_funcs), 970bb42b593SPaul Cercueil INGENIC_PIN_GROUP("mmc0-4bit-a", jz4760_mmc0_4bit_a, 1), 971bb42b593SPaul Cercueil INGENIC_PIN_GROUP("mmc0-1bit-e", jz4760_mmc0_1bit_e, 0), 972bb42b593SPaul Cercueil INGENIC_PIN_GROUP("mmc0-4bit-e", jz4760_mmc0_4bit_e, 0), 973bb42b593SPaul Cercueil INGENIC_PIN_GROUP("mmc0-8bit-e", jz4760_mmc0_8bit_e, 0), 974bb42b593SPaul Cercueil INGENIC_PIN_GROUP("mmc1-1bit-d", jz4760_mmc1_1bit_d, 0), 975bb42b593SPaul Cercueil INGENIC_PIN_GROUP("mmc1-4bit-d", jz4760_mmc1_4bit_d, 0), 976bb42b593SPaul Cercueil INGENIC_PIN_GROUP("mmc1-1bit-e", jz4760_mmc1_1bit_e, 1), 977bb42b593SPaul Cercueil INGENIC_PIN_GROUP("mmc1-4bit-e", jz4760_mmc1_4bit_e, 1), 978bb42b593SPaul Cercueil INGENIC_PIN_GROUP("mmc1-8bit-e", jz4760_mmc1_8bit_e, 1), 979bb42b593SPaul Cercueil INGENIC_PIN_GROUP("mmc2-1bit-b", jz4760_mmc2_1bit_b, 0), 980bb42b593SPaul Cercueil INGENIC_PIN_GROUP("mmc2-4bit-b", jz4760_mmc2_4bit_b, 0), 981bb42b593SPaul Cercueil INGENIC_PIN_GROUP("mmc2-1bit-e", jz4760_mmc2_1bit_e, 2), 982bb42b593SPaul Cercueil INGENIC_PIN_GROUP("mmc2-4bit-e", jz4760_mmc2_4bit_e, 2), 983bb42b593SPaul Cercueil INGENIC_PIN_GROUP("mmc2-8bit-e", jz4760_mmc2_8bit_e, 2), 984bb42b593SPaul Cercueil INGENIC_PIN_GROUP("nemc-8bit-data", jz4760_nemc_8bit_data, 0), 985bb42b593SPaul Cercueil INGENIC_PIN_GROUP("nemc-16bit-data", jz4760_nemc_16bit_data, 0), 986bb42b593SPaul Cercueil INGENIC_PIN_GROUP("nemc-cle-ale", jz4760_nemc_cle_ale, 0), 987bb42b593SPaul Cercueil INGENIC_PIN_GROUP("nemc-addr", jz4760_nemc_addr, 0), 988bb42b593SPaul Cercueil INGENIC_PIN_GROUP("nemc-rd-we", jz4760_nemc_rd_we, 0), 989bb42b593SPaul Cercueil INGENIC_PIN_GROUP("nemc-frd-fwe", jz4760_nemc_frd_fwe, 0), 990bb42b593SPaul Cercueil INGENIC_PIN_GROUP("nemc-wait", jz4760_nemc_wait, 0), 991bb42b593SPaul Cercueil INGENIC_PIN_GROUP("nemc-cs1", jz4760_nemc_cs1, 0), 992bb42b593SPaul Cercueil INGENIC_PIN_GROUP("nemc-cs2", jz4760_nemc_cs2, 0), 993bb42b593SPaul Cercueil INGENIC_PIN_GROUP("nemc-cs3", jz4760_nemc_cs3, 0), 994bb42b593SPaul Cercueil INGENIC_PIN_GROUP("nemc-cs4", jz4760_nemc_cs4, 0), 995bb42b593SPaul Cercueil INGENIC_PIN_GROUP("nemc-cs5", jz4760_nemc_cs5, 0), 996bb42b593SPaul Cercueil INGENIC_PIN_GROUP("nemc-cs6", jz4760_nemc_cs6, 0), 997bb42b593SPaul Cercueil INGENIC_PIN_GROUP("i2c0-data", jz4760_i2c0, 0), 998bb42b593SPaul Cercueil INGENIC_PIN_GROUP("i2c1-data", jz4760_i2c1, 0), 999bb42b593SPaul Cercueil INGENIC_PIN_GROUP("cim-data", jz4760_cim, 0), 1000dd1ccfd6SPaul Cercueil INGENIC_PIN_GROUP("lcd-8bit", jz4760_lcd_8bit, 0), 1001dd1ccfd6SPaul Cercueil INGENIC_PIN_GROUP("lcd-16bit", jz4760_lcd_16bit, 0), 1002dd1ccfd6SPaul Cercueil INGENIC_PIN_GROUP("lcd-18bit", jz4760_lcd_18bit, 0), 1003bb42b593SPaul Cercueil INGENIC_PIN_GROUP("lcd-24bit", jz4760_lcd_24bit, 0), 1004dd1ccfd6SPaul Cercueil INGENIC_PIN_GROUP("lcd-special", jz4760_lcd_special, 1), 10055e6332a7S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("lcd-generic", jz4760_lcd_generic, 0), 1006bb42b593SPaul Cercueil INGENIC_PIN_GROUP("pwm0", jz4760_pwm_pwm0, 0), 1007bb42b593SPaul Cercueil INGENIC_PIN_GROUP("pwm1", jz4760_pwm_pwm1, 0), 1008bb42b593SPaul Cercueil INGENIC_PIN_GROUP("pwm2", jz4760_pwm_pwm2, 0), 1009bb42b593SPaul Cercueil INGENIC_PIN_GROUP("pwm3", jz4760_pwm_pwm3, 0), 1010bb42b593SPaul Cercueil INGENIC_PIN_GROUP("pwm4", jz4760_pwm_pwm4, 0), 1011bb42b593SPaul Cercueil INGENIC_PIN_GROUP("pwm5", jz4760_pwm_pwm5, 0), 1012bb42b593SPaul Cercueil INGENIC_PIN_GROUP("pwm6", jz4760_pwm_pwm6, 0), 1013bb42b593SPaul Cercueil INGENIC_PIN_GROUP("pwm7", jz4760_pwm_pwm7, 0), 1014dd1ccfd6SPaul Cercueil INGENIC_PIN_GROUP("otg-vbus", jz4760_otg, 0), 10150257595aSZhou Yanjie }; 10160257595aSZhou Yanjie 10170257595aSZhou Yanjie static const char *jz4760_uart0_groups[] = { "uart0-data", "uart0-hwflow", }; 10180257595aSZhou Yanjie static const char *jz4760_uart1_groups[] = { "uart1-data", "uart1-hwflow", }; 10190257595aSZhou Yanjie static const char *jz4760_uart2_groups[] = { "uart2-data", "uart2-hwflow", }; 10200257595aSZhou Yanjie static const char *jz4760_uart3_groups[] = { "uart3-data", "uart3-hwflow", }; 1021b638e0f1S周琰杰 (Zhou Yanjie) static const char *jz4760_ssi0_groups[] = { 1022b638e0f1S周琰杰 (Zhou Yanjie) "ssi0-dt-a", "ssi0-dt-b", "ssi0-dt-d", "ssi0-dt-e", 1023b638e0f1S周琰杰 (Zhou Yanjie) "ssi0-dr-a", "ssi0-dr-b", "ssi0-dr-d", "ssi0-dr-e", 1024b638e0f1S周琰杰 (Zhou Yanjie) "ssi0-clk-a", "ssi0-clk-b", "ssi0-clk-d", "ssi0-clk-e", 1025b638e0f1S周琰杰 (Zhou Yanjie) "ssi0-gpc-b", "ssi0-gpc-d", "ssi0-gpc-e", 1026b638e0f1S周琰杰 (Zhou Yanjie) "ssi0-ce0-a", "ssi0-ce0-b", "ssi0-ce0-d", "ssi0-ce0-e", 1027b638e0f1S周琰杰 (Zhou Yanjie) "ssi0-ce1-b", "ssi0-ce1-d", "ssi0-ce1-e", 1028b638e0f1S周琰杰 (Zhou Yanjie) }; 1029b638e0f1S周琰杰 (Zhou Yanjie) static const char *jz4760_ssi1_groups[] = { 1030b638e0f1S周琰杰 (Zhou Yanjie) "ssi1-dt-b-9", "ssi1-dt-b-21", "ssi1-dt-d-12", "ssi1-dt-d-21", "ssi1-dt-e", "ssi1-dt-f", 1031b638e0f1S周琰杰 (Zhou Yanjie) "ssi1-dr-b-6", "ssi1-dr-b-20", "ssi1-dr-d-13", "ssi1-dr-d-20", "ssi1-dr-e", "ssi1-dr-f", 1032b638e0f1S周琰杰 (Zhou Yanjie) "ssi1-clk-b-7", "ssi1-clk-b-28", "ssi1-clk-d", "ssi1-clk-e-7", "ssi1-clk-e-15", "ssi1-clk-f", 1033b638e0f1S周琰杰 (Zhou Yanjie) "ssi1-gpc-b", "ssi1-gpc-d", "ssi1-gpc-e", 1034b638e0f1S周琰杰 (Zhou Yanjie) "ssi1-ce0-b-8", "ssi1-ce0-b-29", "ssi1-ce0-d", "ssi1-ce0-e-6", "ssi1-ce0-e-16", "ssi1-ce0-f", 1035b638e0f1S周琰杰 (Zhou Yanjie) "ssi1-ce1-b", "ssi1-ce1-d", "ssi1-ce1-e", 1036b638e0f1S周琰杰 (Zhou Yanjie) }; 10370257595aSZhou Yanjie static const char *jz4760_mmc0_groups[] = { 10380257595aSZhou Yanjie "mmc0-1bit-a", "mmc0-4bit-a", 10390257595aSZhou Yanjie "mmc0-1bit-e", "mmc0-4bit-e", "mmc0-8bit-e", 10400257595aSZhou Yanjie }; 10410257595aSZhou Yanjie static const char *jz4760_mmc1_groups[] = { 10420257595aSZhou Yanjie "mmc1-1bit-d", "mmc1-4bit-d", 10430257595aSZhou Yanjie "mmc1-1bit-e", "mmc1-4bit-e", "mmc1-8bit-e", 10440257595aSZhou Yanjie }; 10450257595aSZhou Yanjie static const char *jz4760_mmc2_groups[] = { 10460257595aSZhou Yanjie "mmc2-1bit-b", "mmc2-4bit-b", 10470257595aSZhou Yanjie "mmc2-1bit-e", "mmc2-4bit-e", "mmc2-8bit-e", 10480257595aSZhou Yanjie }; 10490257595aSZhou Yanjie static const char *jz4760_nemc_groups[] = { 10500257595aSZhou Yanjie "nemc-8bit-data", "nemc-16bit-data", "nemc-cle-ale", 10510257595aSZhou Yanjie "nemc-addr", "nemc-rd-we", "nemc-frd-fwe", "nemc-wait", 10520257595aSZhou Yanjie }; 10530257595aSZhou Yanjie static const char *jz4760_cs1_groups[] = { "nemc-cs1", }; 10540257595aSZhou Yanjie static const char *jz4760_cs2_groups[] = { "nemc-cs2", }; 10550257595aSZhou Yanjie static const char *jz4760_cs3_groups[] = { "nemc-cs3", }; 10560257595aSZhou Yanjie static const char *jz4760_cs4_groups[] = { "nemc-cs4", }; 10570257595aSZhou Yanjie static const char *jz4760_cs5_groups[] = { "nemc-cs5", }; 10580257595aSZhou Yanjie static const char *jz4760_cs6_groups[] = { "nemc-cs6", }; 10590257595aSZhou Yanjie static const char *jz4760_i2c0_groups[] = { "i2c0-data", }; 10600257595aSZhou Yanjie static const char *jz4760_i2c1_groups[] = { "i2c1-data", }; 10610257595aSZhou Yanjie static const char *jz4760_cim_groups[] = { "cim-data", }; 1062dd1ccfd6SPaul Cercueil static const char *jz4760_lcd_groups[] = { 1063dd1ccfd6SPaul Cercueil "lcd-8bit", "lcd-16bit", "lcd-18bit", "lcd-24bit", 1064dd1ccfd6SPaul Cercueil "lcd-special", "lcd-generic", 1065dd1ccfd6SPaul Cercueil }; 10660257595aSZhou Yanjie static const char *jz4760_pwm0_groups[] = { "pwm0", }; 10670257595aSZhou Yanjie static const char *jz4760_pwm1_groups[] = { "pwm1", }; 10680257595aSZhou Yanjie static const char *jz4760_pwm2_groups[] = { "pwm2", }; 10690257595aSZhou Yanjie static const char *jz4760_pwm3_groups[] = { "pwm3", }; 10700257595aSZhou Yanjie static const char *jz4760_pwm4_groups[] = { "pwm4", }; 10710257595aSZhou Yanjie static const char *jz4760_pwm5_groups[] = { "pwm5", }; 10720257595aSZhou Yanjie static const char *jz4760_pwm6_groups[] = { "pwm6", }; 10730257595aSZhou Yanjie static const char *jz4760_pwm7_groups[] = { "pwm7", }; 1074dd1ccfd6SPaul Cercueil static const char *jz4760_otg_groups[] = { "otg-vbus", }; 10750257595aSZhou Yanjie 10760257595aSZhou Yanjie static const struct function_desc jz4760_functions[] = { 10770257595aSZhou Yanjie { "uart0", jz4760_uart0_groups, ARRAY_SIZE(jz4760_uart0_groups), }, 10780257595aSZhou Yanjie { "uart1", jz4760_uart1_groups, ARRAY_SIZE(jz4760_uart1_groups), }, 10790257595aSZhou Yanjie { "uart2", jz4760_uart2_groups, ARRAY_SIZE(jz4760_uart2_groups), }, 10800257595aSZhou Yanjie { "uart3", jz4760_uart3_groups, ARRAY_SIZE(jz4760_uart3_groups), }, 1081b638e0f1S周琰杰 (Zhou Yanjie) { "ssi0", jz4760_ssi0_groups, ARRAY_SIZE(jz4760_ssi0_groups), }, 1082b638e0f1S周琰杰 (Zhou Yanjie) { "ssi1", jz4760_ssi1_groups, ARRAY_SIZE(jz4760_ssi1_groups), }, 10830257595aSZhou Yanjie { "mmc0", jz4760_mmc0_groups, ARRAY_SIZE(jz4760_mmc0_groups), }, 10840257595aSZhou Yanjie { "mmc1", jz4760_mmc1_groups, ARRAY_SIZE(jz4760_mmc1_groups), }, 10850257595aSZhou Yanjie { "mmc2", jz4760_mmc2_groups, ARRAY_SIZE(jz4760_mmc2_groups), }, 10860257595aSZhou Yanjie { "nemc", jz4760_nemc_groups, ARRAY_SIZE(jz4760_nemc_groups), }, 10870257595aSZhou Yanjie { "nemc-cs1", jz4760_cs1_groups, ARRAY_SIZE(jz4760_cs1_groups), }, 10880257595aSZhou Yanjie { "nemc-cs2", jz4760_cs2_groups, ARRAY_SIZE(jz4760_cs2_groups), }, 10890257595aSZhou Yanjie { "nemc-cs3", jz4760_cs3_groups, ARRAY_SIZE(jz4760_cs3_groups), }, 10900257595aSZhou Yanjie { "nemc-cs4", jz4760_cs4_groups, ARRAY_SIZE(jz4760_cs4_groups), }, 10910257595aSZhou Yanjie { "nemc-cs5", jz4760_cs5_groups, ARRAY_SIZE(jz4760_cs5_groups), }, 10920257595aSZhou Yanjie { "nemc-cs6", jz4760_cs6_groups, ARRAY_SIZE(jz4760_cs6_groups), }, 10930257595aSZhou Yanjie { "i2c0", jz4760_i2c0_groups, ARRAY_SIZE(jz4760_i2c0_groups), }, 10940257595aSZhou Yanjie { "i2c1", jz4760_i2c1_groups, ARRAY_SIZE(jz4760_i2c1_groups), }, 10950257595aSZhou Yanjie { "cim", jz4760_cim_groups, ARRAY_SIZE(jz4760_cim_groups), }, 10960257595aSZhou Yanjie { "lcd", jz4760_lcd_groups, ARRAY_SIZE(jz4760_lcd_groups), }, 10970257595aSZhou Yanjie { "pwm0", jz4760_pwm0_groups, ARRAY_SIZE(jz4760_pwm0_groups), }, 10980257595aSZhou Yanjie { "pwm1", jz4760_pwm1_groups, ARRAY_SIZE(jz4760_pwm1_groups), }, 10990257595aSZhou Yanjie { "pwm2", jz4760_pwm2_groups, ARRAY_SIZE(jz4760_pwm2_groups), }, 11000257595aSZhou Yanjie { "pwm3", jz4760_pwm3_groups, ARRAY_SIZE(jz4760_pwm3_groups), }, 11010257595aSZhou Yanjie { "pwm4", jz4760_pwm4_groups, ARRAY_SIZE(jz4760_pwm4_groups), }, 11020257595aSZhou Yanjie { "pwm5", jz4760_pwm5_groups, ARRAY_SIZE(jz4760_pwm5_groups), }, 11030257595aSZhou Yanjie { "pwm6", jz4760_pwm6_groups, ARRAY_SIZE(jz4760_pwm6_groups), }, 11040257595aSZhou Yanjie { "pwm7", jz4760_pwm7_groups, ARRAY_SIZE(jz4760_pwm7_groups), }, 1105dd1ccfd6SPaul Cercueil { "otg", jz4760_otg_groups, ARRAY_SIZE(jz4760_otg_groups), }, 11060257595aSZhou Yanjie }; 11070257595aSZhou Yanjie 11080257595aSZhou Yanjie static const struct ingenic_chip_info jz4760_chip_info = { 11090257595aSZhou Yanjie .num_chips = 6, 1110f742e5ebS周琰杰 (Zhou Yanjie) .reg_offset = 0x100, 1111baf15647SPaul Cercueil .version = ID_JZ4760, 11120257595aSZhou Yanjie .groups = jz4760_groups, 11130257595aSZhou Yanjie .num_groups = ARRAY_SIZE(jz4760_groups), 11140257595aSZhou Yanjie .functions = jz4760_functions, 11150257595aSZhou Yanjie .num_functions = ARRAY_SIZE(jz4760_functions), 11160257595aSZhou Yanjie .pull_ups = jz4760_pull_ups, 11170257595aSZhou Yanjie .pull_downs = jz4760_pull_downs, 11180257595aSZhou Yanjie }; 11190257595aSZhou Yanjie 1120b5c23aa4SPaul Cercueil static const u32 jz4770_pull_ups[6] = { 1121d5e93140SPaul Cercueil 0x3fffffff, 0xfff0f3fc, 0xffffffff, 0xffff4fff, 0xfffffb7c, 0x0024f00f, 1122b5c23aa4SPaul Cercueil }; 1123b5c23aa4SPaul Cercueil 1124b5c23aa4SPaul Cercueil static const u32 jz4770_pull_downs[6] = { 1125d5e93140SPaul Cercueil 0x00000000, 0x000f0c03, 0x00000000, 0x0000b000, 0x00000483, 0x005b0ff0, 1126b5c23aa4SPaul Cercueil }; 1127b5c23aa4SPaul Cercueil 1128b5c23aa4SPaul Cercueil static int jz4770_uart0_data_pins[] = { 0xa0, 0xa3, }; 1129b5c23aa4SPaul Cercueil static int jz4770_uart0_hwflow_pins[] = { 0xa1, 0xa2, }; 1130b5c23aa4SPaul Cercueil static int jz4770_uart1_data_pins[] = { 0x7a, 0x7c, }; 1131b5c23aa4SPaul Cercueil static int jz4770_uart1_hwflow_pins[] = { 0x7b, 0x7d, }; 1132ff656e47SZhou Yanjie static int jz4770_uart2_data_pins[] = { 0x5c, 0x5e, }; 1133ff656e47SZhou Yanjie static int jz4770_uart2_hwflow_pins[] = { 0x5d, 0x5f, }; 1134b5c23aa4SPaul Cercueil static int jz4770_uart3_data_pins[] = { 0x6c, 0x85, }; 1135b5c23aa4SPaul Cercueil static int jz4770_uart3_hwflow_pins[] = { 0x88, 0x89, }; 1136d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4770_ssi0_dt_a_pins[] = { 0x15, }; 1137d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4770_ssi0_dt_b_pins[] = { 0x35, }; 1138f83c2609SPaul Cercueil static int jz4770_ssi0_dt_d_pins[] = { 0x75, }; 1139f83c2609SPaul Cercueil static int jz4770_ssi0_dt_e_pins[] = { 0x91, }; 1140d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4770_ssi0_dr_a_pins[] = { 0x14, }; 1141d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4770_ssi0_dr_b_pins[] = { 0x34, }; 1142f83c2609SPaul Cercueil static int jz4770_ssi0_dr_d_pins[] = { 0x74, }; 1143f83c2609SPaul Cercueil static int jz4770_ssi0_dr_e_pins[] = { 0x8e, }; 1144d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4770_ssi0_clk_a_pins[] = { 0x12, }; 1145d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4770_ssi0_clk_b_pins[] = { 0x3c, }; 1146f83c2609SPaul Cercueil static int jz4770_ssi0_clk_d_pins[] = { 0x78, }; 1147f83c2609SPaul Cercueil static int jz4770_ssi0_clk_e_pins[] = { 0x8f, }; 1148d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4770_ssi0_gpc_b_pins[] = { 0x3e, }; 1149f83c2609SPaul Cercueil static int jz4770_ssi0_gpc_d_pins[] = { 0x76, }; 1150f83c2609SPaul Cercueil static int jz4770_ssi0_gpc_e_pins[] = { 0x93, }; 1151d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4770_ssi0_ce0_a_pins[] = { 0x13, }; 1152d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4770_ssi0_ce0_b_pins[] = { 0x3d, }; 1153f83c2609SPaul Cercueil static int jz4770_ssi0_ce0_d_pins[] = { 0x79, }; 1154f83c2609SPaul Cercueil static int jz4770_ssi0_ce0_e_pins[] = { 0x90, }; 1155d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4770_ssi0_ce1_b_pins[] = { 0x3f, }; 1156f83c2609SPaul Cercueil static int jz4770_ssi0_ce1_d_pins[] = { 0x77, }; 1157f83c2609SPaul Cercueil static int jz4770_ssi0_ce1_e_pins[] = { 0x92, }; 1158d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4770_ssi1_dt_b_pins[] = { 0x35, }; 1159f83c2609SPaul Cercueil static int jz4770_ssi1_dt_d_pins[] = { 0x75, }; 1160f83c2609SPaul Cercueil static int jz4770_ssi1_dt_e_pins[] = { 0x91, }; 1161d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4770_ssi1_dr_b_pins[] = { 0x34, }; 1162f83c2609SPaul Cercueil static int jz4770_ssi1_dr_d_pins[] = { 0x74, }; 1163f83c2609SPaul Cercueil static int jz4770_ssi1_dr_e_pins[] = { 0x8e, }; 1164d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4770_ssi1_clk_b_pins[] = { 0x3c, }; 1165f83c2609SPaul Cercueil static int jz4770_ssi1_clk_d_pins[] = { 0x78, }; 1166f83c2609SPaul Cercueil static int jz4770_ssi1_clk_e_pins[] = { 0x8f, }; 1167d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4770_ssi1_gpc_b_pins[] = { 0x3e, }; 1168f83c2609SPaul Cercueil static int jz4770_ssi1_gpc_d_pins[] = { 0x76, }; 1169f83c2609SPaul Cercueil static int jz4770_ssi1_gpc_e_pins[] = { 0x93, }; 1170d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4770_ssi1_ce0_b_pins[] = { 0x3d, }; 1171f83c2609SPaul Cercueil static int jz4770_ssi1_ce0_d_pins[] = { 0x79, }; 1172f83c2609SPaul Cercueil static int jz4770_ssi1_ce0_e_pins[] = { 0x90, }; 1173d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4770_ssi1_ce1_b_pins[] = { 0x3f, }; 1174f83c2609SPaul Cercueil static int jz4770_ssi1_ce1_d_pins[] = { 0x77, }; 1175f83c2609SPaul Cercueil static int jz4770_ssi1_ce1_e_pins[] = { 0x92, }; 1176b5c23aa4SPaul Cercueil static int jz4770_mmc0_1bit_a_pins[] = { 0x12, 0x13, 0x14, }; 1177ff656e47SZhou Yanjie static int jz4770_mmc0_4bit_a_pins[] = { 0x15, 0x16, 0x17, }; 1178b5c23aa4SPaul Cercueil static int jz4770_mmc0_1bit_e_pins[] = { 0x9c, 0x9d, 0x94, }; 1179ff656e47SZhou Yanjie static int jz4770_mmc0_4bit_e_pins[] = { 0x95, 0x96, 0x97, }; 1180ff656e47SZhou Yanjie static int jz4770_mmc0_8bit_e_pins[] = { 0x98, 0x99, 0x9a, 0x9b, }; 1181b5c23aa4SPaul Cercueil static int jz4770_mmc1_1bit_d_pins[] = { 0x78, 0x79, 0x74, }; 1182ff656e47SZhou Yanjie static int jz4770_mmc1_4bit_d_pins[] = { 0x75, 0x76, 0x77, }; 1183b5c23aa4SPaul Cercueil static int jz4770_mmc1_1bit_e_pins[] = { 0x9c, 0x9d, 0x94, }; 1184ff656e47SZhou Yanjie static int jz4770_mmc1_4bit_e_pins[] = { 0x95, 0x96, 0x97, }; 1185ff656e47SZhou Yanjie static int jz4770_mmc1_8bit_e_pins[] = { 0x98, 0x99, 0x9a, 0x9b, }; 11865de1a73eSZhou Yanjie static int jz4770_mmc2_1bit_b_pins[] = { 0x3c, 0x3d, 0x34, }; 11875de1a73eSZhou Yanjie static int jz4770_mmc2_4bit_b_pins[] = { 0x35, 0x3e, 0x3f, }; 11885de1a73eSZhou Yanjie static int jz4770_mmc2_1bit_e_pins[] = { 0x9c, 0x9d, 0x94, }; 11895de1a73eSZhou Yanjie static int jz4770_mmc2_4bit_e_pins[] = { 0x95, 0x96, 0x97, }; 11905de1a73eSZhou Yanjie static int jz4770_mmc2_8bit_e_pins[] = { 0x98, 0x99, 0x9a, 0x9b, }; 1191ff656e47SZhou Yanjie static int jz4770_nemc_8bit_data_pins[] = { 1192b5c23aa4SPaul Cercueil 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 1193b5c23aa4SPaul Cercueil }; 1194ff656e47SZhou Yanjie static int jz4770_nemc_16bit_data_pins[] = { 1195ff656e47SZhou Yanjie 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 1196ff656e47SZhou Yanjie }; 1197b5c23aa4SPaul Cercueil static int jz4770_nemc_cle_ale_pins[] = { 0x20, 0x21, }; 1198b5c23aa4SPaul Cercueil static int jz4770_nemc_addr_pins[] = { 0x22, 0x23, 0x24, 0x25, }; 1199b5c23aa4SPaul Cercueil static int jz4770_nemc_rd_we_pins[] = { 0x10, 0x11, }; 1200b5c23aa4SPaul Cercueil static int jz4770_nemc_frd_fwe_pins[] = { 0x12, 0x13, }; 12015de1a73eSZhou Yanjie static int jz4770_nemc_wait_pins[] = { 0x1b, }; 1202b5c23aa4SPaul Cercueil static int jz4770_nemc_cs1_pins[] = { 0x15, }; 1203b5c23aa4SPaul Cercueil static int jz4770_nemc_cs2_pins[] = { 0x16, }; 1204b5c23aa4SPaul Cercueil static int jz4770_nemc_cs3_pins[] = { 0x17, }; 1205b5c23aa4SPaul Cercueil static int jz4770_nemc_cs4_pins[] = { 0x18, }; 1206b5c23aa4SPaul Cercueil static int jz4770_nemc_cs5_pins[] = { 0x19, }; 1207b5c23aa4SPaul Cercueil static int jz4770_nemc_cs6_pins[] = { 0x1a, }; 1208ff656e47SZhou Yanjie static int jz4770_i2c0_pins[] = { 0x7e, 0x7f, }; 1209ff656e47SZhou Yanjie static int jz4770_i2c1_pins[] = { 0x9e, 0x9f, }; 1210b5c23aa4SPaul Cercueil static int jz4770_i2c2_pins[] = { 0xb0, 0xb1, }; 1211ff656e47SZhou Yanjie static int jz4770_cim_8bit_pins[] = { 1212ff656e47SZhou Yanjie 0x26, 0x27, 0x28, 0x29, 1213ff656e47SZhou Yanjie 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 1214b5c23aa4SPaul Cercueil }; 1215ff656e47SZhou Yanjie static int jz4770_cim_12bit_pins[] = { 1216ff656e47SZhou Yanjie 0x32, 0x33, 0xb0, 0xb1, 1217ff656e47SZhou Yanjie }; 1218016e054dSPaul Cercueil static int jz4770_lcd_8bit_pins[] = { 1219016e054dSPaul Cercueil 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x4c, 0x4d, 12205e6332a7S周琰杰 (Zhou Yanjie) 0x48, 0x52, 0x53, 12215e6332a7S周琰杰 (Zhou Yanjie) }; 12225e6332a7S周琰杰 (Zhou Yanjie) static int jz4770_lcd_16bit_pins[] = { 12235e6332a7S周琰杰 (Zhou Yanjie) 0x4e, 0x4f, 0x50, 0x51, 0x56, 0x57, 0x58, 0x59, 12245e6332a7S周琰杰 (Zhou Yanjie) }; 12255e6332a7S周琰杰 (Zhou Yanjie) static int jz4770_lcd_18bit_pins[] = { 12265e6332a7S周琰杰 (Zhou Yanjie) 0x5a, 0x5b, 1227016e054dSPaul Cercueil }; 1228ff656e47SZhou Yanjie static int jz4770_lcd_24bit_pins[] = { 1229b5c23aa4SPaul Cercueil 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 1230b5c23aa4SPaul Cercueil 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 1231b5c23aa4SPaul Cercueil 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 1232ff656e47SZhou Yanjie 0x58, 0x59, 0x5a, 0x5b, 1233b5c23aa4SPaul Cercueil }; 12345e6332a7S周琰杰 (Zhou Yanjie) static int jz4770_lcd_special_pins[] = { 0x54, 0x4a, 0x41, 0x40, }; 12355e6332a7S周琰杰 (Zhou Yanjie) static int jz4770_lcd_generic_pins[] = { 0x49, }; 1236b5c23aa4SPaul Cercueil static int jz4770_pwm_pwm0_pins[] = { 0x80, }; 1237b5c23aa4SPaul Cercueil static int jz4770_pwm_pwm1_pins[] = { 0x81, }; 1238b5c23aa4SPaul Cercueil static int jz4770_pwm_pwm2_pins[] = { 0x82, }; 1239b5c23aa4SPaul Cercueil static int jz4770_pwm_pwm3_pins[] = { 0x83, }; 1240b5c23aa4SPaul Cercueil static int jz4770_pwm_pwm4_pins[] = { 0x84, }; 1241b5c23aa4SPaul Cercueil static int jz4770_pwm_pwm5_pins[] = { 0x85, }; 1242b5c23aa4SPaul Cercueil static int jz4770_pwm_pwm6_pins[] = { 0x6a, }; 1243b5c23aa4SPaul Cercueil static int jz4770_pwm_pwm7_pins[] = { 0x6b, }; 12445de1a73eSZhou Yanjie static int jz4770_mac_rmii_pins[] = { 12455de1a73eSZhou Yanjie 0xa9, 0xab, 0xaa, 0xac, 0xa5, 0xa4, 0xad, 0xae, 0xa6, 0xa8, 12465de1a73eSZhou Yanjie }; 124765afd976S周琰杰 (Zhou Yanjie) static int jz4770_mac_mii_pins[] = { 124865afd976S周琰杰 (Zhou Yanjie) 0x7b, 0x7a, 0x7d, 0x7c, 0xa7, 0x24, 0xaf, 124965afd976S周琰杰 (Zhou Yanjie) }; 1250b5c23aa4SPaul Cercueil 1251b5c23aa4SPaul Cercueil static const struct group_desc jz4770_groups[] = { 1252bb42b593SPaul Cercueil INGENIC_PIN_GROUP("uart0-data", jz4770_uart0_data, 0), 1253bb42b593SPaul Cercueil INGENIC_PIN_GROUP("uart0-hwflow", jz4770_uart0_hwflow, 0), 1254bb42b593SPaul Cercueil INGENIC_PIN_GROUP("uart1-data", jz4770_uart1_data, 0), 1255bb42b593SPaul Cercueil INGENIC_PIN_GROUP("uart1-hwflow", jz4770_uart1_hwflow, 0), 1256bb42b593SPaul Cercueil INGENIC_PIN_GROUP("uart2-data", jz4770_uart2_data, 0), 1257bb42b593SPaul Cercueil INGENIC_PIN_GROUP("uart2-hwflow", jz4770_uart2_hwflow, 0), 1258bb42b593SPaul Cercueil INGENIC_PIN_GROUP_FUNCS("uart3-data", jz4770_uart3_data, 1259bb42b593SPaul Cercueil jz4760_uart3_data_funcs), 1260bb42b593SPaul Cercueil INGENIC_PIN_GROUP("uart3-hwflow", jz4770_uart3_hwflow, 0), 1261bb42b593SPaul Cercueil INGENIC_PIN_GROUP("ssi0-dt-a", jz4770_ssi0_dt_a, 2), 1262bb42b593SPaul Cercueil INGENIC_PIN_GROUP("ssi0-dt-b", jz4770_ssi0_dt_b, 1), 1263bb42b593SPaul Cercueil INGENIC_PIN_GROUP("ssi0-dt-d", jz4770_ssi0_dt_d, 1), 1264bb42b593SPaul Cercueil INGENIC_PIN_GROUP("ssi0-dt-e", jz4770_ssi0_dt_e, 0), 1265bb42b593SPaul Cercueil INGENIC_PIN_GROUP("ssi0-dr-a", jz4770_ssi0_dr_a, 1), 1266bb42b593SPaul Cercueil INGENIC_PIN_GROUP("ssi0-dr-b", jz4770_ssi0_dr_b, 1), 1267bb42b593SPaul Cercueil INGENIC_PIN_GROUP("ssi0-dr-d", jz4770_ssi0_dr_d, 1), 1268bb42b593SPaul Cercueil INGENIC_PIN_GROUP("ssi0-dr-e", jz4770_ssi0_dr_e, 0), 1269bb42b593SPaul Cercueil INGENIC_PIN_GROUP("ssi0-clk-a", jz4770_ssi0_clk_a, 2), 1270bb42b593SPaul Cercueil INGENIC_PIN_GROUP("ssi0-clk-b", jz4770_ssi0_clk_b, 1), 1271bb42b593SPaul Cercueil INGENIC_PIN_GROUP("ssi0-clk-d", jz4770_ssi0_clk_d, 1), 1272bb42b593SPaul Cercueil INGENIC_PIN_GROUP("ssi0-clk-e", jz4770_ssi0_clk_e, 0), 1273bb42b593SPaul Cercueil INGENIC_PIN_GROUP("ssi0-gpc-b", jz4770_ssi0_gpc_b, 1), 1274bb42b593SPaul Cercueil INGENIC_PIN_GROUP("ssi0-gpc-d", jz4770_ssi0_gpc_d, 1), 1275bb42b593SPaul Cercueil INGENIC_PIN_GROUP("ssi0-gpc-e", jz4770_ssi0_gpc_e, 0), 1276bb42b593SPaul Cercueil INGENIC_PIN_GROUP("ssi0-ce0-a", jz4770_ssi0_ce0_a, 2), 1277bb42b593SPaul Cercueil INGENIC_PIN_GROUP("ssi0-ce0-b", jz4770_ssi0_ce0_b, 1), 1278bb42b593SPaul Cercueil INGENIC_PIN_GROUP("ssi0-ce0-d", jz4770_ssi0_ce0_d, 1), 1279bb42b593SPaul Cercueil INGENIC_PIN_GROUP("ssi0-ce0-e", jz4770_ssi0_ce0_e, 0), 1280bb42b593SPaul Cercueil INGENIC_PIN_GROUP("ssi0-ce1-b", jz4770_ssi0_ce1_b, 1), 1281bb42b593SPaul Cercueil INGENIC_PIN_GROUP("ssi0-ce1-d", jz4770_ssi0_ce1_d, 1), 1282bb42b593SPaul Cercueil INGENIC_PIN_GROUP("ssi0-ce1-e", jz4770_ssi0_ce1_e, 0), 1283bb42b593SPaul Cercueil INGENIC_PIN_GROUP("ssi1-dt-b", jz4770_ssi1_dt_b, 2), 1284bb42b593SPaul Cercueil INGENIC_PIN_GROUP("ssi1-dt-d", jz4770_ssi1_dt_d, 2), 1285bb42b593SPaul Cercueil INGENIC_PIN_GROUP("ssi1-dt-e", jz4770_ssi1_dt_e, 1), 1286bb42b593SPaul Cercueil INGENIC_PIN_GROUP("ssi1-dr-b", jz4770_ssi1_dr_b, 2), 1287bb42b593SPaul Cercueil INGENIC_PIN_GROUP("ssi1-dr-d", jz4770_ssi1_dr_d, 2), 1288bb42b593SPaul Cercueil INGENIC_PIN_GROUP("ssi1-dr-e", jz4770_ssi1_dr_e, 1), 1289bb42b593SPaul Cercueil INGENIC_PIN_GROUP("ssi1-clk-b", jz4770_ssi1_clk_b, 2), 1290bb42b593SPaul Cercueil INGENIC_PIN_GROUP("ssi1-clk-d", jz4770_ssi1_clk_d, 2), 1291bb42b593SPaul Cercueil INGENIC_PIN_GROUP("ssi1-clk-e", jz4770_ssi1_clk_e, 1), 1292bb42b593SPaul Cercueil INGENIC_PIN_GROUP("ssi1-gpc-b", jz4770_ssi1_gpc_b, 2), 1293bb42b593SPaul Cercueil INGENIC_PIN_GROUP("ssi1-gpc-d", jz4770_ssi1_gpc_d, 2), 1294bb42b593SPaul Cercueil INGENIC_PIN_GROUP("ssi1-gpc-e", jz4770_ssi1_gpc_e, 1), 1295bb42b593SPaul Cercueil INGENIC_PIN_GROUP("ssi1-ce0-b", jz4770_ssi1_ce0_b, 2), 1296bb42b593SPaul Cercueil INGENIC_PIN_GROUP("ssi1-ce0-d", jz4770_ssi1_ce0_d, 2), 1297bb42b593SPaul Cercueil INGENIC_PIN_GROUP("ssi1-ce0-e", jz4770_ssi1_ce0_e, 1), 1298bb42b593SPaul Cercueil INGENIC_PIN_GROUP("ssi1-ce1-b", jz4770_ssi1_ce1_b, 2), 1299bb42b593SPaul Cercueil INGENIC_PIN_GROUP("ssi1-ce1-d", jz4770_ssi1_ce1_d, 2), 1300bb42b593SPaul Cercueil INGENIC_PIN_GROUP("ssi1-ce1-e", jz4770_ssi1_ce1_e, 1), 1301bb42b593SPaul Cercueil INGENIC_PIN_GROUP_FUNCS("mmc0-1bit-a", jz4770_mmc0_1bit_a, 1302bb42b593SPaul Cercueil jz4760_mmc0_1bit_a_funcs), 1303bb42b593SPaul Cercueil INGENIC_PIN_GROUP("mmc0-4bit-a", jz4770_mmc0_4bit_a, 1), 1304bb42b593SPaul Cercueil INGENIC_PIN_GROUP("mmc0-1bit-e", jz4770_mmc0_1bit_e, 0), 1305bb42b593SPaul Cercueil INGENIC_PIN_GROUP("mmc0-4bit-e", jz4770_mmc0_4bit_e, 0), 1306bb42b593SPaul Cercueil INGENIC_PIN_GROUP("mmc0-8bit-e", jz4770_mmc0_8bit_e, 0), 1307bb42b593SPaul Cercueil INGENIC_PIN_GROUP("mmc1-1bit-d", jz4770_mmc1_1bit_d, 0), 1308bb42b593SPaul Cercueil INGENIC_PIN_GROUP("mmc1-4bit-d", jz4770_mmc1_4bit_d, 0), 1309bb42b593SPaul Cercueil INGENIC_PIN_GROUP("mmc1-1bit-e", jz4770_mmc1_1bit_e, 1), 1310bb42b593SPaul Cercueil INGENIC_PIN_GROUP("mmc1-4bit-e", jz4770_mmc1_4bit_e, 1), 1311bb42b593SPaul Cercueil INGENIC_PIN_GROUP("mmc1-8bit-e", jz4770_mmc1_8bit_e, 1), 1312bb42b593SPaul Cercueil INGENIC_PIN_GROUP("mmc2-1bit-b", jz4770_mmc2_1bit_b, 0), 1313bb42b593SPaul Cercueil INGENIC_PIN_GROUP("mmc2-4bit-b", jz4770_mmc2_4bit_b, 0), 1314bb42b593SPaul Cercueil INGENIC_PIN_GROUP("mmc2-1bit-e", jz4770_mmc2_1bit_e, 2), 1315bb42b593SPaul Cercueil INGENIC_PIN_GROUP("mmc2-4bit-e", jz4770_mmc2_4bit_e, 2), 1316bb42b593SPaul Cercueil INGENIC_PIN_GROUP("mmc2-8bit-e", jz4770_mmc2_8bit_e, 2), 1317bb42b593SPaul Cercueil INGENIC_PIN_GROUP("nemc-8bit-data", jz4770_nemc_8bit_data, 0), 1318bb42b593SPaul Cercueil INGENIC_PIN_GROUP("nemc-16bit-data", jz4770_nemc_16bit_data, 0), 1319bb42b593SPaul Cercueil INGENIC_PIN_GROUP("nemc-cle-ale", jz4770_nemc_cle_ale, 0), 1320bb42b593SPaul Cercueil INGENIC_PIN_GROUP("nemc-addr", jz4770_nemc_addr, 0), 1321bb42b593SPaul Cercueil INGENIC_PIN_GROUP("nemc-rd-we", jz4770_nemc_rd_we, 0), 1322bb42b593SPaul Cercueil INGENIC_PIN_GROUP("nemc-frd-fwe", jz4770_nemc_frd_fwe, 0), 1323bb42b593SPaul Cercueil INGENIC_PIN_GROUP("nemc-wait", jz4770_nemc_wait, 0), 1324bb42b593SPaul Cercueil INGENIC_PIN_GROUP("nemc-cs1", jz4770_nemc_cs1, 0), 1325bb42b593SPaul Cercueil INGENIC_PIN_GROUP("nemc-cs2", jz4770_nemc_cs2, 0), 1326bb42b593SPaul Cercueil INGENIC_PIN_GROUP("nemc-cs3", jz4770_nemc_cs3, 0), 1327bb42b593SPaul Cercueil INGENIC_PIN_GROUP("nemc-cs4", jz4770_nemc_cs4, 0), 1328bb42b593SPaul Cercueil INGENIC_PIN_GROUP("nemc-cs5", jz4770_nemc_cs5, 0), 1329bb42b593SPaul Cercueil INGENIC_PIN_GROUP("nemc-cs6", jz4770_nemc_cs6, 0), 1330bb42b593SPaul Cercueil INGENIC_PIN_GROUP("i2c0-data", jz4770_i2c0, 0), 1331bb42b593SPaul Cercueil INGENIC_PIN_GROUP("i2c1-data", jz4770_i2c1, 0), 1332bb42b593SPaul Cercueil INGENIC_PIN_GROUP("i2c2-data", jz4770_i2c2, 2), 1333bb42b593SPaul Cercueil INGENIC_PIN_GROUP("cim-data-8bit", jz4770_cim_8bit, 0), 1334bb42b593SPaul Cercueil INGENIC_PIN_GROUP("cim-data-12bit", jz4770_cim_12bit, 0), 1335016e054dSPaul Cercueil INGENIC_PIN_GROUP("lcd-8bit", jz4770_lcd_8bit, 0), 13365e6332a7S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("lcd-16bit", jz4770_lcd_16bit, 0), 13375e6332a7S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("lcd-18bit", jz4770_lcd_18bit, 0), 1338bb42b593SPaul Cercueil INGENIC_PIN_GROUP("lcd-24bit", jz4770_lcd_24bit, 0), 13395e6332a7S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("lcd-special", jz4770_lcd_special, 1), 13405e6332a7S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("lcd-generic", jz4770_lcd_generic, 0), 1341bb42b593SPaul Cercueil INGENIC_PIN_GROUP("pwm0", jz4770_pwm_pwm0, 0), 1342bb42b593SPaul Cercueil INGENIC_PIN_GROUP("pwm1", jz4770_pwm_pwm1, 0), 1343bb42b593SPaul Cercueil INGENIC_PIN_GROUP("pwm2", jz4770_pwm_pwm2, 0), 1344bb42b593SPaul Cercueil INGENIC_PIN_GROUP("pwm3", jz4770_pwm_pwm3, 0), 1345bb42b593SPaul Cercueil INGENIC_PIN_GROUP("pwm4", jz4770_pwm_pwm4, 0), 1346bb42b593SPaul Cercueil INGENIC_PIN_GROUP("pwm5", jz4770_pwm_pwm5, 0), 1347bb42b593SPaul Cercueil INGENIC_PIN_GROUP("pwm6", jz4770_pwm_pwm6, 0), 1348bb42b593SPaul Cercueil INGENIC_PIN_GROUP("pwm7", jz4770_pwm_pwm7, 0), 1349bb42b593SPaul Cercueil INGENIC_PIN_GROUP("mac-rmii", jz4770_mac_rmii, 0), 1350bb42b593SPaul Cercueil INGENIC_PIN_GROUP("mac-mii", jz4770_mac_mii, 0), 1351dd1ccfd6SPaul Cercueil INGENIC_PIN_GROUP("otg-vbus", jz4760_otg, 0), 1352b5c23aa4SPaul Cercueil }; 1353b5c23aa4SPaul Cercueil 1354b5c23aa4SPaul Cercueil static const char *jz4770_uart0_groups[] = { "uart0-data", "uart0-hwflow", }; 1355b5c23aa4SPaul Cercueil static const char *jz4770_uart1_groups[] = { "uart1-data", "uart1-hwflow", }; 1356b5c23aa4SPaul Cercueil static const char *jz4770_uart2_groups[] = { "uart2-data", "uart2-hwflow", }; 1357b5c23aa4SPaul Cercueil static const char *jz4770_uart3_groups[] = { "uart3-data", "uart3-hwflow", }; 1358d3ef8c6bS周琰杰 (Zhou Yanjie) static const char *jz4770_ssi0_groups[] = { 1359d3ef8c6bS周琰杰 (Zhou Yanjie) "ssi0-dt-a", "ssi0-dt-b", "ssi0-dt-d", "ssi0-dt-e", 1360d3ef8c6bS周琰杰 (Zhou Yanjie) "ssi0-dr-a", "ssi0-dr-b", "ssi0-dr-d", "ssi0-dr-e", 1361d3ef8c6bS周琰杰 (Zhou Yanjie) "ssi0-clk-a", "ssi0-clk-b", "ssi0-clk-d", "ssi0-clk-e", 1362d3ef8c6bS周琰杰 (Zhou Yanjie) "ssi0-gpc-b", "ssi0-gpc-d", "ssi0-gpc-e", 1363d3ef8c6bS周琰杰 (Zhou Yanjie) "ssi0-ce0-a", "ssi0-ce0-b", "ssi0-ce0-d", "ssi0-ce0-e", 1364d3ef8c6bS周琰杰 (Zhou Yanjie) "ssi0-ce1-b", "ssi0-ce1-d", "ssi0-ce1-e", 1365d3ef8c6bS周琰杰 (Zhou Yanjie) }; 1366d3ef8c6bS周琰杰 (Zhou Yanjie) static const char *jz4770_ssi1_groups[] = { 1367d3ef8c6bS周琰杰 (Zhou Yanjie) "ssi1-dt-b", "ssi1-dt-d", "ssi1-dt-e", 1368d3ef8c6bS周琰杰 (Zhou Yanjie) "ssi1-dr-b", "ssi1-dr-d", "ssi1-dr-e", 1369d3ef8c6bS周琰杰 (Zhou Yanjie) "ssi1-clk-b", "ssi1-clk-d", "ssi1-clk-e", 1370d3ef8c6bS周琰杰 (Zhou Yanjie) "ssi1-gpc-b", "ssi1-gpc-d", "ssi1-gpc-e", 1371d3ef8c6bS周琰杰 (Zhou Yanjie) "ssi1-ce0-b", "ssi1-ce0-d", "ssi1-ce0-e", 1372d3ef8c6bS周琰杰 (Zhou Yanjie) "ssi1-ce1-b", "ssi1-ce1-d", "ssi1-ce1-e", 1373d3ef8c6bS周琰杰 (Zhou Yanjie) }; 1374b5c23aa4SPaul Cercueil static const char *jz4770_mmc0_groups[] = { 1375ff656e47SZhou Yanjie "mmc0-1bit-a", "mmc0-4bit-a", 1376ff656e47SZhou Yanjie "mmc0-1bit-e", "mmc0-4bit-e", "mmc0-8bit-e", 1377b5c23aa4SPaul Cercueil }; 1378b5c23aa4SPaul Cercueil static const char *jz4770_mmc1_groups[] = { 1379ff656e47SZhou Yanjie "mmc1-1bit-d", "mmc1-4bit-d", 1380ff656e47SZhou Yanjie "mmc1-1bit-e", "mmc1-4bit-e", "mmc1-8bit-e", 1381b5c23aa4SPaul Cercueil }; 13825de1a73eSZhou Yanjie static const char *jz4770_mmc2_groups[] = { 13835de1a73eSZhou Yanjie "mmc2-1bit-b", "mmc2-4bit-b", 13845de1a73eSZhou Yanjie "mmc2-1bit-e", "mmc2-4bit-e", "mmc2-8bit-e", 13855de1a73eSZhou Yanjie }; 1386b5c23aa4SPaul Cercueil static const char *jz4770_nemc_groups[] = { 1387ff656e47SZhou Yanjie "nemc-8bit-data", "nemc-16bit-data", "nemc-cle-ale", 13885de1a73eSZhou Yanjie "nemc-addr", "nemc-rd-we", "nemc-frd-fwe", "nemc-wait", 1389b5c23aa4SPaul Cercueil }; 1390b5c23aa4SPaul Cercueil static const char *jz4770_cs1_groups[] = { "nemc-cs1", }; 1391ff656e47SZhou Yanjie static const char *jz4770_cs2_groups[] = { "nemc-cs2", }; 1392ff656e47SZhou Yanjie static const char *jz4770_cs3_groups[] = { "nemc-cs3", }; 1393ff656e47SZhou Yanjie static const char *jz4770_cs4_groups[] = { "nemc-cs4", }; 1394ff656e47SZhou Yanjie static const char *jz4770_cs5_groups[] = { "nemc-cs5", }; 1395b5c23aa4SPaul Cercueil static const char *jz4770_cs6_groups[] = { "nemc-cs6", }; 1396b5c23aa4SPaul Cercueil static const char *jz4770_i2c0_groups[] = { "i2c0-data", }; 1397b5c23aa4SPaul Cercueil static const char *jz4770_i2c1_groups[] = { "i2c1-data", }; 1398b5c23aa4SPaul Cercueil static const char *jz4770_i2c2_groups[] = { "i2c2-data", }; 1399ff656e47SZhou Yanjie static const char *jz4770_cim_groups[] = { "cim-data-8bit", "cim-data-12bit", }; 1400016e054dSPaul Cercueil static const char *jz4770_lcd_groups[] = { 14015e6332a7S周琰杰 (Zhou Yanjie) "lcd-8bit", "lcd-16bit", "lcd-18bit", "lcd-24bit", 14025e6332a7S周琰杰 (Zhou Yanjie) "lcd-special", "lcd-generic", 1403016e054dSPaul Cercueil }; 1404b5c23aa4SPaul Cercueil static const char *jz4770_pwm0_groups[] = { "pwm0", }; 1405b5c23aa4SPaul Cercueil static const char *jz4770_pwm1_groups[] = { "pwm1", }; 1406b5c23aa4SPaul Cercueil static const char *jz4770_pwm2_groups[] = { "pwm2", }; 1407b5c23aa4SPaul Cercueil static const char *jz4770_pwm3_groups[] = { "pwm3", }; 1408b5c23aa4SPaul Cercueil static const char *jz4770_pwm4_groups[] = { "pwm4", }; 1409b5c23aa4SPaul Cercueil static const char *jz4770_pwm5_groups[] = { "pwm5", }; 1410b5c23aa4SPaul Cercueil static const char *jz4770_pwm6_groups[] = { "pwm6", }; 1411b5c23aa4SPaul Cercueil static const char *jz4770_pwm7_groups[] = { "pwm7", }; 14125de1a73eSZhou Yanjie static const char *jz4770_mac_groups[] = { "mac-rmii", "mac-mii", }; 1413b5c23aa4SPaul Cercueil 1414b5c23aa4SPaul Cercueil static const struct function_desc jz4770_functions[] = { 1415b5c23aa4SPaul Cercueil { "uart0", jz4770_uart0_groups, ARRAY_SIZE(jz4770_uart0_groups), }, 1416b5c23aa4SPaul Cercueil { "uart1", jz4770_uart1_groups, ARRAY_SIZE(jz4770_uart1_groups), }, 1417b5c23aa4SPaul Cercueil { "uart2", jz4770_uart2_groups, ARRAY_SIZE(jz4770_uart2_groups), }, 1418b5c23aa4SPaul Cercueil { "uart3", jz4770_uart3_groups, ARRAY_SIZE(jz4770_uart3_groups), }, 1419d3ef8c6bS周琰杰 (Zhou Yanjie) { "ssi0", jz4770_ssi0_groups, ARRAY_SIZE(jz4770_ssi0_groups), }, 1420d3ef8c6bS周琰杰 (Zhou Yanjie) { "ssi1", jz4770_ssi1_groups, ARRAY_SIZE(jz4770_ssi1_groups), }, 1421b5c23aa4SPaul Cercueil { "mmc0", jz4770_mmc0_groups, ARRAY_SIZE(jz4770_mmc0_groups), }, 1422b5c23aa4SPaul Cercueil { "mmc1", jz4770_mmc1_groups, ARRAY_SIZE(jz4770_mmc1_groups), }, 14235de1a73eSZhou Yanjie { "mmc2", jz4770_mmc2_groups, ARRAY_SIZE(jz4770_mmc2_groups), }, 1424b5c23aa4SPaul Cercueil { "nemc", jz4770_nemc_groups, ARRAY_SIZE(jz4770_nemc_groups), }, 1425b5c23aa4SPaul Cercueil { "nemc-cs1", jz4770_cs1_groups, ARRAY_SIZE(jz4770_cs1_groups), }, 1426ff656e47SZhou Yanjie { "nemc-cs2", jz4770_cs2_groups, ARRAY_SIZE(jz4770_cs2_groups), }, 1427ff656e47SZhou Yanjie { "nemc-cs3", jz4770_cs3_groups, ARRAY_SIZE(jz4770_cs3_groups), }, 1428ff656e47SZhou Yanjie { "nemc-cs4", jz4770_cs4_groups, ARRAY_SIZE(jz4770_cs4_groups), }, 1429ff656e47SZhou Yanjie { "nemc-cs5", jz4770_cs5_groups, ARRAY_SIZE(jz4770_cs5_groups), }, 1430b5c23aa4SPaul Cercueil { "nemc-cs6", jz4770_cs6_groups, ARRAY_SIZE(jz4770_cs6_groups), }, 1431b5c23aa4SPaul Cercueil { "i2c0", jz4770_i2c0_groups, ARRAY_SIZE(jz4770_i2c0_groups), }, 1432b5c23aa4SPaul Cercueil { "i2c1", jz4770_i2c1_groups, ARRAY_SIZE(jz4770_i2c1_groups), }, 1433b5c23aa4SPaul Cercueil { "i2c2", jz4770_i2c2_groups, ARRAY_SIZE(jz4770_i2c2_groups), }, 1434b5c23aa4SPaul Cercueil { "cim", jz4770_cim_groups, ARRAY_SIZE(jz4770_cim_groups), }, 1435b5c23aa4SPaul Cercueil { "lcd", jz4770_lcd_groups, ARRAY_SIZE(jz4770_lcd_groups), }, 1436b5c23aa4SPaul Cercueil { "pwm0", jz4770_pwm0_groups, ARRAY_SIZE(jz4770_pwm0_groups), }, 1437b5c23aa4SPaul Cercueil { "pwm1", jz4770_pwm1_groups, ARRAY_SIZE(jz4770_pwm1_groups), }, 1438b5c23aa4SPaul Cercueil { "pwm2", jz4770_pwm2_groups, ARRAY_SIZE(jz4770_pwm2_groups), }, 1439b5c23aa4SPaul Cercueil { "pwm3", jz4770_pwm3_groups, ARRAY_SIZE(jz4770_pwm3_groups), }, 1440b5c23aa4SPaul Cercueil { "pwm4", jz4770_pwm4_groups, ARRAY_SIZE(jz4770_pwm4_groups), }, 1441b5c23aa4SPaul Cercueil { "pwm5", jz4770_pwm5_groups, ARRAY_SIZE(jz4770_pwm5_groups), }, 1442b5c23aa4SPaul Cercueil { "pwm6", jz4770_pwm6_groups, ARRAY_SIZE(jz4770_pwm6_groups), }, 1443b5c23aa4SPaul Cercueil { "pwm7", jz4770_pwm7_groups, ARRAY_SIZE(jz4770_pwm7_groups), }, 14445de1a73eSZhou Yanjie { "mac", jz4770_mac_groups, ARRAY_SIZE(jz4770_mac_groups), }, 1445dd1ccfd6SPaul Cercueil { "otg", jz4760_otg_groups, ARRAY_SIZE(jz4760_otg_groups), }, 1446b5c23aa4SPaul Cercueil }; 1447b5c23aa4SPaul Cercueil 1448b5c23aa4SPaul Cercueil static const struct ingenic_chip_info jz4770_chip_info = { 1449b5c23aa4SPaul Cercueil .num_chips = 6, 1450f742e5ebS周琰杰 (Zhou Yanjie) .reg_offset = 0x100, 1451baf15647SPaul Cercueil .version = ID_JZ4770, 1452b5c23aa4SPaul Cercueil .groups = jz4770_groups, 1453b5c23aa4SPaul Cercueil .num_groups = ARRAY_SIZE(jz4770_groups), 1454b5c23aa4SPaul Cercueil .functions = jz4770_functions, 1455b5c23aa4SPaul Cercueil .num_functions = ARRAY_SIZE(jz4770_functions), 1456b5c23aa4SPaul Cercueil .pull_ups = jz4770_pull_ups, 1457b5c23aa4SPaul Cercueil .pull_downs = jz4770_pull_downs, 1458b5c23aa4SPaul Cercueil }; 1459b5c23aa4SPaul Cercueil 14600c990740S周琰杰 (Zhou Yanjie) static const u32 jz4775_pull_ups[7] = { 14610c990740S周琰杰 (Zhou Yanjie) 0x28ff00ff, 0xf030f3fc, 0x0fffffff, 0xfffe4000, 0xf0f0000c, 0x0000f00f, 0x0000f3c0, 14620c990740S周琰杰 (Zhou Yanjie) }; 14630c990740S周琰杰 (Zhou Yanjie) 14640c990740S周琰杰 (Zhou Yanjie) static const u32 jz4775_pull_downs[7] = { 14650c990740S周琰杰 (Zhou Yanjie) 0x00000000, 0x00030c03, 0x00000000, 0x00008000, 0x00000403, 0x00000ff0, 0x00030c00, 14660c990740S周琰杰 (Zhou Yanjie) }; 14670c990740S周琰杰 (Zhou Yanjie) 14680c990740S周琰杰 (Zhou Yanjie) static int jz4775_uart0_data_pins[] = { 0xa0, 0xa3, }; 14690c990740S周琰杰 (Zhou Yanjie) static int jz4775_uart0_hwflow_pins[] = { 0xa1, 0xa2, }; 14700c990740S周琰杰 (Zhou Yanjie) static int jz4775_uart1_data_pins[] = { 0x7a, 0x7c, }; 14710c990740S周琰杰 (Zhou Yanjie) static int jz4775_uart1_hwflow_pins[] = { 0x7b, 0x7d, }; 14720c990740S周琰杰 (Zhou Yanjie) static int jz4775_uart2_data_c_pins[] = { 0x54, 0x4a, }; 14730c990740S周琰杰 (Zhou Yanjie) static int jz4775_uart2_data_f_pins[] = { 0xa5, 0xa4, }; 14740c990740S周琰杰 (Zhou Yanjie) static int jz4775_uart3_data_pins[] = { 0x1e, 0x1f, }; 14750c990740S周琰杰 (Zhou Yanjie) static int jz4775_ssi_dt_a_pins[] = { 0x13, }; 14760c990740S周琰杰 (Zhou Yanjie) static int jz4775_ssi_dt_d_pins[] = { 0x75, }; 14770c990740S周琰杰 (Zhou Yanjie) static int jz4775_ssi_dr_a_pins[] = { 0x14, }; 14780c990740S周琰杰 (Zhou Yanjie) static int jz4775_ssi_dr_d_pins[] = { 0x74, }; 14790c990740S周琰杰 (Zhou Yanjie) static int jz4775_ssi_clk_a_pins[] = { 0x12, }; 14800c990740S周琰杰 (Zhou Yanjie) static int jz4775_ssi_clk_d_pins[] = { 0x78, }; 14810c990740S周琰杰 (Zhou Yanjie) static int jz4775_ssi_gpc_pins[] = { 0x76, }; 14820c990740S周琰杰 (Zhou Yanjie) static int jz4775_ssi_ce0_a_pins[] = { 0x17, }; 14830c990740S周琰杰 (Zhou Yanjie) static int jz4775_ssi_ce0_d_pins[] = { 0x79, }; 14840c990740S周琰杰 (Zhou Yanjie) static int jz4775_ssi_ce1_pins[] = { 0x77, }; 14850c990740S周琰杰 (Zhou Yanjie) static int jz4775_mmc0_1bit_a_pins[] = { 0x12, 0x13, 0x14, }; 14860c990740S周琰杰 (Zhou Yanjie) static int jz4775_mmc0_4bit_a_pins[] = { 0x15, 0x16, 0x17, }; 14870c990740S周琰杰 (Zhou Yanjie) static int jz4775_mmc0_8bit_a_pins[] = { 0x04, 0x05, 0x06, 0x07, }; 14880c990740S周琰杰 (Zhou Yanjie) static int jz4775_mmc0_1bit_e_pins[] = { 0x9c, 0x9d, 0x94, }; 14890c990740S周琰杰 (Zhou Yanjie) static int jz4775_mmc0_4bit_e_pins[] = { 0x95, 0x96, 0x97, }; 14900c990740S周琰杰 (Zhou Yanjie) static int jz4775_mmc1_1bit_d_pins[] = { 0x78, 0x79, 0x74, }; 14910c990740S周琰杰 (Zhou Yanjie) static int jz4775_mmc1_4bit_d_pins[] = { 0x75, 0x76, 0x77, }; 14920c990740S周琰杰 (Zhou Yanjie) static int jz4775_mmc1_1bit_e_pins[] = { 0x9c, 0x9d, 0x94, }; 14930c990740S周琰杰 (Zhou Yanjie) static int jz4775_mmc1_4bit_e_pins[] = { 0x95, 0x96, 0x97, }; 14940c990740S周琰杰 (Zhou Yanjie) static int jz4775_mmc2_1bit_b_pins[] = { 0x3c, 0x3d, 0x34, }; 14950c990740S周琰杰 (Zhou Yanjie) static int jz4775_mmc2_4bit_b_pins[] = { 0x35, 0x3e, 0x3f, }; 14960c990740S周琰杰 (Zhou Yanjie) static int jz4775_mmc2_1bit_e_pins[] = { 0x9c, 0x9d, 0x94, }; 14970c990740S周琰杰 (Zhou Yanjie) static int jz4775_mmc2_4bit_e_pins[] = { 0x95, 0x96, 0x97, }; 14980c990740S周琰杰 (Zhou Yanjie) static int jz4775_nemc_8bit_data_pins[] = { 14990c990740S周琰杰 (Zhou Yanjie) 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 15000c990740S周琰杰 (Zhou Yanjie) }; 15010c990740S周琰杰 (Zhou Yanjie) static int jz4775_nemc_16bit_data_pins[] = { 15020c990740S周琰杰 (Zhou Yanjie) 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0, 0xd1, 15030c990740S周琰杰 (Zhou Yanjie) }; 15040c990740S周琰杰 (Zhou Yanjie) static int jz4775_nemc_cle_ale_pins[] = { 0x20, 0x21, }; 15050c990740S周琰杰 (Zhou Yanjie) static int jz4775_nemc_addr_pins[] = { 0x22, 0x23, 0x24, 0x25, }; 15060c990740S周琰杰 (Zhou Yanjie) static int jz4775_nemc_rd_we_pins[] = { 0x10, 0x11, }; 15070c990740S周琰杰 (Zhou Yanjie) static int jz4775_nemc_frd_fwe_pins[] = { 0x12, 0x13, }; 15080c990740S周琰杰 (Zhou Yanjie) static int jz4775_nemc_wait_pins[] = { 0x1b, }; 15090c990740S周琰杰 (Zhou Yanjie) static int jz4775_nemc_cs1_pins[] = { 0x15, }; 15100c990740S周琰杰 (Zhou Yanjie) static int jz4775_nemc_cs2_pins[] = { 0x16, }; 15110c990740S周琰杰 (Zhou Yanjie) static int jz4775_nemc_cs3_pins[] = { 0x17, }; 15120c990740S周琰杰 (Zhou Yanjie) static int jz4775_i2c0_pins[] = { 0x7e, 0x7f, }; 15130c990740S周琰杰 (Zhou Yanjie) static int jz4775_i2c1_pins[] = { 0x9e, 0x9f, }; 15140c990740S周琰杰 (Zhou Yanjie) static int jz4775_i2c2_pins[] = { 0x80, 0x83, }; 15150c990740S周琰杰 (Zhou Yanjie) static int jz4775_i2s_data_tx_pins[] = { 0xa3, }; 15160c990740S周琰杰 (Zhou Yanjie) static int jz4775_i2s_data_rx_pins[] = { 0xa2, }; 15170c990740S周琰杰 (Zhou Yanjie) static int jz4775_i2s_clk_txrx_pins[] = { 0xa0, 0xa1, }; 15180c990740S周琰杰 (Zhou Yanjie) static int jz4775_i2s_sysclk_pins[] = { 0x83, }; 15190c990740S周琰杰 (Zhou Yanjie) static int jz4775_dmic_pins[] = { 0xaa, 0xab, }; 15200c990740S周琰杰 (Zhou Yanjie) static int jz4775_cim_pins[] = { 15210c990740S周琰杰 (Zhou Yanjie) 0x26, 0x27, 0x28, 0x29, 15220c990740S周琰杰 (Zhou Yanjie) 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 15230c990740S周琰杰 (Zhou Yanjie) }; 15240c990740S周琰杰 (Zhou Yanjie) static int jz4775_lcd_8bit_pins[] = { 15250c990740S周琰杰 (Zhou Yanjie) 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x4c, 0x4d, 15260c990740S周琰杰 (Zhou Yanjie) 0x48, 0x52, 0x53, 15270c990740S周琰杰 (Zhou Yanjie) }; 15280c990740S周琰杰 (Zhou Yanjie) static int jz4775_lcd_16bit_pins[] = { 15290c990740S周琰杰 (Zhou Yanjie) 0x4e, 0x4f, 0x50, 0x51, 0x56, 0x57, 0x58, 0x59, 15300c990740S周琰杰 (Zhou Yanjie) }; 15310c990740S周琰杰 (Zhou Yanjie) static int jz4775_lcd_18bit_pins[] = { 15320c990740S周琰杰 (Zhou Yanjie) 0x5a, 0x5b, 15330c990740S周琰杰 (Zhou Yanjie) }; 15340c990740S周琰杰 (Zhou Yanjie) static int jz4775_lcd_24bit_pins[] = { 15350c990740S周琰杰 (Zhou Yanjie) 0x40, 0x41, 0x4a, 0x4b, 0x54, 0x55, 15360c990740S周琰杰 (Zhou Yanjie) }; 15370c990740S周琰杰 (Zhou Yanjie) static int jz4775_lcd_special_pins[] = { 0x54, 0x4a, 0x41, 0x40, }; 15380c990740S周琰杰 (Zhou Yanjie) static int jz4775_lcd_generic_pins[] = { 0x49, }; 15390c990740S周琰杰 (Zhou Yanjie) static int jz4775_pwm_pwm0_pins[] = { 0x80, }; 15400c990740S周琰杰 (Zhou Yanjie) static int jz4775_pwm_pwm1_pins[] = { 0x81, }; 15410c990740S周琰杰 (Zhou Yanjie) static int jz4775_pwm_pwm2_pins[] = { 0x82, }; 15420c990740S周琰杰 (Zhou Yanjie) static int jz4775_pwm_pwm3_pins[] = { 0x83, }; 15430c990740S周琰杰 (Zhou Yanjie) static int jz4775_mac_rmii_pins[] = { 15440c990740S周琰杰 (Zhou Yanjie) 0xa9, 0xab, 0xaa, 0xac, 0xa5, 0xa4, 0xad, 0xae, 0xa6, 0xa8, 15450c990740S周琰杰 (Zhou Yanjie) }; 15460c990740S周琰杰 (Zhou Yanjie) static int jz4775_mac_mii_pins[] = { 15470c990740S周琰杰 (Zhou Yanjie) 0x7b, 0x7a, 0x7d, 0x7c, 0xa7, 0x24, 0xaf, 15480c990740S周琰杰 (Zhou Yanjie) }; 15490c990740S周琰杰 (Zhou Yanjie) static int jz4775_mac_rgmii_pins[] = { 15500c990740S周琰杰 (Zhou Yanjie) 0xa9, 0x7b, 0x7a, 0xab, 0xaa, 0xac, 0x7d, 0x7c, 0xa5, 0xa4, 15510c990740S周琰杰 (Zhou Yanjie) 0xad, 0xae, 0xa7, 0xa6, 15520c990740S周琰杰 (Zhou Yanjie) }; 15530c990740S周琰杰 (Zhou Yanjie) static int jz4775_mac_gmii_pins[] = { 15540c990740S周琰杰 (Zhou Yanjie) 0x31, 0x30, 0x2f, 0x2e, 0x2d, 0x2c, 0x2b, 0x2a, 15550c990740S周琰杰 (Zhou Yanjie) 0xa8, 0x28, 0x24, 0xaf, 15560c990740S周琰杰 (Zhou Yanjie) }; 15570c990740S周琰杰 (Zhou Yanjie) static int jz4775_otg_pins[] = { 0x8a, }; 15580c990740S周琰杰 (Zhou Yanjie) 15590c990740S周琰杰 (Zhou Yanjie) static u8 jz4775_uart3_data_funcs[] = { 0, 1, }; 15600c990740S周琰杰 (Zhou Yanjie) static u8 jz4775_mac_mii_funcs[] = { 1, 1, 1, 1, 0, 1, 0, }; 15610c990740S周琰杰 (Zhou Yanjie) static u8 jz4775_mac_rgmii_funcs[] = { 15620c990740S周琰杰 (Zhou Yanjie) 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 15630c990740S周琰杰 (Zhou Yanjie) 0, 0, 0, 0, 15640c990740S周琰杰 (Zhou Yanjie) }; 15650c990740S周琰杰 (Zhou Yanjie) static u8 jz4775_mac_gmii_funcs[] = { 15660c990740S周琰杰 (Zhou Yanjie) 1, 1, 1, 1, 1, 1, 1, 1, 15670c990740S周琰杰 (Zhou Yanjie) 0, 1, 1, 0, 15680c990740S周琰杰 (Zhou Yanjie) }; 15690c990740S周琰杰 (Zhou Yanjie) 15700c990740S周琰杰 (Zhou Yanjie) static const struct group_desc jz4775_groups[] = { 15710c990740S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("uart0-data", jz4775_uart0_data, 0), 15720c990740S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("uart0-hwflow", jz4775_uart0_hwflow, 0), 15730c990740S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("uart1-data", jz4775_uart1_data, 0), 15740c990740S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("uart1-hwflow", jz4775_uart1_hwflow, 0), 15750c990740S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("uart2-data-c", jz4775_uart2_data_c, 2), 15760c990740S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("uart2-data-f", jz4775_uart2_data_f, 1), 15770c990740S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP_FUNCS("uart3-data", jz4775_uart3_data, 15780c990740S周琰杰 (Zhou Yanjie) jz4775_uart3_data_funcs), 15790c990740S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi-dt-a", jz4775_ssi_dt_a, 2), 15800c990740S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi-dt-d", jz4775_ssi_dt_d, 1), 15810c990740S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi-dr-a", jz4775_ssi_dr_a, 2), 15820c990740S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi-dr-d", jz4775_ssi_dr_d, 1), 15830c990740S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi-clk-a", jz4775_ssi_clk_a, 2), 15840c990740S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi-clk-d", jz4775_ssi_clk_d, 1), 15850c990740S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi-gpc", jz4775_ssi_gpc, 1), 15860c990740S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi-ce0-a", jz4775_ssi_ce0_a, 2), 15870c990740S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi-ce0-d", jz4775_ssi_ce0_d, 1), 15880c990740S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi-ce1", jz4775_ssi_ce1, 1), 15890c990740S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("mmc0-1bit-a", jz4775_mmc0_1bit_a, 1), 15900c990740S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("mmc0-4bit-a", jz4775_mmc0_4bit_a, 1), 15910c990740S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("mmc0-8bit-a", jz4775_mmc0_8bit_a, 1), 15920c990740S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("mmc0-1bit-e", jz4775_mmc0_1bit_e, 0), 15930c990740S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("mmc0-4bit-e", jz4775_mmc0_4bit_e, 0), 15940c990740S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("mmc1-1bit-d", jz4775_mmc1_1bit_d, 0), 15950c990740S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("mmc1-4bit-d", jz4775_mmc1_4bit_d, 0), 15960c990740S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("mmc1-1bit-e", jz4775_mmc1_1bit_e, 1), 15970c990740S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("mmc1-4bit-e", jz4775_mmc1_4bit_e, 1), 15980c990740S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("mmc2-1bit-b", jz4775_mmc2_1bit_b, 0), 15990c990740S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("mmc2-4bit-b", jz4775_mmc2_4bit_b, 0), 16000c990740S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("mmc2-1bit-e", jz4775_mmc2_1bit_e, 2), 16010c990740S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("mmc2-4bit-e", jz4775_mmc2_4bit_e, 2), 16020c990740S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("nemc-8bit-data", jz4775_nemc_8bit_data, 0), 16030c990740S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("nemc-16bit-data", jz4775_nemc_16bit_data, 1), 16040c990740S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("nemc-cle-ale", jz4775_nemc_cle_ale, 0), 16050c990740S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("nemc-addr", jz4775_nemc_addr, 0), 16060c990740S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("nemc-rd-we", jz4775_nemc_rd_we, 0), 16070c990740S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("nemc-frd-fwe", jz4775_nemc_frd_fwe, 0), 16080c990740S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("nemc-wait", jz4775_nemc_wait, 0), 16090c990740S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("nemc-cs1", jz4775_nemc_cs1, 0), 16100c990740S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("nemc-cs2", jz4775_nemc_cs2, 0), 16110c990740S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("nemc-cs3", jz4775_nemc_cs3, 0), 16120c990740S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("i2c0-data", jz4775_i2c0, 0), 16130c990740S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("i2c1-data", jz4775_i2c1, 0), 16140c990740S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("i2c2-data", jz4775_i2c2, 1), 16150c990740S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("i2s-data-tx", jz4775_i2s_data_tx, 1), 16160c990740S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("i2s-data-rx", jz4775_i2s_data_rx, 1), 16170c990740S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("i2s-clk-txrx", jz4775_i2s_clk_txrx, 1), 16180c990740S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("i2s-sysclk", jz4775_i2s_sysclk, 2), 16190c990740S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("dmic", jz4775_dmic, 1), 16200c990740S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("cim-data", jz4775_cim, 0), 16210c990740S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("lcd-8bit", jz4775_lcd_8bit, 0), 16220c990740S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("lcd-16bit", jz4775_lcd_16bit, 0), 16230c990740S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("lcd-18bit", jz4775_lcd_18bit, 0), 16240c990740S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("lcd-24bit", jz4775_lcd_24bit, 0), 16250c990740S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("lcd-generic", jz4775_lcd_generic, 0), 16260c990740S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("lcd-special", jz4775_lcd_special, 1), 16270c990740S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("pwm0", jz4775_pwm_pwm0, 0), 16280c990740S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("pwm1", jz4775_pwm_pwm1, 0), 16290c990740S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("pwm2", jz4775_pwm_pwm2, 0), 16300c990740S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("pwm3", jz4775_pwm_pwm3, 0), 16310c990740S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("mac-rmii", jz4775_mac_rmii, 0), 16320c990740S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP_FUNCS("mac-mii", jz4775_mac_mii, 16330c990740S周琰杰 (Zhou Yanjie) jz4775_mac_mii_funcs), 16340c990740S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP_FUNCS("mac-rgmii", jz4775_mac_rgmii, 16350c990740S周琰杰 (Zhou Yanjie) jz4775_mac_rgmii_funcs), 16360c990740S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP_FUNCS("mac-gmii", jz4775_mac_gmii, 16370c990740S周琰杰 (Zhou Yanjie) jz4775_mac_gmii_funcs), 16380c990740S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("otg-vbus", jz4775_otg, 0), 16390c990740S周琰杰 (Zhou Yanjie) }; 16400c990740S周琰杰 (Zhou Yanjie) 16410c990740S周琰杰 (Zhou Yanjie) static const char *jz4775_uart0_groups[] = { "uart0-data", "uart0-hwflow", }; 16420c990740S周琰杰 (Zhou Yanjie) static const char *jz4775_uart1_groups[] = { "uart1-data", "uart1-hwflow", }; 16430c990740S周琰杰 (Zhou Yanjie) static const char *jz4775_uart2_groups[] = { "uart2-data-c", "uart2-data-f", }; 16440c990740S周琰杰 (Zhou Yanjie) static const char *jz4775_uart3_groups[] = { "uart3-data", }; 16450c990740S周琰杰 (Zhou Yanjie) static const char *jz4775_ssi_groups[] = { 16460c990740S周琰杰 (Zhou Yanjie) "ssi-dt-a", "ssi-dt-d", 16470c990740S周琰杰 (Zhou Yanjie) "ssi-dr-a", "ssi-dr-d", 16480c990740S周琰杰 (Zhou Yanjie) "ssi-clk-a", "ssi-clk-d", 16490c990740S周琰杰 (Zhou Yanjie) "ssi-gpc", 16500c990740S周琰杰 (Zhou Yanjie) "ssi-ce0-a", "ssi-ce0-d", 16510c990740S周琰杰 (Zhou Yanjie) "ssi-ce1", 16520c990740S周琰杰 (Zhou Yanjie) }; 16530c990740S周琰杰 (Zhou Yanjie) static const char *jz4775_mmc0_groups[] = { 16540c990740S周琰杰 (Zhou Yanjie) "mmc0-1bit-a", "mmc0-4bit-a", "mmc0-8bit-a", 16550c990740S周琰杰 (Zhou Yanjie) "mmc0-1bit-e", "mmc0-4bit-e", 16560c990740S周琰杰 (Zhou Yanjie) }; 16570c990740S周琰杰 (Zhou Yanjie) static const char *jz4775_mmc1_groups[] = { 16580c990740S周琰杰 (Zhou Yanjie) "mmc1-1bit-d", "mmc1-4bit-d", 16590c990740S周琰杰 (Zhou Yanjie) "mmc1-1bit-e", "mmc1-4bit-e", 16600c990740S周琰杰 (Zhou Yanjie) }; 16610c990740S周琰杰 (Zhou Yanjie) static const char *jz4775_mmc2_groups[] = { 16620c990740S周琰杰 (Zhou Yanjie) "mmc2-1bit-b", "mmc2-4bit-b", 16630c990740S周琰杰 (Zhou Yanjie) "mmc2-1bit-e", "mmc2-4bit-e", 16640c990740S周琰杰 (Zhou Yanjie) }; 16650c990740S周琰杰 (Zhou Yanjie) static const char *jz4775_nemc_groups[] = { 16660c990740S周琰杰 (Zhou Yanjie) "nemc-8bit-data", "nemc-16bit-data", "nemc-cle-ale", 16670c990740S周琰杰 (Zhou Yanjie) "nemc-addr", "nemc-rd-we", "nemc-frd-fwe", "nemc-wait", 16680c990740S周琰杰 (Zhou Yanjie) }; 16690c990740S周琰杰 (Zhou Yanjie) static const char *jz4775_cs1_groups[] = { "nemc-cs1", }; 16700c990740S周琰杰 (Zhou Yanjie) static const char *jz4775_cs2_groups[] = { "nemc-cs2", }; 16710c990740S周琰杰 (Zhou Yanjie) static const char *jz4775_cs3_groups[] = { "nemc-cs3", }; 16720c990740S周琰杰 (Zhou Yanjie) static const char *jz4775_i2c0_groups[] = { "i2c0-data", }; 16730c990740S周琰杰 (Zhou Yanjie) static const char *jz4775_i2c1_groups[] = { "i2c1-data", }; 16740c990740S周琰杰 (Zhou Yanjie) static const char *jz4775_i2c2_groups[] = { "i2c2-data", }; 16750c990740S周琰杰 (Zhou Yanjie) static const char *jz4775_i2s_groups[] = { 16760c990740S周琰杰 (Zhou Yanjie) "i2s-data-tx", "i2s-data-rx", "i2s-clk-txrx", "i2s-sysclk", 16770c990740S周琰杰 (Zhou Yanjie) }; 16780c990740S周琰杰 (Zhou Yanjie) static const char *jz4775_dmic_groups[] = { "dmic", }; 16790c990740S周琰杰 (Zhou Yanjie) static const char *jz4775_cim_groups[] = { "cim-data", }; 16800c990740S周琰杰 (Zhou Yanjie) static const char *jz4775_lcd_groups[] = { 16810c990740S周琰杰 (Zhou Yanjie) "lcd-8bit", "lcd-16bit", "lcd-18bit", "lcd-24bit", 16820c990740S周琰杰 (Zhou Yanjie) "lcd-special", "lcd-generic", 16830c990740S周琰杰 (Zhou Yanjie) }; 16840c990740S周琰杰 (Zhou Yanjie) static const char *jz4775_pwm0_groups[] = { "pwm0", }; 16850c990740S周琰杰 (Zhou Yanjie) static const char *jz4775_pwm1_groups[] = { "pwm1", }; 16860c990740S周琰杰 (Zhou Yanjie) static const char *jz4775_pwm2_groups[] = { "pwm2", }; 16870c990740S周琰杰 (Zhou Yanjie) static const char *jz4775_pwm3_groups[] = { "pwm3", }; 16880c990740S周琰杰 (Zhou Yanjie) static const char *jz4775_mac_groups[] = { 16890c990740S周琰杰 (Zhou Yanjie) "mac-rmii", "mac-mii", "mac-rgmii", "mac-gmii", 16900c990740S周琰杰 (Zhou Yanjie) }; 16910c990740S周琰杰 (Zhou Yanjie) static const char *jz4775_otg_groups[] = { "otg-vbus", }; 16920c990740S周琰杰 (Zhou Yanjie) 16930c990740S周琰杰 (Zhou Yanjie) static const struct function_desc jz4775_functions[] = { 16940c990740S周琰杰 (Zhou Yanjie) { "uart0", jz4775_uart0_groups, ARRAY_SIZE(jz4775_uart0_groups), }, 16950c990740S周琰杰 (Zhou Yanjie) { "uart1", jz4775_uart1_groups, ARRAY_SIZE(jz4775_uart1_groups), }, 16960c990740S周琰杰 (Zhou Yanjie) { "uart2", jz4775_uart2_groups, ARRAY_SIZE(jz4775_uart2_groups), }, 16970c990740S周琰杰 (Zhou Yanjie) { "uart3", jz4775_uart3_groups, ARRAY_SIZE(jz4775_uart3_groups), }, 16980c990740S周琰杰 (Zhou Yanjie) { "ssi", jz4775_ssi_groups, ARRAY_SIZE(jz4775_ssi_groups), }, 16990c990740S周琰杰 (Zhou Yanjie) { "mmc0", jz4775_mmc0_groups, ARRAY_SIZE(jz4775_mmc0_groups), }, 17000c990740S周琰杰 (Zhou Yanjie) { "mmc1", jz4775_mmc1_groups, ARRAY_SIZE(jz4775_mmc1_groups), }, 17010c990740S周琰杰 (Zhou Yanjie) { "mmc2", jz4775_mmc2_groups, ARRAY_SIZE(jz4775_mmc2_groups), }, 17020c990740S周琰杰 (Zhou Yanjie) { "nemc", jz4775_nemc_groups, ARRAY_SIZE(jz4775_nemc_groups), }, 17030c990740S周琰杰 (Zhou Yanjie) { "nemc-cs1", jz4775_cs1_groups, ARRAY_SIZE(jz4775_cs1_groups), }, 17040c990740S周琰杰 (Zhou Yanjie) { "nemc-cs2", jz4775_cs2_groups, ARRAY_SIZE(jz4775_cs2_groups), }, 17050c990740S周琰杰 (Zhou Yanjie) { "nemc-cs3", jz4775_cs3_groups, ARRAY_SIZE(jz4775_cs3_groups), }, 17060c990740S周琰杰 (Zhou Yanjie) { "i2c0", jz4775_i2c0_groups, ARRAY_SIZE(jz4775_i2c0_groups), }, 17070c990740S周琰杰 (Zhou Yanjie) { "i2c1", jz4775_i2c1_groups, ARRAY_SIZE(jz4775_i2c1_groups), }, 17080c990740S周琰杰 (Zhou Yanjie) { "i2c2", jz4775_i2c2_groups, ARRAY_SIZE(jz4775_i2c2_groups), }, 17090c990740S周琰杰 (Zhou Yanjie) { "i2s", jz4775_i2s_groups, ARRAY_SIZE(jz4775_i2s_groups), }, 17100c990740S周琰杰 (Zhou Yanjie) { "dmic", jz4775_dmic_groups, ARRAY_SIZE(jz4775_dmic_groups), }, 17110c990740S周琰杰 (Zhou Yanjie) { "cim", jz4775_cim_groups, ARRAY_SIZE(jz4775_cim_groups), }, 17120c990740S周琰杰 (Zhou Yanjie) { "lcd", jz4775_lcd_groups, ARRAY_SIZE(jz4775_lcd_groups), }, 17130c990740S周琰杰 (Zhou Yanjie) { "pwm0", jz4775_pwm0_groups, ARRAY_SIZE(jz4775_pwm0_groups), }, 17140c990740S周琰杰 (Zhou Yanjie) { "pwm1", jz4775_pwm1_groups, ARRAY_SIZE(jz4775_pwm1_groups), }, 17150c990740S周琰杰 (Zhou Yanjie) { "pwm2", jz4775_pwm2_groups, ARRAY_SIZE(jz4775_pwm2_groups), }, 17160c990740S周琰杰 (Zhou Yanjie) { "pwm3", jz4775_pwm3_groups, ARRAY_SIZE(jz4775_pwm3_groups), }, 17170c990740S周琰杰 (Zhou Yanjie) { "mac", jz4775_mac_groups, ARRAY_SIZE(jz4775_mac_groups), }, 17180c990740S周琰杰 (Zhou Yanjie) { "otg", jz4775_otg_groups, ARRAY_SIZE(jz4775_otg_groups), }, 17190c990740S周琰杰 (Zhou Yanjie) }; 17200c990740S周琰杰 (Zhou Yanjie) 17210c990740S周琰杰 (Zhou Yanjie) static const struct ingenic_chip_info jz4775_chip_info = { 17220c990740S周琰杰 (Zhou Yanjie) .num_chips = 7, 17230c990740S周琰杰 (Zhou Yanjie) .reg_offset = 0x100, 17240c990740S周琰杰 (Zhou Yanjie) .version = ID_JZ4775, 17250c990740S周琰杰 (Zhou Yanjie) .groups = jz4775_groups, 17260c990740S周琰杰 (Zhou Yanjie) .num_groups = ARRAY_SIZE(jz4775_groups), 17270c990740S周琰杰 (Zhou Yanjie) .functions = jz4775_functions, 17280c990740S周琰杰 (Zhou Yanjie) .num_functions = ARRAY_SIZE(jz4775_functions), 17290c990740S周琰杰 (Zhou Yanjie) .pull_ups = jz4775_pull_ups, 17300c990740S周琰杰 (Zhou Yanjie) .pull_downs = jz4775_pull_downs, 17310c990740S周琰杰 (Zhou Yanjie) }; 17320c990740S周琰杰 (Zhou Yanjie) 1733d9f5dc49S周琰杰 (Zhou Yanjie) static const u32 jz4780_pull_ups[6] = { 1734d9f5dc49S周琰杰 (Zhou Yanjie) 0x3fffffff, 0xfff0f3fc, 0x0fffffff, 0xffff4fff, 0xfffffb7c, 0x7fa7f00f, 1735d9f5dc49S周琰杰 (Zhou Yanjie) }; 1736d9f5dc49S周琰杰 (Zhou Yanjie) 1737d9f5dc49S周琰杰 (Zhou Yanjie) static const u32 jz4780_pull_downs[6] = { 1738d9f5dc49S周琰杰 (Zhou Yanjie) 0x00000000, 0x000f0c03, 0x00000000, 0x0000b000, 0x00000483, 0x00580ff0, 1739d9f5dc49S周琰杰 (Zhou Yanjie) }; 1740d9f5dc49S周琰杰 (Zhou Yanjie) 1741ff656e47SZhou Yanjie static int jz4780_uart2_data_pins[] = { 0x66, 0x67, }; 1742ff656e47SZhou Yanjie static int jz4780_uart2_hwflow_pins[] = { 0x65, 0x64, }; 1743ff656e47SZhou Yanjie static int jz4780_uart4_data_pins[] = { 0x54, 0x4a, }; 1744d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4780_ssi0_dt_a_19_pins[] = { 0x13, }; 1745d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4780_ssi0_dt_a_21_pins[] = { 0x15, }; 1746d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4780_ssi0_dt_a_28_pins[] = { 0x1c, }; 1747d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4780_ssi0_dt_b_pins[] = { 0x3d, }; 1748f83c2609SPaul Cercueil static int jz4780_ssi0_dt_d_pins[] = { 0x79, }; 1749d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4780_ssi0_dr_a_20_pins[] = { 0x14, }; 1750d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4780_ssi0_dr_a_27_pins[] = { 0x1b, }; 1751d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4780_ssi0_dr_b_pins[] = { 0x34, }; 1752f83c2609SPaul Cercueil static int jz4780_ssi0_dr_d_pins[] = { 0x74, }; 1753d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4780_ssi0_clk_a_pins[] = { 0x12, }; 1754d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4780_ssi0_clk_b_5_pins[] = { 0x25, }; 1755d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4780_ssi0_clk_b_28_pins[] = { 0x3c, }; 1756f83c2609SPaul Cercueil static int jz4780_ssi0_clk_d_pins[] = { 0x78, }; 1757d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4780_ssi0_gpc_b_pins[] = { 0x3e, }; 1758f83c2609SPaul Cercueil static int jz4780_ssi0_gpc_d_pins[] = { 0x76, }; 1759d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4780_ssi0_ce0_a_23_pins[] = { 0x17, }; 1760d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4780_ssi0_ce0_a_25_pins[] = { 0x19, }; 1761d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4780_ssi0_ce0_b_pins[] = { 0x3f, }; 1762f83c2609SPaul Cercueil static int jz4780_ssi0_ce0_d_pins[] = { 0x77, }; 1763d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4780_ssi0_ce1_b_pins[] = { 0x35, }; 1764f83c2609SPaul Cercueil static int jz4780_ssi0_ce1_d_pins[] = { 0x75, }; 1765d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4780_ssi1_dt_b_pins[] = { 0x3d, }; 1766f83c2609SPaul Cercueil static int jz4780_ssi1_dt_d_pins[] = { 0x79, }; 1767d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4780_ssi1_dr_b_pins[] = { 0x34, }; 1768f83c2609SPaul Cercueil static int jz4780_ssi1_dr_d_pins[] = { 0x74, }; 1769d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4780_ssi1_clk_b_pins[] = { 0x3c, }; 1770f83c2609SPaul Cercueil static int jz4780_ssi1_clk_d_pins[] = { 0x78, }; 1771d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4780_ssi1_gpc_b_pins[] = { 0x3e, }; 1772f83c2609SPaul Cercueil static int jz4780_ssi1_gpc_d_pins[] = { 0x76, }; 1773d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4780_ssi1_ce0_b_pins[] = { 0x3f, }; 1774f83c2609SPaul Cercueil static int jz4780_ssi1_ce0_d_pins[] = { 0x77, }; 1775d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4780_ssi1_ce1_b_pins[] = { 0x35, }; 1776f83c2609SPaul Cercueil static int jz4780_ssi1_ce1_d_pins[] = { 0x75, }; 1777ff656e47SZhou Yanjie static int jz4780_mmc0_8bit_a_pins[] = { 0x04, 0x05, 0x06, 0x07, 0x18, }; 1778ff656e47SZhou Yanjie static int jz4780_i2c3_pins[] = { 0x6a, 0x6b, }; 1779ff656e47SZhou Yanjie static int jz4780_i2c4_e_pins[] = { 0x8c, 0x8d, }; 1780ff656e47SZhou Yanjie static int jz4780_i2c4_f_pins[] = { 0xb9, 0xb8, }; 1781f4b5c348S周琰杰 (Zhou Yanjie) static int jz4780_i2s_data_tx_pins[] = { 0x87, }; 1782f4b5c348S周琰杰 (Zhou Yanjie) static int jz4780_i2s_data_rx_pins[] = { 0x86, }; 1783f4b5c348S周琰杰 (Zhou Yanjie) static int jz4780_i2s_clk_txrx_pins[] = { 0x6c, 0x6d, }; 1784f4b5c348S周琰杰 (Zhou Yanjie) static int jz4780_i2s_clk_rx_pins[] = { 0x88, 0x89, }; 1785f4b5c348S周琰杰 (Zhou Yanjie) static int jz4780_i2s_sysclk_pins[] = { 0x85, }; 17866adf2c56S周琰杰 (Zhou Yanjie) static int jz4780_dmic_pins[] = { 0x32, 0x33, }; 1787a0bb89e8SPaul Boddie static int jz4780_hdmi_ddc_pins[] = { 0xb9, 0xb8, }; 1788ff656e47SZhou Yanjie 1789bb42b593SPaul Cercueil static u8 jz4780_i2s_clk_txrx_funcs[] = { 1, 0, }; 1790ff656e47SZhou Yanjie 1791ff656e47SZhou Yanjie static const struct group_desc jz4780_groups[] = { 1792bb42b593SPaul Cercueil INGENIC_PIN_GROUP("uart0-data", jz4770_uart0_data, 0), 1793bb42b593SPaul Cercueil INGENIC_PIN_GROUP("uart0-hwflow", jz4770_uart0_hwflow, 0), 1794bb42b593SPaul Cercueil INGENIC_PIN_GROUP("uart1-data", jz4770_uart1_data, 0), 1795bb42b593SPaul Cercueil INGENIC_PIN_GROUP("uart1-hwflow", jz4770_uart1_hwflow, 0), 1796bb42b593SPaul Cercueil INGENIC_PIN_GROUP("uart2-data", jz4780_uart2_data, 1), 1797bb42b593SPaul Cercueil INGENIC_PIN_GROUP("uart2-hwflow", jz4780_uart2_hwflow, 1), 1798bb42b593SPaul Cercueil INGENIC_PIN_GROUP_FUNCS("uart3-data", jz4770_uart3_data, 1799bb42b593SPaul Cercueil jz4760_uart3_data_funcs), 1800bb42b593SPaul Cercueil INGENIC_PIN_GROUP("uart3-hwflow", jz4770_uart3_hwflow, 0), 1801bb42b593SPaul Cercueil INGENIC_PIN_GROUP("uart4-data", jz4780_uart4_data, 2), 1802bb42b593SPaul Cercueil INGENIC_PIN_GROUP("ssi0-dt-a-19", jz4780_ssi0_dt_a_19, 2), 1803bb42b593SPaul Cercueil INGENIC_PIN_GROUP("ssi0-dt-a-21", jz4780_ssi0_dt_a_21, 2), 1804bb42b593SPaul Cercueil INGENIC_PIN_GROUP("ssi0-dt-a-28", jz4780_ssi0_dt_a_28, 2), 1805bb42b593SPaul Cercueil INGENIC_PIN_GROUP("ssi0-dt-b", jz4780_ssi0_dt_b, 1), 1806bb42b593SPaul Cercueil INGENIC_PIN_GROUP("ssi0-dt-d", jz4780_ssi0_dt_d, 1), 1807bb42b593SPaul Cercueil INGENIC_PIN_GROUP("ssi0-dt-e", jz4770_ssi0_dt_e, 0), 1808bb42b593SPaul Cercueil INGENIC_PIN_GROUP("ssi0-dr-a-20", jz4780_ssi0_dr_a_20, 2), 1809bb42b593SPaul Cercueil INGENIC_PIN_GROUP("ssi0-dr-a-27", jz4780_ssi0_dr_a_27, 2), 1810bb42b593SPaul Cercueil INGENIC_PIN_GROUP("ssi0-dr-b", jz4780_ssi0_dr_b, 1), 1811bb42b593SPaul Cercueil INGENIC_PIN_GROUP("ssi0-dr-d", jz4780_ssi0_dr_d, 1), 1812bb42b593SPaul Cercueil INGENIC_PIN_GROUP("ssi0-dr-e", jz4770_ssi0_dr_e, 0), 1813bb42b593SPaul Cercueil INGENIC_PIN_GROUP("ssi0-clk-a", jz4780_ssi0_clk_a, 2), 1814bb42b593SPaul Cercueil INGENIC_PIN_GROUP("ssi0-clk-b-5", jz4780_ssi0_clk_b_5, 1), 1815bb42b593SPaul Cercueil INGENIC_PIN_GROUP("ssi0-clk-b-28", jz4780_ssi0_clk_b_28, 1), 1816bb42b593SPaul Cercueil INGENIC_PIN_GROUP("ssi0-clk-d", jz4780_ssi0_clk_d, 1), 1817bb42b593SPaul Cercueil INGENIC_PIN_GROUP("ssi0-clk-e", jz4770_ssi0_clk_e, 0), 1818bb42b593SPaul Cercueil INGENIC_PIN_GROUP("ssi0-gpc-b", jz4780_ssi0_gpc_b, 1), 1819bb42b593SPaul Cercueil INGENIC_PIN_GROUP("ssi0-gpc-d", jz4780_ssi0_gpc_d, 1), 1820bb42b593SPaul Cercueil INGENIC_PIN_GROUP("ssi0-gpc-e", jz4770_ssi0_gpc_e, 0), 1821bb42b593SPaul Cercueil INGENIC_PIN_GROUP("ssi0-ce0-a-23", jz4780_ssi0_ce0_a_23, 2), 1822bb42b593SPaul Cercueil INGENIC_PIN_GROUP("ssi0-ce0-a-25", jz4780_ssi0_ce0_a_25, 2), 1823bb42b593SPaul Cercueil INGENIC_PIN_GROUP("ssi0-ce0-b", jz4780_ssi0_ce0_b, 1), 1824bb42b593SPaul Cercueil INGENIC_PIN_GROUP("ssi0-ce0-d", jz4780_ssi0_ce0_d, 1), 1825bb42b593SPaul Cercueil INGENIC_PIN_GROUP("ssi0-ce0-e", jz4770_ssi0_ce0_e, 0), 1826bb42b593SPaul Cercueil INGENIC_PIN_GROUP("ssi0-ce1-b", jz4780_ssi0_ce1_b, 1), 1827bb42b593SPaul Cercueil INGENIC_PIN_GROUP("ssi0-ce1-d", jz4780_ssi0_ce1_d, 1), 1828bb42b593SPaul Cercueil INGENIC_PIN_GROUP("ssi0-ce1-e", jz4770_ssi0_ce1_e, 0), 1829bb42b593SPaul Cercueil INGENIC_PIN_GROUP("ssi1-dt-b", jz4780_ssi1_dt_b, 2), 1830bb42b593SPaul Cercueil INGENIC_PIN_GROUP("ssi1-dt-d", jz4780_ssi1_dt_d, 2), 1831bb42b593SPaul Cercueil INGENIC_PIN_GROUP("ssi1-dt-e", jz4770_ssi1_dt_e, 1), 1832bb42b593SPaul Cercueil INGENIC_PIN_GROUP("ssi1-dr-b", jz4780_ssi1_dr_b, 2), 1833bb42b593SPaul Cercueil INGENIC_PIN_GROUP("ssi1-dr-d", jz4780_ssi1_dr_d, 2), 1834bb42b593SPaul Cercueil INGENIC_PIN_GROUP("ssi1-dr-e", jz4770_ssi1_dr_e, 1), 1835bb42b593SPaul Cercueil INGENIC_PIN_GROUP("ssi1-clk-b", jz4780_ssi1_clk_b, 2), 1836bb42b593SPaul Cercueil INGENIC_PIN_GROUP("ssi1-clk-d", jz4780_ssi1_clk_d, 2), 1837bb42b593SPaul Cercueil INGENIC_PIN_GROUP("ssi1-clk-e", jz4770_ssi1_clk_e, 1), 1838bb42b593SPaul Cercueil INGENIC_PIN_GROUP("ssi1-gpc-b", jz4780_ssi1_gpc_b, 2), 1839bb42b593SPaul Cercueil INGENIC_PIN_GROUP("ssi1-gpc-d", jz4780_ssi1_gpc_d, 2), 1840bb42b593SPaul Cercueil INGENIC_PIN_GROUP("ssi1-gpc-e", jz4770_ssi1_gpc_e, 1), 1841bb42b593SPaul Cercueil INGENIC_PIN_GROUP("ssi1-ce0-b", jz4780_ssi1_ce0_b, 2), 1842bb42b593SPaul Cercueil INGENIC_PIN_GROUP("ssi1-ce0-d", jz4780_ssi1_ce0_d, 2), 1843bb42b593SPaul Cercueil INGENIC_PIN_GROUP("ssi1-ce0-e", jz4770_ssi1_ce0_e, 1), 1844bb42b593SPaul Cercueil INGENIC_PIN_GROUP("ssi1-ce1-b", jz4780_ssi1_ce1_b, 2), 1845bb42b593SPaul Cercueil INGENIC_PIN_GROUP("ssi1-ce1-d", jz4780_ssi1_ce1_d, 2), 1846bb42b593SPaul Cercueil INGENIC_PIN_GROUP("ssi1-ce1-e", jz4770_ssi1_ce1_e, 1), 1847bb42b593SPaul Cercueil INGENIC_PIN_GROUP_FUNCS("mmc0-1bit-a", jz4770_mmc0_1bit_a, 1848bb42b593SPaul Cercueil jz4760_mmc0_1bit_a_funcs), 1849bb42b593SPaul Cercueil INGENIC_PIN_GROUP("mmc0-4bit-a", jz4770_mmc0_4bit_a, 1), 1850bb42b593SPaul Cercueil INGENIC_PIN_GROUP("mmc0-8bit-a", jz4780_mmc0_8bit_a, 1), 1851bb42b593SPaul Cercueil INGENIC_PIN_GROUP("mmc0-1bit-e", jz4770_mmc0_1bit_e, 0), 1852bb42b593SPaul Cercueil INGENIC_PIN_GROUP("mmc0-4bit-e", jz4770_mmc0_4bit_e, 0), 1853bb42b593SPaul Cercueil INGENIC_PIN_GROUP("mmc1-1bit-d", jz4770_mmc1_1bit_d, 0), 1854bb42b593SPaul Cercueil INGENIC_PIN_GROUP("mmc1-4bit-d", jz4770_mmc1_4bit_d, 0), 1855bb42b593SPaul Cercueil INGENIC_PIN_GROUP("mmc1-1bit-e", jz4770_mmc1_1bit_e, 1), 1856bb42b593SPaul Cercueil INGENIC_PIN_GROUP("mmc1-4bit-e", jz4770_mmc1_4bit_e, 1), 1857bb42b593SPaul Cercueil INGENIC_PIN_GROUP("mmc2-1bit-b", jz4770_mmc2_1bit_b, 0), 1858bb42b593SPaul Cercueil INGENIC_PIN_GROUP("mmc2-4bit-b", jz4770_mmc2_4bit_b, 0), 1859bb42b593SPaul Cercueil INGENIC_PIN_GROUP("mmc2-1bit-e", jz4770_mmc2_1bit_e, 2), 1860bb42b593SPaul Cercueil INGENIC_PIN_GROUP("mmc2-4bit-e", jz4770_mmc2_4bit_e, 2), 1861bb42b593SPaul Cercueil INGENIC_PIN_GROUP("nemc-data", jz4770_nemc_8bit_data, 0), 1862bb42b593SPaul Cercueil INGENIC_PIN_GROUP("nemc-cle-ale", jz4770_nemc_cle_ale, 0), 1863bb42b593SPaul Cercueil INGENIC_PIN_GROUP("nemc-addr", jz4770_nemc_addr, 0), 1864bb42b593SPaul Cercueil INGENIC_PIN_GROUP("nemc-rd-we", jz4770_nemc_rd_we, 0), 1865bb42b593SPaul Cercueil INGENIC_PIN_GROUP("nemc-frd-fwe", jz4770_nemc_frd_fwe, 0), 1866bb42b593SPaul Cercueil INGENIC_PIN_GROUP("nemc-wait", jz4770_nemc_wait, 0), 1867bb42b593SPaul Cercueil INGENIC_PIN_GROUP("nemc-cs1", jz4770_nemc_cs1, 0), 1868bb42b593SPaul Cercueil INGENIC_PIN_GROUP("nemc-cs2", jz4770_nemc_cs2, 0), 1869bb42b593SPaul Cercueil INGENIC_PIN_GROUP("nemc-cs3", jz4770_nemc_cs3, 0), 1870bb42b593SPaul Cercueil INGENIC_PIN_GROUP("nemc-cs4", jz4770_nemc_cs4, 0), 1871bb42b593SPaul Cercueil INGENIC_PIN_GROUP("nemc-cs5", jz4770_nemc_cs5, 0), 1872bb42b593SPaul Cercueil INGENIC_PIN_GROUP("nemc-cs6", jz4770_nemc_cs6, 0), 1873bb42b593SPaul Cercueil INGENIC_PIN_GROUP("i2c0-data", jz4770_i2c0, 0), 1874bb42b593SPaul Cercueil INGENIC_PIN_GROUP("i2c1-data", jz4770_i2c1, 0), 1875bb42b593SPaul Cercueil INGENIC_PIN_GROUP("i2c2-data", jz4770_i2c2, 2), 1876bb42b593SPaul Cercueil INGENIC_PIN_GROUP("i2c3-data", jz4780_i2c3, 1), 1877bb42b593SPaul Cercueil INGENIC_PIN_GROUP("i2c4-data-e", jz4780_i2c4_e, 1), 1878bb42b593SPaul Cercueil INGENIC_PIN_GROUP("i2c4-data-f", jz4780_i2c4_f, 1), 1879bb42b593SPaul Cercueil INGENIC_PIN_GROUP("i2s-data-tx", jz4780_i2s_data_tx, 0), 1880bb42b593SPaul Cercueil INGENIC_PIN_GROUP("i2s-data-rx", jz4780_i2s_data_rx, 0), 1881bb42b593SPaul Cercueil INGENIC_PIN_GROUP_FUNCS("i2s-clk-txrx", jz4780_i2s_clk_txrx, 1882bb42b593SPaul Cercueil jz4780_i2s_clk_txrx_funcs), 1883bb42b593SPaul Cercueil INGENIC_PIN_GROUP("i2s-clk-rx", jz4780_i2s_clk_rx, 1), 1884bb42b593SPaul Cercueil INGENIC_PIN_GROUP("i2s-sysclk", jz4780_i2s_sysclk, 2), 18856adf2c56S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("dmic", jz4780_dmic, 1), 1886bb42b593SPaul Cercueil INGENIC_PIN_GROUP("hdmi-ddc", jz4780_hdmi_ddc, 0), 1887bb42b593SPaul Cercueil INGENIC_PIN_GROUP("cim-data", jz4770_cim_8bit, 0), 1888bb42b593SPaul Cercueil INGENIC_PIN_GROUP("cim-data-12bit", jz4770_cim_12bit, 0), 18895e6332a7S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("lcd-8bit", jz4770_lcd_8bit, 0), 18905e6332a7S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("lcd-16bit", jz4770_lcd_16bit, 0), 18915e6332a7S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("lcd-18bit", jz4770_lcd_18bit, 0), 1892bb42b593SPaul Cercueil INGENIC_PIN_GROUP("lcd-24bit", jz4770_lcd_24bit, 0), 18935e6332a7S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("lcd-special", jz4770_lcd_special, 1), 18945e6332a7S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("lcd-generic", jz4770_lcd_generic, 0), 1895bb42b593SPaul Cercueil INGENIC_PIN_GROUP("pwm0", jz4770_pwm_pwm0, 0), 1896bb42b593SPaul Cercueil INGENIC_PIN_GROUP("pwm1", jz4770_pwm_pwm1, 0), 1897bb42b593SPaul Cercueil INGENIC_PIN_GROUP("pwm2", jz4770_pwm_pwm2, 0), 1898bb42b593SPaul Cercueil INGENIC_PIN_GROUP("pwm3", jz4770_pwm_pwm3, 0), 1899bb42b593SPaul Cercueil INGENIC_PIN_GROUP("pwm4", jz4770_pwm_pwm4, 0), 1900bb42b593SPaul Cercueil INGENIC_PIN_GROUP("pwm5", jz4770_pwm_pwm5, 0), 1901bb42b593SPaul Cercueil INGENIC_PIN_GROUP("pwm6", jz4770_pwm_pwm6, 0), 1902bb42b593SPaul Cercueil INGENIC_PIN_GROUP("pwm7", jz4770_pwm_pwm7, 0), 1903ff656e47SZhou Yanjie }; 1904ff656e47SZhou Yanjie 1905ff656e47SZhou Yanjie static const char *jz4780_uart2_groups[] = { "uart2-data", "uart2-hwflow", }; 1906ff656e47SZhou Yanjie static const char *jz4780_uart4_groups[] = { "uart4-data", }; 1907d3ef8c6bS周琰杰 (Zhou Yanjie) static const char *jz4780_ssi0_groups[] = { 1908d3ef8c6bS周琰杰 (Zhou Yanjie) "ssi0-dt-a-19", "ssi0-dt-a-21", "ssi0-dt-a-28", "ssi0-dt-b", "ssi0-dt-d", "ssi0-dt-e", 1909d3ef8c6bS周琰杰 (Zhou Yanjie) "ssi0-dr-a-20", "ssi0-dr-a-27", "ssi0-dr-b", "ssi0-dr-d", "ssi0-dr-e", 1910d3ef8c6bS周琰杰 (Zhou Yanjie) "ssi0-clk-a", "ssi0-clk-b-5", "ssi0-clk-b-28", "ssi0-clk-d", "ssi0-clk-e", 1911d3ef8c6bS周琰杰 (Zhou Yanjie) "ssi0-gpc-b", "ssi0-gpc-d", "ssi0-gpc-e", 1912d3ef8c6bS周琰杰 (Zhou Yanjie) "ssi0-ce0-a-23", "ssi0-ce0-a-25", "ssi0-ce0-b", "ssi0-ce0-d", "ssi0-ce0-e", 1913d3ef8c6bS周琰杰 (Zhou Yanjie) "ssi0-ce1-b", "ssi0-ce1-d", "ssi0-ce1-e", 1914d3ef8c6bS周琰杰 (Zhou Yanjie) }; 1915d3ef8c6bS周琰杰 (Zhou Yanjie) static const char *jz4780_ssi1_groups[] = { 1916d3ef8c6bS周琰杰 (Zhou Yanjie) "ssi1-dt-b", "ssi1-dt-d", "ssi1-dt-e", 1917d3ef8c6bS周琰杰 (Zhou Yanjie) "ssi1-dr-b", "ssi1-dr-d", "ssi1-dr-e", 1918d3ef8c6bS周琰杰 (Zhou Yanjie) "ssi1-clk-b", "ssi1-clk-d", "ssi1-clk-e", 1919d3ef8c6bS周琰杰 (Zhou Yanjie) "ssi1-gpc-b", "ssi1-gpc-d", "ssi1-gpc-e", 1920d3ef8c6bS周琰杰 (Zhou Yanjie) "ssi1-ce0-b", "ssi1-ce0-d", "ssi1-ce0-e", 1921d3ef8c6bS周琰杰 (Zhou Yanjie) "ssi1-ce1-b", "ssi1-ce1-d", "ssi1-ce1-e", 1922d3ef8c6bS周琰杰 (Zhou Yanjie) }; 1923ff656e47SZhou Yanjie static const char *jz4780_mmc0_groups[] = { 1924ff656e47SZhou Yanjie "mmc0-1bit-a", "mmc0-4bit-a", "mmc0-8bit-a", 1925ff656e47SZhou Yanjie "mmc0-1bit-e", "mmc0-4bit-e", 1926ff656e47SZhou Yanjie }; 1927ff656e47SZhou Yanjie static const char *jz4780_mmc1_groups[] = { 1928ff656e47SZhou Yanjie "mmc1-1bit-d", "mmc1-4bit-d", "mmc1-1bit-e", "mmc1-4bit-e", 1929ff656e47SZhou Yanjie }; 19305de1a73eSZhou Yanjie static const char *jz4780_mmc2_groups[] = { 19315de1a73eSZhou Yanjie "mmc2-1bit-b", "mmc2-4bit-b", "mmc2-1bit-e", "mmc2-4bit-e", 19325de1a73eSZhou Yanjie }; 1933ff656e47SZhou Yanjie static const char *jz4780_nemc_groups[] = { 1934ff656e47SZhou Yanjie "nemc-data", "nemc-cle-ale", "nemc-addr", 19355de1a73eSZhou Yanjie "nemc-rd-we", "nemc-frd-fwe", "nemc-wait", 1936ff656e47SZhou Yanjie }; 1937ff656e47SZhou Yanjie static const char *jz4780_i2c3_groups[] = { "i2c3-data", }; 1938ff656e47SZhou Yanjie static const char *jz4780_i2c4_groups[] = { "i2c4-data-e", "i2c4-data-f", }; 1939f4b5c348S周琰杰 (Zhou Yanjie) static const char *jz4780_i2s_groups[] = { 1940f4b5c348S周琰杰 (Zhou Yanjie) "i2s-data-tx", "i2s-data-rx", "i2s-clk-txrx", "i2s-clk-rx", "i2s-sysclk", 1941f4b5c348S周琰杰 (Zhou Yanjie) }; 19426adf2c56S周琰杰 (Zhou Yanjie) static const char *jz4780_dmic_groups[] = { "dmic", }; 1943ff656e47SZhou Yanjie static const char *jz4780_cim_groups[] = { "cim-data", }; 1944a0bb89e8SPaul Boddie static const char *jz4780_hdmi_ddc_groups[] = { "hdmi-ddc", }; 1945ff656e47SZhou Yanjie 1946ff656e47SZhou Yanjie static const struct function_desc jz4780_functions[] = { 1947ff656e47SZhou Yanjie { "uart0", jz4770_uart0_groups, ARRAY_SIZE(jz4770_uart0_groups), }, 1948ff656e47SZhou Yanjie { "uart1", jz4770_uart1_groups, ARRAY_SIZE(jz4770_uart1_groups), }, 1949ff656e47SZhou Yanjie { "uart2", jz4780_uart2_groups, ARRAY_SIZE(jz4780_uart2_groups), }, 1950ff656e47SZhou Yanjie { "uart3", jz4770_uart3_groups, ARRAY_SIZE(jz4770_uart3_groups), }, 1951ff656e47SZhou Yanjie { "uart4", jz4780_uart4_groups, ARRAY_SIZE(jz4780_uart4_groups), }, 1952d3ef8c6bS周琰杰 (Zhou Yanjie) { "ssi0", jz4780_ssi0_groups, ARRAY_SIZE(jz4780_ssi0_groups), }, 1953d3ef8c6bS周琰杰 (Zhou Yanjie) { "ssi1", jz4780_ssi1_groups, ARRAY_SIZE(jz4780_ssi1_groups), }, 1954ff656e47SZhou Yanjie { "mmc0", jz4780_mmc0_groups, ARRAY_SIZE(jz4780_mmc0_groups), }, 1955ff656e47SZhou Yanjie { "mmc1", jz4780_mmc1_groups, ARRAY_SIZE(jz4780_mmc1_groups), }, 19565de1a73eSZhou Yanjie { "mmc2", jz4780_mmc2_groups, ARRAY_SIZE(jz4780_mmc2_groups), }, 1957ff656e47SZhou Yanjie { "nemc", jz4780_nemc_groups, ARRAY_SIZE(jz4780_nemc_groups), }, 1958ff656e47SZhou Yanjie { "nemc-cs1", jz4770_cs1_groups, ARRAY_SIZE(jz4770_cs1_groups), }, 1959ff656e47SZhou Yanjie { "nemc-cs2", jz4770_cs2_groups, ARRAY_SIZE(jz4770_cs2_groups), }, 1960ff656e47SZhou Yanjie { "nemc-cs3", jz4770_cs3_groups, ARRAY_SIZE(jz4770_cs3_groups), }, 1961ff656e47SZhou Yanjie { "nemc-cs4", jz4770_cs4_groups, ARRAY_SIZE(jz4770_cs4_groups), }, 1962ff656e47SZhou Yanjie { "nemc-cs5", jz4770_cs5_groups, ARRAY_SIZE(jz4770_cs5_groups), }, 1963ff656e47SZhou Yanjie { "nemc-cs6", jz4770_cs6_groups, ARRAY_SIZE(jz4770_cs6_groups), }, 1964ff656e47SZhou Yanjie { "i2c0", jz4770_i2c0_groups, ARRAY_SIZE(jz4770_i2c0_groups), }, 1965ff656e47SZhou Yanjie { "i2c1", jz4770_i2c1_groups, ARRAY_SIZE(jz4770_i2c1_groups), }, 1966ff656e47SZhou Yanjie { "i2c2", jz4770_i2c2_groups, ARRAY_SIZE(jz4770_i2c2_groups), }, 1967ff656e47SZhou Yanjie { "i2c3", jz4780_i2c3_groups, ARRAY_SIZE(jz4780_i2c3_groups), }, 1968ff656e47SZhou Yanjie { "i2c4", jz4780_i2c4_groups, ARRAY_SIZE(jz4780_i2c4_groups), }, 1969f4b5c348S周琰杰 (Zhou Yanjie) { "i2s", jz4780_i2s_groups, ARRAY_SIZE(jz4780_i2s_groups), }, 19706adf2c56S周琰杰 (Zhou Yanjie) { "dmic", jz4780_dmic_groups, ARRAY_SIZE(jz4780_dmic_groups), }, 1971ff656e47SZhou Yanjie { "cim", jz4780_cim_groups, ARRAY_SIZE(jz4780_cim_groups), }, 1972ff656e47SZhou Yanjie { "lcd", jz4770_lcd_groups, ARRAY_SIZE(jz4770_lcd_groups), }, 1973ff656e47SZhou Yanjie { "pwm0", jz4770_pwm0_groups, ARRAY_SIZE(jz4770_pwm0_groups), }, 1974ff656e47SZhou Yanjie { "pwm1", jz4770_pwm1_groups, ARRAY_SIZE(jz4770_pwm1_groups), }, 1975ff656e47SZhou Yanjie { "pwm2", jz4770_pwm2_groups, ARRAY_SIZE(jz4770_pwm2_groups), }, 1976ff656e47SZhou Yanjie { "pwm3", jz4770_pwm3_groups, ARRAY_SIZE(jz4770_pwm3_groups), }, 1977ff656e47SZhou Yanjie { "pwm4", jz4770_pwm4_groups, ARRAY_SIZE(jz4770_pwm4_groups), }, 1978ff656e47SZhou Yanjie { "pwm5", jz4770_pwm5_groups, ARRAY_SIZE(jz4770_pwm5_groups), }, 1979ff656e47SZhou Yanjie { "pwm6", jz4770_pwm6_groups, ARRAY_SIZE(jz4770_pwm6_groups), }, 1980ff656e47SZhou Yanjie { "pwm7", jz4770_pwm7_groups, ARRAY_SIZE(jz4770_pwm7_groups), }, 1981a0bb89e8SPaul Boddie { "hdmi-ddc", jz4780_hdmi_ddc_groups, 1982a0bb89e8SPaul Boddie ARRAY_SIZE(jz4780_hdmi_ddc_groups), }, 1983ff656e47SZhou Yanjie }; 1984ff656e47SZhou Yanjie 1985ff656e47SZhou Yanjie static const struct ingenic_chip_info jz4780_chip_info = { 1986ff656e47SZhou Yanjie .num_chips = 6, 1987f742e5ebS周琰杰 (Zhou Yanjie) .reg_offset = 0x100, 1988baf15647SPaul Cercueil .version = ID_JZ4780, 1989ff656e47SZhou Yanjie .groups = jz4780_groups, 1990ff656e47SZhou Yanjie .num_groups = ARRAY_SIZE(jz4780_groups), 1991ff656e47SZhou Yanjie .functions = jz4780_functions, 1992ff656e47SZhou Yanjie .num_functions = ARRAY_SIZE(jz4780_functions), 1993d9f5dc49S周琰杰 (Zhou Yanjie) .pull_ups = jz4780_pull_ups, 1994d9f5dc49S周琰杰 (Zhou Yanjie) .pull_downs = jz4780_pull_downs, 1995ff656e47SZhou Yanjie }; 1996ff656e47SZhou Yanjie 1997fe1ad5eeSZhou Yanjie static const u32 x1000_pull_ups[4] = { 1998b4a9372aS周琰杰 (Zhou Yanjie) 0xffffffff, 0xfdffffff, 0x0dffffff, 0x0000003f, 1999fe1ad5eeSZhou Yanjie }; 2000fe1ad5eeSZhou Yanjie 2001fe1ad5eeSZhou Yanjie static const u32 x1000_pull_downs[4] = { 2002fe1ad5eeSZhou Yanjie 0x00000000, 0x02000000, 0x02000000, 0x00000000, 2003fe1ad5eeSZhou Yanjie }; 2004fe1ad5eeSZhou Yanjie 2005fe1ad5eeSZhou Yanjie static int x1000_uart0_data_pins[] = { 0x4a, 0x4b, }; 2006fe1ad5eeSZhou Yanjie static int x1000_uart0_hwflow_pins[] = { 0x4c, 0x4d, }; 2007fe1ad5eeSZhou Yanjie static int x1000_uart1_data_a_pins[] = { 0x04, 0x05, }; 2008fe1ad5eeSZhou Yanjie static int x1000_uart1_data_d_pins[] = { 0x62, 0x63, }; 2009b4a9372aS周琰杰 (Zhou Yanjie) static int x1000_uart1_hwflow_pins[] = { 0x64, 0x65, }; 2010fe1ad5eeSZhou Yanjie static int x1000_uart2_data_a_pins[] = { 0x02, 0x03, }; 2011fe1ad5eeSZhou Yanjie static int x1000_uart2_data_d_pins[] = { 0x65, 0x64, }; 201228c1caafS周琰杰 (Zhou Yanjie) static int x1000_sfc_data_pins[] = { 0x1d, 0x1c, 0x1e, 0x1f, }; 201328c1caafS周琰杰 (Zhou Yanjie) static int x1000_sfc_clk_pins[] = { 0x1a, }; 201428c1caafS周琰杰 (Zhou Yanjie) static int x1000_sfc_ce_pins[] = { 0x1b, }; 20153b31e9b0S周琰杰 (Zhou Yanjie) static int x1000_ssi_dt_a_22_pins[] = { 0x16, }; 20163b31e9b0S周琰杰 (Zhou Yanjie) static int x1000_ssi_dt_a_29_pins[] = { 0x1d, }; 20173b31e9b0S周琰杰 (Zhou Yanjie) static int x1000_ssi_dt_d_pins[] = { 0x62, }; 20183b31e9b0S周琰杰 (Zhou Yanjie) static int x1000_ssi_dr_a_23_pins[] = { 0x17, }; 20193b31e9b0S周琰杰 (Zhou Yanjie) static int x1000_ssi_dr_a_28_pins[] = { 0x1c, }; 20203b31e9b0S周琰杰 (Zhou Yanjie) static int x1000_ssi_dr_d_pins[] = { 0x63, }; 20213b31e9b0S周琰杰 (Zhou Yanjie) static int x1000_ssi_clk_a_24_pins[] = { 0x18, }; 20223b31e9b0S周琰杰 (Zhou Yanjie) static int x1000_ssi_clk_a_26_pins[] = { 0x1a, }; 20233b31e9b0S周琰杰 (Zhou Yanjie) static int x1000_ssi_clk_d_pins[] = { 0x60, }; 20243b31e9b0S周琰杰 (Zhou Yanjie) static int x1000_ssi_gpc_a_20_pins[] = { 0x14, }; 20253b31e9b0S周琰杰 (Zhou Yanjie) static int x1000_ssi_gpc_a_31_pins[] = { 0x1f, }; 20263b31e9b0S周琰杰 (Zhou Yanjie) static int x1000_ssi_ce0_a_25_pins[] = { 0x19, }; 20273b31e9b0S周琰杰 (Zhou Yanjie) static int x1000_ssi_ce0_a_27_pins[] = { 0x1b, }; 20283b31e9b0S周琰杰 (Zhou Yanjie) static int x1000_ssi_ce0_d_pins[] = { 0x61, }; 20293b31e9b0S周琰杰 (Zhou Yanjie) static int x1000_ssi_ce1_a_21_pins[] = { 0x15, }; 20303b31e9b0S周琰杰 (Zhou Yanjie) static int x1000_ssi_ce1_a_30_pins[] = { 0x1e, }; 2031fe1ad5eeSZhou Yanjie static int x1000_mmc0_1bit_pins[] = { 0x18, 0x19, 0x17, }; 2032fe1ad5eeSZhou Yanjie static int x1000_mmc0_4bit_pins[] = { 0x16, 0x15, 0x14, }; 2033fe1ad5eeSZhou Yanjie static int x1000_mmc0_8bit_pins[] = { 0x13, 0x12, 0x11, 0x10, }; 2034fe1ad5eeSZhou Yanjie static int x1000_mmc1_1bit_pins[] = { 0x40, 0x41, 0x42, }; 2035fe1ad5eeSZhou Yanjie static int x1000_mmc1_4bit_pins[] = { 0x43, 0x44, 0x45, }; 2036b4a9372aS周琰杰 (Zhou Yanjie) static int x1000_emc_8bit_data_pins[] = { 2037fe1ad5eeSZhou Yanjie 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 2038fe1ad5eeSZhou Yanjie }; 2039b4a9372aS周琰杰 (Zhou Yanjie) static int x1000_emc_16bit_data_pins[] = { 2040fe1ad5eeSZhou Yanjie 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 2041fe1ad5eeSZhou Yanjie }; 2042b4a9372aS周琰杰 (Zhou Yanjie) static int x1000_emc_addr_pins[] = { 2043fe1ad5eeSZhou Yanjie 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 2044fe1ad5eeSZhou Yanjie 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 2045fe1ad5eeSZhou Yanjie }; 2046b4a9372aS周琰杰 (Zhou Yanjie) static int x1000_emc_rd_we_pins[] = { 0x30, 0x31, }; 2047b4a9372aS周琰杰 (Zhou Yanjie) static int x1000_emc_wait_pins[] = { 0x34, }; 2048b4a9372aS周琰杰 (Zhou Yanjie) static int x1000_emc_cs1_pins[] = { 0x32, }; 2049b4a9372aS周琰杰 (Zhou Yanjie) static int x1000_emc_cs2_pins[] = { 0x33, }; 2050fe1ad5eeSZhou Yanjie static int x1000_i2c0_pins[] = { 0x38, 0x37, }; 2051fe1ad5eeSZhou Yanjie static int x1000_i2c1_a_pins[] = { 0x01, 0x00, }; 2052fe1ad5eeSZhou Yanjie static int x1000_i2c1_c_pins[] = { 0x5b, 0x5a, }; 2053fe1ad5eeSZhou Yanjie static int x1000_i2c2_pins[] = { 0x61, 0x60, }; 2054f4b5c348S周琰杰 (Zhou Yanjie) static int x1000_i2s_data_tx_pins[] = { 0x24, }; 2055f4b5c348S周琰杰 (Zhou Yanjie) static int x1000_i2s_data_rx_pins[] = { 0x23, }; 2056f4b5c348S周琰杰 (Zhou Yanjie) static int x1000_i2s_clk_txrx_pins[] = { 0x21, 0x22, }; 2057f4b5c348S周琰杰 (Zhou Yanjie) static int x1000_i2s_sysclk_pins[] = { 0x20, }; 205828c1caafS周琰杰 (Zhou Yanjie) static int x1000_dmic_if0_pins[] = { 0x35, 0x36, }; 205928c1caafS周琰杰 (Zhou Yanjie) static int x1000_dmic_if1_pins[] = { 0x25, }; 2060fe1ad5eeSZhou Yanjie static int x1000_cim_pins[] = { 2061fe1ad5eeSZhou Yanjie 0x08, 0x09, 0x0a, 0x0b, 2062fe1ad5eeSZhou Yanjie 0x13, 0x12, 0x11, 0x10, 0x0f, 0x0e, 0x0d, 0x0c, 2063fe1ad5eeSZhou Yanjie }; 2064fe1ad5eeSZhou Yanjie static int x1000_lcd_8bit_pins[] = { 2065fe1ad5eeSZhou Yanjie 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 2066fe1ad5eeSZhou Yanjie 0x30, 0x31, 0x32, 0x33, 0x34, 2067fe1ad5eeSZhou Yanjie }; 2068fe1ad5eeSZhou Yanjie static int x1000_lcd_16bit_pins[] = { 2069fe1ad5eeSZhou Yanjie 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 2070fe1ad5eeSZhou Yanjie }; 2071fe1ad5eeSZhou Yanjie static int x1000_pwm_pwm0_pins[] = { 0x59, }; 2072fe1ad5eeSZhou Yanjie static int x1000_pwm_pwm1_pins[] = { 0x5a, }; 2073fe1ad5eeSZhou Yanjie static int x1000_pwm_pwm2_pins[] = { 0x5b, }; 2074fe1ad5eeSZhou Yanjie static int x1000_pwm_pwm3_pins[] = { 0x26, }; 2075fe1ad5eeSZhou Yanjie static int x1000_pwm_pwm4_pins[] = { 0x58, }; 2076fe1ad5eeSZhou Yanjie static int x1000_mac_pins[] = { 2077fe1ad5eeSZhou Yanjie 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x26, 2078fe1ad5eeSZhou Yanjie }; 2079fe1ad5eeSZhou Yanjie 2080fe1ad5eeSZhou Yanjie static const struct group_desc x1000_groups[] = { 2081bb42b593SPaul Cercueil INGENIC_PIN_GROUP("uart0-data", x1000_uart0_data, 0), 2082bb42b593SPaul Cercueil INGENIC_PIN_GROUP("uart0-hwflow", x1000_uart0_hwflow, 0), 2083bb42b593SPaul Cercueil INGENIC_PIN_GROUP("uart1-data-a", x1000_uart1_data_a, 2), 2084bb42b593SPaul Cercueil INGENIC_PIN_GROUP("uart1-data-d", x1000_uart1_data_d, 1), 2085bb42b593SPaul Cercueil INGENIC_PIN_GROUP("uart1-hwflow", x1000_uart1_hwflow, 1), 2086bb42b593SPaul Cercueil INGENIC_PIN_GROUP("uart2-data-a", x1000_uart2_data_a, 2), 2087bb42b593SPaul Cercueil INGENIC_PIN_GROUP("uart2-data-d", x1000_uart2_data_d, 0), 208828c1caafS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("sfc-data", x1000_sfc_data, 1), 208928c1caafS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("sfc-clk", x1000_sfc_clk, 1), 209028c1caafS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("sfc-ce", x1000_sfc_ce, 1), 2091bb42b593SPaul Cercueil INGENIC_PIN_GROUP("ssi-dt-a-22", x1000_ssi_dt_a_22, 2), 2092bb42b593SPaul Cercueil INGENIC_PIN_GROUP("ssi-dt-a-29", x1000_ssi_dt_a_29, 2), 2093bb42b593SPaul Cercueil INGENIC_PIN_GROUP("ssi-dt-d", x1000_ssi_dt_d, 0), 2094bb42b593SPaul Cercueil INGENIC_PIN_GROUP("ssi-dr-a-23", x1000_ssi_dr_a_23, 2), 2095bb42b593SPaul Cercueil INGENIC_PIN_GROUP("ssi-dr-a-28", x1000_ssi_dr_a_28, 2), 2096bb42b593SPaul Cercueil INGENIC_PIN_GROUP("ssi-dr-d", x1000_ssi_dr_d, 0), 2097bb42b593SPaul Cercueil INGENIC_PIN_GROUP("ssi-clk-a-24", x1000_ssi_clk_a_24, 2), 2098bb42b593SPaul Cercueil INGENIC_PIN_GROUP("ssi-clk-a-26", x1000_ssi_clk_a_26, 2), 2099bb42b593SPaul Cercueil INGENIC_PIN_GROUP("ssi-clk-d", x1000_ssi_clk_d, 0), 2100bb42b593SPaul Cercueil INGENIC_PIN_GROUP("ssi-gpc-a-20", x1000_ssi_gpc_a_20, 2), 2101bb42b593SPaul Cercueil INGENIC_PIN_GROUP("ssi-gpc-a-31", x1000_ssi_gpc_a_31, 2), 2102bb42b593SPaul Cercueil INGENIC_PIN_GROUP("ssi-ce0-a-25", x1000_ssi_ce0_a_25, 2), 2103bb42b593SPaul Cercueil INGENIC_PIN_GROUP("ssi-ce0-a-27", x1000_ssi_ce0_a_27, 2), 2104bb42b593SPaul Cercueil INGENIC_PIN_GROUP("ssi-ce0-d", x1000_ssi_ce0_d, 0), 2105bb42b593SPaul Cercueil INGENIC_PIN_GROUP("ssi-ce1-a-21", x1000_ssi_ce1_a_21, 2), 2106bb42b593SPaul Cercueil INGENIC_PIN_GROUP("ssi-ce1-a-30", x1000_ssi_ce1_a_30, 2), 2107bb42b593SPaul Cercueil INGENIC_PIN_GROUP("mmc0-1bit", x1000_mmc0_1bit, 1), 2108bb42b593SPaul Cercueil INGENIC_PIN_GROUP("mmc0-4bit", x1000_mmc0_4bit, 1), 2109bb42b593SPaul Cercueil INGENIC_PIN_GROUP("mmc0-8bit", x1000_mmc0_8bit, 1), 2110bb42b593SPaul Cercueil INGENIC_PIN_GROUP("mmc1-1bit", x1000_mmc1_1bit, 0), 2111bb42b593SPaul Cercueil INGENIC_PIN_GROUP("mmc1-4bit", x1000_mmc1_4bit, 0), 2112bb42b593SPaul Cercueil INGENIC_PIN_GROUP("emc-8bit-data", x1000_emc_8bit_data, 0), 2113bb42b593SPaul Cercueil INGENIC_PIN_GROUP("emc-16bit-data", x1000_emc_16bit_data, 0), 2114bb42b593SPaul Cercueil INGENIC_PIN_GROUP("emc-addr", x1000_emc_addr, 0), 2115bb42b593SPaul Cercueil INGENIC_PIN_GROUP("emc-rd-we", x1000_emc_rd_we, 0), 2116bb42b593SPaul Cercueil INGENIC_PIN_GROUP("emc-wait", x1000_emc_wait, 0), 2117bb42b593SPaul Cercueil INGENIC_PIN_GROUP("emc-cs1", x1000_emc_cs1, 0), 2118bb42b593SPaul Cercueil INGENIC_PIN_GROUP("emc-cs2", x1000_emc_cs2, 0), 2119bb42b593SPaul Cercueil INGENIC_PIN_GROUP("i2c0-data", x1000_i2c0, 0), 2120bb42b593SPaul Cercueil INGENIC_PIN_GROUP("i2c1-data-a", x1000_i2c1_a, 2), 2121bb42b593SPaul Cercueil INGENIC_PIN_GROUP("i2c1-data-c", x1000_i2c1_c, 0), 2122bb42b593SPaul Cercueil INGENIC_PIN_GROUP("i2c2-data", x1000_i2c2, 1), 2123bb42b593SPaul Cercueil INGENIC_PIN_GROUP("i2s-data-tx", x1000_i2s_data_tx, 1), 2124bb42b593SPaul Cercueil INGENIC_PIN_GROUP("i2s-data-rx", x1000_i2s_data_rx, 1), 2125bb42b593SPaul Cercueil INGENIC_PIN_GROUP("i2s-clk-txrx", x1000_i2s_clk_txrx, 1), 2126bb42b593SPaul Cercueil INGENIC_PIN_GROUP("i2s-sysclk", x1000_i2s_sysclk, 1), 212728c1caafS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("dmic-if0", x1000_dmic_if0, 0), 212828c1caafS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("dmic-if1", x1000_dmic_if1, 1), 2129bb42b593SPaul Cercueil INGENIC_PIN_GROUP("cim-data", x1000_cim, 2), 2130bb42b593SPaul Cercueil INGENIC_PIN_GROUP("lcd-8bit", x1000_lcd_8bit, 1), 2131bb42b593SPaul Cercueil INGENIC_PIN_GROUP("lcd-16bit", x1000_lcd_16bit, 1), 2132bb42b593SPaul Cercueil INGENIC_PIN_GROUP("pwm0", x1000_pwm_pwm0, 0), 2133bb42b593SPaul Cercueil INGENIC_PIN_GROUP("pwm1", x1000_pwm_pwm1, 1), 2134bb42b593SPaul Cercueil INGENIC_PIN_GROUP("pwm2", x1000_pwm_pwm2, 1), 2135bb42b593SPaul Cercueil INGENIC_PIN_GROUP("pwm3", x1000_pwm_pwm3, 2), 2136bb42b593SPaul Cercueil INGENIC_PIN_GROUP("pwm4", x1000_pwm_pwm4, 0), 2137bb42b593SPaul Cercueil INGENIC_PIN_GROUP("mac", x1000_mac, 1), 2138fe1ad5eeSZhou Yanjie }; 2139fe1ad5eeSZhou Yanjie 2140fe1ad5eeSZhou Yanjie static const char *x1000_uart0_groups[] = { "uart0-data", "uart0-hwflow", }; 2141fe1ad5eeSZhou Yanjie static const char *x1000_uart1_groups[] = { 2142b4a9372aS周琰杰 (Zhou Yanjie) "uart1-data-a", "uart1-data-d", "uart1-hwflow", 2143fe1ad5eeSZhou Yanjie }; 2144fe1ad5eeSZhou Yanjie static const char *x1000_uart2_groups[] = { "uart2-data-a", "uart2-data-d", }; 214528c1caafS周琰杰 (Zhou Yanjie) static const char *x1000_sfc_groups[] = { "sfc-data", "sfc-clk", "sfc-ce", }; 21463b31e9b0S周琰杰 (Zhou Yanjie) static const char *x1000_ssi_groups[] = { 21473b31e9b0S周琰杰 (Zhou Yanjie) "ssi-dt-a-22", "ssi-dt-a-29", "ssi-dt-d", 21483b31e9b0S周琰杰 (Zhou Yanjie) "ssi-dr-a-23", "ssi-dr-a-28", "ssi-dr-d", 21493b31e9b0S周琰杰 (Zhou Yanjie) "ssi-clk-a-24", "ssi-clk-a-26", "ssi-clk-d", 21503b31e9b0S周琰杰 (Zhou Yanjie) "ssi-gpc-a-20", "ssi-gpc-a-31", 21513b31e9b0S周琰杰 (Zhou Yanjie) "ssi-ce0-a-25", "ssi-ce0-a-27", "ssi-ce0-d", 21523b31e9b0S周琰杰 (Zhou Yanjie) "ssi-ce1-a-21", "ssi-ce1-a-30", 21533b31e9b0S周琰杰 (Zhou Yanjie) }; 2154fe1ad5eeSZhou Yanjie static const char *x1000_mmc0_groups[] = { 2155fe1ad5eeSZhou Yanjie "mmc0-1bit", "mmc0-4bit", "mmc0-8bit", 2156fe1ad5eeSZhou Yanjie }; 2157fe1ad5eeSZhou Yanjie static const char *x1000_mmc1_groups[] = { 2158b4a9372aS周琰杰 (Zhou Yanjie) "mmc1-1bit", "mmc1-4bit", 2159fe1ad5eeSZhou Yanjie }; 2160b4a9372aS周琰杰 (Zhou Yanjie) static const char *x1000_emc_groups[] = { 2161b4a9372aS周琰杰 (Zhou Yanjie) "emc-8bit-data", "emc-16bit-data", 2162b4a9372aS周琰杰 (Zhou Yanjie) "emc-addr", "emc-rd-we", "emc-wait", 2163fe1ad5eeSZhou Yanjie }; 2164b4a9372aS周琰杰 (Zhou Yanjie) static const char *x1000_cs1_groups[] = { "emc-cs1", }; 2165b4a9372aS周琰杰 (Zhou Yanjie) static const char *x1000_cs2_groups[] = { "emc-cs2", }; 2166fe1ad5eeSZhou Yanjie static const char *x1000_i2c0_groups[] = { "i2c0-data", }; 2167fe1ad5eeSZhou Yanjie static const char *x1000_i2c1_groups[] = { "i2c1-data-a", "i2c1-data-c", }; 2168fe1ad5eeSZhou Yanjie static const char *x1000_i2c2_groups[] = { "i2c2-data", }; 2169f4b5c348S周琰杰 (Zhou Yanjie) static const char *x1000_i2s_groups[] = { 2170f4b5c348S周琰杰 (Zhou Yanjie) "i2s-data-tx", "i2s-data-rx", "i2s-clk-txrx", "i2s-sysclk", 2171f4b5c348S周琰杰 (Zhou Yanjie) }; 217228c1caafS周琰杰 (Zhou Yanjie) static const char *x1000_dmic_groups[] = { "dmic-if0", "dmic-if1", }; 2173fe1ad5eeSZhou Yanjie static const char *x1000_cim_groups[] = { "cim-data", }; 21745e6332a7S周琰杰 (Zhou Yanjie) static const char *x1000_lcd_groups[] = { "lcd-8bit", "lcd-16bit", }; 2175fe1ad5eeSZhou Yanjie static const char *x1000_pwm0_groups[] = { "pwm0", }; 2176fe1ad5eeSZhou Yanjie static const char *x1000_pwm1_groups[] = { "pwm1", }; 2177fe1ad5eeSZhou Yanjie static const char *x1000_pwm2_groups[] = { "pwm2", }; 2178fe1ad5eeSZhou Yanjie static const char *x1000_pwm3_groups[] = { "pwm3", }; 2179fe1ad5eeSZhou Yanjie static const char *x1000_pwm4_groups[] = { "pwm4", }; 2180fe1ad5eeSZhou Yanjie static const char *x1000_mac_groups[] = { "mac", }; 2181fe1ad5eeSZhou Yanjie 2182fe1ad5eeSZhou Yanjie static const struct function_desc x1000_functions[] = { 2183fe1ad5eeSZhou Yanjie { "uart0", x1000_uart0_groups, ARRAY_SIZE(x1000_uart0_groups), }, 2184fe1ad5eeSZhou Yanjie { "uart1", x1000_uart1_groups, ARRAY_SIZE(x1000_uart1_groups), }, 2185fe1ad5eeSZhou Yanjie { "uart2", x1000_uart2_groups, ARRAY_SIZE(x1000_uart2_groups), }, 21863b31e9b0S周琰杰 (Zhou Yanjie) { "sfc", x1000_sfc_groups, ARRAY_SIZE(x1000_sfc_groups), }, 21873b31e9b0S周琰杰 (Zhou Yanjie) { "ssi", x1000_ssi_groups, ARRAY_SIZE(x1000_ssi_groups), }, 2188fe1ad5eeSZhou Yanjie { "mmc0", x1000_mmc0_groups, ARRAY_SIZE(x1000_mmc0_groups), }, 2189fe1ad5eeSZhou Yanjie { "mmc1", x1000_mmc1_groups, ARRAY_SIZE(x1000_mmc1_groups), }, 2190b4a9372aS周琰杰 (Zhou Yanjie) { "emc", x1000_emc_groups, ARRAY_SIZE(x1000_emc_groups), }, 2191b4a9372aS周琰杰 (Zhou Yanjie) { "emc-cs1", x1000_cs1_groups, ARRAY_SIZE(x1000_cs1_groups), }, 2192b4a9372aS周琰杰 (Zhou Yanjie) { "emc-cs2", x1000_cs2_groups, ARRAY_SIZE(x1000_cs2_groups), }, 2193fe1ad5eeSZhou Yanjie { "i2c0", x1000_i2c0_groups, ARRAY_SIZE(x1000_i2c0_groups), }, 2194fe1ad5eeSZhou Yanjie { "i2c1", x1000_i2c1_groups, ARRAY_SIZE(x1000_i2c1_groups), }, 2195fe1ad5eeSZhou Yanjie { "i2c2", x1000_i2c2_groups, ARRAY_SIZE(x1000_i2c2_groups), }, 2196f4b5c348S周琰杰 (Zhou Yanjie) { "i2s", x1000_i2s_groups, ARRAY_SIZE(x1000_i2s_groups), }, 21976adf2c56S周琰杰 (Zhou Yanjie) { "dmic", x1000_dmic_groups, ARRAY_SIZE(x1000_dmic_groups), }, 2198fe1ad5eeSZhou Yanjie { "cim", x1000_cim_groups, ARRAY_SIZE(x1000_cim_groups), }, 2199fe1ad5eeSZhou Yanjie { "lcd", x1000_lcd_groups, ARRAY_SIZE(x1000_lcd_groups), }, 2200fe1ad5eeSZhou Yanjie { "pwm0", x1000_pwm0_groups, ARRAY_SIZE(x1000_pwm0_groups), }, 2201fe1ad5eeSZhou Yanjie { "pwm1", x1000_pwm1_groups, ARRAY_SIZE(x1000_pwm1_groups), }, 2202fe1ad5eeSZhou Yanjie { "pwm2", x1000_pwm2_groups, ARRAY_SIZE(x1000_pwm2_groups), }, 2203fe1ad5eeSZhou Yanjie { "pwm3", x1000_pwm3_groups, ARRAY_SIZE(x1000_pwm3_groups), }, 2204fe1ad5eeSZhou Yanjie { "pwm4", x1000_pwm4_groups, ARRAY_SIZE(x1000_pwm4_groups), }, 2205fe1ad5eeSZhou Yanjie { "mac", x1000_mac_groups, ARRAY_SIZE(x1000_mac_groups), }, 2206fe1ad5eeSZhou Yanjie }; 2207fe1ad5eeSZhou Yanjie 22089279c00fSAidan MacDonald static const struct regmap_range x1000_access_ranges[] = { 22099279c00fSAidan MacDonald regmap_reg_range(0x000, 0x400 - 4), 22109279c00fSAidan MacDonald regmap_reg_range(0x700, 0x800 - 4), 22119279c00fSAidan MacDonald }; 22129279c00fSAidan MacDonald 22139279c00fSAidan MacDonald /* shared with X1500 */ 22149279c00fSAidan MacDonald static const struct regmap_access_table x1000_access_table = { 22159279c00fSAidan MacDonald .yes_ranges = x1000_access_ranges, 22169279c00fSAidan MacDonald .n_yes_ranges = ARRAY_SIZE(x1000_access_ranges), 22179279c00fSAidan MacDonald }; 22189279c00fSAidan MacDonald 2219fe1ad5eeSZhou Yanjie static const struct ingenic_chip_info x1000_chip_info = { 2220fe1ad5eeSZhou Yanjie .num_chips = 4, 2221f742e5ebS周琰杰 (Zhou Yanjie) .reg_offset = 0x100, 2222baf15647SPaul Cercueil .version = ID_X1000, 2223fe1ad5eeSZhou Yanjie .groups = x1000_groups, 2224fe1ad5eeSZhou Yanjie .num_groups = ARRAY_SIZE(x1000_groups), 2225fe1ad5eeSZhou Yanjie .functions = x1000_functions, 2226fe1ad5eeSZhou Yanjie .num_functions = ARRAY_SIZE(x1000_functions), 2227fe1ad5eeSZhou Yanjie .pull_ups = x1000_pull_ups, 2228fe1ad5eeSZhou Yanjie .pull_downs = x1000_pull_downs, 22299279c00fSAidan MacDonald .access_table = &x1000_access_table, 2230fe1ad5eeSZhou Yanjie }; 2231fe1ad5eeSZhou Yanjie 22325d21595bSZhou Yanjie static int x1500_uart0_data_pins[] = { 0x4a, 0x4b, }; 22335d21595bSZhou Yanjie static int x1500_uart0_hwflow_pins[] = { 0x4c, 0x4d, }; 22345d21595bSZhou Yanjie static int x1500_uart1_data_a_pins[] = { 0x04, 0x05, }; 22355d21595bSZhou Yanjie static int x1500_uart1_data_d_pins[] = { 0x62, 0x63, }; 2236b4a9372aS周琰杰 (Zhou Yanjie) static int x1500_uart1_hwflow_pins[] = { 0x64, 0x65, }; 22375d21595bSZhou Yanjie static int x1500_uart2_data_a_pins[] = { 0x02, 0x03, }; 22385d21595bSZhou Yanjie static int x1500_uart2_data_d_pins[] = { 0x65, 0x64, }; 2239b4a9372aS周琰杰 (Zhou Yanjie) static int x1500_mmc_1bit_pins[] = { 0x18, 0x19, 0x17, }; 2240b4a9372aS周琰杰 (Zhou Yanjie) static int x1500_mmc_4bit_pins[] = { 0x16, 0x15, 0x14, }; 22415d21595bSZhou Yanjie static int x1500_i2c0_pins[] = { 0x38, 0x37, }; 22425d21595bSZhou Yanjie static int x1500_i2c1_a_pins[] = { 0x01, 0x00, }; 22435d21595bSZhou Yanjie static int x1500_i2c1_c_pins[] = { 0x5b, 0x5a, }; 22445d21595bSZhou Yanjie static int x1500_i2c2_pins[] = { 0x61, 0x60, }; 2245f4b5c348S周琰杰 (Zhou Yanjie) static int x1500_i2s_data_tx_pins[] = { 0x24, }; 2246f4b5c348S周琰杰 (Zhou Yanjie) static int x1500_i2s_data_rx_pins[] = { 0x23, }; 2247f4b5c348S周琰杰 (Zhou Yanjie) static int x1500_i2s_clk_txrx_pins[] = { 0x21, 0x22, }; 2248f4b5c348S周琰杰 (Zhou Yanjie) static int x1500_i2s_sysclk_pins[] = { 0x20, }; 224928c1caafS周琰杰 (Zhou Yanjie) static int x1500_dmic_if0_pins[] = { 0x35, 0x36, }; 225028c1caafS周琰杰 (Zhou Yanjie) static int x1500_dmic_if1_pins[] = { 0x25, }; 22515d21595bSZhou Yanjie static int x1500_cim_pins[] = { 22525d21595bSZhou Yanjie 0x08, 0x09, 0x0a, 0x0b, 22535d21595bSZhou Yanjie 0x13, 0x12, 0x11, 0x10, 0x0f, 0x0e, 0x0d, 0x0c, 22545d21595bSZhou Yanjie }; 22555d21595bSZhou Yanjie static int x1500_pwm_pwm0_pins[] = { 0x59, }; 22565d21595bSZhou Yanjie static int x1500_pwm_pwm1_pins[] = { 0x5a, }; 22575d21595bSZhou Yanjie static int x1500_pwm_pwm2_pins[] = { 0x5b, }; 22585d21595bSZhou Yanjie static int x1500_pwm_pwm3_pins[] = { 0x26, }; 22595d21595bSZhou Yanjie static int x1500_pwm_pwm4_pins[] = { 0x58, }; 22605d21595bSZhou Yanjie 22615d21595bSZhou Yanjie static const struct group_desc x1500_groups[] = { 2262bb42b593SPaul Cercueil INGENIC_PIN_GROUP("uart0-data", x1500_uart0_data, 0), 2263bb42b593SPaul Cercueil INGENIC_PIN_GROUP("uart0-hwflow", x1500_uart0_hwflow, 0), 2264bb42b593SPaul Cercueil INGENIC_PIN_GROUP("uart1-data-a", x1500_uart1_data_a, 2), 2265bb42b593SPaul Cercueil INGENIC_PIN_GROUP("uart1-data-d", x1500_uart1_data_d, 1), 2266bb42b593SPaul Cercueil INGENIC_PIN_GROUP("uart1-hwflow", x1500_uart1_hwflow, 1), 2267bb42b593SPaul Cercueil INGENIC_PIN_GROUP("uart2-data-a", x1500_uart2_data_a, 2), 2268bb42b593SPaul Cercueil INGENIC_PIN_GROUP("uart2-data-d", x1500_uart2_data_d, 0), 226928c1caafS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("sfc-data", x1000_sfc_data, 1), 227028c1caafS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("sfc-clk", x1000_sfc_clk, 1), 227128c1caafS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("sfc-ce", x1000_sfc_ce, 1), 2272bb42b593SPaul Cercueil INGENIC_PIN_GROUP("mmc-1bit", x1500_mmc_1bit, 1), 2273bb42b593SPaul Cercueil INGENIC_PIN_GROUP("mmc-4bit", x1500_mmc_4bit, 1), 2274bb42b593SPaul Cercueil INGENIC_PIN_GROUP("i2c0-data", x1500_i2c0, 0), 2275bb42b593SPaul Cercueil INGENIC_PIN_GROUP("i2c1-data-a", x1500_i2c1_a, 2), 2276bb42b593SPaul Cercueil INGENIC_PIN_GROUP("i2c1-data-c", x1500_i2c1_c, 0), 2277bb42b593SPaul Cercueil INGENIC_PIN_GROUP("i2c2-data", x1500_i2c2, 1), 2278bb42b593SPaul Cercueil INGENIC_PIN_GROUP("i2s-data-tx", x1500_i2s_data_tx, 1), 2279bb42b593SPaul Cercueil INGENIC_PIN_GROUP("i2s-data-rx", x1500_i2s_data_rx, 1), 2280bb42b593SPaul Cercueil INGENIC_PIN_GROUP("i2s-clk-txrx", x1500_i2s_clk_txrx, 1), 2281bb42b593SPaul Cercueil INGENIC_PIN_GROUP("i2s-sysclk", x1500_i2s_sysclk, 1), 228228c1caafS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("dmic-if0", x1500_dmic_if0, 0), 228328c1caafS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("dmic-if1", x1500_dmic_if1, 1), 2284bb42b593SPaul Cercueil INGENIC_PIN_GROUP("cim-data", x1500_cim, 2), 2285bb42b593SPaul Cercueil INGENIC_PIN_GROUP("pwm0", x1500_pwm_pwm0, 0), 2286bb42b593SPaul Cercueil INGENIC_PIN_GROUP("pwm1", x1500_pwm_pwm1, 1), 2287bb42b593SPaul Cercueil INGENIC_PIN_GROUP("pwm2", x1500_pwm_pwm2, 1), 2288bb42b593SPaul Cercueil INGENIC_PIN_GROUP("pwm3", x1500_pwm_pwm3, 2), 2289bb42b593SPaul Cercueil INGENIC_PIN_GROUP("pwm4", x1500_pwm_pwm4, 0), 22905d21595bSZhou Yanjie }; 22915d21595bSZhou Yanjie 22925d21595bSZhou Yanjie static const char *x1500_uart0_groups[] = { "uart0-data", "uart0-hwflow", }; 22935d21595bSZhou Yanjie static const char *x1500_uart1_groups[] = { 2294b4a9372aS周琰杰 (Zhou Yanjie) "uart1-data-a", "uart1-data-d", "uart1-hwflow", 22955d21595bSZhou Yanjie }; 22965d21595bSZhou Yanjie static const char *x1500_uart2_groups[] = { "uart2-data-a", "uart2-data-d", }; 2297b4a9372aS周琰杰 (Zhou Yanjie) static const char *x1500_mmc_groups[] = { "mmc-1bit", "mmc-4bit", }; 22985d21595bSZhou Yanjie static const char *x1500_i2c0_groups[] = { "i2c0-data", }; 22995d21595bSZhou Yanjie static const char *x1500_i2c1_groups[] = { "i2c1-data-a", "i2c1-data-c", }; 23005d21595bSZhou Yanjie static const char *x1500_i2c2_groups[] = { "i2c2-data", }; 2301f4b5c348S周琰杰 (Zhou Yanjie) static const char *x1500_i2s_groups[] = { 2302f4b5c348S周琰杰 (Zhou Yanjie) "i2s-data-tx", "i2s-data-rx", "i2s-clk-txrx", "i2s-sysclk", 2303f4b5c348S周琰杰 (Zhou Yanjie) }; 230428c1caafS周琰杰 (Zhou Yanjie) static const char *x1500_dmic_groups[] = { "dmic-if0", "dmic-if1", }; 23055d21595bSZhou Yanjie static const char *x1500_cim_groups[] = { "cim-data", }; 23065d21595bSZhou Yanjie static const char *x1500_pwm0_groups[] = { "pwm0", }; 23075d21595bSZhou Yanjie static const char *x1500_pwm1_groups[] = { "pwm1", }; 23085d21595bSZhou Yanjie static const char *x1500_pwm2_groups[] = { "pwm2", }; 23095d21595bSZhou Yanjie static const char *x1500_pwm3_groups[] = { "pwm3", }; 23105d21595bSZhou Yanjie static const char *x1500_pwm4_groups[] = { "pwm4", }; 23115d21595bSZhou Yanjie 23125d21595bSZhou Yanjie static const struct function_desc x1500_functions[] = { 23135d21595bSZhou Yanjie { "uart0", x1500_uart0_groups, ARRAY_SIZE(x1500_uart0_groups), }, 23145d21595bSZhou Yanjie { "uart1", x1500_uart1_groups, ARRAY_SIZE(x1500_uart1_groups), }, 23155d21595bSZhou Yanjie { "uart2", x1500_uart2_groups, ARRAY_SIZE(x1500_uart2_groups), }, 23163b31e9b0S周琰杰 (Zhou Yanjie) { "sfc", x1000_sfc_groups, ARRAY_SIZE(x1000_sfc_groups), }, 2317b4a9372aS周琰杰 (Zhou Yanjie) { "mmc", x1500_mmc_groups, ARRAY_SIZE(x1500_mmc_groups), }, 23185d21595bSZhou Yanjie { "i2c0", x1500_i2c0_groups, ARRAY_SIZE(x1500_i2c0_groups), }, 23195d21595bSZhou Yanjie { "i2c1", x1500_i2c1_groups, ARRAY_SIZE(x1500_i2c1_groups), }, 23205d21595bSZhou Yanjie { "i2c2", x1500_i2c2_groups, ARRAY_SIZE(x1500_i2c2_groups), }, 2321f4b5c348S周琰杰 (Zhou Yanjie) { "i2s", x1500_i2s_groups, ARRAY_SIZE(x1500_i2s_groups), }, 23226adf2c56S周琰杰 (Zhou Yanjie) { "dmic", x1500_dmic_groups, ARRAY_SIZE(x1500_dmic_groups), }, 23235d21595bSZhou Yanjie { "cim", x1500_cim_groups, ARRAY_SIZE(x1500_cim_groups), }, 23245d21595bSZhou Yanjie { "pwm0", x1500_pwm0_groups, ARRAY_SIZE(x1500_pwm0_groups), }, 23255d21595bSZhou Yanjie { "pwm1", x1500_pwm1_groups, ARRAY_SIZE(x1500_pwm1_groups), }, 23265d21595bSZhou Yanjie { "pwm2", x1500_pwm2_groups, ARRAY_SIZE(x1500_pwm2_groups), }, 23275d21595bSZhou Yanjie { "pwm3", x1500_pwm3_groups, ARRAY_SIZE(x1500_pwm3_groups), }, 23285d21595bSZhou Yanjie { "pwm4", x1500_pwm4_groups, ARRAY_SIZE(x1500_pwm4_groups), }, 23295d21595bSZhou Yanjie }; 23305d21595bSZhou Yanjie 23315d21595bSZhou Yanjie static const struct ingenic_chip_info x1500_chip_info = { 23325d21595bSZhou Yanjie .num_chips = 4, 2333f742e5ebS周琰杰 (Zhou Yanjie) .reg_offset = 0x100, 2334baf15647SPaul Cercueil .version = ID_X1500, 23355d21595bSZhou Yanjie .groups = x1500_groups, 23365d21595bSZhou Yanjie .num_groups = ARRAY_SIZE(x1500_groups), 23375d21595bSZhou Yanjie .functions = x1500_functions, 23385d21595bSZhou Yanjie .num_functions = ARRAY_SIZE(x1500_functions), 23395d21595bSZhou Yanjie .pull_ups = x1000_pull_ups, 23405d21595bSZhou Yanjie .pull_downs = x1000_pull_downs, 23419279c00fSAidan MacDonald .access_table = &x1000_access_table, 23425d21595bSZhou Yanjie }; 23435d21595bSZhou Yanjie 2344d7da2a1eS周琰杰 (Zhou Yanjie) static const u32 x1830_pull_ups[4] = { 2345d7da2a1eS周琰杰 (Zhou Yanjie) 0x5fdfffc0, 0xffffefff, 0x1ffffbff, 0x0fcff3fc, 2346d7da2a1eS周琰杰 (Zhou Yanjie) }; 2347d7da2a1eS周琰杰 (Zhou Yanjie) 2348d7da2a1eS周琰杰 (Zhou Yanjie) static const u32 x1830_pull_downs[4] = { 2349d7da2a1eS周琰杰 (Zhou Yanjie) 0x5fdfffc0, 0xffffefff, 0x1ffffbff, 0x0fcff3fc, 2350d7da2a1eS周琰杰 (Zhou Yanjie) }; 2351d7da2a1eS周琰杰 (Zhou Yanjie) 2352d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_uart0_data_pins[] = { 0x33, 0x36, }; 2353d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_uart0_hwflow_pins[] = { 0x34, 0x35, }; 2354d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_uart1_data_pins[] = { 0x38, 0x37, }; 235528c1caafS周琰杰 (Zhou Yanjie) static int x1830_sfc_data_pins[] = { 0x17, 0x18, 0x1a, 0x19, }; 235628c1caafS周琰杰 (Zhou Yanjie) static int x1830_sfc_clk_pins[] = { 0x1b, }; 235728c1caafS周琰杰 (Zhou Yanjie) static int x1830_sfc_ce_pins[] = { 0x1c, }; 2358d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_ssi0_dt_pins[] = { 0x4c, }; 2359d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_ssi0_dr_pins[] = { 0x4b, }; 2360d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_ssi0_clk_pins[] = { 0x4f, }; 2361d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_ssi0_gpc_pins[] = { 0x4d, }; 2362d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_ssi0_ce0_pins[] = { 0x50, }; 2363d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_ssi0_ce1_pins[] = { 0x4e, }; 2364d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_ssi1_dt_c_pins[] = { 0x53, }; 2365d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_ssi1_dt_d_pins[] = { 0x62, }; 236611015196S周琰杰 (Zhou Yanjie) static int x1830_ssi1_dr_c_pins[] = { 0x54, }; 2367d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_ssi1_dr_d_pins[] = { 0x63, }; 236811015196S周琰杰 (Zhou Yanjie) static int x1830_ssi1_clk_c_pins[] = { 0x57, }; 2369d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_ssi1_clk_d_pins[] = { 0x66, }; 237011015196S周琰杰 (Zhou Yanjie) static int x1830_ssi1_gpc_c_pins[] = { 0x55, }; 2371d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_ssi1_gpc_d_pins[] = { 0x64, }; 237211015196S周琰杰 (Zhou Yanjie) static int x1830_ssi1_ce0_c_pins[] = { 0x58, }; 2373d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_ssi1_ce0_d_pins[] = { 0x67, }; 237411015196S周琰杰 (Zhou Yanjie) static int x1830_ssi1_ce1_c_pins[] = { 0x56, }; 2375d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_ssi1_ce1_d_pins[] = { 0x65, }; 2376d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_mmc0_1bit_pins[] = { 0x24, 0x25, 0x20, }; 2377d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_mmc0_4bit_pins[] = { 0x21, 0x22, 0x23, }; 2378d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_mmc1_1bit_pins[] = { 0x42, 0x43, 0x44, }; 2379d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_mmc1_4bit_pins[] = { 0x45, 0x46, 0x47, }; 2380d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_i2c0_pins[] = { 0x0c, 0x0d, }; 2381d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_i2c1_pins[] = { 0x39, 0x3a, }; 2382d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_i2c2_pins[] = { 0x5b, 0x5c, }; 2383f4b5c348S周琰杰 (Zhou Yanjie) static int x1830_i2s_data_tx_pins[] = { 0x53, }; 2384f4b5c348S周琰杰 (Zhou Yanjie) static int x1830_i2s_data_rx_pins[] = { 0x54, }; 2385f4b5c348S周琰杰 (Zhou Yanjie) static int x1830_i2s_clk_txrx_pins[] = { 0x58, 0x52, }; 2386f4b5c348S周琰杰 (Zhou Yanjie) static int x1830_i2s_clk_rx_pins[] = { 0x56, 0x55, }; 2387f4b5c348S周琰杰 (Zhou Yanjie) static int x1830_i2s_sysclk_pins[] = { 0x57, }; 238828c1caafS周琰杰 (Zhou Yanjie) static int x1830_dmic_if0_pins[] = { 0x48, 0x59, }; 238928c1caafS周琰杰 (Zhou Yanjie) static int x1830_dmic_if1_pins[] = { 0x5a, }; 23905e6332a7S周琰杰 (Zhou Yanjie) static int x1830_lcd_tft_8bit_pins[] = { 2391b2954743S周琰杰 (Zhou Yanjie) 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 23925e6332a7S周琰杰 (Zhou Yanjie) 0x68, 0x73, 0x72, 0x69, 23935e6332a7S周琰杰 (Zhou Yanjie) }; 23945e6332a7S周琰杰 (Zhou Yanjie) static int x1830_lcd_tft_24bit_pins[] = { 23955e6332a7S周琰杰 (Zhou Yanjie) 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 23965e6332a7S周琰杰 (Zhou Yanjie) 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 2397b2954743S周琰杰 (Zhou Yanjie) }; 2398b2954743S周琰杰 (Zhou Yanjie) static int x1830_lcd_slcd_8bit_pins[] = { 2399b2954743S周琰杰 (Zhou Yanjie) 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x6c, 0x6d, 2400b2954743S周琰杰 (Zhou Yanjie) 0x69, 0x72, 0x73, 0x7b, 0x7a, 2401b2954743S周琰杰 (Zhou Yanjie) }; 2402b2954743S周琰杰 (Zhou Yanjie) static int x1830_lcd_slcd_16bit_pins[] = { 2403b2954743S周琰杰 (Zhou Yanjie) 0x6e, 0x6f, 0x70, 0x71, 0x76, 0x77, 0x78, 0x79, 2404b2954743S周琰杰 (Zhou Yanjie) }; 2405d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_pwm_pwm0_b_pins[] = { 0x31, }; 2406d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_pwm_pwm0_c_pins[] = { 0x4b, }; 2407d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_pwm_pwm1_b_pins[] = { 0x32, }; 2408d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_pwm_pwm1_c_pins[] = { 0x4c, }; 2409d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_pwm_pwm2_c_8_pins[] = { 0x48, }; 2410d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_pwm_pwm2_c_13_pins[] = { 0x4d, }; 2411d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_pwm_pwm3_c_9_pins[] = { 0x49, }; 2412d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_pwm_pwm3_c_14_pins[] = { 0x4e, }; 2413d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_pwm_pwm4_c_15_pins[] = { 0x4f, }; 2414d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_pwm_pwm4_c_25_pins[] = { 0x59, }; 2415d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_pwm_pwm5_c_16_pins[] = { 0x50, }; 2416d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_pwm_pwm5_c_26_pins[] = { 0x5a, }; 2417d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_pwm_pwm6_c_17_pins[] = { 0x51, }; 2418d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_pwm_pwm6_c_27_pins[] = { 0x5b, }; 2419d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_pwm_pwm7_c_18_pins[] = { 0x52, }; 2420d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_pwm_pwm7_c_28_pins[] = { 0x5c, }; 2421d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_mac_pins[] = { 2422d7da2a1eS周琰杰 (Zhou Yanjie) 0x29, 0x30, 0x2f, 0x28, 0x2e, 0x2d, 0x2a, 0x2b, 0x26, 0x27, 2423d7da2a1eS周琰杰 (Zhou Yanjie) }; 2424d7da2a1eS周琰杰 (Zhou Yanjie) 2425d7da2a1eS周琰杰 (Zhou Yanjie) static const struct group_desc x1830_groups[] = { 2426bb42b593SPaul Cercueil INGENIC_PIN_GROUP("uart0-data", x1830_uart0_data, 0), 2427bb42b593SPaul Cercueil INGENIC_PIN_GROUP("uart0-hwflow", x1830_uart0_hwflow, 0), 2428bb42b593SPaul Cercueil INGENIC_PIN_GROUP("uart1-data", x1830_uart1_data, 0), 242928c1caafS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("sfc-data", x1830_sfc_data, 1), 243028c1caafS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("sfc-clk", x1830_sfc_clk, 1), 243128c1caafS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("sfc-ce", x1830_sfc_ce, 1), 2432bb42b593SPaul Cercueil INGENIC_PIN_GROUP("ssi0-dt", x1830_ssi0_dt, 0), 2433bb42b593SPaul Cercueil INGENIC_PIN_GROUP("ssi0-dr", x1830_ssi0_dr, 0), 2434bb42b593SPaul Cercueil INGENIC_PIN_GROUP("ssi0-clk", x1830_ssi0_clk, 0), 2435bb42b593SPaul Cercueil INGENIC_PIN_GROUP("ssi0-gpc", x1830_ssi0_gpc, 0), 2436bb42b593SPaul Cercueil INGENIC_PIN_GROUP("ssi0-ce0", x1830_ssi0_ce0, 0), 2437bb42b593SPaul Cercueil INGENIC_PIN_GROUP("ssi0-ce1", x1830_ssi0_ce1, 0), 2438bb42b593SPaul Cercueil INGENIC_PIN_GROUP("ssi1-dt-c", x1830_ssi1_dt_c, 1), 2439bb42b593SPaul Cercueil INGENIC_PIN_GROUP("ssi1-dr-c", x1830_ssi1_dr_c, 1), 2440bb42b593SPaul Cercueil INGENIC_PIN_GROUP("ssi1-clk-c", x1830_ssi1_clk_c, 1), 2441bb42b593SPaul Cercueil INGENIC_PIN_GROUP("ssi1-gpc-c", x1830_ssi1_gpc_c, 1), 2442bb42b593SPaul Cercueil INGENIC_PIN_GROUP("ssi1-ce0-c", x1830_ssi1_ce0_c, 1), 2443bb42b593SPaul Cercueil INGENIC_PIN_GROUP("ssi1-ce1-c", x1830_ssi1_ce1_c, 1), 2444bb42b593SPaul Cercueil INGENIC_PIN_GROUP("ssi1-dt-d", x1830_ssi1_dt_d, 2), 2445bb42b593SPaul Cercueil INGENIC_PIN_GROUP("ssi1-dr-d", x1830_ssi1_dr_d, 2), 2446bb42b593SPaul Cercueil INGENIC_PIN_GROUP("ssi1-clk-d", x1830_ssi1_clk_d, 2), 2447bb42b593SPaul Cercueil INGENIC_PIN_GROUP("ssi1-gpc-d", x1830_ssi1_gpc_d, 2), 2448bb42b593SPaul Cercueil INGENIC_PIN_GROUP("ssi1-ce0-d", x1830_ssi1_ce0_d, 2), 2449bb42b593SPaul Cercueil INGENIC_PIN_GROUP("ssi1-ce1-d", x1830_ssi1_ce1_d, 2), 2450bb42b593SPaul Cercueil INGENIC_PIN_GROUP("mmc0-1bit", x1830_mmc0_1bit, 0), 2451bb42b593SPaul Cercueil INGENIC_PIN_GROUP("mmc0-4bit", x1830_mmc0_4bit, 0), 2452bb42b593SPaul Cercueil INGENIC_PIN_GROUP("mmc1-1bit", x1830_mmc1_1bit, 0), 2453bb42b593SPaul Cercueil INGENIC_PIN_GROUP("mmc1-4bit", x1830_mmc1_4bit, 0), 2454bb42b593SPaul Cercueil INGENIC_PIN_GROUP("i2c0-data", x1830_i2c0, 1), 2455bb42b593SPaul Cercueil INGENIC_PIN_GROUP("i2c1-data", x1830_i2c1, 0), 2456bb42b593SPaul Cercueil INGENIC_PIN_GROUP("i2c2-data", x1830_i2c2, 1), 2457bb42b593SPaul Cercueil INGENIC_PIN_GROUP("i2s-data-tx", x1830_i2s_data_tx, 0), 2458bb42b593SPaul Cercueil INGENIC_PIN_GROUP("i2s-data-rx", x1830_i2s_data_rx, 0), 2459bb42b593SPaul Cercueil INGENIC_PIN_GROUP("i2s-clk-txrx", x1830_i2s_clk_txrx, 0), 2460bb42b593SPaul Cercueil INGENIC_PIN_GROUP("i2s-clk-rx", x1830_i2s_clk_rx, 0), 2461bb42b593SPaul Cercueil INGENIC_PIN_GROUP("i2s-sysclk", x1830_i2s_sysclk, 0), 246228c1caafS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("dmic-if0", x1830_dmic_if0, 2), 246328c1caafS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("dmic-if1", x1830_dmic_if1, 2), 24645e6332a7S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("lcd-tft-8bit", x1830_lcd_tft_8bit, 0), 24655e6332a7S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("lcd-tft-24bit", x1830_lcd_tft_24bit, 0), 2466bb42b593SPaul Cercueil INGENIC_PIN_GROUP("lcd-slcd-8bit", x1830_lcd_slcd_8bit, 1), 2467bb42b593SPaul Cercueil INGENIC_PIN_GROUP("lcd-slcd-16bit", x1830_lcd_slcd_16bit, 1), 2468bb42b593SPaul Cercueil INGENIC_PIN_GROUP("pwm0-b", x1830_pwm_pwm0_b, 0), 2469bb42b593SPaul Cercueil INGENIC_PIN_GROUP("pwm0-c", x1830_pwm_pwm0_c, 1), 2470bb42b593SPaul Cercueil INGENIC_PIN_GROUP("pwm1-b", x1830_pwm_pwm1_b, 0), 2471bb42b593SPaul Cercueil INGENIC_PIN_GROUP("pwm1-c", x1830_pwm_pwm1_c, 1), 2472bb42b593SPaul Cercueil INGENIC_PIN_GROUP("pwm2-c-8", x1830_pwm_pwm2_c_8, 0), 2473bb42b593SPaul Cercueil INGENIC_PIN_GROUP("pwm2-c-13", x1830_pwm_pwm2_c_13, 1), 2474bb42b593SPaul Cercueil INGENIC_PIN_GROUP("pwm3-c-9", x1830_pwm_pwm3_c_9, 0), 2475bb42b593SPaul Cercueil INGENIC_PIN_GROUP("pwm3-c-14", x1830_pwm_pwm3_c_14, 1), 2476bb42b593SPaul Cercueil INGENIC_PIN_GROUP("pwm4-c-15", x1830_pwm_pwm4_c_15, 1), 2477bb42b593SPaul Cercueil INGENIC_PIN_GROUP("pwm4-c-25", x1830_pwm_pwm4_c_25, 0), 2478bb42b593SPaul Cercueil INGENIC_PIN_GROUP("pwm5-c-16", x1830_pwm_pwm5_c_16, 1), 2479bb42b593SPaul Cercueil INGENIC_PIN_GROUP("pwm5-c-26", x1830_pwm_pwm5_c_26, 0), 2480bb42b593SPaul Cercueil INGENIC_PIN_GROUP("pwm6-c-17", x1830_pwm_pwm6_c_17, 1), 2481bb42b593SPaul Cercueil INGENIC_PIN_GROUP("pwm6-c-27", x1830_pwm_pwm6_c_27, 0), 2482bb42b593SPaul Cercueil INGENIC_PIN_GROUP("pwm7-c-18", x1830_pwm_pwm7_c_18, 1), 2483bb42b593SPaul Cercueil INGENIC_PIN_GROUP("pwm7-c-28", x1830_pwm_pwm7_c_28, 0), 2484bb42b593SPaul Cercueil INGENIC_PIN_GROUP("mac", x1830_mac, 0), 2485d7da2a1eS周琰杰 (Zhou Yanjie) }; 2486d7da2a1eS周琰杰 (Zhou Yanjie) 2487d7da2a1eS周琰杰 (Zhou Yanjie) static const char *x1830_uart0_groups[] = { "uart0-data", "uart0-hwflow", }; 2488d7da2a1eS周琰杰 (Zhou Yanjie) static const char *x1830_uart1_groups[] = { "uart1-data", }; 248928c1caafS周琰杰 (Zhou Yanjie) static const char *x1830_sfc_groups[] = { "sfc-data", "sfc-clk", "sfc-ce", }; 2490d7da2a1eS周琰杰 (Zhou Yanjie) static const char *x1830_ssi0_groups[] = { 2491d7da2a1eS周琰杰 (Zhou Yanjie) "ssi0-dt", "ssi0-dr", "ssi0-clk", "ssi0-gpc", "ssi0-ce0", "ssi0-ce1", 2492d7da2a1eS周琰杰 (Zhou Yanjie) }; 2493d7da2a1eS周琰杰 (Zhou Yanjie) static const char *x1830_ssi1_groups[] = { 2494d7da2a1eS周琰杰 (Zhou Yanjie) "ssi1-dt-c", "ssi1-dt-d", 2495d7da2a1eS周琰杰 (Zhou Yanjie) "ssi1-dr-c", "ssi1-dr-d", 2496d7da2a1eS周琰杰 (Zhou Yanjie) "ssi1-clk-c", "ssi1-clk-d", 2497d7da2a1eS周琰杰 (Zhou Yanjie) "ssi1-gpc-c", "ssi1-gpc-d", 2498d7da2a1eS周琰杰 (Zhou Yanjie) "ssi1-ce0-c", "ssi1-ce0-d", 2499d7da2a1eS周琰杰 (Zhou Yanjie) "ssi1-ce1-c", "ssi1-ce1-d", 2500d7da2a1eS周琰杰 (Zhou Yanjie) }; 2501d7da2a1eS周琰杰 (Zhou Yanjie) static const char *x1830_mmc0_groups[] = { "mmc0-1bit", "mmc0-4bit", }; 2502d7da2a1eS周琰杰 (Zhou Yanjie) static const char *x1830_mmc1_groups[] = { "mmc1-1bit", "mmc1-4bit", }; 2503d7da2a1eS周琰杰 (Zhou Yanjie) static const char *x1830_i2c0_groups[] = { "i2c0-data", }; 2504d7da2a1eS周琰杰 (Zhou Yanjie) static const char *x1830_i2c1_groups[] = { "i2c1-data", }; 2505d7da2a1eS周琰杰 (Zhou Yanjie) static const char *x1830_i2c2_groups[] = { "i2c2-data", }; 2506f4b5c348S周琰杰 (Zhou Yanjie) static const char *x1830_i2s_groups[] = { 2507f4b5c348S周琰杰 (Zhou Yanjie) "i2s-data-tx", "i2s-data-rx", "i2s-clk-txrx", "i2s-clk-rx", "i2s-sysclk", 2508f4b5c348S周琰杰 (Zhou Yanjie) }; 250928c1caafS周琰杰 (Zhou Yanjie) static const char *x1830_dmic_groups[] = { "dmic-if0", "dmic-if1", }; 2510b2954743S周琰杰 (Zhou Yanjie) static const char *x1830_lcd_groups[] = { 25115e6332a7S周琰杰 (Zhou Yanjie) "lcd-tft-8bit", "lcd-tft-24bit", "lcd-slcd-8bit", "lcd-slcd-16bit", 2512b2954743S周琰杰 (Zhou Yanjie) }; 2513d7da2a1eS周琰杰 (Zhou Yanjie) static const char *x1830_pwm0_groups[] = { "pwm0-b", "pwm0-c", }; 2514d7da2a1eS周琰杰 (Zhou Yanjie) static const char *x1830_pwm1_groups[] = { "pwm1-b", "pwm1-c", }; 2515d7da2a1eS周琰杰 (Zhou Yanjie) static const char *x1830_pwm2_groups[] = { "pwm2-c-8", "pwm2-c-13", }; 2516d7da2a1eS周琰杰 (Zhou Yanjie) static const char *x1830_pwm3_groups[] = { "pwm3-c-9", "pwm3-c-14", }; 2517d7da2a1eS周琰杰 (Zhou Yanjie) static const char *x1830_pwm4_groups[] = { "pwm4-c-15", "pwm4-c-25", }; 2518d7da2a1eS周琰杰 (Zhou Yanjie) static const char *x1830_pwm5_groups[] = { "pwm5-c-16", "pwm5-c-26", }; 2519d7da2a1eS周琰杰 (Zhou Yanjie) static const char *x1830_pwm6_groups[] = { "pwm6-c-17", "pwm6-c-27", }; 2520d7da2a1eS周琰杰 (Zhou Yanjie) static const char *x1830_pwm7_groups[] = { "pwm7-c-18", "pwm7-c-28", }; 2521d7da2a1eS周琰杰 (Zhou Yanjie) static const char *x1830_mac_groups[] = { "mac", }; 2522d7da2a1eS周琰杰 (Zhou Yanjie) 2523d7da2a1eS周琰杰 (Zhou Yanjie) static const struct function_desc x1830_functions[] = { 2524d7da2a1eS周琰杰 (Zhou Yanjie) { "uart0", x1830_uart0_groups, ARRAY_SIZE(x1830_uart0_groups), }, 2525d7da2a1eS周琰杰 (Zhou Yanjie) { "uart1", x1830_uart1_groups, ARRAY_SIZE(x1830_uart1_groups), }, 2526d7da2a1eS周琰杰 (Zhou Yanjie) { "sfc", x1830_sfc_groups, ARRAY_SIZE(x1830_sfc_groups), }, 2527d7da2a1eS周琰杰 (Zhou Yanjie) { "ssi0", x1830_ssi0_groups, ARRAY_SIZE(x1830_ssi0_groups), }, 2528d7da2a1eS周琰杰 (Zhou Yanjie) { "ssi1", x1830_ssi1_groups, ARRAY_SIZE(x1830_ssi1_groups), }, 2529d7da2a1eS周琰杰 (Zhou Yanjie) { "mmc0", x1830_mmc0_groups, ARRAY_SIZE(x1830_mmc0_groups), }, 2530d7da2a1eS周琰杰 (Zhou Yanjie) { "mmc1", x1830_mmc1_groups, ARRAY_SIZE(x1830_mmc1_groups), }, 2531d7da2a1eS周琰杰 (Zhou Yanjie) { "i2c0", x1830_i2c0_groups, ARRAY_SIZE(x1830_i2c0_groups), }, 2532d7da2a1eS周琰杰 (Zhou Yanjie) { "i2c1", x1830_i2c1_groups, ARRAY_SIZE(x1830_i2c1_groups), }, 2533d7da2a1eS周琰杰 (Zhou Yanjie) { "i2c2", x1830_i2c2_groups, ARRAY_SIZE(x1830_i2c2_groups), }, 2534f4b5c348S周琰杰 (Zhou Yanjie) { "i2s", x1830_i2s_groups, ARRAY_SIZE(x1830_i2s_groups), }, 25356adf2c56S周琰杰 (Zhou Yanjie) { "dmic", x1830_dmic_groups, ARRAY_SIZE(x1830_dmic_groups), }, 2536b2954743S周琰杰 (Zhou Yanjie) { "lcd", x1830_lcd_groups, ARRAY_SIZE(x1830_lcd_groups), }, 2537d7da2a1eS周琰杰 (Zhou Yanjie) { "pwm0", x1830_pwm0_groups, ARRAY_SIZE(x1830_pwm0_groups), }, 2538d7da2a1eS周琰杰 (Zhou Yanjie) { "pwm1", x1830_pwm1_groups, ARRAY_SIZE(x1830_pwm1_groups), }, 2539d7da2a1eS周琰杰 (Zhou Yanjie) { "pwm2", x1830_pwm2_groups, ARRAY_SIZE(x1830_pwm2_groups), }, 2540d7da2a1eS周琰杰 (Zhou Yanjie) { "pwm3", x1830_pwm3_groups, ARRAY_SIZE(x1830_pwm3_groups), }, 2541d7da2a1eS周琰杰 (Zhou Yanjie) { "pwm4", x1830_pwm4_groups, ARRAY_SIZE(x1830_pwm4_groups), }, 2542d7da2a1eS周琰杰 (Zhou Yanjie) { "pwm5", x1830_pwm5_groups, ARRAY_SIZE(x1830_pwm4_groups), }, 2543d7da2a1eS周琰杰 (Zhou Yanjie) { "pwm6", x1830_pwm6_groups, ARRAY_SIZE(x1830_pwm4_groups), }, 2544d7da2a1eS周琰杰 (Zhou Yanjie) { "pwm7", x1830_pwm7_groups, ARRAY_SIZE(x1830_pwm4_groups), }, 2545d7da2a1eS周琰杰 (Zhou Yanjie) { "mac", x1830_mac_groups, ARRAY_SIZE(x1830_mac_groups), }, 2546d7da2a1eS周琰杰 (Zhou Yanjie) }; 2547d7da2a1eS周琰杰 (Zhou Yanjie) 25489279c00fSAidan MacDonald static const struct regmap_range x1830_access_ranges[] = { 25499279c00fSAidan MacDonald regmap_reg_range(0x0000, 0x4000 - 4), 25509279c00fSAidan MacDonald regmap_reg_range(0x7000, 0x8000 - 4), 25519279c00fSAidan MacDonald }; 25529279c00fSAidan MacDonald 25539279c00fSAidan MacDonald static const struct regmap_access_table x1830_access_table = { 25549279c00fSAidan MacDonald .yes_ranges = x1830_access_ranges, 25559279c00fSAidan MacDonald .n_yes_ranges = ARRAY_SIZE(x1830_access_ranges), 25569279c00fSAidan MacDonald }; 25579279c00fSAidan MacDonald 2558d7da2a1eS周琰杰 (Zhou Yanjie) static const struct ingenic_chip_info x1830_chip_info = { 2559d7da2a1eS周琰杰 (Zhou Yanjie) .num_chips = 4, 2560d7da2a1eS周琰杰 (Zhou Yanjie) .reg_offset = 0x1000, 2561baf15647SPaul Cercueil .version = ID_X1830, 2562d7da2a1eS周琰杰 (Zhou Yanjie) .groups = x1830_groups, 2563d7da2a1eS周琰杰 (Zhou Yanjie) .num_groups = ARRAY_SIZE(x1830_groups), 2564d7da2a1eS周琰杰 (Zhou Yanjie) .functions = x1830_functions, 2565d7da2a1eS周琰杰 (Zhou Yanjie) .num_functions = ARRAY_SIZE(x1830_functions), 2566d7da2a1eS周琰杰 (Zhou Yanjie) .pull_ups = x1830_pull_ups, 2567d7da2a1eS周琰杰 (Zhou Yanjie) .pull_downs = x1830_pull_downs, 25689279c00fSAidan MacDonald .access_table = &x1830_access_table, 2569d7da2a1eS周琰杰 (Zhou Yanjie) }; 2570d7da2a1eS周琰杰 (Zhou Yanjie) 2571943e0da1S周琰杰 (Zhou Yanjie) static const u32 x2000_pull_ups[5] = { 2572943e0da1S周琰杰 (Zhou Yanjie) 0x0003ffff, 0xffffffff, 0x1ff0ffff, 0xc7fe3f3f, 0x8fff003f, 2573943e0da1S周琰杰 (Zhou Yanjie) }; 2574943e0da1S周琰杰 (Zhou Yanjie) 2575943e0da1S周琰杰 (Zhou Yanjie) static const u32 x2000_pull_downs[5] = { 2576943e0da1S周琰杰 (Zhou Yanjie) 0x0003ffff, 0xffffffff, 0x1ff0ffff, 0x00000000, 0x8fff003f, 2577943e0da1S周琰杰 (Zhou Yanjie) }; 2578943e0da1S周琰杰 (Zhou Yanjie) 2579943e0da1S周琰杰 (Zhou Yanjie) static int x2000_uart0_data_pins[] = { 0x77, 0x78, }; 2580943e0da1S周琰杰 (Zhou Yanjie) static int x2000_uart0_hwflow_pins[] = { 0x79, 0x7a, }; 2581943e0da1S周琰杰 (Zhou Yanjie) static int x2000_uart1_data_pins[] = { 0x57, 0x58, }; 2582943e0da1S周琰杰 (Zhou Yanjie) static int x2000_uart1_hwflow_pins[] = { 0x55, 0x56, }; 2583943e0da1S周琰杰 (Zhou Yanjie) static int x2000_uart2_data_pins[] = { 0x7e, 0x7f, }; 2584943e0da1S周琰杰 (Zhou Yanjie) static int x2000_uart3_data_c_pins[] = { 0x59, 0x5a, }; 2585943e0da1S周琰杰 (Zhou Yanjie) static int x2000_uart3_data_d_pins[] = { 0x62, 0x63, }; 2586943e0da1S周琰杰 (Zhou Yanjie) static int x2000_uart3_hwflow_c_pins[] = { 0x5b, 0x5c, }; 2587943e0da1S周琰杰 (Zhou Yanjie) static int x2000_uart3_hwflow_d_pins[] = { 0x60, 0x61, }; 2588943e0da1S周琰杰 (Zhou Yanjie) static int x2000_uart4_data_a_pins[] = { 0x02, 0x03, }; 2589943e0da1S周琰杰 (Zhou Yanjie) static int x2000_uart4_data_c_pins[] = { 0x4b, 0x4c, }; 2590943e0da1S周琰杰 (Zhou Yanjie) static int x2000_uart4_hwflow_a_pins[] = { 0x00, 0x01, }; 2591943e0da1S周琰杰 (Zhou Yanjie) static int x2000_uart4_hwflow_c_pins[] = { 0x49, 0x4a, }; 2592943e0da1S周琰杰 (Zhou Yanjie) static int x2000_uart5_data_a_pins[] = { 0x04, 0x05, }; 2593943e0da1S周琰杰 (Zhou Yanjie) static int x2000_uart5_data_c_pins[] = { 0x45, 0x46, }; 2594943e0da1S周琰杰 (Zhou Yanjie) static int x2000_uart6_data_a_pins[] = { 0x06, 0x07, }; 2595943e0da1S周琰杰 (Zhou Yanjie) static int x2000_uart6_data_c_pins[] = { 0x47, 0x48, }; 2596943e0da1S周琰杰 (Zhou Yanjie) static int x2000_uart7_data_a_pins[] = { 0x08, 0x09, }; 2597943e0da1S周琰杰 (Zhou Yanjie) static int x2000_uart7_data_c_pins[] = { 0x41, 0x42, }; 2598943e0da1S周琰杰 (Zhou Yanjie) static int x2000_uart8_data_pins[] = { 0x3c, 0x3d, }; 2599943e0da1S周琰杰 (Zhou Yanjie) static int x2000_uart9_data_pins[] = { 0x3e, 0x3f, }; 260028c1caafS周琰杰 (Zhou Yanjie) static int x2000_sfc_data_if0_d_pins[] = { 0x73, 0x74, 0x75, 0x76, }; 260128c1caafS周琰杰 (Zhou Yanjie) static int x2000_sfc_data_if0_e_pins[] = { 0x92, 0x93, 0x94, 0x95, }; 260228c1caafS周琰杰 (Zhou Yanjie) static int x2000_sfc_data_if1_pins[] = { 0x77, 0x78, 0x79, 0x7a, }; 260328c1caafS周琰杰 (Zhou Yanjie) static int x2000_sfc_clk_d_pins[] = { 0x71, }; 260428c1caafS周琰杰 (Zhou Yanjie) static int x2000_sfc_clk_e_pins[] = { 0x90, }; 260528c1caafS周琰杰 (Zhou Yanjie) static int x2000_sfc_ce_d_pins[] = { 0x72, }; 260628c1caafS周琰杰 (Zhou Yanjie) static int x2000_sfc_ce_e_pins[] = { 0x91, }; 2607943e0da1S周琰杰 (Zhou Yanjie) static int x2000_ssi0_dt_b_pins[] = { 0x3e, }; 2608943e0da1S周琰杰 (Zhou Yanjie) static int x2000_ssi0_dt_d_pins[] = { 0x69, }; 2609943e0da1S周琰杰 (Zhou Yanjie) static int x2000_ssi0_dr_b_pins[] = { 0x3d, }; 2610943e0da1S周琰杰 (Zhou Yanjie) static int x2000_ssi0_dr_d_pins[] = { 0x6a, }; 2611943e0da1S周琰杰 (Zhou Yanjie) static int x2000_ssi0_clk_b_pins[] = { 0x3f, }; 2612943e0da1S周琰杰 (Zhou Yanjie) static int x2000_ssi0_clk_d_pins[] = { 0x68, }; 261328c1caafS周琰杰 (Zhou Yanjie) static int x2000_ssi0_ce_b_pins[] = { 0x3c, }; 261428c1caafS周琰杰 (Zhou Yanjie) static int x2000_ssi0_ce_d_pins[] = { 0x6d, }; 2615943e0da1S周琰杰 (Zhou Yanjie) static int x2000_ssi1_dt_c_pins[] = { 0x4b, }; 2616943e0da1S周琰杰 (Zhou Yanjie) static int x2000_ssi1_dt_d_pins[] = { 0x72, }; 2617943e0da1S周琰杰 (Zhou Yanjie) static int x2000_ssi1_dt_e_pins[] = { 0x91, }; 2618943e0da1S周琰杰 (Zhou Yanjie) static int x2000_ssi1_dr_c_pins[] = { 0x4a, }; 2619943e0da1S周琰杰 (Zhou Yanjie) static int x2000_ssi1_dr_d_pins[] = { 0x73, }; 2620943e0da1S周琰杰 (Zhou Yanjie) static int x2000_ssi1_dr_e_pins[] = { 0x92, }; 2621943e0da1S周琰杰 (Zhou Yanjie) static int x2000_ssi1_clk_c_pins[] = { 0x4c, }; 2622943e0da1S周琰杰 (Zhou Yanjie) static int x2000_ssi1_clk_d_pins[] = { 0x71, }; 2623943e0da1S周琰杰 (Zhou Yanjie) static int x2000_ssi1_clk_e_pins[] = { 0x90, }; 262428c1caafS周琰杰 (Zhou Yanjie) static int x2000_ssi1_ce_c_pins[] = { 0x49, }; 262528c1caafS周琰杰 (Zhou Yanjie) static int x2000_ssi1_ce_d_pins[] = { 0x76, }; 262628c1caafS周琰杰 (Zhou Yanjie) static int x2000_ssi1_ce_e_pins[] = { 0x95, }; 2627943e0da1S周琰杰 (Zhou Yanjie) static int x2000_mmc0_1bit_pins[] = { 0x71, 0x72, 0x73, }; 2628943e0da1S周琰杰 (Zhou Yanjie) static int x2000_mmc0_4bit_pins[] = { 0x74, 0x75, 0x75, }; 2629943e0da1S周琰杰 (Zhou Yanjie) static int x2000_mmc0_8bit_pins[] = { 0x77, 0x78, 0x79, 0x7a, }; 2630943e0da1S周琰杰 (Zhou Yanjie) static int x2000_mmc1_1bit_pins[] = { 0x68, 0x69, 0x6a, }; 2631943e0da1S周琰杰 (Zhou Yanjie) static int x2000_mmc1_4bit_pins[] = { 0x6b, 0x6c, 0x6d, }; 2632943e0da1S周琰杰 (Zhou Yanjie) static int x2000_mmc2_1bit_pins[] = { 0x80, 0x81, 0x82, }; 2633943e0da1S周琰杰 (Zhou Yanjie) static int x2000_mmc2_4bit_pins[] = { 0x83, 0x84, 0x85, }; 2634943e0da1S周琰杰 (Zhou Yanjie) static int x2000_emc_8bit_data_pins[] = { 2635943e0da1S周琰杰 (Zhou Yanjie) 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 2636943e0da1S周琰杰 (Zhou Yanjie) }; 2637943e0da1S周琰杰 (Zhou Yanjie) static int x2000_emc_16bit_data_pins[] = { 2638943e0da1S周琰杰 (Zhou Yanjie) 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 2639943e0da1S周琰杰 (Zhou Yanjie) }; 2640943e0da1S周琰杰 (Zhou Yanjie) static int x2000_emc_addr_pins[] = { 2641943e0da1S周琰杰 (Zhou Yanjie) 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 2642943e0da1S周琰杰 (Zhou Yanjie) 0x28, 0x29, 0x2a, 0x2b, 0x2c, 2643943e0da1S周琰杰 (Zhou Yanjie) }; 2644943e0da1S周琰杰 (Zhou Yanjie) static int x2000_emc_rd_we_pins[] = { 0x2d, 0x2e, }; 2645943e0da1S周琰杰 (Zhou Yanjie) static int x2000_emc_wait_pins[] = { 0x2f, }; 2646943e0da1S周琰杰 (Zhou Yanjie) static int x2000_emc_cs1_pins[] = { 0x57, }; 2647943e0da1S周琰杰 (Zhou Yanjie) static int x2000_emc_cs2_pins[] = { 0x58, }; 2648943e0da1S周琰杰 (Zhou Yanjie) static int x2000_i2c0_pins[] = { 0x4e, 0x4d, }; 2649943e0da1S周琰杰 (Zhou Yanjie) static int x2000_i2c1_c_pins[] = { 0x58, 0x57, }; 2650943e0da1S周琰杰 (Zhou Yanjie) static int x2000_i2c1_d_pins[] = { 0x6c, 0x6b, }; 2651943e0da1S周琰杰 (Zhou Yanjie) static int x2000_i2c2_b_pins[] = { 0x37, 0x36, }; 2652943e0da1S周琰杰 (Zhou Yanjie) static int x2000_i2c2_d_pins[] = { 0x75, 0x74, }; 2653943e0da1S周琰杰 (Zhou Yanjie) static int x2000_i2c2_e_pins[] = { 0x94, 0x93, }; 2654943e0da1S周琰杰 (Zhou Yanjie) static int x2000_i2c3_a_pins[] = { 0x11, 0x10, }; 2655943e0da1S周琰杰 (Zhou Yanjie) static int x2000_i2c3_d_pins[] = { 0x7f, 0x7e, }; 2656943e0da1S周琰杰 (Zhou Yanjie) static int x2000_i2c4_c_pins[] = { 0x5a, 0x59, }; 2657943e0da1S周琰杰 (Zhou Yanjie) static int x2000_i2c4_d_pins[] = { 0x61, 0x60, }; 2658943e0da1S周琰杰 (Zhou Yanjie) static int x2000_i2c5_c_pins[] = { 0x5c, 0x5b, }; 2659943e0da1S周琰杰 (Zhou Yanjie) static int x2000_i2c5_d_pins[] = { 0x65, 0x64, }; 2660943e0da1S周琰杰 (Zhou Yanjie) static int x2000_i2s1_data_tx_pins[] = { 0x47, }; 2661943e0da1S周琰杰 (Zhou Yanjie) static int x2000_i2s1_data_rx_pins[] = { 0x44, }; 2662943e0da1S周琰杰 (Zhou Yanjie) static int x2000_i2s1_clk_tx_pins[] = { 0x45, 0x46, }; 2663943e0da1S周琰杰 (Zhou Yanjie) static int x2000_i2s1_clk_rx_pins[] = { 0x42, 0x43, }; 2664943e0da1S周琰杰 (Zhou Yanjie) static int x2000_i2s1_sysclk_tx_pins[] = { 0x48, }; 2665943e0da1S周琰杰 (Zhou Yanjie) static int x2000_i2s1_sysclk_rx_pins[] = { 0x41, }; 2666943e0da1S周琰杰 (Zhou Yanjie) static int x2000_i2s2_data_rx0_pins[] = { 0x0a, }; 2667943e0da1S周琰杰 (Zhou Yanjie) static int x2000_i2s2_data_rx1_pins[] = { 0x0b, }; 2668943e0da1S周琰杰 (Zhou Yanjie) static int x2000_i2s2_data_rx2_pins[] = { 0x0c, }; 2669943e0da1S周琰杰 (Zhou Yanjie) static int x2000_i2s2_data_rx3_pins[] = { 0x0d, }; 2670943e0da1S周琰杰 (Zhou Yanjie) static int x2000_i2s2_clk_rx_pins[] = { 0x11, 0x09, }; 2671943e0da1S周琰杰 (Zhou Yanjie) static int x2000_i2s2_sysclk_rx_pins[] = { 0x07, }; 2672943e0da1S周琰杰 (Zhou Yanjie) static int x2000_i2s3_data_tx0_pins[] = { 0x03, }; 2673943e0da1S周琰杰 (Zhou Yanjie) static int x2000_i2s3_data_tx1_pins[] = { 0x04, }; 2674943e0da1S周琰杰 (Zhou Yanjie) static int x2000_i2s3_data_tx2_pins[] = { 0x05, }; 2675943e0da1S周琰杰 (Zhou Yanjie) static int x2000_i2s3_data_tx3_pins[] = { 0x06, }; 2676943e0da1S周琰杰 (Zhou Yanjie) static int x2000_i2s3_clk_tx_pins[] = { 0x10, 0x02, }; 2677943e0da1S周琰杰 (Zhou Yanjie) static int x2000_i2s3_sysclk_tx_pins[] = { 0x00, }; 267828c1caafS周琰杰 (Zhou Yanjie) static int x2000_dmic_if0_pins[] = { 0x54, 0x55, }; 267928c1caafS周琰杰 (Zhou Yanjie) static int x2000_dmic_if1_pins[] = { 0x56, }; 268028c1caafS周琰杰 (Zhou Yanjie) static int x2000_dmic_if2_pins[] = { 0x57, }; 268128c1caafS周琰杰 (Zhou Yanjie) static int x2000_dmic_if3_pins[] = { 0x58, }; 2682943e0da1S周琰杰 (Zhou Yanjie) static int x2000_cim_8bit_pins[] = { 2683943e0da1S周琰杰 (Zhou Yanjie) 0x0e, 0x0c, 0x0d, 0x4f, 2684943e0da1S周琰杰 (Zhou Yanjie) 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 2685943e0da1S周琰杰 (Zhou Yanjie) }; 2686943e0da1S周琰杰 (Zhou Yanjie) static int x2000_cim_12bit_pins[] = { 0x08, 0x09, 0x0a, 0x0b, }; 2687943e0da1S周琰杰 (Zhou Yanjie) static int x2000_lcd_tft_8bit_pins[] = { 2688943e0da1S周琰杰 (Zhou Yanjie) 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 2689943e0da1S周琰杰 (Zhou Yanjie) 0x38, 0x3a, 0x39, 0x3b, 2690943e0da1S周琰杰 (Zhou Yanjie) }; 2691943e0da1S周琰杰 (Zhou Yanjie) static int x2000_lcd_tft_16bit_pins[] = { 2692943e0da1S周琰杰 (Zhou Yanjie) 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 2693943e0da1S周琰杰 (Zhou Yanjie) }; 2694943e0da1S周琰杰 (Zhou Yanjie) static int x2000_lcd_tft_18bit_pins[] = { 2695943e0da1S周琰杰 (Zhou Yanjie) 0x30, 0x31, 2696943e0da1S周琰杰 (Zhou Yanjie) }; 2697943e0da1S周琰杰 (Zhou Yanjie) static int x2000_lcd_tft_24bit_pins[] = { 2698943e0da1S周琰杰 (Zhou Yanjie) 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 2699943e0da1S周琰杰 (Zhou Yanjie) }; 2700943e0da1S周琰杰 (Zhou Yanjie) static int x2000_lcd_slcd_8bit_pins[] = { 2701943e0da1S周琰杰 (Zhou Yanjie) 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 2702943e0da1S周琰杰 (Zhou Yanjie) 0x3a, 0x38, 0x3b, 0x30, 0x39, 2703943e0da1S周琰杰 (Zhou Yanjie) }; 2704943e0da1S周琰杰 (Zhou Yanjie) static int x2000_pwm_pwm0_c_pins[] = { 0x40, }; 2705943e0da1S周琰杰 (Zhou Yanjie) static int x2000_pwm_pwm0_d_pins[] = { 0x7e, }; 2706943e0da1S周琰杰 (Zhou Yanjie) static int x2000_pwm_pwm1_c_pins[] = { 0x41, }; 2707943e0da1S周琰杰 (Zhou Yanjie) static int x2000_pwm_pwm1_d_pins[] = { 0x7f, }; 2708943e0da1S周琰杰 (Zhou Yanjie) static int x2000_pwm_pwm2_c_pins[] = { 0x42, }; 2709943e0da1S周琰杰 (Zhou Yanjie) static int x2000_pwm_pwm2_e_pins[] = { 0x80, }; 2710943e0da1S周琰杰 (Zhou Yanjie) static int x2000_pwm_pwm3_c_pins[] = { 0x43, }; 2711943e0da1S周琰杰 (Zhou Yanjie) static int x2000_pwm_pwm3_e_pins[] = { 0x81, }; 2712943e0da1S周琰杰 (Zhou Yanjie) static int x2000_pwm_pwm4_c_pins[] = { 0x44, }; 2713943e0da1S周琰杰 (Zhou Yanjie) static int x2000_pwm_pwm4_e_pins[] = { 0x82, }; 2714943e0da1S周琰杰 (Zhou Yanjie) static int x2000_pwm_pwm5_c_pins[] = { 0x45, }; 2715943e0da1S周琰杰 (Zhou Yanjie) static int x2000_pwm_pwm5_e_pins[] = { 0x83, }; 2716943e0da1S周琰杰 (Zhou Yanjie) static int x2000_pwm_pwm6_c_pins[] = { 0x46, }; 2717943e0da1S周琰杰 (Zhou Yanjie) static int x2000_pwm_pwm6_e_pins[] = { 0x84, }; 2718943e0da1S周琰杰 (Zhou Yanjie) static int x2000_pwm_pwm7_c_pins[] = { 0x47, }; 2719943e0da1S周琰杰 (Zhou Yanjie) static int x2000_pwm_pwm7_e_pins[] = { 0x85, }; 2720943e0da1S周琰杰 (Zhou Yanjie) static int x2000_pwm_pwm8_pins[] = { 0x48, }; 2721943e0da1S周琰杰 (Zhou Yanjie) static int x2000_pwm_pwm9_pins[] = { 0x49, }; 2722943e0da1S周琰杰 (Zhou Yanjie) static int x2000_pwm_pwm10_pins[] = { 0x4a, }; 2723943e0da1S周琰杰 (Zhou Yanjie) static int x2000_pwm_pwm11_pins[] = { 0x4b, }; 2724943e0da1S周琰杰 (Zhou Yanjie) static int x2000_pwm_pwm12_pins[] = { 0x4c, }; 2725943e0da1S周琰杰 (Zhou Yanjie) static int x2000_pwm_pwm13_pins[] = { 0x4d, }; 2726943e0da1S周琰杰 (Zhou Yanjie) static int x2000_pwm_pwm14_pins[] = { 0x4e, }; 2727943e0da1S周琰杰 (Zhou Yanjie) static int x2000_pwm_pwm15_pins[] = { 0x4f, }; 2728943e0da1S周琰杰 (Zhou Yanjie) static int x2000_mac0_rmii_pins[] = { 2729943e0da1S周琰杰 (Zhou Yanjie) 0x4b, 0x47, 0x46, 0x4a, 0x43, 0x42, 0x4c, 0x4d, 0x4e, 0x41, 2730943e0da1S周琰杰 (Zhou Yanjie) }; 2731943e0da1S周琰杰 (Zhou Yanjie) static int x2000_mac0_rgmii_pins[] = { 2732943e0da1S周琰杰 (Zhou Yanjie) 0x4b, 0x49, 0x48, 0x47, 0x46, 0x4a, 0x45, 0x44, 0x43, 0x42, 2733943e0da1S周琰杰 (Zhou Yanjie) 0x4c, 0x4d, 0x4f, 0x4e, 0x41, 2734943e0da1S周琰杰 (Zhou Yanjie) }; 2735943e0da1S周琰杰 (Zhou Yanjie) static int x2000_mac1_rmii_pins[] = { 2736943e0da1S周琰杰 (Zhou Yanjie) 0x32, 0x2d, 0x2c, 0x31, 0x29, 0x28, 0x33, 0x34, 0x35, 0x37, 2737943e0da1S周琰杰 (Zhou Yanjie) }; 2738943e0da1S周琰杰 (Zhou Yanjie) static int x2000_mac1_rgmii_pins[] = { 2739943e0da1S周琰杰 (Zhou Yanjie) 0x32, 0x2f, 0x2e, 0x2d, 0x2c, 0x31, 0x2b, 0x2a, 0x29, 0x28, 2740943e0da1S周琰杰 (Zhou Yanjie) 0x33, 0x34, 0x36, 0x35, 0x37, 2741943e0da1S周琰杰 (Zhou Yanjie) }; 2742943e0da1S周琰杰 (Zhou Yanjie) static int x2000_otg_pins[] = { 0x96, }; 2743943e0da1S周琰杰 (Zhou Yanjie) 2744943e0da1S周琰杰 (Zhou Yanjie) static u8 x2000_cim_8bit_funcs[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, }; 2745943e0da1S周琰杰 (Zhou Yanjie) 2746943e0da1S周琰杰 (Zhou Yanjie) static const struct group_desc x2000_groups[] = { 2747943e0da1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("uart0-data", x2000_uart0_data, 2), 2748943e0da1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("uart0-hwflow", x2000_uart0_hwflow, 2), 2749943e0da1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("uart1-data", x2000_uart1_data, 1), 2750943e0da1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("uart1-hwflow", x2000_uart1_hwflow, 1), 2751943e0da1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("uart2-data", x2000_uart2_data, 0), 2752943e0da1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("uart3-data-c", x2000_uart3_data_c, 0), 2753943e0da1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("uart3-data-d", x2000_uart3_data_d, 1), 2754943e0da1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("uart3-hwflow-c", x2000_uart3_hwflow_c, 0), 2755943e0da1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("uart3-hwflow-d", x2000_uart3_hwflow_d, 1), 2756943e0da1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("uart4-data-a", x2000_uart4_data_a, 1), 2757943e0da1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("uart4-data-c", x2000_uart4_data_c, 3), 2758943e0da1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("uart4-hwflow-a", x2000_uart4_hwflow_a, 1), 2759943e0da1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("uart4-hwflow-c", x2000_uart4_hwflow_c, 3), 2760943e0da1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("uart5-data-a", x2000_uart5_data_a, 1), 2761943e0da1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("uart5-data-c", x2000_uart5_data_c, 3), 2762943e0da1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("uart6-data-a", x2000_uart6_data_a, 1), 2763943e0da1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("uart6-data-c", x2000_uart6_data_c, 3), 2764943e0da1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("uart7-data-a", x2000_uart7_data_a, 1), 2765943e0da1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("uart7-data-c", x2000_uart7_data_c, 3), 2766943e0da1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("uart8-data", x2000_uart8_data, 3), 2767943e0da1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("uart9-data", x2000_uart9_data, 3), 276828c1caafS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("sfc-data-if0-d", x2000_sfc_data_if0_d, 1), 276928c1caafS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("sfc-data-if0-e", x2000_sfc_data_if0_e, 0), 277028c1caafS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("sfc-data-if1", x2000_sfc_data_if1, 1), 277128c1caafS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("sfc-clk-d", x2000_sfc_clk_d, 1), 277228c1caafS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("sfc-clk-e", x2000_sfc_clk_e, 0), 277328c1caafS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("sfc-ce-d", x2000_sfc_ce_d, 1), 277428c1caafS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("sfc-ce-e", x2000_sfc_ce_e, 0), 2775943e0da1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi0-dt-b", x2000_ssi0_dt_b, 1), 2776943e0da1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi0-dt-d", x2000_ssi0_dt_d, 1), 2777943e0da1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi0-dr-b", x2000_ssi0_dr_b, 1), 2778943e0da1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi0-dr-d", x2000_ssi0_dr_d, 1), 2779943e0da1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi0-clk-b", x2000_ssi0_clk_b, 1), 2780943e0da1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi0-clk-d", x2000_ssi0_clk_d, 1), 278128c1caafS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi0-ce-b", x2000_ssi0_ce_b, 1), 278228c1caafS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi0-ce-d", x2000_ssi0_ce_d, 1), 2783943e0da1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi1-dt-c", x2000_ssi1_dt_c, 2), 2784943e0da1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi1-dt-d", x2000_ssi1_dt_d, 2), 2785943e0da1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi1-dt-e", x2000_ssi1_dt_e, 1), 2786943e0da1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi1-dr-c", x2000_ssi1_dr_c, 2), 2787943e0da1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi1-dr-d", x2000_ssi1_dr_d, 2), 2788943e0da1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi1-dr-e", x2000_ssi1_dr_e, 1), 2789943e0da1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi1-clk-c", x2000_ssi1_clk_c, 2), 2790943e0da1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi1-clk-d", x2000_ssi1_clk_d, 2), 2791943e0da1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi1-clk-e", x2000_ssi1_clk_e, 1), 279228c1caafS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi1-ce-c", x2000_ssi1_ce_c, 2), 279328c1caafS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi1-ce-d", x2000_ssi1_ce_d, 2), 279428c1caafS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi1-ce-e", x2000_ssi1_ce_e, 1), 2795943e0da1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("mmc0-1bit", x2000_mmc0_1bit, 0), 2796943e0da1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("mmc0-4bit", x2000_mmc0_4bit, 0), 2797943e0da1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("mmc0-8bit", x2000_mmc0_8bit, 0), 2798943e0da1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("mmc1-1bit", x2000_mmc1_1bit, 0), 2799943e0da1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("mmc1-4bit", x2000_mmc1_4bit, 0), 2800943e0da1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("mmc2-1bit", x2000_mmc2_1bit, 0), 2801943e0da1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("mmc2-4bit", x2000_mmc2_4bit, 0), 2802943e0da1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("emc-8bit-data", x2000_emc_8bit_data, 0), 2803943e0da1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("emc-16bit-data", x2000_emc_16bit_data, 0), 2804943e0da1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("emc-addr", x2000_emc_addr, 0), 2805943e0da1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("emc-rd-we", x2000_emc_rd_we, 0), 2806943e0da1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("emc-wait", x2000_emc_wait, 0), 2807943e0da1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("emc-cs1", x2000_emc_cs1, 3), 2808943e0da1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("emc-cs2", x2000_emc_cs2, 3), 2809943e0da1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("i2c0-data", x2000_i2c0, 3), 2810943e0da1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("i2c1-data-c", x2000_i2c1_c, 2), 2811943e0da1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("i2c1-data-d", x2000_i2c1_d, 1), 2812943e0da1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("i2c2-data-b", x2000_i2c2_b, 2), 2813943e0da1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("i2c2-data-d", x2000_i2c2_d, 2), 2814943e0da1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("i2c2-data-e", x2000_i2c2_e, 1), 2815943e0da1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("i2c3-data-a", x2000_i2c3_a, 0), 2816943e0da1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("i2c3-data-d", x2000_i2c3_d, 1), 2817943e0da1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("i2c4-data-c", x2000_i2c4_c, 1), 2818943e0da1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("i2c4-data-d", x2000_i2c4_d, 2), 2819943e0da1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("i2c5-data-c", x2000_i2c5_c, 1), 2820943e0da1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("i2c5-data-d", x2000_i2c5_d, 1), 2821943e0da1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("i2s1-data-tx", x2000_i2s1_data_tx, 2), 2822943e0da1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("i2s1-data-rx", x2000_i2s1_data_rx, 2), 2823943e0da1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("i2s1-clk-tx", x2000_i2s1_clk_tx, 2), 2824943e0da1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("i2s1-clk-rx", x2000_i2s1_clk_rx, 2), 2825943e0da1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("i2s1-sysclk-tx", x2000_i2s1_sysclk_tx, 2), 2826943e0da1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("i2s1-sysclk-rx", x2000_i2s1_sysclk_rx, 2), 2827943e0da1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("i2s2-data-rx0", x2000_i2s2_data_rx0, 2), 2828943e0da1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("i2s2-data-rx1", x2000_i2s2_data_rx1, 2), 2829943e0da1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("i2s2-data-rx2", x2000_i2s2_data_rx2, 2), 2830943e0da1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("i2s2-data-rx3", x2000_i2s2_data_rx3, 2), 2831943e0da1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("i2s2-clk-rx", x2000_i2s2_clk_rx, 2), 2832943e0da1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("i2s2-sysclk-rx", x2000_i2s2_sysclk_rx, 2), 2833943e0da1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("i2s3-data-tx0", x2000_i2s3_data_tx0, 2), 2834943e0da1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("i2s3-data-tx1", x2000_i2s3_data_tx1, 2), 2835943e0da1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("i2s3-data-tx2", x2000_i2s3_data_tx2, 2), 2836943e0da1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("i2s3-data-tx3", x2000_i2s3_data_tx3, 2), 2837943e0da1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("i2s3-clk-tx", x2000_i2s3_clk_tx, 2), 2838943e0da1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("i2s3-sysclk-tx", x2000_i2s3_sysclk_tx, 2), 283928c1caafS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("dmic-if0", x2000_dmic_if0, 0), 284028c1caafS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("dmic-if1", x2000_dmic_if1, 0), 284128c1caafS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("dmic-if2", x2000_dmic_if2, 0), 284228c1caafS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("dmic-if3", x2000_dmic_if3, 0), 2843943e0da1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP_FUNCS("cim-data-8bit", x2000_cim_8bit, 2844943e0da1S周琰杰 (Zhou Yanjie) x2000_cim_8bit_funcs), 2845943e0da1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("cim-data-12bit", x2000_cim_12bit, 0), 2846943e0da1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("lcd-tft-8bit", x2000_lcd_tft_8bit, 1), 2847943e0da1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("lcd-tft-16bit", x2000_lcd_tft_16bit, 1), 2848943e0da1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("lcd-tft-18bit", x2000_lcd_tft_18bit, 1), 2849943e0da1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("lcd-tft-24bit", x2000_lcd_tft_24bit, 1), 2850943e0da1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("lcd-slcd-8bit", x2000_lcd_slcd_8bit, 2), 2851943e0da1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("lcd-slcd-16bit", x2000_lcd_tft_16bit, 2), 2852943e0da1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("pwm0-c", x2000_pwm_pwm0_c, 0), 2853943e0da1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("pwm0-d", x2000_pwm_pwm0_d, 2), 2854943e0da1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("pwm1-c", x2000_pwm_pwm1_c, 0), 2855943e0da1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("pwm1-d", x2000_pwm_pwm1_d, 2), 2856943e0da1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("pwm2-c", x2000_pwm_pwm2_c, 0), 2857943e0da1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("pwm2-e", x2000_pwm_pwm2_e, 1), 2858943e0da1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("pwm3-c", x2000_pwm_pwm3_c, 0), 2859943e0da1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("pwm3-e", x2000_pwm_pwm3_e, 1), 2860943e0da1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("pwm4-c", x2000_pwm_pwm4_c, 0), 2861943e0da1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("pwm4-e", x2000_pwm_pwm4_e, 1), 2862943e0da1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("pwm5-c", x2000_pwm_pwm5_c, 0), 2863943e0da1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("pwm5-e", x2000_pwm_pwm5_e, 1), 2864943e0da1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("pwm6-c", x2000_pwm_pwm6_c, 0), 2865943e0da1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("pwm6-e", x2000_pwm_pwm6_e, 1), 2866943e0da1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("pwm7-c", x2000_pwm_pwm7_c, 0), 2867943e0da1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("pwm7-e", x2000_pwm_pwm7_e, 1), 2868943e0da1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("pwm8", x2000_pwm_pwm8, 0), 2869943e0da1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("pwm9", x2000_pwm_pwm9, 0), 2870943e0da1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("pwm10", x2000_pwm_pwm10, 0), 2871943e0da1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("pwm11", x2000_pwm_pwm11, 0), 2872943e0da1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("pwm12", x2000_pwm_pwm12, 0), 2873943e0da1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("pwm13", x2000_pwm_pwm13, 0), 2874943e0da1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("pwm14", x2000_pwm_pwm14, 0), 2875943e0da1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("pwm15", x2000_pwm_pwm15, 0), 2876943e0da1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("mac0-rmii", x2000_mac0_rmii, 1), 2877943e0da1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("mac0-rgmii", x2000_mac0_rgmii, 1), 2878943e0da1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("mac1-rmii", x2000_mac1_rmii, 3), 2879943e0da1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("mac1-rgmii", x2000_mac1_rgmii, 3), 2880943e0da1S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("otg-vbus", x2000_otg, 0), 2881943e0da1S周琰杰 (Zhou Yanjie) }; 2882943e0da1S周琰杰 (Zhou Yanjie) 2883943e0da1S周琰杰 (Zhou Yanjie) static const char *x2000_uart0_groups[] = { "uart0-data", "uart0-hwflow", }; 2884943e0da1S周琰杰 (Zhou Yanjie) static const char *x2000_uart1_groups[] = { "uart1-data", "uart1-hwflow", }; 2885943e0da1S周琰杰 (Zhou Yanjie) static const char *x2000_uart2_groups[] = { "uart2-data", }; 2886943e0da1S周琰杰 (Zhou Yanjie) static const char *x2000_uart3_groups[] = { 2887943e0da1S周琰杰 (Zhou Yanjie) "uart3-data-c", "uart3-data-d", "uart3-hwflow-c", "uart3-hwflow-d", 2888943e0da1S周琰杰 (Zhou Yanjie) }; 2889943e0da1S周琰杰 (Zhou Yanjie) static const char *x2000_uart4_groups[] = { 2890943e0da1S周琰杰 (Zhou Yanjie) "uart4-data-a", "uart4-data-c", "uart4-hwflow-a", "uart4-hwflow-c", 2891943e0da1S周琰杰 (Zhou Yanjie) }; 2892943e0da1S周琰杰 (Zhou Yanjie) static const char *x2000_uart5_groups[] = { "uart5-data-a", "uart5-data-c", }; 2893943e0da1S周琰杰 (Zhou Yanjie) static const char *x2000_uart6_groups[] = { "uart6-data-a", "uart6-data-c", }; 2894943e0da1S周琰杰 (Zhou Yanjie) static const char *x2000_uart7_groups[] = { "uart7-data-a", "uart7-data-c", }; 2895943e0da1S周琰杰 (Zhou Yanjie) static const char *x2000_uart8_groups[] = { "uart8-data", }; 2896943e0da1S周琰杰 (Zhou Yanjie) static const char *x2000_uart9_groups[] = { "uart9-data", }; 289728c1caafS周琰杰 (Zhou Yanjie) static const char *x2000_sfc_groups[] = { 289828c1caafS周琰杰 (Zhou Yanjie) "sfc-data-if0-d", "sfc-data-if0-e", "sfc-data-if1", 289928c1caafS周琰杰 (Zhou Yanjie) "sfc-clk-d", "sfc-clk-e", "sfc-ce-d", "sfc-ce-e", 290028c1caafS周琰杰 (Zhou Yanjie) }; 2901943e0da1S周琰杰 (Zhou Yanjie) static const char *x2000_ssi0_groups[] = { 2902943e0da1S周琰杰 (Zhou Yanjie) "ssi0-dt-b", "ssi0-dt-d", 2903943e0da1S周琰杰 (Zhou Yanjie) "ssi0-dr-b", "ssi0-dr-d", 2904943e0da1S周琰杰 (Zhou Yanjie) "ssi0-clk-b", "ssi0-clk-d", 290528c1caafS周琰杰 (Zhou Yanjie) "ssi0-ce-b", "ssi0-ce-d", 2906943e0da1S周琰杰 (Zhou Yanjie) }; 2907943e0da1S周琰杰 (Zhou Yanjie) static const char *x2000_ssi1_groups[] = { 2908943e0da1S周琰杰 (Zhou Yanjie) "ssi1-dt-c", "ssi1-dt-d", "ssi1-dt-e", 2909943e0da1S周琰杰 (Zhou Yanjie) "ssi1-dr-c", "ssi1-dr-d", "ssi1-dr-e", 2910943e0da1S周琰杰 (Zhou Yanjie) "ssi1-clk-c", "ssi1-clk-d", "ssi1-clk-e", 291128c1caafS周琰杰 (Zhou Yanjie) "ssi1-ce-c", "ssi1-ce-d", "ssi1-ce-e", 2912943e0da1S周琰杰 (Zhou Yanjie) }; 2913943e0da1S周琰杰 (Zhou Yanjie) static const char *x2000_mmc0_groups[] = { "mmc0-1bit", "mmc0-4bit", "mmc0-8bit", }; 2914943e0da1S周琰杰 (Zhou Yanjie) static const char *x2000_mmc1_groups[] = { "mmc1-1bit", "mmc1-4bit", }; 2915943e0da1S周琰杰 (Zhou Yanjie) static const char *x2000_mmc2_groups[] = { "mmc2-1bit", "mmc2-4bit", }; 2916943e0da1S周琰杰 (Zhou Yanjie) static const char *x2000_emc_groups[] = { 2917943e0da1S周琰杰 (Zhou Yanjie) "emc-8bit-data", "emc-16bit-data", 2918943e0da1S周琰杰 (Zhou Yanjie) "emc-addr", "emc-rd-we", "emc-wait", 2919943e0da1S周琰杰 (Zhou Yanjie) }; 2920943e0da1S周琰杰 (Zhou Yanjie) static const char *x2000_cs1_groups[] = { "emc-cs1", }; 2921943e0da1S周琰杰 (Zhou Yanjie) static const char *x2000_cs2_groups[] = { "emc-cs2", }; 2922943e0da1S周琰杰 (Zhou Yanjie) static const char *x2000_i2c0_groups[] = { "i2c0-data", }; 2923943e0da1S周琰杰 (Zhou Yanjie) static const char *x2000_i2c1_groups[] = { "i2c1-data-c", "i2c1-data-d", }; 2924943e0da1S周琰杰 (Zhou Yanjie) static const char *x2000_i2c2_groups[] = { "i2c2-data-b", "i2c2-data-d", }; 2925943e0da1S周琰杰 (Zhou Yanjie) static const char *x2000_i2c3_groups[] = { "i2c3-data-a", "i2c3-data-d", }; 2926943e0da1S周琰杰 (Zhou Yanjie) static const char *x2000_i2c4_groups[] = { "i2c4-data-c", "i2c4-data-d", }; 2927943e0da1S周琰杰 (Zhou Yanjie) static const char *x2000_i2c5_groups[] = { "i2c5-data-c", "i2c5-data-d", }; 2928943e0da1S周琰杰 (Zhou Yanjie) static const char *x2000_i2s1_groups[] = { 2929943e0da1S周琰杰 (Zhou Yanjie) "i2s1-data-tx", "i2s1-data-rx", 2930943e0da1S周琰杰 (Zhou Yanjie) "i2s1-clk-tx", "i2s1-clk-rx", 2931943e0da1S周琰杰 (Zhou Yanjie) "i2s1-sysclk-tx", "i2s1-sysclk-rx", 2932943e0da1S周琰杰 (Zhou Yanjie) }; 2933943e0da1S周琰杰 (Zhou Yanjie) static const char *x2000_i2s2_groups[] = { 2934943e0da1S周琰杰 (Zhou Yanjie) "i2s2-data-rx0", "i2s2-data-rx1", "i2s2-data-rx2", "i2s2-data-rx3", 2935943e0da1S周琰杰 (Zhou Yanjie) "i2s2-clk-rx", "i2s2-sysclk-rx", 2936943e0da1S周琰杰 (Zhou Yanjie) }; 2937943e0da1S周琰杰 (Zhou Yanjie) static const char *x2000_i2s3_groups[] = { 2938943e0da1S周琰杰 (Zhou Yanjie) "i2s3-data-tx0", "i2s3-data-tx1", "i2s3-data-tx2", "i2s3-data-tx3", 2939943e0da1S周琰杰 (Zhou Yanjie) "i2s3-clk-tx", "i2s3-sysclk-tx", 2940943e0da1S周琰杰 (Zhou Yanjie) }; 294128c1caafS周琰杰 (Zhou Yanjie) static const char *x2000_dmic_groups[] = { 294228c1caafS周琰杰 (Zhou Yanjie) "dmic-if0", "dmic-if1", "dmic-if2", "dmic-if3", 294328c1caafS周琰杰 (Zhou Yanjie) }; 2944943e0da1S周琰杰 (Zhou Yanjie) static const char *x2000_cim_groups[] = { "cim-data-8bit", "cim-data-12bit", }; 2945943e0da1S周琰杰 (Zhou Yanjie) static const char *x2000_lcd_groups[] = { 2946943e0da1S周琰杰 (Zhou Yanjie) "lcd-tft-8bit", "lcd-tft-16bit", "lcd-tft-18bit", "lcd-tft-24bit", 2947943e0da1S周琰杰 (Zhou Yanjie) "lcd-slcd-8bit", "lcd-slcd-16bit", 2948943e0da1S周琰杰 (Zhou Yanjie) }; 2949943e0da1S周琰杰 (Zhou Yanjie) static const char *x2000_pwm0_groups[] = { "pwm0-c", "pwm0-d", }; 2950943e0da1S周琰杰 (Zhou Yanjie) static const char *x2000_pwm1_groups[] = { "pwm1-c", "pwm1-d", }; 2951943e0da1S周琰杰 (Zhou Yanjie) static const char *x2000_pwm2_groups[] = { "pwm2-c", "pwm2-e", }; 2952943e0da1S周琰杰 (Zhou Yanjie) static const char *x2000_pwm3_groups[] = { "pwm3-c", "pwm3-r", }; 2953943e0da1S周琰杰 (Zhou Yanjie) static const char *x2000_pwm4_groups[] = { "pwm4-c", "pwm4-e", }; 2954943e0da1S周琰杰 (Zhou Yanjie) static const char *x2000_pwm5_groups[] = { "pwm5-c", "pwm5-e", }; 2955943e0da1S周琰杰 (Zhou Yanjie) static const char *x2000_pwm6_groups[] = { "pwm6-c", "pwm6-e", }; 2956943e0da1S周琰杰 (Zhou Yanjie) static const char *x2000_pwm7_groups[] = { "pwm7-c", "pwm7-e", }; 2957943e0da1S周琰杰 (Zhou Yanjie) static const char *x2000_pwm8_groups[] = { "pwm8", }; 2958943e0da1S周琰杰 (Zhou Yanjie) static const char *x2000_pwm9_groups[] = { "pwm9", }; 2959943e0da1S周琰杰 (Zhou Yanjie) static const char *x2000_pwm10_groups[] = { "pwm10", }; 2960943e0da1S周琰杰 (Zhou Yanjie) static const char *x2000_pwm11_groups[] = { "pwm11", }; 2961943e0da1S周琰杰 (Zhou Yanjie) static const char *x2000_pwm12_groups[] = { "pwm12", }; 2962943e0da1S周琰杰 (Zhou Yanjie) static const char *x2000_pwm13_groups[] = { "pwm13", }; 2963943e0da1S周琰杰 (Zhou Yanjie) static const char *x2000_pwm14_groups[] = { "pwm14", }; 2964943e0da1S周琰杰 (Zhou Yanjie) static const char *x2000_pwm15_groups[] = { "pwm15", }; 2965943e0da1S周琰杰 (Zhou Yanjie) static const char *x2000_mac0_groups[] = { "mac0-rmii", "mac0-rgmii", }; 2966943e0da1S周琰杰 (Zhou Yanjie) static const char *x2000_mac1_groups[] = { "mac1-rmii", "mac1-rgmii", }; 2967943e0da1S周琰杰 (Zhou Yanjie) static const char *x2000_otg_groups[] = { "otg-vbus", }; 2968943e0da1S周琰杰 (Zhou Yanjie) 2969943e0da1S周琰杰 (Zhou Yanjie) static const struct function_desc x2000_functions[] = { 2970943e0da1S周琰杰 (Zhou Yanjie) { "uart0", x2000_uart0_groups, ARRAY_SIZE(x2000_uart0_groups), }, 2971943e0da1S周琰杰 (Zhou Yanjie) { "uart1", x2000_uart1_groups, ARRAY_SIZE(x2000_uart1_groups), }, 2972943e0da1S周琰杰 (Zhou Yanjie) { "uart2", x2000_uart2_groups, ARRAY_SIZE(x2000_uart2_groups), }, 2973943e0da1S周琰杰 (Zhou Yanjie) { "uart3", x2000_uart3_groups, ARRAY_SIZE(x2000_uart3_groups), }, 2974943e0da1S周琰杰 (Zhou Yanjie) { "uart4", x2000_uart4_groups, ARRAY_SIZE(x2000_uart4_groups), }, 2975943e0da1S周琰杰 (Zhou Yanjie) { "uart5", x2000_uart5_groups, ARRAY_SIZE(x2000_uart5_groups), }, 2976943e0da1S周琰杰 (Zhou Yanjie) { "uart6", x2000_uart6_groups, ARRAY_SIZE(x2000_uart6_groups), }, 2977943e0da1S周琰杰 (Zhou Yanjie) { "uart7", x2000_uart7_groups, ARRAY_SIZE(x2000_uart7_groups), }, 2978943e0da1S周琰杰 (Zhou Yanjie) { "uart8", x2000_uart8_groups, ARRAY_SIZE(x2000_uart8_groups), }, 2979943e0da1S周琰杰 (Zhou Yanjie) { "uart9", x2000_uart9_groups, ARRAY_SIZE(x2000_uart9_groups), }, 2980943e0da1S周琰杰 (Zhou Yanjie) { "sfc", x2000_sfc_groups, ARRAY_SIZE(x2000_sfc_groups), }, 2981943e0da1S周琰杰 (Zhou Yanjie) { "ssi0", x2000_ssi0_groups, ARRAY_SIZE(x2000_ssi0_groups), }, 2982943e0da1S周琰杰 (Zhou Yanjie) { "ssi1", x2000_ssi1_groups, ARRAY_SIZE(x2000_ssi1_groups), }, 2983943e0da1S周琰杰 (Zhou Yanjie) { "mmc0", x2000_mmc0_groups, ARRAY_SIZE(x2000_mmc0_groups), }, 2984943e0da1S周琰杰 (Zhou Yanjie) { "mmc1", x2000_mmc1_groups, ARRAY_SIZE(x2000_mmc1_groups), }, 2985943e0da1S周琰杰 (Zhou Yanjie) { "mmc2", x2000_mmc2_groups, ARRAY_SIZE(x2000_mmc2_groups), }, 2986943e0da1S周琰杰 (Zhou Yanjie) { "emc", x2000_emc_groups, ARRAY_SIZE(x2000_emc_groups), }, 2987943e0da1S周琰杰 (Zhou Yanjie) { "emc-cs1", x2000_cs1_groups, ARRAY_SIZE(x2000_cs1_groups), }, 2988943e0da1S周琰杰 (Zhou Yanjie) { "emc-cs2", x2000_cs2_groups, ARRAY_SIZE(x2000_cs2_groups), }, 2989943e0da1S周琰杰 (Zhou Yanjie) { "i2c0", x2000_i2c0_groups, ARRAY_SIZE(x2000_i2c0_groups), }, 2990943e0da1S周琰杰 (Zhou Yanjie) { "i2c1", x2000_i2c1_groups, ARRAY_SIZE(x2000_i2c1_groups), }, 2991943e0da1S周琰杰 (Zhou Yanjie) { "i2c2", x2000_i2c2_groups, ARRAY_SIZE(x2000_i2c2_groups), }, 2992943e0da1S周琰杰 (Zhou Yanjie) { "i2c3", x2000_i2c3_groups, ARRAY_SIZE(x2000_i2c3_groups), }, 2993943e0da1S周琰杰 (Zhou Yanjie) { "i2c4", x2000_i2c4_groups, ARRAY_SIZE(x2000_i2c4_groups), }, 2994943e0da1S周琰杰 (Zhou Yanjie) { "i2c5", x2000_i2c5_groups, ARRAY_SIZE(x2000_i2c5_groups), }, 2995943e0da1S周琰杰 (Zhou Yanjie) { "i2s1", x2000_i2s1_groups, ARRAY_SIZE(x2000_i2s1_groups), }, 2996943e0da1S周琰杰 (Zhou Yanjie) { "i2s2", x2000_i2s2_groups, ARRAY_SIZE(x2000_i2s2_groups), }, 2997943e0da1S周琰杰 (Zhou Yanjie) { "i2s3", x2000_i2s3_groups, ARRAY_SIZE(x2000_i2s3_groups), }, 2998943e0da1S周琰杰 (Zhou Yanjie) { "dmic", x2000_dmic_groups, ARRAY_SIZE(x2000_dmic_groups), }, 2999943e0da1S周琰杰 (Zhou Yanjie) { "cim", x2000_cim_groups, ARRAY_SIZE(x2000_cim_groups), }, 3000943e0da1S周琰杰 (Zhou Yanjie) { "lcd", x2000_lcd_groups, ARRAY_SIZE(x2000_lcd_groups), }, 3001943e0da1S周琰杰 (Zhou Yanjie) { "pwm0", x2000_pwm0_groups, ARRAY_SIZE(x2000_pwm0_groups), }, 3002943e0da1S周琰杰 (Zhou Yanjie) { "pwm1", x2000_pwm1_groups, ARRAY_SIZE(x2000_pwm1_groups), }, 3003943e0da1S周琰杰 (Zhou Yanjie) { "pwm2", x2000_pwm2_groups, ARRAY_SIZE(x2000_pwm2_groups), }, 3004943e0da1S周琰杰 (Zhou Yanjie) { "pwm3", x2000_pwm3_groups, ARRAY_SIZE(x2000_pwm3_groups), }, 3005943e0da1S周琰杰 (Zhou Yanjie) { "pwm4", x2000_pwm4_groups, ARRAY_SIZE(x2000_pwm4_groups), }, 3006943e0da1S周琰杰 (Zhou Yanjie) { "pwm5", x2000_pwm5_groups, ARRAY_SIZE(x2000_pwm5_groups), }, 3007943e0da1S周琰杰 (Zhou Yanjie) { "pwm6", x2000_pwm6_groups, ARRAY_SIZE(x2000_pwm6_groups), }, 3008943e0da1S周琰杰 (Zhou Yanjie) { "pwm7", x2000_pwm7_groups, ARRAY_SIZE(x2000_pwm7_groups), }, 3009943e0da1S周琰杰 (Zhou Yanjie) { "pwm8", x2000_pwm8_groups, ARRAY_SIZE(x2000_pwm8_groups), }, 3010943e0da1S周琰杰 (Zhou Yanjie) { "pwm9", x2000_pwm9_groups, ARRAY_SIZE(x2000_pwm9_groups), }, 3011943e0da1S周琰杰 (Zhou Yanjie) { "pwm10", x2000_pwm10_groups, ARRAY_SIZE(x2000_pwm10_groups), }, 3012943e0da1S周琰杰 (Zhou Yanjie) { "pwm11", x2000_pwm11_groups, ARRAY_SIZE(x2000_pwm11_groups), }, 3013943e0da1S周琰杰 (Zhou Yanjie) { "pwm12", x2000_pwm12_groups, ARRAY_SIZE(x2000_pwm12_groups), }, 3014943e0da1S周琰杰 (Zhou Yanjie) { "pwm13", x2000_pwm13_groups, ARRAY_SIZE(x2000_pwm13_groups), }, 3015943e0da1S周琰杰 (Zhou Yanjie) { "pwm14", x2000_pwm14_groups, ARRAY_SIZE(x2000_pwm14_groups), }, 3016943e0da1S周琰杰 (Zhou Yanjie) { "pwm15", x2000_pwm15_groups, ARRAY_SIZE(x2000_pwm15_groups), }, 3017943e0da1S周琰杰 (Zhou Yanjie) { "mac0", x2000_mac0_groups, ARRAY_SIZE(x2000_mac0_groups), }, 3018943e0da1S周琰杰 (Zhou Yanjie) { "mac1", x2000_mac1_groups, ARRAY_SIZE(x2000_mac1_groups), }, 3019943e0da1S周琰杰 (Zhou Yanjie) { "otg", x2000_otg_groups, ARRAY_SIZE(x2000_otg_groups), }, 3020943e0da1S周琰杰 (Zhou Yanjie) }; 3021943e0da1S周琰杰 (Zhou Yanjie) 30229279c00fSAidan MacDonald static const struct regmap_range x2000_access_ranges[] = { 30239279c00fSAidan MacDonald regmap_reg_range(0x000, 0x500 - 4), 30249279c00fSAidan MacDonald regmap_reg_range(0x700, 0x800 - 4), 30259279c00fSAidan MacDonald }; 30269279c00fSAidan MacDonald 30279279c00fSAidan MacDonald /* shared with X2100 */ 30289279c00fSAidan MacDonald static const struct regmap_access_table x2000_access_table = { 30299279c00fSAidan MacDonald .yes_ranges = x2000_access_ranges, 30309279c00fSAidan MacDonald .n_yes_ranges = ARRAY_SIZE(x2000_access_ranges), 30319279c00fSAidan MacDonald }; 30329279c00fSAidan MacDonald 3033943e0da1S周琰杰 (Zhou Yanjie) static const struct ingenic_chip_info x2000_chip_info = { 3034943e0da1S周琰杰 (Zhou Yanjie) .num_chips = 5, 3035943e0da1S周琰杰 (Zhou Yanjie) .reg_offset = 0x100, 3036943e0da1S周琰杰 (Zhou Yanjie) .version = ID_X2000, 3037943e0da1S周琰杰 (Zhou Yanjie) .groups = x2000_groups, 3038943e0da1S周琰杰 (Zhou Yanjie) .num_groups = ARRAY_SIZE(x2000_groups), 3039943e0da1S周琰杰 (Zhou Yanjie) .functions = x2000_functions, 3040943e0da1S周琰杰 (Zhou Yanjie) .num_functions = ARRAY_SIZE(x2000_functions), 3041943e0da1S周琰杰 (Zhou Yanjie) .pull_ups = x2000_pull_ups, 3042943e0da1S周琰杰 (Zhou Yanjie) .pull_downs = x2000_pull_downs, 30439279c00fSAidan MacDonald .access_table = &x2000_access_table, 3044943e0da1S周琰杰 (Zhou Yanjie) }; 3045943e0da1S周琰杰 (Zhou Yanjie) 30462a18211bS周琰杰 (Zhou Yanjie) static const u32 x2100_pull_ups[5] = { 30472a18211bS周琰杰 (Zhou Yanjie) 0x0003ffff, 0xffffffff, 0x1ff0ffff, 0xc7fe3f3f, 0x0fbf003f, 30482a18211bS周琰杰 (Zhou Yanjie) }; 30492a18211bS周琰杰 (Zhou Yanjie) 30502a18211bS周琰杰 (Zhou Yanjie) static const u32 x2100_pull_downs[5] = { 30512a18211bS周琰杰 (Zhou Yanjie) 0x0003ffff, 0xffffffff, 0x1ff0ffff, 0x00000000, 0x0fbf003f, 30522a18211bS周琰杰 (Zhou Yanjie) }; 30532a18211bS周琰杰 (Zhou Yanjie) 30542a18211bS周琰杰 (Zhou Yanjie) static int x2100_mac_pins[] = { 30552a18211bS周琰杰 (Zhou Yanjie) 0x4b, 0x47, 0x46, 0x4a, 0x43, 0x42, 0x4c, 0x4d, 0x4f, 0x41, 30562a18211bS周琰杰 (Zhou Yanjie) }; 30572a18211bS周琰杰 (Zhou Yanjie) 30582a18211bS周琰杰 (Zhou Yanjie) static const struct group_desc x2100_groups[] = { 30592a18211bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("uart0-data", x2000_uart0_data, 2), 30602a18211bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("uart0-hwflow", x2000_uart0_hwflow, 2), 30612a18211bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("uart1-data", x2000_uart1_data, 1), 30622a18211bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("uart1-hwflow", x2000_uart1_hwflow, 1), 30632a18211bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("uart2-data", x2000_uart2_data, 0), 30642a18211bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("uart3-data-c", x2000_uart3_data_c, 0), 30652a18211bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("uart3-data-d", x2000_uart3_data_d, 1), 30662a18211bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("uart3-hwflow-c", x2000_uart3_hwflow_c, 0), 30672a18211bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("uart3-hwflow-d", x2000_uart3_hwflow_d, 1), 30682a18211bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("uart4-data-a", x2000_uart4_data_a, 1), 30692a18211bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("uart4-data-c", x2000_uart4_data_c, 3), 30702a18211bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("uart4-hwflow-a", x2000_uart4_hwflow_a, 1), 30712a18211bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("uart4-hwflow-c", x2000_uart4_hwflow_c, 3), 30722a18211bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("uart5-data-a", x2000_uart5_data_a, 1), 30732a18211bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("uart5-data-c", x2000_uart5_data_c, 3), 30742a18211bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("uart6-data-a", x2000_uart6_data_a, 1), 30752a18211bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("uart6-data-c", x2000_uart6_data_c, 3), 30762a18211bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("uart7-data-a", x2000_uart7_data_a, 1), 30772a18211bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("uart7-data-c", x2000_uart7_data_c, 3), 30782a18211bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("uart8-data", x2000_uart8_data, 3), 30792a18211bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("uart9-data", x2000_uart9_data, 3), 30802a18211bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("sfc-data-if0-d", x2000_sfc_data_if0_d, 1), 30812a18211bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("sfc-data-if0-e", x2000_sfc_data_if0_e, 0), 30822a18211bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("sfc-data-if1", x2000_sfc_data_if1, 1), 30832a18211bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("sfc-clk-d", x2000_sfc_clk_d, 1), 30842a18211bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("sfc-clk-e", x2000_sfc_clk_e, 0), 30852a18211bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("sfc-ce-d", x2000_sfc_ce_d, 1), 30862a18211bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("sfc-ce-e", x2000_sfc_ce_e, 0), 30872a18211bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi0-dt-b", x2000_ssi0_dt_b, 1), 30882a18211bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi0-dt-d", x2000_ssi0_dt_d, 1), 30892a18211bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi0-dr-b", x2000_ssi0_dr_b, 1), 30902a18211bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi0-dr-d", x2000_ssi0_dr_d, 1), 30912a18211bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi0-clk-b", x2000_ssi0_clk_b, 1), 30922a18211bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi0-clk-d", x2000_ssi0_clk_d, 1), 30932a18211bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi0-ce-b", x2000_ssi0_ce_b, 1), 30942a18211bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi0-ce-d", x2000_ssi0_ce_d, 1), 30952a18211bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi1-dt-c", x2000_ssi1_dt_c, 2), 30962a18211bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi1-dt-d", x2000_ssi1_dt_d, 2), 30972a18211bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi1-dt-e", x2000_ssi1_dt_e, 1), 30982a18211bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi1-dr-c", x2000_ssi1_dr_c, 2), 30992a18211bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi1-dr-d", x2000_ssi1_dr_d, 2), 31002a18211bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi1-dr-e", x2000_ssi1_dr_e, 1), 31012a18211bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi1-clk-c", x2000_ssi1_clk_c, 2), 31022a18211bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi1-clk-d", x2000_ssi1_clk_d, 2), 31032a18211bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi1-clk-e", x2000_ssi1_clk_e, 1), 31042a18211bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi1-ce-c", x2000_ssi1_ce_c, 2), 31052a18211bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi1-ce-d", x2000_ssi1_ce_d, 2), 31062a18211bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi1-ce-e", x2000_ssi1_ce_e, 1), 31072a18211bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("mmc0-1bit", x2000_mmc0_1bit, 0), 31082a18211bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("mmc0-4bit", x2000_mmc0_4bit, 0), 31092a18211bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("mmc0-8bit", x2000_mmc0_8bit, 0), 31102a18211bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("mmc1-1bit", x2000_mmc1_1bit, 0), 31112a18211bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("mmc1-4bit", x2000_mmc1_4bit, 0), 31122a18211bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("mmc2-1bit", x2000_mmc2_1bit, 0), 31132a18211bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("mmc2-4bit", x2000_mmc2_4bit, 0), 31142a18211bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("emc-8bit-data", x2000_emc_8bit_data, 0), 31152a18211bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("emc-16bit-data", x2000_emc_16bit_data, 0), 31162a18211bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("emc-addr", x2000_emc_addr, 0), 31172a18211bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("emc-rd-we", x2000_emc_rd_we, 0), 31182a18211bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("emc-wait", x2000_emc_wait, 0), 31192a18211bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("emc-cs1", x2000_emc_cs1, 3), 31202a18211bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("emc-cs2", x2000_emc_cs2, 3), 31212a18211bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("i2c0-data", x2000_i2c0, 3), 31222a18211bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("i2c1-data-c", x2000_i2c1_c, 2), 31232a18211bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("i2c1-data-d", x2000_i2c1_d, 1), 31242a18211bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("i2c2-data-b", x2000_i2c2_b, 2), 31252a18211bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("i2c2-data-d", x2000_i2c2_d, 2), 31262a18211bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("i2c2-data-e", x2000_i2c2_e, 1), 31272a18211bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("i2c3-data-a", x2000_i2c3_a, 0), 31282a18211bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("i2c3-data-d", x2000_i2c3_d, 1), 31292a18211bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("i2c4-data-c", x2000_i2c4_c, 1), 31302a18211bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("i2c4-data-d", x2000_i2c4_d, 2), 31312a18211bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("i2c5-data-c", x2000_i2c5_c, 1), 31322a18211bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("i2c5-data-d", x2000_i2c5_d, 1), 31332a18211bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("i2s1-data-tx", x2000_i2s1_data_tx, 2), 31342a18211bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("i2s1-data-rx", x2000_i2s1_data_rx, 2), 31352a18211bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("i2s1-clk-tx", x2000_i2s1_clk_tx, 2), 31362a18211bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("i2s1-clk-rx", x2000_i2s1_clk_rx, 2), 31372a18211bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("i2s1-sysclk-tx", x2000_i2s1_sysclk_tx, 2), 31382a18211bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("i2s1-sysclk-rx", x2000_i2s1_sysclk_rx, 2), 31392a18211bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("i2s2-data-rx0", x2000_i2s2_data_rx0, 2), 31402a18211bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("i2s2-data-rx1", x2000_i2s2_data_rx1, 2), 31412a18211bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("i2s2-data-rx2", x2000_i2s2_data_rx2, 2), 31422a18211bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("i2s2-data-rx3", x2000_i2s2_data_rx3, 2), 31432a18211bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("i2s2-clk-rx", x2000_i2s2_clk_rx, 2), 31442a18211bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("i2s2-sysclk-rx", x2000_i2s2_sysclk_rx, 2), 31452a18211bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("i2s3-data-tx0", x2000_i2s3_data_tx0, 2), 31462a18211bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("i2s3-data-tx1", x2000_i2s3_data_tx1, 2), 31472a18211bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("i2s3-data-tx2", x2000_i2s3_data_tx2, 2), 31482a18211bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("i2s3-data-tx3", x2000_i2s3_data_tx3, 2), 31492a18211bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("i2s3-clk-tx", x2000_i2s3_clk_tx, 2), 31502a18211bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("i2s3-sysclk-tx", x2000_i2s3_sysclk_tx, 2), 31512a18211bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("dmic-if0", x2000_dmic_if0, 0), 31522a18211bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("dmic-if1", x2000_dmic_if1, 0), 31532a18211bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("dmic-if2", x2000_dmic_if2, 0), 31542a18211bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("dmic-if3", x2000_dmic_if3, 0), 31552a18211bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP_FUNCS("cim-data-8bit", x2000_cim_8bit, 31562a18211bS周琰杰 (Zhou Yanjie) x2000_cim_8bit_funcs), 31572a18211bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("cim-data-12bit", x2000_cim_12bit, 0), 31582a18211bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("lcd-tft-8bit", x2000_lcd_tft_8bit, 1), 31592a18211bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("lcd-tft-16bit", x2000_lcd_tft_16bit, 1), 31602a18211bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("lcd-tft-18bit", x2000_lcd_tft_18bit, 1), 31612a18211bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("lcd-tft-24bit", x2000_lcd_tft_24bit, 1), 31622a18211bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("lcd-slcd-8bit", x2000_lcd_slcd_8bit, 2), 31632a18211bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("lcd-slcd-16bit", x2000_lcd_tft_16bit, 2), 31642a18211bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("pwm0-c", x2000_pwm_pwm0_c, 0), 31652a18211bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("pwm0-d", x2000_pwm_pwm0_d, 2), 31662a18211bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("pwm1-c", x2000_pwm_pwm1_c, 0), 31672a18211bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("pwm1-d", x2000_pwm_pwm1_d, 2), 31682a18211bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("pwm2-c", x2000_pwm_pwm2_c, 0), 31692a18211bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("pwm2-e", x2000_pwm_pwm2_e, 1), 31702a18211bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("pwm3-c", x2000_pwm_pwm3_c, 0), 31712a18211bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("pwm3-e", x2000_pwm_pwm3_e, 1), 31722a18211bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("pwm4-c", x2000_pwm_pwm4_c, 0), 31732a18211bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("pwm4-e", x2000_pwm_pwm4_e, 1), 31742a18211bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("pwm5-c", x2000_pwm_pwm5_c, 0), 31752a18211bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("pwm5-e", x2000_pwm_pwm5_e, 1), 31762a18211bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("pwm6-c", x2000_pwm_pwm6_c, 0), 31772a18211bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("pwm6-e", x2000_pwm_pwm6_e, 1), 31782a18211bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("pwm7-c", x2000_pwm_pwm7_c, 0), 31792a18211bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("pwm7-e", x2000_pwm_pwm7_e, 1), 31802a18211bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("pwm8", x2000_pwm_pwm8, 0), 31812a18211bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("pwm9", x2000_pwm_pwm9, 0), 31822a18211bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("pwm10", x2000_pwm_pwm10, 0), 31832a18211bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("pwm11", x2000_pwm_pwm11, 0), 31842a18211bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("pwm12", x2000_pwm_pwm12, 0), 31852a18211bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("pwm13", x2000_pwm_pwm13, 0), 31862a18211bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("pwm14", x2000_pwm_pwm14, 0), 31872a18211bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("pwm15", x2000_pwm_pwm15, 0), 31882a18211bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("mac", x2100_mac, 1), 31892a18211bS周琰杰 (Zhou Yanjie) }; 31902a18211bS周琰杰 (Zhou Yanjie) 31912a18211bS周琰杰 (Zhou Yanjie) static const char *x2100_mac_groups[] = { "mac", }; 31922a18211bS周琰杰 (Zhou Yanjie) 31932a18211bS周琰杰 (Zhou Yanjie) static const struct function_desc x2100_functions[] = { 31942a18211bS周琰杰 (Zhou Yanjie) { "uart0", x2000_uart0_groups, ARRAY_SIZE(x2000_uart0_groups), }, 31952a18211bS周琰杰 (Zhou Yanjie) { "uart1", x2000_uart1_groups, ARRAY_SIZE(x2000_uart1_groups), }, 31962a18211bS周琰杰 (Zhou Yanjie) { "uart2", x2000_uart2_groups, ARRAY_SIZE(x2000_uart2_groups), }, 31972a18211bS周琰杰 (Zhou Yanjie) { "uart3", x2000_uart3_groups, ARRAY_SIZE(x2000_uart3_groups), }, 31982a18211bS周琰杰 (Zhou Yanjie) { "uart4", x2000_uart4_groups, ARRAY_SIZE(x2000_uart4_groups), }, 31992a18211bS周琰杰 (Zhou Yanjie) { "uart5", x2000_uart5_groups, ARRAY_SIZE(x2000_uart5_groups), }, 32002a18211bS周琰杰 (Zhou Yanjie) { "uart6", x2000_uart6_groups, ARRAY_SIZE(x2000_uart6_groups), }, 32012a18211bS周琰杰 (Zhou Yanjie) { "uart7", x2000_uart7_groups, ARRAY_SIZE(x2000_uart7_groups), }, 32022a18211bS周琰杰 (Zhou Yanjie) { "uart8", x2000_uart8_groups, ARRAY_SIZE(x2000_uart8_groups), }, 32032a18211bS周琰杰 (Zhou Yanjie) { "uart9", x2000_uart9_groups, ARRAY_SIZE(x2000_uart9_groups), }, 32042a18211bS周琰杰 (Zhou Yanjie) { "sfc", x2000_sfc_groups, ARRAY_SIZE(x2000_sfc_groups), }, 32052a18211bS周琰杰 (Zhou Yanjie) { "ssi0", x2000_ssi0_groups, ARRAY_SIZE(x2000_ssi0_groups), }, 32062a18211bS周琰杰 (Zhou Yanjie) { "ssi1", x2000_ssi1_groups, ARRAY_SIZE(x2000_ssi1_groups), }, 32072a18211bS周琰杰 (Zhou Yanjie) { "mmc0", x2000_mmc0_groups, ARRAY_SIZE(x2000_mmc0_groups), }, 32082a18211bS周琰杰 (Zhou Yanjie) { "mmc1", x2000_mmc1_groups, ARRAY_SIZE(x2000_mmc1_groups), }, 32092a18211bS周琰杰 (Zhou Yanjie) { "mmc2", x2000_mmc2_groups, ARRAY_SIZE(x2000_mmc2_groups), }, 32102a18211bS周琰杰 (Zhou Yanjie) { "emc", x2000_emc_groups, ARRAY_SIZE(x2000_emc_groups), }, 32112a18211bS周琰杰 (Zhou Yanjie) { "emc-cs1", x2000_cs1_groups, ARRAY_SIZE(x2000_cs1_groups), }, 32122a18211bS周琰杰 (Zhou Yanjie) { "emc-cs2", x2000_cs2_groups, ARRAY_SIZE(x2000_cs2_groups), }, 32132a18211bS周琰杰 (Zhou Yanjie) { "i2c0", x2000_i2c0_groups, ARRAY_SIZE(x2000_i2c0_groups), }, 32142a18211bS周琰杰 (Zhou Yanjie) { "i2c1", x2000_i2c1_groups, ARRAY_SIZE(x2000_i2c1_groups), }, 32152a18211bS周琰杰 (Zhou Yanjie) { "i2c2", x2000_i2c2_groups, ARRAY_SIZE(x2000_i2c2_groups), }, 32162a18211bS周琰杰 (Zhou Yanjie) { "i2c3", x2000_i2c3_groups, ARRAY_SIZE(x2000_i2c3_groups), }, 32172a18211bS周琰杰 (Zhou Yanjie) { "i2c4", x2000_i2c4_groups, ARRAY_SIZE(x2000_i2c4_groups), }, 32182a18211bS周琰杰 (Zhou Yanjie) { "i2c5", x2000_i2c5_groups, ARRAY_SIZE(x2000_i2c5_groups), }, 32192a18211bS周琰杰 (Zhou Yanjie) { "i2s1", x2000_i2s1_groups, ARRAY_SIZE(x2000_i2s1_groups), }, 32202a18211bS周琰杰 (Zhou Yanjie) { "i2s2", x2000_i2s2_groups, ARRAY_SIZE(x2000_i2s2_groups), }, 32212a18211bS周琰杰 (Zhou Yanjie) { "i2s3", x2000_i2s3_groups, ARRAY_SIZE(x2000_i2s3_groups), }, 32222a18211bS周琰杰 (Zhou Yanjie) { "dmic", x2000_dmic_groups, ARRAY_SIZE(x2000_dmic_groups), }, 32232a18211bS周琰杰 (Zhou Yanjie) { "cim", x2000_cim_groups, ARRAY_SIZE(x2000_cim_groups), }, 32242a18211bS周琰杰 (Zhou Yanjie) { "lcd", x2000_lcd_groups, ARRAY_SIZE(x2000_lcd_groups), }, 32252a18211bS周琰杰 (Zhou Yanjie) { "pwm0", x2000_pwm0_groups, ARRAY_SIZE(x2000_pwm0_groups), }, 32262a18211bS周琰杰 (Zhou Yanjie) { "pwm1", x2000_pwm1_groups, ARRAY_SIZE(x2000_pwm1_groups), }, 32272a18211bS周琰杰 (Zhou Yanjie) { "pwm2", x2000_pwm2_groups, ARRAY_SIZE(x2000_pwm2_groups), }, 32282a18211bS周琰杰 (Zhou Yanjie) { "pwm3", x2000_pwm3_groups, ARRAY_SIZE(x2000_pwm3_groups), }, 32292a18211bS周琰杰 (Zhou Yanjie) { "pwm4", x2000_pwm4_groups, ARRAY_SIZE(x2000_pwm4_groups), }, 32302a18211bS周琰杰 (Zhou Yanjie) { "pwm5", x2000_pwm5_groups, ARRAY_SIZE(x2000_pwm5_groups), }, 32312a18211bS周琰杰 (Zhou Yanjie) { "pwm6", x2000_pwm6_groups, ARRAY_SIZE(x2000_pwm6_groups), }, 32322a18211bS周琰杰 (Zhou Yanjie) { "pwm7", x2000_pwm7_groups, ARRAY_SIZE(x2000_pwm7_groups), }, 32332a18211bS周琰杰 (Zhou Yanjie) { "pwm8", x2000_pwm8_groups, ARRAY_SIZE(x2000_pwm8_groups), }, 32342a18211bS周琰杰 (Zhou Yanjie) { "pwm9", x2000_pwm9_groups, ARRAY_SIZE(x2000_pwm9_groups), }, 32352a18211bS周琰杰 (Zhou Yanjie) { "pwm10", x2000_pwm10_groups, ARRAY_SIZE(x2000_pwm10_groups), }, 32362a18211bS周琰杰 (Zhou Yanjie) { "pwm11", x2000_pwm11_groups, ARRAY_SIZE(x2000_pwm11_groups), }, 32372a18211bS周琰杰 (Zhou Yanjie) { "pwm12", x2000_pwm12_groups, ARRAY_SIZE(x2000_pwm12_groups), }, 32382a18211bS周琰杰 (Zhou Yanjie) { "pwm13", x2000_pwm13_groups, ARRAY_SIZE(x2000_pwm13_groups), }, 32392a18211bS周琰杰 (Zhou Yanjie) { "pwm14", x2000_pwm14_groups, ARRAY_SIZE(x2000_pwm14_groups), }, 32402a18211bS周琰杰 (Zhou Yanjie) { "pwm15", x2000_pwm15_groups, ARRAY_SIZE(x2000_pwm15_groups), }, 32412a18211bS周琰杰 (Zhou Yanjie) { "mac", x2100_mac_groups, ARRAY_SIZE(x2100_mac_groups), }, 32422a18211bS周琰杰 (Zhou Yanjie) }; 32432a18211bS周琰杰 (Zhou Yanjie) 32442a18211bS周琰杰 (Zhou Yanjie) static const struct ingenic_chip_info x2100_chip_info = { 32452a18211bS周琰杰 (Zhou Yanjie) .num_chips = 5, 32462a18211bS周琰杰 (Zhou Yanjie) .reg_offset = 0x100, 32472a18211bS周琰杰 (Zhou Yanjie) .version = ID_X2100, 32482a18211bS周琰杰 (Zhou Yanjie) .groups = x2100_groups, 32492a18211bS周琰杰 (Zhou Yanjie) .num_groups = ARRAY_SIZE(x2100_groups), 32502a18211bS周琰杰 (Zhou Yanjie) .functions = x2100_functions, 32512a18211bS周琰杰 (Zhou Yanjie) .num_functions = ARRAY_SIZE(x2100_functions), 32522a18211bS周琰杰 (Zhou Yanjie) .pull_ups = x2100_pull_ups, 32532a18211bS周琰杰 (Zhou Yanjie) .pull_downs = x2100_pull_downs, 32549279c00fSAidan MacDonald .access_table = &x2000_access_table, 32552a18211bS周琰杰 (Zhou Yanjie) }; 32562a18211bS周琰杰 (Zhou Yanjie) 3257b71c1844SZhou Yanjie static u32 ingenic_gpio_read_reg(struct ingenic_gpio_chip *jzgc, u8 reg) 3258e72394e2SPaul Cercueil { 3259e72394e2SPaul Cercueil unsigned int val; 3260e72394e2SPaul Cercueil 3261e72394e2SPaul Cercueil regmap_read(jzgc->jzpc->map, jzgc->reg_base + reg, &val); 3262e72394e2SPaul Cercueil 3263e72394e2SPaul Cercueil return (u32) val; 3264e72394e2SPaul Cercueil } 3265e72394e2SPaul Cercueil 3266b71c1844SZhou Yanjie static void ingenic_gpio_set_bit(struct ingenic_gpio_chip *jzgc, 3267e72394e2SPaul Cercueil u8 reg, u8 offset, bool set) 3268e72394e2SPaul Cercueil { 32698d2d607cSPaul Cercueil if (!is_soc_or_above(jzgc->jzpc, ID_JZ4740)) { 3270424f3969S周琰杰 (Zhou Yanjie) regmap_update_bits(jzgc->jzpc->map, jzgc->reg_base + reg, 3271424f3969S周琰杰 (Zhou Yanjie) BIT(offset), set ? BIT(offset) : 0); 3272424f3969S周琰杰 (Zhou Yanjie) return; 3273424f3969S周琰杰 (Zhou Yanjie) } 3274424f3969S周琰杰 (Zhou Yanjie) 3275e72394e2SPaul Cercueil if (set) 3276e72394e2SPaul Cercueil reg = REG_SET(reg); 3277e72394e2SPaul Cercueil else 3278e72394e2SPaul Cercueil reg = REG_CLEAR(reg); 3279e72394e2SPaul Cercueil 3280e72394e2SPaul Cercueil regmap_write(jzgc->jzpc->map, jzgc->reg_base + reg, BIT(offset)); 3281e72394e2SPaul Cercueil } 3282e72394e2SPaul Cercueil 3283fe1ad5eeSZhou Yanjie static void ingenic_gpio_shadow_set_bit(struct ingenic_gpio_chip *jzgc, 3284fe1ad5eeSZhou Yanjie u8 reg, u8 offset, bool set) 3285fe1ad5eeSZhou Yanjie { 3286fe1ad5eeSZhou Yanjie if (set) 3287fe1ad5eeSZhou Yanjie reg = REG_SET(reg); 3288fe1ad5eeSZhou Yanjie else 3289fe1ad5eeSZhou Yanjie reg = REG_CLEAR(reg); 3290fe1ad5eeSZhou Yanjie 3291d7da2a1eS周琰杰 (Zhou Yanjie) regmap_write(jzgc->jzpc->map, REG_PZ_BASE( 3292d7da2a1eS周琰杰 (Zhou Yanjie) jzgc->jzpc->info->reg_offset) + reg, BIT(offset)); 3293fe1ad5eeSZhou Yanjie } 3294fe1ad5eeSZhou Yanjie 3295fe1ad5eeSZhou Yanjie static void ingenic_gpio_shadow_set_bit_load(struct ingenic_gpio_chip *jzgc) 3296fe1ad5eeSZhou Yanjie { 3297d7da2a1eS周琰杰 (Zhou Yanjie) regmap_write(jzgc->jzpc->map, REG_PZ_GID2LD( 3298d7da2a1eS周琰杰 (Zhou Yanjie) jzgc->jzpc->info->reg_offset), 3299fe1ad5eeSZhou Yanjie jzgc->gc.base / PINS_PER_GPIO_CHIP); 3300fe1ad5eeSZhou Yanjie } 3301fe1ad5eeSZhou Yanjie 3302424f3969S周琰杰 (Zhou Yanjie) static void jz4730_gpio_set_bits(struct ingenic_gpio_chip *jzgc, 3303424f3969S周琰杰 (Zhou Yanjie) u8 reg_upper, u8 reg_lower, u8 offset, u8 value) 3304424f3969S周琰杰 (Zhou Yanjie) { 3305424f3969S周琰杰 (Zhou Yanjie) /* 3306424f3969S周琰杰 (Zhou Yanjie) * JZ4730 function and IRQ registers support two-bits-per-pin 3307424f3969S周琰杰 (Zhou Yanjie) * definitions, split into two groups of 16. 3308424f3969S周琰杰 (Zhou Yanjie) */ 3309424f3969S周琰杰 (Zhou Yanjie) u8 reg = offset < JZ4730_PINS_PER_PAIRED_REG ? reg_lower : reg_upper; 3310424f3969S周琰杰 (Zhou Yanjie) unsigned int idx = offset % JZ4730_PINS_PER_PAIRED_REG; 3311424f3969S周琰杰 (Zhou Yanjie) unsigned int mask = GENMASK(1, 0) << idx * 2; 3312424f3969S周琰杰 (Zhou Yanjie) 3313424f3969S周琰杰 (Zhou Yanjie) regmap_update_bits(jzgc->jzpc->map, jzgc->reg_base + reg, mask, value << (idx * 2)); 3314424f3969S周琰杰 (Zhou Yanjie) } 3315424f3969S周琰杰 (Zhou Yanjie) 3316e72394e2SPaul Cercueil static inline bool ingenic_gpio_get_value(struct ingenic_gpio_chip *jzgc, 3317e72394e2SPaul Cercueil u8 offset) 3318e72394e2SPaul Cercueil { 3319b71c1844SZhou Yanjie unsigned int val = ingenic_gpio_read_reg(jzgc, GPIO_PIN); 3320e72394e2SPaul Cercueil 3321e72394e2SPaul Cercueil return !!(val & BIT(offset)); 3322e72394e2SPaul Cercueil } 3323e72394e2SPaul Cercueil 3324e72394e2SPaul Cercueil static void ingenic_gpio_set_value(struct ingenic_gpio_chip *jzgc, 3325e72394e2SPaul Cercueil u8 offset, int value) 3326e72394e2SPaul Cercueil { 33278d2d607cSPaul Cercueil if (is_soc_or_above(jzgc->jzpc, ID_JZ4770)) 3328b4aa4876SPaul Cercueil ingenic_gpio_set_bit(jzgc, JZ4770_GPIO_PAT0, offset, !!value); 33298d2d607cSPaul Cercueil else if (is_soc_or_above(jzgc->jzpc, ID_JZ4740)) 3330b71c1844SZhou Yanjie ingenic_gpio_set_bit(jzgc, JZ4740_GPIO_DATA, offset, !!value); 3331424f3969S周琰杰 (Zhou Yanjie) else 3332424f3969S周琰杰 (Zhou Yanjie) ingenic_gpio_set_bit(jzgc, JZ4730_GPIO_DATA, offset, !!value); 3333e72394e2SPaul Cercueil } 3334e72394e2SPaul Cercueil 3335e72394e2SPaul Cercueil static void irq_set_type(struct ingenic_gpio_chip *jzgc, 3336e72394e2SPaul Cercueil u8 offset, unsigned int type) 3337e72394e2SPaul Cercueil { 3338e72394e2SPaul Cercueil u8 reg1, reg2; 3339943e0da1S周琰杰 (Zhou Yanjie) bool val1, val2, val3; 3340f831f93aSPaul Cercueil 3341f831f93aSPaul Cercueil switch (type) { 3342943e0da1S周琰杰 (Zhou Yanjie) case IRQ_TYPE_EDGE_BOTH: 3343943e0da1S周琰杰 (Zhou Yanjie) val1 = val2 = false; 3344943e0da1S周琰杰 (Zhou Yanjie) val3 = true; 3345943e0da1S周琰杰 (Zhou Yanjie) break; 3346f831f93aSPaul Cercueil case IRQ_TYPE_EDGE_RISING: 3347f831f93aSPaul Cercueil val1 = val2 = true; 3348943e0da1S周琰杰 (Zhou Yanjie) val3 = false; 3349f831f93aSPaul Cercueil break; 3350f831f93aSPaul Cercueil case IRQ_TYPE_EDGE_FALLING: 3351943e0da1S周琰杰 (Zhou Yanjie) val1 = val3 = false; 3352f831f93aSPaul Cercueil val2 = true; 3353f831f93aSPaul Cercueil break; 3354f831f93aSPaul Cercueil case IRQ_TYPE_LEVEL_HIGH: 3355f831f93aSPaul Cercueil val1 = true; 3356943e0da1S周琰杰 (Zhou Yanjie) val2 = val3 = false; 3357f831f93aSPaul Cercueil break; 3358f831f93aSPaul Cercueil case IRQ_TYPE_LEVEL_LOW: 3359f831f93aSPaul Cercueil default: 3360943e0da1S周琰杰 (Zhou Yanjie) val1 = val2 = val3 = false; 3361f831f93aSPaul Cercueil break; 3362f831f93aSPaul Cercueil } 3363e72394e2SPaul Cercueil 33648d2d607cSPaul Cercueil if (is_soc_or_above(jzgc->jzpc, ID_JZ4770)) { 3365b4aa4876SPaul Cercueil reg1 = JZ4770_GPIO_PAT1; 3366b4aa4876SPaul Cercueil reg2 = JZ4770_GPIO_PAT0; 33678d2d607cSPaul Cercueil } else if (is_soc_or_above(jzgc->jzpc, ID_JZ4740)) { 3368e72394e2SPaul Cercueil reg1 = JZ4740_GPIO_TRIG; 3369e72394e2SPaul Cercueil reg2 = JZ4740_GPIO_DIR; 3370424f3969S周琰杰 (Zhou Yanjie) } else { 3371424f3969S周琰杰 (Zhou Yanjie) ingenic_gpio_set_bit(jzgc, JZ4730_GPIO_GPDIR, offset, false); 3372424f3969S周琰杰 (Zhou Yanjie) jz4730_gpio_set_bits(jzgc, JZ4730_GPIO_GPIDUR, 3373424f3969S周琰杰 (Zhou Yanjie) JZ4730_GPIO_GPIDLR, offset, (val2 << 1) | val1); 3374424f3969S周琰杰 (Zhou Yanjie) return; 3375e72394e2SPaul Cercueil } 3376e72394e2SPaul Cercueil 33778d2d607cSPaul Cercueil if (is_soc_or_above(jzgc->jzpc, ID_X2000)) { 3378943e0da1S周琰杰 (Zhou Yanjie) ingenic_gpio_shadow_set_bit(jzgc, reg2, offset, val1); 3379943e0da1S周琰杰 (Zhou Yanjie) ingenic_gpio_shadow_set_bit(jzgc, reg1, offset, val2); 3380943e0da1S周琰杰 (Zhou Yanjie) ingenic_gpio_shadow_set_bit_load(jzgc); 3381943e0da1S周琰杰 (Zhou Yanjie) ingenic_gpio_set_bit(jzgc, X2000_GPIO_EDG, offset, val3); 33828d2d607cSPaul Cercueil } else if (is_soc_or_above(jzgc->jzpc, ID_X1000)) { 3383f831f93aSPaul Cercueil ingenic_gpio_shadow_set_bit(jzgc, reg2, offset, val1); 3384f831f93aSPaul Cercueil ingenic_gpio_shadow_set_bit(jzgc, reg1, offset, val2); 3385fe1ad5eeSZhou Yanjie ingenic_gpio_shadow_set_bit_load(jzgc); 3386fe1ad5eeSZhou Yanjie } else { 3387f831f93aSPaul Cercueil ingenic_gpio_set_bit(jzgc, reg2, offset, val1); 3388f831f93aSPaul Cercueil ingenic_gpio_set_bit(jzgc, reg1, offset, val2); 3389e72394e2SPaul Cercueil } 3390e72394e2SPaul Cercueil } 3391e72394e2SPaul Cercueil 3392e72394e2SPaul Cercueil static void ingenic_gpio_irq_mask(struct irq_data *irqd) 3393e72394e2SPaul Cercueil { 3394e72394e2SPaul Cercueil struct gpio_chip *gc = irq_data_get_irq_chip_data(irqd); 3395e72394e2SPaul Cercueil struct ingenic_gpio_chip *jzgc = gpiochip_get_data(gc); 33964c76a7fcSAidan MacDonald irq_hw_number_t irq = irqd_to_hwirq(irqd); 3397e72394e2SPaul Cercueil 33988d2d607cSPaul Cercueil if (is_soc_or_above(jzgc->jzpc, ID_JZ4740)) 3399424f3969S周琰杰 (Zhou Yanjie) ingenic_gpio_set_bit(jzgc, GPIO_MSK, irq, true); 3400424f3969S周琰杰 (Zhou Yanjie) else 3401424f3969S周琰杰 (Zhou Yanjie) ingenic_gpio_set_bit(jzgc, JZ4730_GPIO_GPIMR, irq, true); 3402e72394e2SPaul Cercueil } 3403e72394e2SPaul Cercueil 3404e72394e2SPaul Cercueil static void ingenic_gpio_irq_unmask(struct irq_data *irqd) 3405e72394e2SPaul Cercueil { 3406e72394e2SPaul Cercueil struct gpio_chip *gc = irq_data_get_irq_chip_data(irqd); 3407e72394e2SPaul Cercueil struct ingenic_gpio_chip *jzgc = gpiochip_get_data(gc); 34084c76a7fcSAidan MacDonald irq_hw_number_t irq = irqd_to_hwirq(irqd); 3409e72394e2SPaul Cercueil 34108d2d607cSPaul Cercueil if (is_soc_or_above(jzgc->jzpc, ID_JZ4740)) 3411424f3969S周琰杰 (Zhou Yanjie) ingenic_gpio_set_bit(jzgc, GPIO_MSK, irq, false); 3412424f3969S周琰杰 (Zhou Yanjie) else 3413424f3969S周琰杰 (Zhou Yanjie) ingenic_gpio_set_bit(jzgc, JZ4730_GPIO_GPIMR, irq, false); 3414e72394e2SPaul Cercueil } 3415e72394e2SPaul Cercueil 3416e72394e2SPaul Cercueil static void ingenic_gpio_irq_enable(struct irq_data *irqd) 3417e72394e2SPaul Cercueil { 3418e72394e2SPaul Cercueil struct gpio_chip *gc = irq_data_get_irq_chip_data(irqd); 3419e72394e2SPaul Cercueil struct ingenic_gpio_chip *jzgc = gpiochip_get_data(gc); 34204c76a7fcSAidan MacDonald irq_hw_number_t irq = irqd_to_hwirq(irqd); 3421e72394e2SPaul Cercueil 342271f5e7b3SAidan MacDonald gpiochip_enable_irq(gc, irq); 342371f5e7b3SAidan MacDonald 34248d2d607cSPaul Cercueil if (is_soc_or_above(jzgc->jzpc, ID_JZ4770)) 3425b4aa4876SPaul Cercueil ingenic_gpio_set_bit(jzgc, JZ4770_GPIO_INT, irq, true); 34268d2d607cSPaul Cercueil else if (is_soc_or_above(jzgc->jzpc, ID_JZ4740)) 3427b71c1844SZhou Yanjie ingenic_gpio_set_bit(jzgc, JZ4740_GPIO_SELECT, irq, true); 3428424f3969S周琰杰 (Zhou Yanjie) else 3429424f3969S周琰杰 (Zhou Yanjie) ingenic_gpio_set_bit(jzgc, JZ4730_GPIO_GPIER, irq, true); 3430e72394e2SPaul Cercueil 3431e72394e2SPaul Cercueil ingenic_gpio_irq_unmask(irqd); 3432e72394e2SPaul Cercueil } 3433e72394e2SPaul Cercueil 3434e72394e2SPaul Cercueil static void ingenic_gpio_irq_disable(struct irq_data *irqd) 3435e72394e2SPaul Cercueil { 3436e72394e2SPaul Cercueil struct gpio_chip *gc = irq_data_get_irq_chip_data(irqd); 3437e72394e2SPaul Cercueil struct ingenic_gpio_chip *jzgc = gpiochip_get_data(gc); 34384c76a7fcSAidan MacDonald irq_hw_number_t irq = irqd_to_hwirq(irqd); 3439e72394e2SPaul Cercueil 3440e72394e2SPaul Cercueil ingenic_gpio_irq_mask(irqd); 3441e72394e2SPaul Cercueil 34428d2d607cSPaul Cercueil if (is_soc_or_above(jzgc->jzpc, ID_JZ4770)) 3443b4aa4876SPaul Cercueil ingenic_gpio_set_bit(jzgc, JZ4770_GPIO_INT, irq, false); 34448d2d607cSPaul Cercueil else if (is_soc_or_above(jzgc->jzpc, ID_JZ4740)) 3445b71c1844SZhou Yanjie ingenic_gpio_set_bit(jzgc, JZ4740_GPIO_SELECT, irq, false); 3446424f3969S周琰杰 (Zhou Yanjie) else 3447424f3969S周琰杰 (Zhou Yanjie) ingenic_gpio_set_bit(jzgc, JZ4730_GPIO_GPIER, irq, false); 344871f5e7b3SAidan MacDonald 344971f5e7b3SAidan MacDonald gpiochip_disable_irq(gc, irq); 3450e72394e2SPaul Cercueil } 3451e72394e2SPaul Cercueil 3452e72394e2SPaul Cercueil static void ingenic_gpio_irq_ack(struct irq_data *irqd) 3453e72394e2SPaul Cercueil { 3454e72394e2SPaul Cercueil struct gpio_chip *gc = irq_data_get_irq_chip_data(irqd); 3455e72394e2SPaul Cercueil struct ingenic_gpio_chip *jzgc = gpiochip_get_data(gc); 34564c76a7fcSAidan MacDonald irq_hw_number_t irq = irqd_to_hwirq(irqd); 3457e72394e2SPaul Cercueil bool high; 3458e72394e2SPaul Cercueil 3459943e0da1S周琰杰 (Zhou Yanjie) if ((irqd_get_trigger_type(irqd) == IRQ_TYPE_EDGE_BOTH) && 34608d2d607cSPaul Cercueil !is_soc_or_above(jzgc->jzpc, ID_X2000)) { 3461e72394e2SPaul Cercueil /* 3462e72394e2SPaul Cercueil * Switch to an interrupt for the opposite edge to the one that 3463e72394e2SPaul Cercueil * triggered the interrupt being ACKed. 3464e72394e2SPaul Cercueil */ 3465e72394e2SPaul Cercueil high = ingenic_gpio_get_value(jzgc, irq); 3466e72394e2SPaul Cercueil if (high) 34671c95348bSPaul Cercueil irq_set_type(jzgc, irq, IRQ_TYPE_LEVEL_LOW); 3468e72394e2SPaul Cercueil else 34691c95348bSPaul Cercueil irq_set_type(jzgc, irq, IRQ_TYPE_LEVEL_HIGH); 3470e72394e2SPaul Cercueil } 3471e72394e2SPaul Cercueil 34728d2d607cSPaul Cercueil if (is_soc_or_above(jzgc->jzpc, ID_JZ4770)) 3473b4aa4876SPaul Cercueil ingenic_gpio_set_bit(jzgc, JZ4770_GPIO_FLAG, irq, false); 34748d2d607cSPaul Cercueil else if (is_soc_or_above(jzgc->jzpc, ID_JZ4740)) 3475b71c1844SZhou Yanjie ingenic_gpio_set_bit(jzgc, JZ4740_GPIO_DATA, irq, true); 3476424f3969S周琰杰 (Zhou Yanjie) else 3477424f3969S周琰杰 (Zhou Yanjie) ingenic_gpio_set_bit(jzgc, JZ4730_GPIO_GPFR, irq, false); 3478e72394e2SPaul Cercueil } 3479e72394e2SPaul Cercueil 3480e72394e2SPaul Cercueil static int ingenic_gpio_irq_set_type(struct irq_data *irqd, unsigned int type) 3481e72394e2SPaul Cercueil { 3482e72394e2SPaul Cercueil struct gpio_chip *gc = irq_data_get_irq_chip_data(irqd); 3483e72394e2SPaul Cercueil struct ingenic_gpio_chip *jzgc = gpiochip_get_data(gc); 34844c76a7fcSAidan MacDonald irq_hw_number_t irq = irqd_to_hwirq(irqd); 3485e72394e2SPaul Cercueil 3486e72394e2SPaul Cercueil switch (type) { 3487e72394e2SPaul Cercueil case IRQ_TYPE_EDGE_BOTH: 3488e72394e2SPaul Cercueil case IRQ_TYPE_EDGE_RISING: 3489e72394e2SPaul Cercueil case IRQ_TYPE_EDGE_FALLING: 3490e72394e2SPaul Cercueil irq_set_handler_locked(irqd, handle_edge_irq); 3491e72394e2SPaul Cercueil break; 3492e72394e2SPaul Cercueil case IRQ_TYPE_LEVEL_HIGH: 3493e72394e2SPaul Cercueil case IRQ_TYPE_LEVEL_LOW: 3494e72394e2SPaul Cercueil irq_set_handler_locked(irqd, handle_level_irq); 3495e72394e2SPaul Cercueil break; 3496e72394e2SPaul Cercueil default: 3497e72394e2SPaul Cercueil irq_set_handler_locked(irqd, handle_bad_irq); 3498e72394e2SPaul Cercueil } 3499e72394e2SPaul Cercueil 35008d2d607cSPaul Cercueil if ((type == IRQ_TYPE_EDGE_BOTH) && !is_soc_or_above(jzgc->jzpc, ID_X2000)) { 3501e72394e2SPaul Cercueil /* 3502e72394e2SPaul Cercueil * The hardware does not support interrupts on both edges. The 3503e72394e2SPaul Cercueil * best we can do is to set up a single-edge interrupt and then 3504e72394e2SPaul Cercueil * switch to the opposing edge when ACKing the interrupt. 3505e72394e2SPaul Cercueil */ 35064c76a7fcSAidan MacDonald bool high = ingenic_gpio_get_value(jzgc, irq); 3507e72394e2SPaul Cercueil 35081c95348bSPaul Cercueil type = high ? IRQ_TYPE_LEVEL_LOW : IRQ_TYPE_LEVEL_HIGH; 3509e72394e2SPaul Cercueil } 3510e72394e2SPaul Cercueil 35114c76a7fcSAidan MacDonald irq_set_type(jzgc, irq, type); 3512e72394e2SPaul Cercueil return 0; 3513e72394e2SPaul Cercueil } 3514e72394e2SPaul Cercueil 3515e72394e2SPaul Cercueil static int ingenic_gpio_irq_set_wake(struct irq_data *irqd, unsigned int on) 3516e72394e2SPaul Cercueil { 3517e72394e2SPaul Cercueil struct gpio_chip *gc = irq_data_get_irq_chip_data(irqd); 3518e72394e2SPaul Cercueil struct ingenic_gpio_chip *jzgc = gpiochip_get_data(gc); 3519e72394e2SPaul Cercueil 3520e72394e2SPaul Cercueil return irq_set_irq_wake(jzgc->irq, on); 3521e72394e2SPaul Cercueil } 3522e72394e2SPaul Cercueil 3523e72394e2SPaul Cercueil static void ingenic_gpio_irq_handler(struct irq_desc *desc) 3524e72394e2SPaul Cercueil { 3525e72394e2SPaul Cercueil struct gpio_chip *gc = irq_desc_get_handler_data(desc); 3526e72394e2SPaul Cercueil struct ingenic_gpio_chip *jzgc = gpiochip_get_data(gc); 3527e72394e2SPaul Cercueil struct irq_chip *irq_chip = irq_data_get_irq_chip(&desc->irq_data); 3528e72394e2SPaul Cercueil unsigned long flag, i; 3529e72394e2SPaul Cercueil 3530e72394e2SPaul Cercueil chained_irq_enter(irq_chip, desc); 3531e72394e2SPaul Cercueil 35328d2d607cSPaul Cercueil if (is_soc_or_above(jzgc->jzpc, ID_JZ4770)) 3533b4aa4876SPaul Cercueil flag = ingenic_gpio_read_reg(jzgc, JZ4770_GPIO_FLAG); 35348d2d607cSPaul Cercueil else if (is_soc_or_above(jzgc->jzpc, ID_JZ4740)) 3535b71c1844SZhou Yanjie flag = ingenic_gpio_read_reg(jzgc, JZ4740_GPIO_FLAG); 3536424f3969S周琰杰 (Zhou Yanjie) else 3537424f3969S周琰杰 (Zhou Yanjie) flag = ingenic_gpio_read_reg(jzgc, JZ4730_GPIO_GPFR); 3538e72394e2SPaul Cercueil 3539e72394e2SPaul Cercueil for_each_set_bit(i, &flag, 32) 3540a9cb09b7SMarc Zyngier generic_handle_domain_irq(gc->irq.domain, i); 3541e72394e2SPaul Cercueil chained_irq_exit(irq_chip, desc); 3542e72394e2SPaul Cercueil } 3543e72394e2SPaul Cercueil 3544e72394e2SPaul Cercueil static void ingenic_gpio_set(struct gpio_chip *gc, 3545e72394e2SPaul Cercueil unsigned int offset, int value) 3546e72394e2SPaul Cercueil { 3547e72394e2SPaul Cercueil struct ingenic_gpio_chip *jzgc = gpiochip_get_data(gc); 3548e72394e2SPaul Cercueil 3549e72394e2SPaul Cercueil ingenic_gpio_set_value(jzgc, offset, value); 3550e72394e2SPaul Cercueil } 3551e72394e2SPaul Cercueil 3552e72394e2SPaul Cercueil static int ingenic_gpio_get(struct gpio_chip *gc, unsigned int offset) 3553e72394e2SPaul Cercueil { 3554e72394e2SPaul Cercueil struct ingenic_gpio_chip *jzgc = gpiochip_get_data(gc); 3555e72394e2SPaul Cercueil 3556e72394e2SPaul Cercueil return (int) ingenic_gpio_get_value(jzgc, offset); 3557e72394e2SPaul Cercueil } 3558e72394e2SPaul Cercueil 3559e72394e2SPaul Cercueil static int ingenic_gpio_direction_input(struct gpio_chip *gc, 3560e72394e2SPaul Cercueil unsigned int offset) 3561e72394e2SPaul Cercueil { 3562e72394e2SPaul Cercueil return pinctrl_gpio_direction_input(gc->base + offset); 3563e72394e2SPaul Cercueil } 3564e72394e2SPaul Cercueil 3565e72394e2SPaul Cercueil static int ingenic_gpio_direction_output(struct gpio_chip *gc, 3566e72394e2SPaul Cercueil unsigned int offset, int value) 3567e72394e2SPaul Cercueil { 3568e72394e2SPaul Cercueil ingenic_gpio_set(gc, offset, value); 3569e72394e2SPaul Cercueil return pinctrl_gpio_direction_output(gc->base + offset); 3570e72394e2SPaul Cercueil } 3571e72394e2SPaul Cercueil 3572b5c23aa4SPaul Cercueil static inline void ingenic_config_pin(struct ingenic_pinctrl *jzpc, 3573943e0da1S周琰杰 (Zhou Yanjie) unsigned int pin, unsigned int reg, bool set) 3574b5c23aa4SPaul Cercueil { 3575b5c23aa4SPaul Cercueil unsigned int idx = pin % PINS_PER_GPIO_CHIP; 3576b5c23aa4SPaul Cercueil unsigned int offt = pin / PINS_PER_GPIO_CHIP; 3577b5c23aa4SPaul Cercueil 3578424f3969S周琰杰 (Zhou Yanjie) if (set) { 35798d2d607cSPaul Cercueil if (is_soc_or_above(jzpc, ID_JZ4740)) 3580f742e5ebS周琰杰 (Zhou Yanjie) regmap_write(jzpc->map, offt * jzpc->info->reg_offset + 3581424f3969S周琰杰 (Zhou Yanjie) REG_SET(reg), BIT(idx)); 3582424f3969S周琰杰 (Zhou Yanjie) else 3583424f3969S周琰杰 (Zhou Yanjie) regmap_set_bits(jzpc->map, offt * jzpc->info->reg_offset + 3584424f3969S周琰杰 (Zhou Yanjie) reg, BIT(idx)); 3585424f3969S周琰杰 (Zhou Yanjie) } else { 35868d2d607cSPaul Cercueil if (is_soc_or_above(jzpc, ID_JZ4740)) 3587424f3969S周琰杰 (Zhou Yanjie) regmap_write(jzpc->map, offt * jzpc->info->reg_offset + 3588424f3969S周琰杰 (Zhou Yanjie) REG_CLEAR(reg), BIT(idx)); 3589424f3969S周琰杰 (Zhou Yanjie) else 3590424f3969S周琰杰 (Zhou Yanjie) regmap_clear_bits(jzpc->map, offt * jzpc->info->reg_offset + 3591424f3969S周琰杰 (Zhou Yanjie) reg, BIT(idx)); 3592424f3969S周琰杰 (Zhou Yanjie) } 3593b5c23aa4SPaul Cercueil } 3594b5c23aa4SPaul Cercueil 3595fe1ad5eeSZhou Yanjie static inline void ingenic_shadow_config_pin(struct ingenic_pinctrl *jzpc, 3596fe1ad5eeSZhou Yanjie unsigned int pin, u8 reg, bool set) 3597fe1ad5eeSZhou Yanjie { 3598fe1ad5eeSZhou Yanjie unsigned int idx = pin % PINS_PER_GPIO_CHIP; 3599fe1ad5eeSZhou Yanjie 3600f742e5ebS周琰杰 (Zhou Yanjie) regmap_write(jzpc->map, REG_PZ_BASE(jzpc->info->reg_offset) + 3601fe1ad5eeSZhou Yanjie (set ? REG_SET(reg) : REG_CLEAR(reg)), BIT(idx)); 3602fe1ad5eeSZhou Yanjie } 3603fe1ad5eeSZhou Yanjie 3604fe1ad5eeSZhou Yanjie static inline void ingenic_shadow_config_pin_load(struct ingenic_pinctrl *jzpc, 3605fe1ad5eeSZhou Yanjie unsigned int pin) 3606fe1ad5eeSZhou Yanjie { 3607d7da2a1eS周琰杰 (Zhou Yanjie) regmap_write(jzpc->map, REG_PZ_GID2LD(jzpc->info->reg_offset), 3608d7da2a1eS周琰杰 (Zhou Yanjie) pin / PINS_PER_GPIO_CHIP); 3609fe1ad5eeSZhou Yanjie } 3610fe1ad5eeSZhou Yanjie 3611424f3969S周琰杰 (Zhou Yanjie) static inline void jz4730_config_pin_function(struct ingenic_pinctrl *jzpc, 3612424f3969S周琰杰 (Zhou Yanjie) unsigned int pin, u8 reg_upper, u8 reg_lower, u8 value) 3613424f3969S周琰杰 (Zhou Yanjie) { 3614424f3969S周琰杰 (Zhou Yanjie) /* 3615424f3969S周琰杰 (Zhou Yanjie) * JZ4730 function and IRQ registers support two-bits-per-pin 3616424f3969S周琰杰 (Zhou Yanjie) * definitions, split into two groups of 16. 3617424f3969S周琰杰 (Zhou Yanjie) */ 3618424f3969S周琰杰 (Zhou Yanjie) unsigned int idx = pin % JZ4730_PINS_PER_PAIRED_REG; 3619424f3969S周琰杰 (Zhou Yanjie) unsigned int mask = GENMASK(1, 0) << idx * 2; 3620424f3969S周琰杰 (Zhou Yanjie) unsigned int offt = pin / PINS_PER_GPIO_CHIP; 3621424f3969S周琰杰 (Zhou Yanjie) u8 reg = (pin % PINS_PER_GPIO_CHIP) < JZ4730_PINS_PER_PAIRED_REG ? reg_lower : reg_upper; 3622424f3969S周琰杰 (Zhou Yanjie) 3623424f3969S周琰杰 (Zhou Yanjie) regmap_update_bits(jzpc->map, offt * jzpc->info->reg_offset + reg, 3624424f3969S周琰杰 (Zhou Yanjie) mask, value << (idx * 2)); 3625424f3969S周琰杰 (Zhou Yanjie) } 3626424f3969S周琰杰 (Zhou Yanjie) 3627b5c23aa4SPaul Cercueil static inline bool ingenic_get_pin_config(struct ingenic_pinctrl *jzpc, 3628943e0da1S周琰杰 (Zhou Yanjie) unsigned int pin, unsigned int reg) 3629b5c23aa4SPaul Cercueil { 3630b5c23aa4SPaul Cercueil unsigned int idx = pin % PINS_PER_GPIO_CHIP; 3631b5c23aa4SPaul Cercueil unsigned int offt = pin / PINS_PER_GPIO_CHIP; 3632b5c23aa4SPaul Cercueil unsigned int val; 3633b5c23aa4SPaul Cercueil 3634f742e5ebS周琰杰 (Zhou Yanjie) regmap_read(jzpc->map, offt * jzpc->info->reg_offset + reg, &val); 3635b5c23aa4SPaul Cercueil 3636b5c23aa4SPaul Cercueil return val & BIT(idx); 3637b5c23aa4SPaul Cercueil } 3638b5c23aa4SPaul Cercueil 3639ebd66514SPaul Cercueil static int ingenic_gpio_get_direction(struct gpio_chip *gc, unsigned int offset) 3640ebd66514SPaul Cercueil { 3641ebd66514SPaul Cercueil struct ingenic_gpio_chip *jzgc = gpiochip_get_data(gc); 3642ebd66514SPaul Cercueil struct ingenic_pinctrl *jzpc = jzgc->jzpc; 3643ebd66514SPaul Cercueil unsigned int pin = gc->base + offset; 3644ebd66514SPaul Cercueil 36458d2d607cSPaul Cercueil if (is_soc_or_above(jzpc, ID_JZ4770)) { 3646b4aa4876SPaul Cercueil if (ingenic_get_pin_config(jzpc, pin, JZ4770_GPIO_INT) || 3647b4aa4876SPaul Cercueil ingenic_get_pin_config(jzpc, pin, JZ4770_GPIO_PAT1)) 36483c827873SMatti Vaittinen return GPIO_LINE_DIRECTION_IN; 36493c827873SMatti Vaittinen return GPIO_LINE_DIRECTION_OUT; 36508d2d607cSPaul Cercueil } else if (!is_soc_or_above(jzpc, ID_JZ4740)) { 3651424f3969S周琰杰 (Zhou Yanjie) if (!ingenic_get_pin_config(jzpc, pin, JZ4730_GPIO_GPDIR)) 3652424f3969S周琰杰 (Zhou Yanjie) return GPIO_LINE_DIRECTION_IN; 3653424f3969S周琰杰 (Zhou Yanjie) return GPIO_LINE_DIRECTION_OUT; 36543c827873SMatti Vaittinen } 3655ebd66514SPaul Cercueil 3656ebd66514SPaul Cercueil if (ingenic_get_pin_config(jzpc, pin, JZ4740_GPIO_SELECT)) 36573c827873SMatti Vaittinen return GPIO_LINE_DIRECTION_IN; 3658ebd66514SPaul Cercueil 36593c827873SMatti Vaittinen if (ingenic_get_pin_config(jzpc, pin, JZ4740_GPIO_DIR)) 36603c827873SMatti Vaittinen return GPIO_LINE_DIRECTION_OUT; 36613c827873SMatti Vaittinen 36623c827873SMatti Vaittinen return GPIO_LINE_DIRECTION_IN; 3663ebd66514SPaul Cercueil } 3664ebd66514SPaul Cercueil 36655bf7b849SJulia Lawall static const struct pinctrl_ops ingenic_pctlops = { 3666b5c23aa4SPaul Cercueil .get_groups_count = pinctrl_generic_get_group_count, 3667b5c23aa4SPaul Cercueil .get_group_name = pinctrl_generic_get_group_name, 3668b5c23aa4SPaul Cercueil .get_group_pins = pinctrl_generic_get_group_pins, 3669b5c23aa4SPaul Cercueil .dt_node_to_map = pinconf_generic_dt_node_to_map_all, 3670b5c23aa4SPaul Cercueil .dt_free_map = pinconf_generic_dt_free_map, 3671b5c23aa4SPaul Cercueil }; 3672b5c23aa4SPaul Cercueil 36739a0f1341SPaul Cercueil static int ingenic_gpio_irq_request(struct irq_data *data) 36749a0f1341SPaul Cercueil { 36759a0f1341SPaul Cercueil struct gpio_chip *gpio_chip = irq_data_get_irq_chip_data(data); 36764c76a7fcSAidan MacDonald irq_hw_number_t irq = irqd_to_hwirq(data); 36779a0f1341SPaul Cercueil int ret; 36789a0f1341SPaul Cercueil 36794c76a7fcSAidan MacDonald ret = ingenic_gpio_direction_input(gpio_chip, irq); 36809a0f1341SPaul Cercueil if (ret) 36819a0f1341SPaul Cercueil return ret; 36829a0f1341SPaul Cercueil 36834c76a7fcSAidan MacDonald return gpiochip_reqres_irq(gpio_chip, irq); 36849a0f1341SPaul Cercueil } 36859a0f1341SPaul Cercueil 36869a0f1341SPaul Cercueil static void ingenic_gpio_irq_release(struct irq_data *data) 36879a0f1341SPaul Cercueil { 36889a0f1341SPaul Cercueil struct gpio_chip *gpio_chip = irq_data_get_irq_chip_data(data); 36894c76a7fcSAidan MacDonald irq_hw_number_t irq = irqd_to_hwirq(data); 36909a0f1341SPaul Cercueil 36914c76a7fcSAidan MacDonald return gpiochip_relres_irq(gpio_chip, irq); 36929a0f1341SPaul Cercueil } 36939a0f1341SPaul Cercueil 369471f5e7b3SAidan MacDonald static void ingenic_gpio_irq_print_chip(struct irq_data *data, struct seq_file *p) 369571f5e7b3SAidan MacDonald { 369671f5e7b3SAidan MacDonald struct gpio_chip *gpio_chip = irq_data_get_irq_chip_data(data); 369771f5e7b3SAidan MacDonald 369871f5e7b3SAidan MacDonald seq_printf(p, "%s", gpio_chip->label); 369971f5e7b3SAidan MacDonald } 370071f5e7b3SAidan MacDonald 370171f5e7b3SAidan MacDonald static const struct irq_chip ingenic_gpio_irqchip = { 370271f5e7b3SAidan MacDonald .irq_enable = ingenic_gpio_irq_enable, 370371f5e7b3SAidan MacDonald .irq_disable = ingenic_gpio_irq_disable, 370471f5e7b3SAidan MacDonald .irq_unmask = ingenic_gpio_irq_unmask, 370571f5e7b3SAidan MacDonald .irq_mask = ingenic_gpio_irq_mask, 370671f5e7b3SAidan MacDonald .irq_ack = ingenic_gpio_irq_ack, 370771f5e7b3SAidan MacDonald .irq_set_type = ingenic_gpio_irq_set_type, 370871f5e7b3SAidan MacDonald .irq_set_wake = ingenic_gpio_irq_set_wake, 370971f5e7b3SAidan MacDonald .irq_request_resources = ingenic_gpio_irq_request, 371071f5e7b3SAidan MacDonald .irq_release_resources = ingenic_gpio_irq_release, 371171f5e7b3SAidan MacDonald .irq_print_chip = ingenic_gpio_irq_print_chip, 371271f5e7b3SAidan MacDonald .flags = IRQCHIP_MASK_ON_SUSPEND | IRQCHIP_IMMUTABLE, 371371f5e7b3SAidan MacDonald }; 371471f5e7b3SAidan MacDonald 3715b5c23aa4SPaul Cercueil static int ingenic_pinmux_set_pin_fn(struct ingenic_pinctrl *jzpc, 3716b5c23aa4SPaul Cercueil int pin, int func) 3717b5c23aa4SPaul Cercueil { 3718b5c23aa4SPaul Cercueil unsigned int idx = pin % PINS_PER_GPIO_CHIP; 3719b5c23aa4SPaul Cercueil unsigned int offt = pin / PINS_PER_GPIO_CHIP; 3720b5c23aa4SPaul Cercueil 3721b5c23aa4SPaul Cercueil dev_dbg(jzpc->dev, "set pin P%c%u to function %u\n", 3722b5c23aa4SPaul Cercueil 'A' + offt, idx, func); 3723b5c23aa4SPaul Cercueil 37248d2d607cSPaul Cercueil if (is_soc_or_above(jzpc, ID_X1000)) { 3725b4aa4876SPaul Cercueil ingenic_shadow_config_pin(jzpc, pin, JZ4770_GPIO_INT, false); 3726fe1ad5eeSZhou Yanjie ingenic_shadow_config_pin(jzpc, pin, GPIO_MSK, false); 3727b4aa4876SPaul Cercueil ingenic_shadow_config_pin(jzpc, pin, JZ4770_GPIO_PAT1, func & 0x2); 3728b4aa4876SPaul Cercueil ingenic_shadow_config_pin(jzpc, pin, JZ4770_GPIO_PAT0, func & 0x1); 3729fe1ad5eeSZhou Yanjie ingenic_shadow_config_pin_load(jzpc, pin); 37308d2d607cSPaul Cercueil } else if (is_soc_or_above(jzpc, ID_JZ4770)) { 3731b4aa4876SPaul Cercueil ingenic_config_pin(jzpc, pin, JZ4770_GPIO_INT, false); 3732e72394e2SPaul Cercueil ingenic_config_pin(jzpc, pin, GPIO_MSK, false); 3733b4aa4876SPaul Cercueil ingenic_config_pin(jzpc, pin, JZ4770_GPIO_PAT1, func & 0x2); 3734b4aa4876SPaul Cercueil ingenic_config_pin(jzpc, pin, JZ4770_GPIO_PAT0, func & 0x1); 37358d2d607cSPaul Cercueil } else if (is_soc_or_above(jzpc, ID_JZ4740)) { 3736b5c23aa4SPaul Cercueil ingenic_config_pin(jzpc, pin, JZ4740_GPIO_FUNC, true); 3737b5c23aa4SPaul Cercueil ingenic_config_pin(jzpc, pin, JZ4740_GPIO_TRIG, func & 0x2); 37389a85c09aSPaul Cercueil ingenic_config_pin(jzpc, pin, JZ4740_GPIO_SELECT, func & 0x1); 3739424f3969S周琰杰 (Zhou Yanjie) } else { 3740424f3969S周琰杰 (Zhou Yanjie) ingenic_config_pin(jzpc, pin, JZ4730_GPIO_GPIER, false); 3741424f3969S周琰杰 (Zhou Yanjie) jz4730_config_pin_function(jzpc, pin, JZ4730_GPIO_GPAUR, JZ4730_GPIO_GPALR, func); 3742b5c23aa4SPaul Cercueil } 3743b5c23aa4SPaul Cercueil 3744b5c23aa4SPaul Cercueil return 0; 3745b5c23aa4SPaul Cercueil } 3746b5c23aa4SPaul Cercueil 3747b5c23aa4SPaul Cercueil static int ingenic_pinmux_set_mux(struct pinctrl_dev *pctldev, 3748b5c23aa4SPaul Cercueil unsigned int selector, unsigned int group) 3749b5c23aa4SPaul Cercueil { 3750b5c23aa4SPaul Cercueil struct ingenic_pinctrl *jzpc = pinctrl_dev_get_drvdata(pctldev); 3751b5c23aa4SPaul Cercueil struct function_desc *func; 3752b5c23aa4SPaul Cercueil struct group_desc *grp; 3753b5c23aa4SPaul Cercueil unsigned int i; 3754bb42b593SPaul Cercueil uintptr_t mode; 3755bb42b593SPaul Cercueil u8 *pin_modes; 3756b5c23aa4SPaul Cercueil 3757b5c23aa4SPaul Cercueil func = pinmux_generic_get_function(pctldev, selector); 3758b5c23aa4SPaul Cercueil if (!func) 3759b5c23aa4SPaul Cercueil return -EINVAL; 3760b5c23aa4SPaul Cercueil 3761b5c23aa4SPaul Cercueil grp = pinctrl_generic_get_group(pctldev, group); 3762b5c23aa4SPaul Cercueil if (!grp) 3763b5c23aa4SPaul Cercueil return -EINVAL; 3764b5c23aa4SPaul Cercueil 3765b5c23aa4SPaul Cercueil dev_dbg(pctldev->dev, "enable function %s group %s\n", 3766b5c23aa4SPaul Cercueil func->name, grp->name); 3767b5c23aa4SPaul Cercueil 3768bb42b593SPaul Cercueil mode = (uintptr_t)grp->data; 3769bb42b593SPaul Cercueil if (mode <= 3) { 3770bb42b593SPaul Cercueil for (i = 0; i < grp->num_pins; i++) 3771bb42b593SPaul Cercueil ingenic_pinmux_set_pin_fn(jzpc, grp->pins[i], mode); 3772bb42b593SPaul Cercueil } else { 3773bb42b593SPaul Cercueil pin_modes = grp->data; 3774b5c23aa4SPaul Cercueil 3775bb42b593SPaul Cercueil for (i = 0; i < grp->num_pins; i++) 3776b5c23aa4SPaul Cercueil ingenic_pinmux_set_pin_fn(jzpc, grp->pins[i], pin_modes[i]); 3777b5c23aa4SPaul Cercueil } 3778b5c23aa4SPaul Cercueil 3779b5c23aa4SPaul Cercueil return 0; 3780b5c23aa4SPaul Cercueil } 3781b5c23aa4SPaul Cercueil 3782b5c23aa4SPaul Cercueil static int ingenic_pinmux_gpio_set_direction(struct pinctrl_dev *pctldev, 3783b5c23aa4SPaul Cercueil struct pinctrl_gpio_range *range, 3784b5c23aa4SPaul Cercueil unsigned int pin, bool input) 3785b5c23aa4SPaul Cercueil { 3786b5c23aa4SPaul Cercueil struct ingenic_pinctrl *jzpc = pinctrl_dev_get_drvdata(pctldev); 3787b5c23aa4SPaul Cercueil unsigned int idx = pin % PINS_PER_GPIO_CHIP; 3788b5c23aa4SPaul Cercueil unsigned int offt = pin / PINS_PER_GPIO_CHIP; 3789b5c23aa4SPaul Cercueil 3790b5c23aa4SPaul Cercueil dev_dbg(pctldev->dev, "set pin P%c%u to %sput\n", 3791b5c23aa4SPaul Cercueil 'A' + offt, idx, input ? "in" : "out"); 3792b5c23aa4SPaul Cercueil 37938d2d607cSPaul Cercueil if (is_soc_or_above(jzpc, ID_X1000)) { 3794b4aa4876SPaul Cercueil ingenic_shadow_config_pin(jzpc, pin, JZ4770_GPIO_INT, false); 3795fe1ad5eeSZhou Yanjie ingenic_shadow_config_pin(jzpc, pin, GPIO_MSK, true); 3796b4aa4876SPaul Cercueil ingenic_shadow_config_pin(jzpc, pin, JZ4770_GPIO_PAT1, input); 3797fe1ad5eeSZhou Yanjie ingenic_shadow_config_pin_load(jzpc, pin); 37988d2d607cSPaul Cercueil } else if (is_soc_or_above(jzpc, ID_JZ4770)) { 3799b4aa4876SPaul Cercueil ingenic_config_pin(jzpc, pin, JZ4770_GPIO_INT, false); 3800e72394e2SPaul Cercueil ingenic_config_pin(jzpc, pin, GPIO_MSK, true); 3801b4aa4876SPaul Cercueil ingenic_config_pin(jzpc, pin, JZ4770_GPIO_PAT1, input); 38028d2d607cSPaul Cercueil } else if (is_soc_or_above(jzpc, ID_JZ4740)) { 3803b5c23aa4SPaul Cercueil ingenic_config_pin(jzpc, pin, JZ4740_GPIO_SELECT, false); 38040084a786SPaul Cercueil ingenic_config_pin(jzpc, pin, JZ4740_GPIO_DIR, !input); 3805b5c23aa4SPaul Cercueil ingenic_config_pin(jzpc, pin, JZ4740_GPIO_FUNC, false); 3806424f3969S周琰杰 (Zhou Yanjie) } else { 3807424f3969S周琰杰 (Zhou Yanjie) ingenic_config_pin(jzpc, pin, JZ4730_GPIO_GPIER, false); 3808424f3969S周琰杰 (Zhou Yanjie) ingenic_config_pin(jzpc, pin, JZ4730_GPIO_GPDIR, !input); 3809424f3969S周琰杰 (Zhou Yanjie) jz4730_config_pin_function(jzpc, pin, JZ4730_GPIO_GPAUR, JZ4730_GPIO_GPALR, 0); 3810b5c23aa4SPaul Cercueil } 3811b5c23aa4SPaul Cercueil 3812b5c23aa4SPaul Cercueil return 0; 3813b5c23aa4SPaul Cercueil } 3814b5c23aa4SPaul Cercueil 38155bf7b849SJulia Lawall static const struct pinmux_ops ingenic_pmxops = { 3816b5c23aa4SPaul Cercueil .get_functions_count = pinmux_generic_get_function_count, 3817b5c23aa4SPaul Cercueil .get_function_name = pinmux_generic_get_function_name, 3818b5c23aa4SPaul Cercueil .get_function_groups = pinmux_generic_get_function_groups, 3819b5c23aa4SPaul Cercueil .set_mux = ingenic_pinmux_set_mux, 3820b5c23aa4SPaul Cercueil .gpio_set_direction = ingenic_pinmux_gpio_set_direction, 3821b5c23aa4SPaul Cercueil }; 3822b5c23aa4SPaul Cercueil 3823b5c23aa4SPaul Cercueil static int ingenic_pinconf_get(struct pinctrl_dev *pctldev, 3824b5c23aa4SPaul Cercueil unsigned int pin, unsigned long *config) 3825b5c23aa4SPaul Cercueil { 3826b5c23aa4SPaul Cercueil struct ingenic_pinctrl *jzpc = pinctrl_dev_get_drvdata(pctldev); 3827b5c23aa4SPaul Cercueil enum pin_config_param param = pinconf_to_config_param(*config); 3828b5c23aa4SPaul Cercueil unsigned int idx = pin % PINS_PER_GPIO_CHIP; 3829b5c23aa4SPaul Cercueil unsigned int offt = pin / PINS_PER_GPIO_CHIP; 3830943e0da1S周琰杰 (Zhou Yanjie) unsigned int arg = 1; 3831943e0da1S周琰杰 (Zhou Yanjie) unsigned int bias, reg; 38321d0bd580S周琰杰 (Zhou Yanjie) bool pull, pullup, pulldown; 3833b5c23aa4SPaul Cercueil 38348d2d607cSPaul Cercueil if (is_soc_or_above(jzpc, ID_X2000)) { 3835943e0da1S周琰杰 (Zhou Yanjie) pullup = ingenic_get_pin_config(jzpc, pin, X2000_GPIO_PEPU) && 3836943e0da1S周琰杰 (Zhou Yanjie) !ingenic_get_pin_config(jzpc, pin, X2000_GPIO_PEPD) && 3837943e0da1S周琰杰 (Zhou Yanjie) (jzpc->info->pull_ups[offt] & BIT(idx)); 3838943e0da1S周琰杰 (Zhou Yanjie) pulldown = ingenic_get_pin_config(jzpc, pin, X2000_GPIO_PEPD) && 3839943e0da1S周琰杰 (Zhou Yanjie) !ingenic_get_pin_config(jzpc, pin, X2000_GPIO_PEPU) && 3840943e0da1S周琰杰 (Zhou Yanjie) (jzpc->info->pull_downs[offt] & BIT(idx)); 3841943e0da1S周琰杰 (Zhou Yanjie) 38428d2d607cSPaul Cercueil } else if (is_soc_or_above(jzpc, ID_X1830)) { 38431d0bd580S周琰杰 (Zhou Yanjie) unsigned int half = PINS_PER_GPIO_CHIP / 2; 38441d0bd580S周琰杰 (Zhou Yanjie) unsigned int idxh = (pin % half) * 2; 38451d0bd580S周琰杰 (Zhou Yanjie) 38461d0bd580S周琰杰 (Zhou Yanjie) if (idx < half) 38471d0bd580S周琰杰 (Zhou Yanjie) regmap_read(jzpc->map, offt * jzpc->info->reg_offset + 38481d0bd580S周琰杰 (Zhou Yanjie) X1830_GPIO_PEL, &bias); 38491d0bd580S周琰杰 (Zhou Yanjie) else 38501d0bd580S周琰杰 (Zhou Yanjie) regmap_read(jzpc->map, offt * jzpc->info->reg_offset + 38511d0bd580S周琰杰 (Zhou Yanjie) X1830_GPIO_PEH, &bias); 38521d0bd580S周琰杰 (Zhou Yanjie) 38531d0bd580S周琰杰 (Zhou Yanjie) bias = (bias >> idxh) & (GPIO_PULL_UP | GPIO_PULL_DOWN); 38541d0bd580S周琰杰 (Zhou Yanjie) 38551d0bd580S周琰杰 (Zhou Yanjie) pullup = (bias == GPIO_PULL_UP) && (jzpc->info->pull_ups[offt] & BIT(idx)); 38561d0bd580S周琰杰 (Zhou Yanjie) pulldown = (bias == GPIO_PULL_DOWN) && (jzpc->info->pull_downs[offt] & BIT(idx)); 38571d0bd580S周琰杰 (Zhou Yanjie) 38581d0bd580S周琰杰 (Zhou Yanjie) } else { 38598d2d607cSPaul Cercueil if (is_soc_or_above(jzpc, ID_JZ4770)) 3860b4aa4876SPaul Cercueil pull = !ingenic_get_pin_config(jzpc, pin, JZ4770_GPIO_PEN); 38618d2d607cSPaul Cercueil else if (is_soc_or_above(jzpc, ID_JZ4740)) 3862b5c23aa4SPaul Cercueil pull = !ingenic_get_pin_config(jzpc, pin, JZ4740_GPIO_PULL_DIS); 3863424f3969S周琰杰 (Zhou Yanjie) else 3864424f3969S周琰杰 (Zhou Yanjie) pull = ingenic_get_pin_config(jzpc, pin, JZ4730_GPIO_GPPUR); 3865b5c23aa4SPaul Cercueil 38661d0bd580S周琰杰 (Zhou Yanjie) pullup = pull && (jzpc->info->pull_ups[offt] & BIT(idx)); 38671d0bd580S周琰杰 (Zhou Yanjie) pulldown = pull && (jzpc->info->pull_downs[offt] & BIT(idx)); 38681d0bd580S周琰杰 (Zhou Yanjie) } 38691d0bd580S周琰杰 (Zhou Yanjie) 3870b5c23aa4SPaul Cercueil switch (param) { 3871b5c23aa4SPaul Cercueil case PIN_CONFIG_BIAS_DISABLE: 38721d0bd580S周琰杰 (Zhou Yanjie) if (pullup || pulldown) 3873b5c23aa4SPaul Cercueil return -EINVAL; 3874943e0da1S周琰杰 (Zhou Yanjie) 3875b5c23aa4SPaul Cercueil break; 3876b5c23aa4SPaul Cercueil 3877b5c23aa4SPaul Cercueil case PIN_CONFIG_BIAS_PULL_UP: 38781d0bd580S周琰杰 (Zhou Yanjie) if (!pullup) 3879b5c23aa4SPaul Cercueil return -EINVAL; 3880943e0da1S周琰杰 (Zhou Yanjie) 3881b5c23aa4SPaul Cercueil break; 3882b5c23aa4SPaul Cercueil 3883b5c23aa4SPaul Cercueil case PIN_CONFIG_BIAS_PULL_DOWN: 38841d0bd580S周琰杰 (Zhou Yanjie) if (!pulldown) 3885b5c23aa4SPaul Cercueil return -EINVAL; 3886943e0da1S周琰杰 (Zhou Yanjie) 3887943e0da1S周琰杰 (Zhou Yanjie) break; 3888943e0da1S周琰杰 (Zhou Yanjie) 3889943e0da1S周琰杰 (Zhou Yanjie) case PIN_CONFIG_INPUT_SCHMITT_ENABLE: 38908d2d607cSPaul Cercueil if (is_soc_or_above(jzpc, ID_X2000)) 3891943e0da1S周琰杰 (Zhou Yanjie) reg = X2000_GPIO_SMT; 38928d2d607cSPaul Cercueil else if (is_soc_or_above(jzpc, ID_X1830)) 3893943e0da1S周琰杰 (Zhou Yanjie) reg = X1830_GPIO_SMT; 3894943e0da1S周琰杰 (Zhou Yanjie) else 3895943e0da1S周琰杰 (Zhou Yanjie) return -EINVAL; 3896943e0da1S周琰杰 (Zhou Yanjie) 3897943e0da1S周琰杰 (Zhou Yanjie) arg = !!ingenic_get_pin_config(jzpc, pin, reg); 3898943e0da1S周琰杰 (Zhou Yanjie) break; 3899943e0da1S周琰杰 (Zhou Yanjie) 3900943e0da1S周琰杰 (Zhou Yanjie) case PIN_CONFIG_SLEW_RATE: 39018d2d607cSPaul Cercueil if (is_soc_or_above(jzpc, ID_X2000)) 3902943e0da1S周琰杰 (Zhou Yanjie) reg = X2000_GPIO_SR; 39038d2d607cSPaul Cercueil else if (is_soc_or_above(jzpc, ID_X1830)) 3904943e0da1S周琰杰 (Zhou Yanjie) reg = X1830_GPIO_SR; 3905943e0da1S周琰杰 (Zhou Yanjie) else 3906943e0da1S周琰杰 (Zhou Yanjie) return -EINVAL; 3907943e0da1S周琰杰 (Zhou Yanjie) 3908943e0da1S周琰杰 (Zhou Yanjie) arg = !!ingenic_get_pin_config(jzpc, pin, reg); 3909b5c23aa4SPaul Cercueil break; 3910b5c23aa4SPaul Cercueil 3911b5c23aa4SPaul Cercueil default: 3912b5c23aa4SPaul Cercueil return -ENOTSUPP; 3913b5c23aa4SPaul Cercueil } 3914b5c23aa4SPaul Cercueil 3915943e0da1S周琰杰 (Zhou Yanjie) *config = pinconf_to_config_packed(param, arg); 3916b5c23aa4SPaul Cercueil return 0; 3917b5c23aa4SPaul Cercueil } 3918b5c23aa4SPaul Cercueil 3919b5c23aa4SPaul Cercueil static void ingenic_set_bias(struct ingenic_pinctrl *jzpc, 3920d7da2a1eS周琰杰 (Zhou Yanjie) unsigned int pin, unsigned int bias) 3921b5c23aa4SPaul Cercueil { 39228d2d607cSPaul Cercueil if (is_soc_or_above(jzpc, ID_X2000)) { 3923943e0da1S周琰杰 (Zhou Yanjie) switch (bias) { 39247261851eSPaul Cercueil case GPIO_PULL_UP: 3925943e0da1S周琰杰 (Zhou Yanjie) ingenic_config_pin(jzpc, pin, X2000_GPIO_PEPD, false); 3926943e0da1S周琰杰 (Zhou Yanjie) ingenic_config_pin(jzpc, pin, X2000_GPIO_PEPU, true); 3927943e0da1S周琰杰 (Zhou Yanjie) break; 3928943e0da1S周琰杰 (Zhou Yanjie) 39297261851eSPaul Cercueil case GPIO_PULL_DOWN: 3930943e0da1S周琰杰 (Zhou Yanjie) ingenic_config_pin(jzpc, pin, X2000_GPIO_PEPU, false); 3931943e0da1S周琰杰 (Zhou Yanjie) ingenic_config_pin(jzpc, pin, X2000_GPIO_PEPD, true); 3932943e0da1S周琰杰 (Zhou Yanjie) break; 3933943e0da1S周琰杰 (Zhou Yanjie) 39347261851eSPaul Cercueil case GPIO_PULL_DIS: 3935943e0da1S周琰杰 (Zhou Yanjie) default: 3936943e0da1S周琰杰 (Zhou Yanjie) ingenic_config_pin(jzpc, pin, X2000_GPIO_PEPU, false); 3937943e0da1S周琰杰 (Zhou Yanjie) ingenic_config_pin(jzpc, pin, X2000_GPIO_PEPD, false); 3938943e0da1S周琰杰 (Zhou Yanjie) } 3939943e0da1S周琰杰 (Zhou Yanjie) 39408d2d607cSPaul Cercueil } else if (is_soc_or_above(jzpc, ID_X1830)) { 3941d7da2a1eS周琰杰 (Zhou Yanjie) unsigned int idx = pin % PINS_PER_GPIO_CHIP; 3942d7da2a1eS周琰杰 (Zhou Yanjie) unsigned int half = PINS_PER_GPIO_CHIP / 2; 39431d0bd580S周琰杰 (Zhou Yanjie) unsigned int idxh = (pin % half) * 2; 3944d7da2a1eS周琰杰 (Zhou Yanjie) unsigned int offt = pin / PINS_PER_GPIO_CHIP; 3945d7da2a1eS周琰杰 (Zhou Yanjie) 3946d7da2a1eS周琰杰 (Zhou Yanjie) if (idx < half) { 3947d7da2a1eS周琰杰 (Zhou Yanjie) regmap_write(jzpc->map, offt * jzpc->info->reg_offset + 3948d7da2a1eS周琰杰 (Zhou Yanjie) REG_CLEAR(X1830_GPIO_PEL), 3 << idxh); 3949d7da2a1eS周琰杰 (Zhou Yanjie) regmap_write(jzpc->map, offt * jzpc->info->reg_offset + 3950d7da2a1eS周琰杰 (Zhou Yanjie) REG_SET(X1830_GPIO_PEL), bias << idxh); 3951d7da2a1eS周琰杰 (Zhou Yanjie) } else { 3952d7da2a1eS周琰杰 (Zhou Yanjie) regmap_write(jzpc->map, offt * jzpc->info->reg_offset + 3953d7da2a1eS周琰杰 (Zhou Yanjie) REG_CLEAR(X1830_GPIO_PEH), 3 << idxh); 3954d7da2a1eS周琰杰 (Zhou Yanjie) regmap_write(jzpc->map, offt * jzpc->info->reg_offset + 3955d7da2a1eS周琰杰 (Zhou Yanjie) REG_SET(X1830_GPIO_PEH), bias << idxh); 3956d7da2a1eS周琰杰 (Zhou Yanjie) } 3957d7da2a1eS周琰杰 (Zhou Yanjie) 39588d2d607cSPaul Cercueil } else if (is_soc_or_above(jzpc, ID_JZ4770)) { 3959b4aa4876SPaul Cercueil ingenic_config_pin(jzpc, pin, JZ4770_GPIO_PEN, !bias); 39608d2d607cSPaul Cercueil } else if (is_soc_or_above(jzpc, ID_JZ4740)) { 3961d7da2a1eS周琰杰 (Zhou Yanjie) ingenic_config_pin(jzpc, pin, JZ4740_GPIO_PULL_DIS, !bias); 3962424f3969S周琰杰 (Zhou Yanjie) } else { 3963424f3969S周琰杰 (Zhou Yanjie) ingenic_config_pin(jzpc, pin, JZ4730_GPIO_GPPUR, bias); 3964d7da2a1eS周琰杰 (Zhou Yanjie) } 3965b5c23aa4SPaul Cercueil } 3966b5c23aa4SPaul Cercueil 3967943e0da1S周琰杰 (Zhou Yanjie) static void ingenic_set_schmitt_trigger(struct ingenic_pinctrl *jzpc, 3968943e0da1S周琰杰 (Zhou Yanjie) unsigned int pin, bool enable) 3969943e0da1S周琰杰 (Zhou Yanjie) { 39708d2d607cSPaul Cercueil if (is_soc_or_above(jzpc, ID_X2000)) 3971943e0da1S周琰杰 (Zhou Yanjie) ingenic_config_pin(jzpc, pin, X2000_GPIO_SMT, enable); 3972943e0da1S周琰杰 (Zhou Yanjie) else 3973943e0da1S周琰杰 (Zhou Yanjie) ingenic_config_pin(jzpc, pin, X1830_GPIO_SMT, enable); 3974943e0da1S周琰杰 (Zhou Yanjie) } 3975943e0da1S周琰杰 (Zhou Yanjie) 39767009d046SPaul Cercueil static void ingenic_set_output_level(struct ingenic_pinctrl *jzpc, 39777009d046SPaul Cercueil unsigned int pin, bool high) 39787009d046SPaul Cercueil { 39798d2d607cSPaul Cercueil if (is_soc_or_above(jzpc, ID_JZ4770)) 3980b4aa4876SPaul Cercueil ingenic_config_pin(jzpc, pin, JZ4770_GPIO_PAT0, high); 39818d2d607cSPaul Cercueil else if (is_soc_or_above(jzpc, ID_JZ4740)) 39827009d046SPaul Cercueil ingenic_config_pin(jzpc, pin, JZ4740_GPIO_DATA, high); 3983424f3969S周琰杰 (Zhou Yanjie) else 3984424f3969S周琰杰 (Zhou Yanjie) ingenic_config_pin(jzpc, pin, JZ4730_GPIO_DATA, high); 39857009d046SPaul Cercueil } 39867009d046SPaul Cercueil 3987943e0da1S周琰杰 (Zhou Yanjie) static void ingenic_set_slew_rate(struct ingenic_pinctrl *jzpc, 3988943e0da1S周琰杰 (Zhou Yanjie) unsigned int pin, unsigned int slew) 3989943e0da1S周琰杰 (Zhou Yanjie) { 39908d2d607cSPaul Cercueil if (is_soc_or_above(jzpc, ID_X2000)) 3991943e0da1S周琰杰 (Zhou Yanjie) ingenic_config_pin(jzpc, pin, X2000_GPIO_SR, slew); 3992943e0da1S周琰杰 (Zhou Yanjie) else 3993943e0da1S周琰杰 (Zhou Yanjie) ingenic_config_pin(jzpc, pin, X1830_GPIO_SR, slew); 3994943e0da1S周琰杰 (Zhou Yanjie) } 3995943e0da1S周琰杰 (Zhou Yanjie) 3996b5c23aa4SPaul Cercueil static int ingenic_pinconf_set(struct pinctrl_dev *pctldev, unsigned int pin, 3997b5c23aa4SPaul Cercueil unsigned long *configs, unsigned int num_configs) 3998b5c23aa4SPaul Cercueil { 3999b5c23aa4SPaul Cercueil struct ingenic_pinctrl *jzpc = pinctrl_dev_get_drvdata(pctldev); 4000b5c23aa4SPaul Cercueil unsigned int idx = pin % PINS_PER_GPIO_CHIP; 4001b5c23aa4SPaul Cercueil unsigned int offt = pin / PINS_PER_GPIO_CHIP; 40027009d046SPaul Cercueil unsigned int cfg, arg; 40037009d046SPaul Cercueil int ret; 4004b5c23aa4SPaul Cercueil 4005b5c23aa4SPaul Cercueil for (cfg = 0; cfg < num_configs; cfg++) { 4006b5c23aa4SPaul Cercueil switch (pinconf_to_config_param(configs[cfg])) { 4007b5c23aa4SPaul Cercueil case PIN_CONFIG_BIAS_DISABLE: 4008b5c23aa4SPaul Cercueil case PIN_CONFIG_BIAS_PULL_UP: 4009b5c23aa4SPaul Cercueil case PIN_CONFIG_BIAS_PULL_DOWN: 4010943e0da1S周琰杰 (Zhou Yanjie) case PIN_CONFIG_INPUT_SCHMITT_ENABLE: 40117009d046SPaul Cercueil case PIN_CONFIG_OUTPUT: 4012943e0da1S周琰杰 (Zhou Yanjie) case PIN_CONFIG_SLEW_RATE: 4013b5c23aa4SPaul Cercueil continue; 4014b5c23aa4SPaul Cercueil default: 4015b5c23aa4SPaul Cercueil return -ENOTSUPP; 4016b5c23aa4SPaul Cercueil } 4017b5c23aa4SPaul Cercueil } 4018b5c23aa4SPaul Cercueil 4019b5c23aa4SPaul Cercueil for (cfg = 0; cfg < num_configs; cfg++) { 40207009d046SPaul Cercueil arg = pinconf_to_config_argument(configs[cfg]); 40217009d046SPaul Cercueil 4022b5c23aa4SPaul Cercueil switch (pinconf_to_config_param(configs[cfg])) { 4023b5c23aa4SPaul Cercueil case PIN_CONFIG_BIAS_DISABLE: 4024b5c23aa4SPaul Cercueil dev_dbg(jzpc->dev, "disable pull-over for pin P%c%u\n", 4025b5c23aa4SPaul Cercueil 'A' + offt, idx); 4026d7da2a1eS周琰杰 (Zhou Yanjie) ingenic_set_bias(jzpc, pin, GPIO_PULL_DIS); 4027b5c23aa4SPaul Cercueil break; 4028b5c23aa4SPaul Cercueil 4029b5c23aa4SPaul Cercueil case PIN_CONFIG_BIAS_PULL_UP: 4030b5c23aa4SPaul Cercueil if (!(jzpc->info->pull_ups[offt] & BIT(idx))) 4031b5c23aa4SPaul Cercueil return -EINVAL; 4032b5c23aa4SPaul Cercueil dev_dbg(jzpc->dev, "set pull-up for pin P%c%u\n", 4033b5c23aa4SPaul Cercueil 'A' + offt, idx); 4034d7da2a1eS周琰杰 (Zhou Yanjie) ingenic_set_bias(jzpc, pin, GPIO_PULL_UP); 4035b5c23aa4SPaul Cercueil break; 4036b5c23aa4SPaul Cercueil 4037b5c23aa4SPaul Cercueil case PIN_CONFIG_BIAS_PULL_DOWN: 4038b5c23aa4SPaul Cercueil if (!(jzpc->info->pull_downs[offt] & BIT(idx))) 4039b5c23aa4SPaul Cercueil return -EINVAL; 4040b5c23aa4SPaul Cercueil dev_dbg(jzpc->dev, "set pull-down for pin P%c%u\n", 4041b5c23aa4SPaul Cercueil 'A' + offt, idx); 4042d7da2a1eS周琰杰 (Zhou Yanjie) ingenic_set_bias(jzpc, pin, GPIO_PULL_DOWN); 4043b5c23aa4SPaul Cercueil break; 4044b5c23aa4SPaul Cercueil 4045943e0da1S周琰杰 (Zhou Yanjie) case PIN_CONFIG_INPUT_SCHMITT_ENABLE: 40468d2d607cSPaul Cercueil if (!is_soc_or_above(jzpc, ID_X1830)) 4047943e0da1S周琰杰 (Zhou Yanjie) return -EINVAL; 4048943e0da1S周琰杰 (Zhou Yanjie) 4049943e0da1S周琰杰 (Zhou Yanjie) ingenic_set_schmitt_trigger(jzpc, pin, arg); 4050943e0da1S周琰杰 (Zhou Yanjie) break; 4051943e0da1S周琰杰 (Zhou Yanjie) 40527009d046SPaul Cercueil case PIN_CONFIG_OUTPUT: 40537009d046SPaul Cercueil ret = pinctrl_gpio_direction_output(pin); 40547009d046SPaul Cercueil if (ret) 40557009d046SPaul Cercueil return ret; 40567009d046SPaul Cercueil 40577009d046SPaul Cercueil ingenic_set_output_level(jzpc, pin, arg); 40587009d046SPaul Cercueil break; 40597009d046SPaul Cercueil 4060943e0da1S周琰杰 (Zhou Yanjie) case PIN_CONFIG_SLEW_RATE: 40618d2d607cSPaul Cercueil if (!is_soc_or_above(jzpc, ID_X1830)) 4062943e0da1S周琰杰 (Zhou Yanjie) return -EINVAL; 4063943e0da1S周琰杰 (Zhou Yanjie) 4064943e0da1S周琰杰 (Zhou Yanjie) ingenic_set_slew_rate(jzpc, pin, arg); 4065943e0da1S周琰杰 (Zhou Yanjie) break; 4066943e0da1S周琰杰 (Zhou Yanjie) 4067b5c23aa4SPaul Cercueil default: 4068d6d43a92SJosh Poimboeuf /* unreachable */ 4069d6d43a92SJosh Poimboeuf break; 4070b5c23aa4SPaul Cercueil } 4071b5c23aa4SPaul Cercueil } 4072b5c23aa4SPaul Cercueil 4073b5c23aa4SPaul Cercueil return 0; 4074b5c23aa4SPaul Cercueil } 4075b5c23aa4SPaul Cercueil 4076b5c23aa4SPaul Cercueil static int ingenic_pinconf_group_get(struct pinctrl_dev *pctldev, 4077b5c23aa4SPaul Cercueil unsigned int group, unsigned long *config) 4078b5c23aa4SPaul Cercueil { 4079b5c23aa4SPaul Cercueil const unsigned int *pins; 4080b5c23aa4SPaul Cercueil unsigned int i, npins, old = 0; 4081b5c23aa4SPaul Cercueil int ret; 4082b5c23aa4SPaul Cercueil 4083b5c23aa4SPaul Cercueil ret = pinctrl_generic_get_group_pins(pctldev, group, &pins, &npins); 4084b5c23aa4SPaul Cercueil if (ret) 4085b5c23aa4SPaul Cercueil return ret; 4086b5c23aa4SPaul Cercueil 4087b5c23aa4SPaul Cercueil for (i = 0; i < npins; i++) { 4088b5c23aa4SPaul Cercueil if (ingenic_pinconf_get(pctldev, pins[i], config)) 4089b5c23aa4SPaul Cercueil return -ENOTSUPP; 4090b5c23aa4SPaul Cercueil 4091b5c23aa4SPaul Cercueil /* configs do not match between two pins */ 4092b5c23aa4SPaul Cercueil if (i && (old != *config)) 4093b5c23aa4SPaul Cercueil return -ENOTSUPP; 4094b5c23aa4SPaul Cercueil 4095b5c23aa4SPaul Cercueil old = *config; 4096b5c23aa4SPaul Cercueil } 4097b5c23aa4SPaul Cercueil 4098b5c23aa4SPaul Cercueil return 0; 4099b5c23aa4SPaul Cercueil } 4100b5c23aa4SPaul Cercueil 4101b5c23aa4SPaul Cercueil static int ingenic_pinconf_group_set(struct pinctrl_dev *pctldev, 4102b5c23aa4SPaul Cercueil unsigned int group, unsigned long *configs, 4103b5c23aa4SPaul Cercueil unsigned int num_configs) 4104b5c23aa4SPaul Cercueil { 4105b5c23aa4SPaul Cercueil const unsigned int *pins; 4106b5c23aa4SPaul Cercueil unsigned int i, npins; 4107b5c23aa4SPaul Cercueil int ret; 4108b5c23aa4SPaul Cercueil 4109b5c23aa4SPaul Cercueil ret = pinctrl_generic_get_group_pins(pctldev, group, &pins, &npins); 4110b5c23aa4SPaul Cercueil if (ret) 4111b5c23aa4SPaul Cercueil return ret; 4112b5c23aa4SPaul Cercueil 4113b5c23aa4SPaul Cercueil for (i = 0; i < npins; i++) { 4114b5c23aa4SPaul Cercueil ret = ingenic_pinconf_set(pctldev, 4115b5c23aa4SPaul Cercueil pins[i], configs, num_configs); 4116b5c23aa4SPaul Cercueil if (ret) 4117b5c23aa4SPaul Cercueil return ret; 4118b5c23aa4SPaul Cercueil } 4119b5c23aa4SPaul Cercueil 4120b5c23aa4SPaul Cercueil return 0; 4121b5c23aa4SPaul Cercueil } 4122b5c23aa4SPaul Cercueil 41235bf7b849SJulia Lawall static const struct pinconf_ops ingenic_confops = { 4124b5c23aa4SPaul Cercueil .is_generic = true, 4125b5c23aa4SPaul Cercueil .pin_config_get = ingenic_pinconf_get, 4126b5c23aa4SPaul Cercueil .pin_config_set = ingenic_pinconf_set, 4127b5c23aa4SPaul Cercueil .pin_config_group_get = ingenic_pinconf_group_get, 4128b5c23aa4SPaul Cercueil .pin_config_group_set = ingenic_pinconf_group_set, 4129b5c23aa4SPaul Cercueil }; 4130b5c23aa4SPaul Cercueil 4131b5c23aa4SPaul Cercueil static const struct regmap_config ingenic_pinctrl_regmap_config = { 4132b5c23aa4SPaul Cercueil .reg_bits = 32, 4133b5c23aa4SPaul Cercueil .val_bits = 32, 4134b5c23aa4SPaul Cercueil .reg_stride = 4, 4135b5c23aa4SPaul Cercueil }; 4136b5c23aa4SPaul Cercueil 413728c1caafS周琰杰 (Zhou Yanjie) static const struct of_device_id ingenic_gpio_of_matches[] __initconst = { 413828c1caafS周琰杰 (Zhou Yanjie) { .compatible = "ingenic,jz4730-gpio" }, 413928c1caafS周琰杰 (Zhou Yanjie) { .compatible = "ingenic,jz4740-gpio" }, 414028c1caafS周琰杰 (Zhou Yanjie) { .compatible = "ingenic,jz4725b-gpio" }, 414128c1caafS周琰杰 (Zhou Yanjie) { .compatible = "ingenic,jz4750-gpio" }, 414228c1caafS周琰杰 (Zhou Yanjie) { .compatible = "ingenic,jz4755-gpio" }, 414328c1caafS周琰杰 (Zhou Yanjie) { .compatible = "ingenic,jz4760-gpio" }, 414428c1caafS周琰杰 (Zhou Yanjie) { .compatible = "ingenic,jz4770-gpio" }, 414528c1caafS周琰杰 (Zhou Yanjie) { .compatible = "ingenic,jz4775-gpio" }, 414628c1caafS周琰杰 (Zhou Yanjie) { .compatible = "ingenic,jz4780-gpio" }, 414728c1caafS周琰杰 (Zhou Yanjie) { .compatible = "ingenic,x1000-gpio" }, 414828c1caafS周琰杰 (Zhou Yanjie) { .compatible = "ingenic,x1830-gpio" }, 414928c1caafS周琰杰 (Zhou Yanjie) { .compatible = "ingenic,x2000-gpio" }, 41502a18211bS周琰杰 (Zhou Yanjie) { .compatible = "ingenic,x2100-gpio" }, 4151e72394e2SPaul Cercueil {}, 4152e72394e2SPaul Cercueil }; 4153e72394e2SPaul Cercueil 4154e72394e2SPaul Cercueil static int __init ingenic_gpio_probe(struct ingenic_pinctrl *jzpc, 4155*8c943137SAndy Shevchenko struct fwnode_handle *fwnode) 4156e72394e2SPaul Cercueil { 4157e72394e2SPaul Cercueil struct ingenic_gpio_chip *jzgc; 4158e72394e2SPaul Cercueil struct device *dev = jzpc->dev; 4159142b8767SLinus Walleij struct gpio_irq_chip *girq; 4160e72394e2SPaul Cercueil unsigned int bank; 4161e72394e2SPaul Cercueil int err; 4162e72394e2SPaul Cercueil 4163*8c943137SAndy Shevchenko err = fwnode_property_read_u32(fwnode, "reg", &bank); 4164e72394e2SPaul Cercueil if (err) { 4165e72394e2SPaul Cercueil dev_err(dev, "Cannot read \"reg\" property: %i\n", err); 4166e72394e2SPaul Cercueil return err; 4167e72394e2SPaul Cercueil } 4168e72394e2SPaul Cercueil 4169e72394e2SPaul Cercueil jzgc = devm_kzalloc(dev, sizeof(*jzgc), GFP_KERNEL); 4170e72394e2SPaul Cercueil if (!jzgc) 4171e72394e2SPaul Cercueil return -ENOMEM; 4172e72394e2SPaul Cercueil 4173e72394e2SPaul Cercueil jzgc->jzpc = jzpc; 4174f742e5ebS周琰杰 (Zhou Yanjie) jzgc->reg_base = bank * jzpc->info->reg_offset; 4175e72394e2SPaul Cercueil 4176e72394e2SPaul Cercueil jzgc->gc.label = devm_kasprintf(dev, GFP_KERNEL, "GPIO%c", 'A' + bank); 4177e72394e2SPaul Cercueil if (!jzgc->gc.label) 4178e72394e2SPaul Cercueil return -ENOMEM; 4179e72394e2SPaul Cercueil 4180e72394e2SPaul Cercueil /* DO NOT EXPAND THIS: FOR BACKWARD GPIO NUMBERSPACE COMPATIBIBILITY 4181e72394e2SPaul Cercueil * ONLY: WORK TO TRANSITION CONSUMERS TO USE THE GPIO DESCRIPTOR API IN 4182e72394e2SPaul Cercueil * <linux/gpio/consumer.h> INSTEAD. 4183e72394e2SPaul Cercueil */ 4184e72394e2SPaul Cercueil jzgc->gc.base = bank * 32; 4185e72394e2SPaul Cercueil 4186e72394e2SPaul Cercueil jzgc->gc.ngpio = 32; 4187e72394e2SPaul Cercueil jzgc->gc.parent = dev; 4188*8c943137SAndy Shevchenko jzgc->gc.fwnode = fwnode; 4189e72394e2SPaul Cercueil jzgc->gc.owner = THIS_MODULE; 4190e72394e2SPaul Cercueil 4191e72394e2SPaul Cercueil jzgc->gc.set = ingenic_gpio_set; 4192e72394e2SPaul Cercueil jzgc->gc.get = ingenic_gpio_get; 4193e72394e2SPaul Cercueil jzgc->gc.direction_input = ingenic_gpio_direction_input; 4194e72394e2SPaul Cercueil jzgc->gc.direction_output = ingenic_gpio_direction_output; 4195ebd66514SPaul Cercueil jzgc->gc.get_direction = ingenic_gpio_get_direction; 4196e72394e2SPaul Cercueil jzgc->gc.request = gpiochip_generic_request; 4197e72394e2SPaul Cercueil jzgc->gc.free = gpiochip_generic_free; 4198e72394e2SPaul Cercueil 4199*8c943137SAndy Shevchenko err = fwnode_irq_get(fwnode, 0); 4200*8c943137SAndy Shevchenko if (err < 0) 4201*8c943137SAndy Shevchenko return err; 4202*8c943137SAndy Shevchenko if (!err) 4203e72394e2SPaul Cercueil return -EINVAL; 4204*8c943137SAndy Shevchenko jzgc->irq = err; 4205e72394e2SPaul Cercueil 4206142b8767SLinus Walleij girq = &jzgc->gc.irq; 420771f5e7b3SAidan MacDonald gpio_irq_chip_set_chip(girq, &ingenic_gpio_irqchip); 4208142b8767SLinus Walleij girq->parent_handler = ingenic_gpio_irq_handler; 4209142b8767SLinus Walleij girq->num_parents = 1; 4210142b8767SLinus Walleij girq->parents = devm_kcalloc(dev, 1, sizeof(*girq->parents), 4211142b8767SLinus Walleij GFP_KERNEL); 4212142b8767SLinus Walleij if (!girq->parents) 4213142b8767SLinus Walleij return -ENOMEM; 4214943e0da1S周琰杰 (Zhou Yanjie) 4215142b8767SLinus Walleij girq->parents[0] = jzgc->irq; 4216142b8767SLinus Walleij girq->default_type = IRQ_TYPE_NONE; 4217142b8767SLinus Walleij girq->handler = handle_level_irq; 4218142b8767SLinus Walleij 4219142b8767SLinus Walleij err = devm_gpiochip_add_data(dev, &jzgc->gc, jzgc); 4220e72394e2SPaul Cercueil if (err) 4221e72394e2SPaul Cercueil return err; 4222e72394e2SPaul Cercueil 4223e72394e2SPaul Cercueil return 0; 4224e72394e2SPaul Cercueil } 4225e72394e2SPaul Cercueil 42264717b11fSPaul Cercueil static int __init ingenic_pinctrl_probe(struct platform_device *pdev) 4227b5c23aa4SPaul Cercueil { 4228b5c23aa4SPaul Cercueil struct device *dev = &pdev->dev; 4229b5c23aa4SPaul Cercueil struct ingenic_pinctrl *jzpc; 4230b5c23aa4SPaul Cercueil struct pinctrl_desc *pctl_desc; 4231b5c23aa4SPaul Cercueil void __iomem *base; 4232b5c23aa4SPaul Cercueil const struct ingenic_chip_info *chip_info; 42336626a76eSPaul Cercueil struct regmap_config regmap_config; 4234*8c943137SAndy Shevchenko struct fwnode_handle *fwnode; 4235b5c23aa4SPaul Cercueil unsigned int i; 4236b5c23aa4SPaul Cercueil int err; 4237b5c23aa4SPaul Cercueil 4238*8c943137SAndy Shevchenko chip_info = device_get_match_data(dev); 42399aa35178SPaul Cercueil if (!chip_info) { 42409aa35178SPaul Cercueil dev_err(dev, "Unsupported SoC\n"); 42419aa35178SPaul Cercueil return -EINVAL; 42429aa35178SPaul Cercueil } 42439aa35178SPaul Cercueil 4244b5c23aa4SPaul Cercueil jzpc = devm_kzalloc(dev, sizeof(*jzpc), GFP_KERNEL); 4245b5c23aa4SPaul Cercueil if (!jzpc) 4246b5c23aa4SPaul Cercueil return -ENOMEM; 4247b5c23aa4SPaul Cercueil 424894f7a2cbSPaul Cercueil base = devm_platform_ioremap_resource(pdev, 0); 4249119fcf47SWei Yongjun if (IS_ERR(base)) 4250b5c23aa4SPaul Cercueil return PTR_ERR(base); 4251b5c23aa4SPaul Cercueil 42526626a76eSPaul Cercueil regmap_config = ingenic_pinctrl_regmap_config; 42539279c00fSAidan MacDonald if (chip_info->access_table) { 42549279c00fSAidan MacDonald regmap_config.rd_table = chip_info->access_table; 42559279c00fSAidan MacDonald regmap_config.wr_table = chip_info->access_table; 42569279c00fSAidan MacDonald } else { 42579279c00fSAidan MacDonald regmap_config.max_register = chip_info->num_chips * chip_info->reg_offset - 4; 42589279c00fSAidan MacDonald } 42596626a76eSPaul Cercueil 42606626a76eSPaul Cercueil jzpc->map = devm_regmap_init_mmio(dev, base, ®map_config); 4261b5c23aa4SPaul Cercueil if (IS_ERR(jzpc->map)) { 4262b5c23aa4SPaul Cercueil dev_err(dev, "Failed to create regmap\n"); 4263b5c23aa4SPaul Cercueil return PTR_ERR(jzpc->map); 4264b5c23aa4SPaul Cercueil } 4265b5c23aa4SPaul Cercueil 4266b5c23aa4SPaul Cercueil jzpc->dev = dev; 42679aa35178SPaul Cercueil jzpc->info = chip_info; 4268b5c23aa4SPaul Cercueil 4269b5c23aa4SPaul Cercueil pctl_desc = devm_kzalloc(&pdev->dev, sizeof(*pctl_desc), GFP_KERNEL); 4270b5c23aa4SPaul Cercueil if (!pctl_desc) 4271b5c23aa4SPaul Cercueil return -ENOMEM; 4272b5c23aa4SPaul Cercueil 4273b5c23aa4SPaul Cercueil /* fill in pinctrl_desc structure */ 4274b5c23aa4SPaul Cercueil pctl_desc->name = dev_name(dev); 4275b5c23aa4SPaul Cercueil pctl_desc->owner = THIS_MODULE; 4276b5c23aa4SPaul Cercueil pctl_desc->pctlops = &ingenic_pctlops; 4277b5c23aa4SPaul Cercueil pctl_desc->pmxops = &ingenic_pmxops; 4278b5c23aa4SPaul Cercueil pctl_desc->confops = &ingenic_confops; 4279b5c23aa4SPaul Cercueil pctl_desc->npins = chip_info->num_chips * PINS_PER_GPIO_CHIP; 4280a86854d0SKees Cook pctl_desc->pins = jzpc->pdesc = devm_kcalloc(&pdev->dev, 4281a86854d0SKees Cook pctl_desc->npins, sizeof(*jzpc->pdesc), GFP_KERNEL); 4282b5c23aa4SPaul Cercueil if (!jzpc->pdesc) 4283b5c23aa4SPaul Cercueil return -ENOMEM; 4284b5c23aa4SPaul Cercueil 4285b5c23aa4SPaul Cercueil for (i = 0; i < pctl_desc->npins; i++) { 4286b5c23aa4SPaul Cercueil jzpc->pdesc[i].number = i; 4287b5c23aa4SPaul Cercueil jzpc->pdesc[i].name = kasprintf(GFP_KERNEL, "P%c%d", 4288b5c23aa4SPaul Cercueil 'A' + (i / PINS_PER_GPIO_CHIP), 4289b5c23aa4SPaul Cercueil i % PINS_PER_GPIO_CHIP); 4290b5c23aa4SPaul Cercueil } 4291b5c23aa4SPaul Cercueil 4292b5c23aa4SPaul Cercueil jzpc->pctl = devm_pinctrl_register(dev, pctl_desc, jzpc); 4293e7f4c4bfSDan Carpenter if (IS_ERR(jzpc->pctl)) { 4294b5c23aa4SPaul Cercueil dev_err(dev, "Failed to register pinctrl\n"); 4295e7f4c4bfSDan Carpenter return PTR_ERR(jzpc->pctl); 4296b5c23aa4SPaul Cercueil } 4297b5c23aa4SPaul Cercueil 4298b5c23aa4SPaul Cercueil for (i = 0; i < chip_info->num_groups; i++) { 4299b5c23aa4SPaul Cercueil const struct group_desc *group = &chip_info->groups[i]; 4300b5c23aa4SPaul Cercueil 4301b5c23aa4SPaul Cercueil err = pinctrl_generic_add_group(jzpc->pctl, group->name, 4302b5c23aa4SPaul Cercueil group->pins, group->num_pins, group->data); 4303823dd71fSPaul Burton if (err < 0) { 4304b5c23aa4SPaul Cercueil dev_err(dev, "Failed to register group %s\n", 4305b5c23aa4SPaul Cercueil group->name); 4306b5c23aa4SPaul Cercueil return err; 4307b5c23aa4SPaul Cercueil } 4308b5c23aa4SPaul Cercueil } 4309b5c23aa4SPaul Cercueil 4310b5c23aa4SPaul Cercueil for (i = 0; i < chip_info->num_functions; i++) { 4311b5c23aa4SPaul Cercueil const struct function_desc *func = &chip_info->functions[i]; 4312b5c23aa4SPaul Cercueil 4313b5c23aa4SPaul Cercueil err = pinmux_generic_add_function(jzpc->pctl, func->name, 4314b5c23aa4SPaul Cercueil func->group_names, func->num_group_names, 4315b5c23aa4SPaul Cercueil func->data); 4316823dd71fSPaul Burton if (err < 0) { 4317b5c23aa4SPaul Cercueil dev_err(dev, "Failed to register function %s\n", 4318b5c23aa4SPaul Cercueil func->name); 4319b5c23aa4SPaul Cercueil return err; 4320b5c23aa4SPaul Cercueil } 4321b5c23aa4SPaul Cercueil } 4322b5c23aa4SPaul Cercueil 4323b5c23aa4SPaul Cercueil dev_set_drvdata(dev, jzpc->map); 4324b5c23aa4SPaul Cercueil 4325*8c943137SAndy Shevchenko device_for_each_child_node(dev, fwnode) { 4326*8c943137SAndy Shevchenko if (of_match_node(ingenic_gpio_of_matches, to_of_node(fwnode))) { 4327*8c943137SAndy Shevchenko err = ingenic_gpio_probe(jzpc, fwnode); 4328d2cd54c2SYang Li if (err) { 4329*8c943137SAndy Shevchenko fwnode_handle_put(fwnode); 4330b5c23aa4SPaul Cercueil return err; 4331b5c23aa4SPaul Cercueil } 4332b5c23aa4SPaul Cercueil } 4333d2cd54c2SYang Li } 4334b5c23aa4SPaul Cercueil 4335b5c23aa4SPaul Cercueil return 0; 4336b5c23aa4SPaul Cercueil } 4337b5c23aa4SPaul Cercueil 43380ab1438bSMasahiro Yamada #define IF_ENABLED(cfg, ptr) PTR_IF(IS_ENABLED(cfg), (ptr)) 43390ab1438bSMasahiro Yamada 434028c1caafS周琰杰 (Zhou Yanjie) static const struct of_device_id ingenic_pinctrl_of_matches[] = { 43419aa35178SPaul Cercueil { 4342424f3969S周琰杰 (Zhou Yanjie) .compatible = "ingenic,jz4730-pinctrl", 4343424f3969S周琰杰 (Zhou Yanjie) .data = IF_ENABLED(CONFIG_MACH_JZ4730, &jz4730_chip_info) 4344424f3969S周琰杰 (Zhou Yanjie) }, 4345424f3969S周琰杰 (Zhou Yanjie) { 43469aa35178SPaul Cercueil .compatible = "ingenic,jz4740-pinctrl", 43479aa35178SPaul Cercueil .data = IF_ENABLED(CONFIG_MACH_JZ4740, &jz4740_chip_info) 43489aa35178SPaul Cercueil }, 43499aa35178SPaul Cercueil { 43509aa35178SPaul Cercueil .compatible = "ingenic,jz4725b-pinctrl", 43519aa35178SPaul Cercueil .data = IF_ENABLED(CONFIG_MACH_JZ4725B, &jz4725b_chip_info) 43529aa35178SPaul Cercueil }, 43539aa35178SPaul Cercueil { 4354215c81a3S周琰杰 (Zhou Yanjie) .compatible = "ingenic,jz4750-pinctrl", 4355215c81a3S周琰杰 (Zhou Yanjie) .data = IF_ENABLED(CONFIG_MACH_JZ4750, &jz4750_chip_info) 4356215c81a3S周琰杰 (Zhou Yanjie) }, 4357b582b5a4S周琰杰 (Zhou Yanjie) { 4358b582b5a4S周琰杰 (Zhou Yanjie) .compatible = "ingenic,jz4755-pinctrl", 4359b582b5a4S周琰杰 (Zhou Yanjie) .data = IF_ENABLED(CONFIG_MACH_JZ4755, &jz4755_chip_info) 4360b582b5a4S周琰杰 (Zhou Yanjie) }, 4361b582b5a4S周琰杰 (Zhou Yanjie) { 43629aa35178SPaul Cercueil .compatible = "ingenic,jz4760-pinctrl", 43639aa35178SPaul Cercueil .data = IF_ENABLED(CONFIG_MACH_JZ4760, &jz4760_chip_info) 43649aa35178SPaul Cercueil }, 43659aa35178SPaul Cercueil { 43669aa35178SPaul Cercueil .compatible = "ingenic,jz4760b-pinctrl", 43679aa35178SPaul Cercueil .data = IF_ENABLED(CONFIG_MACH_JZ4760, &jz4760_chip_info) 43689aa35178SPaul Cercueil }, 43699aa35178SPaul Cercueil { 43709aa35178SPaul Cercueil .compatible = "ingenic,jz4770-pinctrl", 43719aa35178SPaul Cercueil .data = IF_ENABLED(CONFIG_MACH_JZ4770, &jz4770_chip_info) 43729aa35178SPaul Cercueil }, 43739aa35178SPaul Cercueil { 43740c990740S周琰杰 (Zhou Yanjie) .compatible = "ingenic,jz4775-pinctrl", 43750c990740S周琰杰 (Zhou Yanjie) .data = IF_ENABLED(CONFIG_MACH_JZ4775, &jz4775_chip_info) 43760c990740S周琰杰 (Zhou Yanjie) }, 43770c990740S周琰杰 (Zhou Yanjie) { 43789aa35178SPaul Cercueil .compatible = "ingenic,jz4780-pinctrl", 43799aa35178SPaul Cercueil .data = IF_ENABLED(CONFIG_MACH_JZ4780, &jz4780_chip_info) 43809aa35178SPaul Cercueil }, 43819aa35178SPaul Cercueil { 43829aa35178SPaul Cercueil .compatible = "ingenic,x1000-pinctrl", 43839aa35178SPaul Cercueil .data = IF_ENABLED(CONFIG_MACH_X1000, &x1000_chip_info) 43849aa35178SPaul Cercueil }, 43859aa35178SPaul Cercueil { 43869aa35178SPaul Cercueil .compatible = "ingenic,x1000e-pinctrl", 43879aa35178SPaul Cercueil .data = IF_ENABLED(CONFIG_MACH_X1000, &x1000_chip_info) 43889aa35178SPaul Cercueil }, 43899aa35178SPaul Cercueil { 43909aa35178SPaul Cercueil .compatible = "ingenic,x1500-pinctrl", 43919aa35178SPaul Cercueil .data = IF_ENABLED(CONFIG_MACH_X1500, &x1500_chip_info) 43929aa35178SPaul Cercueil }, 43939aa35178SPaul Cercueil { 43949aa35178SPaul Cercueil .compatible = "ingenic,x1830-pinctrl", 43959aa35178SPaul Cercueil .data = IF_ENABLED(CONFIG_MACH_X1830, &x1830_chip_info) 43969aa35178SPaul Cercueil }, 4397943e0da1S周琰杰 (Zhou Yanjie) { 4398943e0da1S周琰杰 (Zhou Yanjie) .compatible = "ingenic,x2000-pinctrl", 4399943e0da1S周琰杰 (Zhou Yanjie) .data = IF_ENABLED(CONFIG_MACH_X2000, &x2000_chip_info) 4400943e0da1S周琰杰 (Zhou Yanjie) }, 4401943e0da1S周琰杰 (Zhou Yanjie) { 4402943e0da1S周琰杰 (Zhou Yanjie) .compatible = "ingenic,x2000e-pinctrl", 4403943e0da1S周琰杰 (Zhou Yanjie) .data = IF_ENABLED(CONFIG_MACH_X2000, &x2000_chip_info) 4404943e0da1S周琰杰 (Zhou Yanjie) }, 44052a18211bS周琰杰 (Zhou Yanjie) { 44062a18211bS周琰杰 (Zhou Yanjie) .compatible = "ingenic,x2100-pinctrl", 44072a18211bS周琰杰 (Zhou Yanjie) .data = IF_ENABLED(CONFIG_MACH_X2100, &x2100_chip_info) 44082a18211bS周琰杰 (Zhou Yanjie) }, 44099aa35178SPaul Cercueil { /* sentinel */ }, 4410baf15647SPaul Cercueil }; 4411baf15647SPaul Cercueil 4412b5c23aa4SPaul Cercueil static struct platform_driver ingenic_pinctrl_driver = { 4413b5c23aa4SPaul Cercueil .driver = { 4414b5c23aa4SPaul Cercueil .name = "pinctrl-ingenic", 441528c1caafS周琰杰 (Zhou Yanjie) .of_match_table = ingenic_pinctrl_of_matches, 4416b5c23aa4SPaul Cercueil }, 4417b5c23aa4SPaul Cercueil }; 4418b5c23aa4SPaul Cercueil 4419b5c23aa4SPaul Cercueil static int __init ingenic_pinctrl_drv_register(void) 4420b5c23aa4SPaul Cercueil { 44214717b11fSPaul Cercueil return platform_driver_probe(&ingenic_pinctrl_driver, 44224717b11fSPaul Cercueil ingenic_pinctrl_probe); 4423b5c23aa4SPaul Cercueil } 4424556a36a7SPaul Cercueil subsys_initcall(ingenic_pinctrl_drv_register); 4425