mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-03 00:54:09 +08:00
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: 5a00473607
("pinctrl: tegra: Separate Tegra194 instances")
Signed-off-by: Thierry Reding <treding@nvidia.com>
Link: https://lore.kernel.org/r/20230530105308.1292852-1-thierry.reding@gmail.com
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
This commit is contained in:
parent
a5961bed54
commit
fad5723350
@ -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;
|
||||
|
||||
group_pins = pmx->group_pins;
|
||||
for (fn = 0; fn < soc_data->nfunctions; fn++) {
|
||||
struct tegra_function *func = &soc_data->functions[fn];
|
||||
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 = &pmx->functions[fn];
|
||||
|
||||
func->name = pmx->soc->functions[fn];
|
||||
func->groups = group_pins;
|
||||
|
||||
for (gn = 0; gn < soc_data->ngroups; gn++) {
|
||||
|
@ -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;
|
||||
|
@ -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),
|
||||
|
@ -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),
|
||||
|
@ -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),
|
||||
|
@ -1889,12 +1889,9 @@ enum tegra_mux {
|
||||
TEGRA_MUX_XIO,
|
||||
};
|
||||
|
||||
#define FUNCTION(fname) \
|
||||
{ \
|
||||
.name = #fname, \
|
||||
}
|
||||
#define FUNCTION(fname) #fname
|
||||
|
||||
static struct tegra_function tegra20_functions[] = {
|
||||
static const char * const tegra20_functions[] = {
|
||||
FUNCTION(ahb_clk),
|
||||
FUNCTION(apb_clk),
|
||||
FUNCTION(audio_sync),
|
||||
|
@ -1185,12 +1185,9 @@ enum tegra_mux {
|
||||
TEGRA_MUX_VIMCLK2,
|
||||
};
|
||||
|
||||
#define FUNCTION(fname) \
|
||||
{ \
|
||||
.name = #fname, \
|
||||
}
|
||||
#define FUNCTION(fname) #fname
|
||||
|
||||
static struct tegra_function tegra210_functions[] = {
|
||||
static const char * const tegra210_functions[] = {
|
||||
FUNCTION(aud),
|
||||
FUNCTION(bcl),
|
||||
FUNCTION(blink),
|
||||
|
@ -2010,12 +2010,9 @@ enum tegra_mux {
|
||||
TEGRA_MUX_VI_ALT3,
|
||||
};
|
||||
|
||||
#define FUNCTION(fname) \
|
||||
{ \
|
||||
.name = #fname, \
|
||||
}
|
||||
#define FUNCTION(fname) #fname
|
||||
|
||||
static struct tegra_function tegra30_functions[] = {
|
||||
static const char * const tegra30_functions[] = {
|
||||
FUNCTION(blink),
|
||||
FUNCTION(cec),
|
||||
FUNCTION(clk_12m_out),
|
||||
|
Loading…
Reference in New Issue
Block a user