| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1 | /* linux/arch/arm/mach-s3c2410/mach-h1940.c | 
|  | 2 | * | 
|  | 3 | * Copyright (c) 2003-2005 Simtec Electronics | 
|  | 4 | *   Ben Dooks <ben@simtec.co.uk> | 
|  | 5 | * | 
|  | 6 | * http://www.handhelds.org/projects/h1940.html | 
|  | 7 | * | 
|  | 8 | * This program is free software; you can redistribute it and/or modify | 
|  | 9 | * it under the terms of the GNU General Public License version 2 as | 
|  | 10 | * published by the Free Software Foundation. | 
|  | 11 | * | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 12 | */ | 
|  | 13 |  | 
|  | 14 | #include <linux/kernel.h> | 
|  | 15 | #include <linux/types.h> | 
|  | 16 | #include <linux/interrupt.h> | 
|  | 17 | #include <linux/list.h> | 
| Russell King | 8d717a5 | 2010-05-22 19:47:18 +0100 | [diff] [blame] | 18 | #include <linux/memblock.h> | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 19 | #include <linux/timer.h> | 
|  | 20 | #include <linux/init.h> | 
| Ben Dooks | 333a42e | 2007-05-20 11:55:53 +0100 | [diff] [blame] | 21 | #include <linux/sysdev.h> | 
| Ben Dooks | b6d1f54 | 2006-12-17 23:22:26 +0100 | [diff] [blame] | 22 | #include <linux/serial_core.h> | 
| Russell King | d052d1b | 2005-10-29 19:07:23 +0100 | [diff] [blame] | 23 | #include <linux/platform_device.h> | 
| Russell King | fced80c | 2008-09-06 12:10:45 +0100 | [diff] [blame] | 24 | #include <linux/io.h> | 
| arnaud.patard@rtp-net.org | 3909b9f | 2009-11-17 14:54:56 +0100 | [diff] [blame] | 25 | #include <linux/gpio.h> | 
| Arnaud Patard (Rtp) | bbb1c83 | 2011-01-06 21:52:46 +0200 | [diff] [blame] | 26 | #include <linux/input.h> | 
|  | 27 | #include <linux/gpio_keys.h> | 
| arnaud.patard@rtp-net.org | 22e649f | 2009-11-17 14:54:58 +0100 | [diff] [blame] | 28 | #include <linux/pwm_backlight.h> | 
| Vasily Khoruzhick | 68730b4 | 2010-09-27 09:32:49 +0300 | [diff] [blame] | 29 | #include <linux/i2c.h> | 
| Vasily Khoruzhick | 50e2d10 | 2011-01-06 21:52:48 +0200 | [diff] [blame] | 30 | #include <linux/leds.h> | 
| Vasily Khoruzhick | a8e9985 | 2011-01-06 21:52:49 +0200 | [diff] [blame] | 31 | #include <linux/pda_power.h> | 
|  | 32 | #include <linux/s3c_adc_battery.h> | 
| Vasily Khoruzhick | 25d391c | 2011-01-06 21:52:50 +0200 | [diff] [blame] | 33 | #include <linux/delay.h> | 
| Vasily Khoruzhick | 50e2d10 | 2011-01-06 21:52:48 +0200 | [diff] [blame] | 34 |  | 
| arnaud.patard@rtp-net.org | 22e649f | 2009-11-17 14:54:58 +0100 | [diff] [blame] | 35 | #include <video/platform_lcd.h> | 
| arnaud.patard@rtp-net.org | 3909b9f | 2009-11-17 14:54:56 +0100 | [diff] [blame] | 36 |  | 
|  | 37 | #include <linux/mmc/host.h> | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 38 |  | 
|  | 39 | #include <asm/mach/arch.h> | 
|  | 40 | #include <asm/mach/map.h> | 
|  | 41 | #include <asm/mach/irq.h> | 
|  | 42 |  | 
| Russell King | a09e64f | 2008-08-05 16:14:15 +0100 | [diff] [blame] | 43 | #include <mach/hardware.h> | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 44 | #include <asm/irq.h> | 
|  | 45 | #include <asm/mach-types.h> | 
|  | 46 |  | 
| Ben Dooks | a2b7ba9 | 2008-10-07 22:26:09 +0100 | [diff] [blame] | 47 | #include <plat/regs-serial.h> | 
| Russell King | a09e64f | 2008-08-05 16:14:15 +0100 | [diff] [blame] | 48 | #include <mach/regs-lcd.h> | 
| Russell King | a09e64f | 2008-08-05 16:14:15 +0100 | [diff] [blame] | 49 | #include <mach/regs-clock.h> | 
| Arnaud Patard | f92273c | 2005-09-09 13:10:10 -0700 | [diff] [blame] | 50 |  | 
| arnaud.patard@rtp-net.org | 3909b9f | 2009-11-17 14:54:56 +0100 | [diff] [blame] | 51 | #include <mach/regs-gpio.h> | 
|  | 52 | #include <mach/gpio-fns.h> | 
|  | 53 | #include <mach/gpio-nrs.h> | 
|  | 54 |  | 
| Russell King | a09e64f | 2008-08-05 16:14:15 +0100 | [diff] [blame] | 55 | #include <mach/h1940.h> | 
|  | 56 | #include <mach/h1940-latch.h> | 
|  | 57 | #include <mach/fb.h> | 
| Ben Dooks | 57bd4b9 | 2008-10-30 10:14:37 +0000 | [diff] [blame] | 58 | #include <plat/udc.h> | 
| Ben Dooks | 3e1b776 | 2008-10-31 16:14:40 +0000 | [diff] [blame] | 59 | #include <plat/iic.h> | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 60 |  | 
| Ben Dooks | 40b956f | 2010-05-04 14:38:49 +0900 | [diff] [blame] | 61 | #include <plat/gpio-cfg.h> | 
| Ben Dooks | d5120ae | 2008-10-07 23:09:51 +0100 | [diff] [blame] | 62 | #include <plat/clock.h> | 
| Ben Dooks | a2b7ba9 | 2008-10-07 22:26:09 +0100 | [diff] [blame] | 63 | #include <plat/devs.h> | 
|  | 64 | #include <plat/cpu.h> | 
| Ben Dooks | e24b864 | 2008-10-21 14:06:34 +0100 | [diff] [blame] | 65 | #include <plat/pll.h> | 
| Ben Dooks | a2b7ba9 | 2008-10-07 22:26:09 +0100 | [diff] [blame] | 66 | #include <plat/pm.h> | 
| arnaud.patard@rtp-net.org | 3909b9f | 2009-11-17 14:54:56 +0100 | [diff] [blame] | 67 | #include <plat/mci.h> | 
| Maurus Cuelenaere | 73e59b1 | 2010-05-04 13:12:41 +0200 | [diff] [blame] | 68 | #include <plat/ts.h> | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 69 |  | 
| Vasily Khoruzhick | 68730b4 | 2010-09-27 09:32:49 +0300 | [diff] [blame] | 70 | #include <sound/uda1380.h> | 
|  | 71 |  | 
| Vasily Khoruzhick | 1447709 | 2010-09-08 12:39:46 +0300 | [diff] [blame] | 72 | #define H1940_LATCH		((void __force __iomem *)0xF8000000) | 
|  | 73 |  | 
|  | 74 | #define H1940_PA_LATCH		S3C2410_CS2 | 
|  | 75 |  | 
|  | 76 | #define H1940_LATCH_BIT(x)	(1 << ((x) + 16 - S3C_GPIO_END)) | 
|  | 77 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 78 | static struct map_desc h1940_iodesc[] __initdata = { | 
| Ben Dooks | e198168 | 2006-02-10 22:40:51 +0000 | [diff] [blame] | 79 | [0] = { | 
|  | 80 | .virtual	= (unsigned long)H1940_LATCH, | 
|  | 81 | .pfn		= __phys_to_pfn(H1940_PA_LATCH), | 
|  | 82 | .length		= SZ_16K, | 
|  | 83 | .type		= MT_DEVICE | 
|  | 84 | }, | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 85 | }; | 
|  | 86 |  | 
|  | 87 | #define UCON S3C2410_UCON_DEFAULT | S3C2410_UCON_UCLK | 
|  | 88 | #define ULCON S3C2410_LCON_CS8 | S3C2410_LCON_PNONE | S3C2410_LCON_STOPB | 
|  | 89 | #define UFCON S3C2410_UFCON_RXTRIG8 | S3C2410_UFCON_FIFOMODE | 
|  | 90 |  | 
| Ben Dooks | 66a9b49 | 2006-06-18 23:04:05 +0100 | [diff] [blame] | 91 | static struct s3c2410_uartcfg h1940_uartcfgs[] __initdata = { | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 92 | [0] = { | 
|  | 93 | .hwport	     = 0, | 
|  | 94 | .flags	     = 0, | 
|  | 95 | .ucon	     = 0x3c5, | 
|  | 96 | .ulcon	     = 0x03, | 
|  | 97 | .ufcon	     = 0x51, | 
|  | 98 | }, | 
|  | 99 | [1] = { | 
|  | 100 | .hwport	     = 1, | 
|  | 101 | .flags	     = 0, | 
|  | 102 | .ucon	     = 0x245, | 
|  | 103 | .ulcon	     = 0x03, | 
|  | 104 | .ufcon	     = 0x00, | 
|  | 105 | }, | 
|  | 106 | /* IR port */ | 
|  | 107 | [2] = { | 
|  | 108 | .hwport	     = 2, | 
|  | 109 | .flags	     = 0, | 
|  | 110 | .uart_flags  = UPF_CONS_FLOW, | 
|  | 111 | .ucon	     = 0x3c5, | 
|  | 112 | .ulcon	     = 0x43, | 
|  | 113 | .ufcon	     = 0x51, | 
|  | 114 | } | 
|  | 115 | }; | 
|  | 116 |  | 
| Ben Dooks | e198168 | 2006-02-10 22:40:51 +0000 | [diff] [blame] | 117 | /* Board control latch control */ | 
|  | 118 |  | 
| Vasily Khoruzhick | 53193dd | 2010-09-27 09:28:00 +0300 | [diff] [blame] | 119 | static unsigned int latch_state; | 
| Ben Dooks | e198168 | 2006-02-10 22:40:51 +0000 | [diff] [blame] | 120 |  | 
| Vasily Khoruzhick | 1447709 | 2010-09-08 12:39:46 +0300 | [diff] [blame] | 121 | static void h1940_latch_control(unsigned int clear, unsigned int set) | 
| Ben Dooks | e198168 | 2006-02-10 22:40:51 +0000 | [diff] [blame] | 122 | { | 
|  | 123 | unsigned long flags; | 
|  | 124 |  | 
|  | 125 | local_irq_save(flags); | 
|  | 126 |  | 
|  | 127 | latch_state &= ~clear; | 
|  | 128 | latch_state |= set; | 
|  | 129 |  | 
|  | 130 | __raw_writel(latch_state, H1940_LATCH); | 
|  | 131 |  | 
|  | 132 | local_irq_restore(flags); | 
|  | 133 | } | 
|  | 134 |  | 
| Vasily Khoruzhick | 1447709 | 2010-09-08 12:39:46 +0300 | [diff] [blame] | 135 | static inline int h1940_gpiolib_to_latch(int offset) | 
|  | 136 | { | 
|  | 137 | return 1 << (offset + 16); | 
|  | 138 | } | 
|  | 139 |  | 
|  | 140 | static void h1940_gpiolib_latch_set(struct gpio_chip *chip, | 
|  | 141 | unsigned offset, int value) | 
|  | 142 | { | 
|  | 143 | int latch_bit = h1940_gpiolib_to_latch(offset); | 
|  | 144 |  | 
|  | 145 | h1940_latch_control(value ? 0 : latch_bit, | 
|  | 146 | value ? latch_bit : 0); | 
|  | 147 | } | 
|  | 148 |  | 
|  | 149 | static int h1940_gpiolib_latch_output(struct gpio_chip *chip, | 
|  | 150 | unsigned offset, int value) | 
|  | 151 | { | 
|  | 152 | h1940_gpiolib_latch_set(chip, offset, value); | 
|  | 153 | return 0; | 
|  | 154 | } | 
|  | 155 |  | 
|  | 156 | static int h1940_gpiolib_latch_get(struct gpio_chip *chip, | 
|  | 157 | unsigned offset) | 
|  | 158 | { | 
|  | 159 | return (latch_state >> (offset + 16)) & 1; | 
|  | 160 | } | 
|  | 161 |  | 
|  | 162 | struct gpio_chip h1940_latch_gpiochip = { | 
|  | 163 | .base			= H1940_LATCH_GPIO(0), | 
|  | 164 | .owner			= THIS_MODULE, | 
|  | 165 | .label			= "H1940_LATCH", | 
|  | 166 | .ngpio			= 16, | 
|  | 167 | .direction_output	= h1940_gpiolib_latch_output, | 
|  | 168 | .set			= h1940_gpiolib_latch_set, | 
|  | 169 | .get			= h1940_gpiolib_latch_get, | 
|  | 170 | }; | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 171 |  | 
| Arnaud Patard | 71a9c42 | 2007-02-13 00:21:26 +0100 | [diff] [blame] | 172 | static struct s3c2410_udc_mach_info h1940_udc_cfg __initdata = { | 
| Ben Dooks | 070276d | 2009-05-17 22:32:23 +0100 | [diff] [blame] | 173 | .vbus_pin		= S3C2410_GPG(5), | 
| Arnaud Patard | 71a9c42 | 2007-02-13 00:21:26 +0100 | [diff] [blame] | 174 | .vbus_pin_inverted	= 1, | 
| Lars-Peter Clausen | e27c3c5 | 2011-03-07 08:42:00 +0100 | [diff] [blame] | 175 | .pullup_pin		= H1940_LATCH_USB_DP, | 
| Arnaud Patard | 71a9c42 | 2007-02-13 00:21:26 +0100 | [diff] [blame] | 176 | }; | 
|  | 177 |  | 
| Arnaud Patard | ce8877b | 2009-12-23 19:25:05 +0000 | [diff] [blame] | 178 | static struct s3c2410_ts_mach_info h1940_ts_cfg __initdata = { | 
|  | 179 | .delay = 10000, | 
|  | 180 | .presc = 49, | 
|  | 181 | .oversampling_shift = 2, | 
| Naveen Krishna | 5bfdca1 | 2010-05-18 20:44:27 +0900 | [diff] [blame] | 182 | .cfg_gpio = s3c24xx_ts_cfg_gpio, | 
| Arnaud Patard | ce8877b | 2009-12-23 19:25:05 +0000 | [diff] [blame] | 183 | }; | 
| Arnaud Patard | 71a9c42 | 2007-02-13 00:21:26 +0100 | [diff] [blame] | 184 |  | 
| Arnaud Patard | f92273c | 2005-09-09 13:10:10 -0700 | [diff] [blame] | 185 | /** | 
|  | 186 | * Set lcd on or off | 
|  | 187 | **/ | 
| Krzysztof Helt | 09fe75f | 2007-10-16 01:28:56 -0700 | [diff] [blame] | 188 | static struct s3c2410fb_display h1940_lcd __initdata = { | 
| Krzysztof Helt | f28ef57 | 2007-10-16 01:28:58 -0700 | [diff] [blame] | 189 | .lcdcon5=	S3C2410_LCDCON5_FRM565 | \ | 
|  | 190 | S3C2410_LCDCON5_INVVLINE | \ | 
|  | 191 | S3C2410_LCDCON5_HWSWP, | 
| Krzysztof Helt | 09fe75f | 2007-10-16 01:28:56 -0700 | [diff] [blame] | 192 |  | 
| Krzysztof Helt | 1f41153 | 2007-10-16 01:28:57 -0700 | [diff] [blame] | 193 | .type =		S3C2410_LCDCON1_TFT, | 
| Krzysztof Helt | 09fe75f | 2007-10-16 01:28:56 -0700 | [diff] [blame] | 194 | .width =	240, | 
|  | 195 | .height =	320, | 
| Krzysztof Helt | 6981669 | 2007-10-16 01:29:06 -0700 | [diff] [blame] | 196 | .pixclock =	260000, | 
| Krzysztof Helt | 09fe75f | 2007-10-16 01:28:56 -0700 | [diff] [blame] | 197 | .xres =		240, | 
|  | 198 | .yres =		320, | 
|  | 199 | .bpp =		16, | 
| Mike Solovyev | 26be1b7 | 2010-05-12 15:38:00 +0400 | [diff] [blame] | 200 | .left_margin =	8, | 
|  | 201 | .right_margin =	20, | 
| Krzysztof Helt | 93d11f5 | 2007-10-16 01:29:00 -0700 | [diff] [blame] | 202 | .hsync_len =	4, | 
| Krzysztof Helt | 5f20f69 | 2007-10-16 01:28:59 -0700 | [diff] [blame] | 203 | .upper_margin =	8, | 
|  | 204 | .lower_margin = 7, | 
| Krzysztof Helt | 93d11f5 | 2007-10-16 01:29:00 -0700 | [diff] [blame] | 205 | .vsync_len =	1, | 
| Krzysztof Helt | 09fe75f | 2007-10-16 01:28:56 -0700 | [diff] [blame] | 206 | }; | 
|  | 207 |  | 
|  | 208 | static struct s3c2410fb_mach_info h1940_fb_info __initdata = { | 
| Krzysztof Helt | 09fe75f | 2007-10-16 01:28:56 -0700 | [diff] [blame] | 209 | .displays = &h1940_lcd, | 
|  | 210 | .num_displays = 1, | 
|  | 211 | .default_display = 0, | 
|  | 212 |  | 
| Vasily Khoruzhick | 25d391c | 2011-01-06 21:52:50 +0200 | [diff] [blame] | 213 | .lpcsel =	0x02, | 
|  | 214 | .gpccon =	0xaa940659, | 
|  | 215 | .gpccon_mask =	0xffffc0f0, | 
|  | 216 | .gpcup =	0x0000ffff, | 
|  | 217 | .gpcup_mask =	0xffffffff, | 
|  | 218 | .gpdcon =	0xaa84aaa0, | 
|  | 219 | .gpdcon_mask =	0xffffffff, | 
|  | 220 | .gpdup =	0x0000faff, | 
|  | 221 | .gpdup_mask =	0xffffffff, | 
| Arnaud Patard | f92273c | 2005-09-09 13:10:10 -0700 | [diff] [blame] | 222 | }; | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 223 |  | 
| Vasily Khoruzhick | a8e9985 | 2011-01-06 21:52:49 +0200 | [diff] [blame] | 224 | static int power_supply_init(struct device *dev) | 
|  | 225 | { | 
|  | 226 | return gpio_request(S3C2410_GPF(2), "cable plugged"); | 
|  | 227 | } | 
|  | 228 |  | 
|  | 229 | static int h1940_is_ac_online(void) | 
|  | 230 | { | 
|  | 231 | return !gpio_get_value(S3C2410_GPF(2)); | 
|  | 232 | } | 
|  | 233 |  | 
|  | 234 | static void power_supply_exit(struct device *dev) | 
|  | 235 | { | 
|  | 236 | gpio_free(S3C2410_GPF(2)); | 
|  | 237 | } | 
|  | 238 |  | 
|  | 239 | static char *h1940_supplicants[] = { | 
|  | 240 | "main-battery", | 
|  | 241 | "backup-battery", | 
|  | 242 | }; | 
|  | 243 |  | 
|  | 244 | static struct pda_power_pdata power_supply_info = { | 
|  | 245 | .init			= power_supply_init, | 
|  | 246 | .is_ac_online		= h1940_is_ac_online, | 
|  | 247 | .exit			= power_supply_exit, | 
|  | 248 | .supplied_to		= h1940_supplicants, | 
|  | 249 | .num_supplicants	= ARRAY_SIZE(h1940_supplicants), | 
|  | 250 | }; | 
|  | 251 |  | 
|  | 252 | static struct resource power_supply_resources[] = { | 
|  | 253 | [0] = { | 
|  | 254 | .name	= "ac", | 
|  | 255 | .flags	= IORESOURCE_IRQ | IORESOURCE_IRQ_LOWEDGE | | 
|  | 256 | IORESOURCE_IRQ_HIGHEDGE, | 
|  | 257 | .start	= IRQ_EINT2, | 
|  | 258 | .end	= IRQ_EINT2, | 
|  | 259 | }, | 
|  | 260 | }; | 
|  | 261 |  | 
|  | 262 | static struct platform_device power_supply = { | 
|  | 263 | .name		= "pda-power", | 
|  | 264 | .id		= -1, | 
|  | 265 | .dev		= { | 
|  | 266 | .platform_data = | 
|  | 267 | &power_supply_info, | 
|  | 268 | }, | 
|  | 269 | .resource	= power_supply_resources, | 
|  | 270 | .num_resources	= ARRAY_SIZE(power_supply_resources), | 
|  | 271 | }; | 
|  | 272 |  | 
|  | 273 | static const struct s3c_adc_bat_thresh bat_lut_noac[] = { | 
|  | 274 | { .volt = 4070, .cur = 162, .level = 100}, | 
|  | 275 | { .volt = 4040, .cur = 165, .level = 95}, | 
|  | 276 | { .volt = 4016, .cur = 164, .level = 90}, | 
|  | 277 | { .volt = 3996, .cur = 166, .level = 85}, | 
|  | 278 | { .volt = 3971, .cur = 168, .level = 80}, | 
|  | 279 | { .volt = 3951, .cur = 168, .level = 75}, | 
|  | 280 | { .volt = 3931, .cur = 170, .level = 70}, | 
|  | 281 | { .volt = 3903, .cur = 172, .level = 65}, | 
|  | 282 | { .volt = 3886, .cur = 172, .level = 60}, | 
|  | 283 | { .volt = 3858, .cur = 176, .level = 55}, | 
|  | 284 | { .volt = 3842, .cur = 176, .level = 50}, | 
|  | 285 | { .volt = 3818, .cur = 176, .level = 45}, | 
|  | 286 | { .volt = 3789, .cur = 180, .level = 40}, | 
|  | 287 | { .volt = 3769, .cur = 180, .level = 35}, | 
|  | 288 | { .volt = 3749, .cur = 184, .level = 30}, | 
|  | 289 | { .volt = 3732, .cur = 184, .level = 25}, | 
|  | 290 | { .volt = 3716, .cur = 184, .level = 20}, | 
|  | 291 | { .volt = 3708, .cur = 184, .level = 15}, | 
|  | 292 | { .volt = 3716, .cur = 96, .level = 10}, | 
|  | 293 | { .volt = 3700, .cur = 96, .level = 5}, | 
|  | 294 | { .volt = 3684, .cur = 96, .level = 0}, | 
|  | 295 | }; | 
|  | 296 |  | 
|  | 297 | static const struct s3c_adc_bat_thresh bat_lut_acin[] = { | 
|  | 298 | { .volt = 4130, .cur = 0, .level = 100}, | 
|  | 299 | { .volt = 3982, .cur = 0, .level = 50}, | 
|  | 300 | { .volt = 3854, .cur = 0, .level = 10}, | 
|  | 301 | { .volt = 3841, .cur = 0, .level = 0}, | 
|  | 302 | }; | 
|  | 303 |  | 
|  | 304 | int h1940_bat_init(void) | 
|  | 305 | { | 
|  | 306 | int ret; | 
|  | 307 |  | 
|  | 308 | ret = gpio_request(H1940_LATCH_SM803_ENABLE, "h1940-charger-enable"); | 
|  | 309 | if (ret) | 
|  | 310 | return ret; | 
|  | 311 | gpio_direction_output(H1940_LATCH_SM803_ENABLE, 0); | 
|  | 312 |  | 
|  | 313 | return 0; | 
|  | 314 |  | 
|  | 315 | } | 
|  | 316 |  | 
|  | 317 | void h1940_bat_exit(void) | 
|  | 318 | { | 
|  | 319 | gpio_free(H1940_LATCH_SM803_ENABLE); | 
|  | 320 | } | 
|  | 321 |  | 
|  | 322 | void h1940_enable_charger(void) | 
|  | 323 | { | 
|  | 324 | gpio_set_value(H1940_LATCH_SM803_ENABLE, 1); | 
|  | 325 | } | 
|  | 326 |  | 
|  | 327 | void h1940_disable_charger(void) | 
|  | 328 | { | 
|  | 329 | gpio_set_value(H1940_LATCH_SM803_ENABLE, 0); | 
|  | 330 | } | 
|  | 331 |  | 
|  | 332 | static struct s3c_adc_bat_pdata h1940_bat_cfg = { | 
|  | 333 | .init = h1940_bat_init, | 
|  | 334 | .exit = h1940_bat_exit, | 
|  | 335 | .enable_charger = h1940_enable_charger, | 
|  | 336 | .disable_charger = h1940_disable_charger, | 
|  | 337 | .gpio_charge_finished = S3C2410_GPF(3), | 
|  | 338 | .gpio_inverted = 1, | 
|  | 339 | .lut_noac = bat_lut_noac, | 
|  | 340 | .lut_noac_cnt = ARRAY_SIZE(bat_lut_noac), | 
|  | 341 | .lut_acin = bat_lut_acin, | 
|  | 342 | .lut_acin_cnt = ARRAY_SIZE(bat_lut_acin), | 
|  | 343 | .volt_channel = 0, | 
|  | 344 | .current_channel = 1, | 
|  | 345 | .volt_mult = 4056, | 
|  | 346 | .current_mult = 1893, | 
|  | 347 | .internal_impedance = 200, | 
|  | 348 | .backup_volt_channel = 3, | 
|  | 349 | /* TODO Check backup volt multiplier */ | 
|  | 350 | .backup_volt_mult = 4056, | 
|  | 351 | .backup_volt_min = 0, | 
|  | 352 | .backup_volt_max = 4149288 | 
|  | 353 | }; | 
|  | 354 |  | 
|  | 355 | static struct platform_device h1940_battery = { | 
|  | 356 | .name             = "s3c-adc-battery", | 
|  | 357 | .id               = -1, | 
|  | 358 | .dev = { | 
|  | 359 | .parent = &s3c_device_adc.dev, | 
|  | 360 | .platform_data = &h1940_bat_cfg, | 
|  | 361 | }, | 
|  | 362 | }; | 
|  | 363 |  | 
| Vasily Khoruzhick | 50e2d10 | 2011-01-06 21:52:48 +0200 | [diff] [blame] | 364 | DEFINE_SPINLOCK(h1940_blink_spin); | 
|  | 365 |  | 
|  | 366 | int h1940_led_blink_set(unsigned gpio, int state, | 
|  | 367 | unsigned long *delay_on, unsigned long *delay_off) | 
|  | 368 | { | 
|  | 369 | int blink_gpio, check_gpio1, check_gpio2; | 
|  | 370 |  | 
|  | 371 | switch (gpio) { | 
|  | 372 | case H1940_LATCH_LED_GREEN: | 
|  | 373 | blink_gpio = S3C2410_GPA(7); | 
|  | 374 | check_gpio1 = S3C2410_GPA(1); | 
|  | 375 | check_gpio2 = S3C2410_GPA(3); | 
|  | 376 | break; | 
|  | 377 | case H1940_LATCH_LED_RED: | 
|  | 378 | blink_gpio = S3C2410_GPA(1); | 
|  | 379 | check_gpio1 = S3C2410_GPA(7); | 
|  | 380 | check_gpio2 = S3C2410_GPA(3); | 
|  | 381 | break; | 
|  | 382 | default: | 
|  | 383 | blink_gpio = S3C2410_GPA(3); | 
|  | 384 | check_gpio1 = S3C2410_GPA(1); | 
|  | 385 | check_gpio1 = S3C2410_GPA(7); | 
|  | 386 | break; | 
|  | 387 | } | 
|  | 388 |  | 
|  | 389 | if (delay_on && delay_off && !*delay_on && !*delay_off) | 
|  | 390 | *delay_on = *delay_off = 500; | 
|  | 391 |  | 
|  | 392 | spin_lock(&h1940_blink_spin); | 
|  | 393 |  | 
|  | 394 | switch (state) { | 
|  | 395 | case GPIO_LED_NO_BLINK_LOW: | 
|  | 396 | case GPIO_LED_NO_BLINK_HIGH: | 
|  | 397 | if (!gpio_get_value(check_gpio1) && | 
|  | 398 | !gpio_get_value(check_gpio2)) | 
|  | 399 | gpio_set_value(H1940_LATCH_LED_FLASH, 0); | 
|  | 400 | gpio_set_value(blink_gpio, 0); | 
|  | 401 | if (gpio_is_valid(gpio)) | 
|  | 402 | gpio_set_value(gpio, state); | 
|  | 403 | break; | 
|  | 404 | case GPIO_LED_BLINK: | 
|  | 405 | if (gpio_is_valid(gpio)) | 
|  | 406 | gpio_set_value(gpio, 0); | 
|  | 407 | gpio_set_value(H1940_LATCH_LED_FLASH, 1); | 
|  | 408 | gpio_set_value(blink_gpio, 1); | 
|  | 409 | break; | 
|  | 410 | } | 
|  | 411 |  | 
|  | 412 | spin_unlock(&h1940_blink_spin); | 
|  | 413 |  | 
|  | 414 | return 0; | 
|  | 415 | } | 
|  | 416 | EXPORT_SYMBOL(h1940_led_blink_set); | 
|  | 417 |  | 
|  | 418 | static struct gpio_led h1940_leds_desc[] = { | 
|  | 419 | { | 
|  | 420 | .name			= "Green", | 
| Vasily Khoruzhick | 9edb240 | 2011-03-17 20:04:57 +0200 | [diff] [blame] | 421 | .default_trigger	= "main-battery-full", | 
| Vasily Khoruzhick | 50e2d10 | 2011-01-06 21:52:48 +0200 | [diff] [blame] | 422 | .gpio			= H1940_LATCH_LED_GREEN, | 
|  | 423 | .retain_state_suspended	= 1, | 
|  | 424 | }, | 
|  | 425 | { | 
|  | 426 | .name			= "Red", | 
| Vasily Khoruzhick | 9edb240 | 2011-03-17 20:04:57 +0200 | [diff] [blame] | 427 | .default_trigger | 
|  | 428 | = "main-battery-charging-blink-full-solid", | 
| Vasily Khoruzhick | 50e2d10 | 2011-01-06 21:52:48 +0200 | [diff] [blame] | 429 | .gpio			= H1940_LATCH_LED_RED, | 
|  | 430 | .retain_state_suspended	= 1, | 
|  | 431 | }, | 
|  | 432 | }; | 
|  | 433 |  | 
|  | 434 | static struct gpio_led_platform_data h1940_leds_pdata = { | 
|  | 435 | .num_leds	= ARRAY_SIZE(h1940_leds_desc), | 
|  | 436 | .leds		= h1940_leds_desc, | 
|  | 437 | .gpio_blink_set	= h1940_led_blink_set, | 
|  | 438 | }; | 
|  | 439 |  | 
| Ben Dooks | ff34aaa | 2009-09-28 12:45:47 +0900 | [diff] [blame] | 440 | static struct platform_device h1940_device_leds = { | 
| Vasily Khoruzhick | 50e2d10 | 2011-01-06 21:52:48 +0200 | [diff] [blame] | 441 | .name	= "leds-gpio", | 
|  | 442 | .id	= -1, | 
|  | 443 | .dev	= { | 
|  | 444 | .platform_data = &h1940_leds_pdata, | 
|  | 445 | }, | 
| Arnaud Patard | d2a7602 | 2007-02-13 00:50:34 +0100 | [diff] [blame] | 446 | }; | 
|  | 447 |  | 
| Ben Dooks | ff34aaa | 2009-09-28 12:45:47 +0900 | [diff] [blame] | 448 | static struct platform_device h1940_device_bluetooth = { | 
| Arnaud Patard | 7fdc784 | 2007-05-09 21:41:03 +0100 | [diff] [blame] | 449 | .name             = "h1940-bt", | 
|  | 450 | .id               = -1, | 
|  | 451 | }; | 
|  | 452 |  | 
| Vasily Khoruzhick | 48cd65a | 2010-09-27 00:27:41 +0300 | [diff] [blame] | 453 | static void h1940_set_mmc_power(unsigned char power_mode, unsigned short vdd) | 
|  | 454 | { | 
|  | 455 | switch (power_mode) { | 
|  | 456 | case MMC_POWER_OFF: | 
|  | 457 | gpio_set_value(H1940_LATCH_SD_POWER, 0); | 
|  | 458 | break; | 
|  | 459 | case MMC_POWER_UP: | 
|  | 460 | case MMC_POWER_ON: | 
|  | 461 | gpio_set_value(H1940_LATCH_SD_POWER, 1); | 
|  | 462 | break; | 
|  | 463 | default: | 
|  | 464 | break; | 
|  | 465 | }; | 
|  | 466 | } | 
|  | 467 |  | 
| Ben Dooks | 22c810a | 2010-01-18 16:24:22 +0900 | [diff] [blame] | 468 | static struct s3c24xx_mci_pdata h1940_mmc_cfg __initdata = { | 
| arnaud.patard@rtp-net.org | 3909b9f | 2009-11-17 14:54:56 +0100 | [diff] [blame] | 469 | .gpio_detect   = S3C2410_GPF(5), | 
|  | 470 | .gpio_wprotect = S3C2410_GPH(8), | 
| Vasily Khoruzhick | 48cd65a | 2010-09-27 00:27:41 +0300 | [diff] [blame] | 471 | .set_power     = h1940_set_mmc_power, | 
| arnaud.patard@rtp-net.org | 3909b9f | 2009-11-17 14:54:56 +0100 | [diff] [blame] | 472 | .ocr_avail     = MMC_VDD_32_33, | 
|  | 473 | }; | 
|  | 474 |  | 
| arnaud.patard@rtp-net.org | 22e649f | 2009-11-17 14:54:58 +0100 | [diff] [blame] | 475 | static int h1940_backlight_init(struct device *dev) | 
|  | 476 | { | 
|  | 477 | gpio_request(S3C2410_GPB(0), "Backlight"); | 
|  | 478 |  | 
| Ben Dooks | db61ac5 | 2010-05-04 11:40:51 +0900 | [diff] [blame] | 479 | gpio_direction_output(S3C2410_GPB(0), 0); | 
| Ben Dooks | fb37874 | 2010-05-06 11:03:50 +0900 | [diff] [blame] | 480 | s3c_gpio_setpull(S3C2410_GPB(0), S3C_GPIO_PULL_NONE); | 
| Ben Dooks | 40b956f | 2010-05-04 14:38:49 +0900 | [diff] [blame] | 481 | s3c_gpio_cfgpin(S3C2410_GPB(0), S3C2410_GPB0_TOUT0); | 
| Vasily Khoruzhick | 53193dd | 2010-09-27 09:28:00 +0300 | [diff] [blame] | 482 | gpio_set_value(H1940_LATCH_MAX1698_nSHUTDOWN, 1); | 
| arnaud.patard@rtp-net.org | 22e649f | 2009-11-17 14:54:58 +0100 | [diff] [blame] | 483 |  | 
|  | 484 | return 0; | 
|  | 485 | } | 
|  | 486 |  | 
| Vasily Khoruzhick | 53193dd | 2010-09-27 09:28:00 +0300 | [diff] [blame] | 487 | static int h1940_backlight_notify(struct device *dev, int brightness) | 
|  | 488 | { | 
|  | 489 | if (!brightness) { | 
|  | 490 | gpio_direction_output(S3C2410_GPB(0), 1); | 
|  | 491 | gpio_set_value(H1940_LATCH_MAX1698_nSHUTDOWN, 0); | 
|  | 492 | } else { | 
|  | 493 | gpio_direction_output(S3C2410_GPB(0), 0); | 
|  | 494 | s3c_gpio_setpull(S3C2410_GPB(0), S3C_GPIO_PULL_NONE); | 
|  | 495 | s3c_gpio_cfgpin(S3C2410_GPB(0), S3C2410_GPB0_TOUT0); | 
|  | 496 | gpio_set_value(H1940_LATCH_MAX1698_nSHUTDOWN, 1); | 
|  | 497 | } | 
|  | 498 | return brightness; | 
|  | 499 | } | 
|  | 500 |  | 
| arnaud.patard@rtp-net.org | 22e649f | 2009-11-17 14:54:58 +0100 | [diff] [blame] | 501 | static void h1940_backlight_exit(struct device *dev) | 
|  | 502 | { | 
| Ben Dooks | db61ac5 | 2010-05-04 11:40:51 +0900 | [diff] [blame] | 503 | gpio_direction_output(S3C2410_GPB(0), 1); | 
| Vasily Khoruzhick | 53193dd | 2010-09-27 09:28:00 +0300 | [diff] [blame] | 504 | gpio_set_value(H1940_LATCH_MAX1698_nSHUTDOWN, 0); | 
| arnaud.patard@rtp-net.org | 22e649f | 2009-11-17 14:54:58 +0100 | [diff] [blame] | 505 | } | 
|  | 506 |  | 
| Vasily Khoruzhick | 53193dd | 2010-09-27 09:28:00 +0300 | [diff] [blame] | 507 |  | 
| arnaud.patard@rtp-net.org | 22e649f | 2009-11-17 14:54:58 +0100 | [diff] [blame] | 508 | static struct platform_pwm_backlight_data backlight_data = { | 
|  | 509 | .pwm_id         = 0, | 
|  | 510 | .max_brightness = 100, | 
|  | 511 | .dft_brightness = 50, | 
|  | 512 | /* tcnt = 0x31 */ | 
|  | 513 | .pwm_period_ns  = 36296, | 
|  | 514 | .init           = h1940_backlight_init, | 
| Vasily Khoruzhick | 53193dd | 2010-09-27 09:28:00 +0300 | [diff] [blame] | 515 | .notify		= h1940_backlight_notify, | 
| arnaud.patard@rtp-net.org | 22e649f | 2009-11-17 14:54:58 +0100 | [diff] [blame] | 516 | .exit           = h1940_backlight_exit, | 
|  | 517 | }; | 
|  | 518 |  | 
|  | 519 | static struct platform_device h1940_backlight = { | 
|  | 520 | .name = "pwm-backlight", | 
|  | 521 | .dev  = { | 
|  | 522 | .parent = &s3c_device_timer[0].dev, | 
|  | 523 | .platform_data = &backlight_data, | 
|  | 524 | }, | 
|  | 525 | .id   = -1, | 
|  | 526 | }; | 
|  | 527 |  | 
|  | 528 | static void h1940_lcd_power_set(struct plat_lcd_data *pd, | 
|  | 529 | unsigned int power) | 
|  | 530 | { | 
| Vasily Khoruzhick | 25d391c | 2011-01-06 21:52:50 +0200 | [diff] [blame] | 531 | int value, retries = 100; | 
| arnaud.patard@rtp-net.org | 22e649f | 2009-11-17 14:54:58 +0100 | [diff] [blame] | 532 |  | 
|  | 533 | if (!power) { | 
| Vasily Khoruzhick | 53193dd | 2010-09-27 09:28:00 +0300 | [diff] [blame] | 534 | gpio_set_value(S3C2410_GPC(0), 0); | 
| arnaud.patard@rtp-net.org | 22e649f | 2009-11-17 14:54:58 +0100 | [diff] [blame] | 535 | /* wait for 3ac */ | 
|  | 536 | do { | 
| Ben Dooks | db61ac5 | 2010-05-04 11:40:51 +0900 | [diff] [blame] | 537 | value = gpio_get_value(S3C2410_GPC(6)); | 
| Vasily Khoruzhick | 25d391c | 2011-01-06 21:52:50 +0200 | [diff] [blame] | 538 | } while (value && retries--); | 
| Vasily Khoruzhick | 53193dd | 2010-09-27 09:28:00 +0300 | [diff] [blame] | 539 |  | 
|  | 540 | gpio_set_value(H1940_LATCH_LCD_P2, 0); | 
|  | 541 | gpio_set_value(H1940_LATCH_LCD_P3, 0); | 
|  | 542 | gpio_set_value(H1940_LATCH_LCD_P4, 0); | 
|  | 543 |  | 
|  | 544 | gpio_direction_output(S3C2410_GPC(1), 0); | 
|  | 545 | gpio_direction_output(S3C2410_GPC(4), 0); | 
|  | 546 |  | 
|  | 547 | gpio_set_value(H1940_LATCH_LCD_P1, 0); | 
|  | 548 | gpio_set_value(H1940_LATCH_LCD_P0, 0); | 
|  | 549 |  | 
|  | 550 | gpio_set_value(S3C2410_GPC(5), 0); | 
|  | 551 |  | 
| arnaud.patard@rtp-net.org | 22e649f | 2009-11-17 14:54:58 +0100 | [diff] [blame] | 552 | } else { | 
| Vasily Khoruzhick | 53193dd | 2010-09-27 09:28:00 +0300 | [diff] [blame] | 553 | gpio_set_value(H1940_LATCH_LCD_P0, 1); | 
|  | 554 | gpio_set_value(H1940_LATCH_LCD_P1, 1); | 
|  | 555 |  | 
| Vasily Khoruzhick | 25d391c | 2011-01-06 21:52:50 +0200 | [diff] [blame] | 556 | gpio_direction_input(S3C2410_GPC(1)); | 
|  | 557 | gpio_direction_input(S3C2410_GPC(4)); | 
|  | 558 | mdelay(10); | 
| Vasily Khoruzhick | 53193dd | 2010-09-27 09:28:00 +0300 | [diff] [blame] | 559 | s3c_gpio_cfgpin(S3C2410_GPC(1), S3C_GPIO_SFN(2)); | 
|  | 560 | s3c_gpio_cfgpin(S3C2410_GPC(4), S3C_GPIO_SFN(2)); | 
|  | 561 |  | 
|  | 562 | gpio_set_value(S3C2410_GPC(5), 1); | 
|  | 563 | gpio_set_value(S3C2410_GPC(0), 1); | 
|  | 564 |  | 
|  | 565 | gpio_set_value(H1940_LATCH_LCD_P3, 1); | 
|  | 566 | gpio_set_value(H1940_LATCH_LCD_P2, 1); | 
|  | 567 | gpio_set_value(H1940_LATCH_LCD_P4, 1); | 
| arnaud.patard@rtp-net.org | 22e649f | 2009-11-17 14:54:58 +0100 | [diff] [blame] | 568 | } | 
|  | 569 | } | 
|  | 570 |  | 
|  | 571 | static struct plat_lcd_data h1940_lcd_power_data = { | 
|  | 572 | .set_power      = h1940_lcd_power_set, | 
|  | 573 | }; | 
|  | 574 |  | 
|  | 575 | static struct platform_device h1940_lcd_powerdev = { | 
|  | 576 | .name                   = "platform-lcd", | 
|  | 577 | .dev.parent             = &s3c_device_lcd.dev, | 
|  | 578 | .dev.platform_data      = &h1940_lcd_power_data, | 
|  | 579 | }; | 
|  | 580 |  | 
| Vasily Khoruzhick | 68730b4 | 2010-09-27 09:32:49 +0300 | [diff] [blame] | 581 | static struct uda1380_platform_data uda1380_info = { | 
|  | 582 | .gpio_power	= H1940_LATCH_UDA_POWER, | 
|  | 583 | .gpio_reset	= S3C2410_GPA(12), | 
|  | 584 | .dac_clk	= UDA1380_DAC_CLK_SYSCLK, | 
|  | 585 | }; | 
|  | 586 |  | 
|  | 587 | static struct i2c_board_info h1940_i2c_devices[] = { | 
|  | 588 | { | 
|  | 589 | I2C_BOARD_INFO("uda1380", 0x1a), | 
|  | 590 | .platform_data = &uda1380_info, | 
|  | 591 | }, | 
|  | 592 | }; | 
|  | 593 |  | 
| Arnaud Patard (Rtp) | bbb1c83 | 2011-01-06 21:52:46 +0200 | [diff] [blame] | 594 | #define DECLARE_BUTTON(p, k, n, w)	\ | 
|  | 595 | {				\ | 
|  | 596 | .gpio		= p,	\ | 
|  | 597 | .code		= k,	\ | 
|  | 598 | .desc		= n,	\ | 
|  | 599 | .wakeup		= w,	\ | 
|  | 600 | .active_low	= 1,	\ | 
|  | 601 | } | 
|  | 602 |  | 
|  | 603 | static struct gpio_keys_button h1940_buttons[] = { | 
|  | 604 | DECLARE_BUTTON(S3C2410_GPF(0),       KEY_POWER,          "Power", 1), | 
|  | 605 | DECLARE_BUTTON(S3C2410_GPF(6),       KEY_ENTER,         "Select", 1), | 
|  | 606 | DECLARE_BUTTON(S3C2410_GPF(7),      KEY_RECORD,         "Record", 0), | 
|  | 607 | DECLARE_BUTTON(S3C2410_GPG(0),         KEY_F11,       "Calendar", 0), | 
|  | 608 | DECLARE_BUTTON(S3C2410_GPG(2),         KEY_F12,       "Contacts", 0), | 
|  | 609 | DECLARE_BUTTON(S3C2410_GPG(3),        KEY_MAIL,           "Mail", 0), | 
|  | 610 | DECLARE_BUTTON(S3C2410_GPG(6),        KEY_LEFT,     "Left_arrow", 0), | 
|  | 611 | DECLARE_BUTTON(S3C2410_GPG(7),    KEY_HOMEPAGE,           "Home", 0), | 
|  | 612 | DECLARE_BUTTON(S3C2410_GPG(8),       KEY_RIGHT,    "Right_arrow", 0), | 
|  | 613 | DECLARE_BUTTON(S3C2410_GPG(9),          KEY_UP,       "Up_arrow", 0), | 
|  | 614 | DECLARE_BUTTON(S3C2410_GPG(10),       KEY_DOWN,     "Down_arrow", 0), | 
|  | 615 | }; | 
|  | 616 |  | 
|  | 617 | static struct gpio_keys_platform_data h1940_buttons_data = { | 
|  | 618 | .buttons	= h1940_buttons, | 
|  | 619 | .nbuttons	= ARRAY_SIZE(h1940_buttons), | 
|  | 620 | }; | 
|  | 621 |  | 
|  | 622 | static struct platform_device h1940_dev_buttons = { | 
|  | 623 | .name		= "gpio-keys", | 
|  | 624 | .id		= -1, | 
|  | 625 | .dev		= { | 
|  | 626 | .platform_data  = &h1940_buttons_data, | 
|  | 627 | } | 
|  | 628 | }; | 
|  | 629 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 630 | static struct platform_device *h1940_devices[] __initdata = { | 
| Arnaud Patard (Rtp) | bbb1c83 | 2011-01-06 21:52:46 +0200 | [diff] [blame] | 631 | &h1940_dev_buttons, | 
| Ben Dooks | b813248 | 2009-11-23 00:13:39 +0000 | [diff] [blame] | 632 | &s3c_device_ohci, | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 633 | &s3c_device_lcd, | 
|  | 634 | &s3c_device_wdt, | 
| Ben Dooks | 3e1b776 | 2008-10-31 16:14:40 +0000 | [diff] [blame] | 635 | &s3c_device_i2c0, | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 636 | &s3c_device_iis, | 
| Jassi Brar | 83e37b8 | 2010-11-22 15:35:53 +0900 | [diff] [blame] | 637 | &samsung_asoc_dma, | 
| Arnaud Patard | 71a9c42 | 2007-02-13 00:21:26 +0100 | [diff] [blame] | 638 | &s3c_device_usbgadget, | 
| Ben Dooks | ff34aaa | 2009-09-28 12:45:47 +0900 | [diff] [blame] | 639 | &h1940_device_leds, | 
|  | 640 | &h1940_device_bluetooth, | 
| arnaud.patard@rtp-net.org | 3909b9f | 2009-11-17 14:54:56 +0100 | [diff] [blame] | 641 | &s3c_device_sdi, | 
| arnaud.patard@rtp-net.org | 13733d5 | 2009-11-17 14:54:57 +0100 | [diff] [blame] | 642 | &s3c_device_rtc, | 
| arnaud.patard@rtp-net.org | 22e649f | 2009-11-17 14:54:58 +0100 | [diff] [blame] | 643 | &s3c_device_timer[0], | 
|  | 644 | &h1940_backlight, | 
|  | 645 | &h1940_lcd_powerdev, | 
| Arnaud Patard | 17dcd13 | 2010-04-22 10:47:43 +0200 | [diff] [blame] | 646 | &s3c_device_adc, | 
|  | 647 | &s3c_device_ts, | 
| Vasily Khoruzhick | a8e9985 | 2011-01-06 21:52:49 +0200 | [diff] [blame] | 648 | &power_supply, | 
|  | 649 | &h1940_battery, | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 650 | }; | 
|  | 651 |  | 
| Ben Dooks | 5fe10ab | 2005-09-20 17:24:33 +0100 | [diff] [blame] | 652 | static void __init h1940_map_io(void) | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 653 | { | 
|  | 654 | s3c24xx_init_io(h1940_iodesc, ARRAY_SIZE(h1940_iodesc)); | 
|  | 655 | s3c24xx_init_clocks(0); | 
|  | 656 | s3c24xx_init_uarts(h1940_uartcfgs, ARRAY_SIZE(h1940_uartcfgs)); | 
| Ben Dooks | 9073341 | 2006-12-06 01:50:24 +0100 | [diff] [blame] | 657 |  | 
|  | 658 | /* setup PM */ | 
|  | 659 |  | 
| Krzysztof Helt | b1dfe1f | 2007-03-19 15:10:20 +0100 | [diff] [blame] | 660 | #ifdef CONFIG_PM_H1940 | 
| Ben Dooks | 9073341 | 2006-12-06 01:50:24 +0100 | [diff] [blame] | 661 | memcpy(phys_to_virt(H1940_SUSPEND_RESUMEAT), h1940_pm_return, 1024); | 
| Krzysztof Helt | b1dfe1f | 2007-03-19 15:10:20 +0100 | [diff] [blame] | 662 | #endif | 
| Ben Dooks | 4e59c25 | 2008-12-12 00:24:18 +0000 | [diff] [blame] | 663 | s3c_pm_init(); | 
| Vasily Khoruzhick | 1447709 | 2010-09-08 12:39:46 +0300 | [diff] [blame] | 664 |  | 
| Vasily Khoruzhick | 53193dd | 2010-09-27 09:28:00 +0300 | [diff] [blame] | 665 | /* Add latch gpio chip, set latch initial value */ | 
|  | 666 | h1940_latch_control(0, 0); | 
| Vasily Khoruzhick | 1447709 | 2010-09-08 12:39:46 +0300 | [diff] [blame] | 667 | WARN_ON(gpiochip_add(&h1940_latch_gpiochip)); | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 668 | } | 
|  | 669 |  | 
| Russell King | 98c672c | 2010-05-22 18:18:57 +0100 | [diff] [blame] | 670 | /* H1940 and RX3715 need to reserve this for suspend */ | 
|  | 671 | static void __init h1940_reserve(void) | 
|  | 672 | { | 
| Russell King | 8d717a5 | 2010-05-22 19:47:18 +0100 | [diff] [blame] | 673 | memblock_reserve(0x30003000, 0x1000); | 
|  | 674 | memblock_reserve(0x30081000, 0x1000); | 
| Russell King | 98c672c | 2010-05-22 18:18:57 +0100 | [diff] [blame] | 675 | } | 
|  | 676 |  | 
| Ben Dooks | 5fe10ab | 2005-09-20 17:24:33 +0100 | [diff] [blame] | 677 | static void __init h1940_init_irq(void) | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 678 | { | 
|  | 679 | s3c24xx_init_irq(); | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 680 | } | 
|  | 681 |  | 
| Ben Dooks | 5fe10ab | 2005-09-20 17:24:33 +0100 | [diff] [blame] | 682 | static void __init h1940_init(void) | 
| Arnaud Patard | f92273c | 2005-09-09 13:10:10 -0700 | [diff] [blame] | 683 | { | 
| Arnaud Patard | 71a9c42 | 2007-02-13 00:21:26 +0100 | [diff] [blame] | 684 | u32 tmp; | 
|  | 685 |  | 
| Krzysztof Helt | 09fe75f | 2007-10-16 01:28:56 -0700 | [diff] [blame] | 686 | s3c24xx_fb_set_platdata(&h1940_fb_info); | 
| Ben Dooks | 22c810a | 2010-01-18 16:24:22 +0900 | [diff] [blame] | 687 | s3c24xx_mci_set_platdata(&h1940_mmc_cfg); | 
| Arnaud Patard | 71a9c42 | 2007-02-13 00:21:26 +0100 | [diff] [blame] | 688 | s3c24xx_udc_set_platdata(&h1940_udc_cfg); | 
| Arnaud Patard | ce8877b | 2009-12-23 19:25:05 +0000 | [diff] [blame] | 689 | s3c24xx_ts_set_platdata(&h1940_ts_cfg); | 
| Ben Dooks | 3e1b776 | 2008-10-31 16:14:40 +0000 | [diff] [blame] | 690 | s3c_i2c0_set_platdata(NULL); | 
| Arnaud Patard | 71a9c42 | 2007-02-13 00:21:26 +0100 | [diff] [blame] | 691 |  | 
|  | 692 | /* Turn off suspend on both USB ports, and switch the | 
|  | 693 | * selectable USB port to USB device mode. */ | 
|  | 694 |  | 
|  | 695 | s3c2410_modify_misccr(S3C2410_MISCCR_USBHOST | | 
|  | 696 | S3C2410_MISCCR_USBSUSPND0 | | 
|  | 697 | S3C2410_MISCCR_USBSUSPND1, 0x0); | 
|  | 698 |  | 
| Ben Dooks | e24b864 | 2008-10-21 14:06:34 +0100 | [diff] [blame] | 699 | tmp =   (0x78 << S3C24XX_PLLCON_MDIVSHIFT) | 
|  | 700 | | (0x02 << S3C24XX_PLLCON_PDIVSHIFT) | 
|  | 701 | | (0x03 << S3C24XX_PLLCON_SDIVSHIFT); | 
| Arnaud Patard | 71a9c42 | 2007-02-13 00:21:26 +0100 | [diff] [blame] | 702 | writel(tmp, S3C2410_UPLLCON); | 
| Ben Dooks | 57e5171 | 2007-04-20 11:19:16 +0100 | [diff] [blame] | 703 |  | 
| arnaud.patard@rtp-net.org | 22e649f | 2009-11-17 14:54:58 +0100 | [diff] [blame] | 704 | gpio_request(S3C2410_GPC(0), "LCD power"); | 
| Vasily Khoruzhick | 53193dd | 2010-09-27 09:28:00 +0300 | [diff] [blame] | 705 | gpio_request(S3C2410_GPC(1), "LCD power"); | 
|  | 706 | gpio_request(S3C2410_GPC(4), "LCD power"); | 
| arnaud.patard@rtp-net.org | 22e649f | 2009-11-17 14:54:58 +0100 | [diff] [blame] | 707 | gpio_request(S3C2410_GPC(5), "LCD power"); | 
|  | 708 | gpio_request(S3C2410_GPC(6), "LCD power"); | 
| Vasily Khoruzhick | 53193dd | 2010-09-27 09:28:00 +0300 | [diff] [blame] | 709 | gpio_request(H1940_LATCH_LCD_P0, "LCD power"); | 
|  | 710 | gpio_request(H1940_LATCH_LCD_P1, "LCD power"); | 
|  | 711 | gpio_request(H1940_LATCH_LCD_P2, "LCD power"); | 
|  | 712 | gpio_request(H1940_LATCH_LCD_P3, "LCD power"); | 
|  | 713 | gpio_request(H1940_LATCH_LCD_P4, "LCD power"); | 
|  | 714 | gpio_request(H1940_LATCH_MAX1698_nSHUTDOWN, "LCD power"); | 
|  | 715 | gpio_direction_output(S3C2410_GPC(0), 0); | 
|  | 716 | gpio_direction_output(S3C2410_GPC(1), 0); | 
|  | 717 | gpio_direction_output(S3C2410_GPC(4), 0); | 
|  | 718 | gpio_direction_output(S3C2410_GPC(5), 0); | 
| Ben Dooks | db61ac5 | 2010-05-04 11:40:51 +0900 | [diff] [blame] | 719 | gpio_direction_input(S3C2410_GPC(6)); | 
| Vasily Khoruzhick | 53193dd | 2010-09-27 09:28:00 +0300 | [diff] [blame] | 720 | gpio_direction_output(H1940_LATCH_LCD_P0, 0); | 
|  | 721 | gpio_direction_output(H1940_LATCH_LCD_P1, 0); | 
|  | 722 | gpio_direction_output(H1940_LATCH_LCD_P2, 0); | 
|  | 723 | gpio_direction_output(H1940_LATCH_LCD_P3, 0); | 
|  | 724 | gpio_direction_output(H1940_LATCH_LCD_P4, 0); | 
|  | 725 | gpio_direction_output(H1940_LATCH_MAX1698_nSHUTDOWN, 0); | 
| arnaud.patard@rtp-net.org | 22e649f | 2009-11-17 14:54:58 +0100 | [diff] [blame] | 726 |  | 
| Vasily Khoruzhick | 48cd65a | 2010-09-27 00:27:41 +0300 | [diff] [blame] | 727 | gpio_request(H1940_LATCH_SD_POWER, "SD power"); | 
|  | 728 | gpio_direction_output(H1940_LATCH_SD_POWER, 0); | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 729 |  | 
|  | 730 | platform_add_devices(h1940_devices, ARRAY_SIZE(h1940_devices)); | 
| Vasily Khoruzhick | 68730b4 | 2010-09-27 09:32:49 +0300 | [diff] [blame] | 731 |  | 
| Vasily Khoruzhick | 50e2d10 | 2011-01-06 21:52:48 +0200 | [diff] [blame] | 732 | gpio_request(S3C2410_GPA(1), "Red LED blink"); | 
|  | 733 | gpio_request(S3C2410_GPA(3), "Blue LED blink"); | 
|  | 734 | gpio_request(S3C2410_GPA(7), "Green LED blink"); | 
|  | 735 | gpio_request(H1940_LATCH_LED_FLASH, "LED blink"); | 
|  | 736 | gpio_direction_output(S3C2410_GPA(1), 0); | 
|  | 737 | gpio_direction_output(S3C2410_GPA(3), 0); | 
|  | 738 | gpio_direction_output(S3C2410_GPA(7), 0); | 
|  | 739 | gpio_direction_output(H1940_LATCH_LED_FLASH, 0); | 
|  | 740 |  | 
| Vasily Khoruzhick | 68730b4 | 2010-09-27 09:32:49 +0300 | [diff] [blame] | 741 | i2c_register_board_info(0, h1940_i2c_devices, | 
|  | 742 | ARRAY_SIZE(h1940_i2c_devices)); | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 743 | } | 
|  | 744 |  | 
|  | 745 | MACHINE_START(H1940, "IPAQ-H1940") | 
| Ben Dooks | afdd225 | 2010-05-07 09:24:05 +0900 | [diff] [blame] | 746 | /* Maintainer: Ben Dooks <ben-linux@fluff.org> */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 747 | .boot_params	= S3C2410_SDRAM_PA + 0x100, | 
|  | 748 | .map_io		= h1940_map_io, | 
| Russell King | 98c672c | 2010-05-22 18:18:57 +0100 | [diff] [blame] | 749 | .reserve	= h1940_reserve, | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 750 | .init_irq	= h1940_init_irq, | 
|  | 751 | .init_machine	= h1940_init, | 
|  | 752 | .timer		= &s3c24xx_timer, | 
|  | 753 | MACHINE_END |