162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0+
262306a36Sopenharmony_ci//
362306a36Sopenharmony_ci// Freescale i.MX23 pinctrl driver
462306a36Sopenharmony_ci//
562306a36Sopenharmony_ci// Author: Shawn Guo <shawn.guo@linaro.org>
662306a36Sopenharmony_ci// Copyright 2012 Freescale Semiconductor, Inc.
762306a36Sopenharmony_ci
862306a36Sopenharmony_ci#include <linux/init.h>
962306a36Sopenharmony_ci#include <linux/mod_devicetable.h>
1062306a36Sopenharmony_ci#include <linux/platform_device.h>
1162306a36Sopenharmony_ci#include <linux/pinctrl/pinctrl.h>
1262306a36Sopenharmony_ci#include "pinctrl-mxs.h"
1362306a36Sopenharmony_ci
1462306a36Sopenharmony_cienum imx23_pin_enum {
1562306a36Sopenharmony_ci	GPMI_D00	= PINID(0, 0),
1662306a36Sopenharmony_ci	GPMI_D01	= PINID(0, 1),
1762306a36Sopenharmony_ci	GPMI_D02	= PINID(0, 2),
1862306a36Sopenharmony_ci	GPMI_D03	= PINID(0, 3),
1962306a36Sopenharmony_ci	GPMI_D04	= PINID(0, 4),
2062306a36Sopenharmony_ci	GPMI_D05	= PINID(0, 5),
2162306a36Sopenharmony_ci	GPMI_D06	= PINID(0, 6),
2262306a36Sopenharmony_ci	GPMI_D07	= PINID(0, 7),
2362306a36Sopenharmony_ci	GPMI_D08	= PINID(0, 8),
2462306a36Sopenharmony_ci	GPMI_D09	= PINID(0, 9),
2562306a36Sopenharmony_ci	GPMI_D10	= PINID(0, 10),
2662306a36Sopenharmony_ci	GPMI_D11	= PINID(0, 11),
2762306a36Sopenharmony_ci	GPMI_D12	= PINID(0, 12),
2862306a36Sopenharmony_ci	GPMI_D13	= PINID(0, 13),
2962306a36Sopenharmony_ci	GPMI_D14	= PINID(0, 14),
3062306a36Sopenharmony_ci	GPMI_D15	= PINID(0, 15),
3162306a36Sopenharmony_ci	GPMI_CLE	= PINID(0, 16),
3262306a36Sopenharmony_ci	GPMI_ALE	= PINID(0, 17),
3362306a36Sopenharmony_ci	GPMI_CE2N	= PINID(0, 18),
3462306a36Sopenharmony_ci	GPMI_RDY0	= PINID(0, 19),
3562306a36Sopenharmony_ci	GPMI_RDY1	= PINID(0, 20),
3662306a36Sopenharmony_ci	GPMI_RDY2	= PINID(0, 21),
3762306a36Sopenharmony_ci	GPMI_RDY3	= PINID(0, 22),
3862306a36Sopenharmony_ci	GPMI_WPN	= PINID(0, 23),
3962306a36Sopenharmony_ci	GPMI_WRN	= PINID(0, 24),
4062306a36Sopenharmony_ci	GPMI_RDN	= PINID(0, 25),
4162306a36Sopenharmony_ci	AUART1_CTS	= PINID(0, 26),
4262306a36Sopenharmony_ci	AUART1_RTS	= PINID(0, 27),
4362306a36Sopenharmony_ci	AUART1_RX	= PINID(0, 28),
4462306a36Sopenharmony_ci	AUART1_TX	= PINID(0, 29),
4562306a36Sopenharmony_ci	I2C_SCL		= PINID(0, 30),
4662306a36Sopenharmony_ci	I2C_SDA		= PINID(0, 31),
4762306a36Sopenharmony_ci	LCD_D00		= PINID(1, 0),
4862306a36Sopenharmony_ci	LCD_D01		= PINID(1, 1),
4962306a36Sopenharmony_ci	LCD_D02		= PINID(1, 2),
5062306a36Sopenharmony_ci	LCD_D03		= PINID(1, 3),
5162306a36Sopenharmony_ci	LCD_D04		= PINID(1, 4),
5262306a36Sopenharmony_ci	LCD_D05		= PINID(1, 5),
5362306a36Sopenharmony_ci	LCD_D06		= PINID(1, 6),
5462306a36Sopenharmony_ci	LCD_D07		= PINID(1, 7),
5562306a36Sopenharmony_ci	LCD_D08		= PINID(1, 8),
5662306a36Sopenharmony_ci	LCD_D09		= PINID(1, 9),
5762306a36Sopenharmony_ci	LCD_D10		= PINID(1, 10),
5862306a36Sopenharmony_ci	LCD_D11		= PINID(1, 11),
5962306a36Sopenharmony_ci	LCD_D12		= PINID(1, 12),
6062306a36Sopenharmony_ci	LCD_D13		= PINID(1, 13),
6162306a36Sopenharmony_ci	LCD_D14		= PINID(1, 14),
6262306a36Sopenharmony_ci	LCD_D15		= PINID(1, 15),
6362306a36Sopenharmony_ci	LCD_D16		= PINID(1, 16),
6462306a36Sopenharmony_ci	LCD_D17		= PINID(1, 17),
6562306a36Sopenharmony_ci	LCD_RESET	= PINID(1, 18),
6662306a36Sopenharmony_ci	LCD_RS		= PINID(1, 19),
6762306a36Sopenharmony_ci	LCD_WR		= PINID(1, 20),
6862306a36Sopenharmony_ci	LCD_CS		= PINID(1, 21),
6962306a36Sopenharmony_ci	LCD_DOTCK	= PINID(1, 22),
7062306a36Sopenharmony_ci	LCD_ENABLE	= PINID(1, 23),
7162306a36Sopenharmony_ci	LCD_HSYNC	= PINID(1, 24),
7262306a36Sopenharmony_ci	LCD_VSYNC	= PINID(1, 25),
7362306a36Sopenharmony_ci	PWM0		= PINID(1, 26),
7462306a36Sopenharmony_ci	PWM1		= PINID(1, 27),
7562306a36Sopenharmony_ci	PWM2		= PINID(1, 28),
7662306a36Sopenharmony_ci	PWM3		= PINID(1, 29),
7762306a36Sopenharmony_ci	PWM4		= PINID(1, 30),
7862306a36Sopenharmony_ci	SSP1_CMD	= PINID(2, 0),
7962306a36Sopenharmony_ci	SSP1_DETECT	= PINID(2, 1),
8062306a36Sopenharmony_ci	SSP1_DATA0	= PINID(2, 2),
8162306a36Sopenharmony_ci	SSP1_DATA1	= PINID(2, 3),
8262306a36Sopenharmony_ci	SSP1_DATA2	= PINID(2, 4),
8362306a36Sopenharmony_ci	SSP1_DATA3	= PINID(2, 5),
8462306a36Sopenharmony_ci	SSP1_SCK	= PINID(2, 6),
8562306a36Sopenharmony_ci	ROTARYA		= PINID(2, 7),
8662306a36Sopenharmony_ci	ROTARYB		= PINID(2, 8),
8762306a36Sopenharmony_ci	EMI_A00		= PINID(2, 9),
8862306a36Sopenharmony_ci	EMI_A01		= PINID(2, 10),
8962306a36Sopenharmony_ci	EMI_A02		= PINID(2, 11),
9062306a36Sopenharmony_ci	EMI_A03		= PINID(2, 12),
9162306a36Sopenharmony_ci	EMI_A04		= PINID(2, 13),
9262306a36Sopenharmony_ci	EMI_A05		= PINID(2, 14),
9362306a36Sopenharmony_ci	EMI_A06		= PINID(2, 15),
9462306a36Sopenharmony_ci	EMI_A07		= PINID(2, 16),
9562306a36Sopenharmony_ci	EMI_A08		= PINID(2, 17),
9662306a36Sopenharmony_ci	EMI_A09		= PINID(2, 18),
9762306a36Sopenharmony_ci	EMI_A10		= PINID(2, 19),
9862306a36Sopenharmony_ci	EMI_A11		= PINID(2, 20),
9962306a36Sopenharmony_ci	EMI_A12		= PINID(2, 21),
10062306a36Sopenharmony_ci	EMI_BA0		= PINID(2, 22),
10162306a36Sopenharmony_ci	EMI_BA1		= PINID(2, 23),
10262306a36Sopenharmony_ci	EMI_CASN	= PINID(2, 24),
10362306a36Sopenharmony_ci	EMI_CE0N	= PINID(2, 25),
10462306a36Sopenharmony_ci	EMI_CE1N	= PINID(2, 26),
10562306a36Sopenharmony_ci	GPMI_CE1N	= PINID(2, 27),
10662306a36Sopenharmony_ci	GPMI_CE0N	= PINID(2, 28),
10762306a36Sopenharmony_ci	EMI_CKE		= PINID(2, 29),
10862306a36Sopenharmony_ci	EMI_RASN	= PINID(2, 30),
10962306a36Sopenharmony_ci	EMI_WEN		= PINID(2, 31),
11062306a36Sopenharmony_ci	EMI_D00		= PINID(3, 0),
11162306a36Sopenharmony_ci	EMI_D01		= PINID(3, 1),
11262306a36Sopenharmony_ci	EMI_D02		= PINID(3, 2),
11362306a36Sopenharmony_ci	EMI_D03		= PINID(3, 3),
11462306a36Sopenharmony_ci	EMI_D04		= PINID(3, 4),
11562306a36Sopenharmony_ci	EMI_D05		= PINID(3, 5),
11662306a36Sopenharmony_ci	EMI_D06		= PINID(3, 6),
11762306a36Sopenharmony_ci	EMI_D07		= PINID(3, 7),
11862306a36Sopenharmony_ci	EMI_D08		= PINID(3, 8),
11962306a36Sopenharmony_ci	EMI_D09		= PINID(3, 9),
12062306a36Sopenharmony_ci	EMI_D10		= PINID(3, 10),
12162306a36Sopenharmony_ci	EMI_D11		= PINID(3, 11),
12262306a36Sopenharmony_ci	EMI_D12		= PINID(3, 12),
12362306a36Sopenharmony_ci	EMI_D13		= PINID(3, 13),
12462306a36Sopenharmony_ci	EMI_D14		= PINID(3, 14),
12562306a36Sopenharmony_ci	EMI_D15		= PINID(3, 15),
12662306a36Sopenharmony_ci	EMI_DQM0	= PINID(3, 16),
12762306a36Sopenharmony_ci	EMI_DQM1	= PINID(3, 17),
12862306a36Sopenharmony_ci	EMI_DQS0	= PINID(3, 18),
12962306a36Sopenharmony_ci	EMI_DQS1	= PINID(3, 19),
13062306a36Sopenharmony_ci	EMI_CLK		= PINID(3, 20),
13162306a36Sopenharmony_ci	EMI_CLKN	= PINID(3, 21),
13262306a36Sopenharmony_ci};
13362306a36Sopenharmony_ci
13462306a36Sopenharmony_cistatic const struct pinctrl_pin_desc imx23_pins[] = {
13562306a36Sopenharmony_ci	MXS_PINCTRL_PIN(GPMI_D00),
13662306a36Sopenharmony_ci	MXS_PINCTRL_PIN(GPMI_D01),
13762306a36Sopenharmony_ci	MXS_PINCTRL_PIN(GPMI_D02),
13862306a36Sopenharmony_ci	MXS_PINCTRL_PIN(GPMI_D03),
13962306a36Sopenharmony_ci	MXS_PINCTRL_PIN(GPMI_D04),
14062306a36Sopenharmony_ci	MXS_PINCTRL_PIN(GPMI_D05),
14162306a36Sopenharmony_ci	MXS_PINCTRL_PIN(GPMI_D06),
14262306a36Sopenharmony_ci	MXS_PINCTRL_PIN(GPMI_D07),
14362306a36Sopenharmony_ci	MXS_PINCTRL_PIN(GPMI_D08),
14462306a36Sopenharmony_ci	MXS_PINCTRL_PIN(GPMI_D09),
14562306a36Sopenharmony_ci	MXS_PINCTRL_PIN(GPMI_D10),
14662306a36Sopenharmony_ci	MXS_PINCTRL_PIN(GPMI_D11),
14762306a36Sopenharmony_ci	MXS_PINCTRL_PIN(GPMI_D12),
14862306a36Sopenharmony_ci	MXS_PINCTRL_PIN(GPMI_D13),
14962306a36Sopenharmony_ci	MXS_PINCTRL_PIN(GPMI_D14),
15062306a36Sopenharmony_ci	MXS_PINCTRL_PIN(GPMI_D15),
15162306a36Sopenharmony_ci	MXS_PINCTRL_PIN(GPMI_CLE),
15262306a36Sopenharmony_ci	MXS_PINCTRL_PIN(GPMI_ALE),
15362306a36Sopenharmony_ci	MXS_PINCTRL_PIN(GPMI_CE2N),
15462306a36Sopenharmony_ci	MXS_PINCTRL_PIN(GPMI_RDY0),
15562306a36Sopenharmony_ci	MXS_PINCTRL_PIN(GPMI_RDY1),
15662306a36Sopenharmony_ci	MXS_PINCTRL_PIN(GPMI_RDY2),
15762306a36Sopenharmony_ci	MXS_PINCTRL_PIN(GPMI_RDY3),
15862306a36Sopenharmony_ci	MXS_PINCTRL_PIN(GPMI_WPN),
15962306a36Sopenharmony_ci	MXS_PINCTRL_PIN(GPMI_WRN),
16062306a36Sopenharmony_ci	MXS_PINCTRL_PIN(GPMI_RDN),
16162306a36Sopenharmony_ci	MXS_PINCTRL_PIN(AUART1_CTS),
16262306a36Sopenharmony_ci	MXS_PINCTRL_PIN(AUART1_RTS),
16362306a36Sopenharmony_ci	MXS_PINCTRL_PIN(AUART1_RX),
16462306a36Sopenharmony_ci	MXS_PINCTRL_PIN(AUART1_TX),
16562306a36Sopenharmony_ci	MXS_PINCTRL_PIN(I2C_SCL),
16662306a36Sopenharmony_ci	MXS_PINCTRL_PIN(I2C_SDA),
16762306a36Sopenharmony_ci	MXS_PINCTRL_PIN(LCD_D00),
16862306a36Sopenharmony_ci	MXS_PINCTRL_PIN(LCD_D01),
16962306a36Sopenharmony_ci	MXS_PINCTRL_PIN(LCD_D02),
17062306a36Sopenharmony_ci	MXS_PINCTRL_PIN(LCD_D03),
17162306a36Sopenharmony_ci	MXS_PINCTRL_PIN(LCD_D04),
17262306a36Sopenharmony_ci	MXS_PINCTRL_PIN(LCD_D05),
17362306a36Sopenharmony_ci	MXS_PINCTRL_PIN(LCD_D06),
17462306a36Sopenharmony_ci	MXS_PINCTRL_PIN(LCD_D07),
17562306a36Sopenharmony_ci	MXS_PINCTRL_PIN(LCD_D08),
17662306a36Sopenharmony_ci	MXS_PINCTRL_PIN(LCD_D09),
17762306a36Sopenharmony_ci	MXS_PINCTRL_PIN(LCD_D10),
17862306a36Sopenharmony_ci	MXS_PINCTRL_PIN(LCD_D11),
17962306a36Sopenharmony_ci	MXS_PINCTRL_PIN(LCD_D12),
18062306a36Sopenharmony_ci	MXS_PINCTRL_PIN(LCD_D13),
18162306a36Sopenharmony_ci	MXS_PINCTRL_PIN(LCD_D14),
18262306a36Sopenharmony_ci	MXS_PINCTRL_PIN(LCD_D15),
18362306a36Sopenharmony_ci	MXS_PINCTRL_PIN(LCD_D16),
18462306a36Sopenharmony_ci	MXS_PINCTRL_PIN(LCD_D17),
18562306a36Sopenharmony_ci	MXS_PINCTRL_PIN(LCD_RESET),
18662306a36Sopenharmony_ci	MXS_PINCTRL_PIN(LCD_RS),
18762306a36Sopenharmony_ci	MXS_PINCTRL_PIN(LCD_WR),
18862306a36Sopenharmony_ci	MXS_PINCTRL_PIN(LCD_CS),
18962306a36Sopenharmony_ci	MXS_PINCTRL_PIN(LCD_DOTCK),
19062306a36Sopenharmony_ci	MXS_PINCTRL_PIN(LCD_ENABLE),
19162306a36Sopenharmony_ci	MXS_PINCTRL_PIN(LCD_HSYNC),
19262306a36Sopenharmony_ci	MXS_PINCTRL_PIN(LCD_VSYNC),
19362306a36Sopenharmony_ci	MXS_PINCTRL_PIN(PWM0),
19462306a36Sopenharmony_ci	MXS_PINCTRL_PIN(PWM1),
19562306a36Sopenharmony_ci	MXS_PINCTRL_PIN(PWM2),
19662306a36Sopenharmony_ci	MXS_PINCTRL_PIN(PWM3),
19762306a36Sopenharmony_ci	MXS_PINCTRL_PIN(PWM4),
19862306a36Sopenharmony_ci	MXS_PINCTRL_PIN(SSP1_CMD),
19962306a36Sopenharmony_ci	MXS_PINCTRL_PIN(SSP1_DETECT),
20062306a36Sopenharmony_ci	MXS_PINCTRL_PIN(SSP1_DATA0),
20162306a36Sopenharmony_ci	MXS_PINCTRL_PIN(SSP1_DATA1),
20262306a36Sopenharmony_ci	MXS_PINCTRL_PIN(SSP1_DATA2),
20362306a36Sopenharmony_ci	MXS_PINCTRL_PIN(SSP1_DATA3),
20462306a36Sopenharmony_ci	MXS_PINCTRL_PIN(SSP1_SCK),
20562306a36Sopenharmony_ci	MXS_PINCTRL_PIN(ROTARYA),
20662306a36Sopenharmony_ci	MXS_PINCTRL_PIN(ROTARYB),
20762306a36Sopenharmony_ci	MXS_PINCTRL_PIN(EMI_A00),
20862306a36Sopenharmony_ci	MXS_PINCTRL_PIN(EMI_A01),
20962306a36Sopenharmony_ci	MXS_PINCTRL_PIN(EMI_A02),
21062306a36Sopenharmony_ci	MXS_PINCTRL_PIN(EMI_A03),
21162306a36Sopenharmony_ci	MXS_PINCTRL_PIN(EMI_A04),
21262306a36Sopenharmony_ci	MXS_PINCTRL_PIN(EMI_A05),
21362306a36Sopenharmony_ci	MXS_PINCTRL_PIN(EMI_A06),
21462306a36Sopenharmony_ci	MXS_PINCTRL_PIN(EMI_A07),
21562306a36Sopenharmony_ci	MXS_PINCTRL_PIN(EMI_A08),
21662306a36Sopenharmony_ci	MXS_PINCTRL_PIN(EMI_A09),
21762306a36Sopenharmony_ci	MXS_PINCTRL_PIN(EMI_A10),
21862306a36Sopenharmony_ci	MXS_PINCTRL_PIN(EMI_A11),
21962306a36Sopenharmony_ci	MXS_PINCTRL_PIN(EMI_A12),
22062306a36Sopenharmony_ci	MXS_PINCTRL_PIN(EMI_BA0),
22162306a36Sopenharmony_ci	MXS_PINCTRL_PIN(EMI_BA1),
22262306a36Sopenharmony_ci	MXS_PINCTRL_PIN(EMI_CASN),
22362306a36Sopenharmony_ci	MXS_PINCTRL_PIN(EMI_CE0N),
22462306a36Sopenharmony_ci	MXS_PINCTRL_PIN(EMI_CE1N),
22562306a36Sopenharmony_ci	MXS_PINCTRL_PIN(GPMI_CE1N),
22662306a36Sopenharmony_ci	MXS_PINCTRL_PIN(GPMI_CE0N),
22762306a36Sopenharmony_ci	MXS_PINCTRL_PIN(EMI_CKE),
22862306a36Sopenharmony_ci	MXS_PINCTRL_PIN(EMI_RASN),
22962306a36Sopenharmony_ci	MXS_PINCTRL_PIN(EMI_WEN),
23062306a36Sopenharmony_ci	MXS_PINCTRL_PIN(EMI_D00),
23162306a36Sopenharmony_ci	MXS_PINCTRL_PIN(EMI_D01),
23262306a36Sopenharmony_ci	MXS_PINCTRL_PIN(EMI_D02),
23362306a36Sopenharmony_ci	MXS_PINCTRL_PIN(EMI_D03),
23462306a36Sopenharmony_ci	MXS_PINCTRL_PIN(EMI_D04),
23562306a36Sopenharmony_ci	MXS_PINCTRL_PIN(EMI_D05),
23662306a36Sopenharmony_ci	MXS_PINCTRL_PIN(EMI_D06),
23762306a36Sopenharmony_ci	MXS_PINCTRL_PIN(EMI_D07),
23862306a36Sopenharmony_ci	MXS_PINCTRL_PIN(EMI_D08),
23962306a36Sopenharmony_ci	MXS_PINCTRL_PIN(EMI_D09),
24062306a36Sopenharmony_ci	MXS_PINCTRL_PIN(EMI_D10),
24162306a36Sopenharmony_ci	MXS_PINCTRL_PIN(EMI_D11),
24262306a36Sopenharmony_ci	MXS_PINCTRL_PIN(EMI_D12),
24362306a36Sopenharmony_ci	MXS_PINCTRL_PIN(EMI_D13),
24462306a36Sopenharmony_ci	MXS_PINCTRL_PIN(EMI_D14),
24562306a36Sopenharmony_ci	MXS_PINCTRL_PIN(EMI_D15),
24662306a36Sopenharmony_ci	MXS_PINCTRL_PIN(EMI_DQM0),
24762306a36Sopenharmony_ci	MXS_PINCTRL_PIN(EMI_DQM1),
24862306a36Sopenharmony_ci	MXS_PINCTRL_PIN(EMI_DQS0),
24962306a36Sopenharmony_ci	MXS_PINCTRL_PIN(EMI_DQS1),
25062306a36Sopenharmony_ci	MXS_PINCTRL_PIN(EMI_CLK),
25162306a36Sopenharmony_ci	MXS_PINCTRL_PIN(EMI_CLKN),
25262306a36Sopenharmony_ci};
25362306a36Sopenharmony_ci
25462306a36Sopenharmony_cistatic const struct mxs_regs imx23_regs = {
25562306a36Sopenharmony_ci	.muxsel = 0x100,
25662306a36Sopenharmony_ci	.drive = 0x200,
25762306a36Sopenharmony_ci	.pull = 0x400,
25862306a36Sopenharmony_ci};
25962306a36Sopenharmony_ci
26062306a36Sopenharmony_cistatic struct mxs_pinctrl_soc_data imx23_pinctrl_data = {
26162306a36Sopenharmony_ci	.regs = &imx23_regs,
26262306a36Sopenharmony_ci	.pins = imx23_pins,
26362306a36Sopenharmony_ci	.npins = ARRAY_SIZE(imx23_pins),
26462306a36Sopenharmony_ci};
26562306a36Sopenharmony_ci
26662306a36Sopenharmony_cistatic int imx23_pinctrl_probe(struct platform_device *pdev)
26762306a36Sopenharmony_ci{
26862306a36Sopenharmony_ci	return mxs_pinctrl_probe(pdev, &imx23_pinctrl_data);
26962306a36Sopenharmony_ci}
27062306a36Sopenharmony_ci
27162306a36Sopenharmony_cistatic const struct of_device_id imx23_pinctrl_of_match[] = {
27262306a36Sopenharmony_ci	{ .compatible = "fsl,imx23-pinctrl", },
27362306a36Sopenharmony_ci	{ /* sentinel */ }
27462306a36Sopenharmony_ci};
27562306a36Sopenharmony_ci
27662306a36Sopenharmony_cistatic struct platform_driver imx23_pinctrl_driver = {
27762306a36Sopenharmony_ci	.driver = {
27862306a36Sopenharmony_ci		.name = "imx23-pinctrl",
27962306a36Sopenharmony_ci		.suppress_bind_attrs = true,
28062306a36Sopenharmony_ci		.of_match_table = imx23_pinctrl_of_match,
28162306a36Sopenharmony_ci	},
28262306a36Sopenharmony_ci	.probe = imx23_pinctrl_probe,
28362306a36Sopenharmony_ci};
28462306a36Sopenharmony_ci
28562306a36Sopenharmony_cistatic int __init imx23_pinctrl_init(void)
28662306a36Sopenharmony_ci{
28762306a36Sopenharmony_ci	return platform_driver_register(&imx23_pinctrl_driver);
28862306a36Sopenharmony_ci}
28962306a36Sopenharmony_cipostcore_initcall(imx23_pinctrl_init);
290