Commit fad57233 authored by Thierry Reding's avatar Thierry Reding Committed by Linus Walleij
Browse files

pinctrl: tegra: Duplicate pinmux functions table



The function table is filled with group information based on other
instance-specific data at runtime. However, the function table can be
shared between multiple instances, causing the ->probe() function for
one instance to overwrite the table of a previously probed instance.

Fix this by sharing only the function names and allocating a separate
function table for each instance.

Fixes: 5a004736 ("pinctrl: tegra: Separate Tegra194 instances")
Signed-off-by: default avatarThierry Reding <treding@nvidia.com>
Link: https://lore.kernel.org/r/20230530105308.1292852-1-thierry.reding@gmail.com


Signed-off-by: default avatarLinus Walleij <linus.walleij@linaro.org>
parent a5961bed
Loading
Loading
Loading
Loading
+11 −4
Original line number Diff line number Diff line
@@ -232,7 +232,7 @@ static const char *tegra_pinctrl_get_func_name(struct pinctrl_dev *pctldev,
{
	struct tegra_pmx *pmx = pinctrl_dev_get_drvdata(pctldev);

	return pmx->soc->functions[function].name;
	return pmx->functions[function].name;
}

static int tegra_pinctrl_get_func_groups(struct pinctrl_dev *pctldev,
@@ -242,8 +242,8 @@ static int tegra_pinctrl_get_func_groups(struct pinctrl_dev *pctldev,
{
	struct tegra_pmx *pmx = pinctrl_dev_get_drvdata(pctldev);

	*groups = pmx->soc->functions[function].groups;
	*num_groups = pmx->soc->functions[function].ngroups;
	*groups = pmx->functions[function].groups;
	*num_groups = pmx->functions[function].ngroups;

	return 0;
}
@@ -795,10 +795,17 @@ int tegra_pinctrl_probe(struct platform_device *pdev,
	if (!pmx->group_pins)
		return -ENOMEM;

	pmx->functions = devm_kcalloc(&pdev->dev, pmx->soc->nfunctions,
				      sizeof(*pmx->functions), GFP_KERNEL);
	if (!pmx->functions)
		return -ENOMEM;

	group_pins = pmx->group_pins;

	for (fn = 0; fn < soc_data->nfunctions; fn++) {
		struct tegra_function *func = &soc_data->functions[fn];
		struct tegra_function *func = &pmx->functions[fn];

		func->name = pmx->soc->functions[fn];
		func->groups = group_pins;

		for (gn = 0; gn < soc_data->ngroups; gn++) {
+2 −1
Original line number Diff line number Diff line
@@ -13,6 +13,7 @@ struct tegra_pmx {
	struct pinctrl_dev *pctl;

	const struct tegra_pinctrl_soc_data *soc;
	struct tegra_function *functions;
	const char **group_pins;

	struct pinctrl_gpio_range gpio_range;
@@ -191,7 +192,7 @@ struct tegra_pinctrl_soc_data {
	const char *gpio_compatible;
	const struct pinctrl_pin_desc *pins;
	unsigned npins;
	struct tegra_function *functions;
	const char * const *functions;
	unsigned nfunctions;
	const struct tegra_pingroup *groups;
	unsigned ngroups;
+2 −5
Original line number Diff line number Diff line
@@ -1452,12 +1452,9 @@ enum tegra_mux {
	TEGRA_MUX_VI_ALT3,
};

#define FUNCTION(fname)					\
	{						\
		.name = #fname,				\
	}
#define FUNCTION(fname) #fname

static struct tegra_function tegra114_functions[] = {
static const char * const tegra114_functions[] = {
	FUNCTION(blink),
	FUNCTION(cec),
	FUNCTION(cldvfs),
+2 −5
Original line number Diff line number Diff line
@@ -1611,12 +1611,9 @@ enum tegra_mux {
	TEGRA_MUX_VIMCLK2_ALT,
};

#define FUNCTION(fname)					\
	{						\
		.name = #fname,				\
	}
#define FUNCTION(fname) #fname

static struct tegra_function tegra124_functions[] = {
static const char * const tegra124_functions[] = {
	FUNCTION(blink),
	FUNCTION(ccla),
	FUNCTION(cec),
+2 −5
Original line number Diff line number Diff line
@@ -1189,12 +1189,9 @@ enum tegra_mux_dt {
};

/* Make list of each function name */
#define TEGRA_PIN_FUNCTION(lid)			\
	{					\
		.name = #lid,			\
	}
#define TEGRA_PIN_FUNCTION(lid) #lid

static struct tegra_function tegra194_functions[] = {
static const char * const tegra194_functions[] = {
	TEGRA_PIN_FUNCTION(rsvd0),
	TEGRA_PIN_FUNCTION(rsvd1),
	TEGRA_PIN_FUNCTION(rsvd2),
Loading