Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a373ed0a authored by Laurent Pinchart's avatar Laurent Pinchart
Browse files

sh-pfc: Split pins and functions definition tables



Split the GPIOs table into a pins table for real GPIOs and a functions
table for function GPIOs.

Only register pins with the pinctrl core. The function GPIOs remain
accessible as GPIOs.

Signed-off-by: default avatarLaurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
Acked-by: default avatarLinus Walleij <linus.walleij@linaro.org>
parent 24d6b36e
Loading
Loading
Loading
Loading
+13 −8
Original line number Diff line number Diff line
@@ -92,13 +92,14 @@ static int sh_pfc_enum_in_range(pinmux_enum_t enum_id, struct pinmux_range *r)
static bool sh_pfc_gpio_is_pin(struct sh_pfc *pfc, unsigned int gpio)
{
	return (gpio < pfc->info->nr_pins) &&
	       (pfc->info->gpios[gpio].enum_id != 0);
	       (pfc->info->pins[gpio].enum_id != 0);
}

bool sh_pfc_gpio_is_function(struct sh_pfc *pfc, unsigned int gpio)
{
	return (gpio >= pfc->info->nr_pins) && (gpio < pfc->info->nr_gpios) &&
	       (pfc->info->gpios[gpio].enum_id != 0);
	return (gpio >= pfc->info->nr_pins) &&
	       (gpio < pfc->info->nr_pins + pfc->info->nr_func_gpios) &&
	       (pfc->info->func_gpios[gpio - pfc->info->nr_pins].enum_id != 0);
}

static unsigned long sh_pfc_read_raw_reg(void __iomem *mapped_reg,
@@ -234,7 +235,7 @@ static void sh_pfc_write_config_reg(struct sh_pfc *pfc,

static int sh_pfc_setup_data_reg(struct sh_pfc *pfc, unsigned gpio)
{
	struct pinmux_gpio *gpiop = &pfc->info->gpios[gpio];
	struct pinmux_pin *gpiop = &pfc->info->pins[gpio];
	struct pinmux_data_reg *data_reg;
	int k, n;

@@ -291,7 +292,7 @@ static void sh_pfc_setup_data_regs(struct sh_pfc *pfc)
int sh_pfc_get_data_reg(struct sh_pfc *pfc, unsigned gpio,
			struct pinmux_data_reg **drp, int *bitp)
{
	struct pinmux_gpio *gpiop = &pfc->info->gpios[gpio];
	struct pinmux_pin *gpiop = &pfc->info->pins[gpio];
	int k, n;

	if (!sh_pfc_gpio_is_pin(pfc, gpio))
@@ -352,12 +353,16 @@ static int sh_pfc_get_config_reg(struct sh_pfc *pfc, pinmux_enum_t enum_id,
int sh_pfc_gpio_to_enum(struct sh_pfc *pfc, unsigned gpio, int pos,
			pinmux_enum_t *enum_idp)
{
	pinmux_enum_t enum_id = pfc->info->gpios[gpio].enum_id;
	pinmux_enum_t *data = pfc->info->gpio_data;
	pinmux_enum_t enum_id;
	int k;

	if (!sh_pfc_gpio_is_pin(pfc, gpio) &&
	    !sh_pfc_gpio_is_function(pfc, gpio)) {
	if (sh_pfc_gpio_is_pin(pfc, gpio)) {
		enum_id = pfc->info->pins[gpio].enum_id;
	} else if (sh_pfc_gpio_is_function(pfc, gpio)) {
		unsigned int offset = gpio - pfc->info->nr_pins;
		enum_id = pfc->info->func_gpios[offset].enum_id;
	} else {
		pr_err("non data/mark enum_id for gpio %d\n", gpio);
		return -1;
	}
+3 −2
Original line number Diff line number Diff line
@@ -183,7 +183,7 @@ static void sh_pfc_gpio_setup(struct sh_pfc_chip *chip)
	gc->label = pfc->info->name;
	gc->owner = THIS_MODULE;
	gc->base = 0;
	gc->ngpio = pfc->info->nr_gpios;
	gc->ngpio = pfc->info->nr_pins + pfc->info->nr_func_gpios;
}

int sh_pfc_register_gpiochip(struct sh_pfc *pfc)
@@ -206,7 +206,8 @@ int sh_pfc_register_gpiochip(struct sh_pfc *pfc)
	pfc->gpio = chip;

	pr_info("%s handling gpio 0 -> %u\n",
		pfc->info->name, pfc->info->nr_gpios - 1);
		pfc->info->name,
		pfc->info->nr_pins + pfc->info->nr_func_gpios - 1);

	return 0;
}
+9 −6
Original line number Diff line number Diff line
@@ -1654,11 +1654,13 @@ static pinmux_enum_t pinmux_data[] = {
	PINMUX_DATA(TRACEAUD_FROM_MEMC_MARK,			MSEL5CR_30_1,	MSEL5CR_29_0),
};

static struct pinmux_gpio pinmux_gpios[] = {

	/* PORT */
static struct pinmux_pin pinmux_pins[] = {
	GPIO_PORT_ALL(),
};

#define PINMUX_FN_BASE	ARRAY_SIZE(pinmux_pins)

static struct pinmux_func pinmux_func_gpios[] = {
	/* IRQ */
	GPIO_FN(IRQ0_PORT2),	GPIO_FN(IRQ0_PORT13),
	GPIO_FN(IRQ1),
@@ -2592,9 +2594,10 @@ struct sh_pfc_soc_info r8a7740_pinmux_info = {
	.function	= { PINMUX_FUNCTION_BEGIN,
			    PINMUX_FUNCTION_END },

	.gpios		= pinmux_gpios,
	.nr_pins	= GPIO_PORT211 + 1,
	.nr_gpios	= ARRAY_SIZE(pinmux_gpios),
	.pins		= pinmux_pins,
	.nr_pins	= ARRAY_SIZE(pinmux_pins),
	.func_gpios	= pinmux_func_gpios,
	.nr_func_gpios	= ARRAY_SIZE(pinmux_func_gpios),

	.cfg_regs	= pinmux_config_regs,
	.data_regs	= pinmux_data_regs,
+10 −4
Original line number Diff line number Diff line
@@ -1450,8 +1450,13 @@ static pinmux_enum_t pinmux_data[] = {
	PINMUX_IPSR_MODSEL_DATA(IP12_17_15, SCK4_B, SEL_SCIF4_1),
};

static struct pinmux_gpio pinmux_gpios[] = {
static struct pinmux_pin pinmux_pins[] = {
	PINMUX_GPIO_GP_ALL(),
};

#define PINMUX_FN_BASE	ARRAY_SIZE(pinmux_pins)

static struct pinmux_func pinmux_func_gpios[] = {
	GPIO_FN(AVS1), GPIO_FN(AVS2), GPIO_FN(A17), GPIO_FN(A18),
	GPIO_FN(A19),

@@ -2609,9 +2614,10 @@ struct sh_pfc_soc_info r8a7779_pinmux_info = {
	.output = { PINMUX_OUTPUT_BEGIN, PINMUX_OUTPUT_END },
	.function = { PINMUX_FUNCTION_BEGIN, PINMUX_FUNCTION_END },

	.gpios = pinmux_gpios,
	.nr_pins = GPIO_GP_6_8 + 1,
	.nr_gpios = ARRAY_SIZE(pinmux_gpios),
	.pins = pinmux_pins,
	.nr_pins = ARRAY_SIZE(pinmux_pins),
	.func_gpios = pinmux_func_gpios,
	.nr_func_gpios = ARRAY_SIZE(pinmux_func_gpios),

	.cfg_regs = pinmux_config_regs,
	.data_regs = pinmux_data_regs,
+9 −4
Original line number Diff line number Diff line
@@ -703,7 +703,7 @@ static pinmux_enum_t pinmux_data[] = {
	PINMUX_DATA(SSCK0_PF_MARK, PF0MD_11),
};

static struct pinmux_gpio pinmux_gpios[] = {
static struct pinmux_pin pinmux_pins[] = {

	/* PA */
	PINMUX_GPIO(GPIO_PA7, PA7_DATA),
@@ -815,7 +815,11 @@ static struct pinmux_gpio pinmux_gpios[] = {
	PINMUX_GPIO(GPIO_PF2, PF2_DATA),
	PINMUX_GPIO(GPIO_PF1, PF1_DATA),
	PINMUX_GPIO(GPIO_PF0, PF0_DATA),
};

#define PINMUX_FN_BASE	ARRAY_SIZE(pinmux_pins)

static struct pinmux_func pinmux_func_gpios[] = {
	/* INTC */
	GPIO_FN(PINT7_PB),
	GPIO_FN(PINT6_PB),
@@ -1577,9 +1581,10 @@ struct sh_pfc_soc_info sh7203_pinmux_info = {
	.output = { PINMUX_OUTPUT_BEGIN, PINMUX_OUTPUT_END, FORCE_OUT },
	.function = { PINMUX_FUNCTION_BEGIN, PINMUX_FUNCTION_END },

	.gpios = pinmux_gpios,
	.nr_pins = GPIO_PF0 + 1,
	.nr_gpios = ARRAY_SIZE(pinmux_gpios),
	.pins = pinmux_pins,
	.nr_pins = ARRAY_SIZE(pinmux_pins),
	.func_gpios = pinmux_func_gpios,
	.nr_func_gpios = ARRAY_SIZE(pinmux_func_gpios),

	.cfg_regs = pinmux_config_regs,
	.data_regs = pinmux_data_regs,
Loading