1 #include <linux/init.h>
2 #include <linux/module.h>
3 #include <mach/iomux.h>
8 #define DBG(x...) INFO(KERN_INFO x)
13 #define INFO(x...) printk(KERN_INFO x)
24 struct iomux_mode mux;
29 static inline int mode_is_valid(unsigned int mode)
34 if(mode == INVALID_MODE || m.mux.bank >= GPIO_BANKS)
40 int mode_to_gpio(unsigned int mode)
44 if(!mode_is_valid(mode)){
45 INFO("<%s> mode(0x%x) is invalid\n", __func__, mode);
50 return PIN_BASE + m.mux.bank * 32 + (m.mux.goff - 0x0A) * 8 + m.mux.off;
53 int gpio_to_mode(int gpio)
58 if(!gpio_is_valid(gpio)){
59 INFO("<%s> gpio(%d), is invalid\n", __func__, gpio);
63 off = gpio - PIN_BASE;
65 m.mux.goff = (off%32)/8 + 0x0A;
69 if(!mode_is_valid(m.mode)){
70 INFO("<%s> gpio(gpio%d_%x%d) is invalid\n", __func__, m.mux.bank, m.mux.goff, m.mux.off);
78 void iomux_set(unsigned int mode)
80 unsigned int v, addr, mask;
84 if(!mode_is_valid(mode)){
85 INFO("<%s> mode(0x%x) is invalid\n", __func__, mode);
88 mask = (m.mux.mode < 2)?1:3;
89 v = (m.mux.mode << (m.mux.off * 2)) + (mask << (m.mux.off * 2 + 16));
90 addr = (unsigned int)GRF_IOMUX_BASE + 16 * m.mux.bank + 4 * (m.mux.goff - 0x0A);
92 DBG("<%s> mode(0x%04x), reg_addr(0x%08x), set_value(0x%08x)\n", __func__, mode, addr, v);
94 writel_relaxed(v, (void *)addr);
97 void iomux_set(unsigned int mode)
99 INFO("%s is not support\n", __func__);
103 EXPORT_SYMBOL(iomux_set);
105 void iomux_set_gpio_mode(int gpio)
109 mode = gpio_to_mode(gpio);
110 if(mode_is_valid(mode))
113 EXPORT_SYMBOL(iomux_set_gpio_mode);