2018-05-16 10:33:37 +03:00
// SPDX-License-Identifier: GPL-2.0
2014-05-19 21:36:31 +04:00
/*
* Marvell Berlin BG2 pinctrl driver .
*
* Copyright ( C ) 2014 Marvell Technology Group Ltd .
*
2015-10-14 00:31:41 +03:00
* Antoine Ténart < antoine . tenart @ free - electrons . com >
2014-05-19 21:36:31 +04:00
*/
2017-02-06 11:03:52 +03:00
# include <linux/init.h>
2014-05-19 21:36:31 +04:00
# include <linux/of_device.h>
# include <linux/platform_device.h>
# include <linux/regmap.h>
# include "berlin.h"
static const struct berlin_desc_group berlin2_soc_pinctrl_groups [ ] = {
/* G */
BERLIN_PINCTRL_GROUP ( " G0 " , 0x00 , 0x1 , 0x00 ,
2015-06-02 12:37:48 +03:00
BERLIN_PINCTRL_FUNCTION ( 0x0 , " spi1 " ) , /* SS0n */
2014-05-19 21:36:31 +04:00
BERLIN_PINCTRL_FUNCTION ( 0x1 , " gpio " ) ) ,
BERLIN_PINCTRL_GROUP ( " G1 " , 0x00 , 0x2 , 0x01 ,
2015-06-02 12:37:48 +03:00
BERLIN_PINCTRL_FUNCTION ( 0x0 , " spi1 " ) , /* SS1n */
2014-05-19 21:36:31 +04:00
BERLIN_PINCTRL_FUNCTION ( 0x1 , " gpio " ) ,
BERLIN_PINCTRL_FUNCTION ( 0x2 , " usb1 " ) ) ,
BERLIN_PINCTRL_GROUP ( " G2 " , 0x00 , 0x2 , 0x02 ,
BERLIN_PINCTRL_FUNCTION ( 0x0 , " gpio " ) ,
2015-06-02 12:37:48 +03:00
BERLIN_PINCTRL_FUNCTION ( 0x1 , " spi1 " ) , /* SS2n */
2014-05-19 21:36:31 +04:00
BERLIN_PINCTRL_FUNCTION ( 0x2 , " pwm " ) ,
BERLIN_PINCTRL_FUNCTION ( 0x3 , " i2s0 " ) ) ,
BERLIN_PINCTRL_GROUP ( " G3 " , 0x00 , 0x2 , 0x04 ,
BERLIN_PINCTRL_FUNCTION ( 0x0 , " soc " ) ,
2015-06-02 12:37:48 +03:00
BERLIN_PINCTRL_FUNCTION ( 0x1 , " spi1 " ) , /* SS3n */
2014-05-19 21:36:31 +04:00
BERLIN_PINCTRL_FUNCTION ( 0x2 , " gpio " ) ,
BERLIN_PINCTRL_FUNCTION ( 0x3 , " i2s1 " ) ) ,
BERLIN_PINCTRL_GROUP ( " G4 " , 0x00 , 0x2 , 0x06 ,
2015-06-02 12:37:48 +03:00
BERLIN_PINCTRL_FUNCTION ( 0x0 , " spi1 " ) , /* CLK/SDI/SDO */
2014-05-19 21:36:31 +04:00
BERLIN_PINCTRL_FUNCTION ( 0x1 , " gpio " ) ,
BERLIN_PINCTRL_FUNCTION ( 0x2 , " pwm " ) ) ,
BERLIN_PINCTRL_GROUP ( " G5 " , 0x00 , 0x3 , 0x08 ,
BERLIN_PINCTRL_FUNCTION ( 0x0 , " gpio " ) ,
BERLIN_PINCTRL_FUNCTION ( 0x1 , " sts1 " ) ,
BERLIN_PINCTRL_FUNCTION ( 0x2 , " et " ) ,
/*
* Mode 0x3 mux i2s2 mclk * and * i2s3 mclk :
* add two functions so it can be used with other groups
* within the same subnode in the device tree
*/
BERLIN_PINCTRL_FUNCTION ( 0x3 , " i2s2 " ) ,
BERLIN_PINCTRL_FUNCTION ( 0x3 , " i2s3 " ) ) ,
BERLIN_PINCTRL_GROUP ( " G6 " , 0x00 , 0x2 , 0x0b ,
BERLIN_PINCTRL_FUNCTION ( 0x0 , " gpio " ) ,
BERLIN_PINCTRL_FUNCTION ( 0x1 , " sts0 " ) ,
BERLIN_PINCTRL_FUNCTION ( 0x2 , " et " ) ) ,
BERLIN_PINCTRL_GROUP ( " G7 " , 0x00 , 0x3 , 0x0d ,
BERLIN_PINCTRL_FUNCTION ( 0x0 , " gpio " ) ,
BERLIN_PINCTRL_FUNCTION ( 0x1 , " sts0 " ) ,
BERLIN_PINCTRL_FUNCTION ( 0x2 , " et " ) ,
BERLIN_PINCTRL_FUNCTION ( 0x3 , " vdac " ) ) ,
BERLIN_PINCTRL_GROUP ( " G8 " , 0x00 , 0x3 , 0x10 ,
BERLIN_PINCTRL_FUNCTION ( 0x0 , " gpio " ) ,
BERLIN_PINCTRL_FUNCTION ( 0x1 , " sd0 " ) ,
BERLIN_PINCTRL_FUNCTION ( 0x2 , " et " ) ,
BERLIN_PINCTRL_FUNCTION ( 0x3 , " usb0_dbg " ) ,
BERLIN_PINCTRL_FUNCTION ( 0x4 , " sata_dbg " ) ,
BERLIN_PINCTRL_FUNCTION ( 0x7 , " usb1_dbg " ) ) ,
BERLIN_PINCTRL_GROUP ( " G9 " , 0x00 , 0x3 , 0x13 ,
BERLIN_PINCTRL_FUNCTION ( 0x0 , " gpio " ) ,
BERLIN_PINCTRL_FUNCTION ( 0x1 , " sd0 " ) ,
BERLIN_PINCTRL_FUNCTION ( 0x2 , " et " ) ,
BERLIN_PINCTRL_FUNCTION ( 0x3 , " usb0_dbg " ) ,
BERLIN_PINCTRL_FUNCTION ( 0x4 , " sata_dbg " ) ,
BERLIN_PINCTRL_FUNCTION ( 0x7 , " usb1_dbg " ) ) ,
BERLIN_PINCTRL_GROUP ( " G10 " , 0x00 , 0x2 , 0x16 ,
BERLIN_PINCTRL_FUNCTION ( 0x0 , " soc " ) ,
BERLIN_PINCTRL_FUNCTION ( 0x1 , " twsi0 " ) ,
BERLIN_PINCTRL_FUNCTION ( 0x2 , " gpio " ) ,
BERLIN_PINCTRL_FUNCTION ( 0x3 , " ptp " ) ) ,
BERLIN_PINCTRL_GROUP ( " G11 " , 0x00 , 0x2 , 0x18 ,
BERLIN_PINCTRL_FUNCTION ( 0x0 , " soc " ) ,
BERLIN_PINCTRL_FUNCTION ( 0x1 , " twsi1 " ) ,
BERLIN_PINCTRL_FUNCTION ( 0x2 , " gpio " ) ,
BERLIN_PINCTRL_FUNCTION ( 0x3 , " eddc " ) ) ,
BERLIN_PINCTRL_GROUP ( " G12 " , 0x00 , 0x3 , 0x1a ,
BERLIN_PINCTRL_FUNCTION ( 0x0 , " sts2 " ) ,
BERLIN_PINCTRL_FUNCTION ( 0x1 , " sata " ) ,
BERLIN_PINCTRL_FUNCTION ( 0x2 , " sd1 " ) ,
BERLIN_PINCTRL_FUNCTION ( 0x3 , " usb0_dbg " ) ,
BERLIN_PINCTRL_FUNCTION ( 0x4 , " sts1 " ) ,
BERLIN_PINCTRL_FUNCTION ( 0x7 , " usb1_dbg " ) ) ,
BERLIN_PINCTRL_GROUP ( " G13 " , 0x04 , 0x3 , 0x00 ,
BERLIN_PINCTRL_FUNCTION ( 0x0 , " gpio " ) ,
BERLIN_PINCTRL_FUNCTION ( 0x1 , " sata " ) ,
BERLIN_PINCTRL_FUNCTION ( 0x2 , " sd1 " ) ,
BERLIN_PINCTRL_FUNCTION ( 0x3 , " usb0_dbg " ) ,
BERLIN_PINCTRL_FUNCTION ( 0x4 , " sts1 " ) ,
BERLIN_PINCTRL_FUNCTION ( 0x7 , " usb1_dbg " ) ) ,
BERLIN_PINCTRL_GROUP ( " G14 " , 0x04 , 0x1 , 0x03 ,
BERLIN_PINCTRL_FUNCTION_UNKNOWN ) ,
BERLIN_PINCTRL_GROUP ( " G15 " , 0x04 , 0x2 , 0x04 ,
BERLIN_PINCTRL_FUNCTION ( 0x0 , " gpio " ) ,
BERLIN_PINCTRL_FUNCTION ( 0x2 , " et " ) ,
BERLIN_PINCTRL_FUNCTION ( 0x3 , " osco " ) ) ,
BERLIN_PINCTRL_GROUP ( " G16 " , 0x04 , 0x3 , 0x06 ,
BERLIN_PINCTRL_FUNCTION ( 0x0 , " gpio " ) ,
BERLIN_PINCTRL_FUNCTION ( 0x1 , " dvio " ) ,
BERLIN_PINCTRL_FUNCTION ( 0x2 , " fp " ) ) ,
BERLIN_PINCTRL_GROUP ( " G17 " , 0x04 , 0x3 , 0x09 ,
BERLIN_PINCTRL_FUNCTION ( 0x0 , " gpio " ) ,
BERLIN_PINCTRL_FUNCTION ( 0x1 , " dvio " ) ,
BERLIN_PINCTRL_FUNCTION ( 0x2 , " fp " ) ) ,
BERLIN_PINCTRL_GROUP ( " G18 " , 0x04 , 0x1 , 0x0c ,
BERLIN_PINCTRL_FUNCTION ( 0x0 , " pll " ) ,
BERLIN_PINCTRL_FUNCTION ( 0x1 , " i2s0 " ) ) ,
BERLIN_PINCTRL_GROUP ( " G19 " , 0x04 , 0x1 , 0x0d ,
BERLIN_PINCTRL_FUNCTION ( 0x0 , " i2s0 " ) ,
BERLIN_PINCTRL_FUNCTION ( 0x1 , " pwm " ) ) ,
BERLIN_PINCTRL_GROUP ( " G20 " , 0x04 , 0x1 , 0x0e ,
BERLIN_PINCTRL_FUNCTION ( 0x0 , " spdif " ) ,
BERLIN_PINCTRL_FUNCTION ( 0x1 , " arc " ) ) ,
BERLIN_PINCTRL_GROUP ( " G21 " , 0x04 , 0x3 , 0x0f ,
BERLIN_PINCTRL_FUNCTION ( 0x0 , " gpio " ) ,
BERLIN_PINCTRL_FUNCTION ( 0x1 , " dvio " ) ,
BERLIN_PINCTRL_FUNCTION ( 0x2 , " fp " ) ,
BERLIN_PINCTRL_FUNCTION ( 0x3 , " adac_dbg " ) ,
BERLIN_PINCTRL_FUNCTION ( 0x4 , " pdm_a " ) , /* gpio17..19,pdm */
BERLIN_PINCTRL_FUNCTION ( 0x7 , " pdm_b " ) ) , /* gpio12..14,pdm */
BERLIN_PINCTRL_GROUP ( " G22 " , 0x04 , 0x3 , 0x12 ,
BERLIN_PINCTRL_FUNCTION ( 0x0 , " gpio " ) ,
BERLIN_PINCTRL_FUNCTION ( 0x1 , " dv0 " ) ,
BERLIN_PINCTRL_FUNCTION ( 0x2 , " fp " ) ,
BERLIN_PINCTRL_FUNCTION ( 0x3 , " twsi0 " ) ,
BERLIN_PINCTRL_FUNCTION ( 0x4 , " pwm " ) ) ,
BERLIN_PINCTRL_GROUP ( " G23 " , 0x04 , 0x3 , 0x15 ,
BERLIN_PINCTRL_FUNCTION ( 0x0 , " vclki " ) ,
BERLIN_PINCTRL_FUNCTION ( 0x1 , " dv0 " ) ,
BERLIN_PINCTRL_FUNCTION ( 0x2 , " fp " ) ,
BERLIN_PINCTRL_FUNCTION ( 0x3 , " i2s0 " ) ,
BERLIN_PINCTRL_FUNCTION ( 0x4 , " pwm " ) ,
BERLIN_PINCTRL_FUNCTION ( 0x7 , " pdm " ) ) ,
BERLIN_PINCTRL_GROUP ( " G24 " , 0x04 , 0x2 , 0x18 ,
BERLIN_PINCTRL_FUNCTION ( 0x0 , " i2s2 " ) ,
BERLIN_PINCTRL_FUNCTION ( 0x1 , " i2s1 " ) ) ,
BERLIN_PINCTRL_GROUP ( " G25 " , 0x04 , 0x2 , 0x1a ,
BERLIN_PINCTRL_FUNCTION ( 0x0 , " gpio " ) ,
BERLIN_PINCTRL_FUNCTION ( 0x1 , " nand " ) ,
BERLIN_PINCTRL_FUNCTION ( 0x2 , " i2s2 " ) ) ,
BERLIN_PINCTRL_GROUP ( " G26 " , 0x04 , 0x1 , 0x1c ,
BERLIN_PINCTRL_FUNCTION ( 0x0 , " nand " ) ,
BERLIN_PINCTRL_FUNCTION ( 0x1 , " emmc " ) ) ,
BERLIN_PINCTRL_GROUP ( " G27 " , 0x04 , 0x1 , 0x1d ,
BERLIN_PINCTRL_FUNCTION ( 0x0 , " gpio " ) ,
BERLIN_PINCTRL_FUNCTION ( 0x1 , " nand " ) ) ,
BERLIN_PINCTRL_GROUP ( " G28 " , 0x04 , 0x2 , 0x1e ,
BERLIN_PINCTRL_FUNCTION ( 0x0 , " dvo " ) ,
BERLIN_PINCTRL_FUNCTION ( 0x2 , " sp " ) ) ,
} ;
static const struct berlin_desc_group berlin2_sysmgr_pinctrl_groups [ ] = {
/* GSM */
BERLIN_PINCTRL_GROUP ( " GSM0 " , 0x40 , 0x2 , 0x00 ,
BERLIN_PINCTRL_FUNCTION ( 0x0 , " gpio " ) ,
2015-06-02 12:37:48 +03:00
BERLIN_PINCTRL_FUNCTION ( 0x1 , " spi2 " ) , /* SS0n */
2014-05-19 21:36:31 +04:00
BERLIN_PINCTRL_FUNCTION ( 0x2 , " eth1 " ) ) ,
BERLIN_PINCTRL_GROUP ( " GSM1 " , 0x40 , 0x2 , 0x02 ,
BERLIN_PINCTRL_FUNCTION ( 0x0 , " gpio " ) ,
2015-06-02 12:37:48 +03:00
BERLIN_PINCTRL_FUNCTION ( 0x1 , " spi2 " ) , /* SS1n */
2014-05-19 21:36:31 +04:00
BERLIN_PINCTRL_FUNCTION ( 0x2 , " eth1 " ) ) ,
BERLIN_PINCTRL_GROUP ( " GSM2 " , 0x40 , 0x2 , 0x04 ,
BERLIN_PINCTRL_FUNCTION ( 0x0 , " twsi2 " ) ,
2015-06-02 12:37:48 +03:00
BERLIN_PINCTRL_FUNCTION ( 0x1 , " spi2 " ) ) , /* SS2n/SS3n */
2014-05-19 21:36:31 +04:00
BERLIN_PINCTRL_GROUP ( " GSM3 " , 0x40 , 0x2 , 0x06 ,
BERLIN_PINCTRL_FUNCTION ( 0x0 , " gpio " ) ,
BERLIN_PINCTRL_FUNCTION ( 0x1 , " uart0 " ) , /* CTS/RTS */
BERLIN_PINCTRL_FUNCTION ( 0x2 , " uart2 " ) , /* RX/TX */
BERLIN_PINCTRL_FUNCTION ( 0x3 , " twsi2 " ) ) ,
BERLIN_PINCTRL_GROUP ( " GSM4 " , 0x40 , 0x2 , 0x08 ,
BERLIN_PINCTRL_FUNCTION ( 0x0 , " uart0 " ) , /* RX/TX */
BERLIN_PINCTRL_FUNCTION ( 0x1 , " irda0 " ) ) ,
BERLIN_PINCTRL_GROUP ( " GSM5 " , 0x40 , 0x2 , 0x0a ,
BERLIN_PINCTRL_FUNCTION ( 0x0 , " gpio " ) ,
BERLIN_PINCTRL_FUNCTION ( 0x1 , " uart1 " ) , /* RX/TX */
BERLIN_PINCTRL_FUNCTION ( 0x2 , " irda1 " ) ,
BERLIN_PINCTRL_FUNCTION ( 0x3 , " twsi3 " ) ) ,
BERLIN_PINCTRL_GROUP ( " GSM6 " , 0x40 , 0x2 , 0x0c ,
BERLIN_PINCTRL_FUNCTION ( 0x0 , " gpio " ) ,
2015-06-02 12:37:48 +03:00
BERLIN_PINCTRL_FUNCTION ( 0x1 , " spi2 " ) , /* CLK/SDO */
2014-05-19 21:36:31 +04:00
BERLIN_PINCTRL_FUNCTION ( 0x1 , " clki " ) ) ,
BERLIN_PINCTRL_GROUP ( " GSM7 " , 0x40 , 0x1 , 0x0e ,
BERLIN_PINCTRL_FUNCTION ( 0x0 , " gpio " ) ,
BERLIN_PINCTRL_FUNCTION ( 0x1 , " hdmi " ) ) ,
BERLIN_PINCTRL_GROUP ( " GSM8 " , 0x40 , 0x1 , 0x0f ,
BERLIN_PINCTRL_FUNCTION ( 0x0 , " gpio " ) ,
BERLIN_PINCTRL_FUNCTION ( 0x1 , " hdmi " ) ) ,
BERLIN_PINCTRL_GROUP ( " GSM9 " , 0x40 , 0x1 , 0x10 ,
BERLIN_PINCTRL_FUNCTION ( 0x0 , " gpio " ) ,
BERLIN_PINCTRL_FUNCTION ( 0x1 , " led " ) ) ,
BERLIN_PINCTRL_GROUP ( " GSM10 " , 0x40 , 0x1 , 0x11 ,
BERLIN_PINCTRL_FUNCTION ( 0x0 , " gpio " ) ,
BERLIN_PINCTRL_FUNCTION ( 0x1 , " led " ) ) ,
BERLIN_PINCTRL_GROUP ( " GSM11 " , 0x40 , 0x1 , 0x12 ,
BERLIN_PINCTRL_FUNCTION ( 0x0 , " gpio " ) ,
BERLIN_PINCTRL_FUNCTION ( 0x1 , " led " ) ) ,
} ;
static const struct berlin_pinctrl_desc berlin2_soc_pinctrl_data = {
. groups = berlin2_soc_pinctrl_groups ,
. ngroups = ARRAY_SIZE ( berlin2_soc_pinctrl_groups ) ,
} ;
static const struct berlin_pinctrl_desc berlin2_sysmgr_pinctrl_data = {
. groups = berlin2_sysmgr_pinctrl_groups ,
. ngroups = ARRAY_SIZE ( berlin2_sysmgr_pinctrl_groups ) ,
} ;
static const struct of_device_id berlin2_pinctrl_match [ ] = {
{
2015-05-16 02:16:09 +03:00
. compatible = " marvell,berlin2-soc-pinctrl " ,
2014-05-19 21:36:31 +04:00
. data = & berlin2_soc_pinctrl_data
} ,
{
2015-05-16 02:16:09 +03:00
. compatible = " marvell,berlin2-system-pinctrl " ,
2014-05-19 21:36:31 +04:00
. data = & berlin2_sysmgr_pinctrl_data
} ,
{ }
} ;
static int berlin2_pinctrl_probe ( struct platform_device * pdev )
{
const struct of_device_id * match =
of_match_device ( berlin2_pinctrl_match , & pdev - > dev ) ;
return berlin_pinctrl_probe ( pdev , match - > data ) ;
}
static struct platform_driver berlin2_pinctrl_driver = {
. probe = berlin2_pinctrl_probe ,
. driver = {
. name = " berlin-bg2-pinctrl " ,
. of_match_table = berlin2_pinctrl_match ,
} ,
} ;
2017-02-06 11:03:52 +03:00
builtin_platform_driver ( berlin2_pinctrl_driver ) ;