diff options
Diffstat (limited to 'arch/arm/plat-omap/mux.c')
| -rw-r--r-- | arch/arm/plat-omap/mux.c | 65 |
1 files changed, 51 insertions, 14 deletions
diff --git a/arch/arm/plat-omap/mux.c b/arch/arm/plat-omap/mux.c index 64482040f89e..8c1c016aa689 100644 --- a/arch/arm/plat-omap/mux.c +++ b/arch/arm/plat-omap/mux.c | |||
| @@ -3,7 +3,7 @@ | |||
| 3 | * | 3 | * |
| 4 | * Utility to set the Omap MUX and PULL_DWN registers from a table in mux.h | 4 | * Utility to set the Omap MUX and PULL_DWN registers from a table in mux.h |
| 5 | * | 5 | * |
| 6 | * Copyright (C) 2003 Nokia Corporation | 6 | * Copyright (C) 2003 - 2005 Nokia Corporation |
| 7 | * | 7 | * |
| 8 | * Written by Tony Lindgren <tony.lindgren@nokia.com> | 8 | * Written by Tony Lindgren <tony.lindgren@nokia.com> |
| 9 | * | 9 | * |
| @@ -25,38 +25,74 @@ | |||
| 25 | #include <linux/config.h> | 25 | #include <linux/config.h> |
| 26 | #include <linux/module.h> | 26 | #include <linux/module.h> |
| 27 | #include <linux/init.h> | 27 | #include <linux/init.h> |
| 28 | #include <linux/kernel.h> | ||
| 28 | #include <asm/system.h> | 29 | #include <asm/system.h> |
| 29 | #include <asm/io.h> | 30 | #include <asm/io.h> |
| 30 | #include <linux/spinlock.h> | 31 | #include <linux/spinlock.h> |
| 31 | |||
| 32 | #define __MUX_C__ | ||
| 33 | #include <asm/arch/mux.h> | 32 | #include <asm/arch/mux.h> |
| 34 | 33 | ||
| 35 | #ifdef CONFIG_OMAP_MUX | 34 | #ifdef CONFIG_OMAP_MUX |
| 36 | 35 | ||
| 36 | #define OMAP24XX_L4_BASE 0x48000000 | ||
| 37 | #define OMAP24XX_PULL_ENA (1 << 3) | ||
| 38 | #define OMAP24XX_PULL_UP (1 << 4) | ||
| 39 | |||
| 40 | static struct pin_config * pin_table; | ||
| 41 | static unsigned long pin_table_sz; | ||
| 42 | |||
| 43 | extern struct pin_config * omap730_pins; | ||
| 44 | extern struct pin_config * omap1xxx_pins; | ||
| 45 | extern struct pin_config * omap24xx_pins; | ||
| 46 | |||
| 47 | int __init omap_mux_register(struct pin_config * pins, unsigned long size) | ||
| 48 | { | ||
| 49 | pin_table = pins; | ||
| 50 | pin_table_sz = size; | ||
| 51 | |||
| 52 | return 0; | ||
| 53 | } | ||
| 54 | |||
| 37 | /* | 55 | /* |
| 38 | * Sets the Omap MUX and PULL_DWN registers based on the table | 56 | * Sets the Omap MUX and PULL_DWN registers based on the table |
| 39 | */ | 57 | */ |
| 40 | int __init_or_module | 58 | int __init_or_module omap_cfg_reg(const unsigned long index) |
| 41 | omap_cfg_reg(const reg_cfg_t reg_cfg) | ||
| 42 | { | 59 | { |
| 43 | static DEFINE_SPINLOCK(mux_spin_lock); | 60 | static DEFINE_SPINLOCK(mux_spin_lock); |
| 44 | 61 | ||
| 45 | unsigned long flags; | 62 | unsigned long flags; |
| 46 | reg_cfg_set *cfg; | 63 | struct pin_config *cfg; |
| 47 | unsigned int reg_orig = 0, reg = 0, pu_pd_orig = 0, pu_pd = 0, | 64 | unsigned int reg_orig = 0, reg = 0, pu_pd_orig = 0, pu_pd = 0, |
| 48 | pull_orig = 0, pull = 0; | 65 | pull_orig = 0, pull = 0; |
| 49 | unsigned int mask, warn = 0; | 66 | unsigned int mask, warn = 0; |
| 50 | 67 | ||
| 51 | if (cpu_is_omap7xx()) | 68 | if (!pin_table) |
| 52 | return 0; | 69 | BUG(); |
| 53 | 70 | ||
| 54 | if (reg_cfg > ARRAY_SIZE(reg_cfg_table)) { | 71 | if (index >= pin_table_sz) { |
| 55 | printk(KERN_ERR "MUX: reg_cfg %d\n", reg_cfg); | 72 | printk(KERN_ERR "Invalid pin mux index: %lu (%lu)\n", |
| 56 | return -EINVAL; | 73 | index, pin_table_sz); |
| 74 | dump_stack(); | ||
| 75 | return -ENODEV; | ||
| 57 | } | 76 | } |
| 58 | 77 | ||
| 59 | cfg = (reg_cfg_set *)®_cfg_table[reg_cfg]; | 78 | cfg = (struct pin_config *)&pin_table[index]; |
| 79 | if (cpu_is_omap24xx()) { | ||
| 80 | u8 reg = 0; | ||
| 81 | |||
| 82 | reg |= cfg->mask & 0x7; | ||
| 83 | if (cfg->pull_val) | ||
| 84 | reg |= OMAP24XX_PULL_ENA; | ||
| 85 | if(cfg->pu_pd_val) | ||
| 86 | reg |= OMAP24XX_PULL_UP; | ||
| 87 | #ifdef CONFIG_OMAP_MUX_DEBUG | ||
| 88 | printk("Muxing %s (0x%08x): 0x%02x -> 0x%02x\n", | ||
| 89 | cfg->name, OMAP24XX_L4_BASE + cfg->mux_reg, | ||
| 90 | omap_readb(OMAP24XX_L4_BASE + cfg->mux_reg), reg); | ||
| 91 | #endif | ||
| 92 | omap_writeb(reg, OMAP24XX_L4_BASE + cfg->mux_reg); | ||
| 93 | |||
| 94 | return 0; | ||
| 95 | } | ||
| 60 | 96 | ||
| 61 | /* Check the mux register in question */ | 97 | /* Check the mux register in question */ |
| 62 | if (cfg->mux_reg) { | 98 | if (cfg->mux_reg) { |
| @@ -157,7 +193,8 @@ omap_cfg_reg(const reg_cfg_t reg_cfg) | |||
| 157 | return 0; | 193 | return 0; |
| 158 | #endif | 194 | #endif |
| 159 | } | 195 | } |
| 160 | |||
| 161 | EXPORT_SYMBOL(omap_cfg_reg); | 196 | EXPORT_SYMBOL(omap_cfg_reg); |
| 162 | 197 | #else | |
| 198 | #define omap_mux_init() do {} while(0) | ||
| 199 | #define omap_cfg_reg(x) do {} while(0) | ||
| 163 | #endif /* CONFIG_OMAP_MUX */ | 200 | #endif /* CONFIG_OMAP_MUX */ |
