pinctrl: renesas: Fix pin control matching on R-Car H3e-2G
As R-Car H3 ES1.x (R8A77950) and R-Car ES2.0+ (R8A77951) use the same compatible value, the pin control driver relies on soc_device_match() with soc_id = "r8a7795" and the (non)matching of revision = "ES1.*" to match with and distinguish between the two SoC variants. The corresponding entries in the normal of_match_table are present only to make the optional sanity checks work. The R-Car H3e-2G (R8A779M1) SoC is a different grading of the R-Car H3 ES3.0 (R8A77951) SoC. It uses the same compatible values for individual devices, but has an additional compatible value for the root node. When running on an R-Car H3e-2G SoC, soc_device_match() with soc_id = "r8a7795" does not return a match. Hence the pin control driver falls back to the normal of_match_table, and, as the R8A77950 entry is listed first, incorrectly uses the sub-driver for R-Car H3 ES1.x. Fix this by moving the entry for R8A77951 before the entry for R8A77950. Simplify sh_pfc_quirk_match() to only handle R-Car H3 ES1,x, as R-Car H3 ES2.0+ can now be matched using the normal of_match_table as well. Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com> Link: https://lore.kernel.org/r/6cdc5bfa424461105779b56f455387e03560cf66.1626707688.git.geert+renesas@glider.be
This commit is contained in:
parent
e9d66bdbc5
commit
91d1be9fb7
@ -571,19 +571,23 @@ static const struct of_device_id sh_pfc_of_table[] = {
|
|||||||
.data = &r8a7794_pinmux_info,
|
.data = &r8a7794_pinmux_info,
|
||||||
},
|
},
|
||||||
#endif
|
#endif
|
||||||
/* Both r8a7795 entries must be present to make sanity checks work */
|
/*
|
||||||
#ifdef CONFIG_PINCTRL_PFC_R8A77950
|
* Both r8a7795 entries must be present to make sanity checks work, but only
|
||||||
{
|
* the first entry is actually used.
|
||||||
.compatible = "renesas,pfc-r8a7795",
|
* R-Car H3 ES1.x is matched using soc_device_match() instead.
|
||||||
.data = &r8a77950_pinmux_info,
|
*/
|
||||||
},
|
|
||||||
#endif
|
|
||||||
#ifdef CONFIG_PINCTRL_PFC_R8A77951
|
#ifdef CONFIG_PINCTRL_PFC_R8A77951
|
||||||
{
|
{
|
||||||
.compatible = "renesas,pfc-r8a7795",
|
.compatible = "renesas,pfc-r8a7795",
|
||||||
.data = &r8a77951_pinmux_info,
|
.data = &r8a77951_pinmux_info,
|
||||||
},
|
},
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef CONFIG_PINCTRL_PFC_R8A77950
|
||||||
|
{
|
||||||
|
.compatible = "renesas,pfc-r8a7795",
|
||||||
|
.data = &r8a77950_pinmux_info,
|
||||||
|
},
|
||||||
|
#endif
|
||||||
#ifdef CONFIG_PINCTRL_PFC_R8A77960
|
#ifdef CONFIG_PINCTRL_PFC_R8A77960
|
||||||
{
|
{
|
||||||
.compatible = "renesas,pfc-r8a7796",
|
.compatible = "renesas,pfc-r8a7796",
|
||||||
@ -1085,26 +1089,20 @@ static inline void sh_pfc_check_driver(struct platform_driver *pdrv) {}
|
|||||||
#ifdef CONFIG_OF
|
#ifdef CONFIG_OF
|
||||||
static const void *sh_pfc_quirk_match(void)
|
static const void *sh_pfc_quirk_match(void)
|
||||||
{
|
{
|
||||||
#if defined(CONFIG_PINCTRL_PFC_R8A77950) || \
|
#ifdef CONFIG_PINCTRL_PFC_R8A77950
|
||||||
defined(CONFIG_PINCTRL_PFC_R8A77951)
|
|
||||||
const struct soc_device_attribute *match;
|
const struct soc_device_attribute *match;
|
||||||
static const struct soc_device_attribute quirks[] = {
|
static const struct soc_device_attribute quirks[] = {
|
||||||
{
|
{
|
||||||
.soc_id = "r8a7795", .revision = "ES1.*",
|
.soc_id = "r8a7795", .revision = "ES1.*",
|
||||||
.data = &r8a77950_pinmux_info,
|
.data = &r8a77950_pinmux_info,
|
||||||
},
|
},
|
||||||
{
|
|
||||||
.soc_id = "r8a7795",
|
|
||||||
.data = &r8a77951_pinmux_info,
|
|
||||||
},
|
|
||||||
|
|
||||||
{ /* sentinel */ }
|
{ /* sentinel */ }
|
||||||
};
|
};
|
||||||
|
|
||||||
match = soc_device_match(quirks);
|
match = soc_device_match(quirks);
|
||||||
if (match)
|
if (match)
|
||||||
return match->data ?: ERR_PTR(-ENODEV);
|
return match->data;
|
||||||
#endif /* CONFIG_PINCTRL_PFC_R8A77950 || CONFIG_PINCTRL_PFC_R8A77951 */
|
#endif /* CONFIG_PINCTRL_PFC_R8A77950 */
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@ -1119,9 +1117,6 @@ static int sh_pfc_probe(struct platform_device *pdev)
|
|||||||
#ifdef CONFIG_OF
|
#ifdef CONFIG_OF
|
||||||
if (pdev->dev.of_node) {
|
if (pdev->dev.of_node) {
|
||||||
info = sh_pfc_quirk_match();
|
info = sh_pfc_quirk_match();
|
||||||
if (IS_ERR(info))
|
|
||||||
return PTR_ERR(info);
|
|
||||||
|
|
||||||
if (!info)
|
if (!info)
|
||||||
info = of_device_get_match_data(&pdev->dev);
|
info = of_device_get_match_data(&pdev->dev);
|
||||||
} else
|
} else
|
||||||
|
@ -332,8 +332,8 @@ extern const struct sh_pfc_soc_info r8a7791_pinmux_info;
|
|||||||
extern const struct sh_pfc_soc_info r8a7792_pinmux_info;
|
extern const struct sh_pfc_soc_info r8a7792_pinmux_info;
|
||||||
extern const struct sh_pfc_soc_info r8a7793_pinmux_info;
|
extern const struct sh_pfc_soc_info r8a7793_pinmux_info;
|
||||||
extern const struct sh_pfc_soc_info r8a7794_pinmux_info;
|
extern const struct sh_pfc_soc_info r8a7794_pinmux_info;
|
||||||
extern const struct sh_pfc_soc_info r8a77950_pinmux_info __weak;
|
extern const struct sh_pfc_soc_info r8a77950_pinmux_info;
|
||||||
extern const struct sh_pfc_soc_info r8a77951_pinmux_info __weak;
|
extern const struct sh_pfc_soc_info r8a77951_pinmux_info;
|
||||||
extern const struct sh_pfc_soc_info r8a77960_pinmux_info;
|
extern const struct sh_pfc_soc_info r8a77960_pinmux_info;
|
||||||
extern const struct sh_pfc_soc_info r8a77961_pinmux_info;
|
extern const struct sh_pfc_soc_info r8a77961_pinmux_info;
|
||||||
extern const struct sh_pfc_soc_info r8a77965_pinmux_info;
|
extern const struct sh_pfc_soc_info r8a77965_pinmux_info;
|
||||||
|
Loading…
Reference in New Issue
Block a user