Blame view

arch/arm/mach-w90x900/mfp.c 4.17 KB
27eb97582   wanzongshun   [ARM] 5551/1: Add...
1
  /*
35c9221ac   wanzongshun   ARM: 5682/1: Add ...
2
   * linux/arch/arm/mach-w90x900/mfp.c
27eb97582   wanzongshun   [ARM] 5551/1: Add...
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
   *
   * Copyright (c) 2008 Nuvoton technology corporation
   *
   * Wan ZongShun <mcuos.com@gmail.com>
   *
   * This program is free software; you can redistribute it and/or modify
   * it under the terms of the GNU General Public License as published by
   * the Free Software Foundation;version 2 of the License.
   */
  
  #include <linux/module.h>
  #include <linux/kernel.h>
  #include <linux/device.h>
  #include <linux/list.h>
  #include <linux/errno.h>
  #include <linux/err.h>
  #include <linux/string.h>
  #include <linux/clk.h>
  #include <linux/mutex.h>
  #include <linux/io.h>
  
  #include <mach/hardware.h>
  
  #define REG_MFSEL	(W90X900_VA_GCR + 0xC)
  
  #define GPSELF		(0x01 << 1)
27eb97582   wanzongshun   [ARM] 5551/1: Add...
29
  #define GPSELC		(0x03 << 2)
798681bf2   wanzongshun   ARM: 7158/1: add ...
30
  #define GPSELD		(0x0f << 4)
27eb97582   wanzongshun   [ARM] 5551/1: Add...
31
32
33
  
  #define GPSELEI0	(0x01 << 26)
  #define GPSELEI1	(0x01 << 27)
3f3f1d9d8   wanzongshun   [ARM] 5619/1: Add...
34
35
  #define GPIOG0TO1	(0x03 << 14)
  #define GPIOG2TO3	(0x03 << 16)
3d34a0d80   wanzongshun   ARM: 6141/1: Add ...
36
  #define GPIOG22TO23	(0x03 << 22)
798681bf2   wanzongshun   ARM: 7158/1: add ...
37
  #define GPIOG18TO20	(0x07 << 18)
3d34a0d80   wanzongshun   ARM: 6141/1: Add ...
38

3f3f1d9d8   wanzongshun   [ARM] 5619/1: Add...
39
40
41
  #define ENSPI		(0x0a << 14)
  #define ENI2C0		(0x01 << 14)
  #define ENI2C1		(0x01 << 16)
3d34a0d80   wanzongshun   ARM: 6141/1: Add ...
42
  #define ENAC97		(0x02 << 22)
798681bf2   wanzongshun   ARM: 7158/1: add ...
43
44
45
46
  #define ENSD1		(0x02 << 18)
  #define ENSD0		(0x0a << 4)
  #define ENKPI		(0x02 << 2)
  #define ENNAND		(0x01 << 2)
3f3f1d9d8   wanzongshun   [ARM] 5619/1: Add...
47

f346becf2   wanzongshun   ARM: 5675/1: The ...
48
  static DEFINE_MUTEX(mfp_mutex);
27eb97582   wanzongshun   [ARM] 5551/1: Add...
49
50
51
52
53
54
55
  
  void mfp_set_groupf(struct device *dev)
  {
  	unsigned long mfpen;
  	const char *dev_id;
  
  	BUG_ON(!dev);
f346becf2   wanzongshun   ARM: 5675/1: The ...
56
  	mutex_lock(&mfp_mutex);
27eb97582   wanzongshun   [ARM] 5551/1: Add...
57
58
59
60
  
  	dev_id = dev_name(dev);
  
  	mfpen = __raw_readl(REG_MFSEL);
35c9221ac   wanzongshun   ARM: 5682/1: Add ...
61
  	if (strcmp(dev_id, "nuc900-emc") == 0)
27eb97582   wanzongshun   [ARM] 5551/1: Add...
62
63
64
65
66
  		mfpen |= GPSELF;/*enable mac*/
  	else
  		mfpen &= ~GPSELF;/*GPIOF[9:0]*/
  
  	__raw_writel(mfpen, REG_MFSEL);
f346becf2   wanzongshun   ARM: 5675/1: The ...
67
  	mutex_unlock(&mfp_mutex);
27eb97582   wanzongshun   [ARM] 5551/1: Add...
68
69
70
71
72
73
74
75
76
  }
  EXPORT_SYMBOL(mfp_set_groupf);
  
  void mfp_set_groupc(struct device *dev)
  {
  	unsigned long mfpen;
  	const char *dev_id;
  
  	BUG_ON(!dev);
f346becf2   wanzongshun   ARM: 5675/1: The ...
77
  	mutex_lock(&mfp_mutex);
27eb97582   wanzongshun   [ARM] 5551/1: Add...
78
79
80
81
  
  	dev_id = dev_name(dev);
  
  	mfpen = __raw_readl(REG_MFSEL);
35c9221ac   wanzongshun   ARM: 5682/1: Add ...
82
  	if (strcmp(dev_id, "nuc900-lcd") == 0)
27eb97582   wanzongshun   [ARM] 5551/1: Add...
83
  		mfpen |= GPSELC;/*enable lcd*/
35c9221ac   wanzongshun   ARM: 5682/1: Add ...
84
85
86
87
88
89
90
91
  	else if (strcmp(dev_id, "nuc900-kpi") == 0) {
  		mfpen &= (~GPSELC);/*enable kpi*/
  		mfpen |= ENKPI;
  	} else if (strcmp(dev_id, "nuc900-nand") == 0) {
  		mfpen &= (~GPSELC);/*enable nand*/
  		mfpen |= ENNAND;
  	} else
  		mfpen &= (~GPSELC);/*GPIOC[14:0]*/
27eb97582   wanzongshun   [ARM] 5551/1: Add...
92
93
  
  	__raw_writel(mfpen, REG_MFSEL);
f346becf2   wanzongshun   ARM: 5675/1: The ...
94
  	mutex_unlock(&mfp_mutex);
27eb97582   wanzongshun   [ARM] 5551/1: Add...
95
96
  }
  EXPORT_SYMBOL(mfp_set_groupc);
0abe1856b   wanzongshun   [ARM] 5604/1: Add...
97
  void mfp_set_groupi(struct device *dev)
27eb97582   wanzongshun   [ARM] 5551/1: Add...
98
99
100
101
102
  {
  	unsigned long mfpen;
  	const char *dev_id;
  
  	BUG_ON(!dev);
f346becf2   wanzongshun   ARM: 5675/1: The ...
103
  	mutex_lock(&mfp_mutex);
27eb97582   wanzongshun   [ARM] 5551/1: Add...
104
105
106
107
  
  	dev_id = dev_name(dev);
  
  	mfpen = __raw_readl(REG_MFSEL);
0abe1856b   wanzongshun   [ARM] 5604/1: Add...
108
  	mfpen &= ~GPSELEI1;/*default gpio16*/
35c9221ac   wanzongshun   ARM: 5682/1: Add ...
109
  	if (strcmp(dev_id, "nuc900-wdog") == 0)
27eb97582   wanzongshun   [ARM] 5551/1: Add...
110
  		mfpen |= GPSELEI1;/*enable wdog*/
35c9221ac   wanzongshun   ARM: 5682/1: Add ...
111
112
113
114
  	else if (strcmp(dev_id, "nuc900-atapi") == 0)
  		mfpen |= GPSELEI0;/*enable atapi*/
  	else if (strcmp(dev_id, "nuc900-keypad") == 0)
  		mfpen &= ~GPSELEI0;/*enable keypad*/
27eb97582   wanzongshun   [ARM] 5551/1: Add...
115
116
  
  	__raw_writel(mfpen, REG_MFSEL);
f346becf2   wanzongshun   ARM: 5675/1: The ...
117
  	mutex_unlock(&mfp_mutex);
27eb97582   wanzongshun   [ARM] 5551/1: Add...
118
119
  }
  EXPORT_SYMBOL(mfp_set_groupi);
798681bf2   wanzongshun   ARM: 7158/1: add ...
120
  void mfp_set_groupg(struct device *dev, const char *subname)
3f3f1d9d8   wanzongshun   [ARM] 5619/1: Add...
121
122
123
  {
  	unsigned long mfpen;
  	const char *dev_id;
798681bf2   wanzongshun   ARM: 7158/1: add ...
124
  	BUG_ON((!dev) && (!subname));
3f3f1d9d8   wanzongshun   [ARM] 5619/1: Add...
125

f346becf2   wanzongshun   ARM: 5675/1: The ...
126
  	mutex_lock(&mfp_mutex);
3f3f1d9d8   wanzongshun   [ARM] 5619/1: Add...
127

798681bf2   wanzongshun   ARM: 7158/1: add ...
128
129
130
131
  	if (subname != NULL)
  		dev_id = subname;
  	else
  		dev_id = dev_name(dev);
3f3f1d9d8   wanzongshun   [ARM] 5619/1: Add...
132
133
  
  	mfpen = __raw_readl(REG_MFSEL);
35c9221ac   wanzongshun   ARM: 5682/1: Add ...
134
  	if (strcmp(dev_id, "nuc900-spi") == 0) {
3f3f1d9d8   wanzongshun   [ARM] 5619/1: Add...
135
136
  		mfpen &= ~(GPIOG0TO1 | GPIOG2TO3);
  		mfpen |= ENSPI;/*enable spi*/
35c9221ac   wanzongshun   ARM: 5682/1: Add ...
137
  	} else if (strcmp(dev_id, "nuc900-i2c0") == 0) {
3f3f1d9d8   wanzongshun   [ARM] 5619/1: Add...
138
139
  		mfpen &= ~(GPIOG0TO1);
  		mfpen |= ENI2C0;/*enable i2c0*/
35c9221ac   wanzongshun   ARM: 5682/1: Add ...
140
  	} else if (strcmp(dev_id, "nuc900-i2c1") == 0) {
3f3f1d9d8   wanzongshun   [ARM] 5619/1: Add...
141
142
  		mfpen &= ~(GPIOG2TO3);
  		mfpen |= ENI2C1;/*enable i2c1*/
e37051dc7   Axel Lin   ARM: 7274/1: NUC9...
143
  	} else if (strcmp(dev_id, "nuc900-ac97") == 0) {
3d34a0d80   wanzongshun   ARM: 6141/1: Add ...
144
145
  		mfpen &= ~(GPIOG22TO23);
  		mfpen |= ENAC97;/*enable AC97*/
798681bf2   wanzongshun   ARM: 7158/1: add ...
146
147
148
  	} else if (strcmp(dev_id, "nuc900-mmc-port1") == 0) {
  		mfpen &= ~(GPIOG18TO20);
  		mfpen |= (ENSD1 | 0x01);/*enable sd1*/
3f3f1d9d8   wanzongshun   [ARM] 5619/1: Add...
149
150
151
152
153
  	} else {
  		mfpen &= ~(GPIOG0TO1 | GPIOG2TO3);/*GPIOG[3:0]*/
  	}
  
  	__raw_writel(mfpen, REG_MFSEL);
f346becf2   wanzongshun   ARM: 5675/1: The ...
154
  	mutex_unlock(&mfp_mutex);
3f3f1d9d8   wanzongshun   [ARM] 5619/1: Add...
155
156
  }
  EXPORT_SYMBOL(mfp_set_groupg);
798681bf2   wanzongshun   ARM: 7158/1: add ...
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
  void mfp_set_groupd(struct device *dev, const char *subname)
  {
  	unsigned long mfpen;
  	const char *dev_id;
  
  	BUG_ON((!dev) && (!subname));
  
  	mutex_lock(&mfp_mutex);
  
  	if (subname != NULL)
  		dev_id = subname;
  	else
  		dev_id = dev_name(dev);
  
  	mfpen = __raw_readl(REG_MFSEL);
  
  	if (strcmp(dev_id, "nuc900-mmc-port0") == 0) {
  		mfpen &= ~GPSELD;/*enable sd0*/
  		mfpen |= ENSD0;
  	} else
  		mfpen &= (~GPSELD);
  
  	__raw_writel(mfpen, REG_MFSEL);
  
  	mutex_unlock(&mfp_mutex);
  }
  EXPORT_SYMBOL(mfp_set_groupd);