aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm/mach-s3c2410
diff options
context:
space:
mode:
authorVasily Khoruzhick <anarsoul@gmail.com>2010-09-08 05:39:46 -0400
committerBen Dooks <ben-linux@fluff.org>2010-09-25 19:45:18 -0400
commit14477095abc661a9f195ca4733bb739c54794b32 (patch)
tree92b4da26c1c7f1349706819756895e462f7bbdd7 /arch/arm/mach-s3c2410
parent56162badadb91aae93843d8d6558c7d7780e3cb2 (diff)
ARM: h1940: Use gpiolib for latch access
This patch adds gpiolib support for h1940 latch. With this patch it's possible to use leds-gpio and uda1380 drivers (they require gpiolib support for appropriate pins). And now it's possible to drop leds-h1940 driver. Signed-off-by: Vasily Khoruzhick <anarsoul@gmail.com> Signed-off-by: Ben Dooks <ben-linux@fluff.org>
Diffstat (limited to 'arch/arm/mach-s3c2410')
-rw-r--r--arch/arm/mach-s3c2410/h1940-bluetooth.c13
-rw-r--r--arch/arm/mach-s3c2410/include/mach/h1940-latch.h57
-rw-r--r--arch/arm/mach-s3c2410/mach-h1940.c64
3 files changed, 86 insertions, 48 deletions
diff --git a/arch/arm/mach-s3c2410/h1940-bluetooth.c b/arch/arm/mach-s3c2410/h1940-bluetooth.c
index 8cdeb14af592..8aa2f1902a94 100644
--- a/arch/arm/mach-s3c2410/h1940-bluetooth.c
+++ b/arch/arm/mach-s3c2410/h1940-bluetooth.c
@@ -30,7 +30,7 @@ static void h1940bt_enable(int on)
30{ 30{
31 if (on) { 31 if (on) {
32 /* Power on the chip */ 32 /* Power on the chip */
33 h1940_latch_control(0, H1940_LATCH_BLUETOOTH_POWER); 33 gpio_set_value(H1940_LATCH_BLUETOOTH_POWER, 1);
34 /* Reset the chip */ 34 /* Reset the chip */
35 mdelay(10); 35 mdelay(10);
36 36
@@ -43,7 +43,7 @@ static void h1940bt_enable(int on)
43 mdelay(10); 43 mdelay(10);
44 gpio_set_value(S3C2410_GPH(1), 0); 44 gpio_set_value(S3C2410_GPH(1), 0);
45 mdelay(10); 45 mdelay(10);
46 h1940_latch_control(H1940_LATCH_BLUETOOTH_POWER, 0); 46 gpio_set_value(H1940_LATCH_BLUETOOTH_POWER, 0);
47 } 47 }
48} 48}
49 49
@@ -64,7 +64,14 @@ static int __devinit h1940bt_probe(struct platform_device *pdev)
64 64
65 ret = gpio_request(S3C2410_GPH(1), dev_name(&pdev->dev)); 65 ret = gpio_request(S3C2410_GPH(1), dev_name(&pdev->dev));
66 if (ret) { 66 if (ret) {
67 dev_err(&pdev->dev, "could not get GPH1\n");\ 67 dev_err(&pdev->dev, "could not get GPH1\n");
68 return ret;
69 }
70
71 ret = gpio_request(H1940_LATCH_BLUETOOTH_POWER, dev_name(&pdev->dev));
72 if (ret) {
73 gpio_free(S3C2410_GPH(1));
74 dev_err(&pdev->dev, "could not get BT_POWER\n");
68 return ret; 75 return ret;
69 } 76 }
70 77
diff --git a/arch/arm/mach-s3c2410/include/mach/h1940-latch.h b/arch/arm/mach-s3c2410/include/mach/h1940-latch.h
index d8a832729a8a..73586f20930e 100644
--- a/arch/arm/mach-s3c2410/include/mach/h1940-latch.h
+++ b/arch/arm/mach-s3c2410/include/mach/h1940-latch.h
@@ -14,51 +14,30 @@
14#ifndef __ASM_ARCH_H1940_LATCH_H 14#ifndef __ASM_ARCH_H1940_LATCH_H
15#define __ASM_ARCH_H1940_LATCH_H 15#define __ASM_ARCH_H1940_LATCH_H
16 16
17#include <mach/gpio.h>
17 18
18#ifndef __ASSEMBLY__ 19#define H1940_LATCH_GPIO(x) (S3C_GPIO_END + (x))
19#define H1940_LATCH ((void __force __iomem *)0xF8000000)
20#else
21#define H1940_LATCH 0xF8000000
22#endif
23
24#define H1940_PA_LATCH (S3C2410_CS2)
25 20
26/* SD layer latch */ 21/* SD layer latch */
27 22
28#define H1940_LATCH_SDQ1 (1<<16) 23#define H1940_LATCH_SDQ1 H1940_LATCH_GPIO(0)
29#define H1940_LATCH_LCD_P1 (1<<17) 24#define H1940_LATCH_LCD_P1 H1940_LATCH_GPIO(1)
30#define H1940_LATCH_LCD_P2 (1<<18) 25#define H1940_LATCH_LCD_P2 H1940_LATCH_GPIO(2)
31#define H1940_LATCH_LCD_P3 (1<<19) 26#define H1940_LATCH_LCD_P3 H1940_LATCH_GPIO(3)
32#define H1940_LATCH_MAX1698_nSHUTDOWN (1<<20) /* LCD backlight */ 27#define H1940_LATCH_MAX1698_nSHUTDOWN H1940_LATCH_GPIO(4)
33#define H1940_LATCH_LED_RED (1<<21) 28#define H1940_LATCH_LED_RED H1940_LATCH_GPIO(5)
34#define H1940_LATCH_SDQ7 (1<<22) 29#define H1940_LATCH_SDQ7 H1940_LATCH_GPIO(6)
35#define H1940_LATCH_USB_DP (1<<23) 30#define H1940_LATCH_USB_DP H1940_LATCH_GPIO(7)
36 31
37/* CPU layer latch */ 32/* CPU layer latch */
38 33
39#define H1940_LATCH_UDA_POWER (1<<24) 34#define H1940_LATCH_UDA_POWER H1940_LATCH_GPIO(8)
40#define H1940_LATCH_AUDIO_POWER (1<<25) 35#define H1940_LATCH_AUDIO_POWER H1940_LATCH_GPIO(9)
41#define H1940_LATCH_SM803_ENABLE (1<<26) 36#define H1940_LATCH_SM803_ENABLE H1940_LATCH_GPIO(10)
42#define H1940_LATCH_LCD_P4 (1<<27) 37#define H1940_LATCH_LCD_P4 H1940_LATCH_GPIO(11)
43#define H1940_LATCH_CPUQ5 (1<<28) /* untraced */ 38#define H1940_LATCH_CPUQ5 H1940_LATCH_GPIO(12)
44#define H1940_LATCH_BLUETOOTH_POWER (1<<29) /* active high */ 39#define H1940_LATCH_BLUETOOTH_POWER H1940_LATCH_GPIO(13)
45#define H1940_LATCH_LED_GREEN (1<<30) 40#define H1940_LATCH_LED_GREEN H1940_LATCH_GPIO(14)
46#define H1940_LATCH_LED_FLASH (1<<31) 41#define H1940_LATCH_LED_FLASH H1940_LATCH_GPIO(15)
47
48/* default settings */
49
50#define H1940_LATCH_DEFAULT \
51 H1940_LATCH_LCD_P4 | \
52 H1940_LATCH_SM803_ENABLE | \
53 H1940_LATCH_SDQ1 | \
54 H1940_LATCH_LCD_P1 | \
55 H1940_LATCH_LCD_P2 | \
56 H1940_LATCH_LCD_P3 | \
57 H1940_LATCH_MAX1698_nSHUTDOWN | \
58 H1940_LATCH_CPUQ5
59
60/* control functions */
61
62extern void h1940_latch_control(unsigned int clear, unsigned int set);
63 42
64#endif /* __ASM_ARCH_H1940_LATCH_H */ 43#endif /* __ASM_ARCH_H1940_LATCH_H */
diff --git a/arch/arm/mach-s3c2410/mach-h1940.c b/arch/arm/mach-s3c2410/mach-h1940.c
index 3ba3bab139d0..f0493bdbf0dc 100644
--- a/arch/arm/mach-s3c2410/mach-h1940.c
+++ b/arch/arm/mach-s3c2410/mach-h1940.c
@@ -59,6 +59,12 @@
59#include <plat/mci.h> 59#include <plat/mci.h>
60#include <plat/ts.h> 60#include <plat/ts.h>
61 61
62#define H1940_LATCH ((void __force __iomem *)0xF8000000)
63
64#define H1940_PA_LATCH S3C2410_CS2
65
66#define H1940_LATCH_BIT(x) (1 << ((x) + 16 - S3C_GPIO_END))
67
62static struct map_desc h1940_iodesc[] __initdata = { 68static struct map_desc h1940_iodesc[] __initdata = {
63 [0] = { 69 [0] = {
64 .virtual = (unsigned long)H1940_LATCH, 70 .virtual = (unsigned long)H1940_LATCH,
@@ -100,9 +106,16 @@ static struct s3c2410_uartcfg h1940_uartcfgs[] __initdata = {
100 106
101/* Board control latch control */ 107/* Board control latch control */
102 108
103static unsigned int latch_state = H1940_LATCH_DEFAULT; 109static unsigned int latch_state = H1940_LATCH_BIT(H1940_LATCH_LCD_P4) |
110 H1940_LATCH_BIT(H1940_LATCH_SM803_ENABLE) |
111 H1940_LATCH_BIT(H1940_LATCH_SDQ1) |
112 H1940_LATCH_BIT(H1940_LATCH_LCD_P1) |
113 H1940_LATCH_BIT(H1940_LATCH_LCD_P2) |
114 H1940_LATCH_BIT(H1940_LATCH_LCD_P3) |
115 H1940_LATCH_BIT(H1940_LATCH_MAX1698_nSHUTDOWN) |
116 H1940_LATCH_BIT(H1940_LATCH_CPUQ5);
104 117
105void h1940_latch_control(unsigned int clear, unsigned int set) 118static void h1940_latch_control(unsigned int clear, unsigned int set)
106{ 119{
107 unsigned long flags; 120 unsigned long flags;
108 121
@@ -116,7 +129,42 @@ void h1940_latch_control(unsigned int clear, unsigned int set)
116 local_irq_restore(flags); 129 local_irq_restore(flags);
117} 130}
118 131
119EXPORT_SYMBOL_GPL(h1940_latch_control); 132static inline int h1940_gpiolib_to_latch(int offset)
133{
134 return 1 << (offset + 16);
135}
136
137static void h1940_gpiolib_latch_set(struct gpio_chip *chip,
138 unsigned offset, int value)
139{
140 int latch_bit = h1940_gpiolib_to_latch(offset);
141
142 h1940_latch_control(value ? 0 : latch_bit,
143 value ? latch_bit : 0);
144}
145
146static int h1940_gpiolib_latch_output(struct gpio_chip *chip,
147 unsigned offset, int value)
148{
149 h1940_gpiolib_latch_set(chip, offset, value);
150 return 0;
151}
152
153static int h1940_gpiolib_latch_get(struct gpio_chip *chip,
154 unsigned offset)
155{
156 return (latch_state >> (offset + 16)) & 1;
157}
158
159struct gpio_chip h1940_latch_gpiochip = {
160 .base = H1940_LATCH_GPIO(0),
161 .owner = THIS_MODULE,
162 .label = "H1940_LATCH",
163 .ngpio = 16,
164 .direction_output = h1940_gpiolib_latch_output,
165 .set = h1940_gpiolib_latch_set,
166 .get = h1940_gpiolib_latch_get,
167};
120 168
121static void h1940_udc_pullup(enum s3c2410_udc_cmd_e cmd) 169static void h1940_udc_pullup(enum s3c2410_udc_cmd_e cmd)
122{ 170{
@@ -125,10 +173,10 @@ static void h1940_udc_pullup(enum s3c2410_udc_cmd_e cmd)
125 switch (cmd) 173 switch (cmd)
126 { 174 {
127 case S3C2410_UDC_P_ENABLE : 175 case S3C2410_UDC_P_ENABLE :
128 h1940_latch_control(0, H1940_LATCH_USB_DP); 176 gpio_set_value(H1940_LATCH_USB_DP, 1);
129 break; 177 break;
130 case S3C2410_UDC_P_DISABLE : 178 case S3C2410_UDC_P_DISABLE :
131 h1940_latch_control(H1940_LATCH_USB_DP, 0); 179 gpio_set_value(H1940_LATCH_USB_DP, 0);
132 break; 180 break;
133 case S3C2410_UDC_P_RESET : 181 case S3C2410_UDC_P_RESET :
134 break; 182 break;
@@ -303,6 +351,8 @@ static void __init h1940_map_io(void)
303 memcpy(phys_to_virt(H1940_SUSPEND_RESUMEAT), h1940_pm_return, 1024); 351 memcpy(phys_to_virt(H1940_SUSPEND_RESUMEAT), h1940_pm_return, 1024);
304#endif 352#endif
305 s3c_pm_init(); 353 s3c_pm_init();
354
355 WARN_ON(gpiochip_add(&h1940_latch_gpiochip));
306} 356}
307 357
308/* H1940 and RX3715 need to reserve this for suspend */ 358/* H1940 and RX3715 need to reserve this for suspend */
@@ -342,9 +392,11 @@ static void __init h1940_init(void)
342 gpio_request(S3C2410_GPC(0), "LCD power"); 392 gpio_request(S3C2410_GPC(0), "LCD power");
343 gpio_request(S3C2410_GPC(5), "LCD power"); 393 gpio_request(S3C2410_GPC(5), "LCD power");
344 gpio_request(S3C2410_GPC(6), "LCD power"); 394 gpio_request(S3C2410_GPC(6), "LCD power");
345
346 gpio_direction_input(S3C2410_GPC(6)); 395 gpio_direction_input(S3C2410_GPC(6));
347 396
397 gpio_request(H1940_LATCH_USB_DP, "USB pullup");
398 gpio_direction_output(H1940_LATCH_USB_DP, 0);
399
348 platform_add_devices(h1940_devices, ARRAY_SIZE(h1940_devices)); 400 platform_add_devices(h1940_devices, ARRAY_SIZE(h1940_devices));
349} 401}
350 402