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> 6d7da2a1eS周琰杰 (Zhou Yanjie) * Copyright (c) 2019 周琰杰 (Zhou Yanjie) <zhouyanjie@wanyeetech.com> 7a0bb89e8SPaul Boddie * Copyright (c) 2017, 2019 Paul Boddie <paul@boddie.org.uk> 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> 14b5c23aa4SPaul Cercueil #include <linux/of_device.h> 15e72394e2SPaul Cercueil #include <linux/of_irq.h> 16b5c23aa4SPaul Cercueil #include <linux/of_platform.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> 22b5c23aa4SPaul Cercueil #include <linux/regmap.h> 23b5c23aa4SPaul Cercueil #include <linux/slab.h> 24b5c23aa4SPaul Cercueil 25b5c23aa4SPaul Cercueil #include "core.h" 26b5c23aa4SPaul Cercueil #include "pinconf.h" 27b5c23aa4SPaul Cercueil #include "pinmux.h" 28b5c23aa4SPaul Cercueil 29e72394e2SPaul Cercueil #define GPIO_PIN 0x00 30e72394e2SPaul Cercueil #define GPIO_MSK 0x20 31e72394e2SPaul Cercueil 32b5c23aa4SPaul Cercueil #define JZ4740_GPIO_DATA 0x10 33b5c23aa4SPaul Cercueil #define JZ4740_GPIO_PULL_DIS 0x30 34b5c23aa4SPaul Cercueil #define JZ4740_GPIO_FUNC 0x40 35b5c23aa4SPaul Cercueil #define JZ4740_GPIO_SELECT 0x50 36b5c23aa4SPaul Cercueil #define JZ4740_GPIO_DIR 0x60 37b5c23aa4SPaul Cercueil #define JZ4740_GPIO_TRIG 0x70 38b5c23aa4SPaul Cercueil #define JZ4740_GPIO_FLAG 0x80 39b5c23aa4SPaul Cercueil 400257595aSZhou Yanjie #define JZ4760_GPIO_INT 0x10 410257595aSZhou Yanjie #define JZ4760_GPIO_PAT1 0x30 420257595aSZhou Yanjie #define JZ4760_GPIO_PAT0 0x40 430257595aSZhou Yanjie #define JZ4760_GPIO_FLAG 0x50 440257595aSZhou Yanjie #define JZ4760_GPIO_PEN 0x70 45b5c23aa4SPaul Cercueil 46d7da2a1eS周琰杰 (Zhou Yanjie) #define X1830_GPIO_PEL 0x110 47d7da2a1eS周琰杰 (Zhou Yanjie) #define X1830_GPIO_PEH 0x120 48fe1ad5eeSZhou Yanjie 49b5c23aa4SPaul Cercueil #define REG_SET(x) ((x) + 0x4) 50b5c23aa4SPaul Cercueil #define REG_CLEAR(x) ((x) + 0x8) 51b5c23aa4SPaul Cercueil 52d7da2a1eS周琰杰 (Zhou Yanjie) #define REG_PZ_BASE(x) ((x) * 7) 53d7da2a1eS周琰杰 (Zhou Yanjie) #define REG_PZ_GID2LD(x) ((x) * 7 + 0xf0) 54d7da2a1eS周琰杰 (Zhou Yanjie) 55d7da2a1eS周琰杰 (Zhou Yanjie) #define GPIO_PULL_DIS 0 56d7da2a1eS周琰杰 (Zhou Yanjie) #define GPIO_PULL_UP 1 57d7da2a1eS周琰杰 (Zhou Yanjie) #define GPIO_PULL_DOWN 2 58d7da2a1eS周琰杰 (Zhou Yanjie) 59b5c23aa4SPaul Cercueil #define PINS_PER_GPIO_CHIP 32 60b5c23aa4SPaul Cercueil 61b5c23aa4SPaul Cercueil enum jz_version { 62b5c23aa4SPaul Cercueil ID_JZ4740, 63f2a96765SPaul Cercueil ID_JZ4725B, 640257595aSZhou Yanjie ID_JZ4760, 65b5c23aa4SPaul Cercueil ID_JZ4770, 66b5c23aa4SPaul Cercueil ID_JZ4780, 67fe1ad5eeSZhou Yanjie ID_X1000, 685d21595bSZhou Yanjie ID_X1500, 69d7da2a1eS周琰杰 (Zhou Yanjie) ID_X1830, 70b5c23aa4SPaul Cercueil }; 71b5c23aa4SPaul Cercueil 72b5c23aa4SPaul Cercueil struct ingenic_chip_info { 73b5c23aa4SPaul Cercueil unsigned int num_chips; 74f742e5ebS周琰杰 (Zhou Yanjie) unsigned int reg_offset; 75baf15647SPaul Cercueil enum jz_version version; 76b5c23aa4SPaul Cercueil 77b5c23aa4SPaul Cercueil const struct group_desc *groups; 78b5c23aa4SPaul Cercueil unsigned int num_groups; 79b5c23aa4SPaul Cercueil 80b5c23aa4SPaul Cercueil const struct function_desc *functions; 81b5c23aa4SPaul Cercueil unsigned int num_functions; 82b5c23aa4SPaul Cercueil 83b5c23aa4SPaul Cercueil const u32 *pull_ups, *pull_downs; 84b5c23aa4SPaul Cercueil }; 85b5c23aa4SPaul Cercueil 86b5c23aa4SPaul Cercueil struct ingenic_pinctrl { 87b5c23aa4SPaul Cercueil struct device *dev; 88b5c23aa4SPaul Cercueil struct regmap *map; 89b5c23aa4SPaul Cercueil struct pinctrl_dev *pctl; 90b5c23aa4SPaul Cercueil struct pinctrl_pin_desc *pdesc; 91b5c23aa4SPaul Cercueil 92b5c23aa4SPaul Cercueil const struct ingenic_chip_info *info; 93b5c23aa4SPaul Cercueil }; 94b5c23aa4SPaul Cercueil 95e72394e2SPaul Cercueil struct ingenic_gpio_chip { 96e72394e2SPaul Cercueil struct ingenic_pinctrl *jzpc; 97e72394e2SPaul Cercueil struct gpio_chip gc; 98e72394e2SPaul Cercueil struct irq_chip irq_chip; 99e72394e2SPaul Cercueil unsigned int irq, reg_base; 100e72394e2SPaul Cercueil }; 101e72394e2SPaul Cercueil 102b5c23aa4SPaul Cercueil static const u32 jz4740_pull_ups[4] = { 103b5c23aa4SPaul Cercueil 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 104b5c23aa4SPaul Cercueil }; 105b5c23aa4SPaul Cercueil 106b5c23aa4SPaul Cercueil static const u32 jz4740_pull_downs[4] = { 107b5c23aa4SPaul Cercueil 0x00000000, 0x00000000, 0x00000000, 0x00000000, 108b5c23aa4SPaul Cercueil }; 109b5c23aa4SPaul Cercueil 110b5c23aa4SPaul Cercueil static int jz4740_mmc_1bit_pins[] = { 0x69, 0x68, 0x6a, }; 111b5c23aa4SPaul Cercueil static int jz4740_mmc_4bit_pins[] = { 0x6b, 0x6c, 0x6d, }; 112b5c23aa4SPaul Cercueil static int jz4740_uart0_data_pins[] = { 0x7a, 0x79, }; 113b5c23aa4SPaul Cercueil static int jz4740_uart0_hwflow_pins[] = { 0x7e, 0x7f, }; 114b5c23aa4SPaul Cercueil static int jz4740_uart1_data_pins[] = { 0x7e, 0x7f, }; 115b5c23aa4SPaul Cercueil static int jz4740_lcd_8bit_pins[] = { 116b5c23aa4SPaul Cercueil 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x52, 0x53, 0x54, 117b5c23aa4SPaul Cercueil }; 118b5c23aa4SPaul Cercueil static int jz4740_lcd_16bit_pins[] = { 119b5c23aa4SPaul Cercueil 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x55, 120b5c23aa4SPaul Cercueil }; 121b5c23aa4SPaul Cercueil static int jz4740_lcd_18bit_pins[] = { 0x50, 0x51, }; 122b5c23aa4SPaul Cercueil static int jz4740_lcd_18bit_tft_pins[] = { 0x56, 0x57, 0x31, 0x32, }; 123b5c23aa4SPaul Cercueil static int jz4740_nand_cs1_pins[] = { 0x39, }; 124b5c23aa4SPaul Cercueil static int jz4740_nand_cs2_pins[] = { 0x3a, }; 125b5c23aa4SPaul Cercueil static int jz4740_nand_cs3_pins[] = { 0x3b, }; 126b5c23aa4SPaul Cercueil static int jz4740_nand_cs4_pins[] = { 0x3c, }; 127bcad94d7SPaul Cercueil static int jz4740_nand_fre_fwe_pins[] = { 0x5c, 0x5d, }; 128b5c23aa4SPaul Cercueil static int jz4740_pwm_pwm0_pins[] = { 0x77, }; 129b5c23aa4SPaul Cercueil static int jz4740_pwm_pwm1_pins[] = { 0x78, }; 130b5c23aa4SPaul Cercueil static int jz4740_pwm_pwm2_pins[] = { 0x79, }; 131b5c23aa4SPaul Cercueil static int jz4740_pwm_pwm3_pins[] = { 0x7a, }; 132b5c23aa4SPaul Cercueil static int jz4740_pwm_pwm4_pins[] = { 0x7b, }; 133b5c23aa4SPaul Cercueil static int jz4740_pwm_pwm5_pins[] = { 0x7c, }; 134b5c23aa4SPaul Cercueil static int jz4740_pwm_pwm6_pins[] = { 0x7e, }; 135b5c23aa4SPaul Cercueil static int jz4740_pwm_pwm7_pins[] = { 0x7f, }; 136b5c23aa4SPaul Cercueil 137b5c23aa4SPaul Cercueil static int jz4740_mmc_1bit_funcs[] = { 0, 0, 0, }; 138b5c23aa4SPaul Cercueil static int jz4740_mmc_4bit_funcs[] = { 0, 0, 0, }; 139b5c23aa4SPaul Cercueil static int jz4740_uart0_data_funcs[] = { 1, 1, }; 140b5c23aa4SPaul Cercueil static int jz4740_uart0_hwflow_funcs[] = { 1, 1, }; 141b5c23aa4SPaul Cercueil static int jz4740_uart1_data_funcs[] = { 2, 2, }; 142b5c23aa4SPaul Cercueil static int jz4740_lcd_8bit_funcs[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; 143b5c23aa4SPaul Cercueil static int jz4740_lcd_16bit_funcs[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, }; 144b5c23aa4SPaul Cercueil static int jz4740_lcd_18bit_funcs[] = { 0, 0, }; 145b5c23aa4SPaul Cercueil static int jz4740_lcd_18bit_tft_funcs[] = { 0, 0, 0, 0, }; 146b5c23aa4SPaul Cercueil static int jz4740_nand_cs1_funcs[] = { 0, }; 147b5c23aa4SPaul Cercueil static int jz4740_nand_cs2_funcs[] = { 0, }; 148b5c23aa4SPaul Cercueil static int jz4740_nand_cs3_funcs[] = { 0, }; 149b5c23aa4SPaul Cercueil static int jz4740_nand_cs4_funcs[] = { 0, }; 150bcad94d7SPaul Cercueil static int jz4740_nand_fre_fwe_funcs[] = { 0, 0, }; 151b5c23aa4SPaul Cercueil static int jz4740_pwm_pwm0_funcs[] = { 0, }; 152b5c23aa4SPaul Cercueil static int jz4740_pwm_pwm1_funcs[] = { 0, }; 153b5c23aa4SPaul Cercueil static int jz4740_pwm_pwm2_funcs[] = { 0, }; 154b5c23aa4SPaul Cercueil static int jz4740_pwm_pwm3_funcs[] = { 0, }; 155b5c23aa4SPaul Cercueil static int jz4740_pwm_pwm4_funcs[] = { 0, }; 156b5c23aa4SPaul Cercueil static int jz4740_pwm_pwm5_funcs[] = { 0, }; 157b5c23aa4SPaul Cercueil static int jz4740_pwm_pwm6_funcs[] = { 0, }; 158b5c23aa4SPaul Cercueil static int jz4740_pwm_pwm7_funcs[] = { 0, }; 159b5c23aa4SPaul Cercueil 160b5c23aa4SPaul Cercueil #define INGENIC_PIN_GROUP(name, id) \ 161b5c23aa4SPaul Cercueil { \ 162b5c23aa4SPaul Cercueil name, \ 163b5c23aa4SPaul Cercueil id##_pins, \ 164b5c23aa4SPaul Cercueil ARRAY_SIZE(id##_pins), \ 165b5c23aa4SPaul Cercueil id##_funcs, \ 166b5c23aa4SPaul Cercueil } 167b5c23aa4SPaul Cercueil 168b5c23aa4SPaul Cercueil static const struct group_desc jz4740_groups[] = { 169b5c23aa4SPaul Cercueil INGENIC_PIN_GROUP("mmc-1bit", jz4740_mmc_1bit), 170b5c23aa4SPaul Cercueil INGENIC_PIN_GROUP("mmc-4bit", jz4740_mmc_4bit), 171b5c23aa4SPaul Cercueil INGENIC_PIN_GROUP("uart0-data", jz4740_uart0_data), 172b5c23aa4SPaul Cercueil INGENIC_PIN_GROUP("uart0-hwflow", jz4740_uart0_hwflow), 173b5c23aa4SPaul Cercueil INGENIC_PIN_GROUP("uart1-data", jz4740_uart1_data), 174b5c23aa4SPaul Cercueil INGENIC_PIN_GROUP("lcd-8bit", jz4740_lcd_8bit), 175b5c23aa4SPaul Cercueil INGENIC_PIN_GROUP("lcd-16bit", jz4740_lcd_16bit), 176b5c23aa4SPaul Cercueil INGENIC_PIN_GROUP("lcd-18bit", jz4740_lcd_18bit), 177b5c23aa4SPaul Cercueil INGENIC_PIN_GROUP("lcd-18bit-tft", jz4740_lcd_18bit_tft), 178b5c23aa4SPaul Cercueil { "lcd-no-pins", }, 179b5c23aa4SPaul Cercueil INGENIC_PIN_GROUP("nand-cs1", jz4740_nand_cs1), 180b5c23aa4SPaul Cercueil INGENIC_PIN_GROUP("nand-cs2", jz4740_nand_cs2), 181b5c23aa4SPaul Cercueil INGENIC_PIN_GROUP("nand-cs3", jz4740_nand_cs3), 182b5c23aa4SPaul Cercueil INGENIC_PIN_GROUP("nand-cs4", jz4740_nand_cs4), 183bcad94d7SPaul Cercueil INGENIC_PIN_GROUP("nand-fre-fwe", jz4740_nand_fre_fwe), 184b5c23aa4SPaul Cercueil INGENIC_PIN_GROUP("pwm0", jz4740_pwm_pwm0), 185b5c23aa4SPaul Cercueil INGENIC_PIN_GROUP("pwm1", jz4740_pwm_pwm1), 186b5c23aa4SPaul Cercueil INGENIC_PIN_GROUP("pwm2", jz4740_pwm_pwm2), 187b5c23aa4SPaul Cercueil INGENIC_PIN_GROUP("pwm3", jz4740_pwm_pwm3), 188b5c23aa4SPaul Cercueil INGENIC_PIN_GROUP("pwm4", jz4740_pwm_pwm4), 189b5c23aa4SPaul Cercueil INGENIC_PIN_GROUP("pwm5", jz4740_pwm_pwm5), 190b5c23aa4SPaul Cercueil INGENIC_PIN_GROUP("pwm6", jz4740_pwm_pwm6), 191b5c23aa4SPaul Cercueil INGENIC_PIN_GROUP("pwm7", jz4740_pwm_pwm7), 192b5c23aa4SPaul Cercueil }; 193b5c23aa4SPaul Cercueil 194b5c23aa4SPaul Cercueil static const char *jz4740_mmc_groups[] = { "mmc-1bit", "mmc-4bit", }; 195b5c23aa4SPaul Cercueil static const char *jz4740_uart0_groups[] = { "uart0-data", "uart0-hwflow", }; 196b5c23aa4SPaul Cercueil static const char *jz4740_uart1_groups[] = { "uart1-data", }; 197b5c23aa4SPaul Cercueil static const char *jz4740_lcd_groups[] = { 198b5c23aa4SPaul Cercueil "lcd-8bit", "lcd-16bit", "lcd-18bit", "lcd-18bit-tft", "lcd-no-pins", 199b5c23aa4SPaul Cercueil }; 200b5c23aa4SPaul Cercueil static const char *jz4740_nand_groups[] = { 201bcad94d7SPaul Cercueil "nand-cs1", "nand-cs2", "nand-cs3", "nand-cs4", "nand-fre-fwe", 202b5c23aa4SPaul Cercueil }; 203b5c23aa4SPaul Cercueil static const char *jz4740_pwm0_groups[] = { "pwm0", }; 204b5c23aa4SPaul Cercueil static const char *jz4740_pwm1_groups[] = { "pwm1", }; 205b5c23aa4SPaul Cercueil static const char *jz4740_pwm2_groups[] = { "pwm2", }; 206b5c23aa4SPaul Cercueil static const char *jz4740_pwm3_groups[] = { "pwm3", }; 207b5c23aa4SPaul Cercueil static const char *jz4740_pwm4_groups[] = { "pwm4", }; 208b5c23aa4SPaul Cercueil static const char *jz4740_pwm5_groups[] = { "pwm5", }; 209b5c23aa4SPaul Cercueil static const char *jz4740_pwm6_groups[] = { "pwm6", }; 210b5c23aa4SPaul Cercueil static const char *jz4740_pwm7_groups[] = { "pwm7", }; 211b5c23aa4SPaul Cercueil 212b5c23aa4SPaul Cercueil static const struct function_desc jz4740_functions[] = { 213b5c23aa4SPaul Cercueil { "mmc", jz4740_mmc_groups, ARRAY_SIZE(jz4740_mmc_groups), }, 214b5c23aa4SPaul Cercueil { "uart0", jz4740_uart0_groups, ARRAY_SIZE(jz4740_uart0_groups), }, 215b5c23aa4SPaul Cercueil { "uart1", jz4740_uart1_groups, ARRAY_SIZE(jz4740_uart1_groups), }, 216b5c23aa4SPaul Cercueil { "lcd", jz4740_lcd_groups, ARRAY_SIZE(jz4740_lcd_groups), }, 217b5c23aa4SPaul Cercueil { "nand", jz4740_nand_groups, ARRAY_SIZE(jz4740_nand_groups), }, 218b5c23aa4SPaul Cercueil { "pwm0", jz4740_pwm0_groups, ARRAY_SIZE(jz4740_pwm0_groups), }, 219b5c23aa4SPaul Cercueil { "pwm1", jz4740_pwm1_groups, ARRAY_SIZE(jz4740_pwm1_groups), }, 220b5c23aa4SPaul Cercueil { "pwm2", jz4740_pwm2_groups, ARRAY_SIZE(jz4740_pwm2_groups), }, 221b5c23aa4SPaul Cercueil { "pwm3", jz4740_pwm3_groups, ARRAY_SIZE(jz4740_pwm3_groups), }, 222b5c23aa4SPaul Cercueil { "pwm4", jz4740_pwm4_groups, ARRAY_SIZE(jz4740_pwm4_groups), }, 223b5c23aa4SPaul Cercueil { "pwm5", jz4740_pwm5_groups, ARRAY_SIZE(jz4740_pwm5_groups), }, 224b5c23aa4SPaul Cercueil { "pwm6", jz4740_pwm6_groups, ARRAY_SIZE(jz4740_pwm6_groups), }, 225b5c23aa4SPaul Cercueil { "pwm7", jz4740_pwm7_groups, ARRAY_SIZE(jz4740_pwm7_groups), }, 226b5c23aa4SPaul Cercueil }; 227b5c23aa4SPaul Cercueil 228b5c23aa4SPaul Cercueil static const struct ingenic_chip_info jz4740_chip_info = { 229b5c23aa4SPaul Cercueil .num_chips = 4, 230f742e5ebS周琰杰 (Zhou Yanjie) .reg_offset = 0x100, 231baf15647SPaul Cercueil .version = ID_JZ4740, 232b5c23aa4SPaul Cercueil .groups = jz4740_groups, 233b5c23aa4SPaul Cercueil .num_groups = ARRAY_SIZE(jz4740_groups), 234b5c23aa4SPaul Cercueil .functions = jz4740_functions, 235b5c23aa4SPaul Cercueil .num_functions = ARRAY_SIZE(jz4740_functions), 236b5c23aa4SPaul Cercueil .pull_ups = jz4740_pull_ups, 237b5c23aa4SPaul Cercueil .pull_downs = jz4740_pull_downs, 238b5c23aa4SPaul Cercueil }; 239b5c23aa4SPaul Cercueil 240f2a96765SPaul Cercueil static int jz4725b_mmc0_1bit_pins[] = { 0x48, 0x49, 0x5c, }; 241f2a96765SPaul Cercueil static int jz4725b_mmc0_4bit_pins[] = { 0x5d, 0x5b, 0x56, }; 242f2a96765SPaul Cercueil static int jz4725b_mmc1_1bit_pins[] = { 0x7a, 0x7b, 0x7c, }; 243f2a96765SPaul Cercueil static int jz4725b_mmc1_4bit_pins[] = { 0x7d, 0x7e, 0x7f, }; 244f2a96765SPaul Cercueil static int jz4725b_uart_data_pins[] = { 0x4c, 0x4d, }; 245f2a96765SPaul Cercueil static int jz4725b_nand_cs1_pins[] = { 0x55, }; 246f2a96765SPaul Cercueil static int jz4725b_nand_cs2_pins[] = { 0x56, }; 247f2a96765SPaul Cercueil static int jz4725b_nand_cs3_pins[] = { 0x57, }; 248f2a96765SPaul Cercueil static int jz4725b_nand_cs4_pins[] = { 0x58, }; 249f2a96765SPaul Cercueil static int jz4725b_nand_cle_ale_pins[] = { 0x48, 0x49 }; 250f2a96765SPaul Cercueil static int jz4725b_nand_fre_fwe_pins[] = { 0x5c, 0x5d }; 251f2a96765SPaul Cercueil static int jz4725b_pwm_pwm0_pins[] = { 0x4a, }; 252f2a96765SPaul Cercueil static int jz4725b_pwm_pwm1_pins[] = { 0x4b, }; 253f2a96765SPaul Cercueil static int jz4725b_pwm_pwm2_pins[] = { 0x4c, }; 254f2a96765SPaul Cercueil static int jz4725b_pwm_pwm3_pins[] = { 0x4d, }; 255f2a96765SPaul Cercueil static int jz4725b_pwm_pwm4_pins[] = { 0x4e, }; 256f2a96765SPaul Cercueil static int jz4725b_pwm_pwm5_pins[] = { 0x4f, }; 257a3240f09SPaul Cercueil static int jz4725b_lcd_8bit_pins[] = { 258a3240f09SPaul Cercueil 0x72, 0x73, 0x74, 259a3240f09SPaul Cercueil 0x60, 0x61, 0x62, 0x63, 260a3240f09SPaul Cercueil 0x64, 0x65, 0x66, 0x67, 261a3240f09SPaul Cercueil }; 262a3240f09SPaul Cercueil static int jz4725b_lcd_16bit_pins[] = { 263a3240f09SPaul Cercueil 0x68, 0x69, 0x6a, 0x6b, 264a3240f09SPaul Cercueil 0x6c, 0x6d, 0x6e, 0x6f, 265a3240f09SPaul Cercueil }; 266a3240f09SPaul Cercueil static int jz4725b_lcd_18bit_pins[] = { 0x70, 0x71, }; 267a3240f09SPaul Cercueil static int jz4725b_lcd_24bit_pins[] = { 0x76, 0x77, 0x78, 0x79, }; 268a3240f09SPaul Cercueil static int jz4725b_lcd_special_pins[] = { 0x76, 0x77, 0x78, 0x79, }; 269a3240f09SPaul Cercueil static int jz4725b_lcd_generic_pins[] = { 0x75, }; 270f2a96765SPaul Cercueil 271f2a96765SPaul Cercueil static int jz4725b_mmc0_1bit_funcs[] = { 1, 1, 1, }; 272f2a96765SPaul Cercueil static int jz4725b_mmc0_4bit_funcs[] = { 1, 0, 1, }; 273f2a96765SPaul Cercueil static int jz4725b_mmc1_1bit_funcs[] = { 0, 0, 0, }; 274f2a96765SPaul Cercueil static int jz4725b_mmc1_4bit_funcs[] = { 0, 0, 0, }; 275f2a96765SPaul Cercueil static int jz4725b_uart_data_funcs[] = { 1, 1, }; 276f2a96765SPaul Cercueil static int jz4725b_nand_cs1_funcs[] = { 0, }; 277f2a96765SPaul Cercueil static int jz4725b_nand_cs2_funcs[] = { 0, }; 278f2a96765SPaul Cercueil static int jz4725b_nand_cs3_funcs[] = { 0, }; 279f2a96765SPaul Cercueil static int jz4725b_nand_cs4_funcs[] = { 0, }; 280f2a96765SPaul Cercueil static int jz4725b_nand_cle_ale_funcs[] = { 0, 0, }; 281f2a96765SPaul Cercueil static int jz4725b_nand_fre_fwe_funcs[] = { 0, 0, }; 282f2a96765SPaul Cercueil static int jz4725b_pwm_pwm0_funcs[] = { 0, }; 283f2a96765SPaul Cercueil static int jz4725b_pwm_pwm1_funcs[] = { 0, }; 284f2a96765SPaul Cercueil static int jz4725b_pwm_pwm2_funcs[] = { 0, }; 285f2a96765SPaul Cercueil static int jz4725b_pwm_pwm3_funcs[] = { 0, }; 286f2a96765SPaul Cercueil static int jz4725b_pwm_pwm4_funcs[] = { 0, }; 287f2a96765SPaul Cercueil static int jz4725b_pwm_pwm5_funcs[] = { 0, }; 288a3240f09SPaul Cercueil static int jz4725b_lcd_8bit_funcs[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; 289a3240f09SPaul Cercueil static int jz4725b_lcd_16bit_funcs[] = { 0, 0, 0, 0, 0, 0, 0, 0, }; 290a3240f09SPaul Cercueil static int jz4725b_lcd_18bit_funcs[] = { 0, 0, }; 291a3240f09SPaul Cercueil static int jz4725b_lcd_24bit_funcs[] = { 1, 1, 1, 1, }; 292a3240f09SPaul Cercueil static int jz4725b_lcd_special_funcs[] = { 0, 0, 0, 0, }; 293a3240f09SPaul Cercueil static int jz4725b_lcd_generic_funcs[] = { 0, }; 294f2a96765SPaul Cercueil 295f2a96765SPaul Cercueil static const struct group_desc jz4725b_groups[] = { 296f2a96765SPaul Cercueil INGENIC_PIN_GROUP("mmc0-1bit", jz4725b_mmc0_1bit), 297f2a96765SPaul Cercueil INGENIC_PIN_GROUP("mmc0-4bit", jz4725b_mmc0_4bit), 298f2a96765SPaul Cercueil INGENIC_PIN_GROUP("mmc1-1bit", jz4725b_mmc1_1bit), 299f2a96765SPaul Cercueil INGENIC_PIN_GROUP("mmc1-4bit", jz4725b_mmc1_4bit), 300f2a96765SPaul Cercueil INGENIC_PIN_GROUP("uart-data", jz4725b_uart_data), 301f2a96765SPaul Cercueil INGENIC_PIN_GROUP("nand-cs1", jz4725b_nand_cs1), 302f2a96765SPaul Cercueil INGENIC_PIN_GROUP("nand-cs2", jz4725b_nand_cs2), 303f2a96765SPaul Cercueil INGENIC_PIN_GROUP("nand-cs3", jz4725b_nand_cs3), 304f2a96765SPaul Cercueil INGENIC_PIN_GROUP("nand-cs4", jz4725b_nand_cs4), 305f2a96765SPaul Cercueil INGENIC_PIN_GROUP("nand-cle-ale", jz4725b_nand_cle_ale), 306f2a96765SPaul Cercueil INGENIC_PIN_GROUP("nand-fre-fwe", jz4725b_nand_fre_fwe), 307f2a96765SPaul Cercueil INGENIC_PIN_GROUP("pwm0", jz4725b_pwm_pwm0), 308f2a96765SPaul Cercueil INGENIC_PIN_GROUP("pwm1", jz4725b_pwm_pwm1), 309f2a96765SPaul Cercueil INGENIC_PIN_GROUP("pwm2", jz4725b_pwm_pwm2), 310f2a96765SPaul Cercueil INGENIC_PIN_GROUP("pwm3", jz4725b_pwm_pwm3), 311f2a96765SPaul Cercueil INGENIC_PIN_GROUP("pwm4", jz4725b_pwm_pwm4), 312f2a96765SPaul Cercueil INGENIC_PIN_GROUP("pwm5", jz4725b_pwm_pwm5), 313a3240f09SPaul Cercueil INGENIC_PIN_GROUP("lcd-8bit", jz4725b_lcd_8bit), 314a3240f09SPaul Cercueil INGENIC_PIN_GROUP("lcd-16bit", jz4725b_lcd_16bit), 315a3240f09SPaul Cercueil INGENIC_PIN_GROUP("lcd-18bit", jz4725b_lcd_18bit), 316a3240f09SPaul Cercueil INGENIC_PIN_GROUP("lcd-24bit", jz4725b_lcd_24bit), 317a3240f09SPaul Cercueil INGENIC_PIN_GROUP("lcd-special", jz4725b_lcd_special), 318a3240f09SPaul Cercueil INGENIC_PIN_GROUP("lcd-generic", jz4725b_lcd_generic), 319f2a96765SPaul Cercueil }; 320f2a96765SPaul Cercueil 321f2a96765SPaul Cercueil static const char *jz4725b_mmc0_groups[] = { "mmc0-1bit", "mmc0-4bit", }; 322f2a96765SPaul Cercueil static const char *jz4725b_mmc1_groups[] = { "mmc1-1bit", "mmc1-4bit", }; 323f2a96765SPaul Cercueil static const char *jz4725b_uart_groups[] = { "uart-data", }; 324f2a96765SPaul Cercueil static const char *jz4725b_nand_groups[] = { 325f2a96765SPaul Cercueil "nand-cs1", "nand-cs2", "nand-cs3", "nand-cs4", 326f2a96765SPaul Cercueil "nand-cle-ale", "nand-fre-fwe", 327f2a96765SPaul Cercueil }; 328f2a96765SPaul Cercueil static const char *jz4725b_pwm0_groups[] = { "pwm0", }; 329f2a96765SPaul Cercueil static const char *jz4725b_pwm1_groups[] = { "pwm1", }; 330f2a96765SPaul Cercueil static const char *jz4725b_pwm2_groups[] = { "pwm2", }; 331f2a96765SPaul Cercueil static const char *jz4725b_pwm3_groups[] = { "pwm3", }; 332f2a96765SPaul Cercueil static const char *jz4725b_pwm4_groups[] = { "pwm4", }; 333f2a96765SPaul Cercueil static const char *jz4725b_pwm5_groups[] = { "pwm5", }; 334a3240f09SPaul Cercueil static const char *jz4725b_lcd_groups[] = { 335a3240f09SPaul Cercueil "lcd-8bit", "lcd-16bit", "lcd-18bit", "lcd-24bit", 336a3240f09SPaul Cercueil "lcd-special", "lcd-generic", 337a3240f09SPaul Cercueil }; 338f2a96765SPaul Cercueil 339f2a96765SPaul Cercueil static const struct function_desc jz4725b_functions[] = { 340f2a96765SPaul Cercueil { "mmc0", jz4725b_mmc0_groups, ARRAY_SIZE(jz4725b_mmc0_groups), }, 341f2a96765SPaul Cercueil { "mmc1", jz4725b_mmc1_groups, ARRAY_SIZE(jz4725b_mmc1_groups), }, 342f2a96765SPaul Cercueil { "uart", jz4725b_uart_groups, ARRAY_SIZE(jz4725b_uart_groups), }, 343f2a96765SPaul Cercueil { "nand", jz4725b_nand_groups, ARRAY_SIZE(jz4725b_nand_groups), }, 344f2a96765SPaul Cercueil { "pwm0", jz4725b_pwm0_groups, ARRAY_SIZE(jz4725b_pwm0_groups), }, 345f2a96765SPaul Cercueil { "pwm1", jz4725b_pwm1_groups, ARRAY_SIZE(jz4725b_pwm1_groups), }, 346f2a96765SPaul Cercueil { "pwm2", jz4725b_pwm2_groups, ARRAY_SIZE(jz4725b_pwm2_groups), }, 347f2a96765SPaul Cercueil { "pwm3", jz4725b_pwm3_groups, ARRAY_SIZE(jz4725b_pwm3_groups), }, 348f2a96765SPaul Cercueil { "pwm4", jz4725b_pwm4_groups, ARRAY_SIZE(jz4725b_pwm4_groups), }, 349f2a96765SPaul Cercueil { "pwm5", jz4725b_pwm5_groups, ARRAY_SIZE(jz4725b_pwm5_groups), }, 350a3240f09SPaul Cercueil { "lcd", jz4725b_lcd_groups, ARRAY_SIZE(jz4725b_lcd_groups), }, 351f2a96765SPaul Cercueil }; 352f2a96765SPaul Cercueil 353f2a96765SPaul Cercueil static const struct ingenic_chip_info jz4725b_chip_info = { 354f2a96765SPaul Cercueil .num_chips = 4, 355f742e5ebS周琰杰 (Zhou Yanjie) .reg_offset = 0x100, 356baf15647SPaul Cercueil .version = ID_JZ4725B, 357f2a96765SPaul Cercueil .groups = jz4725b_groups, 358f2a96765SPaul Cercueil .num_groups = ARRAY_SIZE(jz4725b_groups), 359f2a96765SPaul Cercueil .functions = jz4725b_functions, 360f2a96765SPaul Cercueil .num_functions = ARRAY_SIZE(jz4725b_functions), 361f2a96765SPaul Cercueil .pull_ups = jz4740_pull_ups, 362f2a96765SPaul Cercueil .pull_downs = jz4740_pull_downs, 363f2a96765SPaul Cercueil }; 364f2a96765SPaul Cercueil 3650257595aSZhou Yanjie static const u32 jz4760_pull_ups[6] = { 3660257595aSZhou Yanjie 0xffffffff, 0xfffcf3ff, 0xffffffff, 0xffffcfff, 0xfffffb7c, 0xfffff00f, 3670257595aSZhou Yanjie }; 3680257595aSZhou Yanjie 3690257595aSZhou Yanjie static const u32 jz4760_pull_downs[6] = { 3700257595aSZhou Yanjie 0x00000000, 0x00030c00, 0x00000000, 0x00003000, 0x00000483, 0x00000ff0, 3710257595aSZhou Yanjie }; 3720257595aSZhou Yanjie 3730257595aSZhou Yanjie static int jz4760_uart0_data_pins[] = { 0xa0, 0xa3, }; 3740257595aSZhou Yanjie static int jz4760_uart0_hwflow_pins[] = { 0xa1, 0xa2, }; 3750257595aSZhou Yanjie static int jz4760_uart1_data_pins[] = { 0x7a, 0x7c, }; 3760257595aSZhou Yanjie static int jz4760_uart1_hwflow_pins[] = { 0x7b, 0x7d, }; 3770257595aSZhou Yanjie static int jz4760_uart2_data_pins[] = { 0x5c, 0x5e, }; 3780257595aSZhou Yanjie static int jz4760_uart2_hwflow_pins[] = { 0x5d, 0x5f, }; 3790257595aSZhou Yanjie static int jz4760_uart3_data_pins[] = { 0x6c, 0x85, }; 3800257595aSZhou Yanjie static int jz4760_uart3_hwflow_pins[] = { 0x88, 0x89, }; 3810257595aSZhou Yanjie static int jz4760_mmc0_1bit_a_pins[] = { 0x12, 0x13, 0x14, }; 3820257595aSZhou Yanjie static int jz4760_mmc0_4bit_a_pins[] = { 0x15, 0x16, 0x17, }; 3830257595aSZhou Yanjie static int jz4760_mmc0_1bit_e_pins[] = { 0x9c, 0x9d, 0x94, }; 3840257595aSZhou Yanjie static int jz4760_mmc0_4bit_e_pins[] = { 0x95, 0x96, 0x97, }; 3850257595aSZhou Yanjie static int jz4760_mmc0_8bit_e_pins[] = { 0x98, 0x99, 0x9a, 0x9b, }; 3860257595aSZhou Yanjie static int jz4760_mmc1_1bit_d_pins[] = { 0x78, 0x79, 0x74, }; 3870257595aSZhou Yanjie static int jz4760_mmc1_4bit_d_pins[] = { 0x75, 0x76, 0x77, }; 3880257595aSZhou Yanjie static int jz4760_mmc1_1bit_e_pins[] = { 0x9c, 0x9d, 0x94, }; 3890257595aSZhou Yanjie static int jz4760_mmc1_4bit_e_pins[] = { 0x95, 0x96, 0x97, }; 3900257595aSZhou Yanjie static int jz4760_mmc1_8bit_e_pins[] = { 0x98, 0x99, 0x9a, 0x9b, }; 3910257595aSZhou Yanjie static int jz4760_mmc2_1bit_b_pins[] = { 0x3c, 0x3d, 0x34, }; 3920257595aSZhou Yanjie static int jz4760_mmc2_4bit_b_pins[] = { 0x35, 0x3e, 0x3f, }; 3930257595aSZhou Yanjie static int jz4760_mmc2_1bit_e_pins[] = { 0x9c, 0x9d, 0x94, }; 3940257595aSZhou Yanjie static int jz4760_mmc2_4bit_e_pins[] = { 0x95, 0x96, 0x97, }; 3950257595aSZhou Yanjie static int jz4760_mmc2_8bit_e_pins[] = { 0x98, 0x99, 0x9a, 0x9b, }; 3960257595aSZhou Yanjie static int jz4760_nemc_8bit_data_pins[] = { 3970257595aSZhou Yanjie 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 3980257595aSZhou Yanjie }; 3990257595aSZhou Yanjie static int jz4760_nemc_16bit_data_pins[] = { 4000257595aSZhou Yanjie 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 4010257595aSZhou Yanjie }; 4020257595aSZhou Yanjie static int jz4760_nemc_cle_ale_pins[] = { 0x20, 0x21, }; 4030257595aSZhou Yanjie static int jz4760_nemc_addr_pins[] = { 0x22, 0x23, 0x24, 0x25, }; 4040257595aSZhou Yanjie static int jz4760_nemc_rd_we_pins[] = { 0x10, 0x11, }; 4050257595aSZhou Yanjie static int jz4760_nemc_frd_fwe_pins[] = { 0x12, 0x13, }; 4060257595aSZhou Yanjie static int jz4760_nemc_wait_pins[] = { 0x1b, }; 4070257595aSZhou Yanjie static int jz4760_nemc_cs1_pins[] = { 0x15, }; 4080257595aSZhou Yanjie static int jz4760_nemc_cs2_pins[] = { 0x16, }; 4090257595aSZhou Yanjie static int jz4760_nemc_cs3_pins[] = { 0x17, }; 4100257595aSZhou Yanjie static int jz4760_nemc_cs4_pins[] = { 0x18, }; 4110257595aSZhou Yanjie static int jz4760_nemc_cs5_pins[] = { 0x19, }; 4120257595aSZhou Yanjie static int jz4760_nemc_cs6_pins[] = { 0x1a, }; 4130257595aSZhou Yanjie static int jz4760_i2c0_pins[] = { 0x7e, 0x7f, }; 4140257595aSZhou Yanjie static int jz4760_i2c1_pins[] = { 0x9e, 0x9f, }; 4150257595aSZhou Yanjie static int jz4760_cim_pins[] = { 4160257595aSZhou Yanjie 0x26, 0x27, 0x28, 0x29, 4170257595aSZhou Yanjie 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 4180257595aSZhou Yanjie }; 4190257595aSZhou Yanjie static int jz4760_lcd_24bit_pins[] = { 4200257595aSZhou Yanjie 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 4210257595aSZhou Yanjie 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 4220257595aSZhou Yanjie 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 4230257595aSZhou Yanjie 0x58, 0x59, 0x5a, 0x5b, 4240257595aSZhou Yanjie }; 4250257595aSZhou Yanjie static int jz4760_pwm_pwm0_pins[] = { 0x80, }; 4260257595aSZhou Yanjie static int jz4760_pwm_pwm1_pins[] = { 0x81, }; 4270257595aSZhou Yanjie static int jz4760_pwm_pwm2_pins[] = { 0x82, }; 4280257595aSZhou Yanjie static int jz4760_pwm_pwm3_pins[] = { 0x83, }; 4290257595aSZhou Yanjie static int jz4760_pwm_pwm4_pins[] = { 0x84, }; 4300257595aSZhou Yanjie static int jz4760_pwm_pwm5_pins[] = { 0x85, }; 4310257595aSZhou Yanjie static int jz4760_pwm_pwm6_pins[] = { 0x6a, }; 4320257595aSZhou Yanjie static int jz4760_pwm_pwm7_pins[] = { 0x6b, }; 4330257595aSZhou Yanjie 4340257595aSZhou Yanjie static int jz4760_uart0_data_funcs[] = { 0, 0, }; 4350257595aSZhou Yanjie static int jz4760_uart0_hwflow_funcs[] = { 0, 0, }; 4360257595aSZhou Yanjie static int jz4760_uart1_data_funcs[] = { 0, 0, }; 4370257595aSZhou Yanjie static int jz4760_uart1_hwflow_funcs[] = { 0, 0, }; 4380257595aSZhou Yanjie static int jz4760_uart2_data_funcs[] = { 0, 0, }; 4390257595aSZhou Yanjie static int jz4760_uart2_hwflow_funcs[] = { 0, 0, }; 4400257595aSZhou Yanjie static int jz4760_uart3_data_funcs[] = { 0, 1, }; 4410257595aSZhou Yanjie static int jz4760_uart3_hwflow_funcs[] = { 0, 0, }; 4420257595aSZhou Yanjie static int jz4760_mmc0_1bit_a_funcs[] = { 1, 1, 0, }; 4430257595aSZhou Yanjie static int jz4760_mmc0_4bit_a_funcs[] = { 1, 1, 1, }; 4440257595aSZhou Yanjie static int jz4760_mmc0_1bit_e_funcs[] = { 0, 0, 0, }; 4450257595aSZhou Yanjie static int jz4760_mmc0_4bit_e_funcs[] = { 0, 0, 0, }; 4460257595aSZhou Yanjie static int jz4760_mmc0_8bit_e_funcs[] = { 0, 0, 0, 0, }; 4470257595aSZhou Yanjie static int jz4760_mmc1_1bit_d_funcs[] = { 0, 0, 0, }; 4480257595aSZhou Yanjie static int jz4760_mmc1_4bit_d_funcs[] = { 0, 0, 0, }; 4490257595aSZhou Yanjie static int jz4760_mmc1_1bit_e_funcs[] = { 1, 1, 1, }; 4500257595aSZhou Yanjie static int jz4760_mmc1_4bit_e_funcs[] = { 1, 1, 1, }; 4510257595aSZhou Yanjie static int jz4760_mmc1_8bit_e_funcs[] = { 1, 1, 1, 1, }; 4520257595aSZhou Yanjie static int jz4760_mmc2_1bit_b_funcs[] = { 0, 0, 0, }; 4530257595aSZhou Yanjie static int jz4760_mmc2_4bit_b_funcs[] = { 0, 0, 0, }; 4540257595aSZhou Yanjie static int jz4760_mmc2_1bit_e_funcs[] = { 2, 2, 2, }; 4550257595aSZhou Yanjie static int jz4760_mmc2_4bit_e_funcs[] = { 2, 2, 2, }; 4560257595aSZhou Yanjie static int jz4760_mmc2_8bit_e_funcs[] = { 2, 2, 2, 2, }; 4570257595aSZhou Yanjie static int jz4760_nemc_8bit_data_funcs[] = { 0, 0, 0, 0, 0, 0, 0, 0, }; 4580257595aSZhou Yanjie static int jz4760_nemc_16bit_data_funcs[] = { 0, 0, 0, 0, 0, 0, 0, 0, }; 4590257595aSZhou Yanjie static int jz4760_nemc_cle_ale_funcs[] = { 0, 0, }; 4600257595aSZhou Yanjie static int jz4760_nemc_addr_funcs[] = { 0, 0, 0, 0, }; 4610257595aSZhou Yanjie static int jz4760_nemc_rd_we_funcs[] = { 0, 0, }; 4620257595aSZhou Yanjie static int jz4760_nemc_frd_fwe_funcs[] = { 0, 0, }; 4630257595aSZhou Yanjie static int jz4760_nemc_wait_funcs[] = { 0, }; 4640257595aSZhou Yanjie static int jz4760_nemc_cs1_funcs[] = { 0, }; 4650257595aSZhou Yanjie static int jz4760_nemc_cs2_funcs[] = { 0, }; 4660257595aSZhou Yanjie static int jz4760_nemc_cs3_funcs[] = { 0, }; 4670257595aSZhou Yanjie static int jz4760_nemc_cs4_funcs[] = { 0, }; 4680257595aSZhou Yanjie static int jz4760_nemc_cs5_funcs[] = { 0, }; 4690257595aSZhou Yanjie static int jz4760_nemc_cs6_funcs[] = { 0, }; 4700257595aSZhou Yanjie static int jz4760_i2c0_funcs[] = { 0, 0, }; 4710257595aSZhou Yanjie static int jz4760_i2c1_funcs[] = { 0, 0, }; 4720257595aSZhou Yanjie static int jz4760_cim_funcs[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; 4730257595aSZhou Yanjie static int jz4760_lcd_24bit_funcs[] = { 4740257595aSZhou Yanjie 0, 0, 0, 0, 0, 0, 0, 0, 4750257595aSZhou Yanjie 0, 0, 0, 0, 0, 0, 0, 0, 4760257595aSZhou Yanjie 0, 0, 0, 0, 0, 0, 0, 0, 4770257595aSZhou Yanjie 0, 0, 0, 0, 4780257595aSZhou Yanjie }; 4790257595aSZhou Yanjie static int jz4760_pwm_pwm0_funcs[] = { 0, }; 4800257595aSZhou Yanjie static int jz4760_pwm_pwm1_funcs[] = { 0, }; 4810257595aSZhou Yanjie static int jz4760_pwm_pwm2_funcs[] = { 0, }; 4820257595aSZhou Yanjie static int jz4760_pwm_pwm3_funcs[] = { 0, }; 4830257595aSZhou Yanjie static int jz4760_pwm_pwm4_funcs[] = { 0, }; 4840257595aSZhou Yanjie static int jz4760_pwm_pwm5_funcs[] = { 0, }; 4850257595aSZhou Yanjie static int jz4760_pwm_pwm6_funcs[] = { 0, }; 4860257595aSZhou Yanjie static int jz4760_pwm_pwm7_funcs[] = { 0, }; 4870257595aSZhou Yanjie 4880257595aSZhou Yanjie static const struct group_desc jz4760_groups[] = { 4890257595aSZhou Yanjie INGENIC_PIN_GROUP("uart0-data", jz4760_uart0_data), 4900257595aSZhou Yanjie INGENIC_PIN_GROUP("uart0-hwflow", jz4760_uart0_hwflow), 4910257595aSZhou Yanjie INGENIC_PIN_GROUP("uart1-data", jz4760_uart1_data), 4920257595aSZhou Yanjie INGENIC_PIN_GROUP("uart1-hwflow", jz4760_uart1_hwflow), 4930257595aSZhou Yanjie INGENIC_PIN_GROUP("uart2-data", jz4760_uart2_data), 4940257595aSZhou Yanjie INGENIC_PIN_GROUP("uart2-hwflow", jz4760_uart2_hwflow), 4950257595aSZhou Yanjie INGENIC_PIN_GROUP("uart3-data", jz4760_uart3_data), 4960257595aSZhou Yanjie INGENIC_PIN_GROUP("uart3-hwflow", jz4760_uart3_hwflow), 4970257595aSZhou Yanjie INGENIC_PIN_GROUP("mmc0-1bit-a", jz4760_mmc0_1bit_a), 4980257595aSZhou Yanjie INGENIC_PIN_GROUP("mmc0-4bit-a", jz4760_mmc0_4bit_a), 4990257595aSZhou Yanjie INGENIC_PIN_GROUP("mmc0-1bit-e", jz4760_mmc0_1bit_e), 5000257595aSZhou Yanjie INGENIC_PIN_GROUP("mmc0-4bit-e", jz4760_mmc0_4bit_e), 5010257595aSZhou Yanjie INGENIC_PIN_GROUP("mmc0-8bit-e", jz4760_mmc0_8bit_e), 5020257595aSZhou Yanjie INGENIC_PIN_GROUP("mmc1-1bit-d", jz4760_mmc1_1bit_d), 5030257595aSZhou Yanjie INGENIC_PIN_GROUP("mmc1-4bit-d", jz4760_mmc1_4bit_d), 5040257595aSZhou Yanjie INGENIC_PIN_GROUP("mmc1-1bit-e", jz4760_mmc1_1bit_e), 5050257595aSZhou Yanjie INGENIC_PIN_GROUP("mmc1-4bit-e", jz4760_mmc1_4bit_e), 5060257595aSZhou Yanjie INGENIC_PIN_GROUP("mmc1-8bit-e", jz4760_mmc1_8bit_e), 5070257595aSZhou Yanjie INGENIC_PIN_GROUP("mmc2-1bit-b", jz4760_mmc2_1bit_b), 5080257595aSZhou Yanjie INGENIC_PIN_GROUP("mmc2-4bit-b", jz4760_mmc2_4bit_b), 5090257595aSZhou Yanjie INGENIC_PIN_GROUP("mmc2-1bit-e", jz4760_mmc2_1bit_e), 5100257595aSZhou Yanjie INGENIC_PIN_GROUP("mmc2-4bit-e", jz4760_mmc2_4bit_e), 5110257595aSZhou Yanjie INGENIC_PIN_GROUP("mmc2-8bit-e", jz4760_mmc2_8bit_e), 5120257595aSZhou Yanjie INGENIC_PIN_GROUP("nemc-8bit-data", jz4760_nemc_8bit_data), 5130257595aSZhou Yanjie INGENIC_PIN_GROUP("nemc-16bit-data", jz4760_nemc_16bit_data), 5140257595aSZhou Yanjie INGENIC_PIN_GROUP("nemc-cle-ale", jz4760_nemc_cle_ale), 5150257595aSZhou Yanjie INGENIC_PIN_GROUP("nemc-addr", jz4760_nemc_addr), 5160257595aSZhou Yanjie INGENIC_PIN_GROUP("nemc-rd-we", jz4760_nemc_rd_we), 5170257595aSZhou Yanjie INGENIC_PIN_GROUP("nemc-frd-fwe", jz4760_nemc_frd_fwe), 5180257595aSZhou Yanjie INGENIC_PIN_GROUP("nemc-wait", jz4760_nemc_wait), 5190257595aSZhou Yanjie INGENIC_PIN_GROUP("nemc-cs1", jz4760_nemc_cs1), 5200257595aSZhou Yanjie INGENIC_PIN_GROUP("nemc-cs2", jz4760_nemc_cs2), 5210257595aSZhou Yanjie INGENIC_PIN_GROUP("nemc-cs3", jz4760_nemc_cs3), 5220257595aSZhou Yanjie INGENIC_PIN_GROUP("nemc-cs4", jz4760_nemc_cs4), 5230257595aSZhou Yanjie INGENIC_PIN_GROUP("nemc-cs5", jz4760_nemc_cs5), 5240257595aSZhou Yanjie INGENIC_PIN_GROUP("nemc-cs6", jz4760_nemc_cs6), 5250257595aSZhou Yanjie INGENIC_PIN_GROUP("i2c0-data", jz4760_i2c0), 5260257595aSZhou Yanjie INGENIC_PIN_GROUP("i2c1-data", jz4760_i2c1), 5270257595aSZhou Yanjie INGENIC_PIN_GROUP("cim-data", jz4760_cim), 5280257595aSZhou Yanjie INGENIC_PIN_GROUP("lcd-24bit", jz4760_lcd_24bit), 5290257595aSZhou Yanjie { "lcd-no-pins", }, 5300257595aSZhou Yanjie INGENIC_PIN_GROUP("pwm0", jz4760_pwm_pwm0), 5310257595aSZhou Yanjie INGENIC_PIN_GROUP("pwm1", jz4760_pwm_pwm1), 5320257595aSZhou Yanjie INGENIC_PIN_GROUP("pwm2", jz4760_pwm_pwm2), 5330257595aSZhou Yanjie INGENIC_PIN_GROUP("pwm3", jz4760_pwm_pwm3), 5340257595aSZhou Yanjie INGENIC_PIN_GROUP("pwm4", jz4760_pwm_pwm4), 5350257595aSZhou Yanjie INGENIC_PIN_GROUP("pwm5", jz4760_pwm_pwm5), 5360257595aSZhou Yanjie INGENIC_PIN_GROUP("pwm6", jz4760_pwm_pwm6), 5370257595aSZhou Yanjie INGENIC_PIN_GROUP("pwm7", jz4760_pwm_pwm7), 5380257595aSZhou Yanjie }; 5390257595aSZhou Yanjie 5400257595aSZhou Yanjie static const char *jz4760_uart0_groups[] = { "uart0-data", "uart0-hwflow", }; 5410257595aSZhou Yanjie static const char *jz4760_uart1_groups[] = { "uart1-data", "uart1-hwflow", }; 5420257595aSZhou Yanjie static const char *jz4760_uart2_groups[] = { "uart2-data", "uart2-hwflow", }; 5430257595aSZhou Yanjie static const char *jz4760_uart3_groups[] = { "uart3-data", "uart3-hwflow", }; 5440257595aSZhou Yanjie static const char *jz4760_mmc0_groups[] = { 5450257595aSZhou Yanjie "mmc0-1bit-a", "mmc0-4bit-a", 5460257595aSZhou Yanjie "mmc0-1bit-e", "mmc0-4bit-e", "mmc0-8bit-e", 5470257595aSZhou Yanjie }; 5480257595aSZhou Yanjie static const char *jz4760_mmc1_groups[] = { 5490257595aSZhou Yanjie "mmc1-1bit-d", "mmc1-4bit-d", 5500257595aSZhou Yanjie "mmc1-1bit-e", "mmc1-4bit-e", "mmc1-8bit-e", 5510257595aSZhou Yanjie }; 5520257595aSZhou Yanjie static const char *jz4760_mmc2_groups[] = { 5530257595aSZhou Yanjie "mmc2-1bit-b", "mmc2-4bit-b", 5540257595aSZhou Yanjie "mmc2-1bit-e", "mmc2-4bit-e", "mmc2-8bit-e", 5550257595aSZhou Yanjie }; 5560257595aSZhou Yanjie static const char *jz4760_nemc_groups[] = { 5570257595aSZhou Yanjie "nemc-8bit-data", "nemc-16bit-data", "nemc-cle-ale", 5580257595aSZhou Yanjie "nemc-addr", "nemc-rd-we", "nemc-frd-fwe", "nemc-wait", 5590257595aSZhou Yanjie }; 5600257595aSZhou Yanjie static const char *jz4760_cs1_groups[] = { "nemc-cs1", }; 5610257595aSZhou Yanjie static const char *jz4760_cs2_groups[] = { "nemc-cs2", }; 5620257595aSZhou Yanjie static const char *jz4760_cs3_groups[] = { "nemc-cs3", }; 5630257595aSZhou Yanjie static const char *jz4760_cs4_groups[] = { "nemc-cs4", }; 5640257595aSZhou Yanjie static const char *jz4760_cs5_groups[] = { "nemc-cs5", }; 5650257595aSZhou Yanjie static const char *jz4760_cs6_groups[] = { "nemc-cs6", }; 5660257595aSZhou Yanjie static const char *jz4760_i2c0_groups[] = { "i2c0-data", }; 5670257595aSZhou Yanjie static const char *jz4760_i2c1_groups[] = { "i2c1-data", }; 5680257595aSZhou Yanjie static const char *jz4760_cim_groups[] = { "cim-data", }; 5690257595aSZhou Yanjie static const char *jz4760_lcd_groups[] = { "lcd-24bit", "lcd-no-pins", }; 5700257595aSZhou Yanjie static const char *jz4760_pwm0_groups[] = { "pwm0", }; 5710257595aSZhou Yanjie static const char *jz4760_pwm1_groups[] = { "pwm1", }; 5720257595aSZhou Yanjie static const char *jz4760_pwm2_groups[] = { "pwm2", }; 5730257595aSZhou Yanjie static const char *jz4760_pwm3_groups[] = { "pwm3", }; 5740257595aSZhou Yanjie static const char *jz4760_pwm4_groups[] = { "pwm4", }; 5750257595aSZhou Yanjie static const char *jz4760_pwm5_groups[] = { "pwm5", }; 5760257595aSZhou Yanjie static const char *jz4760_pwm6_groups[] = { "pwm6", }; 5770257595aSZhou Yanjie static const char *jz4760_pwm7_groups[] = { "pwm7", }; 5780257595aSZhou Yanjie 5790257595aSZhou Yanjie static const struct function_desc jz4760_functions[] = { 5800257595aSZhou Yanjie { "uart0", jz4760_uart0_groups, ARRAY_SIZE(jz4760_uart0_groups), }, 5810257595aSZhou Yanjie { "uart1", jz4760_uart1_groups, ARRAY_SIZE(jz4760_uart1_groups), }, 5820257595aSZhou Yanjie { "uart2", jz4760_uart2_groups, ARRAY_SIZE(jz4760_uart2_groups), }, 5830257595aSZhou Yanjie { "uart3", jz4760_uart3_groups, ARRAY_SIZE(jz4760_uart3_groups), }, 5840257595aSZhou Yanjie { "mmc0", jz4760_mmc0_groups, ARRAY_SIZE(jz4760_mmc0_groups), }, 5850257595aSZhou Yanjie { "mmc1", jz4760_mmc1_groups, ARRAY_SIZE(jz4760_mmc1_groups), }, 5860257595aSZhou Yanjie { "mmc2", jz4760_mmc2_groups, ARRAY_SIZE(jz4760_mmc2_groups), }, 5870257595aSZhou Yanjie { "nemc", jz4760_nemc_groups, ARRAY_SIZE(jz4760_nemc_groups), }, 5880257595aSZhou Yanjie { "nemc-cs1", jz4760_cs1_groups, ARRAY_SIZE(jz4760_cs1_groups), }, 5890257595aSZhou Yanjie { "nemc-cs2", jz4760_cs2_groups, ARRAY_SIZE(jz4760_cs2_groups), }, 5900257595aSZhou Yanjie { "nemc-cs3", jz4760_cs3_groups, ARRAY_SIZE(jz4760_cs3_groups), }, 5910257595aSZhou Yanjie { "nemc-cs4", jz4760_cs4_groups, ARRAY_SIZE(jz4760_cs4_groups), }, 5920257595aSZhou Yanjie { "nemc-cs5", jz4760_cs5_groups, ARRAY_SIZE(jz4760_cs5_groups), }, 5930257595aSZhou Yanjie { "nemc-cs6", jz4760_cs6_groups, ARRAY_SIZE(jz4760_cs6_groups), }, 5940257595aSZhou Yanjie { "i2c0", jz4760_i2c0_groups, ARRAY_SIZE(jz4760_i2c0_groups), }, 5950257595aSZhou Yanjie { "i2c1", jz4760_i2c1_groups, ARRAY_SIZE(jz4760_i2c1_groups), }, 5960257595aSZhou Yanjie { "cim", jz4760_cim_groups, ARRAY_SIZE(jz4760_cim_groups), }, 5970257595aSZhou Yanjie { "lcd", jz4760_lcd_groups, ARRAY_SIZE(jz4760_lcd_groups), }, 5980257595aSZhou Yanjie { "pwm0", jz4760_pwm0_groups, ARRAY_SIZE(jz4760_pwm0_groups), }, 5990257595aSZhou Yanjie { "pwm1", jz4760_pwm1_groups, ARRAY_SIZE(jz4760_pwm1_groups), }, 6000257595aSZhou Yanjie { "pwm2", jz4760_pwm2_groups, ARRAY_SIZE(jz4760_pwm2_groups), }, 6010257595aSZhou Yanjie { "pwm3", jz4760_pwm3_groups, ARRAY_SIZE(jz4760_pwm3_groups), }, 6020257595aSZhou Yanjie { "pwm4", jz4760_pwm4_groups, ARRAY_SIZE(jz4760_pwm4_groups), }, 6030257595aSZhou Yanjie { "pwm5", jz4760_pwm5_groups, ARRAY_SIZE(jz4760_pwm5_groups), }, 6040257595aSZhou Yanjie { "pwm6", jz4760_pwm6_groups, ARRAY_SIZE(jz4760_pwm6_groups), }, 6050257595aSZhou Yanjie { "pwm7", jz4760_pwm7_groups, ARRAY_SIZE(jz4760_pwm7_groups), }, 6060257595aSZhou Yanjie }; 6070257595aSZhou Yanjie 6080257595aSZhou Yanjie static const struct ingenic_chip_info jz4760_chip_info = { 6090257595aSZhou Yanjie .num_chips = 6, 610f742e5ebS周琰杰 (Zhou Yanjie) .reg_offset = 0x100, 611baf15647SPaul Cercueil .version = ID_JZ4760, 6120257595aSZhou Yanjie .groups = jz4760_groups, 6130257595aSZhou Yanjie .num_groups = ARRAY_SIZE(jz4760_groups), 6140257595aSZhou Yanjie .functions = jz4760_functions, 6150257595aSZhou Yanjie .num_functions = ARRAY_SIZE(jz4760_functions), 6160257595aSZhou Yanjie .pull_ups = jz4760_pull_ups, 6170257595aSZhou Yanjie .pull_downs = jz4760_pull_downs, 6180257595aSZhou Yanjie }; 6190257595aSZhou Yanjie 620b5c23aa4SPaul Cercueil static const u32 jz4770_pull_ups[6] = { 621b5c23aa4SPaul Cercueil 0x3fffffff, 0xfff0030c, 0xffffffff, 0xffff4fff, 0xfffffb7c, 0xffa7f00f, 622b5c23aa4SPaul Cercueil }; 623b5c23aa4SPaul Cercueil 624b5c23aa4SPaul Cercueil static const u32 jz4770_pull_downs[6] = { 625b5c23aa4SPaul Cercueil 0x00000000, 0x000f0c03, 0x00000000, 0x0000b000, 0x00000483, 0x00580ff0, 626b5c23aa4SPaul Cercueil }; 627b5c23aa4SPaul Cercueil 628b5c23aa4SPaul Cercueil static int jz4770_uart0_data_pins[] = { 0xa0, 0xa3, }; 629b5c23aa4SPaul Cercueil static int jz4770_uart0_hwflow_pins[] = { 0xa1, 0xa2, }; 630b5c23aa4SPaul Cercueil static int jz4770_uart1_data_pins[] = { 0x7a, 0x7c, }; 631b5c23aa4SPaul Cercueil static int jz4770_uart1_hwflow_pins[] = { 0x7b, 0x7d, }; 632ff656e47SZhou Yanjie static int jz4770_uart2_data_pins[] = { 0x5c, 0x5e, }; 633ff656e47SZhou Yanjie static int jz4770_uart2_hwflow_pins[] = { 0x5d, 0x5f, }; 634b5c23aa4SPaul Cercueil static int jz4770_uart3_data_pins[] = { 0x6c, 0x85, }; 635b5c23aa4SPaul Cercueil static int jz4770_uart3_hwflow_pins[] = { 0x88, 0x89, }; 636d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4770_ssi0_dt_a_pins[] = { 0x15, }; 637d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4770_ssi0_dt_b_pins[] = { 0x35, }; 638d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4770_ssi0_dt_d_pins[] = { 0x55, }; 639d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4770_ssi0_dt_e_pins[] = { 0x71, }; 640d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4770_ssi0_dr_a_pins[] = { 0x14, }; 641d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4770_ssi0_dr_b_pins[] = { 0x34, }; 642d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4770_ssi0_dr_d_pins[] = { 0x54, }; 643d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4770_ssi0_dr_e_pins[] = { 0x6e, }; 644d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4770_ssi0_clk_a_pins[] = { 0x12, }; 645d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4770_ssi0_clk_b_pins[] = { 0x3c, }; 646d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4770_ssi0_clk_d_pins[] = { 0x58, }; 647d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4770_ssi0_clk_e_pins[] = { 0x6f, }; 648d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4770_ssi0_gpc_b_pins[] = { 0x3e, }; 649d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4770_ssi0_gpc_d_pins[] = { 0x56, }; 650d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4770_ssi0_gpc_e_pins[] = { 0x73, }; 651d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4770_ssi0_ce0_a_pins[] = { 0x13, }; 652d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4770_ssi0_ce0_b_pins[] = { 0x3d, }; 653d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4770_ssi0_ce0_d_pins[] = { 0x59, }; 654d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4770_ssi0_ce0_e_pins[] = { 0x70, }; 655d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4770_ssi0_ce1_b_pins[] = { 0x3f, }; 656d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4770_ssi0_ce1_d_pins[] = { 0x57, }; 657d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4770_ssi0_ce1_e_pins[] = { 0x72, }; 658d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4770_ssi1_dt_b_pins[] = { 0x35, }; 659d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4770_ssi1_dt_d_pins[] = { 0x55, }; 660d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4770_ssi1_dt_e_pins[] = { 0x71, }; 661d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4770_ssi1_dr_b_pins[] = { 0x34, }; 662d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4770_ssi1_dr_d_pins[] = { 0x54, }; 663d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4770_ssi1_dr_e_pins[] = { 0x6e, }; 664d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4770_ssi1_clk_b_pins[] = { 0x3c, }; 665d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4770_ssi1_clk_d_pins[] = { 0x58, }; 666d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4770_ssi1_clk_e_pins[] = { 0x6f, }; 667d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4770_ssi1_gpc_b_pins[] = { 0x3e, }; 668d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4770_ssi1_gpc_d_pins[] = { 0x56, }; 669d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4770_ssi1_gpc_e_pins[] = { 0x73, }; 670d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4770_ssi1_ce0_b_pins[] = { 0x3d, }; 671d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4770_ssi1_ce0_d_pins[] = { 0x59, }; 672d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4770_ssi1_ce0_e_pins[] = { 0x70, }; 673d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4770_ssi1_ce1_b_pins[] = { 0x3f, }; 674d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4770_ssi1_ce1_d_pins[] = { 0x57, }; 675d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4770_ssi1_ce1_e_pins[] = { 0x72, }; 676b5c23aa4SPaul Cercueil static int jz4770_mmc0_1bit_a_pins[] = { 0x12, 0x13, 0x14, }; 677ff656e47SZhou Yanjie static int jz4770_mmc0_4bit_a_pins[] = { 0x15, 0x16, 0x17, }; 678b5c23aa4SPaul Cercueil static int jz4770_mmc0_1bit_e_pins[] = { 0x9c, 0x9d, 0x94, }; 679ff656e47SZhou Yanjie static int jz4770_mmc0_4bit_e_pins[] = { 0x95, 0x96, 0x97, }; 680ff656e47SZhou Yanjie static int jz4770_mmc0_8bit_e_pins[] = { 0x98, 0x99, 0x9a, 0x9b, }; 681b5c23aa4SPaul Cercueil static int jz4770_mmc1_1bit_d_pins[] = { 0x78, 0x79, 0x74, }; 682ff656e47SZhou Yanjie static int jz4770_mmc1_4bit_d_pins[] = { 0x75, 0x76, 0x77, }; 683b5c23aa4SPaul Cercueil static int jz4770_mmc1_1bit_e_pins[] = { 0x9c, 0x9d, 0x94, }; 684ff656e47SZhou Yanjie static int jz4770_mmc1_4bit_e_pins[] = { 0x95, 0x96, 0x97, }; 685ff656e47SZhou Yanjie static int jz4770_mmc1_8bit_e_pins[] = { 0x98, 0x99, 0x9a, 0x9b, }; 6865de1a73eSZhou Yanjie static int jz4770_mmc2_1bit_b_pins[] = { 0x3c, 0x3d, 0x34, }; 6875de1a73eSZhou Yanjie static int jz4770_mmc2_4bit_b_pins[] = { 0x35, 0x3e, 0x3f, }; 6885de1a73eSZhou Yanjie static int jz4770_mmc2_1bit_e_pins[] = { 0x9c, 0x9d, 0x94, }; 6895de1a73eSZhou Yanjie static int jz4770_mmc2_4bit_e_pins[] = { 0x95, 0x96, 0x97, }; 6905de1a73eSZhou Yanjie static int jz4770_mmc2_8bit_e_pins[] = { 0x98, 0x99, 0x9a, 0x9b, }; 691ff656e47SZhou Yanjie static int jz4770_nemc_8bit_data_pins[] = { 692b5c23aa4SPaul Cercueil 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 693b5c23aa4SPaul Cercueil }; 694ff656e47SZhou Yanjie static int jz4770_nemc_16bit_data_pins[] = { 695ff656e47SZhou Yanjie 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 696ff656e47SZhou Yanjie }; 697b5c23aa4SPaul Cercueil static int jz4770_nemc_cle_ale_pins[] = { 0x20, 0x21, }; 698b5c23aa4SPaul Cercueil static int jz4770_nemc_addr_pins[] = { 0x22, 0x23, 0x24, 0x25, }; 699b5c23aa4SPaul Cercueil static int jz4770_nemc_rd_we_pins[] = { 0x10, 0x11, }; 700b5c23aa4SPaul Cercueil static int jz4770_nemc_frd_fwe_pins[] = { 0x12, 0x13, }; 7015de1a73eSZhou Yanjie static int jz4770_nemc_wait_pins[] = { 0x1b, }; 702b5c23aa4SPaul Cercueil static int jz4770_nemc_cs1_pins[] = { 0x15, }; 703b5c23aa4SPaul Cercueil static int jz4770_nemc_cs2_pins[] = { 0x16, }; 704b5c23aa4SPaul Cercueil static int jz4770_nemc_cs3_pins[] = { 0x17, }; 705b5c23aa4SPaul Cercueil static int jz4770_nemc_cs4_pins[] = { 0x18, }; 706b5c23aa4SPaul Cercueil static int jz4770_nemc_cs5_pins[] = { 0x19, }; 707b5c23aa4SPaul Cercueil static int jz4770_nemc_cs6_pins[] = { 0x1a, }; 708ff656e47SZhou Yanjie static int jz4770_i2c0_pins[] = { 0x7e, 0x7f, }; 709ff656e47SZhou Yanjie static int jz4770_i2c1_pins[] = { 0x9e, 0x9f, }; 710b5c23aa4SPaul Cercueil static int jz4770_i2c2_pins[] = { 0xb0, 0xb1, }; 711ff656e47SZhou Yanjie static int jz4770_cim_8bit_pins[] = { 712ff656e47SZhou Yanjie 0x26, 0x27, 0x28, 0x29, 713ff656e47SZhou Yanjie 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 714b5c23aa4SPaul Cercueil }; 715ff656e47SZhou Yanjie static int jz4770_cim_12bit_pins[] = { 716ff656e47SZhou Yanjie 0x32, 0x33, 0xb0, 0xb1, 717ff656e47SZhou Yanjie }; 718ff656e47SZhou Yanjie static int jz4770_lcd_24bit_pins[] = { 719b5c23aa4SPaul Cercueil 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 720b5c23aa4SPaul Cercueil 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 721b5c23aa4SPaul Cercueil 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 722ff656e47SZhou Yanjie 0x58, 0x59, 0x5a, 0x5b, 723b5c23aa4SPaul Cercueil }; 724b5c23aa4SPaul Cercueil static int jz4770_pwm_pwm0_pins[] = { 0x80, }; 725b5c23aa4SPaul Cercueil static int jz4770_pwm_pwm1_pins[] = { 0x81, }; 726b5c23aa4SPaul Cercueil static int jz4770_pwm_pwm2_pins[] = { 0x82, }; 727b5c23aa4SPaul Cercueil static int jz4770_pwm_pwm3_pins[] = { 0x83, }; 728b5c23aa4SPaul Cercueil static int jz4770_pwm_pwm4_pins[] = { 0x84, }; 729b5c23aa4SPaul Cercueil static int jz4770_pwm_pwm5_pins[] = { 0x85, }; 730b5c23aa4SPaul Cercueil static int jz4770_pwm_pwm6_pins[] = { 0x6a, }; 731b5c23aa4SPaul Cercueil static int jz4770_pwm_pwm7_pins[] = { 0x6b, }; 7325de1a73eSZhou Yanjie static int jz4770_mac_rmii_pins[] = { 7335de1a73eSZhou Yanjie 0xa9, 0xab, 0xaa, 0xac, 0xa5, 0xa4, 0xad, 0xae, 0xa6, 0xa8, 7345de1a73eSZhou Yanjie }; 7355de1a73eSZhou Yanjie static int jz4770_mac_mii_pins[] = { 0xa7, 0xaf, }; 736ae75b53eSPaul Cercueil static int jz4770_otg_pins[] = { 0x8a, }; 737b5c23aa4SPaul Cercueil 738b5c23aa4SPaul Cercueil static int jz4770_uart0_data_funcs[] = { 0, 0, }; 739b5c23aa4SPaul Cercueil static int jz4770_uart0_hwflow_funcs[] = { 0, 0, }; 740b5c23aa4SPaul Cercueil static int jz4770_uart1_data_funcs[] = { 0, 0, }; 741b5c23aa4SPaul Cercueil static int jz4770_uart1_hwflow_funcs[] = { 0, 0, }; 742ff656e47SZhou Yanjie static int jz4770_uart2_data_funcs[] = { 0, 0, }; 743ff656e47SZhou Yanjie static int jz4770_uart2_hwflow_funcs[] = { 0, 0, }; 744b5c23aa4SPaul Cercueil static int jz4770_uart3_data_funcs[] = { 0, 1, }; 745b5c23aa4SPaul Cercueil static int jz4770_uart3_hwflow_funcs[] = { 0, 0, }; 746d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4770_ssi0_dt_a_funcs[] = { 2, }; 747d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4770_ssi0_dt_b_funcs[] = { 1, }; 748d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4770_ssi0_dt_d_funcs[] = { 1, }; 749d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4770_ssi0_dt_e_funcs[] = { 0, }; 750d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4770_ssi0_dr_a_funcs[] = { 1, }; 751d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4770_ssi0_dr_b_funcs[] = { 1, }; 752d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4770_ssi0_dr_d_funcs[] = { 1, }; 753d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4770_ssi0_dr_e_funcs[] = { 0, }; 754d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4770_ssi0_clk_a_funcs[] = { 2, }; 755d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4770_ssi0_clk_b_funcs[] = { 1, }; 756d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4770_ssi0_clk_d_funcs[] = { 1, }; 757d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4770_ssi0_clk_e_funcs[] = { 0, }; 758d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4770_ssi0_gpc_b_funcs[] = { 1, }; 759d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4770_ssi0_gpc_d_funcs[] = { 1, }; 760d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4770_ssi0_gpc_e_funcs[] = { 0, }; 761d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4770_ssi0_ce0_a_funcs[] = { 2, }; 762d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4770_ssi0_ce0_b_funcs[] = { 1, }; 763d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4770_ssi0_ce0_d_funcs[] = { 1, }; 764d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4770_ssi0_ce0_e_funcs[] = { 0, }; 765d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4770_ssi0_ce1_b_funcs[] = { 1, }; 766d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4770_ssi0_ce1_d_funcs[] = { 1, }; 767d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4770_ssi0_ce1_e_funcs[] = { 0, }; 768d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4770_ssi1_dt_b_funcs[] = { 2, }; 769d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4770_ssi1_dt_d_funcs[] = { 2, }; 770d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4770_ssi1_dt_e_funcs[] = { 1, }; 771d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4770_ssi1_dr_b_funcs[] = { 2, }; 772d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4770_ssi1_dr_d_funcs[] = { 2, }; 773d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4770_ssi1_dr_e_funcs[] = { 1, }; 774d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4770_ssi1_clk_b_funcs[] = { 2, }; 775d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4770_ssi1_clk_d_funcs[] = { 2, }; 776d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4770_ssi1_clk_e_funcs[] = { 1, }; 777d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4770_ssi1_gpc_b_funcs[] = { 2, }; 778d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4770_ssi1_gpc_d_funcs[] = { 2, }; 779d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4770_ssi1_gpc_e_funcs[] = { 1, }; 780d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4770_ssi1_ce0_b_funcs[] = { 2, }; 781d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4770_ssi1_ce0_d_funcs[] = { 2, }; 782d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4770_ssi1_ce0_e_funcs[] = { 1, }; 783d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4770_ssi1_ce1_b_funcs[] = { 2, }; 784d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4770_ssi1_ce1_d_funcs[] = { 2, }; 785d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4770_ssi1_ce1_e_funcs[] = { 1, }; 786b5c23aa4SPaul Cercueil static int jz4770_mmc0_1bit_a_funcs[] = { 1, 1, 0, }; 787ff656e47SZhou Yanjie static int jz4770_mmc0_4bit_a_funcs[] = { 1, 1, 1, }; 788b5c23aa4SPaul Cercueil static int jz4770_mmc0_1bit_e_funcs[] = { 0, 0, 0, }; 789ff656e47SZhou Yanjie static int jz4770_mmc0_4bit_e_funcs[] = { 0, 0, 0, }; 790ff656e47SZhou Yanjie static int jz4770_mmc0_8bit_e_funcs[] = { 0, 0, 0, 0, }; 791b5c23aa4SPaul Cercueil static int jz4770_mmc1_1bit_d_funcs[] = { 0, 0, 0, }; 792ff656e47SZhou Yanjie static int jz4770_mmc1_4bit_d_funcs[] = { 0, 0, 0, }; 793b5c23aa4SPaul Cercueil static int jz4770_mmc1_1bit_e_funcs[] = { 1, 1, 1, }; 794ff656e47SZhou Yanjie static int jz4770_mmc1_4bit_e_funcs[] = { 1, 1, 1, }; 795ff656e47SZhou Yanjie static int jz4770_mmc1_8bit_e_funcs[] = { 1, 1, 1, 1, }; 7965de1a73eSZhou Yanjie static int jz4770_mmc2_1bit_b_funcs[] = { 0, 0, 0, }; 7975de1a73eSZhou Yanjie static int jz4770_mmc2_4bit_b_funcs[] = { 0, 0, 0, }; 7985de1a73eSZhou Yanjie static int jz4770_mmc2_1bit_e_funcs[] = { 2, 2, 2, }; 7995de1a73eSZhou Yanjie static int jz4770_mmc2_4bit_e_funcs[] = { 2, 2, 2, }; 8005de1a73eSZhou Yanjie static int jz4770_mmc2_8bit_e_funcs[] = { 2, 2, 2, 2, }; 801ff656e47SZhou Yanjie static int jz4770_nemc_8bit_data_funcs[] = { 0, 0, 0, 0, 0, 0, 0, 0, }; 802ff656e47SZhou Yanjie static int jz4770_nemc_16bit_data_funcs[] = { 0, 0, 0, 0, 0, 0, 0, 0, }; 803b5c23aa4SPaul Cercueil static int jz4770_nemc_cle_ale_funcs[] = { 0, 0, }; 804b5c23aa4SPaul Cercueil static int jz4770_nemc_addr_funcs[] = { 0, 0, 0, 0, }; 805b5c23aa4SPaul Cercueil static int jz4770_nemc_rd_we_funcs[] = { 0, 0, }; 806b5c23aa4SPaul Cercueil static int jz4770_nemc_frd_fwe_funcs[] = { 0, 0, }; 8075de1a73eSZhou Yanjie static int jz4770_nemc_wait_funcs[] = { 0, }; 808b5c23aa4SPaul Cercueil static int jz4770_nemc_cs1_funcs[] = { 0, }; 809b5c23aa4SPaul Cercueil static int jz4770_nemc_cs2_funcs[] = { 0, }; 810b5c23aa4SPaul Cercueil static int jz4770_nemc_cs3_funcs[] = { 0, }; 811b5c23aa4SPaul Cercueil static int jz4770_nemc_cs4_funcs[] = { 0, }; 812b5c23aa4SPaul Cercueil static int jz4770_nemc_cs5_funcs[] = { 0, }; 813b5c23aa4SPaul Cercueil static int jz4770_nemc_cs6_funcs[] = { 0, }; 814b5c23aa4SPaul Cercueil static int jz4770_i2c0_funcs[] = { 0, 0, }; 815b5c23aa4SPaul Cercueil static int jz4770_i2c1_funcs[] = { 0, 0, }; 816b5c23aa4SPaul Cercueil static int jz4770_i2c2_funcs[] = { 2, 2, }; 817ff656e47SZhou Yanjie static int jz4770_cim_8bit_funcs[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; 818ff656e47SZhou Yanjie static int jz4770_cim_12bit_funcs[] = { 0, 0, 0, 0, }; 819ff656e47SZhou Yanjie static int jz4770_lcd_24bit_funcs[] = { 820b5c23aa4SPaul Cercueil 0, 0, 0, 0, 0, 0, 0, 0, 821b5c23aa4SPaul Cercueil 0, 0, 0, 0, 0, 0, 0, 0, 822ff656e47SZhou Yanjie 0, 0, 0, 0, 0, 0, 0, 0, 823ff656e47SZhou Yanjie 0, 0, 0, 0, 824b5c23aa4SPaul Cercueil }; 825b5c23aa4SPaul Cercueil static int jz4770_pwm_pwm0_funcs[] = { 0, }; 826b5c23aa4SPaul Cercueil static int jz4770_pwm_pwm1_funcs[] = { 0, }; 827b5c23aa4SPaul Cercueil static int jz4770_pwm_pwm2_funcs[] = { 0, }; 828b5c23aa4SPaul Cercueil static int jz4770_pwm_pwm3_funcs[] = { 0, }; 829b5c23aa4SPaul Cercueil static int jz4770_pwm_pwm4_funcs[] = { 0, }; 830b5c23aa4SPaul Cercueil static int jz4770_pwm_pwm5_funcs[] = { 0, }; 831b5c23aa4SPaul Cercueil static int jz4770_pwm_pwm6_funcs[] = { 0, }; 832b5c23aa4SPaul Cercueil static int jz4770_pwm_pwm7_funcs[] = { 0, }; 8335de1a73eSZhou Yanjie static int jz4770_mac_rmii_funcs[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; 8345de1a73eSZhou Yanjie static int jz4770_mac_mii_funcs[] = { 0, 0, }; 835ae75b53eSPaul Cercueil static int jz4770_otg_funcs[] = { 0, }; 836b5c23aa4SPaul Cercueil 837b5c23aa4SPaul Cercueil static const struct group_desc jz4770_groups[] = { 838b5c23aa4SPaul Cercueil INGENIC_PIN_GROUP("uart0-data", jz4770_uart0_data), 839b5c23aa4SPaul Cercueil INGENIC_PIN_GROUP("uart0-hwflow", jz4770_uart0_hwflow), 840b5c23aa4SPaul Cercueil INGENIC_PIN_GROUP("uart1-data", jz4770_uart1_data), 841b5c23aa4SPaul Cercueil INGENIC_PIN_GROUP("uart1-hwflow", jz4770_uart1_hwflow), 842b5c23aa4SPaul Cercueil INGENIC_PIN_GROUP("uart2-data", jz4770_uart2_data), 843b5c23aa4SPaul Cercueil INGENIC_PIN_GROUP("uart2-hwflow", jz4770_uart2_hwflow), 844b5c23aa4SPaul Cercueil INGENIC_PIN_GROUP("uart3-data", jz4770_uart3_data), 845b5c23aa4SPaul Cercueil INGENIC_PIN_GROUP("uart3-hwflow", jz4770_uart3_hwflow), 846d3ef8c6bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi0-dt-a", jz4770_ssi0_dt_a), 847d3ef8c6bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi0-dt-b", jz4770_ssi0_dt_b), 848d3ef8c6bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi0-dt-d", jz4770_ssi0_dt_d), 849d3ef8c6bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi0-dt-e", jz4770_ssi0_dt_e), 850d3ef8c6bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi0-dr-a", jz4770_ssi0_dr_a), 851d3ef8c6bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi0-dr-b", jz4770_ssi0_dr_b), 852d3ef8c6bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi0-dr-d", jz4770_ssi0_dr_d), 853d3ef8c6bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi0-dr-e", jz4770_ssi0_dr_e), 854d3ef8c6bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi0-clk-a", jz4770_ssi0_clk_a), 855d3ef8c6bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi0-clk-b", jz4770_ssi0_clk_b), 856d3ef8c6bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi0-clk-d", jz4770_ssi0_clk_d), 857d3ef8c6bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi0-clk-e", jz4770_ssi0_clk_e), 858d3ef8c6bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi0-gpc-b", jz4770_ssi0_gpc_b), 859d3ef8c6bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi0-gpc-d", jz4770_ssi0_gpc_d), 860d3ef8c6bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi0-gpc-e", jz4770_ssi0_gpc_e), 861d3ef8c6bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi0-ce0-a", jz4770_ssi0_ce0_a), 862d3ef8c6bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi0-ce0-b", jz4770_ssi0_ce0_b), 863d3ef8c6bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi0-ce0-d", jz4770_ssi0_ce0_d), 864d3ef8c6bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi0-ce0-e", jz4770_ssi0_ce0_e), 865d3ef8c6bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi0-ce1-b", jz4770_ssi0_ce1_b), 866d3ef8c6bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi0-ce1-d", jz4770_ssi0_ce1_d), 867d3ef8c6bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi0-ce1-e", jz4770_ssi0_ce1_e), 868d3ef8c6bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi1-dt-b", jz4770_ssi1_dt_b), 869d3ef8c6bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi1-dt-d", jz4770_ssi1_dt_d), 870d3ef8c6bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi1-dt-e", jz4770_ssi1_dt_e), 871d3ef8c6bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi1-dr-b", jz4770_ssi1_dr_b), 872d3ef8c6bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi1-dr-d", jz4770_ssi1_dr_d), 873d3ef8c6bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi1-dr-e", jz4770_ssi1_dr_e), 874d3ef8c6bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi1-clk-b", jz4770_ssi1_clk_b), 875d3ef8c6bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi1-clk-d", jz4770_ssi1_clk_d), 876d3ef8c6bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi1-clk-e", jz4770_ssi1_clk_e), 877d3ef8c6bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi1-gpc-b", jz4770_ssi1_gpc_b), 878d3ef8c6bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi1-gpc-d", jz4770_ssi1_gpc_d), 879d3ef8c6bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi1-gpc-e", jz4770_ssi1_gpc_e), 880d3ef8c6bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi1-ce0-b", jz4770_ssi1_ce0_b), 881d3ef8c6bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi1-ce0-d", jz4770_ssi1_ce0_d), 882d3ef8c6bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi1-ce0-e", jz4770_ssi1_ce0_e), 883d3ef8c6bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi1-ce1-b", jz4770_ssi1_ce1_b), 884d3ef8c6bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi1-ce1-d", jz4770_ssi1_ce1_d), 885d3ef8c6bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi1-ce1-e", jz4770_ssi1_ce1_e), 886b5c23aa4SPaul Cercueil INGENIC_PIN_GROUP("mmc0-1bit-a", jz4770_mmc0_1bit_a), 887ff656e47SZhou Yanjie INGENIC_PIN_GROUP("mmc0-4bit-a", jz4770_mmc0_4bit_a), 888b5c23aa4SPaul Cercueil INGENIC_PIN_GROUP("mmc0-1bit-e", jz4770_mmc0_1bit_e), 889ff656e47SZhou Yanjie INGENIC_PIN_GROUP("mmc0-4bit-e", jz4770_mmc0_4bit_e), 890ff656e47SZhou Yanjie INGENIC_PIN_GROUP("mmc0-8bit-e", jz4770_mmc0_8bit_e), 891b5c23aa4SPaul Cercueil INGENIC_PIN_GROUP("mmc1-1bit-d", jz4770_mmc1_1bit_d), 892ff656e47SZhou Yanjie INGENIC_PIN_GROUP("mmc1-4bit-d", jz4770_mmc1_4bit_d), 893b5c23aa4SPaul Cercueil INGENIC_PIN_GROUP("mmc1-1bit-e", jz4770_mmc1_1bit_e), 894ff656e47SZhou Yanjie INGENIC_PIN_GROUP("mmc1-4bit-e", jz4770_mmc1_4bit_e), 895ff656e47SZhou Yanjie INGENIC_PIN_GROUP("mmc1-8bit-e", jz4770_mmc1_8bit_e), 8965de1a73eSZhou Yanjie INGENIC_PIN_GROUP("mmc2-1bit-b", jz4770_mmc2_1bit_b), 8975de1a73eSZhou Yanjie INGENIC_PIN_GROUP("mmc2-4bit-b", jz4770_mmc2_4bit_b), 8985de1a73eSZhou Yanjie INGENIC_PIN_GROUP("mmc2-1bit-e", jz4770_mmc2_1bit_e), 8995de1a73eSZhou Yanjie INGENIC_PIN_GROUP("mmc2-4bit-e", jz4770_mmc2_4bit_e), 9005de1a73eSZhou Yanjie INGENIC_PIN_GROUP("mmc2-8bit-e", jz4770_mmc2_8bit_e), 901ff656e47SZhou Yanjie INGENIC_PIN_GROUP("nemc-8bit-data", jz4770_nemc_8bit_data), 902ff656e47SZhou Yanjie INGENIC_PIN_GROUP("nemc-16bit-data", jz4770_nemc_16bit_data), 903b5c23aa4SPaul Cercueil INGENIC_PIN_GROUP("nemc-cle-ale", jz4770_nemc_cle_ale), 904b5c23aa4SPaul Cercueil INGENIC_PIN_GROUP("nemc-addr", jz4770_nemc_addr), 905b5c23aa4SPaul Cercueil INGENIC_PIN_GROUP("nemc-rd-we", jz4770_nemc_rd_we), 906b5c23aa4SPaul Cercueil INGENIC_PIN_GROUP("nemc-frd-fwe", jz4770_nemc_frd_fwe), 9075de1a73eSZhou Yanjie INGENIC_PIN_GROUP("nemc-wait", jz4770_nemc_wait), 908b5c23aa4SPaul Cercueil INGENIC_PIN_GROUP("nemc-cs1", jz4770_nemc_cs1), 909b5c23aa4SPaul Cercueil INGENIC_PIN_GROUP("nemc-cs2", jz4770_nemc_cs2), 910b5c23aa4SPaul Cercueil INGENIC_PIN_GROUP("nemc-cs3", jz4770_nemc_cs3), 911b5c23aa4SPaul Cercueil INGENIC_PIN_GROUP("nemc-cs4", jz4770_nemc_cs4), 912b5c23aa4SPaul Cercueil INGENIC_PIN_GROUP("nemc-cs5", jz4770_nemc_cs5), 913b5c23aa4SPaul Cercueil INGENIC_PIN_GROUP("nemc-cs6", jz4770_nemc_cs6), 914b5c23aa4SPaul Cercueil INGENIC_PIN_GROUP("i2c0-data", jz4770_i2c0), 915b5c23aa4SPaul Cercueil INGENIC_PIN_GROUP("i2c1-data", jz4770_i2c1), 916b5c23aa4SPaul Cercueil INGENIC_PIN_GROUP("i2c2-data", jz4770_i2c2), 917ff656e47SZhou Yanjie INGENIC_PIN_GROUP("cim-data-8bit", jz4770_cim_8bit), 918ff656e47SZhou Yanjie INGENIC_PIN_GROUP("cim-data-12bit", jz4770_cim_12bit), 919ff656e47SZhou Yanjie INGENIC_PIN_GROUP("lcd-24bit", jz4770_lcd_24bit), 920b5c23aa4SPaul Cercueil { "lcd-no-pins", }, 921b5c23aa4SPaul Cercueil INGENIC_PIN_GROUP("pwm0", jz4770_pwm_pwm0), 922b5c23aa4SPaul Cercueil INGENIC_PIN_GROUP("pwm1", jz4770_pwm_pwm1), 923b5c23aa4SPaul Cercueil INGENIC_PIN_GROUP("pwm2", jz4770_pwm_pwm2), 924b5c23aa4SPaul Cercueil INGENIC_PIN_GROUP("pwm3", jz4770_pwm_pwm3), 925b5c23aa4SPaul Cercueil INGENIC_PIN_GROUP("pwm4", jz4770_pwm_pwm4), 926b5c23aa4SPaul Cercueil INGENIC_PIN_GROUP("pwm5", jz4770_pwm_pwm5), 927b5c23aa4SPaul Cercueil INGENIC_PIN_GROUP("pwm6", jz4770_pwm_pwm6), 928b5c23aa4SPaul Cercueil INGENIC_PIN_GROUP("pwm7", jz4770_pwm_pwm7), 9295de1a73eSZhou Yanjie INGENIC_PIN_GROUP("mac-rmii", jz4770_mac_rmii), 9305de1a73eSZhou Yanjie INGENIC_PIN_GROUP("mac-mii", jz4770_mac_mii), 931ae75b53eSPaul Cercueil INGENIC_PIN_GROUP("otg-vbus", jz4770_otg), 932b5c23aa4SPaul Cercueil }; 933b5c23aa4SPaul Cercueil 934b5c23aa4SPaul Cercueil static const char *jz4770_uart0_groups[] = { "uart0-data", "uart0-hwflow", }; 935b5c23aa4SPaul Cercueil static const char *jz4770_uart1_groups[] = { "uart1-data", "uart1-hwflow", }; 936b5c23aa4SPaul Cercueil static const char *jz4770_uart2_groups[] = { "uart2-data", "uart2-hwflow", }; 937b5c23aa4SPaul Cercueil static const char *jz4770_uart3_groups[] = { "uart3-data", "uart3-hwflow", }; 938d3ef8c6bS周琰杰 (Zhou Yanjie) static const char *jz4770_ssi0_groups[] = { 939d3ef8c6bS周琰杰 (Zhou Yanjie) "ssi0-dt-a", "ssi0-dt-b", "ssi0-dt-d", "ssi0-dt-e", 940d3ef8c6bS周琰杰 (Zhou Yanjie) "ssi0-dr-a", "ssi0-dr-b", "ssi0-dr-d", "ssi0-dr-e", 941d3ef8c6bS周琰杰 (Zhou Yanjie) "ssi0-clk-a", "ssi0-clk-b", "ssi0-clk-d", "ssi0-clk-e", 942d3ef8c6bS周琰杰 (Zhou Yanjie) "ssi0-gpc-b", "ssi0-gpc-d", "ssi0-gpc-e", 943d3ef8c6bS周琰杰 (Zhou Yanjie) "ssi0-ce0-a", "ssi0-ce0-b", "ssi0-ce0-d", "ssi0-ce0-e", 944d3ef8c6bS周琰杰 (Zhou Yanjie) "ssi0-ce1-b", "ssi0-ce1-d", "ssi0-ce1-e", 945d3ef8c6bS周琰杰 (Zhou Yanjie) }; 946d3ef8c6bS周琰杰 (Zhou Yanjie) static const char *jz4770_ssi1_groups[] = { 947d3ef8c6bS周琰杰 (Zhou Yanjie) "ssi1-dt-b", "ssi1-dt-d", "ssi1-dt-e", 948d3ef8c6bS周琰杰 (Zhou Yanjie) "ssi1-dr-b", "ssi1-dr-d", "ssi1-dr-e", 949d3ef8c6bS周琰杰 (Zhou Yanjie) "ssi1-clk-b", "ssi1-clk-d", "ssi1-clk-e", 950d3ef8c6bS周琰杰 (Zhou Yanjie) "ssi1-gpc-b", "ssi1-gpc-d", "ssi1-gpc-e", 951d3ef8c6bS周琰杰 (Zhou Yanjie) "ssi1-ce0-b", "ssi1-ce0-d", "ssi1-ce0-e", 952d3ef8c6bS周琰杰 (Zhou Yanjie) "ssi1-ce1-b", "ssi1-ce1-d", "ssi1-ce1-e", 953d3ef8c6bS周琰杰 (Zhou Yanjie) }; 954b5c23aa4SPaul Cercueil static const char *jz4770_mmc0_groups[] = { 955ff656e47SZhou Yanjie "mmc0-1bit-a", "mmc0-4bit-a", 956ff656e47SZhou Yanjie "mmc0-1bit-e", "mmc0-4bit-e", "mmc0-8bit-e", 957b5c23aa4SPaul Cercueil }; 958b5c23aa4SPaul Cercueil static const char *jz4770_mmc1_groups[] = { 959ff656e47SZhou Yanjie "mmc1-1bit-d", "mmc1-4bit-d", 960ff656e47SZhou Yanjie "mmc1-1bit-e", "mmc1-4bit-e", "mmc1-8bit-e", 961b5c23aa4SPaul Cercueil }; 9625de1a73eSZhou Yanjie static const char *jz4770_mmc2_groups[] = { 9635de1a73eSZhou Yanjie "mmc2-1bit-b", "mmc2-4bit-b", 9645de1a73eSZhou Yanjie "mmc2-1bit-e", "mmc2-4bit-e", "mmc2-8bit-e", 9655de1a73eSZhou Yanjie }; 966b5c23aa4SPaul Cercueil static const char *jz4770_nemc_groups[] = { 967ff656e47SZhou Yanjie "nemc-8bit-data", "nemc-16bit-data", "nemc-cle-ale", 9685de1a73eSZhou Yanjie "nemc-addr", "nemc-rd-we", "nemc-frd-fwe", "nemc-wait", 969b5c23aa4SPaul Cercueil }; 970b5c23aa4SPaul Cercueil static const char *jz4770_cs1_groups[] = { "nemc-cs1", }; 971ff656e47SZhou Yanjie static const char *jz4770_cs2_groups[] = { "nemc-cs2", }; 972ff656e47SZhou Yanjie static const char *jz4770_cs3_groups[] = { "nemc-cs3", }; 973ff656e47SZhou Yanjie static const char *jz4770_cs4_groups[] = { "nemc-cs4", }; 974ff656e47SZhou Yanjie static const char *jz4770_cs5_groups[] = { "nemc-cs5", }; 975b5c23aa4SPaul Cercueil static const char *jz4770_cs6_groups[] = { "nemc-cs6", }; 976b5c23aa4SPaul Cercueil static const char *jz4770_i2c0_groups[] = { "i2c0-data", }; 977b5c23aa4SPaul Cercueil static const char *jz4770_i2c1_groups[] = { "i2c1-data", }; 978b5c23aa4SPaul Cercueil static const char *jz4770_i2c2_groups[] = { "i2c2-data", }; 979ff656e47SZhou Yanjie static const char *jz4770_cim_groups[] = { "cim-data-8bit", "cim-data-12bit", }; 980ff656e47SZhou Yanjie static const char *jz4770_lcd_groups[] = { "lcd-24bit", "lcd-no-pins", }; 981b5c23aa4SPaul Cercueil static const char *jz4770_pwm0_groups[] = { "pwm0", }; 982b5c23aa4SPaul Cercueil static const char *jz4770_pwm1_groups[] = { "pwm1", }; 983b5c23aa4SPaul Cercueil static const char *jz4770_pwm2_groups[] = { "pwm2", }; 984b5c23aa4SPaul Cercueil static const char *jz4770_pwm3_groups[] = { "pwm3", }; 985b5c23aa4SPaul Cercueil static const char *jz4770_pwm4_groups[] = { "pwm4", }; 986b5c23aa4SPaul Cercueil static const char *jz4770_pwm5_groups[] = { "pwm5", }; 987b5c23aa4SPaul Cercueil static const char *jz4770_pwm6_groups[] = { "pwm6", }; 988b5c23aa4SPaul Cercueil static const char *jz4770_pwm7_groups[] = { "pwm7", }; 9895de1a73eSZhou Yanjie static const char *jz4770_mac_groups[] = { "mac-rmii", "mac-mii", }; 990ae75b53eSPaul Cercueil static const char *jz4770_otg_groups[] = { "otg-vbus", }; 991b5c23aa4SPaul Cercueil 992b5c23aa4SPaul Cercueil static const struct function_desc jz4770_functions[] = { 993b5c23aa4SPaul Cercueil { "uart0", jz4770_uart0_groups, ARRAY_SIZE(jz4770_uart0_groups), }, 994b5c23aa4SPaul Cercueil { "uart1", jz4770_uart1_groups, ARRAY_SIZE(jz4770_uart1_groups), }, 995b5c23aa4SPaul Cercueil { "uart2", jz4770_uart2_groups, ARRAY_SIZE(jz4770_uart2_groups), }, 996b5c23aa4SPaul Cercueil { "uart3", jz4770_uart3_groups, ARRAY_SIZE(jz4770_uart3_groups), }, 997d3ef8c6bS周琰杰 (Zhou Yanjie) { "ssi0", jz4770_ssi0_groups, ARRAY_SIZE(jz4770_ssi0_groups), }, 998d3ef8c6bS周琰杰 (Zhou Yanjie) { "ssi1", jz4770_ssi1_groups, ARRAY_SIZE(jz4770_ssi1_groups), }, 999b5c23aa4SPaul Cercueil { "mmc0", jz4770_mmc0_groups, ARRAY_SIZE(jz4770_mmc0_groups), }, 1000b5c23aa4SPaul Cercueil { "mmc1", jz4770_mmc1_groups, ARRAY_SIZE(jz4770_mmc1_groups), }, 10015de1a73eSZhou Yanjie { "mmc2", jz4770_mmc2_groups, ARRAY_SIZE(jz4770_mmc2_groups), }, 1002b5c23aa4SPaul Cercueil { "nemc", jz4770_nemc_groups, ARRAY_SIZE(jz4770_nemc_groups), }, 1003b5c23aa4SPaul Cercueil { "nemc-cs1", jz4770_cs1_groups, ARRAY_SIZE(jz4770_cs1_groups), }, 1004ff656e47SZhou Yanjie { "nemc-cs2", jz4770_cs2_groups, ARRAY_SIZE(jz4770_cs2_groups), }, 1005ff656e47SZhou Yanjie { "nemc-cs3", jz4770_cs3_groups, ARRAY_SIZE(jz4770_cs3_groups), }, 1006ff656e47SZhou Yanjie { "nemc-cs4", jz4770_cs4_groups, ARRAY_SIZE(jz4770_cs4_groups), }, 1007ff656e47SZhou Yanjie { "nemc-cs5", jz4770_cs5_groups, ARRAY_SIZE(jz4770_cs5_groups), }, 1008b5c23aa4SPaul Cercueil { "nemc-cs6", jz4770_cs6_groups, ARRAY_SIZE(jz4770_cs6_groups), }, 1009b5c23aa4SPaul Cercueil { "i2c0", jz4770_i2c0_groups, ARRAY_SIZE(jz4770_i2c0_groups), }, 1010b5c23aa4SPaul Cercueil { "i2c1", jz4770_i2c1_groups, ARRAY_SIZE(jz4770_i2c1_groups), }, 1011b5c23aa4SPaul Cercueil { "i2c2", jz4770_i2c2_groups, ARRAY_SIZE(jz4770_i2c2_groups), }, 1012b5c23aa4SPaul Cercueil { "cim", jz4770_cim_groups, ARRAY_SIZE(jz4770_cim_groups), }, 1013b5c23aa4SPaul Cercueil { "lcd", jz4770_lcd_groups, ARRAY_SIZE(jz4770_lcd_groups), }, 1014b5c23aa4SPaul Cercueil { "pwm0", jz4770_pwm0_groups, ARRAY_SIZE(jz4770_pwm0_groups), }, 1015b5c23aa4SPaul Cercueil { "pwm1", jz4770_pwm1_groups, ARRAY_SIZE(jz4770_pwm1_groups), }, 1016b5c23aa4SPaul Cercueil { "pwm2", jz4770_pwm2_groups, ARRAY_SIZE(jz4770_pwm2_groups), }, 1017b5c23aa4SPaul Cercueil { "pwm3", jz4770_pwm3_groups, ARRAY_SIZE(jz4770_pwm3_groups), }, 1018b5c23aa4SPaul Cercueil { "pwm4", jz4770_pwm4_groups, ARRAY_SIZE(jz4770_pwm4_groups), }, 1019b5c23aa4SPaul Cercueil { "pwm5", jz4770_pwm5_groups, ARRAY_SIZE(jz4770_pwm5_groups), }, 1020b5c23aa4SPaul Cercueil { "pwm6", jz4770_pwm6_groups, ARRAY_SIZE(jz4770_pwm6_groups), }, 1021b5c23aa4SPaul Cercueil { "pwm7", jz4770_pwm7_groups, ARRAY_SIZE(jz4770_pwm7_groups), }, 10225de1a73eSZhou Yanjie { "mac", jz4770_mac_groups, ARRAY_SIZE(jz4770_mac_groups), }, 1023ae75b53eSPaul Cercueil { "otg", jz4770_otg_groups, ARRAY_SIZE(jz4770_otg_groups), }, 1024b5c23aa4SPaul Cercueil }; 1025b5c23aa4SPaul Cercueil 1026b5c23aa4SPaul Cercueil static const struct ingenic_chip_info jz4770_chip_info = { 1027b5c23aa4SPaul Cercueil .num_chips = 6, 1028f742e5ebS周琰杰 (Zhou Yanjie) .reg_offset = 0x100, 1029baf15647SPaul Cercueil .version = ID_JZ4770, 1030b5c23aa4SPaul Cercueil .groups = jz4770_groups, 1031b5c23aa4SPaul Cercueil .num_groups = ARRAY_SIZE(jz4770_groups), 1032b5c23aa4SPaul Cercueil .functions = jz4770_functions, 1033b5c23aa4SPaul Cercueil .num_functions = ARRAY_SIZE(jz4770_functions), 1034b5c23aa4SPaul Cercueil .pull_ups = jz4770_pull_ups, 1035b5c23aa4SPaul Cercueil .pull_downs = jz4770_pull_downs, 1036b5c23aa4SPaul Cercueil }; 1037b5c23aa4SPaul Cercueil 1038ff656e47SZhou Yanjie static int jz4780_uart2_data_pins[] = { 0x66, 0x67, }; 1039ff656e47SZhou Yanjie static int jz4780_uart2_hwflow_pins[] = { 0x65, 0x64, }; 1040ff656e47SZhou Yanjie static int jz4780_uart4_data_pins[] = { 0x54, 0x4a, }; 1041d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4780_ssi0_dt_a_19_pins[] = { 0x13, }; 1042d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4780_ssi0_dt_a_21_pins[] = { 0x15, }; 1043d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4780_ssi0_dt_a_28_pins[] = { 0x1c, }; 1044d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4780_ssi0_dt_b_pins[] = { 0x3d, }; 1045d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4780_ssi0_dt_d_pins[] = { 0x59, }; 1046d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4780_ssi0_dr_a_20_pins[] = { 0x14, }; 1047d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4780_ssi0_dr_a_27_pins[] = { 0x1b, }; 1048d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4780_ssi0_dr_b_pins[] = { 0x34, }; 1049d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4780_ssi0_dr_d_pins[] = { 0x54, }; 1050d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4780_ssi0_clk_a_pins[] = { 0x12, }; 1051d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4780_ssi0_clk_b_5_pins[] = { 0x25, }; 1052d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4780_ssi0_clk_b_28_pins[] = { 0x3c, }; 1053d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4780_ssi0_clk_d_pins[] = { 0x58, }; 1054d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4780_ssi0_gpc_b_pins[] = { 0x3e, }; 1055d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4780_ssi0_gpc_d_pins[] = { 0x56, }; 1056d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4780_ssi0_ce0_a_23_pins[] = { 0x17, }; 1057d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4780_ssi0_ce0_a_25_pins[] = { 0x19, }; 1058d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4780_ssi0_ce0_b_pins[] = { 0x3f, }; 1059d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4780_ssi0_ce0_d_pins[] = { 0x57, }; 1060d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4780_ssi0_ce1_b_pins[] = { 0x35, }; 1061d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4780_ssi0_ce1_d_pins[] = { 0x55, }; 1062d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4780_ssi1_dt_b_pins[] = { 0x3d, }; 1063d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4780_ssi1_dt_d_pins[] = { 0x59, }; 1064d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4780_ssi1_dr_b_pins[] = { 0x34, }; 1065d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4780_ssi1_dr_d_pins[] = { 0x54, }; 1066d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4780_ssi1_clk_b_pins[] = { 0x3c, }; 1067d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4780_ssi1_clk_d_pins[] = { 0x58, }; 1068d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4780_ssi1_gpc_b_pins[] = { 0x3e, }; 1069d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4780_ssi1_gpc_d_pins[] = { 0x56, }; 1070d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4780_ssi1_ce0_b_pins[] = { 0x3f, }; 1071d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4780_ssi1_ce0_d_pins[] = { 0x57, }; 1072d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4780_ssi1_ce1_b_pins[] = { 0x35, }; 1073d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4780_ssi1_ce1_d_pins[] = { 0x55, }; 1074ff656e47SZhou Yanjie static int jz4780_mmc0_8bit_a_pins[] = { 0x04, 0x05, 0x06, 0x07, 0x18, }; 1075ff656e47SZhou Yanjie static int jz4780_i2c3_pins[] = { 0x6a, 0x6b, }; 1076ff656e47SZhou Yanjie static int jz4780_i2c4_e_pins[] = { 0x8c, 0x8d, }; 1077ff656e47SZhou Yanjie static int jz4780_i2c4_f_pins[] = { 0xb9, 0xb8, }; 1078a0bb89e8SPaul Boddie static int jz4780_hdmi_ddc_pins[] = { 0xb9, 0xb8, }; 1079ff656e47SZhou Yanjie 1080ff656e47SZhou Yanjie static int jz4780_uart2_data_funcs[] = { 1, 1, }; 1081ff656e47SZhou Yanjie static int jz4780_uart2_hwflow_funcs[] = { 1, 1, }; 1082ff656e47SZhou Yanjie static int jz4780_uart4_data_funcs[] = { 2, 2, }; 1083d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4780_ssi0_dt_a_19_funcs[] = { 2, }; 1084d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4780_ssi0_dt_a_21_funcs[] = { 2, }; 1085d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4780_ssi0_dt_a_28_funcs[] = { 2, }; 1086d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4780_ssi0_dt_b_funcs[] = { 1, }; 1087d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4780_ssi0_dt_d_funcs[] = { 1, }; 1088d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4780_ssi0_dr_a_20_funcs[] = { 2, }; 1089d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4780_ssi0_dr_a_27_funcs[] = { 2, }; 1090d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4780_ssi0_dr_b_funcs[] = { 1, }; 1091d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4780_ssi0_dr_d_funcs[] = { 1, }; 1092d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4780_ssi0_clk_a_funcs[] = { 2, }; 1093d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4780_ssi0_clk_b_5_funcs[] = { 1, }; 1094d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4780_ssi0_clk_b_28_funcs[] = { 1, }; 1095d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4780_ssi0_clk_d_funcs[] = { 1, }; 1096d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4780_ssi0_gpc_b_funcs[] = { 1, }; 1097d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4780_ssi0_gpc_d_funcs[] = { 1, }; 1098d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4780_ssi0_ce0_a_23_funcs[] = { 2, }; 1099d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4780_ssi0_ce0_a_25_funcs[] = { 2, }; 1100d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4780_ssi0_ce0_b_funcs[] = { 1, }; 1101d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4780_ssi0_ce0_d_funcs[] = { 1, }; 1102d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4780_ssi0_ce1_b_funcs[] = { 1, }; 1103d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4780_ssi0_ce1_d_funcs[] = { 1, }; 1104d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4780_ssi1_dt_b_funcs[] = { 2, }; 1105d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4780_ssi1_dt_d_funcs[] = { 2, }; 1106d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4780_ssi1_dr_b_funcs[] = { 2, }; 1107d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4780_ssi1_dr_d_funcs[] = { 2, }; 1108d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4780_ssi1_clk_b_funcs[] = { 2, }; 1109d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4780_ssi1_clk_d_funcs[] = { 2, }; 1110d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4780_ssi1_gpc_b_funcs[] = { 2, }; 1111d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4780_ssi1_gpc_d_funcs[] = { 2, }; 1112d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4780_ssi1_ce0_b_funcs[] = { 2, }; 1113d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4780_ssi1_ce0_d_funcs[] = { 2, }; 1114d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4780_ssi1_ce1_b_funcs[] = { 2, }; 1115d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4780_ssi1_ce1_d_funcs[] = { 2, }; 1116ff656e47SZhou Yanjie static int jz4780_mmc0_8bit_a_funcs[] = { 1, 1, 1, 1, 1, }; 1117ff656e47SZhou Yanjie static int jz4780_i2c3_funcs[] = { 1, 1, }; 1118ff656e47SZhou Yanjie static int jz4780_i2c4_e_funcs[] = { 1, 1, }; 1119ff656e47SZhou Yanjie static int jz4780_i2c4_f_funcs[] = { 1, 1, }; 1120a0bb89e8SPaul Boddie static int jz4780_hdmi_ddc_funcs[] = { 0, 0, }; 1121ff656e47SZhou Yanjie 1122ff656e47SZhou Yanjie static const struct group_desc jz4780_groups[] = { 1123ff656e47SZhou Yanjie INGENIC_PIN_GROUP("uart0-data", jz4770_uart0_data), 1124ff656e47SZhou Yanjie INGENIC_PIN_GROUP("uart0-hwflow", jz4770_uart0_hwflow), 1125ff656e47SZhou Yanjie INGENIC_PIN_GROUP("uart1-data", jz4770_uart1_data), 1126ff656e47SZhou Yanjie INGENIC_PIN_GROUP("uart1-hwflow", jz4770_uart1_hwflow), 1127ff656e47SZhou Yanjie INGENIC_PIN_GROUP("uart2-data", jz4780_uart2_data), 1128ff656e47SZhou Yanjie INGENIC_PIN_GROUP("uart2-hwflow", jz4780_uart2_hwflow), 1129ff656e47SZhou Yanjie INGENIC_PIN_GROUP("uart3-data", jz4770_uart3_data), 1130ff656e47SZhou Yanjie INGENIC_PIN_GROUP("uart3-hwflow", jz4770_uart3_hwflow), 1131ff656e47SZhou Yanjie INGENIC_PIN_GROUP("uart4-data", jz4780_uart4_data), 1132d3ef8c6bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi0-dt-a-19", jz4780_ssi0_dt_a_19), 1133d3ef8c6bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi0-dt-a-21", jz4780_ssi0_dt_a_21), 1134d3ef8c6bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi0-dt-a-28", jz4780_ssi0_dt_a_28), 1135d3ef8c6bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi0-dt-b", jz4780_ssi0_dt_b), 1136d3ef8c6bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi0-dt-d", jz4780_ssi0_dt_d), 1137d3ef8c6bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi0-dt-e", jz4770_ssi0_dt_e), 1138d3ef8c6bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi0-dr-a-20", jz4780_ssi0_dr_a_20), 1139d3ef8c6bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi0-dr-a-27", jz4780_ssi0_dr_a_27), 1140d3ef8c6bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi0-dr-b", jz4780_ssi0_dr_b), 1141d3ef8c6bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi0-dr-d", jz4780_ssi0_dr_d), 1142d3ef8c6bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi0-dr-e", jz4770_ssi0_dr_e), 1143d3ef8c6bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi0-clk-a", jz4780_ssi0_clk_a), 1144d3ef8c6bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi0-clk-b-5", jz4780_ssi0_clk_b_5), 1145d3ef8c6bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi0-clk-b-28", jz4780_ssi0_clk_b_28), 1146d3ef8c6bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi0-clk-d", jz4780_ssi0_clk_d), 1147d3ef8c6bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi0-clk-e", jz4770_ssi0_clk_e), 1148d3ef8c6bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi0-gpc-b", jz4780_ssi0_gpc_b), 1149d3ef8c6bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi0-gpc-d", jz4780_ssi0_gpc_d), 1150d3ef8c6bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi0-gpc-e", jz4770_ssi0_gpc_e), 1151d3ef8c6bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi0-ce0-a-23", jz4780_ssi0_ce0_a_23), 1152d3ef8c6bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi0-ce0-a-25", jz4780_ssi0_ce0_a_25), 1153d3ef8c6bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi0-ce0-b", jz4780_ssi0_ce0_b), 1154d3ef8c6bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi0-ce0-d", jz4780_ssi0_ce0_d), 1155d3ef8c6bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi0-ce0-e", jz4770_ssi0_ce0_e), 1156d3ef8c6bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi0-ce1-b", jz4780_ssi0_ce1_b), 1157d3ef8c6bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi0-ce1-d", jz4780_ssi0_ce1_d), 1158d3ef8c6bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi0-ce1-e", jz4770_ssi0_ce1_e), 1159d3ef8c6bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi1-dt-b", jz4780_ssi1_dt_b), 1160d3ef8c6bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi1-dt-d", jz4780_ssi1_dt_d), 1161d3ef8c6bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi1-dt-e", jz4770_ssi1_dt_e), 1162d3ef8c6bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi1-dr-b", jz4780_ssi1_dr_b), 1163d3ef8c6bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi1-dr-d", jz4780_ssi1_dr_d), 1164d3ef8c6bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi1-dr-e", jz4770_ssi1_dr_e), 1165d3ef8c6bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi1-clk-b", jz4780_ssi1_clk_b), 1166d3ef8c6bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi1-clk-d", jz4780_ssi1_clk_d), 1167d3ef8c6bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi1-clk-e", jz4770_ssi1_clk_e), 1168d3ef8c6bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi1-gpc-b", jz4780_ssi1_gpc_b), 1169d3ef8c6bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi1-gpc-d", jz4780_ssi1_gpc_d), 1170d3ef8c6bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi1-gpc-e", jz4770_ssi1_gpc_e), 1171d3ef8c6bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi1-ce0-b", jz4780_ssi1_ce0_b), 1172d3ef8c6bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi1-ce0-d", jz4780_ssi1_ce0_d), 1173d3ef8c6bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi1-ce0-e", jz4770_ssi1_ce0_e), 1174d3ef8c6bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi1-ce1-b", jz4780_ssi1_ce1_b), 1175d3ef8c6bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi1-ce1-d", jz4780_ssi1_ce1_d), 1176d3ef8c6bS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi1-ce1-e", jz4770_ssi1_ce1_e), 1177ff656e47SZhou Yanjie INGENIC_PIN_GROUP("mmc0-1bit-a", jz4770_mmc0_1bit_a), 1178ff656e47SZhou Yanjie INGENIC_PIN_GROUP("mmc0-4bit-a", jz4770_mmc0_4bit_a), 1179ff656e47SZhou Yanjie INGENIC_PIN_GROUP("mmc0-8bit-a", jz4780_mmc0_8bit_a), 1180ff656e47SZhou Yanjie INGENIC_PIN_GROUP("mmc0-1bit-e", jz4770_mmc0_1bit_e), 1181ff656e47SZhou Yanjie INGENIC_PIN_GROUP("mmc0-4bit-e", jz4770_mmc0_4bit_e), 1182ff656e47SZhou Yanjie INGENIC_PIN_GROUP("mmc1-1bit-d", jz4770_mmc1_1bit_d), 1183ff656e47SZhou Yanjie INGENIC_PIN_GROUP("mmc1-4bit-d", jz4770_mmc1_4bit_d), 1184ff656e47SZhou Yanjie INGENIC_PIN_GROUP("mmc1-1bit-e", jz4770_mmc1_1bit_e), 1185ff656e47SZhou Yanjie INGENIC_PIN_GROUP("mmc1-4bit-e", jz4770_mmc1_4bit_e), 11865de1a73eSZhou Yanjie INGENIC_PIN_GROUP("mmc2-1bit-b", jz4770_mmc2_1bit_b), 11875de1a73eSZhou Yanjie INGENIC_PIN_GROUP("mmc2-4bit-b", jz4770_mmc2_4bit_b), 11885de1a73eSZhou Yanjie INGENIC_PIN_GROUP("mmc2-1bit-e", jz4770_mmc2_1bit_e), 11895de1a73eSZhou Yanjie INGENIC_PIN_GROUP("mmc2-4bit-e", jz4770_mmc2_4bit_e), 1190ff656e47SZhou Yanjie INGENIC_PIN_GROUP("nemc-data", jz4770_nemc_8bit_data), 1191ff656e47SZhou Yanjie INGENIC_PIN_GROUP("nemc-cle-ale", jz4770_nemc_cle_ale), 1192ff656e47SZhou Yanjie INGENIC_PIN_GROUP("nemc-addr", jz4770_nemc_addr), 1193ff656e47SZhou Yanjie INGENIC_PIN_GROUP("nemc-rd-we", jz4770_nemc_rd_we), 1194ff656e47SZhou Yanjie INGENIC_PIN_GROUP("nemc-frd-fwe", jz4770_nemc_frd_fwe), 11955de1a73eSZhou Yanjie INGENIC_PIN_GROUP("nemc-wait", jz4770_nemc_wait), 1196ff656e47SZhou Yanjie INGENIC_PIN_GROUP("nemc-cs1", jz4770_nemc_cs1), 1197ff656e47SZhou Yanjie INGENIC_PIN_GROUP("nemc-cs2", jz4770_nemc_cs2), 1198ff656e47SZhou Yanjie INGENIC_PIN_GROUP("nemc-cs3", jz4770_nemc_cs3), 1199ff656e47SZhou Yanjie INGENIC_PIN_GROUP("nemc-cs4", jz4770_nemc_cs4), 1200ff656e47SZhou Yanjie INGENIC_PIN_GROUP("nemc-cs5", jz4770_nemc_cs5), 1201ff656e47SZhou Yanjie INGENIC_PIN_GROUP("nemc-cs6", jz4770_nemc_cs6), 1202ff656e47SZhou Yanjie INGENIC_PIN_GROUP("i2c0-data", jz4770_i2c0), 1203ff656e47SZhou Yanjie INGENIC_PIN_GROUP("i2c1-data", jz4770_i2c1), 1204ff656e47SZhou Yanjie INGENIC_PIN_GROUP("i2c2-data", jz4770_i2c2), 1205ff656e47SZhou Yanjie INGENIC_PIN_GROUP("i2c3-data", jz4780_i2c3), 1206ff656e47SZhou Yanjie INGENIC_PIN_GROUP("i2c4-data-e", jz4780_i2c4_e), 1207ff656e47SZhou Yanjie INGENIC_PIN_GROUP("i2c4-data-f", jz4780_i2c4_f), 1208a0bb89e8SPaul Boddie INGENIC_PIN_GROUP("hdmi-ddc", jz4780_hdmi_ddc), 1209ff656e47SZhou Yanjie INGENIC_PIN_GROUP("cim-data", jz4770_cim_8bit), 1210ff656e47SZhou Yanjie INGENIC_PIN_GROUP("lcd-24bit", jz4770_lcd_24bit), 1211ff656e47SZhou Yanjie { "lcd-no-pins", }, 1212ff656e47SZhou Yanjie INGENIC_PIN_GROUP("pwm0", jz4770_pwm_pwm0), 1213ff656e47SZhou Yanjie INGENIC_PIN_GROUP("pwm1", jz4770_pwm_pwm1), 1214ff656e47SZhou Yanjie INGENIC_PIN_GROUP("pwm2", jz4770_pwm_pwm2), 1215ff656e47SZhou Yanjie INGENIC_PIN_GROUP("pwm3", jz4770_pwm_pwm3), 1216ff656e47SZhou Yanjie INGENIC_PIN_GROUP("pwm4", jz4770_pwm_pwm4), 1217ff656e47SZhou Yanjie INGENIC_PIN_GROUP("pwm5", jz4770_pwm_pwm5), 1218ff656e47SZhou Yanjie INGENIC_PIN_GROUP("pwm6", jz4770_pwm_pwm6), 1219ff656e47SZhou Yanjie INGENIC_PIN_GROUP("pwm7", jz4770_pwm_pwm7), 1220ff656e47SZhou Yanjie }; 1221ff656e47SZhou Yanjie 1222ff656e47SZhou Yanjie static const char *jz4780_uart2_groups[] = { "uart2-data", "uart2-hwflow", }; 1223ff656e47SZhou Yanjie static const char *jz4780_uart4_groups[] = { "uart4-data", }; 1224d3ef8c6bS周琰杰 (Zhou Yanjie) static const char *jz4780_ssi0_groups[] = { 1225d3ef8c6bS周琰杰 (Zhou Yanjie) "ssi0-dt-a-19", "ssi0-dt-a-21", "ssi0-dt-a-28", "ssi0-dt-b", "ssi0-dt-d", "ssi0-dt-e", 1226d3ef8c6bS周琰杰 (Zhou Yanjie) "ssi0-dr-a-20", "ssi0-dr-a-27", "ssi0-dr-b", "ssi0-dr-d", "ssi0-dr-e", 1227d3ef8c6bS周琰杰 (Zhou Yanjie) "ssi0-clk-a", "ssi0-clk-b-5", "ssi0-clk-b-28", "ssi0-clk-d", "ssi0-clk-e", 1228d3ef8c6bS周琰杰 (Zhou Yanjie) "ssi0-gpc-b", "ssi0-gpc-d", "ssi0-gpc-e", 1229d3ef8c6bS周琰杰 (Zhou Yanjie) "ssi0-ce0-a-23", "ssi0-ce0-a-25", "ssi0-ce0-b", "ssi0-ce0-d", "ssi0-ce0-e", 1230d3ef8c6bS周琰杰 (Zhou Yanjie) "ssi0-ce1-b", "ssi0-ce1-d", "ssi0-ce1-e", 1231d3ef8c6bS周琰杰 (Zhou Yanjie) }; 1232d3ef8c6bS周琰杰 (Zhou Yanjie) static const char *jz4780_ssi1_groups[] = { 1233d3ef8c6bS周琰杰 (Zhou Yanjie) "ssi1-dt-b", "ssi1-dt-d", "ssi1-dt-e", 1234d3ef8c6bS周琰杰 (Zhou Yanjie) "ssi1-dr-b", "ssi1-dr-d", "ssi1-dr-e", 1235d3ef8c6bS周琰杰 (Zhou Yanjie) "ssi1-clk-b", "ssi1-clk-d", "ssi1-clk-e", 1236d3ef8c6bS周琰杰 (Zhou Yanjie) "ssi1-gpc-b", "ssi1-gpc-d", "ssi1-gpc-e", 1237d3ef8c6bS周琰杰 (Zhou Yanjie) "ssi1-ce0-b", "ssi1-ce0-d", "ssi1-ce0-e", 1238d3ef8c6bS周琰杰 (Zhou Yanjie) "ssi1-ce1-b", "ssi1-ce1-d", "ssi1-ce1-e", 1239d3ef8c6bS周琰杰 (Zhou Yanjie) }; 1240ff656e47SZhou Yanjie static const char *jz4780_mmc0_groups[] = { 1241ff656e47SZhou Yanjie "mmc0-1bit-a", "mmc0-4bit-a", "mmc0-8bit-a", 1242ff656e47SZhou Yanjie "mmc0-1bit-e", "mmc0-4bit-e", 1243ff656e47SZhou Yanjie }; 1244ff656e47SZhou Yanjie static const char *jz4780_mmc1_groups[] = { 1245ff656e47SZhou Yanjie "mmc1-1bit-d", "mmc1-4bit-d", "mmc1-1bit-e", "mmc1-4bit-e", 1246ff656e47SZhou Yanjie }; 12475de1a73eSZhou Yanjie static const char *jz4780_mmc2_groups[] = { 12485de1a73eSZhou Yanjie "mmc2-1bit-b", "mmc2-4bit-b", "mmc2-1bit-e", "mmc2-4bit-e", 12495de1a73eSZhou Yanjie }; 1250ff656e47SZhou Yanjie static const char *jz4780_nemc_groups[] = { 1251ff656e47SZhou Yanjie "nemc-data", "nemc-cle-ale", "nemc-addr", 12525de1a73eSZhou Yanjie "nemc-rd-we", "nemc-frd-fwe", "nemc-wait", 1253ff656e47SZhou Yanjie }; 1254ff656e47SZhou Yanjie static const char *jz4780_i2c3_groups[] = { "i2c3-data", }; 1255ff656e47SZhou Yanjie static const char *jz4780_i2c4_groups[] = { "i2c4-data-e", "i2c4-data-f", }; 1256ff656e47SZhou Yanjie static const char *jz4780_cim_groups[] = { "cim-data", }; 1257a0bb89e8SPaul Boddie static const char *jz4780_hdmi_ddc_groups[] = { "hdmi-ddc", }; 1258ff656e47SZhou Yanjie 1259ff656e47SZhou Yanjie static const struct function_desc jz4780_functions[] = { 1260ff656e47SZhou Yanjie { "uart0", jz4770_uart0_groups, ARRAY_SIZE(jz4770_uart0_groups), }, 1261ff656e47SZhou Yanjie { "uart1", jz4770_uart1_groups, ARRAY_SIZE(jz4770_uart1_groups), }, 1262ff656e47SZhou Yanjie { "uart2", jz4780_uart2_groups, ARRAY_SIZE(jz4780_uart2_groups), }, 1263ff656e47SZhou Yanjie { "uart3", jz4770_uart3_groups, ARRAY_SIZE(jz4770_uart3_groups), }, 1264ff656e47SZhou Yanjie { "uart4", jz4780_uart4_groups, ARRAY_SIZE(jz4780_uart4_groups), }, 1265d3ef8c6bS周琰杰 (Zhou Yanjie) { "ssi0", jz4780_ssi0_groups, ARRAY_SIZE(jz4780_ssi0_groups), }, 1266d3ef8c6bS周琰杰 (Zhou Yanjie) { "ssi1", jz4780_ssi1_groups, ARRAY_SIZE(jz4780_ssi1_groups), }, 1267ff656e47SZhou Yanjie { "mmc0", jz4780_mmc0_groups, ARRAY_SIZE(jz4780_mmc0_groups), }, 1268ff656e47SZhou Yanjie { "mmc1", jz4780_mmc1_groups, ARRAY_SIZE(jz4780_mmc1_groups), }, 12695de1a73eSZhou Yanjie { "mmc2", jz4780_mmc2_groups, ARRAY_SIZE(jz4780_mmc2_groups), }, 1270ff656e47SZhou Yanjie { "nemc", jz4780_nemc_groups, ARRAY_SIZE(jz4780_nemc_groups), }, 1271ff656e47SZhou Yanjie { "nemc-cs1", jz4770_cs1_groups, ARRAY_SIZE(jz4770_cs1_groups), }, 1272ff656e47SZhou Yanjie { "nemc-cs2", jz4770_cs2_groups, ARRAY_SIZE(jz4770_cs2_groups), }, 1273ff656e47SZhou Yanjie { "nemc-cs3", jz4770_cs3_groups, ARRAY_SIZE(jz4770_cs3_groups), }, 1274ff656e47SZhou Yanjie { "nemc-cs4", jz4770_cs4_groups, ARRAY_SIZE(jz4770_cs4_groups), }, 1275ff656e47SZhou Yanjie { "nemc-cs5", jz4770_cs5_groups, ARRAY_SIZE(jz4770_cs5_groups), }, 1276ff656e47SZhou Yanjie { "nemc-cs6", jz4770_cs6_groups, ARRAY_SIZE(jz4770_cs6_groups), }, 1277ff656e47SZhou Yanjie { "i2c0", jz4770_i2c0_groups, ARRAY_SIZE(jz4770_i2c0_groups), }, 1278ff656e47SZhou Yanjie { "i2c1", jz4770_i2c1_groups, ARRAY_SIZE(jz4770_i2c1_groups), }, 1279ff656e47SZhou Yanjie { "i2c2", jz4770_i2c2_groups, ARRAY_SIZE(jz4770_i2c2_groups), }, 1280ff656e47SZhou Yanjie { "i2c3", jz4780_i2c3_groups, ARRAY_SIZE(jz4780_i2c3_groups), }, 1281ff656e47SZhou Yanjie { "i2c4", jz4780_i2c4_groups, ARRAY_SIZE(jz4780_i2c4_groups), }, 1282ff656e47SZhou Yanjie { "cim", jz4780_cim_groups, ARRAY_SIZE(jz4780_cim_groups), }, 1283ff656e47SZhou Yanjie { "lcd", jz4770_lcd_groups, ARRAY_SIZE(jz4770_lcd_groups), }, 1284ff656e47SZhou Yanjie { "pwm0", jz4770_pwm0_groups, ARRAY_SIZE(jz4770_pwm0_groups), }, 1285ff656e47SZhou Yanjie { "pwm1", jz4770_pwm1_groups, ARRAY_SIZE(jz4770_pwm1_groups), }, 1286ff656e47SZhou Yanjie { "pwm2", jz4770_pwm2_groups, ARRAY_SIZE(jz4770_pwm2_groups), }, 1287ff656e47SZhou Yanjie { "pwm3", jz4770_pwm3_groups, ARRAY_SIZE(jz4770_pwm3_groups), }, 1288ff656e47SZhou Yanjie { "pwm4", jz4770_pwm4_groups, ARRAY_SIZE(jz4770_pwm4_groups), }, 1289ff656e47SZhou Yanjie { "pwm5", jz4770_pwm5_groups, ARRAY_SIZE(jz4770_pwm5_groups), }, 1290ff656e47SZhou Yanjie { "pwm6", jz4770_pwm6_groups, ARRAY_SIZE(jz4770_pwm6_groups), }, 1291ff656e47SZhou Yanjie { "pwm7", jz4770_pwm7_groups, ARRAY_SIZE(jz4770_pwm7_groups), }, 1292a0bb89e8SPaul Boddie { "hdmi-ddc", jz4780_hdmi_ddc_groups, 1293a0bb89e8SPaul Boddie ARRAY_SIZE(jz4780_hdmi_ddc_groups), }, 1294ff656e47SZhou Yanjie }; 1295ff656e47SZhou Yanjie 1296ff656e47SZhou Yanjie static const struct ingenic_chip_info jz4780_chip_info = { 1297ff656e47SZhou Yanjie .num_chips = 6, 1298f742e5ebS周琰杰 (Zhou Yanjie) .reg_offset = 0x100, 1299baf15647SPaul Cercueil .version = ID_JZ4780, 1300ff656e47SZhou Yanjie .groups = jz4780_groups, 1301ff656e47SZhou Yanjie .num_groups = ARRAY_SIZE(jz4780_groups), 1302ff656e47SZhou Yanjie .functions = jz4780_functions, 1303ff656e47SZhou Yanjie .num_functions = ARRAY_SIZE(jz4780_functions), 1304ff656e47SZhou Yanjie .pull_ups = jz4770_pull_ups, 1305ff656e47SZhou Yanjie .pull_downs = jz4770_pull_downs, 1306ff656e47SZhou Yanjie }; 1307ff656e47SZhou Yanjie 1308fe1ad5eeSZhou Yanjie static const u32 x1000_pull_ups[4] = { 1309b4a9372aS周琰杰 (Zhou Yanjie) 0xffffffff, 0xfdffffff, 0x0dffffff, 0x0000003f, 1310fe1ad5eeSZhou Yanjie }; 1311fe1ad5eeSZhou Yanjie 1312fe1ad5eeSZhou Yanjie static const u32 x1000_pull_downs[4] = { 1313fe1ad5eeSZhou Yanjie 0x00000000, 0x02000000, 0x02000000, 0x00000000, 1314fe1ad5eeSZhou Yanjie }; 1315fe1ad5eeSZhou Yanjie 1316fe1ad5eeSZhou Yanjie static int x1000_uart0_data_pins[] = { 0x4a, 0x4b, }; 1317fe1ad5eeSZhou Yanjie static int x1000_uart0_hwflow_pins[] = { 0x4c, 0x4d, }; 1318fe1ad5eeSZhou Yanjie static int x1000_uart1_data_a_pins[] = { 0x04, 0x05, }; 1319fe1ad5eeSZhou Yanjie static int x1000_uart1_data_d_pins[] = { 0x62, 0x63, }; 1320b4a9372aS周琰杰 (Zhou Yanjie) static int x1000_uart1_hwflow_pins[] = { 0x64, 0x65, }; 1321fe1ad5eeSZhou Yanjie static int x1000_uart2_data_a_pins[] = { 0x02, 0x03, }; 1322fe1ad5eeSZhou Yanjie static int x1000_uart2_data_d_pins[] = { 0x65, 0x64, }; 13233b31e9b0S周琰杰 (Zhou Yanjie) static int x1000_sfc_pins[] = { 0x1d, 0x1c, 0x1e, 0x1f, 0x1a, 0x1b, }; 13243b31e9b0S周琰杰 (Zhou Yanjie) static int x1000_ssi_dt_a_22_pins[] = { 0x16, }; 13253b31e9b0S周琰杰 (Zhou Yanjie) static int x1000_ssi_dt_a_29_pins[] = { 0x1d, }; 13263b31e9b0S周琰杰 (Zhou Yanjie) static int x1000_ssi_dt_d_pins[] = { 0x62, }; 13273b31e9b0S周琰杰 (Zhou Yanjie) static int x1000_ssi_dr_a_23_pins[] = { 0x17, }; 13283b31e9b0S周琰杰 (Zhou Yanjie) static int x1000_ssi_dr_a_28_pins[] = { 0x1c, }; 13293b31e9b0S周琰杰 (Zhou Yanjie) static int x1000_ssi_dr_d_pins[] = { 0x63, }; 13303b31e9b0S周琰杰 (Zhou Yanjie) static int x1000_ssi_clk_a_24_pins[] = { 0x18, }; 13313b31e9b0S周琰杰 (Zhou Yanjie) static int x1000_ssi_clk_a_26_pins[] = { 0x1a, }; 13323b31e9b0S周琰杰 (Zhou Yanjie) static int x1000_ssi_clk_d_pins[] = { 0x60, }; 13333b31e9b0S周琰杰 (Zhou Yanjie) static int x1000_ssi_gpc_a_20_pins[] = { 0x14, }; 13343b31e9b0S周琰杰 (Zhou Yanjie) static int x1000_ssi_gpc_a_31_pins[] = { 0x1f, }; 13353b31e9b0S周琰杰 (Zhou Yanjie) static int x1000_ssi_ce0_a_25_pins[] = { 0x19, }; 13363b31e9b0S周琰杰 (Zhou Yanjie) static int x1000_ssi_ce0_a_27_pins[] = { 0x1b, }; 13373b31e9b0S周琰杰 (Zhou Yanjie) static int x1000_ssi_ce0_d_pins[] = { 0x61, }; 13383b31e9b0S周琰杰 (Zhou Yanjie) static int x1000_ssi_ce1_a_21_pins[] = { 0x15, }; 13393b31e9b0S周琰杰 (Zhou Yanjie) static int x1000_ssi_ce1_a_30_pins[] = { 0x1e, }; 1340fe1ad5eeSZhou Yanjie static int x1000_mmc0_1bit_pins[] = { 0x18, 0x19, 0x17, }; 1341fe1ad5eeSZhou Yanjie static int x1000_mmc0_4bit_pins[] = { 0x16, 0x15, 0x14, }; 1342fe1ad5eeSZhou Yanjie static int x1000_mmc0_8bit_pins[] = { 0x13, 0x12, 0x11, 0x10, }; 1343fe1ad5eeSZhou Yanjie static int x1000_mmc1_1bit_pins[] = { 0x40, 0x41, 0x42, }; 1344fe1ad5eeSZhou Yanjie static int x1000_mmc1_4bit_pins[] = { 0x43, 0x44, 0x45, }; 1345b4a9372aS周琰杰 (Zhou Yanjie) static int x1000_emc_8bit_data_pins[] = { 1346fe1ad5eeSZhou Yanjie 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 1347fe1ad5eeSZhou Yanjie }; 1348b4a9372aS周琰杰 (Zhou Yanjie) static int x1000_emc_16bit_data_pins[] = { 1349fe1ad5eeSZhou Yanjie 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 1350fe1ad5eeSZhou Yanjie }; 1351b4a9372aS周琰杰 (Zhou Yanjie) static int x1000_emc_addr_pins[] = { 1352fe1ad5eeSZhou Yanjie 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 1353fe1ad5eeSZhou Yanjie 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 1354fe1ad5eeSZhou Yanjie }; 1355b4a9372aS周琰杰 (Zhou Yanjie) static int x1000_emc_rd_we_pins[] = { 0x30, 0x31, }; 1356b4a9372aS周琰杰 (Zhou Yanjie) static int x1000_emc_wait_pins[] = { 0x34, }; 1357b4a9372aS周琰杰 (Zhou Yanjie) static int x1000_emc_cs1_pins[] = { 0x32, }; 1358b4a9372aS周琰杰 (Zhou Yanjie) static int x1000_emc_cs2_pins[] = { 0x33, }; 1359fe1ad5eeSZhou Yanjie static int x1000_i2c0_pins[] = { 0x38, 0x37, }; 1360fe1ad5eeSZhou Yanjie static int x1000_i2c1_a_pins[] = { 0x01, 0x00, }; 1361fe1ad5eeSZhou Yanjie static int x1000_i2c1_c_pins[] = { 0x5b, 0x5a, }; 1362fe1ad5eeSZhou Yanjie static int x1000_i2c2_pins[] = { 0x61, 0x60, }; 1363fe1ad5eeSZhou Yanjie static int x1000_cim_pins[] = { 1364fe1ad5eeSZhou Yanjie 0x08, 0x09, 0x0a, 0x0b, 1365fe1ad5eeSZhou Yanjie 0x13, 0x12, 0x11, 0x10, 0x0f, 0x0e, 0x0d, 0x0c, 1366fe1ad5eeSZhou Yanjie }; 1367fe1ad5eeSZhou Yanjie static int x1000_lcd_8bit_pins[] = { 1368fe1ad5eeSZhou Yanjie 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 1369fe1ad5eeSZhou Yanjie 0x30, 0x31, 0x32, 0x33, 0x34, 1370fe1ad5eeSZhou Yanjie }; 1371fe1ad5eeSZhou Yanjie static int x1000_lcd_16bit_pins[] = { 1372fe1ad5eeSZhou Yanjie 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 1373fe1ad5eeSZhou Yanjie }; 1374fe1ad5eeSZhou Yanjie static int x1000_pwm_pwm0_pins[] = { 0x59, }; 1375fe1ad5eeSZhou Yanjie static int x1000_pwm_pwm1_pins[] = { 0x5a, }; 1376fe1ad5eeSZhou Yanjie static int x1000_pwm_pwm2_pins[] = { 0x5b, }; 1377fe1ad5eeSZhou Yanjie static int x1000_pwm_pwm3_pins[] = { 0x26, }; 1378fe1ad5eeSZhou Yanjie static int x1000_pwm_pwm4_pins[] = { 0x58, }; 1379fe1ad5eeSZhou Yanjie static int x1000_mac_pins[] = { 1380fe1ad5eeSZhou Yanjie 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x26, 1381fe1ad5eeSZhou Yanjie }; 1382fe1ad5eeSZhou Yanjie 1383fe1ad5eeSZhou Yanjie static int x1000_uart0_data_funcs[] = { 0, 0, }; 1384fe1ad5eeSZhou Yanjie static int x1000_uart0_hwflow_funcs[] = { 0, 0, }; 1385fe1ad5eeSZhou Yanjie static int x1000_uart1_data_a_funcs[] = { 2, 2, }; 1386fe1ad5eeSZhou Yanjie static int x1000_uart1_data_d_funcs[] = { 1, 1, }; 1387b4a9372aS周琰杰 (Zhou Yanjie) static int x1000_uart1_hwflow_funcs[] = { 1, 1, }; 1388fe1ad5eeSZhou Yanjie static int x1000_uart2_data_a_funcs[] = { 2, 2, }; 1389fe1ad5eeSZhou Yanjie static int x1000_uart2_data_d_funcs[] = { 0, 0, }; 13903b31e9b0S周琰杰 (Zhou Yanjie) static int x1000_sfc_funcs[] = { 1, 1, 1, 1, 1, 1, }; 13913b31e9b0S周琰杰 (Zhou Yanjie) static int x1000_ssi_dt_a_22_funcs[] = { 2, }; 13923b31e9b0S周琰杰 (Zhou Yanjie) static int x1000_ssi_dt_a_29_funcs[] = { 2, }; 13933b31e9b0S周琰杰 (Zhou Yanjie) static int x1000_ssi_dt_d_funcs[] = { 0, }; 13943b31e9b0S周琰杰 (Zhou Yanjie) static int x1000_ssi_dr_a_23_funcs[] = { 2, }; 13953b31e9b0S周琰杰 (Zhou Yanjie) static int x1000_ssi_dr_a_28_funcs[] = { 2, }; 13963b31e9b0S周琰杰 (Zhou Yanjie) static int x1000_ssi_dr_d_funcs[] = { 0, }; 13973b31e9b0S周琰杰 (Zhou Yanjie) static int x1000_ssi_clk_a_24_funcs[] = { 2, }; 13983b31e9b0S周琰杰 (Zhou Yanjie) static int x1000_ssi_clk_a_26_funcs[] = { 2, }; 13993b31e9b0S周琰杰 (Zhou Yanjie) static int x1000_ssi_clk_d_funcs[] = { 0, }; 14003b31e9b0S周琰杰 (Zhou Yanjie) static int x1000_ssi_gpc_a_20_funcs[] = { 2, }; 14013b31e9b0S周琰杰 (Zhou Yanjie) static int x1000_ssi_gpc_a_31_funcs[] = { 2, }; 14023b31e9b0S周琰杰 (Zhou Yanjie) static int x1000_ssi_ce0_a_25_funcs[] = { 2, }; 14033b31e9b0S周琰杰 (Zhou Yanjie) static int x1000_ssi_ce0_a_27_funcs[] = { 2, }; 14043b31e9b0S周琰杰 (Zhou Yanjie) static int x1000_ssi_ce0_d_funcs[] = { 0, }; 14053b31e9b0S周琰杰 (Zhou Yanjie) static int x1000_ssi_ce1_a_21_funcs[] = { 2, }; 14063b31e9b0S周琰杰 (Zhou Yanjie) static int x1000_ssi_ce1_a_30_funcs[] = { 2, }; 1407fe1ad5eeSZhou Yanjie static int x1000_mmc0_1bit_funcs[] = { 1, 1, 1, }; 1408fe1ad5eeSZhou Yanjie static int x1000_mmc0_4bit_funcs[] = { 1, 1, 1, }; 1409fe1ad5eeSZhou Yanjie static int x1000_mmc0_8bit_funcs[] = { 1, 1, 1, 1, 1, }; 1410fe1ad5eeSZhou Yanjie static int x1000_mmc1_1bit_funcs[] = { 0, 0, 0, }; 1411fe1ad5eeSZhou Yanjie static int x1000_mmc1_4bit_funcs[] = { 0, 0, 0, }; 1412b4a9372aS周琰杰 (Zhou Yanjie) static int x1000_emc_8bit_data_funcs[] = { 0, 0, 0, 0, 0, 0, 0, 0, }; 1413b4a9372aS周琰杰 (Zhou Yanjie) static int x1000_emc_16bit_data_funcs[] = { 0, 0, 0, 0, 0, 0, 0, 0, }; 1414b4a9372aS周琰杰 (Zhou Yanjie) static int x1000_emc_addr_funcs[] = { 1415fe1ad5eeSZhou Yanjie 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1416fe1ad5eeSZhou Yanjie }; 1417b4a9372aS周琰杰 (Zhou Yanjie) static int x1000_emc_rd_we_funcs[] = { 0, 0, }; 1418b4a9372aS周琰杰 (Zhou Yanjie) static int x1000_emc_wait_funcs[] = { 0, }; 1419b4a9372aS周琰杰 (Zhou Yanjie) static int x1000_emc_cs1_funcs[] = { 0, }; 1420b4a9372aS周琰杰 (Zhou Yanjie) static int x1000_emc_cs2_funcs[] = { 0, }; 1421fe1ad5eeSZhou Yanjie static int x1000_i2c0_funcs[] = { 0, 0, }; 1422fe1ad5eeSZhou Yanjie static int x1000_i2c1_a_funcs[] = { 2, 2, }; 1423fe1ad5eeSZhou Yanjie static int x1000_i2c1_c_funcs[] = { 0, 0, }; 1424fe1ad5eeSZhou Yanjie static int x1000_i2c2_funcs[] = { 1, 1, }; 1425fe1ad5eeSZhou Yanjie static int x1000_cim_funcs[] = { 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, }; 1426fe1ad5eeSZhou Yanjie static int x1000_lcd_8bit_funcs[] = { 1427fe1ad5eeSZhou Yanjie 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1428fe1ad5eeSZhou Yanjie }; 1429fe1ad5eeSZhou Yanjie static int x1000_lcd_16bit_funcs[] = { 1, 1, 1, 1, 1, 1, 1, 1, }; 1430fe1ad5eeSZhou Yanjie static int x1000_pwm_pwm0_funcs[] = { 0, }; 1431fe1ad5eeSZhou Yanjie static int x1000_pwm_pwm1_funcs[] = { 1, }; 1432fe1ad5eeSZhou Yanjie static int x1000_pwm_pwm2_funcs[] = { 1, }; 1433fe1ad5eeSZhou Yanjie static int x1000_pwm_pwm3_funcs[] = { 2, }; 1434fe1ad5eeSZhou Yanjie static int x1000_pwm_pwm4_funcs[] = { 0, }; 1435fe1ad5eeSZhou Yanjie static int x1000_mac_funcs[] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, }; 1436fe1ad5eeSZhou Yanjie 1437fe1ad5eeSZhou Yanjie static const struct group_desc x1000_groups[] = { 1438fe1ad5eeSZhou Yanjie INGENIC_PIN_GROUP("uart0-data", x1000_uart0_data), 1439fe1ad5eeSZhou Yanjie INGENIC_PIN_GROUP("uart0-hwflow", x1000_uart0_hwflow), 1440fe1ad5eeSZhou Yanjie INGENIC_PIN_GROUP("uart1-data-a", x1000_uart1_data_a), 1441fe1ad5eeSZhou Yanjie INGENIC_PIN_GROUP("uart1-data-d", x1000_uart1_data_d), 1442b4a9372aS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("uart1-hwflow", x1000_uart1_hwflow), 1443fe1ad5eeSZhou Yanjie INGENIC_PIN_GROUP("uart2-data-a", x1000_uart2_data_a), 1444fe1ad5eeSZhou Yanjie INGENIC_PIN_GROUP("uart2-data-d", x1000_uart2_data_d), 14453b31e9b0S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("sfc", x1000_sfc), 14463b31e9b0S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi-dt-a-22", x1000_ssi_dt_a_22), 14473b31e9b0S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi-dt-a-29", x1000_ssi_dt_a_29), 14483b31e9b0S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi-dt-d", x1000_ssi_dt_d), 14493b31e9b0S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi-dr-a-23", x1000_ssi_dr_a_23), 14503b31e9b0S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi-dr-a-28", x1000_ssi_dr_a_28), 14513b31e9b0S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi-dr-d", x1000_ssi_dr_d), 14523b31e9b0S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi-clk-a-24", x1000_ssi_clk_a_24), 14533b31e9b0S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi-clk-a-26", x1000_ssi_clk_a_26), 14543b31e9b0S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi-clk-d", x1000_ssi_clk_d), 14553b31e9b0S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi-gpc-a-20", x1000_ssi_gpc_a_20), 14563b31e9b0S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi-gpc-a-31", x1000_ssi_gpc_a_31), 14573b31e9b0S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi-ce0-a-25", x1000_ssi_ce0_a_25), 14583b31e9b0S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi-ce0-a-27", x1000_ssi_ce0_a_27), 14593b31e9b0S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi-ce0-d", x1000_ssi_ce0_d), 14603b31e9b0S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi-ce1-a-21", x1000_ssi_ce1_a_21), 14613b31e9b0S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi-ce1-a-30", x1000_ssi_ce1_a_30), 1462fe1ad5eeSZhou Yanjie INGENIC_PIN_GROUP("mmc0-1bit", x1000_mmc0_1bit), 1463fe1ad5eeSZhou Yanjie INGENIC_PIN_GROUP("mmc0-4bit", x1000_mmc0_4bit), 1464fe1ad5eeSZhou Yanjie INGENIC_PIN_GROUP("mmc0-8bit", x1000_mmc0_8bit), 1465fe1ad5eeSZhou Yanjie INGENIC_PIN_GROUP("mmc1-1bit", x1000_mmc1_1bit), 1466fe1ad5eeSZhou Yanjie INGENIC_PIN_GROUP("mmc1-4bit", x1000_mmc1_4bit), 1467b4a9372aS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("emc-8bit-data", x1000_emc_8bit_data), 1468b4a9372aS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("emc-16bit-data", x1000_emc_16bit_data), 1469b4a9372aS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("emc-addr", x1000_emc_addr), 1470b4a9372aS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("emc-rd-we", x1000_emc_rd_we), 1471b4a9372aS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("emc-wait", x1000_emc_wait), 1472b4a9372aS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("emc-cs1", x1000_emc_cs1), 1473b4a9372aS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("emc-cs2", x1000_emc_cs2), 1474fe1ad5eeSZhou Yanjie INGENIC_PIN_GROUP("i2c0-data", x1000_i2c0), 1475fe1ad5eeSZhou Yanjie INGENIC_PIN_GROUP("i2c1-data-a", x1000_i2c1_a), 1476fe1ad5eeSZhou Yanjie INGENIC_PIN_GROUP("i2c1-data-c", x1000_i2c1_c), 1477fe1ad5eeSZhou Yanjie INGENIC_PIN_GROUP("i2c2-data", x1000_i2c2), 1478fe1ad5eeSZhou Yanjie INGENIC_PIN_GROUP("cim-data", x1000_cim), 1479fe1ad5eeSZhou Yanjie INGENIC_PIN_GROUP("lcd-8bit", x1000_lcd_8bit), 1480fe1ad5eeSZhou Yanjie INGENIC_PIN_GROUP("lcd-16bit", x1000_lcd_16bit), 1481fe1ad5eeSZhou Yanjie { "lcd-no-pins", }, 1482fe1ad5eeSZhou Yanjie INGENIC_PIN_GROUP("pwm0", x1000_pwm_pwm0), 1483fe1ad5eeSZhou Yanjie INGENIC_PIN_GROUP("pwm1", x1000_pwm_pwm1), 1484fe1ad5eeSZhou Yanjie INGENIC_PIN_GROUP("pwm2", x1000_pwm_pwm2), 1485fe1ad5eeSZhou Yanjie INGENIC_PIN_GROUP("pwm3", x1000_pwm_pwm3), 1486fe1ad5eeSZhou Yanjie INGENIC_PIN_GROUP("pwm4", x1000_pwm_pwm4), 1487fe1ad5eeSZhou Yanjie INGENIC_PIN_GROUP("mac", x1000_mac), 1488fe1ad5eeSZhou Yanjie }; 1489fe1ad5eeSZhou Yanjie 1490fe1ad5eeSZhou Yanjie static const char *x1000_uart0_groups[] = { "uart0-data", "uart0-hwflow", }; 1491fe1ad5eeSZhou Yanjie static const char *x1000_uart1_groups[] = { 1492b4a9372aS周琰杰 (Zhou Yanjie) "uart1-data-a", "uart1-data-d", "uart1-hwflow", 1493fe1ad5eeSZhou Yanjie }; 1494fe1ad5eeSZhou Yanjie static const char *x1000_uart2_groups[] = { "uart2-data-a", "uart2-data-d", }; 14953b31e9b0S周琰杰 (Zhou Yanjie) static const char *x1000_sfc_groups[] = { "sfc", }; 14963b31e9b0S周琰杰 (Zhou Yanjie) static const char *x1000_ssi_groups[] = { 14973b31e9b0S周琰杰 (Zhou Yanjie) "ssi-dt-a-22", "ssi-dt-a-29", "ssi-dt-d", 14983b31e9b0S周琰杰 (Zhou Yanjie) "ssi-dr-a-23", "ssi-dr-a-28", "ssi-dr-d", 14993b31e9b0S周琰杰 (Zhou Yanjie) "ssi-clk-a-24", "ssi-clk-a-26", "ssi-clk-d", 15003b31e9b0S周琰杰 (Zhou Yanjie) "ssi-gpc-a-20", "ssi-gpc-a-31", 15013b31e9b0S周琰杰 (Zhou Yanjie) "ssi-ce0-a-25", "ssi-ce0-a-27", "ssi-ce0-d", 15023b31e9b0S周琰杰 (Zhou Yanjie) "ssi-ce1-a-21", "ssi-ce1-a-30", 15033b31e9b0S周琰杰 (Zhou Yanjie) }; 1504fe1ad5eeSZhou Yanjie static const char *x1000_mmc0_groups[] = { 1505fe1ad5eeSZhou Yanjie "mmc0-1bit", "mmc0-4bit", "mmc0-8bit", 1506fe1ad5eeSZhou Yanjie }; 1507fe1ad5eeSZhou Yanjie static const char *x1000_mmc1_groups[] = { 1508b4a9372aS周琰杰 (Zhou Yanjie) "mmc1-1bit", "mmc1-4bit", 1509fe1ad5eeSZhou Yanjie }; 1510b4a9372aS周琰杰 (Zhou Yanjie) static const char *x1000_emc_groups[] = { 1511b4a9372aS周琰杰 (Zhou Yanjie) "emc-8bit-data", "emc-16bit-data", 1512b4a9372aS周琰杰 (Zhou Yanjie) "emc-addr", "emc-rd-we", "emc-wait", 1513fe1ad5eeSZhou Yanjie }; 1514b4a9372aS周琰杰 (Zhou Yanjie) static const char *x1000_cs1_groups[] = { "emc-cs1", }; 1515b4a9372aS周琰杰 (Zhou Yanjie) static const char *x1000_cs2_groups[] = { "emc-cs2", }; 1516fe1ad5eeSZhou Yanjie static const char *x1000_i2c0_groups[] = { "i2c0-data", }; 1517fe1ad5eeSZhou Yanjie static const char *x1000_i2c1_groups[] = { "i2c1-data-a", "i2c1-data-c", }; 1518fe1ad5eeSZhou Yanjie static const char *x1000_i2c2_groups[] = { "i2c2-data", }; 1519fe1ad5eeSZhou Yanjie static const char *x1000_cim_groups[] = { "cim-data", }; 1520fe1ad5eeSZhou Yanjie static const char *x1000_lcd_groups[] = { 1521fe1ad5eeSZhou Yanjie "lcd-8bit", "lcd-16bit", "lcd-no-pins", 1522fe1ad5eeSZhou Yanjie }; 1523fe1ad5eeSZhou Yanjie static const char *x1000_pwm0_groups[] = { "pwm0", }; 1524fe1ad5eeSZhou Yanjie static const char *x1000_pwm1_groups[] = { "pwm1", }; 1525fe1ad5eeSZhou Yanjie static const char *x1000_pwm2_groups[] = { "pwm2", }; 1526fe1ad5eeSZhou Yanjie static const char *x1000_pwm3_groups[] = { "pwm3", }; 1527fe1ad5eeSZhou Yanjie static const char *x1000_pwm4_groups[] = { "pwm4", }; 1528fe1ad5eeSZhou Yanjie static const char *x1000_mac_groups[] = { "mac", }; 1529fe1ad5eeSZhou Yanjie 1530fe1ad5eeSZhou Yanjie static const struct function_desc x1000_functions[] = { 1531fe1ad5eeSZhou Yanjie { "uart0", x1000_uart0_groups, ARRAY_SIZE(x1000_uart0_groups), }, 1532fe1ad5eeSZhou Yanjie { "uart1", x1000_uart1_groups, ARRAY_SIZE(x1000_uart1_groups), }, 1533fe1ad5eeSZhou Yanjie { "uart2", x1000_uart2_groups, ARRAY_SIZE(x1000_uart2_groups), }, 15343b31e9b0S周琰杰 (Zhou Yanjie) { "sfc", x1000_sfc_groups, ARRAY_SIZE(x1000_sfc_groups), }, 15353b31e9b0S周琰杰 (Zhou Yanjie) { "ssi", x1000_ssi_groups, ARRAY_SIZE(x1000_ssi_groups), }, 1536fe1ad5eeSZhou Yanjie { "mmc0", x1000_mmc0_groups, ARRAY_SIZE(x1000_mmc0_groups), }, 1537fe1ad5eeSZhou Yanjie { "mmc1", x1000_mmc1_groups, ARRAY_SIZE(x1000_mmc1_groups), }, 1538b4a9372aS周琰杰 (Zhou Yanjie) { "emc", x1000_emc_groups, ARRAY_SIZE(x1000_emc_groups), }, 1539b4a9372aS周琰杰 (Zhou Yanjie) { "emc-cs1", x1000_cs1_groups, ARRAY_SIZE(x1000_cs1_groups), }, 1540b4a9372aS周琰杰 (Zhou Yanjie) { "emc-cs2", x1000_cs2_groups, ARRAY_SIZE(x1000_cs2_groups), }, 1541fe1ad5eeSZhou Yanjie { "i2c0", x1000_i2c0_groups, ARRAY_SIZE(x1000_i2c0_groups), }, 1542fe1ad5eeSZhou Yanjie { "i2c1", x1000_i2c1_groups, ARRAY_SIZE(x1000_i2c1_groups), }, 1543fe1ad5eeSZhou Yanjie { "i2c2", x1000_i2c2_groups, ARRAY_SIZE(x1000_i2c2_groups), }, 1544fe1ad5eeSZhou Yanjie { "cim", x1000_cim_groups, ARRAY_SIZE(x1000_cim_groups), }, 1545fe1ad5eeSZhou Yanjie { "lcd", x1000_lcd_groups, ARRAY_SIZE(x1000_lcd_groups), }, 1546fe1ad5eeSZhou Yanjie { "pwm0", x1000_pwm0_groups, ARRAY_SIZE(x1000_pwm0_groups), }, 1547fe1ad5eeSZhou Yanjie { "pwm1", x1000_pwm1_groups, ARRAY_SIZE(x1000_pwm1_groups), }, 1548fe1ad5eeSZhou Yanjie { "pwm2", x1000_pwm2_groups, ARRAY_SIZE(x1000_pwm2_groups), }, 1549fe1ad5eeSZhou Yanjie { "pwm3", x1000_pwm3_groups, ARRAY_SIZE(x1000_pwm3_groups), }, 1550fe1ad5eeSZhou Yanjie { "pwm4", x1000_pwm4_groups, ARRAY_SIZE(x1000_pwm4_groups), }, 1551fe1ad5eeSZhou Yanjie { "mac", x1000_mac_groups, ARRAY_SIZE(x1000_mac_groups), }, 1552fe1ad5eeSZhou Yanjie }; 1553fe1ad5eeSZhou Yanjie 1554fe1ad5eeSZhou Yanjie static const struct ingenic_chip_info x1000_chip_info = { 1555fe1ad5eeSZhou Yanjie .num_chips = 4, 1556f742e5ebS周琰杰 (Zhou Yanjie) .reg_offset = 0x100, 1557baf15647SPaul Cercueil .version = ID_X1000, 1558fe1ad5eeSZhou Yanjie .groups = x1000_groups, 1559fe1ad5eeSZhou Yanjie .num_groups = ARRAY_SIZE(x1000_groups), 1560fe1ad5eeSZhou Yanjie .functions = x1000_functions, 1561fe1ad5eeSZhou Yanjie .num_functions = ARRAY_SIZE(x1000_functions), 1562fe1ad5eeSZhou Yanjie .pull_ups = x1000_pull_ups, 1563fe1ad5eeSZhou Yanjie .pull_downs = x1000_pull_downs, 1564fe1ad5eeSZhou Yanjie }; 1565fe1ad5eeSZhou Yanjie 15665d21595bSZhou Yanjie static int x1500_uart0_data_pins[] = { 0x4a, 0x4b, }; 15675d21595bSZhou Yanjie static int x1500_uart0_hwflow_pins[] = { 0x4c, 0x4d, }; 15685d21595bSZhou Yanjie static int x1500_uart1_data_a_pins[] = { 0x04, 0x05, }; 15695d21595bSZhou Yanjie static int x1500_uart1_data_d_pins[] = { 0x62, 0x63, }; 1570b4a9372aS周琰杰 (Zhou Yanjie) static int x1500_uart1_hwflow_pins[] = { 0x64, 0x65, }; 15715d21595bSZhou Yanjie static int x1500_uart2_data_a_pins[] = { 0x02, 0x03, }; 15725d21595bSZhou Yanjie static int x1500_uart2_data_d_pins[] = { 0x65, 0x64, }; 1573b4a9372aS周琰杰 (Zhou Yanjie) static int x1500_mmc_1bit_pins[] = { 0x18, 0x19, 0x17, }; 1574b4a9372aS周琰杰 (Zhou Yanjie) static int x1500_mmc_4bit_pins[] = { 0x16, 0x15, 0x14, }; 15755d21595bSZhou Yanjie static int x1500_i2c0_pins[] = { 0x38, 0x37, }; 15765d21595bSZhou Yanjie static int x1500_i2c1_a_pins[] = { 0x01, 0x00, }; 15775d21595bSZhou Yanjie static int x1500_i2c1_c_pins[] = { 0x5b, 0x5a, }; 15785d21595bSZhou Yanjie static int x1500_i2c2_pins[] = { 0x61, 0x60, }; 15795d21595bSZhou Yanjie static int x1500_cim_pins[] = { 15805d21595bSZhou Yanjie 0x08, 0x09, 0x0a, 0x0b, 15815d21595bSZhou Yanjie 0x13, 0x12, 0x11, 0x10, 0x0f, 0x0e, 0x0d, 0x0c, 15825d21595bSZhou Yanjie }; 15835d21595bSZhou Yanjie static int x1500_pwm_pwm0_pins[] = { 0x59, }; 15845d21595bSZhou Yanjie static int x1500_pwm_pwm1_pins[] = { 0x5a, }; 15855d21595bSZhou Yanjie static int x1500_pwm_pwm2_pins[] = { 0x5b, }; 15865d21595bSZhou Yanjie static int x1500_pwm_pwm3_pins[] = { 0x26, }; 15875d21595bSZhou Yanjie static int x1500_pwm_pwm4_pins[] = { 0x58, }; 15885d21595bSZhou Yanjie 15895d21595bSZhou Yanjie static int x1500_uart0_data_funcs[] = { 0, 0, }; 15905d21595bSZhou Yanjie static int x1500_uart0_hwflow_funcs[] = { 0, 0, }; 15915d21595bSZhou Yanjie static int x1500_uart1_data_a_funcs[] = { 2, 2, }; 15925d21595bSZhou Yanjie static int x1500_uart1_data_d_funcs[] = { 1, 1, }; 1593b4a9372aS周琰杰 (Zhou Yanjie) static int x1500_uart1_hwflow_funcs[] = { 1, 1, }; 15945d21595bSZhou Yanjie static int x1500_uart2_data_a_funcs[] = { 2, 2, }; 15955d21595bSZhou Yanjie static int x1500_uart2_data_d_funcs[] = { 0, 0, }; 1596b4a9372aS周琰杰 (Zhou Yanjie) static int x1500_mmc_1bit_funcs[] = { 1, 1, 1, }; 1597b4a9372aS周琰杰 (Zhou Yanjie) static int x1500_mmc_4bit_funcs[] = { 1, 1, 1, }; 15985d21595bSZhou Yanjie static int x1500_i2c0_funcs[] = { 0, 0, }; 15995d21595bSZhou Yanjie static int x1500_i2c1_a_funcs[] = { 2, 2, }; 16005d21595bSZhou Yanjie static int x1500_i2c1_c_funcs[] = { 0, 0, }; 16015d21595bSZhou Yanjie static int x1500_i2c2_funcs[] = { 1, 1, }; 16025d21595bSZhou Yanjie static int x1500_cim_funcs[] = { 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, }; 16035d21595bSZhou Yanjie static int x1500_pwm_pwm0_funcs[] = { 0, }; 16045d21595bSZhou Yanjie static int x1500_pwm_pwm1_funcs[] = { 1, }; 16055d21595bSZhou Yanjie static int x1500_pwm_pwm2_funcs[] = { 1, }; 16065d21595bSZhou Yanjie static int x1500_pwm_pwm3_funcs[] = { 2, }; 16075d21595bSZhou Yanjie static int x1500_pwm_pwm4_funcs[] = { 0, }; 16085d21595bSZhou Yanjie 16095d21595bSZhou Yanjie static const struct group_desc x1500_groups[] = { 16105d21595bSZhou Yanjie INGENIC_PIN_GROUP("uart0-data", x1500_uart0_data), 16115d21595bSZhou Yanjie INGENIC_PIN_GROUP("uart0-hwflow", x1500_uart0_hwflow), 16125d21595bSZhou Yanjie INGENIC_PIN_GROUP("uart1-data-a", x1500_uart1_data_a), 16135d21595bSZhou Yanjie INGENIC_PIN_GROUP("uart1-data-d", x1500_uart1_data_d), 1614b4a9372aS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("uart1-hwflow", x1500_uart1_hwflow), 16155d21595bSZhou Yanjie INGENIC_PIN_GROUP("uart2-data-a", x1500_uart2_data_a), 16165d21595bSZhou Yanjie INGENIC_PIN_GROUP("uart2-data-d", x1500_uart2_data_d), 16173b31e9b0S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("sfc", x1000_sfc), 1618b4a9372aS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("mmc-1bit", x1500_mmc_1bit), 1619b4a9372aS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("mmc-4bit", x1500_mmc_4bit), 16205d21595bSZhou Yanjie INGENIC_PIN_GROUP("i2c0-data", x1500_i2c0), 16215d21595bSZhou Yanjie INGENIC_PIN_GROUP("i2c1-data-a", x1500_i2c1_a), 16225d21595bSZhou Yanjie INGENIC_PIN_GROUP("i2c1-data-c", x1500_i2c1_c), 16235d21595bSZhou Yanjie INGENIC_PIN_GROUP("i2c2-data", x1500_i2c2), 16245d21595bSZhou Yanjie INGENIC_PIN_GROUP("cim-data", x1500_cim), 16255d21595bSZhou Yanjie { "lcd-no-pins", }, 16265d21595bSZhou Yanjie INGENIC_PIN_GROUP("pwm0", x1500_pwm_pwm0), 16275d21595bSZhou Yanjie INGENIC_PIN_GROUP("pwm1", x1500_pwm_pwm1), 16285d21595bSZhou Yanjie INGENIC_PIN_GROUP("pwm2", x1500_pwm_pwm2), 16295d21595bSZhou Yanjie INGENIC_PIN_GROUP("pwm3", x1500_pwm_pwm3), 16305d21595bSZhou Yanjie INGENIC_PIN_GROUP("pwm4", x1500_pwm_pwm4), 16315d21595bSZhou Yanjie }; 16325d21595bSZhou Yanjie 16335d21595bSZhou Yanjie static const char *x1500_uart0_groups[] = { "uart0-data", "uart0-hwflow", }; 16345d21595bSZhou Yanjie static const char *x1500_uart1_groups[] = { 1635b4a9372aS周琰杰 (Zhou Yanjie) "uart1-data-a", "uart1-data-d", "uart1-hwflow", 16365d21595bSZhou Yanjie }; 16375d21595bSZhou Yanjie static const char *x1500_uart2_groups[] = { "uart2-data-a", "uart2-data-d", }; 1638b4a9372aS周琰杰 (Zhou Yanjie) static const char *x1500_mmc_groups[] = { "mmc-1bit", "mmc-4bit", }; 16395d21595bSZhou Yanjie static const char *x1500_i2c0_groups[] = { "i2c0-data", }; 16405d21595bSZhou Yanjie static const char *x1500_i2c1_groups[] = { "i2c1-data-a", "i2c1-data-c", }; 16415d21595bSZhou Yanjie static const char *x1500_i2c2_groups[] = { "i2c2-data", }; 16425d21595bSZhou Yanjie static const char *x1500_cim_groups[] = { "cim-data", }; 16435d21595bSZhou Yanjie static const char *x1500_lcd_groups[] = { "lcd-no-pins", }; 16445d21595bSZhou Yanjie static const char *x1500_pwm0_groups[] = { "pwm0", }; 16455d21595bSZhou Yanjie static const char *x1500_pwm1_groups[] = { "pwm1", }; 16465d21595bSZhou Yanjie static const char *x1500_pwm2_groups[] = { "pwm2", }; 16475d21595bSZhou Yanjie static const char *x1500_pwm3_groups[] = { "pwm3", }; 16485d21595bSZhou Yanjie static const char *x1500_pwm4_groups[] = { "pwm4", }; 16495d21595bSZhou Yanjie 16505d21595bSZhou Yanjie static const struct function_desc x1500_functions[] = { 16515d21595bSZhou Yanjie { "uart0", x1500_uart0_groups, ARRAY_SIZE(x1500_uart0_groups), }, 16525d21595bSZhou Yanjie { "uart1", x1500_uart1_groups, ARRAY_SIZE(x1500_uart1_groups), }, 16535d21595bSZhou Yanjie { "uart2", x1500_uart2_groups, ARRAY_SIZE(x1500_uart2_groups), }, 16543b31e9b0S周琰杰 (Zhou Yanjie) { "sfc", x1000_sfc_groups, ARRAY_SIZE(x1000_sfc_groups), }, 1655b4a9372aS周琰杰 (Zhou Yanjie) { "mmc", x1500_mmc_groups, ARRAY_SIZE(x1500_mmc_groups), }, 16565d21595bSZhou Yanjie { "i2c0", x1500_i2c0_groups, ARRAY_SIZE(x1500_i2c0_groups), }, 16575d21595bSZhou Yanjie { "i2c1", x1500_i2c1_groups, ARRAY_SIZE(x1500_i2c1_groups), }, 16585d21595bSZhou Yanjie { "i2c2", x1500_i2c2_groups, ARRAY_SIZE(x1500_i2c2_groups), }, 16595d21595bSZhou Yanjie { "cim", x1500_cim_groups, ARRAY_SIZE(x1500_cim_groups), }, 16605d21595bSZhou Yanjie { "lcd", x1500_lcd_groups, ARRAY_SIZE(x1500_lcd_groups), }, 16615d21595bSZhou Yanjie { "pwm0", x1500_pwm0_groups, ARRAY_SIZE(x1500_pwm0_groups), }, 16625d21595bSZhou Yanjie { "pwm1", x1500_pwm1_groups, ARRAY_SIZE(x1500_pwm1_groups), }, 16635d21595bSZhou Yanjie { "pwm2", x1500_pwm2_groups, ARRAY_SIZE(x1500_pwm2_groups), }, 16645d21595bSZhou Yanjie { "pwm3", x1500_pwm3_groups, ARRAY_SIZE(x1500_pwm3_groups), }, 16655d21595bSZhou Yanjie { "pwm4", x1500_pwm4_groups, ARRAY_SIZE(x1500_pwm4_groups), }, 16665d21595bSZhou Yanjie }; 16675d21595bSZhou Yanjie 16685d21595bSZhou Yanjie static const struct ingenic_chip_info x1500_chip_info = { 16695d21595bSZhou Yanjie .num_chips = 4, 1670f742e5ebS周琰杰 (Zhou Yanjie) .reg_offset = 0x100, 1671baf15647SPaul Cercueil .version = ID_X1500, 16725d21595bSZhou Yanjie .groups = x1500_groups, 16735d21595bSZhou Yanjie .num_groups = ARRAY_SIZE(x1500_groups), 16745d21595bSZhou Yanjie .functions = x1500_functions, 16755d21595bSZhou Yanjie .num_functions = ARRAY_SIZE(x1500_functions), 16765d21595bSZhou Yanjie .pull_ups = x1000_pull_ups, 16775d21595bSZhou Yanjie .pull_downs = x1000_pull_downs, 16785d21595bSZhou Yanjie }; 16795d21595bSZhou Yanjie 1680d7da2a1eS周琰杰 (Zhou Yanjie) static const u32 x1830_pull_ups[4] = { 1681d7da2a1eS周琰杰 (Zhou Yanjie) 0x5fdfffc0, 0xffffefff, 0x1ffffbff, 0x0fcff3fc, 1682d7da2a1eS周琰杰 (Zhou Yanjie) }; 1683d7da2a1eS周琰杰 (Zhou Yanjie) 1684d7da2a1eS周琰杰 (Zhou Yanjie) static const u32 x1830_pull_downs[4] = { 1685d7da2a1eS周琰杰 (Zhou Yanjie) 0x5fdfffc0, 0xffffefff, 0x1ffffbff, 0x0fcff3fc, 1686d7da2a1eS周琰杰 (Zhou Yanjie) }; 1687d7da2a1eS周琰杰 (Zhou Yanjie) 1688d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_uart0_data_pins[] = { 0x33, 0x36, }; 1689d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_uart0_hwflow_pins[] = { 0x34, 0x35, }; 1690d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_uart1_data_pins[] = { 0x38, 0x37, }; 1691d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_sfc_pins[] = { 0x17, 0x18, 0x1a, 0x19, 0x1b, 0x1c, }; 1692d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_ssi0_dt_pins[] = { 0x4c, }; 1693d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_ssi0_dr_pins[] = { 0x4b, }; 1694d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_ssi0_clk_pins[] = { 0x4f, }; 1695d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_ssi0_gpc_pins[] = { 0x4d, }; 1696d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_ssi0_ce0_pins[] = { 0x50, }; 1697d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_ssi0_ce1_pins[] = { 0x4e, }; 1698d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_ssi1_dt_c_pins[] = { 0x53, }; 1699d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_ssi1_dr_c_pins[] = { 0x54, }; 1700d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_ssi1_clk_c_pins[] = { 0x57, }; 1701d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_ssi1_gpc_c_pins[] = { 0x55, }; 1702d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_ssi1_ce0_c_pins[] = { 0x58, }; 1703d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_ssi1_ce1_c_pins[] = { 0x56, }; 1704d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_ssi1_dt_d_pins[] = { 0x62, }; 1705d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_ssi1_dr_d_pins[] = { 0x63, }; 1706d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_ssi1_clk_d_pins[] = { 0x66, }; 1707d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_ssi1_gpc_d_pins[] = { 0x64, }; 1708d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_ssi1_ce0_d_pins[] = { 0x67, }; 1709d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_ssi1_ce1_d_pins[] = { 0x65, }; 1710d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_mmc0_1bit_pins[] = { 0x24, 0x25, 0x20, }; 1711d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_mmc0_4bit_pins[] = { 0x21, 0x22, 0x23, }; 1712d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_mmc1_1bit_pins[] = { 0x42, 0x43, 0x44, }; 1713d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_mmc1_4bit_pins[] = { 0x45, 0x46, 0x47, }; 1714d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_i2c0_pins[] = { 0x0c, 0x0d, }; 1715d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_i2c1_pins[] = { 0x39, 0x3a, }; 1716d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_i2c2_pins[] = { 0x5b, 0x5c, }; 1717b2954743S周琰杰 (Zhou Yanjie) static int x1830_lcd_rgb_18bit_pins[] = { 1718b2954743S周琰杰 (Zhou Yanjie) 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 1719b2954743S周琰杰 (Zhou Yanjie) 0x68, 0x69, 0x6c, 0x6d, 0x6e, 0x6f, 1720b2954743S周琰杰 (Zhou Yanjie) 0x70, 0x71, 0x72, 0x73, 0x76, 0x77, 1721b2954743S周琰杰 (Zhou Yanjie) 0x78, 0x79, 0x7a, 0x7b, 1722b2954743S周琰杰 (Zhou Yanjie) }; 1723b2954743S周琰杰 (Zhou Yanjie) static int x1830_lcd_slcd_8bit_pins[] = { 1724b2954743S周琰杰 (Zhou Yanjie) 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x6c, 0x6d, 1725b2954743S周琰杰 (Zhou Yanjie) 0x69, 0x72, 0x73, 0x7b, 0x7a, 1726b2954743S周琰杰 (Zhou Yanjie) }; 1727b2954743S周琰杰 (Zhou Yanjie) static int x1830_lcd_slcd_16bit_pins[] = { 1728b2954743S周琰杰 (Zhou Yanjie) 0x6e, 0x6f, 0x70, 0x71, 0x76, 0x77, 0x78, 0x79, 1729b2954743S周琰杰 (Zhou Yanjie) }; 1730d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_pwm_pwm0_b_pins[] = { 0x31, }; 1731d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_pwm_pwm0_c_pins[] = { 0x4b, }; 1732d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_pwm_pwm1_b_pins[] = { 0x32, }; 1733d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_pwm_pwm1_c_pins[] = { 0x4c, }; 1734d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_pwm_pwm2_c_8_pins[] = { 0x48, }; 1735d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_pwm_pwm2_c_13_pins[] = { 0x4d, }; 1736d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_pwm_pwm3_c_9_pins[] = { 0x49, }; 1737d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_pwm_pwm3_c_14_pins[] = { 0x4e, }; 1738d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_pwm_pwm4_c_15_pins[] = { 0x4f, }; 1739d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_pwm_pwm4_c_25_pins[] = { 0x59, }; 1740d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_pwm_pwm5_c_16_pins[] = { 0x50, }; 1741d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_pwm_pwm5_c_26_pins[] = { 0x5a, }; 1742d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_pwm_pwm6_c_17_pins[] = { 0x51, }; 1743d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_pwm_pwm6_c_27_pins[] = { 0x5b, }; 1744d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_pwm_pwm7_c_18_pins[] = { 0x52, }; 1745d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_pwm_pwm7_c_28_pins[] = { 0x5c, }; 1746d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_mac_pins[] = { 1747d7da2a1eS周琰杰 (Zhou Yanjie) 0x29, 0x30, 0x2f, 0x28, 0x2e, 0x2d, 0x2a, 0x2b, 0x26, 0x27, 1748d7da2a1eS周琰杰 (Zhou Yanjie) }; 1749d7da2a1eS周琰杰 (Zhou Yanjie) 1750d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_uart0_data_funcs[] = { 0, 0, }; 1751d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_uart0_hwflow_funcs[] = { 0, 0, }; 1752d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_uart1_data_funcs[] = { 0, 0, }; 1753d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_sfc_funcs[] = { 1, 1, 1, 1, 1, 1, }; 1754d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_ssi0_dt_funcs[] = { 0, }; 1755d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_ssi0_dr_funcs[] = { 0, }; 1756d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_ssi0_clk_funcs[] = { 0, }; 1757d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_ssi0_gpc_funcs[] = { 0, }; 1758d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_ssi0_ce0_funcs[] = { 0, }; 1759d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_ssi0_ce1_funcs[] = { 0, }; 1760d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_ssi1_dt_c_funcs[] = { 1, }; 1761d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_ssi1_dr_c_funcs[] = { 1, }; 1762d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_ssi1_clk_c_funcs[] = { 1, }; 1763d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_ssi1_gpc_c_funcs[] = { 1, }; 1764d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_ssi1_ce0_c_funcs[] = { 1, }; 1765d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_ssi1_ce1_c_funcs[] = { 1, }; 1766d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_ssi1_dt_d_funcs[] = { 2, }; 1767d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_ssi1_dr_d_funcs[] = { 2, }; 1768d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_ssi1_clk_d_funcs[] = { 2, }; 1769d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_ssi1_gpc_d_funcs[] = { 2, }; 1770d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_ssi1_ce0_d_funcs[] = { 2, }; 1771d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_ssi1_ce1_d_funcs[] = { 2, }; 1772d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_mmc0_1bit_funcs[] = { 0, 0, 0, }; 1773d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_mmc0_4bit_funcs[] = { 0, 0, 0, }; 1774d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_mmc1_1bit_funcs[] = { 0, 0, 0, }; 1775d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_mmc1_4bit_funcs[] = { 0, 0, 0, }; 1776d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_i2c0_funcs[] = { 1, 1, }; 1777d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_i2c1_funcs[] = { 0, 0, }; 1778d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_i2c2_funcs[] = { 1, 1, }; 1779b2954743S周琰杰 (Zhou Yanjie) static int x1830_lcd_rgb_18bit_funcs[] = { 1780b2954743S周琰杰 (Zhou Yanjie) 0, 0, 0, 0, 0, 0, 1781b2954743S周琰杰 (Zhou Yanjie) 0, 0, 0, 0, 0, 0, 1782b2954743S周琰杰 (Zhou Yanjie) 0, 0, 0, 0, 0, 0, 1783b2954743S周琰杰 (Zhou Yanjie) 0, 0, 0, 0, 1784b2954743S周琰杰 (Zhou Yanjie) }; 1785b2954743S周琰杰 (Zhou Yanjie) static int x1830_lcd_slcd_8bit_funcs[] = { 1786b2954743S周琰杰 (Zhou Yanjie) 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1787b2954743S周琰杰 (Zhou Yanjie) }; 1788b2954743S周琰杰 (Zhou Yanjie) static int x1830_lcd_slcd_16bit_funcs[] = { 1, 1, 1, 1, 1, 1, 1, 1, }; 1789d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_pwm_pwm0_b_funcs[] = { 0, }; 1790d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_pwm_pwm0_c_funcs[] = { 1, }; 1791d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_pwm_pwm1_b_funcs[] = { 0, }; 1792d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_pwm_pwm1_c_funcs[] = { 1, }; 1793d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_pwm_pwm2_c_8_funcs[] = { 0, }; 1794d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_pwm_pwm2_c_13_funcs[] = { 1, }; 1795d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_pwm_pwm3_c_9_funcs[] = { 0, }; 1796d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_pwm_pwm3_c_14_funcs[] = { 1, }; 1797d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_pwm_pwm4_c_15_funcs[] = { 1, }; 1798d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_pwm_pwm4_c_25_funcs[] = { 0, }; 1799d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_pwm_pwm5_c_16_funcs[] = { 1, }; 1800d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_pwm_pwm5_c_26_funcs[] = { 0, }; 1801d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_pwm_pwm6_c_17_funcs[] = { 1, }; 1802d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_pwm_pwm6_c_27_funcs[] = { 0, }; 1803d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_pwm_pwm7_c_18_funcs[] = { 1, }; 1804d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_pwm_pwm7_c_28_funcs[] = { 0, }; 1805d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_mac_funcs[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; 1806d7da2a1eS周琰杰 (Zhou Yanjie) 1807d7da2a1eS周琰杰 (Zhou Yanjie) static const struct group_desc x1830_groups[] = { 1808d7da2a1eS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("uart0-data", x1830_uart0_data), 1809d7da2a1eS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("uart0-hwflow", x1830_uart0_hwflow), 1810d7da2a1eS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("uart1-data", x1830_uart1_data), 1811d7da2a1eS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("sfc", x1830_sfc), 1812d7da2a1eS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi0-dt", x1830_ssi0_dt), 1813d7da2a1eS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi0-dr", x1830_ssi0_dr), 1814d7da2a1eS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi0-clk", x1830_ssi0_clk), 1815d7da2a1eS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi0-gpc", x1830_ssi0_gpc), 1816d7da2a1eS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi0-ce0", x1830_ssi0_ce0), 1817d7da2a1eS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi0-ce1", x1830_ssi0_ce1), 1818d7da2a1eS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi1-dt-c", x1830_ssi1_dt_c), 1819d7da2a1eS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi1-dr-c", x1830_ssi1_dr_c), 1820d7da2a1eS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi1-clk-c", x1830_ssi1_clk_c), 1821d7da2a1eS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi1-gpc-c", x1830_ssi1_gpc_c), 1822d7da2a1eS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi1-ce0-c", x1830_ssi1_ce0_c), 1823d7da2a1eS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi1-ce1-c", x1830_ssi1_ce1_c), 1824d7da2a1eS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi1-dt-d", x1830_ssi1_dt_d), 1825d7da2a1eS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi1-dr-d", x1830_ssi1_dr_d), 1826d7da2a1eS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi1-clk-d", x1830_ssi1_clk_d), 1827d7da2a1eS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi1-gpc-d", x1830_ssi1_gpc_d), 1828d7da2a1eS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi1-ce0-d", x1830_ssi1_ce0_d), 1829d7da2a1eS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("ssi1-ce1-d", x1830_ssi1_ce1_d), 1830d7da2a1eS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("mmc0-1bit", x1830_mmc0_1bit), 1831d7da2a1eS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("mmc0-4bit", x1830_mmc0_4bit), 1832d7da2a1eS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("mmc1-1bit", x1830_mmc1_1bit), 1833d7da2a1eS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("mmc1-4bit", x1830_mmc1_4bit), 1834d7da2a1eS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("i2c0-data", x1830_i2c0), 1835d7da2a1eS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("i2c1-data", x1830_i2c1), 1836d7da2a1eS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("i2c2-data", x1830_i2c2), 1837b2954743S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("lcd-rgb-18bit", x1830_lcd_rgb_18bit), 1838b2954743S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("lcd-slcd-8bit", x1830_lcd_slcd_8bit), 1839b2954743S周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("lcd-slcd-16bit", x1830_lcd_slcd_16bit), 1840b2954743S周琰杰 (Zhou Yanjie) { "lcd-no-pins", }, 1841d7da2a1eS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("pwm0-b", x1830_pwm_pwm0_b), 1842d7da2a1eS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("pwm0-c", x1830_pwm_pwm0_c), 1843d7da2a1eS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("pwm1-b", x1830_pwm_pwm1_b), 1844d7da2a1eS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("pwm1-c", x1830_pwm_pwm1_c), 1845d7da2a1eS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("pwm2-c-8", x1830_pwm_pwm2_c_8), 1846d7da2a1eS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("pwm2-c-13", x1830_pwm_pwm2_c_13), 1847d7da2a1eS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("pwm3-c-9", x1830_pwm_pwm3_c_9), 1848d7da2a1eS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("pwm3-c-14", x1830_pwm_pwm3_c_14), 1849d7da2a1eS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("pwm4-c-15", x1830_pwm_pwm4_c_15), 1850d7da2a1eS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("pwm4-c-25", x1830_pwm_pwm4_c_25), 1851d7da2a1eS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("pwm5-c-16", x1830_pwm_pwm5_c_16), 1852d7da2a1eS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("pwm5-c-26", x1830_pwm_pwm5_c_26), 1853d7da2a1eS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("pwm6-c-17", x1830_pwm_pwm6_c_17), 1854d7da2a1eS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("pwm6-c-27", x1830_pwm_pwm6_c_27), 1855d7da2a1eS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("pwm7-c-18", x1830_pwm_pwm7_c_18), 1856d7da2a1eS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("pwm7-c-28", x1830_pwm_pwm7_c_28), 1857d7da2a1eS周琰杰 (Zhou Yanjie) INGENIC_PIN_GROUP("mac", x1830_mac), 1858d7da2a1eS周琰杰 (Zhou Yanjie) }; 1859d7da2a1eS周琰杰 (Zhou Yanjie) 1860d7da2a1eS周琰杰 (Zhou Yanjie) static const char *x1830_uart0_groups[] = { "uart0-data", "uart0-hwflow", }; 1861d7da2a1eS周琰杰 (Zhou Yanjie) static const char *x1830_uart1_groups[] = { "uart1-data", }; 1862d7da2a1eS周琰杰 (Zhou Yanjie) static const char *x1830_sfc_groups[] = { "sfc", }; 1863d7da2a1eS周琰杰 (Zhou Yanjie) static const char *x1830_ssi0_groups[] = { 1864d7da2a1eS周琰杰 (Zhou Yanjie) "ssi0-dt", "ssi0-dr", "ssi0-clk", "ssi0-gpc", "ssi0-ce0", "ssi0-ce1", 1865d7da2a1eS周琰杰 (Zhou Yanjie) }; 1866d7da2a1eS周琰杰 (Zhou Yanjie) static const char *x1830_ssi1_groups[] = { 1867d7da2a1eS周琰杰 (Zhou Yanjie) "ssi1-dt-c", "ssi1-dt-d", 1868d7da2a1eS周琰杰 (Zhou Yanjie) "ssi1-dr-c", "ssi1-dr-d", 1869d7da2a1eS周琰杰 (Zhou Yanjie) "ssi1-clk-c", "ssi1-clk-d", 1870d7da2a1eS周琰杰 (Zhou Yanjie) "ssi1-gpc-c", "ssi1-gpc-d", 1871d7da2a1eS周琰杰 (Zhou Yanjie) "ssi1-ce0-c", "ssi1-ce0-d", 1872d7da2a1eS周琰杰 (Zhou Yanjie) "ssi1-ce1-c", "ssi1-ce1-d", 1873d7da2a1eS周琰杰 (Zhou Yanjie) }; 1874d7da2a1eS周琰杰 (Zhou Yanjie) static const char *x1830_mmc0_groups[] = { "mmc0-1bit", "mmc0-4bit", }; 1875d7da2a1eS周琰杰 (Zhou Yanjie) static const char *x1830_mmc1_groups[] = { "mmc1-1bit", "mmc1-4bit", }; 1876d7da2a1eS周琰杰 (Zhou Yanjie) static const char *x1830_i2c0_groups[] = { "i2c0-data", }; 1877d7da2a1eS周琰杰 (Zhou Yanjie) static const char *x1830_i2c1_groups[] = { "i2c1-data", }; 1878d7da2a1eS周琰杰 (Zhou Yanjie) static const char *x1830_i2c2_groups[] = { "i2c2-data", }; 1879b2954743S周琰杰 (Zhou Yanjie) static const char *x1830_lcd_groups[] = { 1880b2954743S周琰杰 (Zhou Yanjie) "lcd-rgb-18bit", "lcd-slcd-8bit", "lcd-slcd-16bit", "lcd-no-pins", 1881b2954743S周琰杰 (Zhou Yanjie) }; 1882d7da2a1eS周琰杰 (Zhou Yanjie) static const char *x1830_pwm0_groups[] = { "pwm0-b", "pwm0-c", }; 1883d7da2a1eS周琰杰 (Zhou Yanjie) static const char *x1830_pwm1_groups[] = { "pwm1-b", "pwm1-c", }; 1884d7da2a1eS周琰杰 (Zhou Yanjie) static const char *x1830_pwm2_groups[] = { "pwm2-c-8", "pwm2-c-13", }; 1885d7da2a1eS周琰杰 (Zhou Yanjie) static const char *x1830_pwm3_groups[] = { "pwm3-c-9", "pwm3-c-14", }; 1886d7da2a1eS周琰杰 (Zhou Yanjie) static const char *x1830_pwm4_groups[] = { "pwm4-c-15", "pwm4-c-25", }; 1887d7da2a1eS周琰杰 (Zhou Yanjie) static const char *x1830_pwm5_groups[] = { "pwm5-c-16", "pwm5-c-26", }; 1888d7da2a1eS周琰杰 (Zhou Yanjie) static const char *x1830_pwm6_groups[] = { "pwm6-c-17", "pwm6-c-27", }; 1889d7da2a1eS周琰杰 (Zhou Yanjie) static const char *x1830_pwm7_groups[] = { "pwm7-c-18", "pwm7-c-28", }; 1890d7da2a1eS周琰杰 (Zhou Yanjie) static const char *x1830_mac_groups[] = { "mac", }; 1891d7da2a1eS周琰杰 (Zhou Yanjie) 1892d7da2a1eS周琰杰 (Zhou Yanjie) static const struct function_desc x1830_functions[] = { 1893d7da2a1eS周琰杰 (Zhou Yanjie) { "uart0", x1830_uart0_groups, ARRAY_SIZE(x1830_uart0_groups), }, 1894d7da2a1eS周琰杰 (Zhou Yanjie) { "uart1", x1830_uart1_groups, ARRAY_SIZE(x1830_uart1_groups), }, 1895d7da2a1eS周琰杰 (Zhou Yanjie) { "sfc", x1830_sfc_groups, ARRAY_SIZE(x1830_sfc_groups), }, 1896d7da2a1eS周琰杰 (Zhou Yanjie) { "ssi0", x1830_ssi0_groups, ARRAY_SIZE(x1830_ssi0_groups), }, 1897d7da2a1eS周琰杰 (Zhou Yanjie) { "ssi1", x1830_ssi1_groups, ARRAY_SIZE(x1830_ssi1_groups), }, 1898d7da2a1eS周琰杰 (Zhou Yanjie) { "mmc0", x1830_mmc0_groups, ARRAY_SIZE(x1830_mmc0_groups), }, 1899d7da2a1eS周琰杰 (Zhou Yanjie) { "mmc1", x1830_mmc1_groups, ARRAY_SIZE(x1830_mmc1_groups), }, 1900d7da2a1eS周琰杰 (Zhou Yanjie) { "i2c0", x1830_i2c0_groups, ARRAY_SIZE(x1830_i2c0_groups), }, 1901d7da2a1eS周琰杰 (Zhou Yanjie) { "i2c1", x1830_i2c1_groups, ARRAY_SIZE(x1830_i2c1_groups), }, 1902d7da2a1eS周琰杰 (Zhou Yanjie) { "i2c2", x1830_i2c2_groups, ARRAY_SIZE(x1830_i2c2_groups), }, 1903b2954743S周琰杰 (Zhou Yanjie) { "lcd", x1830_lcd_groups, ARRAY_SIZE(x1830_lcd_groups), }, 1904d7da2a1eS周琰杰 (Zhou Yanjie) { "pwm0", x1830_pwm0_groups, ARRAY_SIZE(x1830_pwm0_groups), }, 1905d7da2a1eS周琰杰 (Zhou Yanjie) { "pwm1", x1830_pwm1_groups, ARRAY_SIZE(x1830_pwm1_groups), }, 1906d7da2a1eS周琰杰 (Zhou Yanjie) { "pwm2", x1830_pwm2_groups, ARRAY_SIZE(x1830_pwm2_groups), }, 1907d7da2a1eS周琰杰 (Zhou Yanjie) { "pwm3", x1830_pwm3_groups, ARRAY_SIZE(x1830_pwm3_groups), }, 1908d7da2a1eS周琰杰 (Zhou Yanjie) { "pwm4", x1830_pwm4_groups, ARRAY_SIZE(x1830_pwm4_groups), }, 1909d7da2a1eS周琰杰 (Zhou Yanjie) { "pwm5", x1830_pwm5_groups, ARRAY_SIZE(x1830_pwm4_groups), }, 1910d7da2a1eS周琰杰 (Zhou Yanjie) { "pwm6", x1830_pwm6_groups, ARRAY_SIZE(x1830_pwm4_groups), }, 1911d7da2a1eS周琰杰 (Zhou Yanjie) { "pwm7", x1830_pwm7_groups, ARRAY_SIZE(x1830_pwm4_groups), }, 1912d7da2a1eS周琰杰 (Zhou Yanjie) { "mac", x1830_mac_groups, ARRAY_SIZE(x1830_mac_groups), }, 1913d7da2a1eS周琰杰 (Zhou Yanjie) }; 1914d7da2a1eS周琰杰 (Zhou Yanjie) 1915d7da2a1eS周琰杰 (Zhou Yanjie) static const struct ingenic_chip_info x1830_chip_info = { 1916d7da2a1eS周琰杰 (Zhou Yanjie) .num_chips = 4, 1917d7da2a1eS周琰杰 (Zhou Yanjie) .reg_offset = 0x1000, 1918baf15647SPaul Cercueil .version = ID_X1830, 1919d7da2a1eS周琰杰 (Zhou Yanjie) .groups = x1830_groups, 1920d7da2a1eS周琰杰 (Zhou Yanjie) .num_groups = ARRAY_SIZE(x1830_groups), 1921d7da2a1eS周琰杰 (Zhou Yanjie) .functions = x1830_functions, 1922d7da2a1eS周琰杰 (Zhou Yanjie) .num_functions = ARRAY_SIZE(x1830_functions), 1923d7da2a1eS周琰杰 (Zhou Yanjie) .pull_ups = x1830_pull_ups, 1924d7da2a1eS周琰杰 (Zhou Yanjie) .pull_downs = x1830_pull_downs, 1925d7da2a1eS周琰杰 (Zhou Yanjie) }; 1926d7da2a1eS周琰杰 (Zhou Yanjie) 1927b71c1844SZhou Yanjie static u32 ingenic_gpio_read_reg(struct ingenic_gpio_chip *jzgc, u8 reg) 1928e72394e2SPaul Cercueil { 1929e72394e2SPaul Cercueil unsigned int val; 1930e72394e2SPaul Cercueil 1931e72394e2SPaul Cercueil regmap_read(jzgc->jzpc->map, jzgc->reg_base + reg, &val); 1932e72394e2SPaul Cercueil 1933e72394e2SPaul Cercueil return (u32) val; 1934e72394e2SPaul Cercueil } 1935e72394e2SPaul Cercueil 1936b71c1844SZhou Yanjie static void ingenic_gpio_set_bit(struct ingenic_gpio_chip *jzgc, 1937e72394e2SPaul Cercueil u8 reg, u8 offset, bool set) 1938e72394e2SPaul Cercueil { 1939e72394e2SPaul Cercueil if (set) 1940e72394e2SPaul Cercueil reg = REG_SET(reg); 1941e72394e2SPaul Cercueil else 1942e72394e2SPaul Cercueil reg = REG_CLEAR(reg); 1943e72394e2SPaul Cercueil 1944e72394e2SPaul Cercueil regmap_write(jzgc->jzpc->map, jzgc->reg_base + reg, BIT(offset)); 1945e72394e2SPaul Cercueil } 1946e72394e2SPaul Cercueil 1947fe1ad5eeSZhou Yanjie static void ingenic_gpio_shadow_set_bit(struct ingenic_gpio_chip *jzgc, 1948fe1ad5eeSZhou Yanjie u8 reg, u8 offset, bool set) 1949fe1ad5eeSZhou Yanjie { 1950fe1ad5eeSZhou Yanjie if (set) 1951fe1ad5eeSZhou Yanjie reg = REG_SET(reg); 1952fe1ad5eeSZhou Yanjie else 1953fe1ad5eeSZhou Yanjie reg = REG_CLEAR(reg); 1954fe1ad5eeSZhou Yanjie 1955d7da2a1eS周琰杰 (Zhou Yanjie) regmap_write(jzgc->jzpc->map, REG_PZ_BASE( 1956d7da2a1eS周琰杰 (Zhou Yanjie) jzgc->jzpc->info->reg_offset) + reg, BIT(offset)); 1957fe1ad5eeSZhou Yanjie } 1958fe1ad5eeSZhou Yanjie 1959fe1ad5eeSZhou Yanjie static void ingenic_gpio_shadow_set_bit_load(struct ingenic_gpio_chip *jzgc) 1960fe1ad5eeSZhou Yanjie { 1961d7da2a1eS周琰杰 (Zhou Yanjie) regmap_write(jzgc->jzpc->map, REG_PZ_GID2LD( 1962d7da2a1eS周琰杰 (Zhou Yanjie) jzgc->jzpc->info->reg_offset), 1963fe1ad5eeSZhou Yanjie jzgc->gc.base / PINS_PER_GPIO_CHIP); 1964fe1ad5eeSZhou Yanjie } 1965fe1ad5eeSZhou Yanjie 1966e72394e2SPaul Cercueil static inline bool ingenic_gpio_get_value(struct ingenic_gpio_chip *jzgc, 1967e72394e2SPaul Cercueil u8 offset) 1968e72394e2SPaul Cercueil { 1969b71c1844SZhou Yanjie unsigned int val = ingenic_gpio_read_reg(jzgc, GPIO_PIN); 1970e72394e2SPaul Cercueil 1971e72394e2SPaul Cercueil return !!(val & BIT(offset)); 1972e72394e2SPaul Cercueil } 1973e72394e2SPaul Cercueil 1974e72394e2SPaul Cercueil static void ingenic_gpio_set_value(struct ingenic_gpio_chip *jzgc, 1975e72394e2SPaul Cercueil u8 offset, int value) 1976e72394e2SPaul Cercueil { 1977baf15647SPaul Cercueil if (jzgc->jzpc->info->version >= ID_JZ4760) 19780257595aSZhou Yanjie ingenic_gpio_set_bit(jzgc, JZ4760_GPIO_PAT0, offset, !!value); 1979e72394e2SPaul Cercueil else 1980b71c1844SZhou Yanjie ingenic_gpio_set_bit(jzgc, JZ4740_GPIO_DATA, offset, !!value); 1981e72394e2SPaul Cercueil } 1982e72394e2SPaul Cercueil 1983e72394e2SPaul Cercueil static void irq_set_type(struct ingenic_gpio_chip *jzgc, 1984e72394e2SPaul Cercueil u8 offset, unsigned int type) 1985e72394e2SPaul Cercueil { 1986e72394e2SPaul Cercueil u8 reg1, reg2; 1987f831f93aSPaul Cercueil bool val1, val2; 1988f831f93aSPaul Cercueil 1989f831f93aSPaul Cercueil switch (type) { 1990f831f93aSPaul Cercueil case IRQ_TYPE_EDGE_RISING: 1991f831f93aSPaul Cercueil val1 = val2 = true; 1992f831f93aSPaul Cercueil break; 1993f831f93aSPaul Cercueil case IRQ_TYPE_EDGE_FALLING: 1994f831f93aSPaul Cercueil val1 = false; 1995f831f93aSPaul Cercueil val2 = true; 1996f831f93aSPaul Cercueil break; 1997f831f93aSPaul Cercueil case IRQ_TYPE_LEVEL_HIGH: 1998f831f93aSPaul Cercueil val1 = true; 1999f831f93aSPaul Cercueil val2 = false; 2000f831f93aSPaul Cercueil break; 2001f831f93aSPaul Cercueil case IRQ_TYPE_LEVEL_LOW: 2002f831f93aSPaul Cercueil default: 2003f831f93aSPaul Cercueil val1 = val2 = false; 2004f831f93aSPaul Cercueil break; 2005f831f93aSPaul Cercueil } 2006e72394e2SPaul Cercueil 2007baf15647SPaul Cercueil if (jzgc->jzpc->info->version >= ID_JZ4760) { 20080257595aSZhou Yanjie reg1 = JZ4760_GPIO_PAT1; 20090257595aSZhou Yanjie reg2 = JZ4760_GPIO_PAT0; 2010e72394e2SPaul Cercueil } else { 2011e72394e2SPaul Cercueil reg1 = JZ4740_GPIO_TRIG; 2012e72394e2SPaul Cercueil reg2 = JZ4740_GPIO_DIR; 2013e72394e2SPaul Cercueil } 2014e72394e2SPaul Cercueil 2015baf15647SPaul Cercueil if (jzgc->jzpc->info->version >= ID_X1000) { 2016f831f93aSPaul Cercueil ingenic_gpio_shadow_set_bit(jzgc, reg2, offset, val1); 2017f831f93aSPaul Cercueil ingenic_gpio_shadow_set_bit(jzgc, reg1, offset, val2); 2018fe1ad5eeSZhou Yanjie ingenic_gpio_shadow_set_bit_load(jzgc); 2019fe1ad5eeSZhou Yanjie } else { 2020f831f93aSPaul Cercueil ingenic_gpio_set_bit(jzgc, reg2, offset, val1); 2021f831f93aSPaul Cercueil ingenic_gpio_set_bit(jzgc, reg1, offset, val2); 2022e72394e2SPaul Cercueil } 2023e72394e2SPaul Cercueil } 2024e72394e2SPaul Cercueil 2025e72394e2SPaul Cercueil static void ingenic_gpio_irq_mask(struct irq_data *irqd) 2026e72394e2SPaul Cercueil { 2027e72394e2SPaul Cercueil struct gpio_chip *gc = irq_data_get_irq_chip_data(irqd); 2028e72394e2SPaul Cercueil struct ingenic_gpio_chip *jzgc = gpiochip_get_data(gc); 2029e72394e2SPaul Cercueil 2030b71c1844SZhou Yanjie ingenic_gpio_set_bit(jzgc, GPIO_MSK, irqd->hwirq, true); 2031e72394e2SPaul Cercueil } 2032e72394e2SPaul Cercueil 2033e72394e2SPaul Cercueil static void ingenic_gpio_irq_unmask(struct irq_data *irqd) 2034e72394e2SPaul Cercueil { 2035e72394e2SPaul Cercueil struct gpio_chip *gc = irq_data_get_irq_chip_data(irqd); 2036e72394e2SPaul Cercueil struct ingenic_gpio_chip *jzgc = gpiochip_get_data(gc); 2037e72394e2SPaul Cercueil 2038b71c1844SZhou Yanjie ingenic_gpio_set_bit(jzgc, GPIO_MSK, irqd->hwirq, false); 2039e72394e2SPaul Cercueil } 2040e72394e2SPaul Cercueil 2041e72394e2SPaul Cercueil static void ingenic_gpio_irq_enable(struct irq_data *irqd) 2042e72394e2SPaul Cercueil { 2043e72394e2SPaul Cercueil struct gpio_chip *gc = irq_data_get_irq_chip_data(irqd); 2044e72394e2SPaul Cercueil struct ingenic_gpio_chip *jzgc = gpiochip_get_data(gc); 2045e72394e2SPaul Cercueil int irq = irqd->hwirq; 2046e72394e2SPaul Cercueil 2047baf15647SPaul Cercueil if (jzgc->jzpc->info->version >= ID_JZ4760) 20480257595aSZhou Yanjie ingenic_gpio_set_bit(jzgc, JZ4760_GPIO_INT, irq, true); 2049e72394e2SPaul Cercueil else 2050b71c1844SZhou Yanjie ingenic_gpio_set_bit(jzgc, JZ4740_GPIO_SELECT, irq, true); 2051e72394e2SPaul Cercueil 2052e72394e2SPaul Cercueil ingenic_gpio_irq_unmask(irqd); 2053e72394e2SPaul Cercueil } 2054e72394e2SPaul Cercueil 2055e72394e2SPaul Cercueil static void ingenic_gpio_irq_disable(struct irq_data *irqd) 2056e72394e2SPaul Cercueil { 2057e72394e2SPaul Cercueil struct gpio_chip *gc = irq_data_get_irq_chip_data(irqd); 2058e72394e2SPaul Cercueil struct ingenic_gpio_chip *jzgc = gpiochip_get_data(gc); 2059e72394e2SPaul Cercueil int irq = irqd->hwirq; 2060e72394e2SPaul Cercueil 2061e72394e2SPaul Cercueil ingenic_gpio_irq_mask(irqd); 2062e72394e2SPaul Cercueil 2063baf15647SPaul Cercueil if (jzgc->jzpc->info->version >= ID_JZ4760) 20640257595aSZhou Yanjie ingenic_gpio_set_bit(jzgc, JZ4760_GPIO_INT, irq, false); 2065e72394e2SPaul Cercueil else 2066b71c1844SZhou Yanjie ingenic_gpio_set_bit(jzgc, JZ4740_GPIO_SELECT, irq, false); 2067e72394e2SPaul Cercueil } 2068e72394e2SPaul Cercueil 2069e72394e2SPaul Cercueil static void ingenic_gpio_irq_ack(struct irq_data *irqd) 2070e72394e2SPaul Cercueil { 2071e72394e2SPaul Cercueil struct gpio_chip *gc = irq_data_get_irq_chip_data(irqd); 2072e72394e2SPaul Cercueil struct ingenic_gpio_chip *jzgc = gpiochip_get_data(gc); 2073e72394e2SPaul Cercueil int irq = irqd->hwirq; 2074e72394e2SPaul Cercueil bool high; 2075e72394e2SPaul Cercueil 2076e72394e2SPaul Cercueil if (irqd_get_trigger_type(irqd) == IRQ_TYPE_EDGE_BOTH) { 2077e72394e2SPaul Cercueil /* 2078e72394e2SPaul Cercueil * Switch to an interrupt for the opposite edge to the one that 2079e72394e2SPaul Cercueil * triggered the interrupt being ACKed. 2080e72394e2SPaul Cercueil */ 2081e72394e2SPaul Cercueil high = ingenic_gpio_get_value(jzgc, irq); 2082e72394e2SPaul Cercueil if (high) 20831c95348bSPaul Cercueil irq_set_type(jzgc, irq, IRQ_TYPE_LEVEL_LOW); 2084e72394e2SPaul Cercueil else 20851c95348bSPaul Cercueil irq_set_type(jzgc, irq, IRQ_TYPE_LEVEL_HIGH); 2086e72394e2SPaul Cercueil } 2087e72394e2SPaul Cercueil 2088baf15647SPaul Cercueil if (jzgc->jzpc->info->version >= ID_JZ4760) 20890257595aSZhou Yanjie ingenic_gpio_set_bit(jzgc, JZ4760_GPIO_FLAG, irq, false); 2090e72394e2SPaul Cercueil else 2091b71c1844SZhou Yanjie ingenic_gpio_set_bit(jzgc, JZ4740_GPIO_DATA, irq, true); 2092e72394e2SPaul Cercueil } 2093e72394e2SPaul Cercueil 2094e72394e2SPaul Cercueil static int ingenic_gpio_irq_set_type(struct irq_data *irqd, unsigned int type) 2095e72394e2SPaul Cercueil { 2096e72394e2SPaul Cercueil struct gpio_chip *gc = irq_data_get_irq_chip_data(irqd); 2097e72394e2SPaul Cercueil struct ingenic_gpio_chip *jzgc = gpiochip_get_data(gc); 2098e72394e2SPaul Cercueil 2099e72394e2SPaul Cercueil switch (type) { 2100e72394e2SPaul Cercueil case IRQ_TYPE_EDGE_BOTH: 2101e72394e2SPaul Cercueil case IRQ_TYPE_EDGE_RISING: 2102e72394e2SPaul Cercueil case IRQ_TYPE_EDGE_FALLING: 2103e72394e2SPaul Cercueil irq_set_handler_locked(irqd, handle_edge_irq); 2104e72394e2SPaul Cercueil break; 2105e72394e2SPaul Cercueil case IRQ_TYPE_LEVEL_HIGH: 2106e72394e2SPaul Cercueil case IRQ_TYPE_LEVEL_LOW: 2107e72394e2SPaul Cercueil irq_set_handler_locked(irqd, handle_level_irq); 2108e72394e2SPaul Cercueil break; 2109e72394e2SPaul Cercueil default: 2110e72394e2SPaul Cercueil irq_set_handler_locked(irqd, handle_bad_irq); 2111e72394e2SPaul Cercueil } 2112e72394e2SPaul Cercueil 2113e72394e2SPaul Cercueil if (type == IRQ_TYPE_EDGE_BOTH) { 2114e72394e2SPaul Cercueil /* 2115e72394e2SPaul Cercueil * The hardware does not support interrupts on both edges. The 2116e72394e2SPaul Cercueil * best we can do is to set up a single-edge interrupt and then 2117e72394e2SPaul Cercueil * switch to the opposing edge when ACKing the interrupt. 2118e72394e2SPaul Cercueil */ 2119e72394e2SPaul Cercueil bool high = ingenic_gpio_get_value(jzgc, irqd->hwirq); 2120e72394e2SPaul Cercueil 21211c95348bSPaul Cercueil type = high ? IRQ_TYPE_LEVEL_LOW : IRQ_TYPE_LEVEL_HIGH; 2122e72394e2SPaul Cercueil } 2123e72394e2SPaul Cercueil 2124e72394e2SPaul Cercueil irq_set_type(jzgc, irqd->hwirq, type); 2125e72394e2SPaul Cercueil return 0; 2126e72394e2SPaul Cercueil } 2127e72394e2SPaul Cercueil 2128e72394e2SPaul Cercueil static int ingenic_gpio_irq_set_wake(struct irq_data *irqd, unsigned int on) 2129e72394e2SPaul Cercueil { 2130e72394e2SPaul Cercueil struct gpio_chip *gc = irq_data_get_irq_chip_data(irqd); 2131e72394e2SPaul Cercueil struct ingenic_gpio_chip *jzgc = gpiochip_get_data(gc); 2132e72394e2SPaul Cercueil 2133e72394e2SPaul Cercueil return irq_set_irq_wake(jzgc->irq, on); 2134e72394e2SPaul Cercueil } 2135e72394e2SPaul Cercueil 2136e72394e2SPaul Cercueil static void ingenic_gpio_irq_handler(struct irq_desc *desc) 2137e72394e2SPaul Cercueil { 2138e72394e2SPaul Cercueil struct gpio_chip *gc = irq_desc_get_handler_data(desc); 2139e72394e2SPaul Cercueil struct ingenic_gpio_chip *jzgc = gpiochip_get_data(gc); 2140e72394e2SPaul Cercueil struct irq_chip *irq_chip = irq_data_get_irq_chip(&desc->irq_data); 2141e72394e2SPaul Cercueil unsigned long flag, i; 2142e72394e2SPaul Cercueil 2143e72394e2SPaul Cercueil chained_irq_enter(irq_chip, desc); 2144e72394e2SPaul Cercueil 2145baf15647SPaul Cercueil if (jzgc->jzpc->info->version >= ID_JZ4760) 21460257595aSZhou Yanjie flag = ingenic_gpio_read_reg(jzgc, JZ4760_GPIO_FLAG); 2147e72394e2SPaul Cercueil else 2148b71c1844SZhou Yanjie flag = ingenic_gpio_read_reg(jzgc, JZ4740_GPIO_FLAG); 2149e72394e2SPaul Cercueil 2150e72394e2SPaul Cercueil for_each_set_bit(i, &flag, 32) 2151e72394e2SPaul Cercueil generic_handle_irq(irq_linear_revmap(gc->irq.domain, i)); 2152e72394e2SPaul Cercueil chained_irq_exit(irq_chip, desc); 2153e72394e2SPaul Cercueil } 2154e72394e2SPaul Cercueil 2155e72394e2SPaul Cercueil static void ingenic_gpio_set(struct gpio_chip *gc, 2156e72394e2SPaul Cercueil unsigned int offset, int value) 2157e72394e2SPaul Cercueil { 2158e72394e2SPaul Cercueil struct ingenic_gpio_chip *jzgc = gpiochip_get_data(gc); 2159e72394e2SPaul Cercueil 2160e72394e2SPaul Cercueil ingenic_gpio_set_value(jzgc, offset, value); 2161e72394e2SPaul Cercueil } 2162e72394e2SPaul Cercueil 2163e72394e2SPaul Cercueil static int ingenic_gpio_get(struct gpio_chip *gc, unsigned int offset) 2164e72394e2SPaul Cercueil { 2165e72394e2SPaul Cercueil struct ingenic_gpio_chip *jzgc = gpiochip_get_data(gc); 2166e72394e2SPaul Cercueil 2167e72394e2SPaul Cercueil return (int) ingenic_gpio_get_value(jzgc, offset); 2168e72394e2SPaul Cercueil } 2169e72394e2SPaul Cercueil 2170e72394e2SPaul Cercueil static int ingenic_gpio_direction_input(struct gpio_chip *gc, 2171e72394e2SPaul Cercueil unsigned int offset) 2172e72394e2SPaul Cercueil { 2173e72394e2SPaul Cercueil return pinctrl_gpio_direction_input(gc->base + offset); 2174e72394e2SPaul Cercueil } 2175e72394e2SPaul Cercueil 2176e72394e2SPaul Cercueil static int ingenic_gpio_direction_output(struct gpio_chip *gc, 2177e72394e2SPaul Cercueil unsigned int offset, int value) 2178e72394e2SPaul Cercueil { 2179e72394e2SPaul Cercueil ingenic_gpio_set(gc, offset, value); 2180e72394e2SPaul Cercueil return pinctrl_gpio_direction_output(gc->base + offset); 2181e72394e2SPaul Cercueil } 2182e72394e2SPaul Cercueil 2183b5c23aa4SPaul Cercueil static inline void ingenic_config_pin(struct ingenic_pinctrl *jzpc, 2184b5c23aa4SPaul Cercueil unsigned int pin, u8 reg, bool set) 2185b5c23aa4SPaul Cercueil { 2186b5c23aa4SPaul Cercueil unsigned int idx = pin % PINS_PER_GPIO_CHIP; 2187b5c23aa4SPaul Cercueil unsigned int offt = pin / PINS_PER_GPIO_CHIP; 2188b5c23aa4SPaul Cercueil 2189f742e5ebS周琰杰 (Zhou Yanjie) regmap_write(jzpc->map, offt * jzpc->info->reg_offset + 2190b5c23aa4SPaul Cercueil (set ? REG_SET(reg) : REG_CLEAR(reg)), BIT(idx)); 2191b5c23aa4SPaul Cercueil } 2192b5c23aa4SPaul Cercueil 2193fe1ad5eeSZhou Yanjie static inline void ingenic_shadow_config_pin(struct ingenic_pinctrl *jzpc, 2194fe1ad5eeSZhou Yanjie unsigned int pin, u8 reg, bool set) 2195fe1ad5eeSZhou Yanjie { 2196fe1ad5eeSZhou Yanjie unsigned int idx = pin % PINS_PER_GPIO_CHIP; 2197fe1ad5eeSZhou Yanjie 2198f742e5ebS周琰杰 (Zhou Yanjie) regmap_write(jzpc->map, REG_PZ_BASE(jzpc->info->reg_offset) + 2199fe1ad5eeSZhou Yanjie (set ? REG_SET(reg) : REG_CLEAR(reg)), BIT(idx)); 2200fe1ad5eeSZhou Yanjie } 2201fe1ad5eeSZhou Yanjie 2202fe1ad5eeSZhou Yanjie static inline void ingenic_shadow_config_pin_load(struct ingenic_pinctrl *jzpc, 2203fe1ad5eeSZhou Yanjie unsigned int pin) 2204fe1ad5eeSZhou Yanjie { 2205d7da2a1eS周琰杰 (Zhou Yanjie) regmap_write(jzpc->map, REG_PZ_GID2LD(jzpc->info->reg_offset), 2206d7da2a1eS周琰杰 (Zhou Yanjie) pin / PINS_PER_GPIO_CHIP); 2207fe1ad5eeSZhou Yanjie } 2208fe1ad5eeSZhou Yanjie 2209b5c23aa4SPaul Cercueil static inline bool ingenic_get_pin_config(struct ingenic_pinctrl *jzpc, 2210b5c23aa4SPaul Cercueil unsigned int pin, u8 reg) 2211b5c23aa4SPaul Cercueil { 2212b5c23aa4SPaul Cercueil unsigned int idx = pin % PINS_PER_GPIO_CHIP; 2213b5c23aa4SPaul Cercueil unsigned int offt = pin / PINS_PER_GPIO_CHIP; 2214b5c23aa4SPaul Cercueil unsigned int val; 2215b5c23aa4SPaul Cercueil 2216f742e5ebS周琰杰 (Zhou Yanjie) regmap_read(jzpc->map, offt * jzpc->info->reg_offset + reg, &val); 2217b5c23aa4SPaul Cercueil 2218b5c23aa4SPaul Cercueil return val & BIT(idx); 2219b5c23aa4SPaul Cercueil } 2220b5c23aa4SPaul Cercueil 2221ebd66514SPaul Cercueil static int ingenic_gpio_get_direction(struct gpio_chip *gc, unsigned int offset) 2222ebd66514SPaul Cercueil { 2223ebd66514SPaul Cercueil struct ingenic_gpio_chip *jzgc = gpiochip_get_data(gc); 2224ebd66514SPaul Cercueil struct ingenic_pinctrl *jzpc = jzgc->jzpc; 2225ebd66514SPaul Cercueil unsigned int pin = gc->base + offset; 2226ebd66514SPaul Cercueil 22273c827873SMatti Vaittinen if (jzpc->info->version >= ID_JZ4760) { 222884e7a946SPaul Cercueil if (ingenic_get_pin_config(jzpc, pin, JZ4760_GPIO_INT) || 222984e7a946SPaul Cercueil ingenic_get_pin_config(jzpc, pin, JZ4760_GPIO_PAT1)) 22303c827873SMatti Vaittinen return GPIO_LINE_DIRECTION_IN; 22313c827873SMatti Vaittinen return GPIO_LINE_DIRECTION_OUT; 22323c827873SMatti Vaittinen } 2233ebd66514SPaul Cercueil 2234ebd66514SPaul Cercueil if (ingenic_get_pin_config(jzpc, pin, JZ4740_GPIO_SELECT)) 22353c827873SMatti Vaittinen return GPIO_LINE_DIRECTION_IN; 2236ebd66514SPaul Cercueil 22373c827873SMatti Vaittinen if (ingenic_get_pin_config(jzpc, pin, JZ4740_GPIO_DIR)) 22383c827873SMatti Vaittinen return GPIO_LINE_DIRECTION_OUT; 22393c827873SMatti Vaittinen 22403c827873SMatti Vaittinen return GPIO_LINE_DIRECTION_IN; 2241ebd66514SPaul Cercueil } 2242ebd66514SPaul Cercueil 22435bf7b849SJulia Lawall static const struct pinctrl_ops ingenic_pctlops = { 2244b5c23aa4SPaul Cercueil .get_groups_count = pinctrl_generic_get_group_count, 2245b5c23aa4SPaul Cercueil .get_group_name = pinctrl_generic_get_group_name, 2246b5c23aa4SPaul Cercueil .get_group_pins = pinctrl_generic_get_group_pins, 2247b5c23aa4SPaul Cercueil .dt_node_to_map = pinconf_generic_dt_node_to_map_all, 2248b5c23aa4SPaul Cercueil .dt_free_map = pinconf_generic_dt_free_map, 2249b5c23aa4SPaul Cercueil }; 2250b5c23aa4SPaul Cercueil 22519a0f1341SPaul Cercueil static int ingenic_gpio_irq_request(struct irq_data *data) 22529a0f1341SPaul Cercueil { 22539a0f1341SPaul Cercueil struct gpio_chip *gpio_chip = irq_data_get_irq_chip_data(data); 22549a0f1341SPaul Cercueil int ret; 22559a0f1341SPaul Cercueil 22569a0f1341SPaul Cercueil ret = ingenic_gpio_direction_input(gpio_chip, data->hwirq); 22579a0f1341SPaul Cercueil if (ret) 22589a0f1341SPaul Cercueil return ret; 22599a0f1341SPaul Cercueil 22609a0f1341SPaul Cercueil return gpiochip_reqres_irq(gpio_chip, data->hwirq); 22619a0f1341SPaul Cercueil } 22629a0f1341SPaul Cercueil 22639a0f1341SPaul Cercueil static void ingenic_gpio_irq_release(struct irq_data *data) 22649a0f1341SPaul Cercueil { 22659a0f1341SPaul Cercueil struct gpio_chip *gpio_chip = irq_data_get_irq_chip_data(data); 22669a0f1341SPaul Cercueil 22679a0f1341SPaul Cercueil return gpiochip_relres_irq(gpio_chip, data->hwirq); 22689a0f1341SPaul Cercueil } 22699a0f1341SPaul Cercueil 2270b5c23aa4SPaul Cercueil static int ingenic_pinmux_set_pin_fn(struct ingenic_pinctrl *jzpc, 2271b5c23aa4SPaul Cercueil int pin, int func) 2272b5c23aa4SPaul Cercueil { 2273b5c23aa4SPaul Cercueil unsigned int idx = pin % PINS_PER_GPIO_CHIP; 2274b5c23aa4SPaul Cercueil unsigned int offt = pin / PINS_PER_GPIO_CHIP; 2275b5c23aa4SPaul Cercueil 2276b5c23aa4SPaul Cercueil dev_dbg(jzpc->dev, "set pin P%c%u to function %u\n", 2277b5c23aa4SPaul Cercueil 'A' + offt, idx, func); 2278b5c23aa4SPaul Cercueil 2279baf15647SPaul Cercueil if (jzpc->info->version >= ID_X1000) { 2280fe1ad5eeSZhou Yanjie ingenic_shadow_config_pin(jzpc, pin, JZ4760_GPIO_INT, false); 2281fe1ad5eeSZhou Yanjie ingenic_shadow_config_pin(jzpc, pin, GPIO_MSK, false); 2282fe1ad5eeSZhou Yanjie ingenic_shadow_config_pin(jzpc, pin, JZ4760_GPIO_PAT1, func & 0x2); 2283fe1ad5eeSZhou Yanjie ingenic_shadow_config_pin(jzpc, pin, JZ4760_GPIO_PAT0, func & 0x1); 2284fe1ad5eeSZhou Yanjie ingenic_shadow_config_pin_load(jzpc, pin); 2285baf15647SPaul Cercueil } else if (jzpc->info->version >= ID_JZ4760) { 22860257595aSZhou Yanjie ingenic_config_pin(jzpc, pin, JZ4760_GPIO_INT, false); 2287e72394e2SPaul Cercueil ingenic_config_pin(jzpc, pin, GPIO_MSK, false); 22880257595aSZhou Yanjie ingenic_config_pin(jzpc, pin, JZ4760_GPIO_PAT1, func & 0x2); 22890257595aSZhou Yanjie ingenic_config_pin(jzpc, pin, JZ4760_GPIO_PAT0, func & 0x1); 2290b5c23aa4SPaul Cercueil } else { 2291b5c23aa4SPaul Cercueil ingenic_config_pin(jzpc, pin, JZ4740_GPIO_FUNC, true); 2292b5c23aa4SPaul Cercueil ingenic_config_pin(jzpc, pin, JZ4740_GPIO_TRIG, func & 0x2); 2293b5c23aa4SPaul Cercueil ingenic_config_pin(jzpc, pin, JZ4740_GPIO_SELECT, func > 0); 2294b5c23aa4SPaul Cercueil } 2295b5c23aa4SPaul Cercueil 2296b5c23aa4SPaul Cercueil return 0; 2297b5c23aa4SPaul Cercueil } 2298b5c23aa4SPaul Cercueil 2299b5c23aa4SPaul Cercueil static int ingenic_pinmux_set_mux(struct pinctrl_dev *pctldev, 2300b5c23aa4SPaul Cercueil unsigned int selector, unsigned int group) 2301b5c23aa4SPaul Cercueil { 2302b5c23aa4SPaul Cercueil struct ingenic_pinctrl *jzpc = pinctrl_dev_get_drvdata(pctldev); 2303b5c23aa4SPaul Cercueil struct function_desc *func; 2304b5c23aa4SPaul Cercueil struct group_desc *grp; 2305b5c23aa4SPaul Cercueil unsigned int i; 2306b5c23aa4SPaul Cercueil 2307b5c23aa4SPaul Cercueil func = pinmux_generic_get_function(pctldev, selector); 2308b5c23aa4SPaul Cercueil if (!func) 2309b5c23aa4SPaul Cercueil return -EINVAL; 2310b5c23aa4SPaul Cercueil 2311b5c23aa4SPaul Cercueil grp = pinctrl_generic_get_group(pctldev, group); 2312b5c23aa4SPaul Cercueil if (!grp) 2313b5c23aa4SPaul Cercueil return -EINVAL; 2314b5c23aa4SPaul Cercueil 2315b5c23aa4SPaul Cercueil dev_dbg(pctldev->dev, "enable function %s group %s\n", 2316b5c23aa4SPaul Cercueil func->name, grp->name); 2317b5c23aa4SPaul Cercueil 2318b5c23aa4SPaul Cercueil for (i = 0; i < grp->num_pins; i++) { 2319b5c23aa4SPaul Cercueil int *pin_modes = grp->data; 2320b5c23aa4SPaul Cercueil 2321b5c23aa4SPaul Cercueil ingenic_pinmux_set_pin_fn(jzpc, grp->pins[i], pin_modes[i]); 2322b5c23aa4SPaul Cercueil } 2323b5c23aa4SPaul Cercueil 2324b5c23aa4SPaul Cercueil return 0; 2325b5c23aa4SPaul Cercueil } 2326b5c23aa4SPaul Cercueil 2327b5c23aa4SPaul Cercueil static int ingenic_pinmux_gpio_set_direction(struct pinctrl_dev *pctldev, 2328b5c23aa4SPaul Cercueil struct pinctrl_gpio_range *range, 2329b5c23aa4SPaul Cercueil unsigned int pin, bool input) 2330b5c23aa4SPaul Cercueil { 2331b5c23aa4SPaul Cercueil struct ingenic_pinctrl *jzpc = pinctrl_dev_get_drvdata(pctldev); 2332b5c23aa4SPaul Cercueil unsigned int idx = pin % PINS_PER_GPIO_CHIP; 2333b5c23aa4SPaul Cercueil unsigned int offt = pin / PINS_PER_GPIO_CHIP; 2334b5c23aa4SPaul Cercueil 2335b5c23aa4SPaul Cercueil dev_dbg(pctldev->dev, "set pin P%c%u to %sput\n", 2336b5c23aa4SPaul Cercueil 'A' + offt, idx, input ? "in" : "out"); 2337b5c23aa4SPaul Cercueil 2338baf15647SPaul Cercueil if (jzpc->info->version >= ID_X1000) { 2339fe1ad5eeSZhou Yanjie ingenic_shadow_config_pin(jzpc, pin, JZ4760_GPIO_INT, false); 2340fe1ad5eeSZhou Yanjie ingenic_shadow_config_pin(jzpc, pin, GPIO_MSK, true); 2341fe1ad5eeSZhou Yanjie ingenic_shadow_config_pin(jzpc, pin, JZ4760_GPIO_PAT1, input); 2342fe1ad5eeSZhou Yanjie ingenic_shadow_config_pin_load(jzpc, pin); 2343baf15647SPaul Cercueil } else if (jzpc->info->version >= ID_JZ4760) { 23440257595aSZhou Yanjie ingenic_config_pin(jzpc, pin, JZ4760_GPIO_INT, false); 2345e72394e2SPaul Cercueil ingenic_config_pin(jzpc, pin, GPIO_MSK, true); 23460257595aSZhou Yanjie ingenic_config_pin(jzpc, pin, JZ4760_GPIO_PAT1, input); 2347b5c23aa4SPaul Cercueil } else { 2348b5c23aa4SPaul Cercueil ingenic_config_pin(jzpc, pin, JZ4740_GPIO_SELECT, false); 23490084a786SPaul Cercueil ingenic_config_pin(jzpc, pin, JZ4740_GPIO_DIR, !input); 2350b5c23aa4SPaul Cercueil ingenic_config_pin(jzpc, pin, JZ4740_GPIO_FUNC, false); 2351b5c23aa4SPaul Cercueil } 2352b5c23aa4SPaul Cercueil 2353b5c23aa4SPaul Cercueil return 0; 2354b5c23aa4SPaul Cercueil } 2355b5c23aa4SPaul Cercueil 23565bf7b849SJulia Lawall static const struct pinmux_ops ingenic_pmxops = { 2357b5c23aa4SPaul Cercueil .get_functions_count = pinmux_generic_get_function_count, 2358b5c23aa4SPaul Cercueil .get_function_name = pinmux_generic_get_function_name, 2359b5c23aa4SPaul Cercueil .get_function_groups = pinmux_generic_get_function_groups, 2360b5c23aa4SPaul Cercueil .set_mux = ingenic_pinmux_set_mux, 2361b5c23aa4SPaul Cercueil .gpio_set_direction = ingenic_pinmux_gpio_set_direction, 2362b5c23aa4SPaul Cercueil }; 2363b5c23aa4SPaul Cercueil 2364b5c23aa4SPaul Cercueil static int ingenic_pinconf_get(struct pinctrl_dev *pctldev, 2365b5c23aa4SPaul Cercueil unsigned int pin, unsigned long *config) 2366b5c23aa4SPaul Cercueil { 2367b5c23aa4SPaul Cercueil struct ingenic_pinctrl *jzpc = pinctrl_dev_get_drvdata(pctldev); 2368b5c23aa4SPaul Cercueil enum pin_config_param param = pinconf_to_config_param(*config); 2369b5c23aa4SPaul Cercueil unsigned int idx = pin % PINS_PER_GPIO_CHIP; 2370b5c23aa4SPaul Cercueil unsigned int offt = pin / PINS_PER_GPIO_CHIP; 2371b5c23aa4SPaul Cercueil bool pull; 2372b5c23aa4SPaul Cercueil 2373baf15647SPaul Cercueil if (jzpc->info->version >= ID_JZ4760) 23740257595aSZhou Yanjie pull = !ingenic_get_pin_config(jzpc, pin, JZ4760_GPIO_PEN); 2375b5c23aa4SPaul Cercueil else 2376b5c23aa4SPaul Cercueil pull = !ingenic_get_pin_config(jzpc, pin, JZ4740_GPIO_PULL_DIS); 2377b5c23aa4SPaul Cercueil 2378b5c23aa4SPaul Cercueil switch (param) { 2379b5c23aa4SPaul Cercueil case PIN_CONFIG_BIAS_DISABLE: 2380b5c23aa4SPaul Cercueil if (pull) 2381b5c23aa4SPaul Cercueil return -EINVAL; 2382b5c23aa4SPaul Cercueil break; 2383b5c23aa4SPaul Cercueil 2384b5c23aa4SPaul Cercueil case PIN_CONFIG_BIAS_PULL_UP: 2385b5c23aa4SPaul Cercueil if (!pull || !(jzpc->info->pull_ups[offt] & BIT(idx))) 2386b5c23aa4SPaul Cercueil return -EINVAL; 2387b5c23aa4SPaul Cercueil break; 2388b5c23aa4SPaul Cercueil 2389b5c23aa4SPaul Cercueil case PIN_CONFIG_BIAS_PULL_DOWN: 2390b5c23aa4SPaul Cercueil if (!pull || !(jzpc->info->pull_downs[offt] & BIT(idx))) 2391b5c23aa4SPaul Cercueil return -EINVAL; 2392b5c23aa4SPaul Cercueil break; 2393b5c23aa4SPaul Cercueil 2394b5c23aa4SPaul Cercueil default: 2395b5c23aa4SPaul Cercueil return -ENOTSUPP; 2396b5c23aa4SPaul Cercueil } 2397b5c23aa4SPaul Cercueil 2398b5c23aa4SPaul Cercueil *config = pinconf_to_config_packed(param, 1); 2399b5c23aa4SPaul Cercueil return 0; 2400b5c23aa4SPaul Cercueil } 2401b5c23aa4SPaul Cercueil 2402b5c23aa4SPaul Cercueil static void ingenic_set_bias(struct ingenic_pinctrl *jzpc, 2403d7da2a1eS周琰杰 (Zhou Yanjie) unsigned int pin, unsigned int bias) 2404b5c23aa4SPaul Cercueil { 2405baf15647SPaul Cercueil if (jzpc->info->version >= ID_X1830) { 2406d7da2a1eS周琰杰 (Zhou Yanjie) unsigned int idx = pin % PINS_PER_GPIO_CHIP; 2407d7da2a1eS周琰杰 (Zhou Yanjie) unsigned int half = PINS_PER_GPIO_CHIP / 2; 2408d7da2a1eS周琰杰 (Zhou Yanjie) unsigned int idxh = pin % half * 2; 2409d7da2a1eS周琰杰 (Zhou Yanjie) unsigned int offt = pin / PINS_PER_GPIO_CHIP; 2410d7da2a1eS周琰杰 (Zhou Yanjie) 2411d7da2a1eS周琰杰 (Zhou Yanjie) if (idx < half) { 2412d7da2a1eS周琰杰 (Zhou Yanjie) regmap_write(jzpc->map, offt * jzpc->info->reg_offset + 2413d7da2a1eS周琰杰 (Zhou Yanjie) REG_CLEAR(X1830_GPIO_PEL), 3 << idxh); 2414d7da2a1eS周琰杰 (Zhou Yanjie) regmap_write(jzpc->map, offt * jzpc->info->reg_offset + 2415d7da2a1eS周琰杰 (Zhou Yanjie) REG_SET(X1830_GPIO_PEL), bias << idxh); 2416d7da2a1eS周琰杰 (Zhou Yanjie) } else { 2417d7da2a1eS周琰杰 (Zhou Yanjie) regmap_write(jzpc->map, offt * jzpc->info->reg_offset + 2418d7da2a1eS周琰杰 (Zhou Yanjie) REG_CLEAR(X1830_GPIO_PEH), 3 << idxh); 2419d7da2a1eS周琰杰 (Zhou Yanjie) regmap_write(jzpc->map, offt * jzpc->info->reg_offset + 2420d7da2a1eS周琰杰 (Zhou Yanjie) REG_SET(X1830_GPIO_PEH), bias << idxh); 2421d7da2a1eS周琰杰 (Zhou Yanjie) } 2422d7da2a1eS周琰杰 (Zhou Yanjie) 2423baf15647SPaul Cercueil } else if (jzpc->info->version >= ID_JZ4760) { 2424d7da2a1eS周琰杰 (Zhou Yanjie) ingenic_config_pin(jzpc, pin, JZ4760_GPIO_PEN, !bias); 2425d7da2a1eS周琰杰 (Zhou Yanjie) } else { 2426d7da2a1eS周琰杰 (Zhou Yanjie) ingenic_config_pin(jzpc, pin, JZ4740_GPIO_PULL_DIS, !bias); 2427d7da2a1eS周琰杰 (Zhou Yanjie) } 2428b5c23aa4SPaul Cercueil } 2429b5c23aa4SPaul Cercueil 24307009d046SPaul Cercueil static void ingenic_set_output_level(struct ingenic_pinctrl *jzpc, 24317009d046SPaul Cercueil unsigned int pin, bool high) 24327009d046SPaul Cercueil { 2433baf15647SPaul Cercueil if (jzpc->info->version >= ID_JZ4760) 24347009d046SPaul Cercueil ingenic_config_pin(jzpc, pin, JZ4760_GPIO_PAT0, high); 24357009d046SPaul Cercueil else 24367009d046SPaul Cercueil ingenic_config_pin(jzpc, pin, JZ4740_GPIO_DATA, high); 24377009d046SPaul Cercueil } 24387009d046SPaul Cercueil 2439b5c23aa4SPaul Cercueil static int ingenic_pinconf_set(struct pinctrl_dev *pctldev, unsigned int pin, 2440b5c23aa4SPaul Cercueil unsigned long *configs, unsigned int num_configs) 2441b5c23aa4SPaul Cercueil { 2442b5c23aa4SPaul Cercueil struct ingenic_pinctrl *jzpc = pinctrl_dev_get_drvdata(pctldev); 2443b5c23aa4SPaul Cercueil unsigned int idx = pin % PINS_PER_GPIO_CHIP; 2444b5c23aa4SPaul Cercueil unsigned int offt = pin / PINS_PER_GPIO_CHIP; 24457009d046SPaul Cercueil unsigned int cfg, arg; 24467009d046SPaul Cercueil int ret; 2447b5c23aa4SPaul Cercueil 2448b5c23aa4SPaul Cercueil for (cfg = 0; cfg < num_configs; cfg++) { 2449b5c23aa4SPaul Cercueil switch (pinconf_to_config_param(configs[cfg])) { 2450b5c23aa4SPaul Cercueil case PIN_CONFIG_BIAS_DISABLE: 2451b5c23aa4SPaul Cercueil case PIN_CONFIG_BIAS_PULL_UP: 2452b5c23aa4SPaul Cercueil case PIN_CONFIG_BIAS_PULL_DOWN: 24537009d046SPaul Cercueil case PIN_CONFIG_OUTPUT: 2454b5c23aa4SPaul Cercueil continue; 2455b5c23aa4SPaul Cercueil default: 2456b5c23aa4SPaul Cercueil return -ENOTSUPP; 2457b5c23aa4SPaul Cercueil } 2458b5c23aa4SPaul Cercueil } 2459b5c23aa4SPaul Cercueil 2460b5c23aa4SPaul Cercueil for (cfg = 0; cfg < num_configs; cfg++) { 24617009d046SPaul Cercueil arg = pinconf_to_config_argument(configs[cfg]); 24627009d046SPaul Cercueil 2463b5c23aa4SPaul Cercueil switch (pinconf_to_config_param(configs[cfg])) { 2464b5c23aa4SPaul Cercueil case PIN_CONFIG_BIAS_DISABLE: 2465b5c23aa4SPaul Cercueil dev_dbg(jzpc->dev, "disable pull-over for pin P%c%u\n", 2466b5c23aa4SPaul Cercueil 'A' + offt, idx); 2467d7da2a1eS周琰杰 (Zhou Yanjie) ingenic_set_bias(jzpc, pin, GPIO_PULL_DIS); 2468b5c23aa4SPaul Cercueil break; 2469b5c23aa4SPaul Cercueil 2470b5c23aa4SPaul Cercueil case PIN_CONFIG_BIAS_PULL_UP: 2471b5c23aa4SPaul Cercueil if (!(jzpc->info->pull_ups[offt] & BIT(idx))) 2472b5c23aa4SPaul Cercueil return -EINVAL; 2473b5c23aa4SPaul Cercueil dev_dbg(jzpc->dev, "set pull-up for pin P%c%u\n", 2474b5c23aa4SPaul Cercueil 'A' + offt, idx); 2475d7da2a1eS周琰杰 (Zhou Yanjie) ingenic_set_bias(jzpc, pin, GPIO_PULL_UP); 2476b5c23aa4SPaul Cercueil break; 2477b5c23aa4SPaul Cercueil 2478b5c23aa4SPaul Cercueil case PIN_CONFIG_BIAS_PULL_DOWN: 2479b5c23aa4SPaul Cercueil if (!(jzpc->info->pull_downs[offt] & BIT(idx))) 2480b5c23aa4SPaul Cercueil return -EINVAL; 2481b5c23aa4SPaul Cercueil dev_dbg(jzpc->dev, "set pull-down for pin P%c%u\n", 2482b5c23aa4SPaul Cercueil 'A' + offt, idx); 2483d7da2a1eS周琰杰 (Zhou Yanjie) ingenic_set_bias(jzpc, pin, GPIO_PULL_DOWN); 2484b5c23aa4SPaul Cercueil break; 2485b5c23aa4SPaul Cercueil 24867009d046SPaul Cercueil case PIN_CONFIG_OUTPUT: 24877009d046SPaul Cercueil ret = pinctrl_gpio_direction_output(pin); 24887009d046SPaul Cercueil if (ret) 24897009d046SPaul Cercueil return ret; 24907009d046SPaul Cercueil 24917009d046SPaul Cercueil ingenic_set_output_level(jzpc, pin, arg); 24927009d046SPaul Cercueil break; 24937009d046SPaul Cercueil 2494b5c23aa4SPaul Cercueil default: 2495d6d43a92SJosh Poimboeuf /* unreachable */ 2496d6d43a92SJosh Poimboeuf break; 2497b5c23aa4SPaul Cercueil } 2498b5c23aa4SPaul Cercueil } 2499b5c23aa4SPaul Cercueil 2500b5c23aa4SPaul Cercueil return 0; 2501b5c23aa4SPaul Cercueil } 2502b5c23aa4SPaul Cercueil 2503b5c23aa4SPaul Cercueil static int ingenic_pinconf_group_get(struct pinctrl_dev *pctldev, 2504b5c23aa4SPaul Cercueil unsigned int group, unsigned long *config) 2505b5c23aa4SPaul Cercueil { 2506b5c23aa4SPaul Cercueil const unsigned int *pins; 2507b5c23aa4SPaul Cercueil unsigned int i, npins, old = 0; 2508b5c23aa4SPaul Cercueil int ret; 2509b5c23aa4SPaul Cercueil 2510b5c23aa4SPaul Cercueil ret = pinctrl_generic_get_group_pins(pctldev, group, &pins, &npins); 2511b5c23aa4SPaul Cercueil if (ret) 2512b5c23aa4SPaul Cercueil return ret; 2513b5c23aa4SPaul Cercueil 2514b5c23aa4SPaul Cercueil for (i = 0; i < npins; i++) { 2515b5c23aa4SPaul Cercueil if (ingenic_pinconf_get(pctldev, pins[i], config)) 2516b5c23aa4SPaul Cercueil return -ENOTSUPP; 2517b5c23aa4SPaul Cercueil 2518b5c23aa4SPaul Cercueil /* configs do not match between two pins */ 2519b5c23aa4SPaul Cercueil if (i && (old != *config)) 2520b5c23aa4SPaul Cercueil return -ENOTSUPP; 2521b5c23aa4SPaul Cercueil 2522b5c23aa4SPaul Cercueil old = *config; 2523b5c23aa4SPaul Cercueil } 2524b5c23aa4SPaul Cercueil 2525b5c23aa4SPaul Cercueil return 0; 2526b5c23aa4SPaul Cercueil } 2527b5c23aa4SPaul Cercueil 2528b5c23aa4SPaul Cercueil static int ingenic_pinconf_group_set(struct pinctrl_dev *pctldev, 2529b5c23aa4SPaul Cercueil unsigned int group, unsigned long *configs, 2530b5c23aa4SPaul Cercueil unsigned int num_configs) 2531b5c23aa4SPaul Cercueil { 2532b5c23aa4SPaul Cercueil const unsigned int *pins; 2533b5c23aa4SPaul Cercueil unsigned int i, npins; 2534b5c23aa4SPaul Cercueil int ret; 2535b5c23aa4SPaul Cercueil 2536b5c23aa4SPaul Cercueil ret = pinctrl_generic_get_group_pins(pctldev, group, &pins, &npins); 2537b5c23aa4SPaul Cercueil if (ret) 2538b5c23aa4SPaul Cercueil return ret; 2539b5c23aa4SPaul Cercueil 2540b5c23aa4SPaul Cercueil for (i = 0; i < npins; i++) { 2541b5c23aa4SPaul Cercueil ret = ingenic_pinconf_set(pctldev, 2542b5c23aa4SPaul Cercueil pins[i], configs, num_configs); 2543b5c23aa4SPaul Cercueil if (ret) 2544b5c23aa4SPaul Cercueil return ret; 2545b5c23aa4SPaul Cercueil } 2546b5c23aa4SPaul Cercueil 2547b5c23aa4SPaul Cercueil return 0; 2548b5c23aa4SPaul Cercueil } 2549b5c23aa4SPaul Cercueil 25505bf7b849SJulia Lawall static const struct pinconf_ops ingenic_confops = { 2551b5c23aa4SPaul Cercueil .is_generic = true, 2552b5c23aa4SPaul Cercueil .pin_config_get = ingenic_pinconf_get, 2553b5c23aa4SPaul Cercueil .pin_config_set = ingenic_pinconf_set, 2554b5c23aa4SPaul Cercueil .pin_config_group_get = ingenic_pinconf_group_get, 2555b5c23aa4SPaul Cercueil .pin_config_group_set = ingenic_pinconf_group_set, 2556b5c23aa4SPaul Cercueil }; 2557b5c23aa4SPaul Cercueil 2558b5c23aa4SPaul Cercueil static const struct regmap_config ingenic_pinctrl_regmap_config = { 2559b5c23aa4SPaul Cercueil .reg_bits = 32, 2560b5c23aa4SPaul Cercueil .val_bits = 32, 2561b5c23aa4SPaul Cercueil .reg_stride = 4, 2562b5c23aa4SPaul Cercueil }; 2563b5c23aa4SPaul Cercueil 2564e72394e2SPaul Cercueil static const struct of_device_id ingenic_gpio_of_match[] __initconst = { 2565e72394e2SPaul Cercueil { .compatible = "ingenic,jz4740-gpio", }, 2566b5fc06a1SPaul Cercueil { .compatible = "ingenic,jz4725b-gpio", }, 25670257595aSZhou Yanjie { .compatible = "ingenic,jz4760-gpio", }, 2568e72394e2SPaul Cercueil { .compatible = "ingenic,jz4770-gpio", }, 2569e72394e2SPaul Cercueil { .compatible = "ingenic,jz4780-gpio", }, 2570fe1ad5eeSZhou Yanjie { .compatible = "ingenic,x1000-gpio", }, 2571d7da2a1eS周琰杰 (Zhou Yanjie) { .compatible = "ingenic,x1830-gpio", }, 2572e72394e2SPaul Cercueil {}, 2573e72394e2SPaul Cercueil }; 2574e72394e2SPaul Cercueil 2575e72394e2SPaul Cercueil static int __init ingenic_gpio_probe(struct ingenic_pinctrl *jzpc, 2576e72394e2SPaul Cercueil struct device_node *node) 2577e72394e2SPaul Cercueil { 2578e72394e2SPaul Cercueil struct ingenic_gpio_chip *jzgc; 2579e72394e2SPaul Cercueil struct device *dev = jzpc->dev; 2580142b8767SLinus Walleij struct gpio_irq_chip *girq; 2581e72394e2SPaul Cercueil unsigned int bank; 2582e72394e2SPaul Cercueil int err; 2583e72394e2SPaul Cercueil 2584e72394e2SPaul Cercueil err = of_property_read_u32(node, "reg", &bank); 2585e72394e2SPaul Cercueil if (err) { 2586e72394e2SPaul Cercueil dev_err(dev, "Cannot read \"reg\" property: %i\n", err); 2587e72394e2SPaul Cercueil return err; 2588e72394e2SPaul Cercueil } 2589e72394e2SPaul Cercueil 2590e72394e2SPaul Cercueil jzgc = devm_kzalloc(dev, sizeof(*jzgc), GFP_KERNEL); 2591e72394e2SPaul Cercueil if (!jzgc) 2592e72394e2SPaul Cercueil return -ENOMEM; 2593e72394e2SPaul Cercueil 2594e72394e2SPaul Cercueil jzgc->jzpc = jzpc; 2595f742e5ebS周琰杰 (Zhou Yanjie) jzgc->reg_base = bank * jzpc->info->reg_offset; 2596e72394e2SPaul Cercueil 2597e72394e2SPaul Cercueil jzgc->gc.label = devm_kasprintf(dev, GFP_KERNEL, "GPIO%c", 'A' + bank); 2598e72394e2SPaul Cercueil if (!jzgc->gc.label) 2599e72394e2SPaul Cercueil return -ENOMEM; 2600e72394e2SPaul Cercueil 2601e72394e2SPaul Cercueil /* DO NOT EXPAND THIS: FOR BACKWARD GPIO NUMBERSPACE COMPATIBIBILITY 2602e72394e2SPaul Cercueil * ONLY: WORK TO TRANSITION CONSUMERS TO USE THE GPIO DESCRIPTOR API IN 2603e72394e2SPaul Cercueil * <linux/gpio/consumer.h> INSTEAD. 2604e72394e2SPaul Cercueil */ 2605e72394e2SPaul Cercueil jzgc->gc.base = bank * 32; 2606e72394e2SPaul Cercueil 2607e72394e2SPaul Cercueil jzgc->gc.ngpio = 32; 2608e72394e2SPaul Cercueil jzgc->gc.parent = dev; 2609e72394e2SPaul Cercueil jzgc->gc.of_node = node; 2610e72394e2SPaul Cercueil jzgc->gc.owner = THIS_MODULE; 2611e72394e2SPaul Cercueil 2612e72394e2SPaul Cercueil jzgc->gc.set = ingenic_gpio_set; 2613e72394e2SPaul Cercueil jzgc->gc.get = ingenic_gpio_get; 2614e72394e2SPaul Cercueil jzgc->gc.direction_input = ingenic_gpio_direction_input; 2615e72394e2SPaul Cercueil jzgc->gc.direction_output = ingenic_gpio_direction_output; 2616ebd66514SPaul Cercueil jzgc->gc.get_direction = ingenic_gpio_get_direction; 2617e72394e2SPaul Cercueil jzgc->gc.request = gpiochip_generic_request; 2618e72394e2SPaul Cercueil jzgc->gc.free = gpiochip_generic_free; 2619e72394e2SPaul Cercueil 2620e72394e2SPaul Cercueil jzgc->irq = irq_of_parse_and_map(node, 0); 2621e72394e2SPaul Cercueil if (!jzgc->irq) 2622e72394e2SPaul Cercueil return -EINVAL; 2623e72394e2SPaul Cercueil 2624e72394e2SPaul Cercueil jzgc->irq_chip.name = jzgc->gc.label; 2625e72394e2SPaul Cercueil jzgc->irq_chip.irq_enable = ingenic_gpio_irq_enable; 2626e72394e2SPaul Cercueil jzgc->irq_chip.irq_disable = ingenic_gpio_irq_disable; 2627e72394e2SPaul Cercueil jzgc->irq_chip.irq_unmask = ingenic_gpio_irq_unmask; 2628e72394e2SPaul Cercueil jzgc->irq_chip.irq_mask = ingenic_gpio_irq_mask; 2629e72394e2SPaul Cercueil jzgc->irq_chip.irq_ack = ingenic_gpio_irq_ack; 2630e72394e2SPaul Cercueil jzgc->irq_chip.irq_set_type = ingenic_gpio_irq_set_type; 2631e72394e2SPaul Cercueil jzgc->irq_chip.irq_set_wake = ingenic_gpio_irq_set_wake; 26329a0f1341SPaul Cercueil jzgc->irq_chip.irq_request_resources = ingenic_gpio_irq_request; 26339a0f1341SPaul Cercueil jzgc->irq_chip.irq_release_resources = ingenic_gpio_irq_release; 2634e72394e2SPaul Cercueil jzgc->irq_chip.flags = IRQCHIP_MASK_ON_SUSPEND; 2635e72394e2SPaul Cercueil 2636142b8767SLinus Walleij girq = &jzgc->gc.irq; 2637142b8767SLinus Walleij girq->chip = &jzgc->irq_chip; 2638142b8767SLinus Walleij girq->parent_handler = ingenic_gpio_irq_handler; 2639142b8767SLinus Walleij girq->num_parents = 1; 2640142b8767SLinus Walleij girq->parents = devm_kcalloc(dev, 1, sizeof(*girq->parents), 2641142b8767SLinus Walleij GFP_KERNEL); 2642142b8767SLinus Walleij if (!girq->parents) 2643142b8767SLinus Walleij return -ENOMEM; 2644142b8767SLinus Walleij girq->parents[0] = jzgc->irq; 2645142b8767SLinus Walleij girq->default_type = IRQ_TYPE_NONE; 2646142b8767SLinus Walleij girq->handler = handle_level_irq; 2647142b8767SLinus Walleij 2648142b8767SLinus Walleij err = devm_gpiochip_add_data(dev, &jzgc->gc, jzgc); 2649e72394e2SPaul Cercueil if (err) 2650e72394e2SPaul Cercueil return err; 2651e72394e2SPaul Cercueil 2652e72394e2SPaul Cercueil return 0; 2653e72394e2SPaul Cercueil } 2654e72394e2SPaul Cercueil 26554717b11fSPaul Cercueil static int __init ingenic_pinctrl_probe(struct platform_device *pdev) 2656b5c23aa4SPaul Cercueil { 2657b5c23aa4SPaul Cercueil struct device *dev = &pdev->dev; 2658b5c23aa4SPaul Cercueil struct ingenic_pinctrl *jzpc; 2659b5c23aa4SPaul Cercueil struct pinctrl_desc *pctl_desc; 2660b5c23aa4SPaul Cercueil void __iomem *base; 2661b5c23aa4SPaul Cercueil const struct ingenic_chip_info *chip_info; 2662e72394e2SPaul Cercueil struct device_node *node; 2663b5c23aa4SPaul Cercueil unsigned int i; 2664b5c23aa4SPaul Cercueil int err; 2665b5c23aa4SPaul Cercueil 2666b5c23aa4SPaul Cercueil jzpc = devm_kzalloc(dev, sizeof(*jzpc), GFP_KERNEL); 2667b5c23aa4SPaul Cercueil if (!jzpc) 2668b5c23aa4SPaul Cercueil return -ENOMEM; 2669b5c23aa4SPaul Cercueil 267094f7a2cbSPaul Cercueil base = devm_platform_ioremap_resource(pdev, 0); 2671119fcf47SWei Yongjun if (IS_ERR(base)) 2672b5c23aa4SPaul Cercueil return PTR_ERR(base); 2673b5c23aa4SPaul Cercueil 2674b5c23aa4SPaul Cercueil jzpc->map = devm_regmap_init_mmio(dev, base, 2675b5c23aa4SPaul Cercueil &ingenic_pinctrl_regmap_config); 2676b5c23aa4SPaul Cercueil if (IS_ERR(jzpc->map)) { 2677b5c23aa4SPaul Cercueil dev_err(dev, "Failed to create regmap\n"); 2678b5c23aa4SPaul Cercueil return PTR_ERR(jzpc->map); 2679b5c23aa4SPaul Cercueil } 2680b5c23aa4SPaul Cercueil 2681b5c23aa4SPaul Cercueil jzpc->dev = dev; 2682baf15647SPaul Cercueil jzpc->info = chip_info = of_device_get_match_data(dev); 2683b5c23aa4SPaul Cercueil 2684b5c23aa4SPaul Cercueil pctl_desc = devm_kzalloc(&pdev->dev, sizeof(*pctl_desc), GFP_KERNEL); 2685b5c23aa4SPaul Cercueil if (!pctl_desc) 2686b5c23aa4SPaul Cercueil return -ENOMEM; 2687b5c23aa4SPaul Cercueil 2688b5c23aa4SPaul Cercueil /* fill in pinctrl_desc structure */ 2689b5c23aa4SPaul Cercueil pctl_desc->name = dev_name(dev); 2690b5c23aa4SPaul Cercueil pctl_desc->owner = THIS_MODULE; 2691b5c23aa4SPaul Cercueil pctl_desc->pctlops = &ingenic_pctlops; 2692b5c23aa4SPaul Cercueil pctl_desc->pmxops = &ingenic_pmxops; 2693b5c23aa4SPaul Cercueil pctl_desc->confops = &ingenic_confops; 2694b5c23aa4SPaul Cercueil pctl_desc->npins = chip_info->num_chips * PINS_PER_GPIO_CHIP; 2695a86854d0SKees Cook pctl_desc->pins = jzpc->pdesc = devm_kcalloc(&pdev->dev, 2696a86854d0SKees Cook pctl_desc->npins, sizeof(*jzpc->pdesc), GFP_KERNEL); 2697b5c23aa4SPaul Cercueil if (!jzpc->pdesc) 2698b5c23aa4SPaul Cercueil return -ENOMEM; 2699b5c23aa4SPaul Cercueil 2700b5c23aa4SPaul Cercueil for (i = 0; i < pctl_desc->npins; i++) { 2701b5c23aa4SPaul Cercueil jzpc->pdesc[i].number = i; 2702b5c23aa4SPaul Cercueil jzpc->pdesc[i].name = kasprintf(GFP_KERNEL, "P%c%d", 2703b5c23aa4SPaul Cercueil 'A' + (i / PINS_PER_GPIO_CHIP), 2704b5c23aa4SPaul Cercueil i % PINS_PER_GPIO_CHIP); 2705b5c23aa4SPaul Cercueil } 2706b5c23aa4SPaul Cercueil 2707b5c23aa4SPaul Cercueil jzpc->pctl = devm_pinctrl_register(dev, pctl_desc, jzpc); 2708e7f4c4bfSDan Carpenter if (IS_ERR(jzpc->pctl)) { 2709b5c23aa4SPaul Cercueil dev_err(dev, "Failed to register pinctrl\n"); 2710e7f4c4bfSDan Carpenter return PTR_ERR(jzpc->pctl); 2711b5c23aa4SPaul Cercueil } 2712b5c23aa4SPaul Cercueil 2713b5c23aa4SPaul Cercueil for (i = 0; i < chip_info->num_groups; i++) { 2714b5c23aa4SPaul Cercueil const struct group_desc *group = &chip_info->groups[i]; 2715b5c23aa4SPaul Cercueil 2716b5c23aa4SPaul Cercueil err = pinctrl_generic_add_group(jzpc->pctl, group->name, 2717b5c23aa4SPaul Cercueil group->pins, group->num_pins, group->data); 2718823dd71fSPaul Burton if (err < 0) { 2719b5c23aa4SPaul Cercueil dev_err(dev, "Failed to register group %s\n", 2720b5c23aa4SPaul Cercueil group->name); 2721b5c23aa4SPaul Cercueil return err; 2722b5c23aa4SPaul Cercueil } 2723b5c23aa4SPaul Cercueil } 2724b5c23aa4SPaul Cercueil 2725b5c23aa4SPaul Cercueil for (i = 0; i < chip_info->num_functions; i++) { 2726b5c23aa4SPaul Cercueil const struct function_desc *func = &chip_info->functions[i]; 2727b5c23aa4SPaul Cercueil 2728b5c23aa4SPaul Cercueil err = pinmux_generic_add_function(jzpc->pctl, func->name, 2729b5c23aa4SPaul Cercueil func->group_names, func->num_group_names, 2730b5c23aa4SPaul Cercueil func->data); 2731823dd71fSPaul Burton if (err < 0) { 2732b5c23aa4SPaul Cercueil dev_err(dev, "Failed to register function %s\n", 2733b5c23aa4SPaul Cercueil func->name); 2734b5c23aa4SPaul Cercueil return err; 2735b5c23aa4SPaul Cercueil } 2736b5c23aa4SPaul Cercueil } 2737b5c23aa4SPaul Cercueil 2738b5c23aa4SPaul Cercueil dev_set_drvdata(dev, jzpc->map); 2739b5c23aa4SPaul Cercueil 2740e72394e2SPaul Cercueil for_each_child_of_node(dev->of_node, node) { 2741e72394e2SPaul Cercueil if (of_match_node(ingenic_gpio_of_match, node)) { 2742e72394e2SPaul Cercueil err = ingenic_gpio_probe(jzpc, node); 2743e72394e2SPaul Cercueil if (err) 2744b5c23aa4SPaul Cercueil return err; 2745b5c23aa4SPaul Cercueil } 2746b5c23aa4SPaul Cercueil } 2747b5c23aa4SPaul Cercueil 2748b5c23aa4SPaul Cercueil return 0; 2749b5c23aa4SPaul Cercueil } 2750b5c23aa4SPaul Cercueil 2751baf15647SPaul Cercueil static const struct of_device_id ingenic_pinctrl_of_match[] = { 2752baf15647SPaul Cercueil { .compatible = "ingenic,jz4740-pinctrl", .data = &jz4740_chip_info }, 2753baf15647SPaul Cercueil { .compatible = "ingenic,jz4725b-pinctrl", .data = &jz4725b_chip_info }, 2754baf15647SPaul Cercueil { .compatible = "ingenic,jz4760-pinctrl", .data = &jz4760_chip_info }, 27555ffdbb7eSPaul Cercueil { .compatible = "ingenic,jz4760b-pinctrl", .data = &jz4760_chip_info }, 2756baf15647SPaul Cercueil { .compatible = "ingenic,jz4770-pinctrl", .data = &jz4770_chip_info }, 2757baf15647SPaul Cercueil { .compatible = "ingenic,jz4780-pinctrl", .data = &jz4780_chip_info }, 2758baf15647SPaul Cercueil { .compatible = "ingenic,x1000-pinctrl", .data = &x1000_chip_info }, 27595ffdbb7eSPaul Cercueil { .compatible = "ingenic,x1000e-pinctrl", .data = &x1000_chip_info }, 2760baf15647SPaul Cercueil { .compatible = "ingenic,x1500-pinctrl", .data = &x1500_chip_info }, 2761baf15647SPaul Cercueil { .compatible = "ingenic,x1830-pinctrl", .data = &x1830_chip_info }, 2762baf15647SPaul Cercueil {}, 2763baf15647SPaul Cercueil }; 2764baf15647SPaul Cercueil 2765b5c23aa4SPaul Cercueil static struct platform_driver ingenic_pinctrl_driver = { 2766b5c23aa4SPaul Cercueil .driver = { 2767b5c23aa4SPaul Cercueil .name = "pinctrl-ingenic", 27685ec008bfSPaul Cercueil .of_match_table = ingenic_pinctrl_of_match, 2769b5c23aa4SPaul Cercueil }, 2770b5c23aa4SPaul Cercueil }; 2771b5c23aa4SPaul Cercueil 2772b5c23aa4SPaul Cercueil static int __init ingenic_pinctrl_drv_register(void) 2773b5c23aa4SPaul Cercueil { 27744717b11fSPaul Cercueil return platform_driver_probe(&ingenic_pinctrl_driver, 27754717b11fSPaul Cercueil ingenic_pinctrl_probe); 2776b5c23aa4SPaul Cercueil } 2777556a36a7SPaul Cercueil subsys_initcall(ingenic_pinctrl_drv_register); 2778