| From c021f241f4fab2bb4fc4120a38a828a03dd3f970 Mon Sep 17 00:00:00 2001 |
| From: "David R. Piegdon" <lkml@p23q.org> |
| Date: Mon, 16 Jun 2014 23:42:51 +0000 |
| Subject: ARM: OMAP2+: Fix parser-bug in platform muxing code |
| |
| From: "David R. Piegdon" <lkml@p23q.org> |
| |
| commit c021f241f4fab2bb4fc4120a38a828a03dd3f970 upstream. |
| |
| Fix a parser-bug in the omap2 muxing code where muxtable-entries will be |
| wrongly selected if the requested muxname is a *prefix* of their |
| m0-entry and they have a matching mN-entry. Fix by additionally checking |
| that the length of the m0_entry is equal. |
| |
| For example muxing of "dss_data2.dss_data2" on omap32xx will fail |
| because the prefix "dss_data2" will match the mux-entries "dss_data2" as |
| well as "dss_data20", with the suffix "dss_data2" matching m0 (for |
| dss_data2) and m4 (for dss_data20). Thus both are recognized as signal |
| path candidates: |
| |
| Relevant muxentries from mux34xx.c: |
| _OMAP3_MUXENTRY(DSS_DATA20, 90, |
| "dss_data20", NULL, "mcspi3_somi", "dss_data2", |
| "gpio_90", NULL, NULL, "safe_mode"), |
| _OMAP3_MUXENTRY(DSS_DATA2, 72, |
| "dss_data2", NULL, NULL, NULL, |
| "gpio_72", NULL, NULL, "safe_mode"), |
| |
| This will result in a failure to mux the pin at all: |
| |
| _omap_mux_get_by_name: Multiple signal paths (2) for dss_data2.dss_data2 |
| |
| Patch should apply to linus' latest master down to rather old linux-2.6 |
| trees. |
| |
| Signed-off-by: David R. Piegdon <lkml@p23q.org> |
| Cc: stable@vger.kernel.org |
| [tony@atomide.com: updated description to include full description] |
| Signed-off-by: Tony Lindgren <tony@atomide.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| arch/arm/mach-omap2/mux.c | 6 ++++-- |
| 1 file changed, 4 insertions(+), 2 deletions(-) |
| |
| --- a/arch/arm/mach-omap2/mux.c |
| +++ b/arch/arm/mach-omap2/mux.c |
| @@ -183,8 +183,10 @@ static int __init _omap_mux_get_by_name( |
| m0_entry = mux->muxnames[0]; |
| |
| /* First check for full name in mode0.muxmode format */ |
| - if (mode0_len && strncmp(muxname, m0_entry, mode0_len)) |
| - continue; |
| + if (mode0_len) |
| + if (strncmp(muxname, m0_entry, mode0_len) || |
| + (strlen(m0_entry) != mode0_len)) |
| + continue; |
| |
| /* Then check for muxmode only */ |
| for (i = 0; i < OMAP_MUX_NR_MODES; i++) { |