// SPDX-License-Identifier: GPL-2.0-only
/*
 * Pinctrl driver for the Mobileye EyeQ5 platform.
 *
 * The registers are located in a syscon region called OLB. There are two pin
 * banks, each being controlled by 5 registers (see enum eq5p_regs) for
 * pull-down, pull-up, drive strength and muxing.
 *
 * For each pin, muxing is between two functions: (0) GPIO or (1) another one
 * that is pin-dependent. Functions are declared statically in this driver.
 *
 * We create pinctrl groups that are 1:1 equivalent to pins: each group has a
 * single pin, and its index/selector is the pin number.
 *
 * We use eq5p_ as prefix, as-in "EyeQ5 Pinctrl", but way shorter.
 *
 * Copyright (C) 2024 Mobileye Vision Technologies Ltd.
 */

#include <linux/array_size.h>
#include <linux/auxiliary_bus.h>
#include <linux/bits.h>
#include <linux/bug.h>
#include <linux/device.h>
#include <linux/err.h>
#include <linux/errno.h>
#include <linux/io.h>
#include <linux/mod_devicetable.h>
#include <linux/of.h>
#include <linux/seq_file.h>
#include <linux/slab.h>
#include <linux/types.h>

#include <linux/pinctrl/pinconf-generic.h>
#include <linux/pinctrl/pinconf.h>
#include <linux/pinctrl/pinctrl.h>
#include <linux/pinctrl/pinmux.h>

#include "core.h"
#include "pinctrl-utils.h"

enum eq5p_regs {
	EQ5P_PD,
	EQ5P_PU,
	EQ5P_DS_LOW,
	EQ5P_DS_HIGH,
	EQ5P_IOCR,

	EQ5P_REG_COUNT,
};

struct eq5p_bank {
	const unsigned int npins;
	const unsigned int regs[EQ5P_REG_COUNT];
};

struct eq5p_match_data {
	const unsigned int npins;
	const unsigned int nfunctions;
	const unsigned int nbanks;
	const struct pinctrl_pin_desc *pins;
	const struct pinfunction *functions;
	const struct eq5p_bank *banks;
};

struct eq5p_pinctrl {
	struct pinctrl_desc		desc;
	void __iomem			*base;
	const struct eq5p_match_data	*data;
};

/*
 * Drive strength; two bits per pin.
 */
#define EQ5P_DS_MASK	GENMASK(1, 0)

/*
 * The GPIO function is always the first function
 */
#define EQ5P_GPIO_FUNC_SELECTOR 0

/* Helper to declare pinfunction */
#define EQ5P_PINFUNCTION(func, groups) PINCTRL_PINFUNCTION(func, groups, ARRAY_SIZE(groups))

/*
 * Comments to the right of each pin are the "signal name" in the datasheet.
 */
static const struct pinctrl_pin_desc eq5p_eyeq5_pins[] = {
	/* Bank A */
	PINCTRL_PIN(0,  "PA0"),  /* A0_TIMER0_CK */
	PINCTRL_PIN(1,  "PA1"),  /* A1_TIMER0_EOC */
	PINCTRL_PIN(2,  "PA2"),  /* A2_TIMER1_CK */
	PINCTRL_PIN(3,  "PA3"),  /* A3_TIMER1_EOC */
	PINCTRL_PIN(4,  "PA4"),  /* A4_TIMER2_CK */
	PINCTRL_PIN(5,  "PA5"),  /* A5_TIMER2_EOC */
	PINCTRL_PIN(6,  "PA6"),  /* A6_TIMER5_EXT_INCAP1 */
	PINCTRL_PIN(7,  "PA7"),  /* A7_TIMER5_EXT_INCAP2 */
	PINCTRL_PIN(8,  "PA8"),  /* A8_TIMER5_EXT_OUTCMP1 */
	PINCTRL_PIN(9,  "PA9"),  /* A9_TIMER5_EXT_OUTCMP2 */
	PINCTRL_PIN(10, "PA10"), /* A10_UART_0_TX */
	PINCTRL_PIN(11, "PA11"), /* A11_UART_0_RX */
	PINCTRL_PIN(12, "PA12"), /* A12_UART_1_TX */
	PINCTRL_PIN(13, "PA13"), /* A13_UART_1_RX */
	PINCTRL_PIN(14, "PA14"), /* A14_CAN_0_TX */
	PINCTRL_PIN(15, "PA15"), /* A15_CAN_0_RX */
	PINCTRL_PIN(16, "PA16"), /* A16_CAN_1_TX */
	PINCTRL_PIN(17, "PA17"), /* A17_CAN_1_RX */
	PINCTRL_PIN(18, "PA18"), /* A18_SPI_0_DO */
	PINCTRL_PIN(19, "PA19"), /* A19_SPI_0_DI */
	PINCTRL_PIN(20, "PA20"), /* A20_SPI_0_CK */
	PINCTRL_PIN(21, "PA21"), /* A21_SPI_0_CS0 */
	PINCTRL_PIN(22, "PA22"), /* A22_SPI_0_CS1 */
	PINCTRL_PIN(23, "PA23"), /* A23_SPI_1_DO */
	PINCTRL_PIN(24, "PA24"), /* A24_SPI_1_DI */
	PINCTRL_PIN(25, "PA25"), /* A25_SPI_1_CK */
	PINCTRL_PIN(26, "PA26"), /* A26_SPI_1_CS0 */
	PINCTRL_PIN(27, "PA27"), /* A27_SPI_1_CS1 */
	PINCTRL_PIN(28, "PA28"), /* A28_REF_CLK0 */

#define EQ5P_EYEQ5_PIN_OFFSET_BANK_B	29

	/* Bank B */
	PINCTRL_PIN(EQ5P_EYEQ5_PIN_OFFSET_BANK_B + 0,  "PB0"),  /* B0_TIMER3_CK */
	PINCTRL_PIN(EQ5P_EYEQ5_PIN_OFFSET_BANK_B + 1,  "PB1"),  /* B1_TIMER3_EOC */
	PINCTRL_PIN(EQ5P_EYEQ5_PIN_OFFSET_BANK_B + 2,  "PB2"),  /* B2_TIMER4_CK */
	PINCTRL_PIN(EQ5P_EYEQ5_PIN_OFFSET_BANK_B + 3,  "PB3"),  /* B3_TIMER4_EOC */
	PINCTRL_PIN(EQ5P_EYEQ5_PIN_OFFSET_BANK_B + 4,  "PB4"),  /* B4_TIMER6_EXT_INCAP1 */
	PINCTRL_PIN(EQ5P_EYEQ5_PIN_OFFSET_BANK_B + 5,  "PB5"),  /* B5_TIMER6_EXT_INCAP2 */
	PINCTRL_PIN(EQ5P_EYEQ5_PIN_OFFSET_BANK_B + 6,  "PB6"),  /* B6_TIMER6_EXT_OUTCMP1 */
	PINCTRL_PIN(EQ5P_EYEQ5_PIN_OFFSET_BANK_B + 7,  "PB7"),  /* B7_TIMER6_EXT_OUTCMP2 */
	PINCTRL_PIN(EQ5P_EYEQ5_PIN_OFFSET_BANK_B + 8,  "PB8"),  /* B8_UART_2_TX */
	PINCTRL_PIN(EQ5P_EYEQ5_PIN_OFFSET_BANK_B + 9,  "PB9"),  /* B9_UART_2_RX */
	PINCTRL_PIN(EQ5P_EYEQ5_PIN_OFFSET_BANK_B + 10, "PB10"), /* B10_CAN_2_TX */
	PINCTRL_PIN(EQ5P_EYEQ5_PIN_OFFSET_BANK_B + 11, "PB11"), /* B11_CAN_2_RX */
	PINCTRL_PIN(EQ5P_EYEQ5_PIN_OFFSET_BANK_B + 12, "PB12"), /* B12_SPI_2_DO */
	PINCTRL_PIN(EQ5P_EYEQ5_PIN_OFFSET_BANK_B + 13, "PB13"), /* B13_SPI_2_DI */
	PINCTRL_PIN(EQ5P_EYEQ5_PIN_OFFSET_BANK_B + 14, "PB14"), /* B14_SPI_2_CK */
	PINCTRL_PIN(EQ5P_EYEQ5_PIN_OFFSET_BANK_B + 15, "PB15"), /* B15_SPI_2_CS0 */
	PINCTRL_PIN(EQ5P_EYEQ5_PIN_OFFSET_BANK_B + 16, "PB16"), /* B16_SPI_2_CS1 */
	PINCTRL_PIN(EQ5P_EYEQ5_PIN_OFFSET_BANK_B + 17, "PB17"), /* B17_SPI_3_DO */
	PINCTRL_PIN(EQ5P_EYEQ5_PIN_OFFSET_BANK_B + 18, "PB18"), /* B18_SPI_3_DI */
	PINCTRL_PIN(EQ5P_EYEQ5_PIN_OFFSET_BANK_B + 19, "PB19"), /* B19_SPI_3_CK */
	PINCTRL_PIN(EQ5P_EYEQ5_PIN_OFFSET_BANK_B + 20, "PB20"), /* B20_SPI_3_CS0 */
	PINCTRL_PIN(EQ5P_EYEQ5_PIN_OFFSET_BANK_B + 21, "PB21"), /* B21_SPI_3_CS1 */
	PINCTRL_PIN(EQ5P_EYEQ5_PIN_OFFSET_BANK_B + 22, "PB22"), /* B22_MCLK0 */
};

static const char * const eq5p_eyeq5_gpio_groups[] = {
	/* Bank A */
	"PA0",  "PA1",  "PA2",  "PA3",  "PA4",  "PA5",  "PA6",  "PA7",
	"PA8",  "PA9",  "PA10", "PA11", "PA12", "PA13", "PA14", "PA15",
	"PA16", "PA17", "PA18", "PA19", "PA20", "PA21", "PA22", "PA23",
	"PA24", "PA25", "PA26", "PA27", "PA28",

	/* Bank B */
	"PB0",  "PB1",  "PB2",  "PB3",  "PB4",  "PB5",  "PB6",  "PB7",
	"PB8",  "PB9",  "PB10", "PB11", "PB12", "PB13", "PB14", "PB15",
	"PB16", "PB17", "PB18", "PB19", "PB20", "PB21", "PB22",
};

/* Groups of functions on bank A */
static const char * const eq5p_eyeq5_timer0_groups[] = { "PA0", "PA1" };
static const char * const eq5p_eyeq5_timer1_groups[] = { "PA2", "PA3" };
static const char * const eq5p_eyeq5_timer2_groups[] = { "PA4", "PA5" };
static const char * const eq5p_eyeq5_timer5_groups[] = { "PA6", "PA7", "PA8", "PA9" };
static const char * const eq5p_eyeq5_uart0_groups[] = { "PA10", "PA11" };
static const char * const eq5p_eyeq5_uart1_groups[] = { "PA12", "PA13" };
static const char * const eq5p_eyeq5_can0_groups[] = { "PA14", "PA15" };
static const char * const eq5p_eyeq5_can1_groups[] = { "PA16", "PA17" };
static const char * const eq5p_eyeq5_spi0_groups[] = { "PA18", "PA19", "PA20", "PA21", "PA22" };
static const char * const eq5p_eyeq5_spi1_groups[] = { "PA23", "PA24", "PA25", "PA26", "PA27" };
static const char * const eq5p_eyeq5_refclk0_groups[] = { "PA28" };

/* Groups of functions on bank B */
static const char * const eq5p_eyeq5_timer3_groups[] = { "PB0", "PB1" };
static const char * const eq5p_eyeq5_timer4_groups[] = { "PB2", "PB3" };
static const char * const eq5p_eyeq5_timer6_groups[] = { "PB4", "PB5", "PB6", "PB7" };
static const char * const eq5p_eyeq5_uart2_groups[] = { "PB8", "PB9" };
static const char * const eq5p_eyeq5_can2_groups[] = { "PB10", "PB11" };
static const char * const eq5p_eyeq5_spi2_groups[] = { "PB12", "PB13", "PB14", "PB15", "PB16" };
static const char * const eq5p_eyeq5_spi3_groups[] = { "PB17", "PB18", "PB19", "PB20", "PB21" };
static const char * const eq5p_eyeq5_mclk0_groups[] = { "PB22" };

static const struct pinfunction eq5p_eyeq5_functions[] = {
	/* GPIO having a fixed index is depended upon, see EQ5P_GPIO_FUNC_SELECTOR. */
	EQ5P_PINFUNCTION("gpio", eq5p_eyeq5_gpio_groups),

	/* Bank A functions */
	EQ5P_PINFUNCTION("timer0", eq5p_eyeq5_timer0_groups),
	EQ5P_PINFUNCTION("timer1", eq5p_eyeq5_timer1_groups),
	EQ5P_PINFUNCTION("timer2", eq5p_eyeq5_timer2_groups),
	EQ5P_PINFUNCTION("timer5", eq5p_eyeq5_timer5_groups),
	EQ5P_PINFUNCTION("uart0", eq5p_eyeq5_uart0_groups),
	EQ5P_PINFUNCTION("uart1", eq5p_eyeq5_uart1_groups),
	EQ5P_PINFUNCTION("can0", eq5p_eyeq5_can0_groups),
	EQ5P_PINFUNCTION("can1", eq5p_eyeq5_can1_groups),
	EQ5P_PINFUNCTION("spi0", eq5p_eyeq5_spi0_groups),
	EQ5P_PINFUNCTION("spi1", eq5p_eyeq5_spi1_groups),
	EQ5P_PINFUNCTION("refclk0", eq5p_eyeq5_refclk0_groups),

	/* Bank B functions */
	EQ5P_PINFUNCTION("timer3", eq5p_eyeq5_timer3_groups),
	EQ5P_PINFUNCTION("timer4", eq5p_eyeq5_timer4_groups),
	EQ5P_PINFUNCTION("timer6", eq5p_eyeq5_timer6_groups),
	EQ5P_PINFUNCTION("uart2", eq5p_eyeq5_uart2_groups),
	EQ5P_PINFUNCTION("can2", eq5p_eyeq5_can2_groups),
	EQ5P_PINFUNCTION("spi2", eq5p_eyeq5_spi2_groups),
	EQ5P_PINFUNCTION("spi3", eq5p_eyeq5_spi3_groups),
	EQ5P_PINFUNCTION("mclk0", eq5p_eyeq5_mclk0_groups),
};

static const struct eq5p_bank eq5p_eyeq5_banks[] = {
	{
		.npins = EQ5P_EYEQ5_PIN_OFFSET_BANK_B,
		.regs = {0x0C0, 0x0C4, 0x0D0, 0x0D4, 0x0B0},
	},
	{
		.npins = ARRAY_SIZE(eq5p_eyeq5_pins) - EQ5P_EYEQ5_PIN_OFFSET_BANK_B,
		.regs = {0x0C8, 0x0CC, 0x0D8, 0x0DC, 0x0B4},
	},
};

static const struct eq5p_match_data eq5p_eyeq5_data = {
	.npins = ARRAY_SIZE(eq5p_eyeq5_pins),
	.nfunctions = ARRAY_SIZE(eq5p_eyeq5_functions),
	.nbanks = ARRAY_SIZE(eq5p_eyeq5_banks),
	.pins = eq5p_eyeq5_pins,
	.functions = eq5p_eyeq5_functions,
	.banks = eq5p_eyeq5_banks,
};

static const struct pinctrl_pin_desc eq5p_eyeq6lplus_pins[] = {
	PINCTRL_PIN(0,  "PA0"),  /* GPIO_A0_TIMER0_CK0 */
	PINCTRL_PIN(1,  "PA1"),  /* GPIO_A1_TIMER0_EOC */
	PINCTRL_PIN(2,  "PA2"),  /* GPIO_A2_TIMER1_CK */
	PINCTRL_PIN(3,  "PA3"),  /* GPIO_A3_TIMER1_EOC1 */
	PINCTRL_PIN(4,  "PA4"),  /* GPIO_A4_SSI_UART_RX */
	PINCTRL_PIN(5,  "PA5"),  /* GPIO_A5_SSI_UART_TX */
	PINCTRL_PIN(6,  "PA6"),  /* GPIO_A6_SPI_0_CS */
	PINCTRL_PIN(7,  "PA7"),  /* GPIO_A7_SPI_0_DI */
	PINCTRL_PIN(8,  "PA8"),  /* GPIO_A8_SPI_0_CK */
	PINCTRL_PIN(9,  "PA9"),  /* GPIO_A9_SPI_0_DO */
	PINCTRL_PIN(10, "PA10"), /* GPIO_A10_SPI_0_CS1 */
	PINCTRL_PIN(11, "PA11"), /* GPIO_A11_UART_0_RX */
	PINCTRL_PIN(12, "PA12"), /* GPIO_A12_UART_0_TX */
	PINCTRL_PIN(13, "PA13"), /* GPIO_A13_TIMER2_CK */
	PINCTRL_PIN(14, "PA14"), /* GPIO_A14_TIMER2_EOC */
	PINCTRL_PIN(15, "PA15"), /* GPIO_A15_TIMER3_CK */
	PINCTRL_PIN(16, "PA16"), /* GPIO_A16_TIMER_EOC */
	PINCTRL_PIN(17, "PA17"), /* GPIO_A17_TIMER_EXT0_INCA P1 */
	PINCTRL_PIN(18, "PA18"), /* GPIO_A18_TIMER_EXT0_INCA P2 */
	PINCTRL_PIN(19, "PA19"), /* GPIO_A19_TIMER_EXT0_OUT CMP1 */
	PINCTRL_PIN(20, "PA20"), /* GPIO_A20_TIMER_EXT0_OUT CMP2 */
	PINCTRL_PIN(21, "PA21"), /* GPIO_A21_SPI_1_CS0 */
	PINCTRL_PIN(22, "PA22"), /* GPIO_A22_SPI_1_DI */
	PINCTRL_PIN(23, "PA23"), /* GPIO_A23_SPI_1_CK */
	PINCTRL_PIN(24, "PA24"), /* GPIO_A24_SPI_1_DO */
	PINCTRL_PIN(25, "PA25"), /* GPIO_A25_SPI_1_CS1 */
	PINCTRL_PIN(26, "PA26"), /* GPIO_A26_TIMER_EXT1_INCA P1 */
	PINCTRL_PIN(27, "PA27"), /* GPIO_A27_TIMER_EXT1_INCA P2 */
	PINCTRL_PIN(28, "PA28"), /* GPIO_A28_TIMER_EXT1_OUTC MP1 */
	PINCTRL_PIN(29, "PA29"), /* GPIO_A29_TIMER_EXT1_OUTC MP2 */
	PINCTRL_PIN(30, "PA30"), /* GPIO_A30_EXT_CLK */
	PINCTRL_PIN(31, "PA31"), /* GPIO_A31_VDI_MCLK */
};

static const char * const eq5p_eyeq6lplus_gpio_groups[] = {
	/* Bank A */
	"PA0",  "PA1",  "PA2",  "PA3",  "PA4",  "PA5",  "PA6",  "PA7",
	"PA8",  "PA9",  "PA10", "PA11", "PA12", "PA13", "PA14", "PA15",
	"PA16", "PA17", "PA18", "PA19", "PA20", "PA21", "PA22", "PA23",
	"PA24", "PA25", "PA26", "PA27", "PA28", "PA29", "PA30", "PA31",
};

/* Groups of functions on bank A */
static const char * const eq5p_eyeq6lplus_timer0_groups[] = { "PA0", "PA1" };
static const char * const eq5p_eyeq6lplus_timer1_groups[] = { "PA2", "PA3" };
static const char * const eq5p_eyeq6lplus_uart_ssi_groups[] = { "PA4", "PA5" };
static const char * const eq5p_eyeq6lplus_spi0_groups[] = { "PA6", "PA7", "PA8", "PA9", "PA10" };
static const char * const eq5p_eyeq6lplus_uart0_groups[] = { "PA11", "PA12" };
static const char * const eq5p_eyeq6lplus_timer2_groups[] = { "PA13", "PA14" };
static const char * const eq5p_eyeq6lplus_timer3_groups[] = { "PA15", "PA16" };
static const char * const eq5p_eyeq6lplus_timer_ext0_groups[] = { "PA17", "PA18", "PA19", "PA20" };
static const char * const eq5p_eyeq6lplus_spi1_groups[] = {
	"PA21", "PA22", "PA23", "PA24", "PA25"
};
static const char * const eq5p_eyeq6lplus_timer_ext1_groups[] = { "PA26", "PA27", "PA28", "PA29" };
static const char * const eq5p_eyeq6lplus_ext_ref_clk_groups[] = { "PA30" };
static const char * const eq5p_eyeq6lplus_mipi_ref_clk_groups[] = { "PA31" };

static const struct pinfunction eq5p_eyeq6lplus_functions[] = {
	/* gpios function */
	EQ5P_PINFUNCTION("gpio", eq5p_eyeq6lplus_gpio_groups),

	/* Bank A alternate functions */
	EQ5P_PINFUNCTION("timer0", eq5p_eyeq6lplus_timer0_groups),
	EQ5P_PINFUNCTION("timer1", eq5p_eyeq6lplus_timer1_groups),
	EQ5P_PINFUNCTION("uart_ssi", eq5p_eyeq6lplus_uart_ssi_groups),
	EQ5P_PINFUNCTION("spi0", eq5p_eyeq6lplus_spi0_groups),
	EQ5P_PINFUNCTION("uart0", eq5p_eyeq6lplus_uart0_groups),
	EQ5P_PINFUNCTION("timer2", eq5p_eyeq6lplus_timer2_groups),
	EQ5P_PINFUNCTION("timer3", eq5p_eyeq6lplus_timer3_groups),
	EQ5P_PINFUNCTION("timer_ext0", eq5p_eyeq6lplus_timer_ext0_groups),
	EQ5P_PINFUNCTION("spi1", eq5p_eyeq6lplus_spi1_groups),
	EQ5P_PINFUNCTION("timer_ext1", eq5p_eyeq6lplus_timer_ext1_groups),
	EQ5P_PINFUNCTION("ext_ref_clk", eq5p_eyeq6lplus_ext_ref_clk_groups),
	EQ5P_PINFUNCTION("mipi_ref_clk", eq5p_eyeq6lplus_mipi_ref_clk_groups),
};

static const struct eq5p_bank eq5p_eyeq6lplus_banks[] = {
	{
		.npins = ARRAY_SIZE(eq5p_eyeq6lplus_pins),
		.regs = {0x0C0, 0x0C4, 0x0D0, 0x0D4, 0x0B0},
	},
};

static const struct eq5p_match_data eq5p_eyeq6lplus_data = {
	.npins = ARRAY_SIZE(eq5p_eyeq6lplus_pins),
	.nfunctions = ARRAY_SIZE(eq5p_eyeq6lplus_functions),
	.nbanks = ARRAY_SIZE(eq5p_eyeq6lplus_banks),
	.pins = eq5p_eyeq6lplus_pins,
	.functions = eq5p_eyeq6lplus_functions,
	.banks = eq5p_eyeq6lplus_banks,
};

static void eq5p_update_bits(const struct eq5p_pinctrl *pctrl,
			     const struct eq5p_bank *bank,
			     enum eq5p_regs reg, u32 mask, u32 val)
{
	void __iomem *ptr = pctrl->base + bank->regs[reg];

	writel((readl(ptr) & ~mask) | (val & mask), ptr);
}

static bool eq5p_test_bit(const struct eq5p_pinctrl *pctrl,
			  const struct eq5p_bank *bank,
			  enum eq5p_regs reg, int offset)
{
	u32 val = readl(pctrl->base + bank->regs[reg]);

	if (WARN_ON(offset > 31))
		return false;

	return (val & BIT(offset)) != 0;
}

static int eq5p_pin_to_bank_offset(const struct eq5p_pinctrl *pctrl, unsigned int pin,
				   const struct eq5p_bank **bank, unsigned int *offset)
{
	for (unsigned int i = 0; i < pctrl->data->nbanks; i++) {
		const struct eq5p_bank *_bank = &pctrl->data->banks[i];
		unsigned int npins = _bank->npins;

		if (pin < npins) {
			*bank = _bank;
			*offset = pin;
			return 0;
		}
		pin -= npins;
	}

	return -EINVAL;
}

static int eq5p_pinctrl_get_groups_count(struct pinctrl_dev *pctldev)
{
	struct eq5p_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev);

	return pctrl->data->npins;
}

static const char *eq5p_pinctrl_get_group_name(struct pinctrl_dev *pctldev,
					       unsigned int selector)
{
	return pctldev->desc->pins[selector].name;
}

static int eq5p_pinctrl_get_group_pins(struct pinctrl_dev *pctldev,
				       unsigned int selector,
				       const unsigned int **pins,
				       unsigned int *num_pins)
{
	*pins = &pctldev->desc->pins[selector].number;
	*num_pins = 1;
	return 0;
}

static int eq5p_pinconf_get(struct pinctrl_dev *pctldev, unsigned int pin,
			    unsigned long *config)
{
	enum pin_config_param param = pinconf_to_config_param(*config);
	struct eq5p_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev);
	const struct eq5p_bank *bank;
	unsigned int offset;
	u32 val_ds, arg;
	bool pd, pu;
	int ret;

	ret = eq5p_pin_to_bank_offset(pctrl, pin, &bank, &offset);
	if (ret)
		return ret;

	pd = eq5p_test_bit(pctrl, bank, EQ5P_PD, offset);
	pu = eq5p_test_bit(pctrl, bank, EQ5P_PU, offset);

	switch (param) {
	case PIN_CONFIG_BIAS_DISABLE:
		arg = !(pd || pu);
		break;
	case PIN_CONFIG_BIAS_PULL_DOWN:
		arg = pd;
		break;
	case PIN_CONFIG_BIAS_PULL_UP:
		arg = pu;
		break;
	case PIN_CONFIG_DRIVE_STRENGTH:
		offset *= 2; /* two bits per pin */
		if (offset >= 32) {
			val_ds = readl(pctrl->base + bank->regs[EQ5P_DS_HIGH]);
			offset -= 32;
		} else {
			val_ds = readl(pctrl->base + bank->regs[EQ5P_DS_LOW]);
		}
		arg = (val_ds >> offset) & EQ5P_DS_MASK;
		break;
	default:
		return -ENOTSUPP;
	}

	*config = pinconf_to_config_packed(param, arg);
	return 0;
}

static void eq5p_pinctrl_pin_dbg_show(struct pinctrl_dev *pctldev,
				      struct seq_file *s,
				      unsigned int pin)
{
	struct eq5p_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev);
	const char *pin_name = pctrl->desc.pins[pin].name;
	const struct eq5p_bank *bank;
	const char *func_name, *bias;
	unsigned long ds_config;
	unsigned int offset;
	u32 drive_strength;
	bool pd, pu;
	int i, j;

	if (eq5p_pin_to_bank_offset(pctrl, pin, &bank, &offset)) {
		seq_puts(s, "unknown pin");
		return;
	}

	/*
	 * First, let's get the function name. All pins have only two functions:
	 * GPIO (IOCR == 0) and something else (IOCR == 1).
	 */
	if (eq5p_test_bit(pctrl, bank, EQ5P_IOCR, offset)) {
		func_name = NULL;
		for (i = 0; i < pctrl->data->nfunctions; i++) {
			if (i == EQ5P_GPIO_FUNC_SELECTOR)
				continue;

			for (j = 0; j < pctrl->data->functions[i].ngroups; j++) {
				/* Groups and pins are the same thing for us. */
				const char *x = pctrl->data->functions[i].groups[j];

				if (strcmp(x, pin_name) == 0) {
					func_name = pctrl->data->functions[i].name;
					break;
				}
			}

			if (func_name)
				break;
		}

		/*
		 * We have not found the function attached to this pin, this
		 * should never occur as all pins have exactly two functions.
		 */
		if (!func_name)
			func_name = "unknown";
	} else {
		func_name = pctrl->data->functions[EQ5P_GPIO_FUNC_SELECTOR].name;
	}

	/* Second, we retrieve the bias. */
	pd = eq5p_test_bit(pctrl, bank, EQ5P_PD, offset);
	pu = eq5p_test_bit(pctrl, bank, EQ5P_PU, offset);
	if (pd && pu)
		bias = "both";
	else if (pd && !pu)
		bias = "pulldown";
	else if (!pd && pu)
		bias = "pullup";
	else
		bias = "none";

	/* Third, we get the drive strength. */
	ds_config = pinconf_to_config_packed(PIN_CONFIG_DRIVE_STRENGTH, 0);
	eq5p_pinconf_get(pctldev, pin, &ds_config);
	drive_strength = pinconf_to_config_argument(ds_config);

	seq_printf(s, "function=%s bias=%s drive_strength=%d",
		   func_name, bias, drive_strength);
}

static const struct pinctrl_ops eq5p_pinctrl_ops = {
	.get_groups_count	= eq5p_pinctrl_get_groups_count,
	.get_group_name		= eq5p_pinctrl_get_group_name,
	.get_group_pins		= eq5p_pinctrl_get_group_pins,
	.pin_dbg_show		= eq5p_pinctrl_pin_dbg_show,
	.dt_node_to_map		= pinconf_generic_dt_node_to_map_pin,
	.dt_free_map		= pinctrl_utils_free_map,
};

static int eq5p_pinmux_get_functions_count(struct pinctrl_dev *pctldev)
{
	struct eq5p_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev);

	return pctrl->data->nfunctions;
}

static const char *eq5p_pinmux_get_function_name(struct pinctrl_dev *pctldev,
						 unsigned int selector)
{
	struct eq5p_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev);

	return pctrl->data->functions[selector].name;
}

static int eq5p_pinmux_get_function_groups(struct pinctrl_dev *pctldev,
					   unsigned int selector,
					   const char * const **groups,
					   unsigned int *num_groups)
{
	struct eq5p_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev);

	*groups = pctrl->data->functions[selector].groups;
	*num_groups = pctrl->data->functions[selector].ngroups;
	return 0;
}

static int eq5p_pinmux_set_mux(struct pinctrl_dev *pctldev,
			       unsigned int func_selector, unsigned int pin)
{
	struct eq5p_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev);
	const char *func_name = pctrl->data->functions[func_selector].name;
	const char *group_name = pctldev->desc->pins[pin].name;
	bool is_gpio = func_selector == EQ5P_GPIO_FUNC_SELECTOR;
	const struct eq5p_bank *bank;
	unsigned int offset;
	u32 mask, val;
	int ret;

	ret = eq5p_pin_to_bank_offset(pctrl, pin, &bank, &offset);
	if (ret)
		return ret;

	dev_dbg(pctldev->dev, "func=%s group=%s\n", func_name, group_name);

	mask = BIT(offset);
	val = is_gpio ? 0 : mask;
	eq5p_update_bits(pctrl, bank, EQ5P_IOCR, mask, val);
	return 0;
}

static int eq5p_pinmux_gpio_request_enable(struct pinctrl_dev *pctldev,
					   struct pinctrl_gpio_range *range,
					   unsigned int pin)
{
	/* Pin numbers and group selectors are the same thing in our case. */
	return eq5p_pinmux_set_mux(pctldev, EQ5P_GPIO_FUNC_SELECTOR, pin);
}

static const struct pinmux_ops eq5p_pinmux_ops = {
	.get_functions_count	= eq5p_pinmux_get_functions_count,
	.get_function_name	= eq5p_pinmux_get_function_name,
	.get_function_groups	= eq5p_pinmux_get_function_groups,
	.set_mux		= eq5p_pinmux_set_mux,
	.gpio_request_enable	= eq5p_pinmux_gpio_request_enable,
	.strict			= true,
};

static int eq5p_pinconf_set_drive_strength(struct pinctrl_dev *pctldev,
					   unsigned int pin, u32 arg)
{
	struct eq5p_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev);
	const struct eq5p_bank *bank;
	unsigned int offset;
	unsigned int reg;
	u32 mask, val;
	int ret;

	ret = eq5p_pin_to_bank_offset(pctrl, pin, &bank, &offset);
	if (ret)
		return ret;

	if (arg & ~EQ5P_DS_MASK) {
		dev_err(pctldev->dev, "Unsupported drive strength: %u\n", arg);
		return -EINVAL;
	}

	offset *= 2; /* two bits per pin */

	if (offset >= 32) {
		reg = EQ5P_DS_HIGH;
		offset -= 32;
	} else {
		reg = EQ5P_DS_LOW;
	}

	mask = EQ5P_DS_MASK << offset;
	val = arg << offset;
	eq5p_update_bits(pctrl, bank, reg, mask, val);
	return 0;
}

static int eq5p_pinconf_set(struct pinctrl_dev *pctldev, unsigned int pin,
			    unsigned long *configs, unsigned int num_configs)
{
	struct eq5p_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev);
	const char *pin_name = pctldev->desc->pins[pin].name;
	struct device *dev = pctldev->dev;
	const struct eq5p_bank *bank;
	unsigned int offset;
	unsigned int i;
	u32 val;
	int ret;

	ret = eq5p_pin_to_bank_offset(pctrl, pin, &bank, &offset);
	if (ret)
		return ret;

	val = BIT(offset);
	for (i = 0; i < num_configs; i++) {
		enum pin_config_param param = pinconf_to_config_param(configs[i]);
		u32 arg = pinconf_to_config_argument(configs[i]);

		switch (param) {
		case PIN_CONFIG_BIAS_DISABLE:
			dev_dbg(dev, "pin=%s bias_disable\n", pin_name);

			eq5p_update_bits(pctrl, bank, EQ5P_PD, val, 0);
			eq5p_update_bits(pctrl, bank, EQ5P_PU, val, 0);
			break;

		case PIN_CONFIG_BIAS_PULL_DOWN:
			dev_dbg(dev, "pin=%s bias_pull_down arg=%u\n",
				pin_name, arg);

			if (arg == 0) /* cannot connect to GND */
				return -ENOTSUPP;

			eq5p_update_bits(pctrl, bank, EQ5P_PD, val, val);
			eq5p_update_bits(pctrl, bank, EQ5P_PU, val, 0);
			break;

		case PIN_CONFIG_BIAS_PULL_UP:
			dev_dbg(dev, "pin=%s bias_pull_up arg=%u\n",
				pin_name, arg);

			if (arg == 0) /* cannot connect to VDD */
				return -ENOTSUPP;

			eq5p_update_bits(pctrl, bank, EQ5P_PD, val, 0);
			eq5p_update_bits(pctrl, bank, EQ5P_PU, val, val);
			break;

		case PIN_CONFIG_DRIVE_STRENGTH:
			dev_dbg(dev, "pin=%s drive_strength arg=%u\n",
				pin_name, arg);

			eq5p_pinconf_set_drive_strength(pctldev, pin, arg);
			break;

		default:
			dev_err(dev, "Unsupported pinconf %u\n", param);
			return -ENOTSUPP;
		}
	}

	return 0;
}

static const struct pinconf_ops eq5p_pinconf_ops = {
	.is_generic = true,
	.pin_config_get = eq5p_pinconf_get,
	.pin_config_set = eq5p_pinconf_set,
	/* Pins and groups are equivalent in this driver. */
	.pin_config_group_get = eq5p_pinconf_get,
	.pin_config_group_set = eq5p_pinconf_set,
};

static int eq5p_probe(struct auxiliary_device *adev,
		      const struct auxiliary_device_id *id)
{
	const struct of_device_id *match;
	struct device *dev = &adev->dev;
	struct pinctrl_dev *pctldev;
	struct eq5p_pinctrl *pctrl;
	int ret;

	/* Get match data based on parent OF node set in clk-eyeq */
	match = of_match_node(dev->driver->of_match_table, dev->of_node);
	if (!match || !match->data)
		return -ENODEV;

	pctrl = devm_kzalloc(dev, sizeof(*pctrl), GFP_KERNEL);
	if (!pctrl)
		return -ENOMEM;

	pctrl->base = (void __iomem *)dev_get_platdata(dev);
	pctrl->data = match->data;
	pctrl->desc.name = dev_name(dev);
	pctrl->desc.pins = pctrl->data->pins;
	pctrl->desc.npins = pctrl->data->npins;
	pctrl->desc.pctlops = &eq5p_pinctrl_ops;
	pctrl->desc.pmxops = &eq5p_pinmux_ops;
	pctrl->desc.confops = &eq5p_pinconf_ops;
	pctrl->desc.owner = THIS_MODULE;

	ret = devm_pinctrl_register_and_init(dev, &pctrl->desc, pctrl, &pctldev);
	if (ret)
		return dev_err_probe(dev, ret, "failed registering pinctrl device\n");

	ret = pinctrl_enable(pctldev);
	if (ret)
		return dev_err_probe(dev, ret, "failed enabling pinctrl device\n");

	return 0;
}

static const struct of_device_id eq5p_match_table[] = {
	{ .compatible = "mobileye,eyeq5-olb", .data = &eq5p_eyeq5_data },
	{ .compatible = "mobileye,eyeq6lplus-olb", .data = &eq5p_eyeq6lplus_data },
	{}
};
MODULE_DEVICE_TABLE(of, eq5p_match_table);

static const struct auxiliary_device_id eq5p_id_table[] = {
	{ .name = "clk_eyeq.pinctrl" },
	{}
};
MODULE_DEVICE_TABLE(auxiliary, eq5p_id_table);

static struct auxiliary_driver eq5p_driver = {
	.probe = eq5p_probe,
	.id_table = eq5p_id_table,
	.driver = {
		.of_match_table = eq5p_match_table,
	}
};
module_auxiliary_driver(eq5p_driver);
