2019-05-27 09:55:01 +03:00
// SPDX-License-Identifier: GPL-2.0-or-later
2017-06-12 18:34:57 +03:00
/*
* Marvell Armada CP110 pinctrl driver based on mvebu pinctrl core
*
* Copyright ( C ) 2017 Marvell
*
* Hanna Hawa < hannah @ marvell . com >
*/
# include <linux/err.h>
# include <linux/init.h>
# include <linux/io.h>
# include <linux/mfd/syscon.h>
# include <linux/of.h>
# include <linux/pinctrl/pinctrl.h>
# include <linux/platform_device.h>
2023-10-09 20:29:13 +03:00
# include <linux/property.h>
2017-06-12 18:34:57 +03:00
# include "pinctrl-mvebu.h"
/*
* Even if the pin controller is the same the MMP available depend on the SoC
* integration .
* - In Armada7K ( single CP ) almost all the MPPs are available ( except the
* MMP 39 to 43 )
* - In Armada8K ( dual CP ) the MPPs are split into 2 parts , MPPs 0 - 31 from
* CPS , and MPPs 32 - 62 from CPM , the below flags ( V_ARMADA_8K_CPM ,
* V_ARMADA_8K_CPS ) set which MPP is available to the CPx .
* The x_PLUS enum mean that the MPP available for CPx and for Armada70x0
*/
enum {
V_ARMADA_7K = BIT ( 0 ) ,
V_ARMADA_8K_CPM = BIT ( 1 ) ,
V_ARMADA_8K_CPS = BIT ( 2 ) ,
2019-08-05 13:16:07 +03:00
V_CP115_STANDALONE = BIT ( 3 ) ,
2017-06-12 18:34:57 +03:00
V_ARMADA_7K_8K_CPM = ( V_ARMADA_7K | V_ARMADA_8K_CPM ) ,
V_ARMADA_7K_8K_CPS = ( V_ARMADA_7K | V_ARMADA_8K_CPS ) ,
} ;
static struct mvebu_mpp_mode armada_cp110_mpp_modes [ ] = {
MPP_MODE ( 0 ,
MPP_FUNCTION ( 0 , " gpio " , NULL ) ,
MPP_FUNCTION ( 1 , " dev " , " ale1 " ) ,
MPP_FUNCTION ( 2 , " au " , " i2smclk " ) ,
MPP_FUNCTION ( 3 , " ge0 " , " rxd3 " ) ,
MPP_FUNCTION ( 4 , " tdm " , " pclk " ) ,
MPP_FUNCTION ( 6 , " ptp " , " pulse " ) ,
MPP_FUNCTION ( 7 , " mss_i2c " , " sda " ) ,
MPP_FUNCTION ( 8 , " uart0 " , " rxd " ) ,
MPP_FUNCTION ( 9 , " sata0 " , " present_act " ) ,
MPP_FUNCTION ( 10 , " ge " , " mdio " ) ) ,
MPP_MODE ( 1 ,
MPP_FUNCTION ( 0 , " gpio " , NULL ) ,
MPP_FUNCTION ( 1 , " dev " , " ale0 " ) ,
MPP_FUNCTION ( 2 , " au " , " i2sdo_spdifo " ) ,
MPP_FUNCTION ( 3 , " ge0 " , " rxd2 " ) ,
MPP_FUNCTION ( 4 , " tdm " , " drx " ) ,
MPP_FUNCTION ( 6 , " ptp " , " clk " ) ,
MPP_FUNCTION ( 7 , " mss_i2c " , " sck " ) ,
MPP_FUNCTION ( 8 , " uart0 " , " txd " ) ,
MPP_FUNCTION ( 9 , " sata1 " , " present_act " ) ,
MPP_FUNCTION ( 10 , " ge " , " mdc " ) ) ,
MPP_MODE ( 2 ,
MPP_FUNCTION ( 0 , " gpio " , NULL ) ,
MPP_FUNCTION ( 1 , " dev " , " ad15 " ) ,
MPP_FUNCTION ( 2 , " au " , " i2sextclk " ) ,
MPP_FUNCTION ( 3 , " ge0 " , " rxd1 " ) ,
MPP_FUNCTION ( 4 , " tdm " , " dtx " ) ,
MPP_FUNCTION ( 5 , " mss_uart " , " rxd " ) ,
MPP_FUNCTION ( 6 , " ptp " , " pclk_out " ) ,
MPP_FUNCTION ( 7 , " i2c1 " , " sck " ) ,
MPP_FUNCTION ( 8 , " uart1 " , " rxd " ) ,
MPP_FUNCTION ( 9 , " sata0 " , " present_act " ) ,
MPP_FUNCTION ( 10 , " xg " , " mdc " ) ) ,
MPP_MODE ( 3 ,
MPP_FUNCTION ( 0 , " gpio " , NULL ) ,
MPP_FUNCTION ( 1 , " dev " , " ad14 " ) ,
MPP_FUNCTION ( 2 , " au " , " i2slrclk " ) ,
MPP_FUNCTION ( 3 , " ge0 " , " rxd0 " ) ,
MPP_FUNCTION ( 4 , " tdm " , " fsync " ) ,
MPP_FUNCTION ( 5 , " mss_uart " , " txd " ) ,
MPP_FUNCTION ( 6 , " pcie " , " rstoutn " ) ,
MPP_FUNCTION ( 7 , " i2c1 " , " sda " ) ,
MPP_FUNCTION ( 8 , " uart1 " , " txd " ) ,
MPP_FUNCTION ( 9 , " sata1 " , " present_act " ) ,
MPP_FUNCTION ( 10 , " xg " , " mdio " ) ) ,
MPP_MODE ( 4 ,
MPP_FUNCTION ( 0 , " gpio " , NULL ) ,
MPP_FUNCTION ( 1 , " dev " , " ad13 " ) ,
MPP_FUNCTION ( 2 , " au " , " i2sbclk " ) ,
MPP_FUNCTION ( 3 , " ge0 " , " rxctl " ) ,
MPP_FUNCTION ( 4 , " tdm " , " rstn " ) ,
MPP_FUNCTION ( 5 , " mss_uart " , " rxd " ) ,
MPP_FUNCTION ( 6 , " uart1 " , " cts " ) ,
MPP_FUNCTION ( 7 , " pcie0 " , " clkreq " ) ,
MPP_FUNCTION ( 8 , " uart3 " , " rxd " ) ,
MPP_FUNCTION ( 10 , " ge " , " mdc " ) ) ,
MPP_MODE ( 5 ,
MPP_FUNCTION ( 0 , " gpio " , NULL ) ,
MPP_FUNCTION ( 1 , " dev " , " ad12 " ) ,
MPP_FUNCTION ( 2 , " au " , " i2sdi " ) ,
MPP_FUNCTION ( 3 , " ge0 " , " rxclk " ) ,
MPP_FUNCTION ( 4 , " tdm " , " intn " ) ,
MPP_FUNCTION ( 5 , " mss_uart " , " txd " ) ,
MPP_FUNCTION ( 6 , " uart1 " , " rts " ) ,
MPP_FUNCTION ( 7 , " pcie1 " , " clkreq " ) ,
MPP_FUNCTION ( 8 , " uart3 " , " txd " ) ,
MPP_FUNCTION ( 10 , " ge " , " mdio " ) ) ,
MPP_MODE ( 6 ,
MPP_FUNCTION ( 0 , " gpio " , NULL ) ,
MPP_FUNCTION ( 1 , " dev " , " ad11 " ) ,
MPP_FUNCTION ( 3 , " ge0 " , " txd3 " ) ,
MPP_FUNCTION ( 4 , " spi0 " , " csn2 " ) ,
MPP_FUNCTION ( 5 , " au " , " i2sextclk " ) ,
MPP_FUNCTION ( 6 , " sata1 " , " present_act " ) ,
MPP_FUNCTION ( 7 , " pcie2 " , " clkreq " ) ,
MPP_FUNCTION ( 8 , " uart0 " , " rxd " ) ,
MPP_FUNCTION ( 9 , " ptp " , " pulse " ) ) ,
MPP_MODE ( 7 ,
MPP_FUNCTION ( 0 , " gpio " , NULL ) ,
MPP_FUNCTION ( 1 , " dev " , " ad10 " ) ,
MPP_FUNCTION ( 3 , " ge0 " , " txd2 " ) ,
MPP_FUNCTION ( 4 , " spi0 " , " csn1 " ) ,
MPP_FUNCTION ( 5 , " spi1 " , " csn1 " ) ,
MPP_FUNCTION ( 6 , " sata0 " , " present_act " ) ,
MPP_FUNCTION ( 7 , " led " , " data " ) ,
MPP_FUNCTION ( 8 , " uart0 " , " txd " ) ,
MPP_FUNCTION ( 9 , " ptp " , " clk " ) ) ,
MPP_MODE ( 8 ,
MPP_FUNCTION ( 0 , " gpio " , NULL ) ,
MPP_FUNCTION ( 1 , " dev " , " ad9 " ) ,
MPP_FUNCTION ( 3 , " ge0 " , " txd1 " ) ,
MPP_FUNCTION ( 4 , " spi0 " , " csn0 " ) ,
MPP_FUNCTION ( 5 , " spi1 " , " csn0 " ) ,
MPP_FUNCTION ( 6 , " uart0 " , " cts " ) ,
MPP_FUNCTION ( 7 , " led " , " stb " ) ,
MPP_FUNCTION ( 8 , " uart2 " , " rxd " ) ,
MPP_FUNCTION ( 9 , " ptp " , " pclk_out " ) ,
MPP_FUNCTION ( 10 , " synce1 " , " clk " ) ) ,
MPP_MODE ( 9 ,
MPP_FUNCTION ( 0 , " gpio " , NULL ) ,
MPP_FUNCTION ( 1 , " dev " , " ad8 " ) ,
MPP_FUNCTION ( 3 , " ge0 " , " txd0 " ) ,
MPP_FUNCTION ( 4 , " spi0 " , " mosi " ) ,
MPP_FUNCTION ( 5 , " spi1 " , " mosi " ) ,
MPP_FUNCTION ( 7 , " pcie " , " rstoutn " ) ,
MPP_FUNCTION ( 10 , " synce2 " , " clk " ) ) ,
MPP_MODE ( 10 ,
MPP_FUNCTION ( 0 , " gpio " , NULL ) ,
MPP_FUNCTION ( 1 , " dev " , " readyn " ) ,
MPP_FUNCTION ( 3 , " ge0 " , " txctl " ) ,
MPP_FUNCTION ( 4 , " spi0 " , " miso " ) ,
MPP_FUNCTION ( 5 , " spi1 " , " miso " ) ,
MPP_FUNCTION ( 6 , " uart0 " , " cts " ) ,
MPP_FUNCTION ( 7 , " sata1 " , " present_act " ) ) ,
MPP_MODE ( 11 ,
MPP_FUNCTION ( 0 , " gpio " , NULL ) ,
MPP_FUNCTION ( 1 , " dev " , " wen1 " ) ,
MPP_FUNCTION ( 3 , " ge0 " , " txclkout " ) ,
MPP_FUNCTION ( 4 , " spi0 " , " clk " ) ,
MPP_FUNCTION ( 5 , " spi1 " , " clk " ) ,
MPP_FUNCTION ( 6 , " uart0 " , " rts " ) ,
MPP_FUNCTION ( 7 , " led " , " clk " ) ,
MPP_FUNCTION ( 8 , " uart2 " , " txd " ) ,
MPP_FUNCTION ( 9 , " sata0 " , " present_act " ) ) ,
MPP_MODE ( 12 ,
MPP_FUNCTION ( 0 , " gpio " , NULL ) ,
MPP_FUNCTION ( 1 , " dev " , " clk_out " ) ,
MPP_FUNCTION ( 2 , " nf " , " rbn1 " ) ,
MPP_FUNCTION ( 3 , " spi1 " , " csn1 " ) ,
MPP_FUNCTION ( 4 , " ge0 " , " rxclk " ) ) ,
MPP_MODE ( 13 ,
MPP_FUNCTION ( 0 , " gpio " , NULL ) ,
MPP_FUNCTION ( 1 , " dev " , " burstn " ) ,
MPP_FUNCTION ( 2 , " nf " , " rbn0 " ) ,
MPP_FUNCTION ( 3 , " spi1 " , " miso " ) ,
MPP_FUNCTION ( 4 , " ge0 " , " rxctl " ) ,
MPP_FUNCTION ( 8 , " mss_spi " , " miso " ) ) ,
MPP_MODE ( 14 ,
MPP_FUNCTION ( 0 , " gpio " , NULL ) ,
MPP_FUNCTION ( 1 , " dev " , " bootcsn " ) ,
MPP_FUNCTION ( 2 , " dev " , " csn0 " ) ,
MPP_FUNCTION ( 3 , " spi1 " , " csn0 " ) ,
MPP_FUNCTION ( 4 , " spi0 " , " csn3 " ) ,
MPP_FUNCTION ( 5 , " au " , " i2sextclk " ) ,
MPP_FUNCTION ( 6 , " spi0 " , " miso " ) ,
MPP_FUNCTION ( 7 , " sata0 " , " present_act " ) ,
MPP_FUNCTION ( 8 , " mss_spi " , " csn " ) ) ,
MPP_MODE ( 15 ,
MPP_FUNCTION ( 0 , " gpio " , NULL ) ,
MPP_FUNCTION ( 1 , " dev " , " ad7 " ) ,
MPP_FUNCTION ( 3 , " spi1 " , " mosi " ) ,
MPP_FUNCTION ( 6 , " spi0 " , " mosi " ) ,
MPP_FUNCTION ( 8 , " mss_spi " , " mosi " ) ,
MPP_FUNCTION ( 11 , " ptp " , " pulse_cp2cp " ) ) ,
MPP_MODE ( 16 ,
MPP_FUNCTION ( 0 , " gpio " , NULL ) ,
MPP_FUNCTION ( 1 , " dev " , " ad6 " ) ,
MPP_FUNCTION ( 3 , " spi1 " , " clk " ) ,
MPP_FUNCTION ( 8 , " mss_spi " , " clk " ) ) ,
MPP_MODE ( 17 ,
MPP_FUNCTION ( 0 , " gpio " , NULL ) ,
MPP_FUNCTION ( 1 , " dev " , " ad5 " ) ,
MPP_FUNCTION ( 4 , " ge0 " , " txd3 " ) ) ,
MPP_MODE ( 18 ,
MPP_FUNCTION ( 0 , " gpio " , NULL ) ,
MPP_FUNCTION ( 1 , " dev " , " ad4 " ) ,
MPP_FUNCTION ( 4 , " ge0 " , " txd2 " ) ,
MPP_FUNCTION ( 11 , " ptp " , " clk_cp2cp " ) ) ,
MPP_MODE ( 19 ,
MPP_FUNCTION ( 0 , " gpio " , NULL ) ,
MPP_FUNCTION ( 1 , " dev " , " ad3 " ) ,
MPP_FUNCTION ( 4 , " ge0 " , " txd1 " ) ,
MPP_FUNCTION ( 11 , " wakeup " , " out_cp2cp " ) ) ,
MPP_MODE ( 20 ,
MPP_FUNCTION ( 0 , " gpio " , NULL ) ,
MPP_FUNCTION ( 1 , " dev " , " ad2 " ) ,
MPP_FUNCTION ( 4 , " ge0 " , " txd0 " ) ) ,
MPP_MODE ( 21 ,
MPP_FUNCTION ( 0 , " gpio " , NULL ) ,
MPP_FUNCTION ( 1 , " dev " , " ad1 " ) ,
MPP_FUNCTION ( 4 , " ge0 " , " txctl " ) ,
MPP_FUNCTION ( 11 , " sei " , " in_cp2cp " ) ) ,
MPP_MODE ( 22 ,
MPP_FUNCTION ( 0 , " gpio " , NULL ) ,
MPP_FUNCTION ( 1 , " dev " , " ad0 " ) ,
MPP_FUNCTION ( 4 , " ge0 " , " txclkout " ) ,
MPP_FUNCTION ( 11 , " wakeup " , " in_cp2cp " ) ) ,
MPP_MODE ( 23 ,
MPP_FUNCTION ( 0 , " gpio " , NULL ) ,
MPP_FUNCTION ( 1 , " dev " , " a1 " ) ,
MPP_FUNCTION ( 5 , " au " , " i2smclk " ) ,
MPP_FUNCTION ( 11 , " link " , " rd_in_cp2cp " ) ) ,
MPP_MODE ( 24 ,
MPP_FUNCTION ( 0 , " gpio " , NULL ) ,
MPP_FUNCTION ( 1 , " dev " , " a0 " ) ,
MPP_FUNCTION ( 5 , " au " , " i2slrclk " ) ) ,
MPP_MODE ( 25 ,
MPP_FUNCTION ( 0 , " gpio " , NULL ) ,
MPP_FUNCTION ( 1 , " dev " , " oen " ) ,
MPP_FUNCTION ( 5 , " au " , " i2sdo_spdifo " ) ) ,
MPP_MODE ( 26 ,
MPP_FUNCTION ( 0 , " gpio " , NULL ) ,
MPP_FUNCTION ( 1 , " dev " , " wen0 " ) ,
MPP_FUNCTION ( 5 , " au " , " i2sbclk " ) ) ,
MPP_MODE ( 27 ,
MPP_FUNCTION ( 0 , " gpio " , NULL ) ,
MPP_FUNCTION ( 1 , " dev " , " csn0 " ) ,
MPP_FUNCTION ( 2 , " spi1 " , " miso " ) ,
MPP_FUNCTION ( 3 , " mss_gpio4 " , NULL ) ,
MPP_FUNCTION ( 4 , " ge0 " , " rxd3 " ) ,
MPP_FUNCTION ( 5 , " spi0 " , " csn4 " ) ,
MPP_FUNCTION ( 8 , " ge " , " mdio " ) ,
MPP_FUNCTION ( 9 , " sata0 " , " present_act " ) ,
MPP_FUNCTION ( 10 , " uart0 " , " rts " ) ,
MPP_FUNCTION ( 11 , " rei " , " in_cp2cp " ) ) ,
MPP_MODE ( 28 ,
MPP_FUNCTION ( 0 , " gpio " , NULL ) ,
MPP_FUNCTION ( 1 , " dev " , " csn1 " ) ,
MPP_FUNCTION ( 2 , " spi1 " , " csn0 " ) ,
MPP_FUNCTION ( 3 , " mss_gpio5 " , NULL ) ,
MPP_FUNCTION ( 4 , " ge0 " , " rxd2 " ) ,
MPP_FUNCTION ( 5 , " spi0 " , " csn5 " ) ,
MPP_FUNCTION ( 6 , " pcie2 " , " clkreq " ) ,
MPP_FUNCTION ( 7 , " ptp " , " pulse " ) ,
MPP_FUNCTION ( 8 , " ge " , " mdc " ) ,
MPP_FUNCTION ( 9 , " sata1 " , " present_act " ) ,
MPP_FUNCTION ( 10 , " uart0 " , " cts " ) ,
MPP_FUNCTION ( 11 , " led " , " data " ) ) ,
MPP_MODE ( 29 ,
MPP_FUNCTION ( 0 , " gpio " , NULL ) ,
MPP_FUNCTION ( 1 , " dev " , " csn2 " ) ,
MPP_FUNCTION ( 2 , " spi1 " , " mosi " ) ,
MPP_FUNCTION ( 3 , " mss_gpio6 " , NULL ) ,
MPP_FUNCTION ( 4 , " ge0 " , " rxd1 " ) ,
MPP_FUNCTION ( 5 , " spi0 " , " csn6 " ) ,
MPP_FUNCTION ( 6 , " pcie1 " , " clkreq " ) ,
MPP_FUNCTION ( 7 , " ptp " , " clk " ) ,
MPP_FUNCTION ( 8 , " mss_i2c " , " sda " ) ,
MPP_FUNCTION ( 9 , " sata0 " , " present_act " ) ,
MPP_FUNCTION ( 10 , " uart0 " , " rxd " ) ,
MPP_FUNCTION ( 11 , " led " , " stb " ) ) ,
MPP_MODE ( 30 ,
MPP_FUNCTION ( 0 , " gpio " , NULL ) ,
MPP_FUNCTION ( 1 , " dev " , " csn3 " ) ,
MPP_FUNCTION ( 2 , " spi1 " , " clk " ) ,
MPP_FUNCTION ( 3 , " mss_gpio7 " , NULL ) ,
MPP_FUNCTION ( 4 , " ge0 " , " rxd0 " ) ,
MPP_FUNCTION ( 5 , " spi0 " , " csn7 " ) ,
MPP_FUNCTION ( 6 , " pcie0 " , " clkreq " ) ,
MPP_FUNCTION ( 7 , " ptp " , " pclk_out " ) ,
MPP_FUNCTION ( 8 , " mss_i2c " , " sck " ) ,
MPP_FUNCTION ( 9 , " sata1 " , " present_act " ) ,
MPP_FUNCTION ( 10 , " uart0 " , " txd " ) ,
MPP_FUNCTION ( 11 , " led " , " clk " ) ) ,
MPP_MODE ( 31 ,
MPP_FUNCTION ( 0 , " gpio " , NULL ) ,
MPP_FUNCTION ( 1 , " dev " , " a2 " ) ,
MPP_FUNCTION ( 3 , " mss_gpio4 " , NULL ) ,
MPP_FUNCTION ( 6 , " pcie " , " rstoutn " ) ,
MPP_FUNCTION ( 8 , " ge " , " mdc " ) ) ,
MPP_MODE ( 32 ,
MPP_FUNCTION ( 0 , " gpio " , NULL ) ,
MPP_FUNCTION ( 1 , " mii " , " col " ) ,
MPP_FUNCTION ( 2 , " mii " , " txerr " ) ,
MPP_FUNCTION ( 3 , " mss_spi " , " miso " ) ,
MPP_FUNCTION ( 4 , " tdm " , " drx " ) ,
MPP_FUNCTION ( 5 , " au " , " i2sextclk " ) ,
MPP_FUNCTION ( 6 , " au " , " i2sdi " ) ,
MPP_FUNCTION ( 7 , " ge " , " mdio " ) ,
MPP_FUNCTION ( 8 , " sdio " , " v18_en " ) ,
MPP_FUNCTION ( 9 , " pcie1 " , " clkreq " ) ,
MPP_FUNCTION ( 10 , " mss_gpio0 " , NULL ) ) ,
MPP_MODE ( 33 ,
MPP_FUNCTION ( 0 , " gpio " , NULL ) ,
MPP_FUNCTION ( 1 , " mii " , " txclk " ) ,
MPP_FUNCTION ( 2 , " sdio " , " pwr10 " ) ,
MPP_FUNCTION ( 3 , " mss_spi " , " csn " ) ,
MPP_FUNCTION ( 4 , " tdm " , " fsync " ) ,
MPP_FUNCTION ( 5 , " au " , " i2smclk " ) ,
MPP_FUNCTION ( 6 , " sdio " , " bus_pwr " ) ,
MPP_FUNCTION ( 8 , " xg " , " mdio " ) ,
MPP_FUNCTION ( 9 , " pcie2 " , " clkreq " ) ,
MPP_FUNCTION ( 10 , " mss_gpio1 " , NULL ) ) ,
MPP_MODE ( 34 ,
MPP_FUNCTION ( 0 , " gpio " , NULL ) ,
MPP_FUNCTION ( 1 , " mii " , " rxerr " ) ,
MPP_FUNCTION ( 2 , " sdio " , " pwr11 " ) ,
MPP_FUNCTION ( 3 , " mss_spi " , " mosi " ) ,
MPP_FUNCTION ( 4 , " tdm " , " dtx " ) ,
MPP_FUNCTION ( 5 , " au " , " i2slrclk " ) ,
MPP_FUNCTION ( 6 , " sdio " , " wr_protect " ) ,
MPP_FUNCTION ( 7 , " ge " , " mdc " ) ,
MPP_FUNCTION ( 9 , " pcie0 " , " clkreq " ) ,
MPP_FUNCTION ( 10 , " mss_gpio2 " , NULL ) ) ,
MPP_MODE ( 35 ,
MPP_FUNCTION ( 0 , " gpio " , NULL ) ,
MPP_FUNCTION ( 1 , " sata1 " , " present_act " ) ,
MPP_FUNCTION ( 2 , " i2c1 " , " sda " ) ,
MPP_FUNCTION ( 3 , " mss_spi " , " clk " ) ,
MPP_FUNCTION ( 4 , " tdm " , " pclk " ) ,
MPP_FUNCTION ( 5 , " au " , " i2sdo_spdifo " ) ,
MPP_FUNCTION ( 6 , " sdio " , " card_detect " ) ,
MPP_FUNCTION ( 7 , " xg " , " mdio " ) ,
MPP_FUNCTION ( 8 , " ge " , " mdio " ) ,
MPP_FUNCTION ( 9 , " pcie " , " rstoutn " ) ,
MPP_FUNCTION ( 10 , " mss_gpio3 " , NULL ) ) ,
MPP_MODE ( 36 ,
MPP_FUNCTION ( 0 , " gpio " , NULL ) ,
MPP_FUNCTION ( 1 , " synce2 " , " clk " ) ,
MPP_FUNCTION ( 2 , " i2c1 " , " sck " ) ,
MPP_FUNCTION ( 3 , " ptp " , " clk " ) ,
MPP_FUNCTION ( 4 , " synce1 " , " clk " ) ,
MPP_FUNCTION ( 5 , " au " , " i2sbclk " ) ,
MPP_FUNCTION ( 6 , " sata0 " , " present_act " ) ,
MPP_FUNCTION ( 7 , " xg " , " mdc " ) ,
MPP_FUNCTION ( 8 , " ge " , " mdc " ) ,
MPP_FUNCTION ( 9 , " pcie2 " , " clkreq " ) ,
MPP_FUNCTION ( 10 , " mss_gpio5 " , NULL ) ) ,
MPP_MODE ( 37 ,
MPP_FUNCTION ( 0 , " gpio " , NULL ) ,
MPP_FUNCTION ( 1 , " uart2 " , " rxd " ) ,
MPP_FUNCTION ( 2 , " i2c0 " , " sck " ) ,
MPP_FUNCTION ( 3 , " ptp " , " pclk_out " ) ,
MPP_FUNCTION ( 4 , " tdm " , " intn " ) ,
MPP_FUNCTION ( 5 , " mss_i2c " , " sck " ) ,
MPP_FUNCTION ( 6 , " sata1 " , " present_act " ) ,
MPP_FUNCTION ( 7 , " ge " , " mdc " ) ,
MPP_FUNCTION ( 8 , " xg " , " mdc " ) ,
MPP_FUNCTION ( 9 , " pcie1 " , " clkreq " ) ,
MPP_FUNCTION ( 10 , " mss_gpio6 " , NULL ) ,
MPP_FUNCTION ( 11 , " link " , " rd_out_cp2cp " ) ) ,
MPP_MODE ( 38 ,
MPP_FUNCTION ( 0 , " gpio " , NULL ) ,
MPP_FUNCTION ( 1 , " uart2 " , " txd " ) ,
MPP_FUNCTION ( 2 , " i2c0 " , " sda " ) ,
MPP_FUNCTION ( 3 , " ptp " , " pulse " ) ,
MPP_FUNCTION ( 4 , " tdm " , " rstn " ) ,
MPP_FUNCTION ( 5 , " mss_i2c " , " sda " ) ,
MPP_FUNCTION ( 6 , " sata0 " , " present_act " ) ,
MPP_FUNCTION ( 7 , " ge " , " mdio " ) ,
MPP_FUNCTION ( 8 , " xg " , " mdio " ) ,
MPP_FUNCTION ( 9 , " au " , " i2sextclk " ) ,
MPP_FUNCTION ( 10 , " mss_gpio7 " , NULL ) ,
MPP_FUNCTION ( 11 , " ptp " , " pulse_cp2cp " ) ) ,
MPP_MODE ( 39 ,
MPP_FUNCTION ( 0 , " gpio " , NULL ) ,
MPP_FUNCTION ( 1 , " sdio " , " wr_protect " ) ,
MPP_FUNCTION ( 4 , " au " , " i2sbclk " ) ,
MPP_FUNCTION ( 5 , " ptp " , " clk " ) ,
MPP_FUNCTION ( 6 , " spi0 " , " csn1 " ) ,
MPP_FUNCTION ( 9 , " sata1 " , " present_act " ) ,
MPP_FUNCTION ( 10 , " mss_gpio0 " , NULL ) ) ,
MPP_MODE ( 40 ,
MPP_FUNCTION ( 0 , " gpio " , NULL ) ,
MPP_FUNCTION ( 1 , " sdio " , " pwr11 " ) ,
MPP_FUNCTION ( 2 , " synce1 " , " clk " ) ,
MPP_FUNCTION ( 3 , " mss_i2c " , " sda " ) ,
MPP_FUNCTION ( 4 , " au " , " i2sdo_spdifo " ) ,
MPP_FUNCTION ( 5 , " ptp " , " pclk_out " ) ,
MPP_FUNCTION ( 6 , " spi0 " , " clk " ) ,
MPP_FUNCTION ( 7 , " uart1 " , " txd " ) ,
MPP_FUNCTION ( 8 , " ge " , " mdio " ) ,
MPP_FUNCTION ( 9 , " sata0 " , " present_act " ) ,
MPP_FUNCTION ( 10 , " mss_gpio1 " , NULL ) ) ,
MPP_MODE ( 41 ,
MPP_FUNCTION ( 0 , " gpio " , NULL ) ,
MPP_FUNCTION ( 1 , " sdio " , " pwr10 " ) ,
MPP_FUNCTION ( 2 , " sdio " , " bus_pwr " ) ,
MPP_FUNCTION ( 3 , " mss_i2c " , " sck " ) ,
MPP_FUNCTION ( 4 , " au " , " i2slrclk " ) ,
MPP_FUNCTION ( 5 , " ptp " , " pulse " ) ,
MPP_FUNCTION ( 6 , " spi0 " , " mosi " ) ,
MPP_FUNCTION ( 7 , " uart1 " , " rxd " ) ,
MPP_FUNCTION ( 8 , " ge " , " mdc " ) ,
MPP_FUNCTION ( 9 , " sata1 " , " present_act " ) ,
MPP_FUNCTION ( 10 , " mss_gpio2 " , NULL ) ,
MPP_FUNCTION ( 11 , " rei " , " out_cp2cp " ) ) ,
MPP_MODE ( 42 ,
MPP_FUNCTION ( 0 , " gpio " , NULL ) ,
MPP_FUNCTION ( 1 , " sdio " , " v18_en " ) ,
MPP_FUNCTION ( 2 , " sdio " , " wr_protect " ) ,
MPP_FUNCTION ( 3 , " synce2 " , " clk " ) ,
MPP_FUNCTION ( 4 , " au " , " i2smclk " ) ,
MPP_FUNCTION ( 5 , " mss_uart " , " txd " ) ,
MPP_FUNCTION ( 6 , " spi0 " , " miso " ) ,
MPP_FUNCTION ( 7 , " uart1 " , " cts " ) ,
MPP_FUNCTION ( 8 , " xg " , " mdc " ) ,
MPP_FUNCTION ( 9 , " sata0 " , " present_act " ) ,
MPP_FUNCTION ( 10 , " mss_gpio4 " , NULL ) ) ,
MPP_MODE ( 43 ,
MPP_FUNCTION ( 0 , " gpio " , NULL ) ,
MPP_FUNCTION ( 1 , " sdio " , " card_detect " ) ,
MPP_FUNCTION ( 3 , " synce1 " , " clk " ) ,
MPP_FUNCTION ( 4 , " au " , " i2sextclk " ) ,
MPP_FUNCTION ( 5 , " mss_uart " , " rxd " ) ,
MPP_FUNCTION ( 6 , " spi0 " , " csn0 " ) ,
MPP_FUNCTION ( 7 , " uart1 " , " rts " ) ,
MPP_FUNCTION ( 8 , " xg " , " mdio " ) ,
MPP_FUNCTION ( 9 , " sata1 " , " present_act " ) ,
MPP_FUNCTION ( 10 , " mss_gpio5 " , NULL ) ,
MPP_FUNCTION ( 11 , " wakeup " , " out_cp2cp " ) ) ,
MPP_MODE ( 44 ,
MPP_FUNCTION ( 0 , " gpio " , NULL ) ,
MPP_FUNCTION ( 1 , " ge1 " , " txd2 " ) ,
MPP_FUNCTION ( 7 , " uart0 " , " rts " ) ,
MPP_FUNCTION ( 11 , " ptp " , " clk_cp2cp " ) ) ,
MPP_MODE ( 45 ,
MPP_FUNCTION ( 0 , " gpio " , NULL ) ,
MPP_FUNCTION ( 1 , " ge1 " , " txd3 " ) ,
MPP_FUNCTION ( 7 , " uart0 " , " txd " ) ,
MPP_FUNCTION ( 9 , " pcie " , " rstoutn " ) ) ,
MPP_MODE ( 46 ,
MPP_FUNCTION ( 0 , " gpio " , NULL ) ,
MPP_FUNCTION ( 1 , " ge1 " , " txd1 " ) ,
MPP_FUNCTION ( 7 , " uart1 " , " rts " ) ) ,
MPP_MODE ( 47 ,
MPP_FUNCTION ( 0 , " gpio " , NULL ) ,
MPP_FUNCTION ( 1 , " ge1 " , " txd0 " ) ,
MPP_FUNCTION ( 5 , " spi1 " , " clk " ) ,
MPP_FUNCTION ( 7 , " uart1 " , " txd " ) ,
MPP_FUNCTION ( 8 , " ge " , " mdc " ) ) ,
MPP_MODE ( 48 ,
MPP_FUNCTION ( 0 , " gpio " , NULL ) ,
MPP_FUNCTION ( 1 , " ge1 " , " txctl_txen " ) ,
MPP_FUNCTION ( 5 , " spi1 " , " mosi " ) ,
MPP_FUNCTION ( 8 , " xg " , " mdc " ) ,
MPP_FUNCTION ( 11 , " wakeup " , " in_cp2cp " ) ) ,
MPP_MODE ( 49 ,
MPP_FUNCTION ( 0 , " gpio " , NULL ) ,
MPP_FUNCTION ( 1 , " ge1 " , " txclkout " ) ,
MPP_FUNCTION ( 2 , " mii " , " crs " ) ,
MPP_FUNCTION ( 5 , " spi1 " , " miso " ) ,
MPP_FUNCTION ( 7 , " uart1 " , " rxd " ) ,
MPP_FUNCTION ( 8 , " ge " , " mdio " ) ,
MPP_FUNCTION ( 9 , " pcie0 " , " clkreq " ) ,
MPP_FUNCTION ( 10 , " sdio " , " v18_en " ) ,
MPP_FUNCTION ( 11 , " sei " , " out_cp2cp " ) ) ,
MPP_MODE ( 50 ,
MPP_FUNCTION ( 0 , " gpio " , NULL ) ,
MPP_FUNCTION ( 1 , " ge1 " , " rxclk " ) ,
MPP_FUNCTION ( 2 , " mss_i2c " , " sda " ) ,
MPP_FUNCTION ( 5 , " spi1 " , " csn0 " ) ,
MPP_FUNCTION ( 6 , " uart2 " , " txd " ) ,
MPP_FUNCTION ( 7 , " uart0 " , " rxd " ) ,
MPP_FUNCTION ( 8 , " xg " , " mdio " ) ,
MPP_FUNCTION ( 10 , " sdio " , " pwr11 " ) ) ,
MPP_MODE ( 51 ,
MPP_FUNCTION ( 0 , " gpio " , NULL ) ,
MPP_FUNCTION ( 1 , " ge1 " , " rxd0 " ) ,
MPP_FUNCTION ( 2 , " mss_i2c " , " sck " ) ,
MPP_FUNCTION ( 5 , " spi1 " , " csn1 " ) ,
MPP_FUNCTION ( 6 , " uart2 " , " rxd " ) ,
MPP_FUNCTION ( 7 , " uart0 " , " cts " ) ,
MPP_FUNCTION ( 10 , " sdio " , " pwr10 " ) ) ,
MPP_MODE ( 52 ,
MPP_FUNCTION ( 0 , " gpio " , NULL ) ,
MPP_FUNCTION ( 1 , " ge1 " , " rxd1 " ) ,
MPP_FUNCTION ( 2 , " synce1 " , " clk " ) ,
MPP_FUNCTION ( 4 , " synce2 " , " clk " ) ,
MPP_FUNCTION ( 5 , " spi1 " , " csn2 " ) ,
MPP_FUNCTION ( 7 , " uart1 " , " cts " ) ,
MPP_FUNCTION ( 8 , " led " , " clk " ) ,
MPP_FUNCTION ( 9 , " pcie " , " rstoutn " ) ,
MPP_FUNCTION ( 10 , " pcie0 " , " clkreq " ) ) ,
MPP_MODE ( 53 ,
MPP_FUNCTION ( 0 , " gpio " , NULL ) ,
MPP_FUNCTION ( 1 , " ge1 " , " rxd2 " ) ,
MPP_FUNCTION ( 3 , " ptp " , " clk " ) ,
MPP_FUNCTION ( 5 , " spi1 " , " csn3 " ) ,
MPP_FUNCTION ( 7 , " uart1 " , " rxd " ) ,
MPP_FUNCTION ( 8 , " led " , " stb " ) ,
MPP_FUNCTION ( 11 , " sdio " , " led " ) ) ,
MPP_MODE ( 54 ,
MPP_FUNCTION ( 0 , " gpio " , NULL ) ,
MPP_FUNCTION ( 1 , " ge1 " , " rxd3 " ) ,
MPP_FUNCTION ( 2 , " synce2 " , " clk " ) ,
MPP_FUNCTION ( 3 , " ptp " , " pclk_out " ) ,
MPP_FUNCTION ( 4 , " synce1 " , " clk " ) ,
MPP_FUNCTION ( 8 , " led " , " data " ) ,
MPP_FUNCTION ( 10 , " sdio " , " hw_rst " ) ,
2021-02-16 14:31:18 +03:00
MPP_FUNCTION ( 11 , " sdio_wp " , " wr_protect " ) ) ,
2017-06-12 18:34:57 +03:00
MPP_MODE ( 55 ,
MPP_FUNCTION ( 0 , " gpio " , NULL ) ,
MPP_FUNCTION ( 1 , " ge1 " , " rxctl_rxdv " ) ,
MPP_FUNCTION ( 3 , " ptp " , " pulse " ) ,
MPP_FUNCTION ( 10 , " sdio " , " led " ) ,
2021-02-16 14:31:18 +03:00
MPP_FUNCTION ( 11 , " sdio_cd " , " card_detect " ) ) ,
2017-06-12 18:34:57 +03:00
MPP_MODE ( 56 ,
MPP_FUNCTION ( 0 , " gpio " , NULL ) ,
MPP_FUNCTION ( 4 , " tdm " , " drx " ) ,
MPP_FUNCTION ( 5 , " au " , " i2sdo_spdifo " ) ,
MPP_FUNCTION ( 6 , " spi0 " , " clk " ) ,
MPP_FUNCTION ( 7 , " uart1 " , " rxd " ) ,
MPP_FUNCTION ( 9 , " sata1 " , " present_act " ) ,
MPP_FUNCTION ( 14 , " sdio " , " clk " ) ) ,
MPP_MODE ( 57 ,
MPP_FUNCTION ( 0 , " gpio " , NULL ) ,
MPP_FUNCTION ( 2 , " mss_i2c " , " sda " ) ,
MPP_FUNCTION ( 3 , " ptp " , " pclk_out " ) ,
MPP_FUNCTION ( 4 , " tdm " , " intn " ) ,
MPP_FUNCTION ( 5 , " au " , " i2sbclk " ) ,
MPP_FUNCTION ( 6 , " spi0 " , " mosi " ) ,
MPP_FUNCTION ( 7 , " uart1 " , " txd " ) ,
MPP_FUNCTION ( 9 , " sata0 " , " present_act " ) ,
MPP_FUNCTION ( 14 , " sdio " , " cmd " ) ) ,
MPP_MODE ( 58 ,
MPP_FUNCTION ( 0 , " gpio " , NULL ) ,
MPP_FUNCTION ( 2 , " mss_i2c " , " sck " ) ,
MPP_FUNCTION ( 3 , " ptp " , " clk " ) ,
MPP_FUNCTION ( 4 , " tdm " , " rstn " ) ,
MPP_FUNCTION ( 5 , " au " , " i2sdi " ) ,
MPP_FUNCTION ( 6 , " spi0 " , " miso " ) ,
MPP_FUNCTION ( 7 , " uart1 " , " cts " ) ,
MPP_FUNCTION ( 8 , " led " , " clk " ) ,
MPP_FUNCTION ( 14 , " sdio " , " d0 " ) ) ,
MPP_MODE ( 59 ,
MPP_FUNCTION ( 0 , " gpio " , NULL ) ,
MPP_FUNCTION ( 1 , " mss_gpio7 " , NULL ) ,
MPP_FUNCTION ( 2 , " synce2 " , " clk " ) ,
MPP_FUNCTION ( 4 , " tdm " , " fsync " ) ,
MPP_FUNCTION ( 5 , " au " , " i2slrclk " ) ,
MPP_FUNCTION ( 6 , " spi0 " , " csn0 " ) ,
MPP_FUNCTION ( 7 , " uart0 " , " cts " ) ,
MPP_FUNCTION ( 8 , " led " , " stb " ) ,
MPP_FUNCTION ( 9 , " uart1 " , " txd " ) ,
MPP_FUNCTION ( 14 , " sdio " , " d1 " ) ) ,
MPP_MODE ( 60 ,
MPP_FUNCTION ( 0 , " gpio " , NULL ) ,
MPP_FUNCTION ( 1 , " mss_gpio6 " , NULL ) ,
MPP_FUNCTION ( 3 , " ptp " , " pulse " ) ,
MPP_FUNCTION ( 4 , " tdm " , " dtx " ) ,
MPP_FUNCTION ( 5 , " au " , " i2smclk " ) ,
MPP_FUNCTION ( 6 , " spi0 " , " csn1 " ) ,
MPP_FUNCTION ( 7 , " uart0 " , " rts " ) ,
MPP_FUNCTION ( 8 , " led " , " data " ) ,
MPP_FUNCTION ( 9 , " uart1 " , " rxd " ) ,
MPP_FUNCTION ( 14 , " sdio " , " d2 " ) ) ,
MPP_MODE ( 61 ,
MPP_FUNCTION ( 0 , " gpio " , NULL ) ,
MPP_FUNCTION ( 1 , " mss_gpio5 " , NULL ) ,
MPP_FUNCTION ( 3 , " ptp " , " clk " ) ,
MPP_FUNCTION ( 4 , " tdm " , " pclk " ) ,
MPP_FUNCTION ( 5 , " au " , " i2sextclk " ) ,
MPP_FUNCTION ( 6 , " spi0 " , " csn2 " ) ,
MPP_FUNCTION ( 7 , " uart0 " , " txd " ) ,
MPP_FUNCTION ( 8 , " uart2 " , " txd " ) ,
MPP_FUNCTION ( 9 , " sata1 " , " present_act " ) ,
MPP_FUNCTION ( 10 , " ge " , " mdio " ) ,
MPP_FUNCTION ( 14 , " sdio " , " d3 " ) ) ,
MPP_MODE ( 62 ,
MPP_FUNCTION ( 0 , " gpio " , NULL ) ,
MPP_FUNCTION ( 1 , " mss_gpio4 " , NULL ) ,
MPP_FUNCTION ( 2 , " synce1 " , " clk " ) ,
MPP_FUNCTION ( 3 , " ptp " , " pclk_out " ) ,
MPP_FUNCTION ( 5 , " sata1 " , " present_act " ) ,
MPP_FUNCTION ( 6 , " spi0 " , " csn3 " ) ,
MPP_FUNCTION ( 7 , " uart0 " , " rxd " ) ,
MPP_FUNCTION ( 8 , " uart2 " , " rxd " ) ,
MPP_FUNCTION ( 9 , " sata0 " , " present_act " ) ,
2019-08-05 13:16:05 +03:00
MPP_FUNCTION ( 10 , " ge " , " mdc " ) ,
MPP_FUNCTION ( 14 , " sdio " , " ds " ) ) ,
2017-06-12 18:34:57 +03:00
} ;
static const struct of_device_id armada_cp110_pinctrl_of_match [ ] = {
{
. compatible = " marvell,armada-7k-pinctrl " ,
. data = ( void * ) V_ARMADA_7K ,
} ,
{
. compatible = " marvell,armada-8k-cpm-pinctrl " ,
. data = ( void * ) V_ARMADA_8K_CPM ,
} ,
{
. compatible = " marvell,armada-8k-cps-pinctrl " ,
. data = ( void * ) V_ARMADA_8K_CPS ,
} ,
2019-08-05 13:16:07 +03:00
{
. compatible = " marvell,cp115-standalone-pinctrl " ,
. data = ( void * ) V_CP115_STANDALONE ,
} ,
2017-06-12 18:34:57 +03:00
{ } ,
} ;
static const struct mvebu_mpp_ctrl armada_cp110_mpp_controls [ ] = {
MPP_FUNC_CTRL ( 0 , 62 , NULL , mvebu_regmap_mpp_ctrl ) ,
} ;
static void mvebu_pinctrl_assign_variant ( struct mvebu_mpp_mode * m ,
u8 variant )
{
struct mvebu_mpp_ctrl_setting * s ;
for ( s = m - > settings ; s - > name ; s + + )
s - > variant = variant ;
}
static int armada_cp110_pinctrl_probe ( struct platform_device * pdev )
{
struct mvebu_pinctrl_soc_info * soc ;
int i ;
if ( ! pdev - > dev . parent )
return - ENODEV ;
soc = devm_kzalloc ( & pdev - > dev ,
sizeof ( struct mvebu_pinctrl_soc_info ) , GFP_KERNEL ) ;
if ( ! soc )
return - ENOMEM ;
2023-10-09 20:29:13 +03:00
soc - > variant = ( unsigned long ) device_get_match_data ( & pdev - > dev ) & 0xff ;
2017-06-12 18:34:57 +03:00
soc - > controls = armada_cp110_mpp_controls ;
soc - > ncontrols = ARRAY_SIZE ( armada_cp110_mpp_controls ) ;
soc - > modes = armada_cp110_mpp_modes ;
soc - > nmodes = ARRAY_SIZE ( armada_cp110_mpp_modes ) ;
for ( i = 0 ; i < ARRAY_SIZE ( armada_cp110_mpp_modes ) ; i + + ) {
struct mvebu_mpp_mode * m = & armada_cp110_mpp_modes [ i ] ;
switch ( i ) {
case 0 . . . 31 :
2019-08-05 13:16:07 +03:00
mvebu_pinctrl_assign_variant ( m , ( V_ARMADA_7K_8K_CPS |
V_CP115_STANDALONE ) ) ;
2017-06-12 18:34:57 +03:00
break ;
case 32 . . . 38 :
2019-08-05 13:16:07 +03:00
mvebu_pinctrl_assign_variant ( m , ( V_ARMADA_7K_8K_CPM |
V_CP115_STANDALONE ) ) ;
2017-06-12 18:34:57 +03:00
break ;
case 39 . . . 43 :
2019-08-05 13:16:07 +03:00
mvebu_pinctrl_assign_variant ( m , ( V_ARMADA_8K_CPM |
V_CP115_STANDALONE ) ) ;
2017-06-12 18:34:57 +03:00
break ;
case 44 . . . 62 :
2019-08-05 13:16:07 +03:00
mvebu_pinctrl_assign_variant ( m , ( V_ARMADA_7K_8K_CPM |
V_CP115_STANDALONE ) ) ;
2017-06-12 18:34:57 +03:00
break ;
}
}
pdev - > dev . platform_data = soc ;
return mvebu_pinctrl_simple_regmap_probe ( pdev , pdev - > dev . parent , 0 ) ;
}
static struct platform_driver armada_cp110_pinctrl_driver = {
. driver = {
. name = " armada-cp110-pinctrl " ,
. of_match_table = of_match_ptr ( armada_cp110_pinctrl_of_match ) ,
} ,
. probe = armada_cp110_pinctrl_probe ,
} ;
builtin_platform_driver ( armada_cp110_pinctrl_driver ) ;