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

Commit b7d7f9ee authored by Sean Wang's avatar Sean Wang Committed by Linus Walleij
Browse files

pinctrl: mediatek: extend struct mtk_pin_desc which per-pin driver depends on



Because the pincrl-mtk-common.c is an implementation for per-pin binding,
its pin descriptor includes more information than pinctrl-mtk-common-v2
so far can support. So, we complement these data before writing a driver
using pincrl-mtk-common-v2.c for per-pin binding. By the way, the size of
struct mtk_pin_desc would be larger than struct pinctrl_pin_desc can hold,
so it's necessary to have a copy before the pins information is being
registered into the core.

Signed-off-by: default avatarSean Wang <sean.wang@mediatek.com>
Signed-off-by: default avatarLinus Walleij <linus.walleij@linaro.org>
parent 9d9b171c
Loading
Loading
Loading
Loading
+20 −8
Original line number Original line Diff line number Diff line
@@ -475,10 +475,10 @@ static int mtk_gpio_to_irq(struct gpio_chip *chip, unsigned int offset)


	desc = (const struct mtk_pin_desc *)&hw->soc->pins[offset];
	desc = (const struct mtk_pin_desc *)&hw->soc->pins[offset];


	if (desc->eint_n == EINT_NA)
	if (desc->eint.eint_n == EINT_NA)
		return -ENOTSUPP;
		return -ENOTSUPP;


	return mtk_eint_find_irq(hw->eint, desc->eint_n);
	return mtk_eint_find_irq(hw->eint, desc->eint.eint_n);
}
}


static int mtk_gpio_set_config(struct gpio_chip *chip, unsigned int offset,
static int mtk_gpio_set_config(struct gpio_chip *chip, unsigned int offset,
@@ -492,12 +492,12 @@ static int mtk_gpio_set_config(struct gpio_chip *chip, unsigned int offset,


	if (!hw->eint ||
	if (!hw->eint ||
	    pinconf_to_config_param(config) != PIN_CONFIG_INPUT_DEBOUNCE ||
	    pinconf_to_config_param(config) != PIN_CONFIG_INPUT_DEBOUNCE ||
	    desc->eint_n == EINT_NA)
	    desc->eint.eint_n == EINT_NA)
		return -ENOTSUPP;
		return -ENOTSUPP;


	debounce = pinconf_to_config_argument(config);
	debounce = pinconf_to_config_argument(config);


	return mtk_eint_set_debounce(hw->eint, desc->eint_n, debounce);
	return mtk_eint_set_debounce(hw->eint, desc->eint.eint_n, debounce);
}
}


static int mtk_build_gpiochip(struct mtk_pinctrl *hw, struct device_node *np)
static int mtk_build_gpiochip(struct mtk_pinctrl *hw, struct device_node *np)
@@ -593,7 +593,7 @@ static int mtk_xt_find_eint_num(struct mtk_pinctrl *hw,
	desc = (const struct mtk_pin_desc *)hw->soc->pins;
	desc = (const struct mtk_pin_desc *)hw->soc->pins;


	while (i < hw->soc->npins) {
	while (i < hw->soc->npins) {
		if (desc[i].eint_n == eint_n)
		if (desc[i].eint.eint_n == eint_n)
			return desc[i].number;
			return desc[i].number;
		i++;
		i++;
	}
	}
@@ -612,7 +612,7 @@ static int mtk_xt_get_gpio_n(void *data, unsigned long eint_n,
	*gpio_chip = &hw->chip;
	*gpio_chip = &hw->chip;


	/* Be greedy to guess first gpio_n is equal to eint_n */
	/* Be greedy to guess first gpio_n is equal to eint_n */
	if (desc[eint_n].eint_n == eint_n)
	if (desc[eint_n].eint.eint_n == eint_n)
		*gpio_n = eint_n;
		*gpio_n = eint_n;
	else
	else
		*gpio_n = mtk_xt_find_eint_num(hw, eint_n);
		*gpio_n = mtk_xt_find_eint_num(hw, eint_n);
@@ -649,7 +649,7 @@ static int mtk_xt_set_gpio_as_eint(void *data, unsigned long eint_n)
	desc = (const struct mtk_pin_desc *)&hw->soc->pins[gpio_n];
	desc = (const struct mtk_pin_desc *)&hw->soc->pins[gpio_n];


	err = mtk_hw_set_value(hw, desc, PINCTRL_PIN_REG_MODE,
	err = mtk_hw_set_value(hw, desc, PINCTRL_PIN_REG_MODE,
			       hw->soc->eint_m);
			       desc->eint.eint_m);
	if (err)
	if (err)
		return err;
		return err;


@@ -711,6 +711,7 @@ mtk_build_eint(struct mtk_pinctrl *hw, struct platform_device *pdev)
int mtk_moore_pinctrl_probe(struct platform_device *pdev,
int mtk_moore_pinctrl_probe(struct platform_device *pdev,
			    const struct mtk_pin_soc *soc)
			    const struct mtk_pin_soc *soc)
{
{
	struct pinctrl_pin_desc *pins;
	struct resource *res;
	struct resource *res;
	struct mtk_pinctrl *hw;
	struct mtk_pinctrl *hw;
	int err, i;
	int err, i;
@@ -748,8 +749,19 @@ int mtk_moore_pinctrl_probe(struct platform_device *pdev,


	hw->nbase = hw->soc->nbase_names;
	hw->nbase = hw->soc->nbase_names;


	/* Copy from internal struct mtk_pin_desc to register to the core */
	pins = devm_kmalloc_array(&pdev->dev, hw->soc->npins, sizeof(*pins),
				  GFP_KERNEL);
	if (IS_ERR(pins))
		return PTR_ERR(pins);

	for (i = 0; i < hw->soc->npins; i++) {
		pins[i].number = hw->soc->pins[i].number;
		pins[i].name = hw->soc->pins[i].name;
	}

	/* Setup pins descriptions per SoC types */
	/* Setup pins descriptions per SoC types */
	mtk_desc.pins = (const struct pinctrl_pin_desc *)hw->soc->pins;
	mtk_desc.pins = (const struct pinctrl_pin_desc *)pins;
	mtk_desc.npins = hw->soc->npins;
	mtk_desc.npins = hw->soc->npins;
	mtk_desc.num_custom_params = ARRAY_SIZE(mtk_custom_bindings);
	mtk_desc.num_custom_params = ARRAY_SIZE(mtk_custom_bindings);
	mtk_desc.custom_params = mtk_custom_bindings;
	mtk_desc.custom_params = mtk_custom_bindings;
+6 −2
Original line number Original line Diff line number Diff line
@@ -28,11 +28,15 @@


#define MTK_RANGE(_a)		{ .range = (_a), .nranges = ARRAY_SIZE(_a), }
#define MTK_RANGE(_a)		{ .range = (_a), .nranges = ARRAY_SIZE(_a), }


#define MTK_PIN(_number, _name, _eint_n, _drv_n) {	\
#define MTK_PIN(_number, _name, _eint_m, _eint_n, _drv_n) {	\
		.number = _number,			\
		.number = _number,			\
		.name = _name,				\
		.name = _name,				\
		.eint = {				\
			.eint_m = _eint_m,		\
			.eint_n = _eint_n,		\
			.eint_n = _eint_n,		\
		},					\
		.drv_n = _drv_n,			\
		.drv_n = _drv_n,			\
		.funcs = NULL,				\
	}
	}


#define PINCTRL_PIN_GROUP(name, id)			\
#define PINCTRL_PIN_GROUP(name, id)			\
+2 −3
Original line number Original line Diff line number Diff line
@@ -9,7 +9,7 @@
#include "pinctrl-moore.h"
#include "pinctrl-moore.h"


#define MT7622_PIN(_number, _name)					\
#define MT7622_PIN(_number, _name)					\
	MTK_PIN(_number, _name, _number, DRV_GRP0)
	MTK_PIN(_number, _name, 1, _number, DRV_GRP0)


static const struct mtk_pin_field_calc mt7622_pin_mode_range[] = {
static const struct mtk_pin_field_calc mt7622_pin_mode_range[] = {
	PIN_FIELD(0, 0, 0x320, 0x10, 16, 4),
	PIN_FIELD(0, 0, 0x320, 0x10, 16, 4),
@@ -758,7 +758,7 @@ static const struct mtk_eint_hw mt7622_eint_hw = {


static const struct mtk_pin_soc mt7622_data = {
static const struct mtk_pin_soc mt7622_data = {
	.reg_cal = mt7622_reg_cals,
	.reg_cal = mt7622_reg_cals,
	.pins = (const struct pinctrl_pin_desc *)mt7622_pins,
	.pins = mt7622_pins,
	.npins = ARRAY_SIZE(mt7622_pins),
	.npins = ARRAY_SIZE(mt7622_pins),
	.grps = mt7622_groups,
	.grps = mt7622_groups,
	.ngrps = ARRAY_SIZE(mt7622_groups),
	.ngrps = ARRAY_SIZE(mt7622_groups),
@@ -766,7 +766,6 @@ static const struct mtk_pin_soc mt7622_data = {
	.nfuncs = ARRAY_SIZE(mt7622_functions),
	.nfuncs = ARRAY_SIZE(mt7622_functions),
	.eint_hw = &mt7622_eint_hw,
	.eint_hw = &mt7622_eint_hw,
	.gpio_m	= 1,
	.gpio_m	= 1,
	.eint_m = 1,
	.ies_present = false,
	.ies_present = false,
	.base_names = mtk_default_register_base_names,
	.base_names = mtk_default_register_base_names,
	.nbase_names = ARRAY_SIZE(mtk_default_register_base_names),
	.nbase_names = ARRAY_SIZE(mtk_default_register_base_names),
+2 −3
Original line number Original line Diff line number Diff line
@@ -30,7 +30,7 @@
		       _x_bits, 16, 1)
		       _x_bits, 16, 1)


#define MT7623_PIN(_number, _name, _eint_n, _drv_grp)			\
#define MT7623_PIN(_number, _name, _eint_n, _drv_grp)			\
	MTK_PIN(_number, _name, _eint_n, _drv_grp)
	MTK_PIN(_number, _name, 0, _eint_n, _drv_grp)


static const struct mtk_pin_field_calc mt7623_pin_mode_range[] = {
static const struct mtk_pin_field_calc mt7623_pin_mode_range[] = {
	PIN_FIELD15(0, 278, 0x760, 0x10, 0, 3),
	PIN_FIELD15(0, 278, 0x760, 0x10, 0, 3),
@@ -1373,7 +1373,7 @@ static const struct mtk_eint_hw mt7623_eint_hw = {


static struct mtk_pin_soc mt7623_data = {
static struct mtk_pin_soc mt7623_data = {
	.reg_cal = mt7623_reg_cals,
	.reg_cal = mt7623_reg_cals,
	.pins = (const struct pinctrl_pin_desc *)mt7623_pins,
	.pins = mt7623_pins,
	.npins = ARRAY_SIZE(mt7623_pins),
	.npins = ARRAY_SIZE(mt7623_pins),
	.grps = mt7623_groups,
	.grps = mt7623_groups,
	.ngrps = ARRAY_SIZE(mt7623_groups),
	.ngrps = ARRAY_SIZE(mt7623_groups),
@@ -1381,7 +1381,6 @@ static struct mtk_pin_soc mt7623_data = {
	.nfuncs = ARRAY_SIZE(mt7623_functions),
	.nfuncs = ARRAY_SIZE(mt7623_functions),
	.eint_hw = &mt7623_eint_hw,
	.eint_hw = &mt7623_eint_hw,
	.gpio_m = 0,
	.gpio_m = 0,
	.eint_m = 0,
	.ies_present = true,
	.ies_present = true,
	.base_names = mtk_default_register_base_names,
	.base_names = mtk_default_register_base_names,
	.nbase_names = ARRAY_SIZE(mtk_default_register_base_names),
	.nbase_names = ARRAY_SIZE(mtk_default_register_base_names),
+32 −4
Original line number Original line Diff line number Diff line
@@ -133,19 +133,45 @@ struct mtk_pin_reg_calc {
	unsigned int nranges;
	unsigned int nranges;
};
};


/**
 * struct mtk_func_desc - the structure that providing information
 *			  all the funcs for this pin
 * @name:		the name of function
 * @muxval:		the mux to the function
 */
struct mtk_func_desc {
	const char *name;
	u8 muxval;
};

/**
 * struct mtk_eint_desc - the structure that providing information
 *			       for eint data per pin
 * @eint_m:		the eint mux for this pin
 * @eitn_n:		the eint number for this pin
 */
struct mtk_eint_desc {
	u8 eint_m;
	u16 eint_n;
};

/**
/**
 * struct mtk_pin_desc - the structure that providing information
 * struct mtk_pin_desc - the structure that providing information
 *			       for each pin of chips
 *			       for each pin of chips
 * @number:		unique pin number from the global pin number space
 * @number:		unique pin number from the global pin number space
 * @name:		name for this pin
 * @name:		name for this pin
 * @eint_n:		the eint number for this pin
 * @eint:		the eint data for this pin
 * @drv_n:		the index with the driving group
 * @drv_n:		the index with the driving group
 * @funcs:		all available functions for this pins (only used in
 *			those drivers compatible to pinctrl-mtk-common.c-like
 *			ones)
 */
 */
struct mtk_pin_desc {
struct mtk_pin_desc {
	unsigned int number;
	unsigned int number;
	const char *name;
	const char *name;
	u16 eint_n;
	struct mtk_eint_desc eint;
	u8 drv_n;
	u8 drv_n;
	struct mtk_func_desc *funcs;
};
};


struct mtk_pinctrl;
struct mtk_pinctrl;
@@ -153,7 +179,7 @@ struct mtk_pinctrl;
/* struct mtk_pin_soc - the structure that holds SoC-specific data */
/* struct mtk_pin_soc - the structure that holds SoC-specific data */
struct mtk_pin_soc {
struct mtk_pin_soc {
	const struct mtk_pin_reg_calc	*reg_cal;
	const struct mtk_pin_reg_calc	*reg_cal;
	const struct pinctrl_pin_desc	*pins;
	const struct mtk_pin_desc	*pins;
	unsigned int			npins;
	unsigned int			npins;
	const struct group_desc		*grps;
	const struct group_desc		*grps;
	unsigned int			ngrps;
	unsigned int			ngrps;
@@ -164,7 +190,6 @@ struct mtk_pin_soc {


	/* Specific parameters per SoC */
	/* Specific parameters per SoC */
	u8				gpio_m;
	u8				gpio_m;
	u8				eint_m;
	bool				ies_present;
	bool				ies_present;
	const char * const		*base_names;
	const char * const		*base_names;
	unsigned int			nbase_names;
	unsigned int			nbase_names;
@@ -190,6 +215,9 @@ struct mtk_pin_soc {
	int (*adv_pull_get)(struct mtk_pinctrl *hw,
	int (*adv_pull_get)(struct mtk_pinctrl *hw,
			    const struct mtk_pin_desc *desc, bool pullup,
			    const struct mtk_pin_desc *desc, bool pullup,
			    u32 *val);
			    u32 *val);

	/* Specific driver data */
	void				*driver_data;
};
};


struct mtk_pinctrl {
struct mtk_pinctrl {