162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * linux/drivers/pinctrl/pinmux-xway.c 462306a36Sopenharmony_ci * based on linux/drivers/pinctrl/pinmux-pxa910.c 562306a36Sopenharmony_ci * 662306a36Sopenharmony_ci * Copyright (C) 2012 John Crispin <john@phrozen.org> 762306a36Sopenharmony_ci * Copyright (C) 2015 Martin Schiller <mschiller@tdt.de> 862306a36Sopenharmony_ci */ 962306a36Sopenharmony_ci 1062306a36Sopenharmony_ci#include <linux/err.h> 1162306a36Sopenharmony_ci#include <linux/gpio/driver.h> 1262306a36Sopenharmony_ci#include <linux/slab.h> 1362306a36Sopenharmony_ci#include <linux/module.h> 1462306a36Sopenharmony_ci#include <linux/of_platform.h> 1562306a36Sopenharmony_ci#include <linux/of_address.h> 1662306a36Sopenharmony_ci#include <linux/ioport.h> 1762306a36Sopenharmony_ci#include <linux/io.h> 1862306a36Sopenharmony_ci#include <linux/device.h> 1962306a36Sopenharmony_ci#include <linux/platform_device.h> 2062306a36Sopenharmony_ci 2162306a36Sopenharmony_ci#include "pinctrl-lantiq.h" 2262306a36Sopenharmony_ci 2362306a36Sopenharmony_ci#include <lantiq_soc.h> 2462306a36Sopenharmony_ci 2562306a36Sopenharmony_ci/* we have up to 4 banks of 16 bit each */ 2662306a36Sopenharmony_ci#define PINS 16 2762306a36Sopenharmony_ci#define PORT3 3 2862306a36Sopenharmony_ci#define PORT(x) (x / PINS) 2962306a36Sopenharmony_ci#define PORT_PIN(x) (x % PINS) 3062306a36Sopenharmony_ci 3162306a36Sopenharmony_ci/* we have 2 mux bits that can be set for each pin */ 3262306a36Sopenharmony_ci#define MUX_ALT0 0x1 3362306a36Sopenharmony_ci#define MUX_ALT1 0x2 3462306a36Sopenharmony_ci 3562306a36Sopenharmony_ci/* 3662306a36Sopenharmony_ci * each bank has this offset apart from the 4th bank that is mixed into the 3762306a36Sopenharmony_ci * other 3 ranges 3862306a36Sopenharmony_ci */ 3962306a36Sopenharmony_ci#define REG_OFF 0x30 4062306a36Sopenharmony_ci 4162306a36Sopenharmony_ci/* these are the offsets to our registers */ 4262306a36Sopenharmony_ci#define GPIO_BASE(p) (REG_OFF * PORT(p)) 4362306a36Sopenharmony_ci#define GPIO_OUT(p) GPIO_BASE(p) 4462306a36Sopenharmony_ci#define GPIO_IN(p) (GPIO_BASE(p) + 0x04) 4562306a36Sopenharmony_ci#define GPIO_DIR(p) (GPIO_BASE(p) + 0x08) 4662306a36Sopenharmony_ci#define GPIO_ALT0(p) (GPIO_BASE(p) + 0x0C) 4762306a36Sopenharmony_ci#define GPIO_ALT1(p) (GPIO_BASE(p) + 0x10) 4862306a36Sopenharmony_ci#define GPIO_OD(p) (GPIO_BASE(p) + 0x14) 4962306a36Sopenharmony_ci#define GPIO_PUDSEL(p) (GPIO_BASE(p) + 0x1c) 5062306a36Sopenharmony_ci#define GPIO_PUDEN(p) (GPIO_BASE(p) + 0x20) 5162306a36Sopenharmony_ci 5262306a36Sopenharmony_ci/* the 4th port needs special offsets for some registers */ 5362306a36Sopenharmony_ci#define GPIO3_OD (GPIO_BASE(0) + 0x24) 5462306a36Sopenharmony_ci#define GPIO3_PUDSEL (GPIO_BASE(0) + 0x28) 5562306a36Sopenharmony_ci#define GPIO3_PUDEN (GPIO_BASE(0) + 0x2C) 5662306a36Sopenharmony_ci#define GPIO3_ALT1 (GPIO_BASE(PINS) + 0x24) 5762306a36Sopenharmony_ci 5862306a36Sopenharmony_ci/* macros to help us access the registers */ 5962306a36Sopenharmony_ci#define gpio_getbit(m, r, p) (!!(ltq_r32(m + r) & BIT(p))) 6062306a36Sopenharmony_ci#define gpio_setbit(m, r, p) ltq_w32_mask(0, BIT(p), m + r) 6162306a36Sopenharmony_ci#define gpio_clearbit(m, r, p) ltq_w32_mask(BIT(p), 0, m + r) 6262306a36Sopenharmony_ci 6362306a36Sopenharmony_ci#define MFP_XWAY(a, f0, f1, f2, f3) \ 6462306a36Sopenharmony_ci { \ 6562306a36Sopenharmony_ci .name = #a, \ 6662306a36Sopenharmony_ci .pin = a, \ 6762306a36Sopenharmony_ci .func = { \ 6862306a36Sopenharmony_ci XWAY_MUX_##f0, \ 6962306a36Sopenharmony_ci XWAY_MUX_##f1, \ 7062306a36Sopenharmony_ci XWAY_MUX_##f2, \ 7162306a36Sopenharmony_ci XWAY_MUX_##f3, \ 7262306a36Sopenharmony_ci }, \ 7362306a36Sopenharmony_ci } 7462306a36Sopenharmony_ci 7562306a36Sopenharmony_ci#define GRP_MUX(a, m, p) \ 7662306a36Sopenharmony_ci { .name = a, .mux = XWAY_MUX_##m, .pins = p, .npins = ARRAY_SIZE(p), } 7762306a36Sopenharmony_ci 7862306a36Sopenharmony_ci#define FUNC_MUX(f, m) \ 7962306a36Sopenharmony_ci { .func = f, .mux = XWAY_MUX_##m, } 8062306a36Sopenharmony_ci 8162306a36Sopenharmony_cienum xway_mux { 8262306a36Sopenharmony_ci XWAY_MUX_GPIO = 0, 8362306a36Sopenharmony_ci XWAY_MUX_SPI, 8462306a36Sopenharmony_ci XWAY_MUX_ASC, 8562306a36Sopenharmony_ci XWAY_MUX_USIF, 8662306a36Sopenharmony_ci XWAY_MUX_PCI, 8762306a36Sopenharmony_ci XWAY_MUX_CBUS, 8862306a36Sopenharmony_ci XWAY_MUX_CGU, 8962306a36Sopenharmony_ci XWAY_MUX_EBU, 9062306a36Sopenharmony_ci XWAY_MUX_EBU2, 9162306a36Sopenharmony_ci XWAY_MUX_JTAG, 9262306a36Sopenharmony_ci XWAY_MUX_MCD, 9362306a36Sopenharmony_ci XWAY_MUX_EXIN, 9462306a36Sopenharmony_ci XWAY_MUX_TDM, 9562306a36Sopenharmony_ci XWAY_MUX_STP, 9662306a36Sopenharmony_ci XWAY_MUX_SIN, 9762306a36Sopenharmony_ci XWAY_MUX_GPT, 9862306a36Sopenharmony_ci XWAY_MUX_NMI, 9962306a36Sopenharmony_ci XWAY_MUX_MDIO, 10062306a36Sopenharmony_ci XWAY_MUX_MII, 10162306a36Sopenharmony_ci XWAY_MUX_EPHY, 10262306a36Sopenharmony_ci XWAY_MUX_DFE, 10362306a36Sopenharmony_ci XWAY_MUX_SDIO, 10462306a36Sopenharmony_ci XWAY_MUX_GPHY, 10562306a36Sopenharmony_ci XWAY_MUX_SSI, 10662306a36Sopenharmony_ci XWAY_MUX_WIFI, 10762306a36Sopenharmony_ci XWAY_MUX_NONE = 0xffff, 10862306a36Sopenharmony_ci}; 10962306a36Sopenharmony_ci 11062306a36Sopenharmony_ci/* --------- ase related code --------- */ 11162306a36Sopenharmony_ci#define ASE_MAX_PIN 32 11262306a36Sopenharmony_ci 11362306a36Sopenharmony_cistatic const struct ltq_mfp_pin ase_mfp[] = { 11462306a36Sopenharmony_ci /* pin f0 f1 f2 f3 */ 11562306a36Sopenharmony_ci MFP_XWAY(GPIO0, GPIO, EXIN, MII, TDM), 11662306a36Sopenharmony_ci MFP_XWAY(GPIO1, GPIO, STP, DFE, EBU), 11762306a36Sopenharmony_ci MFP_XWAY(GPIO2, GPIO, STP, DFE, EPHY), 11862306a36Sopenharmony_ci MFP_XWAY(GPIO3, GPIO, STP, EPHY, EBU), 11962306a36Sopenharmony_ci MFP_XWAY(GPIO4, GPIO, GPT, EPHY, MII), 12062306a36Sopenharmony_ci MFP_XWAY(GPIO5, GPIO, MII, ASC, GPT), 12162306a36Sopenharmony_ci MFP_XWAY(GPIO6, GPIO, MII, ASC, EXIN), 12262306a36Sopenharmony_ci MFP_XWAY(GPIO7, GPIO, SPI, MII, JTAG), 12362306a36Sopenharmony_ci MFP_XWAY(GPIO8, GPIO, SPI, MII, JTAG), 12462306a36Sopenharmony_ci MFP_XWAY(GPIO9, GPIO, SPI, MII, JTAG), 12562306a36Sopenharmony_ci MFP_XWAY(GPIO10, GPIO, SPI, MII, JTAG), 12662306a36Sopenharmony_ci MFP_XWAY(GPIO11, GPIO, EBU, CGU, JTAG), 12762306a36Sopenharmony_ci MFP_XWAY(GPIO12, GPIO, EBU, MII, SDIO), 12862306a36Sopenharmony_ci MFP_XWAY(GPIO13, GPIO, EBU, MII, CGU), 12962306a36Sopenharmony_ci MFP_XWAY(GPIO14, GPIO, EBU, SPI, CGU), 13062306a36Sopenharmony_ci MFP_XWAY(GPIO15, GPIO, EBU, SPI, SDIO), 13162306a36Sopenharmony_ci MFP_XWAY(GPIO16, GPIO, NONE, NONE, NONE), 13262306a36Sopenharmony_ci MFP_XWAY(GPIO17, GPIO, NONE, NONE, NONE), 13362306a36Sopenharmony_ci MFP_XWAY(GPIO18, GPIO, NONE, NONE, NONE), 13462306a36Sopenharmony_ci MFP_XWAY(GPIO19, GPIO, EBU, MII, SDIO), 13562306a36Sopenharmony_ci MFP_XWAY(GPIO20, GPIO, EBU, MII, SDIO), 13662306a36Sopenharmony_ci MFP_XWAY(GPIO21, GPIO, EBU, MII, EBU2), 13762306a36Sopenharmony_ci MFP_XWAY(GPIO22, GPIO, EBU, MII, CGU), 13862306a36Sopenharmony_ci MFP_XWAY(GPIO23, GPIO, EBU, MII, CGU), 13962306a36Sopenharmony_ci MFP_XWAY(GPIO24, GPIO, EBU, EBU2, MDIO), 14062306a36Sopenharmony_ci MFP_XWAY(GPIO25, GPIO, EBU, MII, GPT), 14162306a36Sopenharmony_ci MFP_XWAY(GPIO26, GPIO, EBU, MII, SDIO), 14262306a36Sopenharmony_ci MFP_XWAY(GPIO27, GPIO, EBU, NONE, MDIO), 14362306a36Sopenharmony_ci MFP_XWAY(GPIO28, GPIO, MII, EBU, SDIO), 14462306a36Sopenharmony_ci MFP_XWAY(GPIO29, GPIO, EBU, MII, EXIN), 14562306a36Sopenharmony_ci MFP_XWAY(GPIO30, GPIO, NONE, NONE, NONE), 14662306a36Sopenharmony_ci MFP_XWAY(GPIO31, GPIO, NONE, NONE, NONE), 14762306a36Sopenharmony_ci}; 14862306a36Sopenharmony_ci 14962306a36Sopenharmony_cistatic const unsigned ase_exin_pin_map[] = {GPIO6, GPIO29, GPIO0}; 15062306a36Sopenharmony_ci 15162306a36Sopenharmony_cistatic const unsigned ase_pins_exin0[] = {GPIO6}; 15262306a36Sopenharmony_cistatic const unsigned ase_pins_exin1[] = {GPIO29}; 15362306a36Sopenharmony_cistatic const unsigned ase_pins_exin2[] = {GPIO0}; 15462306a36Sopenharmony_ci 15562306a36Sopenharmony_cistatic const unsigned ase_pins_jtag[] = {GPIO7, GPIO8, GPIO9, GPIO10, GPIO11}; 15662306a36Sopenharmony_cistatic const unsigned ase_pins_asc[] = {GPIO5, GPIO6}; 15762306a36Sopenharmony_cistatic const unsigned ase_pins_stp[] = {GPIO1, GPIO2, GPIO3}; 15862306a36Sopenharmony_cistatic const unsigned ase_pins_mdio[] = {GPIO24, GPIO27}; 15962306a36Sopenharmony_cistatic const unsigned ase_pins_ephy_led0[] = {GPIO2}; 16062306a36Sopenharmony_cistatic const unsigned ase_pins_ephy_led1[] = {GPIO3}; 16162306a36Sopenharmony_cistatic const unsigned ase_pins_ephy_led2[] = {GPIO4}; 16262306a36Sopenharmony_cistatic const unsigned ase_pins_dfe_led0[] = {GPIO1}; 16362306a36Sopenharmony_cistatic const unsigned ase_pins_dfe_led1[] = {GPIO2}; 16462306a36Sopenharmony_ci 16562306a36Sopenharmony_cistatic const unsigned ase_pins_spi[] = {GPIO8, GPIO9, GPIO10}; /* DEPRECATED */ 16662306a36Sopenharmony_cistatic const unsigned ase_pins_spi_di[] = {GPIO8}; 16762306a36Sopenharmony_cistatic const unsigned ase_pins_spi_do[] = {GPIO9}; 16862306a36Sopenharmony_cistatic const unsigned ase_pins_spi_clk[] = {GPIO10}; 16962306a36Sopenharmony_cistatic const unsigned ase_pins_spi_cs1[] = {GPIO7}; 17062306a36Sopenharmony_cistatic const unsigned ase_pins_spi_cs2[] = {GPIO15}; 17162306a36Sopenharmony_cistatic const unsigned ase_pins_spi_cs3[] = {GPIO14}; 17262306a36Sopenharmony_ci 17362306a36Sopenharmony_cistatic const unsigned ase_pins_gpt1[] = {GPIO5}; 17462306a36Sopenharmony_cistatic const unsigned ase_pins_gpt2[] = {GPIO4}; 17562306a36Sopenharmony_cistatic const unsigned ase_pins_gpt3[] = {GPIO25}; 17662306a36Sopenharmony_ci 17762306a36Sopenharmony_cistatic const unsigned ase_pins_clkout0[] = {GPIO23}; 17862306a36Sopenharmony_cistatic const unsigned ase_pins_clkout1[] = {GPIO22}; 17962306a36Sopenharmony_cistatic const unsigned ase_pins_clkout2[] = {GPIO14}; 18062306a36Sopenharmony_ci 18162306a36Sopenharmony_cistatic const struct ltq_pin_group ase_grps[] = { 18262306a36Sopenharmony_ci GRP_MUX("exin0", EXIN, ase_pins_exin0), 18362306a36Sopenharmony_ci GRP_MUX("exin1", EXIN, ase_pins_exin1), 18462306a36Sopenharmony_ci GRP_MUX("exin2", EXIN, ase_pins_exin2), 18562306a36Sopenharmony_ci GRP_MUX("jtag", JTAG, ase_pins_jtag), 18662306a36Sopenharmony_ci GRP_MUX("spi", SPI, ase_pins_spi), /* DEPRECATED */ 18762306a36Sopenharmony_ci GRP_MUX("spi_di", SPI, ase_pins_spi_di), 18862306a36Sopenharmony_ci GRP_MUX("spi_do", SPI, ase_pins_spi_do), 18962306a36Sopenharmony_ci GRP_MUX("spi_clk", SPI, ase_pins_spi_clk), 19062306a36Sopenharmony_ci GRP_MUX("spi_cs1", SPI, ase_pins_spi_cs1), 19162306a36Sopenharmony_ci GRP_MUX("spi_cs2", SPI, ase_pins_spi_cs2), 19262306a36Sopenharmony_ci GRP_MUX("spi_cs3", SPI, ase_pins_spi_cs3), 19362306a36Sopenharmony_ci GRP_MUX("asc", ASC, ase_pins_asc), 19462306a36Sopenharmony_ci GRP_MUX("stp", STP, ase_pins_stp), 19562306a36Sopenharmony_ci GRP_MUX("gpt1", GPT, ase_pins_gpt1), 19662306a36Sopenharmony_ci GRP_MUX("gpt2", GPT, ase_pins_gpt2), 19762306a36Sopenharmony_ci GRP_MUX("gpt3", GPT, ase_pins_gpt3), 19862306a36Sopenharmony_ci GRP_MUX("clkout0", CGU, ase_pins_clkout0), 19962306a36Sopenharmony_ci GRP_MUX("clkout1", CGU, ase_pins_clkout1), 20062306a36Sopenharmony_ci GRP_MUX("clkout2", CGU, ase_pins_clkout2), 20162306a36Sopenharmony_ci GRP_MUX("mdio", MDIO, ase_pins_mdio), 20262306a36Sopenharmony_ci GRP_MUX("dfe led0", DFE, ase_pins_dfe_led0), 20362306a36Sopenharmony_ci GRP_MUX("dfe led1", DFE, ase_pins_dfe_led1), 20462306a36Sopenharmony_ci GRP_MUX("ephy led0", EPHY, ase_pins_ephy_led0), 20562306a36Sopenharmony_ci GRP_MUX("ephy led1", EPHY, ase_pins_ephy_led1), 20662306a36Sopenharmony_ci GRP_MUX("ephy led2", EPHY, ase_pins_ephy_led2), 20762306a36Sopenharmony_ci}; 20862306a36Sopenharmony_ci 20962306a36Sopenharmony_cistatic const char * const ase_exin_grps[] = {"exin0", "exin1", "exin2"}; 21062306a36Sopenharmony_cistatic const char * const ase_gpt_grps[] = {"gpt1", "gpt2", "gpt3"}; 21162306a36Sopenharmony_cistatic const char * const ase_cgu_grps[] = {"clkout0", "clkout1", 21262306a36Sopenharmony_ci "clkout2"}; 21362306a36Sopenharmony_cistatic const char * const ase_mdio_grps[] = {"mdio"}; 21462306a36Sopenharmony_cistatic const char * const ase_dfe_grps[] = {"dfe led0", "dfe led1"}; 21562306a36Sopenharmony_cistatic const char * const ase_ephy_grps[] = {"ephy led0", "ephy led1", 21662306a36Sopenharmony_ci "ephy led2"}; 21762306a36Sopenharmony_cistatic const char * const ase_asc_grps[] = {"asc"}; 21862306a36Sopenharmony_cistatic const char * const ase_jtag_grps[] = {"jtag"}; 21962306a36Sopenharmony_cistatic const char * const ase_stp_grps[] = {"stp"}; 22062306a36Sopenharmony_cistatic const char * const ase_spi_grps[] = {"spi", /* DEPRECATED */ 22162306a36Sopenharmony_ci "spi_di", "spi_do", 22262306a36Sopenharmony_ci "spi_clk", "spi_cs1", 22362306a36Sopenharmony_ci "spi_cs2", "spi_cs3"}; 22462306a36Sopenharmony_ci 22562306a36Sopenharmony_cistatic const struct ltq_pmx_func ase_funcs[] = { 22662306a36Sopenharmony_ci {"spi", ARRAY_AND_SIZE(ase_spi_grps)}, 22762306a36Sopenharmony_ci {"asc", ARRAY_AND_SIZE(ase_asc_grps)}, 22862306a36Sopenharmony_ci {"cgu", ARRAY_AND_SIZE(ase_cgu_grps)}, 22962306a36Sopenharmony_ci {"jtag", ARRAY_AND_SIZE(ase_jtag_grps)}, 23062306a36Sopenharmony_ci {"exin", ARRAY_AND_SIZE(ase_exin_grps)}, 23162306a36Sopenharmony_ci {"stp", ARRAY_AND_SIZE(ase_stp_grps)}, 23262306a36Sopenharmony_ci {"gpt", ARRAY_AND_SIZE(ase_gpt_grps)}, 23362306a36Sopenharmony_ci {"mdio", ARRAY_AND_SIZE(ase_mdio_grps)}, 23462306a36Sopenharmony_ci {"ephy", ARRAY_AND_SIZE(ase_ephy_grps)}, 23562306a36Sopenharmony_ci {"dfe", ARRAY_AND_SIZE(ase_dfe_grps)}, 23662306a36Sopenharmony_ci}; 23762306a36Sopenharmony_ci 23862306a36Sopenharmony_ci/* --------- danube related code --------- */ 23962306a36Sopenharmony_ci#define DANUBE_MAX_PIN 32 24062306a36Sopenharmony_ci 24162306a36Sopenharmony_cistatic const struct ltq_mfp_pin danube_mfp[] = { 24262306a36Sopenharmony_ci /* pin f0 f1 f2 f3 */ 24362306a36Sopenharmony_ci MFP_XWAY(GPIO0, GPIO, EXIN, SDIO, TDM), 24462306a36Sopenharmony_ci MFP_XWAY(GPIO1, GPIO, EXIN, CBUS, MII), 24562306a36Sopenharmony_ci MFP_XWAY(GPIO2, GPIO, CGU, EXIN, MII), 24662306a36Sopenharmony_ci MFP_XWAY(GPIO3, GPIO, CGU, SDIO, PCI), 24762306a36Sopenharmony_ci MFP_XWAY(GPIO4, GPIO, STP, DFE, ASC), 24862306a36Sopenharmony_ci MFP_XWAY(GPIO5, GPIO, STP, MII, DFE), 24962306a36Sopenharmony_ci MFP_XWAY(GPIO6, GPIO, STP, GPT, ASC), 25062306a36Sopenharmony_ci MFP_XWAY(GPIO7, GPIO, CGU, CBUS, MII), 25162306a36Sopenharmony_ci MFP_XWAY(GPIO8, GPIO, CGU, NMI, MII), 25262306a36Sopenharmony_ci MFP_XWAY(GPIO9, GPIO, ASC, SPI, MII), 25362306a36Sopenharmony_ci MFP_XWAY(GPIO10, GPIO, ASC, SPI, MII), 25462306a36Sopenharmony_ci MFP_XWAY(GPIO11, GPIO, ASC, CBUS, SPI), 25562306a36Sopenharmony_ci MFP_XWAY(GPIO12, GPIO, ASC, CBUS, MCD), 25662306a36Sopenharmony_ci MFP_XWAY(GPIO13, GPIO, EBU, SPI, MII), 25762306a36Sopenharmony_ci MFP_XWAY(GPIO14, GPIO, CGU, CBUS, MII), 25862306a36Sopenharmony_ci MFP_XWAY(GPIO15, GPIO, SPI, SDIO, JTAG), 25962306a36Sopenharmony_ci MFP_XWAY(GPIO16, GPIO, SPI, SDIO, JTAG), 26062306a36Sopenharmony_ci MFP_XWAY(GPIO17, GPIO, SPI, SDIO, JTAG), 26162306a36Sopenharmony_ci MFP_XWAY(GPIO18, GPIO, SPI, SDIO, JTAG), 26262306a36Sopenharmony_ci MFP_XWAY(GPIO19, GPIO, PCI, SDIO, MII), 26362306a36Sopenharmony_ci MFP_XWAY(GPIO20, GPIO, JTAG, SDIO, MII), 26462306a36Sopenharmony_ci MFP_XWAY(GPIO21, GPIO, PCI, EBU, GPT), 26562306a36Sopenharmony_ci MFP_XWAY(GPIO22, GPIO, SPI, MCD, MII), 26662306a36Sopenharmony_ci MFP_XWAY(GPIO23, GPIO, EBU, PCI, STP), 26762306a36Sopenharmony_ci MFP_XWAY(GPIO24, GPIO, EBU, TDM, PCI), 26862306a36Sopenharmony_ci MFP_XWAY(GPIO25, GPIO, TDM, SDIO, ASC), 26962306a36Sopenharmony_ci MFP_XWAY(GPIO26, GPIO, EBU, TDM, SDIO), 27062306a36Sopenharmony_ci MFP_XWAY(GPIO27, GPIO, TDM, SDIO, ASC), 27162306a36Sopenharmony_ci MFP_XWAY(GPIO28, GPIO, GPT, MII, SDIO), 27262306a36Sopenharmony_ci MFP_XWAY(GPIO29, GPIO, PCI, CBUS, MII), 27362306a36Sopenharmony_ci MFP_XWAY(GPIO30, GPIO, PCI, CBUS, MII), 27462306a36Sopenharmony_ci MFP_XWAY(GPIO31, GPIO, EBU, PCI, MII), 27562306a36Sopenharmony_ci}; 27662306a36Sopenharmony_ci 27762306a36Sopenharmony_cistatic const unsigned danube_exin_pin_map[] = {GPIO0, GPIO1, GPIO2}; 27862306a36Sopenharmony_ci 27962306a36Sopenharmony_cistatic const unsigned danube_pins_exin0[] = {GPIO0}; 28062306a36Sopenharmony_cistatic const unsigned danube_pins_exin1[] = {GPIO1}; 28162306a36Sopenharmony_cistatic const unsigned danube_pins_exin2[] = {GPIO2}; 28262306a36Sopenharmony_ci 28362306a36Sopenharmony_cistatic const unsigned danube_pins_jtag[] = {GPIO15, GPIO16, GPIO17, GPIO18, GPIO20}; 28462306a36Sopenharmony_cistatic const unsigned danube_pins_asc0[] = {GPIO11, GPIO12}; 28562306a36Sopenharmony_cistatic const unsigned danube_pins_asc0_cts_rts[] = {GPIO9, GPIO10}; 28662306a36Sopenharmony_cistatic const unsigned danube_pins_stp[] = {GPIO4, GPIO5, GPIO6}; 28762306a36Sopenharmony_cistatic const unsigned danube_pins_nmi[] = {GPIO8}; 28862306a36Sopenharmony_ci 28962306a36Sopenharmony_cistatic const unsigned danube_pins_dfe_led0[] = {GPIO4}; 29062306a36Sopenharmony_cistatic const unsigned danube_pins_dfe_led1[] = {GPIO5}; 29162306a36Sopenharmony_ci 29262306a36Sopenharmony_cistatic const unsigned danube_pins_ebu_a24[] = {GPIO13}; 29362306a36Sopenharmony_cistatic const unsigned danube_pins_ebu_clk[] = {GPIO21}; 29462306a36Sopenharmony_cistatic const unsigned danube_pins_ebu_cs1[] = {GPIO23}; 29562306a36Sopenharmony_cistatic const unsigned danube_pins_ebu_a23[] = {GPIO24}; 29662306a36Sopenharmony_cistatic const unsigned danube_pins_ebu_wait[] = {GPIO26}; 29762306a36Sopenharmony_cistatic const unsigned danube_pins_ebu_a25[] = {GPIO31}; 29862306a36Sopenharmony_ci 29962306a36Sopenharmony_cistatic const unsigned danube_pins_nand_ale[] = {GPIO13}; 30062306a36Sopenharmony_cistatic const unsigned danube_pins_nand_cs1[] = {GPIO23}; 30162306a36Sopenharmony_cistatic const unsigned danube_pins_nand_cle[] = {GPIO24}; 30262306a36Sopenharmony_ci 30362306a36Sopenharmony_cistatic const unsigned danube_pins_spi[] = {GPIO16, GPIO17, GPIO18}; /* DEPRECATED */ 30462306a36Sopenharmony_cistatic const unsigned danube_pins_spi_di[] = {GPIO16}; 30562306a36Sopenharmony_cistatic const unsigned danube_pins_spi_do[] = {GPIO17}; 30662306a36Sopenharmony_cistatic const unsigned danube_pins_spi_clk[] = {GPIO18}; 30762306a36Sopenharmony_cistatic const unsigned danube_pins_spi_cs1[] = {GPIO15}; 30862306a36Sopenharmony_cistatic const unsigned danube_pins_spi_cs2[] = {GPIO21}; 30962306a36Sopenharmony_cistatic const unsigned danube_pins_spi_cs3[] = {GPIO13}; 31062306a36Sopenharmony_cistatic const unsigned danube_pins_spi_cs4[] = {GPIO10}; 31162306a36Sopenharmony_cistatic const unsigned danube_pins_spi_cs5[] = {GPIO9}; 31262306a36Sopenharmony_cistatic const unsigned danube_pins_spi_cs6[] = {GPIO11}; 31362306a36Sopenharmony_ci 31462306a36Sopenharmony_cistatic const unsigned danube_pins_gpt1[] = {GPIO28}; 31562306a36Sopenharmony_cistatic const unsigned danube_pins_gpt2[] = {GPIO21}; 31662306a36Sopenharmony_cistatic const unsigned danube_pins_gpt3[] = {GPIO6}; 31762306a36Sopenharmony_ci 31862306a36Sopenharmony_cistatic const unsigned danube_pins_clkout0[] = {GPIO8}; 31962306a36Sopenharmony_cistatic const unsigned danube_pins_clkout1[] = {GPIO7}; 32062306a36Sopenharmony_cistatic const unsigned danube_pins_clkout2[] = {GPIO3}; 32162306a36Sopenharmony_cistatic const unsigned danube_pins_clkout3[] = {GPIO2}; 32262306a36Sopenharmony_ci 32362306a36Sopenharmony_cistatic const unsigned danube_pins_pci_gnt1[] = {GPIO30}; 32462306a36Sopenharmony_cistatic const unsigned danube_pins_pci_gnt2[] = {GPIO23}; 32562306a36Sopenharmony_cistatic const unsigned danube_pins_pci_gnt3[] = {GPIO19}; 32662306a36Sopenharmony_cistatic const unsigned danube_pins_pci_req1[] = {GPIO29}; 32762306a36Sopenharmony_cistatic const unsigned danube_pins_pci_req2[] = {GPIO31}; 32862306a36Sopenharmony_cistatic const unsigned danube_pins_pci_req3[] = {GPIO3}; 32962306a36Sopenharmony_ci 33062306a36Sopenharmony_cistatic const struct ltq_pin_group danube_grps[] = { 33162306a36Sopenharmony_ci GRP_MUX("exin0", EXIN, danube_pins_exin0), 33262306a36Sopenharmony_ci GRP_MUX("exin1", EXIN, danube_pins_exin1), 33362306a36Sopenharmony_ci GRP_MUX("exin2", EXIN, danube_pins_exin2), 33462306a36Sopenharmony_ci GRP_MUX("jtag", JTAG, danube_pins_jtag), 33562306a36Sopenharmony_ci GRP_MUX("ebu a23", EBU, danube_pins_ebu_a23), 33662306a36Sopenharmony_ci GRP_MUX("ebu a24", EBU, danube_pins_ebu_a24), 33762306a36Sopenharmony_ci GRP_MUX("ebu a25", EBU, danube_pins_ebu_a25), 33862306a36Sopenharmony_ci GRP_MUX("ebu clk", EBU, danube_pins_ebu_clk), 33962306a36Sopenharmony_ci GRP_MUX("ebu cs1", EBU, danube_pins_ebu_cs1), 34062306a36Sopenharmony_ci GRP_MUX("ebu wait", EBU, danube_pins_ebu_wait), 34162306a36Sopenharmony_ci GRP_MUX("nand ale", EBU, danube_pins_nand_ale), 34262306a36Sopenharmony_ci GRP_MUX("nand cs1", EBU, danube_pins_nand_cs1), 34362306a36Sopenharmony_ci GRP_MUX("nand cle", EBU, danube_pins_nand_cle), 34462306a36Sopenharmony_ci GRP_MUX("spi", SPI, danube_pins_spi), /* DEPRECATED */ 34562306a36Sopenharmony_ci GRP_MUX("spi_di", SPI, danube_pins_spi_di), 34662306a36Sopenharmony_ci GRP_MUX("spi_do", SPI, danube_pins_spi_do), 34762306a36Sopenharmony_ci GRP_MUX("spi_clk", SPI, danube_pins_spi_clk), 34862306a36Sopenharmony_ci GRP_MUX("spi_cs1", SPI, danube_pins_spi_cs1), 34962306a36Sopenharmony_ci GRP_MUX("spi_cs2", SPI, danube_pins_spi_cs2), 35062306a36Sopenharmony_ci GRP_MUX("spi_cs3", SPI, danube_pins_spi_cs3), 35162306a36Sopenharmony_ci GRP_MUX("spi_cs4", SPI, danube_pins_spi_cs4), 35262306a36Sopenharmony_ci GRP_MUX("spi_cs5", SPI, danube_pins_spi_cs5), 35362306a36Sopenharmony_ci GRP_MUX("spi_cs6", SPI, danube_pins_spi_cs6), 35462306a36Sopenharmony_ci GRP_MUX("asc0", ASC, danube_pins_asc0), 35562306a36Sopenharmony_ci GRP_MUX("asc0 cts rts", ASC, danube_pins_asc0_cts_rts), 35662306a36Sopenharmony_ci GRP_MUX("stp", STP, danube_pins_stp), 35762306a36Sopenharmony_ci GRP_MUX("nmi", NMI, danube_pins_nmi), 35862306a36Sopenharmony_ci GRP_MUX("gpt1", GPT, danube_pins_gpt1), 35962306a36Sopenharmony_ci GRP_MUX("gpt2", GPT, danube_pins_gpt2), 36062306a36Sopenharmony_ci GRP_MUX("gpt3", GPT, danube_pins_gpt3), 36162306a36Sopenharmony_ci GRP_MUX("clkout0", CGU, danube_pins_clkout0), 36262306a36Sopenharmony_ci GRP_MUX("clkout1", CGU, danube_pins_clkout1), 36362306a36Sopenharmony_ci GRP_MUX("clkout2", CGU, danube_pins_clkout2), 36462306a36Sopenharmony_ci GRP_MUX("clkout3", CGU, danube_pins_clkout3), 36562306a36Sopenharmony_ci GRP_MUX("gnt1", PCI, danube_pins_pci_gnt1), 36662306a36Sopenharmony_ci GRP_MUX("gnt2", PCI, danube_pins_pci_gnt2), 36762306a36Sopenharmony_ci GRP_MUX("gnt3", PCI, danube_pins_pci_gnt3), 36862306a36Sopenharmony_ci GRP_MUX("req1", PCI, danube_pins_pci_req1), 36962306a36Sopenharmony_ci GRP_MUX("req2", PCI, danube_pins_pci_req2), 37062306a36Sopenharmony_ci GRP_MUX("req3", PCI, danube_pins_pci_req3), 37162306a36Sopenharmony_ci GRP_MUX("dfe led0", DFE, danube_pins_dfe_led0), 37262306a36Sopenharmony_ci GRP_MUX("dfe led1", DFE, danube_pins_dfe_led1), 37362306a36Sopenharmony_ci}; 37462306a36Sopenharmony_ci 37562306a36Sopenharmony_cistatic const char * const danube_pci_grps[] = {"gnt1", "gnt2", 37662306a36Sopenharmony_ci "gnt3", "req1", 37762306a36Sopenharmony_ci "req2", "req3"}; 37862306a36Sopenharmony_cistatic const char * const danube_spi_grps[] = {"spi", /* DEPRECATED */ 37962306a36Sopenharmony_ci "spi_di", "spi_do", 38062306a36Sopenharmony_ci "spi_clk", "spi_cs1", 38162306a36Sopenharmony_ci "spi_cs2", "spi_cs3", 38262306a36Sopenharmony_ci "spi_cs4", "spi_cs5", 38362306a36Sopenharmony_ci "spi_cs6"}; 38462306a36Sopenharmony_cistatic const char * const danube_cgu_grps[] = {"clkout0", "clkout1", 38562306a36Sopenharmony_ci "clkout2", "clkout3"}; 38662306a36Sopenharmony_cistatic const char * const danube_ebu_grps[] = {"ebu a23", "ebu a24", 38762306a36Sopenharmony_ci "ebu a25", "ebu cs1", 38862306a36Sopenharmony_ci "ebu wait", "ebu clk", 38962306a36Sopenharmony_ci "nand ale", "nand cs1", 39062306a36Sopenharmony_ci "nand cle"}; 39162306a36Sopenharmony_cistatic const char * const danube_dfe_grps[] = {"dfe led0", "dfe led1"}; 39262306a36Sopenharmony_cistatic const char * const danube_exin_grps[] = {"exin0", "exin1", "exin2"}; 39362306a36Sopenharmony_cistatic const char * const danube_gpt_grps[] = {"gpt1", "gpt2", "gpt3"}; 39462306a36Sopenharmony_cistatic const char * const danube_asc_grps[] = {"asc0", "asc0 cts rts"}; 39562306a36Sopenharmony_cistatic const char * const danube_jtag_grps[] = {"jtag"}; 39662306a36Sopenharmony_cistatic const char * const danube_stp_grps[] = {"stp"}; 39762306a36Sopenharmony_cistatic const char * const danube_nmi_grps[] = {"nmi"}; 39862306a36Sopenharmony_ci 39962306a36Sopenharmony_cistatic const struct ltq_pmx_func danube_funcs[] = { 40062306a36Sopenharmony_ci {"spi", ARRAY_AND_SIZE(danube_spi_grps)}, 40162306a36Sopenharmony_ci {"asc", ARRAY_AND_SIZE(danube_asc_grps)}, 40262306a36Sopenharmony_ci {"cgu", ARRAY_AND_SIZE(danube_cgu_grps)}, 40362306a36Sopenharmony_ci {"jtag", ARRAY_AND_SIZE(danube_jtag_grps)}, 40462306a36Sopenharmony_ci {"exin", ARRAY_AND_SIZE(danube_exin_grps)}, 40562306a36Sopenharmony_ci {"stp", ARRAY_AND_SIZE(danube_stp_grps)}, 40662306a36Sopenharmony_ci {"gpt", ARRAY_AND_SIZE(danube_gpt_grps)}, 40762306a36Sopenharmony_ci {"nmi", ARRAY_AND_SIZE(danube_nmi_grps)}, 40862306a36Sopenharmony_ci {"pci", ARRAY_AND_SIZE(danube_pci_grps)}, 40962306a36Sopenharmony_ci {"ebu", ARRAY_AND_SIZE(danube_ebu_grps)}, 41062306a36Sopenharmony_ci {"dfe", ARRAY_AND_SIZE(danube_dfe_grps)}, 41162306a36Sopenharmony_ci}; 41262306a36Sopenharmony_ci 41362306a36Sopenharmony_ci/* --------- xrx100 related code --------- */ 41462306a36Sopenharmony_ci#define XRX100_MAX_PIN 56 41562306a36Sopenharmony_ci 41662306a36Sopenharmony_cistatic const struct ltq_mfp_pin xrx100_mfp[] = { 41762306a36Sopenharmony_ci /* pin f0 f1 f2 f3 */ 41862306a36Sopenharmony_ci MFP_XWAY(GPIO0, GPIO, EXIN, SDIO, TDM), 41962306a36Sopenharmony_ci MFP_XWAY(GPIO1, GPIO, EXIN, CBUS, SIN), 42062306a36Sopenharmony_ci MFP_XWAY(GPIO2, GPIO, CGU, EXIN, NONE), 42162306a36Sopenharmony_ci MFP_XWAY(GPIO3, GPIO, CGU, SDIO, PCI), 42262306a36Sopenharmony_ci MFP_XWAY(GPIO4, GPIO, STP, DFE, ASC), 42362306a36Sopenharmony_ci MFP_XWAY(GPIO5, GPIO, STP, NONE, DFE), 42462306a36Sopenharmony_ci MFP_XWAY(GPIO6, GPIO, STP, GPT, ASC), 42562306a36Sopenharmony_ci MFP_XWAY(GPIO7, GPIO, CGU, CBUS, NONE), 42662306a36Sopenharmony_ci MFP_XWAY(GPIO8, GPIO, CGU, NMI, NONE), 42762306a36Sopenharmony_ci MFP_XWAY(GPIO9, GPIO, ASC, SPI, EXIN), 42862306a36Sopenharmony_ci MFP_XWAY(GPIO10, GPIO, ASC, SPI, EXIN), 42962306a36Sopenharmony_ci MFP_XWAY(GPIO11, GPIO, ASC, CBUS, SPI), 43062306a36Sopenharmony_ci MFP_XWAY(GPIO12, GPIO, ASC, CBUS, MCD), 43162306a36Sopenharmony_ci MFP_XWAY(GPIO13, GPIO, EBU, SPI, NONE), 43262306a36Sopenharmony_ci MFP_XWAY(GPIO14, GPIO, CGU, NONE, NONE), 43362306a36Sopenharmony_ci MFP_XWAY(GPIO15, GPIO, SPI, SDIO, MCD), 43462306a36Sopenharmony_ci MFP_XWAY(GPIO16, GPIO, SPI, SDIO, NONE), 43562306a36Sopenharmony_ci MFP_XWAY(GPIO17, GPIO, SPI, SDIO, NONE), 43662306a36Sopenharmony_ci MFP_XWAY(GPIO18, GPIO, SPI, SDIO, NONE), 43762306a36Sopenharmony_ci MFP_XWAY(GPIO19, GPIO, PCI, SDIO, CGU), 43862306a36Sopenharmony_ci MFP_XWAY(GPIO20, GPIO, NONE, SDIO, EBU), 43962306a36Sopenharmony_ci MFP_XWAY(GPIO21, GPIO, PCI, EBU, GPT), 44062306a36Sopenharmony_ci MFP_XWAY(GPIO22, GPIO, SPI, NONE, EBU), 44162306a36Sopenharmony_ci MFP_XWAY(GPIO23, GPIO, EBU, PCI, STP), 44262306a36Sopenharmony_ci MFP_XWAY(GPIO24, GPIO, EBU, TDM, PCI), 44362306a36Sopenharmony_ci MFP_XWAY(GPIO25, GPIO, TDM, SDIO, ASC), 44462306a36Sopenharmony_ci MFP_XWAY(GPIO26, GPIO, EBU, TDM, SDIO), 44562306a36Sopenharmony_ci MFP_XWAY(GPIO27, GPIO, TDM, SDIO, ASC), 44662306a36Sopenharmony_ci MFP_XWAY(GPIO28, GPIO, GPT, NONE, SDIO), 44762306a36Sopenharmony_ci MFP_XWAY(GPIO29, GPIO, PCI, CBUS, NONE), 44862306a36Sopenharmony_ci MFP_XWAY(GPIO30, GPIO, PCI, CBUS, NONE), 44962306a36Sopenharmony_ci MFP_XWAY(GPIO31, GPIO, EBU, PCI, NONE), 45062306a36Sopenharmony_ci MFP_XWAY(GPIO32, GPIO, MII, NONE, EBU), 45162306a36Sopenharmony_ci MFP_XWAY(GPIO33, GPIO, MII, NONE, EBU), 45262306a36Sopenharmony_ci MFP_XWAY(GPIO34, GPIO, SIN, SSI, NONE), 45362306a36Sopenharmony_ci MFP_XWAY(GPIO35, GPIO, SIN, SSI, NONE), 45462306a36Sopenharmony_ci MFP_XWAY(GPIO36, GPIO, SIN, SSI, NONE), 45562306a36Sopenharmony_ci MFP_XWAY(GPIO37, GPIO, PCI, NONE, NONE), 45662306a36Sopenharmony_ci MFP_XWAY(GPIO38, GPIO, PCI, NONE, NONE), 45762306a36Sopenharmony_ci MFP_XWAY(GPIO39, GPIO, NONE, EXIN, NONE), 45862306a36Sopenharmony_ci MFP_XWAY(GPIO40, GPIO, MII, TDM, NONE), 45962306a36Sopenharmony_ci MFP_XWAY(GPIO41, GPIO, MII, TDM, NONE), 46062306a36Sopenharmony_ci MFP_XWAY(GPIO42, GPIO, MDIO, NONE, NONE), 46162306a36Sopenharmony_ci MFP_XWAY(GPIO43, GPIO, MDIO, NONE, NONE), 46262306a36Sopenharmony_ci MFP_XWAY(GPIO44, GPIO, MII, SIN, NONE), 46362306a36Sopenharmony_ci MFP_XWAY(GPIO45, GPIO, MII, NONE, SIN), 46462306a36Sopenharmony_ci MFP_XWAY(GPIO46, GPIO, MII, NONE, EXIN), 46562306a36Sopenharmony_ci MFP_XWAY(GPIO47, GPIO, MII, NONE, SIN), 46662306a36Sopenharmony_ci MFP_XWAY(GPIO48, GPIO, EBU, NONE, NONE), 46762306a36Sopenharmony_ci MFP_XWAY(GPIO49, GPIO, EBU, NONE, NONE), 46862306a36Sopenharmony_ci MFP_XWAY(GPIO50, GPIO, NONE, NONE, NONE), 46962306a36Sopenharmony_ci MFP_XWAY(GPIO51, GPIO, NONE, NONE, NONE), 47062306a36Sopenharmony_ci MFP_XWAY(GPIO52, GPIO, NONE, NONE, NONE), 47162306a36Sopenharmony_ci MFP_XWAY(GPIO53, GPIO, NONE, NONE, NONE), 47262306a36Sopenharmony_ci MFP_XWAY(GPIO54, GPIO, NONE, NONE, NONE), 47362306a36Sopenharmony_ci MFP_XWAY(GPIO55, GPIO, NONE, NONE, NONE), 47462306a36Sopenharmony_ci}; 47562306a36Sopenharmony_ci 47662306a36Sopenharmony_cistatic const unsigned xrx100_exin_pin_map[] = {GPIO0, GPIO1, GPIO2, GPIO39, GPIO10, GPIO9}; 47762306a36Sopenharmony_ci 47862306a36Sopenharmony_cistatic const unsigned xrx100_pins_exin0[] = {GPIO0}; 47962306a36Sopenharmony_cistatic const unsigned xrx100_pins_exin1[] = {GPIO1}; 48062306a36Sopenharmony_cistatic const unsigned xrx100_pins_exin2[] = {GPIO2}; 48162306a36Sopenharmony_cistatic const unsigned xrx100_pins_exin3[] = {GPIO39}; 48262306a36Sopenharmony_cistatic const unsigned xrx100_pins_exin4[] = {GPIO10}; 48362306a36Sopenharmony_cistatic const unsigned xrx100_pins_exin5[] = {GPIO9}; 48462306a36Sopenharmony_ci 48562306a36Sopenharmony_cistatic const unsigned xrx100_pins_asc0[] = {GPIO11, GPIO12}; 48662306a36Sopenharmony_cistatic const unsigned xrx100_pins_asc0_cts_rts[] = {GPIO9, GPIO10}; 48762306a36Sopenharmony_cistatic const unsigned xrx100_pins_stp[] = {GPIO4, GPIO5, GPIO6}; 48862306a36Sopenharmony_cistatic const unsigned xrx100_pins_nmi[] = {GPIO8}; 48962306a36Sopenharmony_cistatic const unsigned xrx100_pins_mdio[] = {GPIO42, GPIO43}; 49062306a36Sopenharmony_ci 49162306a36Sopenharmony_cistatic const unsigned xrx100_pins_dfe_led0[] = {GPIO4}; 49262306a36Sopenharmony_cistatic const unsigned xrx100_pins_dfe_led1[] = {GPIO5}; 49362306a36Sopenharmony_ci 49462306a36Sopenharmony_cistatic const unsigned xrx100_pins_ebu_a24[] = {GPIO13}; 49562306a36Sopenharmony_cistatic const unsigned xrx100_pins_ebu_clk[] = {GPIO21}; 49662306a36Sopenharmony_cistatic const unsigned xrx100_pins_ebu_cs1[] = {GPIO23}; 49762306a36Sopenharmony_cistatic const unsigned xrx100_pins_ebu_a23[] = {GPIO24}; 49862306a36Sopenharmony_cistatic const unsigned xrx100_pins_ebu_wait[] = {GPIO26}; 49962306a36Sopenharmony_cistatic const unsigned xrx100_pins_ebu_a25[] = {GPIO31}; 50062306a36Sopenharmony_ci 50162306a36Sopenharmony_cistatic const unsigned xrx100_pins_nand_ale[] = {GPIO13}; 50262306a36Sopenharmony_cistatic const unsigned xrx100_pins_nand_cs1[] = {GPIO23}; 50362306a36Sopenharmony_cistatic const unsigned xrx100_pins_nand_cle[] = {GPIO24}; 50462306a36Sopenharmony_cistatic const unsigned xrx100_pins_nand_rdy[] = {GPIO48}; 50562306a36Sopenharmony_cistatic const unsigned xrx100_pins_nand_rd[] = {GPIO49}; 50662306a36Sopenharmony_ci 50762306a36Sopenharmony_cistatic const unsigned xrx100_pins_spi_di[] = {GPIO16}; 50862306a36Sopenharmony_cistatic const unsigned xrx100_pins_spi_do[] = {GPIO17}; 50962306a36Sopenharmony_cistatic const unsigned xrx100_pins_spi_clk[] = {GPIO18}; 51062306a36Sopenharmony_cistatic const unsigned xrx100_pins_spi_cs1[] = {GPIO15}; 51162306a36Sopenharmony_cistatic const unsigned xrx100_pins_spi_cs2[] = {GPIO22}; 51262306a36Sopenharmony_cistatic const unsigned xrx100_pins_spi_cs3[] = {GPIO13}; 51362306a36Sopenharmony_cistatic const unsigned xrx100_pins_spi_cs4[] = {GPIO10}; 51462306a36Sopenharmony_cistatic const unsigned xrx100_pins_spi_cs5[] = {GPIO9}; 51562306a36Sopenharmony_cistatic const unsigned xrx100_pins_spi_cs6[] = {GPIO11}; 51662306a36Sopenharmony_ci 51762306a36Sopenharmony_cistatic const unsigned xrx100_pins_gpt1[] = {GPIO28}; 51862306a36Sopenharmony_cistatic const unsigned xrx100_pins_gpt2[] = {GPIO21}; 51962306a36Sopenharmony_cistatic const unsigned xrx100_pins_gpt3[] = {GPIO6}; 52062306a36Sopenharmony_ci 52162306a36Sopenharmony_cistatic const unsigned xrx100_pins_clkout0[] = {GPIO8}; 52262306a36Sopenharmony_cistatic const unsigned xrx100_pins_clkout1[] = {GPIO7}; 52362306a36Sopenharmony_cistatic const unsigned xrx100_pins_clkout2[] = {GPIO3}; 52462306a36Sopenharmony_cistatic const unsigned xrx100_pins_clkout3[] = {GPIO2}; 52562306a36Sopenharmony_ci 52662306a36Sopenharmony_cistatic const unsigned xrx100_pins_pci_gnt1[] = {GPIO30}; 52762306a36Sopenharmony_cistatic const unsigned xrx100_pins_pci_gnt2[] = {GPIO23}; 52862306a36Sopenharmony_cistatic const unsigned xrx100_pins_pci_gnt3[] = {GPIO19}; 52962306a36Sopenharmony_cistatic const unsigned xrx100_pins_pci_gnt4[] = {GPIO38}; 53062306a36Sopenharmony_cistatic const unsigned xrx100_pins_pci_req1[] = {GPIO29}; 53162306a36Sopenharmony_cistatic const unsigned xrx100_pins_pci_req2[] = {GPIO31}; 53262306a36Sopenharmony_cistatic const unsigned xrx100_pins_pci_req3[] = {GPIO3}; 53362306a36Sopenharmony_cistatic const unsigned xrx100_pins_pci_req4[] = {GPIO37}; 53462306a36Sopenharmony_ci 53562306a36Sopenharmony_cistatic const struct ltq_pin_group xrx100_grps[] = { 53662306a36Sopenharmony_ci GRP_MUX("exin0", EXIN, xrx100_pins_exin0), 53762306a36Sopenharmony_ci GRP_MUX("exin1", EXIN, xrx100_pins_exin1), 53862306a36Sopenharmony_ci GRP_MUX("exin2", EXIN, xrx100_pins_exin2), 53962306a36Sopenharmony_ci GRP_MUX("exin3", EXIN, xrx100_pins_exin3), 54062306a36Sopenharmony_ci GRP_MUX("exin4", EXIN, xrx100_pins_exin4), 54162306a36Sopenharmony_ci GRP_MUX("exin5", EXIN, xrx100_pins_exin5), 54262306a36Sopenharmony_ci GRP_MUX("ebu a23", EBU, xrx100_pins_ebu_a23), 54362306a36Sopenharmony_ci GRP_MUX("ebu a24", EBU, xrx100_pins_ebu_a24), 54462306a36Sopenharmony_ci GRP_MUX("ebu a25", EBU, xrx100_pins_ebu_a25), 54562306a36Sopenharmony_ci GRP_MUX("ebu clk", EBU, xrx100_pins_ebu_clk), 54662306a36Sopenharmony_ci GRP_MUX("ebu cs1", EBU, xrx100_pins_ebu_cs1), 54762306a36Sopenharmony_ci GRP_MUX("ebu wait", EBU, xrx100_pins_ebu_wait), 54862306a36Sopenharmony_ci GRP_MUX("nand ale", EBU, xrx100_pins_nand_ale), 54962306a36Sopenharmony_ci GRP_MUX("nand cs1", EBU, xrx100_pins_nand_cs1), 55062306a36Sopenharmony_ci GRP_MUX("nand cle", EBU, xrx100_pins_nand_cle), 55162306a36Sopenharmony_ci GRP_MUX("nand rdy", EBU, xrx100_pins_nand_rdy), 55262306a36Sopenharmony_ci GRP_MUX("nand rd", EBU, xrx100_pins_nand_rd), 55362306a36Sopenharmony_ci GRP_MUX("spi_di", SPI, xrx100_pins_spi_di), 55462306a36Sopenharmony_ci GRP_MUX("spi_do", SPI, xrx100_pins_spi_do), 55562306a36Sopenharmony_ci GRP_MUX("spi_clk", SPI, xrx100_pins_spi_clk), 55662306a36Sopenharmony_ci GRP_MUX("spi_cs1", SPI, xrx100_pins_spi_cs1), 55762306a36Sopenharmony_ci GRP_MUX("spi_cs2", SPI, xrx100_pins_spi_cs2), 55862306a36Sopenharmony_ci GRP_MUX("spi_cs3", SPI, xrx100_pins_spi_cs3), 55962306a36Sopenharmony_ci GRP_MUX("spi_cs4", SPI, xrx100_pins_spi_cs4), 56062306a36Sopenharmony_ci GRP_MUX("spi_cs5", SPI, xrx100_pins_spi_cs5), 56162306a36Sopenharmony_ci GRP_MUX("spi_cs6", SPI, xrx100_pins_spi_cs6), 56262306a36Sopenharmony_ci GRP_MUX("asc0", ASC, xrx100_pins_asc0), 56362306a36Sopenharmony_ci GRP_MUX("asc0 cts rts", ASC, xrx100_pins_asc0_cts_rts), 56462306a36Sopenharmony_ci GRP_MUX("stp", STP, xrx100_pins_stp), 56562306a36Sopenharmony_ci GRP_MUX("nmi", NMI, xrx100_pins_nmi), 56662306a36Sopenharmony_ci GRP_MUX("gpt1", GPT, xrx100_pins_gpt1), 56762306a36Sopenharmony_ci GRP_MUX("gpt2", GPT, xrx100_pins_gpt2), 56862306a36Sopenharmony_ci GRP_MUX("gpt3", GPT, xrx100_pins_gpt3), 56962306a36Sopenharmony_ci GRP_MUX("clkout0", CGU, xrx100_pins_clkout0), 57062306a36Sopenharmony_ci GRP_MUX("clkout1", CGU, xrx100_pins_clkout1), 57162306a36Sopenharmony_ci GRP_MUX("clkout2", CGU, xrx100_pins_clkout2), 57262306a36Sopenharmony_ci GRP_MUX("clkout3", CGU, xrx100_pins_clkout3), 57362306a36Sopenharmony_ci GRP_MUX("gnt1", PCI, xrx100_pins_pci_gnt1), 57462306a36Sopenharmony_ci GRP_MUX("gnt2", PCI, xrx100_pins_pci_gnt2), 57562306a36Sopenharmony_ci GRP_MUX("gnt3", PCI, xrx100_pins_pci_gnt3), 57662306a36Sopenharmony_ci GRP_MUX("gnt4", PCI, xrx100_pins_pci_gnt4), 57762306a36Sopenharmony_ci GRP_MUX("req1", PCI, xrx100_pins_pci_req1), 57862306a36Sopenharmony_ci GRP_MUX("req2", PCI, xrx100_pins_pci_req2), 57962306a36Sopenharmony_ci GRP_MUX("req3", PCI, xrx100_pins_pci_req3), 58062306a36Sopenharmony_ci GRP_MUX("req4", PCI, xrx100_pins_pci_req4), 58162306a36Sopenharmony_ci GRP_MUX("mdio", MDIO, xrx100_pins_mdio), 58262306a36Sopenharmony_ci GRP_MUX("dfe led0", DFE, xrx100_pins_dfe_led0), 58362306a36Sopenharmony_ci GRP_MUX("dfe led1", DFE, xrx100_pins_dfe_led1), 58462306a36Sopenharmony_ci}; 58562306a36Sopenharmony_ci 58662306a36Sopenharmony_cistatic const char * const xrx100_pci_grps[] = {"gnt1", "gnt2", 58762306a36Sopenharmony_ci "gnt3", "gnt4", 58862306a36Sopenharmony_ci "req1", "req2", 58962306a36Sopenharmony_ci "req3", "req4"}; 59062306a36Sopenharmony_cistatic const char * const xrx100_spi_grps[] = {"spi_di", "spi_do", 59162306a36Sopenharmony_ci "spi_clk", "spi_cs1", 59262306a36Sopenharmony_ci "spi_cs2", "spi_cs3", 59362306a36Sopenharmony_ci "spi_cs4", "spi_cs5", 59462306a36Sopenharmony_ci "spi_cs6"}; 59562306a36Sopenharmony_cistatic const char * const xrx100_cgu_grps[] = {"clkout0", "clkout1", 59662306a36Sopenharmony_ci "clkout2", "clkout3"}; 59762306a36Sopenharmony_cistatic const char * const xrx100_ebu_grps[] = {"ebu a23", "ebu a24", 59862306a36Sopenharmony_ci "ebu a25", "ebu cs1", 59962306a36Sopenharmony_ci "ebu wait", "ebu clk", 60062306a36Sopenharmony_ci "nand ale", "nand cs1", 60162306a36Sopenharmony_ci "nand cle", "nand rdy", 60262306a36Sopenharmony_ci "nand rd"}; 60362306a36Sopenharmony_cistatic const char * const xrx100_exin_grps[] = {"exin0", "exin1", "exin2", 60462306a36Sopenharmony_ci "exin3", "exin4", "exin5"}; 60562306a36Sopenharmony_cistatic const char * const xrx100_gpt_grps[] = {"gpt1", "gpt2", "gpt3"}; 60662306a36Sopenharmony_cistatic const char * const xrx100_asc_grps[] = {"asc0", "asc0 cts rts"}; 60762306a36Sopenharmony_cistatic const char * const xrx100_stp_grps[] = {"stp"}; 60862306a36Sopenharmony_cistatic const char * const xrx100_nmi_grps[] = {"nmi"}; 60962306a36Sopenharmony_cistatic const char * const xrx100_mdio_grps[] = {"mdio"}; 61062306a36Sopenharmony_cistatic const char * const xrx100_dfe_grps[] = {"dfe led0", "dfe led1"}; 61162306a36Sopenharmony_ci 61262306a36Sopenharmony_cistatic const struct ltq_pmx_func xrx100_funcs[] = { 61362306a36Sopenharmony_ci {"spi", ARRAY_AND_SIZE(xrx100_spi_grps)}, 61462306a36Sopenharmony_ci {"asc", ARRAY_AND_SIZE(xrx100_asc_grps)}, 61562306a36Sopenharmony_ci {"cgu", ARRAY_AND_SIZE(xrx100_cgu_grps)}, 61662306a36Sopenharmony_ci {"exin", ARRAY_AND_SIZE(xrx100_exin_grps)}, 61762306a36Sopenharmony_ci {"stp", ARRAY_AND_SIZE(xrx100_stp_grps)}, 61862306a36Sopenharmony_ci {"gpt", ARRAY_AND_SIZE(xrx100_gpt_grps)}, 61962306a36Sopenharmony_ci {"nmi", ARRAY_AND_SIZE(xrx100_nmi_grps)}, 62062306a36Sopenharmony_ci {"pci", ARRAY_AND_SIZE(xrx100_pci_grps)}, 62162306a36Sopenharmony_ci {"ebu", ARRAY_AND_SIZE(xrx100_ebu_grps)}, 62262306a36Sopenharmony_ci {"mdio", ARRAY_AND_SIZE(xrx100_mdio_grps)}, 62362306a36Sopenharmony_ci {"dfe", ARRAY_AND_SIZE(xrx100_dfe_grps)}, 62462306a36Sopenharmony_ci}; 62562306a36Sopenharmony_ci 62662306a36Sopenharmony_ci/* --------- xrx200 related code --------- */ 62762306a36Sopenharmony_ci#define XRX200_MAX_PIN 50 62862306a36Sopenharmony_ci 62962306a36Sopenharmony_cistatic const struct ltq_mfp_pin xrx200_mfp[] = { 63062306a36Sopenharmony_ci /* pin f0 f1 f2 f3 */ 63162306a36Sopenharmony_ci MFP_XWAY(GPIO0, GPIO, EXIN, SDIO, TDM), 63262306a36Sopenharmony_ci MFP_XWAY(GPIO1, GPIO, EXIN, CBUS, SIN), 63362306a36Sopenharmony_ci MFP_XWAY(GPIO2, GPIO, CGU, EXIN, GPHY), 63462306a36Sopenharmony_ci MFP_XWAY(GPIO3, GPIO, CGU, SDIO, PCI), 63562306a36Sopenharmony_ci MFP_XWAY(GPIO4, GPIO, STP, DFE, USIF), 63662306a36Sopenharmony_ci MFP_XWAY(GPIO5, GPIO, STP, GPHY, DFE), 63762306a36Sopenharmony_ci MFP_XWAY(GPIO6, GPIO, STP, GPT, USIF), 63862306a36Sopenharmony_ci MFP_XWAY(GPIO7, GPIO, CGU, CBUS, GPHY), 63962306a36Sopenharmony_ci MFP_XWAY(GPIO8, GPIO, CGU, NMI, NONE), 64062306a36Sopenharmony_ci MFP_XWAY(GPIO9, GPIO, USIF, SPI, EXIN), 64162306a36Sopenharmony_ci MFP_XWAY(GPIO10, GPIO, USIF, SPI, EXIN), 64262306a36Sopenharmony_ci MFP_XWAY(GPIO11, GPIO, USIF, CBUS, SPI), 64362306a36Sopenharmony_ci MFP_XWAY(GPIO12, GPIO, USIF, CBUS, MCD), 64462306a36Sopenharmony_ci MFP_XWAY(GPIO13, GPIO, EBU, SPI, NONE), 64562306a36Sopenharmony_ci MFP_XWAY(GPIO14, GPIO, CGU, CBUS, USIF), 64662306a36Sopenharmony_ci MFP_XWAY(GPIO15, GPIO, SPI, SDIO, MCD), 64762306a36Sopenharmony_ci MFP_XWAY(GPIO16, GPIO, SPI, SDIO, NONE), 64862306a36Sopenharmony_ci MFP_XWAY(GPIO17, GPIO, SPI, SDIO, NONE), 64962306a36Sopenharmony_ci MFP_XWAY(GPIO18, GPIO, SPI, SDIO, NONE), 65062306a36Sopenharmony_ci MFP_XWAY(GPIO19, GPIO, PCI, SDIO, CGU), 65162306a36Sopenharmony_ci MFP_XWAY(GPIO20, GPIO, NONE, SDIO, EBU), 65262306a36Sopenharmony_ci MFP_XWAY(GPIO21, GPIO, PCI, EBU, GPT), 65362306a36Sopenharmony_ci MFP_XWAY(GPIO22, GPIO, SPI, CGU, EBU), 65462306a36Sopenharmony_ci MFP_XWAY(GPIO23, GPIO, EBU, PCI, STP), 65562306a36Sopenharmony_ci MFP_XWAY(GPIO24, GPIO, EBU, TDM, PCI), 65662306a36Sopenharmony_ci MFP_XWAY(GPIO25, GPIO, TDM, SDIO, USIF), 65762306a36Sopenharmony_ci MFP_XWAY(GPIO26, GPIO, EBU, TDM, SDIO), 65862306a36Sopenharmony_ci MFP_XWAY(GPIO27, GPIO, TDM, SDIO, USIF), 65962306a36Sopenharmony_ci MFP_XWAY(GPIO28, GPIO, GPT, PCI, SDIO), 66062306a36Sopenharmony_ci MFP_XWAY(GPIO29, GPIO, PCI, CBUS, EXIN), 66162306a36Sopenharmony_ci MFP_XWAY(GPIO30, GPIO, PCI, CBUS, NONE), 66262306a36Sopenharmony_ci MFP_XWAY(GPIO31, GPIO, EBU, PCI, NONE), 66362306a36Sopenharmony_ci MFP_XWAY(GPIO32, GPIO, MII, NONE, EBU), 66462306a36Sopenharmony_ci MFP_XWAY(GPIO33, GPIO, MII, NONE, EBU), 66562306a36Sopenharmony_ci MFP_XWAY(GPIO34, GPIO, SIN, SSI, NONE), 66662306a36Sopenharmony_ci MFP_XWAY(GPIO35, GPIO, SIN, SSI, NONE), 66762306a36Sopenharmony_ci MFP_XWAY(GPIO36, GPIO, SIN, SSI, EXIN), 66862306a36Sopenharmony_ci MFP_XWAY(GPIO37, GPIO, USIF, NONE, PCI), 66962306a36Sopenharmony_ci MFP_XWAY(GPIO38, GPIO, PCI, USIF, NONE), 67062306a36Sopenharmony_ci MFP_XWAY(GPIO39, GPIO, USIF, EXIN, NONE), 67162306a36Sopenharmony_ci MFP_XWAY(GPIO40, GPIO, MII, TDM, NONE), 67262306a36Sopenharmony_ci MFP_XWAY(GPIO41, GPIO, MII, TDM, NONE), 67362306a36Sopenharmony_ci MFP_XWAY(GPIO42, GPIO, MDIO, NONE, NONE), 67462306a36Sopenharmony_ci MFP_XWAY(GPIO43, GPIO, MDIO, NONE, NONE), 67562306a36Sopenharmony_ci MFP_XWAY(GPIO44, GPIO, MII, SIN, GPHY), 67662306a36Sopenharmony_ci MFP_XWAY(GPIO45, GPIO, MII, GPHY, SIN), 67762306a36Sopenharmony_ci MFP_XWAY(GPIO46, GPIO, MII, NONE, EXIN), 67862306a36Sopenharmony_ci MFP_XWAY(GPIO47, GPIO, MII, GPHY, SIN), 67962306a36Sopenharmony_ci MFP_XWAY(GPIO48, GPIO, EBU, NONE, NONE), 68062306a36Sopenharmony_ci MFP_XWAY(GPIO49, GPIO, EBU, NONE, NONE), 68162306a36Sopenharmony_ci}; 68262306a36Sopenharmony_ci 68362306a36Sopenharmony_cistatic const unsigned xrx200_exin_pin_map[] = {GPIO0, GPIO1, GPIO2, GPIO39, GPIO10, GPIO9}; 68462306a36Sopenharmony_ci 68562306a36Sopenharmony_cistatic const unsigned xrx200_pins_exin0[] = {GPIO0}; 68662306a36Sopenharmony_cistatic const unsigned xrx200_pins_exin1[] = {GPIO1}; 68762306a36Sopenharmony_cistatic const unsigned xrx200_pins_exin2[] = {GPIO2}; 68862306a36Sopenharmony_cistatic const unsigned xrx200_pins_exin3[] = {GPIO39}; 68962306a36Sopenharmony_cistatic const unsigned xrx200_pins_exin4[] = {GPIO10}; 69062306a36Sopenharmony_cistatic const unsigned xrx200_pins_exin5[] = {GPIO9}; 69162306a36Sopenharmony_ci 69262306a36Sopenharmony_cistatic const unsigned xrx200_pins_usif_uart_rx[] = {GPIO11}; 69362306a36Sopenharmony_cistatic const unsigned xrx200_pins_usif_uart_tx[] = {GPIO12}; 69462306a36Sopenharmony_cistatic const unsigned xrx200_pins_usif_uart_rts[] = {GPIO9}; 69562306a36Sopenharmony_cistatic const unsigned xrx200_pins_usif_uart_cts[] = {GPIO10}; 69662306a36Sopenharmony_cistatic const unsigned xrx200_pins_usif_uart_dtr[] = {GPIO4}; 69762306a36Sopenharmony_cistatic const unsigned xrx200_pins_usif_uart_dsr[] = {GPIO6}; 69862306a36Sopenharmony_cistatic const unsigned xrx200_pins_usif_uart_dcd[] = {GPIO25}; 69962306a36Sopenharmony_cistatic const unsigned xrx200_pins_usif_uart_ri[] = {GPIO27}; 70062306a36Sopenharmony_ci 70162306a36Sopenharmony_cistatic const unsigned xrx200_pins_usif_spi_di[] = {GPIO11}; 70262306a36Sopenharmony_cistatic const unsigned xrx200_pins_usif_spi_do[] = {GPIO12}; 70362306a36Sopenharmony_cistatic const unsigned xrx200_pins_usif_spi_clk[] = {GPIO38}; 70462306a36Sopenharmony_cistatic const unsigned xrx200_pins_usif_spi_cs0[] = {GPIO37}; 70562306a36Sopenharmony_cistatic const unsigned xrx200_pins_usif_spi_cs1[] = {GPIO39}; 70662306a36Sopenharmony_cistatic const unsigned xrx200_pins_usif_spi_cs2[] = {GPIO14}; 70762306a36Sopenharmony_ci 70862306a36Sopenharmony_cistatic const unsigned xrx200_pins_stp[] = {GPIO4, GPIO5, GPIO6}; 70962306a36Sopenharmony_cistatic const unsigned xrx200_pins_nmi[] = {GPIO8}; 71062306a36Sopenharmony_cistatic const unsigned xrx200_pins_mdio[] = {GPIO42, GPIO43}; 71162306a36Sopenharmony_ci 71262306a36Sopenharmony_cistatic const unsigned xrx200_pins_dfe_led0[] = {GPIO4}; 71362306a36Sopenharmony_cistatic const unsigned xrx200_pins_dfe_led1[] = {GPIO5}; 71462306a36Sopenharmony_ci 71562306a36Sopenharmony_cistatic const unsigned xrx200_pins_gphy0_led0[] = {GPIO5}; 71662306a36Sopenharmony_cistatic const unsigned xrx200_pins_gphy0_led1[] = {GPIO7}; 71762306a36Sopenharmony_cistatic const unsigned xrx200_pins_gphy0_led2[] = {GPIO2}; 71862306a36Sopenharmony_cistatic const unsigned xrx200_pins_gphy1_led0[] = {GPIO44}; 71962306a36Sopenharmony_cistatic const unsigned xrx200_pins_gphy1_led1[] = {GPIO45}; 72062306a36Sopenharmony_cistatic const unsigned xrx200_pins_gphy1_led2[] = {GPIO47}; 72162306a36Sopenharmony_ci 72262306a36Sopenharmony_cistatic const unsigned xrx200_pins_ebu_a24[] = {GPIO13}; 72362306a36Sopenharmony_cistatic const unsigned xrx200_pins_ebu_clk[] = {GPIO21}; 72462306a36Sopenharmony_cistatic const unsigned xrx200_pins_ebu_cs1[] = {GPIO23}; 72562306a36Sopenharmony_cistatic const unsigned xrx200_pins_ebu_a23[] = {GPIO24}; 72662306a36Sopenharmony_cistatic const unsigned xrx200_pins_ebu_wait[] = {GPIO26}; 72762306a36Sopenharmony_cistatic const unsigned xrx200_pins_ebu_a25[] = {GPIO31}; 72862306a36Sopenharmony_ci 72962306a36Sopenharmony_cistatic const unsigned xrx200_pins_nand_ale[] = {GPIO13}; 73062306a36Sopenharmony_cistatic const unsigned xrx200_pins_nand_cs1[] = {GPIO23}; 73162306a36Sopenharmony_cistatic const unsigned xrx200_pins_nand_cle[] = {GPIO24}; 73262306a36Sopenharmony_cistatic const unsigned xrx200_pins_nand_rdy[] = {GPIO48}; 73362306a36Sopenharmony_cistatic const unsigned xrx200_pins_nand_rd[] = {GPIO49}; 73462306a36Sopenharmony_ci 73562306a36Sopenharmony_cistatic const unsigned xrx200_pins_spi_di[] = {GPIO16}; 73662306a36Sopenharmony_cistatic const unsigned xrx200_pins_spi_do[] = {GPIO17}; 73762306a36Sopenharmony_cistatic const unsigned xrx200_pins_spi_clk[] = {GPIO18}; 73862306a36Sopenharmony_cistatic const unsigned xrx200_pins_spi_cs1[] = {GPIO15}; 73962306a36Sopenharmony_cistatic const unsigned xrx200_pins_spi_cs2[] = {GPIO22}; 74062306a36Sopenharmony_cistatic const unsigned xrx200_pins_spi_cs3[] = {GPIO13}; 74162306a36Sopenharmony_cistatic const unsigned xrx200_pins_spi_cs4[] = {GPIO10}; 74262306a36Sopenharmony_cistatic const unsigned xrx200_pins_spi_cs5[] = {GPIO9}; 74362306a36Sopenharmony_cistatic const unsigned xrx200_pins_spi_cs6[] = {GPIO11}; 74462306a36Sopenharmony_ci 74562306a36Sopenharmony_cistatic const unsigned xrx200_pins_gpt1[] = {GPIO28}; 74662306a36Sopenharmony_cistatic const unsigned xrx200_pins_gpt2[] = {GPIO21}; 74762306a36Sopenharmony_cistatic const unsigned xrx200_pins_gpt3[] = {GPIO6}; 74862306a36Sopenharmony_ci 74962306a36Sopenharmony_cistatic const unsigned xrx200_pins_clkout0[] = {GPIO8}; 75062306a36Sopenharmony_cistatic const unsigned xrx200_pins_clkout1[] = {GPIO7}; 75162306a36Sopenharmony_cistatic const unsigned xrx200_pins_clkout2[] = {GPIO3}; 75262306a36Sopenharmony_cistatic const unsigned xrx200_pins_clkout3[] = {GPIO2}; 75362306a36Sopenharmony_ci 75462306a36Sopenharmony_cistatic const unsigned xrx200_pins_pci_gnt1[] = {GPIO28}; 75562306a36Sopenharmony_cistatic const unsigned xrx200_pins_pci_gnt2[] = {GPIO23}; 75662306a36Sopenharmony_cistatic const unsigned xrx200_pins_pci_gnt3[] = {GPIO19}; 75762306a36Sopenharmony_cistatic const unsigned xrx200_pins_pci_gnt4[] = {GPIO38}; 75862306a36Sopenharmony_cistatic const unsigned xrx200_pins_pci_req1[] = {GPIO29}; 75962306a36Sopenharmony_cistatic const unsigned xrx200_pins_pci_req2[] = {GPIO31}; 76062306a36Sopenharmony_cistatic const unsigned xrx200_pins_pci_req3[] = {GPIO3}; 76162306a36Sopenharmony_cistatic const unsigned xrx200_pins_pci_req4[] = {GPIO37}; 76262306a36Sopenharmony_ci 76362306a36Sopenharmony_cistatic const struct ltq_pin_group xrx200_grps[] = { 76462306a36Sopenharmony_ci GRP_MUX("exin0", EXIN, xrx200_pins_exin0), 76562306a36Sopenharmony_ci GRP_MUX("exin1", EXIN, xrx200_pins_exin1), 76662306a36Sopenharmony_ci GRP_MUX("exin2", EXIN, xrx200_pins_exin2), 76762306a36Sopenharmony_ci GRP_MUX("exin3", EXIN, xrx200_pins_exin3), 76862306a36Sopenharmony_ci GRP_MUX("exin4", EXIN, xrx200_pins_exin4), 76962306a36Sopenharmony_ci GRP_MUX("exin5", EXIN, xrx200_pins_exin5), 77062306a36Sopenharmony_ci GRP_MUX("ebu a23", EBU, xrx200_pins_ebu_a23), 77162306a36Sopenharmony_ci GRP_MUX("ebu a24", EBU, xrx200_pins_ebu_a24), 77262306a36Sopenharmony_ci GRP_MUX("ebu a25", EBU, xrx200_pins_ebu_a25), 77362306a36Sopenharmony_ci GRP_MUX("ebu clk", EBU, xrx200_pins_ebu_clk), 77462306a36Sopenharmony_ci GRP_MUX("ebu cs1", EBU, xrx200_pins_ebu_cs1), 77562306a36Sopenharmony_ci GRP_MUX("ebu wait", EBU, xrx200_pins_ebu_wait), 77662306a36Sopenharmony_ci GRP_MUX("nand ale", EBU, xrx200_pins_nand_ale), 77762306a36Sopenharmony_ci GRP_MUX("nand cs1", EBU, xrx200_pins_nand_cs1), 77862306a36Sopenharmony_ci GRP_MUX("nand cle", EBU, xrx200_pins_nand_cle), 77962306a36Sopenharmony_ci GRP_MUX("nand rdy", EBU, xrx200_pins_nand_rdy), 78062306a36Sopenharmony_ci GRP_MUX("nand rd", EBU, xrx200_pins_nand_rd), 78162306a36Sopenharmony_ci GRP_MUX("spi_di", SPI, xrx200_pins_spi_di), 78262306a36Sopenharmony_ci GRP_MUX("spi_do", SPI, xrx200_pins_spi_do), 78362306a36Sopenharmony_ci GRP_MUX("spi_clk", SPI, xrx200_pins_spi_clk), 78462306a36Sopenharmony_ci GRP_MUX("spi_cs1", SPI, xrx200_pins_spi_cs1), 78562306a36Sopenharmony_ci GRP_MUX("spi_cs2", SPI, xrx200_pins_spi_cs2), 78662306a36Sopenharmony_ci GRP_MUX("spi_cs3", SPI, xrx200_pins_spi_cs3), 78762306a36Sopenharmony_ci GRP_MUX("spi_cs4", SPI, xrx200_pins_spi_cs4), 78862306a36Sopenharmony_ci GRP_MUX("spi_cs5", SPI, xrx200_pins_spi_cs5), 78962306a36Sopenharmony_ci GRP_MUX("spi_cs6", SPI, xrx200_pins_spi_cs6), 79062306a36Sopenharmony_ci GRP_MUX("usif uart_rx", USIF, xrx200_pins_usif_uart_rx), 79162306a36Sopenharmony_ci GRP_MUX("usif uart_tx", USIF, xrx200_pins_usif_uart_tx), 79262306a36Sopenharmony_ci GRP_MUX("usif uart_rts", USIF, xrx200_pins_usif_uart_rts), 79362306a36Sopenharmony_ci GRP_MUX("usif uart_cts", USIF, xrx200_pins_usif_uart_cts), 79462306a36Sopenharmony_ci GRP_MUX("usif uart_dtr", USIF, xrx200_pins_usif_uart_dtr), 79562306a36Sopenharmony_ci GRP_MUX("usif uart_dsr", USIF, xrx200_pins_usif_uart_dsr), 79662306a36Sopenharmony_ci GRP_MUX("usif uart_dcd", USIF, xrx200_pins_usif_uart_dcd), 79762306a36Sopenharmony_ci GRP_MUX("usif uart_ri", USIF, xrx200_pins_usif_uart_ri), 79862306a36Sopenharmony_ci GRP_MUX("usif spi_di", USIF, xrx200_pins_usif_spi_di), 79962306a36Sopenharmony_ci GRP_MUX("usif spi_do", USIF, xrx200_pins_usif_spi_do), 80062306a36Sopenharmony_ci GRP_MUX("usif spi_clk", USIF, xrx200_pins_usif_spi_clk), 80162306a36Sopenharmony_ci GRP_MUX("usif spi_cs0", USIF, xrx200_pins_usif_spi_cs0), 80262306a36Sopenharmony_ci GRP_MUX("usif spi_cs1", USIF, xrx200_pins_usif_spi_cs1), 80362306a36Sopenharmony_ci GRP_MUX("usif spi_cs2", USIF, xrx200_pins_usif_spi_cs2), 80462306a36Sopenharmony_ci GRP_MUX("stp", STP, xrx200_pins_stp), 80562306a36Sopenharmony_ci GRP_MUX("nmi", NMI, xrx200_pins_nmi), 80662306a36Sopenharmony_ci GRP_MUX("gpt1", GPT, xrx200_pins_gpt1), 80762306a36Sopenharmony_ci GRP_MUX("gpt2", GPT, xrx200_pins_gpt2), 80862306a36Sopenharmony_ci GRP_MUX("gpt3", GPT, xrx200_pins_gpt3), 80962306a36Sopenharmony_ci GRP_MUX("clkout0", CGU, xrx200_pins_clkout0), 81062306a36Sopenharmony_ci GRP_MUX("clkout1", CGU, xrx200_pins_clkout1), 81162306a36Sopenharmony_ci GRP_MUX("clkout2", CGU, xrx200_pins_clkout2), 81262306a36Sopenharmony_ci GRP_MUX("clkout3", CGU, xrx200_pins_clkout3), 81362306a36Sopenharmony_ci GRP_MUX("gnt1", PCI, xrx200_pins_pci_gnt1), 81462306a36Sopenharmony_ci GRP_MUX("gnt2", PCI, xrx200_pins_pci_gnt2), 81562306a36Sopenharmony_ci GRP_MUX("gnt3", PCI, xrx200_pins_pci_gnt3), 81662306a36Sopenharmony_ci GRP_MUX("gnt4", PCI, xrx200_pins_pci_gnt4), 81762306a36Sopenharmony_ci GRP_MUX("req1", PCI, xrx200_pins_pci_req1), 81862306a36Sopenharmony_ci GRP_MUX("req2", PCI, xrx200_pins_pci_req2), 81962306a36Sopenharmony_ci GRP_MUX("req3", PCI, xrx200_pins_pci_req3), 82062306a36Sopenharmony_ci GRP_MUX("req4", PCI, xrx200_pins_pci_req4), 82162306a36Sopenharmony_ci GRP_MUX("mdio", MDIO, xrx200_pins_mdio), 82262306a36Sopenharmony_ci GRP_MUX("dfe led0", DFE, xrx200_pins_dfe_led0), 82362306a36Sopenharmony_ci GRP_MUX("dfe led1", DFE, xrx200_pins_dfe_led1), 82462306a36Sopenharmony_ci GRP_MUX("gphy0 led0", GPHY, xrx200_pins_gphy0_led0), 82562306a36Sopenharmony_ci GRP_MUX("gphy0 led1", GPHY, xrx200_pins_gphy0_led1), 82662306a36Sopenharmony_ci GRP_MUX("gphy0 led2", GPHY, xrx200_pins_gphy0_led2), 82762306a36Sopenharmony_ci GRP_MUX("gphy1 led0", GPHY, xrx200_pins_gphy1_led0), 82862306a36Sopenharmony_ci GRP_MUX("gphy1 led1", GPHY, xrx200_pins_gphy1_led1), 82962306a36Sopenharmony_ci GRP_MUX("gphy1 led2", GPHY, xrx200_pins_gphy1_led2), 83062306a36Sopenharmony_ci}; 83162306a36Sopenharmony_ci 83262306a36Sopenharmony_cistatic const char * const xrx200_pci_grps[] = {"gnt1", "gnt2", 83362306a36Sopenharmony_ci "gnt3", "gnt4", 83462306a36Sopenharmony_ci "req1", "req2", 83562306a36Sopenharmony_ci "req3", "req4"}; 83662306a36Sopenharmony_cistatic const char * const xrx200_spi_grps[] = {"spi_di", "spi_do", 83762306a36Sopenharmony_ci "spi_clk", "spi_cs1", 83862306a36Sopenharmony_ci "spi_cs2", "spi_cs3", 83962306a36Sopenharmony_ci "spi_cs4", "spi_cs5", 84062306a36Sopenharmony_ci "spi_cs6"}; 84162306a36Sopenharmony_cistatic const char * const xrx200_cgu_grps[] = {"clkout0", "clkout1", 84262306a36Sopenharmony_ci "clkout2", "clkout3"}; 84362306a36Sopenharmony_cistatic const char * const xrx200_ebu_grps[] = {"ebu a23", "ebu a24", 84462306a36Sopenharmony_ci "ebu a25", "ebu cs1", 84562306a36Sopenharmony_ci "ebu wait", "ebu clk", 84662306a36Sopenharmony_ci "nand ale", "nand cs1", 84762306a36Sopenharmony_ci "nand cle", "nand rdy", 84862306a36Sopenharmony_ci "nand rd"}; 84962306a36Sopenharmony_cistatic const char * const xrx200_exin_grps[] = {"exin0", "exin1", "exin2", 85062306a36Sopenharmony_ci "exin3", "exin4", "exin5"}; 85162306a36Sopenharmony_cistatic const char * const xrx200_gpt_grps[] = {"gpt1", "gpt2", "gpt3"}; 85262306a36Sopenharmony_cistatic const char * const xrx200_usif_grps[] = {"usif uart_rx", "usif uart_tx", 85362306a36Sopenharmony_ci "usif uart_rts", "usif uart_cts", 85462306a36Sopenharmony_ci "usif uart_dtr", "usif uart_dsr", 85562306a36Sopenharmony_ci "usif uart_dcd", "usif uart_ri", 85662306a36Sopenharmony_ci "usif spi_di", "usif spi_do", 85762306a36Sopenharmony_ci "usif spi_clk", "usif spi_cs0", 85862306a36Sopenharmony_ci "usif spi_cs1", "usif spi_cs2"}; 85962306a36Sopenharmony_cistatic const char * const xrx200_stp_grps[] = {"stp"}; 86062306a36Sopenharmony_cistatic const char * const xrx200_nmi_grps[] = {"nmi"}; 86162306a36Sopenharmony_cistatic const char * const xrx200_mdio_grps[] = {"mdio"}; 86262306a36Sopenharmony_cistatic const char * const xrx200_dfe_grps[] = {"dfe led0", "dfe led1"}; 86362306a36Sopenharmony_cistatic const char * const xrx200_gphy_grps[] = {"gphy0 led0", "gphy0 led1", 86462306a36Sopenharmony_ci "gphy0 led2", "gphy1 led0", 86562306a36Sopenharmony_ci "gphy1 led1", "gphy1 led2"}; 86662306a36Sopenharmony_ci 86762306a36Sopenharmony_cistatic const struct ltq_pmx_func xrx200_funcs[] = { 86862306a36Sopenharmony_ci {"spi", ARRAY_AND_SIZE(xrx200_spi_grps)}, 86962306a36Sopenharmony_ci {"usif", ARRAY_AND_SIZE(xrx200_usif_grps)}, 87062306a36Sopenharmony_ci {"cgu", ARRAY_AND_SIZE(xrx200_cgu_grps)}, 87162306a36Sopenharmony_ci {"exin", ARRAY_AND_SIZE(xrx200_exin_grps)}, 87262306a36Sopenharmony_ci {"stp", ARRAY_AND_SIZE(xrx200_stp_grps)}, 87362306a36Sopenharmony_ci {"gpt", ARRAY_AND_SIZE(xrx200_gpt_grps)}, 87462306a36Sopenharmony_ci {"nmi", ARRAY_AND_SIZE(xrx200_nmi_grps)}, 87562306a36Sopenharmony_ci {"pci", ARRAY_AND_SIZE(xrx200_pci_grps)}, 87662306a36Sopenharmony_ci {"ebu", ARRAY_AND_SIZE(xrx200_ebu_grps)}, 87762306a36Sopenharmony_ci {"mdio", ARRAY_AND_SIZE(xrx200_mdio_grps)}, 87862306a36Sopenharmony_ci {"dfe", ARRAY_AND_SIZE(xrx200_dfe_grps)}, 87962306a36Sopenharmony_ci {"gphy", ARRAY_AND_SIZE(xrx200_gphy_grps)}, 88062306a36Sopenharmony_ci}; 88162306a36Sopenharmony_ci 88262306a36Sopenharmony_ci/* --------- xrx300 related code --------- */ 88362306a36Sopenharmony_ci#define XRX300_MAX_PIN 64 88462306a36Sopenharmony_ci 88562306a36Sopenharmony_cistatic const struct ltq_mfp_pin xrx300_mfp[] = { 88662306a36Sopenharmony_ci /* pin f0 f1 f2 f3 */ 88762306a36Sopenharmony_ci MFP_XWAY(GPIO0, GPIO, EXIN, EPHY, NONE), 88862306a36Sopenharmony_ci MFP_XWAY(GPIO1, GPIO, NONE, EXIN, NONE), 88962306a36Sopenharmony_ci MFP_XWAY(GPIO2, NONE, NONE, NONE, NONE), 89062306a36Sopenharmony_ci MFP_XWAY(GPIO3, GPIO, CGU, NONE, NONE), 89162306a36Sopenharmony_ci MFP_XWAY(GPIO4, GPIO, STP, DFE, NONE), 89262306a36Sopenharmony_ci MFP_XWAY(GPIO5, GPIO, STP, EPHY, DFE), 89362306a36Sopenharmony_ci MFP_XWAY(GPIO6, GPIO, STP, NONE, NONE), 89462306a36Sopenharmony_ci MFP_XWAY(GPIO7, NONE, NONE, NONE, NONE), 89562306a36Sopenharmony_ci MFP_XWAY(GPIO8, GPIO, CGU, GPHY, EPHY), 89662306a36Sopenharmony_ci MFP_XWAY(GPIO9, GPIO, WIFI, NONE, EXIN), 89762306a36Sopenharmony_ci MFP_XWAY(GPIO10, GPIO, USIF, SPI, EXIN), 89862306a36Sopenharmony_ci MFP_XWAY(GPIO11, GPIO, USIF, WIFI, SPI), 89962306a36Sopenharmony_ci MFP_XWAY(GPIO12, NONE, NONE, NONE, NONE), 90062306a36Sopenharmony_ci MFP_XWAY(GPIO13, GPIO, EBU, NONE, NONE), 90162306a36Sopenharmony_ci MFP_XWAY(GPIO14, GPIO, CGU, USIF, EPHY), 90262306a36Sopenharmony_ci MFP_XWAY(GPIO15, GPIO, SPI, NONE, MCD), 90362306a36Sopenharmony_ci MFP_XWAY(GPIO16, GPIO, SPI, EXIN, NONE), 90462306a36Sopenharmony_ci MFP_XWAY(GPIO17, GPIO, SPI, NONE, NONE), 90562306a36Sopenharmony_ci MFP_XWAY(GPIO18, GPIO, SPI, NONE, NONE), 90662306a36Sopenharmony_ci MFP_XWAY(GPIO19, GPIO, USIF, NONE, EPHY), 90762306a36Sopenharmony_ci MFP_XWAY(GPIO20, NONE, NONE, NONE, NONE), 90862306a36Sopenharmony_ci MFP_XWAY(GPIO21, NONE, NONE, NONE, NONE), 90962306a36Sopenharmony_ci MFP_XWAY(GPIO22, NONE, NONE, NONE, NONE), 91062306a36Sopenharmony_ci MFP_XWAY(GPIO23, GPIO, EBU, NONE, NONE), 91162306a36Sopenharmony_ci MFP_XWAY(GPIO24, GPIO, EBU, NONE, NONE), 91262306a36Sopenharmony_ci MFP_XWAY(GPIO25, GPIO, TDM, NONE, NONE), 91362306a36Sopenharmony_ci MFP_XWAY(GPIO26, GPIO, TDM, NONE, NONE), 91462306a36Sopenharmony_ci MFP_XWAY(GPIO27, GPIO, TDM, NONE, NONE), 91562306a36Sopenharmony_ci MFP_XWAY(GPIO28, NONE, NONE, NONE, NONE), 91662306a36Sopenharmony_ci MFP_XWAY(GPIO29, NONE, NONE, NONE, NONE), 91762306a36Sopenharmony_ci MFP_XWAY(GPIO30, NONE, NONE, NONE, NONE), 91862306a36Sopenharmony_ci MFP_XWAY(GPIO31, NONE, NONE, NONE, NONE), 91962306a36Sopenharmony_ci MFP_XWAY(GPIO32, NONE, NONE, NONE, NONE), 92062306a36Sopenharmony_ci MFP_XWAY(GPIO33, NONE, NONE, NONE, NONE), 92162306a36Sopenharmony_ci MFP_XWAY(GPIO34, GPIO, NONE, SSI, NONE), 92262306a36Sopenharmony_ci MFP_XWAY(GPIO35, GPIO, NONE, SSI, NONE), 92362306a36Sopenharmony_ci MFP_XWAY(GPIO36, GPIO, NONE, SSI, NONE), 92462306a36Sopenharmony_ci MFP_XWAY(GPIO37, NONE, NONE, NONE, NONE), 92562306a36Sopenharmony_ci MFP_XWAY(GPIO38, NONE, NONE, NONE, NONE), 92662306a36Sopenharmony_ci MFP_XWAY(GPIO39, NONE, NONE, NONE, NONE), 92762306a36Sopenharmony_ci MFP_XWAY(GPIO40, NONE, NONE, NONE, NONE), 92862306a36Sopenharmony_ci MFP_XWAY(GPIO41, NONE, NONE, NONE, NONE), 92962306a36Sopenharmony_ci MFP_XWAY(GPIO42, GPIO, MDIO, NONE, NONE), 93062306a36Sopenharmony_ci MFP_XWAY(GPIO43, GPIO, MDIO, NONE, NONE), 93162306a36Sopenharmony_ci MFP_XWAY(GPIO44, NONE, NONE, NONE, NONE), 93262306a36Sopenharmony_ci MFP_XWAY(GPIO45, NONE, NONE, NONE, NONE), 93362306a36Sopenharmony_ci MFP_XWAY(GPIO46, NONE, NONE, NONE, NONE), 93462306a36Sopenharmony_ci MFP_XWAY(GPIO47, NONE, NONE, NONE, NONE), 93562306a36Sopenharmony_ci MFP_XWAY(GPIO48, GPIO, EBU, NONE, NONE), 93662306a36Sopenharmony_ci MFP_XWAY(GPIO49, GPIO, EBU, NONE, NONE), 93762306a36Sopenharmony_ci MFP_XWAY(GPIO50, GPIO, EBU, NONE, NONE), 93862306a36Sopenharmony_ci MFP_XWAY(GPIO51, GPIO, EBU, NONE, NONE), 93962306a36Sopenharmony_ci MFP_XWAY(GPIO52, GPIO, EBU, NONE, NONE), 94062306a36Sopenharmony_ci MFP_XWAY(GPIO53, GPIO, EBU, NONE, NONE), 94162306a36Sopenharmony_ci MFP_XWAY(GPIO54, GPIO, EBU, NONE, NONE), 94262306a36Sopenharmony_ci MFP_XWAY(GPIO55, GPIO, EBU, NONE, NONE), 94362306a36Sopenharmony_ci MFP_XWAY(GPIO56, GPIO, EBU, NONE, NONE), 94462306a36Sopenharmony_ci MFP_XWAY(GPIO57, GPIO, EBU, NONE, NONE), 94562306a36Sopenharmony_ci MFP_XWAY(GPIO58, GPIO, EBU, TDM, NONE), 94662306a36Sopenharmony_ci MFP_XWAY(GPIO59, GPIO, EBU, NONE, NONE), 94762306a36Sopenharmony_ci MFP_XWAY(GPIO60, GPIO, EBU, NONE, NONE), 94862306a36Sopenharmony_ci MFP_XWAY(GPIO61, GPIO, EBU, NONE, NONE), 94962306a36Sopenharmony_ci MFP_XWAY(GPIO62, NONE, NONE, NONE, NONE), 95062306a36Sopenharmony_ci MFP_XWAY(GPIO63, NONE, NONE, NONE, NONE), 95162306a36Sopenharmony_ci}; 95262306a36Sopenharmony_ci 95362306a36Sopenharmony_cistatic const unsigned xrx300_exin_pin_map[] = {GPIO0, GPIO1, GPIO16, GPIO10, GPIO9}; 95462306a36Sopenharmony_ci 95562306a36Sopenharmony_cistatic const unsigned xrx300_pins_exin0[] = {GPIO0}; 95662306a36Sopenharmony_cistatic const unsigned xrx300_pins_exin1[] = {GPIO1}; 95762306a36Sopenharmony_cistatic const unsigned xrx300_pins_exin2[] = {GPIO16}; 95862306a36Sopenharmony_ci/* EXIN3 is not available on xrX300 */ 95962306a36Sopenharmony_cistatic const unsigned xrx300_pins_exin4[] = {GPIO10}; 96062306a36Sopenharmony_cistatic const unsigned xrx300_pins_exin5[] = {GPIO9}; 96162306a36Sopenharmony_ci 96262306a36Sopenharmony_cistatic const unsigned xrx300_pins_usif_uart_rx[] = {GPIO11}; 96362306a36Sopenharmony_cistatic const unsigned xrx300_pins_usif_uart_tx[] = {GPIO10}; 96462306a36Sopenharmony_ci 96562306a36Sopenharmony_cistatic const unsigned xrx300_pins_usif_spi_di[] = {GPIO11}; 96662306a36Sopenharmony_cistatic const unsigned xrx300_pins_usif_spi_do[] = {GPIO10}; 96762306a36Sopenharmony_cistatic const unsigned xrx300_pins_usif_spi_clk[] = {GPIO19}; 96862306a36Sopenharmony_cistatic const unsigned xrx300_pins_usif_spi_cs0[] = {GPIO14}; 96962306a36Sopenharmony_ci 97062306a36Sopenharmony_cistatic const unsigned xrx300_pins_stp[] = {GPIO4, GPIO5, GPIO6}; 97162306a36Sopenharmony_cistatic const unsigned xrx300_pins_mdio[] = {GPIO42, GPIO43}; 97262306a36Sopenharmony_ci 97362306a36Sopenharmony_cistatic const unsigned xrx300_pins_dfe_led0[] = {GPIO4}; 97462306a36Sopenharmony_cistatic const unsigned xrx300_pins_dfe_led1[] = {GPIO5}; 97562306a36Sopenharmony_ci 97662306a36Sopenharmony_cistatic const unsigned xrx300_pins_ephy0_led0[] = {GPIO5}; 97762306a36Sopenharmony_cistatic const unsigned xrx300_pins_ephy0_led1[] = {GPIO8}; 97862306a36Sopenharmony_cistatic const unsigned xrx300_pins_ephy1_led0[] = {GPIO14}; 97962306a36Sopenharmony_cistatic const unsigned xrx300_pins_ephy1_led1[] = {GPIO19}; 98062306a36Sopenharmony_ci 98162306a36Sopenharmony_cistatic const unsigned xrx300_pins_nand_ale[] = {GPIO13}; 98262306a36Sopenharmony_cistatic const unsigned xrx300_pins_nand_cs1[] = {GPIO23}; 98362306a36Sopenharmony_cistatic const unsigned xrx300_pins_nand_cle[] = {GPIO24}; 98462306a36Sopenharmony_cistatic const unsigned xrx300_pins_nand_rdy[] = {GPIO48}; 98562306a36Sopenharmony_cistatic const unsigned xrx300_pins_nand_rd[] = {GPIO49}; 98662306a36Sopenharmony_cistatic const unsigned xrx300_pins_nand_d1[] = {GPIO50}; 98762306a36Sopenharmony_cistatic const unsigned xrx300_pins_nand_d0[] = {GPIO51}; 98862306a36Sopenharmony_cistatic const unsigned xrx300_pins_nand_d2[] = {GPIO52}; 98962306a36Sopenharmony_cistatic const unsigned xrx300_pins_nand_d7[] = {GPIO53}; 99062306a36Sopenharmony_cistatic const unsigned xrx300_pins_nand_d6[] = {GPIO54}; 99162306a36Sopenharmony_cistatic const unsigned xrx300_pins_nand_d5[] = {GPIO55}; 99262306a36Sopenharmony_cistatic const unsigned xrx300_pins_nand_d4[] = {GPIO56}; 99362306a36Sopenharmony_cistatic const unsigned xrx300_pins_nand_d3[] = {GPIO57}; 99462306a36Sopenharmony_cistatic const unsigned xrx300_pins_nand_cs0[] = {GPIO58}; 99562306a36Sopenharmony_cistatic const unsigned xrx300_pins_nand_wr[] = {GPIO59}; 99662306a36Sopenharmony_cistatic const unsigned xrx300_pins_nand_wp[] = {GPIO60}; 99762306a36Sopenharmony_cistatic const unsigned xrx300_pins_nand_se[] = {GPIO61}; 99862306a36Sopenharmony_ci 99962306a36Sopenharmony_cistatic const unsigned xrx300_pins_spi_di[] = {GPIO16}; 100062306a36Sopenharmony_cistatic const unsigned xrx300_pins_spi_do[] = {GPIO17}; 100162306a36Sopenharmony_cistatic const unsigned xrx300_pins_spi_clk[] = {GPIO18}; 100262306a36Sopenharmony_cistatic const unsigned xrx300_pins_spi_cs1[] = {GPIO15}; 100362306a36Sopenharmony_ci/* SPI_CS2 is not available on xrX300 */ 100462306a36Sopenharmony_ci/* SPI_CS3 is not available on xrX300 */ 100562306a36Sopenharmony_cistatic const unsigned xrx300_pins_spi_cs4[] = {GPIO10}; 100662306a36Sopenharmony_ci/* SPI_CS5 is not available on xrX300 */ 100762306a36Sopenharmony_cistatic const unsigned xrx300_pins_spi_cs6[] = {GPIO11}; 100862306a36Sopenharmony_ci 100962306a36Sopenharmony_ci/* CLKOUT0 is not available on xrX300 */ 101062306a36Sopenharmony_ci/* CLKOUT1 is not available on xrX300 */ 101162306a36Sopenharmony_cistatic const unsigned xrx300_pins_clkout2[] = {GPIO3}; 101262306a36Sopenharmony_ci 101362306a36Sopenharmony_cistatic const struct ltq_pin_group xrx300_grps[] = { 101462306a36Sopenharmony_ci GRP_MUX("exin0", EXIN, xrx300_pins_exin0), 101562306a36Sopenharmony_ci GRP_MUX("exin1", EXIN, xrx300_pins_exin1), 101662306a36Sopenharmony_ci GRP_MUX("exin2", EXIN, xrx300_pins_exin2), 101762306a36Sopenharmony_ci GRP_MUX("exin4", EXIN, xrx300_pins_exin4), 101862306a36Sopenharmony_ci GRP_MUX("exin5", EXIN, xrx300_pins_exin5), 101962306a36Sopenharmony_ci GRP_MUX("nand ale", EBU, xrx300_pins_nand_ale), 102062306a36Sopenharmony_ci GRP_MUX("nand cs1", EBU, xrx300_pins_nand_cs1), 102162306a36Sopenharmony_ci GRP_MUX("nand cle", EBU, xrx300_pins_nand_cle), 102262306a36Sopenharmony_ci GRP_MUX("nand rdy", EBU, xrx300_pins_nand_rdy), 102362306a36Sopenharmony_ci GRP_MUX("nand rd", EBU, xrx300_pins_nand_rd), 102462306a36Sopenharmony_ci GRP_MUX("nand d1", EBU, xrx300_pins_nand_d1), 102562306a36Sopenharmony_ci GRP_MUX("nand d0", EBU, xrx300_pins_nand_d0), 102662306a36Sopenharmony_ci GRP_MUX("nand d2", EBU, xrx300_pins_nand_d2), 102762306a36Sopenharmony_ci GRP_MUX("nand d7", EBU, xrx300_pins_nand_d7), 102862306a36Sopenharmony_ci GRP_MUX("nand d6", EBU, xrx300_pins_nand_d6), 102962306a36Sopenharmony_ci GRP_MUX("nand d5", EBU, xrx300_pins_nand_d5), 103062306a36Sopenharmony_ci GRP_MUX("nand d4", EBU, xrx300_pins_nand_d4), 103162306a36Sopenharmony_ci GRP_MUX("nand d3", EBU, xrx300_pins_nand_d3), 103262306a36Sopenharmony_ci GRP_MUX("nand cs0", EBU, xrx300_pins_nand_cs0), 103362306a36Sopenharmony_ci GRP_MUX("nand wr", EBU, xrx300_pins_nand_wr), 103462306a36Sopenharmony_ci GRP_MUX("nand wp", EBU, xrx300_pins_nand_wp), 103562306a36Sopenharmony_ci GRP_MUX("nand se", EBU, xrx300_pins_nand_se), 103662306a36Sopenharmony_ci GRP_MUX("spi_di", SPI, xrx300_pins_spi_di), 103762306a36Sopenharmony_ci GRP_MUX("spi_do", SPI, xrx300_pins_spi_do), 103862306a36Sopenharmony_ci GRP_MUX("spi_clk", SPI, xrx300_pins_spi_clk), 103962306a36Sopenharmony_ci GRP_MUX("spi_cs1", SPI, xrx300_pins_spi_cs1), 104062306a36Sopenharmony_ci GRP_MUX("spi_cs4", SPI, xrx300_pins_spi_cs4), 104162306a36Sopenharmony_ci GRP_MUX("spi_cs6", SPI, xrx300_pins_spi_cs6), 104262306a36Sopenharmony_ci GRP_MUX("usif uart_rx", USIF, xrx300_pins_usif_uart_rx), 104362306a36Sopenharmony_ci GRP_MUX("usif uart_tx", USIF, xrx300_pins_usif_uart_tx), 104462306a36Sopenharmony_ci GRP_MUX("usif spi_di", USIF, xrx300_pins_usif_spi_di), 104562306a36Sopenharmony_ci GRP_MUX("usif spi_do", USIF, xrx300_pins_usif_spi_do), 104662306a36Sopenharmony_ci GRP_MUX("usif spi_clk", USIF, xrx300_pins_usif_spi_clk), 104762306a36Sopenharmony_ci GRP_MUX("usif spi_cs0", USIF, xrx300_pins_usif_spi_cs0), 104862306a36Sopenharmony_ci GRP_MUX("stp", STP, xrx300_pins_stp), 104962306a36Sopenharmony_ci GRP_MUX("clkout2", CGU, xrx300_pins_clkout2), 105062306a36Sopenharmony_ci GRP_MUX("mdio", MDIO, xrx300_pins_mdio), 105162306a36Sopenharmony_ci GRP_MUX("dfe led0", DFE, xrx300_pins_dfe_led0), 105262306a36Sopenharmony_ci GRP_MUX("dfe led1", DFE, xrx300_pins_dfe_led1), 105362306a36Sopenharmony_ci GRP_MUX("ephy0 led0", GPHY, xrx300_pins_ephy0_led0), 105462306a36Sopenharmony_ci GRP_MUX("ephy0 led1", GPHY, xrx300_pins_ephy0_led1), 105562306a36Sopenharmony_ci GRP_MUX("ephy1 led0", GPHY, xrx300_pins_ephy1_led0), 105662306a36Sopenharmony_ci GRP_MUX("ephy1 led1", GPHY, xrx300_pins_ephy1_led1), 105762306a36Sopenharmony_ci}; 105862306a36Sopenharmony_ci 105962306a36Sopenharmony_cistatic const char * const xrx300_spi_grps[] = {"spi_di", "spi_do", 106062306a36Sopenharmony_ci "spi_clk", "spi_cs1", 106162306a36Sopenharmony_ci "spi_cs4", "spi_cs6"}; 106262306a36Sopenharmony_cistatic const char * const xrx300_cgu_grps[] = {"clkout2"}; 106362306a36Sopenharmony_cistatic const char * const xrx300_ebu_grps[] = {"nand ale", "nand cs1", 106462306a36Sopenharmony_ci "nand cle", "nand rdy", 106562306a36Sopenharmony_ci "nand rd", "nand d1", 106662306a36Sopenharmony_ci "nand d0", "nand d2", 106762306a36Sopenharmony_ci "nand d7", "nand d6", 106862306a36Sopenharmony_ci "nand d5", "nand d4", 106962306a36Sopenharmony_ci "nand d3", "nand cs0", 107062306a36Sopenharmony_ci "nand wr", "nand wp", 107162306a36Sopenharmony_ci "nand se"}; 107262306a36Sopenharmony_cistatic const char * const xrx300_exin_grps[] = {"exin0", "exin1", "exin2", 107362306a36Sopenharmony_ci "exin4", "exin5"}; 107462306a36Sopenharmony_cistatic const char * const xrx300_usif_grps[] = {"usif uart_rx", "usif uart_tx", 107562306a36Sopenharmony_ci "usif spi_di", "usif spi_do", 107662306a36Sopenharmony_ci "usif spi_clk", "usif spi_cs0"}; 107762306a36Sopenharmony_cistatic const char * const xrx300_stp_grps[] = {"stp"}; 107862306a36Sopenharmony_cistatic const char * const xrx300_mdio_grps[] = {"mdio"}; 107962306a36Sopenharmony_cistatic const char * const xrx300_dfe_grps[] = {"dfe led0", "dfe led1"}; 108062306a36Sopenharmony_cistatic const char * const xrx300_gphy_grps[] = {"ephy0 led0", "ephy0 led1", 108162306a36Sopenharmony_ci "ephy1 led0", "ephy1 led1"}; 108262306a36Sopenharmony_ci 108362306a36Sopenharmony_cistatic const struct ltq_pmx_func xrx300_funcs[] = { 108462306a36Sopenharmony_ci {"spi", ARRAY_AND_SIZE(xrx300_spi_grps)}, 108562306a36Sopenharmony_ci {"usif", ARRAY_AND_SIZE(xrx300_usif_grps)}, 108662306a36Sopenharmony_ci {"cgu", ARRAY_AND_SIZE(xrx300_cgu_grps)}, 108762306a36Sopenharmony_ci {"exin", ARRAY_AND_SIZE(xrx300_exin_grps)}, 108862306a36Sopenharmony_ci {"stp", ARRAY_AND_SIZE(xrx300_stp_grps)}, 108962306a36Sopenharmony_ci {"ebu", ARRAY_AND_SIZE(xrx300_ebu_grps)}, 109062306a36Sopenharmony_ci {"mdio", ARRAY_AND_SIZE(xrx300_mdio_grps)}, 109162306a36Sopenharmony_ci {"dfe", ARRAY_AND_SIZE(xrx300_dfe_grps)}, 109262306a36Sopenharmony_ci {"ephy", ARRAY_AND_SIZE(xrx300_gphy_grps)}, 109362306a36Sopenharmony_ci}; 109462306a36Sopenharmony_ci 109562306a36Sopenharmony_ci/* --------- pinconf related code --------- */ 109662306a36Sopenharmony_cistatic int xway_pinconf_get(struct pinctrl_dev *pctldev, 109762306a36Sopenharmony_ci unsigned pin, 109862306a36Sopenharmony_ci unsigned long *config) 109962306a36Sopenharmony_ci{ 110062306a36Sopenharmony_ci struct ltq_pinmux_info *info = pinctrl_dev_get_drvdata(pctldev); 110162306a36Sopenharmony_ci enum ltq_pinconf_param param = LTQ_PINCONF_UNPACK_PARAM(*config); 110262306a36Sopenharmony_ci int port = PORT(pin); 110362306a36Sopenharmony_ci u32 reg; 110462306a36Sopenharmony_ci 110562306a36Sopenharmony_ci switch (param) { 110662306a36Sopenharmony_ci case LTQ_PINCONF_PARAM_OPEN_DRAIN: 110762306a36Sopenharmony_ci if (port == PORT3) 110862306a36Sopenharmony_ci reg = GPIO3_OD; 110962306a36Sopenharmony_ci else 111062306a36Sopenharmony_ci reg = GPIO_OD(pin); 111162306a36Sopenharmony_ci *config = LTQ_PINCONF_PACK(param, 111262306a36Sopenharmony_ci !gpio_getbit(info->membase[0], reg, PORT_PIN(pin))); 111362306a36Sopenharmony_ci break; 111462306a36Sopenharmony_ci 111562306a36Sopenharmony_ci case LTQ_PINCONF_PARAM_PULL: 111662306a36Sopenharmony_ci if (port == PORT3) 111762306a36Sopenharmony_ci reg = GPIO3_PUDEN; 111862306a36Sopenharmony_ci else 111962306a36Sopenharmony_ci reg = GPIO_PUDEN(pin); 112062306a36Sopenharmony_ci if (!gpio_getbit(info->membase[0], reg, PORT_PIN(pin))) { 112162306a36Sopenharmony_ci *config = LTQ_PINCONF_PACK(param, 0); 112262306a36Sopenharmony_ci break; 112362306a36Sopenharmony_ci } 112462306a36Sopenharmony_ci 112562306a36Sopenharmony_ci if (port == PORT3) 112662306a36Sopenharmony_ci reg = GPIO3_PUDSEL; 112762306a36Sopenharmony_ci else 112862306a36Sopenharmony_ci reg = GPIO_PUDSEL(pin); 112962306a36Sopenharmony_ci if (!gpio_getbit(info->membase[0], reg, PORT_PIN(pin))) 113062306a36Sopenharmony_ci *config = LTQ_PINCONF_PACK(param, 2); 113162306a36Sopenharmony_ci else 113262306a36Sopenharmony_ci *config = LTQ_PINCONF_PACK(param, 1); 113362306a36Sopenharmony_ci break; 113462306a36Sopenharmony_ci 113562306a36Sopenharmony_ci case LTQ_PINCONF_PARAM_OUTPUT: 113662306a36Sopenharmony_ci reg = GPIO_DIR(pin); 113762306a36Sopenharmony_ci *config = LTQ_PINCONF_PACK(param, 113862306a36Sopenharmony_ci gpio_getbit(info->membase[0], reg, PORT_PIN(pin))); 113962306a36Sopenharmony_ci break; 114062306a36Sopenharmony_ci default: 114162306a36Sopenharmony_ci dev_err(pctldev->dev, "Invalid config param %04x\n", param); 114262306a36Sopenharmony_ci return -ENOTSUPP; 114362306a36Sopenharmony_ci } 114462306a36Sopenharmony_ci return 0; 114562306a36Sopenharmony_ci} 114662306a36Sopenharmony_ci 114762306a36Sopenharmony_cistatic int xway_pinconf_set(struct pinctrl_dev *pctldev, 114862306a36Sopenharmony_ci unsigned pin, 114962306a36Sopenharmony_ci unsigned long *configs, 115062306a36Sopenharmony_ci unsigned num_configs) 115162306a36Sopenharmony_ci{ 115262306a36Sopenharmony_ci struct ltq_pinmux_info *info = pinctrl_dev_get_drvdata(pctldev); 115362306a36Sopenharmony_ci enum ltq_pinconf_param param; 115462306a36Sopenharmony_ci int arg; 115562306a36Sopenharmony_ci int port = PORT(pin); 115662306a36Sopenharmony_ci u32 reg; 115762306a36Sopenharmony_ci int i; 115862306a36Sopenharmony_ci 115962306a36Sopenharmony_ci for (i = 0; i < num_configs; i++) { 116062306a36Sopenharmony_ci param = LTQ_PINCONF_UNPACK_PARAM(configs[i]); 116162306a36Sopenharmony_ci arg = LTQ_PINCONF_UNPACK_ARG(configs[i]); 116262306a36Sopenharmony_ci 116362306a36Sopenharmony_ci switch (param) { 116462306a36Sopenharmony_ci case LTQ_PINCONF_PARAM_OPEN_DRAIN: 116562306a36Sopenharmony_ci if (port == PORT3) 116662306a36Sopenharmony_ci reg = GPIO3_OD; 116762306a36Sopenharmony_ci else 116862306a36Sopenharmony_ci reg = GPIO_OD(pin); 116962306a36Sopenharmony_ci if (arg == 0) 117062306a36Sopenharmony_ci gpio_setbit(info->membase[0], 117162306a36Sopenharmony_ci reg, 117262306a36Sopenharmony_ci PORT_PIN(pin)); 117362306a36Sopenharmony_ci else 117462306a36Sopenharmony_ci gpio_clearbit(info->membase[0], 117562306a36Sopenharmony_ci reg, 117662306a36Sopenharmony_ci PORT_PIN(pin)); 117762306a36Sopenharmony_ci break; 117862306a36Sopenharmony_ci 117962306a36Sopenharmony_ci case LTQ_PINCONF_PARAM_PULL: 118062306a36Sopenharmony_ci if (port == PORT3) 118162306a36Sopenharmony_ci reg = GPIO3_PUDEN; 118262306a36Sopenharmony_ci else 118362306a36Sopenharmony_ci reg = GPIO_PUDEN(pin); 118462306a36Sopenharmony_ci if (arg == 0) { 118562306a36Sopenharmony_ci gpio_clearbit(info->membase[0], 118662306a36Sopenharmony_ci reg, 118762306a36Sopenharmony_ci PORT_PIN(pin)); 118862306a36Sopenharmony_ci break; 118962306a36Sopenharmony_ci } 119062306a36Sopenharmony_ci gpio_setbit(info->membase[0], reg, PORT_PIN(pin)); 119162306a36Sopenharmony_ci 119262306a36Sopenharmony_ci if (port == PORT3) 119362306a36Sopenharmony_ci reg = GPIO3_PUDSEL; 119462306a36Sopenharmony_ci else 119562306a36Sopenharmony_ci reg = GPIO_PUDSEL(pin); 119662306a36Sopenharmony_ci if (arg == 1) 119762306a36Sopenharmony_ci gpio_clearbit(info->membase[0], 119862306a36Sopenharmony_ci reg, 119962306a36Sopenharmony_ci PORT_PIN(pin)); 120062306a36Sopenharmony_ci else if (arg == 2) 120162306a36Sopenharmony_ci gpio_setbit(info->membase[0], 120262306a36Sopenharmony_ci reg, 120362306a36Sopenharmony_ci PORT_PIN(pin)); 120462306a36Sopenharmony_ci else 120562306a36Sopenharmony_ci dev_err(pctldev->dev, 120662306a36Sopenharmony_ci "Invalid pull value %d\n", arg); 120762306a36Sopenharmony_ci break; 120862306a36Sopenharmony_ci 120962306a36Sopenharmony_ci case LTQ_PINCONF_PARAM_OUTPUT: 121062306a36Sopenharmony_ci reg = GPIO_DIR(pin); 121162306a36Sopenharmony_ci if (arg == 0) 121262306a36Sopenharmony_ci gpio_clearbit(info->membase[0], 121362306a36Sopenharmony_ci reg, 121462306a36Sopenharmony_ci PORT_PIN(pin)); 121562306a36Sopenharmony_ci else 121662306a36Sopenharmony_ci gpio_setbit(info->membase[0], 121762306a36Sopenharmony_ci reg, 121862306a36Sopenharmony_ci PORT_PIN(pin)); 121962306a36Sopenharmony_ci break; 122062306a36Sopenharmony_ci 122162306a36Sopenharmony_ci default: 122262306a36Sopenharmony_ci dev_err(pctldev->dev, 122362306a36Sopenharmony_ci "Invalid config param %04x\n", param); 122462306a36Sopenharmony_ci return -ENOTSUPP; 122562306a36Sopenharmony_ci } 122662306a36Sopenharmony_ci } /* for each config */ 122762306a36Sopenharmony_ci 122862306a36Sopenharmony_ci return 0; 122962306a36Sopenharmony_ci} 123062306a36Sopenharmony_ci 123162306a36Sopenharmony_ciint xway_pinconf_group_set(struct pinctrl_dev *pctldev, 123262306a36Sopenharmony_ci unsigned selector, 123362306a36Sopenharmony_ci unsigned long *configs, 123462306a36Sopenharmony_ci unsigned num_configs) 123562306a36Sopenharmony_ci{ 123662306a36Sopenharmony_ci struct ltq_pinmux_info *info = pinctrl_dev_get_drvdata(pctldev); 123762306a36Sopenharmony_ci int i, ret = 0; 123862306a36Sopenharmony_ci 123962306a36Sopenharmony_ci for (i = 0; i < info->grps[selector].npins && !ret; i++) 124062306a36Sopenharmony_ci ret = xway_pinconf_set(pctldev, 124162306a36Sopenharmony_ci info->grps[selector].pins[i], 124262306a36Sopenharmony_ci configs, 124362306a36Sopenharmony_ci num_configs); 124462306a36Sopenharmony_ci 124562306a36Sopenharmony_ci return ret; 124662306a36Sopenharmony_ci} 124762306a36Sopenharmony_ci 124862306a36Sopenharmony_cistatic const struct pinconf_ops xway_pinconf_ops = { 124962306a36Sopenharmony_ci .pin_config_get = xway_pinconf_get, 125062306a36Sopenharmony_ci .pin_config_set = xway_pinconf_set, 125162306a36Sopenharmony_ci .pin_config_group_set = xway_pinconf_group_set, 125262306a36Sopenharmony_ci}; 125362306a36Sopenharmony_ci 125462306a36Sopenharmony_cistatic struct pinctrl_desc xway_pctrl_desc = { 125562306a36Sopenharmony_ci .owner = THIS_MODULE, 125662306a36Sopenharmony_ci .confops = &xway_pinconf_ops, 125762306a36Sopenharmony_ci}; 125862306a36Sopenharmony_ci 125962306a36Sopenharmony_cistatic inline int xway_mux_apply(struct pinctrl_dev *pctrldev, 126062306a36Sopenharmony_ci int pin, int mux) 126162306a36Sopenharmony_ci{ 126262306a36Sopenharmony_ci struct ltq_pinmux_info *info = pinctrl_dev_get_drvdata(pctrldev); 126362306a36Sopenharmony_ci int port = PORT(pin); 126462306a36Sopenharmony_ci u32 alt1_reg = GPIO_ALT1(pin); 126562306a36Sopenharmony_ci 126662306a36Sopenharmony_ci if (port == PORT3) 126762306a36Sopenharmony_ci alt1_reg = GPIO3_ALT1; 126862306a36Sopenharmony_ci 126962306a36Sopenharmony_ci if (mux & MUX_ALT0) 127062306a36Sopenharmony_ci gpio_setbit(info->membase[0], GPIO_ALT0(pin), PORT_PIN(pin)); 127162306a36Sopenharmony_ci else 127262306a36Sopenharmony_ci gpio_clearbit(info->membase[0], GPIO_ALT0(pin), PORT_PIN(pin)); 127362306a36Sopenharmony_ci 127462306a36Sopenharmony_ci if (mux & MUX_ALT1) 127562306a36Sopenharmony_ci gpio_setbit(info->membase[0], alt1_reg, PORT_PIN(pin)); 127662306a36Sopenharmony_ci else 127762306a36Sopenharmony_ci gpio_clearbit(info->membase[0], alt1_reg, PORT_PIN(pin)); 127862306a36Sopenharmony_ci 127962306a36Sopenharmony_ci return 0; 128062306a36Sopenharmony_ci} 128162306a36Sopenharmony_ci 128262306a36Sopenharmony_cistatic const struct ltq_cfg_param xway_cfg_params[] = { 128362306a36Sopenharmony_ci {"lantiq,pull", LTQ_PINCONF_PARAM_PULL}, 128462306a36Sopenharmony_ci {"lantiq,open-drain", LTQ_PINCONF_PARAM_OPEN_DRAIN}, 128562306a36Sopenharmony_ci {"lantiq,output", LTQ_PINCONF_PARAM_OUTPUT}, 128662306a36Sopenharmony_ci}; 128762306a36Sopenharmony_ci 128862306a36Sopenharmony_cistatic struct ltq_pinmux_info xway_info = { 128962306a36Sopenharmony_ci .desc = &xway_pctrl_desc, 129062306a36Sopenharmony_ci .apply_mux = xway_mux_apply, 129162306a36Sopenharmony_ci .params = xway_cfg_params, 129262306a36Sopenharmony_ci .num_params = ARRAY_SIZE(xway_cfg_params), 129362306a36Sopenharmony_ci}; 129462306a36Sopenharmony_ci 129562306a36Sopenharmony_ci/* --------- gpio_chip related code --------- */ 129662306a36Sopenharmony_cistatic void xway_gpio_set(struct gpio_chip *chip, unsigned int pin, int val) 129762306a36Sopenharmony_ci{ 129862306a36Sopenharmony_ci struct ltq_pinmux_info *info = dev_get_drvdata(chip->parent); 129962306a36Sopenharmony_ci 130062306a36Sopenharmony_ci if (val) 130162306a36Sopenharmony_ci gpio_setbit(info->membase[0], GPIO_OUT(pin), PORT_PIN(pin)); 130262306a36Sopenharmony_ci else 130362306a36Sopenharmony_ci gpio_clearbit(info->membase[0], GPIO_OUT(pin), PORT_PIN(pin)); 130462306a36Sopenharmony_ci} 130562306a36Sopenharmony_ci 130662306a36Sopenharmony_cistatic int xway_gpio_get(struct gpio_chip *chip, unsigned int pin) 130762306a36Sopenharmony_ci{ 130862306a36Sopenharmony_ci struct ltq_pinmux_info *info = dev_get_drvdata(chip->parent); 130962306a36Sopenharmony_ci 131062306a36Sopenharmony_ci return !!gpio_getbit(info->membase[0], GPIO_IN(pin), PORT_PIN(pin)); 131162306a36Sopenharmony_ci} 131262306a36Sopenharmony_ci 131362306a36Sopenharmony_cistatic int xway_gpio_dir_in(struct gpio_chip *chip, unsigned int pin) 131462306a36Sopenharmony_ci{ 131562306a36Sopenharmony_ci struct ltq_pinmux_info *info = dev_get_drvdata(chip->parent); 131662306a36Sopenharmony_ci 131762306a36Sopenharmony_ci gpio_clearbit(info->membase[0], GPIO_DIR(pin), PORT_PIN(pin)); 131862306a36Sopenharmony_ci 131962306a36Sopenharmony_ci return 0; 132062306a36Sopenharmony_ci} 132162306a36Sopenharmony_ci 132262306a36Sopenharmony_cistatic int xway_gpio_dir_out(struct gpio_chip *chip, unsigned int pin, int val) 132362306a36Sopenharmony_ci{ 132462306a36Sopenharmony_ci struct ltq_pinmux_info *info = dev_get_drvdata(chip->parent); 132562306a36Sopenharmony_ci 132662306a36Sopenharmony_ci if (PORT(pin) == PORT3) 132762306a36Sopenharmony_ci gpio_setbit(info->membase[0], GPIO3_OD, PORT_PIN(pin)); 132862306a36Sopenharmony_ci else 132962306a36Sopenharmony_ci gpio_setbit(info->membase[0], GPIO_OD(pin), PORT_PIN(pin)); 133062306a36Sopenharmony_ci gpio_setbit(info->membase[0], GPIO_DIR(pin), PORT_PIN(pin)); 133162306a36Sopenharmony_ci xway_gpio_set(chip, pin, val); 133262306a36Sopenharmony_ci 133362306a36Sopenharmony_ci return 0; 133462306a36Sopenharmony_ci} 133562306a36Sopenharmony_ci 133662306a36Sopenharmony_ci/* 133762306a36Sopenharmony_ci * gpiolib gpiod_to_irq callback function. 133862306a36Sopenharmony_ci * Returns the mapped IRQ (external interrupt) number for a given GPIO pin. 133962306a36Sopenharmony_ci */ 134062306a36Sopenharmony_cistatic int xway_gpio_to_irq(struct gpio_chip *chip, unsigned offset) 134162306a36Sopenharmony_ci{ 134262306a36Sopenharmony_ci struct ltq_pinmux_info *info = dev_get_drvdata(chip->parent); 134362306a36Sopenharmony_ci int i; 134462306a36Sopenharmony_ci 134562306a36Sopenharmony_ci for (i = 0; i < info->num_exin; i++) 134662306a36Sopenharmony_ci if (info->exin[i] == offset) 134762306a36Sopenharmony_ci return ltq_eiu_get_irq(i); 134862306a36Sopenharmony_ci 134962306a36Sopenharmony_ci return -1; 135062306a36Sopenharmony_ci} 135162306a36Sopenharmony_ci 135262306a36Sopenharmony_cistatic struct gpio_chip xway_chip = { 135362306a36Sopenharmony_ci .label = "gpio-xway", 135462306a36Sopenharmony_ci .direction_input = xway_gpio_dir_in, 135562306a36Sopenharmony_ci .direction_output = xway_gpio_dir_out, 135662306a36Sopenharmony_ci .get = xway_gpio_get, 135762306a36Sopenharmony_ci .set = xway_gpio_set, 135862306a36Sopenharmony_ci .request = gpiochip_generic_request, 135962306a36Sopenharmony_ci .free = gpiochip_generic_free, 136062306a36Sopenharmony_ci .to_irq = xway_gpio_to_irq, 136162306a36Sopenharmony_ci .base = -1, 136262306a36Sopenharmony_ci}; 136362306a36Sopenharmony_ci 136462306a36Sopenharmony_ci 136562306a36Sopenharmony_ci/* --------- register the pinctrl layer --------- */ 136662306a36Sopenharmony_cistruct pinctrl_xway_soc { 136762306a36Sopenharmony_ci int pin_count; 136862306a36Sopenharmony_ci const struct ltq_mfp_pin *mfp; 136962306a36Sopenharmony_ci const struct ltq_pin_group *grps; 137062306a36Sopenharmony_ci unsigned int num_grps; 137162306a36Sopenharmony_ci const struct ltq_pmx_func *funcs; 137262306a36Sopenharmony_ci unsigned int num_funcs; 137362306a36Sopenharmony_ci const unsigned *exin; 137462306a36Sopenharmony_ci unsigned int num_exin; 137562306a36Sopenharmony_ci}; 137662306a36Sopenharmony_ci 137762306a36Sopenharmony_ci/* XWAY AMAZON Family */ 137862306a36Sopenharmony_cistatic struct pinctrl_xway_soc ase_pinctrl = { 137962306a36Sopenharmony_ci .pin_count = ASE_MAX_PIN, 138062306a36Sopenharmony_ci .mfp = ase_mfp, 138162306a36Sopenharmony_ci .grps = ase_grps, 138262306a36Sopenharmony_ci .num_grps = ARRAY_SIZE(ase_grps), 138362306a36Sopenharmony_ci .funcs = ase_funcs, 138462306a36Sopenharmony_ci .num_funcs = ARRAY_SIZE(ase_funcs), 138562306a36Sopenharmony_ci .exin = ase_exin_pin_map, 138662306a36Sopenharmony_ci .num_exin = 3 138762306a36Sopenharmony_ci}; 138862306a36Sopenharmony_ci 138962306a36Sopenharmony_ci/* XWAY DANUBE Family */ 139062306a36Sopenharmony_cistatic struct pinctrl_xway_soc danube_pinctrl = { 139162306a36Sopenharmony_ci .pin_count = DANUBE_MAX_PIN, 139262306a36Sopenharmony_ci .mfp = danube_mfp, 139362306a36Sopenharmony_ci .grps = danube_grps, 139462306a36Sopenharmony_ci .num_grps = ARRAY_SIZE(danube_grps), 139562306a36Sopenharmony_ci .funcs = danube_funcs, 139662306a36Sopenharmony_ci .num_funcs = ARRAY_SIZE(danube_funcs), 139762306a36Sopenharmony_ci .exin = danube_exin_pin_map, 139862306a36Sopenharmony_ci .num_exin = 3 139962306a36Sopenharmony_ci}; 140062306a36Sopenharmony_ci 140162306a36Sopenharmony_ci/* XWAY xRX100 Family */ 140262306a36Sopenharmony_cistatic struct pinctrl_xway_soc xrx100_pinctrl = { 140362306a36Sopenharmony_ci .pin_count = XRX100_MAX_PIN, 140462306a36Sopenharmony_ci .mfp = xrx100_mfp, 140562306a36Sopenharmony_ci .grps = xrx100_grps, 140662306a36Sopenharmony_ci .num_grps = ARRAY_SIZE(xrx100_grps), 140762306a36Sopenharmony_ci .funcs = xrx100_funcs, 140862306a36Sopenharmony_ci .num_funcs = ARRAY_SIZE(xrx100_funcs), 140962306a36Sopenharmony_ci .exin = xrx100_exin_pin_map, 141062306a36Sopenharmony_ci .num_exin = 6 141162306a36Sopenharmony_ci}; 141262306a36Sopenharmony_ci 141362306a36Sopenharmony_ci/* XWAY xRX200 Family */ 141462306a36Sopenharmony_cistatic struct pinctrl_xway_soc xrx200_pinctrl = { 141562306a36Sopenharmony_ci .pin_count = XRX200_MAX_PIN, 141662306a36Sopenharmony_ci .mfp = xrx200_mfp, 141762306a36Sopenharmony_ci .grps = xrx200_grps, 141862306a36Sopenharmony_ci .num_grps = ARRAY_SIZE(xrx200_grps), 141962306a36Sopenharmony_ci .funcs = xrx200_funcs, 142062306a36Sopenharmony_ci .num_funcs = ARRAY_SIZE(xrx200_funcs), 142162306a36Sopenharmony_ci .exin = xrx200_exin_pin_map, 142262306a36Sopenharmony_ci .num_exin = 6 142362306a36Sopenharmony_ci}; 142462306a36Sopenharmony_ci 142562306a36Sopenharmony_ci/* XWAY xRX300 Family */ 142662306a36Sopenharmony_cistatic struct pinctrl_xway_soc xrx300_pinctrl = { 142762306a36Sopenharmony_ci .pin_count = XRX300_MAX_PIN, 142862306a36Sopenharmony_ci .mfp = xrx300_mfp, 142962306a36Sopenharmony_ci .grps = xrx300_grps, 143062306a36Sopenharmony_ci .num_grps = ARRAY_SIZE(xrx300_grps), 143162306a36Sopenharmony_ci .funcs = xrx300_funcs, 143262306a36Sopenharmony_ci .num_funcs = ARRAY_SIZE(xrx300_funcs), 143362306a36Sopenharmony_ci .exin = xrx300_exin_pin_map, 143462306a36Sopenharmony_ci .num_exin = 5 143562306a36Sopenharmony_ci}; 143662306a36Sopenharmony_ci 143762306a36Sopenharmony_cistatic struct pinctrl_gpio_range xway_gpio_range = { 143862306a36Sopenharmony_ci .name = "XWAY GPIO", 143962306a36Sopenharmony_ci .gc = &xway_chip, 144062306a36Sopenharmony_ci}; 144162306a36Sopenharmony_ci 144262306a36Sopenharmony_cistatic const struct of_device_id xway_match[] = { 144362306a36Sopenharmony_ci { .compatible = "lantiq,ase-pinctrl", .data = &ase_pinctrl}, 144462306a36Sopenharmony_ci { .compatible = "lantiq,danube-pinctrl", .data = &danube_pinctrl}, 144562306a36Sopenharmony_ci { .compatible = "lantiq,xrx100-pinctrl", .data = &xrx100_pinctrl}, 144662306a36Sopenharmony_ci { .compatible = "lantiq,xrx200-pinctrl", .data = &xrx200_pinctrl}, 144762306a36Sopenharmony_ci { .compatible = "lantiq,xrx300-pinctrl", .data = &xrx300_pinctrl}, 144862306a36Sopenharmony_ci {}, 144962306a36Sopenharmony_ci}; 145062306a36Sopenharmony_ciMODULE_DEVICE_TABLE(of, xway_match); 145162306a36Sopenharmony_ci 145262306a36Sopenharmony_cistatic int pinmux_xway_probe(struct platform_device *pdev) 145362306a36Sopenharmony_ci{ 145462306a36Sopenharmony_ci const struct of_device_id *match; 145562306a36Sopenharmony_ci const struct pinctrl_xway_soc *xway_soc; 145662306a36Sopenharmony_ci int ret, i; 145762306a36Sopenharmony_ci 145862306a36Sopenharmony_ci /* get and remap our register range */ 145962306a36Sopenharmony_ci xway_info.membase[0] = devm_platform_ioremap_resource(pdev, 0); 146062306a36Sopenharmony_ci if (IS_ERR(xway_info.membase[0])) 146162306a36Sopenharmony_ci return PTR_ERR(xway_info.membase[0]); 146262306a36Sopenharmony_ci 146362306a36Sopenharmony_ci match = of_match_device(xway_match, &pdev->dev); 146462306a36Sopenharmony_ci if (match) 146562306a36Sopenharmony_ci xway_soc = (const struct pinctrl_xway_soc *) match->data; 146662306a36Sopenharmony_ci else 146762306a36Sopenharmony_ci xway_soc = &danube_pinctrl; 146862306a36Sopenharmony_ci 146962306a36Sopenharmony_ci /* find out how many pads we have */ 147062306a36Sopenharmony_ci xway_chip.ngpio = xway_soc->pin_count; 147162306a36Sopenharmony_ci 147262306a36Sopenharmony_ci /* load our pad descriptors */ 147362306a36Sopenharmony_ci xway_info.pads = devm_kcalloc(&pdev->dev, 147462306a36Sopenharmony_ci xway_chip.ngpio, sizeof(struct pinctrl_pin_desc), 147562306a36Sopenharmony_ci GFP_KERNEL); 147662306a36Sopenharmony_ci if (!xway_info.pads) 147762306a36Sopenharmony_ci return -ENOMEM; 147862306a36Sopenharmony_ci 147962306a36Sopenharmony_ci for (i = 0; i < xway_chip.ngpio; i++) { 148062306a36Sopenharmony_ci char *name = devm_kasprintf(&pdev->dev, GFP_KERNEL, "io%d", i); 148162306a36Sopenharmony_ci 148262306a36Sopenharmony_ci if (!name) 148362306a36Sopenharmony_ci return -ENOMEM; 148462306a36Sopenharmony_ci 148562306a36Sopenharmony_ci xway_info.pads[i].number = GPIO0 + i; 148662306a36Sopenharmony_ci xway_info.pads[i].name = name; 148762306a36Sopenharmony_ci } 148862306a36Sopenharmony_ci xway_pctrl_desc.pins = xway_info.pads; 148962306a36Sopenharmony_ci 149062306a36Sopenharmony_ci /* setup the data needed by pinctrl */ 149162306a36Sopenharmony_ci xway_pctrl_desc.name = dev_name(&pdev->dev); 149262306a36Sopenharmony_ci xway_pctrl_desc.npins = xway_chip.ngpio; 149362306a36Sopenharmony_ci 149462306a36Sopenharmony_ci xway_info.num_pads = xway_chip.ngpio; 149562306a36Sopenharmony_ci xway_info.num_mfp = xway_chip.ngpio; 149662306a36Sopenharmony_ci xway_info.mfp = xway_soc->mfp; 149762306a36Sopenharmony_ci xway_info.grps = xway_soc->grps; 149862306a36Sopenharmony_ci xway_info.num_grps = xway_soc->num_grps; 149962306a36Sopenharmony_ci xway_info.funcs = xway_soc->funcs; 150062306a36Sopenharmony_ci xway_info.num_funcs = xway_soc->num_funcs; 150162306a36Sopenharmony_ci xway_info.exin = xway_soc->exin; 150262306a36Sopenharmony_ci xway_info.num_exin = xway_soc->num_exin; 150362306a36Sopenharmony_ci 150462306a36Sopenharmony_ci /* register with the generic lantiq layer */ 150562306a36Sopenharmony_ci ret = ltq_pinctrl_register(pdev, &xway_info); 150662306a36Sopenharmony_ci if (ret) { 150762306a36Sopenharmony_ci dev_err(&pdev->dev, "Failed to register pinctrl driver\n"); 150862306a36Sopenharmony_ci return ret; 150962306a36Sopenharmony_ci } 151062306a36Sopenharmony_ci 151162306a36Sopenharmony_ci /* register the gpio chip */ 151262306a36Sopenharmony_ci xway_chip.parent = &pdev->dev; 151362306a36Sopenharmony_ci xway_chip.owner = THIS_MODULE; 151462306a36Sopenharmony_ci ret = devm_gpiochip_add_data(&pdev->dev, &xway_chip, NULL); 151562306a36Sopenharmony_ci if (ret) { 151662306a36Sopenharmony_ci dev_err(&pdev->dev, "Failed to register gpio chip\n"); 151762306a36Sopenharmony_ci return ret; 151862306a36Sopenharmony_ci } 151962306a36Sopenharmony_ci 152062306a36Sopenharmony_ci /* 152162306a36Sopenharmony_ci * For DeviceTree-supported systems, the gpio core checks the 152262306a36Sopenharmony_ci * pinctrl's device node for the "gpio-ranges" property. 152362306a36Sopenharmony_ci * If it is present, it takes care of adding the pin ranges 152462306a36Sopenharmony_ci * for the driver. In this case the driver can skip ahead. 152562306a36Sopenharmony_ci * 152662306a36Sopenharmony_ci * In order to remain compatible with older, existing DeviceTree 152762306a36Sopenharmony_ci * files which don't set the "gpio-ranges" property or systems that 152862306a36Sopenharmony_ci * utilize ACPI the driver has to call gpiochip_add_pin_range(). 152962306a36Sopenharmony_ci */ 153062306a36Sopenharmony_ci if (!of_property_read_bool(pdev->dev.of_node, "gpio-ranges")) { 153162306a36Sopenharmony_ci /* finish with registering the gpio range in pinctrl */ 153262306a36Sopenharmony_ci xway_gpio_range.npins = xway_chip.ngpio; 153362306a36Sopenharmony_ci xway_gpio_range.base = xway_chip.base; 153462306a36Sopenharmony_ci pinctrl_add_gpio_range(xway_info.pctrl, &xway_gpio_range); 153562306a36Sopenharmony_ci } 153662306a36Sopenharmony_ci 153762306a36Sopenharmony_ci dev_info(&pdev->dev, "Init done\n"); 153862306a36Sopenharmony_ci return 0; 153962306a36Sopenharmony_ci} 154062306a36Sopenharmony_ci 154162306a36Sopenharmony_cistatic struct platform_driver pinmux_xway_driver = { 154262306a36Sopenharmony_ci .probe = pinmux_xway_probe, 154362306a36Sopenharmony_ci .driver = { 154462306a36Sopenharmony_ci .name = "pinctrl-xway", 154562306a36Sopenharmony_ci .of_match_table = xway_match, 154662306a36Sopenharmony_ci }, 154762306a36Sopenharmony_ci}; 154862306a36Sopenharmony_ci 154962306a36Sopenharmony_cistatic int __init pinmux_xway_init(void) 155062306a36Sopenharmony_ci{ 155162306a36Sopenharmony_ci return platform_driver_register(&pinmux_xway_driver); 155262306a36Sopenharmony_ci} 155362306a36Sopenharmony_ci 155462306a36Sopenharmony_cicore_initcall_sync(pinmux_xway_init); 1555