18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci * Lochnagar pin and GPIO control
48c2ecf20Sopenharmony_ci *
58c2ecf20Sopenharmony_ci * Copyright (c) 2017-2018 Cirrus Logic, Inc. and
68c2ecf20Sopenharmony_ci *                         Cirrus Logic International Semiconductor Ltd.
78c2ecf20Sopenharmony_ci *
88c2ecf20Sopenharmony_ci * Author: Charles Keepax <ckeepax@opensource.cirrus.com>
98c2ecf20Sopenharmony_ci */
108c2ecf20Sopenharmony_ci
118c2ecf20Sopenharmony_ci#include <linux/err.h>
128c2ecf20Sopenharmony_ci#include <linux/errno.h>
138c2ecf20Sopenharmony_ci#include <linux/gpio/driver.h>
148c2ecf20Sopenharmony_ci#include <linux/module.h>
158c2ecf20Sopenharmony_ci#include <linux/of.h>
168c2ecf20Sopenharmony_ci#include <linux/platform_device.h>
178c2ecf20Sopenharmony_ci#include <linux/regmap.h>
188c2ecf20Sopenharmony_ci#include <linux/pinctrl/pinctrl.h>
198c2ecf20Sopenharmony_ci#include <linux/pinctrl/pinmux.h>
208c2ecf20Sopenharmony_ci#include <linux/pinctrl/pinconf.h>
218c2ecf20Sopenharmony_ci#include <linux/pinctrl/pinconf-generic.h>
228c2ecf20Sopenharmony_ci
238c2ecf20Sopenharmony_ci#include <linux/mfd/lochnagar.h>
248c2ecf20Sopenharmony_ci#include <linux/mfd/lochnagar1_regs.h>
258c2ecf20Sopenharmony_ci#include <linux/mfd/lochnagar2_regs.h>
268c2ecf20Sopenharmony_ci
278c2ecf20Sopenharmony_ci#include <dt-bindings/pinctrl/lochnagar.h>
288c2ecf20Sopenharmony_ci
298c2ecf20Sopenharmony_ci#include "../pinctrl-utils.h"
308c2ecf20Sopenharmony_ci
318c2ecf20Sopenharmony_ci#define LN2_NUM_GPIO_CHANNELS	16
328c2ecf20Sopenharmony_ci
338c2ecf20Sopenharmony_ci#define LN_CDC_AIF1_STR		"codec-aif1"
348c2ecf20Sopenharmony_ci#define LN_CDC_AIF2_STR		"codec-aif2"
358c2ecf20Sopenharmony_ci#define LN_CDC_AIF3_STR		"codec-aif3"
368c2ecf20Sopenharmony_ci#define LN_DSP_AIF1_STR		"dsp-aif1"
378c2ecf20Sopenharmony_ci#define LN_DSP_AIF2_STR		"dsp-aif2"
388c2ecf20Sopenharmony_ci#define LN_PSIA1_STR		"psia1"
398c2ecf20Sopenharmony_ci#define LN_PSIA2_STR		"psia2"
408c2ecf20Sopenharmony_ci#define LN_GF_AIF1_STR		"gf-aif1"
418c2ecf20Sopenharmony_ci#define LN_GF_AIF2_STR		"gf-aif2"
428c2ecf20Sopenharmony_ci#define LN_GF_AIF3_STR		"gf-aif3"
438c2ecf20Sopenharmony_ci#define LN_GF_AIF4_STR		"gf-aif4"
448c2ecf20Sopenharmony_ci#define LN_SPDIF_AIF_STR	"spdif-aif"
458c2ecf20Sopenharmony_ci#define LN_USB_AIF1_STR		"usb-aif1"
468c2ecf20Sopenharmony_ci#define LN_USB_AIF2_STR		"usb-aif2"
478c2ecf20Sopenharmony_ci#define LN_ADAT_AIF_STR		"adat-aif"
488c2ecf20Sopenharmony_ci#define LN_SOUNDCARD_AIF_STR	"soundcard-aif"
498c2ecf20Sopenharmony_ci
508c2ecf20Sopenharmony_ci#define LN_PIN_GPIO(REV, ID, NAME, REG, SHIFT, INVERT) \
518c2ecf20Sopenharmony_cistatic const struct lochnagar_pin lochnagar##REV##_##ID##_pin = { \
528c2ecf20Sopenharmony_ci	.name = NAME, .type = LN_PTYPE_GPIO, .reg = LOCHNAGAR##REV##_##REG, \
538c2ecf20Sopenharmony_ci	.shift = LOCHNAGAR##REV##_##SHIFT##_SHIFT, .invert = INVERT, \
548c2ecf20Sopenharmony_ci}
558c2ecf20Sopenharmony_ci
568c2ecf20Sopenharmony_ci#define LN_PIN_SAIF(REV, ID, NAME) \
578c2ecf20Sopenharmony_cistatic const struct lochnagar_pin lochnagar##REV##_##ID##_pin = \
588c2ecf20Sopenharmony_ci	{ .name = NAME, .type = LN_PTYPE_AIF, }
598c2ecf20Sopenharmony_ci
608c2ecf20Sopenharmony_ci#define LN_PIN_AIF(REV, ID) \
618c2ecf20Sopenharmony_ci	LN_PIN_SAIF(REV, ID##_BCLK,  LN_##ID##_STR"-bclk"); \
628c2ecf20Sopenharmony_ci	LN_PIN_SAIF(REV, ID##_LRCLK, LN_##ID##_STR"-lrclk"); \
638c2ecf20Sopenharmony_ci	LN_PIN_SAIF(REV, ID##_RXDAT, LN_##ID##_STR"-rxdat"); \
648c2ecf20Sopenharmony_ci	LN_PIN_SAIF(REV, ID##_TXDAT, LN_##ID##_STR"-txdat")
658c2ecf20Sopenharmony_ci
668c2ecf20Sopenharmony_ci#define LN1_PIN_GPIO(ID, NAME, REG, SHIFT, INVERT) \
678c2ecf20Sopenharmony_ci	LN_PIN_GPIO(1, ID, NAME, REG, SHIFT, INVERT)
688c2ecf20Sopenharmony_ci
698c2ecf20Sopenharmony_ci#define LN1_PIN_MUX(ID, NAME) \
708c2ecf20Sopenharmony_cistatic const struct lochnagar_pin lochnagar1_##ID##_pin = \
718c2ecf20Sopenharmony_ci	{ .name = NAME, .type = LN_PTYPE_MUX, .reg = LOCHNAGAR1_##ID, }
728c2ecf20Sopenharmony_ci
738c2ecf20Sopenharmony_ci#define LN1_PIN_AIF(ID) LN_PIN_AIF(1, ID)
748c2ecf20Sopenharmony_ci
758c2ecf20Sopenharmony_ci#define LN2_PIN_GPIO(ID, NAME, REG, SHIFT, INVERT) \
768c2ecf20Sopenharmony_ci	LN_PIN_GPIO(2, ID, NAME, REG, SHIFT, INVERT)
778c2ecf20Sopenharmony_ci
788c2ecf20Sopenharmony_ci#define LN2_PIN_MUX(ID, NAME) \
798c2ecf20Sopenharmony_cistatic const struct lochnagar_pin lochnagar2_##ID##_pin = \
808c2ecf20Sopenharmony_ci	{ .name = NAME, .type = LN_PTYPE_MUX, .reg = LOCHNAGAR2_GPIO_##ID, }
818c2ecf20Sopenharmony_ci
828c2ecf20Sopenharmony_ci#define LN2_PIN_AIF(ID) LN_PIN_AIF(2, ID)
838c2ecf20Sopenharmony_ci
848c2ecf20Sopenharmony_ci#define LN2_PIN_GAI(ID) \
858c2ecf20Sopenharmony_ci	LN2_PIN_MUX(ID##_BCLK,  LN_##ID##_STR"-bclk"); \
868c2ecf20Sopenharmony_ci	LN2_PIN_MUX(ID##_LRCLK, LN_##ID##_STR"-lrclk"); \
878c2ecf20Sopenharmony_ci	LN2_PIN_MUX(ID##_RXDAT, LN_##ID##_STR"-rxdat"); \
888c2ecf20Sopenharmony_ci	LN2_PIN_MUX(ID##_TXDAT, LN_##ID##_STR"-txdat")
898c2ecf20Sopenharmony_ci
908c2ecf20Sopenharmony_ci#define LN_PIN(REV, ID) [LOCHNAGAR##REV##_PIN_##ID] = { \
918c2ecf20Sopenharmony_ci	.number = LOCHNAGAR##REV##_PIN_##ID, \
928c2ecf20Sopenharmony_ci	.name = lochnagar##REV##_##ID##_pin.name, \
938c2ecf20Sopenharmony_ci	.drv_data = (void *)&lochnagar##REV##_##ID##_pin, \
948c2ecf20Sopenharmony_ci}
958c2ecf20Sopenharmony_ci
968c2ecf20Sopenharmony_ci#define LN1_PIN(ID) LN_PIN(1, ID)
978c2ecf20Sopenharmony_ci#define LN2_PIN(ID) LN_PIN(2, ID)
988c2ecf20Sopenharmony_ci
998c2ecf20Sopenharmony_ci#define LN_PINS(REV, ID) \
1008c2ecf20Sopenharmony_ci	LN_PIN(REV, ID##_BCLK), LN_PIN(REV, ID##_LRCLK), \
1018c2ecf20Sopenharmony_ci	LN_PIN(REV, ID##_RXDAT), LN_PIN(REV, ID##_TXDAT)
1028c2ecf20Sopenharmony_ci
1038c2ecf20Sopenharmony_ci#define LN1_PINS(ID) LN_PINS(1, ID)
1048c2ecf20Sopenharmony_ci#define LN2_PINS(ID) LN_PINS(2, ID)
1058c2ecf20Sopenharmony_ci
1068c2ecf20Sopenharmony_cienum {
1078c2ecf20Sopenharmony_ci	LOCHNAGAR1_PIN_GF_GPIO2 = LOCHNAGAR1_PIN_NUM_GPIOS,
1088c2ecf20Sopenharmony_ci	LOCHNAGAR1_PIN_GF_GPIO3,
1098c2ecf20Sopenharmony_ci	LOCHNAGAR1_PIN_GF_GPIO7,
1108c2ecf20Sopenharmony_ci	LOCHNAGAR1_PIN_LED1,
1118c2ecf20Sopenharmony_ci	LOCHNAGAR1_PIN_LED2,
1128c2ecf20Sopenharmony_ci	LOCHNAGAR1_PIN_CDC_AIF1_BCLK,
1138c2ecf20Sopenharmony_ci	LOCHNAGAR1_PIN_CDC_AIF1_LRCLK,
1148c2ecf20Sopenharmony_ci	LOCHNAGAR1_PIN_CDC_AIF1_RXDAT,
1158c2ecf20Sopenharmony_ci	LOCHNAGAR1_PIN_CDC_AIF1_TXDAT,
1168c2ecf20Sopenharmony_ci	LOCHNAGAR1_PIN_CDC_AIF2_BCLK,
1178c2ecf20Sopenharmony_ci	LOCHNAGAR1_PIN_CDC_AIF2_LRCLK,
1188c2ecf20Sopenharmony_ci	LOCHNAGAR1_PIN_CDC_AIF2_RXDAT,
1198c2ecf20Sopenharmony_ci	LOCHNAGAR1_PIN_CDC_AIF2_TXDAT,
1208c2ecf20Sopenharmony_ci	LOCHNAGAR1_PIN_CDC_AIF3_BCLK,
1218c2ecf20Sopenharmony_ci	LOCHNAGAR1_PIN_CDC_AIF3_LRCLK,
1228c2ecf20Sopenharmony_ci	LOCHNAGAR1_PIN_CDC_AIF3_RXDAT,
1238c2ecf20Sopenharmony_ci	LOCHNAGAR1_PIN_CDC_AIF3_TXDAT,
1248c2ecf20Sopenharmony_ci	LOCHNAGAR1_PIN_DSP_AIF1_BCLK,
1258c2ecf20Sopenharmony_ci	LOCHNAGAR1_PIN_DSP_AIF1_LRCLK,
1268c2ecf20Sopenharmony_ci	LOCHNAGAR1_PIN_DSP_AIF1_RXDAT,
1278c2ecf20Sopenharmony_ci	LOCHNAGAR1_PIN_DSP_AIF1_TXDAT,
1288c2ecf20Sopenharmony_ci	LOCHNAGAR1_PIN_DSP_AIF2_BCLK,
1298c2ecf20Sopenharmony_ci	LOCHNAGAR1_PIN_DSP_AIF2_LRCLK,
1308c2ecf20Sopenharmony_ci	LOCHNAGAR1_PIN_DSP_AIF2_RXDAT,
1318c2ecf20Sopenharmony_ci	LOCHNAGAR1_PIN_DSP_AIF2_TXDAT,
1328c2ecf20Sopenharmony_ci	LOCHNAGAR1_PIN_PSIA1_BCLK,
1338c2ecf20Sopenharmony_ci	LOCHNAGAR1_PIN_PSIA1_LRCLK,
1348c2ecf20Sopenharmony_ci	LOCHNAGAR1_PIN_PSIA1_RXDAT,
1358c2ecf20Sopenharmony_ci	LOCHNAGAR1_PIN_PSIA1_TXDAT,
1368c2ecf20Sopenharmony_ci	LOCHNAGAR1_PIN_PSIA2_BCLK,
1378c2ecf20Sopenharmony_ci	LOCHNAGAR1_PIN_PSIA2_LRCLK,
1388c2ecf20Sopenharmony_ci	LOCHNAGAR1_PIN_PSIA2_RXDAT,
1398c2ecf20Sopenharmony_ci	LOCHNAGAR1_PIN_PSIA2_TXDAT,
1408c2ecf20Sopenharmony_ci	LOCHNAGAR1_PIN_SPDIF_AIF_BCLK,
1418c2ecf20Sopenharmony_ci	LOCHNAGAR1_PIN_SPDIF_AIF_LRCLK,
1428c2ecf20Sopenharmony_ci	LOCHNAGAR1_PIN_SPDIF_AIF_RXDAT,
1438c2ecf20Sopenharmony_ci	LOCHNAGAR1_PIN_SPDIF_AIF_TXDAT,
1448c2ecf20Sopenharmony_ci	LOCHNAGAR1_PIN_GF_AIF3_BCLK,
1458c2ecf20Sopenharmony_ci	LOCHNAGAR1_PIN_GF_AIF3_RXDAT,
1468c2ecf20Sopenharmony_ci	LOCHNAGAR1_PIN_GF_AIF3_LRCLK,
1478c2ecf20Sopenharmony_ci	LOCHNAGAR1_PIN_GF_AIF3_TXDAT,
1488c2ecf20Sopenharmony_ci	LOCHNAGAR1_PIN_GF_AIF4_BCLK,
1498c2ecf20Sopenharmony_ci	LOCHNAGAR1_PIN_GF_AIF4_RXDAT,
1508c2ecf20Sopenharmony_ci	LOCHNAGAR1_PIN_GF_AIF4_LRCLK,
1518c2ecf20Sopenharmony_ci	LOCHNAGAR1_PIN_GF_AIF4_TXDAT,
1528c2ecf20Sopenharmony_ci	LOCHNAGAR1_PIN_GF_AIF1_BCLK,
1538c2ecf20Sopenharmony_ci	LOCHNAGAR1_PIN_GF_AIF1_RXDAT,
1548c2ecf20Sopenharmony_ci	LOCHNAGAR1_PIN_GF_AIF1_LRCLK,
1558c2ecf20Sopenharmony_ci	LOCHNAGAR1_PIN_GF_AIF1_TXDAT,
1568c2ecf20Sopenharmony_ci	LOCHNAGAR1_PIN_GF_AIF2_BCLK,
1578c2ecf20Sopenharmony_ci	LOCHNAGAR1_PIN_GF_AIF2_RXDAT,
1588c2ecf20Sopenharmony_ci	LOCHNAGAR1_PIN_GF_AIF2_LRCLK,
1598c2ecf20Sopenharmony_ci	LOCHNAGAR1_PIN_GF_AIF2_TXDAT,
1608c2ecf20Sopenharmony_ci
1618c2ecf20Sopenharmony_ci	LOCHNAGAR2_PIN_SPDIF_AIF_BCLK = LOCHNAGAR2_PIN_NUM_GPIOS,
1628c2ecf20Sopenharmony_ci	LOCHNAGAR2_PIN_SPDIF_AIF_LRCLK,
1638c2ecf20Sopenharmony_ci	LOCHNAGAR2_PIN_SPDIF_AIF_RXDAT,
1648c2ecf20Sopenharmony_ci	LOCHNAGAR2_PIN_SPDIF_AIF_TXDAT,
1658c2ecf20Sopenharmony_ci	LOCHNAGAR2_PIN_USB_AIF1_BCLK,
1668c2ecf20Sopenharmony_ci	LOCHNAGAR2_PIN_USB_AIF1_LRCLK,
1678c2ecf20Sopenharmony_ci	LOCHNAGAR2_PIN_USB_AIF1_RXDAT,
1688c2ecf20Sopenharmony_ci	LOCHNAGAR2_PIN_USB_AIF1_TXDAT,
1698c2ecf20Sopenharmony_ci	LOCHNAGAR2_PIN_USB_AIF2_BCLK,
1708c2ecf20Sopenharmony_ci	LOCHNAGAR2_PIN_USB_AIF2_LRCLK,
1718c2ecf20Sopenharmony_ci	LOCHNAGAR2_PIN_USB_AIF2_RXDAT,
1728c2ecf20Sopenharmony_ci	LOCHNAGAR2_PIN_USB_AIF2_TXDAT,
1738c2ecf20Sopenharmony_ci	LOCHNAGAR2_PIN_ADAT_AIF_BCLK,
1748c2ecf20Sopenharmony_ci	LOCHNAGAR2_PIN_ADAT_AIF_LRCLK,
1758c2ecf20Sopenharmony_ci	LOCHNAGAR2_PIN_ADAT_AIF_RXDAT,
1768c2ecf20Sopenharmony_ci	LOCHNAGAR2_PIN_ADAT_AIF_TXDAT,
1778c2ecf20Sopenharmony_ci	LOCHNAGAR2_PIN_SOUNDCARD_AIF_BCLK,
1788c2ecf20Sopenharmony_ci	LOCHNAGAR2_PIN_SOUNDCARD_AIF_LRCLK,
1798c2ecf20Sopenharmony_ci	LOCHNAGAR2_PIN_SOUNDCARD_AIF_RXDAT,
1808c2ecf20Sopenharmony_ci	LOCHNAGAR2_PIN_SOUNDCARD_AIF_TXDAT,
1818c2ecf20Sopenharmony_ci};
1828c2ecf20Sopenharmony_ci
1838c2ecf20Sopenharmony_cienum lochnagar_pin_type {
1848c2ecf20Sopenharmony_ci	LN_PTYPE_GPIO,
1858c2ecf20Sopenharmony_ci	LN_PTYPE_MUX,
1868c2ecf20Sopenharmony_ci	LN_PTYPE_AIF,
1878c2ecf20Sopenharmony_ci	LN_PTYPE_COUNT,
1888c2ecf20Sopenharmony_ci};
1898c2ecf20Sopenharmony_ci
1908c2ecf20Sopenharmony_cistruct lochnagar_pin {
1918c2ecf20Sopenharmony_ci	const char name[20];
1928c2ecf20Sopenharmony_ci
1938c2ecf20Sopenharmony_ci	enum lochnagar_pin_type type;
1948c2ecf20Sopenharmony_ci
1958c2ecf20Sopenharmony_ci	unsigned int reg;
1968c2ecf20Sopenharmony_ci	int shift;
1978c2ecf20Sopenharmony_ci	bool invert;
1988c2ecf20Sopenharmony_ci};
1998c2ecf20Sopenharmony_ci
2008c2ecf20Sopenharmony_ciLN1_PIN_GPIO(CDC_RESET,    "codec-reset",    RST,      CDC_RESET,    1);
2018c2ecf20Sopenharmony_ciLN1_PIN_GPIO(DSP_RESET,    "dsp-reset",      RST,      DSP_RESET,    1);
2028c2ecf20Sopenharmony_ciLN1_PIN_GPIO(CDC_CIF1MODE, "codec-cif1mode", I2C_CTRL, CDC_CIF_MODE, 0);
2038c2ecf20Sopenharmony_ciLN1_PIN_MUX(GF_GPIO2,      "gf-gpio2");
2048c2ecf20Sopenharmony_ciLN1_PIN_MUX(GF_GPIO3,      "gf-gpio3");
2058c2ecf20Sopenharmony_ciLN1_PIN_MUX(GF_GPIO7,      "gf-gpio7");
2068c2ecf20Sopenharmony_ciLN1_PIN_MUX(LED1,          "led1");
2078c2ecf20Sopenharmony_ciLN1_PIN_MUX(LED2,          "led2");
2088c2ecf20Sopenharmony_ciLN1_PIN_AIF(CDC_AIF1);
2098c2ecf20Sopenharmony_ciLN1_PIN_AIF(CDC_AIF2);
2108c2ecf20Sopenharmony_ciLN1_PIN_AIF(CDC_AIF3);
2118c2ecf20Sopenharmony_ciLN1_PIN_AIF(DSP_AIF1);
2128c2ecf20Sopenharmony_ciLN1_PIN_AIF(DSP_AIF2);
2138c2ecf20Sopenharmony_ciLN1_PIN_AIF(PSIA1);
2148c2ecf20Sopenharmony_ciLN1_PIN_AIF(PSIA2);
2158c2ecf20Sopenharmony_ciLN1_PIN_AIF(SPDIF_AIF);
2168c2ecf20Sopenharmony_ciLN1_PIN_AIF(GF_AIF1);
2178c2ecf20Sopenharmony_ciLN1_PIN_AIF(GF_AIF2);
2188c2ecf20Sopenharmony_ciLN1_PIN_AIF(GF_AIF3);
2198c2ecf20Sopenharmony_ciLN1_PIN_AIF(GF_AIF4);
2208c2ecf20Sopenharmony_ci
2218c2ecf20Sopenharmony_ciLN2_PIN_GPIO(CDC_RESET,    "codec-reset",    MINICARD_RESETS, CDC_RESET,     1);
2228c2ecf20Sopenharmony_ciLN2_PIN_GPIO(DSP_RESET,    "dsp-reset",      MINICARD_RESETS, DSP_RESET,     1);
2238c2ecf20Sopenharmony_ciLN2_PIN_GPIO(CDC_CIF1MODE, "codec-cif1mode", COMMS_CTRL4,     CDC_CIF1MODE,  0);
2248c2ecf20Sopenharmony_ciLN2_PIN_GPIO(CDC_LDOENA,   "codec-ldoena",   POWER_CTRL,      PWR_ENA,       0);
2258c2ecf20Sopenharmony_ciLN2_PIN_GPIO(SPDIF_HWMODE, "spdif-hwmode",   SPDIF_CTRL,      SPDIF_HWMODE,  0);
2268c2ecf20Sopenharmony_ciLN2_PIN_GPIO(SPDIF_RESET,  "spdif-reset",    SPDIF_CTRL,      SPDIF_RESET,   1);
2278c2ecf20Sopenharmony_ciLN2_PIN_MUX(FPGA_GPIO1,    "fpga-gpio1");
2288c2ecf20Sopenharmony_ciLN2_PIN_MUX(FPGA_GPIO2,    "fpga-gpio2");
2298c2ecf20Sopenharmony_ciLN2_PIN_MUX(FPGA_GPIO3,    "fpga-gpio3");
2308c2ecf20Sopenharmony_ciLN2_PIN_MUX(FPGA_GPIO4,    "fpga-gpio4");
2318c2ecf20Sopenharmony_ciLN2_PIN_MUX(FPGA_GPIO5,    "fpga-gpio5");
2328c2ecf20Sopenharmony_ciLN2_PIN_MUX(FPGA_GPIO6,    "fpga-gpio6");
2338c2ecf20Sopenharmony_ciLN2_PIN_MUX(CDC_GPIO1,     "codec-gpio1");
2348c2ecf20Sopenharmony_ciLN2_PIN_MUX(CDC_GPIO2,     "codec-gpio2");
2358c2ecf20Sopenharmony_ciLN2_PIN_MUX(CDC_GPIO3,     "codec-gpio3");
2368c2ecf20Sopenharmony_ciLN2_PIN_MUX(CDC_GPIO4,     "codec-gpio4");
2378c2ecf20Sopenharmony_ciLN2_PIN_MUX(CDC_GPIO5,     "codec-gpio5");
2388c2ecf20Sopenharmony_ciLN2_PIN_MUX(CDC_GPIO6,     "codec-gpio6");
2398c2ecf20Sopenharmony_ciLN2_PIN_MUX(CDC_GPIO7,     "codec-gpio7");
2408c2ecf20Sopenharmony_ciLN2_PIN_MUX(CDC_GPIO8,     "codec-gpio8");
2418c2ecf20Sopenharmony_ciLN2_PIN_MUX(DSP_GPIO1,     "dsp-gpio1");
2428c2ecf20Sopenharmony_ciLN2_PIN_MUX(DSP_GPIO2,     "dsp-gpio2");
2438c2ecf20Sopenharmony_ciLN2_PIN_MUX(DSP_GPIO3,     "dsp-gpio3");
2448c2ecf20Sopenharmony_ciLN2_PIN_MUX(DSP_GPIO4,     "dsp-gpio4");
2458c2ecf20Sopenharmony_ciLN2_PIN_MUX(DSP_GPIO5,     "dsp-gpio5");
2468c2ecf20Sopenharmony_ciLN2_PIN_MUX(DSP_GPIO6,     "dsp-gpio6");
2478c2ecf20Sopenharmony_ciLN2_PIN_MUX(GF_GPIO2,      "gf-gpio2");
2488c2ecf20Sopenharmony_ciLN2_PIN_MUX(GF_GPIO3,      "gf-gpio3");
2498c2ecf20Sopenharmony_ciLN2_PIN_MUX(GF_GPIO7,      "gf-gpio7");
2508c2ecf20Sopenharmony_ciLN2_PIN_MUX(DSP_UART1_RX,  "dsp-uart1-rx");
2518c2ecf20Sopenharmony_ciLN2_PIN_MUX(DSP_UART1_TX,  "dsp-uart1-tx");
2528c2ecf20Sopenharmony_ciLN2_PIN_MUX(DSP_UART2_RX,  "dsp-uart2-rx");
2538c2ecf20Sopenharmony_ciLN2_PIN_MUX(DSP_UART2_TX,  "dsp-uart2-tx");
2548c2ecf20Sopenharmony_ciLN2_PIN_MUX(GF_UART2_RX,   "gf-uart2-rx");
2558c2ecf20Sopenharmony_ciLN2_PIN_MUX(GF_UART2_TX,   "gf-uart2-tx");
2568c2ecf20Sopenharmony_ciLN2_PIN_MUX(USB_UART_RX,   "usb-uart-rx");
2578c2ecf20Sopenharmony_ciLN2_PIN_MUX(CDC_PDMCLK1,   "codec-pdmclk1");
2588c2ecf20Sopenharmony_ciLN2_PIN_MUX(CDC_PDMDAT1,   "codec-pdmdat1");
2598c2ecf20Sopenharmony_ciLN2_PIN_MUX(CDC_PDMCLK2,   "codec-pdmclk2");
2608c2ecf20Sopenharmony_ciLN2_PIN_MUX(CDC_PDMDAT2,   "codec-pdmdat2");
2618c2ecf20Sopenharmony_ciLN2_PIN_MUX(CDC_DMICCLK1,  "codec-dmicclk1");
2628c2ecf20Sopenharmony_ciLN2_PIN_MUX(CDC_DMICDAT1,  "codec-dmicdat1");
2638c2ecf20Sopenharmony_ciLN2_PIN_MUX(CDC_DMICCLK2,  "codec-dmicclk2");
2648c2ecf20Sopenharmony_ciLN2_PIN_MUX(CDC_DMICDAT2,  "codec-dmicdat2");
2658c2ecf20Sopenharmony_ciLN2_PIN_MUX(CDC_DMICCLK3,  "codec-dmicclk3");
2668c2ecf20Sopenharmony_ciLN2_PIN_MUX(CDC_DMICDAT3,  "codec-dmicdat3");
2678c2ecf20Sopenharmony_ciLN2_PIN_MUX(CDC_DMICCLK4,  "codec-dmicclk4");
2688c2ecf20Sopenharmony_ciLN2_PIN_MUX(CDC_DMICDAT4,  "codec-dmicdat4");
2698c2ecf20Sopenharmony_ciLN2_PIN_MUX(DSP_DMICCLK1,  "dsp-dmicclk1");
2708c2ecf20Sopenharmony_ciLN2_PIN_MUX(DSP_DMICDAT1,  "dsp-dmicdat1");
2718c2ecf20Sopenharmony_ciLN2_PIN_MUX(DSP_DMICCLK2,  "dsp-dmicclk2");
2728c2ecf20Sopenharmony_ciLN2_PIN_MUX(DSP_DMICDAT2,  "dsp-dmicdat2");
2738c2ecf20Sopenharmony_ciLN2_PIN_MUX(I2C2_SCL,      "i2c2-scl");
2748c2ecf20Sopenharmony_ciLN2_PIN_MUX(I2C2_SDA,      "i2c2-sda");
2758c2ecf20Sopenharmony_ciLN2_PIN_MUX(I2C3_SCL,      "i2c3-scl");
2768c2ecf20Sopenharmony_ciLN2_PIN_MUX(I2C3_SDA,      "i2c3-sda");
2778c2ecf20Sopenharmony_ciLN2_PIN_MUX(I2C4_SCL,      "i2c4-scl");
2788c2ecf20Sopenharmony_ciLN2_PIN_MUX(I2C4_SDA,      "i2c4-sda");
2798c2ecf20Sopenharmony_ciLN2_PIN_MUX(DSP_STANDBY,   "dsp-standby");
2808c2ecf20Sopenharmony_ciLN2_PIN_MUX(CDC_MCLK1,     "codec-mclk1");
2818c2ecf20Sopenharmony_ciLN2_PIN_MUX(CDC_MCLK2,     "codec-mclk2");
2828c2ecf20Sopenharmony_ciLN2_PIN_MUX(DSP_CLKIN,     "dsp-clkin");
2838c2ecf20Sopenharmony_ciLN2_PIN_MUX(PSIA1_MCLK,    "psia1-mclk");
2848c2ecf20Sopenharmony_ciLN2_PIN_MUX(PSIA2_MCLK,    "psia2-mclk");
2858c2ecf20Sopenharmony_ciLN2_PIN_MUX(GF_GPIO1,      "gf-gpio1");
2868c2ecf20Sopenharmony_ciLN2_PIN_MUX(GF_GPIO5,      "gf-gpio5");
2878c2ecf20Sopenharmony_ciLN2_PIN_MUX(DSP_GPIO20,    "dsp-gpio20");
2888c2ecf20Sopenharmony_ciLN2_PIN_GAI(CDC_AIF1);
2898c2ecf20Sopenharmony_ciLN2_PIN_GAI(CDC_AIF2);
2908c2ecf20Sopenharmony_ciLN2_PIN_GAI(CDC_AIF3);
2918c2ecf20Sopenharmony_ciLN2_PIN_GAI(DSP_AIF1);
2928c2ecf20Sopenharmony_ciLN2_PIN_GAI(DSP_AIF2);
2938c2ecf20Sopenharmony_ciLN2_PIN_GAI(PSIA1);
2948c2ecf20Sopenharmony_ciLN2_PIN_GAI(PSIA2);
2958c2ecf20Sopenharmony_ciLN2_PIN_GAI(GF_AIF1);
2968c2ecf20Sopenharmony_ciLN2_PIN_GAI(GF_AIF2);
2978c2ecf20Sopenharmony_ciLN2_PIN_GAI(GF_AIF3);
2988c2ecf20Sopenharmony_ciLN2_PIN_GAI(GF_AIF4);
2998c2ecf20Sopenharmony_ciLN2_PIN_AIF(SPDIF_AIF);
3008c2ecf20Sopenharmony_ciLN2_PIN_AIF(USB_AIF1);
3018c2ecf20Sopenharmony_ciLN2_PIN_AIF(USB_AIF2);
3028c2ecf20Sopenharmony_ciLN2_PIN_AIF(ADAT_AIF);
3038c2ecf20Sopenharmony_ciLN2_PIN_AIF(SOUNDCARD_AIF);
3048c2ecf20Sopenharmony_ci
3058c2ecf20Sopenharmony_cistatic const struct pinctrl_pin_desc lochnagar1_pins[] = {
3068c2ecf20Sopenharmony_ci	LN1_PIN(CDC_RESET),      LN1_PIN(DSP_RESET),    LN1_PIN(CDC_CIF1MODE),
3078c2ecf20Sopenharmony_ci	LN1_PIN(GF_GPIO2),       LN1_PIN(GF_GPIO3),     LN1_PIN(GF_GPIO7),
3088c2ecf20Sopenharmony_ci	LN1_PIN(LED1),           LN1_PIN(LED2),
3098c2ecf20Sopenharmony_ci	LN1_PINS(CDC_AIF1),      LN1_PINS(CDC_AIF2),    LN1_PINS(CDC_AIF3),
3108c2ecf20Sopenharmony_ci	LN1_PINS(DSP_AIF1),      LN1_PINS(DSP_AIF2),
3118c2ecf20Sopenharmony_ci	LN1_PINS(PSIA1),         LN1_PINS(PSIA2),
3128c2ecf20Sopenharmony_ci	LN1_PINS(SPDIF_AIF),
3138c2ecf20Sopenharmony_ci	LN1_PINS(GF_AIF1),       LN1_PINS(GF_AIF2),
3148c2ecf20Sopenharmony_ci	LN1_PINS(GF_AIF3),       LN1_PINS(GF_AIF4),
3158c2ecf20Sopenharmony_ci};
3168c2ecf20Sopenharmony_ci
3178c2ecf20Sopenharmony_cistatic const struct pinctrl_pin_desc lochnagar2_pins[] = {
3188c2ecf20Sopenharmony_ci	LN2_PIN(CDC_RESET),      LN2_PIN(DSP_RESET),    LN2_PIN(CDC_CIF1MODE),
3198c2ecf20Sopenharmony_ci	LN2_PIN(CDC_LDOENA),
3208c2ecf20Sopenharmony_ci	LN2_PIN(SPDIF_HWMODE),   LN2_PIN(SPDIF_RESET),
3218c2ecf20Sopenharmony_ci	LN2_PIN(FPGA_GPIO1),     LN2_PIN(FPGA_GPIO2),   LN2_PIN(FPGA_GPIO3),
3228c2ecf20Sopenharmony_ci	LN2_PIN(FPGA_GPIO4),     LN2_PIN(FPGA_GPIO5),   LN2_PIN(FPGA_GPIO6),
3238c2ecf20Sopenharmony_ci	LN2_PIN(CDC_GPIO1),      LN2_PIN(CDC_GPIO2),    LN2_PIN(CDC_GPIO3),
3248c2ecf20Sopenharmony_ci	LN2_PIN(CDC_GPIO4),      LN2_PIN(CDC_GPIO5),    LN2_PIN(CDC_GPIO6),
3258c2ecf20Sopenharmony_ci	LN2_PIN(CDC_GPIO7),      LN2_PIN(CDC_GPIO8),
3268c2ecf20Sopenharmony_ci	LN2_PIN(DSP_GPIO1),      LN2_PIN(DSP_GPIO2),    LN2_PIN(DSP_GPIO3),
3278c2ecf20Sopenharmony_ci	LN2_PIN(DSP_GPIO4),      LN2_PIN(DSP_GPIO5),    LN2_PIN(DSP_GPIO6),
3288c2ecf20Sopenharmony_ci	LN2_PIN(DSP_GPIO20),
3298c2ecf20Sopenharmony_ci	LN2_PIN(GF_GPIO1),       LN2_PIN(GF_GPIO2),     LN2_PIN(GF_GPIO3),
3308c2ecf20Sopenharmony_ci	LN2_PIN(GF_GPIO5),       LN2_PIN(GF_GPIO7),
3318c2ecf20Sopenharmony_ci	LN2_PINS(CDC_AIF1),      LN2_PINS(CDC_AIF2),    LN2_PINS(CDC_AIF3),
3328c2ecf20Sopenharmony_ci	LN2_PINS(DSP_AIF1),      LN2_PINS(DSP_AIF2),
3338c2ecf20Sopenharmony_ci	LN2_PINS(PSIA1),         LN2_PINS(PSIA2),
3348c2ecf20Sopenharmony_ci	LN2_PINS(GF_AIF1),       LN2_PINS(GF_AIF2),
3358c2ecf20Sopenharmony_ci	LN2_PINS(GF_AIF3),       LN2_PINS(GF_AIF4),
3368c2ecf20Sopenharmony_ci	LN2_PIN(DSP_UART1_RX),   LN2_PIN(DSP_UART1_TX),
3378c2ecf20Sopenharmony_ci	LN2_PIN(DSP_UART2_RX),   LN2_PIN(DSP_UART2_TX),
3388c2ecf20Sopenharmony_ci	LN2_PIN(GF_UART2_RX),    LN2_PIN(GF_UART2_TX),
3398c2ecf20Sopenharmony_ci	LN2_PIN(USB_UART_RX),
3408c2ecf20Sopenharmony_ci	LN2_PIN(CDC_PDMCLK1),    LN2_PIN(CDC_PDMDAT1),
3418c2ecf20Sopenharmony_ci	LN2_PIN(CDC_PDMCLK2),    LN2_PIN(CDC_PDMDAT2),
3428c2ecf20Sopenharmony_ci	LN2_PIN(CDC_DMICCLK1),   LN2_PIN(CDC_DMICDAT1),
3438c2ecf20Sopenharmony_ci	LN2_PIN(CDC_DMICCLK2),   LN2_PIN(CDC_DMICDAT2),
3448c2ecf20Sopenharmony_ci	LN2_PIN(CDC_DMICCLK3),   LN2_PIN(CDC_DMICDAT3),
3458c2ecf20Sopenharmony_ci	LN2_PIN(CDC_DMICCLK4),   LN2_PIN(CDC_DMICDAT4),
3468c2ecf20Sopenharmony_ci	LN2_PIN(DSP_DMICCLK1),   LN2_PIN(DSP_DMICDAT1),
3478c2ecf20Sopenharmony_ci	LN2_PIN(DSP_DMICCLK2),   LN2_PIN(DSP_DMICDAT2),
3488c2ecf20Sopenharmony_ci	LN2_PIN(I2C2_SCL),       LN2_PIN(I2C2_SDA),
3498c2ecf20Sopenharmony_ci	LN2_PIN(I2C3_SCL),       LN2_PIN(I2C3_SDA),
3508c2ecf20Sopenharmony_ci	LN2_PIN(I2C4_SCL),       LN2_PIN(I2C4_SDA),
3518c2ecf20Sopenharmony_ci	LN2_PIN(DSP_STANDBY),
3528c2ecf20Sopenharmony_ci	LN2_PIN(CDC_MCLK1),      LN2_PIN(CDC_MCLK2),
3538c2ecf20Sopenharmony_ci	LN2_PIN(DSP_CLKIN),
3548c2ecf20Sopenharmony_ci	LN2_PIN(PSIA1_MCLK),     LN2_PIN(PSIA2_MCLK),
3558c2ecf20Sopenharmony_ci	LN2_PINS(SPDIF_AIF),
3568c2ecf20Sopenharmony_ci	LN2_PINS(USB_AIF1),      LN2_PINS(USB_AIF2),
3578c2ecf20Sopenharmony_ci	LN2_PINS(ADAT_AIF),
3588c2ecf20Sopenharmony_ci	LN2_PINS(SOUNDCARD_AIF),
3598c2ecf20Sopenharmony_ci};
3608c2ecf20Sopenharmony_ci
3618c2ecf20Sopenharmony_ci#define LN_AIF_PINS(REV, ID) \
3628c2ecf20Sopenharmony_ci	LOCHNAGAR##REV##_PIN_##ID##_BCLK, \
3638c2ecf20Sopenharmony_ci	LOCHNAGAR##REV##_PIN_##ID##_LRCLK, \
3648c2ecf20Sopenharmony_ci	LOCHNAGAR##REV##_PIN_##ID##_TXDAT, \
3658c2ecf20Sopenharmony_ci	LOCHNAGAR##REV##_PIN_##ID##_RXDAT,
3668c2ecf20Sopenharmony_ci
3678c2ecf20Sopenharmony_ci#define LN1_AIF(ID, CTRL) \
3688c2ecf20Sopenharmony_cistatic const struct lochnagar_aif lochnagar1_##ID##_aif = { \
3698c2ecf20Sopenharmony_ci	.name = LN_##ID##_STR, \
3708c2ecf20Sopenharmony_ci	.pins = { LN_AIF_PINS(1, ID) }, \
3718c2ecf20Sopenharmony_ci	.src_reg = LOCHNAGAR1_##ID##_SEL, \
3728c2ecf20Sopenharmony_ci	.src_mask = LOCHNAGAR1_SRC_MASK, \
3738c2ecf20Sopenharmony_ci	.ctrl_reg = LOCHNAGAR1_##CTRL, \
3748c2ecf20Sopenharmony_ci	.ena_mask = LOCHNAGAR1_##ID##_ENA_MASK, \
3758c2ecf20Sopenharmony_ci	.master_mask = LOCHNAGAR1_##ID##_LRCLK_DIR_MASK | \
3768c2ecf20Sopenharmony_ci		       LOCHNAGAR1_##ID##_BCLK_DIR_MASK, \
3778c2ecf20Sopenharmony_ci}
3788c2ecf20Sopenharmony_ci
3798c2ecf20Sopenharmony_ci#define LN2_AIF(ID) \
3808c2ecf20Sopenharmony_cistatic const struct lochnagar_aif lochnagar2_##ID##_aif = { \
3818c2ecf20Sopenharmony_ci	.name = LN_##ID##_STR, \
3828c2ecf20Sopenharmony_ci	.pins = { LN_AIF_PINS(2, ID) }, \
3838c2ecf20Sopenharmony_ci	.src_reg = LOCHNAGAR2_##ID##_CTRL,  \
3848c2ecf20Sopenharmony_ci	.src_mask = LOCHNAGAR2_AIF_SRC_MASK, \
3858c2ecf20Sopenharmony_ci	.ctrl_reg = LOCHNAGAR2_##ID##_CTRL, \
3868c2ecf20Sopenharmony_ci	.ena_mask = LOCHNAGAR2_AIF_ENA_MASK, \
3878c2ecf20Sopenharmony_ci	.master_mask = LOCHNAGAR2_AIF_LRCLK_DIR_MASK | \
3888c2ecf20Sopenharmony_ci		       LOCHNAGAR2_AIF_BCLK_DIR_MASK, \
3898c2ecf20Sopenharmony_ci}
3908c2ecf20Sopenharmony_ci
3918c2ecf20Sopenharmony_cistruct lochnagar_aif {
3928c2ecf20Sopenharmony_ci	const char name[16];
3938c2ecf20Sopenharmony_ci
3948c2ecf20Sopenharmony_ci	unsigned int pins[4];
3958c2ecf20Sopenharmony_ci
3968c2ecf20Sopenharmony_ci	u16 src_reg;
3978c2ecf20Sopenharmony_ci	u16 src_mask;
3988c2ecf20Sopenharmony_ci
3998c2ecf20Sopenharmony_ci	u16 ctrl_reg;
4008c2ecf20Sopenharmony_ci	u16 ena_mask;
4018c2ecf20Sopenharmony_ci	u16 master_mask;
4028c2ecf20Sopenharmony_ci};
4038c2ecf20Sopenharmony_ci
4048c2ecf20Sopenharmony_ciLN1_AIF(CDC_AIF1,      CDC_AIF_CTRL1);
4058c2ecf20Sopenharmony_ciLN1_AIF(CDC_AIF2,      CDC_AIF_CTRL1);
4068c2ecf20Sopenharmony_ciLN1_AIF(CDC_AIF3,      CDC_AIF_CTRL2);
4078c2ecf20Sopenharmony_ciLN1_AIF(DSP_AIF1,      DSP_AIF);
4088c2ecf20Sopenharmony_ciLN1_AIF(DSP_AIF2,      DSP_AIF);
4098c2ecf20Sopenharmony_ciLN1_AIF(PSIA1,         PSIA_AIF);
4108c2ecf20Sopenharmony_ciLN1_AIF(PSIA2,         PSIA_AIF);
4118c2ecf20Sopenharmony_ciLN1_AIF(GF_AIF1,       GF_AIF1);
4128c2ecf20Sopenharmony_ciLN1_AIF(GF_AIF2,       GF_AIF2);
4138c2ecf20Sopenharmony_ciLN1_AIF(GF_AIF3,       GF_AIF1);
4148c2ecf20Sopenharmony_ciLN1_AIF(GF_AIF4,       GF_AIF2);
4158c2ecf20Sopenharmony_ciLN1_AIF(SPDIF_AIF,     EXT_AIF_CTRL);
4168c2ecf20Sopenharmony_ci
4178c2ecf20Sopenharmony_ciLN2_AIF(CDC_AIF1);
4188c2ecf20Sopenharmony_ciLN2_AIF(CDC_AIF2);
4198c2ecf20Sopenharmony_ciLN2_AIF(CDC_AIF3);
4208c2ecf20Sopenharmony_ciLN2_AIF(DSP_AIF1);
4218c2ecf20Sopenharmony_ciLN2_AIF(DSP_AIF2);
4228c2ecf20Sopenharmony_ciLN2_AIF(PSIA1);
4238c2ecf20Sopenharmony_ciLN2_AIF(PSIA2);
4248c2ecf20Sopenharmony_ciLN2_AIF(GF_AIF1);
4258c2ecf20Sopenharmony_ciLN2_AIF(GF_AIF2);
4268c2ecf20Sopenharmony_ciLN2_AIF(GF_AIF3);
4278c2ecf20Sopenharmony_ciLN2_AIF(GF_AIF4);
4288c2ecf20Sopenharmony_ciLN2_AIF(SPDIF_AIF);
4298c2ecf20Sopenharmony_ciLN2_AIF(USB_AIF1);
4308c2ecf20Sopenharmony_ciLN2_AIF(USB_AIF2);
4318c2ecf20Sopenharmony_ciLN2_AIF(ADAT_AIF);
4328c2ecf20Sopenharmony_ciLN2_AIF(SOUNDCARD_AIF);
4338c2ecf20Sopenharmony_ci
4348c2ecf20Sopenharmony_ci#define LN2_OP_AIF	0x00
4358c2ecf20Sopenharmony_ci#define LN2_OP_GPIO	0xFE
4368c2ecf20Sopenharmony_ci
4378c2ecf20Sopenharmony_ci#define LN_FUNC(NAME, TYPE, OP) \
4388c2ecf20Sopenharmony_ci	{ .name = NAME, .type = LN_FTYPE_##TYPE, .op = OP }
4398c2ecf20Sopenharmony_ci
4408c2ecf20Sopenharmony_ci#define LN_FUNC_PIN(REV, ID, OP) \
4418c2ecf20Sopenharmony_ci	LN_FUNC(lochnagar##REV##_##ID##_pin.name, PIN, OP)
4428c2ecf20Sopenharmony_ci
4438c2ecf20Sopenharmony_ci#define LN1_FUNC_PIN(ID, OP) LN_FUNC_PIN(1, ID, OP)
4448c2ecf20Sopenharmony_ci#define LN2_FUNC_PIN(ID, OP) LN_FUNC_PIN(2, ID, OP)
4458c2ecf20Sopenharmony_ci
4468c2ecf20Sopenharmony_ci#define LN_FUNC_AIF(REV, ID, OP) \
4478c2ecf20Sopenharmony_ci	LN_FUNC(lochnagar##REV##_##ID##_aif.name, AIF, OP)
4488c2ecf20Sopenharmony_ci
4498c2ecf20Sopenharmony_ci#define LN1_FUNC_AIF(ID, OP) LN_FUNC_AIF(1, ID, OP)
4508c2ecf20Sopenharmony_ci#define LN2_FUNC_AIF(ID, OP) LN_FUNC_AIF(2, ID, OP)
4518c2ecf20Sopenharmony_ci
4528c2ecf20Sopenharmony_ci#define LN2_FUNC_GAI(ID, OP, BOP, LROP, RXOP, TXOP) \
4538c2ecf20Sopenharmony_ci	LN2_FUNC_AIF(ID, OP), \
4548c2ecf20Sopenharmony_ci	LN_FUNC(lochnagar2_##ID##_BCLK_pin.name, PIN, BOP), \
4558c2ecf20Sopenharmony_ci	LN_FUNC(lochnagar2_##ID##_LRCLK_pin.name, PIN, LROP), \
4568c2ecf20Sopenharmony_ci	LN_FUNC(lochnagar2_##ID##_RXDAT_pin.name, PIN, RXOP), \
4578c2ecf20Sopenharmony_ci	LN_FUNC(lochnagar2_##ID##_TXDAT_pin.name, PIN, TXOP)
4588c2ecf20Sopenharmony_ci
4598c2ecf20Sopenharmony_cienum lochnagar_func_type {
4608c2ecf20Sopenharmony_ci	LN_FTYPE_PIN,
4618c2ecf20Sopenharmony_ci	LN_FTYPE_AIF,
4628c2ecf20Sopenharmony_ci	LN_FTYPE_COUNT,
4638c2ecf20Sopenharmony_ci};
4648c2ecf20Sopenharmony_ci
4658c2ecf20Sopenharmony_cistruct lochnagar_func {
4668c2ecf20Sopenharmony_ci	const char * const name;
4678c2ecf20Sopenharmony_ci
4688c2ecf20Sopenharmony_ci	enum lochnagar_func_type type;
4698c2ecf20Sopenharmony_ci
4708c2ecf20Sopenharmony_ci	u8 op;
4718c2ecf20Sopenharmony_ci};
4728c2ecf20Sopenharmony_ci
4738c2ecf20Sopenharmony_cistatic const struct lochnagar_func lochnagar1_funcs[] = {
4748c2ecf20Sopenharmony_ci	LN_FUNC("dsp-gpio1",       PIN, 0x01),
4758c2ecf20Sopenharmony_ci	LN_FUNC("dsp-gpio2",       PIN, 0x02),
4768c2ecf20Sopenharmony_ci	LN_FUNC("dsp-gpio3",       PIN, 0x03),
4778c2ecf20Sopenharmony_ci	LN_FUNC("codec-gpio1",     PIN, 0x04),
4788c2ecf20Sopenharmony_ci	LN_FUNC("codec-gpio2",     PIN, 0x05),
4798c2ecf20Sopenharmony_ci	LN_FUNC("codec-gpio3",     PIN, 0x06),
4808c2ecf20Sopenharmony_ci	LN_FUNC("codec-gpio4",     PIN, 0x07),
4818c2ecf20Sopenharmony_ci	LN_FUNC("codec-gpio5",     PIN, 0x08),
4828c2ecf20Sopenharmony_ci	LN_FUNC("codec-gpio6",     PIN, 0x09),
4838c2ecf20Sopenharmony_ci	LN_FUNC("codec-gpio7",     PIN, 0x0A),
4848c2ecf20Sopenharmony_ci	LN_FUNC("codec-gpio8",     PIN, 0x0B),
4858c2ecf20Sopenharmony_ci	LN1_FUNC_PIN(GF_GPIO2,          0x0C),
4868c2ecf20Sopenharmony_ci	LN1_FUNC_PIN(GF_GPIO3,          0x0D),
4878c2ecf20Sopenharmony_ci	LN1_FUNC_PIN(GF_GPIO7,          0x0E),
4888c2ecf20Sopenharmony_ci
4898c2ecf20Sopenharmony_ci	LN1_FUNC_AIF(SPDIF_AIF,         0x01),
4908c2ecf20Sopenharmony_ci	LN1_FUNC_AIF(PSIA1,             0x02),
4918c2ecf20Sopenharmony_ci	LN1_FUNC_AIF(PSIA2,             0x03),
4928c2ecf20Sopenharmony_ci	LN1_FUNC_AIF(CDC_AIF1,          0x04),
4938c2ecf20Sopenharmony_ci	LN1_FUNC_AIF(CDC_AIF2,          0x05),
4948c2ecf20Sopenharmony_ci	LN1_FUNC_AIF(CDC_AIF3,          0x06),
4958c2ecf20Sopenharmony_ci	LN1_FUNC_AIF(DSP_AIF1,          0x07),
4968c2ecf20Sopenharmony_ci	LN1_FUNC_AIF(DSP_AIF2,          0x08),
4978c2ecf20Sopenharmony_ci	LN1_FUNC_AIF(GF_AIF3,           0x09),
4988c2ecf20Sopenharmony_ci	LN1_FUNC_AIF(GF_AIF4,           0x0A),
4998c2ecf20Sopenharmony_ci	LN1_FUNC_AIF(GF_AIF1,           0x0B),
5008c2ecf20Sopenharmony_ci	LN1_FUNC_AIF(GF_AIF2,           0x0C),
5018c2ecf20Sopenharmony_ci};
5028c2ecf20Sopenharmony_ci
5038c2ecf20Sopenharmony_cistatic const struct lochnagar_func lochnagar2_funcs[] = {
5048c2ecf20Sopenharmony_ci	LN_FUNC("aif",             PIN, LN2_OP_AIF),
5058c2ecf20Sopenharmony_ci	LN2_FUNC_PIN(FPGA_GPIO1,        0x01),
5068c2ecf20Sopenharmony_ci	LN2_FUNC_PIN(FPGA_GPIO2,        0x02),
5078c2ecf20Sopenharmony_ci	LN2_FUNC_PIN(FPGA_GPIO3,        0x03),
5088c2ecf20Sopenharmony_ci	LN2_FUNC_PIN(FPGA_GPIO4,        0x04),
5098c2ecf20Sopenharmony_ci	LN2_FUNC_PIN(FPGA_GPIO5,        0x05),
5108c2ecf20Sopenharmony_ci	LN2_FUNC_PIN(FPGA_GPIO6,        0x06),
5118c2ecf20Sopenharmony_ci	LN2_FUNC_PIN(CDC_GPIO1,         0x07),
5128c2ecf20Sopenharmony_ci	LN2_FUNC_PIN(CDC_GPIO2,         0x08),
5138c2ecf20Sopenharmony_ci	LN2_FUNC_PIN(CDC_GPIO3,         0x09),
5148c2ecf20Sopenharmony_ci	LN2_FUNC_PIN(CDC_GPIO4,         0x0A),
5158c2ecf20Sopenharmony_ci	LN2_FUNC_PIN(CDC_GPIO5,         0x0B),
5168c2ecf20Sopenharmony_ci	LN2_FUNC_PIN(CDC_GPIO6,         0x0C),
5178c2ecf20Sopenharmony_ci	LN2_FUNC_PIN(CDC_GPIO7,         0x0D),
5188c2ecf20Sopenharmony_ci	LN2_FUNC_PIN(CDC_GPIO8,         0x0E),
5198c2ecf20Sopenharmony_ci	LN2_FUNC_PIN(DSP_GPIO1,         0x0F),
5208c2ecf20Sopenharmony_ci	LN2_FUNC_PIN(DSP_GPIO2,         0x10),
5218c2ecf20Sopenharmony_ci	LN2_FUNC_PIN(DSP_GPIO3,         0x11),
5228c2ecf20Sopenharmony_ci	LN2_FUNC_PIN(DSP_GPIO4,         0x12),
5238c2ecf20Sopenharmony_ci	LN2_FUNC_PIN(DSP_GPIO5,         0x13),
5248c2ecf20Sopenharmony_ci	LN2_FUNC_PIN(DSP_GPIO6,         0x14),
5258c2ecf20Sopenharmony_ci	LN2_FUNC_PIN(GF_GPIO2,          0x15),
5268c2ecf20Sopenharmony_ci	LN2_FUNC_PIN(GF_GPIO3,          0x16),
5278c2ecf20Sopenharmony_ci	LN2_FUNC_PIN(GF_GPIO7,          0x17),
5288c2ecf20Sopenharmony_ci	LN2_FUNC_PIN(GF_GPIO1,          0x18),
5298c2ecf20Sopenharmony_ci	LN2_FUNC_PIN(GF_GPIO5,          0x19),
5308c2ecf20Sopenharmony_ci	LN2_FUNC_PIN(DSP_GPIO20,        0x1A),
5318c2ecf20Sopenharmony_ci	LN_FUNC("codec-clkout",    PIN, 0x20),
5328c2ecf20Sopenharmony_ci	LN_FUNC("dsp-clkout",      PIN, 0x21),
5338c2ecf20Sopenharmony_ci	LN_FUNC("pmic-32k",        PIN, 0x22),
5348c2ecf20Sopenharmony_ci	LN_FUNC("spdif-clkout",    PIN, 0x23),
5358c2ecf20Sopenharmony_ci	LN_FUNC("clk-12m288",      PIN, 0x24),
5368c2ecf20Sopenharmony_ci	LN_FUNC("clk-11m2986",     PIN, 0x25),
5378c2ecf20Sopenharmony_ci	LN_FUNC("clk-24m576",      PIN, 0x26),
5388c2ecf20Sopenharmony_ci	LN_FUNC("clk-22m5792",     PIN, 0x27),
5398c2ecf20Sopenharmony_ci	LN_FUNC("xmos-mclk",       PIN, 0x29),
5408c2ecf20Sopenharmony_ci	LN_FUNC("gf-clkout1",      PIN, 0x2A),
5418c2ecf20Sopenharmony_ci	LN_FUNC("gf-mclk1",        PIN, 0x2B),
5428c2ecf20Sopenharmony_ci	LN_FUNC("gf-mclk3",        PIN, 0x2C),
5438c2ecf20Sopenharmony_ci	LN_FUNC("gf-mclk2",        PIN, 0x2D),
5448c2ecf20Sopenharmony_ci	LN_FUNC("gf-clkout2",      PIN, 0x2E),
5458c2ecf20Sopenharmony_ci	LN2_FUNC_PIN(CDC_MCLK1,         0x2F),
5468c2ecf20Sopenharmony_ci	LN2_FUNC_PIN(CDC_MCLK2,         0x30),
5478c2ecf20Sopenharmony_ci	LN2_FUNC_PIN(DSP_CLKIN,         0x31),
5488c2ecf20Sopenharmony_ci	LN2_FUNC_PIN(PSIA1_MCLK,        0x32),
5498c2ecf20Sopenharmony_ci	LN2_FUNC_PIN(PSIA2_MCLK,        0x33),
5508c2ecf20Sopenharmony_ci	LN_FUNC("spdif-mclk",      PIN, 0x34),
5518c2ecf20Sopenharmony_ci	LN_FUNC("codec-irq",       PIN, 0x42),
5528c2ecf20Sopenharmony_ci	LN2_FUNC_PIN(CDC_RESET,         0x43),
5538c2ecf20Sopenharmony_ci	LN2_FUNC_PIN(DSP_RESET,         0x44),
5548c2ecf20Sopenharmony_ci	LN_FUNC("dsp-irq",         PIN, 0x45),
5558c2ecf20Sopenharmony_ci	LN2_FUNC_PIN(DSP_STANDBY,       0x46),
5568c2ecf20Sopenharmony_ci	LN2_FUNC_PIN(CDC_PDMCLK1,       0x90),
5578c2ecf20Sopenharmony_ci	LN2_FUNC_PIN(CDC_PDMDAT1,       0x91),
5588c2ecf20Sopenharmony_ci	LN2_FUNC_PIN(CDC_PDMCLK2,       0x92),
5598c2ecf20Sopenharmony_ci	LN2_FUNC_PIN(CDC_PDMDAT2,       0x93),
5608c2ecf20Sopenharmony_ci	LN2_FUNC_PIN(CDC_DMICCLK1,      0xA0),
5618c2ecf20Sopenharmony_ci	LN2_FUNC_PIN(CDC_DMICDAT1,      0xA1),
5628c2ecf20Sopenharmony_ci	LN2_FUNC_PIN(CDC_DMICCLK2,      0xA2),
5638c2ecf20Sopenharmony_ci	LN2_FUNC_PIN(CDC_DMICDAT2,      0xA3),
5648c2ecf20Sopenharmony_ci	LN2_FUNC_PIN(CDC_DMICCLK3,      0xA4),
5658c2ecf20Sopenharmony_ci	LN2_FUNC_PIN(CDC_DMICDAT3,      0xA5),
5668c2ecf20Sopenharmony_ci	LN2_FUNC_PIN(CDC_DMICCLK4,      0xA6),
5678c2ecf20Sopenharmony_ci	LN2_FUNC_PIN(CDC_DMICDAT4,      0xA7),
5688c2ecf20Sopenharmony_ci	LN2_FUNC_PIN(DSP_DMICCLK1,      0xA8),
5698c2ecf20Sopenharmony_ci	LN2_FUNC_PIN(DSP_DMICDAT1,      0xA9),
5708c2ecf20Sopenharmony_ci	LN2_FUNC_PIN(DSP_DMICCLK2,      0xAA),
5718c2ecf20Sopenharmony_ci	LN2_FUNC_PIN(DSP_DMICDAT2,      0xAB),
5728c2ecf20Sopenharmony_ci	LN2_FUNC_PIN(DSP_UART1_RX,      0xC0),
5738c2ecf20Sopenharmony_ci	LN2_FUNC_PIN(DSP_UART1_TX,      0xC1),
5748c2ecf20Sopenharmony_ci	LN2_FUNC_PIN(DSP_UART2_RX,      0xC2),
5758c2ecf20Sopenharmony_ci	LN2_FUNC_PIN(DSP_UART2_TX,      0xC3),
5768c2ecf20Sopenharmony_ci	LN2_FUNC_PIN(GF_UART2_RX,       0xC4),
5778c2ecf20Sopenharmony_ci	LN2_FUNC_PIN(GF_UART2_TX,       0xC5),
5788c2ecf20Sopenharmony_ci	LN2_FUNC_PIN(USB_UART_RX,       0xC6),
5798c2ecf20Sopenharmony_ci	LN_FUNC("usb-uart-tx",     PIN, 0xC7),
5808c2ecf20Sopenharmony_ci	LN2_FUNC_PIN(I2C2_SCL,          0xE0),
5818c2ecf20Sopenharmony_ci	LN2_FUNC_PIN(I2C2_SDA,          0xE1),
5828c2ecf20Sopenharmony_ci	LN2_FUNC_PIN(I2C3_SCL,          0xE2),
5838c2ecf20Sopenharmony_ci	LN2_FUNC_PIN(I2C3_SDA,          0xE3),
5848c2ecf20Sopenharmony_ci	LN2_FUNC_PIN(I2C4_SCL,          0xE4),
5858c2ecf20Sopenharmony_ci	LN2_FUNC_PIN(I2C4_SDA,          0xE5),
5868c2ecf20Sopenharmony_ci
5878c2ecf20Sopenharmony_ci	LN2_FUNC_AIF(SPDIF_AIF,         0x01),
5888c2ecf20Sopenharmony_ci	LN2_FUNC_GAI(PSIA1,             0x02, 0x50, 0x51, 0x52, 0x53),
5898c2ecf20Sopenharmony_ci	LN2_FUNC_GAI(PSIA2,             0x03, 0x54, 0x55, 0x56, 0x57),
5908c2ecf20Sopenharmony_ci	LN2_FUNC_GAI(CDC_AIF1,          0x04, 0x59, 0x5B, 0x5A, 0x58),
5918c2ecf20Sopenharmony_ci	LN2_FUNC_GAI(CDC_AIF2,          0x05, 0x5D, 0x5F, 0x5E, 0x5C),
5928c2ecf20Sopenharmony_ci	LN2_FUNC_GAI(CDC_AIF3,          0x06, 0x61, 0x62, 0x63, 0x60),
5938c2ecf20Sopenharmony_ci	LN2_FUNC_GAI(DSP_AIF1,          0x07, 0x65, 0x67, 0x66, 0x64),
5948c2ecf20Sopenharmony_ci	LN2_FUNC_GAI(DSP_AIF2,          0x08, 0x69, 0x6B, 0x6A, 0x68),
5958c2ecf20Sopenharmony_ci	LN2_FUNC_GAI(GF_AIF3,           0x09, 0x6D, 0x6F, 0x6C, 0x6E),
5968c2ecf20Sopenharmony_ci	LN2_FUNC_GAI(GF_AIF4,           0x0A, 0x71, 0x73, 0x70, 0x72),
5978c2ecf20Sopenharmony_ci	LN2_FUNC_GAI(GF_AIF1,           0x0B, 0x75, 0x77, 0x74, 0x76),
5988c2ecf20Sopenharmony_ci	LN2_FUNC_GAI(GF_AIF2,           0x0C, 0x79, 0x7B, 0x78, 0x7A),
5998c2ecf20Sopenharmony_ci	LN2_FUNC_AIF(USB_AIF1,          0x0D),
6008c2ecf20Sopenharmony_ci	LN2_FUNC_AIF(USB_AIF2,          0x0E),
6018c2ecf20Sopenharmony_ci	LN2_FUNC_AIF(ADAT_AIF,          0x0F),
6028c2ecf20Sopenharmony_ci	LN2_FUNC_AIF(SOUNDCARD_AIF,     0x10),
6038c2ecf20Sopenharmony_ci};
6048c2ecf20Sopenharmony_ci
6058c2ecf20Sopenharmony_ci#define LN_GROUP_PIN(REV, ID) { \
6068c2ecf20Sopenharmony_ci	.name = lochnagar##REV##_##ID##_pin.name, \
6078c2ecf20Sopenharmony_ci	.type = LN_FTYPE_PIN, \
6088c2ecf20Sopenharmony_ci	.pins = &lochnagar##REV##_pins[LOCHNAGAR##REV##_PIN_##ID].number, \
6098c2ecf20Sopenharmony_ci	.npins = 1, \
6108c2ecf20Sopenharmony_ci	.priv = &lochnagar##REV##_pins[LOCHNAGAR##REV##_PIN_##ID], \
6118c2ecf20Sopenharmony_ci}
6128c2ecf20Sopenharmony_ci
6138c2ecf20Sopenharmony_ci#define LN_GROUP_AIF(REV, ID) { \
6148c2ecf20Sopenharmony_ci	.name = lochnagar##REV##_##ID##_aif.name, \
6158c2ecf20Sopenharmony_ci	.type = LN_FTYPE_AIF, \
6168c2ecf20Sopenharmony_ci	.pins = lochnagar##REV##_##ID##_aif.pins, \
6178c2ecf20Sopenharmony_ci	.npins = ARRAY_SIZE(lochnagar##REV##_##ID##_aif.pins), \
6188c2ecf20Sopenharmony_ci	.priv = &lochnagar##REV##_##ID##_aif, \
6198c2ecf20Sopenharmony_ci}
6208c2ecf20Sopenharmony_ci
6218c2ecf20Sopenharmony_ci#define LN1_GROUP_PIN(ID) LN_GROUP_PIN(1, ID)
6228c2ecf20Sopenharmony_ci#define LN2_GROUP_PIN(ID) LN_GROUP_PIN(2, ID)
6238c2ecf20Sopenharmony_ci
6248c2ecf20Sopenharmony_ci#define LN1_GROUP_AIF(ID) LN_GROUP_AIF(1, ID)
6258c2ecf20Sopenharmony_ci#define LN2_GROUP_AIF(ID) LN_GROUP_AIF(2, ID)
6268c2ecf20Sopenharmony_ci
6278c2ecf20Sopenharmony_ci#define LN2_GROUP_GAI(ID) \
6288c2ecf20Sopenharmony_ci	LN2_GROUP_AIF(ID), \
6298c2ecf20Sopenharmony_ci	LN2_GROUP_PIN(ID##_BCLK), LN2_GROUP_PIN(ID##_LRCLK), \
6308c2ecf20Sopenharmony_ci	LN2_GROUP_PIN(ID##_RXDAT), LN2_GROUP_PIN(ID##_TXDAT)
6318c2ecf20Sopenharmony_ci
6328c2ecf20Sopenharmony_cistruct lochnagar_group {
6338c2ecf20Sopenharmony_ci	const char * const name;
6348c2ecf20Sopenharmony_ci
6358c2ecf20Sopenharmony_ci	enum lochnagar_func_type type;
6368c2ecf20Sopenharmony_ci
6378c2ecf20Sopenharmony_ci	const unsigned int *pins;
6388c2ecf20Sopenharmony_ci	unsigned int npins;
6398c2ecf20Sopenharmony_ci
6408c2ecf20Sopenharmony_ci	const void *priv;
6418c2ecf20Sopenharmony_ci};
6428c2ecf20Sopenharmony_ci
6438c2ecf20Sopenharmony_cistatic const struct lochnagar_group lochnagar1_groups[] = {
6448c2ecf20Sopenharmony_ci	LN1_GROUP_PIN(GF_GPIO2),       LN1_GROUP_PIN(GF_GPIO3),
6458c2ecf20Sopenharmony_ci	LN1_GROUP_PIN(GF_GPIO7),
6468c2ecf20Sopenharmony_ci	LN1_GROUP_PIN(LED1),           LN1_GROUP_PIN(LED2),
6478c2ecf20Sopenharmony_ci	LN1_GROUP_AIF(CDC_AIF1),       LN1_GROUP_AIF(CDC_AIF2),
6488c2ecf20Sopenharmony_ci	LN1_GROUP_AIF(CDC_AIF3),
6498c2ecf20Sopenharmony_ci	LN1_GROUP_AIF(DSP_AIF1),       LN1_GROUP_AIF(DSP_AIF2),
6508c2ecf20Sopenharmony_ci	LN1_GROUP_AIF(PSIA1),          LN1_GROUP_AIF(PSIA2),
6518c2ecf20Sopenharmony_ci	LN1_GROUP_AIF(GF_AIF1),        LN1_GROUP_AIF(GF_AIF2),
6528c2ecf20Sopenharmony_ci	LN1_GROUP_AIF(GF_AIF3),        LN1_GROUP_AIF(GF_AIF4),
6538c2ecf20Sopenharmony_ci	LN1_GROUP_AIF(SPDIF_AIF),
6548c2ecf20Sopenharmony_ci};
6558c2ecf20Sopenharmony_ci
6568c2ecf20Sopenharmony_cistatic const struct lochnagar_group lochnagar2_groups[] = {
6578c2ecf20Sopenharmony_ci	LN2_GROUP_PIN(FPGA_GPIO1),     LN2_GROUP_PIN(FPGA_GPIO2),
6588c2ecf20Sopenharmony_ci	LN2_GROUP_PIN(FPGA_GPIO3),     LN2_GROUP_PIN(FPGA_GPIO4),
6598c2ecf20Sopenharmony_ci	LN2_GROUP_PIN(FPGA_GPIO5),     LN2_GROUP_PIN(FPGA_GPIO6),
6608c2ecf20Sopenharmony_ci	LN2_GROUP_PIN(CDC_GPIO1),      LN2_GROUP_PIN(CDC_GPIO2),
6618c2ecf20Sopenharmony_ci	LN2_GROUP_PIN(CDC_GPIO3),      LN2_GROUP_PIN(CDC_GPIO4),
6628c2ecf20Sopenharmony_ci	LN2_GROUP_PIN(CDC_GPIO5),      LN2_GROUP_PIN(CDC_GPIO6),
6638c2ecf20Sopenharmony_ci	LN2_GROUP_PIN(CDC_GPIO7),      LN2_GROUP_PIN(CDC_GPIO8),
6648c2ecf20Sopenharmony_ci	LN2_GROUP_PIN(DSP_GPIO1),      LN2_GROUP_PIN(DSP_GPIO2),
6658c2ecf20Sopenharmony_ci	LN2_GROUP_PIN(DSP_GPIO3),      LN2_GROUP_PIN(DSP_GPIO4),
6668c2ecf20Sopenharmony_ci	LN2_GROUP_PIN(DSP_GPIO5),      LN2_GROUP_PIN(DSP_GPIO6),
6678c2ecf20Sopenharmony_ci	LN2_GROUP_PIN(DSP_GPIO20),
6688c2ecf20Sopenharmony_ci	LN2_GROUP_PIN(GF_GPIO1),
6698c2ecf20Sopenharmony_ci	LN2_GROUP_PIN(GF_GPIO2),       LN2_GROUP_PIN(GF_GPIO5),
6708c2ecf20Sopenharmony_ci	LN2_GROUP_PIN(GF_GPIO3),       LN2_GROUP_PIN(GF_GPIO7),
6718c2ecf20Sopenharmony_ci	LN2_GROUP_PIN(DSP_UART1_RX),   LN2_GROUP_PIN(DSP_UART1_TX),
6728c2ecf20Sopenharmony_ci	LN2_GROUP_PIN(DSP_UART2_RX),   LN2_GROUP_PIN(DSP_UART2_TX),
6738c2ecf20Sopenharmony_ci	LN2_GROUP_PIN(GF_UART2_RX),    LN2_GROUP_PIN(GF_UART2_TX),
6748c2ecf20Sopenharmony_ci	LN2_GROUP_PIN(USB_UART_RX),
6758c2ecf20Sopenharmony_ci	LN2_GROUP_PIN(CDC_PDMCLK1),    LN2_GROUP_PIN(CDC_PDMDAT1),
6768c2ecf20Sopenharmony_ci	LN2_GROUP_PIN(CDC_PDMCLK2),    LN2_GROUP_PIN(CDC_PDMDAT2),
6778c2ecf20Sopenharmony_ci	LN2_GROUP_PIN(CDC_DMICCLK1),   LN2_GROUP_PIN(CDC_DMICDAT1),
6788c2ecf20Sopenharmony_ci	LN2_GROUP_PIN(CDC_DMICCLK2),   LN2_GROUP_PIN(CDC_DMICDAT2),
6798c2ecf20Sopenharmony_ci	LN2_GROUP_PIN(CDC_DMICCLK3),   LN2_GROUP_PIN(CDC_DMICDAT3),
6808c2ecf20Sopenharmony_ci	LN2_GROUP_PIN(CDC_DMICCLK4),   LN2_GROUP_PIN(CDC_DMICDAT4),
6818c2ecf20Sopenharmony_ci	LN2_GROUP_PIN(DSP_DMICCLK1),   LN2_GROUP_PIN(DSP_DMICDAT1),
6828c2ecf20Sopenharmony_ci	LN2_GROUP_PIN(DSP_DMICCLK2),   LN2_GROUP_PIN(DSP_DMICDAT2),
6838c2ecf20Sopenharmony_ci	LN2_GROUP_PIN(I2C2_SCL),       LN2_GROUP_PIN(I2C2_SDA),
6848c2ecf20Sopenharmony_ci	LN2_GROUP_PIN(I2C3_SCL),       LN2_GROUP_PIN(I2C3_SDA),
6858c2ecf20Sopenharmony_ci	LN2_GROUP_PIN(I2C4_SCL),       LN2_GROUP_PIN(I2C4_SDA),
6868c2ecf20Sopenharmony_ci	LN2_GROUP_PIN(DSP_STANDBY),
6878c2ecf20Sopenharmony_ci	LN2_GROUP_PIN(CDC_MCLK1),      LN2_GROUP_PIN(CDC_MCLK2),
6888c2ecf20Sopenharmony_ci	LN2_GROUP_PIN(DSP_CLKIN),
6898c2ecf20Sopenharmony_ci	LN2_GROUP_PIN(PSIA1_MCLK),     LN2_GROUP_PIN(PSIA2_MCLK),
6908c2ecf20Sopenharmony_ci	LN2_GROUP_GAI(CDC_AIF1),       LN2_GROUP_GAI(CDC_AIF2),
6918c2ecf20Sopenharmony_ci	LN2_GROUP_GAI(CDC_AIF3),
6928c2ecf20Sopenharmony_ci	LN2_GROUP_GAI(DSP_AIF1),       LN2_GROUP_GAI(DSP_AIF2),
6938c2ecf20Sopenharmony_ci	LN2_GROUP_GAI(PSIA1),          LN2_GROUP_GAI(PSIA2),
6948c2ecf20Sopenharmony_ci	LN2_GROUP_GAI(GF_AIF1),        LN2_GROUP_GAI(GF_AIF2),
6958c2ecf20Sopenharmony_ci	LN2_GROUP_GAI(GF_AIF3),        LN2_GROUP_GAI(GF_AIF4),
6968c2ecf20Sopenharmony_ci	LN2_GROUP_AIF(SPDIF_AIF),
6978c2ecf20Sopenharmony_ci	LN2_GROUP_AIF(USB_AIF1),       LN2_GROUP_AIF(USB_AIF2),
6988c2ecf20Sopenharmony_ci	LN2_GROUP_AIF(ADAT_AIF),
6998c2ecf20Sopenharmony_ci	LN2_GROUP_AIF(SOUNDCARD_AIF),
7008c2ecf20Sopenharmony_ci};
7018c2ecf20Sopenharmony_ci
7028c2ecf20Sopenharmony_cistruct lochnagar_func_groups {
7038c2ecf20Sopenharmony_ci	const char **groups;
7048c2ecf20Sopenharmony_ci	unsigned int ngroups;
7058c2ecf20Sopenharmony_ci};
7068c2ecf20Sopenharmony_ci
7078c2ecf20Sopenharmony_cistruct lochnagar_pin_priv {
7088c2ecf20Sopenharmony_ci	struct lochnagar *lochnagar;
7098c2ecf20Sopenharmony_ci	struct device *dev;
7108c2ecf20Sopenharmony_ci
7118c2ecf20Sopenharmony_ci	const struct lochnagar_func *funcs;
7128c2ecf20Sopenharmony_ci	unsigned int nfuncs;
7138c2ecf20Sopenharmony_ci
7148c2ecf20Sopenharmony_ci	const struct pinctrl_pin_desc *pins;
7158c2ecf20Sopenharmony_ci	unsigned int npins;
7168c2ecf20Sopenharmony_ci
7178c2ecf20Sopenharmony_ci	const struct lochnagar_group *groups;
7188c2ecf20Sopenharmony_ci	unsigned int ngroups;
7198c2ecf20Sopenharmony_ci
7208c2ecf20Sopenharmony_ci	struct lochnagar_func_groups func_groups[LN_FTYPE_COUNT];
7218c2ecf20Sopenharmony_ci
7228c2ecf20Sopenharmony_ci	struct gpio_chip gpio_chip;
7238c2ecf20Sopenharmony_ci};
7248c2ecf20Sopenharmony_ci
7258c2ecf20Sopenharmony_cistatic int lochnagar_get_groups_count(struct pinctrl_dev *pctldev)
7268c2ecf20Sopenharmony_ci{
7278c2ecf20Sopenharmony_ci	struct lochnagar_pin_priv *priv = pinctrl_dev_get_drvdata(pctldev);
7288c2ecf20Sopenharmony_ci
7298c2ecf20Sopenharmony_ci	return priv->ngroups;
7308c2ecf20Sopenharmony_ci}
7318c2ecf20Sopenharmony_ci
7328c2ecf20Sopenharmony_cistatic const char *lochnagar_get_group_name(struct pinctrl_dev *pctldev,
7338c2ecf20Sopenharmony_ci					    unsigned int group_idx)
7348c2ecf20Sopenharmony_ci{
7358c2ecf20Sopenharmony_ci	struct lochnagar_pin_priv *priv = pinctrl_dev_get_drvdata(pctldev);
7368c2ecf20Sopenharmony_ci
7378c2ecf20Sopenharmony_ci	return priv->groups[group_idx].name;
7388c2ecf20Sopenharmony_ci}
7398c2ecf20Sopenharmony_ci
7408c2ecf20Sopenharmony_cistatic int lochnagar_get_group_pins(struct pinctrl_dev *pctldev,
7418c2ecf20Sopenharmony_ci				    unsigned int group_idx,
7428c2ecf20Sopenharmony_ci				    const unsigned int **pins,
7438c2ecf20Sopenharmony_ci				    unsigned int *num_pins)
7448c2ecf20Sopenharmony_ci{
7458c2ecf20Sopenharmony_ci	struct lochnagar_pin_priv *priv = pinctrl_dev_get_drvdata(pctldev);
7468c2ecf20Sopenharmony_ci
7478c2ecf20Sopenharmony_ci	*pins = priv->groups[group_idx].pins;
7488c2ecf20Sopenharmony_ci	*num_pins = priv->groups[group_idx].npins;
7498c2ecf20Sopenharmony_ci
7508c2ecf20Sopenharmony_ci	return 0;
7518c2ecf20Sopenharmony_ci}
7528c2ecf20Sopenharmony_ci
7538c2ecf20Sopenharmony_cistatic const struct pinctrl_ops lochnagar_pin_group_ops = {
7548c2ecf20Sopenharmony_ci	.get_groups_count = lochnagar_get_groups_count,
7558c2ecf20Sopenharmony_ci	.get_group_name = lochnagar_get_group_name,
7568c2ecf20Sopenharmony_ci	.get_group_pins = lochnagar_get_group_pins,
7578c2ecf20Sopenharmony_ci	.dt_node_to_map = pinconf_generic_dt_node_to_map_all,
7588c2ecf20Sopenharmony_ci	.dt_free_map = pinctrl_utils_free_map,
7598c2ecf20Sopenharmony_ci};
7608c2ecf20Sopenharmony_ci
7618c2ecf20Sopenharmony_cistatic int lochnagar_get_funcs_count(struct pinctrl_dev *pctldev)
7628c2ecf20Sopenharmony_ci{
7638c2ecf20Sopenharmony_ci	struct lochnagar_pin_priv *priv = pinctrl_dev_get_drvdata(pctldev);
7648c2ecf20Sopenharmony_ci
7658c2ecf20Sopenharmony_ci	return priv->nfuncs;
7668c2ecf20Sopenharmony_ci}
7678c2ecf20Sopenharmony_ci
7688c2ecf20Sopenharmony_cistatic const char *lochnagar_get_func_name(struct pinctrl_dev *pctldev,
7698c2ecf20Sopenharmony_ci					   unsigned int func_idx)
7708c2ecf20Sopenharmony_ci{
7718c2ecf20Sopenharmony_ci	struct lochnagar_pin_priv *priv = pinctrl_dev_get_drvdata(pctldev);
7728c2ecf20Sopenharmony_ci
7738c2ecf20Sopenharmony_ci	return priv->funcs[func_idx].name;
7748c2ecf20Sopenharmony_ci}
7758c2ecf20Sopenharmony_ci
7768c2ecf20Sopenharmony_cistatic int lochnagar_get_func_groups(struct pinctrl_dev *pctldev,
7778c2ecf20Sopenharmony_ci				     unsigned int func_idx,
7788c2ecf20Sopenharmony_ci				     const char * const **groups,
7798c2ecf20Sopenharmony_ci				     unsigned int * const num_groups)
7808c2ecf20Sopenharmony_ci{
7818c2ecf20Sopenharmony_ci	struct lochnagar_pin_priv *priv = pinctrl_dev_get_drvdata(pctldev);
7828c2ecf20Sopenharmony_ci	int func_type;
7838c2ecf20Sopenharmony_ci
7848c2ecf20Sopenharmony_ci	func_type = priv->funcs[func_idx].type;
7858c2ecf20Sopenharmony_ci
7868c2ecf20Sopenharmony_ci	*groups = priv->func_groups[func_type].groups;
7878c2ecf20Sopenharmony_ci	*num_groups = priv->func_groups[func_type].ngroups;
7888c2ecf20Sopenharmony_ci
7898c2ecf20Sopenharmony_ci	return 0;
7908c2ecf20Sopenharmony_ci}
7918c2ecf20Sopenharmony_ci
7928c2ecf20Sopenharmony_cistatic int lochnagar2_get_gpio_chan(struct lochnagar_pin_priv *priv,
7938c2ecf20Sopenharmony_ci				    unsigned int op)
7948c2ecf20Sopenharmony_ci{
7958c2ecf20Sopenharmony_ci	struct regmap *regmap = priv->lochnagar->regmap;
7968c2ecf20Sopenharmony_ci	unsigned int val;
7978c2ecf20Sopenharmony_ci	int free = -1;
7988c2ecf20Sopenharmony_ci	int i, ret;
7998c2ecf20Sopenharmony_ci
8008c2ecf20Sopenharmony_ci	for (i = 0; i < LN2_NUM_GPIO_CHANNELS; i++) {
8018c2ecf20Sopenharmony_ci		ret = regmap_read(regmap, LOCHNAGAR2_GPIO_CHANNEL1 + i, &val);
8028c2ecf20Sopenharmony_ci		if (ret)
8038c2ecf20Sopenharmony_ci			return ret;
8048c2ecf20Sopenharmony_ci
8058c2ecf20Sopenharmony_ci		val &= LOCHNAGAR2_GPIO_CHANNEL_SRC_MASK;
8068c2ecf20Sopenharmony_ci
8078c2ecf20Sopenharmony_ci		if (val == op)
8088c2ecf20Sopenharmony_ci			return i + 1;
8098c2ecf20Sopenharmony_ci
8108c2ecf20Sopenharmony_ci		if (free < 0 && !val)
8118c2ecf20Sopenharmony_ci			free = i;
8128c2ecf20Sopenharmony_ci	}
8138c2ecf20Sopenharmony_ci
8148c2ecf20Sopenharmony_ci	if (free >= 0) {
8158c2ecf20Sopenharmony_ci		ret = regmap_update_bits(regmap,
8168c2ecf20Sopenharmony_ci					 LOCHNAGAR2_GPIO_CHANNEL1 + free,
8178c2ecf20Sopenharmony_ci					 LOCHNAGAR2_GPIO_CHANNEL_SRC_MASK, op);
8188c2ecf20Sopenharmony_ci		if (ret)
8198c2ecf20Sopenharmony_ci			return ret;
8208c2ecf20Sopenharmony_ci
8218c2ecf20Sopenharmony_ci		free++;
8228c2ecf20Sopenharmony_ci
8238c2ecf20Sopenharmony_ci		dev_dbg(priv->dev, "Set channel %d to 0x%x\n", free, op);
8248c2ecf20Sopenharmony_ci
8258c2ecf20Sopenharmony_ci		return free;
8268c2ecf20Sopenharmony_ci	}
8278c2ecf20Sopenharmony_ci
8288c2ecf20Sopenharmony_ci	return -ENOSPC;
8298c2ecf20Sopenharmony_ci}
8308c2ecf20Sopenharmony_ci
8318c2ecf20Sopenharmony_cistatic int lochnagar_pin_set_mux(struct lochnagar_pin_priv *priv,
8328c2ecf20Sopenharmony_ci				 const struct lochnagar_pin *pin,
8338c2ecf20Sopenharmony_ci				 unsigned int op)
8348c2ecf20Sopenharmony_ci{
8358c2ecf20Sopenharmony_ci	int ret;
8368c2ecf20Sopenharmony_ci
8378c2ecf20Sopenharmony_ci	switch (priv->lochnagar->type) {
8388c2ecf20Sopenharmony_ci	case LOCHNAGAR1:
8398c2ecf20Sopenharmony_ci		break;
8408c2ecf20Sopenharmony_ci	default:
8418c2ecf20Sopenharmony_ci		ret = lochnagar2_get_gpio_chan(priv, op);
8428c2ecf20Sopenharmony_ci		if (ret < 0) {
8438c2ecf20Sopenharmony_ci			dev_err(priv->dev, "Failed to get channel for %s: %d\n",
8448c2ecf20Sopenharmony_ci				pin->name, ret);
8458c2ecf20Sopenharmony_ci			return ret;
8468c2ecf20Sopenharmony_ci		}
8478c2ecf20Sopenharmony_ci
8488c2ecf20Sopenharmony_ci		op = ret;
8498c2ecf20Sopenharmony_ci		break;
8508c2ecf20Sopenharmony_ci	}
8518c2ecf20Sopenharmony_ci
8528c2ecf20Sopenharmony_ci	dev_dbg(priv->dev, "Set pin %s to 0x%x\n", pin->name, op);
8538c2ecf20Sopenharmony_ci
8548c2ecf20Sopenharmony_ci	ret = regmap_write(priv->lochnagar->regmap, pin->reg, op);
8558c2ecf20Sopenharmony_ci	if (ret)
8568c2ecf20Sopenharmony_ci		dev_err(priv->dev, "Failed to set %s mux: %d\n",
8578c2ecf20Sopenharmony_ci			pin->name, ret);
8588c2ecf20Sopenharmony_ci
8598c2ecf20Sopenharmony_ci	return 0;
8608c2ecf20Sopenharmony_ci}
8618c2ecf20Sopenharmony_ci
8628c2ecf20Sopenharmony_cistatic int lochnagar_aif_set_mux(struct lochnagar_pin_priv *priv,
8638c2ecf20Sopenharmony_ci				 const struct lochnagar_group *group,
8648c2ecf20Sopenharmony_ci				 unsigned int op)
8658c2ecf20Sopenharmony_ci{
8668c2ecf20Sopenharmony_ci	struct regmap *regmap = priv->lochnagar->regmap;
8678c2ecf20Sopenharmony_ci	const struct lochnagar_aif *aif = group->priv;
8688c2ecf20Sopenharmony_ci	const struct lochnagar_pin *pin;
8698c2ecf20Sopenharmony_ci	int i, ret;
8708c2ecf20Sopenharmony_ci
8718c2ecf20Sopenharmony_ci	ret = regmap_update_bits(regmap, aif->src_reg, aif->src_mask, op);
8728c2ecf20Sopenharmony_ci	if (ret) {
8738c2ecf20Sopenharmony_ci		dev_err(priv->dev, "Failed to set %s source: %d\n",
8748c2ecf20Sopenharmony_ci			group->name, ret);
8758c2ecf20Sopenharmony_ci		return ret;
8768c2ecf20Sopenharmony_ci	}
8778c2ecf20Sopenharmony_ci
8788c2ecf20Sopenharmony_ci	ret = regmap_update_bits(regmap, aif->ctrl_reg,
8798c2ecf20Sopenharmony_ci				 aif->ena_mask, aif->ena_mask);
8808c2ecf20Sopenharmony_ci	if (ret) {
8818c2ecf20Sopenharmony_ci		dev_err(priv->dev, "Failed to set %s enable: %d\n",
8828c2ecf20Sopenharmony_ci			group->name, ret);
8838c2ecf20Sopenharmony_ci		return ret;
8848c2ecf20Sopenharmony_ci	}
8858c2ecf20Sopenharmony_ci
8868c2ecf20Sopenharmony_ci	for (i = 0; i < group->npins; i++) {
8878c2ecf20Sopenharmony_ci		pin = priv->pins[group->pins[i]].drv_data;
8888c2ecf20Sopenharmony_ci
8898c2ecf20Sopenharmony_ci		if (pin->type != LN_PTYPE_MUX)
8908c2ecf20Sopenharmony_ci			continue;
8918c2ecf20Sopenharmony_ci
8928c2ecf20Sopenharmony_ci		dev_dbg(priv->dev, "Set pin %s to AIF\n", pin->name);
8938c2ecf20Sopenharmony_ci
8948c2ecf20Sopenharmony_ci		ret = regmap_update_bits(regmap, pin->reg,
8958c2ecf20Sopenharmony_ci					 LOCHNAGAR2_GPIO_SRC_MASK,
8968c2ecf20Sopenharmony_ci					 LN2_OP_AIF);
8978c2ecf20Sopenharmony_ci		if (ret) {
8988c2ecf20Sopenharmony_ci			dev_err(priv->dev, "Failed to set %s to AIF: %d\n",
8998c2ecf20Sopenharmony_ci				pin->name, ret);
9008c2ecf20Sopenharmony_ci			return ret;
9018c2ecf20Sopenharmony_ci		}
9028c2ecf20Sopenharmony_ci	}
9038c2ecf20Sopenharmony_ci
9048c2ecf20Sopenharmony_ci	return 0;
9058c2ecf20Sopenharmony_ci}
9068c2ecf20Sopenharmony_ci
9078c2ecf20Sopenharmony_cistatic int lochnagar_set_mux(struct pinctrl_dev *pctldev,
9088c2ecf20Sopenharmony_ci			     unsigned int func_idx, unsigned int group_idx)
9098c2ecf20Sopenharmony_ci{
9108c2ecf20Sopenharmony_ci	struct lochnagar_pin_priv *priv = pinctrl_dev_get_drvdata(pctldev);
9118c2ecf20Sopenharmony_ci	const struct lochnagar_func *func = &priv->funcs[func_idx];
9128c2ecf20Sopenharmony_ci	const struct lochnagar_group *group = &priv->groups[group_idx];
9138c2ecf20Sopenharmony_ci	const struct lochnagar_pin *pin;
9148c2ecf20Sopenharmony_ci
9158c2ecf20Sopenharmony_ci	switch (func->type) {
9168c2ecf20Sopenharmony_ci	case LN_FTYPE_AIF:
9178c2ecf20Sopenharmony_ci		dev_dbg(priv->dev, "Set group %s to %s\n",
9188c2ecf20Sopenharmony_ci			group->name, func->name);
9198c2ecf20Sopenharmony_ci
9208c2ecf20Sopenharmony_ci		return lochnagar_aif_set_mux(priv, group, func->op);
9218c2ecf20Sopenharmony_ci	case LN_FTYPE_PIN:
9228c2ecf20Sopenharmony_ci		pin = priv->pins[*group->pins].drv_data;
9238c2ecf20Sopenharmony_ci
9248c2ecf20Sopenharmony_ci		dev_dbg(priv->dev, "Set pin %s to %s\n", pin->name, func->name);
9258c2ecf20Sopenharmony_ci
9268c2ecf20Sopenharmony_ci		return lochnagar_pin_set_mux(priv, pin, func->op);
9278c2ecf20Sopenharmony_ci	default:
9288c2ecf20Sopenharmony_ci		return -EINVAL;
9298c2ecf20Sopenharmony_ci	}
9308c2ecf20Sopenharmony_ci}
9318c2ecf20Sopenharmony_ci
9328c2ecf20Sopenharmony_cistatic int lochnagar_gpio_request(struct pinctrl_dev *pctldev,
9338c2ecf20Sopenharmony_ci				  struct pinctrl_gpio_range *range,
9348c2ecf20Sopenharmony_ci				  unsigned int offset)
9358c2ecf20Sopenharmony_ci{
9368c2ecf20Sopenharmony_ci	struct lochnagar_pin_priv *priv = pinctrl_dev_get_drvdata(pctldev);
9378c2ecf20Sopenharmony_ci	struct lochnagar *lochnagar = priv->lochnagar;
9388c2ecf20Sopenharmony_ci	const struct lochnagar_pin *pin = priv->pins[offset].drv_data;
9398c2ecf20Sopenharmony_ci	int ret;
9408c2ecf20Sopenharmony_ci
9418c2ecf20Sopenharmony_ci	dev_dbg(priv->dev, "Requesting GPIO %s\n", pin->name);
9428c2ecf20Sopenharmony_ci
9438c2ecf20Sopenharmony_ci	if (lochnagar->type == LOCHNAGAR1 || pin->type != LN_PTYPE_MUX)
9448c2ecf20Sopenharmony_ci		return 0;
9458c2ecf20Sopenharmony_ci
9468c2ecf20Sopenharmony_ci	ret = lochnagar2_get_gpio_chan(priv, LN2_OP_GPIO);
9478c2ecf20Sopenharmony_ci	if (ret < 0) {
9488c2ecf20Sopenharmony_ci		dev_err(priv->dev, "Failed to get low channel: %d\n", ret);
9498c2ecf20Sopenharmony_ci		return ret;
9508c2ecf20Sopenharmony_ci	}
9518c2ecf20Sopenharmony_ci
9528c2ecf20Sopenharmony_ci	ret = lochnagar2_get_gpio_chan(priv, LN2_OP_GPIO | 0x1);
9538c2ecf20Sopenharmony_ci	if (ret < 0) {
9548c2ecf20Sopenharmony_ci		dev_err(priv->dev, "Failed to get high channel: %d\n", ret);
9558c2ecf20Sopenharmony_ci		return ret;
9568c2ecf20Sopenharmony_ci	}
9578c2ecf20Sopenharmony_ci
9588c2ecf20Sopenharmony_ci	return 0;
9598c2ecf20Sopenharmony_ci}
9608c2ecf20Sopenharmony_ci
9618c2ecf20Sopenharmony_cistatic int lochnagar_gpio_set_direction(struct pinctrl_dev *pctldev,
9628c2ecf20Sopenharmony_ci					struct pinctrl_gpio_range *range,
9638c2ecf20Sopenharmony_ci					unsigned int offset,
9648c2ecf20Sopenharmony_ci					bool input)
9658c2ecf20Sopenharmony_ci{
9668c2ecf20Sopenharmony_ci	/* The GPIOs only support output */
9678c2ecf20Sopenharmony_ci	if (input)
9688c2ecf20Sopenharmony_ci		return -EINVAL;
9698c2ecf20Sopenharmony_ci
9708c2ecf20Sopenharmony_ci	return 0;
9718c2ecf20Sopenharmony_ci}
9728c2ecf20Sopenharmony_ci
9738c2ecf20Sopenharmony_cistatic const struct pinmux_ops lochnagar_pin_mux_ops = {
9748c2ecf20Sopenharmony_ci	.get_functions_count = lochnagar_get_funcs_count,
9758c2ecf20Sopenharmony_ci	.get_function_name = lochnagar_get_func_name,
9768c2ecf20Sopenharmony_ci	.get_function_groups = lochnagar_get_func_groups,
9778c2ecf20Sopenharmony_ci	.set_mux = lochnagar_set_mux,
9788c2ecf20Sopenharmony_ci
9798c2ecf20Sopenharmony_ci	.gpio_request_enable = lochnagar_gpio_request,
9808c2ecf20Sopenharmony_ci	.gpio_set_direction = lochnagar_gpio_set_direction,
9818c2ecf20Sopenharmony_ci
9828c2ecf20Sopenharmony_ci	.strict = true,
9838c2ecf20Sopenharmony_ci};
9848c2ecf20Sopenharmony_ci
9858c2ecf20Sopenharmony_cistatic int lochnagar_aif_set_master(struct lochnagar_pin_priv *priv,
9868c2ecf20Sopenharmony_ci				    unsigned int group_idx, bool master)
9878c2ecf20Sopenharmony_ci{
9888c2ecf20Sopenharmony_ci	struct regmap *regmap = priv->lochnagar->regmap;
9898c2ecf20Sopenharmony_ci	const struct lochnagar_group *group = &priv->groups[group_idx];
9908c2ecf20Sopenharmony_ci	const struct lochnagar_aif *aif = group->priv;
9918c2ecf20Sopenharmony_ci	unsigned int val = 0;
9928c2ecf20Sopenharmony_ci	int ret;
9938c2ecf20Sopenharmony_ci
9948c2ecf20Sopenharmony_ci	if (group->type != LN_FTYPE_AIF)
9958c2ecf20Sopenharmony_ci		return -EINVAL;
9968c2ecf20Sopenharmony_ci
9978c2ecf20Sopenharmony_ci	if (!master)
9988c2ecf20Sopenharmony_ci		val = aif->master_mask;
9998c2ecf20Sopenharmony_ci
10008c2ecf20Sopenharmony_ci	dev_dbg(priv->dev, "Set AIF %s to %s\n",
10018c2ecf20Sopenharmony_ci		group->name, master ? "master" : "slave");
10028c2ecf20Sopenharmony_ci
10038c2ecf20Sopenharmony_ci	ret = regmap_update_bits(regmap, aif->ctrl_reg, aif->master_mask, val);
10048c2ecf20Sopenharmony_ci	if (ret) {
10058c2ecf20Sopenharmony_ci		dev_err(priv->dev, "Failed to set %s mode: %d\n",
10068c2ecf20Sopenharmony_ci			group->name, ret);
10078c2ecf20Sopenharmony_ci		return ret;
10088c2ecf20Sopenharmony_ci	}
10098c2ecf20Sopenharmony_ci
10108c2ecf20Sopenharmony_ci	return 0;
10118c2ecf20Sopenharmony_ci}
10128c2ecf20Sopenharmony_ci
10138c2ecf20Sopenharmony_cistatic int lochnagar_conf_group_set(struct pinctrl_dev *pctldev,
10148c2ecf20Sopenharmony_ci				    unsigned int group_idx,
10158c2ecf20Sopenharmony_ci				    unsigned long *configs,
10168c2ecf20Sopenharmony_ci				    unsigned int num_configs)
10178c2ecf20Sopenharmony_ci{
10188c2ecf20Sopenharmony_ci	struct lochnagar_pin_priv *priv = pinctrl_dev_get_drvdata(pctldev);
10198c2ecf20Sopenharmony_ci	int i, ret;
10208c2ecf20Sopenharmony_ci
10218c2ecf20Sopenharmony_ci	for (i = 0; i < num_configs; i++) {
10228c2ecf20Sopenharmony_ci		unsigned int param = pinconf_to_config_param(*configs);
10238c2ecf20Sopenharmony_ci
10248c2ecf20Sopenharmony_ci		switch (param) {
10258c2ecf20Sopenharmony_ci		case PIN_CONFIG_OUTPUT_ENABLE:
10268c2ecf20Sopenharmony_ci			ret = lochnagar_aif_set_master(priv, group_idx, true);
10278c2ecf20Sopenharmony_ci			if (ret)
10288c2ecf20Sopenharmony_ci				return ret;
10298c2ecf20Sopenharmony_ci			break;
10308c2ecf20Sopenharmony_ci		case PIN_CONFIG_INPUT_ENABLE:
10318c2ecf20Sopenharmony_ci			ret = lochnagar_aif_set_master(priv, group_idx, false);
10328c2ecf20Sopenharmony_ci			if (ret)
10338c2ecf20Sopenharmony_ci				return ret;
10348c2ecf20Sopenharmony_ci			break;
10358c2ecf20Sopenharmony_ci		default:
10368c2ecf20Sopenharmony_ci			return -ENOTSUPP;
10378c2ecf20Sopenharmony_ci		}
10388c2ecf20Sopenharmony_ci
10398c2ecf20Sopenharmony_ci		configs++;
10408c2ecf20Sopenharmony_ci	}
10418c2ecf20Sopenharmony_ci
10428c2ecf20Sopenharmony_ci	return 0;
10438c2ecf20Sopenharmony_ci}
10448c2ecf20Sopenharmony_ci
10458c2ecf20Sopenharmony_cistatic const struct pinconf_ops lochnagar_pin_conf_ops = {
10468c2ecf20Sopenharmony_ci	.pin_config_group_set = lochnagar_conf_group_set,
10478c2ecf20Sopenharmony_ci};
10488c2ecf20Sopenharmony_ci
10498c2ecf20Sopenharmony_cistatic const struct pinctrl_desc lochnagar_pin_desc = {
10508c2ecf20Sopenharmony_ci	.name = "lochnagar-pinctrl",
10518c2ecf20Sopenharmony_ci	.owner = THIS_MODULE,
10528c2ecf20Sopenharmony_ci
10538c2ecf20Sopenharmony_ci	.pctlops = &lochnagar_pin_group_ops,
10548c2ecf20Sopenharmony_ci	.pmxops = &lochnagar_pin_mux_ops,
10558c2ecf20Sopenharmony_ci	.confops = &lochnagar_pin_conf_ops,
10568c2ecf20Sopenharmony_ci};
10578c2ecf20Sopenharmony_ci
10588c2ecf20Sopenharmony_cistatic void lochnagar_gpio_set(struct gpio_chip *chip,
10598c2ecf20Sopenharmony_ci			       unsigned int offset, int value)
10608c2ecf20Sopenharmony_ci{
10618c2ecf20Sopenharmony_ci	struct lochnagar_pin_priv *priv = gpiochip_get_data(chip);
10628c2ecf20Sopenharmony_ci	struct lochnagar *lochnagar = priv->lochnagar;
10638c2ecf20Sopenharmony_ci	const struct lochnagar_pin *pin = priv->pins[offset].drv_data;
10648c2ecf20Sopenharmony_ci	int ret;
10658c2ecf20Sopenharmony_ci
10668c2ecf20Sopenharmony_ci	value = !!value;
10678c2ecf20Sopenharmony_ci
10688c2ecf20Sopenharmony_ci	dev_dbg(priv->dev, "Set GPIO %s to %s\n",
10698c2ecf20Sopenharmony_ci		pin->name, value ? "high" : "low");
10708c2ecf20Sopenharmony_ci
10718c2ecf20Sopenharmony_ci	switch (pin->type) {
10728c2ecf20Sopenharmony_ci	case LN_PTYPE_MUX:
10738c2ecf20Sopenharmony_ci		value |= LN2_OP_GPIO;
10748c2ecf20Sopenharmony_ci
10758c2ecf20Sopenharmony_ci		ret = lochnagar_pin_set_mux(priv, pin, value);
10768c2ecf20Sopenharmony_ci		break;
10778c2ecf20Sopenharmony_ci	case LN_PTYPE_GPIO:
10788c2ecf20Sopenharmony_ci		if (pin->invert)
10798c2ecf20Sopenharmony_ci			value = !value;
10808c2ecf20Sopenharmony_ci
10818c2ecf20Sopenharmony_ci		ret = regmap_update_bits(lochnagar->regmap, pin->reg,
10828c2ecf20Sopenharmony_ci					 BIT(pin->shift), value << pin->shift);
10838c2ecf20Sopenharmony_ci		break;
10848c2ecf20Sopenharmony_ci	default:
10858c2ecf20Sopenharmony_ci		ret = -EINVAL;
10868c2ecf20Sopenharmony_ci		break;
10878c2ecf20Sopenharmony_ci	}
10888c2ecf20Sopenharmony_ci
10898c2ecf20Sopenharmony_ci	if (ret < 0)
10908c2ecf20Sopenharmony_ci		dev_err(chip->parent, "Failed to set %s value: %d\n",
10918c2ecf20Sopenharmony_ci			pin->name, ret);
10928c2ecf20Sopenharmony_ci}
10938c2ecf20Sopenharmony_ci
10948c2ecf20Sopenharmony_cistatic int lochnagar_gpio_direction_out(struct gpio_chip *chip,
10958c2ecf20Sopenharmony_ci					unsigned int offset, int value)
10968c2ecf20Sopenharmony_ci{
10978c2ecf20Sopenharmony_ci	lochnagar_gpio_set(chip, offset, value);
10988c2ecf20Sopenharmony_ci
10998c2ecf20Sopenharmony_ci	return pinctrl_gpio_direction_output(chip->base + offset);
11008c2ecf20Sopenharmony_ci}
11018c2ecf20Sopenharmony_ci
11028c2ecf20Sopenharmony_cistatic int lochnagar_fill_func_groups(struct lochnagar_pin_priv *priv)
11038c2ecf20Sopenharmony_ci{
11048c2ecf20Sopenharmony_ci	struct lochnagar_func_groups *funcs;
11058c2ecf20Sopenharmony_ci	int i;
11068c2ecf20Sopenharmony_ci
11078c2ecf20Sopenharmony_ci	for (i = 0; i < priv->ngroups; i++)
11088c2ecf20Sopenharmony_ci		priv->func_groups[priv->groups[i].type].ngroups++;
11098c2ecf20Sopenharmony_ci
11108c2ecf20Sopenharmony_ci	for (i = 0; i < LN_FTYPE_COUNT; i++) {
11118c2ecf20Sopenharmony_ci		funcs = &priv->func_groups[i];
11128c2ecf20Sopenharmony_ci
11138c2ecf20Sopenharmony_ci		if (!funcs->ngroups)
11148c2ecf20Sopenharmony_ci			continue;
11158c2ecf20Sopenharmony_ci
11168c2ecf20Sopenharmony_ci		funcs->groups = devm_kcalloc(priv->dev, funcs->ngroups,
11178c2ecf20Sopenharmony_ci					     sizeof(*funcs->groups),
11188c2ecf20Sopenharmony_ci					     GFP_KERNEL);
11198c2ecf20Sopenharmony_ci		if (!funcs->groups)
11208c2ecf20Sopenharmony_ci			return -ENOMEM;
11218c2ecf20Sopenharmony_ci
11228c2ecf20Sopenharmony_ci		funcs->ngroups = 0;
11238c2ecf20Sopenharmony_ci	}
11248c2ecf20Sopenharmony_ci
11258c2ecf20Sopenharmony_ci	for (i = 0; i < priv->ngroups; i++) {
11268c2ecf20Sopenharmony_ci		funcs = &priv->func_groups[priv->groups[i].type];
11278c2ecf20Sopenharmony_ci
11288c2ecf20Sopenharmony_ci		funcs->groups[funcs->ngroups++] = priv->groups[i].name;
11298c2ecf20Sopenharmony_ci	}
11308c2ecf20Sopenharmony_ci
11318c2ecf20Sopenharmony_ci	return 0;
11328c2ecf20Sopenharmony_ci}
11338c2ecf20Sopenharmony_ci
11348c2ecf20Sopenharmony_cistatic int lochnagar_pin_probe(struct platform_device *pdev)
11358c2ecf20Sopenharmony_ci{
11368c2ecf20Sopenharmony_ci	struct lochnagar *lochnagar = dev_get_drvdata(pdev->dev.parent);
11378c2ecf20Sopenharmony_ci	struct lochnagar_pin_priv *priv;
11388c2ecf20Sopenharmony_ci	struct pinctrl_desc *desc;
11398c2ecf20Sopenharmony_ci	struct pinctrl_dev *pctl;
11408c2ecf20Sopenharmony_ci	struct device *dev = &pdev->dev;
11418c2ecf20Sopenharmony_ci	int ret;
11428c2ecf20Sopenharmony_ci
11438c2ecf20Sopenharmony_ci	priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
11448c2ecf20Sopenharmony_ci	if (!priv)
11458c2ecf20Sopenharmony_ci		return -ENOMEM;
11468c2ecf20Sopenharmony_ci
11478c2ecf20Sopenharmony_ci	priv->dev = dev;
11488c2ecf20Sopenharmony_ci	priv->lochnagar = lochnagar;
11498c2ecf20Sopenharmony_ci
11508c2ecf20Sopenharmony_ci	desc = devm_kzalloc(dev, sizeof(*desc), GFP_KERNEL);
11518c2ecf20Sopenharmony_ci	if (!desc)
11528c2ecf20Sopenharmony_ci		return -ENOMEM;
11538c2ecf20Sopenharmony_ci
11548c2ecf20Sopenharmony_ci	*desc = lochnagar_pin_desc;
11558c2ecf20Sopenharmony_ci
11568c2ecf20Sopenharmony_ci	priv->gpio_chip.label = dev_name(dev);
11578c2ecf20Sopenharmony_ci	priv->gpio_chip.request = gpiochip_generic_request;
11588c2ecf20Sopenharmony_ci	priv->gpio_chip.free = gpiochip_generic_free;
11598c2ecf20Sopenharmony_ci	priv->gpio_chip.direction_output = lochnagar_gpio_direction_out;
11608c2ecf20Sopenharmony_ci	priv->gpio_chip.set = lochnagar_gpio_set;
11618c2ecf20Sopenharmony_ci	priv->gpio_chip.can_sleep = true;
11628c2ecf20Sopenharmony_ci	priv->gpio_chip.parent = dev;
11638c2ecf20Sopenharmony_ci	priv->gpio_chip.base = -1;
11648c2ecf20Sopenharmony_ci#ifdef CONFIG_OF_GPIO
11658c2ecf20Sopenharmony_ci	priv->gpio_chip.of_node = dev->of_node;
11668c2ecf20Sopenharmony_ci#endif
11678c2ecf20Sopenharmony_ci
11688c2ecf20Sopenharmony_ci	switch (lochnagar->type) {
11698c2ecf20Sopenharmony_ci	case LOCHNAGAR1:
11708c2ecf20Sopenharmony_ci		priv->funcs = lochnagar1_funcs;
11718c2ecf20Sopenharmony_ci		priv->nfuncs = ARRAY_SIZE(lochnagar1_funcs);
11728c2ecf20Sopenharmony_ci		priv->pins = lochnagar1_pins;
11738c2ecf20Sopenharmony_ci		priv->npins = ARRAY_SIZE(lochnagar1_pins);
11748c2ecf20Sopenharmony_ci		priv->groups = lochnagar1_groups;
11758c2ecf20Sopenharmony_ci		priv->ngroups = ARRAY_SIZE(lochnagar1_groups);
11768c2ecf20Sopenharmony_ci
11778c2ecf20Sopenharmony_ci		priv->gpio_chip.ngpio = LOCHNAGAR1_PIN_NUM_GPIOS;
11788c2ecf20Sopenharmony_ci		break;
11798c2ecf20Sopenharmony_ci	case LOCHNAGAR2:
11808c2ecf20Sopenharmony_ci		priv->funcs = lochnagar2_funcs;
11818c2ecf20Sopenharmony_ci		priv->nfuncs = ARRAY_SIZE(lochnagar2_funcs);
11828c2ecf20Sopenharmony_ci		priv->pins = lochnagar2_pins;
11838c2ecf20Sopenharmony_ci		priv->npins = ARRAY_SIZE(lochnagar2_pins);
11848c2ecf20Sopenharmony_ci		priv->groups = lochnagar2_groups;
11858c2ecf20Sopenharmony_ci		priv->ngroups = ARRAY_SIZE(lochnagar2_groups);
11868c2ecf20Sopenharmony_ci
11878c2ecf20Sopenharmony_ci		priv->gpio_chip.ngpio = LOCHNAGAR2_PIN_NUM_GPIOS;
11888c2ecf20Sopenharmony_ci		break;
11898c2ecf20Sopenharmony_ci	default:
11908c2ecf20Sopenharmony_ci		dev_err(dev, "Unknown Lochnagar type: %d\n", lochnagar->type);
11918c2ecf20Sopenharmony_ci		return -EINVAL;
11928c2ecf20Sopenharmony_ci	}
11938c2ecf20Sopenharmony_ci
11948c2ecf20Sopenharmony_ci	ret = lochnagar_fill_func_groups(priv);
11958c2ecf20Sopenharmony_ci	if (ret < 0)
11968c2ecf20Sopenharmony_ci		return ret;
11978c2ecf20Sopenharmony_ci
11988c2ecf20Sopenharmony_ci	desc->pins = priv->pins;
11998c2ecf20Sopenharmony_ci	desc->npins = priv->npins;
12008c2ecf20Sopenharmony_ci
12018c2ecf20Sopenharmony_ci	pctl = devm_pinctrl_register(dev, desc, priv);
12028c2ecf20Sopenharmony_ci	if (IS_ERR(pctl)) {
12038c2ecf20Sopenharmony_ci		ret = PTR_ERR(pctl);
12048c2ecf20Sopenharmony_ci		dev_err(priv->dev, "Failed to register pinctrl: %d\n", ret);
12058c2ecf20Sopenharmony_ci		return ret;
12068c2ecf20Sopenharmony_ci	}
12078c2ecf20Sopenharmony_ci
12088c2ecf20Sopenharmony_ci	ret = devm_gpiochip_add_data(dev, &priv->gpio_chip, priv);
12098c2ecf20Sopenharmony_ci	if (ret < 0) {
12108c2ecf20Sopenharmony_ci		dev_err(&pdev->dev, "Failed to register gpiochip: %d\n", ret);
12118c2ecf20Sopenharmony_ci		return ret;
12128c2ecf20Sopenharmony_ci	}
12138c2ecf20Sopenharmony_ci
12148c2ecf20Sopenharmony_ci	return 0;
12158c2ecf20Sopenharmony_ci}
12168c2ecf20Sopenharmony_ci
12178c2ecf20Sopenharmony_cistatic const struct of_device_id lochnagar_of_match[] = {
12188c2ecf20Sopenharmony_ci	{ .compatible = "cirrus,lochnagar-pinctrl" },
12198c2ecf20Sopenharmony_ci	{}
12208c2ecf20Sopenharmony_ci};
12218c2ecf20Sopenharmony_ciMODULE_DEVICE_TABLE(of, lochnagar_of_match);
12228c2ecf20Sopenharmony_ci
12238c2ecf20Sopenharmony_cistatic struct platform_driver lochnagar_pin_driver = {
12248c2ecf20Sopenharmony_ci	.driver = {
12258c2ecf20Sopenharmony_ci		.name = "lochnagar-pinctrl",
12268c2ecf20Sopenharmony_ci		.of_match_table = of_match_ptr(lochnagar_of_match),
12278c2ecf20Sopenharmony_ci	},
12288c2ecf20Sopenharmony_ci
12298c2ecf20Sopenharmony_ci	.probe = lochnagar_pin_probe,
12308c2ecf20Sopenharmony_ci};
12318c2ecf20Sopenharmony_cimodule_platform_driver(lochnagar_pin_driver);
12328c2ecf20Sopenharmony_ci
12338c2ecf20Sopenharmony_ciMODULE_AUTHOR("Charles Keepax <ckeepax@opensource.cirrus.com>");
12348c2ecf20Sopenharmony_ciMODULE_DESCRIPTION("Pinctrl driver for Cirrus Logic Lochnagar Board");
12358c2ecf20Sopenharmony_ciMODULE_LICENSE("GPL v2");
1236