Commit 52130b60 authored by Viresh Kumar's avatar Viresh Kumar Committed by Arnd Bergmann

pinctrl: Add SPEAr3xx pinctrl drivers

This adds pinctrl driver for SPEAr3xx family. SPEAr3xx family supports three
families: SPEAr300, SPEAr310 and SPEAr320.
Signed-off-by: default avatarViresh Kumar <viresh.kumar@st.com>
Acked-by: default avatarLinus Walleij <linus.walleij@linaro.org>
Reviewed-by: default avatarStephen Warren <swarren@wwwdotorg.org>
parent deda8287
ST Microelectronics, SPEAr pinmux controller
Required properties:
- compatible : "st,spear300-pinmux"
: "st,spear310-pinmux"
: "st,spear320-pinmux"
- reg : Address range of the pinctrl registers
- st,pinmux-mode: Mandatory for SPEAr300 and SPEAr320 and invalid for others.
- Its values for SPEAr300:
- NAND_MODE : <0>
- NOR_MODE : <1>
- PHOTO_FRAME_MODE : <2>
- LEND_IP_PHONE_MODE : <3>
- HEND_IP_PHONE_MODE : <4>
- LEND_WIFI_PHONE_MODE : <5>
- HEND_WIFI_PHONE_MODE : <6>
- ATA_PABX_WI2S_MODE : <7>
- ATA_PABX_I2S_MODE : <8>
- CAML_LCDW_MODE : <9>
- CAMU_LCD_MODE : <10>
- CAMU_WLCD_MODE : <11>
- CAML_LCD_MODE : <12>
- Its values for SPEAr320:
- AUTO_NET_SMII_MODE : <0>
- AUTO_NET_MII_MODE : <1>
- AUTO_EXP_MODE : <2>
- SMALL_PRINTERS_MODE : <3>
- EXTENDED_MODE : <4>
Please refer to pinctrl-bindings.txt in this directory for details of the common
pinctrl bindings used by client devices.
SPEAr's pinmux nodes act as a container for an abitrary number of subnodes. Each
of these subnodes represents muxing for a pin, a group, or a list of pins or
groups.
The name of each subnode is not important; all subnodes should be enumerated
and processed purely based on their content.
Required subnode-properties:
- st,pins : An array of strings. Each string contains the name of a pin or
group.
- st,function: A string containing the name of the function to mux to the pin or
group. See the SPEAr's TRM to determine which are valid for each pin or group.
Valid values for group and function names can be found from looking at the
group and function arrays in driver files:
drivers/pinctrl/spear/pinctrl-spear3*0.c
Valid values for group names are:
For All SPEAr3xx machines:
"firda_grp", "i2c0_grp", "ssp_cs_grp", "ssp0_grp", "mii0_grp",
"gpio0_pin0_grp", "gpio0_pin1_grp", "gpio0_pin2_grp", "gpio0_pin3_grp",
"gpio0_pin4_grp", "gpio0_pin5_grp", "uart0_ext_grp", "uart0_grp",
"timer_0_1_grp", timer_0_1_pins, "timer_2_3_grp"
For SPEAr300 machines:
"fsmc_2chips_grp", "fsmc_4chips_grp", "clcd_lcdmode_grp",
"clcd_pfmode_grp", "tdm_grp", "i2c_clk_grp_grp", "caml_grp", "camu_grp",
"dac_grp", "i2s_grp", "sdhci_4bit_grp", "sdhci_8bit_grp",
"gpio1_0_to_3_grp", "gpio1_4_to_7_grp"
For SPEAr310 machines:
"emi_cs_0_to_5_grp", "uart1_grp", "uart2_grp", "uart3_grp", "uart4_grp",
"uart5_grp", "fsmc_grp", "rs485_0_grp", "rs485_1_grp", "tdm_grp"
For SPEAr320 machines:
"clcd_grp", "emi_grp", "fsmc_8bit_grp", "fsmc_16bit_grp", "spp_grp",
"sdhci_led_grp", "sdhci_cd_12_grp", "sdhci_cd_51_grp", "i2s_grp",
"uart1_grp", "uart1_modem_2_to_7_grp", "uart1_modem_31_to_36_grp",
"uart1_modem_34_to_45_grp", "uart1_modem_80_to_85_grp", "uart2_grp",
"uart3_8_9_grp", "uart3_15_16_grp", "uart3_41_42_grp",
"uart3_52_53_grp", "uart3_73_74_grp", "uart3_94_95_grp",
"uart3_98_99_grp", "uart4_6_7_grp", "uart4_13_14_grp",
"uart4_39_40_grp", "uart4_71_72_grp", "uart4_92_93_grp",
"uart4_100_101_grp", "uart5_4_5_grp", "uart5_37_38_grp",
"uart5_69_70_grp", "uart5_90_91_grp", "uart6_2_3_grp",
"uart6_88_89_grp", "rs485_grp", "touchscreen_grp", "can0_grp",
"can1_grp", "pwm0_1_pin_8_9_grp", "pwm0_1_pin_14_15_grp",
"pwm0_1_pin_30_31_grp", "pwm0_1_pin_37_38_grp", "pwm0_1_pin_42_43_grp",
"pwm0_1_pin_59_60_grp", "pwm0_1_pin_88_89_grp", "pwm2_pin_7_grp",
"pwm2_pin_13_grp", "pwm2_pin_29_grp", "pwm2_pin_34_grp",
"pwm2_pin_41_grp", "pwm2_pin_58_grp", "pwm2_pin_87_grp",
"pwm3_pin_6_grp", "pwm3_pin_12_grp", "pwm3_pin_28_grp",
"pwm3_pin_40_grp", "pwm3_pin_57_grp", "pwm3_pin_86_grp",
"ssp1_17_20_grp", "ssp1_36_39_grp", "ssp1_48_51_grp", "ssp1_65_68_grp",
"ssp1_94_97_grp", "ssp2_13_16_grp", "ssp2_32_35_grp", "ssp2_44_47_grp",
"ssp2_61_64_grp", "ssp2_90_93_grp", "mii2_grp", "smii0_1_grp",
"rmii0_1_grp", "i2c1_8_9_grp", "i2c1_98_99_grp", "i2c2_0_1_grp",
"i2c2_2_3_grp", "i2c2_19_20_grp", "i2c2_75_76_grp", "i2c2_96_97_grp"
Valid values for function names are:
For All SPEAr3xx machines:
"firda", "i2c0", "ssp_cs", "ssp0", "mii0", "gpio0", "uart0_ext",
"uart0", "timer_0_1", "timer_2_3"
For SPEAr300 machines:
"fsmc", "clcd", "tdm", "i2c1", "cam", "dac", "i2s", "sdhci", "gpio1"
For SPEAr310 machines:
"emi", "uart1", "uart2", "uart3", "uart4", "uart5", "fsmc", "rs485_0",
"rs485_1", "tdm"
For SPEAr320 machines:
"clcd", "emi", "fsmc", "spp", "sdhci", "i2s", "uart1", "uart1_modem",
"uart2", "uart3", "uart4", "uart5", "uart6", "rs485", "touchscreen",
"can0", "can1", "pwm0_1", "pwm2", "pwm3", "ssp1", "ssp2", "mii2",
"mii0_1", "i2c1", "i2c2"
......@@ -11,4 +11,24 @@ config PINCTRL_SPEAR
help
This enables pin control drivers for SPEAr Platform
config PINCTRL_SPEAR3XX
bool
depends on ARCH_SPEAR3XX
select PINCTRL_SPEAR
config PINCTRL_SPEAR300
bool "ST Microelectronics SPEAr300 SoC pin controller driver"
depends on MACH_SPEAR300
select PINCTRL_SPEAR3XX
config PINCTRL_SPEAR310
bool "ST Microelectronics SPEAr310 SoC pin controller driver"
depends on MACH_SPEAR310
select PINCTRL_SPEAR3XX
config PINCTRL_SPEAR320
bool "ST Microelectronics SPEAr320 SoC pin controller driver"
depends on MACH_SPEAR320
select PINCTRL_SPEAR3XX
endif
# SPEAr pinmux support
obj-$(CONFIG_PINCTRL_SPEAR) += pinctrl-spear.o
obj-$(CONFIG_PINCTRL_SPEAR3XX) += pinctrl-spear3xx.o
obj-$(CONFIG_PINCTRL_SPEAR300) += pinctrl-spear300.o
obj-$(CONFIG_PINCTRL_SPEAR310) += pinctrl-spear310.o
obj-$(CONFIG_PINCTRL_SPEAR320) += pinctrl-spear320.o
/*
* Driver for the ST Microelectronics SPEAr300 pinmux
*
* Copyright (C) 2012 ST Microelectronics
* Viresh Kumar <viresh.kumar@st.com>
*
* This file is licensed under the terms of the GNU General Public
* License version 2. This program is licensed "as is" without any
* warranty of any kind, whether express or implied.
*/
#include <linux/err.h>
#include <linux/init.h>
#include <linux/module.h>
#include <linux/of_device.h>
#include <linux/platform_device.h>
#include "pinctrl-spear3xx.h"
#define DRIVER_NAME "spear300-pinmux"
/* addresses */
#define PMX_CONFIG_REG 0x00
#define MODE_CONFIG_REG 0x04
/* modes */
#define NAND_MODE (1 << 0)
#define NOR_MODE (1 << 1)
#define PHOTO_FRAME_MODE (1 << 2)
#define LEND_IP_PHONE_MODE (1 << 3)
#define HEND_IP_PHONE_MODE (1 << 4)
#define LEND_WIFI_PHONE_MODE (1 << 5)
#define HEND_WIFI_PHONE_MODE (1 << 6)
#define ATA_PABX_WI2S_MODE (1 << 7)
#define ATA_PABX_I2S_MODE (1 << 8)
#define CAML_LCDW_MODE (1 << 9)
#define CAMU_LCD_MODE (1 << 10)
#define CAMU_WLCD_MODE (1 << 11)
#define CAML_LCD_MODE (1 << 12)
static struct spear_pmx_mode pmx_mode_nand = {
.name = "nand",
.mode = NAND_MODE,
.reg = MODE_CONFIG_REG,
.mask = 0x0000000F,
.val = 0x00,
};
static struct spear_pmx_mode pmx_mode_nor = {
.name = "nor",
.mode = NOR_MODE,
.reg = MODE_CONFIG_REG,
.mask = 0x0000000F,
.val = 0x01,
};
static struct spear_pmx_mode pmx_mode_photo_frame = {
.name = "photo frame mode",
.mode = PHOTO_FRAME_MODE,
.reg = MODE_CONFIG_REG,
.mask = 0x0000000F,
.val = 0x02,
};
static struct spear_pmx_mode pmx_mode_lend_ip_phone = {
.name = "lend ip phone mode",
.mode = LEND_IP_PHONE_MODE,
.reg = MODE_CONFIG_REG,
.mask = 0x0000000F,
.val = 0x03,
};
static struct spear_pmx_mode pmx_mode_hend_ip_phone = {
.name = "hend ip phone mode",
.mode = HEND_IP_PHONE_MODE,
.reg = MODE_CONFIG_REG,
.mask = 0x0000000F,
.val = 0x04,
};
static struct spear_pmx_mode pmx_mode_lend_wifi_phone = {
.name = "lend wifi phone mode",
.mode = LEND_WIFI_PHONE_MODE,
.reg = MODE_CONFIG_REG,
.mask = 0x0000000F,
.val = 0x05,
};
static struct spear_pmx_mode pmx_mode_hend_wifi_phone = {
.name = "hend wifi phone mode",
.mode = HEND_WIFI_PHONE_MODE,
.reg = MODE_CONFIG_REG,
.mask = 0x0000000F,
.val = 0x06,
};
static struct spear_pmx_mode pmx_mode_ata_pabx_wi2s = {
.name = "ata pabx wi2s mode",
.mode = ATA_PABX_WI2S_MODE,
.reg = MODE_CONFIG_REG,
.mask = 0x0000000F,
.val = 0x07,
};
static struct spear_pmx_mode pmx_mode_ata_pabx_i2s = {
.name = "ata pabx i2s mode",
.mode = ATA_PABX_I2S_MODE,
.reg = MODE_CONFIG_REG,
.mask = 0x0000000F,
.val = 0x08,
};
static struct spear_pmx_mode pmx_mode_caml_lcdw = {
.name = "caml lcdw mode",
.mode = CAML_LCDW_MODE,
.reg = MODE_CONFIG_REG,
.mask = 0x0000000F,
.val = 0x0C,
};
static struct spear_pmx_mode pmx_mode_camu_lcd = {
.name = "camu lcd mode",
.mode = CAMU_LCD_MODE,
.reg = MODE_CONFIG_REG,
.mask = 0x0000000F,
.val = 0x0D,
};
static struct spear_pmx_mode pmx_mode_camu_wlcd = {
.name = "camu wlcd mode",
.mode = CAMU_WLCD_MODE,
.reg = MODE_CONFIG_REG,
.mask = 0x0000000F,
.val = 0xE,
};
static struct spear_pmx_mode pmx_mode_caml_lcd = {
.name = "caml lcd mode",
.mode = CAML_LCD_MODE,
.reg = MODE_CONFIG_REG,
.mask = 0x0000000F,
.val = 0x0F,
};
static struct spear_pmx_mode *spear300_pmx_modes[] = {
&pmx_mode_nand,
&pmx_mode_nor,
&pmx_mode_photo_frame,
&pmx_mode_lend_ip_phone,
&pmx_mode_hend_ip_phone,
&pmx_mode_lend_wifi_phone,
&pmx_mode_hend_wifi_phone,
&pmx_mode_ata_pabx_wi2s,
&pmx_mode_ata_pabx_i2s,
&pmx_mode_caml_lcdw,
&pmx_mode_camu_lcd,
&pmx_mode_camu_wlcd,
&pmx_mode_caml_lcd,
};
/* fsmc_2chips_pins */
static const unsigned fsmc_2chips_pins[] = { 1, 97 };
static struct spear_muxreg fsmc_2chips_muxreg[] = {
{
.reg = PMX_CONFIG_REG,
.mask = PMX_FIRDA_MASK,
.val = 0,
},
};
static struct spear_modemux fsmc_2chips_modemux[] = {
{
.modes = NAND_MODE | NOR_MODE | PHOTO_FRAME_MODE |
ATA_PABX_WI2S_MODE | ATA_PABX_I2S_MODE,
.muxregs = fsmc_2chips_muxreg,
.nmuxregs = ARRAY_SIZE(fsmc_2chips_muxreg),
},
};
static struct spear_pingroup fsmc_2chips_pingroup = {
.name = "fsmc_2chips_grp",
.pins = fsmc_2chips_pins,
.npins = ARRAY_SIZE(fsmc_2chips_pins),
.modemuxs = fsmc_2chips_modemux,
.nmodemuxs = ARRAY_SIZE(fsmc_2chips_modemux),
};
/* fsmc_4chips_pins */
static const unsigned fsmc_4chips_pins[] = { 1, 2, 3, 97 };
static struct spear_muxreg fsmc_4chips_muxreg[] = {
{
.reg = PMX_CONFIG_REG,
.mask = PMX_FIRDA_MASK | PMX_UART0_MASK,
.val = 0,
},
};
static struct spear_modemux fsmc_4chips_modemux[] = {
{
.modes = NAND_MODE | NOR_MODE | PHOTO_FRAME_MODE |
ATA_PABX_WI2S_MODE | ATA_PABX_I2S_MODE,
.muxregs = fsmc_4chips_muxreg,
.nmuxregs = ARRAY_SIZE(fsmc_4chips_muxreg),
},
};
static struct spear_pingroup fsmc_4chips_pingroup = {
.name = "fsmc_4chips_grp",
.pins = fsmc_4chips_pins,
.npins = ARRAY_SIZE(fsmc_4chips_pins),
.modemuxs = fsmc_4chips_modemux,
.nmodemuxs = ARRAY_SIZE(fsmc_4chips_modemux),
};
static const char *const fsmc_grps[] = { "fsmc_2chips_grp", "fsmc_4chips_grp"
};
static struct spear_function fsmc_function = {
.name = "fsmc",
.groups = fsmc_grps,
.ngroups = ARRAY_SIZE(fsmc_grps),
};
/* clcd_lcdmode_pins */
static const unsigned clcd_lcdmode_pins[] = { 49, 50 };
static struct spear_muxreg clcd_lcdmode_muxreg[] = {
{
.reg = PMX_CONFIG_REG,
.mask = PMX_TIMER_0_1_MASK | PMX_TIMER_2_3_MASK,
.val = 0,
},
};
static struct spear_modemux clcd_lcdmode_modemux[] = {
{
.modes = HEND_IP_PHONE_MODE | HEND_WIFI_PHONE_MODE |
CAMU_LCD_MODE | CAML_LCD_MODE,
.muxregs = clcd_lcdmode_muxreg,
.nmuxregs = ARRAY_SIZE(clcd_lcdmode_muxreg),
},
};
static struct spear_pingroup clcd_lcdmode_pingroup = {
.name = "clcd_lcdmode_grp",
.pins = clcd_lcdmode_pins,
.npins = ARRAY_SIZE(clcd_lcdmode_pins),
.modemuxs = clcd_lcdmode_modemux,
.nmodemuxs = ARRAY_SIZE(clcd_lcdmode_modemux),
};
/* clcd_pfmode_pins */
static const unsigned clcd_pfmode_pins[] = { 47, 48, 49, 50 };
static struct spear_muxreg clcd_pfmode_muxreg[] = {
{
.reg = PMX_CONFIG_REG,
.mask = PMX_TIMER_2_3_MASK,
.val = 0,
},
};
static struct spear_modemux clcd_pfmode_modemux[] = {
{
.modes = PHOTO_FRAME_MODE,
.muxregs = clcd_pfmode_muxreg,
.nmuxregs = ARRAY_SIZE(clcd_pfmode_muxreg),
},
};
static struct spear_pingroup clcd_pfmode_pingroup = {
.name = "clcd_pfmode_grp",
.pins = clcd_pfmode_pins,
.npins = ARRAY_SIZE(clcd_pfmode_pins),
.modemuxs = clcd_pfmode_modemux,
.nmodemuxs = ARRAY_SIZE(clcd_pfmode_modemux),
};
static const char *const clcd_grps[] = { "clcd_lcdmode_grp", "clcd_pfmode_grp"
};
static struct spear_function clcd_function = {
.name = "clcd",
.groups = clcd_grps,
.ngroups = ARRAY_SIZE(clcd_grps),
};
/* tdm_pins */
static const unsigned tdm_pins[] = { 34, 35, 36, 37, 38 };
static struct spear_muxreg tdm_muxreg[] = {
{
.reg = PMX_CONFIG_REG,
.mask = PMX_UART0_MODEM_MASK | PMX_SSP_CS_MASK,
.val = 0,
},
};
static struct spear_modemux tdm_modemux[] = {
{
.modes = PHOTO_FRAME_MODE | LEND_IP_PHONE_MODE |
HEND_IP_PHONE_MODE | LEND_WIFI_PHONE_MODE
| HEND_WIFI_PHONE_MODE | ATA_PABX_WI2S_MODE
| ATA_PABX_I2S_MODE | CAML_LCDW_MODE | CAMU_LCD_MODE
| CAMU_WLCD_MODE | CAML_LCD_MODE,
.muxregs = tdm_muxreg,
.nmuxregs = ARRAY_SIZE(tdm_muxreg),
},
};
static struct spear_pingroup tdm_pingroup = {
.name = "tdm_grp",
.pins = tdm_pins,
.npins = ARRAY_SIZE(tdm_pins),
.modemuxs = tdm_modemux,
.nmodemuxs = ARRAY_SIZE(tdm_modemux),
};
static const char *const tdm_grps[] = { "tdm_grp" };
static struct spear_function tdm_function = {
.name = "tdm",
.groups = tdm_grps,
.ngroups = ARRAY_SIZE(tdm_grps),
};
/* i2c_clk_pins */
static const unsigned i2c_clk_pins[] = { 45, 46, 47, 48 };
static struct spear_muxreg i2c_clk_muxreg[] = {
{
.reg = PMX_CONFIG_REG,
.mask = PMX_TIMER_0_1_MASK | PMX_TIMER_2_3_MASK,
.val = 0,
},
};
static struct spear_modemux i2c_clk_modemux[] = {
{
.modes = LEND_IP_PHONE_MODE | HEND_IP_PHONE_MODE |
LEND_WIFI_PHONE_MODE | HEND_WIFI_PHONE_MODE |
ATA_PABX_WI2S_MODE | ATA_PABX_I2S_MODE | CAML_LCDW_MODE
| CAML_LCD_MODE,
.muxregs = i2c_clk_muxreg,
.nmuxregs = ARRAY_SIZE(i2c_clk_muxreg),
},
};
static struct spear_pingroup i2c_clk_pingroup = {
.name = "i2c_clk_grp_grp",
.pins = i2c_clk_pins,
.npins = ARRAY_SIZE(i2c_clk_pins),
.modemuxs = i2c_clk_modemux,
.nmodemuxs = ARRAY_SIZE(i2c_clk_modemux),
};
static const char *const i2c_grps[] = { "i2c_clk_grp" };
static struct spear_function i2c_function = {
.name = "i2c1",
.groups = i2c_grps,
.ngroups = ARRAY_SIZE(i2c_grps),
};
/* caml_pins */
static const unsigned caml_pins[] = { 12, 13, 14, 15, 16, 17, 18, 19, 20, 21 };
static struct spear_muxreg caml_muxreg[] = {
{
.reg = PMX_CONFIG_REG,
.mask = PMX_MII_MASK,
.val = 0,
},
};
static struct spear_modemux caml_modemux[] = {
{
.modes = CAML_LCDW_MODE | CAML_LCD_MODE,
.muxregs = caml_muxreg,
.nmuxregs = ARRAY_SIZE(caml_muxreg),
},
};
static struct spear_pingroup caml_pingroup = {
.name = "caml_grp",
.pins = caml_pins,
.npins = ARRAY_SIZE(caml_pins),
.modemuxs = caml_modemux,
.nmodemuxs = ARRAY_SIZE(caml_modemux),
};
/* camu_pins */
static const unsigned camu_pins[] = { 16, 17, 18, 19, 20, 21, 45, 46, 47, 48 };
static struct spear_muxreg camu_muxreg[] = {
{
.reg = PMX_CONFIG_REG,
.mask = PMX_TIMER_0_1_MASK | PMX_TIMER_2_3_MASK | PMX_MII_MASK,
.val = 0,
},
};
static struct spear_modemux camu_modemux[] = {
{
.modes = CAMU_LCD_MODE | CAMU_WLCD_MODE,
.muxregs = camu_muxreg,
.nmuxregs = ARRAY_SIZE(camu_muxreg),
},
};
static struct spear_pingroup camu_pingroup = {
.name = "camu_grp",
.pins = camu_pins,
.npins = ARRAY_SIZE(camu_pins),
.modemuxs = camu_modemux,
.nmodemuxs = ARRAY_SIZE(camu_modemux),
};
static const char *const cam_grps[] = { "caml_grp", "camu_grp" };
static struct spear_function cam_function = {
.name = "cam",
.groups = cam_grps,
.ngroups = ARRAY_SIZE(cam_grps),
};
/* dac_pins */
static const unsigned dac_pins[] = { 43, 44 };
static struct spear_muxreg dac_muxreg[] = {
{
.reg = PMX_CONFIG_REG,
.mask = PMX_TIMER_0_1_MASK,
.val = 0,
},
};
static struct spear_modemux dac_modemux[] = {
{
.modes = ATA_PABX_I2S_MODE | CAML_LCDW_MODE | CAMU_LCD_MODE
| CAMU_WLCD_MODE | CAML_LCD_MODE,
.muxregs = dac_muxreg,
.nmuxregs = ARRAY_SIZE(dac_muxreg),
},
};
static struct spear_pingroup dac_pingroup = {
.name = "dac_grp",
.pins = dac_pins,
.npins = ARRAY_SIZE(dac_pins),
.modemuxs = dac_modemux,
.nmodemuxs = ARRAY_SIZE(dac_modemux),
};
static const char *const dac_grps[] = { "dac_grp" };
static struct spear_function dac_function = {
.name = "dac",
.groups = dac_grps,
.ngroups = ARRAY_SIZE(dac_grps),
};
/* i2s_pins */
static const unsigned i2s_pins[] = { 39, 40, 41, 42 };
static struct spear_muxreg i2s_muxreg[] = {
{
.reg = PMX_CONFIG_REG,
.mask = PMX_UART0_MODEM_MASK,
.val = 0,
},
};
static struct spear_modemux i2s_modemux[] = {
{
.modes = LEND_IP_PHONE_MODE | HEND_IP_PHONE_MODE
| LEND_WIFI_PHONE_MODE | HEND_WIFI_PHONE_MODE |
ATA_PABX_I2S_MODE | CAML_LCDW_MODE | CAMU_LCD_MODE
| CAMU_WLCD_MODE | CAML_LCD_MODE,
.muxregs = i2s_muxreg,
.nmuxregs = ARRAY_SIZE(i2s_muxreg),
},
};
static struct spear_pingroup i2s_pingroup = {
.name = "i2s_grp",
.pins = i2s_pins,
.npins = ARRAY_SIZE(i2s_pins),
.modemuxs = i2s_modemux,
.nmodemuxs = ARRAY_SIZE(i2s_modemux),
};
static const char *const i2s_grps[] = { "i2s_grp" };
static struct spear_function i2s_function = {
.name = "i2s",
.groups = i2s_grps,
.ngroups = ARRAY_SIZE(i2s_grps),
};
/* sdhci_4bit_pins */
static const unsigned sdhci_4bit_pins[] = { 28, 29, 30, 31, 32, 33 };
static struct spear_muxreg sdhci_4bit_muxreg[] = {
{
.reg = PMX_CONFIG_REG,
.mask = PMX_GPIO_PIN0_MASK | PMX_GPIO_PIN1_MASK |
PMX_GPIO_PIN2_MASK | PMX_GPIO_PIN3_MASK |
PMX_GPIO_PIN4_MASK | PMX_GPIO_PIN5_MASK,
.val = 0,
},
};
static struct spear_modemux sdhci_4bit_modemux[] = {
{
.modes = PHOTO_FRAME_MODE | LEND_IP_PHONE_MODE |
HEND_IP_PHONE_MODE | LEND_WIFI_PHONE_MODE |
HEND_WIFI_PHONE_MODE | CAML_LCDW_MODE | CAMU_LCD_MODE |
CAMU_WLCD_MODE | CAML_LCD_MODE | ATA_PABX_WI2S_MODE,
.muxregs = sdhci_4bit_muxreg,
.nmuxregs = ARRAY_SIZE(sdhci_4bit_muxreg),
},
};
static struct spear_pingroup sdhci_4bit_pingroup = {
.name = "sdhci_4bit_grp",
.pins = sdhci_4bit_pins,
.npins = ARRAY_SIZE(sdhci_4bit_pins),
.modemuxs = sdhci_4bit_modemux,
.nmodemuxs = ARRAY_SIZE(sdhci_4bit_modemux),
};
/* sdhci_8bit_pins */
static const unsigned sdhci_8bit_pins[] = { 24, 25, 26, 27, 28, 29, 30, 31, 32,
33 };
static struct spear_muxreg sdhci_8bit_muxreg[] = {
{
.reg = PMX_CONFIG_REG,
.mask = PMX_GPIO_PIN0_MASK | PMX_GPIO_PIN1_MASK |
PMX_GPIO_PIN2_MASK | PMX_GPIO_PIN3_MASK |
PMX_GPIO_PIN4_MASK | PMX_GPIO_PIN5_MASK | PMX_MII_MASK,
.val = 0,
},
};
static struct spear_modemux sdhci_8bit_modemux[] = {
{
.modes = PHOTO_FRAME_MODE | LEND_IP_PHONE_MODE |
HEND_IP_PHONE_MODE | LEND_WIFI_PHONE_MODE |
HEND_WIFI_PHONE_MODE | CAML_LCDW_MODE | CAMU_LCD_MODE |
CAMU_WLCD_MODE | CAML_LCD_MODE,
.muxregs = sdhci_8bit_muxreg,
.nmuxregs = ARRAY_SIZE(sdhci_8bit_muxreg),
},
};
static struct spear_pingroup sdhci_8bit_pingroup = {
.name = "sdhci_8bit_grp",
.pins = sdhci_8bit_pins,
.npins = ARRAY_SIZE(sdhci_8bit_pins),
.modemuxs = sdhci_8bit_modemux,
.nmodemuxs = ARRAY_SIZE(sdhci_8bit_modemux),
};
static const char *const sdhci_grps[] = { "sdhci_4bit_grp", "sdhci_8bit_grp" };
static struct spear_function sdhci_function = {
.name = "sdhci",
.groups = sdhci_grps,
.ngroups = ARRAY_SIZE(sdhci_grps),
};
/* gpio1_0_to_3_pins */
static const unsigned gpio1_0_to_3_pins[] = { 39, 40, 41, 42 };
static struct spear_muxreg gpio1_0_to_3_muxreg[] = {
{
.reg = PMX_CONFIG_REG,
.mask = PMX_UART0_MODEM_MASK,
.val = 0,
},
};
static struct spear_modemux gpio1_0_to_3_modemux[] = {
{
.modes = PHOTO_FRAME_MODE,
.muxregs = gpio1_0_to_3_muxreg,
.nmuxregs = ARRAY_SIZE(gpio1_0_to_3_muxreg),
},
};
static struct spear_pingroup gpio1_0_to_3_pingroup = {
.name = "gpio1_0_to_3_grp",
.pins = gpio1_0_to_3_pins,
.npins = ARRAY_SIZE(gpio1_0_to_3_pins),
.modemuxs = gpio1_0_to_3_modemux,
.nmodemuxs = ARRAY_SIZE(gpio1_0_to_3_modemux),
};
/* gpio1_4_to_7_pins */
static const unsigned gpio1_4_to_7_pins[] = { 43, 44, 45, 46 };
static struct spear_muxreg gpio1_4_to_7_muxreg[] = {
{
.reg = PMX_CONFIG_REG,
.mask = PMX_TIMER_0_1_MASK | PMX_TIMER_2_3_MASK,
.val = 0,
},
};
static struct spear_modemux gpio1_4_to_7_modemux[] = {
{
.modes = PHOTO_FRAME_MODE,
.muxregs = gpio1_4_to_7_muxreg,
.nmuxregs = ARRAY_SIZE(gpio1_4_to_7_muxreg),
},
};
static struct spear_pingroup gpio1_4_to_7_pingroup = {
.name = "gpio1_4_to_7_grp",
.pins = gpio1_4_to_7_pins,
.npins = ARRAY_SIZE(gpio1_4_to_7_pins),
.modemuxs = gpio1_4_to_7_modemux,
.nmodemuxs = ARRAY_SIZE(gpio1_4_to_7_modemux),
};
static const char *const gpio1_grps[] = { "gpio1_0_to_3_grp", "gpio1_4_to_7_grp"
};
static struct spear_function gpio1_function = {
.name = "gpio1",
.groups = gpio1_grps,
.ngroups = ARRAY_SIZE(gpio1_grps),
};
/* pingroups */
static struct spear_pingroup *spear300_pingroups[] = {
SPEAR3XX_COMMON_PINGROUPS,
&fsmc_2chips_pingroup,
&fsmc_4chips_pingroup,
&clcd_lcdmode_pingroup,
&clcd_pfmode_pingroup,
&tdm_pingroup,
&i2c_clk_pingroup,
&caml_pingroup,
&camu_pingroup,
&dac_pingroup,
&i2s_pingroup,
&sdhci_4bit_pingroup,
&sdhci_8bit_pingroup,
&gpio1_0_to_3_pingroup,
&gpio1_4_to_7_pingroup,
};
/* functions */
static struct spear_function *spear300_functions[] = {
SPEAR3XX_COMMON_FUNCTIONS,
&fsmc_function,
&clcd_function,
&tdm_function,
&i2c_function,
&cam_function,
&dac_function,
&i2s_function,
&sdhci_function,
&gpio1_function,
};
static struct of_device_id spear300_pinctrl_of_match[] __devinitdata = {
{
.compatible = "st,spear300-pinmux",
},
{},
};
static int __devinit spear300_pinctrl_probe(struct platform_device *pdev)
{
int ret;
spear3xx_machdata.groups = spear300_pingroups;
spear3xx_machdata.ngroups = ARRAY_SIZE(spear300_pingroups);
spear3xx_machdata.functions = spear300_functions;
spear3xx_machdata.nfunctions = ARRAY_SIZE(spear300_functions);
spear3xx_machdata.modes_supported = true;
spear3xx_machdata.pmx_modes = spear300_pmx_modes;
spear3xx_machdata.npmx_modes = ARRAY_SIZE(spear300_pmx_modes);
pmx_init_addr(&spear3xx_machdata, PMX_CONFIG_REG);
ret = spear_pinctrl_probe(pdev, &spear3xx_machdata);
if (ret)
return ret;
return 0;
}
static int __devexit spear300_pinctrl_remove(struct platform_device *pdev)
{
return spear_pinctrl_remove(pdev);
}
static struct platform_driver spear300_pinctrl_driver = {
.driver = {
.name = DRIVER_NAME,
.owner = THIS_MODULE,
.of_match_table = spear300_pinctrl_of_match,
},
.probe = spear300_pinctrl_probe,
.remove = __devexit_p(spear300_pinctrl_remove),
};
static int __init spear300_pinctrl_init(void)
{
return platform_driver_register(&spear300_pinctrl_driver);
}
arch_initcall(spear300_pinctrl_init);
static void __exit spear300_pinctrl_exit(void)
{
platform_driver_unregister(&spear300_pinctrl_driver);
}
module_exit(spear300_pinctrl_exit);
MODULE_AUTHOR("Viresh Kumar <viresh.kumar@st.com>");
MODULE_DESCRIPTION("ST Microelectronics SPEAr300 pinctrl driver");
MODULE_LICENSE("GPL v2");
MODULE_DEVICE_TABLE(of, spear300_pinctrl_of_match);
/*
* Driver for the ST Microelectronics SPEAr310 pinmux
*
* Copyright (C) 2012 ST Microelectronics
* Viresh Kumar <viresh.kumar@st.com>
*
* This file is licensed under the terms of the GNU General Public
* License version 2. This program is licensed "as is" without any
* warranty of any kind, whether express or implied.
*/
#include <linux/err.h>
#include <linux/init.h>
#include <linux/module.h>
#include <linux/of_device.h>
#include <linux/platform_device.h>
#include "pinctrl-spear3xx.h"
#define DRIVER_NAME "spear310-pinmux"
/* addresses */
#define PMX_CONFIG_REG 0x08
/* emi_cs_0_to_5_pins */
static const unsigned emi_cs_0_to_5_pins[] = { 45, 46, 47, 48, 49, 50 };
static struct spear_muxreg emi_cs_0_to_5_muxreg[] = {
{
.reg = PMX_CONFIG_REG,
.mask = PMX_TIMER_0_1_MASK | PMX_TIMER_2_3_MASK,
.val = 0,
},
};
static struct spear_modemux emi_cs_0_to_5_modemux[] = {
{
.muxregs = emi_cs_0_to_5_muxreg,
.nmuxregs = ARRAY_SIZE(emi_cs_0_to_5_muxreg),
},
};
static struct spear_pingroup emi_cs_0_to_5_pingroup = {
.name = "emi_cs_0_to_5_grp",
.pins = emi_cs_0_to_5_pins,
.npins = ARRAY_SIZE(emi_cs_0_to_5_pins),
.modemuxs = emi_cs_0_to_5_modemux,
.nmodemuxs = ARRAY_SIZE(emi_cs_0_to_5_modemux),
};
static const char *const emi_cs_0_to_5_grps[] = { "emi_cs_0_to_5_grp" };
static struct spear_function emi_cs_0_to_5_function = {
.name = "emi",
.groups = emi_cs_0_to_5_grps,
.ngroups = ARRAY_SIZE(emi_cs_0_to_5_grps),
};
/* uart1_pins */
static const unsigned uart1_pins[] = { 0, 1 };
static struct spear_muxreg uart1_muxreg[] = {
{
.reg = PMX_CONFIG_REG,
.mask = PMX_FIRDA_MASK,
.val = 0,
},
};
static struct spear_modemux uart1_modemux[] = {
{
.muxregs = uart1_muxreg,
.nmuxregs = ARRAY_SIZE(uart1_muxreg),
},
};
static struct spear_pingroup uart1_pingroup = {
.name = "uart1_grp",
.pins = uart1_pins,
.npins = ARRAY_SIZE(uart1_pins),
.modemuxs = uart1_modemux,
.nmodemuxs = ARRAY_SIZE(uart1_modemux),
};
static const char *const uart1_grps[] = { "uart1_grp" };
static struct spear_function uart1_function = {
.name = "uart1",
.groups = uart1_grps,
.ngroups = ARRAY_SIZE(uart1_grps),
};
/* uart2_pins */
static const unsigned uart2_pins[] = { 43, 44 };
static struct spear_muxreg uart2_muxreg[] = {
{
.reg = PMX_CONFIG_REG,
.mask = PMX_TIMER_0_1_MASK,
.val = 0,
},
};
static struct spear_modemux uart2_modemux[] = {
{
.muxregs = uart2_muxreg,
.nmuxregs = ARRAY_SIZE(uart2_muxreg),
},
};
static struct spear_pingroup uart2_pingroup = {
.name = "uart2_grp",
.pins = uart2_pins,
.npins = ARRAY_SIZE(uart2_pins),
.modemuxs = uart2_modemux,
.nmodemuxs = ARRAY_SIZE(uart2_modemux),
};
static const char *const uart2_grps[] = { "uart2_grp" };
static struct spear_function uart2_function = {
.name = "uart2",
.groups = uart2_grps,
.ngroups = ARRAY_SIZE(uart2_grps),
};
/* uart3_pins */
static const unsigned uart3_pins[] = { 37, 38 };
static struct spear_muxreg uart3_muxreg[] = {
{
.reg = PMX_CONFIG_REG,
.mask = PMX_UART0_MODEM_MASK,
.val = 0,
},
};
static struct spear_modemux uart3_modemux[] = {
{
.muxregs = uart3_muxreg,
.nmuxregs = ARRAY_SIZE(uart3_muxreg),
},
};
static struct spear_pingroup uart3_pingroup = {
.name = "uart3_grp",
.pins = uart3_pins,
.npins = ARRAY_SIZE(uart3_pins),
.modemuxs = uart3_modemux,
.nmodemuxs = ARRAY_SIZE(uart3_modemux),
};
static const char *const uart3_grps[] = { "uart3_grp" };
static struct spear_function uart3_function = {
.name = "uart3",
.groups = uart3_grps,
.ngroups = ARRAY_SIZE(uart3_grps),
};
/* uart4_pins */
static const unsigned uart4_pins[] = { 39, 40 };
static struct spear_muxreg uart4_muxreg[] = {
{
.reg = PMX_CONFIG_REG,
.mask = PMX_UART0_MODEM_MASK,
.val = 0,
},
};
static struct spear_modemux uart4_modemux[] = {
{
.muxregs = uart4_muxreg,
.nmuxregs = ARRAY_SIZE(uart4_muxreg),
},
};
static struct spear_pingroup uart4_pingroup = {
.name = "uart4_grp",
.pins = uart4_pins,
.npins = ARRAY_SIZE(uart4_pins),
.modemuxs = uart4_modemux,
.nmodemuxs = ARRAY_SIZE(uart4_modemux),
};
static const char *const uart4_grps[] = { "uart4_grp" };
static struct spear_function uart4_function = {
.name = "uart4",
.groups = uart4_grps,
.ngroups = ARRAY_SIZE(uart4_grps),
};
/* uart5_pins */
static const unsigned uart5_pins[] = { 41, 42 };
static struct spear_muxreg uart5_muxreg[] = {
{
.reg = PMX_CONFIG_REG,
.mask = PMX_UART0_MODEM_MASK,
.val = 0,
},
};
static struct spear_modemux uart5_modemux[] = {
{
.muxregs = uart5_muxreg,
.nmuxregs = ARRAY_SIZE(uart5_muxreg),
},
};
static struct spear_pingroup uart5_pingroup = {
.name = "uart5_grp",
.pins = uart5_pins,
.npins = ARRAY_SIZE(uart5_pins),
.modemuxs = uart5_modemux,
.nmodemuxs = ARRAY_SIZE(uart5_modemux),
};
static const char *const uart5_grps[] = { "uart5_grp" };
static struct spear_function uart5_function = {
.name = "uart5",
.groups = uart5_grps,
.ngroups = ARRAY_SIZE(uart5_grps),
};
/* fsmc_pins */
static const unsigned fsmc_pins[] = { 34, 35, 36 };
static struct spear_muxreg fsmc_muxreg[] = {
{
.reg = PMX_CONFIG_REG,
.mask = PMX_SSP_CS_MASK,
.val = 0,
},
};
static struct spear_modemux fsmc_modemux[] = {
{
.muxregs = fsmc_muxreg,
.nmuxregs = ARRAY_SIZE(fsmc_muxreg),
},
};
static struct spear_pingroup fsmc_pingroup = {
.name = "fsmc_grp",
.pins = fsmc_pins,
.npins = ARRAY_SIZE(fsmc_pins),
.modemuxs = fsmc_modemux,
.nmodemuxs = ARRAY_SIZE(fsmc_modemux),
};
static const char *const fsmc_grps[] = { "fsmc_grp" };
static struct spear_function fsmc_function = {
.name = "fsmc",
.groups = fsmc_grps,
.ngroups = ARRAY_SIZE(fsmc_grps),
};
/* rs485_0_pins */
static const unsigned rs485_0_pins[] = { 19, 20, 21, 22, 23 };
static struct spear_muxreg rs485_0_muxreg[] = {
{
.reg = PMX_CONFIG_REG,
.mask = PMX_MII_MASK,
.val = 0,
},
};
static struct spear_modemux rs485_0_modemux[] = {
{
.muxregs = rs485_0_muxreg,
.nmuxregs = ARRAY_SIZE(rs485_0_muxreg),
},
};
static struct spear_pingroup rs485_0_pingroup = {
.name = "rs485_0_grp",
.pins = rs485_0_pins,
.npins = ARRAY_SIZE(rs485_0_pins),
.modemuxs = rs485_0_modemux,
.nmodemuxs = ARRAY_SIZE(rs485_0_modemux),
};
static const char *const rs485_0_grps[] = { "rs485_0" };
static struct spear_function rs485_0_function = {
.name = "rs485_0",
.groups = rs485_0_grps,
.ngroups = ARRAY_SIZE(rs485_0_grps),
};
/* rs485_1_pins */
static const unsigned rs485_1_pins[] = { 14, 15, 16, 17, 18 };
static struct spear_muxreg rs485_1_muxreg[] = {
{
.reg = PMX_CONFIG_REG,
.mask = PMX_MII_MASK,
.val = 0,
},
};
static struct spear_modemux rs485_1_modemux[] = {
{
.muxregs = rs485_1_muxreg,
.nmuxregs = ARRAY_SIZE(rs485_1_muxreg),
},
};
static struct spear_pingroup rs485_1_pingroup = {
.name = "rs485_1_grp",
.pins = rs485_1_pins,
.npins = ARRAY_SIZE(rs485_1_pins),
.modemuxs = rs485_1_modemux,
.nmodemuxs = ARRAY_SIZE(rs485_1_modemux),
};
static const char *const rs485_1_grps[] = { "rs485_1" };
static struct spear_function rs485_1_function = {
.name = "rs485_1",
.groups = rs485_1_grps,
.ngroups = ARRAY_SIZE(rs485_1_grps),
};
/* tdm_pins */
static const unsigned tdm_pins[] = { 10, 11, 12, 13 };
static struct spear_muxreg tdm_muxreg[] = {
{
.reg = PMX_CONFIG_REG,
.mask = PMX_MII_MASK,
.val = 0,
},
};
static struct spear_modemux tdm_modemux[] = {
{
.muxregs = tdm_muxreg,
.nmuxregs = ARRAY_SIZE(tdm_muxreg),
},
};
static struct spear_pingroup tdm_pingroup = {
.name = "tdm_grp",
.pins = tdm_pins,
.npins = ARRAY_SIZE(tdm_pins),
.modemuxs = tdm_modemux,
.nmodemuxs = ARRAY_SIZE(tdm_modemux),
};
static const char *const tdm_grps[] = { "tdm_grp" };
static struct spear_function tdm_function = {
.name = "tdm",
.groups = tdm_grps,
.ngroups = ARRAY_SIZE(tdm_grps),
};
/* pingroups */
static struct spear_pingroup *spear310_pingroups[] = {
SPEAR3XX_COMMON_PINGROUPS,
&emi_cs_0_to_5_pingroup,
&uart1_pingroup,
&uart2_pingroup,
&uart3_pingroup,
&uart4_pingroup,
&uart5_pingroup,
&fsmc_pingroup,
&rs485_0_pingroup,
&rs485_1_pingroup,
&tdm_pingroup,
};
/* functions */
static struct spear_function *spear310_functions[] = {
SPEAR3XX_COMMON_FUNCTIONS,
&emi_cs_0_to_5_function,
&uart1_function,
&uart2_function,
&uart3_function,
&uart4_function,
&uart5_function,
&fsmc_function,
&rs485_0_function,
&rs485_1_function,
&tdm_function,
};
static struct of_device_id spear310_pinctrl_of_match[] __devinitdata = {
{
.compatible = "st,spear310-pinmux",
},
{},
};
static int __devinit spear310_pinctrl_probe(struct platform_device *pdev)
{
int ret;
spear3xx_machdata.groups = spear310_pingroups;
spear3xx_machdata.ngroups = ARRAY_SIZE(spear310_pingroups);
spear3xx_machdata.functions = spear310_functions;
spear3xx_machdata.nfunctions = ARRAY_SIZE(spear310_functions);
pmx_init_addr(&spear3xx_machdata, PMX_CONFIG_REG);
spear3xx_machdata.modes_supported = false;
ret = spear_pinctrl_probe(pdev, &spear3xx_machdata);
if (ret)
return ret;
return 0;
}
static int __devexit spear310_pinctrl_remove(struct platform_device *pdev)
{
return spear_pinctrl_remove(pdev);
}
static struct platform_driver spear310_pinctrl_driver = {
.driver = {
.name = DRIVER_NAME,
.owner = THIS_MODULE,
.of_match_table = spear310_pinctrl_of_match,
},
.probe = spear310_pinctrl_probe,
.remove = __devexit_p(spear310_pinctrl_remove),
};
static int __init spear310_pinctrl_init(void)
{
return platform_driver_register(&spear310_pinctrl_driver);
}
arch_initcall(spear310_pinctrl_init);
static void __exit spear310_pinctrl_exit(void)
{
platform_driver_unregister(&spear310_pinctrl_driver);
}
module_exit(spear310_pinctrl_exit);
MODULE_AUTHOR("Viresh Kumar <viresh.kumar@st.com>");
MODULE_DESCRIPTION("ST Microelectronics SPEAr310 pinctrl driver");
MODULE_LICENSE("GPL v2");
MODULE_DEVICE_TABLE(of, SPEAr310_pinctrl_of_match);
/*
* Driver for the ST Microelectronics SPEAr320 pinmux
*
* Copyright (C) 2012 ST Microelectronics
* Viresh Kumar <viresh.kumar@st.com>
*
* This file is licensed under the terms of the GNU General Public
* License version 2. This program is licensed "as is" without any
* warranty of any kind, whether express or implied.
*/
#include <linux/err.h>
#include <linux/init.h>
#include <linux/module.h>
#include <linux/of_device.h>
#include <linux/platform_device.h>
#include "pinctrl-spear3xx.h"
#define DRIVER_NAME "spear320-pinmux"
/* addresses */
#define PMX_CONFIG_REG 0x0C
#define MODE_CONFIG_REG 0x10
#define MODE_EXT_CONFIG_REG 0x18
/* modes */
#define AUTO_NET_SMII_MODE (1 << 0)
#define AUTO_NET_MII_MODE (1 << 1)
#define AUTO_EXP_MODE (1 << 2)
#define SMALL_PRINTERS_MODE (1 << 3)
#define EXTENDED_MODE (1 << 4)
static struct spear_pmx_mode pmx_mode_auto_net_smii = {
.name = "Automation Networking SMII mode",
.mode = AUTO_NET_SMII_MODE,
.reg = MODE_CONFIG_REG,
.mask = 0x00000007,
.val = 0x0,
};
static struct spear_pmx_mode pmx_mode_auto_net_mii = {
.name = "Automation Networking MII mode",
.mode = AUTO_NET_MII_MODE,
.reg = MODE_CONFIG_REG,
.mask = 0x00000007,
.val = 0x1,
};
static struct spear_pmx_mode pmx_mode_auto_exp = {
.name = "Automation Expanded mode",
.mode = AUTO_EXP_MODE,
.reg = MODE_CONFIG_REG,
.mask = 0x00000007,
.val = 0x2,
};
static struct spear_pmx_mode pmx_mode_small_printers = {
.name = "Small Printers mode",
.mode = SMALL_PRINTERS_MODE,
.reg = MODE_CONFIG_REG,
.mask = 0x00000007,
.val = 0x3,
};
static struct spear_pmx_mode pmx_mode_extended = {
.name = "extended mode",
.mode = EXTENDED_MODE,
.reg = MODE_EXT_CONFIG_REG,
.mask = 0x00000001,
.val = 0x1,
};
static struct spear_pmx_mode *spear320_pmx_modes[] = {
&pmx_mode_auto_net_smii,
&pmx_mode_auto_net_mii,
&pmx_mode_auto_exp,
&pmx_mode_small_printers,
&pmx_mode_extended,
};
/* Extended mode registers and their offsets */
#define EXT_CTRL_REG 0x0018
#define MII_MDIO_MASK (1 << 4)
#define MII_MDIO_10_11_VAL 0
#define MII_MDIO_81_VAL (1 << 4)
#define EMI_FSMC_DYNAMIC_MUX_MASK (1 << 5)
#define MAC_MODE_MII 0
#define MAC_MODE_RMII 1
#define MAC_MODE_SMII 2
#define MAC_MODE_SS_SMII 3
#define MAC_MODE_MASK 0x3
#define MAC1_MODE_SHIFT 16
#define MAC2_MODE_SHIFT 18
#define IP_SEL_PAD_0_9_REG 0x00A4
#define PMX_PL_0_1_MASK (0x3F << 0)
#define PMX_UART2_PL_0_1_VAL 0x0
#define PMX_I2C2_PL_0_1_VAL (0x4 | (0x4 << 3))
#define PMX_PL_2_3_MASK (0x3F << 6)
#define PMX_I2C2_PL_2_3_VAL 0x0
#define PMX_UART6_PL_2_3_VAL ((0x1 << 6) | (0x1 << 9))
#define PMX_UART1_ENH_PL_2_3_VAL ((0x4 << 6) | (0x4 << 9))
#define PMX_PL_4_5_MASK (0x3F << 12)
#define PMX_UART5_PL_4_5_VAL ((0x1 << 12) | (0x1 << 15))
#define PMX_UART1_ENH_PL_4_5_VAL ((0x4 << 12) | (0x4 << 15))
#define PMX_PL_5_MASK (0x7 << 15)
#define PMX_TOUCH_Y_PL_5_VAL 0x0
#define PMX_PL_6_7_MASK (0x3F << 18)
#define PMX_PL_6_MASK (0x7 << 18)
#define PMX_PL_7_MASK (0x7 << 21)
#define PMX_UART4_PL_6_7_VAL ((0x1 << 18) | (0x1 << 21))
#define PMX_PWM_3_PL_6_VAL (0x2 << 18)
#define PMX_PWM_2_PL_7_VAL (0x2 << 21)
#define PMX_UART1_ENH_PL_6_7_VAL ((0x4 << 18) | (0x4 << 21))
#define PMX_PL_8_9_MASK (0x3F << 24)
#define PMX_UART3_PL_8_9_VAL ((0x1 << 24) | (0x1 << 27))
#define PMX_PWM_0_1_PL_8_9_VAL ((0x2 << 24) | (0x2 << 27))
#define PMX_I2C1_PL_8_9_VAL ((0x4 << 24) | (0x4 << 27))
#define IP_SEL_PAD_10_19_REG 0x00A8
#define PMX_PL_10_11_MASK (0x3F << 0)
#define PMX_SMII_PL_10_11_VAL 0
#define PMX_RMII_PL_10_11_VAL ((0x4 << 0) | (0x4 << 3))
#define PMX_PL_12_MASK (0x7 << 6)
#define PMX_PWM3_PL_12_VAL 0
#define PMX_SDHCI_CD_PL_12_VAL (0x4 << 6)
#define PMX_PL_13_14_MASK (0x3F << 9)
#define PMX_PL_13_MASK (0x7 << 9)
#define PMX_PL_14_MASK (0x7 << 12)
#define PMX_SSP2_PL_13_14_15_16_VAL 0
#define PMX_UART4_PL_13_14_VAL ((0x1 << 9) | (0x1 << 12))
#define PMX_RMII_PL_13_14_VAL ((0x4 << 9) | (0x4 << 12))
#define PMX_PWM2_PL_13_VAL (0x2 << 9)
#define PMX_PWM1_PL_14_VAL (0x2 << 12)
#define PMX_PL_15_MASK (0x7 << 15)
#define PMX_PWM0_PL_15_VAL (0x2 << 15)
#define PMX_PL_15_16_MASK (0x3F << 15)
#define PMX_UART3_PL_15_16_VAL ((0x1 << 15) | (0x1 << 18))
#define PMX_RMII_PL_15_16_VAL ((0x4 << 15) | (0x4 << 18))
#define PMX_PL_17_18_MASK (0x3F << 21)
#define PMX_SSP1_PL_17_18_19_20_VAL 0
#define PMX_RMII_PL_17_18_VAL ((0x4 << 21) | (0x4 << 24))
#define PMX_PL_19_MASK (0x7 << 27)
#define PMX_I2C2_PL_19_VAL (0x1 << 27)
#define PMX_RMII_PL_19_VAL (0x4 << 27)
#define IP_SEL_PAD_20_29_REG 0x00AC
#define PMX_PL_20_MASK (0x7 << 0)
#define PMX_I2C2_PL_20_VAL (0x1 << 0)
#define PMX_RMII_PL_20_VAL (0x4 << 0)
#define PMX_PL_21_TO_27_MASK (0x1FFFFF << 3)
#define PMX_SMII_PL_21_TO_27_VAL 0
#define PMX_RMII_PL_21_TO_27_VAL ((0x4 << 3) | (0x4 << 6) | (0x4 << 9) | (0x4 << 12) | (0x4 << 15) | (0x4 << 18) | (0x4 << 21))
#define PMX_PL_28_29_MASK (0x3F << 24)
#define PMX_PL_28_MASK (0x7 << 24)
#define PMX_PL_29_MASK (0x7 << 27)
#define PMX_UART1_PL_28_29_VAL 0
#define PMX_PWM_3_PL_28_VAL (0x4 << 24)
#define PMX_PWM_2_PL_29_VAL (0x4 << 27)
#define IP_SEL_PAD_30_39_REG 0x00B0
#define PMX_PL_30_31_MASK (0x3F << 0)
#define PMX_CAN1_PL_30_31_VAL (0)
#define PMX_PL_30_MASK (0x7 << 0)
#define PMX_PL_31_MASK (0x7 << 3)
#define PMX_PWM1_EXT_PL_30_VAL (0x4 << 0)
#define PMX_PWM0_EXT_PL_31_VAL (0x4 << 3)
#define PMX_UART1_ENH_PL_31_VAL (0x3 << 3)
#define PMX_PL_32_33_MASK (0x3F << 6)
#define PMX_CAN0_PL_32_33_VAL 0
#define PMX_UART1_ENH_PL_32_33_VAL ((0x3 << 6) | (0x3 << 9))
#define PMX_SSP2_PL_32_33_VAL ((0x4 << 6) | (0x4 << 9))
#define PMX_PL_34_MASK (0x7 << 12)
#define PMX_PWM2_PL_34_VAL 0
#define PMX_UART1_ENH_PL_34_VAL (0x2 << 12)
#define PMX_SSP2_PL_34_VAL (0x4 << 12)
#define PMX_PL_35_MASK (0x7 << 15)
#define PMX_I2S_REF_CLK_PL_35_VAL 0
#define PMX_UART1_ENH_PL_35_VAL (0x2 << 15)
#define PMX_SSP2_PL_35_VAL (0x4 << 15)
#define PMX_PL_36_MASK (0x7 << 18)
#define PMX_TOUCH_X_PL_36_VAL 0
#define PMX_UART1_ENH_PL_36_VAL (0x2 << 18)
#define PMX_SSP1_PL_36_VAL (0x4 << 18)
#define PMX_PL_37_38_MASK (0x3F << 21)
#define PMX_PWM0_1_PL_37_38_VAL 0
#define PMX_UART5_PL_37_38_VAL ((0x2 << 21) | (0x2 << 24))
#define PMX_SSP1_PL_37_38_VAL ((0x4 << 21) | (0x4 << 24))
#define PMX_PL_39_MASK (0x7 << 27)
#define PMX_I2S_PL_39_VAL 0
#define PMX_UART4_PL_39_VAL (0x2 << 27)
#define PMX_SSP1_PL_39_VAL (0x4 << 27)
#define IP_SEL_PAD_40_49_REG 0x00B4
#define PMX_PL_40_MASK (0x7 << 0)
#define PMX_I2S_PL_40_VAL 0
#define PMX_UART4_PL_40_VAL (0x2 << 0)
#define PMX_PWM3_PL_40_VAL (0x4 << 0)
#define PMX_PL_41_42_MASK (0x3F << 3)
#define PMX_PL_41_MASK (0x7 << 3)
#define PMX_PL_42_MASK (0x7 << 6)
#define PMX_I2S_PL_41_42_VAL 0
#define PMX_UART3_PL_41_42_VAL ((0x2 << 3) | (0x2 << 6))
#define PMX_PWM2_PL_41_VAL (0x4 << 3)
#define PMX_PWM1_PL_42_VAL (0x4 << 6)
#define PMX_PL_43_MASK (0x7 << 9)
#define PMX_SDHCI_PL_43_VAL 0
#define PMX_UART1_ENH_PL_43_VAL (0x2 << 9)
#define PMX_PWM0_PL_43_VAL (0x4 << 9)
#define PMX_PL_44_45_MASK (0x3F << 12)
#define PMX_SDHCI_PL_44_45_VAL 0
#define PMX_UART1_ENH_PL_44_45_VAL ((0x2 << 12) | (0x2 << 15))
#define PMX_SSP2_PL_44_45_VAL ((0x4 << 12) | (0x4 << 15))
#define PMX_PL_46_47_MASK (0x3F << 18)
#define PMX_SDHCI_PL_46_47_VAL 0
#define PMX_FSMC_EMI_PL_46_47_VAL ((0x2 << 18) | (0x2 << 21))
#define PMX_SSP2_PL_46_47_VAL ((0x4 << 18) | (0x4 << 21))
#define PMX_PL_48_49_MASK (0x3F << 24)
#define PMX_SDHCI_PL_48_49_VAL 0
#define PMX_FSMC_EMI_PL_48_49_VAL ((0x2 << 24) | (0x2 << 27))
#define PMX_SSP1_PL_48_49_VAL ((0x4 << 24) | (0x4 << 27))
#define IP_SEL_PAD_50_59_REG 0x00B8
#define PMX_PL_50_51_MASK (0x3F << 0)
#define PMX_EMI_PL_50_51_VAL ((0x2 << 0) | (0x2 << 3))
#define PMX_SSP1_PL_50_51_VAL ((0x4 << 0) | (0x4 << 3))
#define PMX_PL_50_MASK (0x7 << 0)
#define PMX_PL_51_MASK (0x7 << 3)
#define PMX_SDHCI_PL_50_VAL 0
#define PMX_SDHCI_CD_PL_51_VAL 0
#define PMX_PL_52_53_MASK (0x3F << 6)
#define PMX_FSMC_PL_52_53_VAL 0
#define PMX_EMI_PL_52_53_VAL ((0x2 << 6) | (0x2 << 9))
#define PMX_UART3_PL_52_53_VAL ((0x4 << 6) | (0x4 << 9))
#define PMX_PL_54_55_56_MASK (0x1FF << 12)
#define PMX_FSMC_EMI_PL_54_55_56_VAL ((0x2 << 12) | (0x2 << 15) | (0x2 << 18))
#define PMX_PL_57_MASK (0x7 << 21)
#define PMX_FSMC_PL_57_VAL 0
#define PMX_PWM3_PL_57_VAL (0x4 << 21)
#define PMX_PL_58_59_MASK (0x3F << 24)
#define PMX_PL_58_MASK (0x7 << 24)
#define PMX_PL_59_MASK (0x7 << 27)
#define PMX_FSMC_EMI_PL_58_59_VAL ((0x2 << 24) | (0x2 << 27))
#define PMX_PWM2_PL_58_VAL (0x4 << 24)
#define PMX_PWM1_PL_59_VAL (0x4 << 27)
#define IP_SEL_PAD_60_69_REG 0x00BC
#define PMX_PL_60_MASK (0x7 << 0)
#define PMX_FSMC_PL_60_VAL 0
#define PMX_PWM0_PL_60_VAL (0x4 << 0)
#define PMX_PL_61_TO_64_MASK (0xFFF << 3)
#define PMX_FSMC_PL_61_TO_64_VAL ((0x2 << 3) | (0x2 << 6) | (0x2 << 9) | (0x2 << 12))
#define PMX_SSP2_PL_61_TO_64_VAL ((0x4 << 3) | (0x4 << 6) | (0x4 << 9) | (0x4 << 12))
#define PMX_PL_65_TO_68_MASK (0xFFF << 15)
#define PMX_FSMC_PL_65_TO_68_VAL ((0x2 << 15) | (0x2 << 18) | (0x2 << 21) | (0x2 << 24))
#define PMX_SSP1_PL_65_TO_68_VAL ((0x4 << 15) | (0x4 << 18) | (0x4 << 21) | (0x4 << 24))
#define PMX_PL_69_MASK (0x7 << 27)
#define PMX_CLCD_PL_69_VAL (0)
#define PMX_EMI_PL_69_VAL (0x2 << 27)
#define PMX_SPP_PL_69_VAL (0x3 << 27)
#define PMX_UART5_PL_69_VAL (0x4 << 27)
#define IP_SEL_PAD_70_79_REG 0x00C0
#define PMX_PL_70_MASK (0x7 << 0)
#define PMX_CLCD_PL_70_VAL (0)
#define PMX_FSMC_EMI_PL_70_VAL (0x2 << 0)
#define PMX_SPP_PL_70_VAL (0x3 << 0)
#define PMX_UART5_PL_70_VAL (0x4 << 0)
#define PMX_PL_71_72_MASK (0x3F << 3)
#define PMX_CLCD_PL_71_72_VAL (0)
#define PMX_FSMC_EMI_PL_71_72_VAL ((0x2 << 3) | (0x2 << 6))
#define PMX_SPP_PL_71_72_VAL ((0x3 << 3) | (0x3 << 6))
#define PMX_UART4_PL_71_72_VAL ((0x4 << 3) | (0x4 << 6))
#define PMX_PL_73_MASK (0x7 << 9)
#define PMX_CLCD_PL_73_VAL (0)
#define PMX_FSMC_EMI_PL_73_VAL (0x2 << 9)
#define PMX_SPP_PL_73_VAL (0x3 << 9)
#define PMX_UART3_PL_73_VAL (0x4 << 9)
#define PMX_PL_74_MASK (0x7 << 12)
#define PMX_CLCD_PL_74_VAL (0)
#define PMX_EMI_PL_74_VAL (0x2 << 12)
#define PMX_SPP_PL_74_VAL (0x3 << 12)
#define PMX_UART3_PL_74_VAL (0x4 << 12)
#define PMX_PL_75_76_MASK (0x3F << 15)
#define PMX_CLCD_PL_75_76_VAL (0)
#define PMX_EMI_PL_75_76_VAL ((0x2 << 15) | (0x2 << 18))
#define PMX_SPP_PL_75_76_VAL ((0x3 << 15) | (0x3 << 18))
#define PMX_I2C2_PL_75_76_VAL ((0x4 << 15) | (0x4 << 18))
#define PMX_PL_77_78_79_MASK (0x1FF << 21)
#define PMX_CLCD_PL_77_78_79_VAL (0)
#define PMX_EMI_PL_77_78_79_VAL ((0x2 << 21) | (0x2 << 24) | (0x2 << 27))
#define PMX_SPP_PL_77_78_79_VAL ((0x3 << 21) | (0x3 << 24) | (0x3 << 27))
#define PMX_RS485_PL_77_78_79_VAL ((0x4 << 21) | (0x4 << 24) | (0x4 << 27))
#define IP_SEL_PAD_80_89_REG 0x00C4
#define PMX_PL_80_TO_85_MASK (0x3FFFF << 0)
#define PMX_CLCD_PL_80_TO_85_VAL 0
#define PMX_MII2_PL_80_TO_85_VAL ((0x1 << 0) | (0x1 << 3) | (0x1 << 6) | (0x1 << 9) | (0x1 << 12) | (0x1 << 15))
#define PMX_EMI_PL_80_TO_85_VAL ((0x2 << 0) | (0x2 << 3) | (0x2 << 6) | (0x2 << 9) | (0x2 << 12) | (0x2 << 15))
#define PMX_SPP_PL_80_TO_85_VAL ((0x3 << 0) | (0x3 << 3) | (0x3 << 6) | (0x3 << 9) | (0x3 << 12) | (0x3 << 15))
#define PMX_UART1_ENH_PL_80_TO_85_VAL ((0x4 << 0) | (0x4 << 3) | (0x4 << 6) | (0x4 << 9) | (0x4 << 12) | (0x4 << 15))
#define PMX_PL_86_87_MASK (0x3F << 18)
#define PMX_PL_86_MASK (0x7 << 18)
#define PMX_PL_87_MASK (0x7 << 21)
#define PMX_CLCD_PL_86_87_VAL 0
#define PMX_MII2_PL_86_87_VAL ((0x1 << 18) | (0x1 << 21))
#define PMX_EMI_PL_86_87_VAL ((0x2 << 18) | (0x2 << 21))
#define PMX_PWM3_PL_86_VAL (0x4 << 18)
#define PMX_PWM2_PL_87_VAL (0x4 << 21)
#define PMX_PL_88_89_MASK (0x3F << 24)
#define PMX_CLCD_PL_88_89_VAL 0
#define PMX_MII2_PL_88_89_VAL ((0x1 << 24) | (0x1 << 27))
#define PMX_EMI_PL_88_89_VAL ((0x2 << 24) | (0x2 << 27))
#define PMX_UART6_PL_88_89_VAL ((0x3 << 24) | (0x3 << 27))
#define PMX_PWM0_1_PL_88_89_VAL ((0x4 << 24) | (0x4 << 27))
#define IP_SEL_PAD_90_99_REG 0x00C8
#define PMX_PL_90_91_MASK (0x3F << 0)
#define PMX_CLCD_PL_90_91_VAL 0
#define PMX_MII2_PL_90_91_VAL ((0x1 << 0) | (0x1 << 3))
#define PMX_EMI1_PL_90_91_VAL ((0x2 << 0) | (0x2 << 3))
#define PMX_UART5_PL_90_91_VAL ((0x3 << 0) | (0x3 << 3))
#define PMX_SSP2_PL_90_91_VAL ((0x4 << 0) | (0x4 << 3))
#define PMX_PL_92_93_MASK (0x3F << 6)
#define PMX_CLCD_PL_92_93_VAL 0
#define PMX_MII2_PL_92_93_VAL ((0x1 << 6) | (0x1 << 9))
#define PMX_EMI1_PL_92_93_VAL ((0x2 << 6) | (0x2 << 9))
#define PMX_UART4_PL_92_93_VAL ((0x3 << 6) | (0x3 << 9))
#define PMX_SSP2_PL_92_93_VAL ((0x4 << 6) | (0x4 << 9))
#define PMX_PL_94_95_MASK (0x3F << 12)
#define PMX_CLCD_PL_94_95_VAL 0
#define PMX_MII2_PL_94_95_VAL ((0x1 << 12) | (0x1 << 15))
#define PMX_EMI1_PL_94_95_VAL ((0x2 << 12) | (0x2 << 15))
#define PMX_UART3_PL_94_95_VAL ((0x3 << 12) | (0x3 << 15))
#define PMX_SSP1_PL_94_95_VAL ((0x4 << 12) | (0x4 << 15))
#define PMX_PL_96_97_MASK (0x3F << 18)
#define PMX_CLCD_PL_96_97_VAL 0
#define PMX_MII2_PL_96_97_VAL ((0x1 << 18) | (0x1 << 21))
#define PMX_EMI1_PL_96_97_VAL ((0x2 << 18) | (0x2 << 21))
#define PMX_I2C2_PL_96_97_VAL ((0x3 << 18) | (0x3 << 21))
#define PMX_SSP1_PL_96_97_VAL ((0x4 << 18) | (0x4 << 21))
#define PMX_PL_98_MASK (0x7 << 24)
#define PMX_CLCD_PL_98_VAL 0
#define PMX_I2C1_PL_98_VAL (0x2 << 24)
#define PMX_UART3_PL_98_VAL (0x4 << 24)
#define PMX_PL_99_MASK (0x7 << 27)
#define PMX_SDHCI_PL_99_VAL 0
#define PMX_I2C1_PL_99_VAL (0x2 << 27)
#define PMX_UART3_PL_99_VAL (0x4 << 27)
#define IP_SEL_MIX_PAD_REG 0x00CC
#define PMX_PL_100_101_MASK (0x3F << 0)
#define PMX_SDHCI_PL_100_101_VAL 0
#define PMX_UART4_PL_100_101_VAL ((0x4 << 0) | (0x4 << 3))
#define PMX_SSP1_PORT_SEL_MASK (0x7 << 8)
#define PMX_SSP1_PORT_94_TO_97_VAL 0
#define PMX_SSP1_PORT_65_TO_68_VAL (0x1 << 8)
#define PMX_SSP1_PORT_48_TO_51_VAL (0x2 << 8)
#define PMX_SSP1_PORT_36_TO_39_VAL (0x3 << 8)
#define PMX_SSP1_PORT_17_TO_20_VAL (0x4 << 8)
#define PMX_SSP2_PORT_SEL_MASK (0x7 << 11)
#define PMX_SSP2_PORT_90_TO_93_VAL 0
#define PMX_SSP2_PORT_61_TO_64_VAL (0x1 << 11)
#define PMX_SSP2_PORT_44_TO_47_VAL (0x2 << 11)
#define PMX_SSP2_PORT_32_TO_35_VAL (0x3 << 11)
#define PMX_SSP2_PORT_13_TO_16_VAL (0x4 << 11)
#define PMX_UART1_ENH_PORT_SEL_MASK (0x3 << 14)
#define PMX_UART1_ENH_PORT_81_TO_85_VAL 0
#define PMX_UART1_ENH_PORT_44_45_34_36_VAL (0x1 << 14)
#define PMX_UART1_ENH_PORT_32_TO_34_36_VAL (0x2 << 14)
#define PMX_UART1_ENH_PORT_3_TO_5_7_VAL (0x3 << 14)
#define PMX_UART3_PORT_SEL_MASK (0x7 << 16)
#define PMX_UART3_PORT_94_VAL 0
#define PMX_UART3_PORT_73_VAL (0x1 << 16)
#define PMX_UART3_PORT_52_VAL (0x2 << 16)
#define PMX_UART3_PORT_41_VAL (0x3 << 16)
#define PMX_UART3_PORT_15_VAL (0x4 << 16)
#define PMX_UART3_PORT_8_VAL (0x5 << 16)
#define PMX_UART3_PORT_99_VAL (0x6 << 16)
#define PMX_UART4_PORT_SEL_MASK (0x7 << 19)
#define PMX_UART4_PORT_92_VAL 0
#define PMX_UART4_PORT_71_VAL (0x1 << 19)
#define PMX_UART4_PORT_39_VAL (0x2 << 19)
#define PMX_UART4_PORT_13_VAL (0x3 << 19)
#define PMX_UART4_PORT_6_VAL (0x4 << 19)
#define PMX_UART4_PORT_101_VAL (0x5 << 19)
#define PMX_UART5_PORT_SEL_MASK (0x3 << 22)
#define PMX_UART5_PORT_90_VAL 0
#define PMX_UART5_PORT_69_VAL (0x1 << 22)
#define PMX_UART5_PORT_37_VAL (0x2 << 22)
#define PMX_UART5_PORT_4_VAL (0x3 << 22)
#define PMX_UART6_PORT_SEL_MASK (0x1 << 24)
#define PMX_UART6_PORT_88_VAL 0
#define PMX_UART6_PORT_2_VAL (0x1 << 24)
#define PMX_I2C1_PORT_SEL_MASK (0x1 << 25)
#define PMX_I2C1_PORT_8_9_VAL 0
#define PMX_I2C1_PORT_98_99_VAL (0x1 << 25)
#define PMX_I2C2_PORT_SEL_MASK (0x3 << 26)
#define PMX_I2C2_PORT_96_97_VAL 0
#define PMX_I2C2_PORT_75_76_VAL (0x1 << 26)
#define PMX_I2C2_PORT_19_20_VAL (0x2 << 26)
#define PMX_I2C2_PORT_2_3_VAL (0x3 << 26)
#define PMX_I2C2_PORT_0_1_VAL (0x4 << 26)
#define PMX_SDHCI_CD_PORT_SEL_MASK (0x1 << 29)
#define PMX_SDHCI_CD_PORT_12_VAL 0
#define PMX_SDHCI_CD_PORT_51_VAL (0x1 << 29)
/* Pad multiplexing for CLCD device */
static const unsigned clcd_pins[] = { 69, 70, 71, 72, 73, 74, 75, 76, 77, 78,
79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96,
97 };
static struct spear_muxreg clcd_muxreg[] = {
{
.reg = IP_SEL_PAD_60_69_REG,
.mask = PMX_PL_69_MASK,
.val = PMX_CLCD_PL_69_VAL,
}, {
.reg = IP_SEL_PAD_70_79_REG,
.mask = PMX_PL_70_MASK | PMX_PL_71_72_MASK | PMX_PL_73_MASK |
PMX_PL_74_MASK | PMX_PL_75_76_MASK |
PMX_PL_77_78_79_MASK,
.val = PMX_CLCD_PL_70_VAL | PMX_CLCD_PL_71_72_VAL |
PMX_CLCD_PL_73_VAL | PMX_CLCD_PL_74_VAL |
PMX_CLCD_PL_75_76_VAL | PMX_CLCD_PL_77_78_79_VAL,
}, {
.reg = IP_SEL_PAD_80_89_REG,
.mask = PMX_PL_80_TO_85_MASK | PMX_PL_86_87_MASK |
PMX_PL_88_89_MASK,
.val = PMX_CLCD_PL_80_TO_85_VAL | PMX_CLCD_PL_86_87_VAL |
PMX_CLCD_PL_88_89_VAL,
}, {
.reg = IP_SEL_PAD_90_99_REG,
.mask = PMX_PL_90_91_MASK | PMX_PL_92_93_MASK |
PMX_PL_94_95_MASK | PMX_PL_96_97_MASK | PMX_PL_98_MASK,
.val = PMX_CLCD_PL_90_91_VAL | PMX_CLCD_PL_92_93_VAL |
PMX_CLCD_PL_94_95_VAL | PMX_CLCD_PL_96_97_VAL |
PMX_CLCD_PL_98_VAL,
},
};
static struct spear_modemux clcd_modemux[] = {
{
.modes = EXTENDED_MODE,
.muxregs = clcd_muxreg,
.nmuxregs = ARRAY_SIZE(clcd_muxreg),
},
};
static struct spear_pingroup clcd_pingroup = {
.name = "clcd_grp",
.pins = clcd_pins,
.npins = ARRAY_SIZE(clcd_pins),
.modemuxs = clcd_modemux,
.nmodemuxs = ARRAY_SIZE(clcd_modemux),
};
static const char *const clcd_grps[] = { "clcd_grp" };
static struct spear_function clcd_function = {
.name = "clcd",
.groups = clcd_grps,
.ngroups = ARRAY_SIZE(clcd_grps),
};
/* Pad multiplexing for EMI (Parallel NOR flash) device */
static const unsigned emi_pins[] = { 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56,
57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74,
75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92,
93, 94, 95, 96, 97 };
static struct spear_muxreg emi_muxreg[] = {
{
.reg = PMX_CONFIG_REG,
.mask = PMX_TIMER_0_1_MASK | PMX_TIMER_2_3_MASK,
.val = 0,
},
};
static struct spear_muxreg emi_ext_muxreg[] = {
{
.reg = IP_SEL_PAD_40_49_REG,
.mask = PMX_PL_46_47_MASK | PMX_PL_48_49_MASK,
.val = PMX_FSMC_EMI_PL_46_47_VAL | PMX_FSMC_EMI_PL_48_49_VAL,
}, {
.reg = IP_SEL_PAD_50_59_REG,
.mask = PMX_PL_50_51_MASK | PMX_PL_52_53_MASK |
PMX_PL_54_55_56_MASK | PMX_PL_58_59_MASK,
.val = PMX_EMI_PL_50_51_VAL | PMX_EMI_PL_52_53_VAL |
PMX_FSMC_EMI_PL_54_55_56_VAL |
PMX_FSMC_EMI_PL_58_59_VAL,
}, {
.reg = IP_SEL_PAD_60_69_REG,
.mask = PMX_PL_69_MASK,
.val = PMX_EMI_PL_69_VAL,
}, {
.reg = IP_SEL_PAD_70_79_REG,
.mask = PMX_PL_70_MASK | PMX_PL_71_72_MASK | PMX_PL_73_MASK |
PMX_PL_74_MASK | PMX_PL_75_76_MASK |
PMX_PL_77_78_79_MASK,
.val = PMX_FSMC_EMI_PL_70_VAL | PMX_FSMC_EMI_PL_71_72_VAL |
PMX_FSMC_EMI_PL_73_VAL | PMX_EMI_PL_74_VAL |
PMX_EMI_PL_75_76_VAL | PMX_EMI_PL_77_78_79_VAL,
}, {
.reg = IP_SEL_PAD_80_89_REG,
.mask = PMX_PL_80_TO_85_MASK | PMX_PL_86_87_MASK |
PMX_PL_88_89_MASK,
.val = PMX_EMI_PL_80_TO_85_VAL | PMX_EMI_PL_86_87_VAL |
PMX_EMI_PL_88_89_VAL,
}, {
.reg = IP_SEL_PAD_90_99_REG,
.mask = PMX_PL_90_91_MASK | PMX_PL_92_93_MASK |
PMX_PL_94_95_MASK | PMX_PL_96_97_MASK,
.val = PMX_EMI1_PL_90_91_VAL | PMX_EMI1_PL_92_93_VAL |
PMX_EMI1_PL_94_95_VAL | PMX_EMI1_PL_96_97_VAL,
}, {
.reg = EXT_CTRL_REG,
.mask = EMI_FSMC_DYNAMIC_MUX_MASK,
.val = EMI_FSMC_DYNAMIC_MUX_MASK,
},
};
static struct spear_modemux emi_modemux[] = {
{
.modes = AUTO_EXP_MODE | EXTENDED_MODE,
.muxregs = emi_muxreg,
.nmuxregs = ARRAY_SIZE(emi_muxreg),
}, {
.modes = EXTENDED_MODE,
.muxregs = emi_ext_muxreg,
.nmuxregs = ARRAY_SIZE(emi_ext_muxreg),
},
};
static struct spear_pingroup emi_pingroup = {
.name = "emi_grp",
.pins = emi_pins,
.npins = ARRAY_SIZE(emi_pins),
.modemuxs = emi_modemux,
.nmodemuxs = ARRAY_SIZE(emi_modemux),
};
static const char *const emi_grps[] = { "emi_grp" };
static struct spear_function emi_function = {
.name = "emi",
.groups = emi_grps,
.ngroups = ARRAY_SIZE(emi_grps),
};
/* Pad multiplexing for FSMC (NAND flash) device */
static const unsigned fsmc_8bit_pins[] = { 52, 53, 54, 55, 56, 57, 58, 59, 60,
61, 62, 63, 64, 65, 66, 67, 68 };
static struct spear_muxreg fsmc_8bit_muxreg[] = {
{
.reg = IP_SEL_PAD_50_59_REG,
.mask = PMX_PL_52_53_MASK | PMX_PL_54_55_56_MASK |
PMX_PL_57_MASK | PMX_PL_58_59_MASK,
.val = PMX_FSMC_PL_52_53_VAL | PMX_FSMC_EMI_PL_54_55_56_VAL |
PMX_FSMC_PL_57_VAL | PMX_FSMC_EMI_PL_58_59_VAL,
}, {
.reg = IP_SEL_PAD_60_69_REG,
.mask = PMX_PL_60_MASK | PMX_PL_61_TO_64_MASK |
PMX_PL_65_TO_68_MASK,
.val = PMX_FSMC_PL_60_VAL | PMX_FSMC_PL_61_TO_64_VAL |
PMX_FSMC_PL_65_TO_68_VAL,
}, {
.reg = EXT_CTRL_REG,
.mask = EMI_FSMC_DYNAMIC_MUX_MASK,
.val = EMI_FSMC_DYNAMIC_MUX_MASK,
},
};
static struct spear_modemux fsmc_8bit_modemux[] = {
{
.modes = EXTENDED_MODE,
.muxregs = fsmc_8bit_muxreg,
.nmuxregs = ARRAY_SIZE(fsmc_8bit_muxreg),
},
};
static struct spear_pingroup fsmc_8bit_pingroup = {
.name = "fsmc_8bit_grp",
.pins = fsmc_8bit_pins,
.npins = ARRAY_SIZE(fsmc_8bit_pins),
.modemuxs = fsmc_8bit_modemux,
.nmodemuxs = ARRAY_SIZE(fsmc_8bit_modemux),
};
static const unsigned fsmc_16bit_pins[] = { 46, 47, 48, 49, 52, 53, 54, 55, 56,
57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 70, 71, 72, 73 };
static struct spear_muxreg fsmc_16bit_autoexp_muxreg[] = {
{
.reg = PMX_CONFIG_REG,
.mask = PMX_TIMER_0_1_MASK | PMX_TIMER_2_3_MASK,
.val = 0,
},
};
static struct spear_muxreg fsmc_16bit_muxreg[] = {
{
.reg = IP_SEL_PAD_40_49_REG,
.mask = PMX_PL_46_47_MASK | PMX_PL_48_49_MASK,
.val = PMX_FSMC_EMI_PL_46_47_VAL | PMX_FSMC_EMI_PL_48_49_VAL,
}, {
.reg = IP_SEL_PAD_70_79_REG,
.mask = PMX_PL_70_MASK | PMX_PL_71_72_MASK | PMX_PL_73_MASK,
.val = PMX_FSMC_EMI_PL_70_VAL | PMX_FSMC_EMI_PL_71_72_VAL |
PMX_FSMC_EMI_PL_73_VAL,
}
};
static struct spear_modemux fsmc_16bit_modemux[] = {
{
.modes = EXTENDED_MODE,
.muxregs = fsmc_8bit_muxreg,
.nmuxregs = ARRAY_SIZE(fsmc_8bit_muxreg),
}, {
.modes = AUTO_EXP_MODE | EXTENDED_MODE,
.muxregs = fsmc_16bit_autoexp_muxreg,
.nmuxregs = ARRAY_SIZE(fsmc_16bit_autoexp_muxreg),
}, {
.modes = EXTENDED_MODE,
.muxregs = fsmc_16bit_muxreg,
.nmuxregs = ARRAY_SIZE(fsmc_16bit_muxreg),
},
};
static struct spear_pingroup fsmc_16bit_pingroup = {
.name = "fsmc_16bit_grp",
.pins = fsmc_16bit_pins,
.npins = ARRAY_SIZE(fsmc_16bit_pins),
.modemuxs = fsmc_16bit_modemux,
.nmodemuxs = ARRAY_SIZE(fsmc_16bit_modemux),
};
static const char *const fsmc_grps[] = { "fsmc_8bit_grp", "fsmc_16bit_grp" };
static struct spear_function fsmc_function = {
.name = "fsmc",
.groups = fsmc_grps,
.ngroups = ARRAY_SIZE(fsmc_grps),
};
/* Pad multiplexing for SPP device */
static const unsigned spp_pins[] = { 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
80, 81, 82, 83, 84, 85 };
static struct spear_muxreg spp_muxreg[] = {
{
.reg = IP_SEL_PAD_60_69_REG,
.mask = PMX_PL_69_MASK,
.val = PMX_SPP_PL_69_VAL,
}, {
.reg = IP_SEL_PAD_70_79_REG,
.mask = PMX_PL_70_MASK | PMX_PL_71_72_MASK | PMX_PL_73_MASK |
PMX_PL_74_MASK | PMX_PL_75_76_MASK |
PMX_PL_77_78_79_MASK,
.val = PMX_SPP_PL_70_VAL | PMX_SPP_PL_71_72_VAL |
PMX_SPP_PL_73_VAL | PMX_SPP_PL_74_VAL |
PMX_SPP_PL_75_76_VAL | PMX_SPP_PL_77_78_79_VAL,
}, {
.reg = IP_SEL_PAD_80_89_REG,
.mask = PMX_PL_80_TO_85_MASK,
.val = PMX_SPP_PL_80_TO_85_VAL,
},
};
static struct spear_modemux spp_modemux[] = {
{
.modes = EXTENDED_MODE,
.muxregs = spp_muxreg,
.nmuxregs = ARRAY_SIZE(spp_muxreg),
},
};
static struct spear_pingroup spp_pingroup = {
.name = "spp_grp",
.pins = spp_pins,
.npins = ARRAY_SIZE(spp_pins),
.modemuxs = spp_modemux,
.nmodemuxs = ARRAY_SIZE(spp_modemux),
};
static const char *const spp_grps[] = { "spp_grp" };
static struct spear_function spp_function = {
.name = "spp",
.groups = spp_grps,
.ngroups = ARRAY_SIZE(spp_grps),
};
/* Pad multiplexing for SDHCI device */
static const unsigned sdhci_led_pins[] = { 34 };
static struct spear_muxreg sdhci_led_muxreg[] = {
{
.reg = PMX_CONFIG_REG,
.mask = PMX_SSP_CS_MASK,
.val = 0,
},
};
static struct spear_muxreg sdhci_led_ext_muxreg[] = {
{
.reg = IP_SEL_PAD_30_39_REG,
.mask = PMX_PL_34_MASK,
.val = PMX_PWM2_PL_34_VAL,
},
};
static struct spear_modemux sdhci_led_modemux[] = {
{
.modes = AUTO_NET_SMII_MODE | AUTO_NET_MII_MODE | EXTENDED_MODE,
.muxregs = sdhci_led_muxreg,
.nmuxregs = ARRAY_SIZE(sdhci_led_muxreg),
}, {
.modes = EXTENDED_MODE,
.muxregs = sdhci_led_ext_muxreg,
.nmuxregs = ARRAY_SIZE(sdhci_led_ext_muxreg),
},
};
static struct spear_pingroup sdhci_led_pingroup = {
.name = "sdhci_led_grp",
.pins = sdhci_led_pins,
.npins = ARRAY_SIZE(sdhci_led_pins),
.modemuxs = sdhci_led_modemux,
.nmodemuxs = ARRAY_SIZE(sdhci_led_modemux),
};
static const unsigned sdhci_cd_12_pins[] = { 12, 43, 44, 45, 46, 47, 48, 49,
50};
static const unsigned sdhci_cd_51_pins[] = { 43, 44, 45, 46, 47, 48, 49, 50, 51
};
static struct spear_muxreg sdhci_muxreg[] = {
{
.reg = PMX_CONFIG_REG,
.mask = PMX_TIMER_0_1_MASK | PMX_TIMER_2_3_MASK,
.val = 0,
},
};
static struct spear_muxreg sdhci_ext_muxreg[] = {
{
.reg = IP_SEL_PAD_40_49_REG,
.mask = PMX_PL_43_MASK | PMX_PL_44_45_MASK | PMX_PL_46_47_MASK |
PMX_PL_48_49_MASK,
.val = PMX_SDHCI_PL_43_VAL | PMX_SDHCI_PL_44_45_VAL |
PMX_SDHCI_PL_46_47_VAL | PMX_SDHCI_PL_48_49_VAL,
}, {
.reg = IP_SEL_PAD_50_59_REG,
.mask = PMX_PL_50_MASK,
.val = PMX_SDHCI_PL_50_VAL,
}, {
.reg = IP_SEL_PAD_90_99_REG,
.mask = PMX_PL_99_MASK,
.val = PMX_SDHCI_PL_99_VAL,
}, {
.reg = IP_SEL_MIX_PAD_REG,
.mask = PMX_PL_100_101_MASK,
.val = PMX_SDHCI_PL_100_101_VAL,
},
};
static struct spear_muxreg sdhci_cd_12_muxreg[] = {
{
.reg = PMX_CONFIG_REG,
.mask = PMX_MII_MASK,
.val = 0,
}, {
.reg = IP_SEL_PAD_10_19_REG,
.mask = PMX_PL_12_MASK,
.val = PMX_SDHCI_CD_PL_12_VAL,
}, {
.reg = IP_SEL_MIX_PAD_REG,
.mask = PMX_SDHCI_CD_PORT_SEL_MASK,
.val = PMX_SDHCI_CD_PORT_12_VAL,
},
};
static struct spear_muxreg sdhci_cd_51_muxreg[] = {
{
.reg = IP_SEL_PAD_50_59_REG,
.mask = PMX_PL_51_MASK,
.val = PMX_SDHCI_CD_PL_51_VAL,
}, {
.reg = IP_SEL_MIX_PAD_REG,
.mask = PMX_SDHCI_CD_PORT_SEL_MASK,
.val = PMX_SDHCI_CD_PORT_51_VAL,
},
};
#define pmx_sdhci_common_modemux \
{ \
.modes = AUTO_NET_SMII_MODE | AUTO_NET_MII_MODE | \
SMALL_PRINTERS_MODE | EXTENDED_MODE, \
.muxregs = sdhci_muxreg, \
.nmuxregs = ARRAY_SIZE(sdhci_muxreg), \
}, { \
.modes = EXTENDED_MODE, \
.muxregs = sdhci_ext_muxreg, \
.nmuxregs = ARRAY_SIZE(sdhci_ext_muxreg), \
}
static struct spear_modemux sdhci_modemux[][3] = {
{
/* select pin 12 for cd */
pmx_sdhci_common_modemux,
{
.modes = EXTENDED_MODE,
.muxregs = sdhci_cd_12_muxreg,
.nmuxregs = ARRAY_SIZE(sdhci_cd_12_muxreg),
},
}, {
/* select pin 51 for cd */
pmx_sdhci_common_modemux,
{
.modes = EXTENDED_MODE,
.muxregs = sdhci_cd_51_muxreg,
.nmuxregs = ARRAY_SIZE(sdhci_cd_51_muxreg),
},
}
};
static struct spear_pingroup sdhci_pingroup[] = {
{
.name = "sdhci_cd_12_grp",
.pins = sdhci_cd_12_pins,
.npins = ARRAY_SIZE(sdhci_cd_12_pins),
.modemuxs = sdhci_modemux[0],
.nmodemuxs = ARRAY_SIZE(sdhci_modemux[0]),
}, {
.name = "sdhci_cd_51_grp",
.pins = sdhci_cd_51_pins,
.npins = ARRAY_SIZE(sdhci_cd_51_pins),
.modemuxs = sdhci_modemux[1],
.nmodemuxs = ARRAY_SIZE(sdhci_modemux[1]),
},
};
static const char *const sdhci_grps[] = { "sdhci_cd_12_grp", "sdhci_cd_51_grp",
"sdhci_led_grp" };
static struct spear_function sdhci_function = {
.name = "sdhci",
.groups = sdhci_grps,
.ngroups = ARRAY_SIZE(sdhci_grps),
};
/* Pad multiplexing for I2S device */
static const unsigned i2s_pins[] = { 35, 39, 40, 41, 42 };
static struct spear_muxreg i2s_muxreg[] = {
{
.reg = PMX_CONFIG_REG,
.mask = PMX_SSP_CS_MASK,
.val = 0,
}, {
.reg = PMX_CONFIG_REG,
.mask = PMX_UART0_MODEM_MASK,
.val = 0,
},
};
static struct spear_muxreg i2s_ext_muxreg[] = {
{
.reg = IP_SEL_PAD_30_39_REG,
.mask = PMX_PL_35_MASK | PMX_PL_39_MASK,
.val = PMX_I2S_REF_CLK_PL_35_VAL | PMX_I2S_PL_39_VAL,
}, {
.reg = IP_SEL_PAD_40_49_REG,
.mask = PMX_PL_40_MASK | PMX_PL_41_42_MASK,
.val = PMX_I2S_PL_40_VAL | PMX_I2S_PL_41_42_VAL,
},
};
static struct spear_modemux i2s_modemux[] = {
{
.modes = AUTO_NET_SMII_MODE | AUTO_NET_MII_MODE | EXTENDED_MODE,
.muxregs = i2s_muxreg,
.nmuxregs = ARRAY_SIZE(i2s_muxreg),
}, {
.modes = EXTENDED_MODE,
.muxregs = i2s_ext_muxreg,
.nmuxregs = ARRAY_SIZE(i2s_ext_muxreg),
},
};
static struct spear_pingroup i2s_pingroup = {
.name = "i2s_grp",
.pins = i2s_pins,
.npins = ARRAY_SIZE(i2s_pins),
.modemuxs = i2s_modemux,
.nmodemuxs = ARRAY_SIZE(i2s_modemux),
};
static const char *const i2s_grps[] = { "i2s_grp" };
static struct spear_function i2s_function = {
.name = "i2s",
.groups = i2s_grps,
.ngroups = ARRAY_SIZE(i2s_grps),
};
/* Pad multiplexing for UART1 device */
static const unsigned uart1_pins[] = { 28, 29 };
static struct spear_muxreg uart1_muxreg[] = {
{
.reg = PMX_CONFIG_REG,
.mask = PMX_GPIO_PIN0_MASK | PMX_GPIO_PIN1_MASK,
.val = 0,
},
};
static struct spear_muxreg uart1_ext_muxreg[] = {
{
.reg = IP_SEL_PAD_20_29_REG,
.mask = PMX_PL_28_29_MASK,
.val = PMX_UART1_PL_28_29_VAL,
},
};
static struct spear_modemux uart1_modemux[] = {
{
.modes = AUTO_NET_SMII_MODE | AUTO_NET_MII_MODE | AUTO_EXP_MODE
| SMALL_PRINTERS_MODE | EXTENDED_MODE,
.muxregs = uart1_muxreg,
.nmuxregs = ARRAY_SIZE(uart1_muxreg),
}, {
.modes = EXTENDED_MODE,
.muxregs = uart1_ext_muxreg,
.nmuxregs = ARRAY_SIZE(uart1_ext_muxreg),
},
};
static struct spear_pingroup uart1_pingroup = {
.name = "uart1_grp",
.pins = uart1_pins,
.npins = ARRAY_SIZE(uart1_pins),
.modemuxs = uart1_modemux,
.nmodemuxs = ARRAY_SIZE(uart1_modemux),
};
static const char *const uart1_grps[] = { "uart1_grp" };
static struct spear_function uart1_function = {
.name = "uart1",
.groups = uart1_grps,
.ngroups = ARRAY_SIZE(uart1_grps),
};
/* Pad multiplexing for UART1 Modem device */
static const unsigned uart1_modem_2_to_7_pins[] = { 2, 3, 4, 5, 6, 7 };
static const unsigned uart1_modem_31_to_36_pins[] = { 31, 32, 33, 34, 35, 36 };
static const unsigned uart1_modem_34_to_45_pins[] = { 34, 35, 36, 43, 44, 45 };
static const unsigned uart1_modem_80_to_85_pins[] = { 80, 81, 82, 83, 84, 85 };
static struct spear_muxreg uart1_modem_ext_2_to_7_muxreg[] = {
{
.reg = PMX_CONFIG_REG,
.mask = PMX_UART0_MASK | PMX_I2C_MASK | PMX_SSP_MASK,
.val = 0,
}, {
.reg = IP_SEL_PAD_0_9_REG,
.mask = PMX_PL_2_3_MASK | PMX_PL_6_7_MASK,
.val = PMX_UART1_ENH_PL_2_3_VAL | PMX_UART1_ENH_PL_4_5_VAL |
PMX_UART1_ENH_PL_6_7_VAL,
}, {
.reg = IP_SEL_MIX_PAD_REG,
.mask = PMX_UART1_ENH_PORT_SEL_MASK,
.val = PMX_UART1_ENH_PORT_3_TO_5_7_VAL,
},
};
static struct spear_muxreg uart1_modem_31_to_36_muxreg[] = {
{
.reg = PMX_CONFIG_REG,
.mask = PMX_GPIO_PIN3_MASK | PMX_GPIO_PIN4_MASK |
PMX_GPIO_PIN5_MASK | PMX_SSP_CS_MASK,
.val = 0,
},
};
static struct spear_muxreg uart1_modem_ext_31_to_36_muxreg[] = {
{
.reg = IP_SEL_PAD_30_39_REG,
.mask = PMX_PL_31_MASK | PMX_PL_32_33_MASK | PMX_PL_34_MASK |
PMX_PL_35_MASK | PMX_PL_36_MASK,
.val = PMX_UART1_ENH_PL_31_VAL | PMX_UART1_ENH_PL_32_33_VAL |
PMX_UART1_ENH_PL_34_VAL | PMX_UART1_ENH_PL_35_VAL |
PMX_UART1_ENH_PL_36_VAL,
}, {
.reg = IP_SEL_MIX_PAD_REG,
.mask = PMX_UART1_ENH_PORT_SEL_MASK,
.val = PMX_UART1_ENH_PORT_32_TO_34_36_VAL,
},
};
static struct spear_muxreg uart1_modem_34_to_45_muxreg[] = {
{
.reg = PMX_CONFIG_REG,
.mask = PMX_TIMER_0_1_MASK | PMX_TIMER_2_3_MASK |
PMX_SSP_CS_MASK,
.val = 0,
},
};
static struct spear_muxreg uart1_modem_ext_34_to_45_muxreg[] = {
{
.reg = IP_SEL_PAD_30_39_REG,
.mask = PMX_PL_34_MASK | PMX_PL_35_MASK | PMX_PL_36_MASK,
.val = PMX_UART1_ENH_PL_34_VAL | PMX_UART1_ENH_PL_35_VAL |
PMX_UART1_ENH_PL_36_VAL,
}, {
.reg = IP_SEL_PAD_40_49_REG,
.mask = PMX_PL_43_MASK | PMX_PL_44_45_MASK,
.val = PMX_UART1_ENH_PL_43_VAL | PMX_UART1_ENH_PL_44_45_VAL,
}, {
.reg = IP_SEL_MIX_PAD_REG,
.mask = PMX_UART1_ENH_PORT_SEL_MASK,
.val = PMX_UART1_ENH_PORT_44_45_34_36_VAL,
},
};
static struct spear_muxreg uart1_modem_ext_80_to_85_muxreg[] = {
{
.reg = IP_SEL_PAD_80_89_REG,
.mask = PMX_PL_80_TO_85_MASK,
.val = PMX_UART1_ENH_PL_80_TO_85_VAL,
}, {
.reg = IP_SEL_PAD_40_49_REG,
.mask = PMX_PL_43_MASK | PMX_PL_44_45_MASK,
.val = PMX_UART1_ENH_PL_43_VAL | PMX_UART1_ENH_PL_44_45_VAL,
}, {
.reg = IP_SEL_MIX_PAD_REG,
.mask = PMX_UART1_ENH_PORT_SEL_MASK,
.val = PMX_UART1_ENH_PORT_81_TO_85_VAL,
},
};
static struct spear_modemux uart1_modem_2_to_7_modemux[] = {
{
.modes = EXTENDED_MODE,
.muxregs = uart1_modem_ext_2_to_7_muxreg,
.nmuxregs = ARRAY_SIZE(uart1_modem_ext_2_to_7_muxreg),
},
};
static struct spear_modemux uart1_modem_31_to_36_modemux[] = {
{
.modes = SMALL_PRINTERS_MODE | EXTENDED_MODE,
.muxregs = uart1_modem_31_to_36_muxreg,
.nmuxregs = ARRAY_SIZE(uart1_modem_31_to_36_muxreg),
}, {
.modes = EXTENDED_MODE,
.muxregs = uart1_modem_ext_31_to_36_muxreg,
.nmuxregs = ARRAY_SIZE(uart1_modem_ext_31_to_36_muxreg),
},
};
static struct spear_modemux uart1_modem_34_to_45_modemux[] = {
{
.modes = AUTO_EXP_MODE | EXTENDED_MODE,
.muxregs = uart1_modem_34_to_45_muxreg,
.nmuxregs = ARRAY_SIZE(uart1_modem_34_to_45_muxreg),
}, {
.modes = EXTENDED_MODE,
.muxregs = uart1_modem_ext_34_to_45_muxreg,
.nmuxregs = ARRAY_SIZE(uart1_modem_ext_34_to_45_muxreg),
},
};
static struct spear_modemux uart1_modem_80_to_85_modemux[] = {
{
.modes = EXTENDED_MODE,
.muxregs = uart1_modem_ext_80_to_85_muxreg,
.nmuxregs = ARRAY_SIZE(uart1_modem_ext_80_to_85_muxreg),
},
};
static struct spear_pingroup uart1_modem_pingroup[] = {
{
.name = "uart1_modem_2_to_7_grp",
.pins = uart1_modem_2_to_7_pins,
.npins = ARRAY_SIZE(uart1_modem_2_to_7_pins),
.modemuxs = uart1_modem_2_to_7_modemux,
.nmodemuxs = ARRAY_SIZE(uart1_modem_2_to_7_modemux),
}, {
.name = "uart1_modem_31_to_36_grp",
.pins = uart1_modem_31_to_36_pins,
.npins = ARRAY_SIZE(uart1_modem_31_to_36_pins),
.modemuxs = uart1_modem_31_to_36_modemux,
.nmodemuxs = ARRAY_SIZE(uart1_modem_31_to_36_modemux),
}, {
.name = "uart1_modem_34_to_45_grp",
.pins = uart1_modem_34_to_45_pins,
.npins = ARRAY_SIZE(uart1_modem_34_to_45_pins),
.modemuxs = uart1_modem_34_to_45_modemux,
.nmodemuxs = ARRAY_SIZE(uart1_modem_34_to_45_modemux),
}, {
.name = "uart1_modem_80_to_85_grp",
.pins = uart1_modem_80_to_85_pins,
.npins = ARRAY_SIZE(uart1_modem_80_to_85_pins),
.modemuxs = uart1_modem_80_to_85_modemux,
.nmodemuxs = ARRAY_SIZE(uart1_modem_80_to_85_modemux),
},
};
static const char *const uart1_modem_grps[] = { "uart1_modem_2_to_7_grp",
"uart1_modem_31_to_36_grp", "uart1_modem_34_to_45_grp",
"uart1_modem_80_to_85_grp" };
static struct spear_function uart1_modem_function = {
.name = "uart1_modem",
.groups = uart1_modem_grps,
.ngroups = ARRAY_SIZE(uart1_modem_grps),
};
/* Pad multiplexing for UART2 device */
static const unsigned uart2_pins[] = { 0, 1 };
static struct spear_muxreg uart2_muxreg[] = {
{
.reg = PMX_CONFIG_REG,
.mask = PMX_FIRDA_MASK,
.val = 0,
},
};
static struct spear_muxreg uart2_ext_muxreg[] = {
{
.reg = IP_SEL_PAD_0_9_REG,
.mask = PMX_PL_0_1_MASK,
.val = PMX_UART2_PL_0_1_VAL,
},
};
static struct spear_modemux uart2_modemux[] = {
{
.modes = AUTO_NET_SMII_MODE | AUTO_NET_MII_MODE | AUTO_EXP_MODE
| SMALL_PRINTERS_MODE | EXTENDED_MODE,
.muxregs = uart2_muxreg,
.nmuxregs = ARRAY_SIZE(uart2_muxreg),
}, {
.modes = EXTENDED_MODE,
.muxregs = uart2_ext_muxreg,
.nmuxregs = ARRAY_SIZE(uart2_ext_muxreg),
},
};
static struct spear_pingroup uart2_pingroup = {
.name = "uart2_grp",
.pins = uart2_pins,
.npins = ARRAY_SIZE(uart2_pins),
.modemuxs = uart2_modemux,
.nmodemuxs = ARRAY_SIZE(uart2_modemux),
};
static const char *const uart2_grps[] = { "uart2_grp" };
static struct spear_function uart2_function = {
.name = "uart2",
.groups = uart2_grps,
.ngroups = ARRAY_SIZE(uart2_grps),
};
/* Pad multiplexing for uart3 device */
static const unsigned uart3_pins[][2] = { { 8, 9 }, { 15, 16 }, { 41, 42 },
{ 52, 53 }, { 73, 74 }, { 94, 95 }, { 98, 99 } };
static struct spear_muxreg uart3_ext_8_9_muxreg[] = {
{
.reg = PMX_CONFIG_REG,
.mask = PMX_SSP_MASK,
.val = 0,
}, {
.reg = IP_SEL_PAD_0_9_REG,
.mask = PMX_PL_8_9_MASK,
.val = PMX_UART3_PL_8_9_VAL,
}, {
.reg = IP_SEL_MIX_PAD_REG,
.mask = PMX_UART3_PORT_SEL_MASK,
.val = PMX_UART3_PORT_8_VAL,
},
};
static struct spear_muxreg uart3_ext_15_16_muxreg[] = {
{
.reg = PMX_CONFIG_REG,
.mask = PMX_MII_MASK,
.val = 0,
}, {
.reg = IP_SEL_PAD_10_19_REG,
.mask = PMX_PL_15_16_MASK,
.val = PMX_UART3_PL_15_16_VAL,
}, {
.reg = IP_SEL_MIX_PAD_REG,
.mask = PMX_UART3_PORT_SEL_MASK,
.val = PMX_UART3_PORT_15_VAL,
},
};
static struct spear_muxreg uart3_ext_41_42_muxreg[] = {
{
.reg = PMX_CONFIG_REG,
.mask = PMX_UART0_MODEM_MASK,
.val = 0,
}, {
.reg = IP_SEL_PAD_40_49_REG,
.mask = PMX_PL_41_42_MASK,
.val = PMX_UART3_PL_41_42_VAL,
}, {
.reg = IP_SEL_MIX_PAD_REG,
.mask = PMX_UART3_PORT_SEL_MASK,
.val = PMX_UART3_PORT_41_VAL,
},
};
static struct spear_muxreg uart3_ext_52_53_muxreg[] = {
{
.reg = IP_SEL_PAD_50_59_REG,
.mask = PMX_PL_52_53_MASK,
.val = PMX_UART3_PL_52_53_VAL,
}, {
.reg = IP_SEL_MIX_PAD_REG,
.mask = PMX_UART3_PORT_SEL_MASK,
.val = PMX_UART3_PORT_52_VAL,
},
};
static struct spear_muxreg uart3_ext_73_74_muxreg[] = {
{
.reg = IP_SEL_PAD_70_79_REG,
.mask = PMX_PL_73_MASK | PMX_PL_74_MASK,
.val = PMX_UART3_PL_73_VAL | PMX_UART3_PL_74_VAL,
}, {
.reg = IP_SEL_MIX_PAD_REG,
.mask = PMX_UART3_PORT_SEL_MASK,
.val = PMX_UART3_PORT_73_VAL,
},
};
static struct spear_muxreg uart3_ext_94_95_muxreg[] = {
{
.reg = IP_SEL_PAD_90_99_REG,
.mask = PMX_PL_94_95_MASK,
.val = PMX_UART3_PL_94_95_VAL,
}, {
.reg = IP_SEL_MIX_PAD_REG,
.mask = PMX_UART3_PORT_SEL_MASK,
.val = PMX_UART3_PORT_94_VAL,
},
};
static struct spear_muxreg uart3_ext_98_99_muxreg[] = {
{
.reg = IP_SEL_PAD_90_99_REG,
.mask = PMX_PL_98_MASK | PMX_PL_99_MASK,
.val = PMX_UART3_PL_98_VAL | PMX_UART3_PL_99_VAL,
}, {
.reg = IP_SEL_MIX_PAD_REG,
.mask = PMX_UART3_PORT_SEL_MASK,
.val = PMX_UART3_PORT_99_VAL,
},
};
static struct spear_modemux uart3_modemux[][1] = {
{
/* Select signals on pins 8_9 */
{
.modes = EXTENDED_MODE,
.muxregs = uart3_ext_8_9_muxreg,
.nmuxregs = ARRAY_SIZE(uart3_ext_8_9_muxreg),
},
}, {
/* Select signals on pins 15_16 */
{
.modes = EXTENDED_MODE,
.muxregs = uart3_ext_15_16_muxreg,
.nmuxregs = ARRAY_SIZE(uart3_ext_15_16_muxreg),
},
}, {
/* Select signals on pins 41_42 */
{
.modes = EXTENDED_MODE,
.muxregs = uart3_ext_41_42_muxreg,
.nmuxregs = ARRAY_SIZE(uart3_ext_41_42_muxreg),
},
}, {
/* Select signals on pins 52_53 */
{
.modes = EXTENDED_MODE,
.muxregs = uart3_ext_52_53_muxreg,
.nmuxregs = ARRAY_SIZE(uart3_ext_52_53_muxreg),
},
}, {
/* Select signals on pins 73_74 */
{
.modes = EXTENDED_MODE,
.muxregs = uart3_ext_73_74_muxreg,
.nmuxregs = ARRAY_SIZE(uart3_ext_73_74_muxreg),
},
}, {
/* Select signals on pins 94_95 */
{
.modes = EXTENDED_MODE,
.muxregs = uart3_ext_94_95_muxreg,
.nmuxregs = ARRAY_SIZE(uart3_ext_94_95_muxreg),
},
}, {
/* Select signals on pins 98_99 */
{
.modes = EXTENDED_MODE,
.muxregs = uart3_ext_98_99_muxreg,
.nmuxregs = ARRAY_SIZE(uart3_ext_98_99_muxreg),
},
},
};
static struct spear_pingroup uart3_pingroup[] = {
{
.name = "uart3_8_9_grp",
.pins = uart3_pins[0],
.npins = ARRAY_SIZE(uart3_pins[0]),
.modemuxs = uart3_modemux[0],
.nmodemuxs = ARRAY_SIZE(uart3_modemux[0]),
}, {
.name = "uart3_15_16_grp",
.pins = uart3_pins[1],
.npins = ARRAY_SIZE(uart3_pins[1]),
.modemuxs = uart3_modemux[1],
.nmodemuxs = ARRAY_SIZE(uart3_modemux[1]),
}, {
.name = "uart3_41_42_grp",
.pins = uart3_pins[2],
.npins = ARRAY_SIZE(uart3_pins[2]),
.modemuxs = uart3_modemux[2],
.nmodemuxs = ARRAY_SIZE(uart3_modemux[2]),
}, {
.name = "uart3_52_53_grp",
.pins = uart3_pins[3],
.npins = ARRAY_SIZE(uart3_pins[3]),
.modemuxs = uart3_modemux[3],
.nmodemuxs = ARRAY_SIZE(uart3_modemux[3]),
}, {
.name = "uart3_73_74_grp",
.pins = uart3_pins[4],
.npins = ARRAY_SIZE(uart3_pins[4]),
.modemuxs = uart3_modemux[4],
.nmodemuxs = ARRAY_SIZE(uart3_modemux[4]),
}, {
.name = "uart3_94_95_grp",
.pins = uart3_pins[5],
.npins = ARRAY_SIZE(uart3_pins[5]),
.modemuxs = uart3_modemux[5],
.nmodemuxs = ARRAY_SIZE(uart3_modemux[5]),
}, {
.name = "uart3_98_99_grp",
.pins = uart3_pins[6],
.npins = ARRAY_SIZE(uart3_pins[6]),
.modemuxs = uart3_modemux[6],
.nmodemuxs = ARRAY_SIZE(uart3_modemux[6]),
},
};
static const char *const uart3_grps[] = { "uart3_8_9_grp", "uart3_15_16_grp",
"uart3_41_42_grp", "uart3_52_53_grp", "uart3_73_74_grp",
"uart3_94_95_grp", "uart3_98_99_grp" };
static struct spear_function uart3_function = {
.name = "uart3",
.groups = uart3_grps,
.ngroups = ARRAY_SIZE(uart3_grps),
};
/* Pad multiplexing for uart4 device */
static const unsigned uart4_pins[][2] = { { 6, 7 }, { 13, 14 }, { 39, 40 },
{ 71, 72 }, { 92, 93 }, { 100, 101 } };
static struct spear_muxreg uart4_ext_6_7_muxreg[] = {
{
.reg = PMX_CONFIG_REG,
.mask = PMX_SSP_MASK,
.val = 0,
}, {
.reg = IP_SEL_PAD_0_9_REG,
.mask = PMX_PL_6_7_MASK,
.val = PMX_UART4_PL_6_7_VAL,
}, {
.reg = IP_SEL_MIX_PAD_REG,
.mask = PMX_UART4_PORT_SEL_MASK,
.val = PMX_UART4_PORT_6_VAL,
},
};
static struct spear_muxreg uart4_ext_13_14_muxreg[] = {
{
.reg = PMX_CONFIG_REG,
.mask = PMX_MII_MASK,
.val = 0,
}, {
.reg = IP_SEL_PAD_10_19_REG,
.mask = PMX_PL_13_14_MASK,
.val = PMX_UART4_PL_13_14_VAL,
}, {
.reg = IP_SEL_MIX_PAD_REG,
.mask = PMX_UART4_PORT_SEL_MASK,
.val = PMX_UART4_PORT_13_VAL,
},
};
static struct spear_muxreg uart4_ext_39_40_muxreg[] = {
{
.reg = PMX_CONFIG_REG,
.mask = PMX_UART0_MODEM_MASK,
.val = 0,
}, {
.reg = IP_SEL_PAD_30_39_REG,
.mask = PMX_PL_39_MASK,
.val = PMX_UART4_PL_39_VAL,
}, {
.reg = IP_SEL_PAD_40_49_REG,
.mask = PMX_PL_40_MASK,
.val = PMX_UART4_PL_40_VAL,
}, {
.reg = IP_SEL_MIX_PAD_REG,
.mask = PMX_UART4_PORT_SEL_MASK,
.val = PMX_UART4_PORT_39_VAL,
},
};
static struct spear_muxreg uart4_ext_71_72_muxreg[] = {
{
.reg = IP_SEL_PAD_70_79_REG,
.mask = PMX_PL_71_72_MASK,
.val = PMX_UART4_PL_71_72_VAL,
}, {
.reg = IP_SEL_MIX_PAD_REG,
.mask = PMX_UART4_PORT_SEL_MASK,
.val = PMX_UART4_PORT_71_VAL,
},
};
static struct spear_muxreg uart4_ext_92_93_muxreg[] = {
{
.reg = IP_SEL_PAD_90_99_REG,
.mask = PMX_PL_92_93_MASK,
.val = PMX_UART4_PL_92_93_VAL,
}, {
.reg = IP_SEL_MIX_PAD_REG,
.mask = PMX_UART4_PORT_SEL_MASK,
.val = PMX_UART4_PORT_92_VAL,
},
};
static struct spear_muxreg uart4_ext_100_101_muxreg[] = {
{
.reg = IP_SEL_MIX_PAD_REG,
.mask = PMX_PL_100_101_MASK |
PMX_UART4_PORT_SEL_MASK,
.val = PMX_UART4_PL_100_101_VAL |
PMX_UART4_PORT_101_VAL,
},
};
static struct spear_modemux uart4_modemux[][1] = {
{
/* Select signals on pins 6_7 */
{
.modes = EXTENDED_MODE,
.muxregs = uart4_ext_6_7_muxreg,
.nmuxregs = ARRAY_SIZE(uart4_ext_6_7_muxreg),
},
}, {
/* Select signals on pins 13_14 */
{
.modes = EXTENDED_MODE,
.muxregs = uart4_ext_13_14_muxreg,
.nmuxregs = ARRAY_SIZE(uart4_ext_13_14_muxreg),
},
}, {
/* Select signals on pins 39_40 */
{
.modes = EXTENDED_MODE,
.muxregs = uart4_ext_39_40_muxreg,
.nmuxregs = ARRAY_SIZE(uart4_ext_39_40_muxreg),
},
}, {
/* Select signals on pins 71_72 */
{
.modes = EXTENDED_MODE,
.muxregs = uart4_ext_71_72_muxreg,
.nmuxregs = ARRAY_SIZE(uart4_ext_71_72_muxreg),
},
}, {
/* Select signals on pins 92_93 */
{
.modes = EXTENDED_MODE,
.muxregs = uart4_ext_92_93_muxreg,
.nmuxregs = ARRAY_SIZE(uart4_ext_92_93_muxreg),
},
}, {
/* Select signals on pins 100_101_ */
{
.modes = EXTENDED_MODE,
.muxregs = uart4_ext_100_101_muxreg,
.nmuxregs = ARRAY_SIZE(uart4_ext_100_101_muxreg),
},
},
};
static struct spear_pingroup uart4_pingroup[] = {
{
.name = "uart4_6_7_grp",
.pins = uart4_pins[0],
.npins = ARRAY_SIZE(uart4_pins[0]),
.modemuxs = uart4_modemux[0],
.nmodemuxs = ARRAY_SIZE(uart4_modemux[0]),
}, {
.name = "uart4_13_14_grp",
.pins = uart4_pins[1],
.npins = ARRAY_SIZE(uart4_pins[1]),
.modemuxs = uart4_modemux[1],
.nmodemuxs = ARRAY_SIZE(uart4_modemux[1]),
}, {
.name = "uart4_39_40_grp",
.pins = uart4_pins[2],
.npins = ARRAY_SIZE(uart4_pins[2]),
.modemuxs = uart4_modemux[2],
.nmodemuxs = ARRAY_SIZE(uart4_modemux[2]),
}, {
.name = "uart4_71_72_grp",
.pins = uart4_pins[3],
.npins = ARRAY_SIZE(uart4_pins[3]),
.modemuxs = uart4_modemux[3],
.nmodemuxs = ARRAY_SIZE(uart4_modemux[3]),
}, {
.name = "uart4_92_93_grp",
.pins = uart4_pins[4],
.npins = ARRAY_SIZE(uart4_pins[4]),
.modemuxs = uart4_modemux[4],
.nmodemuxs = ARRAY_SIZE(uart4_modemux[4]),
}, {
.name = "uart4_100_101_grp",
.pins = uart4_pins[5],
.npins = ARRAY_SIZE(uart4_pins[5]),
.modemuxs = uart4_modemux[5],
.nmodemuxs = ARRAY_SIZE(uart4_modemux[5]),
},
};
static const char *const uart4_grps[] = { "uart4_6_7_grp", "uart4_13_14_grp",
"uart4_39_40_grp", "uart4_71_72_grp", "uart4_92_93_grp",
"uart4_100_101_grp" };
static struct spear_function uart4_function = {
.name = "uart4",
.groups = uart4_grps,
.ngroups = ARRAY_SIZE(uart4_grps),
};
/* Pad multiplexing for uart5 device */
static const unsigned uart5_pins[][2] = { { 4, 5 }, { 37, 38 }, { 69, 70 },
{ 90, 91 } };
static struct spear_muxreg uart5_ext_4_5_muxreg[] = {
{
.reg = PMX_CONFIG_REG,
.mask = PMX_I2C_MASK,
.val = 0,
}, {
.reg = IP_SEL_PAD_0_9_REG,
.mask = PMX_PL_4_5_MASK,
.val = PMX_UART5_PL_4_5_VAL,
}, {
.reg = IP_SEL_MIX_PAD_REG,
.mask = PMX_UART5_PORT_SEL_MASK,
.val = PMX_UART5_PORT_4_VAL,
},
};
static struct spear_muxreg uart5_ext_37_38_muxreg[] = {
{
.reg = PMX_CONFIG_REG,
.mask = PMX_UART0_MODEM_MASK,
.val = 0,
}, {
.reg = IP_SEL_PAD_30_39_REG,
.mask = PMX_PL_37_38_MASK,
.val = PMX_UART5_PL_37_38_VAL,
}, {
.reg = IP_SEL_MIX_PAD_REG,
.mask = PMX_UART5_PORT_SEL_MASK,
.val = PMX_UART5_PORT_37_VAL,
},
};
static struct spear_muxreg uart5_ext_69_70_muxreg[] = {
{
.reg = IP_SEL_PAD_60_69_REG,
.mask = PMX_PL_69_MASK,
.val = PMX_UART5_PL_69_VAL,
}, {
.reg = IP_SEL_PAD_70_79_REG,
.mask = PMX_PL_70_MASK,
.val = PMX_UART5_PL_70_VAL,
}, {
.reg = IP_SEL_MIX_PAD_REG,
.mask = PMX_UART5_PORT_SEL_MASK,
.val = PMX_UART5_PORT_69_VAL,
},
};
static struct spear_muxreg uart5_ext_90_91_muxreg[] = {
{
.reg = IP_SEL_PAD_90_99_REG,
.mask = PMX_PL_90_91_MASK,
.val = PMX_UART5_PL_90_91_VAL,
}, {
.reg = IP_SEL_MIX_PAD_REG,
.mask = PMX_UART5_PORT_SEL_MASK,
.val = PMX_UART5_PORT_90_VAL,
},
};
static struct spear_modemux uart5_modemux[][1] = {
{
/* Select signals on pins 4_5 */
{
.modes = EXTENDED_MODE,
.muxregs = uart5_ext_4_5_muxreg,
.nmuxregs = ARRAY_SIZE(uart5_ext_4_5_muxreg),
},
}, {
/* Select signals on pins 37_38 */
{
.modes = EXTENDED_MODE,
.muxregs = uart5_ext_37_38_muxreg,
.nmuxregs = ARRAY_SIZE(uart5_ext_37_38_muxreg),
},
}, {
/* Select signals on pins 69_70 */
{
.modes = EXTENDED_MODE,
.muxregs = uart5_ext_69_70_muxreg,
.nmuxregs = ARRAY_SIZE(uart5_ext_69_70_muxreg),
},
}, {
/* Select signals on pins 90_91 */
{
.modes = EXTENDED_MODE,
.muxregs = uart5_ext_90_91_muxreg,
.nmuxregs = ARRAY_SIZE(uart5_ext_90_91_muxreg),
},
},
};
static struct spear_pingroup uart5_pingroup[] = {
{
.name = "uart5_4_5_grp",
.pins = uart5_pins[0],
.npins = ARRAY_SIZE(uart5_pins[0]),
.modemuxs = uart5_modemux[0],
.nmodemuxs = ARRAY_SIZE(uart5_modemux[0]),
}, {
.name = "uart5_37_38_grp",
.pins = uart5_pins[1],
.npins = ARRAY_SIZE(uart5_pins[1]),
.modemuxs = uart5_modemux[1],
.nmodemuxs = ARRAY_SIZE(uart5_modemux[1]),
}, {
.name = "uart5_69_70_grp",
.pins = uart5_pins[2],
.npins = ARRAY_SIZE(uart5_pins[2]),
.modemuxs = uart5_modemux[2],
.nmodemuxs = ARRAY_SIZE(uart5_modemux[2]),
}, {
.name = "uart5_90_91_grp",
.pins = uart5_pins[3],
.npins = ARRAY_SIZE(uart5_pins[3]),
.modemuxs = uart5_modemux[3],
.nmodemuxs = ARRAY_SIZE(uart5_modemux[3]),
},
};
static const char *const uart5_grps[] = { "uart5_4_5_grp", "uart5_37_38_grp",
"uart5_69_70_grp", "uart5_90_91_grp" };
static struct spear_function uart5_function = {
.name = "uart5",
.groups = uart5_grps,
.ngroups = ARRAY_SIZE(uart5_grps),
};
/* Pad multiplexing for uart6 device */
static const unsigned uart6_pins[][2] = { { 2, 3 }, { 88, 89 } };
static struct spear_muxreg uart6_ext_2_3_muxreg[] = {
{
.reg = PMX_CONFIG_REG,
.mask = PMX_UART0_MASK,
.val = 0,
}, {
.reg = IP_SEL_PAD_0_9_REG,
.mask = PMX_PL_2_3_MASK,
.val = PMX_UART6_PL_2_3_VAL,
}, {
.reg = IP_SEL_MIX_PAD_REG,
.mask = PMX_UART6_PORT_SEL_MASK,
.val = PMX_UART6_PORT_2_VAL,
},
};
static struct spear_muxreg uart6_ext_88_89_muxreg[] = {
{
.reg = IP_SEL_PAD_80_89_REG,
.mask = PMX_PL_88_89_MASK,
.val = PMX_UART6_PL_88_89_VAL,
}, {
.reg = IP_SEL_MIX_PAD_REG,
.mask = PMX_UART6_PORT_SEL_MASK,
.val = PMX_UART6_PORT_88_VAL,
},
};
static struct spear_modemux uart6_modemux[][1] = {
{
/* Select signals on pins 2_3 */
{
.modes = EXTENDED_MODE,
.muxregs = uart6_ext_2_3_muxreg,
.nmuxregs = ARRAY_SIZE(uart6_ext_2_3_muxreg),
},
}, {
/* Select signals on pins 88_89 */
{
.modes = EXTENDED_MODE,
.muxregs = uart6_ext_88_89_muxreg,
.nmuxregs = ARRAY_SIZE(uart6_ext_88_89_muxreg),
},
},
};
static struct spear_pingroup uart6_pingroup[] = {
{
.name = "uart6_2_3_grp",
.pins = uart6_pins[0],
.npins = ARRAY_SIZE(uart6_pins[0]),
.modemuxs = uart6_modemux[0],
.nmodemuxs = ARRAY_SIZE(uart6_modemux[0]),
}, {
.name = "uart6_88_89_grp",
.pins = uart6_pins[1],
.npins = ARRAY_SIZE(uart6_pins[1]),
.modemuxs = uart6_modemux[1],
.nmodemuxs = ARRAY_SIZE(uart6_modemux[1]),
},
};
static const char *const uart6_grps[] = { "uart6_2_3_grp", "uart6_88_89_grp" };
static struct spear_function uart6_function = {
.name = "uart6",
.groups = uart6_grps,
.ngroups = ARRAY_SIZE(uart6_grps),
};
/* UART - RS485 pmx */
static const unsigned rs485_pins[] = { 77, 78, 79 };
static struct spear_muxreg rs485_muxreg[] = {
{
.reg = IP_SEL_PAD_70_79_REG,
.mask = PMX_PL_77_78_79_MASK,
.val = PMX_RS485_PL_77_78_79_VAL,
},
};
static struct spear_modemux rs485_modemux[] = {
{
.modes = EXTENDED_MODE,
.muxregs = rs485_muxreg,
.nmuxregs = ARRAY_SIZE(rs485_muxreg),
},
};
static struct spear_pingroup rs485_pingroup = {
.name = "rs485_grp",
.pins = rs485_pins,
.npins = ARRAY_SIZE(rs485_pins),
.modemuxs = rs485_modemux,
.nmodemuxs = ARRAY_SIZE(rs485_modemux),
};
static const char *const rs485_grps[] = { "rs485_grp" };
static struct spear_function rs485_function = {
.name = "rs485",
.groups = rs485_grps,
.ngroups = ARRAY_SIZE(rs485_grps),
};
/* Pad multiplexing for Touchscreen device */
static const unsigned touchscreen_pins[] = { 5, 36 };
static struct spear_muxreg touchscreen_muxreg[] = {
{
.reg = PMX_CONFIG_REG,
.mask = PMX_I2C_MASK | PMX_SSP_CS_MASK,
.val = 0,
},
};
static struct spear_muxreg touchscreen_ext_muxreg[] = {
{
.reg = IP_SEL_PAD_0_9_REG,
.mask = PMX_PL_5_MASK,
.val = PMX_TOUCH_Y_PL_5_VAL,
}, {
.reg = IP_SEL_PAD_30_39_REG,
.mask = PMX_PL_36_MASK,
.val = PMX_TOUCH_X_PL_36_VAL,
},
};
static struct spear_modemux touchscreen_modemux[] = {
{
.modes = AUTO_NET_SMII_MODE | EXTENDED_MODE,
.muxregs = touchscreen_muxreg,
.nmuxregs = ARRAY_SIZE(touchscreen_muxreg),
}, {
.modes = EXTENDED_MODE,
.muxregs = touchscreen_ext_muxreg,
.nmuxregs = ARRAY_SIZE(touchscreen_ext_muxreg),
},
};
static struct spear_pingroup touchscreen_pingroup = {
.name = "touchscreen_grp",
.pins = touchscreen_pins,
.npins = ARRAY_SIZE(touchscreen_pins),
.modemuxs = touchscreen_modemux,
.nmodemuxs = ARRAY_SIZE(touchscreen_modemux),
};
static const char *const touchscreen_grps[] = { "touchscreen_grp" };
static struct spear_function touchscreen_function = {
.name = "touchscreen",
.groups = touchscreen_grps,
.ngroups = ARRAY_SIZE(touchscreen_grps),
};
/* Pad multiplexing for CAN device */
static const unsigned can0_pins[] = { 32, 33 };
static struct spear_muxreg can0_muxreg[] = {
{
.reg = PMX_CONFIG_REG,
.mask = PMX_GPIO_PIN4_MASK | PMX_GPIO_PIN5_MASK,
.val = 0,
},
};
static struct spear_muxreg can0_ext_muxreg[] = {
{
.reg = IP_SEL_PAD_30_39_REG,
.mask = PMX_PL_32_33_MASK,
.val = PMX_CAN0_PL_32_33_VAL,
},
};
static struct spear_modemux can0_modemux[] = {
{
.modes = AUTO_NET_SMII_MODE | AUTO_NET_MII_MODE | AUTO_EXP_MODE
| EXTENDED_MODE,
.muxregs = can0_muxreg,
.nmuxregs = ARRAY_SIZE(can0_muxreg),
}, {
.modes = EXTENDED_MODE,
.muxregs = can0_ext_muxreg,
.nmuxregs = ARRAY_SIZE(can0_ext_muxreg),
},
};
static struct spear_pingroup can0_pingroup = {
.name = "can0_grp",
.pins = can0_pins,
.npins = ARRAY_SIZE(can0_pins),
.modemuxs = can0_modemux,
.nmodemuxs = ARRAY_SIZE(can0_modemux),
};
static const char *const can0_grps[] = { "can0_grp" };
static struct spear_function can0_function = {
.name = "can0",
.groups = can0_grps,
.ngroups = ARRAY_SIZE(can0_grps),
};
static const unsigned can1_pins[] = { 30, 31 };
static struct spear_muxreg can1_muxreg[] = {
{
.reg = PMX_CONFIG_REG,
.mask = PMX_GPIO_PIN2_MASK | PMX_GPIO_PIN3_MASK,
.val = 0,
},
};
static struct spear_muxreg can1_ext_muxreg[] = {
{
.reg = IP_SEL_PAD_30_39_REG,
.mask = PMX_PL_30_31_MASK,
.val = PMX_CAN1_PL_30_31_VAL,
},
};
static struct spear_modemux can1_modemux[] = {
{
.modes = AUTO_NET_SMII_MODE | AUTO_NET_MII_MODE | AUTO_EXP_MODE
| EXTENDED_MODE,
.muxregs = can1_muxreg,
.nmuxregs = ARRAY_SIZE(can1_muxreg),
}, {
.modes = EXTENDED_MODE,
.muxregs = can1_ext_muxreg,
.nmuxregs = ARRAY_SIZE(can1_ext_muxreg),
},
};
static struct spear_pingroup can1_pingroup = {
.name = "can1_grp",
.pins = can1_pins,
.npins = ARRAY_SIZE(can1_pins),
.modemuxs = can1_modemux,
.nmodemuxs = ARRAY_SIZE(can1_modemux),
};
static const char *const can1_grps[] = { "can1_grp" };
static struct spear_function can1_function = {
.name = "can1",
.groups = can1_grps,
.ngroups = ARRAY_SIZE(can1_grps),
};
/* Pad multiplexing for PWM0_1 device */
static const unsigned pwm0_1_pins[][2] = { { 37, 38 }, { 14, 15 }, { 8, 9 },
{ 30, 31 }, { 42, 43 }, { 59, 60 }, { 88, 89 } };
static struct spear_muxreg pwm0_1_pin_8_9_muxreg[] = {
{
.reg = PMX_CONFIG_REG,
.mask = PMX_SSP_MASK,
.val = 0,
}, {
.reg = IP_SEL_PAD_0_9_REG,
.mask = PMX_PL_8_9_MASK,
.val = PMX_PWM_0_1_PL_8_9_VAL,
},
};
static struct spear_muxreg pwm0_1_autoexpsmallpri_muxreg[] = {
{
.reg = PMX_CONFIG_REG,
.mask = PMX_MII_MASK,
.val = 0,
},
};
static struct spear_muxreg pwm0_1_pin_14_15_muxreg[] = {
{
.reg = IP_SEL_PAD_10_19_REG,
.mask = PMX_PL_14_MASK | PMX_PL_15_MASK,
.val = PMX_PWM1_PL_14_VAL | PMX_PWM0_PL_15_VAL,
},
};
static struct spear_muxreg pwm0_1_pin_30_31_muxreg[] = {
{
.reg = PMX_CONFIG_REG,
.mask = PMX_GPIO_PIN2_MASK | PMX_GPIO_PIN3_MASK,
.val = 0,
}, {
.reg = IP_SEL_PAD_30_39_REG,
.mask = PMX_PL_30_MASK | PMX_PL_31_MASK,
.val = PMX_PWM1_EXT_PL_30_VAL | PMX_PWM0_EXT_PL_31_VAL,
},
};
static struct spear_muxreg pwm0_1_net_muxreg[] = {
{
.reg = PMX_CONFIG_REG,
.mask = PMX_UART0_MODEM_MASK,
.val = 0,
},
};
static struct spear_muxreg pwm0_1_pin_37_38_muxreg[] = {
{
.reg = IP_SEL_PAD_30_39_REG,
.mask = PMX_PL_37_38_MASK,
.val = PMX_PWM0_1_PL_37_38_VAL,
},
};
static struct spear_muxreg pwm0_1_pin_42_43_muxreg[] = {
{
.reg = PMX_CONFIG_REG,
.mask = PMX_UART0_MODEM_MASK | PMX_TIMER_0_1_MASK ,
.val = 0,
}, {
.reg = IP_SEL_PAD_40_49_REG,
.mask = PMX_PL_42_MASK | PMX_PL_43_MASK,
.val = PMX_PWM1_PL_42_VAL |
PMX_PWM0_PL_43_VAL,
},
};
static struct spear_muxreg pwm0_1_pin_59_60_muxreg[] = {
{
.reg = IP_SEL_PAD_50_59_REG,
.mask = PMX_PL_59_MASK,
.val = PMX_PWM1_PL_59_VAL,
}, {
.reg = IP_SEL_PAD_60_69_REG,
.mask = PMX_PL_60_MASK,
.val = PMX_PWM0_PL_60_VAL,
},
};
static struct spear_muxreg pwm0_1_pin_88_89_muxreg[] = {
{
.reg = IP_SEL_PAD_80_89_REG,
.mask = PMX_PL_88_89_MASK,
.val = PMX_PWM0_1_PL_88_89_VAL,
},
};
static struct spear_modemux pwm0_1_pin_8_9_modemux[] = {
{
.modes = EXTENDED_MODE,
.muxregs = pwm0_1_pin_8_9_muxreg,
.nmuxregs = ARRAY_SIZE(pwm0_1_pin_8_9_muxreg),
},
};
static struct spear_modemux pwm0_1_pin_14_15_modemux[] = {
{
.modes = AUTO_EXP_MODE | SMALL_PRINTERS_MODE | EXTENDED_MODE,
.muxregs = pwm0_1_autoexpsmallpri_muxreg,
.nmuxregs = ARRAY_SIZE(pwm0_1_autoexpsmallpri_muxreg),
}, {
.modes = EXTENDED_MODE,
.muxregs = pwm0_1_pin_14_15_muxreg,
.nmuxregs = ARRAY_SIZE(pwm0_1_pin_14_15_muxreg),
},
};
static struct spear_modemux pwm0_1_pin_30_31_modemux[] = {
{
.modes = EXTENDED_MODE,
.muxregs = pwm0_1_pin_30_31_muxreg,
.nmuxregs = ARRAY_SIZE(pwm0_1_pin_30_31_muxreg),
},
};
static struct spear_modemux pwm0_1_pin_37_38_modemux[] = {
{
.modes = AUTO_NET_SMII_MODE | AUTO_NET_MII_MODE | EXTENDED_MODE,
.muxregs = pwm0_1_net_muxreg,
.nmuxregs = ARRAY_SIZE(pwm0_1_net_muxreg),
}, {
.modes = EXTENDED_MODE,
.muxregs = pwm0_1_pin_37_38_muxreg,
.nmuxregs = ARRAY_SIZE(pwm0_1_pin_37_38_muxreg),
},
};
static struct spear_modemux pwm0_1_pin_42_43_modemux[] = {
{
.modes = EXTENDED_MODE,
.muxregs = pwm0_1_pin_42_43_muxreg,
.nmuxregs = ARRAY_SIZE(pwm0_1_pin_42_43_muxreg),
},
};
static struct spear_modemux pwm0_1_pin_59_60_modemux[] = {
{
.modes = EXTENDED_MODE,
.muxregs = pwm0_1_pin_59_60_muxreg,
.nmuxregs = ARRAY_SIZE(pwm0_1_pin_59_60_muxreg),
},
};
static struct spear_modemux pwm0_1_pin_88_89_modemux[] = {
{
.modes = EXTENDED_MODE,
.muxregs = pwm0_1_pin_88_89_muxreg,
.nmuxregs = ARRAY_SIZE(pwm0_1_pin_88_89_muxreg),
},
};
static struct spear_pingroup pwm0_1_pingroup[] = {
{
.name = "pwm0_1_pin_8_9_grp",
.pins = pwm0_1_pins[0],
.npins = ARRAY_SIZE(pwm0_1_pins[0]),
.modemuxs = pwm0_1_pin_8_9_modemux,
.nmodemuxs = ARRAY_SIZE(pwm0_1_pin_8_9_modemux),
}, {
.name = "pwm0_1_pin_14_15_grp",
.pins = pwm0_1_pins[1],
.npins = ARRAY_SIZE(pwm0_1_pins[1]),
.modemuxs = pwm0_1_pin_14_15_modemux,
.nmodemuxs = ARRAY_SIZE(pwm0_1_pin_14_15_modemux),
}, {
.name = "pwm0_1_pin_30_31_grp",
.pins = pwm0_1_pins[2],
.npins = ARRAY_SIZE(pwm0_1_pins[2]),
.modemuxs = pwm0_1_pin_30_31_modemux,
.nmodemuxs = ARRAY_SIZE(pwm0_1_pin_30_31_modemux),
}, {
.name = "pwm0_1_pin_37_38_grp",
.pins = pwm0_1_pins[3],
.npins = ARRAY_SIZE(pwm0_1_pins[3]),
.modemuxs = pwm0_1_pin_37_38_modemux,
.nmodemuxs = ARRAY_SIZE(pwm0_1_pin_37_38_modemux),
}, {
.name = "pwm0_1_pin_42_43_grp",
.pins = pwm0_1_pins[4],
.npins = ARRAY_SIZE(pwm0_1_pins[4]),
.modemuxs = pwm0_1_pin_42_43_modemux,
.nmodemuxs = ARRAY_SIZE(pwm0_1_pin_42_43_modemux),
}, {
.name = "pwm0_1_pin_59_60_grp",
.pins = pwm0_1_pins[5],
.npins = ARRAY_SIZE(pwm0_1_pins[5]),
.modemuxs = pwm0_1_pin_59_60_modemux,
.nmodemuxs = ARRAY_SIZE(pwm0_1_pin_59_60_modemux),
}, {
.name = "pwm0_1_pin_88_89_grp",
.pins = pwm0_1_pins[6],
.npins = ARRAY_SIZE(pwm0_1_pins[6]),
.modemuxs = pwm0_1_pin_88_89_modemux,
.nmodemuxs = ARRAY_SIZE(pwm0_1_pin_88_89_modemux),
},
};
static const char *const pwm0_1_grps[] = { "pwm0_1_pin_8_9_grp",
"pwm0_1_pin_14_15_grp", "pwm0_1_pin_30_31_grp", "pwm0_1_pin_37_38_grp",
"pwm0_1_pin_42_43_grp", "pwm0_1_pin_59_60_grp", "pwm0_1_pin_88_89_grp"
};
static struct spear_function pwm0_1_function = {
.name = "pwm0_1",
.groups = pwm0_1_grps,
.ngroups = ARRAY_SIZE(pwm0_1_grps),
};
/* Pad multiplexing for PWM2 device */
static const unsigned pwm2_pins[][1] = { { 7 }, { 13 }, { 29 }, { 34 }, { 41 },
{ 58 }, { 87 } };
static struct spear_muxreg pwm2_net_muxreg[] = {
{
.reg = PMX_CONFIG_REG,
.mask = PMX_SSP_CS_MASK,
.val = 0,
},
};
static struct spear_muxreg pwm2_pin_7_muxreg[] = {
{
.reg = IP_SEL_PAD_0_9_REG,
.mask = PMX_PL_7_MASK,
.val = PMX_PWM_2_PL_7_VAL,
},
};
static struct spear_muxreg pwm2_autoexpsmallpri_muxreg[] = {
{
.reg = PMX_CONFIG_REG,
.mask = PMX_MII_MASK,
.val = 0,
},
};
static struct spear_muxreg pwm2_pin_13_muxreg[] = {
{
.reg = IP_SEL_PAD_10_19_REG,
.mask = PMX_PL_13_MASK,
.val = PMX_PWM2_PL_13_VAL,
},
};
static struct spear_muxreg pwm2_pin_29_muxreg[] = {
{
.reg = PMX_CONFIG_REG,
.mask = PMX_GPIO_PIN1_MASK,
.val = 0,
}, {
.reg = IP_SEL_PAD_20_29_REG,
.mask = PMX_PL_29_MASK,
.val = PMX_PWM_2_PL_29_VAL,
},
};
static struct spear_muxreg pwm2_pin_34_muxreg[] = {
{
.reg = PMX_CONFIG_REG,
.mask = PMX_SSP_CS_MASK,
.val = 0,
}, {
.reg = IP_SEL_PAD_30_39_REG,
.mask = PMX_PL_34_MASK,
.val = PMX_PWM2_PL_34_VAL,
},
};
static struct spear_muxreg pwm2_pin_41_muxreg[] = {
{
.reg = PMX_CONFIG_REG,
.mask = PMX_UART0_MODEM_MASK,
.val = 0,
}, {
.reg = IP_SEL_PAD_40_49_REG,
.mask = PMX_PL_41_MASK,
.val = PMX_PWM2_PL_41_VAL,
},
};
static struct spear_muxreg pwm2_pin_58_muxreg[] = {
{
.reg = IP_SEL_PAD_50_59_REG,
.mask = PMX_PL_58_MASK,
.val = PMX_PWM2_PL_58_VAL,
},
};
static struct spear_muxreg pwm2_pin_87_muxreg[] = {
{
.reg = IP_SEL_PAD_80_89_REG,
.mask = PMX_PL_87_MASK,
.val = PMX_PWM2_PL_87_VAL,
},
};
static struct spear_modemux pwm2_pin_7_modemux[] = {
{
.modes = AUTO_NET_SMII_MODE | AUTO_NET_MII_MODE | EXTENDED_MODE,
.muxregs = pwm2_net_muxreg,
.nmuxregs = ARRAY_SIZE(pwm2_net_muxreg),
}, {
.modes = EXTENDED_MODE,
.muxregs = pwm2_pin_7_muxreg,
.nmuxregs = ARRAY_SIZE(pwm2_pin_7_muxreg),
},
};
static struct spear_modemux pwm2_pin_13_modemux[] = {
{
.modes = AUTO_EXP_MODE | SMALL_PRINTERS_MODE | EXTENDED_MODE,
.muxregs = pwm2_autoexpsmallpri_muxreg,
.nmuxregs = ARRAY_SIZE(pwm2_autoexpsmallpri_muxreg),
}, {
.modes = EXTENDED_MODE,
.muxregs = pwm2_pin_13_muxreg,
.nmuxregs = ARRAY_SIZE(pwm2_pin_13_muxreg),
},
};
static struct spear_modemux pwm2_pin_29_modemux[] = {
{
.modes = EXTENDED_MODE,
.muxregs = pwm2_pin_29_muxreg,
.nmuxregs = ARRAY_SIZE(pwm2_pin_29_muxreg),
},
};
static struct spear_modemux pwm2_pin_34_modemux[] = {
{
.modes = EXTENDED_MODE,
.muxregs = pwm2_pin_34_muxreg,
.nmuxregs = ARRAY_SIZE(pwm2_pin_34_muxreg),
},
};
static struct spear_modemux pwm2_pin_41_modemux[] = {
{
.modes = EXTENDED_MODE,
.muxregs = pwm2_pin_41_muxreg,
.nmuxregs = ARRAY_SIZE(pwm2_pin_41_muxreg),
},
};
static struct spear_modemux pwm2_pin_58_modemux[] = {
{
.modes = EXTENDED_MODE,
.muxregs = pwm2_pin_58_muxreg,
.nmuxregs = ARRAY_SIZE(pwm2_pin_58_muxreg),
},
};
static struct spear_modemux pwm2_pin_87_modemux[] = {
{
.modes = EXTENDED_MODE,
.muxregs = pwm2_pin_87_muxreg,
.nmuxregs = ARRAY_SIZE(pwm2_pin_87_muxreg),
},
};
static struct spear_pingroup pwm2_pingroup[] = {
{
.name = "pwm2_pin_7_grp",
.pins = pwm2_pins[0],
.npins = ARRAY_SIZE(pwm2_pins[0]),
.modemuxs = pwm2_pin_7_modemux,
.nmodemuxs = ARRAY_SIZE(pwm2_pin_7_modemux),
}, {
.name = "pwm2_pin_13_grp",
.pins = pwm2_pins[1],
.npins = ARRAY_SIZE(pwm2_pins[1]),
.modemuxs = pwm2_pin_13_modemux,
.nmodemuxs = ARRAY_SIZE(pwm2_pin_13_modemux),
}, {
.name = "pwm2_pin_29_grp",
.pins = pwm2_pins[2],
.npins = ARRAY_SIZE(pwm2_pins[2]),
.modemuxs = pwm2_pin_29_modemux,
.nmodemuxs = ARRAY_SIZE(pwm2_pin_29_modemux),
}, {
.name = "pwm2_pin_34_grp",
.pins = pwm2_pins[3],
.npins = ARRAY_SIZE(pwm2_pins[3]),
.modemuxs = pwm2_pin_34_modemux,
.nmodemuxs = ARRAY_SIZE(pwm2_pin_34_modemux),
}, {
.name = "pwm2_pin_41_grp",
.pins = pwm2_pins[4],
.npins = ARRAY_SIZE(pwm2_pins[4]),
.modemuxs = pwm2_pin_41_modemux,
.nmodemuxs = ARRAY_SIZE(pwm2_pin_41_modemux),
}, {
.name = "pwm2_pin_58_grp",
.pins = pwm2_pins[5],
.npins = ARRAY_SIZE(pwm2_pins[5]),
.modemuxs = pwm2_pin_58_modemux,
.nmodemuxs = ARRAY_SIZE(pwm2_pin_58_modemux),
}, {
.name = "pwm2_pin_87_grp",
.pins = pwm2_pins[6],
.npins = ARRAY_SIZE(pwm2_pins[6]),
.modemuxs = pwm2_pin_87_modemux,
.nmodemuxs = ARRAY_SIZE(pwm2_pin_87_modemux),
},
};
static const char *const pwm2_grps[] = { "pwm2_pin_7_grp", "pwm2_pin_13_grp",
"pwm2_pin_29_grp", "pwm2_pin_34_grp", "pwm2_pin_41_grp",
"pwm2_pin_58_grp", "pwm2_pin_87_grp" };
static struct spear_function pwm2_function = {
.name = "pwm2",
.groups = pwm2_grps,
.ngroups = ARRAY_SIZE(pwm2_grps),
};
/* Pad multiplexing for PWM3 device */
static const unsigned pwm3_pins[][1] = { { 6 }, { 12 }, { 28 }, { 40 }, { 57 },
{ 86 } };
static struct spear_muxreg pwm3_pin_6_muxreg[] = {
{
.reg = PMX_CONFIG_REG,
.mask = PMX_SSP_MASK,
.val = 0,
}, {
.reg = IP_SEL_PAD_0_9_REG,
.mask = PMX_PL_6_MASK,
.val = PMX_PWM_3_PL_6_VAL,
},
};
static struct spear_muxreg pwm3_muxreg[] = {
{
.reg = PMX_CONFIG_REG,
.mask = PMX_MII_MASK,
.val = 0,
},
};
static struct spear_muxreg pwm3_pin_12_muxreg[] = {
{
.reg = IP_SEL_PAD_10_19_REG,
.mask = PMX_PL_12_MASK,
.val = PMX_PWM3_PL_12_VAL,
},
};
static struct spear_muxreg pwm3_pin_28_muxreg[] = {
{
.reg = PMX_CONFIG_REG,
.mask = PMX_GPIO_PIN0_MASK,
.val = 0,
}, {
.reg = IP_SEL_PAD_20_29_REG,
.mask = PMX_PL_28_MASK,
.val = PMX_PWM_3_PL_28_VAL,
},
};
static struct spear_muxreg pwm3_pin_40_muxreg[] = {
{
.reg = PMX_CONFIG_REG,
.mask = PMX_UART0_MODEM_MASK,
.val = 0,
}, {
.reg = IP_SEL_PAD_40_49_REG,
.mask = PMX_PL_40_MASK,
.val = PMX_PWM3_PL_40_VAL,
},
};
static struct spear_muxreg pwm3_pin_57_muxreg[] = {
{
.reg = IP_SEL_PAD_50_59_REG,
.mask = PMX_PL_57_MASK,
.val = PMX_PWM3_PL_57_VAL,
},
};
static struct spear_muxreg pwm3_pin_86_muxreg[] = {
{
.reg = IP_SEL_PAD_80_89_REG,
.mask = PMX_PL_86_MASK,
.val = PMX_PWM3_PL_86_VAL,
},
};
static struct spear_modemux pwm3_pin_6_modemux[] = {
{
.modes = EXTENDED_MODE,
.muxregs = pwm3_pin_6_muxreg,
.nmuxregs = ARRAY_SIZE(pwm3_pin_6_muxreg),
},
};
static struct spear_modemux pwm3_pin_12_modemux[] = {
{
.modes = AUTO_EXP_MODE | SMALL_PRINTERS_MODE |
AUTO_NET_SMII_MODE | EXTENDED_MODE,
.muxregs = pwm3_muxreg,
.nmuxregs = ARRAY_SIZE(pwm3_muxreg),
}, {
.modes = EXTENDED_MODE,
.muxregs = pwm3_pin_12_muxreg,
.nmuxregs = ARRAY_SIZE(pwm3_pin_12_muxreg),
},
};
static struct spear_modemux pwm3_pin_28_modemux[] = {
{
.modes = EXTENDED_MODE,
.muxregs = pwm3_pin_28_muxreg,
.nmuxregs = ARRAY_SIZE(pwm3_pin_28_muxreg),
},
};
static struct spear_modemux pwm3_pin_40_modemux[] = {
{
.modes = EXTENDED_MODE,
.muxregs = pwm3_pin_40_muxreg,
.nmuxregs = ARRAY_SIZE(pwm3_pin_40_muxreg),
},
};
static struct spear_modemux pwm3_pin_57_modemux[] = {
{
.modes = EXTENDED_MODE,
.muxregs = pwm3_pin_57_muxreg,
.nmuxregs = ARRAY_SIZE(pwm3_pin_57_muxreg),
},
};
static struct spear_modemux pwm3_pin_86_modemux[] = {
{
.modes = EXTENDED_MODE,
.muxregs = pwm3_pin_86_muxreg,
.nmuxregs = ARRAY_SIZE(pwm3_pin_86_muxreg),
},
};
static struct spear_pingroup pwm3_pingroup[] = {
{
.name = "pwm3_pin_6_grp",
.pins = pwm3_pins[0],
.npins = ARRAY_SIZE(pwm3_pins[0]),
.modemuxs = pwm3_pin_6_modemux,
.nmodemuxs = ARRAY_SIZE(pwm3_pin_6_modemux),
}, {
.name = "pwm3_pin_12_grp",
.pins = pwm3_pins[1],
.npins = ARRAY_SIZE(pwm3_pins[1]),
.modemuxs = pwm3_pin_12_modemux,
.nmodemuxs = ARRAY_SIZE(pwm3_pin_12_modemux),
}, {
.name = "pwm3_pin_28_grp",
.pins = pwm3_pins[2],
.npins = ARRAY_SIZE(pwm3_pins[2]),
.modemuxs = pwm3_pin_28_modemux,
.nmodemuxs = ARRAY_SIZE(pwm3_pin_28_modemux),
}, {
.name = "pwm3_pin_40_grp",
.pins = pwm3_pins[3],
.npins = ARRAY_SIZE(pwm3_pins[3]),
.modemuxs = pwm3_pin_40_modemux,
.nmodemuxs = ARRAY_SIZE(pwm3_pin_40_modemux),
}, {
.name = "pwm3_pin_57_grp",
.pins = pwm3_pins[4],
.npins = ARRAY_SIZE(pwm3_pins[4]),
.modemuxs = pwm3_pin_57_modemux,
.nmodemuxs = ARRAY_SIZE(pwm3_pin_57_modemux),
}, {
.name = "pwm3_pin_86_grp",
.pins = pwm3_pins[5],
.npins = ARRAY_SIZE(pwm3_pins[5]),
.modemuxs = pwm3_pin_86_modemux,
.nmodemuxs = ARRAY_SIZE(pwm3_pin_86_modemux),
},
};
static const char *const pwm3_grps[] = { "pwm3_pin_6_grp", "pwm3_pin_12_grp",
"pwm3_pin_28_grp", "pwm3_pin_40_grp", "pwm3_pin_57_grp",
"pwm3_pin_86_grp" };
static struct spear_function pwm3_function = {
.name = "pwm3",
.groups = pwm3_grps,
.ngroups = ARRAY_SIZE(pwm3_grps),
};
/* Pad multiplexing for SSP1 device */
static const unsigned ssp1_pins[][2] = { { 17, 20 }, { 36, 39 }, { 48, 51 },
{ 65, 68 }, { 94, 97 } };
static struct spear_muxreg ssp1_muxreg[] = {
{
.reg = PMX_CONFIG_REG,
.mask = PMX_MII_MASK,
.val = 0,
},
};
static struct spear_muxreg ssp1_ext_17_20_muxreg[] = {
{
.reg = IP_SEL_PAD_10_19_REG,
.mask = PMX_PL_17_18_MASK | PMX_PL_19_MASK,
.val = PMX_SSP1_PL_17_18_19_20_VAL,
}, {
.reg = IP_SEL_PAD_20_29_REG,
.mask = PMX_PL_20_MASK,
.val = PMX_SSP1_PL_17_18_19_20_VAL,
}, {
.reg = IP_SEL_MIX_PAD_REG,
.mask = PMX_SSP1_PORT_SEL_MASK,
.val = PMX_SSP1_PORT_17_TO_20_VAL,
},
};
static struct spear_muxreg ssp1_ext_36_39_muxreg[] = {
{
.reg = PMX_CONFIG_REG,
.mask = PMX_UART0_MODEM_MASK | PMX_SSP_CS_MASK,
.val = 0,
}, {
.reg = IP_SEL_PAD_30_39_REG,
.mask = PMX_PL_36_MASK | PMX_PL_37_38_MASK | PMX_PL_39_MASK,
.val = PMX_SSP1_PL_36_VAL | PMX_SSP1_PL_37_38_VAL |
PMX_SSP1_PL_39_VAL,
}, {
.reg = IP_SEL_MIX_PAD_REG,
.mask = PMX_SSP1_PORT_SEL_MASK,
.val = PMX_SSP1_PORT_36_TO_39_VAL,
},
};
static struct spear_muxreg ssp1_ext_48_51_muxreg[] = {
{
.reg = PMX_CONFIG_REG,
.mask = PMX_TIMER_0_1_MASK | PMX_TIMER_2_3_MASK,
.val = 0,
}, {
.reg = IP_SEL_PAD_40_49_REG,
.mask = PMX_PL_48_49_MASK,
.val = PMX_SSP1_PL_48_49_VAL,
}, {
.reg = IP_SEL_PAD_50_59_REG,
.mask = PMX_PL_50_51_MASK,
.val = PMX_SSP1_PL_50_51_VAL,
}, {
.reg = IP_SEL_MIX_PAD_REG,
.mask = PMX_SSP1_PORT_SEL_MASK,
.val = PMX_SSP1_PORT_48_TO_51_VAL,
},
};
static struct spear_muxreg ssp1_ext_65_68_muxreg[] = {
{
.reg = IP_SEL_PAD_60_69_REG,
.mask = PMX_PL_65_TO_68_MASK,
.val = PMX_SSP1_PL_65_TO_68_VAL,
}, {
.reg = IP_SEL_MIX_PAD_REG,
.mask = PMX_SSP1_PORT_SEL_MASK,
.val = PMX_SSP1_PORT_65_TO_68_VAL,
},
};
static struct spear_muxreg ssp1_ext_94_97_muxreg[] = {
{
.reg = IP_SEL_PAD_90_99_REG,
.mask = PMX_PL_94_95_MASK | PMX_PL_96_97_MASK,
.val = PMX_SSP1_PL_94_95_VAL | PMX_SSP1_PL_96_97_VAL,
}, {
.reg = IP_SEL_MIX_PAD_REG,
.mask = PMX_SSP1_PORT_SEL_MASK,
.val = PMX_SSP1_PORT_94_TO_97_VAL,
},
};
static struct spear_modemux ssp1_17_20_modemux[] = {
{
.modes = SMALL_PRINTERS_MODE | AUTO_NET_SMII_MODE |
EXTENDED_MODE,
.muxregs = ssp1_muxreg,
.nmuxregs = ARRAY_SIZE(ssp1_muxreg),
}, {
.modes = EXTENDED_MODE,
.muxregs = ssp1_ext_17_20_muxreg,
.nmuxregs = ARRAY_SIZE(ssp1_ext_17_20_muxreg),
},
};
static struct spear_modemux ssp1_36_39_modemux[] = {
{
.modes = EXTENDED_MODE,
.muxregs = ssp1_ext_36_39_muxreg,
.nmuxregs = ARRAY_SIZE(ssp1_ext_36_39_muxreg),
},
};
static struct spear_modemux ssp1_48_51_modemux[] = {
{
.modes = EXTENDED_MODE,
.muxregs = ssp1_ext_48_51_muxreg,
.nmuxregs = ARRAY_SIZE(ssp1_ext_48_51_muxreg),
},
};
static struct spear_modemux ssp1_65_68_modemux[] = {
{
.modes = EXTENDED_MODE,
.muxregs = ssp1_ext_65_68_muxreg,
.nmuxregs = ARRAY_SIZE(ssp1_ext_65_68_muxreg),
},
};
static struct spear_modemux ssp1_94_97_modemux[] = {
{
.modes = EXTENDED_MODE,
.muxregs = ssp1_ext_94_97_muxreg,
.nmuxregs = ARRAY_SIZE(ssp1_ext_94_97_muxreg),
},
};
static struct spear_pingroup ssp1_pingroup[] = {
{
.name = "ssp1_17_20_grp",
.pins = ssp1_pins[0],
.npins = ARRAY_SIZE(ssp1_pins[0]),
.modemuxs = ssp1_17_20_modemux,
.nmodemuxs = ARRAY_SIZE(ssp1_17_20_modemux),
}, {
.name = "ssp1_36_39_grp",
.pins = ssp1_pins[1],
.npins = ARRAY_SIZE(ssp1_pins[1]),
.modemuxs = ssp1_36_39_modemux,
.nmodemuxs = ARRAY_SIZE(ssp1_36_39_modemux),
}, {
.name = "ssp1_48_51_grp",
.pins = ssp1_pins[2],
.npins = ARRAY_SIZE(ssp1_pins[2]),
.modemuxs = ssp1_48_51_modemux,
.nmodemuxs = ARRAY_SIZE(ssp1_48_51_modemux),
}, {
.name = "ssp1_65_68_grp",
.pins = ssp1_pins[3],
.npins = ARRAY_SIZE(ssp1_pins[3]),
.modemuxs = ssp1_65_68_modemux,
.nmodemuxs = ARRAY_SIZE(ssp1_65_68_modemux),
}, {
.name = "ssp1_94_97_grp",
.pins = ssp1_pins[4],
.npins = ARRAY_SIZE(ssp1_pins[4]),
.modemuxs = ssp1_94_97_modemux,
.nmodemuxs = ARRAY_SIZE(ssp1_94_97_modemux),
},
};
static const char *const ssp1_grps[] = { "ssp1_17_20_grp", "ssp1_36_39_grp",
"ssp1_48_51_grp", "ssp1_65_68_grp", "ssp1_94_97_grp"
};
static struct spear_function ssp1_function = {
.name = "ssp1",
.groups = ssp1_grps,
.ngroups = ARRAY_SIZE(ssp1_grps),
};
/* Pad multiplexing for SSP2 device */
static const unsigned ssp2_pins[][2] = { { 13, 16 }, { 32, 35 }, { 44, 47 },
{ 61, 64 }, { 90, 93 } };
static struct spear_muxreg ssp2_muxreg[] = {
{
.reg = PMX_CONFIG_REG,
.mask = PMX_MII_MASK,
.val = 0,
},
};
static struct spear_muxreg ssp2_ext_13_16_muxreg[] = {
{
.reg = IP_SEL_PAD_10_19_REG,
.mask = PMX_PL_13_14_MASK | PMX_PL_15_16_MASK,
.val = PMX_SSP2_PL_13_14_15_16_VAL,
}, {
.reg = IP_SEL_MIX_PAD_REG,
.mask = PMX_SSP2_PORT_SEL_MASK,
.val = PMX_SSP2_PORT_13_TO_16_VAL,
},
};
static struct spear_muxreg ssp2_ext_32_35_muxreg[] = {
{
.reg = PMX_CONFIG_REG,
.mask = PMX_SSP_CS_MASK | PMX_GPIO_PIN4_MASK |
PMX_GPIO_PIN5_MASK,
.val = 0,
}, {
.reg = IP_SEL_PAD_30_39_REG,
.mask = PMX_PL_32_33_MASK | PMX_PL_34_MASK | PMX_PL_35_MASK,
.val = PMX_SSP2_PL_32_33_VAL | PMX_SSP2_PL_34_VAL |
PMX_SSP2_PL_35_VAL,
}, {
.reg = IP_SEL_MIX_PAD_REG,
.mask = PMX_SSP2_PORT_SEL_MASK,
.val = PMX_SSP2_PORT_32_TO_35_VAL,
},
};
static struct spear_muxreg ssp2_ext_44_47_muxreg[] = {
{
.reg = PMX_CONFIG_REG,
.mask = PMX_TIMER_0_1_MASK | PMX_TIMER_2_3_MASK,
.val = 0,
}, {
.reg = IP_SEL_PAD_40_49_REG,
.mask = PMX_PL_44_45_MASK | PMX_PL_46_47_MASK,
.val = PMX_SSP2_PL_44_45_VAL | PMX_SSP2_PL_46_47_VAL,
}, {
.reg = IP_SEL_MIX_PAD_REG,
.mask = PMX_SSP2_PORT_SEL_MASK,
.val = PMX_SSP2_PORT_44_TO_47_VAL,
},
};
static struct spear_muxreg ssp2_ext_61_64_muxreg[] = {
{
.reg = IP_SEL_PAD_60_69_REG,
.mask = PMX_PL_61_TO_64_MASK,
.val = PMX_SSP2_PL_61_TO_64_VAL,
}, {
.reg = IP_SEL_MIX_PAD_REG,
.mask = PMX_SSP2_PORT_SEL_MASK,
.val = PMX_SSP2_PORT_61_TO_64_VAL,
},
};
static struct spear_muxreg ssp2_ext_90_93_muxreg[] = {
{
.reg = IP_SEL_PAD_90_99_REG,
.mask = PMX_PL_90_91_MASK | PMX_PL_92_93_MASK,
.val = PMX_SSP2_PL_90_91_VAL | PMX_SSP2_PL_92_93_VAL,
}, {
.reg = IP_SEL_MIX_PAD_REG,
.mask = PMX_SSP2_PORT_SEL_MASK,
.val = PMX_SSP2_PORT_90_TO_93_VAL,
},
};
static struct spear_modemux ssp2_13_16_modemux[] = {
{
.modes = AUTO_NET_SMII_MODE | EXTENDED_MODE,
.muxregs = ssp2_muxreg,
.nmuxregs = ARRAY_SIZE(ssp2_muxreg),
}, {
.modes = EXTENDED_MODE,
.muxregs = ssp2_ext_13_16_muxreg,
.nmuxregs = ARRAY_SIZE(ssp2_ext_13_16_muxreg),
},
};
static struct spear_modemux ssp2_32_35_modemux[] = {
{
.modes = EXTENDED_MODE,
.muxregs = ssp2_ext_32_35_muxreg,
.nmuxregs = ARRAY_SIZE(ssp2_ext_32_35_muxreg),
},
};
static struct spear_modemux ssp2_44_47_modemux[] = {
{
.modes = EXTENDED_MODE,
.muxregs = ssp2_ext_44_47_muxreg,
.nmuxregs = ARRAY_SIZE(ssp2_ext_44_47_muxreg),
},
};
static struct spear_modemux ssp2_61_64_modemux[] = {
{
.modes = EXTENDED_MODE,
.muxregs = ssp2_ext_61_64_muxreg,
.nmuxregs = ARRAY_SIZE(ssp2_ext_61_64_muxreg),
},
};
static struct spear_modemux ssp2_90_93_modemux[] = {
{
.modes = EXTENDED_MODE,
.muxregs = ssp2_ext_90_93_muxreg,
.nmuxregs = ARRAY_SIZE(ssp2_ext_90_93_muxreg),
},
};
static struct spear_pingroup ssp2_pingroup[] = {
{
.name = "ssp2_13_16_grp",
.pins = ssp2_pins[0],
.npins = ARRAY_SIZE(ssp2_pins[0]),
.modemuxs = ssp2_13_16_modemux,
.nmodemuxs = ARRAY_SIZE(ssp2_13_16_modemux),
}, {
.name = "ssp2_32_35_grp",
.pins = ssp2_pins[1],
.npins = ARRAY_SIZE(ssp2_pins[1]),
.modemuxs = ssp2_32_35_modemux,
.nmodemuxs = ARRAY_SIZE(ssp2_32_35_modemux),
}, {
.name = "ssp2_44_47_grp",
.pins = ssp2_pins[2],
.npins = ARRAY_SIZE(ssp2_pins[2]),
.modemuxs = ssp2_44_47_modemux,
.nmodemuxs = ARRAY_SIZE(ssp2_44_47_modemux),
}, {
.name = "ssp2_61_64_grp",
.pins = ssp2_pins[3],
.npins = ARRAY_SIZE(ssp2_pins[3]),
.modemuxs = ssp2_61_64_modemux,
.nmodemuxs = ARRAY_SIZE(ssp2_61_64_modemux),
}, {
.name = "ssp2_90_93_grp",
.pins = ssp2_pins[4],
.npins = ARRAY_SIZE(ssp2_pins[4]),
.modemuxs = ssp2_90_93_modemux,
.nmodemuxs = ARRAY_SIZE(ssp2_90_93_modemux),
},
};
static const char *const ssp2_grps[] = { "ssp2_13_16_grp", "ssp2_32_35_grp",
"ssp2_44_47_grp", "ssp2_61_64_grp", "ssp2_90_93_grp" };
static struct spear_function ssp2_function = {
.name = "ssp2",
.groups = ssp2_grps,
.ngroups = ARRAY_SIZE(ssp2_grps),
};
/* Pad multiplexing for cadence mii2 as mii device */
static const unsigned mii2_pins[] = { 80, 81, 82, 83, 84, 85, 86, 87, 88, 89,
90, 91, 92, 93, 94, 95, 96, 97 };
static struct spear_muxreg mii2_muxreg[] = {
{
.reg = IP_SEL_PAD_80_89_REG,
.mask = PMX_PL_80_TO_85_MASK | PMX_PL_86_87_MASK |
PMX_PL_88_89_MASK,
.val = PMX_MII2_PL_80_TO_85_VAL | PMX_MII2_PL_86_87_VAL |
PMX_MII2_PL_88_89_VAL,
}, {
.reg = IP_SEL_PAD_90_99_REG,
.mask = PMX_PL_90_91_MASK | PMX_PL_92_93_MASK |
PMX_PL_94_95_MASK | PMX_PL_96_97_MASK,
.val = PMX_MII2_PL_90_91_VAL | PMX_MII2_PL_92_93_VAL |
PMX_MII2_PL_94_95_VAL | PMX_MII2_PL_96_97_VAL,
}, {
.reg = EXT_CTRL_REG,
.mask = (MAC_MODE_MASK << MAC2_MODE_SHIFT) |
(MAC_MODE_MASK << MAC1_MODE_SHIFT) |
MII_MDIO_MASK,
.val = (MAC_MODE_MII << MAC2_MODE_SHIFT) |
(MAC_MODE_MII << MAC1_MODE_SHIFT) |
MII_MDIO_81_VAL,
},
};
static struct spear_modemux mii2_modemux[] = {
{
.modes = EXTENDED_MODE,
.muxregs = mii2_muxreg,
.nmuxregs = ARRAY_SIZE(mii2_muxreg),
},
};
static struct spear_pingroup mii2_pingroup = {
.name = "mii2_grp",
.pins = mii2_pins,
.npins = ARRAY_SIZE(mii2_pins),
.modemuxs = mii2_modemux,
.nmodemuxs = ARRAY_SIZE(mii2_modemux),
};
static const char *const mii2_grps[] = { "mii2_grp" };
static struct spear_function mii2_function = {
.name = "mii2",
.groups = mii2_grps,
.ngroups = ARRAY_SIZE(mii2_grps),
};
/* Pad multiplexing for cadence mii 1_2 as smii or rmii device */
static const unsigned smii0_1_pins[] = { 10, 11, 13, 14, 15, 16, 17, 18, 19, 20,
21, 22, 23, 24, 25, 26, 27 };
static const unsigned rmii0_1_pins[] = { 10, 11, 21, 22, 23, 24, 25, 26, 27 };
static struct spear_muxreg mii0_1_muxreg[] = {
{
.reg = PMX_CONFIG_REG,
.mask = PMX_MII_MASK,
.val = 0,
},
};
static struct spear_muxreg smii0_1_ext_muxreg[] = {
{
.reg = IP_SEL_PAD_10_19_REG,
.mask = PMX_PL_10_11_MASK,
.val = PMX_SMII_PL_10_11_VAL,
}, {
.reg = IP_SEL_PAD_20_29_REG,
.mask = PMX_PL_21_TO_27_MASK,
.val = PMX_SMII_PL_21_TO_27_VAL,
}, {
.reg = EXT_CTRL_REG,
.mask = (MAC_MODE_MASK << MAC2_MODE_SHIFT) |
(MAC_MODE_MASK << MAC1_MODE_SHIFT) |
MII_MDIO_MASK,
.val = (MAC_MODE_SMII << MAC2_MODE_SHIFT)
| (MAC_MODE_SMII << MAC1_MODE_SHIFT)
| MII_MDIO_10_11_VAL,
},
};
static struct spear_muxreg rmii0_1_ext_muxreg[] = {
{
.reg = IP_SEL_PAD_10_19_REG,
.mask = PMX_PL_10_11_MASK | PMX_PL_13_14_MASK |
PMX_PL_15_16_MASK | PMX_PL_17_18_MASK | PMX_PL_19_MASK,
.val = PMX_RMII_PL_10_11_VAL | PMX_RMII_PL_13_14_VAL |
PMX_RMII_PL_15_16_VAL | PMX_RMII_PL_17_18_VAL |
PMX_RMII_PL_19_VAL,
}, {
.reg = IP_SEL_PAD_20_29_REG,
.mask = PMX_PL_20_MASK | PMX_PL_21_TO_27_MASK,
.val = PMX_RMII_PL_20_VAL | PMX_RMII_PL_21_TO_27_VAL,
}, {
.reg = EXT_CTRL_REG,
.mask = (MAC_MODE_MASK << MAC2_MODE_SHIFT) |
(MAC_MODE_MASK << MAC1_MODE_SHIFT) |
MII_MDIO_MASK,
.val = (MAC_MODE_RMII << MAC2_MODE_SHIFT)
| (MAC_MODE_RMII << MAC1_MODE_SHIFT)
| MII_MDIO_10_11_VAL,
},
};
static struct spear_modemux mii0_1_modemux[][2] = {
{
/* configure as smii */
{
.modes = AUTO_NET_SMII_MODE | AUTO_EXP_MODE |
SMALL_PRINTERS_MODE | EXTENDED_MODE,
.muxregs = mii0_1_muxreg,
.nmuxregs = ARRAY_SIZE(mii0_1_muxreg),
}, {
.modes = EXTENDED_MODE,
.muxregs = smii0_1_ext_muxreg,
.nmuxregs = ARRAY_SIZE(smii0_1_ext_muxreg),
},
}, {
/* configure as rmii */
{
.modes = AUTO_NET_SMII_MODE | AUTO_EXP_MODE |
SMALL_PRINTERS_MODE | EXTENDED_MODE,
.muxregs = mii0_1_muxreg,
.nmuxregs = ARRAY_SIZE(mii0_1_muxreg),
}, {
.modes = EXTENDED_MODE,
.muxregs = rmii0_1_ext_muxreg,
.nmuxregs = ARRAY_SIZE(rmii0_1_ext_muxreg),
},
},
};
static struct spear_pingroup mii0_1_pingroup[] = {
{
.name = "smii0_1_grp",
.pins = smii0_1_pins,
.npins = ARRAY_SIZE(smii0_1_pins),
.modemuxs = mii0_1_modemux[0],
.nmodemuxs = ARRAY_SIZE(mii0_1_modemux[0]),
}, {
.name = "rmii0_1_grp",
.pins = rmii0_1_pins,
.npins = ARRAY_SIZE(rmii0_1_pins),
.modemuxs = mii0_1_modemux[1],
.nmodemuxs = ARRAY_SIZE(mii0_1_modemux[1]),
},
};
static const char *const mii0_1_grps[] = { "smii0_1_grp", "rmii0_1_grp" };
static struct spear_function mii0_1_function = {
.name = "mii0_1",
.groups = mii0_1_grps,
.ngroups = ARRAY_SIZE(mii0_1_grps),
};
/* Pad multiplexing for i2c1 device */
static const unsigned i2c1_pins[][2] = { { 8, 9 }, { 98, 99 } };
static struct spear_muxreg i2c1_ext_8_9_muxreg[] = {
{
.reg = PMX_CONFIG_REG,
.mask = PMX_SSP_CS_MASK,
.val = 0,
}, {
.reg = IP_SEL_PAD_0_9_REG,
.mask = PMX_PL_8_9_MASK,
.val = PMX_I2C1_PL_8_9_VAL,
}, {
.reg = IP_SEL_MIX_PAD_REG,
.mask = PMX_I2C1_PORT_SEL_MASK,
.val = PMX_I2C1_PORT_8_9_VAL,
},
};
static struct spear_muxreg i2c1_ext_98_99_muxreg[] = {
{
.reg = IP_SEL_PAD_90_99_REG,
.mask = PMX_PL_98_MASK | PMX_PL_99_MASK,
.val = PMX_I2C1_PL_98_VAL | PMX_I2C1_PL_99_VAL,
}, {
.reg = IP_SEL_MIX_PAD_REG,
.mask = PMX_I2C1_PORT_SEL_MASK,
.val = PMX_I2C1_PORT_98_99_VAL,
},
};
static struct spear_modemux i2c1_modemux[][1] = {
{
/* Select signals on pins 8-9 */
{
.modes = EXTENDED_MODE,
.muxregs = i2c1_ext_8_9_muxreg,
.nmuxregs = ARRAY_SIZE(i2c1_ext_8_9_muxreg),
},
}, {
/* Select signals on pins 98-99 */
{
.modes = EXTENDED_MODE,
.muxregs = i2c1_ext_98_99_muxreg,
.nmuxregs = ARRAY_SIZE(i2c1_ext_98_99_muxreg),
},
},
};
static struct spear_pingroup i2c1_pingroup[] = {
{
.name = "i2c1_8_9_grp",
.pins = i2c1_pins[0],
.npins = ARRAY_SIZE(i2c1_pins[0]),
.modemuxs = i2c1_modemux[0],
.nmodemuxs = ARRAY_SIZE(i2c1_modemux[0]),
}, {
.name = "i2c1_98_99_grp",
.pins = i2c1_pins[1],
.npins = ARRAY_SIZE(i2c1_pins[1]),
.modemuxs = i2c1_modemux[1],
.nmodemuxs = ARRAY_SIZE(i2c1_modemux[1]),
},
};
static const char *const i2c1_grps[] = { "i2c1_8_9_grp", "i2c1_98_99_grp" };
static struct spear_function i2c1_function = {
.name = "i2c1",
.groups = i2c1_grps,
.ngroups = ARRAY_SIZE(i2c1_grps),
};
/* Pad multiplexing for i2c2 device */
static const unsigned i2c2_pins[][2] = { { 0, 1 }, { 2, 3 }, { 19, 20 },
{ 75, 76 }, { 96, 97 } };
static struct spear_muxreg i2c2_ext_0_1_muxreg[] = {
{
.reg = PMX_CONFIG_REG,
.mask = PMX_FIRDA_MASK,
.val = 0,
}, {
.reg = IP_SEL_PAD_0_9_REG,
.mask = PMX_PL_0_1_MASK,
.val = PMX_I2C2_PL_0_1_VAL,
}, {
.reg = IP_SEL_MIX_PAD_REG,
.mask = PMX_I2C2_PORT_SEL_MASK,
.val = PMX_I2C2_PORT_0_1_VAL,
},
};
static struct spear_muxreg i2c2_ext_2_3_muxreg[] = {
{
.reg = PMX_CONFIG_REG,
.mask = PMX_UART0_MASK,
.val = 0,
}, {
.reg = IP_SEL_PAD_0_9_REG,
.mask = PMX_PL_2_3_MASK,
.val = PMX_I2C2_PL_2_3_VAL,
}, {
.reg = IP_SEL_MIX_PAD_REG,
.mask = PMX_I2C2_PORT_SEL_MASK,
.val = PMX_I2C2_PORT_2_3_VAL,
},
};
static struct spear_muxreg i2c2_ext_19_20_muxreg[] = {
{
.reg = PMX_CONFIG_REG,
.mask = PMX_MII_MASK,
.val = 0,
}, {
.reg = IP_SEL_PAD_10_19_REG,
.mask = PMX_PL_19_MASK,
.val = PMX_I2C2_PL_19_VAL,
}, {
.reg = IP_SEL_PAD_20_29_REG,
.mask = PMX_PL_20_MASK,
.val = PMX_I2C2_PL_20_VAL,
}, {
.reg = IP_SEL_MIX_PAD_REG,
.mask = PMX_I2C2_PORT_SEL_MASK,
.val = PMX_I2C2_PORT_19_20_VAL,
},
};
static struct spear_muxreg i2c2_ext_75_76_muxreg[] = {
{
.reg = IP_SEL_PAD_70_79_REG,
.mask = PMX_PL_75_76_MASK,
.val = PMX_I2C2_PL_75_76_VAL,
}, {
.reg = IP_SEL_MIX_PAD_REG,
.mask = PMX_I2C2_PORT_SEL_MASK,
.val = PMX_I2C2_PORT_75_76_VAL,
},
};
static struct spear_muxreg i2c2_ext_96_97_muxreg[] = {
{
.reg = IP_SEL_PAD_90_99_REG,
.mask = PMX_PL_96_97_MASK,
.val = PMX_I2C2_PL_96_97_VAL,
}, {
.reg = IP_SEL_MIX_PAD_REG,
.mask = PMX_I2C2_PORT_SEL_MASK,
.val = PMX_I2C2_PORT_96_97_VAL,
},
};
static struct spear_modemux i2c2_modemux[][1] = {
{
/* Select signals on pins 0_1 */
{
.modes = EXTENDED_MODE,
.muxregs = i2c2_ext_0_1_muxreg,
.nmuxregs = ARRAY_SIZE(i2c2_ext_0_1_muxreg),
},
}, {
/* Select signals on pins 2_3 */
{
.modes = EXTENDED_MODE,
.muxregs = i2c2_ext_2_3_muxreg,
.nmuxregs = ARRAY_SIZE(i2c2_ext_2_3_muxreg),
},
}, {
/* Select signals on pins 19_20 */
{
.modes = EXTENDED_MODE,
.muxregs = i2c2_ext_19_20_muxreg,
.nmuxregs = ARRAY_SIZE(i2c2_ext_19_20_muxreg),
},
}, {
/* Select signals on pins 75_76 */
{
.modes = EXTENDED_MODE,
.muxregs = i2c2_ext_75_76_muxreg,
.nmuxregs = ARRAY_SIZE(i2c2_ext_75_76_muxreg),
},
}, {
/* Select signals on pins 96_97 */
{
.modes = EXTENDED_MODE,
.muxregs = i2c2_ext_96_97_muxreg,
.nmuxregs = ARRAY_SIZE(i2c2_ext_96_97_muxreg),
},
},
};
static struct spear_pingroup i2c2_pingroup[] = {
{
.name = "i2c2_0_1_grp",
.pins = i2c2_pins[0],
.npins = ARRAY_SIZE(i2c2_pins[0]),
.modemuxs = i2c2_modemux[0],
.nmodemuxs = ARRAY_SIZE(i2c2_modemux[0]),
}, {
.name = "i2c2_2_3_grp",
.pins = i2c2_pins[1],
.npins = ARRAY_SIZE(i2c2_pins[1]),
.modemuxs = i2c2_modemux[1],
.nmodemuxs = ARRAY_SIZE(i2c2_modemux[1]),
}, {
.name = "i2c2_19_20_grp",
.pins = i2c2_pins[2],
.npins = ARRAY_SIZE(i2c2_pins[2]),
.modemuxs = i2c2_modemux[2],
.nmodemuxs = ARRAY_SIZE(i2c2_modemux[2]),
}, {
.name = "i2c2_75_76_grp",
.pins = i2c2_pins[3],
.npins = ARRAY_SIZE(i2c2_pins[3]),
.modemuxs = i2c2_modemux[3],
.nmodemuxs = ARRAY_SIZE(i2c2_modemux[3]),
}, {
.name = "i2c2_96_97_grp",
.pins = i2c2_pins[4],
.npins = ARRAY_SIZE(i2c2_pins[4]),
.modemuxs = i2c2_modemux[4],
.nmodemuxs = ARRAY_SIZE(i2c2_modemux[4]),
},
};
static const char *const i2c2_grps[] = { "i2c2_0_1_grp", "i2c2_2_3_grp",
"i2c2_19_20_grp", "i2c2_75_76_grp", "i2c2_96_97_grp" };
static struct spear_function i2c2_function = {
.name = "i2c2",
.groups = i2c2_grps,
.ngroups = ARRAY_SIZE(i2c2_grps),
};
/* pingroups */
static struct spear_pingroup *spear320_pingroups[] = {
SPEAR3XX_COMMON_PINGROUPS,
&clcd_pingroup,
&emi_pingroup,
&fsmc_8bit_pingroup,
&fsmc_16bit_pingroup,
&spp_pingroup,
&sdhci_led_pingroup,
&sdhci_pingroup[0],
&sdhci_pingroup[1],
&i2s_pingroup,
&uart1_pingroup,
&uart1_modem_pingroup[0],
&uart1_modem_pingroup[1],
&uart1_modem_pingroup[2],
&uart1_modem_pingroup[3],
&uart2_pingroup,
&uart3_pingroup[0],
&uart3_pingroup[1],
&uart3_pingroup[2],
&uart3_pingroup[3],
&uart3_pingroup[4],
&uart3_pingroup[5],
&uart3_pingroup[6],
&uart4_pingroup[0],
&uart4_pingroup[1],
&uart4_pingroup[2],
&uart4_pingroup[3],
&uart4_pingroup[4],
&uart4_pingroup[5],
&uart5_pingroup[0],
&uart5_pingroup[1],
&uart5_pingroup[2],
&uart5_pingroup[3],
&uart6_pingroup[0],
&uart6_pingroup[1],
&rs485_pingroup,
&touchscreen_pingroup,
&can0_pingroup,
&can1_pingroup,
&pwm0_1_pingroup[0],
&pwm0_1_pingroup[1],
&pwm0_1_pingroup[2],
&pwm0_1_pingroup[3],
&pwm0_1_pingroup[4],
&pwm0_1_pingroup[5],
&pwm0_1_pingroup[6],
&pwm2_pingroup[0],
&pwm2_pingroup[1],
&pwm2_pingroup[2],
&pwm2_pingroup[3],
&pwm2_pingroup[4],
&pwm2_pingroup[5],
&pwm2_pingroup[6],
&pwm3_pingroup[0],
&pwm3_pingroup[1],
&pwm3_pingroup[2],
&pwm3_pingroup[3],
&pwm3_pingroup[4],
&pwm3_pingroup[5],
&ssp1_pingroup[0],
&ssp1_pingroup[1],
&ssp1_pingroup[2],
&ssp1_pingroup[3],
&ssp1_pingroup[4],
&ssp2_pingroup[0],
&ssp2_pingroup[1],
&ssp2_pingroup[2],
&ssp2_pingroup[3],
&ssp2_pingroup[4],
&mii2_pingroup,
&mii0_1_pingroup[0],
&mii0_1_pingroup[1],
&i2c1_pingroup[0],
&i2c1_pingroup[1],
&i2c2_pingroup[0],
&i2c2_pingroup[1],
&i2c2_pingroup[2],
&i2c2_pingroup[3],
&i2c2_pingroup[4],
};
/* functions */
static struct spear_function *spear320_functions[] = {
SPEAR3XX_COMMON_FUNCTIONS,
&clcd_function,
&emi_function,
&fsmc_function,
&spp_function,
&sdhci_function,
&i2s_function,
&uart1_function,
&uart1_modem_function,
&uart2_function,
&uart3_function,
&uart4_function,
&uart5_function,
&uart6_function,
&rs485_function,
&touchscreen_function,
&can0_function,
&can1_function,
&pwm0_1_function,
&pwm2_function,
&pwm3_function,
&ssp1_function,
&ssp2_function,
&mii2_function,
&mii0_1_function,
&i2c1_function,
&i2c2_function,
};
static struct of_device_id spear320_pinctrl_of_match[] __devinitdata = {
{
.compatible = "st,spear320-pinmux",
},
{},
};
static int __devinit spear320_pinctrl_probe(struct platform_device *pdev)
{
int ret;
spear3xx_machdata.groups = spear320_pingroups;
spear3xx_machdata.ngroups = ARRAY_SIZE(spear320_pingroups);
spear3xx_machdata.functions = spear320_functions;
spear3xx_machdata.nfunctions = ARRAY_SIZE(spear320_functions);
spear3xx_machdata.modes_supported = true;
spear3xx_machdata.pmx_modes = spear320_pmx_modes;
spear3xx_machdata.npmx_modes = ARRAY_SIZE(spear320_pmx_modes);
pmx_init_addr(&spear3xx_machdata, PMX_CONFIG_REG);
ret = spear_pinctrl_probe(pdev, &spear3xx_machdata);
if (ret)
return ret;
return 0;
}
static int __devexit spear320_pinctrl_remove(struct platform_device *pdev)
{
return spear_pinctrl_remove(pdev);
}
static struct platform_driver spear320_pinctrl_driver = {
.driver = {
.name = DRIVER_NAME,
.owner = THIS_MODULE,
.of_match_table = spear320_pinctrl_of_match,
},
.probe = spear320_pinctrl_probe,
.remove = __devexit_p(spear320_pinctrl_remove),
};
static int __init spear320_pinctrl_init(void)
{
return platform_driver_register(&spear320_pinctrl_driver);
}
arch_initcall(spear320_pinctrl_init);
static void __exit spear320_pinctrl_exit(void)
{
platform_driver_unregister(&spear320_pinctrl_driver);
}
module_exit(spear320_pinctrl_exit);
MODULE_AUTHOR("Viresh Kumar <viresh.kumar@st.com>");
MODULE_DESCRIPTION("ST Microelectronics SPEAr320 pinctrl driver");
MODULE_LICENSE("GPL v2");
MODULE_DEVICE_TABLE(of, spear320_pinctrl_of_match);
/*
* Driver for the ST Microelectronics SPEAr3xx pinmux
*
* Copyright (C) 2012 ST Microelectronics
* Viresh Kumar <viresh.kumar@st.com>
*
* This file is licensed under the terms of the GNU General Public
* License version 2. This program is licensed "as is" without any
* warranty of any kind, whether express or implied.
*/
#include <linux/pinctrl/pinctrl.h>
#include "pinctrl-spear3xx.h"
/* pins */
static const struct pinctrl_pin_desc spear3xx_pins[] = {
PINCTRL_PIN(0, "PLGPIO0"),
PINCTRL_PIN(1, "PLGPIO1"),
PINCTRL_PIN(2, "PLGPIO2"),
PINCTRL_PIN(3, "PLGPIO3"),
PINCTRL_PIN(4, "PLGPIO4"),
PINCTRL_PIN(5, "PLGPIO5"),
PINCTRL_PIN(6, "PLGPIO6"),
PINCTRL_PIN(7, "PLGPIO7"),
PINCTRL_PIN(8, "PLGPIO8"),
PINCTRL_PIN(9, "PLGPIO9"),
PINCTRL_PIN(10, "PLGPIO10"),
PINCTRL_PIN(11, "PLGPIO11"),
PINCTRL_PIN(12, "PLGPIO12"),
PINCTRL_PIN(13, "PLGPIO13"),
PINCTRL_PIN(14, "PLGPIO14"),
PINCTRL_PIN(15, "PLGPIO15"),
PINCTRL_PIN(16, "PLGPIO16"),
PINCTRL_PIN(17, "PLGPIO17"),
PINCTRL_PIN(18, "PLGPIO18"),
PINCTRL_PIN(19, "PLGPIO19"),
PINCTRL_PIN(20, "PLGPIO20"),
PINCTRL_PIN(21, "PLGPIO21"),
PINCTRL_PIN(22, "PLGPIO22"),
PINCTRL_PIN(23, "PLGPIO23"),
PINCTRL_PIN(24, "PLGPIO24"),
PINCTRL_PIN(25, "PLGPIO25"),
PINCTRL_PIN(26, "PLGPIO26"),
PINCTRL_PIN(27, "PLGPIO27"),
PINCTRL_PIN(28, "PLGPIO28"),
PINCTRL_PIN(29, "PLGPIO29"),
PINCTRL_PIN(30, "PLGPIO30"),
PINCTRL_PIN(31, "PLGPIO31"),
PINCTRL_PIN(32, "PLGPIO32"),
PINCTRL_PIN(33, "PLGPIO33"),
PINCTRL_PIN(34, "PLGPIO34"),
PINCTRL_PIN(35, "PLGPIO35"),
PINCTRL_PIN(36, "PLGPIO36"),
PINCTRL_PIN(37, "PLGPIO37"),
PINCTRL_PIN(38, "PLGPIO38"),
PINCTRL_PIN(39, "PLGPIO39"),
PINCTRL_PIN(40, "PLGPIO40"),
PINCTRL_PIN(41, "PLGPIO41"),
PINCTRL_PIN(42, "PLGPIO42"),
PINCTRL_PIN(43, "PLGPIO43"),
PINCTRL_PIN(44, "PLGPIO44"),
PINCTRL_PIN(45, "PLGPIO45"),
PINCTRL_PIN(46, "PLGPIO46"),
PINCTRL_PIN(47, "PLGPIO47"),
PINCTRL_PIN(48, "PLGPIO48"),
PINCTRL_PIN(49, "PLGPIO49"),
PINCTRL_PIN(50, "PLGPIO50"),
PINCTRL_PIN(51, "PLGPIO51"),
PINCTRL_PIN(52, "PLGPIO52"),
PINCTRL_PIN(53, "PLGPIO53"),
PINCTRL_PIN(54, "PLGPIO54"),
PINCTRL_PIN(55, "PLGPIO55"),
PINCTRL_PIN(56, "PLGPIO56"),
PINCTRL_PIN(57, "PLGPIO57"),
PINCTRL_PIN(58, "PLGPIO58"),
PINCTRL_PIN(59, "PLGPIO59"),
PINCTRL_PIN(60, "PLGPIO60"),
PINCTRL_PIN(61, "PLGPIO61"),
PINCTRL_PIN(62, "PLGPIO62"),
PINCTRL_PIN(63, "PLGPIO63"),
PINCTRL_PIN(64, "PLGPIO64"),
PINCTRL_PIN(65, "PLGPIO65"),
PINCTRL_PIN(66, "PLGPIO66"),
PINCTRL_PIN(67, "PLGPIO67"),
PINCTRL_PIN(68, "PLGPIO68"),
PINCTRL_PIN(69, "PLGPIO69"),
PINCTRL_PIN(70, "PLGPIO70"),
PINCTRL_PIN(71, "PLGPIO71"),
PINCTRL_PIN(72, "PLGPIO72"),
PINCTRL_PIN(73, "PLGPIO73"),
PINCTRL_PIN(74, "PLGPIO74"),
PINCTRL_PIN(75, "PLGPIO75"),
PINCTRL_PIN(76, "PLGPIO76"),
PINCTRL_PIN(77, "PLGPIO77"),
PINCTRL_PIN(78, "PLGPIO78"),
PINCTRL_PIN(79, "PLGPIO79"),
PINCTRL_PIN(80, "PLGPIO80"),
PINCTRL_PIN(81, "PLGPIO81"),
PINCTRL_PIN(82, "PLGPIO82"),
PINCTRL_PIN(83, "PLGPIO83"),
PINCTRL_PIN(84, "PLGPIO84"),
PINCTRL_PIN(85, "PLGPIO85"),
PINCTRL_PIN(86, "PLGPIO86"),
PINCTRL_PIN(87, "PLGPIO87"),
PINCTRL_PIN(88, "PLGPIO88"),
PINCTRL_PIN(89, "PLGPIO89"),
PINCTRL_PIN(90, "PLGPIO90"),
PINCTRL_PIN(91, "PLGPIO91"),
PINCTRL_PIN(92, "PLGPIO92"),
PINCTRL_PIN(93, "PLGPIO93"),
PINCTRL_PIN(94, "PLGPIO94"),
PINCTRL_PIN(95, "PLGPIO95"),
PINCTRL_PIN(96, "PLGPIO96"),
PINCTRL_PIN(97, "PLGPIO97"),
PINCTRL_PIN(98, "PLGPIO98"),
PINCTRL_PIN(99, "PLGPIO99"),
PINCTRL_PIN(100, "PLGPIO100"),
PINCTRL_PIN(101, "PLGPIO101"),
};
/* firda_pins */
static const unsigned firda_pins[] = { 0, 1 };
static struct spear_muxreg firda_muxreg[] = {
{
.reg = -1,
.mask = PMX_FIRDA_MASK,
.val = PMX_FIRDA_MASK,
},
};
static struct spear_modemux firda_modemux[] = {
{
.modes = ~0,
.muxregs = firda_muxreg,
.nmuxregs = ARRAY_SIZE(firda_muxreg),
},
};
struct spear_pingroup spear3xx_firda_pingroup = {
.name = "firda_grp",
.pins = firda_pins,
.npins = ARRAY_SIZE(firda_pins),
.modemuxs = firda_modemux,
.nmodemuxs = ARRAY_SIZE(firda_modemux),
};
static const char *const firda_grps[] = { "firda_grp" };
struct spear_function spear3xx_firda_function = {
.name = "firda",
.groups = firda_grps,
.ngroups = ARRAY_SIZE(firda_grps),
};
/* i2c_pins */
static const unsigned i2c_pins[] = { 4, 5 };
static struct spear_muxreg i2c_muxreg[] = {
{
.reg = -1,
.mask = PMX_I2C_MASK,
.val = PMX_I2C_MASK,
},
};
static struct spear_modemux i2c_modemux[] = {
{
.modes = ~0,
.muxregs = i2c_muxreg,
.nmuxregs = ARRAY_SIZE(i2c_muxreg),
},
};
struct spear_pingroup spear3xx_i2c_pingroup = {
.name = "i2c0_grp",
.pins = i2c_pins,
.npins = ARRAY_SIZE(i2c_pins),
.modemuxs = i2c_modemux,
.nmodemuxs = ARRAY_SIZE(i2c_modemux),
};
static const char *const i2c_grps[] = { "i2c0_grp" };
struct spear_function spear3xx_i2c_function = {
.name = "i2c0",
.groups = i2c_grps,
.ngroups = ARRAY_SIZE(i2c_grps),
};
/* ssp_cs_pins */
static const unsigned ssp_cs_pins[] = { 34, 35, 36 };
static struct spear_muxreg ssp_cs_muxreg[] = {
{
.reg = -1,
.mask = PMX_SSP_CS_MASK,
.val = PMX_SSP_CS_MASK,
},
};
static struct spear_modemux ssp_cs_modemux[] = {
{
.modes = ~0,
.muxregs = ssp_cs_muxreg,
.nmuxregs = ARRAY_SIZE(ssp_cs_muxreg),
},
};
struct spear_pingroup spear3xx_ssp_cs_pingroup = {
.name = "ssp_cs_grp",
.pins = ssp_cs_pins,
.npins = ARRAY_SIZE(ssp_cs_pins),
.modemuxs = ssp_cs_modemux,
.nmodemuxs = ARRAY_SIZE(ssp_cs_modemux),
};
static const char *const ssp_cs_grps[] = { "ssp_cs_grp" };
struct spear_function spear3xx_ssp_cs_function = {
.name = "ssp_cs",
.groups = ssp_cs_grps,
.ngroups = ARRAY_SIZE(ssp_cs_grps),
};
/* ssp_pins */
static const unsigned ssp_pins[] = { 6, 7, 8, 9 };
static struct spear_muxreg ssp_muxreg[] = {
{
.reg = -1,
.mask = PMX_SSP_MASK,
.val = PMX_SSP_MASK,
},
};
static struct spear_modemux ssp_modemux[] = {
{
.modes = ~0,
.muxregs = ssp_muxreg,
.nmuxregs = ARRAY_SIZE(ssp_muxreg),
},
};
struct spear_pingroup spear3xx_ssp_pingroup = {
.name = "ssp0_grp",
.pins = ssp_pins,
.npins = ARRAY_SIZE(ssp_pins),
.modemuxs = ssp_modemux,
.nmodemuxs = ARRAY_SIZE(ssp_modemux),
};
static const char *const ssp_grps[] = { "ssp0_grp" };
struct spear_function spear3xx_ssp_function = {
.name = "ssp0",
.groups = ssp_grps,
.ngroups = ARRAY_SIZE(ssp_grps),
};
/* mii_pins */
static const unsigned mii_pins[] = { 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
21, 22, 23, 24, 25, 26, 27 };
static struct spear_muxreg mii_muxreg[] = {
{
.reg = -1,
.mask = PMX_MII_MASK,
.val = PMX_MII_MASK,
},
};
static struct spear_modemux mii_modemux[] = {
{
.modes = ~0,
.muxregs = mii_muxreg,
.nmuxregs = ARRAY_SIZE(mii_muxreg),
},
};
struct spear_pingroup spear3xx_mii_pingroup = {
.name = "mii0_grp",
.pins = mii_pins,
.npins = ARRAY_SIZE(mii_pins),
.modemuxs = mii_modemux,
.nmodemuxs = ARRAY_SIZE(mii_modemux),
};
static const char *const mii_grps[] = { "mii0_grp" };
struct spear_function spear3xx_mii_function = {
.name = "mii0",
.groups = mii_grps,
.ngroups = ARRAY_SIZE(mii_grps),
};
/* gpio0_pin0_pins */
static const unsigned gpio0_pin0_pins[] = { 28 };
static struct spear_muxreg gpio0_pin0_muxreg[] = {
{
.reg = -1,
.mask = PMX_GPIO_PIN0_MASK,
.val = PMX_GPIO_PIN0_MASK,
},
};
static struct spear_modemux gpio0_pin0_modemux[] = {
{
.modes = ~0,
.muxregs = gpio0_pin0_muxreg,
.nmuxregs = ARRAY_SIZE(gpio0_pin0_muxreg),
},
};
struct spear_pingroup spear3xx_gpio0_pin0_pingroup = {
.name = "gpio0_pin0_grp",
.pins = gpio0_pin0_pins,
.npins = ARRAY_SIZE(gpio0_pin0_pins),
.modemuxs = gpio0_pin0_modemux,
.nmodemuxs = ARRAY_SIZE(gpio0_pin0_modemux),
};
/* gpio0_pin1_pins */
static const unsigned gpio0_pin1_pins[] = { 29 };
static struct spear_muxreg gpio0_pin1_muxreg[] = {
{
.reg = -1,
.mask = PMX_GPIO_PIN1_MASK,
.val = PMX_GPIO_PIN1_MASK,
},
};
static struct spear_modemux gpio0_pin1_modemux[] = {
{
.modes = ~0,
.muxregs = gpio0_pin1_muxreg,
.nmuxregs = ARRAY_SIZE(gpio0_pin1_muxreg),
},
};
struct spear_pingroup spear3xx_gpio0_pin1_pingroup = {
.name = "gpio0_pin1_grp",
.pins = gpio0_pin1_pins,
.npins = ARRAY_SIZE(gpio0_pin1_pins),
.modemuxs = gpio0_pin1_modemux,
.nmodemuxs = ARRAY_SIZE(gpio0_pin1_modemux),
};
/* gpio0_pin2_pins */
static const unsigned gpio0_pin2_pins[] = { 30 };
static struct spear_muxreg gpio0_pin2_muxreg[] = {
{
.reg = -1,
.mask = PMX_GPIO_PIN2_MASK,
.val = PMX_GPIO_PIN2_MASK,
},
};
static struct spear_modemux gpio0_pin2_modemux[] = {
{
.modes = ~0,
.muxregs = gpio0_pin2_muxreg,
.nmuxregs = ARRAY_SIZE(gpio0_pin2_muxreg),
},
};
struct spear_pingroup spear3xx_gpio0_pin2_pingroup = {
.name = "gpio0_pin2_grp",
.pins = gpio0_pin2_pins,
.npins = ARRAY_SIZE(gpio0_pin2_pins),
.modemuxs = gpio0_pin2_modemux,
.nmodemuxs = ARRAY_SIZE(gpio0_pin2_modemux),
};
/* gpio0_pin3_pins */
static const unsigned gpio0_pin3_pins[] = { 31 };
static struct spear_muxreg gpio0_pin3_muxreg[] = {
{
.reg = -1,
.mask = PMX_GPIO_PIN3_MASK,
.val = PMX_GPIO_PIN3_MASK,
},
};
static struct spear_modemux gpio0_pin3_modemux[] = {
{
.modes = ~0,
.muxregs = gpio0_pin3_muxreg,
.nmuxregs = ARRAY_SIZE(gpio0_pin3_muxreg),
},
};
struct spear_pingroup spear3xx_gpio0_pin3_pingroup = {
.name = "gpio0_pin3_grp",
.pins = gpio0_pin3_pins,
.npins = ARRAY_SIZE(gpio0_pin3_pins),
.modemuxs = gpio0_pin3_modemux,
.nmodemuxs = ARRAY_SIZE(gpio0_pin3_modemux),
};
/* gpio0_pin4_pins */
static const unsigned gpio0_pin4_pins[] = { 32 };
static struct spear_muxreg gpio0_pin4_muxreg[] = {
{
.reg = -1,
.mask = PMX_GPIO_PIN4_MASK,
.val = PMX_GPIO_PIN4_MASK,
},
};
static struct spear_modemux gpio0_pin4_modemux[] = {
{
.modes = ~0,
.muxregs = gpio0_pin4_muxreg,
.nmuxregs = ARRAY_SIZE(gpio0_pin4_muxreg),
},
};
struct spear_pingroup spear3xx_gpio0_pin4_pingroup = {
.name = "gpio0_pin4_grp",
.pins = gpio0_pin4_pins,
.npins = ARRAY_SIZE(gpio0_pin4_pins),
.modemuxs = gpio0_pin4_modemux,
.nmodemuxs = ARRAY_SIZE(gpio0_pin4_modemux),
};
/* gpio0_pin5_pins */
static const unsigned gpio0_pin5_pins[] = { 33 };
static struct spear_muxreg gpio0_pin5_muxreg[] = {
{
.reg = -1,
.mask = PMX_GPIO_PIN5_MASK,
.val = PMX_GPIO_PIN5_MASK,
},
};
static struct spear_modemux gpio0_pin5_modemux[] = {
{
.modes = ~0,
.muxregs = gpio0_pin5_muxreg,
.nmuxregs = ARRAY_SIZE(gpio0_pin5_muxreg),
},
};
struct spear_pingroup spear3xx_gpio0_pin5_pingroup = {
.name = "gpio0_pin5_grp",
.pins = gpio0_pin5_pins,
.npins = ARRAY_SIZE(gpio0_pin5_pins),
.modemuxs = gpio0_pin5_modemux,
.nmodemuxs = ARRAY_SIZE(gpio0_pin5_modemux),
};
static const char *const gpio0_grps[] = { "gpio0_pin0_grp", "gpio0_pin1_grp",
"gpio0_pin2_grp", "gpio0_pin3_grp", "gpio0_pin4_grp", "gpio0_pin5_grp",
};
struct spear_function spear3xx_gpio0_function = {
.name = "gpio0",
.groups = gpio0_grps,
.ngroups = ARRAY_SIZE(gpio0_grps),
};
/* uart0_ext_pins */
static const unsigned uart0_ext_pins[] = { 37, 38, 39, 40, 41, 42 };
static struct spear_muxreg uart0_ext_muxreg[] = {
{
.reg = -1,
.mask = PMX_UART0_MODEM_MASK,
.val = PMX_UART0_MODEM_MASK,
},
};
static struct spear_modemux uart0_ext_modemux[] = {
{
.modes = ~0,
.muxregs = uart0_ext_muxreg,
.nmuxregs = ARRAY_SIZE(uart0_ext_muxreg),
},
};
struct spear_pingroup spear3xx_uart0_ext_pingroup = {
.name = "uart0_ext_grp",
.pins = uart0_ext_pins,
.npins = ARRAY_SIZE(uart0_ext_pins),
.modemuxs = uart0_ext_modemux,
.nmodemuxs = ARRAY_SIZE(uart0_ext_modemux),
};
static const char *const uart0_ext_grps[] = { "uart0_ext_grp" };
struct spear_function spear3xx_uart0_ext_function = {
.name = "uart0_ext",
.groups = uart0_ext_grps,
.ngroups = ARRAY_SIZE(uart0_ext_grps),
};
/* uart0_pins */
static const unsigned uart0_pins[] = { 2, 3 };
static struct spear_muxreg uart0_muxreg[] = {
{
.reg = -1,
.mask = PMX_UART0_MASK,
.val = PMX_UART0_MASK,
},
};
static struct spear_modemux uart0_modemux[] = {
{
.modes = ~0,
.muxregs = uart0_muxreg,
.nmuxregs = ARRAY_SIZE(uart0_muxreg),
},
};
struct spear_pingroup spear3xx_uart0_pingroup = {
.name = "uart0_grp",
.pins = uart0_pins,
.npins = ARRAY_SIZE(uart0_pins),
.modemuxs = uart0_modemux,
.nmodemuxs = ARRAY_SIZE(uart0_modemux),
};
static const char *const uart0_grps[] = { "uart0_grp" };
struct spear_function spear3xx_uart0_function = {
.name = "uart0",
.groups = uart0_grps,
.ngroups = ARRAY_SIZE(uart0_grps),
};
/* timer_0_1_pins */
static const unsigned timer_0_1_pins[] = { 43, 44, 47, 48 };
static struct spear_muxreg timer_0_1_muxreg[] = {
{
.reg = -1,
.mask = PMX_TIMER_0_1_MASK,
.val = PMX_TIMER_0_1_MASK,
},
};
static struct spear_modemux timer_0_1_modemux[] = {
{
.modes = ~0,
.muxregs = timer_0_1_muxreg,
.nmuxregs = ARRAY_SIZE(timer_0_1_muxreg),
},
};
struct spear_pingroup spear3xx_timer_0_1_pingroup = {
.name = "timer_0_1_grp",
.pins = timer_0_1_pins,
.npins = ARRAY_SIZE(timer_0_1_pins),
.modemuxs = timer_0_1_modemux,
.nmodemuxs = ARRAY_SIZE(timer_0_1_modemux),
};
static const char *const timer_0_1_grps[] = { "timer_0_1_grp" };
struct spear_function spear3xx_timer_0_1_function = {
.name = "timer_0_1",
.groups = timer_0_1_grps,
.ngroups = ARRAY_SIZE(timer_0_1_grps),
};
/* timer_2_3_pins */
static const unsigned timer_2_3_pins[] = { 45, 46, 49, 50 };
static struct spear_muxreg timer_2_3_muxreg[] = {
{
.reg = -1,
.mask = PMX_TIMER_2_3_MASK,
.val = PMX_TIMER_2_3_MASK,
},
};
static struct spear_modemux timer_2_3_modemux[] = {
{
.modes = ~0,
.muxregs = timer_2_3_muxreg,
.nmuxregs = ARRAY_SIZE(timer_2_3_muxreg),
},
};
struct spear_pingroup spear3xx_timer_2_3_pingroup = {
.name = "timer_2_3_grp",
.pins = timer_2_3_pins,
.npins = ARRAY_SIZE(timer_2_3_pins),
.modemuxs = timer_2_3_modemux,
.nmodemuxs = ARRAY_SIZE(timer_2_3_modemux),
};
static const char *const timer_2_3_grps[] = { "timer_2_3_grp" };
struct spear_function spear3xx_timer_2_3_function = {
.name = "timer_2_3",
.groups = timer_2_3_grps,
.ngroups = ARRAY_SIZE(timer_2_3_grps),
};
struct spear_pinctrl_machdata spear3xx_machdata = {
.pins = spear3xx_pins,
.npins = ARRAY_SIZE(spear3xx_pins),
};
/*
* Header file for the ST Microelectronics SPEAr3xx pinmux
*
* Copyright (C) 2012 ST Microelectronics
* Viresh Kumar <viresh.kumar@st.com>
*
* This file is licensed under the terms of the GNU General Public
* License version 2. This program is licensed "as is" without any
* warranty of any kind, whether express or implied.
*/
#ifndef __PINMUX_SPEAR3XX_H__
#define __PINMUX_SPEAR3XX_H__
#include "pinctrl-spear.h"
/* pad mux declarations */
#define PMX_FIRDA_MASK (1 << 14)
#define PMX_I2C_MASK (1 << 13)
#define PMX_SSP_CS_MASK (1 << 12)
#define PMX_SSP_MASK (1 << 11)
#define PMX_MII_MASK (1 << 10)
#define PMX_GPIO_PIN0_MASK (1 << 9)
#define PMX_GPIO_PIN1_MASK (1 << 8)
#define PMX_GPIO_PIN2_MASK (1 << 7)
#define PMX_GPIO_PIN3_MASK (1 << 6)
#define PMX_GPIO_PIN4_MASK (1 << 5)
#define PMX_GPIO_PIN5_MASK (1 << 4)
#define PMX_UART0_MODEM_MASK (1 << 3)
#define PMX_UART0_MASK (1 << 2)
#define PMX_TIMER_2_3_MASK (1 << 1)
#define PMX_TIMER_0_1_MASK (1 << 0)
extern struct spear_pingroup spear3xx_firda_pingroup;
extern struct spear_pingroup spear3xx_gpio0_pin0_pingroup;
extern struct spear_pingroup spear3xx_gpio0_pin1_pingroup;
extern struct spear_pingroup spear3xx_gpio0_pin2_pingroup;
extern struct spear_pingroup spear3xx_gpio0_pin3_pingroup;
extern struct spear_pingroup spear3xx_gpio0_pin4_pingroup;
extern struct spear_pingroup spear3xx_gpio0_pin5_pingroup;
extern struct spear_pingroup spear3xx_i2c_pingroup;
extern struct spear_pingroup spear3xx_mii_pingroup;
extern struct spear_pingroup spear3xx_ssp_cs_pingroup;
extern struct spear_pingroup spear3xx_ssp_pingroup;
extern struct spear_pingroup spear3xx_timer_0_1_pingroup;
extern struct spear_pingroup spear3xx_timer_2_3_pingroup;
extern struct spear_pingroup spear3xx_uart0_ext_pingroup;
extern struct spear_pingroup spear3xx_uart0_pingroup;
#define SPEAR3XX_COMMON_PINGROUPS \
&spear3xx_firda_pingroup, \
&spear3xx_gpio0_pin0_pingroup, \
&spear3xx_gpio0_pin1_pingroup, \
&spear3xx_gpio0_pin2_pingroup, \
&spear3xx_gpio0_pin3_pingroup, \
&spear3xx_gpio0_pin4_pingroup, \
&spear3xx_gpio0_pin5_pingroup, \
&spear3xx_i2c_pingroup, \
&spear3xx_mii_pingroup, \
&spear3xx_ssp_cs_pingroup, \
&spear3xx_ssp_pingroup, \
&spear3xx_timer_0_1_pingroup, \
&spear3xx_timer_2_3_pingroup, \
&spear3xx_uart0_ext_pingroup, \
&spear3xx_uart0_pingroup
extern struct spear_function spear3xx_firda_function;
extern struct spear_function spear3xx_gpio0_function;
extern struct spear_function spear3xx_i2c_function;
extern struct spear_function spear3xx_mii_function;
extern struct spear_function spear3xx_ssp_cs_function;
extern struct spear_function spear3xx_ssp_function;
extern struct spear_function spear3xx_timer_0_1_function;
extern struct spear_function spear3xx_timer_2_3_function;
extern struct spear_function spear3xx_uart0_ext_function;
extern struct spear_function spear3xx_uart0_function;
#define SPEAR3XX_COMMON_FUNCTIONS \
&spear3xx_firda_function, \
&spear3xx_gpio0_function, \
&spear3xx_i2c_function, \
&spear3xx_mii_function, \
&spear3xx_ssp_cs_function, \
&spear3xx_ssp_function, \
&spear3xx_timer_0_1_function, \
&spear3xx_timer_2_3_function, \
&spear3xx_uart0_ext_function, \
&spear3xx_uart0_function
extern struct spear_pinctrl_machdata spear3xx_machdata;
#endif /* __PINMUX_SPEAR3XX_H__ */
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment