aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTony Lindgren <tony@atomide.com>2010-12-22 21:42:35 -0500
committerTony Lindgren <tony@atomide.com>2010-12-22 21:42:35 -0500
commit9796b323b5a1940f9ec62c3a6cf7e442bf540d53 (patch)
tree8fb2b57e5cbc7cfdfc5a26c4f5daf6f8c884353e
parent8419fdbaf2118a0a169441be82f09f7be93a5ca1 (diff)
omap2+: Add support for hwmod specific muxing of devices
This allows adding hwmod specific pads dynamically during the platform device init. Note that we don't currently have the hwmod specific signals listed in the hwmod data, but struct omap_hwmod_mux_info will make that possible if necessary. Signed-off-by: Tony Lindgren <tony@atomide.com>
-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;