aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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)