mirror of
https://github.com/u-boot/u-boot.git
synced 2025-05-04 02:32:32 +00:00
pinctrl: tegra: detect unknown/invalid pin/func configurations
Applies same logic to general Tegra pincontrol driver as is done to Tegra20
by commit:
a35bf832d7
("pinctrl: tegra20: detect unknown/invalid pin/func
configurations")
Suggested-by: Artur Kowalski <arturkow2000@gmail.com>
Signed-off-by: Svyatoslav Ryhel <clamor95@gmail.com>
This commit is contained in:
parent
a35bf832d7
commit
e9245a360a
1 changed files with 59 additions and 16 deletions
|
@ -14,7 +14,7 @@
|
||||||
static void tegra_pinctrl_set_drive(struct udevice *config, int drvcnt)
|
static void tegra_pinctrl_set_drive(struct udevice *config, int drvcnt)
|
||||||
{
|
{
|
||||||
struct pmux_drvgrp_config *drive_group;
|
struct pmux_drvgrp_config *drive_group;
|
||||||
int i, ret, pad_id;
|
int i, ret, pad_id, count = 0;
|
||||||
const char **pads;
|
const char **pads;
|
||||||
|
|
||||||
drive_group = kmalloc_array(drvcnt, sizeof(*drive_group), GFP_KERNEL);
|
drive_group = kmalloc_array(drvcnt, sizeof(*drive_group), GFP_KERNEL);
|
||||||
|
@ -46,21 +46,32 @@ static void tegra_pinctrl_set_drive(struct udevice *config, int drvcnt)
|
||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* i goes through all drive instances defined, while
|
||||||
|
* count is increased only if a valid configuration is found
|
||||||
|
*/
|
||||||
for (i = 0; i < drvcnt; i++) {
|
for (i = 0; i < drvcnt; i++) {
|
||||||
for (pad_id = 0; pad_id < PMUX_DRVGRP_COUNT; pad_id++)
|
for (pad_id = 0; pad_id < PMUX_DRVGRP_COUNT; pad_id++)
|
||||||
if (tegra_pinctrl_to_drvgrp[pad_id])
|
if (tegra_pinctrl_to_drvgrp[pad_id])
|
||||||
if (!strcmp(pads[i], tegra_pinctrl_to_drvgrp[pad_id])) {
|
if (!strcmp(pads[i], tegra_pinctrl_to_drvgrp[pad_id])) {
|
||||||
drive_group[i].drvgrp = pad_id;
|
drive_group[count].drvgrp = pad_id;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
debug("%s drvmap: %d, %d, %d, %d, %d\n", pads[i],
|
if (pad_id == PMUX_DRVGRP_COUNT) {
|
||||||
drive_group[i].drvgrp, drive_group[i].slwf,
|
log_debug("%s: drive %s is not valid\n", __func__, pads[i]);
|
||||||
drive_group[i].slwr, drive_group[i].drvup,
|
continue;
|
||||||
drive_group[i].drvdn);
|
}
|
||||||
|
|
||||||
|
log_debug("%s(%d) drvmap: %d, %d, %d, %d, %d\n", pads[count], count,
|
||||||
|
drive_group[count].drvgrp, drive_group[count].slwf,
|
||||||
|
drive_group[count].slwr, drive_group[count].drvup,
|
||||||
|
drive_group[count].drvdn);
|
||||||
|
|
||||||
|
count++;
|
||||||
}
|
}
|
||||||
|
|
||||||
pinmux_config_drvgrp_table(drive_group, drvcnt);
|
pinmux_config_drvgrp_table(drive_group, count);
|
||||||
|
|
||||||
free(pads);
|
free(pads);
|
||||||
exit:
|
exit:
|
||||||
|
@ -71,7 +82,7 @@ exit:
|
||||||
static void tegra_pinctrl_set_mipipad(struct udevice *config, int padcnt)
|
static void tegra_pinctrl_set_mipipad(struct udevice *config, int padcnt)
|
||||||
{
|
{
|
||||||
struct pmux_mipipadctrlgrp_config *mipipad_group;
|
struct pmux_mipipadctrlgrp_config *mipipad_group;
|
||||||
int i, ret, pad_id;
|
int i, ret, pad_id, count = 0;
|
||||||
const char *function;
|
const char *function;
|
||||||
const char **pads;
|
const char **pads;
|
||||||
|
|
||||||
|
@ -89,6 +100,11 @@ static void tegra_pinctrl_set_mipipad(struct udevice *config, int padcnt)
|
||||||
if (!strcmp(function, tegra_pinctrl_to_func[i]))
|
if (!strcmp(function, tegra_pinctrl_to_func[i]))
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
if (!function || i == PMUX_FUNC_COUNT) {
|
||||||
|
log_debug("%s: pin function is not defined or is not valid\n", __func__);
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
|
||||||
mipipad_group[0].func = i;
|
mipipad_group[0].func = i;
|
||||||
|
|
||||||
for (i = 1; i < padcnt; i++)
|
for (i = 1; i < padcnt; i++)
|
||||||
|
@ -100,16 +116,27 @@ static void tegra_pinctrl_set_mipipad(struct udevice *config, int padcnt)
|
||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* i goes through all pin instances defined, while
|
||||||
|
* count is increased only if a valid configuration is found
|
||||||
|
*/
|
||||||
for (i = 0; i < padcnt; i++) {
|
for (i = 0; i < padcnt; i++) {
|
||||||
for (pad_id = 0; pad_id < PMUX_MIPIPADCTRLGRP_COUNT; pad_id++)
|
for (pad_id = 0; pad_id < PMUX_MIPIPADCTRLGRP_COUNT; pad_id++)
|
||||||
if (tegra_pinctrl_to_mipipadgrp[pad_id])
|
if (tegra_pinctrl_to_mipipadgrp[pad_id])
|
||||||
if (!strcmp(pads[i], tegra_pinctrl_to_mipipadgrp[pad_id])) {
|
if (!strcmp(pads[i], tegra_pinctrl_to_mipipadgrp[pad_id])) {
|
||||||
mipipad_group[i].grp = pad_id;
|
mipipad_group[count].grp = pad_id;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (pad_id == PMUX_MIPIPADCTRLGRP_COUNT) {
|
||||||
|
log_debug("%s: drive %s is not valid\n", __func__, pads[i]);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
count++;
|
||||||
}
|
}
|
||||||
|
|
||||||
pinmux_config_mipipadctrlgrp_table(mipipad_group, padcnt);
|
pinmux_config_mipipadctrlgrp_table(mipipad_group, count);
|
||||||
|
|
||||||
free(pads);
|
free(pads);
|
||||||
exit:
|
exit:
|
||||||
|
@ -122,7 +149,7 @@ static void tegra_pinctrl_set_mipipad(struct udevice *config, int padcnt) { }
|
||||||
static void tegra_pinctrl_set_pin(struct udevice *config, int pincnt)
|
static void tegra_pinctrl_set_pin(struct udevice *config, int pincnt)
|
||||||
{
|
{
|
||||||
struct pmux_pingrp_config *pinmux_group;
|
struct pmux_pingrp_config *pinmux_group;
|
||||||
int i, ret, pin_id;
|
int i, ret, pin_id, count = 0;
|
||||||
const char *function;
|
const char *function;
|
||||||
const char **pins;
|
const char **pins;
|
||||||
|
|
||||||
|
@ -140,6 +167,11 @@ static void tegra_pinctrl_set_pin(struct udevice *config, int pincnt)
|
||||||
if (!strcmp(function, tegra_pinctrl_to_func[i]))
|
if (!strcmp(function, tegra_pinctrl_to_func[i]))
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
if (!function || i == PMUX_FUNC_COUNT) {
|
||||||
|
log_debug("%s: pin function is not defined or is not valid\n", __func__);
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
|
||||||
pinmux_group[0].func = i;
|
pinmux_group[0].func = i;
|
||||||
|
|
||||||
pinmux_group[0].pull = dev_read_u32_default(config, "nvidia,pull", PMUX_PULL_NORMAL);
|
pinmux_group[0].pull = dev_read_u32_default(config, "nvidia,pull", PMUX_PULL_NORMAL);
|
||||||
|
@ -178,20 +210,31 @@ static void tegra_pinctrl_set_pin(struct udevice *config, int pincnt)
|
||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* i goes through all pin instances defined, while
|
||||||
|
* count is increased only if a valid configuration is found
|
||||||
|
*/
|
||||||
for (i = 0; i < pincnt; i++) {
|
for (i = 0; i < pincnt; i++) {
|
||||||
for (pin_id = 0; pin_id < PMUX_PINGRP_COUNT; pin_id++)
|
for (pin_id = 0; pin_id < PMUX_PINGRP_COUNT; pin_id++)
|
||||||
if (tegra_pinctrl_to_pingrp[pin_id])
|
if (tegra_pinctrl_to_pingrp[pin_id])
|
||||||
if (!strcmp(pins[i], tegra_pinctrl_to_pingrp[pin_id])) {
|
if (!strcmp(pins[i], tegra_pinctrl_to_pingrp[pin_id])) {
|
||||||
pinmux_group[i].pingrp = pin_id;
|
pinmux_group[count].pingrp = pin_id;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
debug("%s pinmap: %d, %d, %d, %d\n", pins[i],
|
if (pin_id == PMUX_PINGRP_COUNT) {
|
||||||
pinmux_group[i].pingrp, pinmux_group[i].func,
|
log_debug("%s: pin %s is not valid\n", __func__, pins[i]);
|
||||||
pinmux_group[i].pull, pinmux_group[i].tristate);
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
log_debug("%s(%d) pinmap: %d, %d, %d, %d\n", pins[count], count,
|
||||||
|
pinmux_group[count].pingrp, pinmux_group[count].func,
|
||||||
|
pinmux_group[count].pull, pinmux_group[count].tristate);
|
||||||
|
|
||||||
|
count++;
|
||||||
}
|
}
|
||||||
|
|
||||||
pinmux_config_pingrp_table(pinmux_group, pincnt);
|
pinmux_config_pingrp_table(pinmux_group, count);
|
||||||
|
|
||||||
free(pins);
|
free(pins);
|
||||||
exit:
|
exit:
|
||||||
|
|
Loading…
Add table
Reference in a new issue