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

Commit 8919ffbb authored by Linus Walleij's avatar Linus Walleij
Browse files

Merge branch 'devel-mt2701' into devel

parents 4afe2684 59ee9c96
Loading
Loading
Loading
Loading
+735 −0

File added.

Preview size limit exceeded, changes collapsed.

+6 −0
Original line number Diff line number Diff line
@@ -9,6 +9,12 @@ config PINCTRL_MTK_COMMON
	select OF_GPIO

# For ARMv7 SoCs
config PINCTRL_MT2701
	bool "Mediatek MT2701 pin control" if COMPILE_TEST && !MACH_MT2701
	depends on OF
	default MACH_MT2701
	select PINCTRL_MTK_COMMON

config PINCTRL_MT8135
	bool "Mediatek MT8135 pin control" if COMPILE_TEST && !MACH_MT8135
	depends on OF
+1 −0
Original line number Diff line number Diff line
@@ -2,6 +2,7 @@
obj-$(CONFIG_PINCTRL_MTK_COMMON)	+= pinctrl-mtk-common.o

# SoC Drivers
obj-$(CONFIG_PINCTRL_MT2701)		+= pinctrl-mt2701.o
obj-$(CONFIG_PINCTRL_MT8135)		+= pinctrl-mt8135.o
obj-$(CONFIG_PINCTRL_MT8127)		+= pinctrl-mt8127.o
obj-$(CONFIG_PINCTRL_MT8173)		+= pinctrl-mt8173.o
+586 −0

File added.

Preview size limit exceeded, changes collapsed.

+50 −0
Original line number Diff line number Diff line
@@ -43,10 +43,13 @@

#define MAX_GPIO_MODE_PER_REG 5
#define GPIO_MODE_BITS        3
#define GPIO_MODE_PREFIX "GPIO"

static const char * const mtk_gpio_functions[] = {
	"func0", "func1", "func2", "func3",
	"func4", "func5", "func6", "func7",
	"func8", "func9", "func10", "func11",
	"func12", "func13", "func14", "func15",
};

/*
@@ -81,6 +84,9 @@ static int mtk_pmx_gpio_set_direction(struct pinctrl_dev *pctldev,
	reg_addr = mtk_get_port(pctl, offset) + pctl->devdata->dir_offset;
	bit = BIT(offset & 0xf);

	if (pctl->devdata->spec_dir_set)
		pctl->devdata->spec_dir_set(&reg_addr, offset);

	if (input)
		/* Different SoC has different alignment offset. */
		reg_addr = CLR_ADDR(reg_addr, pctl);
@@ -675,9 +681,14 @@ static int mtk_pmx_set_mode(struct pinctrl_dev *pctldev,
	unsigned int mask = (1L << GPIO_MODE_BITS) - 1;
	struct mtk_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev);

	if (pctl->devdata->spec_pinmux_set)
		pctl->devdata->spec_pinmux_set(mtk_get_regmap(pctl, pin),
					pin, mode);

	reg_addr = ((pin / MAX_GPIO_MODE_PER_REG) << pctl->devdata->port_shf)
			+ pctl->devdata->pinmux_offset;

	mode &= mask;
	bit = pin % MAX_GPIO_MODE_PER_REG;
	mask <<= (GPIO_MODE_BITS * bit);
	val = (mode << (GPIO_MODE_BITS * bit));
@@ -723,12 +734,47 @@ static int mtk_pmx_set_mux(struct pinctrl_dev *pctldev,
	return 0;
}

static int mtk_pmx_find_gpio_mode(struct mtk_pinctrl *pctl,
				unsigned offset)
{
	const struct mtk_desc_pin *pin = pctl->devdata->pins + offset;
	const struct mtk_desc_function *func = pin->functions;

	while (func && func->name) {
		if (!strncmp(func->name, GPIO_MODE_PREFIX,
			sizeof(GPIO_MODE_PREFIX)-1))
			return func->muxval;
		func++;
	}
	return -EINVAL;
}

static int mtk_pmx_gpio_request_enable(struct pinctrl_dev *pctldev,
				    struct pinctrl_gpio_range *range,
				    unsigned offset)
{
	unsigned long muxval;
	struct mtk_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev);

	muxval = mtk_pmx_find_gpio_mode(pctl, offset);

	if (muxval < 0) {
		dev_err(pctl->dev, "invalid gpio pin %d.\n", offset);
		return -EINVAL;
	}

	mtk_pmx_set_mode(pctldev, offset, muxval);

	return 0;
}

static const struct pinmux_ops mtk_pmx_ops = {
	.get_functions_count	= mtk_pmx_get_funcs_cnt,
	.get_function_name	= mtk_pmx_get_func_name,
	.get_function_groups	= mtk_pmx_get_func_groups,
	.set_mux		= mtk_pmx_set_mux,
	.gpio_set_direction	= mtk_pmx_gpio_set_direction,
	.gpio_request_enable	= mtk_pmx_gpio_request_enable,
};

static int mtk_gpio_direction_input(struct gpio_chip *chip,
@@ -754,6 +800,10 @@ static int mtk_gpio_get_direction(struct gpio_chip *chip, unsigned offset)

	reg_addr =  mtk_get_port(pctl, offset) + pctl->devdata->dir_offset;
	bit = BIT(offset & 0xf);

	if (pctl->devdata->spec_dir_set)
		pctl->devdata->spec_dir_set(&reg_addr, offset);

	regmap_read(pctl->regmap1, reg_addr, &read_val);
	return !(read_val & bit);
}
Loading