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

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.comSigned-off-by: default avatarLinus Walleij <linus.walleij@linaro.org>
parent a5961bed
...@@ -232,7 +232,7 @@ static const char *tegra_pinctrl_get_func_name(struct pinctrl_dev *pctldev, ...@@ -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); 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, 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, ...@@ -242,8 +242,8 @@ static int tegra_pinctrl_get_func_groups(struct pinctrl_dev *pctldev,
{ {
struct tegra_pmx *pmx = pinctrl_dev_get_drvdata(pctldev); struct tegra_pmx *pmx = pinctrl_dev_get_drvdata(pctldev);
*groups = pmx->soc->functions[function].groups; *groups = pmx->functions[function].groups;
*num_groups = pmx->soc->functions[function].ngroups; *num_groups = pmx->functions[function].ngroups;
return 0; return 0;
} }
...@@ -795,10 +795,17 @@ int tegra_pinctrl_probe(struct platform_device *pdev, ...@@ -795,10 +795,17 @@ int tegra_pinctrl_probe(struct platform_device *pdev,
if (!pmx->group_pins) if (!pmx->group_pins)
return -ENOMEM; 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; group_pins = pmx->group_pins;
for (fn = 0; fn < soc_data->nfunctions; fn++) { 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; func->groups = group_pins;
for (gn = 0; gn < soc_data->ngroups; gn++) { for (gn = 0; gn < soc_data->ngroups; gn++) {
......
...@@ -13,6 +13,7 @@ struct tegra_pmx { ...@@ -13,6 +13,7 @@ struct tegra_pmx {
struct pinctrl_dev *pctl; struct pinctrl_dev *pctl;
const struct tegra_pinctrl_soc_data *soc; const struct tegra_pinctrl_soc_data *soc;
struct tegra_function *functions;
const char **group_pins; const char **group_pins;
struct pinctrl_gpio_range gpio_range; struct pinctrl_gpio_range gpio_range;
...@@ -191,7 +192,7 @@ struct tegra_pinctrl_soc_data { ...@@ -191,7 +192,7 @@ struct tegra_pinctrl_soc_data {
const char *gpio_compatible; const char *gpio_compatible;
const struct pinctrl_pin_desc *pins; const struct pinctrl_pin_desc *pins;
unsigned npins; unsigned npins;
struct tegra_function *functions; const char * const *functions;
unsigned nfunctions; unsigned nfunctions;
const struct tegra_pingroup *groups; const struct tegra_pingroup *groups;
unsigned ngroups; unsigned ngroups;
......
...@@ -1452,12 +1452,9 @@ enum tegra_mux { ...@@ -1452,12 +1452,9 @@ enum tegra_mux {
TEGRA_MUX_VI_ALT3, TEGRA_MUX_VI_ALT3,
}; };
#define FUNCTION(fname) \ #define FUNCTION(fname) #fname
{ \
.name = #fname, \
}
static struct tegra_function tegra114_functions[] = { static const char * const tegra114_functions[] = {
FUNCTION(blink), FUNCTION(blink),
FUNCTION(cec), FUNCTION(cec),
FUNCTION(cldvfs), FUNCTION(cldvfs),
......
...@@ -1611,12 +1611,9 @@ enum tegra_mux { ...@@ -1611,12 +1611,9 @@ enum tegra_mux {
TEGRA_MUX_VIMCLK2_ALT, TEGRA_MUX_VIMCLK2_ALT,
}; };
#define FUNCTION(fname) \ #define FUNCTION(fname) #fname
{ \
.name = #fname, \
}
static struct tegra_function tegra124_functions[] = { static const char * const tegra124_functions[] = {
FUNCTION(blink), FUNCTION(blink),
FUNCTION(ccla), FUNCTION(ccla),
FUNCTION(cec), FUNCTION(cec),
......
...@@ -1189,12 +1189,9 @@ enum tegra_mux_dt { ...@@ -1189,12 +1189,9 @@ enum tegra_mux_dt {
}; };
/* Make list of each function name */ /* Make list of each function name */
#define TEGRA_PIN_FUNCTION(lid) \ #define TEGRA_PIN_FUNCTION(lid) #lid
{ \
.name = #lid, \
}
static struct tegra_function tegra194_functions[] = { static const char * const tegra194_functions[] = {
TEGRA_PIN_FUNCTION(rsvd0), TEGRA_PIN_FUNCTION(rsvd0),
TEGRA_PIN_FUNCTION(rsvd1), TEGRA_PIN_FUNCTION(rsvd1),
TEGRA_PIN_FUNCTION(rsvd2), TEGRA_PIN_FUNCTION(rsvd2),
......
...@@ -1889,12 +1889,9 @@ enum tegra_mux { ...@@ -1889,12 +1889,9 @@ enum tegra_mux {
TEGRA_MUX_XIO, TEGRA_MUX_XIO,
}; };
#define FUNCTION(fname) \ #define FUNCTION(fname) #fname
{ \
.name = #fname, \
}
static struct tegra_function tegra20_functions[] = { static const char * const tegra20_functions[] = {
FUNCTION(ahb_clk), FUNCTION(ahb_clk),
FUNCTION(apb_clk), FUNCTION(apb_clk),
FUNCTION(audio_sync), FUNCTION(audio_sync),
......
...@@ -1185,12 +1185,9 @@ enum tegra_mux { ...@@ -1185,12 +1185,9 @@ enum tegra_mux {
TEGRA_MUX_VIMCLK2, TEGRA_MUX_VIMCLK2,
}; };
#define FUNCTION(fname) \ #define FUNCTION(fname) #fname
{ \
.name = #fname, \
}
static struct tegra_function tegra210_functions[] = { static const char * const tegra210_functions[] = {
FUNCTION(aud), FUNCTION(aud),
FUNCTION(bcl), FUNCTION(bcl),
FUNCTION(blink), FUNCTION(blink),
......
...@@ -2010,12 +2010,9 @@ enum tegra_mux { ...@@ -2010,12 +2010,9 @@ enum tegra_mux {
TEGRA_MUX_VI_ALT3, TEGRA_MUX_VI_ALT3,
}; };
#define FUNCTION(fname) \ #define FUNCTION(fname) #fname
{ \
.name = #fname, \
}
static struct tegra_function tegra30_functions[] = { static const char * const tegra30_functions[] = {
FUNCTION(blink), FUNCTION(blink),
FUNCTION(cec), FUNCTION(cec),
FUNCTION(clk_12m_out), FUNCTION(clk_12m_out),
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment