aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm/mach-omap2/mux.c
diff options
context:
space:
mode:
authorGrazvydas Ignotas <notasas@gmail.com>2010-08-02 06:18:28 -0400
committerTony Lindgren <tony@atomide.com>2010-08-02 07:23:07 -0400
commit8a6f7e14fc3b3ea911838c3f4ce137cb8a3d134a (patch)
treef8da6e446475d300661936711c720fef706e6f29 /arch/arm/mach-omap2/mux.c
parent7d35b8d09fb0cb0a89c8c265a5bfb52c2867b1d5 (diff)
omap: mux: fix multipath gpio handling
OMAP3530 CBB package can have GPIO126 muxed on 2 pins: mmc1_dat4 and cam_strobe. This causes a problem with current multipath GPIO mux handling, which muxes both pins as GPIO126 and makes the GPIO unusable. Fix this by not muxing any pins if multipath GPIO is detected and just print a warning instead. It's up to board files to set correct mux using omap_mux_init_signal and pin name. Signed-off-by: Grazvydas Ignotas <notasas@gmail.com> Signed-off-by: Tony Lindgren <tony@atomide.com>
Diffstat (limited to 'arch/arm/mach-omap2/mux.c')
-rw-r--r--arch/arm/mach-omap2/mux.c38
1 files changed, 20 insertions, 18 deletions
diff --git a/arch/arm/mach-omap2/mux.c b/arch/arm/mach-omap2/mux.c
index be52fabf6dc0..ab403b2ed26b 100644
--- a/arch/arm/mach-omap2/mux.c
+++ b/arch/arm/mach-omap2/mux.c
@@ -87,6 +87,9 @@ static char *omap_mux_options;
87int __init omap_mux_init_gpio(int gpio, int val) 87int __init omap_mux_init_gpio(int gpio, int val)
88{ 88{
89 struct omap_mux_entry *e; 89 struct omap_mux_entry *e;
90 struct omap_mux *gpio_mux;
91 u16 old_mode;
92 u16 mux_mode;
90 int found = 0; 93 int found = 0;
91 94
92 if (!gpio) 95 if (!gpio)
@@ -95,34 +98,33 @@ int __init omap_mux_init_gpio(int gpio, int val)
95 list_for_each_entry(e, &muxmodes, node) { 98 list_for_each_entry(e, &muxmodes, node) {
96 struct omap_mux *m = &e->mux; 99 struct omap_mux *m = &e->mux;
97 if (gpio == m->gpio) { 100 if (gpio == m->gpio) {
98 u16 old_mode; 101 gpio_mux = m;
99 u16 mux_mode;
100
101 old_mode = omap_mux_read(m->reg_offset);
102 mux_mode = val & ~(OMAP_MUX_NR_MODES - 1);
103 if (omap_mux_flags & MUXABLE_GPIO_MODE3)
104 mux_mode |= OMAP_MUX_MODE3;
105 else
106 mux_mode |= OMAP_MUX_MODE4;
107 printk(KERN_DEBUG "mux: Setting signal "
108 "%s.gpio%i 0x%04x -> 0x%04x\n",
109 m->muxnames[0], gpio, old_mode, mux_mode);
110 omap_mux_write(mux_mode, m->reg_offset);
111 found++; 102 found++;
112 } 103 }
113 } 104 }
114 105
115 if (found == 1) 106 if (found == 0) {
116 return 0; 107 printk(KERN_ERR "mux: Could not set gpio%i\n", gpio);
108 return -ENODEV;
109 }
117 110
118 if (found > 1) { 111 if (found > 1) {
119 printk(KERN_ERR "mux: Multiple gpio paths for gpio%i\n", gpio); 112 printk(KERN_INFO "mux: Multiple gpio paths (%d) for gpio%i\n",
113 found, gpio);
120 return -EINVAL; 114 return -EINVAL;
121 } 115 }
122 116
123 printk(KERN_ERR "mux: Could not set gpio%i\n", gpio); 117 old_mode = omap_mux_read(gpio_mux->reg_offset);
118 mux_mode = val & ~(OMAP_MUX_NR_MODES - 1);
119 if (omap_mux_flags & MUXABLE_GPIO_MODE3)
120 mux_mode |= OMAP_MUX_MODE3;
121 else
122 mux_mode |= OMAP_MUX_MODE4;
123 printk(KERN_DEBUG "mux: Setting signal %s.gpio%i 0x%04x -> 0x%04x\n",
124 gpio_mux->muxnames[0], gpio, old_mode, mux_mode);
125 omap_mux_write(mux_mode, gpio_mux->reg_offset);
124 126
125 return -ENODEV; 127 return 0;
126} 128}
127 129
128int __init omap_mux_init_signal(char *muxname, int val) 130int __init omap_mux_init_signal(char *muxname, int val)