pinctrl-armada-38x.c 21.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
/*
 * Marvell Armada 380/385 pinctrl driver based on mvebu pinctrl core
 *
 * Copyright (C) 2013 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;

27 28
static int armada_38x_mpp_ctrl_get(struct mvebu_mpp_ctrl_data *data,
				   unsigned pid, unsigned long *config)
29 30 31 32
{
	return default_mpp_ctrl_get(mpp_base, pid, config);
}

33 34
static int armada_38x_mpp_ctrl_set(struct mvebu_mpp_ctrl_data *data,
				   unsigned pid, unsigned long config)
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 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
{
	return default_mpp_ctrl_set(mpp_base, pid, config);
}

enum {
	V_88F6810 = BIT(0),
	V_88F6820 = BIT(1),
	V_88F6828 = BIT(2),
	V_88F6810_PLUS = (V_88F6810 | V_88F6820 | V_88F6828),
	V_88F6820_PLUS = (V_88F6820 | V_88F6828),
};

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

static struct mvebu_pinctrl_soc_info armada_38x_pinctrl_info;

398
static const struct of_device_id armada_38x_pinctrl_of_match[] = {
399 400 401 402 403 404 405 406 407 408 409 410 411 412 413
	{
		.compatible = "marvell,mv88f6810-pinctrl",
		.data       = (void *) V_88F6810,
	},
	{
		.compatible = "marvell,mv88f6820-pinctrl",
		.data       = (void *) V_88F6820,
	},
	{
		.compatible = "marvell,mv88f6828-pinctrl",
		.data       = (void *) V_88F6828,
	},
	{ },
};

414
static const struct mvebu_mpp_ctrl armada_38x_mpp_controls[] = {
415 416 417 418 419
	MPP_FUNC_CTRL(0, 59, NULL, armada_38x_mpp_ctrl),
};

static struct pinctrl_gpio_range armada_38x_mpp_gpio_ranges[] = {
	MPP_GPIO_RANGE(0,   0,  0, 32),
420
	MPP_GPIO_RANGE(1,  32, 32, 28),
421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463
};

static int armada_38x_pinctrl_probe(struct platform_device *pdev)
{
	struct mvebu_pinctrl_soc_info *soc = &armada_38x_pinctrl_info;
	const struct of_device_id *match =
		of_match_device(armada_38x_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_38x_mpp_controls;
	soc->ncontrols = ARRAY_SIZE(armada_38x_mpp_controls);
	soc->gpioranges = armada_38x_mpp_gpio_ranges;
	soc->ngpioranges = ARRAY_SIZE(armada_38x_mpp_gpio_ranges);
	soc->modes = armada_38x_mpp_modes;
	soc->nmodes = armada_38x_mpp_controls[0].npins;

	pdev->dev.platform_data = soc;

	return mvebu_pinctrl_probe(pdev);
}

static struct platform_driver armada_38x_pinctrl_driver = {
	.driver = {
		.name = "armada-38x-pinctrl",
		.of_match_table = of_match_ptr(armada_38x_pinctrl_of_match),
	},
	.probe = armada_38x_pinctrl_probe,
};

module_platform_driver(armada_38x_pinctrl_driver);

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