1 /*
2  * linux/arch/arm/mach-omap2/mux.c
3  *
4  * OMAP2, OMAP3 and OMAP4 pin multiplexing configurations
5  *
6  * Copyright (C) 2004 - 2010 Texas Instruments Inc.
7  * Copyright (C) 2003 - 2008 Nokia Corporation
8  *
9  * Written by Tony Lindgren
10  *
11  * This program is free software; you can redistribute it and/or modify
12  * it under the terms of the GNU General Public License as published by
13  * the Free Software Foundation; either version 2 of the License, or
14  * (at your option) any later version.
15  *
16  * This program is distributed in the hope that it will be useful,
17  * but WITHOUT ANY WARRANTY; without even the implied warranty of
18  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19  * GNU General Public License for more details.
20  *
21  * You should have received a copy of the GNU General Public License
22  * along with this program; if not, write to the Free Software
23  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
24  *
25  */
26 #include <linux/kernel.h>
27 #include <linux/init.h>
28 #include <linux/io.h>
29 #include <linux/list.h>
30 #include <linux/slab.h>
31 #include <linux/ctype.h>
32 #include <linux/debugfs.h>
33 #include <linux/seq_file.h>
34 #include <linux/uaccess.h>
35 
36 #include <asm/system.h>
37 
38 #include <plat/omap_hwmod.h>
39 
40 #include "control.h"
41 #include "mux.h"
42 
43 #define OMAP_MUX_BASE_OFFSET		0x30	/* Offset from CTRL_BASE */
44 #define OMAP_MUX_BASE_SZ		0x5ca
45 
46 struct omap_mux_entry {
47 	struct omap_mux		mux;
48 	struct list_head	node;
49 };
50 
51 static LIST_HEAD(mux_partitions);
52 static DEFINE_MUTEX(muxmode_mutex);
53 
omap_mux_get(const char * name)54 struct omap_mux_partition *omap_mux_get(const char *name)
55 {
56 	struct omap_mux_partition *partition;
57 
58 	list_for_each_entry(partition, &mux_partitions, node) {
59 		if (!strcmp(name, partition->name))
60 			return partition;
61 	}
62 
63 	return NULL;
64 }
65 
omap_mux_read(struct omap_mux_partition * partition,u16 reg)66 u16 omap_mux_read(struct omap_mux_partition *partition, u16 reg)
67 {
68 	if (partition->flags & OMAP_MUX_REG_8BIT)
69 		return __raw_readb(partition->base + reg);
70 	else
71 		return __raw_readw(partition->base + reg);
72 }
73 
omap_mux_write(struct omap_mux_partition * partition,u16 val,u16 reg)74 void omap_mux_write(struct omap_mux_partition *partition, u16 val,
75 			   u16 reg)
76 {
77 	if (partition->flags & OMAP_MUX_REG_8BIT)
78 		__raw_writeb(val, partition->base + reg);
79 	else
80 		__raw_writew(val, partition->base + reg);
81 }
82 
omap_mux_write_array(struct omap_mux_partition * partition,struct omap_board_mux * board_mux)83 void omap_mux_write_array(struct omap_mux_partition *partition,
84 				 struct omap_board_mux *board_mux)
85 {
86 	while (board_mux->reg_offset != OMAP_MUX_TERMINATOR) {
87 		omap_mux_write(partition, board_mux->value,
88 			       board_mux->reg_offset);
89 		board_mux++;
90 	}
91 }
92 
93 #ifdef CONFIG_OMAP_MUX
94 
95 static char *omap_mux_options;
96 
_omap_mux_init_gpio(struct omap_mux_partition * partition,int gpio,int val)97 static int __init _omap_mux_init_gpio(struct omap_mux_partition *partition,
98 				      int gpio, int val)
99 {
100 	struct omap_mux_entry *e;
101 	struct omap_mux *gpio_mux = NULL;
102 	u16 old_mode;
103 	u16 mux_mode;
104 	int found = 0;
105 	struct list_head *muxmodes = &partition->muxmodes;
106 
107 	if (!gpio)
108 		return -EINVAL;
109 
110 	list_for_each_entry(e, muxmodes, node) {
111 		struct omap_mux *m = &e->mux;
112 		if (gpio == m->gpio) {
113 			gpio_mux = m;
114 			found++;
115 		}
116 	}
117 
118 	if (found == 0) {
119 		pr_err("%s: Could not set gpio%i\n", __func__, gpio);
120 		return -ENODEV;
121 	}
122 
123 	if (found > 1) {
124 		pr_info("%s: Multiple gpio paths (%d) for gpio%i\n", __func__,
125 			found, gpio);
126 		return -EINVAL;
127 	}
128 
129 	old_mode = omap_mux_read(partition, gpio_mux->reg_offset);
130 	mux_mode = val & ~(OMAP_MUX_NR_MODES - 1);
131 	if (partition->flags & OMAP_MUX_GPIO_IN_MODE3)
132 		mux_mode |= OMAP_MUX_MODE3;
133 	else
134 		mux_mode |= OMAP_MUX_MODE4;
135 	pr_debug("%s: Setting signal %s.gpio%i 0x%04x -> 0x%04x\n", __func__,
136 		 gpio_mux->muxnames[0], gpio, old_mode, mux_mode);
137 	omap_mux_write(partition, mux_mode, gpio_mux->reg_offset);
138 
139 	return 0;
140 }
141 
omap_mux_init_gpio(int gpio,int val)142 int __init omap_mux_init_gpio(int gpio, int val)
143 {
144 	struct omap_mux_partition *partition;
145 	int ret;
146 
147 	list_for_each_entry(partition, &mux_partitions, node) {
148 		ret = _omap_mux_init_gpio(partition, gpio, val);
149 		if (!ret)
150 			return ret;
151 	}
152 
153 	return -ENODEV;
154 }
155 
_omap_mux_get_by_name(struct omap_mux_partition * partition,const char * muxname,struct omap_mux ** found_mux)156 static int __init _omap_mux_get_by_name(struct omap_mux_partition *partition,
157 					const char *muxname,
158 					struct omap_mux **found_mux)
159 {
160 	struct omap_mux *mux = NULL;
161 	struct omap_mux_entry *e;
162 	const char *mode_name;
163 	int found = 0, found_mode = 0, mode0_len = 0;
164 	struct list_head *muxmodes = &partition->muxmodes;
165 
166 	mode_name = strchr(muxname, '.');
167 	if (mode_name) {
168 		mode0_len = strlen(muxname) - strlen(mode_name);
169 		mode_name++;
170 	} else {
171 		mode_name = muxname;
172 	}
173 
174 	list_for_each_entry(e, muxmodes, node) {
175 		char *m0_entry;
176 		int i;
177 
178 		mux = &e->mux;
179 		m0_entry = mux->muxnames[0];
180 
181 		/* First check for full name in mode0.muxmode format */
182 		if (mode0_len && strncmp(muxname, m0_entry, mode0_len))
183 			continue;
184 
185 		/* Then check for muxmode only */
186 		for (i = 0; i < OMAP_MUX_NR_MODES; i++) {
187 			char *mode_cur = mux->muxnames[i];
188 
189 			if (!mode_cur)
190 				continue;
191 
192 			if (!strcmp(mode_name, mode_cur)) {
193 				*found_mux = mux;
194 				found++;
195 				found_mode = i;
196 			}
197 		}
198 	}
199 
200 	if (found == 1) {
201 		return found_mode;
202 	}
203 
204 	if (found > 1) {
205 		pr_err("%s: Multiple signal paths (%i) for %s\n", __func__,
206 		       found, muxname);
207 		return -EINVAL;
208 	}
209 
210 	pr_err("%s: Could not find signal %s\n", __func__, muxname);
211 
212 	return -ENODEV;
213 }
214 
215 static int __init
omap_mux_get_by_name(const char * muxname,struct omap_mux_partition ** found_partition,struct omap_mux ** found_mux)216 omap_mux_get_by_name(const char *muxname,
217 			struct omap_mux_partition **found_partition,
218 			struct omap_mux **found_mux)
219 {
220 	struct omap_mux_partition *partition;
221 
222 	list_for_each_entry(partition, &mux_partitions, node) {
223 		struct omap_mux *mux = NULL;
224 		int mux_mode = _omap_mux_get_by_name(partition, muxname, &mux);
225 		if (mux_mode < 0)
226 			continue;
227 
228 		*found_partition = partition;
229 		*found_mux = mux;
230 
231 		return mux_mode;
232 	}
233 
234 	return -ENODEV;
235 }
236 
omap_mux_init_signal(const char * muxname,int val)237 int __init omap_mux_init_signal(const char *muxname, int val)
238 {
239 	struct omap_mux_partition *partition = NULL;
240 	struct omap_mux *mux = NULL;
241 	u16 old_mode;
242 	int mux_mode;
243 
244 	mux_mode = omap_mux_get_by_name(muxname, &partition, &mux);
245 	if (mux_mode < 0)
246 		return mux_mode;
247 
248 	old_mode = omap_mux_read(partition, mux->reg_offset);
249 	mux_mode |= val;
250 	pr_debug("%s: Setting signal %s 0x%04x -> 0x%04x\n",
251 			 __func__, muxname, old_mode, mux_mode);
252 	omap_mux_write(partition, mux_mode, mux->reg_offset);
253 
254 	return 0;
255 }
256 
257 struct omap_hwmod_mux_info * __init
omap_hwmod_mux_init(struct omap_device_pad * bpads,int nr_pads)258 omap_hwmod_mux_init(struct omap_device_pad *bpads, int nr_pads)
259 {
260 	struct omap_hwmod_mux_info *hmux;
261 	int i, nr_pads_dynamic = 0;
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 
306 		if (pad->flags & OMAP_DEVICE_PAD_REMUX)
307 			nr_pads_dynamic++;
308 
309 		pr_debug("%s: Initialized %s\n", __func__, pad->name);
310 	}
311 
312 	if (!nr_pads_dynamic)
313 		return hmux;
314 
315 	/*
316 	 * Add pads that need dynamic muxing into a separate list
317 	 */
318 
319 	hmux->nr_pads_dynamic = nr_pads_dynamic;
320 	hmux->pads_dynamic = kzalloc(sizeof(struct omap_device_pad *) *
321 					nr_pads_dynamic, GFP_KERNEL);
322 	if (!hmux->pads_dynamic) {
323 		pr_err("%s: Could not allocate dynamic pads\n", __func__);
324 		return hmux;
325 	}
326 
327 	nr_pads_dynamic = 0;
328 	for (i = 0; i < hmux->nr_pads; i++) {
329 		struct omap_device_pad *pad = &hmux->pads[i];
330 
331 		if (pad->flags & OMAP_DEVICE_PAD_REMUX) {
332 			pr_debug("%s: pad %s tagged dynamic\n",
333 					__func__, pad->name);
334 			hmux->pads_dynamic[nr_pads_dynamic] = pad;
335 			nr_pads_dynamic++;
336 		}
337 	}
338 
339 	return hmux;
340 
341 err3:
342 	kfree(hmux->pads);
343 err2:
344 	kfree(hmux);
345 err1:
346 	pr_err("%s: Could not allocate device mux entry\n", __func__);
347 
348 	return NULL;
349 }
350 
351 /* Assumes the calling function takes care of locking */
omap_hwmod_mux(struct omap_hwmod_mux_info * hmux,u8 state)352 void omap_hwmod_mux(struct omap_hwmod_mux_info *hmux, u8 state)
353 {
354 	int i;
355 
356 	/* Runtime idling of dynamic pads */
357 	if (state == _HWMOD_STATE_IDLE && hmux->enabled) {
358 		for (i = 0; i < hmux->nr_pads_dynamic; i++) {
359 			struct omap_device_pad *pad = hmux->pads_dynamic[i];
360 			int val = -EINVAL;
361 
362 			val = pad->idle;
363 			omap_mux_write(pad->partition, val,
364 					pad->mux->reg_offset);
365 		}
366 
367 		return;
368 	}
369 
370 	/* Runtime enabling of dynamic pads */
371 	if ((state == _HWMOD_STATE_ENABLED) && hmux->pads_dynamic
372 					&& hmux->enabled) {
373 		for (i = 0; i < hmux->nr_pads_dynamic; i++) {
374 			struct omap_device_pad *pad = hmux->pads_dynamic[i];
375 			int val = -EINVAL;
376 
377 			val = pad->enable;
378 			omap_mux_write(pad->partition, val,
379 					pad->mux->reg_offset);
380 		}
381 
382 		return;
383 	}
384 
385 	/* Enabling or disabling of all pads */
386 	for (i = 0; i < hmux->nr_pads; i++) {
387 		struct omap_device_pad *pad = &hmux->pads[i];
388 		int flags, val = -EINVAL;
389 
390 		flags = pad->flags;
391 
392 		switch (state) {
393 		case _HWMOD_STATE_ENABLED:
394 			val = pad->enable;
395 			pr_debug("%s: Enabling %s %x\n", __func__,
396 					pad->name, val);
397 			break;
398 		case _HWMOD_STATE_DISABLED:
399 			/* Use safe mode unless OMAP_DEVICE_PAD_REMUX */
400 			if (flags & OMAP_DEVICE_PAD_REMUX)
401 				val = pad->off;
402 			else
403 				val = OMAP_MUX_MODE7;
404 			pr_debug("%s: Disabling %s %x\n", __func__,
405 					pad->name, val);
406 			break;
407 		default:
408 			/* Nothing to be done */
409 			break;
410 		};
411 
412 		if (val >= 0) {
413 			omap_mux_write(pad->partition, val,
414 					pad->mux->reg_offset);
415 			pad->flags = flags;
416 		}
417 	}
418 
419 	if (state == _HWMOD_STATE_ENABLED)
420 		hmux->enabled = true;
421 	else
422 		hmux->enabled = false;
423 }
424 
425 #ifdef CONFIG_DEBUG_FS
426 
427 #define OMAP_MUX_MAX_NR_FLAGS	10
428 #define OMAP_MUX_TEST_FLAG(val, mask)				\
429 	if (((val) & (mask)) == (mask)) {			\
430 		i++;						\
431 		flags[i] =  #mask;				\
432 	}
433 
434 /* REVISIT: Add checking for non-optimal mux settings */
omap_mux_decode(struct seq_file * s,u16 val)435 static inline void omap_mux_decode(struct seq_file *s, u16 val)
436 {
437 	char *flags[OMAP_MUX_MAX_NR_FLAGS];
438 	char mode[sizeof("OMAP_MUX_MODE") + 1];
439 	int i = -1;
440 
441 	sprintf(mode, "OMAP_MUX_MODE%d", val & 0x7);
442 	i++;
443 	flags[i] = mode;
444 
445 	OMAP_MUX_TEST_FLAG(val, OMAP_PIN_OFF_WAKEUPENABLE);
446 	if (val & OMAP_OFF_EN) {
447 		if (!(val & OMAP_OFFOUT_EN)) {
448 			if (!(val & OMAP_OFF_PULL_UP)) {
449 				OMAP_MUX_TEST_FLAG(val,
450 					OMAP_PIN_OFF_INPUT_PULLDOWN);
451 			} else {
452 				OMAP_MUX_TEST_FLAG(val,
453 					OMAP_PIN_OFF_INPUT_PULLUP);
454 			}
455 		} else {
456 			if (!(val & OMAP_OFFOUT_VAL)) {
457 				OMAP_MUX_TEST_FLAG(val,
458 					OMAP_PIN_OFF_OUTPUT_LOW);
459 			} else {
460 				OMAP_MUX_TEST_FLAG(val,
461 					OMAP_PIN_OFF_OUTPUT_HIGH);
462 			}
463 		}
464 	}
465 
466 	if (val & OMAP_INPUT_EN) {
467 		if (val & OMAP_PULL_ENA) {
468 			if (!(val & OMAP_PULL_UP)) {
469 				OMAP_MUX_TEST_FLAG(val,
470 					OMAP_PIN_INPUT_PULLDOWN);
471 			} else {
472 				OMAP_MUX_TEST_FLAG(val, OMAP_PIN_INPUT_PULLUP);
473 			}
474 		} else {
475 			OMAP_MUX_TEST_FLAG(val, OMAP_PIN_INPUT);
476 		}
477 	} else {
478 		i++;
479 		flags[i] = "OMAP_PIN_OUTPUT";
480 	}
481 
482 	do {
483 		seq_printf(s, "%s", flags[i]);
484 		if (i > 0)
485 			seq_printf(s, " | ");
486 	} while (i-- > 0);
487 }
488 
489 #define OMAP_MUX_DEFNAME_LEN	32
490 
omap_mux_dbg_board_show(struct seq_file * s,void * unused)491 static int omap_mux_dbg_board_show(struct seq_file *s, void *unused)
492 {
493 	struct omap_mux_partition *partition = s->private;
494 	struct omap_mux_entry *e;
495 	u8 omap_gen = omap_rev() >> 28;
496 
497 	list_for_each_entry(e, &partition->muxmodes, node) {
498 		struct omap_mux *m = &e->mux;
499 		char m0_def[OMAP_MUX_DEFNAME_LEN];
500 		char *m0_name = m->muxnames[0];
501 		u16 val;
502 		int i, mode;
503 
504 		if (!m0_name)
505 			continue;
506 
507 		/* REVISIT: Needs to be updated if mode0 names get longer */
508 		for (i = 0; i < OMAP_MUX_DEFNAME_LEN; i++) {
509 			if (m0_name[i] == '\0') {
510 				m0_def[i] = m0_name[i];
511 				break;
512 			}
513 			m0_def[i] = toupper(m0_name[i]);
514 		}
515 		val = omap_mux_read(partition, m->reg_offset);
516 		mode = val & OMAP_MUX_MODE7;
517 		if (mode != 0)
518 			seq_printf(s, "/* %s */\n", m->muxnames[mode]);
519 
520 		/*
521 		 * XXX: Might be revisited to support differences across
522 		 * same OMAP generation.
523 		 */
524 		seq_printf(s, "OMAP%d_MUX(%s, ", omap_gen, m0_def);
525 		omap_mux_decode(s, val);
526 		seq_printf(s, "),\n");
527 	}
528 
529 	return 0;
530 }
531 
omap_mux_dbg_board_open(struct inode * inode,struct file * file)532 static int omap_mux_dbg_board_open(struct inode *inode, struct file *file)
533 {
534 	return single_open(file, omap_mux_dbg_board_show, inode->i_private);
535 }
536 
537 static const struct file_operations omap_mux_dbg_board_fops = {
538 	.open		= omap_mux_dbg_board_open,
539 	.read		= seq_read,
540 	.llseek		= seq_lseek,
541 	.release	= single_release,
542 };
543 
omap_mux_get_partition(struct omap_mux * mux)544 static struct omap_mux_partition *omap_mux_get_partition(struct omap_mux *mux)
545 {
546 	struct omap_mux_partition *partition;
547 
548 	list_for_each_entry(partition, &mux_partitions, node) {
549 		struct list_head *muxmodes = &partition->muxmodes;
550 		struct omap_mux_entry *e;
551 
552 		list_for_each_entry(e, muxmodes, node) {
553 			struct omap_mux *m = &e->mux;
554 
555 			if (m == mux)
556 				return partition;
557 		}
558 	}
559 
560 	return NULL;
561 }
562 
omap_mux_dbg_signal_show(struct seq_file * s,void * unused)563 static int omap_mux_dbg_signal_show(struct seq_file *s, void *unused)
564 {
565 	struct omap_mux *m = s->private;
566 	struct omap_mux_partition *partition;
567 	const char *none = "NA";
568 	u16 val;
569 	int mode;
570 
571 	partition = omap_mux_get_partition(m);
572 	if (!partition)
573 		return 0;
574 
575 	val = omap_mux_read(partition, m->reg_offset);
576 	mode = val & OMAP_MUX_MODE7;
577 
578 	seq_printf(s, "name: %s.%s (0x%08x/0x%03x = 0x%04x), b %s, t %s\n",
579 			m->muxnames[0], m->muxnames[mode],
580 			partition->phys + m->reg_offset, m->reg_offset, val,
581 			m->balls[0] ? m->balls[0] : none,
582 			m->balls[1] ? m->balls[1] : none);
583 	seq_printf(s, "mode: ");
584 	omap_mux_decode(s, val);
585 	seq_printf(s, "\n");
586 	seq_printf(s, "signals: %s | %s | %s | %s | %s | %s | %s | %s\n",
587 			m->muxnames[0] ? m->muxnames[0] : none,
588 			m->muxnames[1] ? m->muxnames[1] : none,
589 			m->muxnames[2] ? m->muxnames[2] : none,
590 			m->muxnames[3] ? m->muxnames[3] : none,
591 			m->muxnames[4] ? m->muxnames[4] : none,
592 			m->muxnames[5] ? m->muxnames[5] : none,
593 			m->muxnames[6] ? m->muxnames[6] : none,
594 			m->muxnames[7] ? m->muxnames[7] : none);
595 
596 	return 0;
597 }
598 
599 #define OMAP_MUX_MAX_ARG_CHAR  7
600 
omap_mux_dbg_signal_write(struct file * file,const char __user * user_buf,size_t count,loff_t * ppos)601 static ssize_t omap_mux_dbg_signal_write(struct file *file,
602 					 const char __user *user_buf,
603 					 size_t count, loff_t *ppos)
604 {
605 	char buf[OMAP_MUX_MAX_ARG_CHAR];
606 	struct seq_file *seqf;
607 	struct omap_mux *m;
608 	unsigned long val;
609 	int buf_size, ret;
610 	struct omap_mux_partition *partition;
611 
612 	if (count > OMAP_MUX_MAX_ARG_CHAR)
613 		return -EINVAL;
614 
615 	memset(buf, 0, sizeof(buf));
616 	buf_size = min(count, sizeof(buf) - 1);
617 
618 	if (copy_from_user(buf, user_buf, buf_size))
619 		return -EFAULT;
620 
621 	ret = strict_strtoul(buf, 0x10, &val);
622 	if (ret < 0)
623 		return ret;
624 
625 	if (val > 0xffff)
626 		return -EINVAL;
627 
628 	seqf = file->private_data;
629 	m = seqf->private;
630 
631 	partition = omap_mux_get_partition(m);
632 	if (!partition)
633 		return -ENODEV;
634 
635 	omap_mux_write(partition, (u16)val, m->reg_offset);
636 	*ppos += count;
637 
638 	return count;
639 }
640 
omap_mux_dbg_signal_open(struct inode * inode,struct file * file)641 static int omap_mux_dbg_signal_open(struct inode *inode, struct file *file)
642 {
643 	return single_open(file, omap_mux_dbg_signal_show, inode->i_private);
644 }
645 
646 static const struct file_operations omap_mux_dbg_signal_fops = {
647 	.open		= omap_mux_dbg_signal_open,
648 	.read		= seq_read,
649 	.write		= omap_mux_dbg_signal_write,
650 	.llseek		= seq_lseek,
651 	.release	= single_release,
652 };
653 
654 static struct dentry *mux_dbg_dir;
655 
omap_mux_dbg_create_entry(struct omap_mux_partition * partition,struct dentry * mux_dbg_dir)656 static void __init omap_mux_dbg_create_entry(
657 				struct omap_mux_partition *partition,
658 				struct dentry *mux_dbg_dir)
659 {
660 	struct omap_mux_entry *e;
661 
662 	list_for_each_entry(e, &partition->muxmodes, node) {
663 		struct omap_mux *m = &e->mux;
664 
665 		(void)debugfs_create_file(m->muxnames[0], S_IWUSR, mux_dbg_dir,
666 					  m, &omap_mux_dbg_signal_fops);
667 	}
668 }
669 
omap_mux_dbg_init(void)670 static void __init omap_mux_dbg_init(void)
671 {
672 	struct omap_mux_partition *partition;
673 	static struct dentry *mux_dbg_board_dir;
674 
675 	mux_dbg_dir = debugfs_create_dir("omap_mux", NULL);
676 	if (!mux_dbg_dir)
677 		return;
678 
679 	mux_dbg_board_dir = debugfs_create_dir("board", mux_dbg_dir);
680 	if (!mux_dbg_board_dir)
681 		return;
682 
683 	list_for_each_entry(partition, &mux_partitions, node) {
684 		omap_mux_dbg_create_entry(partition, mux_dbg_dir);
685 		(void)debugfs_create_file(partition->name, S_IRUGO,
686 					  mux_dbg_board_dir, partition,
687 					  &omap_mux_dbg_board_fops);
688 	}
689 }
690 
691 #else
omap_mux_dbg_init(void)692 static inline void omap_mux_dbg_init(void)
693 {
694 }
695 #endif	/* CONFIG_DEBUG_FS */
696 
omap_mux_free_names(struct omap_mux * m)697 static void __init omap_mux_free_names(struct omap_mux *m)
698 {
699 	int i;
700 
701 	for (i = 0; i < OMAP_MUX_NR_MODES; i++)
702 		kfree(m->muxnames[i]);
703 
704 #ifdef CONFIG_DEBUG_FS
705 	for (i = 0; i < OMAP_MUX_NR_SIDES; i++)
706 		kfree(m->balls[i]);
707 #endif
708 
709 }
710 
711 /* Free all data except for GPIO pins unless CONFIG_DEBUG_FS is set */
omap_mux_late_init(void)712 static int __init omap_mux_late_init(void)
713 {
714 	struct omap_mux_partition *partition;
715 
716 	list_for_each_entry(partition, &mux_partitions, node) {
717 		struct omap_mux_entry *e, *tmp;
718 		list_for_each_entry_safe(e, tmp, &partition->muxmodes, node) {
719 			struct omap_mux *m = &e->mux;
720 			u16 mode = omap_mux_read(partition, m->reg_offset);
721 
722 			if (OMAP_MODE_GPIO(mode))
723 				continue;
724 
725 #ifndef CONFIG_DEBUG_FS
726 			mutex_lock(&muxmode_mutex);
727 			list_del(&e->node);
728 			mutex_unlock(&muxmode_mutex);
729 			omap_mux_free_names(m);
730 			kfree(m);
731 #endif
732 		}
733 	}
734 
735 	omap_mux_dbg_init();
736 
737 	return 0;
738 }
739 late_initcall(omap_mux_late_init);
740 
omap_mux_package_fixup(struct omap_mux * p,struct omap_mux * superset)741 static void __init omap_mux_package_fixup(struct omap_mux *p,
742 					struct omap_mux *superset)
743 {
744 	while (p->reg_offset !=  OMAP_MUX_TERMINATOR) {
745 		struct omap_mux *s = superset;
746 		int found = 0;
747 
748 		while (s->reg_offset != OMAP_MUX_TERMINATOR) {
749 			if (s->reg_offset == p->reg_offset) {
750 				*s = *p;
751 				found++;
752 				break;
753 			}
754 			s++;
755 		}
756 		if (!found)
757 			pr_err("%s: Unknown entry offset 0x%x\n", __func__,
758 			       p->reg_offset);
759 		p++;
760 	}
761 }
762 
763 #ifdef CONFIG_DEBUG_FS
764 
omap_mux_package_init_balls(struct omap_ball * b,struct omap_mux * superset)765 static void __init omap_mux_package_init_balls(struct omap_ball *b,
766 				struct omap_mux *superset)
767 {
768 	while (b->reg_offset != OMAP_MUX_TERMINATOR) {
769 		struct omap_mux *s = superset;
770 		int found = 0;
771 
772 		while (s->reg_offset != OMAP_MUX_TERMINATOR) {
773 			if (s->reg_offset == b->reg_offset) {
774 				s->balls[0] = b->balls[0];
775 				s->balls[1] = b->balls[1];
776 				found++;
777 				break;
778 			}
779 			s++;
780 		}
781 		if (!found)
782 			pr_err("%s: Unknown ball offset 0x%x\n", __func__,
783 			       b->reg_offset);
784 		b++;
785 	}
786 }
787 
788 #else	/* CONFIG_DEBUG_FS */
789 
omap_mux_package_init_balls(struct omap_ball * b,struct omap_mux * superset)790 static inline void omap_mux_package_init_balls(struct omap_ball *b,
791 					struct omap_mux *superset)
792 {
793 }
794 
795 #endif	/* CONFIG_DEBUG_FS */
796 
omap_mux_setup(char * options)797 static int __init omap_mux_setup(char *options)
798 {
799 	if (!options)
800 		return 0;
801 
802 	omap_mux_options = options;
803 
804 	return 1;
805 }
806 __setup("omap_mux=", omap_mux_setup);
807 
808 /*
809  * Note that the omap_mux=some.signal1=0x1234,some.signal2=0x1234
810  * cmdline options only override the bootloader values.
811  * During development, please enable CONFIG_DEBUG_FS, and use the
812  * signal specific entries under debugfs.
813  */
omap_mux_set_cmdline_signals(void)814 static void __init omap_mux_set_cmdline_signals(void)
815 {
816 	char *options, *next_opt, *token;
817 
818 	if (!omap_mux_options)
819 		return;
820 
821 	options = kmalloc(strlen(omap_mux_options) + 1, GFP_KERNEL);
822 	if (!options)
823 		return;
824 
825 	strcpy(options, omap_mux_options);
826 	next_opt = options;
827 
828 	while ((token = strsep(&next_opt, ",")) != NULL) {
829 		char *keyval, *name;
830 		unsigned long val;
831 
832 		keyval = token;
833 		name = strsep(&keyval, "=");
834 		if (name) {
835 			int res;
836 
837 			res = strict_strtoul(keyval, 0x10, &val);
838 			if (res < 0)
839 				continue;
840 
841 			omap_mux_init_signal(name, (u16)val);
842 		}
843 	}
844 
845 	kfree(options);
846 }
847 
omap_mux_copy_names(struct omap_mux * src,struct omap_mux * dst)848 static int __init omap_mux_copy_names(struct omap_mux *src,
849 				      struct omap_mux *dst)
850 {
851 	int i;
852 
853 	for (i = 0; i < OMAP_MUX_NR_MODES; i++) {
854 		if (src->muxnames[i]) {
855 			dst->muxnames[i] =
856 				kmalloc(strlen(src->muxnames[i]) + 1,
857 					GFP_KERNEL);
858 			if (!dst->muxnames[i])
859 				goto free;
860 			strcpy(dst->muxnames[i], src->muxnames[i]);
861 		}
862 	}
863 
864 #ifdef CONFIG_DEBUG_FS
865 	for (i = 0; i < OMAP_MUX_NR_SIDES; i++) {
866 		if (src->balls[i]) {
867 			dst->balls[i] =
868 				kmalloc(strlen(src->balls[i]) + 1,
869 					GFP_KERNEL);
870 			if (!dst->balls[i])
871 				goto free;
872 			strcpy(dst->balls[i], src->balls[i]);
873 		}
874 	}
875 #endif
876 
877 	return 0;
878 
879 free:
880 	omap_mux_free_names(dst);
881 	return -ENOMEM;
882 
883 }
884 
885 #endif	/* CONFIG_OMAP_MUX */
886 
omap_mux_get_by_gpio(struct omap_mux_partition * partition,int gpio)887 static struct omap_mux *omap_mux_get_by_gpio(
888 				struct omap_mux_partition *partition,
889 				int gpio)
890 {
891 	struct omap_mux_entry *e;
892 	struct omap_mux *ret = NULL;
893 
894 	list_for_each_entry(e, &partition->muxmodes, node) {
895 		struct omap_mux *m = &e->mux;
896 		if (m->gpio == gpio) {
897 			ret = m;
898 			break;
899 		}
900 	}
901 
902 	return ret;
903 }
904 
905 /* Needed for dynamic muxing of GPIO pins for off-idle */
omap_mux_get_gpio(int gpio)906 u16 omap_mux_get_gpio(int gpio)
907 {
908 	struct omap_mux_partition *partition;
909 	struct omap_mux *m;
910 
911 	list_for_each_entry(partition, &mux_partitions, node) {
912 		m = omap_mux_get_by_gpio(partition, gpio);
913 		if (m)
914 			return omap_mux_read(partition, m->reg_offset);
915 	}
916 
917 	if (!m || m->reg_offset == OMAP_MUX_TERMINATOR)
918 		pr_err("%s: Could not get gpio%i\n", __func__, gpio);
919 
920 	return OMAP_MUX_TERMINATOR;
921 }
922 
923 /* Needed for dynamic muxing of GPIO pins for off-idle */
omap_mux_set_gpio(u16 val,int gpio)924 void omap_mux_set_gpio(u16 val, int gpio)
925 {
926 	struct omap_mux_partition *partition;
927 	struct omap_mux *m = NULL;
928 
929 	list_for_each_entry(partition, &mux_partitions, node) {
930 		m = omap_mux_get_by_gpio(partition, gpio);
931 		if (m) {
932 			omap_mux_write(partition, val, m->reg_offset);
933 			return;
934 		}
935 	}
936 
937 	if (!m || m->reg_offset == OMAP_MUX_TERMINATOR)
938 		pr_err("%s: Could not set gpio%i\n", __func__, gpio);
939 }
940 
omap_mux_list_add(struct omap_mux_partition * partition,struct omap_mux * src)941 static struct omap_mux * __init omap_mux_list_add(
942 					struct omap_mux_partition *partition,
943 					struct omap_mux *src)
944 {
945 	struct omap_mux_entry *entry;
946 	struct omap_mux *m;
947 
948 	entry = kzalloc(sizeof(struct omap_mux_entry), GFP_KERNEL);
949 	if (!entry)
950 		return NULL;
951 
952 	m = &entry->mux;
953 	entry->mux = *src;
954 
955 #ifdef CONFIG_OMAP_MUX
956 	if (omap_mux_copy_names(src, m)) {
957 		kfree(entry);
958 		return NULL;
959 	}
960 #endif
961 
962 	mutex_lock(&muxmode_mutex);
963 	list_add_tail(&entry->node, &partition->muxmodes);
964 	mutex_unlock(&muxmode_mutex);
965 
966 	return m;
967 }
968 
969 /*
970  * Note if CONFIG_OMAP_MUX is not selected, we will only initialize
971  * the GPIO to mux offset mapping that is needed for dynamic muxing
972  * of GPIO pins for off-idle.
973  */
omap_mux_init_list(struct omap_mux_partition * partition,struct omap_mux * superset)974 static void __init omap_mux_init_list(struct omap_mux_partition *partition,
975 				      struct omap_mux *superset)
976 {
977 	while (superset->reg_offset !=  OMAP_MUX_TERMINATOR) {
978 		struct omap_mux *entry;
979 
980 #ifdef CONFIG_OMAP_MUX
981 		if (!superset->muxnames || !superset->muxnames[0]) {
982 			superset++;
983 			continue;
984 		}
985 #else
986 		/* Skip pins that are not muxed as GPIO by bootloader */
987 		if (!OMAP_MODE_GPIO(omap_mux_read(partition,
988 				    superset->reg_offset))) {
989 			superset++;
990 			continue;
991 		}
992 #endif
993 
994 		entry = omap_mux_list_add(partition, superset);
995 		if (!entry) {
996 			pr_err("%s: Could not add entry\n", __func__);
997 			return;
998 		}
999 		superset++;
1000 	}
1001 }
1002 
1003 #ifdef CONFIG_OMAP_MUX
1004 
omap_mux_init_package(struct omap_mux * superset,struct omap_mux * package_subset,struct omap_ball * package_balls)1005 static void omap_mux_init_package(struct omap_mux *superset,
1006 				  struct omap_mux *package_subset,
1007 				  struct omap_ball *package_balls)
1008 {
1009 	if (package_subset)
1010 		omap_mux_package_fixup(package_subset, superset);
1011 	if (package_balls)
1012 		omap_mux_package_init_balls(package_balls, superset);
1013 }
1014 
omap_mux_init_signals(struct omap_mux_partition * partition,struct omap_board_mux * board_mux)1015 static void omap_mux_init_signals(struct omap_mux_partition *partition,
1016 				  struct omap_board_mux *board_mux)
1017 {
1018 	omap_mux_set_cmdline_signals();
1019 	omap_mux_write_array(partition, board_mux);
1020 }
1021 
1022 #else
1023 
omap_mux_init_package(struct omap_mux * superset,struct omap_mux * package_subset,struct omap_ball * package_balls)1024 static void omap_mux_init_package(struct omap_mux *superset,
1025 				  struct omap_mux *package_subset,
1026 				  struct omap_ball *package_balls)
1027 {
1028 }
1029 
omap_mux_init_signals(struct omap_mux_partition * partition,struct omap_board_mux * board_mux)1030 static void omap_mux_init_signals(struct omap_mux_partition *partition,
1031 				  struct omap_board_mux *board_mux)
1032 {
1033 }
1034 
1035 #endif
1036 
1037 static u32 mux_partitions_cnt;
1038 
omap_mux_init(const char * name,u32 flags,u32 mux_pbase,u32 mux_size,struct omap_mux * superset,struct omap_mux * package_subset,struct omap_board_mux * board_mux,struct omap_ball * package_balls)1039 int __init omap_mux_init(const char *name, u32 flags,
1040 			 u32 mux_pbase, u32 mux_size,
1041 			 struct omap_mux *superset,
1042 			 struct omap_mux *package_subset,
1043 			 struct omap_board_mux *board_mux,
1044 			 struct omap_ball *package_balls)
1045 {
1046 	struct omap_mux_partition *partition;
1047 
1048 	partition = kzalloc(sizeof(struct omap_mux_partition), GFP_KERNEL);
1049 	if (!partition)
1050 		return -ENOMEM;
1051 
1052 	partition->name = name;
1053 	partition->flags = flags;
1054 	partition->size = mux_size;
1055 	partition->phys = mux_pbase;
1056 	partition->base = ioremap(mux_pbase, mux_size);
1057 	if (!partition->base) {
1058 		pr_err("%s: Could not ioremap mux partition at 0x%08x\n",
1059 			__func__, partition->phys);
1060 		kfree(partition);
1061 		return -ENODEV;
1062 	}
1063 
1064 	INIT_LIST_HEAD(&partition->muxmodes);
1065 
1066 	list_add_tail(&partition->node, &mux_partitions);
1067 	mux_partitions_cnt++;
1068 	pr_info("%s: Add partition: #%d: %s, flags: %x\n", __func__,
1069 		mux_partitions_cnt, partition->name, partition->flags);
1070 
1071 	omap_mux_init_package(superset, package_subset, package_balls);
1072 	omap_mux_init_list(partition, superset);
1073 	omap_mux_init_signals(partition, board_mux);
1074 
1075 	return 0;
1076 }
1077 
1078