// SPDX-License-Identifier: (GPL-2.0 OR MIT)
/*
 * Microsemi SoCs pinctrl driver
 *
 * Author: <gregory.clement@bootlin.com>
 * License: Dual MIT/GPL
 * Copyright (c) 2018 Microsemi Corporation
 */

#include <common.h>
#include <config.h>
#include <dm.h>
#include <dm/device-internal.h>
#include <dm/lists.h>
#include <dm/pinctrl.h>
#include <dm/root.h>
#include <errno.h>
#include <fdtdec.h>
#include <linux/io.h>
#include <asm/gpio.h>
#include <asm/system.h>
#include "mscc-common.h"

enum {
	FUNC_NONE,
	FUNC_GPIO,
	FUNC_SIO,
	FUNC_TACHO,
	FUNC_TWI,
	FUNC_PHY_LED,
	FUNC_EXT_IRQ,
	FUNC_SFP,
	FUNC_SI,
	FUNC_PWM,
	FUNC_UART,
	FUNC_MAX
};

static char * const luton_function_names[] = {
	[FUNC_NONE]		= "none",
	[FUNC_GPIO]		= "gpio",
	[FUNC_SIO]		= "sio",
	[FUNC_TACHO]		= "tacho",
	[FUNC_TWI]		= "twi",
	[FUNC_PHY_LED]		= "phy_led",
	[FUNC_EXT_IRQ]		= "ext_irq",
	[FUNC_SFP]		= "sfp",
	[FUNC_SI]		= "si",
	[FUNC_PWM]		= "pwm",
	[FUNC_UART]		= "uart",
};

MSCC_P(0,  SIO,       NONE,      NONE);
MSCC_P(1,  SIO,       NONE,      NONE);
MSCC_P(2,  SIO,       NONE,      NONE);
MSCC_P(3,  SIO,       NONE,      NONE);
MSCC_P(4,  TACHO,     NONE,      NONE);
MSCC_P(5,  TWI,       PHY_LED,   NONE);
MSCC_P(6,  TWI,       PHY_LED,   NONE);
MSCC_P(7,  NONE,      PHY_LED,   NONE);
MSCC_P(8,  EXT_IRQ,   PHY_LED,   NONE);
MSCC_P(9,  EXT_IRQ,   PHY_LED,   NONE);
MSCC_P(10, SFP,       PHY_LED,   NONE);
MSCC_P(11, SFP,       PHY_LED,   NONE);
MSCC_P(12, SFP,       PHY_LED,   NONE);
MSCC_P(13, SFP,       PHY_LED,   NONE);
MSCC_P(14, SI,        PHY_LED,   NONE);
MSCC_P(15, SI,        PHY_LED,   NONE);
MSCC_P(16, SI,        PHY_LED,   NONE);
MSCC_P(17, SFP,       PHY_LED,   NONE);
MSCC_P(18, SFP,       PHY_LED,   NONE);
MSCC_P(19, SFP,       PHY_LED,   NONE);
MSCC_P(20, SFP,       PHY_LED,   NONE);
MSCC_P(21, SFP,       PHY_LED,   NONE);
MSCC_P(22, SFP,       PHY_LED,   NONE);
MSCC_P(23, SFP,       PHY_LED,   NONE);
MSCC_P(24, SFP,       PHY_LED,   NONE);
MSCC_P(25, SFP,       PHY_LED,   NONE);
MSCC_P(26, SFP,       PHY_LED,   NONE);
MSCC_P(27, SFP,       PHY_LED,   NONE);
MSCC_P(28, SFP,       PHY_LED,   NONE);
MSCC_P(29, PWM,       NONE,      NONE);
MSCC_P(30, UART,      NONE,      NONE);
MSCC_P(31, UART,      NONE,      NONE);

#define LUTON_PIN(n) {						\
	.name = "GPIO_"#n,					\
	.drv_data = &mscc_pin_##n				\
}

static const struct mscc_pin_data luton_pins[] = {
	LUTON_PIN(0),
	LUTON_PIN(1),
	LUTON_PIN(2),
	LUTON_PIN(3),
	LUTON_PIN(4),
	LUTON_PIN(5),
	LUTON_PIN(6),
	LUTON_PIN(7),
	LUTON_PIN(8),
	LUTON_PIN(9),
	LUTON_PIN(10),
	LUTON_PIN(11),
	LUTON_PIN(12),
	LUTON_PIN(13),
	LUTON_PIN(14),
	LUTON_PIN(15),
	LUTON_PIN(16),
	LUTON_PIN(17),
	LUTON_PIN(18),
	LUTON_PIN(19),
	LUTON_PIN(20),
	LUTON_PIN(21),
	LUTON_PIN(22),
	LUTON_PIN(23),
	LUTON_PIN(24),
	LUTON_PIN(25),
	LUTON_PIN(26),
	LUTON_PIN(27),
	LUTON_PIN(28),
	LUTON_PIN(29),
	LUTON_PIN(30),
	LUTON_PIN(31),
};

static int luton_gpio_probe(struct udevice *dev)
{
	struct gpio_dev_priv *uc_priv;

	uc_priv = dev_get_uclass_priv(dev);
	uc_priv->bank_name = "luton-gpio";
	uc_priv->gpio_count = ARRAY_SIZE(luton_pins);

	return 0;
}

static struct driver luton_gpio_driver = {
	.name	= "luton-gpio",
	.id	= UCLASS_GPIO,
	.probe	= luton_gpio_probe,
	.ops	= &mscc_gpio_ops,
};

int luton_pinctrl_probe(struct udevice *dev)
{
	int ret;

	ret = mscc_pinctrl_probe(dev, FUNC_MAX, luton_pins,
				 ARRAY_SIZE(luton_pins), luton_function_names);

	if (ret)
		return ret;

	ret = device_bind(dev, &luton_gpio_driver, "luton-gpio", NULL,
			  dev_of_offset(dev), NULL);

	return 0;
}

static const struct udevice_id luton_pinctrl_of_match[] = {
	{.compatible = "mscc,luton-pinctrl"},
	{},
};

U_BOOT_DRIVER(luton_pinctrl) = {
	.name = "luton-pinctrl",
	.id = UCLASS_PINCTRL,
	.of_match = of_match_ptr(luton_pinctrl_of_match),
	.probe = luton_pinctrl_probe,
	.priv_auto_alloc_size = sizeof(struct mscc_pinctrl),
	.ops = &mscc_pinctrl_ops,
};
