diff options
Diffstat (limited to 'linux/3.1.6')
14 files changed, 1367 insertions, 0 deletions
| diff --git a/linux/3.1.6/0001-n35-fix-key-codes.patch b/linux/3.1.6/0001-n35-fix-key-codes.patch new file mode 100644 index 0000000..25cc732 --- /dev/null +++ b/linux/3.1.6/0001-n35-fix-key-codes.patch @@ -0,0 +1,42 @@ +From 3c43052284796659aeda8ae262d27525e7cdf948 Mon Sep 17 00:00:00 2001 +From: Jiri Pinkava <jiri.pinkava@vscht.cz> +Date: Wed, 23 Jun 2010 20:33:53 +0200 +Subject: [PATCH 01/14] n35: fix key codes + + +Signed-off-by: Jiri Pinkava <jiri.pinkava@vscht.cz> +--- + arch/arm/mach-s3c2410/mach-n30.c |    5 ++--- + 1 files changed, 2 insertions(+), 3 deletions(-) + +diff --git a/arch/arm/mach-s3c2410/mach-n30.c b/arch/arm/mach-s3c2410/mach-n30.c +index 41f299d..e732619 100644 +--- a/arch/arm/mach-s3c2410/mach-n30.c ++++ b/arch/arm/mach-s3c2410/mach-n30.c +@@ -174,7 +174,6 @@ static struct gpio_keys_button n35_buttons[] = { + 	{ + 		.gpio		= S3C2410_GPF(0), + 		.code		= KEY_POWER, +-		.type		= EV_PWR, + 		.desc		= "Power", + 		.active_low	= 0, + 		.wakeup		= 1, +@@ -193,13 +192,13 @@ static struct gpio_keys_button n35_buttons[] = { + 	}, + 	{ + 		.gpio		= S3C2410_GPG(6), +-		.code		= KEY_DOWN, ++		.code		= KEY_LEFT, + 		.desc		= "Joystick Left", + 		.active_low	= 0, + 	}, + 	{ + 		.gpio		= S3C2410_GPG(5), +-		.code		= KEY_DOWN, ++		.code		= KEY_RIGHT, + 		.desc		= "Joystick Right", + 		.active_low	= 0, + 	}, +--  +1.7.3.1 + diff --git a/linux/3.1.6/0002-n35-Update-GPIO-documentation-for-Acer-n35.patch b/linux/3.1.6/0002-n35-Update-GPIO-documentation-for-Acer-n35.patch new file mode 100644 index 0000000..2d2fdb6 --- /dev/null +++ b/linux/3.1.6/0002-n35-Update-GPIO-documentation-for-Acer-n35.patch @@ -0,0 +1,36 @@ +From d09acdd4292db1c10fb63f2f7247dd7ac800ead6 Mon Sep 17 00:00:00 2001 +From: Jiri Pinkava <jiri.pinkava@vscht.cz> +Date: Sat, 29 May 2010 17:11:10 +0200 +Subject: [PATCH 02/14] n35: Update GPIO documentation for Acer n35 + +Signed-off-by: Jiri Pinkava <jiri.pinkava@vscht.cz> +--- + arch/arm/mach-s3c2410/mach-n30.c |   12 +++++------- + 1 files changed, 5 insertions(+), 7 deletions(-) + +diff --git a/arch/arm/mach-s3c2410/mach-n30.c b/arch/arm/mach-s3c2410/mach-n30.c +index e732619..abbb9b5 100644 +--- a/arch/arm/mach-s3c2410/mach-n30.c ++++ b/arch/arm/mach-s3c2410/mach-n30.c +@@ -410,13 +410,11 @@ static struct s3c2410_platform_i2c __initdata n30_i2ccfg = { + static void __init n30_hwinit(void) + { + 	/* GPA0-11 special functions -- unknown what they do +-	 * GPA12 N30 special function -- unknown what it does +-	 *       N35/PiN output -- unknown what it does +-	 * +-	 * A12 is nGCS1 on the N30 and an output on the N35/PiN.  I +-	 * don't think it does anything useful on the N30, so I ought +-	 * to make it an output there too since it always driven to 0 +-	 * as far as I can tell. */ ++	 * GPA12 N30 special function (nGCS1) -- unknown what it does ++	 *       PiN output -- unknown function ++	 *       N35 output -- turn on/off red led, 0 = normal operation, ++	 *       1 = turn off red led at all. Note: GPD9 must be input or ++	 *       output with value set to 1 before setting GPA12 to 0. */ + 	if (machine_is_n30()) + 		__raw_writel(0x007fffff, S3C2410_GPACON); + 	if (machine_is_n35()) +--  +1.7.3.1 + diff --git a/linux/3.1.6/0003-n30-Clean-up-UARTs-configuration-replace-numeric-con.patch b/linux/3.1.6/0003-n30-Clean-up-UARTs-configuration-replace-numeric-con.patch new file mode 100644 index 0000000..ef66723 --- /dev/null +++ b/linux/3.1.6/0003-n30-Clean-up-UARTs-configuration-replace-numeric-con.patch @@ -0,0 +1,84 @@ +From 01eb4ac8cc0ca178786d01bd696dc2092716e466 Mon Sep 17 00:00:00 2001 +From: Jiri Pinkava <jiri.pinkava@vscht.cz> +Date: Mon, 24 May 2010 10:29:46 +0200 +Subject: [PATCH 03/14] n30: Clean up UARTs configuration (replace numeric constants) + +Signed-off-by: Jiri Pinkava <jiri.pinkava@vscht.cz> +--- + arch/arm/mach-s3c2410/mach-n30.c                 |   28 +++++++++++++++------- + arch/arm/plat-samsung/include/plat/regs-serial.h |    3 ++ + 2 files changed, 22 insertions(+), 9 deletions(-) + +diff --git a/arch/arm/mach-s3c2410/mach-n30.c b/arch/arm/mach-s3c2410/mach-n30.c +index abbb9b5..895e1e9a 100644 +--- a/arch/arm/mach-s3c2410/mach-n30.c ++++ b/arch/arm/mach-s3c2410/mach-n30.c +@@ -55,32 +55,42 @@ static struct map_desc n30_iodesc[] __initdata = { + 	/* nothing here yet */ + }; +  ++#define UCON	(S3C2410_UCON_DEFAULT | \ ++		 S3C2443_UCON_RXERR_IRQEN) ++ ++#define ULCON	(S3C2410_LCON_CS8 | \ ++		 S3C2410_LCON_PNONE) ++ ++#define UFCON	(S3C2410_UFCON_FIFOMODE | \ ++		 S3C2410_UFCON_RXTRIG8 | \ ++		 S3C2410_UFCON_TXTRIG4) ++ + static struct s3c2410_uartcfg n30_uartcfgs[] = { + 	/* Normal serial port */ + 	[0] = { + 		.hwport	     = 0, + 		.flags	     = 0, +-		.ucon	     = 0x2c5, +-		.ulcon	     = 0x03, +-		.ufcon	     = 0x51, ++		.ucon	     = UCON, ++		.ulcon	     = ULCON, ++		.ufcon	     = UFCON, + 	}, + 	/* IR port */ + 	[1] = { + 		.hwport	     = 1, + 		.flags	     = 0, + 		.uart_flags  = UPF_CONS_FLOW, +-		.ucon	     = 0x2c5, +-		.ulcon	     = 0x43, +-		.ufcon	     = 0x51, ++		.ucon	     = UCON, ++		.ulcon	     = ULCON | S3C2410_LCON_IRM, ++		.ufcon	     = UFCON, + 	}, + 	/* On the N30 the bluetooth controller is connected here. + 	 * On the N35 and variants the GPS receiver is connected here. */ + 	[2] = { + 		.hwport	     = 2, + 		.flags	     = 0, +-		.ucon	     = 0x2c5, +-		.ulcon	     = 0x03, +-		.ufcon	     = 0x51, ++		.ucon	     = UCON, ++		.ulcon	     = ULCON, ++		.ufcon	     = UFCON, + 	}, + }; +  +diff --git a/arch/arm/plat-samsung/include/plat/regs-serial.h b/arch/arm/plat-samsung/include/plat/regs-serial.h +index 788837e..c64beca 100644 +--- a/arch/arm/plat-samsung/include/plat/regs-serial.h ++++ b/arch/arm/plat-samsung/include/plat/regs-serial.h +@@ -114,6 +114,9 @@ +  + #define S3C2410_UFCON_FIFOMODE	  (1<<0) + #define S3C2410_UFCON_TXTRIG0	  (0<<6) ++#define S3C2410_UFCON_TXTRIG4	  (1<<6) ++#define S3C2410_UFCON_TXTRIG8	  (2<<6) ++#define S3C2410_UFCON_TXTRIG12	  (3<<6) + #define S3C2410_UFCON_RXTRIG8	  (1<<4) + #define S3C2410_UFCON_RXTRIG12	  (2<<4) +  +--  +1.7.3.1 + diff --git a/linux/3.1.6/0004-n30-Fix-MMC-power-management-on-Acer-n30-n35.patch b/linux/3.1.6/0004-n30-Fix-MMC-power-management-on-Acer-n30-n35.patch new file mode 100644 index 0000000..e8b94e0 --- /dev/null +++ b/linux/3.1.6/0004-n30-Fix-MMC-power-management-on-Acer-n30-n35.patch @@ -0,0 +1,31 @@ +From 157e2a1dbbcb9a7144ad9d776db45a15769406f9 Mon Sep 17 00:00:00 2001 +From: Jiri Pinkava <jiri.pinkava@vscht.cz> +Date: Mon, 24 May 2010 10:04:57 +0200 +Subject: [PATCH 04/14] n30: Fix MMC power management on Acer n30 / n35 + +Signed-off-by: Jiri Pinkava <jiri.pinkava@vscht.cz> +--- + arch/arm/mach-s3c2410/mach-n30.c |    4 ++-- + 1 files changed, 2 insertions(+), 2 deletions(-) + +diff --git a/arch/arm/mach-s3c2410/mach-n30.c b/arch/arm/mach-s3c2410/mach-n30.c +index 895e1e9a..ecc039a 100644 +--- a/arch/arm/mach-s3c2410/mach-n30.c ++++ b/arch/arm/mach-s3c2410/mach-n30.c +@@ -366,11 +366,11 @@ static void n30_sdi_set_power(unsigned char power_mode, unsigned short vdd) + 	switch (power_mode) { + 	case MMC_POWER_ON: + 	case MMC_POWER_UP: +-		gpio_set_value(S3C2410_GPG(4), 1); ++		gpio_set_value(S3C2410_GPG(4), 0); + 		break; + 	case MMC_POWER_OFF: + 	default: +-		gpio_set_value(S3C2410_GPG(4), 0); ++		gpio_set_value(S3C2410_GPG(4), 1); + 		break; + 	} + } +--  +1.7.3.1 + diff --git a/linux/3.1.6/0005-n30-Add-touchscreen-support-for-Acer-n30-n35.patch b/linux/3.1.6/0005-n30-Add-touchscreen-support-for-Acer-n30-n35.patch new file mode 100644 index 0000000..27b4470 --- /dev/null +++ b/linux/3.1.6/0005-n30-Add-touchscreen-support-for-Acer-n30-n35.patch @@ -0,0 +1,78 @@ +From 1a03b4d877299c1cef4b2ef2228da6a067986095 Mon Sep 17 00:00:00 2001 +From: Jiri Pinkava <jiri.pinkava@vscht.cz> +Date: Thu, 27 May 2010 15:47:40 +0200 +Subject: [PATCH 05/14] n30: Add touchscreen support for Acer n30 / n35 + +Signed-off-by: Jiri Pinkava <jiri.pinkava@vscht.cz> +--- + arch/arm/mach-s3c2410/Kconfig    |    1 + + arch/arm/mach-s3c2410/mach-n30.c |   13 +++++++++++++ + 2 files changed, 14 insertions(+), 0 deletions(-) + +diff --git a/arch/arm/mach-s3c2410/Kconfig b/arch/arm/mach-s3c2410/Kconfig +index 7245a55..1d55349 100644 +--- a/arch/arm/mach-s3c2410/Kconfig ++++ b/arch/arm/mach-s3c2410/Kconfig +@@ -100,6 +100,7 @@ config MACH_N30 + 	select MACH_N35 + 	select S3C_DEV_USB_HOST + 	select S3C_DEV_NAND ++	select S3C2410_SETUP_TS + 	help + 	  Say Y here if you want suppt for the Acer N30, Acer N35, + 	  Navman PiN570, Yakumo AlphaX or Airis NC05 PDAs. +diff --git a/arch/arm/mach-s3c2410/mach-n30.c b/arch/arm/mach-s3c2410/mach-n30.c +index ecc039a..be5235d 100644 +--- a/arch/arm/mach-s3c2410/mach-n30.c ++++ b/arch/arm/mach-s3c2410/mach-n30.c +@@ -49,6 +49,7 @@ + #include <plat/devs.h> + #include <plat/mci.h> + #include <plat/s3c2410.h> ++#include <plat/ts.h> + #include <plat/udc.h> +  + static struct map_desc n30_iodesc[] __initdata = { +@@ -116,6 +117,13 @@ static struct s3c2410_udc_mach_info n30_udc_cfg __initdata = { + 	.vbus_pin_inverted	= 0, + }; +  ++static struct s3c2410_ts_mach_info n30_ts_cfg __initdata = { ++	.delay = 16383, ++	.presc = 49, ++	.oversampling_shift = 3, ++	.cfg_gpio = s3c24xx_ts_cfg_gpio, ++}; ++ + static struct gpio_keys_button n30_buttons[] = { + 	{ + 		.gpio		= S3C2410_GPF(0), +@@ -391,6 +399,8 @@ static struct platform_device *n30_devices[] __initdata = { + 	&s3c_device_rtc, + 	&s3c_device_usbgadget, + 	&s3c_device_sdi, ++	&s3c_device_adc, ++	&s3c_device_ts, + 	&n30_button_device, + 	&n30_blue_led, + 	&n30_warning_led, +@@ -404,6 +414,8 @@ static struct platform_device *n35_devices[] __initdata = { + 	&s3c_device_rtc, + 	&s3c_device_usbgadget, + 	&s3c_device_sdi, ++	&s3c_device_adc, ++	&s3c_device_ts, + 	&n35_button_device, + 	&n35_blue_led, + 	&n35_warning_led, +@@ -566,6 +578,7 @@ static void __init n30_init(void) + 	WARN_ON(gpio_request(S3C2410_GPG(4), "mmc power")); +  + 	s3c24xx_fb_set_platdata(&n30_fb_info); ++	s3c24xx_ts_set_platdata(&n30_ts_cfg); + 	s3c24xx_udc_set_platdata(&n30_udc_cfg); + 	s3c24xx_mci_set_platdata(&n30_mci_cfg); + 	s3c_i2c0_set_platdata(&n30_i2ccfg); +--  +1.7.3.1 + diff --git a/linux/3.1.6/0006-n35-Add-LCD-backlight-regulation-on-Acer-n35.patch b/linux/3.1.6/0006-n35-Add-LCD-backlight-regulation-on-Acer-n35.patch new file mode 100644 index 0000000..21169d8 --- /dev/null +++ b/linux/3.1.6/0006-n35-Add-LCD-backlight-regulation-on-Acer-n35.patch @@ -0,0 +1,109 @@ +From d31ea8b61f04341c8ea4b19105ca5772e655518f Mon Sep 17 00:00:00 2001 +From: Jiri Pinkava <jiri.pinkava@vscht.cz> +Date: Mon, 24 May 2010 10:38:19 +0200 +Subject: [PATCH 06/14] n35: Add LCD backlight regulation on Acer n35 + +Signed-off-by: Jiri Pinkava <jiri.pinkava@vscht.cz> +--- + arch/arm/mach-s3c2410/mach-n30.c |   71 ++++++++++++++++++++++++++++++++++++++ + 1 files changed, 71 insertions(+), 0 deletions(-) + +diff --git a/arch/arm/mach-s3c2410/mach-n30.c b/arch/arm/mach-s3c2410/mach-n30.c +index be5235d..4199143 100644 +--- a/arch/arm/mach-s3c2410/mach-n30.c ++++ b/arch/arm/mach-s3c2410/mach-n30.c +@@ -23,6 +23,7 @@ + #include <linux/input.h> + #include <linux/interrupt.h> + #include <linux/platform_device.h> ++#include <linux/pwm_backlight.h> + #include <linux/serial_core.h> + #include <linux/timer.h> + #include <linux/io.h> +@@ -369,6 +370,74 @@ static struct s3c2410fb_mach_info n30_fb_info __initdata = { + 	.lpcsel		= 0x06, + }; +  ++static int n35_backlight_init(struct device *dev) ++{ ++	int ret; ++ ++	ret = gpio_request(S3C2410_GPB(0), "Backlight PWM output"); ++	if (ret) ++		goto request_gpb0_fail; ++	ret = gpio_request(S3C2410_GPB(1), "Backlight power"); ++	if (ret) ++		goto request_gpb1_fail; ++ ++	/* set GPB0 as output of PWM timer */ ++	gpio_set_value(S3C2410_GPB(0), 0); ++	s3c_gpio_setpull(S3C2410_GPB(0), S3C_GPIO_PULL_DOWN); ++	s3c_gpio_cfgpin(S3C2410_GPB(0), S3C2410_GPB0_TOUT0); ++ ++	/* backlight power */ ++	ret = gpio_direction_output(S3C2410_GPB(1), 1); ++	if (ret) ++		goto direction_gpb1_fail; ++	s3c_gpio_setpull(S3C2410_GPB(1), S3C_GPIO_PULL_UP); ++ ++	return 0; ++ ++direction_gpb1_fail: ++	gpio_free(S3C2410_GPB(1)); ++request_gpb1_fail: ++	gpio_free(S3C2410_GPB(0)); ++request_gpb0_fail: ++	return ret; ++} ++ ++static int n35_backlight_notify(struct device *dev, int brightness) ++{ ++	/* power off backlight, values less than 14 are useless */ ++	gpio_set_value(S3C2410_GPB(1), brightness > 14 ? 1 : 0); ++	return (brightness > 14 ? brightness : 0); ++} ++ ++static void n35_backlight_exit(struct device *dev) ++{ ++	gpio_direction_output(S3C2410_GPB(0), 0); ++	gpio_free(S3C2410_GPB(0)); ++ ++	gpio_set_value(S3C2410_GPB(1), 0); ++	s3c_gpio_setpull(S3C2410_GPB(1), S3C_GPIO_PULL_UP); ++	gpio_free(S3C2410_GPB(1)); ++} ++ ++static struct platform_pwm_backlight_data backlight_data = { ++	.pwm_id         = 0, ++	.max_brightness = 100, ++	.dft_brightness = 50, ++	.pwm_period_ns  = 3*1000*1000, ++	.init           = n35_backlight_init, ++	.notify         = n35_backlight_notify, ++	.exit           = n35_backlight_exit, ++}; ++ ++static struct platform_device n35_backlight = { ++	.name = "pwm-backlight", ++	.dev  = { ++		.parent = &s3c_device_timer[0].dev, ++		.platform_data = &backlight_data, ++	}, ++	.id   = -1, ++}; ++ + static void n30_sdi_set_power(unsigned char power_mode, unsigned short vdd) + { + 	switch (power_mode) { +@@ -416,6 +485,8 @@ static struct platform_device *n35_devices[] __initdata = { + 	&s3c_device_sdi, + 	&s3c_device_adc, + 	&s3c_device_ts, ++	&s3c_device_timer[0], ++	&n35_backlight, + 	&n35_button_device, + 	&n35_blue_led, + 	&n35_warning_led, +--  +1.7.3.1 + diff --git a/linux/3.1.6/0007-n30-Clean-up-LCD-conf.-moved-to-LCD-conf.-from-hardc.patch b/linux/3.1.6/0007-n30-Clean-up-LCD-conf.-moved-to-LCD-conf.-from-hardc.patch new file mode 100644 index 0000000..526d45e --- /dev/null +++ b/linux/3.1.6/0007-n30-Clean-up-LCD-conf.-moved-to-LCD-conf.-from-hardc.patch @@ -0,0 +1,33 @@ +From 8086748ebb12eaec8c7c0ad89f6a52f99f777d87 Mon Sep 17 00:00:00 2001 +From: Jiri Pinkava <jiri.pinkava@vscht.cz> +Date: Mon, 24 May 2010 11:00:25 +0200 +Subject: [PATCH 07/14] n30: Clean up LCD conf. (moved to LCD conf. from hardcoded section) + +Signed-off-by: Jiri Pinkava <jiri.pinkava@vscht.cz> +--- + arch/arm/mach-s3c2410/mach-n30.c |    9 +++++++++ + 1 files changed, 9 insertions(+), 0 deletions(-) + +diff --git a/arch/arm/mach-s3c2410/mach-n30.c b/arch/arm/mach-s3c2410/mach-n30.c +index 4199143..3158165 100644 +--- a/arch/arm/mach-s3c2410/mach-n30.c ++++ b/arch/arm/mach-s3c2410/mach-n30.c +@@ -368,6 +368,15 @@ static struct s3c2410fb_mach_info n30_fb_info __initdata = { + 	.num_displays	= 1, + 	.default_display = 0, + 	.lpcsel		= 0x06, ++ ++	.gpccon		= 0xaaa80208, ++	.gpccon_mask	= 0xfffc030c, ++	.gpcup		= 0x0000fe12, ++	.gpcup_mask	= 0xfffffe12, ++	.gpdcon		= 0xaa80aaa4, ++	.gpdcon_mask	= 0xffc0fffc, ++	.gpdup		= 0x0000f8fe, ++	.gpdup_mask	= 0xfffff8fe, + }; +  + static int n35_backlight_init(struct device *dev) +--  +1.7.3.1 + diff --git a/linux/3.1.6/0008-n35-Support-for-NAND-Flash-on-Acer-n35.patch b/linux/3.1.6/0008-n35-Support-for-NAND-Flash-on-Acer-n35.patch new file mode 100644 index 0000000..3a72c6a --- /dev/null +++ b/linux/3.1.6/0008-n35-Support-for-NAND-Flash-on-Acer-n35.patch @@ -0,0 +1,122 @@ +From c8955e56555dae6e308b3fa3ea91c8d823402bd5 Mon Sep 17 00:00:00 2001 +From: Jiri Pinkava <jiri.pinkava@vscht.cz> +Date: Sat, 22 May 2010 05:01:39 +0200 +Subject: [PATCH 08/14] n35: Support for NAND Flash on Acer n35 + +Signed-off-by: Jiri Pinkava <jiri.pinkava@vscht.cz> +--- + arch/arm/mach-s3c2410/mach-n30.c |   73 ++++++++++++++++++++++++++++++++++++++ + 1 files changed, 73 insertions(+), 0 deletions(-) + +diff --git a/arch/arm/mach-s3c2410/mach-n30.c b/arch/arm/mach-s3c2410/mach-n30.c +index 3158165..c492f5d 100644 +--- a/arch/arm/mach-s3c2410/mach-n30.c ++++ b/arch/arm/mach-s3c2410/mach-n30.c +@@ -17,6 +17,7 @@ + #include <linux/kernel.h> + #include <linux/types.h> +  ++#include <linux/delay.h> + #include <linux/gpio_keys.h> + #include <linux/init.h> + #include <linux/gpio.h> +@@ -49,10 +50,69 @@ + #include <plat/cpu.h> + #include <plat/devs.h> + #include <plat/mci.h> ++#include <plat/nand.h> + #include <plat/s3c2410.h> + #include <plat/ts.h> + #include <plat/udc.h> +  ++#ifdef CONFIG_MTD_PARTITIONS ++#include <linux/mtd/mtd.h> ++#include <linux/mtd/nand.h> ++#include <linux/mtd/nand_ecc.h> ++#include <linux/mtd/partitions.h> ++ ++struct mtd_partition n35_default_nand_part[] = { ++	/* Original partitioning by manufacturer ++	 * ++	 * 0x0     - 0x3fff  NBoot ++	 * 0x4000  - 0x4fff  TOC ++	 * 0x8000  - 0x27fff Eboot ++	 * 0x28000 - 0x2bfff partition table ++	 * 0x2c000 -         data ... ++	 * FIXME: incomplete ++	 * */ ++	{ ++		.name   = "bootloader", ++		.offset = 0, ++		.size   = 0x28000, ++		.mask_flags = MTD_WRITEABLE, ++	}, ++	{ ++		.name   = "partition", ++		.offset = MTDPART_OFS_APPEND, ++		.size   = 0x4000, ++	}, ++	{ ++		.name   = "kernel", ++		.offset = MTDPART_OFS_APPEND, ++		.size   = 0x180000, ++	}, ++	{ ++		.name   = "rootfs", ++		.offset = MTDPART_OFS_APPEND, ++		.size   = MTDPART_SIZ_FULL, ++	}, ++}; ++ ++static struct s3c2410_nand_set n35_nand_sets[] = { ++	{ ++		.name       = "chip0", ++		.nr_chips   = 1, ++		.nr_partitions  = ARRAY_SIZE(n35_default_nand_part), ++		.partitions = n35_default_nand_part, ++	}, ++}; ++ ++static struct s3c2410_platform_nand n35_nand_info = { ++	.tacls      = 20, ++	.twrph0     = 35, ++	.twrph1     = 20, ++	.nr_sets    = ARRAY_SIZE(n35_nand_sets), ++	.sets       = n35_nand_sets, ++	.ignore_unset_ecc = 1, ++}; ++#endif ++ + static struct map_desc n30_iodesc[] __initdata = { + 	/* nothing here yet */ + }; +@@ -492,6 +552,9 @@ static struct platform_device *n35_devices[] __initdata = { + 	&s3c_device_rtc, + 	&s3c_device_usbgadget, + 	&s3c_device_sdi, ++#ifdef CONFIG_MTD_PARTITIONS ++	&s3c_device_nand, ++#endif + 	&s3c_device_adc, + 	&s3c_device_ts, + 	&s3c_device_timer[0], +@@ -681,6 +744,16 @@ static void __init n30_init(void) + 	} +  + 	if (machine_is_n35()) { ++		s3c_nand_set_platdata(&n35_nand_info); ++ ++		/* Clear any locks and write protects on the flash. */ ++		WARN_ON(gpio_request(S3C2410_GPC(5), "NAND write protection")); ++		gpio_set_value(S3C2410_GPC(5), 1); ++		udelay(1); ++		gpio_set_value(S3C2410_GPC(5), 0); ++		udelay(1); ++		gpio_set_value(S3C2410_GPC(5), 1); ++ + 		/* Turn off suspend and switch the selectable USB port + 		 * to USB device mode.  Turn on suspend for the host + 		 * port since it is not connected on the N35. +--  +1.7.3.1 + diff --git a/linux/3.1.6/0009-n30-Add-battery-status-for-Acer-n30-n35.patch b/linux/3.1.6/0009-n30-Add-battery-status-for-Acer-n30-n35.patch new file mode 100644 index 0000000..d9ac7e5 --- /dev/null +++ b/linux/3.1.6/0009-n30-Add-battery-status-for-Acer-n30-n35.patch @@ -0,0 +1,197 @@ +From f28776d590b9f75bde803a37ae63de66b3069c56 Mon Sep 17 00:00:00 2001 +From: Jiri Pinkava <jiri.pinkava@vscht.cz> +Date: Mon, 24 May 2010 10:48:10 +0200 +Subject: [PATCH 09/14] n30: Add battery status for Acer n30 / n35 + +Signed-off-by: Jiri Pinkava <jiri.pinkava@vscht.cz> +--- + arch/arm/mach-s3c2410/mach-n30.c |    7 ++ + drivers/power/Kconfig            |    6 ++ + drivers/power/Makefile           |    1 + + drivers/power/n30_battery.c      |  116 ++++++++++++++++++++++++++++++++++++++ + 4 files changed, 130 insertions(+), 0 deletions(-) + create mode 100644 drivers/power/n30_battery.c + +diff --git a/arch/arm/mach-s3c2410/mach-n30.c b/arch/arm/mach-s3c2410/mach-n30.c +index c492f5d..36ed810 100644 +--- a/arch/arm/mach-s3c2410/mach-n30.c ++++ b/arch/arm/mach-s3c2410/mach-n30.c +@@ -185,6 +185,11 @@ static struct s3c2410_ts_mach_info n30_ts_cfg __initdata = { + 	.cfg_gpio = s3c24xx_ts_cfg_gpio, + }; +  ++static struct platform_device n30_battery = { ++	.name		= "n30-battery", ++	.id		= -1, ++}; ++ + static struct gpio_keys_button n30_buttons[] = { + 	{ + 		.gpio		= S3C2410_GPF(0), +@@ -539,6 +544,7 @@ static struct platform_device *n30_devices[] __initdata = { + 	&s3c_device_sdi, + 	&s3c_device_adc, + 	&s3c_device_ts, ++	&n30_battery, + 	&n30_button_device, + 	&n30_blue_led, + 	&n30_warning_led, +@@ -559,6 +565,7 @@ static struct platform_device *n35_devices[] __initdata = { + 	&s3c_device_ts, + 	&s3c_device_timer[0], + 	&n35_backlight, ++	&n30_battery, + 	&n35_button_device, + 	&n35_blue_led, + 	&n35_warning_led, +diff --git a/drivers/power/Kconfig b/drivers/power/Kconfig +index 0734356..0f4559c 100644 +--- a/drivers/power/Kconfig ++++ b/drivers/power/Kconfig +@@ -76,6 +76,12 @@ config BATTERY_DS2782 + 	  Say Y here to enable support for the DS2782/DS2786 standalone battery + 	  gas-gauge. +  ++config BATTERY_N30 ++	tristate "Acer n30/n35 battery driver" ++	depends on (MACH_N30 || MACH_N35) && I2C ++	help ++	  Say Y here to enable support for batteries on the Acer n30 family. ++ + config BATTERY_PMU + 	tristate "Apple PMU battery" + 	depends on PPC32 && ADB_PMU +diff --git a/drivers/power/Makefile b/drivers/power/Makefile +index 10143aa..ee8dad2 100644 +--- a/drivers/power/Makefile ++++ b/drivers/power/Makefile +@@ -37,3 +37,4 @@ obj-$(CONFIG_BATTERY_S3C_ADC)	+= s3c_adc_battery.o + obj-$(CONFIG_CHARGER_PCF50633)	+= pcf50633-charger.o + obj-$(CONFIG_BATTERY_JZ4740)	+= jz4740-battery.o + obj-$(CONFIG_BATTERY_INTEL_MID)	+= intel_mid_battery.o ++obj-$(CONFIG_BATTERY_N30)	+= n30_battery.o +diff --git a/drivers/power/n30_battery.c b/drivers/power/n30_battery.c +new file mode 100644 +index 0000000..c7d34aa +--- /dev/null ++++ b/drivers/power/n30_battery.c +@@ -0,0 +1,116 @@ ++/* Acer n30 battery driver. ++ * ++ * The Acer n30 family has a battery controller which sits on the I2C ++ * bus and which can report the battery charge in percent.  Two GPIO ++ * pins tells if the PDA is being powered from a charger or via USB. ++ * ++ * Copyright (c) 2008 Christer Weinigel <christer@weinigel.se> ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License version 2 as ++ * published by the Free Software Foundation. ++ */ ++ ++#include <linux/kernel.h> ++#include <linux/types.h> ++#include <linux/i2c.h> ++#include <linux/platform_device.h> ++#include <linux/power_supply.h> ++ ++#include <mach/hardware.h> ++#include <mach/regs-gpio.h> ++ ++#include <asm/mach-types.h> ++ ++static int n30_battery_get_capacity(struct device *dev) ++{ ++	u8 value; ++	struct i2c_adapter *adap; ++	struct i2c_msg msg[] = { ++		{ .addr = 0x0b, .flags = I2C_M_RD, .buf = &value, .len = 1 } ++	}; ++	int capacity = -EIO; ++ ++	adap = i2c_get_adapter(0); ++	if (adap != NULL) { ++		if (i2c_transfer(adap, msg, 1) == 1) ++			capacity = value; ++		else ++			dev_err(dev, "failed to read capacity\n"); ++		i2c_put_adapter(adap); ++	} else ++		dev_err(dev, "failed to get i2c adapter\n"); ++ ++	return capacity; ++} ++ ++static int n30_battery_get_property(struct power_supply *psy, ++				    enum power_supply_property psp, ++				    union power_supply_propval *val) ++{ ++	switch (psp) { ++	case POWER_SUPPLY_PROP_CAPACITY: ++		val->intval = n30_battery_get_capacity(psy->dev); ++		return 0; ++	default: ++		return -EINVAL; ++	} ++	return 0; ++} ++ ++static enum power_supply_property n30_battery_props[] = { ++	POWER_SUPPLY_PROP_CAPACITY, ++}; ++ ++static struct power_supply n30_battery = { ++	.name = "battery", ++	.type = POWER_SUPPLY_TYPE_BATTERY, ++	.properties = n30_battery_props, ++	.num_properties = ARRAY_SIZE(n30_battery_props), ++	.get_property = n30_battery_get_property, ++	.use_for_apm = 1, ++}; ++ ++static int __devinit n30_battery_probe(struct platform_device *pdev) ++{ ++	int ret; ++ ++	dev_info(&pdev->dev, "Acer n30 battery driver\n"); ++ ++	ret = power_supply_register(&pdev->dev, &n30_battery); ++	if (ret) ++		return ret; ++ ++	return 0; ++} ++ ++static int n30_battery_remove(struct platform_device *pdev) ++{ ++	power_supply_unregister(&n30_battery); ++	return 0; ++} ++ ++static struct platform_driver n30_battery_driver = { ++	.driver = { ++		.name = "n30-battery", ++	}, ++	.probe = n30_battery_probe, ++	.remove = n30_battery_remove, ++}; ++ ++static int __init n30_battery_init(void) ++{ ++	return platform_driver_register(&n30_battery_driver); ++} ++ ++static void __exit n30_battery_exit(void) ++{ ++	platform_driver_unregister(&n30_battery_driver); ++} ++ ++module_init(n30_battery_init); ++module_exit(n30_battery_exit); ++ ++MODULE_AUTHOR("Christer Weinigel <christer@weinigel.se>"); ++MODULE_DESCRIPTION("Acer n30 battery driver"); ++MODULE_LICENSE("GPL"); +--  +1.7.3.1 + diff --git a/linux/3.1.6/0010-n30-Add-PDA-power-supply-status-on-Acer-n30-n35.patch b/linux/3.1.6/0010-n30-Add-PDA-power-supply-status-on-Acer-n30-n35.patch new file mode 100644 index 0000000..7388140 --- /dev/null +++ b/linux/3.1.6/0010-n30-Add-PDA-power-supply-status-on-Acer-n30-n35.patch @@ -0,0 +1,98 @@ +From e98e470136f0910a64bed8a77c067e6976dd23de Mon Sep 17 00:00:00 2001 +From: Jiri Pinkava <jiri.pinkava@vscht.cz> +Date: Mon, 24 May 2010 10:08:47 +0200 +Subject: [PATCH 10/14] n30: Add PDA power supply status on Acer n30 / n35 + +Signed-off-by: Jiri Pinkava <jiri.pinkava@vscht.cz> +--- + arch/arm/mach-s3c2410/mach-n30.c |   53 ++++++++++++++++++++++++++++++++++++++ + 1 files changed, 53 insertions(+), 0 deletions(-) + +diff --git a/arch/arm/mach-s3c2410/mach-n30.c b/arch/arm/mach-s3c2410/mach-n30.c +index 36ed810..9c0e5b8 100644 +--- a/arch/arm/mach-s3c2410/mach-n30.c ++++ b/arch/arm/mach-s3c2410/mach-n30.c +@@ -23,6 +23,7 @@ + #include <linux/gpio.h> + #include <linux/input.h> + #include <linux/interrupt.h> ++#include <linux/pda_power.h> + #include <linux/platform_device.h> + #include <linux/pwm_backlight.h> + #include <linux/serial_core.h> +@@ -185,6 +186,56 @@ static struct s3c2410_ts_mach_info n30_ts_cfg __initdata = { + 	.cfg_gpio = s3c24xx_ts_cfg_gpio, + }; +  ++/* It would be possible to register GPG1 as interrupt resource EINT9 ++ * with the pda_power code, but since GPC7 cannot have an interrupt ++ * connected to it, the pda_power driver will use polling anyway.  In ++ * addition to that, since the USB driver already requests EINT9, the ++ * request_irq in pda_power fails.  So don't do that. */ ++ ++/* ++static struct resource n30_power_resource[] = { ++	{ ++		.name = "usb", ++		.start = IRQ_EINT9, ++		.end   = IRQ_EINT9, ++		.flags = IORESOURCE_IRQ, ++	}, ++}; ++*/ ++ ++static int n30_is_ac_online(void) ++{ ++	return gpio_get_value(S3C2410_GPC(7)); ++} ++ ++static int n30_is_usb_online(void) ++{ ++	return gpio_get_value(S3C2410_GPG(1)); ++} ++ ++static char *n30_power_supplied_to[] = { ++	"battery", ++}; ++ ++static struct pda_power_pdata n30_power_pdata = { ++	.is_ac_online = n30_is_ac_online, ++	.is_usb_online = n30_is_usb_online, ++	.supplied_to = n30_power_supplied_to, ++	.num_supplicants = ARRAY_SIZE(n30_power_supplied_to), ++}; ++ ++static struct platform_device n30_power = { ++	.name		= "pda-power", ++	.id		= -1, ++	.dev		= { ++		.platform_data	= &n30_power_pdata, ++	}, ++/* ++	.num_resources	= ARRAY_SIZE(n30_power_resource), ++	.resource	= n30_power_resource, ++*/ ++}; ++ + static struct platform_device n30_battery = { + 	.name		= "n30-battery", + 	.id		= -1, +@@ -545,6 +596,7 @@ static struct platform_device *n30_devices[] __initdata = { + 	&s3c_device_adc, + 	&s3c_device_ts, + 	&n30_battery, ++	&n30_power, + 	&n30_button_device, + 	&n30_blue_led, + 	&n30_warning_led, +@@ -569,6 +621,7 @@ static struct platform_device *n35_devices[] __initdata = { + 	&n35_button_device, + 	&n35_blue_led, + 	&n35_warning_led, ++	&n30_power, + }; +  + static struct s3c2410_platform_i2c __initdata n30_i2ccfg = { +--  +1.7.3.1 + diff --git a/linux/3.1.6/0011-n35-Powermanagement-for-some-LCD-stuff-on-Acer-n35.patch b/linux/3.1.6/0011-n35-Powermanagement-for-some-LCD-stuff-on-Acer-n35.patch new file mode 100644 index 0000000..68e7ed4 --- /dev/null +++ b/linux/3.1.6/0011-n35-Powermanagement-for-some-LCD-stuff-on-Acer-n35.patch @@ -0,0 +1,92 @@ +From 3dad22d3a6e269ea7387c756592fd831fbd7810e Mon Sep 17 00:00:00 2001 +From: Jiri Pinkava <jiri.pinkava@vscht.cz> +Date: Mon, 24 May 2010 11:03:52 +0200 +Subject: [PATCH 11/14] n35: Powermanagement for some LCD stuff on Acer n35 + +Signed-off-by: Jiri Pinkava <jiri.pinkava@vscht.cz> +--- + arch/arm/mach-s3c2410/mach-n30.c |   47 ++++++++++++++++++++++++++++++++++++++ + 1 files changed, 47 insertions(+), 0 deletions(-) + +diff --git a/arch/arm/mach-s3c2410/mach-n30.c b/arch/arm/mach-s3c2410/mach-n30.c +index 9c0e5b8..3c784e4 100644 +--- a/arch/arm/mach-s3c2410/mach-n30.c ++++ b/arch/arm/mach-s3c2410/mach-n30.c +@@ -56,6 +56,8 @@ + #include <plat/ts.h> + #include <plat/udc.h> +  ++#include <video/platform_lcd.h> ++ + #ifdef CONFIG_MTD_PARTITIONS + #include <linux/mtd/mtd.h> + #include <linux/mtd/nand.h> +@@ -563,6 +565,45 @@ static struct platform_device n35_backlight = { + 	.id   = -1, + }; +  ++static void n35_lcd_set_power(struct plat_lcd_data *pd, unsigned int power) ++{ ++	if (power) { ++		gpio_set_value(S3C2410_GPB(8), 1); ++		s3c_gpio_setpull(S3C2410_GPB(8), S3C_GPIO_PULL_UP); ++ ++		s3c_gpio_cfgpin(S3C2410_GPB(9), S3C2410_GPIO_OUTPUT); ++		gpio_set_value(S3C2410_GPB(9), 1); ++		s3c_gpio_setpull(S3C2410_GPB(9), S3C_GPIO_PULL_UP); ++ ++		s3c_gpio_cfgpin(S3C2410_GPB(10), S3C2410_GPIO_OUTPUT); ++		gpio_set_value(S3C2410_GPB(10), 1); ++		s3c_gpio_setpull(S3C2410_GPB(10), S3C_GPIO_PULL_UP); ++	} else { ++		gpio_set_value(S3C2410_GPB(8), 0); ++		s3c_gpio_setpull(S3C2410_GPB(8), S3C_GPIO_PULL_DOWN); ++ ++		s3c_gpio_cfgpin(S3C2410_GPB(9), S3C2410_GPIO_INPUT); ++		s3c_gpio_setpull(S3C2410_GPB(9), S3C_GPIO_PULL_DOWN); ++ ++		s3c_gpio_cfgpin(S3C2410_GPB(10), S3C2410_GPIO_INPUT); ++		s3c_gpio_setpull(S3C2410_GPB(10), S3C_GPIO_PULL_DOWN); ++	} ++} ++ ++ ++static struct plat_lcd_data n35_lcd_power_data = { ++	.set_power = n35_lcd_set_power, ++}; ++ ++static struct platform_device n35_lcd_powerdev = { ++	.name	= "platform-lcd", ++	.id	= -1, ++	.dev	= { ++		.parent		= &s3c_device_lcd.dev, ++		.platform_data	= &n35_lcd_power_data, ++	}, ++}; ++ + static void n30_sdi_set_power(unsigned char power_mode, unsigned short vdd) + { + 	switch (power_mode) { +@@ -617,6 +658,7 @@ static struct platform_device *n35_devices[] __initdata = { + 	&s3c_device_ts, + 	&s3c_device_timer[0], + 	&n35_backlight, ++	&n35_lcd_powerdev, + 	&n30_battery, + 	&n35_button_device, + 	&n35_blue_led, +@@ -806,6 +848,11 @@ static void __init n30_init(void) + 	if (machine_is_n35()) { + 		s3c_nand_set_platdata(&n35_nand_info); +  ++		WARN_ON(gpio_request(S3C2410_GPB(8), "LCD driver")); ++		WARN_ON(gpio_request(S3C2410_GPB(9), "LCD HSYNC")); ++		WARN_ON(gpio_request(S3C2410_GPB(10), "LCD VSYNC")); ++		s3c_gpio_cfgpin(S3C2410_GPB(8), S3C2410_GPIO_OUTPUT); ++ + 		/* Clear any locks and write protects on the flash. */ + 		WARN_ON(gpio_request(S3C2410_GPC(5), "NAND write protection")); + 		gpio_set_value(S3C2410_GPC(5), 1); +--  +1.7.3.1 + diff --git a/linux/3.1.6/0012-n30-Basic-suspend-to-ram-for-Acer-n30-n35.patch b/linux/3.1.6/0012-n30-Basic-suspend-to-ram-for-Acer-n30-n35.patch new file mode 100644 index 0000000..b00ddcd --- /dev/null +++ b/linux/3.1.6/0012-n30-Basic-suspend-to-ram-for-Acer-n30-n35.patch @@ -0,0 +1,187 @@ +From e73ac678d32e5748c73902591922b0e9b5b6c182 Mon Sep 17 00:00:00 2001 +From: Jiri Pinkava <jiri.pinkava@vscht.cz> +Date: Thu, 27 May 2010 15:53:03 +0200 +Subject: [PATCH 12/14] n30: Basic suspend to ram for Acer n30 / n35 + +Signed-off-by: Jiri Pinkava <jiri.pinkava@vscht.cz> +--- + arch/arm/Makefile                          |    1 + + arch/arm/mach-s3c2410/Kconfig              |    1 + + arch/arm/mach-s3c2410/Makefile.boot        |   11 +++++++---- + arch/arm/mach-s3c2410/include/mach/h1940.h |    1 + + arch/arm/mach-s3c2410/mach-n30.c           |   22 ++++++++++++++++++++++ + arch/arm/mach-s3c2410/pm-h1940.S           |    2 ++ + arch/arm/mach-s3c2410/sleep.S              |    3 +++ + 7 files changed, 37 insertions(+), 4 deletions(-) + +diff --git a/arch/arm/Makefile b/arch/arm/Makefile +index 59c1ce8..40ec8d4 100644 +--- a/arch/arm/Makefile ++++ b/arch/arm/Makefile +@@ -119,6 +119,7 @@ textofs-y	:= 0x00008000 + textofs-$(CONFIG_ARCH_CLPS711X) := 0x00028000 + # We don't want the htc bootloader to corrupt kernel during resume + textofs-$(CONFIG_PM_H1940)      := 0x00108000 ++textofs-$(CONFIG_MACH_N35)      := 0x00208000 + # SA1111 DMA bug: we don't want the kernel to live in precious DMA-able memory + ifeq ($(CONFIG_ARCH_SA1100),y) + textofs-$(CONFIG_SA1111) := 0x00208000 +diff --git a/arch/arm/mach-s3c2410/Kconfig b/arch/arm/mach-s3c2410/Kconfig +index 1d55349..bcb7061 100644 +--- a/arch/arm/mach-s3c2410/Kconfig ++++ b/arch/arm/mach-s3c2410/Kconfig +@@ -98,6 +98,7 @@ config MACH_N30 + 	bool "Acer N30 family" + 	select CPU_S3C2410 + 	select MACH_N35 ++	select PM_H1940 if PM + 	select S3C_DEV_USB_HOST + 	select S3C_DEV_NAND + 	select S3C2410_SETUP_TS +diff --git a/arch/arm/mach-s3c2410/Makefile.boot b/arch/arm/mach-s3c2410/Makefile.boot +index 58c1dd7..aaf5bdc 100644 +--- a/arch/arm/mach-s3c2410/Makefile.boot ++++ b/arch/arm/mach-s3c2410/Makefile.boot +@@ -1,7 +1,10 @@ ++zreladdr-y	:= 0x30008000 ++params_phys-y	:= 0x30000100 + ifeq ($(CONFIG_PM_H1940),y) +-	zreladdr-y		:= 0x30108000 ++	zreladdr-y	:= 0x30108000 + 	params_phys-y	:= 0x30100100 +-else +-	zreladdr-y		:= 0x30008000 +-	params_phys-y	:= 0x30000100 ++endif ++ifeq ($(CONFIG_MACH_N35),y) ++	zreladdr-y	:= 0x30208000 ++	params_phys-y	:= 0x30200100 + endif +diff --git a/arch/arm/mach-s3c2410/include/mach/h1940.h b/arch/arm/mach-s3c2410/include/mach/h1940.h +index 4559784..be48128 100644 +--- a/arch/arm/mach-s3c2410/include/mach/h1940.h ++++ b/arch/arm/mach-s3c2410/include/mach/h1940.h +@@ -17,5 +17,6 @@ + #define H1940_SUSPEND_CHECK		(0x30080000) +  + extern void h1940_pm_return(void); ++extern void h1940_pm_return_end(void); +  + #endif /* __ASM_ARCH_H1940_H */ +diff --git a/arch/arm/mach-s3c2410/mach-n30.c b/arch/arm/mach-s3c2410/mach-n30.c +index 3c784e4..34a7e9e 100644 +--- a/arch/arm/mach-s3c2410/mach-n30.c ++++ b/arch/arm/mach-s3c2410/mach-n30.c +@@ -19,6 +19,7 @@ +  + #include <linux/delay.h> + #include <linux/gpio_keys.h> ++#include <linux/memblock.h> + #include <linux/init.h> + #include <linux/gpio.h> + #include <linux/input.h> +@@ -27,6 +28,7 @@ + #include <linux/platform_device.h> + #include <linux/pwm_backlight.h> + #include <linux/serial_core.h> ++#include <linux/sysdev.h> + #include <linux/timer.h> + #include <linux/io.h> + #include <linux/mmc/host.h> +@@ -36,6 +38,7 @@ + #include <asm/mach-types.h> +  + #include <mach/fb.h> ++#include <mach/h1940.h> + #include <mach/leds-gpio.h> + #include <mach/regs-gpio.h> + #include <mach/regs-lcd.h> +@@ -49,6 +52,7 @@ +  + #include <plat/clock.h> + #include <plat/cpu.h> ++#include <plat/pm.h> + #include <plat/devs.h> + #include <plat/mci.h> + #include <plat/nand.h> +@@ -58,6 +62,8 @@ +  + #include <video/platform_lcd.h> +  ++#define N35_SUSPEND_RESUMEAT (S3C2410_SDRAM_PA + 0x201000) ++ + #ifdef CONFIG_MTD_PARTITIONS + #include <linux/mtd/mtd.h> + #include <linux/mtd/nand.h> +@@ -816,12 +822,26 @@ static void __init n30_map_io(void) + 	s3c24xx_init_uarts(n30_uartcfgs, ARRAY_SIZE(n30_uartcfgs)); + } +  ++/* Acer N30/N35 need to reserve this memory to suspend */ ++static void __init n30_reserve(void) ++{ ++       memblock_reserve(0x30201000, 0x1000); ++} ++ + /* GPB3 is the line that controls the pull-up for the USB D+ line */ +  + static void __init n30_init(void) + { + 	WARN_ON(gpio_request(S3C2410_GPG(4), "mmc power")); +  ++	/* setup PM */ ++ ++#ifdef CONFIG_PM_H1940 ++	memcpy(phys_to_virt(N35_SUSPEND_RESUMEAT), h1940_pm_return, ++			h1940_pm_return_end - h1940_pm_return); ++#endif ++	s3c_pm_init(); ++ + 	s3c24xx_fb_set_platdata(&n30_fb_info); + 	s3c24xx_ts_set_platdata(&n30_ts_cfg); + 	s3c24xx_udc_set_platdata(&n30_udc_cfg); +@@ -892,6 +912,7 @@ MACHINE_START(N30, "Acer-N30") + 	.init_machine	= n30_init, + 	.init_irq	= s3c24xx_init_irq, + 	.map_io		= n30_map_io, ++	.reserve	= n30_reserve, + MACHINE_END +  + MACHINE_START(N35, "Acer-N35") +@@ -904,4 +925,5 @@ MACHINE_START(N35, "Acer-N35") + 	.init_machine	= n30_init, + 	.init_irq	= s3c24xx_init_irq, + 	.map_io		= n30_map_io, ++	.reserve	= n30_reserve, + MACHINE_END +diff --git a/arch/arm/mach-s3c2410/pm-h1940.S b/arch/arm/mach-s3c2410/pm-h1940.S +index c93bf2d..020ed0c 100644 +--- a/arch/arm/mach-s3c2410/pm-h1940.S ++++ b/arch/arm/mach-s3c2410/pm-h1940.S +@@ -27,7 +27,9 @@ +  + 	.text + 	.global	h1940_pm_return ++	.global h1940_pm_return_end +  + h1940_pm_return: + 	mov	r0, #S3C2410_PA_GPIO + 	ldr	pc, [ r0, #S3C2410_GSTATUS3 - S3C24XX_VA_GPIO ] ++h1940_pm_return_end: +diff --git a/arch/arm/mach-s3c2410/sleep.S b/arch/arm/mach-s3c2410/sleep.S +index dd5b638..84ecef3 100644 +--- a/arch/arm/mach-s3c2410/sleep.S ++++ b/arch/arm/mach-s3c2410/sleep.S +@@ -51,6 +51,9 @@ ENTRY(s3c2410_cpu_suspend) +  + 	orr	r7, r7, #S3C2410_REFRESH_SELF	@ SDRAM sleep command + 	orr	r8, r8, #S3C2410_MISCCR_SDSLEEP @ SDRAM power-down signals ++						@ turn off data port pull ups ++	orr	r8, r8, #S3C2410_MISCCR_SPUCR_HDIS ++	orr	r8, r8, #S3C2410_MISCCR_SPUCR_LDIS + 	orr	r9, r9, #S3C2410_CLKCON_POWER	@ power down command +  + 	teq	pc, #0			@ first as a trial-run to load cache +--  +1.7.3.1 + diff --git a/linux/3.1.6/0013-n35-Acer-n35-GPS-power-management.patch b/linux/3.1.6/0013-n35-Acer-n35-GPS-power-management.patch new file mode 100644 index 0000000..9193ce6 --- /dev/null +++ b/linux/3.1.6/0013-n35-Acer-n35-GPS-power-management.patch @@ -0,0 +1,206 @@ +From 2dac0b9383e3939ce69b07aff70e8eae3b7fa561 Mon Sep 17 00:00:00 2001 +From: Jiri Pinkava <jiri.pinkava@vscht.cz> +Date: Wed, 26 May 2010 23:00:56 +0200 +Subject: [PATCH 13/14] n35: Acer n35 GPS power management + +Signed-off-by: Jiri Pinkava <jiri.pinkava@vscht.cz> +--- + arch/arm/mach-s3c2410/Makefile   |    1 + + arch/arm/mach-s3c2410/mach-n30.c |    6 ++ + arch/arm/mach-s3c2410/n35_gps.c  |  148 ++++++++++++++++++++++++++++++++++++++ + 3 files changed, 155 insertions(+), 0 deletions(-) + create mode 100644 arch/arm/mach-s3c2410/n35_gps.c + +diff --git a/arch/arm/mach-s3c2410/Makefile b/arch/arm/mach-s3c2410/Makefile +index 0d468e9..896baa4 100644 +--- a/arch/arm/mach-s3c2410/Makefile ++++ b/arch/arm/mach-s3c2410/Makefile +@@ -25,6 +25,7 @@ obj-$(CONFIG_ARCH_H1940)	+= mach-h1940.o + obj-$(CONFIG_H1940BT)		+= h1940-bluetooth.o + obj-$(CONFIG_PM_H1940)		+= pm-h1940.o + obj-$(CONFIG_MACH_N30)		+= mach-n30.o ++obj-$(CONFIG_MACH_N35)		+= n35_gps.o + obj-$(CONFIG_ARCH_BAST)		+= mach-bast.o usb-simtec.o + obj-$(CONFIG_MACH_OTOM)		+= mach-otom.o + obj-$(CONFIG_MACH_AML_M5900)	+= mach-amlm5900.o +diff --git a/arch/arm/mach-s3c2410/mach-n30.c b/arch/arm/mach-s3c2410/mach-n30.c +index 34a7e9e..010d5aa 100644 +--- a/arch/arm/mach-s3c2410/mach-n30.c ++++ b/arch/arm/mach-s3c2410/mach-n30.c +@@ -631,6 +631,11 @@ static struct s3c24xx_mci_pdata n30_mci_cfg __initdata = { + 	.set_power	= n30_sdi_set_power, + }; +  ++static struct platform_device n35_device_gps = { ++	.name             = "n35-gps", ++	.id               = -1, ++}; ++ + static struct platform_device *n30_devices[] __initdata = { + 	&s3c_device_lcd, + 	&s3c_device_wdt, +@@ -664,6 +669,7 @@ static struct platform_device *n35_devices[] __initdata = { + 	&s3c_device_ts, + 	&s3c_device_timer[0], + 	&n35_backlight, ++	&n35_device_gps, + 	&n35_lcd_powerdev, + 	&n30_battery, + 	&n35_button_device, +diff --git a/arch/arm/mach-s3c2410/n35_gps.c b/arch/arm/mach-s3c2410/n35_gps.c +new file mode 100644 +index 0000000..41506e9 +--- /dev/null ++++ b/arch/arm/mach-s3c2410/n35_gps.c +@@ -0,0 +1,148 @@ ++/* ++ * arch/arm/mach-s3c2410/n35-gps.c ++ * Copyright (c) Arnaud Patard <arnaud.patard@rtp-net.org> ++ * ++ * This file is subject to the terms and conditions of the GNU General Public ++ * License.  See the file COPYING in the main directory of this archive for ++ * more details. ++ * ++ *	    Acer n35 GPS "driver" ++ *	    FIXME: Do proper up/down handling, now it only ses power on/off. ++ * ++ */ ++ ++#include <linux/module.h> ++#include <linux/platform_device.h> ++//#include <linux/delay.h> ++#include <linux/string.h> ++#include <linux/ctype.h> ++#include <linux/gpio.h> ++ ++#include <mach/regs-gpio.h> ++#include <mach/hardware.h> ++ ++#define DRV_NAME              "n35-gps" ++ ++struct n35_gps_data { ++	int suspend_power_state; ++}; ++ ++static struct n35_gps_data n35_gps; ++ ++static int gps_power_get(void) ++{ ++	return !(gpio_get_value(S3C2410_GPB(4)) || \ ++			gpio_get_value(S3C2410_GPG(11))); ++} ++ ++static void gps_power_set(int power) ++{ ++	gpio_set_value(S3C2410_GPB(4), power ? 0 : 1); ++	gpio_set_value(S3C2410_GPG(11), power ? 0 : 1); ++} ++ ++static ssize_t gps_power_show(struct device *dev, ++		struct device_attribute *attr, char *buf) ++{ ++	if (gps_power_get()) ++		return sprintf(buf, "1\n"); ++	return sprintf(buf, "0\n"); ++} ++ ++static ssize_t gps_power_store(struct device *pdev, ++		struct device_attribute *attr, const char *buf, size_t size) ++{ ++	int power; ++ ++	power = simple_strtoul(buf, NULL, 0); ++	gps_power_set(power); ++ ++	return size; ++} ++ ++static DEVICE_ATTR(gps_power, 0664, gps_power_show, gps_power_store); ++ ++static int __devinit n35_gps_probe(struct platform_device *pdev) ++{ ++	int ret; ++ ++	ret = gpio_request(S3C2410_GPB(4), "Acer n35 GPS module power"); ++	if (ret) ++		goto ret_err; ++ ++	ret = gpio_request(S3C2410_GPG(11), "Acer n35 GPS antena power"); ++	if (ret) ++		goto ret_err_gpg4; ++ ++	s3c_gpio_cfgpin(S3C2410_GPB(4), S3C2410_GPIO_OUTPUT); ++	s3c_gpio_cfgpin(S3C2410_GPG(11), S3C2410_GPIO_OUTPUT); ++ ++	gps_power_set(0); ++ ++	ret = device_create_file(&pdev->dev, &dev_attr_gps_power); ++	if (ret) { ++		dev_err(&pdev->dev, "Failed to create GPS sysfs device\n"); ++		goto ret_err_gpg11; ++	} ++ ++	return 0; ++ret_err_gpg11: ++	gpio_free(S3C2410_GPG(11)); ++ret_err_gpg4: ++	gpio_free(S3C2410_GPB(4)); ++ret_err: ++	return ret; ++} ++ ++static int n35_gps_remove(struct platform_device *pdev) ++{ ++	gps_power_set(0); ++ ++	gpio_free(S3C2410_GPG(11)); ++	gpio_free(S3C2410_GPB(4)); ++ ++	device_remove_file(&pdev->dev, &dev_attr_gps_power); ++ ++	return 0; ++} ++ ++static int n35_gps_suspend(struct platform_device *pdev, pm_message_t state) ++{ ++	n35_gps.suspend_power_state = gps_power_get(); ++	gps_power_set(0); ++	return 0; ++} ++ ++static int n35_gps_resume(struct platform_device *pdev) ++{ ++	gps_power_set(n35_gps.suspend_power_state); ++	return 0; ++} ++ ++static struct platform_driver n35_gps_driver = { ++	.driver		= { ++		.name	= DRV_NAME, ++	}, ++	.probe		= n35_gps_probe, ++	.remove		= n35_gps_remove, ++	.resume		= n35_gps_resume, ++	.suspend	= n35_gps_suspend, ++}; ++ ++ ++static int __init n35_gps_init(void) ++{ ++	return platform_driver_register(&n35_gps_driver); ++} ++ ++static void __exit n35_gps_exit(void) ++{ ++	platform_driver_unregister(&n35_gps_driver); ++} ++ ++module_init(n35_gps_init); ++module_exit(n35_gps_exit); ++ ++MODULE_AUTHOR("Jiri Pinkava <jiri.pinkava@vscht.cz>"); ++MODULE_DESCRIPTION("Driver for the Acer n35 GPS"); ++MODULE_LICENSE("GPL"); +--  +1.7.3.1 + diff --git a/linux/3.1.6/0014-s3c2410_ts-HACK-for-tslib-add-fake-pressure-value.patch b/linux/3.1.6/0014-s3c2410_ts-HACK-for-tslib-add-fake-pressure-value.patch new file mode 100644 index 0000000..d259355 --- /dev/null +++ b/linux/3.1.6/0014-s3c2410_ts-HACK-for-tslib-add-fake-pressure-value.patch @@ -0,0 +1,52 @@ +From dee39d8e29e6de3759acc733588bbc691e69114b Mon Sep 17 00:00:00 2001 +From: Jiri Pinkava <jiri.pinkava@vscht.cz> +Date: Sat, 5 Jun 2010 12:35:55 +0200 +Subject: [PATCH 14/14] s3c2410_ts: HACK for tslib, add fake pressure value + +Signed-off-by: Jiri Pinkava <jiri.pinkava@vscht.cz> +--- + drivers/input/touchscreen/s3c2410_ts.c |   12 ++++++++++-- + 1 files changed, 10 insertions(+), 2 deletions(-) + +diff --git a/drivers/input/touchscreen/s3c2410_ts.c b/drivers/input/touchscreen/s3c2410_ts.c +index 6085d12..13f8c04 100644 +--- a/drivers/input/touchscreen/s3c2410_ts.c ++++ b/drivers/input/touchscreen/s3c2410_ts.c +@@ -124,6 +124,7 @@ static void touch_timer_fire(unsigned long data) +  + 			input_report_abs(ts.input, ABS_X, ts.xp); + 			input_report_abs(ts.input, ABS_Y, ts.yp); ++			input_report_abs(ts.input, ABS_PRESSURE, 1); +  + 			input_report_key(ts.input, BTN_TOUCH, 1); + 			input_sync(ts.input); +@@ -140,6 +141,7 @@ static void touch_timer_fire(unsigned long data) + 		ts.count = 0; +  + 		input_report_key(ts.input, BTN_TOUCH, 0); ++		input_report_abs(ts.input, ABS_PRESSURE, 0); + 		input_sync(ts.input); +  + 		writel(WAIT4INT | INT_DOWN, ts.io + S3C2410_ADCTSC); +@@ -314,10 +316,16 @@ static int __devinit s3c2410ts_probe(struct platform_device *pdev) + 	} +  + 	ts.input = input_dev; +-	ts.input->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS); +-	ts.input->keybit[BIT_WORD(BTN_TOUCH)] = BIT_MASK(BTN_TOUCH); ++	__set_bit(EV_ABS, ts.input->evbit); ++	__set_bit(ABS_X, ts.input->absbit); ++	__set_bit(ABS_Y, ts.input->absbit); ++	__set_bit(ABS_PRESSURE, ts.input->absbit); ++	__set_bit(EV_SYN, ts.input->evbit); ++	__set_bit(EV_KEY, ts.input->evbit); ++	__set_bit(BTN_TOUCH, ts.input->keybit); + 	input_set_abs_params(ts.input, ABS_X, 0, 0x3FF, 0, 0); + 	input_set_abs_params(ts.input, ABS_Y, 0, 0x3FF, 0, 0); ++	input_set_abs_params(ts.input, ABS_PRESSURE, 0, 1, 0, 0); +  + 	ts.input->name = "S3C24XX TouchScreen"; + 	ts.input->id.bustype = BUS_HOST; +--  +1.7.3.1 + | 
