2 * linux/arch/arm/mach-omap2/mux.c
4 * OMAP2, OMAP3 and OMAP4 pin multiplexing configurations
6 * Copyright (C) 2004 - 2010 Texas Instruments Inc.
7 * Copyright (C) 2003 - 2008 Nokia Corporation
9 * Written by Tony Lindgren
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.
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.
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
26 #include <linux/kernel.h>
27 #include <linux/init.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>
36 #include <asm/system.h>
38 #include <plat/omap_hwmod.h>
43 #define OMAP_MUX_BASE_OFFSET 0x30 /* Offset from CTRL_BASE */
44 #define OMAP_MUX_BASE_SZ 0x5ca
46 struct omap_mux_entry
{
48 struct list_head node
;
51 static LIST_HEAD(mux_partitions
);
52 static DEFINE_MUTEX(muxmode_mutex
);
54 struct omap_mux_partition
*omap_mux_get(const char *name
)
56 struct omap_mux_partition
*partition
;
58 list_for_each_entry(partition
, &mux_partitions
, node
) {
59 if (!strcmp(name
, partition
->name
))
66 u16
omap_mux_read(struct omap_mux_partition
*partition
, u16 reg
)
68 if (partition
->flags
& OMAP_MUX_REG_8BIT
)
69 return __raw_readb(partition
->base
+ reg
);
71 return __raw_readw(partition
->base
+ reg
);
74 void omap_mux_write(struct omap_mux_partition
*partition
, u16 val
,
77 if (partition
->flags
& OMAP_MUX_REG_8BIT
)
78 __raw_writeb(val
, partition
->base
+ reg
);
80 __raw_writew(val
, partition
->base
+ reg
);
83 void omap_mux_write_array(struct omap_mux_partition
*partition
,
84 struct omap_board_mux
*board_mux
)
86 while (board_mux
->reg_offset
!= OMAP_MUX_TERMINATOR
) {
87 omap_mux_write(partition
, board_mux
->value
,
88 board_mux
->reg_offset
);
93 #ifdef CONFIG_OMAP_MUX
95 static char *omap_mux_options
;
97 static int __init
_omap_mux_init_gpio(struct omap_mux_partition
*partition
,
100 struct omap_mux_entry
*e
;
101 struct omap_mux
*gpio_mux
= NULL
;
105 struct list_head
*muxmodes
= &partition
->muxmodes
;
110 list_for_each_entry(e
, muxmodes
, node
) {
111 struct omap_mux
*m
= &e
->mux
;
112 if (gpio
== m
->gpio
) {
119 pr_err("%s: Could not set gpio%i\n", __func__
, gpio
);
124 pr_info("%s: Multiple gpio paths (%d) for gpio%i\n", __func__
,
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
;
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
);
142 int __init
omap_mux_init_gpio(int gpio
, int val
)
144 struct omap_mux_partition
*partition
;
147 list_for_each_entry(partition
, &mux_partitions
, node
) {
148 ret
= _omap_mux_init_gpio(partition
, gpio
, val
);
156 static int __init
_omap_mux_get_by_name(struct omap_mux_partition
*partition
,
158 struct omap_mux
**found_mux
)
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
;
166 mode_name
= strchr(muxname
, '.');
168 mode0_len
= strlen(muxname
) - strlen(mode_name
);
174 list_for_each_entry(e
, muxmodes
, node
) {
179 m0_entry
= mux
->muxnames
[0];
181 /* First check for full name in mode0.muxmode format */
182 if (mode0_len
&& strncmp(muxname
, m0_entry
, mode0_len
))
185 /* Then check for muxmode only */
186 for (i
= 0; i
< OMAP_MUX_NR_MODES
; i
++) {
187 char *mode_cur
= mux
->muxnames
[i
];
192 if (!strcmp(mode_name
, mode_cur
)) {
205 pr_err("%s: Multiple signal paths (%i) for %s\n", __func__
,
210 pr_err("%s: Could not find signal %s\n", __func__
, muxname
);
216 omap_mux_get_by_name(const char *muxname
,
217 struct omap_mux_partition
**found_partition
,
218 struct omap_mux
**found_mux
)
220 struct omap_mux_partition
*partition
;
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
);
228 *found_partition
= partition
;
237 int __init
omap_mux_init_signal(const char *muxname
, int val
)
239 struct omap_mux_partition
*partition
= NULL
;
240 struct omap_mux
*mux
= NULL
;
244 mux_mode
= omap_mux_get_by_name(muxname
, &partition
, &mux
);
248 old_mode
= omap_mux_read(partition
, mux
->reg_offset
);
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
);
257 struct omap_hwmod_mux_info
* __init
258 omap_hwmod_mux_init(struct omap_device_pad
*bpads
, int nr_pads
)
260 struct omap_hwmod_mux_info
*hmux
;
263 if (!bpads
|| nr_pads
< 1)
266 hmux
= kzalloc(sizeof(struct omap_hwmod_mux_info
), GFP_KERNEL
);
270 hmux
->nr_pads
= nr_pads
;
272 hmux
->pads
= kzalloc(sizeof(struct omap_device_pad
) *
273 nr_pads
, GFP_KERNEL
);
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
;
283 mux_mode
= omap_mux_get_by_name(bpad
->name
, &partition
, &mux
);
287 pad
->partition
= partition
;
291 pad
->name
= kzalloc(strlen(bpad
->name
) + 1, GFP_KERNEL
);
295 for (j
= i
- 1; j
>= 0; j
--)
296 kfree(hmux
->pads
[j
].name
);
299 strcpy(pad
->name
, bpad
->name
);
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
);
315 pr_err("%s: Could not allocate device mux entry\n", __func__
);
320 /* Assumes the calling function takes care of locking */
321 void omap_hwmod_mux(struct omap_hwmod_mux_info
*hmux
, u8 state
)
325 for (i
= 0; i
< hmux
->nr_pads
; i
++) {
326 struct omap_device_pad
*pad
= &hmux
->pads
[i
];
327 int flags
, val
= -EINVAL
;
332 case _HWMOD_STATE_ENABLED
:
333 if (flags
& OMAP_DEVICE_PAD_ENABLED
)
335 flags
|= OMAP_DEVICE_PAD_ENABLED
;
337 pr_debug("%s: Enabling %s %x\n", __func__
,
340 case _HWMOD_STATE_IDLE
:
341 if (!(flags
& OMAP_DEVICE_PAD_REMUX
))
343 flags
&= ~OMAP_DEVICE_PAD_ENABLED
;
345 pr_debug("%s: Idling %s %x\n", __func__
,
348 case _HWMOD_STATE_DISABLED
:
350 /* Use safe mode unless OMAP_DEVICE_PAD_REMUX */
351 if (flags
& OMAP_DEVICE_PAD_REMUX
)
354 val
= OMAP_MUX_MODE7
;
355 flags
&= ~OMAP_DEVICE_PAD_ENABLED
;
356 pr_debug("%s: Disabling %s %x\n", __func__
,
361 omap_mux_write(pad
->partition
, val
,
362 pad
->mux
->reg_offset
);
368 #ifdef CONFIG_DEBUG_FS
370 #define OMAP_MUX_MAX_NR_FLAGS 10
371 #define OMAP_MUX_TEST_FLAG(val, mask) \
372 if (((val) & (mask)) == (mask)) { \
377 /* REVISIT: Add checking for non-optimal mux settings */
378 static inline void omap_mux_decode(struct seq_file
*s
, u16 val
)
380 char *flags
[OMAP_MUX_MAX_NR_FLAGS
];
381 char mode
[sizeof("OMAP_MUX_MODE") + 1];
384 sprintf(mode
, "OMAP_MUX_MODE%d", val
& 0x7);
388 OMAP_MUX_TEST_FLAG(val
, OMAP_PIN_OFF_WAKEUPENABLE
);
389 if (val
& OMAP_OFF_EN
) {
390 if (!(val
& OMAP_OFFOUT_EN
)) {
391 if (!(val
& OMAP_OFF_PULL_UP
)) {
392 OMAP_MUX_TEST_FLAG(val
,
393 OMAP_PIN_OFF_INPUT_PULLDOWN
);
395 OMAP_MUX_TEST_FLAG(val
,
396 OMAP_PIN_OFF_INPUT_PULLUP
);
399 if (!(val
& OMAP_OFFOUT_VAL
)) {
400 OMAP_MUX_TEST_FLAG(val
,
401 OMAP_PIN_OFF_OUTPUT_LOW
);
403 OMAP_MUX_TEST_FLAG(val
,
404 OMAP_PIN_OFF_OUTPUT_HIGH
);
409 if (val
& OMAP_INPUT_EN
) {
410 if (val
& OMAP_PULL_ENA
) {
411 if (!(val
& OMAP_PULL_UP
)) {
412 OMAP_MUX_TEST_FLAG(val
,
413 OMAP_PIN_INPUT_PULLDOWN
);
415 OMAP_MUX_TEST_FLAG(val
, OMAP_PIN_INPUT_PULLUP
);
418 OMAP_MUX_TEST_FLAG(val
, OMAP_PIN_INPUT
);
422 flags
[i
] = "OMAP_PIN_OUTPUT";
426 seq_printf(s
, "%s", flags
[i
]);
428 seq_printf(s
, " | ");
432 #define OMAP_MUX_DEFNAME_LEN 32
434 static int omap_mux_dbg_board_show(struct seq_file
*s
, void *unused
)
436 struct omap_mux_partition
*partition
= s
->private;
437 struct omap_mux_entry
*e
;
438 u8 omap_gen
= omap_rev() >> 28;
440 list_for_each_entry(e
, &partition
->muxmodes
, node
) {
441 struct omap_mux
*m
= &e
->mux
;
442 char m0_def
[OMAP_MUX_DEFNAME_LEN
];
443 char *m0_name
= m
->muxnames
[0];
450 /* REVISIT: Needs to be updated if mode0 names get longer */
451 for (i
= 0; i
< OMAP_MUX_DEFNAME_LEN
; i
++) {
452 if (m0_name
[i
] == '\0') {
453 m0_def
[i
] = m0_name
[i
];
456 m0_def
[i
] = toupper(m0_name
[i
]);
458 val
= omap_mux_read(partition
, m
->reg_offset
);
459 mode
= val
& OMAP_MUX_MODE7
;
461 seq_printf(s
, "/* %s */\n", m
->muxnames
[mode
]);
464 * XXX: Might be revisited to support differences accross
465 * same OMAP generation.
467 seq_printf(s
, "OMAP%d_MUX(%s, ", omap_gen
, m0_def
);
468 omap_mux_decode(s
, val
);
469 seq_printf(s
, "),\n");
475 static int omap_mux_dbg_board_open(struct inode
*inode
, struct file
*file
)
477 return single_open(file
, omap_mux_dbg_board_show
, inode
->i_private
);
480 static const struct file_operations omap_mux_dbg_board_fops
= {
481 .open
= omap_mux_dbg_board_open
,
484 .release
= single_release
,
487 static struct omap_mux_partition
*omap_mux_get_partition(struct omap_mux
*mux
)
489 struct omap_mux_partition
*partition
;
491 list_for_each_entry(partition
, &mux_partitions
, node
) {
492 struct list_head
*muxmodes
= &partition
->muxmodes
;
493 struct omap_mux_entry
*e
;
495 list_for_each_entry(e
, muxmodes
, node
) {
496 struct omap_mux
*m
= &e
->mux
;
506 static int omap_mux_dbg_signal_show(struct seq_file
*s
, void *unused
)
508 struct omap_mux
*m
= s
->private;
509 struct omap_mux_partition
*partition
;
510 const char *none
= "NA";
514 partition
= omap_mux_get_partition(m
);
518 val
= omap_mux_read(partition
, m
->reg_offset
);
519 mode
= val
& OMAP_MUX_MODE7
;
521 seq_printf(s
, "name: %s.%s (0x%08x/0x%03x = 0x%04x), b %s, t %s\n",
522 m
->muxnames
[0], m
->muxnames
[mode
],
523 partition
->phys
+ m
->reg_offset
, m
->reg_offset
, val
,
524 m
->balls
[0] ? m
->balls
[0] : none
,
525 m
->balls
[1] ? m
->balls
[1] : none
);
526 seq_printf(s
, "mode: ");
527 omap_mux_decode(s
, val
);
529 seq_printf(s
, "signals: %s | %s | %s | %s | %s | %s | %s | %s\n",
530 m
->muxnames
[0] ? m
->muxnames
[0] : none
,
531 m
->muxnames
[1] ? m
->muxnames
[1] : none
,
532 m
->muxnames
[2] ? m
->muxnames
[2] : none
,
533 m
->muxnames
[3] ? m
->muxnames
[3] : none
,
534 m
->muxnames
[4] ? m
->muxnames
[4] : none
,
535 m
->muxnames
[5] ? m
->muxnames
[5] : none
,
536 m
->muxnames
[6] ? m
->muxnames
[6] : none
,
537 m
->muxnames
[7] ? m
->muxnames
[7] : none
);
542 #define OMAP_MUX_MAX_ARG_CHAR 7
544 static ssize_t
omap_mux_dbg_signal_write(struct file
*file
,
545 const char __user
*user_buf
,
546 size_t count
, loff_t
*ppos
)
548 char buf
[OMAP_MUX_MAX_ARG_CHAR
];
549 struct seq_file
*seqf
;
553 struct omap_mux_partition
*partition
;
555 if (count
> OMAP_MUX_MAX_ARG_CHAR
)
558 memset(buf
, 0, sizeof(buf
));
559 buf_size
= min(count
, sizeof(buf
) - 1);
561 if (copy_from_user(buf
, user_buf
, buf_size
))
564 ret
= strict_strtoul(buf
, 0x10, &val
);
571 seqf
= file
->private_data
;
574 partition
= omap_mux_get_partition(m
);
578 omap_mux_write(partition
, (u16
)val
, m
->reg_offset
);
584 static int omap_mux_dbg_signal_open(struct inode
*inode
, struct file
*file
)
586 return single_open(file
, omap_mux_dbg_signal_show
, inode
->i_private
);
589 static const struct file_operations omap_mux_dbg_signal_fops
= {
590 .open
= omap_mux_dbg_signal_open
,
592 .write
= omap_mux_dbg_signal_write
,
594 .release
= single_release
,
597 static struct dentry
*mux_dbg_dir
;
599 static void __init
omap_mux_dbg_create_entry(
600 struct omap_mux_partition
*partition
,
601 struct dentry
*mux_dbg_dir
)
603 struct omap_mux_entry
*e
;
605 list_for_each_entry(e
, &partition
->muxmodes
, node
) {
606 struct omap_mux
*m
= &e
->mux
;
608 (void)debugfs_create_file(m
->muxnames
[0], S_IWUGO
, mux_dbg_dir
,
609 m
, &omap_mux_dbg_signal_fops
);
613 static void __init
omap_mux_dbg_init(void)
615 struct omap_mux_partition
*partition
;
616 static struct dentry
*mux_dbg_board_dir
;
618 mux_dbg_dir
= debugfs_create_dir("omap_mux", NULL
);
622 mux_dbg_board_dir
= debugfs_create_dir("board", mux_dbg_dir
);
623 if (!mux_dbg_board_dir
)
626 list_for_each_entry(partition
, &mux_partitions
, node
) {
627 omap_mux_dbg_create_entry(partition
, mux_dbg_dir
);
628 (void)debugfs_create_file(partition
->name
, S_IRUGO
,
629 mux_dbg_board_dir
, partition
,
630 &omap_mux_dbg_board_fops
);
635 static inline void omap_mux_dbg_init(void)
638 #endif /* CONFIG_DEBUG_FS */
640 static void __init
omap_mux_free_names(struct omap_mux
*m
)
644 for (i
= 0; i
< OMAP_MUX_NR_MODES
; i
++)
645 kfree(m
->muxnames
[i
]);
647 #ifdef CONFIG_DEBUG_FS
648 for (i
= 0; i
< OMAP_MUX_NR_SIDES
; i
++)
654 /* Free all data except for GPIO pins unless CONFIG_DEBUG_FS is set */
655 static int __init
omap_mux_late_init(void)
657 struct omap_mux_partition
*partition
;
659 list_for_each_entry(partition
, &mux_partitions
, node
) {
660 struct omap_mux_entry
*e
, *tmp
;
661 list_for_each_entry_safe(e
, tmp
, &partition
->muxmodes
, node
) {
662 struct omap_mux
*m
= &e
->mux
;
663 u16 mode
= omap_mux_read(partition
, m
->reg_offset
);
665 if (OMAP_MODE_GPIO(mode
))
668 #ifndef CONFIG_DEBUG_FS
669 mutex_lock(&muxmode_mutex
);
671 mutex_unlock(&muxmode_mutex
);
672 omap_mux_free_names(m
);
682 late_initcall(omap_mux_late_init
);
684 static void __init
omap_mux_package_fixup(struct omap_mux
*p
,
685 struct omap_mux
*superset
)
687 while (p
->reg_offset
!= OMAP_MUX_TERMINATOR
) {
688 struct omap_mux
*s
= superset
;
691 while (s
->reg_offset
!= OMAP_MUX_TERMINATOR
) {
692 if (s
->reg_offset
== p
->reg_offset
) {
700 pr_err("%s: Unknown entry offset 0x%x\n", __func__
,
706 #ifdef CONFIG_DEBUG_FS
708 static void __init
omap_mux_package_init_balls(struct omap_ball
*b
,
709 struct omap_mux
*superset
)
711 while (b
->reg_offset
!= OMAP_MUX_TERMINATOR
) {
712 struct omap_mux
*s
= superset
;
715 while (s
->reg_offset
!= OMAP_MUX_TERMINATOR
) {
716 if (s
->reg_offset
== b
->reg_offset
) {
717 s
->balls
[0] = b
->balls
[0];
718 s
->balls
[1] = b
->balls
[1];
725 pr_err("%s: Unknown ball offset 0x%x\n", __func__
,
731 #else /* CONFIG_DEBUG_FS */
733 static inline void omap_mux_package_init_balls(struct omap_ball
*b
,
734 struct omap_mux
*superset
)
738 #endif /* CONFIG_DEBUG_FS */
740 static int __init
omap_mux_setup(char *options
)
745 omap_mux_options
= options
;
749 __setup("omap_mux=", omap_mux_setup
);
752 * Note that the omap_mux=some.signal1=0x1234,some.signal2=0x1234
753 * cmdline options only override the bootloader values.
754 * During development, please enable CONFIG_DEBUG_FS, and use the
755 * signal specific entries under debugfs.
757 static void __init
omap_mux_set_cmdline_signals(void)
759 char *options
, *next_opt
, *token
;
761 if (!omap_mux_options
)
764 options
= kmalloc(strlen(omap_mux_options
) + 1, GFP_KERNEL
);
768 strcpy(options
, omap_mux_options
);
771 while ((token
= strsep(&next_opt
, ",")) != NULL
) {
776 name
= strsep(&keyval
, "=");
780 res
= strict_strtoul(keyval
, 0x10, &val
);
784 omap_mux_init_signal(name
, (u16
)val
);
791 static int __init
omap_mux_copy_names(struct omap_mux
*src
,
792 struct omap_mux
*dst
)
796 for (i
= 0; i
< OMAP_MUX_NR_MODES
; i
++) {
797 if (src
->muxnames
[i
]) {
799 kmalloc(strlen(src
->muxnames
[i
]) + 1,
801 if (!dst
->muxnames
[i
])
803 strcpy(dst
->muxnames
[i
], src
->muxnames
[i
]);
807 #ifdef CONFIG_DEBUG_FS
808 for (i
= 0; i
< OMAP_MUX_NR_SIDES
; i
++) {
811 kmalloc(strlen(src
->balls
[i
]) + 1,
815 strcpy(dst
->balls
[i
], src
->balls
[i
]);
823 omap_mux_free_names(dst
);
828 #endif /* CONFIG_OMAP_MUX */
830 static struct omap_mux
*omap_mux_get_by_gpio(
831 struct omap_mux_partition
*partition
,
834 struct omap_mux_entry
*e
;
835 struct omap_mux
*ret
= NULL
;
837 list_for_each_entry(e
, &partition
->muxmodes
, node
) {
838 struct omap_mux
*m
= &e
->mux
;
839 if (m
->gpio
== gpio
) {
848 /* Needed for dynamic muxing of GPIO pins for off-idle */
849 u16
omap_mux_get_gpio(int gpio
)
851 struct omap_mux_partition
*partition
;
854 list_for_each_entry(partition
, &mux_partitions
, node
) {
855 m
= omap_mux_get_by_gpio(partition
, gpio
);
857 return omap_mux_read(partition
, m
->reg_offset
);
860 if (!m
|| m
->reg_offset
== OMAP_MUX_TERMINATOR
)
861 pr_err("%s: Could not get gpio%i\n", __func__
, gpio
);
863 return OMAP_MUX_TERMINATOR
;
866 /* Needed for dynamic muxing of GPIO pins for off-idle */
867 void omap_mux_set_gpio(u16 val
, int gpio
)
869 struct omap_mux_partition
*partition
;
870 struct omap_mux
*m
= NULL
;
872 list_for_each_entry(partition
, &mux_partitions
, node
) {
873 m
= omap_mux_get_by_gpio(partition
, gpio
);
875 omap_mux_write(partition
, val
, m
->reg_offset
);
880 if (!m
|| m
->reg_offset
== OMAP_MUX_TERMINATOR
)
881 pr_err("%s: Could not set gpio%i\n", __func__
, gpio
);
884 static struct omap_mux
* __init
omap_mux_list_add(
885 struct omap_mux_partition
*partition
,
886 struct omap_mux
*src
)
888 struct omap_mux_entry
*entry
;
891 entry
= kzalloc(sizeof(struct omap_mux_entry
), GFP_KERNEL
);
898 #ifdef CONFIG_OMAP_MUX
899 if (omap_mux_copy_names(src
, m
)) {
905 mutex_lock(&muxmode_mutex
);
906 list_add_tail(&entry
->node
, &partition
->muxmodes
);
907 mutex_unlock(&muxmode_mutex
);
913 * Note if CONFIG_OMAP_MUX is not selected, we will only initialize
914 * the GPIO to mux offset mapping that is needed for dynamic muxing
915 * of GPIO pins for off-idle.
917 static void __init
omap_mux_init_list(struct omap_mux_partition
*partition
,
918 struct omap_mux
*superset
)
920 while (superset
->reg_offset
!= OMAP_MUX_TERMINATOR
) {
921 struct omap_mux
*entry
;
923 #ifdef CONFIG_OMAP_MUX
924 if (!superset
->muxnames
|| !superset
->muxnames
[0]) {
929 /* Skip pins that are not muxed as GPIO by bootloader */
930 if (!OMAP_MODE_GPIO(omap_mux_read(partition
,
931 superset
->reg_offset
))) {
937 entry
= omap_mux_list_add(partition
, superset
);
939 pr_err("%s: Could not add entry\n", __func__
);
946 #ifdef CONFIG_OMAP_MUX
948 static void omap_mux_init_package(struct omap_mux
*superset
,
949 struct omap_mux
*package_subset
,
950 struct omap_ball
*package_balls
)
953 omap_mux_package_fixup(package_subset
, superset
);
955 omap_mux_package_init_balls(package_balls
, superset
);
958 static void omap_mux_init_signals(struct omap_mux_partition
*partition
,
959 struct omap_board_mux
*board_mux
)
961 omap_mux_set_cmdline_signals();
962 omap_mux_write_array(partition
, board_mux
);
967 static void omap_mux_init_package(struct omap_mux
*superset
,
968 struct omap_mux
*package_subset
,
969 struct omap_ball
*package_balls
)
973 static void omap_mux_init_signals(struct omap_mux_partition
*partition
,
974 struct omap_board_mux
*board_mux
)
980 static u32 mux_partitions_cnt
;
982 int __init
omap_mux_init(const char *name
, u32 flags
,
983 u32 mux_pbase
, u32 mux_size
,
984 struct omap_mux
*superset
,
985 struct omap_mux
*package_subset
,
986 struct omap_board_mux
*board_mux
,
987 struct omap_ball
*package_balls
)
989 struct omap_mux_partition
*partition
;
991 partition
= kzalloc(sizeof(struct omap_mux_partition
), GFP_KERNEL
);
995 partition
->name
= name
;
996 partition
->flags
= flags
;
997 partition
->size
= mux_size
;
998 partition
->phys
= mux_pbase
;
999 partition
->base
= ioremap(mux_pbase
, mux_size
);
1000 if (!partition
->base
) {
1001 pr_err("%s: Could not ioremap mux partition at 0x%08x\n",
1002 __func__
, partition
->phys
);
1007 INIT_LIST_HEAD(&partition
->muxmodes
);
1009 list_add_tail(&partition
->node
, &mux_partitions
);
1010 mux_partitions_cnt
++;
1011 pr_info("%s: Add partition: #%d: %s, flags: %x\n", __func__
,
1012 mux_partitions_cnt
, partition
->name
, partition
->flags
);
1014 omap_mux_init_package(superset
, package_subset
, package_balls
);
1015 omap_mux_init_list(partition
, superset
);
1016 omap_mux_init_signals(partition
, board_mux
);