cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

pinctrl-dove.c (28774B)


      1// SPDX-License-Identifier: GPL-2.0-or-later
      2/*
      3 * Marvell Dove pinctrl driver based on mvebu pinctrl core
      4 *
      5 * Author: Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com>
      6 */
      7
      8#include <linux/err.h>
      9#include <linux/init.h>
     10#include <linux/io.h>
     11#include <linux/bitops.h>
     12#include <linux/platform_device.h>
     13#include <linux/clk.h>
     14#include <linux/of.h>
     15#include <linux/of_device.h>
     16#include <linux/mfd/syscon.h>
     17#include <linux/pinctrl/pinctrl.h>
     18#include <linux/regmap.h>
     19
     20#include "pinctrl-mvebu.h"
     21
     22/* Internal registers can be configured at any 1 MiB aligned address */
     23#define INT_REGS_MASK		~(SZ_1M - 1)
     24#define MPP4_REGS_OFFS		0xd0440
     25#define PMU_REGS_OFFS		0xd802c
     26#define GC_REGS_OFFS		0xe802c
     27
     28/* MPP Base registers */
     29#define PMU_MPP_GENERAL_CTRL	0x10
     30#define  AU0_AC97_SEL		BIT(16)
     31
     32/* MPP Control 4 register */
     33#define SPI_GPIO_SEL		BIT(5)
     34#define UART1_GPIO_SEL		BIT(4)
     35#define AU1_GPIO_SEL		BIT(3)
     36#define CAM_GPIO_SEL		BIT(2)
     37#define SD1_GPIO_SEL		BIT(1)
     38#define SD0_GPIO_SEL		BIT(0)
     39
     40/* PMU Signal Select registers */
     41#define PMU_SIGNAL_SELECT_0	0x00
     42#define PMU_SIGNAL_SELECT_1	0x04
     43
     44/* Global Config regmap registers */
     45#define GLOBAL_CONFIG_1		0x00
     46#define  TWSI_ENABLE_OPTION1	BIT(7)
     47#define GLOBAL_CONFIG_2		0x04
     48#define  TWSI_ENABLE_OPTION2	BIT(20)
     49#define  TWSI_ENABLE_OPTION3	BIT(21)
     50#define  TWSI_OPTION3_GPIO	BIT(22)
     51#define SSP_CTRL_STATUS_1	0x08
     52#define  SSP_ON_AU1		BIT(0)
     53#define MPP_GENERAL_CONFIG	0x10
     54#define  AU1_SPDIFO_GPIO_EN	BIT(1)
     55#define  NAND_GPIO_EN		BIT(0)
     56
     57#define CONFIG_PMU	BIT(4)
     58
     59static void __iomem *mpp4_base;
     60static void __iomem *pmu_base;
     61static struct regmap *gconfmap;
     62
     63static int dove_pmu_mpp_ctrl_get(struct mvebu_mpp_ctrl_data *data,
     64				 unsigned pid, unsigned long *config)
     65{
     66	unsigned off = (pid / MVEBU_MPPS_PER_REG) * MVEBU_MPP_BITS;
     67	unsigned shift = (pid % MVEBU_MPPS_PER_REG) * MVEBU_MPP_BITS;
     68	unsigned long pmu = readl(data->base + PMU_MPP_GENERAL_CTRL);
     69	unsigned long func;
     70
     71	if ((pmu & BIT(pid)) == 0)
     72		return mvebu_mmio_mpp_ctrl_get(data, pid, config);
     73
     74	func = readl(pmu_base + PMU_SIGNAL_SELECT_0 + off);
     75	*config = (func >> shift) & MVEBU_MPP_MASK;
     76	*config |= CONFIG_PMU;
     77
     78	return 0;
     79}
     80
     81static int dove_pmu_mpp_ctrl_set(struct mvebu_mpp_ctrl_data *data,
     82				 unsigned pid, unsigned long config)
     83{
     84	unsigned off = (pid / MVEBU_MPPS_PER_REG) * MVEBU_MPP_BITS;
     85	unsigned shift = (pid % MVEBU_MPPS_PER_REG) * MVEBU_MPP_BITS;
     86	unsigned long pmu = readl(data->base + PMU_MPP_GENERAL_CTRL);
     87	unsigned long func;
     88
     89	if ((config & CONFIG_PMU) == 0) {
     90		writel(pmu & ~BIT(pid), data->base + PMU_MPP_GENERAL_CTRL);
     91		return mvebu_mmio_mpp_ctrl_set(data, pid, config);
     92	}
     93
     94	writel(pmu | BIT(pid), data->base + PMU_MPP_GENERAL_CTRL);
     95	func = readl(pmu_base + PMU_SIGNAL_SELECT_0 + off);
     96	func &= ~(MVEBU_MPP_MASK << shift);
     97	func |= (config & MVEBU_MPP_MASK) << shift;
     98	writel(func, pmu_base + PMU_SIGNAL_SELECT_0 + off);
     99
    100	return 0;
    101}
    102
    103static int dove_mpp4_ctrl_get(struct mvebu_mpp_ctrl_data *data, unsigned pid,
    104			      unsigned long *config)
    105{
    106	unsigned long mpp4 = readl(mpp4_base);
    107	unsigned long mask;
    108
    109	switch (pid) {
    110	case 24: /* mpp_camera */
    111		mask = CAM_GPIO_SEL;
    112		break;
    113	case 40: /* mpp_sdio0 */
    114		mask = SD0_GPIO_SEL;
    115		break;
    116	case 46: /* mpp_sdio1 */
    117		mask = SD1_GPIO_SEL;
    118		break;
    119	case 58: /* mpp_spi0 */
    120		mask = SPI_GPIO_SEL;
    121		break;
    122	case 62: /* mpp_uart1 */
    123		mask = UART1_GPIO_SEL;
    124		break;
    125	default:
    126		return -EINVAL;
    127	}
    128
    129	*config = ((mpp4 & mask) != 0);
    130
    131	return 0;
    132}
    133
    134static int dove_mpp4_ctrl_set(struct mvebu_mpp_ctrl_data *data, unsigned pid,
    135			      unsigned long config)
    136{
    137	unsigned long mpp4 = readl(mpp4_base);
    138	unsigned long mask;
    139
    140	switch (pid) {
    141	case 24: /* mpp_camera */
    142		mask = CAM_GPIO_SEL;
    143		break;
    144	case 40: /* mpp_sdio0 */
    145		mask = SD0_GPIO_SEL;
    146		break;
    147	case 46: /* mpp_sdio1 */
    148		mask = SD1_GPIO_SEL;
    149		break;
    150	case 58: /* mpp_spi0 */
    151		mask = SPI_GPIO_SEL;
    152		break;
    153	case 62: /* mpp_uart1 */
    154		mask = UART1_GPIO_SEL;
    155		break;
    156	default:
    157		return -EINVAL;
    158	}
    159
    160	mpp4 &= ~mask;
    161	if (config)
    162		mpp4 |= mask;
    163
    164	writel(mpp4, mpp4_base);
    165
    166	return 0;
    167}
    168
    169static int dove_nand_ctrl_get(struct mvebu_mpp_ctrl_data *data, unsigned pid,
    170			      unsigned long *config)
    171{
    172	unsigned int gmpp;
    173
    174	regmap_read(gconfmap, MPP_GENERAL_CONFIG, &gmpp);
    175	*config = ((gmpp & NAND_GPIO_EN) != 0);
    176
    177	return 0;
    178}
    179
    180static int dove_nand_ctrl_set(struct mvebu_mpp_ctrl_data *data, unsigned pid,
    181			      unsigned long config)
    182{
    183	regmap_update_bits(gconfmap, MPP_GENERAL_CONFIG,
    184			   NAND_GPIO_EN,
    185			   (config) ? NAND_GPIO_EN : 0);
    186	return 0;
    187}
    188
    189static int dove_audio0_ctrl_get(struct mvebu_mpp_ctrl_data *data, unsigned pid,
    190				unsigned long *config)
    191{
    192	unsigned long pmu = readl(data->base + PMU_MPP_GENERAL_CTRL);
    193
    194	*config = ((pmu & AU0_AC97_SEL) != 0);
    195
    196	return 0;
    197}
    198
    199static int dove_audio0_ctrl_set(struct mvebu_mpp_ctrl_data *data, unsigned pid,
    200				unsigned long config)
    201{
    202	unsigned long pmu = readl(data->base + PMU_MPP_GENERAL_CTRL);
    203
    204	pmu &= ~AU0_AC97_SEL;
    205	if (config)
    206		pmu |= AU0_AC97_SEL;
    207	writel(pmu, data->base + PMU_MPP_GENERAL_CTRL);
    208
    209	return 0;
    210}
    211
    212static int dove_audio1_ctrl_get(struct mvebu_mpp_ctrl_data *data, unsigned pid,
    213				unsigned long *config)
    214{
    215	unsigned int mpp4 = readl(mpp4_base);
    216	unsigned int sspc1;
    217	unsigned int gmpp;
    218	unsigned int gcfg2;
    219
    220	regmap_read(gconfmap, SSP_CTRL_STATUS_1, &sspc1);
    221	regmap_read(gconfmap, MPP_GENERAL_CONFIG, &gmpp);
    222	regmap_read(gconfmap, GLOBAL_CONFIG_2, &gcfg2);
    223
    224	*config = 0;
    225	if (mpp4 & AU1_GPIO_SEL)
    226		*config |= BIT(3);
    227	if (sspc1 & SSP_ON_AU1)
    228		*config |= BIT(2);
    229	if (gmpp & AU1_SPDIFO_GPIO_EN)
    230		*config |= BIT(1);
    231	if (gcfg2 & TWSI_OPTION3_GPIO)
    232		*config |= BIT(0);
    233
    234	/* SSP/TWSI only if I2S1 not set*/
    235	if ((*config & BIT(3)) == 0)
    236		*config &= ~(BIT(2) | BIT(0));
    237	/* TWSI only if SPDIFO not set*/
    238	if ((*config & BIT(1)) == 0)
    239		*config &= ~BIT(0);
    240	return 0;
    241}
    242
    243static int dove_audio1_ctrl_set(struct mvebu_mpp_ctrl_data *data, unsigned pid,
    244				unsigned long config)
    245{
    246	unsigned int mpp4 = readl(mpp4_base);
    247
    248	mpp4 &= ~AU1_GPIO_SEL;
    249	if (config & BIT(3))
    250		mpp4 |= AU1_GPIO_SEL;
    251	writel(mpp4, mpp4_base);
    252
    253	regmap_update_bits(gconfmap, SSP_CTRL_STATUS_1,
    254			   SSP_ON_AU1,
    255			   (config & BIT(2)) ? SSP_ON_AU1 : 0);
    256	regmap_update_bits(gconfmap, MPP_GENERAL_CONFIG,
    257			   AU1_SPDIFO_GPIO_EN,
    258			   (config & BIT(1)) ? AU1_SPDIFO_GPIO_EN : 0);
    259	regmap_update_bits(gconfmap, GLOBAL_CONFIG_2,
    260			   TWSI_OPTION3_GPIO,
    261			   (config & BIT(0)) ? TWSI_OPTION3_GPIO : 0);
    262
    263	return 0;
    264}
    265
    266/* mpp[52:57] gpio pins depend heavily on current config;
    267 * gpio_req does not try to mux in gpio capabilities to not
    268 * break other functions. If you require all mpps as gpio
    269 * enforce gpio setting by pinctrl mapping.
    270 */
    271static int dove_audio1_ctrl_gpio_req(struct mvebu_mpp_ctrl_data *data,
    272				     unsigned pid)
    273{
    274	unsigned long config;
    275
    276	dove_audio1_ctrl_get(data, pid, &config);
    277
    278	switch (config) {
    279	case 0x02: /* i2s1 : gpio[56:57] */
    280	case 0x0e: /* ssp  : gpio[56:57] */
    281		if (pid >= 56)
    282			return 0;
    283		return -ENOTSUPP;
    284	case 0x08: /* spdifo : gpio[52:55] */
    285	case 0x0b: /* twsi   : gpio[52:55] */
    286		if (pid <= 55)
    287			return 0;
    288		return -ENOTSUPP;
    289	case 0x0a: /* all gpio */
    290		return 0;
    291	/* 0x00 : i2s1/spdifo : no gpio */
    292	/* 0x0c : ssp/spdifo  : no gpio */
    293	/* 0x0f : ssp/twsi    : no gpio */
    294	}
    295	return -ENOTSUPP;
    296}
    297
    298/* mpp[52:57] has gpio pins capable of in and out */
    299static int dove_audio1_ctrl_gpio_dir(struct mvebu_mpp_ctrl_data *data,
    300				     unsigned pid, bool input)
    301{
    302	if (pid < 52 || pid > 57)
    303		return -ENOTSUPP;
    304	return 0;
    305}
    306
    307static int dove_twsi_ctrl_get(struct mvebu_mpp_ctrl_data *data, unsigned pid,
    308			      unsigned long *config)
    309{
    310	unsigned int gcfg1;
    311	unsigned int gcfg2;
    312
    313	regmap_read(gconfmap, GLOBAL_CONFIG_1, &gcfg1);
    314	regmap_read(gconfmap, GLOBAL_CONFIG_2, &gcfg2);
    315
    316	*config = 0;
    317	if (gcfg1 & TWSI_ENABLE_OPTION1)
    318		*config = 1;
    319	else if (gcfg2 & TWSI_ENABLE_OPTION2)
    320		*config = 2;
    321	else if (gcfg2 & TWSI_ENABLE_OPTION3)
    322		*config = 3;
    323
    324	return 0;
    325}
    326
    327static int dove_twsi_ctrl_set(struct mvebu_mpp_ctrl_data *data, unsigned pid,
    328			      unsigned long config)
    329{
    330	unsigned int gcfg1 = 0;
    331	unsigned int gcfg2 = 0;
    332
    333	switch (config) {
    334	case 1:
    335		gcfg1 = TWSI_ENABLE_OPTION1;
    336		break;
    337	case 2:
    338		gcfg2 = TWSI_ENABLE_OPTION2;
    339		break;
    340	case 3:
    341		gcfg2 = TWSI_ENABLE_OPTION3;
    342		break;
    343	}
    344
    345	regmap_update_bits(gconfmap, GLOBAL_CONFIG_1,
    346			   TWSI_ENABLE_OPTION1,
    347			   gcfg1);
    348	regmap_update_bits(gconfmap, GLOBAL_CONFIG_2,
    349			   TWSI_ENABLE_OPTION2 | TWSI_ENABLE_OPTION3,
    350			   gcfg2);
    351
    352	return 0;
    353}
    354
    355static const struct mvebu_mpp_ctrl dove_mpp_controls[] = {
    356	MPP_FUNC_CTRL(0, 15, NULL, dove_pmu_mpp_ctrl),
    357	MPP_FUNC_CTRL(16, 23, NULL, mvebu_mmio_mpp_ctrl),
    358	MPP_FUNC_CTRL(24, 39, "mpp_camera", dove_mpp4_ctrl),
    359	MPP_FUNC_CTRL(40, 45, "mpp_sdio0", dove_mpp4_ctrl),
    360	MPP_FUNC_CTRL(46, 51, "mpp_sdio1", dove_mpp4_ctrl),
    361	MPP_FUNC_GPIO_CTRL(52, 57, "mpp_audio1", dove_audio1_ctrl),
    362	MPP_FUNC_CTRL(58, 61, "mpp_spi0", dove_mpp4_ctrl),
    363	MPP_FUNC_CTRL(62, 63, "mpp_uart1", dove_mpp4_ctrl),
    364	MPP_FUNC_CTRL(64, 71, "mpp_nand", dove_nand_ctrl),
    365	MPP_FUNC_CTRL(72, 72, "audio0", dove_audio0_ctrl),
    366	MPP_FUNC_CTRL(73, 73, "twsi", dove_twsi_ctrl),
    367};
    368
    369static struct mvebu_mpp_mode dove_mpp_modes[] = {
    370	MPP_MODE(0,
    371		MPP_FUNCTION(0x00, "gpio", NULL),
    372		MPP_FUNCTION(0x02, "uart2", "rts"),
    373		MPP_FUNCTION(0x03, "sdio0", "cd"),
    374		MPP_FUNCTION(0x0f, "lcd0", "pwm"),
    375		MPP_FUNCTION(CONFIG_PMU | 0x0, "pmu-nc", NULL),
    376		MPP_FUNCTION(CONFIG_PMU | 0x1, "pmu-low", NULL),
    377		MPP_FUNCTION(CONFIG_PMU | 0x2, "pmu-high", NULL),
    378		MPP_FUNCTION(CONFIG_PMU | 0x3, "pmic", "sdi"),
    379		MPP_FUNCTION(CONFIG_PMU | 0x4, "cpu-pwr-down", NULL),
    380		MPP_FUNCTION(CONFIG_PMU | 0x5, "standby-pwr-down", NULL),
    381		MPP_FUNCTION(CONFIG_PMU | 0x8, "core-pwr-good", NULL),
    382		MPP_FUNCTION(CONFIG_PMU | 0xa, "bat-fault", NULL),
    383		MPP_FUNCTION(CONFIG_PMU | 0xb, "ext0-wakeup", NULL),
    384		MPP_FUNCTION(CONFIG_PMU | 0xc, "ext1-wakeup", NULL),
    385		MPP_FUNCTION(CONFIG_PMU | 0xd, "ext2-wakeup", NULL),
    386		MPP_FUNCTION(CONFIG_PMU | 0xe, "pmu-blink", NULL)),
    387	MPP_MODE(1,
    388		MPP_FUNCTION(0x00, "gpio", NULL),
    389		MPP_FUNCTION(0x02, "uart2", "cts"),
    390		MPP_FUNCTION(0x03, "sdio0", "wp"),
    391		MPP_FUNCTION(0x0f, "lcd1", "pwm"),
    392		MPP_FUNCTION(CONFIG_PMU | 0x0, "pmu-nc", NULL),
    393		MPP_FUNCTION(CONFIG_PMU | 0x1, "pmu-low", NULL),
    394		MPP_FUNCTION(CONFIG_PMU | 0x2, "pmu-high", NULL),
    395		MPP_FUNCTION(CONFIG_PMU | 0x3, "pmic", "sdi"),
    396		MPP_FUNCTION(CONFIG_PMU | 0x4, "cpu-pwr-down", NULL),
    397		MPP_FUNCTION(CONFIG_PMU | 0x5, "standby-pwr-down", NULL),
    398		MPP_FUNCTION(CONFIG_PMU | 0x8, "core-pwr-good", NULL),
    399		MPP_FUNCTION(CONFIG_PMU | 0xa, "bat-fault", NULL),
    400		MPP_FUNCTION(CONFIG_PMU | 0xb, "ext0-wakeup", NULL),
    401		MPP_FUNCTION(CONFIG_PMU | 0xc, "ext1-wakeup", NULL),
    402		MPP_FUNCTION(CONFIG_PMU | 0xd, "ext2-wakeup", NULL),
    403		MPP_FUNCTION(CONFIG_PMU | 0xe, "pmu-blink", NULL)),
    404	MPP_MODE(2,
    405		MPP_FUNCTION(0x00, "gpio", NULL),
    406		MPP_FUNCTION(0x01, "sata", "prsnt"),
    407		MPP_FUNCTION(0x02, "uart2", "txd"),
    408		MPP_FUNCTION(0x03, "sdio0", "buspwr"),
    409		MPP_FUNCTION(0x04, "uart1", "rts"),
    410		MPP_FUNCTION(CONFIG_PMU | 0x0, "pmu-nc", NULL),
    411		MPP_FUNCTION(CONFIG_PMU | 0x1, "pmu-low", NULL),
    412		MPP_FUNCTION(CONFIG_PMU | 0x2, "pmu-high", NULL),
    413		MPP_FUNCTION(CONFIG_PMU | 0x3, "pmic", "sdi"),
    414		MPP_FUNCTION(CONFIG_PMU | 0x4, "cpu-pwr-down", NULL),
    415		MPP_FUNCTION(CONFIG_PMU | 0x5, "standby-pwr-down", NULL),
    416		MPP_FUNCTION(CONFIG_PMU | 0x8, "core-pwr-good", NULL),
    417		MPP_FUNCTION(CONFIG_PMU | 0xa, "bat-fault", NULL),
    418		MPP_FUNCTION(CONFIG_PMU | 0xb, "ext0-wakeup", NULL),
    419		MPP_FUNCTION(CONFIG_PMU | 0xc, "ext1-wakeup", NULL),
    420		MPP_FUNCTION(CONFIG_PMU | 0xd, "ext2-wakeup", NULL),
    421		MPP_FUNCTION(CONFIG_PMU | 0xe, "pmu-blink", NULL)),
    422	MPP_MODE(3,
    423		MPP_FUNCTION(0x00, "gpio", NULL),
    424		MPP_FUNCTION(0x01, "sata", "act"),
    425		MPP_FUNCTION(0x02, "uart2", "rxd"),
    426		MPP_FUNCTION(0x03, "sdio0", "ledctrl"),
    427		MPP_FUNCTION(0x04, "uart1", "cts"),
    428		MPP_FUNCTION(0x0f, "lcd-spi", "cs1"),
    429		MPP_FUNCTION(CONFIG_PMU | 0x0, "pmu-nc", NULL),
    430		MPP_FUNCTION(CONFIG_PMU | 0x1, "pmu-low", NULL),
    431		MPP_FUNCTION(CONFIG_PMU | 0x2, "pmu-high", NULL),
    432		MPP_FUNCTION(CONFIG_PMU | 0x3, "pmic", "sdi"),
    433		MPP_FUNCTION(CONFIG_PMU | 0x4, "cpu-pwr-down", NULL),
    434		MPP_FUNCTION(CONFIG_PMU | 0x5, "standby-pwr-down", NULL),
    435		MPP_FUNCTION(CONFIG_PMU | 0x8, "core-pwr-good", NULL),
    436		MPP_FUNCTION(CONFIG_PMU | 0xa, "bat-fault", NULL),
    437		MPP_FUNCTION(CONFIG_PMU | 0xb, "ext0-wakeup", NULL),
    438		MPP_FUNCTION(CONFIG_PMU | 0xc, "ext1-wakeup", NULL),
    439		MPP_FUNCTION(CONFIG_PMU | 0xd, "ext2-wakeup", NULL),
    440		MPP_FUNCTION(CONFIG_PMU | 0xe, "pmu-blink", NULL)),
    441	MPP_MODE(4,
    442		MPP_FUNCTION(0x00, "gpio", NULL),
    443		MPP_FUNCTION(0x02, "uart3", "rts"),
    444		MPP_FUNCTION(0x03, "sdio1", "cd"),
    445		MPP_FUNCTION(0x04, "spi1", "miso"),
    446		MPP_FUNCTION(CONFIG_PMU | 0x0, "pmu-nc", NULL),
    447		MPP_FUNCTION(CONFIG_PMU | 0x1, "pmu-low", NULL),
    448		MPP_FUNCTION(CONFIG_PMU | 0x2, "pmu-high", NULL),
    449		MPP_FUNCTION(CONFIG_PMU | 0x3, "pmic", "sdi"),
    450		MPP_FUNCTION(CONFIG_PMU | 0x4, "cpu-pwr-down", NULL),
    451		MPP_FUNCTION(CONFIG_PMU | 0x5, "standby-pwr-down", NULL),
    452		MPP_FUNCTION(CONFIG_PMU | 0x8, "core-pwr-good", NULL),
    453		MPP_FUNCTION(CONFIG_PMU | 0xa, "bat-fault", NULL),
    454		MPP_FUNCTION(CONFIG_PMU | 0xb, "ext0-wakeup", NULL),
    455		MPP_FUNCTION(CONFIG_PMU | 0xc, "ext1-wakeup", NULL),
    456		MPP_FUNCTION(CONFIG_PMU | 0xd, "ext2-wakeup", NULL),
    457		MPP_FUNCTION(CONFIG_PMU | 0xe, "pmu-blink", NULL)),
    458	MPP_MODE(5,
    459		MPP_FUNCTION(0x00, "gpio", NULL),
    460		MPP_FUNCTION(0x02, "uart3", "cts"),
    461		MPP_FUNCTION(0x03, "sdio1", "wp"),
    462		MPP_FUNCTION(0x04, "spi1", "cs"),
    463		MPP_FUNCTION(CONFIG_PMU | 0x0, "pmu-nc", NULL),
    464		MPP_FUNCTION(CONFIG_PMU | 0x1, "pmu-low", NULL),
    465		MPP_FUNCTION(CONFIG_PMU | 0x2, "pmu-high", NULL),
    466		MPP_FUNCTION(CONFIG_PMU | 0x3, "pmic", "sdi"),
    467		MPP_FUNCTION(CONFIG_PMU | 0x4, "cpu-pwr-down", NULL),
    468		MPP_FUNCTION(CONFIG_PMU | 0x5, "standby-pwr-down", NULL),
    469		MPP_FUNCTION(CONFIG_PMU | 0x8, "core-pwr-good", NULL),
    470		MPP_FUNCTION(CONFIG_PMU | 0xa, "bat-fault", NULL),
    471		MPP_FUNCTION(CONFIG_PMU | 0xb, "ext0-wakeup", NULL),
    472		MPP_FUNCTION(CONFIG_PMU | 0xc, "ext1-wakeup", NULL),
    473		MPP_FUNCTION(CONFIG_PMU | 0xd, "ext2-wakeup", NULL),
    474		MPP_FUNCTION(CONFIG_PMU | 0xe, "pmu-blink", NULL)),
    475	MPP_MODE(6,
    476		MPP_FUNCTION(0x00, "gpio", NULL),
    477		MPP_FUNCTION(0x02, "uart3", "txd"),
    478		MPP_FUNCTION(0x03, "sdio1", "buspwr"),
    479		MPP_FUNCTION(0x04, "spi1", "mosi"),
    480		MPP_FUNCTION(CONFIG_PMU | 0x0, "pmu-nc", NULL),
    481		MPP_FUNCTION(CONFIG_PMU | 0x1, "pmu-low", NULL),
    482		MPP_FUNCTION(CONFIG_PMU | 0x2, "pmu-high", NULL),
    483		MPP_FUNCTION(CONFIG_PMU | 0x3, "pmic", "sdi"),
    484		MPP_FUNCTION(CONFIG_PMU | 0x4, "cpu-pwr-down", NULL),
    485		MPP_FUNCTION(CONFIG_PMU | 0x5, "standby-pwr-down", NULL),
    486		MPP_FUNCTION(CONFIG_PMU | 0x8, "core-pwr-good", NULL),
    487		MPP_FUNCTION(CONFIG_PMU | 0xa, "bat-fault", NULL),
    488		MPP_FUNCTION(CONFIG_PMU | 0xb, "ext0-wakeup", NULL),
    489		MPP_FUNCTION(CONFIG_PMU | 0xc, "ext1-wakeup", NULL),
    490		MPP_FUNCTION(CONFIG_PMU | 0xd, "ext2-wakeup", NULL),
    491		MPP_FUNCTION(CONFIG_PMU | 0xe, "pmu-blink", NULL)),
    492	MPP_MODE(7,
    493		MPP_FUNCTION(0x00, "gpio", NULL),
    494		MPP_FUNCTION(0x02, "uart3", "rxd"),
    495		MPP_FUNCTION(0x03, "sdio1", "ledctrl"),
    496		MPP_FUNCTION(0x04, "spi1", "sck"),
    497		MPP_FUNCTION(CONFIG_PMU | 0x0, "pmu-nc", NULL),
    498		MPP_FUNCTION(CONFIG_PMU | 0x1, "pmu-low", NULL),
    499		MPP_FUNCTION(CONFIG_PMU | 0x2, "pmu-high", NULL),
    500		MPP_FUNCTION(CONFIG_PMU | 0x3, "pmic", "sdi"),
    501		MPP_FUNCTION(CONFIG_PMU | 0x4, "cpu-pwr-down", NULL),
    502		MPP_FUNCTION(CONFIG_PMU | 0x5, "standby-pwr-down", NULL),
    503		MPP_FUNCTION(CONFIG_PMU | 0x8, "core-pwr-good", NULL),
    504		MPP_FUNCTION(CONFIG_PMU | 0xa, "bat-fault", NULL),
    505		MPP_FUNCTION(CONFIG_PMU | 0xb, "ext0-wakeup", NULL),
    506		MPP_FUNCTION(CONFIG_PMU | 0xc, "ext1-wakeup", NULL),
    507		MPP_FUNCTION(CONFIG_PMU | 0xd, "ext2-wakeup", NULL),
    508		MPP_FUNCTION(CONFIG_PMU | 0xe, "pmu-blink", NULL)),
    509	MPP_MODE(8,
    510		MPP_FUNCTION(0x00, "gpio", NULL),
    511		MPP_FUNCTION(0x01, "watchdog", "rstout"),
    512		MPP_FUNCTION(CONFIG_PMU | 0x0, "pmu-nc", NULL),
    513		MPP_FUNCTION(CONFIG_PMU | 0x1, "pmu-low", NULL),
    514		MPP_FUNCTION(CONFIG_PMU | 0x2, "pmu-high", NULL),
    515		MPP_FUNCTION(CONFIG_PMU | 0x3, "pmic", "sdi"),
    516		MPP_FUNCTION(CONFIG_PMU | 0x4, "cpu-pwr-down", NULL),
    517		MPP_FUNCTION(CONFIG_PMU | 0x5, "standby-pwr-down", NULL),
    518		MPP_FUNCTION(CONFIG_PMU | 0x8, "cpu-pwr-good", NULL),
    519		MPP_FUNCTION(CONFIG_PMU | 0xa, "bat-fault", NULL),
    520		MPP_FUNCTION(CONFIG_PMU | 0xb, "ext0-wakeup", NULL),
    521		MPP_FUNCTION(CONFIG_PMU | 0xc, "ext1-wakeup", NULL),
    522		MPP_FUNCTION(CONFIG_PMU | 0xd, "ext2-wakeup", NULL),
    523		MPP_FUNCTION(CONFIG_PMU | 0xe, "pmu-blink", NULL)),
    524	MPP_MODE(9,
    525		MPP_FUNCTION(0x00, "gpio", NULL),
    526		MPP_FUNCTION(0x05, "pex1", "clkreq"),
    527		MPP_FUNCTION(CONFIG_PMU | 0x0, "pmu-nc", NULL),
    528		MPP_FUNCTION(CONFIG_PMU | 0x1, "pmu-low", NULL),
    529		MPP_FUNCTION(CONFIG_PMU | 0x2, "pmu-high", NULL),
    530		MPP_FUNCTION(CONFIG_PMU | 0x3, "pmic", "sdi"),
    531		MPP_FUNCTION(CONFIG_PMU | 0x4, "cpu-pwr-down", NULL),
    532		MPP_FUNCTION(CONFIG_PMU | 0x5, "standby-pwr-down", NULL),
    533		MPP_FUNCTION(CONFIG_PMU | 0x8, "cpu-pwr-good", NULL),
    534		MPP_FUNCTION(CONFIG_PMU | 0xa, "bat-fault", NULL),
    535		MPP_FUNCTION(CONFIG_PMU | 0xb, "ext0-wakeup", NULL),
    536		MPP_FUNCTION(CONFIG_PMU | 0xc, "ext1-wakeup", NULL),
    537		MPP_FUNCTION(CONFIG_PMU | 0xd, "ext2-wakeup", NULL),
    538		MPP_FUNCTION(CONFIG_PMU | 0xe, "pmu-blink", NULL)),
    539	MPP_MODE(10,
    540		MPP_FUNCTION(0x00, "gpio", NULL),
    541		MPP_FUNCTION(0x05, "ssp", "sclk"),
    542		MPP_FUNCTION(CONFIG_PMU | 0x0, "pmu-nc", NULL),
    543		MPP_FUNCTION(CONFIG_PMU | 0x1, "pmu-low", NULL),
    544		MPP_FUNCTION(CONFIG_PMU | 0x2, "pmu-high", NULL),
    545		MPP_FUNCTION(CONFIG_PMU | 0x3, "pmic", "sdi"),
    546		MPP_FUNCTION(CONFIG_PMU | 0x4, "cpu-pwr-down", NULL),
    547		MPP_FUNCTION(CONFIG_PMU | 0x5, "standby-pwr-down", NULL),
    548		MPP_FUNCTION(CONFIG_PMU | 0x8, "cpu-pwr-good", NULL),
    549		MPP_FUNCTION(CONFIG_PMU | 0xa, "bat-fault", NULL),
    550		MPP_FUNCTION(CONFIG_PMU | 0xb, "ext0-wakeup", NULL),
    551		MPP_FUNCTION(CONFIG_PMU | 0xc, "ext1-wakeup", NULL),
    552		MPP_FUNCTION(CONFIG_PMU | 0xd, "ext2-wakeup", NULL),
    553		MPP_FUNCTION(CONFIG_PMU | 0xe, "pmu-blink", NULL)),
    554	MPP_MODE(11,
    555		MPP_FUNCTION(0x00, "gpio", NULL),
    556		MPP_FUNCTION(0x01, "sata", "prsnt"),
    557		MPP_FUNCTION(0x02, "sata-1", "act"),
    558		MPP_FUNCTION(0x03, "sdio0", "ledctrl"),
    559		MPP_FUNCTION(0x04, "sdio1", "ledctrl"),
    560		MPP_FUNCTION(0x05, "pex0", "clkreq"),
    561		MPP_FUNCTION(CONFIG_PMU | 0x0, "pmu-nc", NULL),
    562		MPP_FUNCTION(CONFIG_PMU | 0x1, "pmu-low", NULL),
    563		MPP_FUNCTION(CONFIG_PMU | 0x2, "pmu-high", NULL),
    564		MPP_FUNCTION(CONFIG_PMU | 0x3, "pmic", "sdi"),
    565		MPP_FUNCTION(CONFIG_PMU | 0x4, "cpu-pwr-down", NULL),
    566		MPP_FUNCTION(CONFIG_PMU | 0x5, "standby-pwr-down", NULL),
    567		MPP_FUNCTION(CONFIG_PMU | 0x8, "cpu-pwr-good", NULL),
    568		MPP_FUNCTION(CONFIG_PMU | 0xa, "bat-fault", NULL),
    569		MPP_FUNCTION(CONFIG_PMU | 0xb, "ext0-wakeup", NULL),
    570		MPP_FUNCTION(CONFIG_PMU | 0xc, "ext1-wakeup", NULL),
    571		MPP_FUNCTION(CONFIG_PMU | 0xd, "ext2-wakeup", NULL),
    572		MPP_FUNCTION(CONFIG_PMU | 0xe, "pmu-blink", NULL)),
    573	MPP_MODE(12,
    574		MPP_FUNCTION(0x00, "gpio", NULL),
    575		MPP_FUNCTION(0x01, "sata", "act"),
    576		MPP_FUNCTION(0x02, "uart2", "rts"),
    577		MPP_FUNCTION(0x03, "audio0", "extclk"),
    578		MPP_FUNCTION(0x04, "sdio1", "cd"),
    579		MPP_FUNCTION(CONFIG_PMU | 0x0, "pmu-nc", NULL),
    580		MPP_FUNCTION(CONFIG_PMU | 0x1, "pmu-low", NULL),
    581		MPP_FUNCTION(CONFIG_PMU | 0x2, "pmu-high", NULL),
    582		MPP_FUNCTION(CONFIG_PMU | 0x3, "pmic", "sdi"),
    583		MPP_FUNCTION(CONFIG_PMU | 0x4, "cpu-pwr-down", NULL),
    584		MPP_FUNCTION(CONFIG_PMU | 0x5, "standby-pwr-down", NULL),
    585		MPP_FUNCTION(CONFIG_PMU | 0x8, "cpu-pwr-good", NULL),
    586		MPP_FUNCTION(CONFIG_PMU | 0xa, "bat-fault", NULL),
    587		MPP_FUNCTION(CONFIG_PMU | 0xb, "ext0-wakeup", NULL),
    588		MPP_FUNCTION(CONFIG_PMU | 0xc, "ext1-wakeup", NULL),
    589		MPP_FUNCTION(CONFIG_PMU | 0xd, "ext2-wakeup", NULL),
    590		MPP_FUNCTION(CONFIG_PMU | 0xe, "pmu-blink", NULL)),
    591	MPP_MODE(13,
    592		MPP_FUNCTION(0x00, "gpio", NULL),
    593		MPP_FUNCTION(0x02, "uart2", "cts"),
    594		MPP_FUNCTION(0x03, "audio1", "extclk"),
    595		MPP_FUNCTION(0x04, "sdio1", "wp"),
    596		MPP_FUNCTION(0x05, "ssp", "extclk"),
    597		MPP_FUNCTION(CONFIG_PMU | 0x0, "pmu-nc", NULL),
    598		MPP_FUNCTION(CONFIG_PMU | 0x1, "pmu-low", NULL),
    599		MPP_FUNCTION(CONFIG_PMU | 0x2, "pmu-high", NULL),
    600		MPP_FUNCTION(CONFIG_PMU | 0x3, "pmic", "sdi"),
    601		MPP_FUNCTION(CONFIG_PMU | 0x4, "cpu-pwr-down", NULL),
    602		MPP_FUNCTION(CONFIG_PMU | 0x5, "standby-pwr-down", NULL),
    603		MPP_FUNCTION(CONFIG_PMU | 0x8, "cpu-pwr-good", NULL),
    604		MPP_FUNCTION(CONFIG_PMU | 0xa, "bat-fault", NULL),
    605		MPP_FUNCTION(CONFIG_PMU | 0xb, "ext0-wakeup", NULL),
    606		MPP_FUNCTION(CONFIG_PMU | 0xc, "ext1-wakeup", NULL),
    607		MPP_FUNCTION(CONFIG_PMU | 0xd, "ext2-wakeup", NULL),
    608		MPP_FUNCTION(CONFIG_PMU | 0xe, "pmu-blink", NULL)),
    609	MPP_MODE(14,
    610		MPP_FUNCTION(0x00, "gpio", NULL),
    611		MPP_FUNCTION(0x02, "uart2", "txd"),
    612		MPP_FUNCTION(0x04, "sdio1", "buspwr"),
    613		MPP_FUNCTION(0x05, "ssp", "rxd"),
    614		MPP_FUNCTION(CONFIG_PMU | 0x0, "pmu-nc", NULL),
    615		MPP_FUNCTION(CONFIG_PMU | 0x1, "pmu-low", NULL),
    616		MPP_FUNCTION(CONFIG_PMU | 0x2, "pmu-high", NULL),
    617		MPP_FUNCTION(CONFIG_PMU | 0x3, "pmic", "sdi"),
    618		MPP_FUNCTION(CONFIG_PMU | 0x4, "cpu-pwr-down", NULL),
    619		MPP_FUNCTION(CONFIG_PMU | 0x5, "standby-pwr-down", NULL),
    620		MPP_FUNCTION(CONFIG_PMU | 0x8, "cpu-pwr-good", NULL),
    621		MPP_FUNCTION(CONFIG_PMU | 0xa, "bat-fault", NULL),
    622		MPP_FUNCTION(CONFIG_PMU | 0xb, "ext0-wakeup", NULL),
    623		MPP_FUNCTION(CONFIG_PMU | 0xc, "ext1-wakeup", NULL),
    624		MPP_FUNCTION(CONFIG_PMU | 0xd, "ext2-wakeup", NULL),
    625		MPP_FUNCTION(CONFIG_PMU | 0xe, "pmu-blink", NULL)),
    626	MPP_MODE(15,
    627		MPP_FUNCTION(0x00, "gpio", NULL),
    628		MPP_FUNCTION(0x02, "uart2", "rxd"),
    629		MPP_FUNCTION(0x04, "sdio1", "ledctrl"),
    630		MPP_FUNCTION(0x05, "ssp", "sfrm"),
    631		MPP_FUNCTION(CONFIG_PMU | 0x0, "pmu-nc", NULL),
    632		MPP_FUNCTION(CONFIG_PMU | 0x1, "pmu-low", NULL),
    633		MPP_FUNCTION(CONFIG_PMU | 0x2, "pmu-high", NULL),
    634		MPP_FUNCTION(CONFIG_PMU | 0x3, "pmic", "sdi"),
    635		MPP_FUNCTION(CONFIG_PMU | 0x4, "cpu-pwr-down", NULL),
    636		MPP_FUNCTION(CONFIG_PMU | 0x5, "standby-pwr-down", NULL),
    637		MPP_FUNCTION(CONFIG_PMU | 0x8, "cpu-pwr-good", NULL),
    638		MPP_FUNCTION(CONFIG_PMU | 0xa, "bat-fault", NULL),
    639		MPP_FUNCTION(CONFIG_PMU | 0xb, "ext0-wakeup", NULL),
    640		MPP_FUNCTION(CONFIG_PMU | 0xc, "ext1-wakeup", NULL),
    641		MPP_FUNCTION(CONFIG_PMU | 0xd, "ext2-wakeup", NULL),
    642		MPP_FUNCTION(CONFIG_PMU | 0xe, "pmu-blink", NULL)),
    643	MPP_MODE(16,
    644		MPP_FUNCTION(0x00, "gpio", NULL),
    645		MPP_FUNCTION(0x02, "uart3", "rts"),
    646		MPP_FUNCTION(0x03, "sdio0", "cd"),
    647		MPP_FUNCTION(0x04, "lcd-spi", "cs1"),
    648		MPP_FUNCTION(0x05, "ac97", "sdi1")),
    649	MPP_MODE(17,
    650		MPP_FUNCTION(0x00, "gpio", NULL),
    651		MPP_FUNCTION(0x01, "ac97-1", "sysclko"),
    652		MPP_FUNCTION(0x02, "uart3", "cts"),
    653		MPP_FUNCTION(0x03, "sdio0", "wp"),
    654		MPP_FUNCTION(0x04, "twsi", "sda"),
    655		MPP_FUNCTION(0x05, "ac97", "sdi2")),
    656	MPP_MODE(18,
    657		MPP_FUNCTION(0x00, "gpio", NULL),
    658		MPP_FUNCTION(0x02, "uart3", "txd"),
    659		MPP_FUNCTION(0x03, "sdio0", "buspwr"),
    660		MPP_FUNCTION(0x04, "lcd0", "pwm"),
    661		MPP_FUNCTION(0x05, "ac97", "sdi3")),
    662	MPP_MODE(19,
    663		MPP_FUNCTION(0x00, "gpio", NULL),
    664		MPP_FUNCTION(0x02, "uart3", "rxd"),
    665		MPP_FUNCTION(0x03, "sdio0", "ledctrl"),
    666		MPP_FUNCTION(0x04, "twsi", "sck")),
    667	MPP_MODE(20,
    668		MPP_FUNCTION(0x00, "gpio", NULL),
    669		MPP_FUNCTION(0x01, "ac97", "sysclko"),
    670		MPP_FUNCTION(0x02, "lcd-spi", "miso"),
    671		MPP_FUNCTION(0x03, "sdio1", "cd"),
    672		MPP_FUNCTION(0x05, "sdio0", "cd"),
    673		MPP_FUNCTION(0x06, "spi1", "miso")),
    674	MPP_MODE(21,
    675		MPP_FUNCTION(0x00, "gpio", NULL),
    676		MPP_FUNCTION(0x01, "uart1", "rts"),
    677		MPP_FUNCTION(0x02, "lcd-spi", "cs0"),
    678		MPP_FUNCTION(0x03, "sdio1", "wp"),
    679		MPP_FUNCTION(0x04, "ssp", "sfrm"),
    680		MPP_FUNCTION(0x05, "sdio0", "wp"),
    681		MPP_FUNCTION(0x06, "spi1", "cs")),
    682	MPP_MODE(22,
    683		MPP_FUNCTION(0x00, "gpio", NULL),
    684		MPP_FUNCTION(0x01, "uart1", "cts"),
    685		MPP_FUNCTION(0x02, "lcd-spi", "mosi"),
    686		MPP_FUNCTION(0x03, "sdio1", "buspwr"),
    687		MPP_FUNCTION(0x04, "ssp", "txd"),
    688		MPP_FUNCTION(0x05, "sdio0", "buspwr"),
    689		MPP_FUNCTION(0x06, "spi1", "mosi")),
    690	MPP_MODE(23,
    691		MPP_FUNCTION(0x00, "gpio", NULL),
    692		MPP_FUNCTION(0x02, "lcd-spi", "sck"),
    693		MPP_FUNCTION(0x03, "sdio1", "ledctrl"),
    694		MPP_FUNCTION(0x04, "ssp", "sclk"),
    695		MPP_FUNCTION(0x05, "sdio0", "ledctrl"),
    696		MPP_FUNCTION(0x06, "spi1", "sck")),
    697	MPP_MODE(24,
    698		MPP_FUNCTION(0x00, "camera", NULL),
    699		MPP_FUNCTION(0x01, "gpio", NULL)),
    700	MPP_MODE(40,
    701		MPP_FUNCTION(0x00, "sdio0", NULL),
    702		MPP_FUNCTION(0x01, "gpio", NULL)),
    703	MPP_MODE(46,
    704		MPP_FUNCTION(0x00, "sdio1", NULL),
    705		MPP_FUNCTION(0x01, "gpio", NULL)),
    706	MPP_MODE(52,
    707		MPP_FUNCTION(0x00, "i2s1/spdifo", NULL),
    708		MPP_FUNCTION(0x02, "i2s1", NULL),
    709		MPP_FUNCTION(0x08, "spdifo", NULL),
    710		MPP_FUNCTION(0x0a, "gpio", NULL),
    711		MPP_FUNCTION(0x0b, "twsi", NULL),
    712		MPP_FUNCTION(0x0c, "ssp/spdifo", NULL),
    713		MPP_FUNCTION(0x0e, "ssp", NULL),
    714		MPP_FUNCTION(0x0f, "ssp/twsi", NULL)),
    715	MPP_MODE(58,
    716		MPP_FUNCTION(0x00, "spi0", NULL),
    717		MPP_FUNCTION(0x01, "gpio", NULL)),
    718	MPP_MODE(62,
    719		MPP_FUNCTION(0x00, "uart1", NULL),
    720		MPP_FUNCTION(0x01, "gpio", NULL)),
    721	MPP_MODE(64,
    722		MPP_FUNCTION(0x00, "nand", NULL),
    723		MPP_FUNCTION(0x01, "gpo", NULL)),
    724	MPP_MODE(72,
    725		MPP_FUNCTION(0x00, "i2s", NULL),
    726		MPP_FUNCTION(0x01, "ac97", NULL)),
    727	MPP_MODE(73,
    728		MPP_FUNCTION(0x00, "twsi-none", NULL),
    729		MPP_FUNCTION(0x01, "twsi-opt1", NULL),
    730		MPP_FUNCTION(0x02, "twsi-opt2", NULL),
    731		MPP_FUNCTION(0x03, "twsi-opt3", NULL)),
    732};
    733
    734static struct pinctrl_gpio_range dove_mpp_gpio_ranges[] = {
    735	MPP_GPIO_RANGE(0,  0,  0, 32),
    736	MPP_GPIO_RANGE(1, 32, 32, 32),
    737	MPP_GPIO_RANGE(2, 64, 64,  8),
    738};
    739
    740static struct mvebu_pinctrl_soc_info dove_pinctrl_info = {
    741	.controls = dove_mpp_controls,
    742	.ncontrols = ARRAY_SIZE(dove_mpp_controls),
    743	.modes = dove_mpp_modes,
    744	.nmodes = ARRAY_SIZE(dove_mpp_modes),
    745	.gpioranges = dove_mpp_gpio_ranges,
    746	.ngpioranges = ARRAY_SIZE(dove_mpp_gpio_ranges),
    747	.variant = 0,
    748};
    749
    750static struct clk *clk;
    751
    752static const struct of_device_id dove_pinctrl_of_match[] = {
    753	{ .compatible = "marvell,dove-pinctrl", .data = &dove_pinctrl_info },
    754	{ }
    755};
    756
    757static const struct regmap_config gc_regmap_config = {
    758	.reg_bits = 32,
    759	.val_bits = 32,
    760	.reg_stride = 4,
    761	.max_register = 5,
    762};
    763
    764static int dove_pinctrl_probe(struct platform_device *pdev)
    765{
    766	struct resource *res, *mpp_res;
    767	struct resource fb_res;
    768	const struct of_device_id *match =
    769		of_match_device(dove_pinctrl_of_match, &pdev->dev);
    770	struct mvebu_mpp_ctrl_data *mpp_data;
    771	void __iomem *base;
    772	int i;
    773
    774	pdev->dev.platform_data = (void *)match->data;
    775
    776	/*
    777	 * General MPP Configuration Register is part of pdma registers.
    778	 * grab clk to make sure it is ticking.
    779	 */
    780	clk = devm_clk_get(&pdev->dev, NULL);
    781	if (IS_ERR(clk)) {
    782		dev_err(&pdev->dev, "Unable to get pdma clock");
    783		return PTR_ERR(clk);
    784	}
    785	clk_prepare_enable(clk);
    786
    787	mpp_res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
    788	base = devm_ioremap_resource(&pdev->dev, mpp_res);
    789	if (IS_ERR(base))
    790		return PTR_ERR(base);
    791
    792	mpp_data = devm_kcalloc(&pdev->dev, dove_pinctrl_info.ncontrols,
    793				sizeof(*mpp_data), GFP_KERNEL);
    794	if (!mpp_data)
    795		return -ENOMEM;
    796
    797	dove_pinctrl_info.control_data = mpp_data;
    798	for (i = 0; i < ARRAY_SIZE(dove_mpp_controls); i++)
    799		mpp_data[i].base = base;
    800
    801	/* prepare fallback resource */
    802	memcpy(&fb_res, mpp_res, sizeof(struct resource));
    803	fb_res.start = 0;
    804
    805	res = platform_get_resource(pdev, IORESOURCE_MEM, 1);
    806	if (!res) {
    807		dev_warn(&pdev->dev, "falling back to hardcoded MPP4 resource\n");
    808		adjust_resource(&fb_res,
    809			(mpp_res->start & INT_REGS_MASK) + MPP4_REGS_OFFS, 0x4);
    810		res = &fb_res;
    811	}
    812
    813	mpp4_base = devm_ioremap_resource(&pdev->dev, res);
    814	if (IS_ERR(mpp4_base))
    815		return PTR_ERR(mpp4_base);
    816
    817	res = platform_get_resource(pdev, IORESOURCE_MEM, 2);
    818	if (!res) {
    819		dev_warn(&pdev->dev, "falling back to hardcoded PMU resource\n");
    820		adjust_resource(&fb_res,
    821			(mpp_res->start & INT_REGS_MASK) + PMU_REGS_OFFS, 0x8);
    822		res = &fb_res;
    823	}
    824
    825	pmu_base = devm_ioremap_resource(&pdev->dev, res);
    826	if (IS_ERR(pmu_base))
    827		return PTR_ERR(pmu_base);
    828
    829	gconfmap = syscon_regmap_lookup_by_compatible("marvell,dove-global-config");
    830	if (IS_ERR(gconfmap)) {
    831		void __iomem *gc_base;
    832
    833		dev_warn(&pdev->dev, "falling back to hardcoded global registers\n");
    834		adjust_resource(&fb_res,
    835			(mpp_res->start & INT_REGS_MASK) + GC_REGS_OFFS, 0x14);
    836		gc_base = devm_ioremap_resource(&pdev->dev, &fb_res);
    837		if (IS_ERR(gc_base))
    838			return PTR_ERR(gc_base);
    839		gconfmap = devm_regmap_init_mmio(&pdev->dev,
    840						 gc_base, &gc_regmap_config);
    841		if (IS_ERR(gconfmap))
    842			return PTR_ERR(gconfmap);
    843	}
    844
    845	/* Warn on any missing DT resource */
    846	if (fb_res.start)
    847		dev_warn(&pdev->dev, FW_BUG "Missing pinctrl regs in DTB. Please update your firmware.\n");
    848
    849	return mvebu_pinctrl_probe(pdev);
    850}
    851
    852static struct platform_driver dove_pinctrl_driver = {
    853	.driver = {
    854		.name = "dove-pinctrl",
    855		.suppress_bind_attrs = true,
    856		.of_match_table = dove_pinctrl_of_match,
    857	},
    858	.probe = dove_pinctrl_probe,
    859};
    860builtin_platform_driver(dove_pinctrl_driver);