brintos

brintos / linux-shallow public Read only

0
0
Text · 12.8 KiB · a50c218 Raw
404 lines · c
1// SPDX-License-Identifier: GPL-2.0-or-later2/*3 * Marvell Armada 370 pinctrl driver based on mvebu pinctrl core4 *5 * Copyright (C) 2012 Marvell6 *7 * Thomas Petazzoni <thomas.petazzoni@free-electrons.com>8 */9 10#include <linux/err.h>11#include <linux/init.h>12#include <linux/io.h>13#include <linux/platform_device.h>14#include <linux/clk.h>15#include <linux/of.h>16#include <linux/pinctrl/pinctrl.h>17 18#include "pinctrl-mvebu.h"19 20static struct mvebu_mpp_mode mv88f6710_mpp_modes[] = {21	MPP_MODE(0,22	   MPP_FUNCTION(0x0, "gpio", NULL),23	   MPP_FUNCTION(0x1, "uart0", "rxd")),24	MPP_MODE(1,25	   MPP_FUNCTION(0x0, "gpo", NULL),26	   MPP_FUNCTION(0x1, "uart0", "txd")),27	MPP_MODE(2,28	   MPP_FUNCTION(0x0, "gpio", NULL),29	   MPP_FUNCTION(0x1, "i2c0", "sck"),30	   MPP_FUNCTION(0x2, "uart0", "txd")),31	MPP_MODE(3,32	   MPP_FUNCTION(0x0, "gpio", NULL),33	   MPP_FUNCTION(0x1, "i2c0", "sda"),34	   MPP_FUNCTION(0x2, "uart0", "rxd")),35	MPP_MODE(4,36	   MPP_FUNCTION(0x0, "gpio", NULL),37	   MPP_FUNCTION(0x1, "vdd", "cpu-pd")),38	MPP_MODE(5,39	   MPP_FUNCTION(0x0, "gpo", NULL),40	   MPP_FUNCTION(0x1, "ge0", "txclkout"),41	   MPP_FUNCTION(0x2, "uart1", "txd"),42	   MPP_FUNCTION(0x4, "spi1", "sck"),43	   MPP_FUNCTION(0x5, "audio", "mclk")),44	MPP_MODE(6,45	   MPP_FUNCTION(0x0, "gpio", NULL),46	   MPP_FUNCTION(0x1, "ge0", "txd0"),47	   MPP_FUNCTION(0x2, "sata0", "prsnt"),48	   MPP_FUNCTION(0x4, "tdm", "rst"),49	   MPP_FUNCTION(0x5, "audio", "sdo")),50	MPP_MODE(7,51	   MPP_FUNCTION(0x0, "gpo", NULL),52	   MPP_FUNCTION(0x1, "ge0", "txd1"),53	   MPP_FUNCTION(0x4, "tdm", "dtx"),54	   MPP_FUNCTION(0x5, "audio", "lrclk")),55	MPP_MODE(8,56	   MPP_FUNCTION(0x0, "gpio", NULL),57	   MPP_FUNCTION(0x1, "ge0", "txd2"),58	   MPP_FUNCTION(0x2, "uart0", "rts"),59	   MPP_FUNCTION(0x4, "tdm", "drx"),60	   MPP_FUNCTION(0x5, "audio", "bclk")),61	MPP_MODE(9,62	   MPP_FUNCTION(0x0, "gpo", NULL),63	   MPP_FUNCTION(0x1, "ge0", "txd3"),64	   MPP_FUNCTION(0x2, "uart1", "txd"),65	   MPP_FUNCTION(0x3, "sd0", "clk"),66	   MPP_FUNCTION(0x5, "audio", "spdifo")),67	MPP_MODE(10,68	   MPP_FUNCTION(0x0, "gpio", NULL),69	   MPP_FUNCTION(0x1, "ge0", "txctl"),70	   MPP_FUNCTION(0x2, "uart0", "cts"),71	   MPP_FUNCTION(0x4, "tdm", "fsync"),72	   MPP_FUNCTION(0x5, "audio", "sdi")),73	MPP_MODE(11,74	   MPP_FUNCTION(0x0, "gpio", NULL),75	   MPP_FUNCTION(0x1, "ge0", "rxd0"),76	   MPP_FUNCTION(0x2, "uart1", "rxd"),77	   MPP_FUNCTION(0x3, "sd0", "cmd"),78	   MPP_FUNCTION(0x4, "spi0", "cs1"),79	   MPP_FUNCTION(0x5, "sata1", "prsnt"),80	   MPP_FUNCTION(0x6, "spi1", "cs1")),81	MPP_MODE(12,82	   MPP_FUNCTION(0x0, "gpio", NULL),83	   MPP_FUNCTION(0x1, "ge0", "rxd1"),84	   MPP_FUNCTION(0x2, "i2c1", "sda"),85	   MPP_FUNCTION(0x3, "sd0", "d0"),86	   MPP_FUNCTION(0x4, "spi1", "cs0"),87	   MPP_FUNCTION(0x5, "audio", "spdifi")),88	MPP_MODE(13,89	   MPP_FUNCTION(0x0, "gpio", NULL),90	   MPP_FUNCTION(0x1, "ge0", "rxd2"),91	   MPP_FUNCTION(0x2, "i2c1", "sck"),92	   MPP_FUNCTION(0x3, "sd0", "d1"),93	   MPP_FUNCTION(0x4, "tdm", "pclk"),94	   MPP_FUNCTION(0x5, "audio", "rmclk")),95	MPP_MODE(14,96	   MPP_FUNCTION(0x0, "gpio", NULL),97	   MPP_FUNCTION(0x1, "ge0", "rxd3"),98	   MPP_FUNCTION(0x2, "pcie", "clkreq0"),99	   MPP_FUNCTION(0x3, "sd0", "d2"),100	   MPP_FUNCTION(0x4, "spi1", "mosi"),101	   MPP_FUNCTION(0x5, "spi0", "cs2")),102	MPP_MODE(15,103	   MPP_FUNCTION(0x0, "gpio", NULL),104	   MPP_FUNCTION(0x1, "ge0", "rxctl"),105	   MPP_FUNCTION(0x2, "pcie", "clkreq1"),106	   MPP_FUNCTION(0x3, "sd0", "d3"),107	   MPP_FUNCTION(0x4, "spi1", "miso"),108	   MPP_FUNCTION(0x5, "spi0", "cs3")),109	MPP_MODE(16,110	   MPP_FUNCTION(0x0, "gpio", NULL),111	   MPP_FUNCTION(0x1, "ge0", "rxclk"),112	   MPP_FUNCTION(0x2, "uart1", "rxd"),113	   MPP_FUNCTION(0x4, "tdm", "int"),114	   MPP_FUNCTION(0x5, "audio", "extclk")),115	MPP_MODE(17,116	   MPP_FUNCTION(0x0, "gpo", NULL),117	   MPP_FUNCTION(0x1, "ge", "mdc")),118	MPP_MODE(18,119	   MPP_FUNCTION(0x0, "gpio", NULL),120	   MPP_FUNCTION(0x1, "ge", "mdio")),121	MPP_MODE(19,122	   MPP_FUNCTION(0x0, "gpio", NULL),123	   MPP_FUNCTION(0x1, "ge0", "txclk"),124	   MPP_FUNCTION(0x2, "ge1", "txclkout"),125	   MPP_FUNCTION(0x4, "tdm", "pclk")),126	MPP_MODE(20,127	   MPP_FUNCTION(0x0, "gpo", NULL),128	   MPP_FUNCTION(0x1, "ge0", "txd4"),129	   MPP_FUNCTION(0x2, "ge1", "txd0")),130	MPP_MODE(21,131	   MPP_FUNCTION(0x0, "gpo", NULL),132	   MPP_FUNCTION(0x1, "ge0", "txd5"),133	   MPP_FUNCTION(0x2, "ge1", "txd1"),134	   MPP_FUNCTION(0x4, "uart1", "txd")),135	MPP_MODE(22,136	   MPP_FUNCTION(0x0, "gpo", NULL),137	   MPP_FUNCTION(0x1, "ge0", "txd6"),138	   MPP_FUNCTION(0x2, "ge1", "txd2"),139	   MPP_FUNCTION(0x4, "uart0", "rts")),140	MPP_MODE(23,141	   MPP_FUNCTION(0x0, "gpo", NULL),142	   MPP_FUNCTION(0x1, "ge0", "txd7"),143	   MPP_FUNCTION(0x2, "ge1", "txd3"),144	   MPP_FUNCTION(0x4, "spi1", "mosi")),145	MPP_MODE(24,146	   MPP_FUNCTION(0x0, "gpio", NULL),147	   MPP_FUNCTION(0x1, "ge0", "col"),148	   MPP_FUNCTION(0x2, "ge1", "txctl"),149	   MPP_FUNCTION(0x4, "spi1", "cs0")),150	MPP_MODE(25,151	   MPP_FUNCTION(0x0, "gpio", NULL),152	   MPP_FUNCTION(0x1, "ge0", "rxerr"),153	   MPP_FUNCTION(0x2, "ge1", "rxd0"),154	   MPP_FUNCTION(0x4, "uart1", "rxd")),155	MPP_MODE(26,156	   MPP_FUNCTION(0x0, "gpio", NULL),157	   MPP_FUNCTION(0x1, "ge0", "crs"),158	   MPP_FUNCTION(0x2, "ge1", "rxd1"),159	   MPP_FUNCTION(0x4, "spi1", "miso")),160	MPP_MODE(27,161	   MPP_FUNCTION(0x0, "gpio", NULL),162	   MPP_FUNCTION(0x1, "ge0", "rxd4"),163	   MPP_FUNCTION(0x2, "ge1", "rxd2"),164	   MPP_FUNCTION(0x4, "uart0", "cts")),165	MPP_MODE(28,166	   MPP_FUNCTION(0x0, "gpio", NULL),167	   MPP_FUNCTION(0x1, "ge0", "rxd5"),168	   MPP_FUNCTION(0x2, "ge1", "rxd3")),169	MPP_MODE(29,170	   MPP_FUNCTION(0x0, "gpio", NULL),171	   MPP_FUNCTION(0x1, "ge0", "rxd6"),172	   MPP_FUNCTION(0x2, "ge1", "rxctl"),173	   MPP_FUNCTION(0x4, "i2c1", "sda")),174	MPP_MODE(30,175	   MPP_FUNCTION(0x0, "gpio", NULL),176	   MPP_FUNCTION(0x1, "ge0", "rxd7"),177	   MPP_FUNCTION(0x2, "ge1", "rxclk"),178	   MPP_FUNCTION(0x4, "i2c1", "sck")),179	MPP_MODE(31,180	   MPP_FUNCTION(0x0, "gpio", NULL),181	   MPP_FUNCTION(0x3, "tclk", NULL),182	   MPP_FUNCTION(0x4, "ge0", "txerr")),183	MPP_MODE(32,184	   MPP_FUNCTION(0x0, "gpio", NULL),185	   MPP_FUNCTION(0x1, "spi0", "cs0")),186	MPP_MODE(33,187	   MPP_FUNCTION(0x0, "gpio", NULL),188	   MPP_FUNCTION(0x1, "dev", "bootcs"),189	   MPP_FUNCTION(0x2, "spi0", "cs0")),190	MPP_MODE(34,191	   MPP_FUNCTION(0x0, "gpo", NULL),192	   MPP_FUNCTION(0x1, "dev", "we0"),193	   MPP_FUNCTION(0x2, "spi0", "mosi")),194	MPP_MODE(35,195	   MPP_FUNCTION(0x0, "gpo", NULL),196	   MPP_FUNCTION(0x1, "dev", "oe"),197	   MPP_FUNCTION(0x2, "spi0", "sck")),198	MPP_MODE(36,199	   MPP_FUNCTION(0x0, "gpo", NULL),200	   MPP_FUNCTION(0x1, "dev", "a1"),201	   MPP_FUNCTION(0x2, "spi0", "miso")),202	MPP_MODE(37,203	   MPP_FUNCTION(0x0, "gpo", NULL),204	   MPP_FUNCTION(0x1, "dev", "a0"),205	   MPP_FUNCTION(0x2, "sata0", "prsnt")),206	MPP_MODE(38,207	   MPP_FUNCTION(0x0, "gpio", NULL),208	   MPP_FUNCTION(0x1, "dev", "ready"),209	   MPP_FUNCTION(0x2, "uart1", "cts"),210	   MPP_FUNCTION(0x3, "uart0", "cts")),211	MPP_MODE(39,212	   MPP_FUNCTION(0x0, "gpo", NULL),213	   MPP_FUNCTION(0x1, "dev", "ad0"),214	   MPP_FUNCTION(0x2, "audio", "spdifo")),215	MPP_MODE(40,216	   MPP_FUNCTION(0x0, "gpio", NULL),217	   MPP_FUNCTION(0x1, "dev", "ad1"),218	   MPP_FUNCTION(0x2, "uart1", "rts"),219	   MPP_FUNCTION(0x3, "uart0", "rts")),220	MPP_MODE(41,221	   MPP_FUNCTION(0x0, "gpio", NULL),222	   MPP_FUNCTION(0x1, "dev", "ad2"),223	   MPP_FUNCTION(0x2, "uart1", "rxd")),224	MPP_MODE(42,225	   MPP_FUNCTION(0x0, "gpo", NULL),226	   MPP_FUNCTION(0x1, "dev", "ad3"),227	   MPP_FUNCTION(0x2, "uart1", "txd")),228	MPP_MODE(43,229	   MPP_FUNCTION(0x0, "gpo", NULL),230	   MPP_FUNCTION(0x1, "dev", "ad4"),231	   MPP_FUNCTION(0x2, "audio", "bclk")),232	MPP_MODE(44,233	   MPP_FUNCTION(0x0, "gpo", NULL),234	   MPP_FUNCTION(0x1, "dev", "ad5"),235	   MPP_FUNCTION(0x2, "audio", "mclk")),236	MPP_MODE(45,237	   MPP_FUNCTION(0x0, "gpo", NULL),238	   MPP_FUNCTION(0x1, "dev", "ad6"),239	   MPP_FUNCTION(0x2, "audio", "lrclk")),240	MPP_MODE(46,241	   MPP_FUNCTION(0x0, "gpo", NULL),242	   MPP_FUNCTION(0x1, "dev", "ad7"),243	   MPP_FUNCTION(0x2, "audio", "sdo")),244	MPP_MODE(47,245	   MPP_FUNCTION(0x0, "gpo", NULL),246	   MPP_FUNCTION(0x1, "dev", "ad8"),247	   MPP_FUNCTION(0x3, "sd0", "clk"),248	   MPP_FUNCTION(0x5, "audio", "spdifo")),249	MPP_MODE(48,250	   MPP_FUNCTION(0x0, "gpio", NULL),251	   MPP_FUNCTION(0x1, "dev", "ad9"),252	   MPP_FUNCTION(0x2, "uart0", "rts"),253	   MPP_FUNCTION(0x3, "sd0", "cmd"),254	   MPP_FUNCTION(0x4, "sata1", "prsnt"),255	   MPP_FUNCTION(0x5, "spi0", "cs1")),256	MPP_MODE(49,257	   MPP_FUNCTION(0x0, "gpio", NULL),258	   MPP_FUNCTION(0x1, "dev", "ad10"),259	   MPP_FUNCTION(0x2, "pcie", "clkreq1"),260	   MPP_FUNCTION(0x3, "sd0", "d0"),261	   MPP_FUNCTION(0x4, "spi1", "cs0"),262	   MPP_FUNCTION(0x5, "audio", "spdifi")),263	MPP_MODE(50,264	   MPP_FUNCTION(0x0, "gpio", NULL),265	   MPP_FUNCTION(0x1, "dev", "ad11"),266	   MPP_FUNCTION(0x2, "uart0", "cts"),267	   MPP_FUNCTION(0x3, "sd0", "d1"),268	   MPP_FUNCTION(0x4, "spi1", "miso"),269	   MPP_FUNCTION(0x5, "audio", "rmclk")),270	MPP_MODE(51,271	   MPP_FUNCTION(0x0, "gpio", NULL),272	   MPP_FUNCTION(0x1, "dev", "ad12"),273	   MPP_FUNCTION(0x2, "i2c1", "sda"),274	   MPP_FUNCTION(0x3, "sd0", "d2"),275	   MPP_FUNCTION(0x4, "spi1", "mosi")),276	MPP_MODE(52,277	   MPP_FUNCTION(0x0, "gpio", NULL),278	   MPP_FUNCTION(0x1, "dev", "ad13"),279	   MPP_FUNCTION(0x2, "i2c1", "sck"),280	   MPP_FUNCTION(0x3, "sd0", "d3"),281	   MPP_FUNCTION(0x4, "spi1", "sck")),282	MPP_MODE(53,283	   MPP_FUNCTION(0x0, "gpio", NULL),284	   MPP_FUNCTION(0x1, "dev", "ad14"),285	   MPP_FUNCTION(0x2, "sd0", "clk"),286	   MPP_FUNCTION(0x3, "tdm", "pclk"),287	   MPP_FUNCTION(0x4, "spi0", "cs2"),288	   MPP_FUNCTION(0x5, "pcie", "clkreq1")),289	MPP_MODE(54,290	   MPP_FUNCTION(0x0, "gpo", NULL),291	   MPP_FUNCTION(0x1, "dev", "ad15"),292	   MPP_FUNCTION(0x3, "tdm", "dtx")),293	MPP_MODE(55,294	   MPP_FUNCTION(0x0, "gpio", NULL),295	   MPP_FUNCTION(0x1, "dev", "cs1"),296	   MPP_FUNCTION(0x2, "uart1", "txd"),297	   MPP_FUNCTION(0x3, "tdm", "rst"),298	   MPP_FUNCTION(0x4, "sata1", "prsnt"),299	   MPP_FUNCTION(0x5, "sata0", "prsnt")),300	MPP_MODE(56,301	   MPP_FUNCTION(0x0, "gpio", NULL),302	   MPP_FUNCTION(0x1, "dev", "cs2"),303	   MPP_FUNCTION(0x2, "uart1", "cts"),304	   MPP_FUNCTION(0x3, "uart0", "cts"),305	   MPP_FUNCTION(0x4, "spi0", "cs3"),306	   MPP_FUNCTION(0x5, "pcie", "clkreq0"),307	   MPP_FUNCTION(0x6, "spi1", "cs1")),308	MPP_MODE(57,309	   MPP_FUNCTION(0x0, "gpio", NULL),310	   MPP_FUNCTION(0x1, "dev", "cs3"),311	   MPP_FUNCTION(0x2, "uart1", "rxd"),312	   MPP_FUNCTION(0x3, "tdm", "fsync"),313	   MPP_FUNCTION(0x4, "sata0", "prsnt"),314	   MPP_FUNCTION(0x5, "audio", "sdo")),315	MPP_MODE(58,316	   MPP_FUNCTION(0x0, "gpio", NULL),317	   MPP_FUNCTION(0x1, "dev", "cs0"),318	   MPP_FUNCTION(0x2, "uart1", "rts"),319	   MPP_FUNCTION(0x3, "tdm", "int"),320	   MPP_FUNCTION(0x5, "audio", "extclk"),321	   MPP_FUNCTION(0x6, "uart0", "rts")),322	MPP_MODE(59,323	   MPP_FUNCTION(0x0, "gpo", NULL),324	   MPP_FUNCTION(0x1, "dev", "ale0"),325	   MPP_FUNCTION(0x2, "uart1", "rts"),326	   MPP_FUNCTION(0x3, "uart0", "rts"),327	   MPP_FUNCTION(0x5, "audio", "bclk")),328	MPP_MODE(60,329	   MPP_FUNCTION(0x0, "gpio", NULL),330	   MPP_FUNCTION(0x1, "dev", "ale1"),331	   MPP_FUNCTION(0x2, "uart1", "rxd"),332	   MPP_FUNCTION(0x3, "sata0", "prsnt"),333	   MPP_FUNCTION(0x4, "pcie", "rstout"),334	   MPP_FUNCTION(0x5, "audio", "sdi")),335	MPP_MODE(61,336	   MPP_FUNCTION(0x0, "gpo", NULL),337	   MPP_FUNCTION(0x1, "dev", "we1"),338	   MPP_FUNCTION(0x2, "uart1", "txd"),339	   MPP_FUNCTION(0x5, "audio", "lrclk")),340	MPP_MODE(62,341	   MPP_FUNCTION(0x0, "gpio", NULL),342	   MPP_FUNCTION(0x1, "dev", "a2"),343	   MPP_FUNCTION(0x2, "uart1", "cts"),344	   MPP_FUNCTION(0x3, "tdm", "drx"),345	   MPP_FUNCTION(0x4, "pcie", "clkreq0"),346	   MPP_FUNCTION(0x5, "audio", "mclk"),347	   MPP_FUNCTION(0x6, "uart0", "cts")),348	MPP_MODE(63,349	   MPP_FUNCTION(0x0, "gpio", NULL),350	   MPP_FUNCTION(0x1, "spi0", "sck"),351	   MPP_FUNCTION(0x2, "tclk", NULL)),352	MPP_MODE(64,353	   MPP_FUNCTION(0x0, "gpio", NULL),354	   MPP_FUNCTION(0x1, "spi0", "miso"),355	   MPP_FUNCTION(0x2, "spi0", "cs1")),356	MPP_MODE(65,357	   MPP_FUNCTION(0x0, "gpio", NULL),358	   MPP_FUNCTION(0x1, "spi0", "mosi"),359	   MPP_FUNCTION(0x2, "spi0", "cs2")),360};361 362static struct mvebu_pinctrl_soc_info armada_370_pinctrl_info;363 364static const struct of_device_id armada_370_pinctrl_of_match[] = {365	{ .compatible = "marvell,mv88f6710-pinctrl" },366	{ },367};368 369static const struct mvebu_mpp_ctrl mv88f6710_mpp_controls[] = {370	MPP_FUNC_CTRL(0, 65, NULL, mvebu_mmio_mpp_ctrl),371};372 373static struct pinctrl_gpio_range mv88f6710_mpp_gpio_ranges[] = {374	MPP_GPIO_RANGE(0,   0,  0, 32),375	MPP_GPIO_RANGE(1,  32, 32, 32),376	MPP_GPIO_RANGE(2,  64, 64,  2),377};378 379static int armada_370_pinctrl_probe(struct platform_device *pdev)380{381	struct mvebu_pinctrl_soc_info *soc = &armada_370_pinctrl_info;382 383	soc->variant = 0; /* no variants for Armada 370 */384	soc->controls = mv88f6710_mpp_controls;385	soc->ncontrols = ARRAY_SIZE(mv88f6710_mpp_controls);386	soc->modes = mv88f6710_mpp_modes;387	soc->nmodes = ARRAY_SIZE(mv88f6710_mpp_modes);388	soc->gpioranges = mv88f6710_mpp_gpio_ranges;389	soc->ngpioranges = ARRAY_SIZE(mv88f6710_mpp_gpio_ranges);390 391	pdev->dev.platform_data = soc;392 393	return mvebu_pinctrl_simple_mmio_probe(pdev);394}395 396static struct platform_driver armada_370_pinctrl_driver = {397	.driver = {398		.name = "armada-370-pinctrl",399		.of_match_table = armada_370_pinctrl_of_match,400	},401	.probe = armada_370_pinctrl_probe,402};403builtin_platform_driver(armada_370_pinctrl_driver);404