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>
23 /* Map a group to a range of GPIO pins in that group */
24 static const struct dove_mpp_grp dove_mpp_grp
[] = {
47 /* Enable gpio for a range of pins. mode should be a combination of
48 GPIO_OUTPUT_OK | GPIO_INPUT_OK */
49 static void dove_mpp_gpio_mode(int start
, int end
, int gpio_mode
)
53 for (i
= start
; i
<= end
; i
++)
54 orion_gpio_set_valid(i
, gpio_mode
);
57 /* Dump all the extra MPP registers. The platform code will dump the
58 registers for pins 0-23. */
59 static void dove_mpp_dump_regs(void)
61 pr_debug("PMU_CTRL4_CTRL: %08x\n",
62 readl(DOVE_MPP_CTRL4_VIRT_BASE
));
64 pr_debug("PMU_MPP_GENERAL_CTRL: %08x\n",
65 readl(DOVE_PMU_MPP_GENERAL_CTRL
));
67 pr_debug("MPP_GENERAL: %08x\n", readl(DOVE_MPP_GENERAL_VIRT_BASE
));
70 static void dove_mpp_cfg_nfc(int sel
)
72 u32 mpp_gen_cfg
= readl(DOVE_MPP_GENERAL_VIRT_BASE
);
76 writel(mpp_gen_cfg
, DOVE_MPP_GENERAL_VIRT_BASE
);
78 dove_mpp_gpio_mode(64, 71, GPIO_OUTPUT_OK
);
81 static void dove_mpp_cfg_au1(int sel
)
83 u32 mpp_ctrl4
= readl(DOVE_MPP_CTRL4_VIRT_BASE
);
84 u32 ssp_ctrl1
= readl(DOVE_SSP_CTRL_STATUS_1
);
85 u32 mpp_gen_ctrl
= readl(DOVE_MPP_GENERAL_VIRT_BASE
);
86 u32 global_cfg_2
= readl(DOVE_GLOBAL_CONFIG_2
);
88 mpp_ctrl4
&= ~(DOVE_AU1_GPIO_SEL
);
89 ssp_ctrl1
&= ~(DOVE_SSP_ON_AU1
);
90 mpp_gen_ctrl
&= ~(DOVE_AU1_SPDIFO_GPIO_EN
);
91 global_cfg_2
&= ~(DOVE_TWSI_OPTION3_GPIO
);
93 if (!sel
|| sel
== 0x2)
94 dove_mpp_gpio_mode(52, 57, 0);
96 dove_mpp_gpio_mode(52, 57, GPIO_OUTPUT_OK
| GPIO_INPUT_OK
);
99 global_cfg_2
|= DOVE_TWSI_OPTION3_GPIO
;
100 dove_mpp_gpio_mode(56, 57, 0);
103 mpp_gen_ctrl
|= DOVE_AU1_SPDIFO_GPIO_EN
;
104 dove_mpp_gpio_mode(57, 57, GPIO_OUTPUT_OK
| GPIO_INPUT_OK
);
107 ssp_ctrl1
|= DOVE_SSP_ON_AU1
;
108 dove_mpp_gpio_mode(52, 55, 0);
111 mpp_ctrl4
|= DOVE_AU1_GPIO_SEL
;
113 writel(mpp_ctrl4
, DOVE_MPP_CTRL4_VIRT_BASE
);
114 writel(ssp_ctrl1
, DOVE_SSP_CTRL_STATUS_1
);
115 writel(mpp_gen_ctrl
, DOVE_MPP_GENERAL_VIRT_BASE
);
116 writel(global_cfg_2
, DOVE_GLOBAL_CONFIG_2
);
119 /* Configure the group registers, enabling GPIO if sel indicates the
120 pin is to be used for GPIO */
121 static void dove_mpp_conf_grp(unsigned int *mpp_grp_list
)
123 u32 mpp_ctrl4
= readl(DOVE_MPP_CTRL4_VIRT_BASE
);
126 for ( ; *mpp_grp_list
; mpp_grp_list
++) {
127 unsigned int num
= MPP_NUM(*mpp_grp_list
);
128 unsigned int sel
= MPP_SEL(*mpp_grp_list
);
130 if (num
> MPP_GRP_MAX
) {
131 pr_err("dove: invalid MPP GRP number (%u)\n", num
);
135 mpp_ctrl4
&= ~(0x1 << num
);
136 mpp_ctrl4
|= sel
<< num
;
138 gpio_mode
= sel
? GPIO_OUTPUT_OK
| GPIO_INPUT_OK
: 0;
139 dove_mpp_gpio_mode(dove_mpp_grp
[num
].start
,
140 dove_mpp_grp
[num
].end
, gpio_mode
);
142 writel(mpp_ctrl4
, DOVE_MPP_CTRL4_VIRT_BASE
);
145 /* Configure the various MPP pins on Dove */
146 void __init
dove_mpp_conf(unsigned int *mpp_list
,
147 unsigned int *mpp_grp_list
,
148 unsigned int grp_au1_52_57
,
149 unsigned int grp_nfc_64_71
)
151 dove_mpp_dump_regs();
153 /* Use platform code for pins 0-23 */
154 orion_mpp_conf(mpp_list
, 0, MPP_MAX
, DOVE_MPP_VIRT_BASE
);
156 dove_mpp_conf_grp(mpp_grp_list
);
157 dove_mpp_cfg_au1(grp_au1_52_57
);
158 dove_mpp_cfg_nfc(grp_nfc_64_71
);
160 dove_mpp_dump_regs();