| /* | 
 |  * Marvell PXA25x family pin control | 
 |  * | 
 |  * Copyright (C) 2016 Robert Jarzmik | 
 |  * | 
 |  * 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; version 2 of the License. | 
 |  * | 
 |  */ | 
 | #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-pxa2xx.h" | 
 |  | 
 | static const struct pxa_desc_pin pxa25x_pins[] = { | 
 | 	PXA_GPIO_ONLY_PIN(PXA_PINCTRL_PIN(0)), | 
 | 	PXA_GPIO_PIN(PXA_PINCTRL_PIN(1), | 
 | 		     PXA_FUNCTION(0, 1, "GP_RST")), | 
 | 	PXA_GPIO_ONLY_PIN(PXA_PINCTRL_PIN(2)), | 
 | 	PXA_GPIO_ONLY_PIN(PXA_PINCTRL_PIN(3)), | 
 | 	PXA_GPIO_ONLY_PIN(PXA_PINCTRL_PIN(4)), | 
 | 	PXA_GPIO_ONLY_PIN(PXA_PINCTRL_PIN(5)), | 
 | 	PXA_GPIO_PIN(PXA_PINCTRL_PIN(6), | 
 | 		     PXA_FUNCTION(1, 1, "MMCCLK")), | 
 | 	PXA_GPIO_PIN(PXA_PINCTRL_PIN(7), | 
 | 		     PXA_FUNCTION(1, 1, "48_MHz")), | 
 | 	PXA_GPIO_PIN(PXA_PINCTRL_PIN(8), | 
 | 		     PXA_FUNCTION(1, 1, "MMCCS0")), | 
 | 	PXA_GPIO_PIN(PXA_PINCTRL_PIN(9), | 
 | 		     PXA_FUNCTION(1, 1, "MMCCS1")), | 
 | 	PXA_GPIO_PIN(PXA_PINCTRL_PIN(10), | 
 | 		     PXA_FUNCTION(1, 1, "RTCCLK")), | 
 | 	PXA_GPIO_PIN(PXA_PINCTRL_PIN(11), | 
 | 		     PXA_FUNCTION(1, 1, "3_6_MHz")), | 
 | 	PXA_GPIO_PIN(PXA_PINCTRL_PIN(12), | 
 | 		     PXA_FUNCTION(1, 1, "32_kHz")), | 
 | 	PXA_GPIO_PIN(PXA_PINCTRL_PIN(13), | 
 | 		     PXA_FUNCTION(1, 2, "MBGNT")), | 
 | 	PXA_GPIO_PIN(PXA_PINCTRL_PIN(14), | 
 | 		     PXA_FUNCTION(0, 1, "MBREQ")), | 
 | 	PXA_GPIO_PIN(PXA_PINCTRL_PIN(15), | 
 | 		     PXA_FUNCTION(1, 2, "nCS_1")), | 
 | 	PXA_GPIO_PIN(PXA_PINCTRL_PIN(16), | 
 | 		     PXA_FUNCTION(1, 2, "PWM0")), | 
 | 	PXA_GPIO_PIN(PXA_PINCTRL_PIN(17), | 
 | 		     PXA_FUNCTION(1, 2, "PWM1")), | 
 | 	PXA_GPIO_PIN(PXA_PINCTRL_PIN(18), | 
 | 		     PXA_FUNCTION(0, 1, "RDY")), | 
 | 	PXA_GPIO_PIN(PXA_PINCTRL_PIN(19), | 
 | 		     PXA_FUNCTION(0, 1, "DREQ[1]")), | 
 | 	PXA_GPIO_PIN(PXA_PINCTRL_PIN(20), | 
 | 		     PXA_FUNCTION(0, 1, "DREQ[0]")), | 
 | 	PXA_GPIO_ONLY_PIN(PXA_PINCTRL_PIN(21)), | 
 | 	PXA_GPIO_ONLY_PIN(PXA_PINCTRL_PIN(22)), | 
 | 	PXA_GPIO_PIN(PXA_PINCTRL_PIN(23), | 
 | 		     PXA_FUNCTION(1, 2, "SCLK")), | 
 | 	PXA_GPIO_PIN(PXA_PINCTRL_PIN(24), | 
 | 		     PXA_FUNCTION(1, 2, "SFRM")), | 
 | 	PXA_GPIO_PIN(PXA_PINCTRL_PIN(25), | 
 | 		     PXA_FUNCTION(1, 2, "TXD")), | 
 | 	PXA_GPIO_PIN(PXA_PINCTRL_PIN(26), | 
 | 		     PXA_FUNCTION(0, 1, "RXD")), | 
 | 	PXA_GPIO_PIN(PXA_PINCTRL_PIN(27), | 
 | 		     PXA_FUNCTION(0, 1, "EXTCLK")), | 
 | 	PXA_GPIO_PIN(PXA_PINCTRL_PIN(28), | 
 | 		     PXA_FUNCTION(0, 1, "BITCLK"), | 
 | 		     PXA_FUNCTION(0, 2, "BITCLK"), | 
 | 		     PXA_FUNCTION(1, 1, "BITCLK")), | 
 | 	PXA_GPIO_PIN(PXA_PINCTRL_PIN(29), | 
 | 		     PXA_FUNCTION(0, 1, "SDATA_IN0"), | 
 | 		     PXA_FUNCTION(0, 2, "SDATA_IN")), | 
 | 	PXA_GPIO_PIN(PXA_PINCTRL_PIN(30), | 
 | 		     PXA_FUNCTION(1, 1, "SDATA_OUT"), | 
 | 		     PXA_FUNCTION(1, 2, "SDATA_OUT")), | 
 | 	PXA_GPIO_PIN(PXA_PINCTRL_PIN(31), | 
 | 		     PXA_FUNCTION(1, 1, "SYNC"), | 
 | 		     PXA_FUNCTION(1, 2, "SYNC")), | 
 | 	PXA_GPIO_PIN(PXA_PINCTRL_PIN(32), | 
 | 		     PXA_FUNCTION(0, 1, "SDATA_IN1"), | 
 | 		     PXA_FUNCTION(1, 1, "SYSCLK")), | 
 | 	PXA_GPIO_PIN(PXA_PINCTRL_PIN(33), | 
 | 		     PXA_FUNCTION(1, 2, "nCS[5]")), | 
 | 	PXA_GPIO_PIN(PXA_PINCTRL_PIN(34), | 
 | 		     PXA_FUNCTION(0, 1, "FFRXD"), | 
 | 		     PXA_FUNCTION(1, 2, "MMCCS0")), | 
 | 	PXA_GPIO_PIN(PXA_PINCTRL_PIN(35), | 
 | 		     PXA_FUNCTION(0, 1, "CTS")), | 
 | 	PXA_GPIO_PIN(PXA_PINCTRL_PIN(36), | 
 | 		     PXA_FUNCTION(0, 1, "DCD")), | 
 | 	PXA_GPIO_PIN(PXA_PINCTRL_PIN(37), | 
 | 		     PXA_FUNCTION(0, 1, "DSR")), | 
 | 	PXA_GPIO_PIN(PXA_PINCTRL_PIN(38), | 
 | 		     PXA_FUNCTION(0, 1, "RI")), | 
 | 	PXA_GPIO_PIN(PXA_PINCTRL_PIN(39), | 
 | 		     PXA_FUNCTION(1, 1, "MMCC1"), | 
 | 		     PXA_FUNCTION(1, 2, "FFTXD")), | 
 | 	PXA_GPIO_PIN(PXA_PINCTRL_PIN(40), | 
 | 		     PXA_FUNCTION(1, 2, "DTR")), | 
 | 	PXA_GPIO_PIN(PXA_PINCTRL_PIN(41), | 
 | 		     PXA_FUNCTION(1, 2, "RTS")), | 
 | 	PXA_GPIO_PIN(PXA_PINCTRL_PIN(42), | 
 | 		     PXA_FUNCTION(0, 1, "BTRXD"), | 
 | 		     PXA_FUNCTION(0, 3, "HWRXD")), | 
 | 	PXA_GPIO_PIN(PXA_PINCTRL_PIN(43), | 
 | 		     PXA_FUNCTION(1, 2, "BTTXD"), | 
 | 		     PXA_FUNCTION(1, 3, "HWTXD")), | 
 | 	PXA_GPIO_PIN(PXA_PINCTRL_PIN(44), | 
 | 		     PXA_FUNCTION(0, 1, "BTCTS"), | 
 | 		     PXA_FUNCTION(0, 3, "HWCTS")), | 
 | 	PXA_GPIO_PIN(PXA_PINCTRL_PIN(45), | 
 | 		     PXA_FUNCTION(1, 2, "BTRTS"), | 
 | 		     PXA_FUNCTION(1, 3, "HWRTS")), | 
 | 	PXA_GPIO_PIN(PXA_PINCTRL_PIN(46), | 
 | 		     PXA_FUNCTION(0, 1, "ICP_RXD"), | 
 | 		     PXA_FUNCTION(0, 2, "RXD")), | 
 | 	PXA_GPIO_PIN(PXA_PINCTRL_PIN(47), | 
 | 		     PXA_FUNCTION(1, 1, "TXD"), | 
 | 		     PXA_FUNCTION(1, 2, "ICP_TXD")), | 
 | 	PXA_GPIO_PIN(PXA_PINCTRL_PIN(48), | 
 | 		     PXA_FUNCTION(1, 1, "HWTXD"), | 
 | 		     PXA_FUNCTION(1, 2, "nPOE")), | 
 | 	PXA_GPIO_PIN(PXA_PINCTRL_PIN(49), | 
 | 		     PXA_FUNCTION(0, 1, "HWRXD"), | 
 | 		     PXA_FUNCTION(1, 2, "nPWE")), | 
 | 	PXA_GPIO_PIN(PXA_PINCTRL_PIN(50), | 
 | 		     PXA_FUNCTION(0, 1, "HWCTS"), | 
 | 		     PXA_FUNCTION(1, 2, "nPIOR")), | 
 | 	PXA_GPIO_PIN(PXA_PINCTRL_PIN(51), | 
 | 		     PXA_FUNCTION(1, 1, "HWRTS"), | 
 | 		     PXA_FUNCTION(1, 2, "nPIOW")), | 
 | 	PXA_GPIO_PIN(PXA_PINCTRL_PIN(52), | 
 | 		     PXA_FUNCTION(1, 2, "nPCE[1]")), | 
 | 	PXA_GPIO_PIN(PXA_PINCTRL_PIN(53), | 
 | 		     PXA_FUNCTION(1, 1, "MMCCLK"), | 
 | 		     PXA_FUNCTION(1, 2, "nPCE[2]")), | 
 | 	PXA_GPIO_PIN(PXA_PINCTRL_PIN(54), | 
 | 		     PXA_FUNCTION(1, 1, "MMCCLK"), | 
 | 		     PXA_FUNCTION(1, 2, "nPSKTSEL")), | 
 | 	PXA_GPIO_PIN(PXA_PINCTRL_PIN(55), | 
 | 		     PXA_FUNCTION(1, 2, "nPREG")), | 
 | 	PXA_GPIO_PIN(PXA_PINCTRL_PIN(56), | 
 | 		     PXA_FUNCTION(0, 1, "nPWAIT")), | 
 | 	PXA_GPIO_PIN(PXA_PINCTRL_PIN(57), | 
 | 		     PXA_FUNCTION(0, 1, "nIOIS16")), | 
 | 	PXA_GPIO_PIN(PXA_PINCTRL_PIN(58), | 
 | 		     PXA_FUNCTION(1, 2, "LDD<0>")), | 
 | 	PXA_GPIO_PIN(PXA_PINCTRL_PIN(59), | 
 | 		     PXA_FUNCTION(1, 2, "LDD<1>")), | 
 | 	PXA_GPIO_PIN(PXA_PINCTRL_PIN(60), | 
 | 		     PXA_FUNCTION(1, 2, "LDD<2>")), | 
 | 	PXA_GPIO_PIN(PXA_PINCTRL_PIN(61), | 
 | 		     PXA_FUNCTION(1, 2, "LDD<3>")), | 
 | 	PXA_GPIO_PIN(PXA_PINCTRL_PIN(62), | 
 | 		     PXA_FUNCTION(1, 2, "LDD<4>")), | 
 | 	PXA_GPIO_PIN(PXA_PINCTRL_PIN(63), | 
 | 		     PXA_FUNCTION(1, 2, "LDD<5>")), | 
 | 	PXA_GPIO_PIN(PXA_PINCTRL_PIN(64), | 
 | 		     PXA_FUNCTION(1, 2, "LDD<6>")), | 
 | 	PXA_GPIO_PIN(PXA_PINCTRL_PIN(65), | 
 | 		     PXA_FUNCTION(1, 2, "LDD<7>")), | 
 | 	PXA_GPIO_PIN(PXA_PINCTRL_PIN(66), | 
 | 		     PXA_FUNCTION(0, 1, "MBREQ"), | 
 | 		     PXA_FUNCTION(1, 2, "LDD<8>")), | 
 | 	PXA_GPIO_PIN(PXA_PINCTRL_PIN(67), | 
 | 		     PXA_FUNCTION(1, 1, "MMCCS0"), | 
 | 		     PXA_FUNCTION(1, 2, "LDD<9>")), | 
 | 	PXA_GPIO_PIN(PXA_PINCTRL_PIN(68), | 
 | 		     PXA_FUNCTION(1, 1, "MMCCS1"), | 
 | 		     PXA_FUNCTION(1, 2, "LDD<10>")), | 
 | 	PXA_GPIO_PIN(PXA_PINCTRL_PIN(69), | 
 | 		     PXA_FUNCTION(1, 1, "MMCCLK"), | 
 | 		     PXA_FUNCTION(1, 2, "LDD<11>")), | 
 | 	PXA_GPIO_PIN(PXA_PINCTRL_PIN(70), | 
 | 		     PXA_FUNCTION(1, 1, "RTCCLK"), | 
 | 		     PXA_FUNCTION(1, 2, "LDD<12>")), | 
 | 	PXA_GPIO_PIN(PXA_PINCTRL_PIN(71), | 
 | 		     PXA_FUNCTION(1, 1, "3_6_MHz"), | 
 | 		     PXA_FUNCTION(1, 2, "LDD<13>")), | 
 | 	PXA_GPIO_PIN(PXA_PINCTRL_PIN(72), | 
 | 		     PXA_FUNCTION(1, 1, "32_kHz"), | 
 | 		     PXA_FUNCTION(1, 2, "LDD<14>")), | 
 | 	PXA_GPIO_PIN(PXA_PINCTRL_PIN(73), | 
 | 		     PXA_FUNCTION(1, 1, "MBGNT"), | 
 | 		     PXA_FUNCTION(1, 2, "LDD<15>")), | 
 | 	PXA_GPIO_PIN(PXA_PINCTRL_PIN(74), | 
 | 		     PXA_FUNCTION(1, 2, "LCD_FCLK")), | 
 | 	PXA_GPIO_PIN(PXA_PINCTRL_PIN(75), | 
 | 		     PXA_FUNCTION(1, 2, "LCD_LCLK")), | 
 | 	PXA_GPIO_PIN(PXA_PINCTRL_PIN(76), | 
 | 		     PXA_FUNCTION(1, 2, "LCD_PCLK")), | 
 | 	PXA_GPIO_PIN(PXA_PINCTRL_PIN(77), | 
 | 		     PXA_FUNCTION(1, 2, "LCD_ACBIAS")), | 
 | 	PXA_GPIO_PIN(PXA_PINCTRL_PIN(78), | 
 | 		     PXA_FUNCTION(1, 2, "nCS<2>")), | 
 | 	PXA_GPIO_PIN(PXA_PINCTRL_PIN(79), | 
 | 		     PXA_FUNCTION(1, 2, "nCS<3>")), | 
 | 	PXA_GPIO_PIN(PXA_PINCTRL_PIN(80), | 
 | 		     PXA_FUNCTION(1, 2, "nCS<4>")), | 
 | 	PXA_GPIO_PIN(PXA_PINCTRL_PIN(81), | 
 | 		     PXA_FUNCTION(0, 1, "NSSPSCLK"), | 
 | 		     PXA_FUNCTION(1, 1, "NSSPSCLK")), | 
 | 	PXA_GPIO_PIN(PXA_PINCTRL_PIN(82), | 
 | 		     PXA_FUNCTION(0, 1, "NSSPSFRM"), | 
 | 		     PXA_FUNCTION(1, 1, "NSSPSFRM")), | 
 | 	PXA_GPIO_PIN(PXA_PINCTRL_PIN(83), | 
 | 		     PXA_FUNCTION(0, 2, "NSSPRXD"), | 
 | 		     PXA_FUNCTION(1, 1, "NSSPTXD")), | 
 | 	PXA_GPIO_PIN(PXA_PINCTRL_PIN(84), | 
 | 		     PXA_FUNCTION(0, 2, "NSSPRXD"), | 
 | 		     PXA_FUNCTION(1, 1, "NSSPTXD")), | 
 | }; | 
 |  | 
 | static int pxa25x_pinctrl_probe(struct platform_device *pdev) | 
 | { | 
 | 	int ret, i; | 
 | 	void __iomem *base_af[8]; | 
 | 	void __iomem *base_dir[4]; | 
 | 	void __iomem *base_sleep[4]; | 
 | 	struct resource *res; | 
 |  | 
 | 	res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 
 | 	base_af[0] = devm_ioremap_resource(&pdev->dev, res); | 
 | 	if (IS_ERR(base_af[0])) | 
 | 		return PTR_ERR(base_af[0]); | 
 |  | 
 | 	res = platform_get_resource(pdev, IORESOURCE_MEM, 1); | 
 | 	base_dir[0] = devm_ioremap_resource(&pdev->dev, res); | 
 | 	if (IS_ERR(base_dir[0])) | 
 | 		return PTR_ERR(base_dir[0]); | 
 |  | 
 | 	res = platform_get_resource(pdev, IORESOURCE_MEM, 2); | 
 | 	base_dir[3] = devm_ioremap_resource(&pdev->dev, res); | 
 | 	if (IS_ERR(base_dir[3])) | 
 | 		return PTR_ERR(base_dir[3]); | 
 |  | 
 | 	res = platform_get_resource(pdev, IORESOURCE_MEM, 3); | 
 | 	base_sleep[0] = devm_ioremap_resource(&pdev->dev, res); | 
 | 	if (IS_ERR(base_sleep[0])) | 
 | 		return PTR_ERR(base_sleep[0]); | 
 |  | 
 | 	for (i = 0; i < ARRAY_SIZE(base_af); i++) | 
 | 		base_af[i] = base_af[0] + sizeof(base_af[0]) * i; | 
 | 	for (i = 0; i < 3; i++) | 
 | 		base_dir[i] = base_dir[0] + sizeof(base_dir[0]) * i; | 
 | 	for (i = 0; i < ARRAY_SIZE(base_sleep); i++) | 
 | 		base_sleep[i] = base_sleep[0] + sizeof(base_af[0]) * i; | 
 |  | 
 | 	ret = pxa2xx_pinctrl_init(pdev, pxa25x_pins, ARRAY_SIZE(pxa25x_pins), | 
 | 				  base_af, base_dir, base_sleep); | 
 | 	return ret; | 
 | } | 
 |  | 
 | static const struct of_device_id pxa25x_pinctrl_match[] = { | 
 | 	{ .compatible = "marvell,pxa25x-pinctrl", }, | 
 | 	{} | 
 | }; | 
 | MODULE_DEVICE_TABLE(of, pxa25x_pinctrl_match); | 
 |  | 
 | static struct platform_driver pxa25x_pinctrl_driver = { | 
 | 	.probe	= pxa25x_pinctrl_probe, | 
 | 	.driver	= { | 
 | 		.name		= "pxa25x-pinctrl", | 
 | 		.of_match_table	= pxa25x_pinctrl_match, | 
 | 	}, | 
 | }; | 
 | module_platform_driver(pxa25x_pinctrl_driver); | 
 |  | 
 | MODULE_AUTHOR("Robert Jarzmik <robert.jarzmik@free.fr>"); | 
 | MODULE_DESCRIPTION("Marvell PXA25x pinctrl driver"); | 
 | MODULE_LICENSE("GPL v2"); |