diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2009-12-08 11:12:43 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-12-08 11:12:43 -0500 |
commit | 79c9601c2e0dbbe69895d302de4d19f3a31fbd30 (patch) | |
tree | 78d4be2df851b2b4106adcfd736622a90cecf9e9 /arch/arm/plat-s3c64xx | |
parent | 41440ffe21f29bdb985cab76b2d0b06d83e63b19 (diff) | |
parent | 3d14b5beba35250c548d3851a2b84fce742d8311 (diff) |
Merge branch 'devel' of master.kernel.org:/home/rmk/linux-2.6-arm
* 'devel' of master.kernel.org:/home/rmk/linux-2.6-arm: (272 commits)
Fix soc_common PCMCIA configuration
ARM: 5827/1: SA1100: h3100/h3600: emit messages on failed gpio_request
ARM: 5826/1: SA1100: h3100/h3600: always build htc-egpio driver
ARM: 5825/1: SA1100: h3600: update defconfig
ARM: 5824/1: SA1100: reuse h3600 PCMCIA driver on h3100
ARM: 5823/1: SA1100: h3100/h3600: add support for gpio-keys
ARM: 5822/1: SA1100: h3100/h3600: clean up #includes
ARM: 5821/1: SA1100: h3100/h3600: revise copyright boilerplates
ARM: 5820/1: SA1100: h3100/h3600: split h3600.c
ARM: 5819/1: SA1100: h3100/h3600: merge h3600.h and h3600_gpio.h into h3xxx.h
ARM: 5818/1: SA1100: h3100/h3600: drop old GPIO definitions
ARM: 5817/1: SA1100: h3100/h3600: configure all unused gpios as inputs
ARM: 5816/1: SA1100: h3600: remove IRQ_GPIO_* definitions
ARM: 5815/1: SA1100: h3100/h3600: remove now unused assign_h3600_egpio handlers
ARM: 5814/1: SA1100: h3100/h3600: convert all users of assign_h3600_egpio to gpiolib
ARM: 5813/1: SA1100: h3100/h3600: add htc-egpio driver
ARM: 5812/1: SA1100: h3100/h3600: separate machine-specific LCD helpers
ARM: 5811/2: pcmcia: convert sa1100_h3600 driver to gpiolib
ARM: 5799/1: SA1100: h3600: stop setting direction for LCD pins
ARM: 5798/1: SA1100: h3600: remove unused cruft from h3600.h
...
Diffstat (limited to 'arch/arm/plat-s3c64xx')
-rw-r--r-- | arch/arm/plat-s3c64xx/cpu.c | 5 | ||||
-rw-r--r-- | arch/arm/plat-s3c64xx/cpufreq.c | 40 | ||||
-rw-r--r-- | arch/arm/plat-s3c64xx/gpiolib.c | 12 | ||||
-rw-r--r-- | arch/arm/plat-s3c64xx/include/plat/gpio-bank-c.h | 6 | ||||
-rw-r--r-- | arch/arm/plat-s3c64xx/irq-eint.c | 19 | ||||
-rw-r--r-- | arch/arm/plat-s3c64xx/setup-sdhci-gpio.c | 20 |
6 files changed, 78 insertions, 24 deletions
diff --git a/arch/arm/plat-s3c64xx/cpu.c b/arch/arm/plat-s3c64xx/cpu.c index b1fdd83940a6..49796d2db86d 100644 --- a/arch/arm/plat-s3c64xx/cpu.c +++ b/arch/arm/plat-s3c64xx/cpu.c | |||
@@ -107,6 +107,11 @@ static struct map_desc s3c_iodesc[] __initdata = { | |||
107 | .pfn = __phys_to_pfn(S3C64XX_PA_WATCHDOG), | 107 | .pfn = __phys_to_pfn(S3C64XX_PA_WATCHDOG), |
108 | .length = SZ_4K, | 108 | .length = SZ_4K, |
109 | .type = MT_DEVICE, | 109 | .type = MT_DEVICE, |
110 | }, { | ||
111 | .virtual = (unsigned long)S3C_VA_USB_HSPHY, | ||
112 | .pfn = __phys_to_pfn(S3C64XX_PA_USB_HSPHY), | ||
113 | .length = SZ_1K, | ||
114 | .type = MT_DEVICE, | ||
110 | }, | 115 | }, |
111 | }; | 116 | }; |
112 | 117 | ||
diff --git a/arch/arm/plat-s3c64xx/cpufreq.c b/arch/arm/plat-s3c64xx/cpufreq.c index e6e0843215df..74c0e8347de5 100644 --- a/arch/arm/plat-s3c64xx/cpufreq.c +++ b/arch/arm/plat-s3c64xx/cpufreq.c | |||
@@ -19,6 +19,7 @@ | |||
19 | 19 | ||
20 | static struct clk *armclk; | 20 | static struct clk *armclk; |
21 | static struct regulator *vddarm; | 21 | static struct regulator *vddarm; |
22 | static unsigned long regulator_latency; | ||
22 | 23 | ||
23 | #ifdef CONFIG_CPU_S3C6410 | 24 | #ifdef CONFIG_CPU_S3C6410 |
24 | struct s3c64xx_dvfs { | 25 | struct s3c64xx_dvfs { |
@@ -27,11 +28,10 @@ struct s3c64xx_dvfs { | |||
27 | }; | 28 | }; |
28 | 29 | ||
29 | static struct s3c64xx_dvfs s3c64xx_dvfs_table[] = { | 30 | static struct s3c64xx_dvfs s3c64xx_dvfs_table[] = { |
30 | [0] = { 1000000, 1000000 }, | 31 | [0] = { 1000000, 1150000 }, |
31 | [1] = { 1000000, 1050000 }, | 32 | [1] = { 1050000, 1150000 }, |
32 | [2] = { 1050000, 1100000 }, | 33 | [2] = { 1100000, 1150000 }, |
33 | [3] = { 1050000, 1150000 }, | 34 | [3] = { 1200000, 1350000 }, |
34 | [4] = { 1250000, 1350000 }, | ||
35 | }; | 35 | }; |
36 | 36 | ||
37 | static struct cpufreq_frequency_table s3c64xx_freq_table[] = { | 37 | static struct cpufreq_frequency_table s3c64xx_freq_table[] = { |
@@ -41,9 +41,9 @@ static struct cpufreq_frequency_table s3c64xx_freq_table[] = { | |||
41 | { 1, 266000 }, | 41 | { 1, 266000 }, |
42 | { 2, 333000 }, | 42 | { 2, 333000 }, |
43 | { 2, 400000 }, | 43 | { 2, 400000 }, |
44 | { 3, 532000 }, | 44 | { 2, 532000 }, |
45 | { 3, 533000 }, | 45 | { 2, 533000 }, |
46 | { 4, 667000 }, | 46 | { 3, 667000 }, |
47 | { 0, CPUFREQ_TABLE_END }, | 47 | { 0, CPUFREQ_TABLE_END }, |
48 | }; | 48 | }; |
49 | #endif | 49 | #endif |
@@ -141,7 +141,7 @@ err: | |||
141 | } | 141 | } |
142 | 142 | ||
143 | #ifdef CONFIG_REGULATOR | 143 | #ifdef CONFIG_REGULATOR |
144 | static void __init s3c64xx_cpufreq_constrain_voltages(void) | 144 | static void __init s3c64xx_cpufreq_config_regulator(void) |
145 | { | 145 | { |
146 | int count, v, i, found; | 146 | int count, v, i, found; |
147 | struct cpufreq_frequency_table *freq; | 147 | struct cpufreq_frequency_table *freq; |
@@ -150,11 +150,10 @@ static void __init s3c64xx_cpufreq_constrain_voltages(void) | |||
150 | count = regulator_count_voltages(vddarm); | 150 | count = regulator_count_voltages(vddarm); |
151 | if (count < 0) { | 151 | if (count < 0) { |
152 | pr_err("cpufreq: Unable to check supported voltages\n"); | 152 | pr_err("cpufreq: Unable to check supported voltages\n"); |
153 | return; | ||
154 | } | 153 | } |
155 | 154 | ||
156 | freq = s3c64xx_freq_table; | 155 | freq = s3c64xx_freq_table; |
157 | while (freq->frequency != CPUFREQ_TABLE_END) { | 156 | while (count > 0 && freq->frequency != CPUFREQ_TABLE_END) { |
158 | if (freq->frequency == CPUFREQ_ENTRY_INVALID) | 157 | if (freq->frequency == CPUFREQ_ENTRY_INVALID) |
159 | continue; | 158 | continue; |
160 | 159 | ||
@@ -175,6 +174,10 @@ static void __init s3c64xx_cpufreq_constrain_voltages(void) | |||
175 | 174 | ||
176 | freq++; | 175 | freq++; |
177 | } | 176 | } |
177 | |||
178 | /* Guess based on having to do an I2C/SPI write; in future we | ||
179 | * will be able to query the regulator performance here. */ | ||
180 | regulator_latency = 1 * 1000 * 1000; | ||
178 | } | 181 | } |
179 | #endif | 182 | #endif |
180 | 183 | ||
@@ -206,7 +209,7 @@ static int __init s3c64xx_cpufreq_driver_init(struct cpufreq_policy *policy) | |||
206 | pr_err("cpufreq: Only frequency scaling available\n"); | 209 | pr_err("cpufreq: Only frequency scaling available\n"); |
207 | vddarm = NULL; | 210 | vddarm = NULL; |
208 | } else { | 211 | } else { |
209 | s3c64xx_cpufreq_constrain_voltages(); | 212 | s3c64xx_cpufreq_config_regulator(); |
210 | } | 213 | } |
211 | #endif | 214 | #endif |
212 | 215 | ||
@@ -217,8 +220,11 @@ static int __init s3c64xx_cpufreq_driver_init(struct cpufreq_policy *policy) | |||
217 | /* Check for frequencies we can generate */ | 220 | /* Check for frequencies we can generate */ |
218 | r = clk_round_rate(armclk, freq->frequency * 1000); | 221 | r = clk_round_rate(armclk, freq->frequency * 1000); |
219 | r /= 1000; | 222 | r /= 1000; |
220 | if (r != freq->frequency) | 223 | if (r != freq->frequency) { |
224 | pr_debug("cpufreq: %dkHz unsupported by clock\n", | ||
225 | freq->frequency); | ||
221 | freq->frequency = CPUFREQ_ENTRY_INVALID; | 226 | freq->frequency = CPUFREQ_ENTRY_INVALID; |
227 | } | ||
222 | 228 | ||
223 | /* If we have no regulator then assume startup | 229 | /* If we have no regulator then assume startup |
224 | * frequency is the maximum we can support. */ | 230 | * frequency is the maximum we can support. */ |
@@ -230,9 +236,11 @@ static int __init s3c64xx_cpufreq_driver_init(struct cpufreq_policy *policy) | |||
230 | 236 | ||
231 | policy->cur = clk_get_rate(armclk) / 1000; | 237 | policy->cur = clk_get_rate(armclk) / 1000; |
232 | 238 | ||
233 | /* Pick a conservative guess in ns: we'll need ~1 I2C/SPI | 239 | /* Datasheet says PLL stabalisation time (if we were to use |
234 | * write plus clock reprogramming. */ | 240 | * the PLLs, which we don't currently) is ~300us worst case, |
235 | policy->cpuinfo.transition_latency = 2 * 1000 * 1000; | 241 | * but add some fudge. |
242 | */ | ||
243 | policy->cpuinfo.transition_latency = (500 * 1000) + regulator_latency; | ||
236 | 244 | ||
237 | ret = cpufreq_frequency_table_cpuinfo(policy, s3c64xx_freq_table); | 245 | ret = cpufreq_frequency_table_cpuinfo(policy, s3c64xx_freq_table); |
238 | if (ret != 0) { | 246 | if (ret != 0) { |
diff --git a/arch/arm/plat-s3c64xx/gpiolib.c b/arch/arm/plat-s3c64xx/gpiolib.c index 92859290ea33..778560457277 100644 --- a/arch/arm/plat-s3c64xx/gpiolib.c +++ b/arch/arm/plat-s3c64xx/gpiolib.c | |||
@@ -213,6 +213,11 @@ static struct s3c_gpio_cfg gpio_4bit_cfg_eint0011 = { | |||
213 | .get_pull = s3c_gpio_getpull_updown, | 213 | .get_pull = s3c_gpio_getpull_updown, |
214 | }; | 214 | }; |
215 | 215 | ||
216 | int s3c64xx_gpio2int_gpm(struct gpio_chip *chip, unsigned pin) | ||
217 | { | ||
218 | return pin < 5 ? IRQ_EINT(23) + pin : -ENXIO; | ||
219 | } | ||
220 | |||
216 | static struct s3c_gpio_chip gpio_4bit[] = { | 221 | static struct s3c_gpio_chip gpio_4bit[] = { |
217 | { | 222 | { |
218 | .base = S3C64XX_GPA_BASE, | 223 | .base = S3C64XX_GPA_BASE, |
@@ -269,10 +274,16 @@ static struct s3c_gpio_chip gpio_4bit[] = { | |||
269 | .base = S3C64XX_GPM(0), | 274 | .base = S3C64XX_GPM(0), |
270 | .ngpio = S3C64XX_GPIO_M_NR, | 275 | .ngpio = S3C64XX_GPIO_M_NR, |
271 | .label = "GPM", | 276 | .label = "GPM", |
277 | .to_irq = s3c64xx_gpio2int_gpm, | ||
272 | }, | 278 | }, |
273 | }, | 279 | }, |
274 | }; | 280 | }; |
275 | 281 | ||
282 | int s3c64xx_gpio2int_gpl(struct gpio_chip *chip, unsigned pin) | ||
283 | { | ||
284 | return pin >= 8 ? IRQ_EINT(16) + pin - 8 : -ENXIO; | ||
285 | } | ||
286 | |||
276 | static struct s3c_gpio_chip gpio_4bit2[] = { | 287 | static struct s3c_gpio_chip gpio_4bit2[] = { |
277 | { | 288 | { |
278 | .base = S3C64XX_GPH_BASE + 0x4, | 289 | .base = S3C64XX_GPH_BASE + 0x4, |
@@ -297,6 +308,7 @@ static struct s3c_gpio_chip gpio_4bit2[] = { | |||
297 | .base = S3C64XX_GPL(0), | 308 | .base = S3C64XX_GPL(0), |
298 | .ngpio = S3C64XX_GPIO_L_NR, | 309 | .ngpio = S3C64XX_GPIO_L_NR, |
299 | .label = "GPL", | 310 | .label = "GPL", |
311 | .to_irq = s3c64xx_gpio2int_gpl, | ||
300 | }, | 312 | }, |
301 | }, | 313 | }, |
302 | }; | 314 | }; |
diff --git a/arch/arm/plat-s3c64xx/include/plat/gpio-bank-c.h b/arch/arm/plat-s3c64xx/include/plat/gpio-bank-c.h index c47daf7e2723..e22b49f4f982 100644 --- a/arch/arm/plat-s3c64xx/include/plat/gpio-bank-c.h +++ b/arch/arm/plat-s3c64xx/include/plat/gpio-bank-c.h | |||
@@ -36,18 +36,18 @@ | |||
36 | 36 | ||
37 | #define S3C64XX_GPC4_SPI_MISO1 (0x02 << 16) | 37 | #define S3C64XX_GPC4_SPI_MISO1 (0x02 << 16) |
38 | #define S3C64XX_GPC4_MMC2_CMD (0x03 << 16) | 38 | #define S3C64XX_GPC4_MMC2_CMD (0x03 << 16) |
39 | #define S3C64XX_GPC4_I2S0_V40_DO (0x05 << 16) | 39 | #define S3C64XX_GPC4_I2S_V40_DO0 (0x05 << 16) |
40 | #define S3C64XX_GPC4_EINT_G2_4 (0x07 << 16) | 40 | #define S3C64XX_GPC4_EINT_G2_4 (0x07 << 16) |
41 | 41 | ||
42 | #define S3C64XX_GPC5_SPI_CLK1 (0x02 << 20) | 42 | #define S3C64XX_GPC5_SPI_CLK1 (0x02 << 20) |
43 | #define S3C64XX_GPC5_MMC2_CLK (0x03 << 20) | 43 | #define S3C64XX_GPC5_MMC2_CLK (0x03 << 20) |
44 | #define S3C64XX_GPC5_I2S1_V40_DO (0x05 << 20) | 44 | #define S3C64XX_GPC5_I2S_V40_DO1 (0x05 << 20) |
45 | #define S3C64XX_GPC5_EINT_G2_5 (0x07 << 20) | 45 | #define S3C64XX_GPC5_EINT_G2_5 (0x07 << 20) |
46 | 46 | ||
47 | #define S3C64XX_GPC6_SPI_MOSI1 (0x02 << 24) | 47 | #define S3C64XX_GPC6_SPI_MOSI1 (0x02 << 24) |
48 | #define S3C64XX_GPC6_EINT_G2_6 (0x07 << 24) | 48 | #define S3C64XX_GPC6_EINT_G2_6 (0x07 << 24) |
49 | 49 | ||
50 | #define S3C64XX_GPC7_SPI_nCS1 (0x02 << 28) | 50 | #define S3C64XX_GPC7_SPI_nCS1 (0x02 << 28) |
51 | #define S3C64XX_GPC7_I2S2_V40_DO (0x05 << 28) | 51 | #define S3C64XX_GPC7_I2S_V40_DO2 (0x05 << 28) |
52 | #define S3C64XX_GPC7_EINT_G2_7 (0x07 << 28) | 52 | #define S3C64XX_GPC7_EINT_G2_7 (0x07 << 28) |
53 | 53 | ||
diff --git a/arch/arm/plat-s3c64xx/irq-eint.c b/arch/arm/plat-s3c64xx/irq-eint.c index f81b7b818ba0..ebdf183a0911 100644 --- a/arch/arm/plat-s3c64xx/irq-eint.c +++ b/arch/arm/plat-s3c64xx/irq-eint.c | |||
@@ -65,7 +65,7 @@ static void s3c_irq_eint_maskack(unsigned int irq) | |||
65 | static int s3c_irq_eint_set_type(unsigned int irq, unsigned int type) | 65 | static int s3c_irq_eint_set_type(unsigned int irq, unsigned int type) |
66 | { | 66 | { |
67 | int offs = eint_offset(irq); | 67 | int offs = eint_offset(irq); |
68 | int pin; | 68 | int pin, pin_val; |
69 | int shift; | 69 | int shift; |
70 | u32 ctrl, mask; | 70 | u32 ctrl, mask; |
71 | u32 newvalue = 0; | 71 | u32 newvalue = 0; |
@@ -109,7 +109,10 @@ static int s3c_irq_eint_set_type(unsigned int irq, unsigned int type) | |||
109 | return -1; | 109 | return -1; |
110 | } | 110 | } |
111 | 111 | ||
112 | shift = (offs / 2) * 4; | 112 | if (offs <= 15) |
113 | shift = (offs / 2) * 4; | ||
114 | else | ||
115 | shift = ((offs - 16) / 2) * 4; | ||
113 | mask = 0x7 << shift; | 116 | mask = 0x7 << shift; |
114 | 117 | ||
115 | ctrl = __raw_readl(reg); | 118 | ctrl = __raw_readl(reg); |
@@ -119,12 +122,18 @@ static int s3c_irq_eint_set_type(unsigned int irq, unsigned int type) | |||
119 | 122 | ||
120 | /* set the GPIO pin appropriately */ | 123 | /* set the GPIO pin appropriately */ |
121 | 124 | ||
122 | if (offs < 23) | 125 | if (offs < 16) { |
123 | pin = S3C64XX_GPN(offs); | 126 | pin = S3C64XX_GPN(offs); |
124 | else | 127 | pin_val = S3C_GPIO_SFN(2); |
128 | } else if (offs < 23) { | ||
129 | pin = S3C64XX_GPL(offs + 8 - 16); | ||
130 | pin_val = S3C_GPIO_SFN(3); | ||
131 | } else { | ||
125 | pin = S3C64XX_GPM(offs - 23); | 132 | pin = S3C64XX_GPM(offs - 23); |
133 | pin_val = S3C_GPIO_SFN(3); | ||
134 | } | ||
126 | 135 | ||
127 | s3c_gpio_cfgpin(pin, S3C_GPIO_SFN(2)); | 136 | s3c_gpio_cfgpin(pin, pin_val); |
128 | 137 | ||
129 | return 0; | 138 | return 0; |
130 | } | 139 | } |
diff --git a/arch/arm/plat-s3c64xx/setup-sdhci-gpio.c b/arch/arm/plat-s3c64xx/setup-sdhci-gpio.c index 5417123b0ac1..a58c0cc7ba5e 100644 --- a/arch/arm/plat-s3c64xx/setup-sdhci-gpio.c +++ b/arch/arm/plat-s3c64xx/setup-sdhci-gpio.c | |||
@@ -53,3 +53,23 @@ void s3c64xx_setup_sdhci1_cfg_gpio(struct platform_device *dev, int width) | |||
53 | s3c_gpio_setpull(S3C64XX_GPG(6), S3C_GPIO_PULL_UP); | 53 | s3c_gpio_setpull(S3C64XX_GPG(6), S3C_GPIO_PULL_UP); |
54 | s3c_gpio_cfgpin(S3C64XX_GPG(6), S3C_GPIO_SFN(3)); | 54 | s3c_gpio_cfgpin(S3C64XX_GPG(6), S3C_GPIO_SFN(3)); |
55 | } | 55 | } |
56 | |||
57 | void s3c64xx_setup_sdhci2_cfg_gpio(struct platform_device *dev, int width) | ||
58 | { | ||
59 | unsigned int gpio; | ||
60 | unsigned int end; | ||
61 | |||
62 | end = S3C64XX_GPH(6 + width); | ||
63 | |||
64 | /* Set all the necessary GPH pins to special-function 1 */ | ||
65 | for (gpio = S3C64XX_GPH(6); gpio < end; gpio++) { | ||
66 | s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(3)); | ||
67 | s3c_gpio_setpull(gpio, S3C_GPIO_PULL_NONE); | ||
68 | } | ||
69 | |||
70 | /* Set all the necessary GPC pins to special-function 1 */ | ||
71 | for (gpio = S3C64XX_GPC(4); gpio < S3C64XX_GPC(6); gpio++) { | ||
72 | s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(3)); | ||
73 | s3c_gpio_setpull(gpio, S3C_GPIO_PULL_NONE); | ||
74 | } | ||
75 | } | ||