aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/arm/mach-omap2/mux.c65
-rw-r--r--arch/arm/mach-omap2/mux.h40
-rw-r--r--arch/arm/plat-omap/include/plat/omap_hwmod.h13
3 files changed, 118 insertions, 0 deletions
diff --git a/arch/arm/mach-omap2/mux.c b/arch/arm/mach-omap2/mux.c
index 0fa3d74125bc..27eb51a224cb 100644
--- a/arch/arm/mach-omap2/mux.c
+++ b/arch/arm/mach-omap2/mux.c
@@ -35,6 +35,8 @@
35 35
36#include <asm/system.h> 36#include <asm/system.h>
37 37
38#include <plat/omap_hwmod.h>
39
38#include "control.h" 40#include "control.h"
39#include "mux.h" 41#include "mux.h"
40 42
@@ -252,6 +254,69 @@ int __init omap_mux_init_signal(const char *muxname, int val)
252 return 0; 254 return 0;
253} 255}
254 256
257struct omap_hwmod_mux_info * __init
258omap_hwmod_mux_init(struct omap_device_pad *bpads, int nr_pads)
259{
260 struct omap_hwmod_mux_info *hmux;
261 int i;
262
263 if (!bpads || nr_pads < 1)
264 return NULL;
265
266 hmux = kzalloc(sizeof(struct omap_hwmod_mux_info), GFP_KERNEL);
267 if (!hmux)
268 goto err1;
269
270 hmux->nr_pads = nr_pads;
271
272 hmux->pads = kzalloc(sizeof(struct omap_device_pad) *
273 nr_pads, GFP_KERNEL);
274 if (!hmux->pads)
275 goto err2;
276
277 for (i = 0; i < hmux->nr_pads; i++) {
278 struct omap_mux_partition *partition;
279 struct omap_device_pad *bpad = &bpads[i], *pad = &hmux->pads[i];
280 struct omap_mux *mux;
281 int mux_mode;
282
283 mux_mode = omap_mux_get_by_name(bpad->name, &partition, &mux);
284 if (mux_mode < 0)
285 goto err3;
286 if (!pad->partition)
287 pad->partition = partition;
288 if (!pad->mux)
289 pad->mux = mux;
290
291 pad->name = kzalloc(strlen(bpad->name) + 1, GFP_KERNEL);
292 if (!pad->name) {
293 int j;
294
295 for (j = i - 1; j >= 0; j--)
296 kfree(hmux->pads[j].name);
297 goto err3;
298 }
299 strcpy(pad->name, bpad->name);
300
301 pad->flags = bpad->flags;
302 pad->enable = bpad->enable;
303 pad->idle = bpad->idle;
304 pad->off = bpad->off;
305 pr_debug("%s: Initialized %s\n", __func__, pad->name);
306 }
307
308 return hmux;
309
310err3:
311 kfree(hmux->pads);
312err2:
313 kfree(hmux);
314err1:
315 pr_err("%s: Could not allocate device mux entry\n", __func__);
316
317 return NULL;
318}
319
255#ifdef CONFIG_DEBUG_FS 320#ifdef CONFIG_DEBUG_FS
256 321
257#define OMAP_MUX_MAX_NR_FLAGS 10 322#define OMAP_MUX_MAX_NR_FLAGS 10
diff --git a/arch/arm/mach-omap2/mux.h b/arch/arm/mach-omap2/mux.h
index f5f7f4938057..9c48b9d3ec29 100644
--- a/arch/arm/mach-omap2/mux.h
+++ b/arch/arm/mach-omap2/mux.h
@@ -145,6 +145,32 @@ struct omap_board_mux {
145 u16 value; 145 u16 value;
146}; 146};
147 147
148#define OMAP_DEVICE_PAD_ENABLED BIT(7) /* Not needed for board-*.c */
149#define OMAP_DEVICE_PAD_REMUX BIT(1) /* Dynamically remux a pad,
150 needs enable, idle and off
151 values */
152#define OMAP_DEVICE_PAD_WAKEUP BIT(0) /* Pad is wake-up capable */
153
154/**
155 * struct omap_device_pad - device specific pad configuration
156 * @name: signal name
157 * @flags: pad specific runtime flags
158 * @enable: runtime value for a pad
159 * @idle: idle value for a pad
160 * @off: off value for a pad, defaults to safe mode
161 * @partition: mux partition
162 * @mux: mux register
163 */
164struct omap_device_pad {
165 char *name;
166 u8 flags;
167 u16 enable;
168 u16 idle;
169 u16 off;
170 struct omap_mux_partition *partition;
171 struct omap_mux *mux;
172};
173
148#if defined(CONFIG_OMAP_MUX) 174#if defined(CONFIG_OMAP_MUX)
149 175
150/** 176/**
@@ -161,6 +187,14 @@ int omap_mux_init_gpio(int gpio, int val);
161 */ 187 */
162int omap_mux_init_signal(const char *muxname, int val); 188int omap_mux_init_signal(const char *muxname, int val);
163 189
190/**
191 * omap_hwmod_mux_init - initialize hwmod specific mux data
192 * @bpads: Board specific device signal names
193 * @nr_pads: Number of signal names for the device
194 */
195extern struct omap_hwmod_mux_info *
196omap_hwmod_mux_init(struct omap_device_pad *bpads, int nr_pads);
197
164#else 198#else
165 199
166static inline int omap_mux_init_gpio(int gpio, int val) 200static inline int omap_mux_init_gpio(int gpio, int val)
@@ -172,6 +206,12 @@ static inline int omap_mux_init_signal(char *muxname, int val)
172 return 0; 206 return 0;
173} 207}
174 208
209static inline struct omap_hwmod_mux_info *
210omap_hwmod_mux_init(struct omap_device_pad *bpads, int nr_pads)
211{
212 return NULL;
213}
214
175static struct omap_board_mux *board_mux __initdata __maybe_unused; 215static struct omap_board_mux *board_mux __initdata __maybe_unused;
176 216
177#endif 217#endif
diff --git a/arch/arm/plat-omap/include/plat/omap_hwmod.h b/arch/arm/plat-omap/include/plat/omap_hwmod.h
index b219a88cac2c..6864a997f2ca 100644
--- a/arch/arm/plat-omap/include/plat/omap_hwmod.h
+++ b/arch/arm/plat-omap/include/plat/omap_hwmod.h
@@ -81,6 +81,18 @@ extern struct omap_hwmod_sysc_fields omap_hwmod_sysc_type2;
81#define HWMOD_IDLEMODE_SMART_WKUP (1 << 3) 81#define HWMOD_IDLEMODE_SMART_WKUP (1 << 3)
82 82
83/** 83/**
84 * struct omap_hwmod_mux_info - hwmod specific mux configuration
85 * @pads: array of omap_device_pad entries
86 * @nr_pads: number of omap_device_pad entries
87 *
88 * Note that this is currently built during init as needed.
89 */
90struct omap_hwmod_mux_info {
91 int nr_pads;
92 struct omap_device_pad *pads;
93};
94
95/**
84 * struct omap_hwmod_irq_info - MPU IRQs used by the hwmod 96 * struct omap_hwmod_irq_info - MPU IRQs used by the hwmod
85 * @name: name of the IRQ channel (module local name) 97 * @name: name of the IRQ channel (module local name)
86 * @irq_ch: IRQ channel ID 98 * @irq_ch: IRQ channel ID
@@ -487,6 +499,7 @@ struct omap_hwmod {
487 const char *name; 499 const char *name;
488 struct omap_hwmod_class *class; 500 struct omap_hwmod_class *class;
489 struct omap_device *od; 501 struct omap_device *od;
502 struct omap_hwmod_mux_info *mux;
490 struct omap_hwmod_irq_info *mpu_irqs; 503 struct omap_hwmod_irq_info *mpu_irqs;
491 struct omap_hwmod_dma_info *sdma_reqs; 504 struct omap_hwmod_dma_info *sdma_reqs;
492 struct omap_hwmod_rst_info *rst_lines; 505 struct omap_hwmod_rst_info *rst_lines;