141 lines · c
1// SPDX-License-Identifier: GPL-2.0-only2 3#include <asm/mach-ralink/ralink_regs.h>4#include <asm/mach-ralink/rt305x.h>5#include <linux/module.h>6#include <linux/platform_device.h>7#include <linux/of.h>8#include "pinctrl-mtmips.h"9 10#define RT305X_GPIO_MODE_UART0_SHIFT 211#define RT305X_GPIO_MODE_UART0_MASK 0x712#define RT305X_GPIO_MODE_UART0(x) ((x) << RT305X_GPIO_MODE_UART0_SHIFT)13#define RT305X_GPIO_MODE_UARTF 014#define RT305X_GPIO_MODE_PCM_UARTF 115#define RT305X_GPIO_MODE_PCM_I2S 216#define RT305X_GPIO_MODE_I2S_UARTF 317#define RT305X_GPIO_MODE_PCM_GPIO 418#define RT305X_GPIO_MODE_GPIO_UARTF 519#define RT305X_GPIO_MODE_GPIO_I2S 620#define RT305X_GPIO_MODE_GPIO 721 22#define RT305X_GPIO_MODE_I2C 023#define RT305X_GPIO_MODE_SPI 124#define RT305X_GPIO_MODE_UART1 525#define RT305X_GPIO_MODE_JTAG 626#define RT305X_GPIO_MODE_MDIO 727#define RT305X_GPIO_MODE_SDRAM 828#define RT305X_GPIO_MODE_RGMII 929#define RT5350_GPIO_MODE_PHY_LED 1430#define RT5350_GPIO_MODE_SPI_CS1 2131#define RT3352_GPIO_MODE_LNA 1832#define RT3352_GPIO_MODE_PA 2033 34static struct mtmips_pmx_func i2c_grp[] = { FUNC("i2c", 0, 1, 2) };35static struct mtmips_pmx_func spi_grp[] = { FUNC("spi", 0, 3, 4) };36static struct mtmips_pmx_func uartf_grp[] = {37 FUNC("uartf", RT305X_GPIO_MODE_UARTF, 7, 8),38 FUNC("pcm uartf", RT305X_GPIO_MODE_PCM_UARTF, 7, 8),39 FUNC("pcm i2s", RT305X_GPIO_MODE_PCM_I2S, 7, 8),40 FUNC("i2s uartf", RT305X_GPIO_MODE_I2S_UARTF, 7, 8),41 FUNC("pcm gpio", RT305X_GPIO_MODE_PCM_GPIO, 11, 4),42 FUNC("gpio uartf", RT305X_GPIO_MODE_GPIO_UARTF, 7, 4),43 FUNC("gpio i2s", RT305X_GPIO_MODE_GPIO_I2S, 7, 4),44};45static struct mtmips_pmx_func uartlite_grp[] = { FUNC("uartlite", 0, 15, 2) };46static struct mtmips_pmx_func jtag_grp[] = { FUNC("jtag", 0, 17, 5) };47static struct mtmips_pmx_func mdio_grp[] = { FUNC("mdio", 0, 22, 2) };48static struct mtmips_pmx_func rt5350_led_grp[] = { FUNC("led", 0, 22, 5) };49static struct mtmips_pmx_func rt5350_cs1_grp[] = {50 FUNC("spi_cs1", 0, 27, 1),51 FUNC("wdg_cs1", 1, 27, 1),52};53static struct mtmips_pmx_func sdram_grp[] = { FUNC("sdram", 0, 24, 16) };54static struct mtmips_pmx_func rt3352_rgmii_grp[] = {55 FUNC("rgmii", 0, 24, 12)56};57static struct mtmips_pmx_func rgmii_grp[] = { FUNC("rgmii", 0, 40, 12) };58static struct mtmips_pmx_func rt3352_lna_grp[] = { FUNC("lna", 0, 36, 2) };59static struct mtmips_pmx_func rt3352_pa_grp[] = { FUNC("pa", 0, 38, 2) };60static struct mtmips_pmx_func rt3352_led_grp[] = { FUNC("led", 0, 40, 5) };61static struct mtmips_pmx_func rt3352_cs1_grp[] = {62 FUNC("spi_cs1", 0, 45, 1),63 FUNC("wdg_cs1", 1, 45, 1),64};65 66static struct mtmips_pmx_group rt3050_pinmux_data[] = {67 GRP("i2c", i2c_grp, 1, RT305X_GPIO_MODE_I2C),68 GRP("spi", spi_grp, 1, RT305X_GPIO_MODE_SPI),69 GRP("uartf", uartf_grp, RT305X_GPIO_MODE_UART0_MASK,70 RT305X_GPIO_MODE_UART0_SHIFT),71 GRP("uartlite", uartlite_grp, 1, RT305X_GPIO_MODE_UART1),72 GRP("jtag", jtag_grp, 1, RT305X_GPIO_MODE_JTAG),73 GRP("mdio", mdio_grp, 1, RT305X_GPIO_MODE_MDIO),74 GRP("rgmii", rgmii_grp, 1, RT305X_GPIO_MODE_RGMII),75 GRP("sdram", sdram_grp, 1, RT305X_GPIO_MODE_SDRAM),76 { 0 }77};78 79static struct mtmips_pmx_group rt3352_pinmux_data[] = {80 GRP("i2c", i2c_grp, 1, RT305X_GPIO_MODE_I2C),81 GRP("spi", spi_grp, 1, RT305X_GPIO_MODE_SPI),82 GRP("uartf", uartf_grp, RT305X_GPIO_MODE_UART0_MASK,83 RT305X_GPIO_MODE_UART0_SHIFT),84 GRP("uartlite", uartlite_grp, 1, RT305X_GPIO_MODE_UART1),85 GRP("jtag", jtag_grp, 1, RT305X_GPIO_MODE_JTAG),86 GRP("mdio", mdio_grp, 1, RT305X_GPIO_MODE_MDIO),87 GRP("rgmii", rt3352_rgmii_grp, 1, RT305X_GPIO_MODE_RGMII),88 GRP("lna", rt3352_lna_grp, 1, RT3352_GPIO_MODE_LNA),89 GRP("pa", rt3352_pa_grp, 1, RT3352_GPIO_MODE_PA),90 GRP("led", rt3352_led_grp, 1, RT5350_GPIO_MODE_PHY_LED),91 GRP("spi_cs1", rt3352_cs1_grp, 2, RT5350_GPIO_MODE_SPI_CS1),92 { 0 }93};94 95static struct mtmips_pmx_group rt5350_pinmux_data[] = {96 GRP("i2c", i2c_grp, 1, RT305X_GPIO_MODE_I2C),97 GRP("spi", spi_grp, 1, RT305X_GPIO_MODE_SPI),98 GRP("uartf", uartf_grp, RT305X_GPIO_MODE_UART0_MASK,99 RT305X_GPIO_MODE_UART0_SHIFT),100 GRP("uartlite", uartlite_grp, 1, RT305X_GPIO_MODE_UART1),101 GRP("jtag", jtag_grp, 1, RT305X_GPIO_MODE_JTAG),102 GRP("led", rt5350_led_grp, 1, RT5350_GPIO_MODE_PHY_LED),103 GRP("spi_cs1", rt5350_cs1_grp, 2, RT5350_GPIO_MODE_SPI_CS1),104 { 0 }105};106 107static int rt305x_pinctrl_probe(struct platform_device *pdev)108{109 if (soc_is_rt5350())110 return mtmips_pinctrl_init(pdev, rt5350_pinmux_data);111 else if (soc_is_rt305x() || soc_is_rt3350())112 return mtmips_pinctrl_init(pdev, rt3050_pinmux_data);113 else if (soc_is_rt3352())114 return mtmips_pinctrl_init(pdev, rt3352_pinmux_data);115 else116 return -EINVAL;117}118 119static const struct of_device_id rt305x_pinctrl_match[] = {120 { .compatible = "ralink,rt305x-pinctrl" },121 { .compatible = "ralink,rt3352-pinctrl" },122 { .compatible = "ralink,rt5350-pinctrl" },123 { .compatible = "ralink,rt2880-pinmux" },124 {}125};126MODULE_DEVICE_TABLE(of, rt305x_pinctrl_match);127 128static struct platform_driver rt305x_pinctrl_driver = {129 .probe = rt305x_pinctrl_probe,130 .driver = {131 .name = "rt305x-pinctrl",132 .of_match_table = rt305x_pinctrl_match,133 },134};135 136static int __init rt305x_pinctrl_init(void)137{138 return platform_driver_register(&rt305x_pinctrl_driver);139}140core_initcall_sync(rt305x_pinctrl_init);141