Blame view

arch/arm/mach-dove/mpp.c 3.88 KB
5af244fdf   Mike Rapoport   [ARM] Dove: add s...
1
2
3
4
5
6
7
8
9
10
11
12
13
  /*
   * arch/arm/mach-dove/mpp.c
   *
   * MPP functions for Marvell Dove SoCs
   *
   * This file is licensed under the terms of the GNU General Public
   * License version 2.  This program is licensed "as is" without any
   * warranty of any kind, whether express or implied.
   */
  
  #include <linux/kernel.h>
  #include <linux/gpio.h>
  #include <linux/io.h>
3cff484d4   Andrew Lunn   ARM: dove: Consol...
14
  #include <plat/mpp.h>
5af244fdf   Mike Rapoport   [ARM] Dove: add s...
15
  #include <mach/dove.h>
ce91574c2   Rob Herring   ARM: orion: move ...
16
  #include <plat/orion-gpio.h>
5af244fdf   Mike Rapoport   [ARM] Dove: add s...
17
  #include "mpp.h"
5af244fdf   Mike Rapoport   [ARM] Dove: add s...
18
19
20
21
  struct dove_mpp_grp {
  	int start;
  	int end;
  };
3cff484d4   Andrew Lunn   ARM: dove: Consol...
22
23
  /* Map a group to a range of GPIO pins in that group */
  static const struct dove_mpp_grp dove_mpp_grp[] = {
5af244fdf   Mike Rapoport   [ARM] Dove: add s...
24
25
26
27
28
29
30
31
32
  	[MPP_24_39] = {
  		.start	= 24,
  		.end	= 39,
  	},
  	[MPP_40_45] = {
  		.start	= 40,
  		.end	= 45,
  	},
  	[MPP_46_51] = {
3cff484d4   Andrew Lunn   ARM: dove: Consol...
33
34
  		.start	= 46,
  		.end	= 51,
5af244fdf   Mike Rapoport   [ARM] Dove: add s...
35
36
37
38
39
40
41
42
43
44
  	},
  	[MPP_58_61] = {
  		.start	= 58,
  		.end	= 61,
  	},
  	[MPP_62_63] = {
  		.start	= 62,
  		.end	= 63,
  	},
  };
3cff484d4   Andrew Lunn   ARM: dove: Consol...
45
46
  /* Enable gpio for a range of pins. mode should be a combination of
     GPIO_OUTPUT_OK | GPIO_INPUT_OK */
2746a7c27   Sebastian Hesselbarth   ARM: dove: fix mi...
47
  static void __init dove_mpp_gpio_mode(int start, int end, int gpio_mode)
5af244fdf   Mike Rapoport   [ARM] Dove: add s...
48
49
50
51
52
53
  {
  	int i;
  
  	for (i = start; i <= end; i++)
  		orion_gpio_set_valid(i, gpio_mode);
  }
3cff484d4   Andrew Lunn   ARM: dove: Consol...
54
55
  /* Dump all the extra MPP registers. The platform code will dump the
     registers for pins 0-23. */
ca2ac5cc9   Andrew Lunn   Dove: Fix Section...
56
  static void __init dove_mpp_dump_regs(void)
5af244fdf   Mike Rapoport   [ARM] Dove: add s...
57
  {
3cff484d4   Andrew Lunn   ARM: dove: Consol...
58
59
60
  	pr_debug("PMU_CTRL4_CTRL: %08x
  ",
  		 readl(DOVE_MPP_CTRL4_VIRT_BASE));
5af244fdf   Mike Rapoport   [ARM] Dove: add s...
61

3cff484d4   Andrew Lunn   ARM: dove: Consol...
62
63
64
  	pr_debug("PMU_MPP_GENERAL_CTRL: %08x
  ",
  		 readl(DOVE_PMU_MPP_GENERAL_CTRL));
5af244fdf   Mike Rapoport   [ARM] Dove: add s...
65

5af244fdf   Mike Rapoport   [ARM] Dove: add s...
66
67
  	pr_debug("MPP_GENERAL: %08x
  ", readl(DOVE_MPP_GENERAL_VIRT_BASE));
5af244fdf   Mike Rapoport   [ARM] Dove: add s...
68
  }
ca2ac5cc9   Andrew Lunn   Dove: Fix Section...
69
  static void __init dove_mpp_cfg_nfc(int sel)
5af244fdf   Mike Rapoport   [ARM] Dove: add s...
70
71
72
73
74
75
76
77
78
  {
  	u32 mpp_gen_cfg = readl(DOVE_MPP_GENERAL_VIRT_BASE);
  
  	mpp_gen_cfg &= ~0x1;
  	mpp_gen_cfg |= sel;
  	writel(mpp_gen_cfg, DOVE_MPP_GENERAL_VIRT_BASE);
  
  	dove_mpp_gpio_mode(64, 71, GPIO_OUTPUT_OK);
  }
ca2ac5cc9   Andrew Lunn   Dove: Fix Section...
79
  static void __init dove_mpp_cfg_au1(int sel)
5af244fdf   Mike Rapoport   [ARM] Dove: add s...
80
  {
3cff484d4   Andrew Lunn   ARM: dove: Consol...
81
  	u32 mpp_ctrl4 = readl(DOVE_MPP_CTRL4_VIRT_BASE);
5af244fdf   Mike Rapoport   [ARM] Dove: add s...
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
  	u32 ssp_ctrl1 = readl(DOVE_SSP_CTRL_STATUS_1);
  	u32 mpp_gen_ctrl = readl(DOVE_MPP_GENERAL_VIRT_BASE);
  	u32 global_cfg_2 = readl(DOVE_GLOBAL_CONFIG_2);
  
  	mpp_ctrl4 &= ~(DOVE_AU1_GPIO_SEL);
  	ssp_ctrl1 &= ~(DOVE_SSP_ON_AU1);
  	mpp_gen_ctrl &= ~(DOVE_AU1_SPDIFO_GPIO_EN);
  	global_cfg_2 &= ~(DOVE_TWSI_OPTION3_GPIO);
  
  	if (!sel || sel == 0x2)
  		dove_mpp_gpio_mode(52, 57, 0);
  	else
  		dove_mpp_gpio_mode(52, 57, GPIO_OUTPUT_OK | GPIO_INPUT_OK);
  
  	if (sel & 0x1) {
  		global_cfg_2 |= DOVE_TWSI_OPTION3_GPIO;
  		dove_mpp_gpio_mode(56, 57, 0);
  	}
  	if (sel & 0x2) {
  		mpp_gen_ctrl |= DOVE_AU1_SPDIFO_GPIO_EN;
  		dove_mpp_gpio_mode(57, 57, GPIO_OUTPUT_OK | GPIO_INPUT_OK);
  	}
  	if (sel & 0x4) {
  		ssp_ctrl1 |= DOVE_SSP_ON_AU1;
  		dove_mpp_gpio_mode(52, 55, 0);
  	}
  	if (sel & 0x8)
  		mpp_ctrl4 |= DOVE_AU1_GPIO_SEL;
  
  	writel(mpp_ctrl4, DOVE_MPP_CTRL4_VIRT_BASE);
  	writel(ssp_ctrl1, DOVE_SSP_CTRL_STATUS_1);
  	writel(mpp_gen_ctrl, DOVE_MPP_GENERAL_VIRT_BASE);
  	writel(global_cfg_2, DOVE_GLOBAL_CONFIG_2);
  }
3cff484d4   Andrew Lunn   ARM: dove: Consol...
116
117
  /* Configure the group registers, enabling GPIO if sel indicates the
     pin is to be used for GPIO */
ca2ac5cc9   Andrew Lunn   Dove: Fix Section...
118
  static void __init dove_mpp_conf_grp(unsigned int *mpp_grp_list)
5af244fdf   Mike Rapoport   [ARM] Dove: add s...
119
  {
3cff484d4   Andrew Lunn   ARM: dove: Consol...
120
121
  	u32 mpp_ctrl4 = readl(DOVE_MPP_CTRL4_VIRT_BASE);
  	int gpio_mode;
5af244fdf   Mike Rapoport   [ARM] Dove: add s...
122

3cff484d4   Andrew Lunn   ARM: dove: Consol...
123
124
125
  	for ( ; *mpp_grp_list; mpp_grp_list++) {
  		unsigned int num = MPP_NUM(*mpp_grp_list);
  		unsigned int sel = MPP_SEL(*mpp_grp_list);
5af244fdf   Mike Rapoport   [ARM] Dove: add s...
126

3cff484d4   Andrew Lunn   ARM: dove: Consol...
127
128
129
  		if (num > MPP_GRP_MAX) {
  			pr_err("dove: invalid MPP GRP number (%u)
  ", num);
5af244fdf   Mike Rapoport   [ARM] Dove: add s...
130
131
  			continue;
  		}
3cff484d4   Andrew Lunn   ARM: dove: Consol...
132
133
  		mpp_ctrl4 &= ~(0x1 << num);
  		mpp_ctrl4 |= sel << num;
5af244fdf   Mike Rapoport   [ARM] Dove: add s...
134

3cff484d4   Andrew Lunn   ARM: dove: Consol...
135
136
137
  		gpio_mode = sel ? GPIO_OUTPUT_OK | GPIO_INPUT_OK : 0;
  		dove_mpp_gpio_mode(dove_mpp_grp[num].start,
  				   dove_mpp_grp[num].end, gpio_mode);
5af244fdf   Mike Rapoport   [ARM] Dove: add s...
138
  	}
3cff484d4   Andrew Lunn   ARM: dove: Consol...
139
140
  	writel(mpp_ctrl4, DOVE_MPP_CTRL4_VIRT_BASE);
  }
5af244fdf   Mike Rapoport   [ARM] Dove: add s...
141

3cff484d4   Andrew Lunn   ARM: dove: Consol...
142
143
144
145
146
147
148
  /* Configure the various MPP pins on Dove */
  void __init dove_mpp_conf(unsigned int *mpp_list,
  			  unsigned int *mpp_grp_list,
  			  unsigned int grp_au1_52_57,
  			  unsigned int grp_nfc_64_71)
  {
  	dove_mpp_dump_regs();
5af244fdf   Mike Rapoport   [ARM] Dove: add s...
149

3cff484d4   Andrew Lunn   ARM: dove: Consol...
150
151
  	/* Use platform code for pins 0-23 */
  	orion_mpp_conf(mpp_list, 0, MPP_MAX, DOVE_MPP_VIRT_BASE);
5af244fdf   Mike Rapoport   [ARM] Dove: add s...
152

3cff484d4   Andrew Lunn   ARM: dove: Consol...
153
154
155
  	dove_mpp_conf_grp(mpp_grp_list);
  	dove_mpp_cfg_au1(grp_au1_52_57);
  	dove_mpp_cfg_nfc(grp_nfc_64_71);
5af244fdf   Mike Rapoport   [ARM] Dove: add s...
156
157
158
  
  	dove_mpp_dump_regs();
  }