2 * arch/arm/mach-dove/mpp.c
4 * MPP functions for Marvell Dove SoCs
6 * This file is licensed under the terms of the GNU General Public
7 * License version 2. This program is licensed "as is" without any
8 * warranty of any kind, whether express or implied.
11 #include <linux/kernel.h>
12 #include <linux/gpio.h>
15 #include <mach/dove.h>
16 #include <plat/orion-gpio.h>
24 /* Map a group to a range of GPIO pins in that group */
25 static const struct dove_mpp_grp dove_mpp_grp
[] = {
48 /* Enable gpio for a range of pins. mode should be a combination of
49 GPIO_OUTPUT_OK | GPIO_INPUT_OK */
50 static void __init
dove_mpp_gpio_mode(int start
, int end
, int gpio_mode
)
54 for (i
= start
; i
<= end
; i
++)
55 orion_gpio_set_valid(i
, gpio_mode
);
58 /* Dump all the extra MPP registers. The platform code will dump the
59 registers for pins 0-23. */
60 static void __init
dove_mpp_dump_regs(void)
62 pr_debug("PMU_CTRL4_CTRL: %08x\n",
63 readl(DOVE_MPP_CTRL4_VIRT_BASE
));
65 pr_debug("PMU_MPP_GENERAL_CTRL: %08x\n",
66 readl(DOVE_PMU_MPP_GENERAL_CTRL
));
68 pr_debug("MPP_GENERAL: %08x\n", readl(DOVE_MPP_GENERAL_VIRT_BASE
));
71 static void __init
dove_mpp_cfg_nfc(int sel
)
73 u32 mpp_gen_cfg
= readl(DOVE_MPP_GENERAL_VIRT_BASE
);
77 writel(mpp_gen_cfg
, DOVE_MPP_GENERAL_VIRT_BASE
);
79 dove_mpp_gpio_mode(64, 71, GPIO_OUTPUT_OK
);
82 static void __init
dove_mpp_cfg_au1(int sel
)
84 u32 mpp_ctrl4
= readl(DOVE_MPP_CTRL4_VIRT_BASE
);
85 u32 ssp_ctrl1
= readl(DOVE_SSP_CTRL_STATUS_1
);
86 u32 mpp_gen_ctrl
= readl(DOVE_MPP_GENERAL_VIRT_BASE
);
87 u32 global_cfg_2
= readl(DOVE_GLOBAL_CONFIG_2
);
89 mpp_ctrl4
&= ~(DOVE_AU1_GPIO_SEL
);
90 ssp_ctrl1
&= ~(DOVE_SSP_ON_AU1
);
91 mpp_gen_ctrl
&= ~(DOVE_AU1_SPDIFO_GPIO_EN
);
92 global_cfg_2
&= ~(DOVE_TWSI_OPTION3_GPIO
);
94 if (!sel
|| sel
== 0x2)
95 dove_mpp_gpio_mode(52, 57, 0);
97 dove_mpp_gpio_mode(52, 57, GPIO_OUTPUT_OK
| GPIO_INPUT_OK
);
100 global_cfg_2
|= DOVE_TWSI_OPTION3_GPIO
;
101 dove_mpp_gpio_mode(56, 57, 0);
104 mpp_gen_ctrl
|= DOVE_AU1_SPDIFO_GPIO_EN
;
105 dove_mpp_gpio_mode(57, 57, GPIO_OUTPUT_OK
| GPIO_INPUT_OK
);
108 ssp_ctrl1
|= DOVE_SSP_ON_AU1
;
109 dove_mpp_gpio_mode(52, 55, 0);
112 mpp_ctrl4
|= DOVE_AU1_GPIO_SEL
;
114 writel(mpp_ctrl4
, DOVE_MPP_CTRL4_VIRT_BASE
);
115 writel(ssp_ctrl1
, DOVE_SSP_CTRL_STATUS_1
);
116 writel(mpp_gen_ctrl
, DOVE_MPP_GENERAL_VIRT_BASE
);
117 writel(global_cfg_2
, DOVE_GLOBAL_CONFIG_2
);
120 /* Configure the group registers, enabling GPIO if sel indicates the
121 pin is to be used for GPIO */
122 static void __init
dove_mpp_conf_grp(unsigned int *mpp_grp_list
)
124 u32 mpp_ctrl4
= readl(DOVE_MPP_CTRL4_VIRT_BASE
);
127 for ( ; *mpp_grp_list
; mpp_grp_list
++) {
128 unsigned int num
= MPP_NUM(*mpp_grp_list
);
129 unsigned int sel
= MPP_SEL(*mpp_grp_list
);
131 if (num
> MPP_GRP_MAX
) {
132 pr_err("dove: invalid MPP GRP number (%u)\n", num
);
136 mpp_ctrl4
&= ~(0x1 << num
);
137 mpp_ctrl4
|= sel
<< num
;
139 gpio_mode
= sel
? GPIO_OUTPUT_OK
| GPIO_INPUT_OK
: 0;
140 dove_mpp_gpio_mode(dove_mpp_grp
[num
].start
,
141 dove_mpp_grp
[num
].end
, gpio_mode
);
143 writel(mpp_ctrl4
, DOVE_MPP_CTRL4_VIRT_BASE
);
146 /* Configure the various MPP pins on Dove */
147 void __init
dove_mpp_conf(unsigned int *mpp_list
,
148 unsigned int *mpp_grp_list
,
149 unsigned int grp_au1_52_57
,
150 unsigned int grp_nfc_64_71
)
152 dove_mpp_dump_regs();
154 /* Use platform code for pins 0-23 */
155 orion_mpp_conf(mpp_list
, 0, MPP_MAX
, DOVE_MPP_VIRT_BASE
);
157 dove_mpp_conf_grp(mpp_grp_list
);
158 dove_mpp_cfg_au1(grp_au1_52_57
);
159 dove_mpp_cfg_nfc(grp_nfc_64_71
);
161 dove_mpp_dump_regs();