pinctrl-armada-39x.c 19.6 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 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
/*
 * Marvell Armada 39x pinctrl driver based on mvebu pinctrl core
 *
 * Copyright (C) 2015 Marvell
 *
 * Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 */

#include <linux/err.h>
#include <linux/init.h>
#include <linux/io.h>
#include <linux/module.h>
#include <linux/platform_device.h>
#include <linux/of.h>
#include <linux/of_device.h>
#include <linux/pinctrl/pinctrl.h>

#include "pinctrl-mvebu.h"

static void __iomem *mpp_base;

static int armada_39x_mpp_ctrl_get(unsigned pid, unsigned long *config)
{
	return default_mpp_ctrl_get(mpp_base, pid, config);
}

static int armada_39x_mpp_ctrl_set(unsigned pid, unsigned long config)
{
	return default_mpp_ctrl_set(mpp_base, pid, config);
}

enum {
	V_88F6920 = BIT(0),
	V_88F6928 = BIT(1),
	V_88F6920_PLUS = (V_88F6920 | V_88F6928),
};

static struct mvebu_mpp_mode armada_39x_mpp_modes[] = {
	MPP_MODE(0,
		 MPP_VAR_FUNCTION(0, "gpio",    NULL,       V_88F6920_PLUS),
		 MPP_VAR_FUNCTION(1, "ua0",     "rxd",      V_88F6920_PLUS)),
	MPP_MODE(1,
		 MPP_VAR_FUNCTION(0, "gpio",    NULL,       V_88F6920_PLUS),
		 MPP_VAR_FUNCTION(1, "ua0",     "txd",      V_88F6920_PLUS)),
	MPP_MODE(2,
		 MPP_VAR_FUNCTION(0, "gpio",    NULL,       V_88F6920_PLUS),
		 MPP_VAR_FUNCTION(1, "i2c0",    "sck",      V_88F6920_PLUS)),
	MPP_MODE(3,
		 MPP_VAR_FUNCTION(0, "gpio",    NULL,       V_88F6920_PLUS),
		 MPP_VAR_FUNCTION(1, "i2c0",    "sda",      V_88F6920_PLUS)),
	MPP_MODE(4,
		 MPP_VAR_FUNCTION(0, "gpio",    NULL,       V_88F6920_PLUS),
		 MPP_VAR_FUNCTION(2, "ua1",     "txd",      V_88F6920_PLUS),
		 MPP_VAR_FUNCTION(3, "ua0",     "rts",      V_88F6920_PLUS),
		 MPP_VAR_FUNCTION(7, "smi",     "mdc",      V_88F6920_PLUS)),
	MPP_MODE(5,
		 MPP_VAR_FUNCTION(0, "gpio",    NULL,       V_88F6920_PLUS),
		 MPP_VAR_FUNCTION(2, "ua1",     "rxd",      V_88F6920_PLUS),
		 MPP_VAR_FUNCTION(3, "ua0",     "cts",      V_88F6920_PLUS),
		 MPP_VAR_FUNCTION(7, "smi",     "mdio",     V_88F6920_PLUS)),
	MPP_MODE(6,
		 MPP_VAR_FUNCTION(0, "gpio",    NULL,       V_88F6920_PLUS),
		 MPP_VAR_FUNCTION(5, "dev",     "cs3",      V_88F6920_PLUS),
		 MPP_VAR_FUNCTION(7, "xsmi",    "mdio",     V_88F6920_PLUS)),
	MPP_MODE(7,
		 MPP_VAR_FUNCTION(0, "gpio",    NULL,       V_88F6920_PLUS),
		 MPP_VAR_FUNCTION(5, "dev",     "ad9",      V_88F6920_PLUS),
		 MPP_VAR_FUNCTION(7, "xsmi",    "mdc",      V_88F6920_PLUS)),
	MPP_MODE(8,
		 MPP_VAR_FUNCTION(0, "gpio",    NULL,       V_88F6920_PLUS),
		 MPP_VAR_FUNCTION(5, "dev",     "ad10",     V_88F6920_PLUS),
		 MPP_VAR_FUNCTION(7, "ptp",     "trig",     V_88F6920_PLUS)),
	MPP_MODE(9,
		 MPP_VAR_FUNCTION(0, "gpio",    NULL,       V_88F6920_PLUS),
		 MPP_VAR_FUNCTION(5, "dev",     "ad11",     V_88F6920_PLUS),
		 MPP_VAR_FUNCTION(7, "ptp",     "clk",      V_88F6920_PLUS)),
	MPP_MODE(10,
		 MPP_VAR_FUNCTION(0, "gpio",    NULL,       V_88F6920_PLUS),
		 MPP_VAR_FUNCTION(5, "dev",     "ad12",     V_88F6920_PLUS),
85
		 MPP_VAR_FUNCTION(7, "ptp",     "evreq",    V_88F6920_PLUS)),
86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
	MPP_MODE(11,
		 MPP_VAR_FUNCTION(0, "gpio",    NULL,       V_88F6920_PLUS),
		 MPP_VAR_FUNCTION(5, "dev",     "ad13",     V_88F6920_PLUS),
		 MPP_VAR_FUNCTION(7, "led",     "clk",      V_88F6920_PLUS)),
	MPP_MODE(12,
		 MPP_VAR_FUNCTION(0, "gpio",    NULL,       V_88F6920_PLUS),
		 MPP_VAR_FUNCTION(2, "pcie0",   "rstout",   V_88F6920_PLUS),
		 MPP_VAR_FUNCTION(5, "dev",     "ad14",     V_88F6920_PLUS),
		 MPP_VAR_FUNCTION(7, "led",     "stb",      V_88F6920_PLUS)),
	MPP_MODE(13,
		 MPP_VAR_FUNCTION(0, "gpio",    NULL,       V_88F6920_PLUS),
		 MPP_VAR_FUNCTION(5, "dev",     "ad15",     V_88F6920_PLUS),
		 MPP_VAR_FUNCTION(7, "led",     "data",     V_88F6920_PLUS)),
	MPP_MODE(14,
		 MPP_VAR_FUNCTION(0, "gpio",    NULL,       V_88F6920_PLUS),
101
		 MPP_VAR_FUNCTION(3, "dram",    "vttctrl",  V_88F6920_PLUS),
102
		 MPP_VAR_FUNCTION(5, "dev",     "we1",      V_88F6920_PLUS),
103 104 105 106 107 108 109 110
		 MPP_VAR_FUNCTION(7, "ua1",     "txd",      V_88F6920_PLUS)),
	MPP_MODE(15,
		 MPP_VAR_FUNCTION(0, "gpio",    NULL,       V_88F6920_PLUS),
		 MPP_VAR_FUNCTION(3, "pcie0",   "rstout",   V_88F6920_PLUS),
		 MPP_VAR_FUNCTION(4, "spi0",    "mosi",     V_88F6920_PLUS),
		 MPP_VAR_FUNCTION(7, "i2c1",    "sck",      V_88F6920_PLUS)),
	MPP_MODE(16,
		 MPP_VAR_FUNCTION(0, "gpio",    NULL,       V_88F6920_PLUS),
111
		 MPP_VAR_FUNCTION(3, "dram",    "deccerr",  V_88F6920_PLUS),
112 113 114 115 116 117 118 119 120 121 122 123 124 125
		 MPP_VAR_FUNCTION(4, "spi0",    "miso",     V_88F6920_PLUS),
		 MPP_VAR_FUNCTION(7, "i2c1",    "sda",      V_88F6920_PLUS)),
	MPP_MODE(17,
		 MPP_VAR_FUNCTION(0, "gpio",    NULL,       V_88F6920_PLUS),
		 MPP_VAR_FUNCTION(3, "ua1",     "rxd",      V_88F6920_PLUS),
		 MPP_VAR_FUNCTION(4, "spi0",    "sck",      V_88F6920_PLUS),
		 MPP_VAR_FUNCTION(7, "smi",     "mdio",     V_88F6920_PLUS)),
	MPP_MODE(18,
		 MPP_VAR_FUNCTION(0, "gpio",    NULL,       V_88F6920_PLUS),
		 MPP_VAR_FUNCTION(3, "ua1",     "txd",      V_88F6920_PLUS),
		 MPP_VAR_FUNCTION(4, "spi0",    "cs0",      V_88F6920_PLUS),
		 MPP_VAR_FUNCTION(7, "i2c2",    "sck",      V_88F6920_PLUS)),
	MPP_MODE(19,
		 MPP_VAR_FUNCTION(0, "gpio",    NULL,       V_88F6920_PLUS),
126
		 MPP_VAR_FUNCTION(4, "sata1",   "prsnt",    V_88F6928),
127 128 129 130 131
		 MPP_VAR_FUNCTION(5, "ua0",     "cts",      V_88F6920_PLUS),
		 MPP_VAR_FUNCTION(6, "ua1",     "rxd",      V_88F6920_PLUS),
		 MPP_VAR_FUNCTION(7, "i2c2",    "sda",      V_88F6920_PLUS)),
	MPP_MODE(20,
		 MPP_VAR_FUNCTION(0, "gpio",    NULL,       V_88F6920_PLUS),
132
		 MPP_VAR_FUNCTION(4, "sata0",   "prsnt",    V_88F6928),
133 134 135 136 137 138
		 MPP_VAR_FUNCTION(5, "ua0",     "rts",      V_88F6920_PLUS),
		 MPP_VAR_FUNCTION(6, "ua1",     "txd",      V_88F6920_PLUS),
		 MPP_VAR_FUNCTION(7, "smi",     "mdc",      V_88F6920_PLUS)),
	MPP_MODE(21,
		 MPP_VAR_FUNCTION(0, "gpio",    NULL,       V_88F6920_PLUS),
		 MPP_VAR_FUNCTION(1, "spi0",    "cs1",      V_88F6920_PLUS),
139
		 MPP_VAR_FUNCTION(3, "sata0",   "prsnt",    V_88F6928),
140
		 MPP_VAR_FUNCTION(4, "sd0",     "cmd",      V_88F6920_PLUS),
141 142 143 144 145 146 147 148 149 150 151 152 153 154 155
		 MPP_VAR_FUNCTION(5, "dev",     "bootcs",   V_88F6920_PLUS),
		 MPP_VAR_FUNCTION(8, "ge",      "rxd0",     V_88F6920_PLUS)),
	MPP_MODE(22,
		 MPP_VAR_FUNCTION(0, "gpio",    NULL,       V_88F6920_PLUS),
		 MPP_VAR_FUNCTION(1, "spi0",    "mosi",     V_88F6920_PLUS),
		 MPP_VAR_FUNCTION(5, "dev",     "ad0",      V_88F6920_PLUS)),
	MPP_MODE(23,
		 MPP_VAR_FUNCTION(0, "gpio",    NULL,       V_88F6920_PLUS),
		 MPP_VAR_FUNCTION(1, "spi0",    "sck",      V_88F6920_PLUS),
		 MPP_VAR_FUNCTION(5, "dev",     "ad2",      V_88F6920_PLUS)),
	MPP_MODE(24,
		 MPP_VAR_FUNCTION(0, "gpio",    NULL,       V_88F6920_PLUS),
		 MPP_VAR_FUNCTION(1, "spi0",    "miso",     V_88F6920_PLUS),
		 MPP_VAR_FUNCTION(2, "ua0",     "cts",      V_88F6920_PLUS),
		 MPP_VAR_FUNCTION(3, "ua1",     "rxd",      V_88F6920_PLUS),
156
		 MPP_VAR_FUNCTION(4, "sd0",     "d4",       V_88F6920_PLUS),
157
		 MPP_VAR_FUNCTION(5, "dev",     "ready",    V_88F6920_PLUS)),
158 159 160 161 162
	MPP_MODE(25,
		 MPP_VAR_FUNCTION(0, "gpio",    NULL,       V_88F6920_PLUS),
		 MPP_VAR_FUNCTION(1, "spi0",    "cs0",      V_88F6920_PLUS),
		 MPP_VAR_FUNCTION(2, "ua0",     "rts",      V_88F6920_PLUS),
		 MPP_VAR_FUNCTION(3, "ua1",     "txd",      V_88F6920_PLUS),
163
		 MPP_VAR_FUNCTION(4, "sd0",     "d5",       V_88F6920_PLUS),
164 165 166 167 168
		 MPP_VAR_FUNCTION(5, "dev",     "cs0",      V_88F6920_PLUS)),
	MPP_MODE(26,
		 MPP_VAR_FUNCTION(0, "gpio",    NULL,       V_88F6920_PLUS),
		 MPP_VAR_FUNCTION(1, "spi0",    "cs2",      V_88F6920_PLUS),
		 MPP_VAR_FUNCTION(3, "i2c1",    "sck",      V_88F6920_PLUS),
169
		 MPP_VAR_FUNCTION(4, "sd0",     "d6",       V_88F6920_PLUS),
170 171 172 173 174
		 MPP_VAR_FUNCTION(5, "dev",     "cs1",      V_88F6920_PLUS)),
	MPP_MODE(27,
		 MPP_VAR_FUNCTION(0, "gpio",    NULL,       V_88F6920_PLUS),
		 MPP_VAR_FUNCTION(1, "spi0",    "cs3",      V_88F6920_PLUS),
		 MPP_VAR_FUNCTION(3, "i2c1",    "sda",      V_88F6920_PLUS),
175
		 MPP_VAR_FUNCTION(4, "sd0",     "d7",       V_88F6920_PLUS),
176 177 178 179
		 MPP_VAR_FUNCTION(5, "dev",     "cs2",      V_88F6920_PLUS),
		 MPP_VAR_FUNCTION(8, "ge",      "txclkout", V_88F6920_PLUS)),
	MPP_MODE(28,
		 MPP_VAR_FUNCTION(0, "gpio",    NULL,       V_88F6920_PLUS),
180
		 MPP_VAR_FUNCTION(4, "sd0",     "clk",      V_88F6920_PLUS),
181 182 183 184 185 186 187 188
		 MPP_VAR_FUNCTION(5, "dev",     "ad5",      V_88F6920_PLUS),
		 MPP_VAR_FUNCTION(8, "ge",      "txd0",     V_88F6920_PLUS)),
	MPP_MODE(29,
		 MPP_VAR_FUNCTION(0, "gpio",    NULL,       V_88F6920_PLUS),
		 MPP_VAR_FUNCTION(5, "dev",     "ale0",     V_88F6920_PLUS),
		 MPP_VAR_FUNCTION(8, "ge",      "txd1",     V_88F6920_PLUS)),
	MPP_MODE(30,
		 MPP_VAR_FUNCTION(0, "gpio",    NULL,       V_88F6920_PLUS),
189
		 MPP_VAR_FUNCTION(5, "dev",     "oe",       V_88F6920_PLUS),
190 191 192 193 194 195 196
		 MPP_VAR_FUNCTION(8, "ge",      "txd2",     V_88F6920_PLUS)),
	MPP_MODE(31,
		 MPP_VAR_FUNCTION(0, "gpio",    NULL,       V_88F6920_PLUS),
		 MPP_VAR_FUNCTION(5, "dev",     "ale1",     V_88F6920_PLUS),
		 MPP_VAR_FUNCTION(8, "ge",      "txd3",     V_88F6920_PLUS)),
	MPP_MODE(32,
		 MPP_VAR_FUNCTION(0, "gpio",    NULL,       V_88F6920_PLUS),
197
		 MPP_VAR_FUNCTION(5, "dev",     "we0",      V_88F6920_PLUS),
198 199 200
		 MPP_VAR_FUNCTION(8, "ge",      "txctl",    V_88F6920_PLUS)),
	MPP_MODE(33,
		 MPP_VAR_FUNCTION(0, "gpio",    NULL,       V_88F6920_PLUS),
201
		 MPP_VAR_FUNCTION(1, "dram",    "deccerr",  V_88F6920_PLUS),
202 203 204 205 206 207 208 209 210 211 212 213 214
		 MPP_VAR_FUNCTION(5, "dev",     "ad3",      V_88F6920_PLUS)),
	MPP_MODE(34,
		 MPP_VAR_FUNCTION(0, "gpio",    NULL,       V_88F6920_PLUS),
		 MPP_VAR_FUNCTION(5, "dev",     "ad1",      V_88F6920_PLUS)),
	MPP_MODE(35,
		 MPP_VAR_FUNCTION(0, "gpio",    NULL,       V_88F6920_PLUS),
		 MPP_VAR_FUNCTION(1, "ref",     "clk",      V_88F6920_PLUS),
		 MPP_VAR_FUNCTION(5, "dev",     "a1",       V_88F6920_PLUS)),
	MPP_MODE(36,
		 MPP_VAR_FUNCTION(0, "gpio",    NULL,       V_88F6920_PLUS),
		 MPP_VAR_FUNCTION(5, "dev",     "a0",       V_88F6920_PLUS)),
	MPP_MODE(37,
		 MPP_VAR_FUNCTION(0, "gpio",    NULL,       V_88F6920_PLUS),
215
		 MPP_VAR_FUNCTION(4, "sd0",     "d3",       V_88F6920_PLUS),
216 217 218 219 220
		 MPP_VAR_FUNCTION(5, "dev",     "ad8",      V_88F6920_PLUS),
		 MPP_VAR_FUNCTION(8, "ge",      "rxclk",    V_88F6920_PLUS)),
	MPP_MODE(38,
		 MPP_VAR_FUNCTION(0, "gpio",    NULL,       V_88F6920_PLUS),
		 MPP_VAR_FUNCTION(3, "ref",     "clk",      V_88F6920_PLUS),
221
		 MPP_VAR_FUNCTION(4, "sd0",     "d0",       V_88F6920_PLUS),
222 223 224 225 226 227
		 MPP_VAR_FUNCTION(5, "dev",     "ad4",      V_88F6920_PLUS),
		 MPP_VAR_FUNCTION(8, "ge",      "rxd1",     V_88F6920_PLUS)),
	MPP_MODE(39,
		 MPP_VAR_FUNCTION(0, "gpio",    NULL,       V_88F6920_PLUS),
		 MPP_VAR_FUNCTION(1, "i2c1",    "sck",      V_88F6920_PLUS),
		 MPP_VAR_FUNCTION(3, "ua0",     "cts",      V_88F6920_PLUS),
228
		 MPP_VAR_FUNCTION(4, "sd0",     "d1",       V_88F6920_PLUS),
229 230 231 232 233 234
		 MPP_VAR_FUNCTION(5, "dev",     "a2",       V_88F6920_PLUS),
		 MPP_VAR_FUNCTION(8, "ge",      "rxd2",     V_88F6920_PLUS)),
	MPP_MODE(40,
		 MPP_VAR_FUNCTION(0, "gpio",    NULL,       V_88F6920_PLUS),
		 MPP_VAR_FUNCTION(1, "i2c1",    "sda",      V_88F6920_PLUS),
		 MPP_VAR_FUNCTION(3, "ua0",     "rts",      V_88F6920_PLUS),
235
		 MPP_VAR_FUNCTION(4, "sd0",     "d2",       V_88F6920_PLUS),
236 237 238 239 240 241 242
		 MPP_VAR_FUNCTION(5, "dev",     "ad6",      V_88F6920_PLUS),
		 MPP_VAR_FUNCTION(8, "ge",      "rxd3",     V_88F6920_PLUS)),
	MPP_MODE(41,
		 MPP_VAR_FUNCTION(0, "gpio",    NULL,       V_88F6920_PLUS),
		 MPP_VAR_FUNCTION(1, "ua1",     "rxd",      V_88F6920_PLUS),
		 MPP_VAR_FUNCTION(3, "ua0",     "cts",      V_88F6920_PLUS),
		 MPP_VAR_FUNCTION(4, "spi1",    "cs3",      V_88F6920_PLUS),
243
		 MPP_VAR_FUNCTION(5, "dev",     "burst/last", V_88F6920_PLUS),
244 245 246 247 248 249 250 251 252 253
		 MPP_VAR_FUNCTION(6, "nd",      "rbn0",     V_88F6920_PLUS),
		 MPP_VAR_FUNCTION(8, "ge",      "rxctl",    V_88F6920_PLUS)),
	MPP_MODE(42,
		 MPP_VAR_FUNCTION(0, "gpio",    NULL,       V_88F6920_PLUS),
		 MPP_VAR_FUNCTION(1, "ua1",     "txd",      V_88F6920_PLUS),
		 MPP_VAR_FUNCTION(3, "ua0",     "rts",      V_88F6920_PLUS),
		 MPP_VAR_FUNCTION(5, "dev",     "ad7",      V_88F6920_PLUS)),
	MPP_MODE(43,
		 MPP_VAR_FUNCTION(0, "gpio",    NULL,       V_88F6920_PLUS),
		 MPP_VAR_FUNCTION(1, "pcie0",   "clkreq",   V_88F6920_PLUS),
254 255
		 MPP_VAR_FUNCTION(2, "dram",    "vttctrl",  V_88F6920_PLUS),
		 MPP_VAR_FUNCTION(3, "dram",    "deccerr",  V_88F6920_PLUS),
256 257 258 259 260
		 MPP_VAR_FUNCTION(4, "spi1",    "cs2",      V_88F6920_PLUS),
		 MPP_VAR_FUNCTION(5, "dev",     "clkout",   V_88F6920_PLUS),
		 MPP_VAR_FUNCTION(6, "nd",      "rbn1",     V_88F6920_PLUS)),
	MPP_MODE(44,
		 MPP_VAR_FUNCTION(0, "gpio",    NULL,       V_88F6920_PLUS),
261 262
		 MPP_VAR_FUNCTION(1, "sata0",   "prsnt",    V_88F6928),
		 MPP_VAR_FUNCTION(2, "sata1",   "prsnt",    V_88F6928),
263 264 265 266 267 268 269 270 271 272 273 274 275 276
		 MPP_VAR_FUNCTION(7, "led",     "clk",      V_88F6920_PLUS)),
	MPP_MODE(45,
		 MPP_VAR_FUNCTION(0, "gpio",    NULL,       V_88F6920_PLUS),
		 MPP_VAR_FUNCTION(1, "ref",     "clk",      V_88F6920_PLUS),
		 MPP_VAR_FUNCTION(2, "pcie0",   "rstout",   V_88F6920_PLUS),
		 MPP_VAR_FUNCTION(6, "ua1",     "rxd",      V_88F6920_PLUS)),
	MPP_MODE(46,
		 MPP_VAR_FUNCTION(0, "gpio",    NULL,       V_88F6920_PLUS),
		 MPP_VAR_FUNCTION(1, "ref",     "clk",      V_88F6920_PLUS),
		 MPP_VAR_FUNCTION(2, "pcie0",   "rstout",   V_88F6920_PLUS),
		 MPP_VAR_FUNCTION(6, "ua1",     "txd",      V_88F6920_PLUS),
		 MPP_VAR_FUNCTION(7, "led",     "stb",      V_88F6920_PLUS)),
	MPP_MODE(47,
		 MPP_VAR_FUNCTION(0, "gpio",    NULL,       V_88F6920_PLUS),
277 278
		 MPP_VAR_FUNCTION(1, "sata0",   "prsnt",    V_88F6928),
		 MPP_VAR_FUNCTION(2, "sata1",   "prsnt",    V_88F6928),
279 280 281
		 MPP_VAR_FUNCTION(7, "led",     "data",     V_88F6920_PLUS)),
	MPP_MODE(48,
		 MPP_VAR_FUNCTION(0, "gpio",    NULL,       V_88F6920_PLUS),
282
		 MPP_VAR_FUNCTION(1, "sata0",   "prsnt",    V_88F6928),
283
		 MPP_VAR_FUNCTION(2, "dram",    "vttctrl",  V_88F6920_PLUS),
284 285
		 MPP_VAR_FUNCTION(3, "tdm",     "pclk",     V_88F6928),
		 MPP_VAR_FUNCTION(4, "audio",   "mclk",     V_88F6928),
286
		 MPP_VAR_FUNCTION(5, "sd0",     "d4",       V_88F6920_PLUS),
287 288 289 290 291 292
		 MPP_VAR_FUNCTION(6, "pcie0",   "clkreq",   V_88F6920_PLUS),
		 MPP_VAR_FUNCTION(7, "ua1",     "txd",      V_88F6920_PLUS)),
	MPP_MODE(49,
		 MPP_VAR_FUNCTION(0, "gpio",    NULL,       V_88F6920_PLUS),
		 MPP_VAR_FUNCTION(3, "tdm",     "fsync",    V_88F6928),
		 MPP_VAR_FUNCTION(4, "audio",   "lrclk",    V_88F6928),
293
		 MPP_VAR_FUNCTION(5, "sd0",     "d5",       V_88F6920_PLUS),
294 295 296 297 298 299
		 MPP_VAR_FUNCTION(7, "ua2",     "rxd",      V_88F6920_PLUS)),
	MPP_MODE(50,
		 MPP_VAR_FUNCTION(0, "gpio",    NULL,       V_88F6920_PLUS),
		 MPP_VAR_FUNCTION(1, "pcie0",   "rstout",   V_88F6920_PLUS),
		 MPP_VAR_FUNCTION(3, "tdm",     "drx",      V_88F6928),
		 MPP_VAR_FUNCTION(4, "audio",   "extclk",   V_88F6928),
300
		 MPP_VAR_FUNCTION(5, "sd0",     "cmd",      V_88F6920_PLUS),
301 302 303 304 305
		 MPP_VAR_FUNCTION(7, "ua2",     "rxd",      V_88F6920_PLUS)),
	MPP_MODE(51,
		 MPP_VAR_FUNCTION(0, "gpio",    NULL,       V_88F6920_PLUS),
		 MPP_VAR_FUNCTION(3, "tdm",     "dtx",      V_88F6928),
		 MPP_VAR_FUNCTION(4, "audio",   "sdo",      V_88F6928),
306
		 MPP_VAR_FUNCTION(5, "dram",    "deccerr",  V_88F6920_PLUS),
307 308 309 310 311 312
		 MPP_VAR_FUNCTION(7, "ua2",     "txd",      V_88F6920_PLUS)),
	MPP_MODE(52,
		 MPP_VAR_FUNCTION(0, "gpio",    NULL,       V_88F6920_PLUS),
		 MPP_VAR_FUNCTION(1, "pcie0",   "rstout",   V_88F6920_PLUS),
		 MPP_VAR_FUNCTION(3, "tdm",     "intn",     V_88F6928),
		 MPP_VAR_FUNCTION(4, "audio",   "sdi",      V_88F6928),
313
		 MPP_VAR_FUNCTION(5, "sd0",     "d6",       V_88F6920_PLUS),
314 315 316
		 MPP_VAR_FUNCTION(7, "i2c3",    "sck",      V_88F6920_PLUS)),
	MPP_MODE(53,
		 MPP_VAR_FUNCTION(0, "gpio",    NULL,       V_88F6920_PLUS),
317 318
		 MPP_VAR_FUNCTION(1, "sata1",   "prsnt",    V_88F6928),
		 MPP_VAR_FUNCTION(2, "sata0",   "prsnt",    V_88F6928),
319 320
		 MPP_VAR_FUNCTION(3, "tdm",     "rstn",     V_88F6928),
		 MPP_VAR_FUNCTION(4, "audio",   "bclk",     V_88F6928),
321
		 MPP_VAR_FUNCTION(5, "sd0",     "d7",       V_88F6920_PLUS),
322 323 324
		 MPP_VAR_FUNCTION(7, "i2c3",    "sda",      V_88F6920_PLUS)),
	MPP_MODE(54,
		 MPP_VAR_FUNCTION(0, "gpio",    NULL,       V_88F6920_PLUS),
325 326
		 MPP_VAR_FUNCTION(1, "sata0",   "prsnt",    V_88F6928),
		 MPP_VAR_FUNCTION(2, "sata1",   "prsnt",    V_88F6928),
327
		 MPP_VAR_FUNCTION(3, "pcie0",   "rstout",   V_88F6920_PLUS),
328
		 MPP_VAR_FUNCTION(5, "sd0",     "d3",       V_88F6920_PLUS),
329 330 331 332 333
		 MPP_VAR_FUNCTION(7, "ua3",     "txd",      V_88F6920_PLUS)),
	MPP_MODE(55,
		 MPP_VAR_FUNCTION(0, "gpio",    NULL,       V_88F6920_PLUS),
		 MPP_VAR_FUNCTION(1, "ua1",     "cts",      V_88F6920_PLUS),
		 MPP_VAR_FUNCTION(4, "spi1",    "cs1",      V_88F6920_PLUS),
334
		 MPP_VAR_FUNCTION(5, "sd0",     "d0",       V_88F6920_PLUS),
335 336 337 338 339
		 MPP_VAR_FUNCTION(6, "ua1",     "rxd",      V_88F6920_PLUS),
		 MPP_VAR_FUNCTION(7, "ua3",     "rxd",      V_88F6920_PLUS)),
	MPP_MODE(56,
		 MPP_VAR_FUNCTION(0, "gpio",    NULL,       V_88F6920_PLUS),
		 MPP_VAR_FUNCTION(1, "ua1",     "rts",      V_88F6920_PLUS),
340
		 MPP_VAR_FUNCTION(3, "dram",    "deccerr",  V_88F6920_PLUS),
341 342 343 344 345
		 MPP_VAR_FUNCTION(4, "spi1",    "mosi",     V_88F6920_PLUS),
		 MPP_VAR_FUNCTION(6, "ua1",     "txd",      V_88F6920_PLUS)),
	MPP_MODE(57,
		 MPP_VAR_FUNCTION(0, "gpio",    NULL,       V_88F6920_PLUS),
		 MPP_VAR_FUNCTION(4, "spi1",    "sck",      V_88F6920_PLUS),
346
		 MPP_VAR_FUNCTION(5, "sd0",     "clk",      V_88F6920_PLUS),
347 348 349 350 351 352
		 MPP_VAR_FUNCTION(6, "ua1",     "txd",      V_88F6920_PLUS)),
	MPP_MODE(58,
		 MPP_VAR_FUNCTION(0, "gpio",    NULL,       V_88F6920_PLUS),
		 MPP_VAR_FUNCTION(2, "i2c1",    "sck",      V_88F6920_PLUS),
		 MPP_VAR_FUNCTION(3, "pcie2",   "clkreq",   V_88F6920_PLUS),
		 MPP_VAR_FUNCTION(4, "spi1",    "miso",     V_88F6920_PLUS),
353
		 MPP_VAR_FUNCTION(5, "sd0",     "d1",       V_88F6920_PLUS),
354 355 356 357 358 359
		 MPP_VAR_FUNCTION(6, "ua1",     "rxd",      V_88F6920_PLUS)),
	MPP_MODE(59,
		 MPP_VAR_FUNCTION(0, "gpio",    NULL,       V_88F6920_PLUS),
		 MPP_VAR_FUNCTION(1, "pcie0",   "rstout",   V_88F6920_PLUS),
		 MPP_VAR_FUNCTION(2, "i2c1",    "sda",      V_88F6920_PLUS),
		 MPP_VAR_FUNCTION(4, "spi1",    "cs0",      V_88F6920_PLUS),
360
		 MPP_VAR_FUNCTION(5, "sd0",     "d2",       V_88F6920_PLUS)),
361 362 363 364
};

static struct mvebu_pinctrl_soc_info armada_39x_pinctrl_info;

365
static const struct of_device_id armada_39x_pinctrl_of_match[] = {
366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382
	{
		.compatible = "marvell,mv88f6920-pinctrl",
		.data       = (void *) V_88F6920,
	},
	{
		.compatible = "marvell,mv88f6928-pinctrl",
		.data       = (void *) V_88F6928,
	},
	{ },
};

static struct mvebu_mpp_ctrl armada_39x_mpp_controls[] = {
	MPP_FUNC_CTRL(0, 59, NULL, armada_39x_mpp_ctrl),
};

static struct pinctrl_gpio_range armada_39x_mpp_gpio_ranges[] = {
	MPP_GPIO_RANGE(0,   0,  0, 32),
383
	MPP_GPIO_RANGE(1,  32, 32, 28),
384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432
};

static int armada_39x_pinctrl_probe(struct platform_device *pdev)
{
	struct mvebu_pinctrl_soc_info *soc = &armada_39x_pinctrl_info;
	const struct of_device_id *match =
		of_match_device(armada_39x_pinctrl_of_match, &pdev->dev);
	struct resource *res;

	if (!match)
		return -ENODEV;

	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
	mpp_base = devm_ioremap_resource(&pdev->dev, res);
	if (IS_ERR(mpp_base))
		return PTR_ERR(mpp_base);

	soc->variant = (unsigned) match->data & 0xff;
	soc->controls = armada_39x_mpp_controls;
	soc->ncontrols = ARRAY_SIZE(armada_39x_mpp_controls);
	soc->gpioranges = armada_39x_mpp_gpio_ranges;
	soc->ngpioranges = ARRAY_SIZE(armada_39x_mpp_gpio_ranges);
	soc->modes = armada_39x_mpp_modes;
	soc->nmodes = armada_39x_mpp_controls[0].npins;

	pdev->dev.platform_data = soc;

	return mvebu_pinctrl_probe(pdev);
}

static int armada_39x_pinctrl_remove(struct platform_device *pdev)
{
	return mvebu_pinctrl_remove(pdev);
}

static struct platform_driver armada_39x_pinctrl_driver = {
	.driver = {
		.name = "armada-39x-pinctrl",
		.of_match_table = of_match_ptr(armada_39x_pinctrl_of_match),
	},
	.probe = armada_39x_pinctrl_probe,
	.remove = armada_39x_pinctrl_remove,
};

module_platform_driver(armada_39x_pinctrl_driver);

MODULE_AUTHOR("Thomas Petazzoni <thomas.petazzoni@free-electrons.com>");
MODULE_DESCRIPTION("Marvell Armada 39x pinctrl driver");
MODULE_LICENSE("GPL v2");