From 87ac5f53fb8d372c28e01e5158929442db54e7d3 Mon Sep 17 00:00:00 2001 From: Martin Jansa Date: Mon, 26 Apr 2010 10:46:27 +0200 Subject: linux-openmoko-2.6.32: upgrade to 2.6.32.12, add latest gdrm patches Signed-off-by: Martin Jansa --- ...display-before-trying-to-set-mode-or-base.patch | 103 + ...-send-userspace-an-event-on-disconnection.patch | 42 - ...display-before-trying-to-set-mode-or-base.patch | 103 - .../linux-openmoko-2.6.32/0016-accels.patch.patch | 1759 ++++++++++++++++ .../linux-openmoko-2.6.32/0017-accels.patch.patch | 1759 ---------------- .../linux-openmoko-2.6.32/0017-usbhost.patch.patch | 233 +++ .../0018-ar6000_delay.patch.patch | 211 ++ .../linux-openmoko-2.6.32/0018-usbhost.patch.patch | 233 --- .../0019-ar6000_delay.patch.patch | 211 -- .../0019-save_regs.patch.patch | 140 ++ ...0020-Fix-KMS-framebuffer-physical-address.patch | 38 + .../0020-save_regs.patch.patch | 140 -- .../0021-Reject-modes-with-clock-0.patch | 25 + .../0021-gta02_defconfig.patch | 2143 ------------------- ...BT6k74-tweaks-Make-resolution-switch-work.patch | 316 +++ .../0022-gta02_drm_defconfig.patch | 2169 -------------------- ...23-Re-enable-Glamo-fence-IRQ-if-it-sticks.patch | 36 - ...023-Remove-a-couple-of-debugging-messages.patch | 35 + ...le-dummy-frames-when-switching-resolution.patch | 26 + ...0024-Fix-KMS-framebuffer-physical-address.patch | 38 - .../0025-pcf50633-fix-merge.patch | 28 + ...mise-possibility-of-race-in-ar6000_ioctl_.patch | 33 + recipes/linux/linux-openmoko-2.6.32_git.bb | 29 +- 23 files changed, 2961 insertions(+), 6889 deletions(-) create mode 100644 recipes/linux/linux-openmoko-2.6.32/0015-Enable-display-before-trying-to-set-mode-or-base.patch delete mode 100644 recipes/linux/linux-openmoko-2.6.32/0015-ar6000-send-userspace-an-event-on-disconnection.patch delete mode 100644 recipes/linux/linux-openmoko-2.6.32/0016-Enable-display-before-trying-to-set-mode-or-base.patch create mode 100644 recipes/linux/linux-openmoko-2.6.32/0016-accels.patch.patch delete mode 100644 recipes/linux/linux-openmoko-2.6.32/0017-accels.patch.patch create mode 100644 recipes/linux/linux-openmoko-2.6.32/0017-usbhost.patch.patch create mode 100644 recipes/linux/linux-openmoko-2.6.32/0018-ar6000_delay.patch.patch delete mode 100644 recipes/linux/linux-openmoko-2.6.32/0018-usbhost.patch.patch delete mode 100644 recipes/linux/linux-openmoko-2.6.32/0019-ar6000_delay.patch.patch create mode 100644 recipes/linux/linux-openmoko-2.6.32/0019-save_regs.patch.patch create mode 100644 recipes/linux/linux-openmoko-2.6.32/0020-Fix-KMS-framebuffer-physical-address.patch delete mode 100644 recipes/linux/linux-openmoko-2.6.32/0020-save_regs.patch.patch create mode 100644 recipes/linux/linux-openmoko-2.6.32/0021-Reject-modes-with-clock-0.patch delete mode 100644 recipes/linux/linux-openmoko-2.6.32/0021-gta02_defconfig.patch create mode 100644 recipes/linux/linux-openmoko-2.6.32/0022-JBT6k74-tweaks-Make-resolution-switch-work.patch delete mode 100644 recipes/linux/linux-openmoko-2.6.32/0022-gta02_drm_defconfig.patch delete mode 100644 recipes/linux/linux-openmoko-2.6.32/0023-Re-enable-Glamo-fence-IRQ-if-it-sticks.patch create mode 100644 recipes/linux/linux-openmoko-2.6.32/0023-Remove-a-couple-of-debugging-messages.patch create mode 100644 recipes/linux/linux-openmoko-2.6.32/0024-Enable-dummy-frames-when-switching-resolution.patch delete mode 100644 recipes/linux/linux-openmoko-2.6.32/0024-Fix-KMS-framebuffer-physical-address.patch create mode 100644 recipes/linux/linux-openmoko-2.6.32/0025-pcf50633-fix-merge.patch create mode 100644 recipes/linux/linux-openmoko-2.6.32/0031-ar6000-minimise-possibility-of-race-in-ar6000_ioctl_.patch (limited to 'recipes') diff --git a/recipes/linux/linux-openmoko-2.6.32/0015-Enable-display-before-trying-to-set-mode-or-base.patch b/recipes/linux/linux-openmoko-2.6.32/0015-Enable-display-before-trying-to-set-mode-or-base.patch new file mode 100644 index 0000000000..4e7a8abe10 --- /dev/null +++ b/recipes/linux/linux-openmoko-2.6.32/0015-Enable-display-before-trying-to-set-mode-or-base.patch @@ -0,0 +1,103 @@ +From 986df52e3e02a1cdbf43eafccd483f0f86c696bd Mon Sep 17 00:00:00 2001 +From: Thomas White +Date: Sun, 21 Mar 2010 20:55:18 +0100 +Subject: [PATCH 16/16] Enable display before trying to set mode or base + +This makes it possible to change mode when the screen is switched off. + +Signed-off-by: Thomas White +--- + drivers/mfd/glamo/glamo-display.c | 56 ++++++++++++++++++------------------ + 1 files changed, 28 insertions(+), 28 deletions(-) + +diff --git a/drivers/mfd/glamo/glamo-display.c b/drivers/mfd/glamo/glamo-display.c +index e56cdb4..24a1a31 100644 +--- a/drivers/mfd/glamo/glamo-display.c ++++ b/drivers/mfd/glamo/glamo-display.c +@@ -267,9 +267,9 @@ static int glamo_crtc_mode_set_base(struct drm_crtc *crtc, int x, int y, + gdrm = gcrtc->gdrm; /* Here it is! */ + + if ( !gcrtc->pixel_clock_on ) { +- printk(KERN_WARNING "[glamo-drm] Refusing to set base while " +- "pixel clock is off.\n"); +- return -EBUSY; ++ printk(KERN_WARNING "[glamo-drm] Display is off - " ++ "enabling it before setting base.\n"); ++ glamo_lcd_power(gdrm, 1); + } + + gfb = to_glamo_framebuffer(crtc->fb); +@@ -304,9 +304,9 @@ static int glamo_crtc_mode_set(struct drm_crtc *crtc, + gdrm = gcrtc->gdrm; /* Here it is! */ + + if ( !gcrtc->pixel_clock_on ) { +- printk(KERN_WARNING "[glamo-drm] Refusing to set mode while " +- "pixel clock is off.\n"); +- return -EBUSY; ++ printk(KERN_WARNING "[glamo-drm] Display is off - " ++ "enabling it before setting mode.\n"); ++ glamo_lcd_power(gdrm, 1); + } + + glamo_lcd_cmd_mode(gdrm, 1); +@@ -380,28 +380,6 @@ static void glamo_crtc_dpms(struct drm_crtc *crtc, int mode) + } + + +-void glamo_lcd_power(struct glamodrm_handle *gdrm, int mode) +-{ +- struct drm_crtc *crtc = gdrm->crtc; +- struct glamo_crtc *gcrtc = to_glamo_crtc(crtc); +- +- if ( mode ) { +- glamo_engine_enable(gdrm->glamo_core, GLAMO_ENGINE_LCD); +- gcrtc->pixel_clock_on = 1; +- jbt6k74_setpower(JBT_POWER_MODE_NORMAL); +- if ( gcrtc->current_mode_set ) { +- glamo_crtc_mode_set(crtc, &gcrtc->current_mode, +- &gcrtc->current_mode, 0, 0, +- gcrtc->current_fb); +- } +- } else { +- jbt6k74_setpower(JBT_POWER_MODE_OFF); +- glamo_engine_suspend(gdrm->glamo_core, GLAMO_ENGINE_LCD); +- gcrtc->pixel_clock_on = 0; +- } +-} +- +- + static void glamo_crtc_prepare(struct drm_crtc *crtc) + { + } +@@ -862,6 +840,28 @@ int glamo_display_init(struct drm_device *dev) + } + + ++void glamo_lcd_power(struct glamodrm_handle *gdrm, int mode) ++{ ++ struct drm_crtc *crtc = gdrm->crtc; ++ struct glamo_crtc *gcrtc = to_glamo_crtc(crtc); ++ ++ if ( mode ) { ++ glamo_engine_enable(gdrm->glamo_core, GLAMO_ENGINE_LCD); ++ gcrtc->pixel_clock_on = 1; ++ jbt6k74_setpower(JBT_POWER_MODE_NORMAL); ++ if ( gcrtc->current_mode_set ) { ++ glamo_crtc_mode_set(crtc, &gcrtc->current_mode, ++ &gcrtc->current_mode, 0, 0, ++ gcrtc->current_fb); ++ } ++ } else { ++ jbt6k74_setpower(JBT_POWER_MODE_OFF); ++ glamo_engine_suspend(gdrm->glamo_core, GLAMO_ENGINE_LCD); ++ gcrtc->pixel_clock_on = 0; ++ } ++} ++ ++ + void glamo_display_suspend(struct glamodrm_handle *gdrm) + { + /* do nothing */ +-- +1.7.0.2 + diff --git a/recipes/linux/linux-openmoko-2.6.32/0015-ar6000-send-userspace-an-event-on-disconnection.patch b/recipes/linux/linux-openmoko-2.6.32/0015-ar6000-send-userspace-an-event-on-disconnection.patch deleted file mode 100644 index fb0ede68e7..0000000000 --- a/recipes/linux/linux-openmoko-2.6.32/0015-ar6000-send-userspace-an-event-on-disconnection.patch +++ /dev/null @@ -1,42 +0,0 @@ -From 505ed5ebe6b5a296c83881e91fa7e8dd0ef021aa Mon Sep 17 00:00:00 2001 -From: Paul Fertser -Date: Sun, 21 Feb 2010 12:52:58 +0300 -Subject: [PATCH 15/15] ar6000: send userspace an event on disconnection - -Without this userspace gets confused and might fail to obtain a DHCP -lease, bring the interface up etc etc. - -This place is definetely not the best or most intuitive to add this code -but when added to the real disconnect callback it messes wpa_supplicant -completely because hardware signals disconnection right after it was -asked to associate (and signals association the next moment). - -The particular problem this patch solves is lack of DISCONNECTED event -during suspend/resume; because of it "wpa_cli -a" doesn't relaunch its -script and the interface is not brought up automatically after resume. - -Signed-off-by: Paul Fertser ---- - drivers/ar6000/ar6000/ar6000_drv.c | 6 ++++++ - 1 files changed, 6 insertions(+), 0 deletions(-) - -diff --git a/drivers/ar6000/ar6000/ar6000_drv.c b/drivers/ar6000/ar6000/ar6000_drv.c -index 90533ab..4e0ae72 100644 ---- a/drivers/ar6000/ar6000/ar6000_drv.c -+++ b/drivers/ar6000/ar6000/ar6000_drv.c -@@ -934,6 +934,12 @@ static void - ar6000_unavail_ev(void *Instance) - { - AR_SOFTC_T *ar = (AR_SOFTC_T *)Instance; -+ union iwreq_data wrqu; -+ -+ A_MEMZERO(&wrqu, sizeof(wrqu)); -+ wrqu.ap_addr.sa_family = ARPHRD_ETHER; -+ wireless_send_event(ar->arNetDev, SIOCGIWAP, &wrqu, NULL); -+ - /* NULL out it's entry in the global list */ - ar6000_devices[ar->arDeviceIndex] = NULL; - ar6000_destroy(ar->arNetDev, 1); --- -1.7.0.2 - diff --git a/recipes/linux/linux-openmoko-2.6.32/0016-Enable-display-before-trying-to-set-mode-or-base.patch b/recipes/linux/linux-openmoko-2.6.32/0016-Enable-display-before-trying-to-set-mode-or-base.patch deleted file mode 100644 index 4e7a8abe10..0000000000 --- a/recipes/linux/linux-openmoko-2.6.32/0016-Enable-display-before-trying-to-set-mode-or-base.patch +++ /dev/null @@ -1,103 +0,0 @@ -From 986df52e3e02a1cdbf43eafccd483f0f86c696bd Mon Sep 17 00:00:00 2001 -From: Thomas White -Date: Sun, 21 Mar 2010 20:55:18 +0100 -Subject: [PATCH 16/16] Enable display before trying to set mode or base - -This makes it possible to change mode when the screen is switched off. - -Signed-off-by: Thomas White ---- - drivers/mfd/glamo/glamo-display.c | 56 ++++++++++++++++++------------------ - 1 files changed, 28 insertions(+), 28 deletions(-) - -diff --git a/drivers/mfd/glamo/glamo-display.c b/drivers/mfd/glamo/glamo-display.c -index e56cdb4..24a1a31 100644 ---- a/drivers/mfd/glamo/glamo-display.c -+++ b/drivers/mfd/glamo/glamo-display.c -@@ -267,9 +267,9 @@ static int glamo_crtc_mode_set_base(struct drm_crtc *crtc, int x, int y, - gdrm = gcrtc->gdrm; /* Here it is! */ - - if ( !gcrtc->pixel_clock_on ) { -- printk(KERN_WARNING "[glamo-drm] Refusing to set base while " -- "pixel clock is off.\n"); -- return -EBUSY; -+ printk(KERN_WARNING "[glamo-drm] Display is off - " -+ "enabling it before setting base.\n"); -+ glamo_lcd_power(gdrm, 1); - } - - gfb = to_glamo_framebuffer(crtc->fb); -@@ -304,9 +304,9 @@ static int glamo_crtc_mode_set(struct drm_crtc *crtc, - gdrm = gcrtc->gdrm; /* Here it is! */ - - if ( !gcrtc->pixel_clock_on ) { -- printk(KERN_WARNING "[glamo-drm] Refusing to set mode while " -- "pixel clock is off.\n"); -- return -EBUSY; -+ printk(KERN_WARNING "[glamo-drm] Display is off - " -+ "enabling it before setting mode.\n"); -+ glamo_lcd_power(gdrm, 1); - } - - glamo_lcd_cmd_mode(gdrm, 1); -@@ -380,28 +380,6 @@ static void glamo_crtc_dpms(struct drm_crtc *crtc, int mode) - } - - --void glamo_lcd_power(struct glamodrm_handle *gdrm, int mode) --{ -- struct drm_crtc *crtc = gdrm->crtc; -- struct glamo_crtc *gcrtc = to_glamo_crtc(crtc); -- -- if ( mode ) { -- glamo_engine_enable(gdrm->glamo_core, GLAMO_ENGINE_LCD); -- gcrtc->pixel_clock_on = 1; -- jbt6k74_setpower(JBT_POWER_MODE_NORMAL); -- if ( gcrtc->current_mode_set ) { -- glamo_crtc_mode_set(crtc, &gcrtc->current_mode, -- &gcrtc->current_mode, 0, 0, -- gcrtc->current_fb); -- } -- } else { -- jbt6k74_setpower(JBT_POWER_MODE_OFF); -- glamo_engine_suspend(gdrm->glamo_core, GLAMO_ENGINE_LCD); -- gcrtc->pixel_clock_on = 0; -- } --} -- -- - static void glamo_crtc_prepare(struct drm_crtc *crtc) - { - } -@@ -862,6 +840,28 @@ int glamo_display_init(struct drm_device *dev) - } - - -+void glamo_lcd_power(struct glamodrm_handle *gdrm, int mode) -+{ -+ struct drm_crtc *crtc = gdrm->crtc; -+ struct glamo_crtc *gcrtc = to_glamo_crtc(crtc); -+ -+ if ( mode ) { -+ glamo_engine_enable(gdrm->glamo_core, GLAMO_ENGINE_LCD); -+ gcrtc->pixel_clock_on = 1; -+ jbt6k74_setpower(JBT_POWER_MODE_NORMAL); -+ if ( gcrtc->current_mode_set ) { -+ glamo_crtc_mode_set(crtc, &gcrtc->current_mode, -+ &gcrtc->current_mode, 0, 0, -+ gcrtc->current_fb); -+ } -+ } else { -+ jbt6k74_setpower(JBT_POWER_MODE_OFF); -+ glamo_engine_suspend(gdrm->glamo_core, GLAMO_ENGINE_LCD); -+ gcrtc->pixel_clock_on = 0; -+ } -+} -+ -+ - void glamo_display_suspend(struct glamodrm_handle *gdrm) - { - /* do nothing */ --- -1.7.0.2 - diff --git a/recipes/linux/linux-openmoko-2.6.32/0016-accels.patch.patch b/recipes/linux/linux-openmoko-2.6.32/0016-accels.patch.patch new file mode 100644 index 0000000000..16f379d055 --- /dev/null +++ b/recipes/linux/linux-openmoko-2.6.32/0016-accels.patch.patch @@ -0,0 +1,1759 @@ +From a08be3ba79daf13baca6de98249c8784ede31297 Mon Sep 17 00:00:00 2001 +From: Radek Polak +Date: Fri, 9 Apr 2010 09:15:40 +0200 +Subject: [PATCH 17/22] accels.patch + +adds support for accelerometers. You will need include/linux/lis302dl.h and +drivers/input/misc/lis302dl.c from andy-tracking. The patch needs +spi_bitbang_transfer_sync() and bitbang_work() to be ported correctly (some +fixes from original 2.6.32 are missing). + +Signed-off-by: Martin Jansa +--- + arch/arm/mach-s3c2410/include/mach/spi-gpio.h | 3 +- + arch/arm/mach-s3c2442/mach-gta02.c | 157 ++++ + drivers/input/misc/Kconfig | 9 + + drivers/input/misc/Makefile | 1 + + drivers/input/misc/lis302dl.c | 952 +++++++++++++++++++++++++ + drivers/spi/spi_bitbang.c | 231 ++++--- + drivers/spi/spi_s3c24xx_gpio.c | 7 +- + include/linux/lis302dl.h | 152 ++++ + include/linux/spi/spi.h | 30 + + include/linux/spi/spi_bitbang.h | 5 + + 10 files changed, 1433 insertions(+), 114 deletions(-) + create mode 100644 drivers/input/misc/lis302dl.c + create mode 100644 include/linux/lis302dl.h + +diff --git a/arch/arm/mach-s3c2410/include/mach/spi-gpio.h b/arch/arm/mach-s3c2410/include/mach/spi-gpio.h +index 980a099..0ff8949 100644 +--- a/arch/arm/mach-s3c2410/include/mach/spi-gpio.h ++++ b/arch/arm/mach-s3c2410/include/mach/spi-gpio.h +@@ -21,7 +21,8 @@ struct s3c2410_spigpio_info { + int num_chipselect; + int bus_num; + +- void (*chip_select)(struct s3c2410_spigpio_info *spi, int cs); ++ int non_blocking_transfer; ++ void (*chip_select)(struct s3c2410_spigpio_info *spi, int csid, int cs); + }; + + +diff --git a/arch/arm/mach-s3c2442/mach-gta02.c b/arch/arm/mach-s3c2442/mach-gta02.c +index b580b1b..8e3cc91 100644 +--- a/arch/arm/mach-s3c2442/mach-gta02.c ++++ b/arch/arm/mach-s3c2442/mach-gta02.c +@@ -63,6 +63,7 @@ + + #include + #include ++#include + + #include + #include +@@ -120,6 +121,22 @@ + #include + #endif + ++#define S3C2410_GPIONO(bank,offset) ((bank) + (offset)) ++ ++#define S3C2410_GPIO_BANKD (32*3) ++#define S3C2410_GPIO_BANKG (32*6) ++ ++#define S3C2410_GPG5 S3C2410_GPIONO(S3C2410_GPIO_BANKG, 5) ++#define S3C2410_GPG6 S3C2410_GPIONO(S3C2410_GPIO_BANKG, 6) ++#define S3C2410_GPG7 S3C2410_GPIONO(S3C2410_GPIO_BANKG, 7) ++#define S3C2410_GPD12 S3C2410_GPIONO(S3C2410_GPIO_BANKD, 12) ++#define S3C2410_GPD13 S3C2410_GPIONO(S3C2410_GPIO_BANKD, 13) ++ ++#define BITBANG_CS_ACTIVE 1 /* normally nCS, active low */ ++#define BITBANG_CS_INACTIVE 0 ++ ++#define S3C_SYSTEM_REV_ATAG GTA02v6_SYSTEM_REV ++ + struct pcf50633 *gta02_pcf; + + /* +@@ -776,6 +793,60 @@ const struct jbt6k74_platform_data jbt6k74_pdata = { + .gpio_reset = GTA02_GPIO_GLAMO(4), + }; + ++/*----------- SPI: Accelerometers attached to SPI of s3c244x ----------------- */ ++ ++void gta02_lis302dl_suspend_io(struct lis302dl_info *lis, int resume) ++{ ++ struct lis302dl_platform_data *pdata = lis->pdata; ++ ++ if (!resume) { ++ /* ++ * we don't want to power them with a high level ++ * because GSENSOR_3V3 is not up during suspend ++ */ ++ s3c2410_gpio_setpin(pdata->pin_chip_select, 0); ++ s3c2410_gpio_setpin(pdata->pin_clk, 0); ++ s3c2410_gpio_setpin(pdata->pin_mosi, 0); ++ /* misnomer: it is a pullDOWN in 2442 */ ++ s3c2410_gpio_pullup(pdata->pin_miso, 1); ++ return; ++ } ++ ++ /* back to normal */ ++ s3c2410_gpio_setpin(pdata->pin_chip_select, 1); ++ s3c2410_gpio_setpin(pdata->pin_clk, 1); ++ /* misnomer: it is a pullDOWN in 2442 */ ++ s3c2410_gpio_pullup(pdata->pin_miso, 0); ++ ++ s3c2410_gpio_cfgpin(pdata->pin_chip_select, S3C2410_GPIO_OUTPUT); ++ s3c2410_gpio_cfgpin(pdata->pin_clk, S3C2410_GPIO_OUTPUT); ++ s3c2410_gpio_cfgpin(pdata->pin_mosi, S3C2410_GPIO_OUTPUT); ++ s3c2410_gpio_cfgpin(pdata->pin_miso, S3C2410_GPIO_INPUT); ++ ++} ++ ++struct lis302dl_platform_data lis302_pdata_top = { ++ .name = "lis302-1 (top)", ++ .pin_chip_select= S3C2410_GPD12, ++ .pin_clk = S3C2410_GPG7, ++ .pin_mosi = S3C2410_GPG6, ++ .pin_miso = S3C2410_GPG5, ++ .interrupt = GTA02_IRQ_GSENSOR_1, ++ .open_drain = 1, /* altered at runtime by PCB rev */ ++ .lis302dl_suspend_io = gta02_lis302dl_suspend_io, ++}; ++ ++struct lis302dl_platform_data lis302_pdata_bottom = { ++ .name = "lis302-2 (bottom)", ++ .pin_chip_select= S3C2410_GPD13, ++ .pin_clk = S3C2410_GPG7, ++ .pin_mosi = S3C2410_GPG6, ++ .pin_miso = S3C2410_GPG5, ++ .interrupt = GTA02_IRQ_GSENSOR_2, ++ .open_drain = 1, /* altered at runtime by PCB rev */ ++ .lis302dl_suspend_io = gta02_lis302dl_suspend_io, ++}; ++ + static struct spi_board_info gta02_spi_board_info[] = { + { + .modalias = "jbt6k74", +@@ -786,6 +857,81 @@ static struct spi_board_info gta02_spi_board_info[] = { + .bus_num = 2, + .chip_select = 0 + }, ++ { ++ .modalias = "lis302dl", ++ /* platform_data */ ++ .platform_data = &lis302_pdata_top, ++ /* controller_data */ ++ /* irq */ ++ .max_speed_hz = 100 * 1000, ++ .bus_num = 3, ++ .chip_select = 0, ++ }, ++ { ++ .modalias = "lis302dl", ++ /* platform_data */ ++ .platform_data = &lis302_pdata_bottom, ++ /* controller_data */ ++ /* irq */ ++ .max_speed_hz = 100 * 1000, ++ .bus_num = 3, ++ .chip_select = 1, ++ }, ++}; ++ ++static void gta02_lis302_chip_select(struct s3c2410_spigpio_info *info, int csid, int cs) ++{ ++ ++ /* ++ * Huh... "quirk"... CS on this device is not really "CS" like you can ++ * expect. ++ * ++ * When it is 0 it selects SPI interface mode. ++ * When it is 1 it selects I2C interface mode. ++ * ++ * Because we have 2 devices on one interface we have to make sure ++ * that the "disabled" device (actually in I2C mode) don't think we're ++ * talking to it. ++ * ++ * When we talk to the "enabled" device, the "disabled" device sees ++ * the clocks as I2C clocks, creating havoc. ++ * ++ * I2C sees MOSI going LOW while CLK HIGH as a START action, thus we ++ * must ensure this is never issued. ++ */ ++ ++ int cs_gpio, other_cs_gpio; ++ ++ cs_gpio = csid ? S3C2410_GPD13 : S3C2410_GPD12; ++ other_cs_gpio = (1 - csid) ? S3C2410_GPD13 : S3C2410_GPD12; ++ ++ ++ if (cs == BITBANG_CS_ACTIVE) { ++ s3c2410_gpio_setpin(other_cs_gpio, 1); ++ s3c2410_gpio_setpin(cs_gpio, 1); ++ s3c2410_gpio_setpin(info->pin_clk, 1); ++ s3c2410_gpio_setpin(cs_gpio, 0); ++ } else { ++ s3c2410_gpio_setpin(cs_gpio, 1); ++ s3c2410_gpio_setpin(other_cs_gpio, 1); ++ } ++} ++ ++static struct s3c2410_spigpio_info gta02_spigpio_cfg = { ++ .pin_clk = S3C2410_GPG7, ++ .pin_mosi = S3C2410_GPG6, ++ .pin_miso = S3C2410_GPG5, ++ .bus_num = 3, ++ .num_chipselect = 2, ++ .chip_select = gta02_lis302_chip_select, ++ .non_blocking_transfer = 1, ++}; ++ ++static struct platform_device gta02_spi_gpio_dev = { ++ .name = "spi_s3c24xx_gpio", ++ .dev = { ++ .platform_data = >a02_spigpio_cfg, ++ }, + }; + + /* BQ27000 Battery */ +@@ -1136,6 +1282,7 @@ static struct platform_device *gta02_devices[] __initdata = { + static struct platform_device *gta02_devices_pmu_children[] = { + &s3c_device_ts, + >a02_glamo_dev, ++ >a02_spi_gpio_dev, + &s3c_device_timer[2], + >a02_hdq_device, + >a02_gps_userspace_consumer +@@ -1362,6 +1509,16 @@ static void __init gta02_machine_init(void) + /* Set the panic callback to make AUX LED blink at ~5Hz. */ + panic_blink = gta02_panic_blink; + ++ switch (S3C_SYSTEM_REV_ATAG) { ++ case GTA02v6_SYSTEM_REV: ++ /* we need push-pull interrupt from motion sensors */ ++ lis302_pdata_top.open_drain = 0; ++ lis302_pdata_bottom.open_drain = 0; ++ break; ++ default: ++ break; ++ } ++ + s3c_device_ts.name = "s3c2440-ts"; + + bus_register_notifier(&platform_bus_type, >a02_device_register_notifier); +diff --git a/drivers/input/misc/Kconfig b/drivers/input/misc/Kconfig +index a9bb254..2e9bc5d 100644 +--- a/drivers/input/misc/Kconfig ++++ b/drivers/input/misc/Kconfig +@@ -317,4 +317,13 @@ config INPUT_PCAP + To compile this driver as a module, choose M here: the + module will be called pcap_keys. + ++config INPUT_LIS302DL ++ tristate "STmicro LIS302DL 3-axis accelerometer" ++ depends on SPI_MASTER ++ help ++ SPI driver for the STmicro LIS302DL 3-axis accelerometer. ++ ++ The userspece interface is a 3-axis (X/Y/Z) relative movement ++ Linux input device, reporting REL_[XYZ] events. ++ + endif +diff --git a/drivers/input/misc/Makefile b/drivers/input/misc/Makefile +index a8b8485..7e63293 100644 +--- a/drivers/input/misc/Makefile ++++ b/drivers/input/misc/Makefile +@@ -30,4 +30,5 @@ obj-$(CONFIG_INPUT_WINBOND_CIR) += winbond-cir.o + obj-$(CONFIG_INPUT_WISTRON_BTNS) += wistron_btns.o + obj-$(CONFIG_INPUT_WM831X_ON) += wm831x-on.o + obj-$(CONFIG_INPUT_YEALINK) += yealink.o ++obj-$(CONFIG_INPUT_LIS302DL) += lis302dl.o + +diff --git a/drivers/input/misc/lis302dl.c b/drivers/input/misc/lis302dl.c +new file mode 100644 +index 0000000..d345bfb +--- /dev/null ++++ b/drivers/input/misc/lis302dl.c +@@ -0,0 +1,952 @@ ++/* Linux kernel driver for the ST LIS302D 3-axis accelerometer ++ * ++ * Copyright (C) 2007-2008 by Openmoko, Inc. ++ * Author: Harald Welte ++ * converted to private bitbang by: ++ * Andy Green ++ * ability to set acceleration threshold added by: ++ * Simon Kagstrom ++ * All rights reserved. ++ * ++ * This program is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU General Public License as ++ * published by the Free Software Foundation; either version 2 of ++ * the License, or (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, write to the Free Software ++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, ++ * MA 02111-1307 USA ++ * ++ * TODO ++ * * statistics for overflow events ++ * * configuration interface (sysfs) for ++ * * enable/disable x/y/z axis data ready ++ * * enable/disable resume from freee fall / click ++ * * free fall / click parameters ++ * * high pass filter parameters ++ */ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include ++ ++/* Utility functions */ ++static u8 __reg_read(struct lis302dl_info *lis, u8 reg) ++{ ++ struct spi_message msg; ++ struct spi_transfer t; ++ u8 data[2] = {0xc0 | reg}; ++ int rc; ++ ++ spi_message_init(&msg); ++ memset(&t, 0, sizeof t); ++ t.len = 2; ++ spi_message_add_tail(&t, &msg); ++ t.tx_buf = &data[0]; ++ t.rx_buf = &data[0]; ++ ++ /* Should complete without blocking */ ++ rc = spi_non_blocking_transfer(lis->spi, &msg); ++ if (rc < 0) { ++ dev_err(lis->dev, "Error reading register\n"); ++ return rc; ++ } ++ ++ return data[1]; ++} ++ ++static void __reg_write(struct lis302dl_info *lis, u8 reg, u8 val) ++{ ++ struct spi_message msg; ++ struct spi_transfer t; ++ u8 data[2] = {reg, val}; ++ ++ spi_message_init(&msg); ++ memset(&t, 0, sizeof t); ++ t.len = 2; ++ spi_message_add_tail(&t, &msg); ++ t.tx_buf = &data[0]; ++ t.rx_buf = &data[0]; ++ ++ /* Completes without blocking */ ++ if (spi_non_blocking_transfer(lis->spi, &msg) < 0) ++ dev_err(lis->dev, "Error writing register\n"); ++} ++ ++static void __reg_set_bit_mask(struct lis302dl_info *lis, u8 reg, u8 mask, ++ u8 val) ++{ ++ u_int8_t tmp; ++ ++ val &= mask; ++ ++ tmp = __reg_read(lis, reg); ++ tmp &= ~mask; ++ tmp |= val; ++ __reg_write(lis, reg, tmp); ++} ++ ++static int __ms_to_duration(struct lis302dl_info *lis, int ms) ++{ ++ /* If we have 400 ms sampling rate, the stepping is 2.5 ms, ++ * on 100 ms the stepping is 10ms */ ++ if (lis->flags & LIS302DL_F_DR) ++ return min((ms * 10) / 25, 637); ++ ++ return min(ms / 10, 2550); ++} ++ ++static int __duration_to_ms(struct lis302dl_info *lis, int duration) ++{ ++ if (lis->flags & LIS302DL_F_DR) ++ return (duration * 25) / 10; ++ ++ return duration * 10; ++} ++ ++static u8 __mg_to_threshold(struct lis302dl_info *lis, int mg) ++{ ++ /* If FS is set each bit is 71mg, otherwise 18mg. The THS register ++ * has 7 bits for the threshold value */ ++ if (lis->flags & LIS302DL_F_FS) ++ return min(mg / 71, 127); ++ ++ return min(mg / 18, 127); ++} ++ ++static int __threshold_to_mg(struct lis302dl_info *lis, u8 threshold) ++{ ++ if (lis->flags & LIS302DL_F_FS) ++ return threshold * 71; ++ ++ return threshold * 18; ++} ++ ++/* interrupt handling related */ ++ ++enum lis302dl_intmode { ++ LIS302DL_INTMODE_GND = 0x00, ++ LIS302DL_INTMODE_FF_WU_1 = 0x01, ++ LIS302DL_INTMODE_FF_WU_2 = 0x02, ++ LIS302DL_INTMODE_FF_WU_12 = 0x03, ++ LIS302DL_INTMODE_DATA_READY = 0x04, ++ LIS302DL_INTMODE_CLICK = 0x07, ++}; ++ ++static void __lis302dl_int_mode(struct device *dev, int int_pin, ++ enum lis302dl_intmode mode) ++{ ++ struct lis302dl_info *lis = dev_get_drvdata(dev); ++ ++ switch (int_pin) { ++ case 1: ++ __reg_set_bit_mask(lis, LIS302DL_REG_CTRL3, 0x07, mode); ++ break; ++ case 2: ++ __reg_set_bit_mask(lis, LIS302DL_REG_CTRL3, 0x38, mode << 3); ++ break; ++ default: ++ BUG(); ++ } ++} ++ ++static void __enable_wakeup(struct lis302dl_info *lis) ++{ ++ __reg_write(lis, LIS302DL_REG_CTRL1, 0); ++ ++ /* First zero to get to a known state */ ++ __reg_write(lis, LIS302DL_REG_FF_WU_CFG_1, LIS302DL_FFWUCFG_XHIE | ++ LIS302DL_FFWUCFG_YHIE | LIS302DL_FFWUCFG_ZHIE | ++ LIS302DL_FFWUCFG_LIR); ++ __reg_write(lis, LIS302DL_REG_FF_WU_THS_1, ++ __mg_to_threshold(lis, lis->wakeup.threshold)); ++ __reg_write(lis, LIS302DL_REG_FF_WU_DURATION_1, ++ __ms_to_duration(lis, lis->wakeup.duration)); ++ ++ /* Route the interrupt for wakeup */ ++ __lis302dl_int_mode(lis->dev, 1, ++ LIS302DL_INTMODE_FF_WU_1); ++ ++ __reg_read(lis, LIS302DL_REG_HP_FILTER_RESET); ++ __reg_read(lis, LIS302DL_REG_OUT_X); ++ __reg_read(lis, LIS302DL_REG_OUT_Y); ++ __reg_read(lis, LIS302DL_REG_OUT_Z); ++ __reg_read(lis, LIS302DL_REG_STATUS); ++ __reg_read(lis, LIS302DL_REG_FF_WU_SRC_1); ++ __reg_read(lis, LIS302DL_REG_FF_WU_SRC_2); ++ __reg_write(lis, LIS302DL_REG_CTRL1, LIS302DL_CTRL1_PD | 7); ++} ++ ++static void __enable_data_collection(struct lis302dl_info *lis) ++{ ++ u_int8_t ctrl1 = LIS302DL_CTRL1_PD | LIS302DL_CTRL1_Xen | ++ LIS302DL_CTRL1_Yen | LIS302DL_CTRL1_Zen; ++ ++ /* make sure we're powered up and generate data ready */ ++ __reg_set_bit_mask(lis, LIS302DL_REG_CTRL1, ctrl1, ctrl1); ++ ++ /* If the threshold is zero, let the device generated an interrupt ++ * on each datum */ ++ if (lis->threshold == 0) { ++ __reg_write(lis, LIS302DL_REG_CTRL2, 0); ++ __lis302dl_int_mode(lis->dev, 1, LIS302DL_INTMODE_DATA_READY); ++ __lis302dl_int_mode(lis->dev, 2, LIS302DL_INTMODE_DATA_READY); ++ } else { ++ __reg_write(lis, LIS302DL_REG_CTRL2, ++ LIS302DL_CTRL2_HPFF1); ++ __reg_write(lis, LIS302DL_REG_FF_WU_THS_1, ++ __mg_to_threshold(lis, lis->threshold)); ++ __reg_write(lis, LIS302DL_REG_FF_WU_DURATION_1, ++ __ms_to_duration(lis, lis->duration)); ++ ++ /* Clear the HP filter "starting point" */ ++ __reg_read(lis, LIS302DL_REG_HP_FILTER_RESET); ++ __reg_write(lis, LIS302DL_REG_FF_WU_CFG_1, ++ LIS302DL_FFWUCFG_XHIE | LIS302DL_FFWUCFG_YHIE | ++ LIS302DL_FFWUCFG_ZHIE | LIS302DL_FFWUCFG_LIR); ++ __lis302dl_int_mode(lis->dev, 1, LIS302DL_INTMODE_FF_WU_12); ++ __lis302dl_int_mode(lis->dev, 2, LIS302DL_INTMODE_FF_WU_12); ++ } ++} ++ ++#if 0 ++static void _report_btn_single(struct input_dev *inp, int btn) ++{ ++ input_report_key(inp, btn, 1); ++ input_sync(inp); ++ input_report_key(inp, btn, 0); ++} ++ ++static void _report_btn_double(struct input_dev *inp, int btn) ++{ ++ input_report_key(inp, btn, 1); ++ input_sync(inp); ++ input_report_key(inp, btn, 0); ++ input_sync(inp); ++ input_report_key(inp, btn, 1); ++ input_sync(inp); ++ input_report_key(inp, btn, 0); ++} ++#endif ++ ++ ++static void lis302dl_bitbang_read_sample(struct lis302dl_info *lis) ++{ ++ u8 data[(LIS302DL_REG_OUT_Z - LIS302DL_REG_STATUS) + 2] = {0xC0 | LIS302DL_REG_STATUS}; ++ u8 *read = data + 1; ++ unsigned long flags; ++ int mg_per_sample = __threshold_to_mg(lis, 1); ++ struct spi_message msg; ++ struct spi_transfer t; ++ ++ spi_message_init(&msg); ++ memset(&t, 0, sizeof t); ++ t.len = sizeof(data); ++ spi_message_add_tail(&t, &msg); ++ t.tx_buf = &data[0]; ++ t.rx_buf = &data[0]; ++ ++ /* grab the set of register containing status and XYZ data */ ++ ++ local_irq_save(flags); ++ ++ /* Should complete without blocking */ ++ if (spi_non_blocking_transfer(lis->spi, &msg) < 0) ++ dev_err(lis->dev, "Error reading registers\n"); ++ ++ local_irq_restore(flags); ++ ++ /* ++ * at the minute the test below fails 50% of the time due to ++ * a problem with level interrupts causing ISRs to get called twice. ++ * This is a workaround for that, but actually this test is still ++ * valid and the information can be used for overrrun stats. ++ */ ++ ++ /* has any kind of overrun been observed by the lis302dl? */ ++ if (read[0] & (LIS302DL_STATUS_XOR | ++ LIS302DL_STATUS_YOR | ++ LIS302DL_STATUS_ZOR)) ++ lis->overruns++; ++ ++ /* we have a valid sample set? */ ++ if (read[0] & LIS302DL_STATUS_XYZDA) { ++ input_report_abs(lis->input_dev, ABS_X, mg_per_sample * ++ (s8)read[LIS302DL_REG_OUT_X - LIS302DL_REG_STATUS]); ++ input_report_abs(lis->input_dev, ABS_Y, mg_per_sample * ++ (s8)read[LIS302DL_REG_OUT_Y - LIS302DL_REG_STATUS]); ++ input_report_abs(lis->input_dev, ABS_Z, mg_per_sample * ++ (s8)read[LIS302DL_REG_OUT_Z - LIS302DL_REG_STATUS]); ++ ++ input_sync(lis->input_dev); ++ } ++ ++ if (lis->threshold) ++ /* acknowledge the wakeup source */ ++ __reg_read(lis, LIS302DL_REG_FF_WU_SRC_1); ++} ++ ++static irqreturn_t lis302dl_interrupt(int irq, void *_lis) ++{ ++ struct lis302dl_info *lis = _lis; ++ ++ lis302dl_bitbang_read_sample(lis); ++ return IRQ_HANDLED; ++} ++ ++/* sysfs */ ++ ++static ssize_t show_overruns(struct device *dev, struct device_attribute *attr, ++ char *buf) ++{ ++ struct lis302dl_info *lis = dev_get_drvdata(dev); ++ ++ return sprintf(buf, "%u\n", lis->overruns); ++} ++ ++static DEVICE_ATTR(overruns, S_IRUGO, show_overruns, NULL); ++ ++static ssize_t show_rate(struct device *dev, struct device_attribute *attr, ++ char *buf) ++{ ++ struct lis302dl_info *lis = dev_get_drvdata(dev); ++ u8 ctrl1; ++ unsigned long flags; ++ ++ local_irq_save(flags); ++ ctrl1 = __reg_read(lis, LIS302DL_REG_CTRL1); ++ local_irq_restore(flags); ++ ++ return sprintf(buf, "%d\n", ctrl1 & LIS302DL_CTRL1_DR ? 400 : 100); ++} ++ ++static ssize_t set_rate(struct device *dev, struct device_attribute *attr, ++ const char *buf, size_t count) ++{ ++ struct lis302dl_info *lis = dev_get_drvdata(dev); ++ unsigned long flags; ++ ++ local_irq_save(flags); ++ ++ if (!strcmp(buf, "400\n")) { ++ __reg_set_bit_mask(lis, LIS302DL_REG_CTRL1, LIS302DL_CTRL1_DR, ++ LIS302DL_CTRL1_DR); ++ lis->flags |= LIS302DL_F_DR; ++ } else { ++ __reg_set_bit_mask(lis, LIS302DL_REG_CTRL1, LIS302DL_CTRL1_DR, ++ 0); ++ lis->flags &= ~LIS302DL_F_DR; ++ } ++ local_irq_restore(flags); ++ ++ return count; ++} ++ ++static DEVICE_ATTR(sample_rate, S_IRUGO | S_IWUSR, show_rate, set_rate); ++ ++static ssize_t show_scale(struct device *dev, struct device_attribute *attr, ++ char *buf) ++{ ++ struct lis302dl_info *lis = dev_get_drvdata(dev); ++ u_int8_t ctrl1; ++ unsigned long flags; ++ ++ local_irq_save(flags); ++ ctrl1 = __reg_read(lis, LIS302DL_REG_CTRL1); ++ local_irq_restore(flags); ++ ++ return sprintf(buf, "%s\n", ctrl1 & LIS302DL_CTRL1_FS ? "9.2" : "2.3"); ++} ++ ++static ssize_t set_scale(struct device *dev, struct device_attribute *attr, ++ const char *buf, size_t count) ++{ ++ struct lis302dl_info *lis = dev_get_drvdata(dev); ++ unsigned long flags; ++ ++ local_irq_save(flags); ++ ++ if (!strcmp(buf, "9.2\n")) { ++ __reg_set_bit_mask(lis, LIS302DL_REG_CTRL1, LIS302DL_CTRL1_FS, ++ LIS302DL_CTRL1_FS); ++ lis->flags |= LIS302DL_F_FS; ++ } else { ++ __reg_set_bit_mask(lis, LIS302DL_REG_CTRL1, LIS302DL_CTRL1_FS, ++ 0); ++ lis->flags &= ~LIS302DL_F_FS; ++ } ++ ++ if (lis->flags & LIS302DL_F_INPUT_OPEN) ++ __enable_data_collection(lis); ++ ++ local_irq_restore(flags); ++ ++ return count; ++} ++ ++static DEVICE_ATTR(full_scale, S_IRUGO | S_IWUSR, show_scale, set_scale); ++ ++static ssize_t show_threshold(struct device *dev, struct device_attribute *attr, ++ char *buf) ++{ ++ struct lis302dl_info *lis = dev_get_drvdata(dev); ++ ++ /* Display the device view of the threshold setting */ ++ return sprintf(buf, "%d\n", __threshold_to_mg(lis, ++ __mg_to_threshold(lis, lis->threshold))); ++} ++ ++static ssize_t set_threshold(struct device *dev, struct device_attribute *attr, ++ const char *buf, size_t count) ++{ ++ struct lis302dl_info *lis = dev_get_drvdata(dev); ++ unsigned int val; ++ ++ if (sscanf(buf, "%u\n", &val) != 1) ++ return -EINVAL; ++ /* 8g is the maximum if FS is 1 */ ++ if (val > 8000) ++ return -ERANGE; ++ ++ /* Set the threshold and write it out if the device is used */ ++ lis->threshold = val; ++ ++ if (lis->flags & LIS302DL_F_INPUT_OPEN) { ++ unsigned long flags; ++ ++ local_irq_save(flags); ++ __enable_data_collection(lis); ++ local_irq_restore(flags); ++ } ++ ++ return count; ++} ++ ++static DEVICE_ATTR(threshold, S_IRUGO | S_IWUSR, show_threshold, set_threshold); ++ ++static ssize_t show_duration(struct device *dev, struct device_attribute *attr, ++ char *buf) ++{ ++ struct lis302dl_info *lis = dev_get_drvdata(dev); ++ ++ return sprintf(buf, "%d\n", __duration_to_ms(lis, ++ __ms_to_duration(lis, lis->duration))); ++} ++ ++static ssize_t set_duration(struct device *dev, struct device_attribute *attr, ++ const char *buf, size_t count) ++{ ++ struct lis302dl_info *lis = dev_get_drvdata(dev); ++ unsigned int val; ++ ++ if (sscanf(buf, "%u\n", &val) != 1) ++ return -EINVAL; ++ if (val > 2550) ++ return -ERANGE; ++ ++ lis->duration = val; ++ if (lis->flags & LIS302DL_F_INPUT_OPEN) ++ __reg_write(lis, LIS302DL_REG_FF_WU_DURATION_1, ++ __ms_to_duration(lis, lis->duration)); ++ ++ return count; ++} ++ ++static DEVICE_ATTR(duration, S_IRUGO | S_IWUSR, show_duration, set_duration); ++ ++static ssize_t lis302dl_dump(struct device *dev, struct device_attribute *attr, ++ char *buf) ++{ ++ struct lis302dl_info *lis = dev_get_drvdata(dev); ++ int n = 0; ++ u8 reg[0x40]; ++ char *end = buf; ++ unsigned long flags; ++ ++ local_irq_save(flags); ++ ++ for (n = 0; n < sizeof(reg); n++) ++ reg[n] = __reg_read(lis, n); ++ ++ local_irq_restore(flags); ++ ++ for (n = 0; n < sizeof(reg); n += 16) { ++ hex_dump_to_buffer(reg + n, 16, 16, 1, end, 128, 0); ++ end += strlen(end); ++ *end++ = '\n'; ++ *end++ = '\0'; ++ } ++ ++ return end - buf; ++} ++static DEVICE_ATTR(dump, S_IRUGO, lis302dl_dump, NULL); ++ ++/* Configure freefall/wakeup interrupts */ ++static ssize_t set_wakeup_threshold(struct device *dev, ++ struct device_attribute *attr, const char *buf, size_t count) ++{ ++ struct lis302dl_info *lis = dev_get_drvdata(dev); ++ unsigned int threshold; ++ ++ if (sscanf(buf, "%u\n", &threshold) != 1) ++ return -EINVAL; ++ ++ if (threshold > 8000) ++ return -ERANGE; ++ ++ /* Zero turns the feature off */ ++ if (threshold == 0) { ++ if (lis->flags & LIS302DL_F_IRQ_WAKE) { ++ disable_irq_wake(lis->pdata->interrupt); ++ lis->flags &= ~LIS302DL_F_IRQ_WAKE; ++ } ++ ++ return count; ++ } ++ ++ lis->wakeup.threshold = threshold; ++ ++ if (!(lis->flags & LIS302DL_F_IRQ_WAKE)) { ++ enable_irq_wake(lis->pdata->interrupt); ++ lis->flags |= LIS302DL_F_IRQ_WAKE; ++ } ++ ++ return count; ++} ++ ++static ssize_t show_wakeup_threshold(struct device *dev, ++ struct device_attribute *attr, char *buf) ++{ ++ struct lis302dl_info *lis = dev_get_drvdata(dev); ++ ++ /* All events off? */ ++ if (lis->wakeup.threshold == 0) ++ return sprintf(buf, "off\n"); ++ ++ return sprintf(buf, "%u\n", lis->wakeup.threshold); ++} ++ ++static DEVICE_ATTR(wakeup_threshold, S_IRUGO | S_IWUSR, show_wakeup_threshold, ++ set_wakeup_threshold); ++ ++static ssize_t set_wakeup_duration(struct device *dev, ++ struct device_attribute *attr, const char *buf, size_t count) ++{ ++ struct lis302dl_info *lis = dev_get_drvdata(dev); ++ unsigned int duration; ++ ++ if (sscanf(buf, "%u\n", &duration) != 1) ++ return -EINVAL; ++ ++ if (duration > 2550) ++ return -ERANGE; ++ ++ lis->wakeup.duration = duration; ++ ++ return count; ++} ++ ++static ssize_t show_wakeup_duration(struct device *dev, ++ struct device_attribute *attr, char *buf) ++{ ++ struct lis302dl_info *lis = dev_get_drvdata(dev); ++ ++ return sprintf(buf, "%u\n", lis->wakeup.duration); ++} ++ ++static DEVICE_ATTR(wakeup_duration, S_IRUGO | S_IWUSR, show_wakeup_duration, ++ set_wakeup_duration); ++ ++static struct attribute *lis302dl_sysfs_entries[] = { ++ &dev_attr_sample_rate.attr, ++ &dev_attr_full_scale.attr, ++ &dev_attr_threshold.attr, ++ &dev_attr_duration.attr, ++ &dev_attr_dump.attr, ++ &dev_attr_wakeup_threshold.attr, ++ &dev_attr_wakeup_duration.attr, ++ &dev_attr_overruns.attr, ++ NULL ++}; ++ ++static struct attribute_group lis302dl_attr_group = { ++ .name = NULL, ++ .attrs = lis302dl_sysfs_entries, ++}; ++ ++/* input device handling and driver core interaction */ ++ ++static int lis302dl_input_open(struct input_dev *inp) ++{ ++ struct lis302dl_info *lis = input_get_drvdata(inp); ++ unsigned long flags; ++ ++ local_irq_save(flags); ++ ++ __enable_data_collection(lis); ++ lis->flags |= LIS302DL_F_INPUT_OPEN; ++ ++ local_irq_restore(flags); ++ ++ return 0; ++} ++ ++static void lis302dl_input_close(struct input_dev *inp) ++{ ++ struct lis302dl_info *lis = input_get_drvdata(inp); ++ u_int8_t ctrl1 = LIS302DL_CTRL1_Xen | LIS302DL_CTRL1_Yen | ++ LIS302DL_CTRL1_Zen; ++ unsigned long flags; ++ ++ local_irq_save(flags); ++ ++ /* since the input core already serializes access and makes sure we ++ * only see close() for the close of the last user, we can safely ++ * disable the data ready events */ ++ __reg_set_bit_mask(lis, LIS302DL_REG_CTRL1, ctrl1, 0x00); ++ lis->flags &= ~LIS302DL_F_INPUT_OPEN; ++ ++ /* however, don't power down the whole device if still needed */ ++ if (!(lis->flags & LIS302DL_F_WUP_FF || ++ lis->flags & LIS302DL_F_WUP_CLICK)) { ++ __reg_set_bit_mask(lis, LIS302DL_REG_CTRL1, LIS302DL_CTRL1_PD, ++ 0x00); ++ } ++ local_irq_restore(flags); ++} ++ ++/* get the device to reload its coefficients from EEPROM and wait for it ++ * to complete ++ */ ++ ++static int __lis302dl_reset_device(struct lis302dl_info *lis) ++{ ++ int timeout = 10; ++ ++ __reg_write(lis, LIS302DL_REG_CTRL2, ++ LIS302DL_CTRL2_BOOT | LIS302DL_CTRL2_FDS); ++ ++ while ((__reg_read(lis, LIS302DL_REG_CTRL2) ++ & LIS302DL_CTRL2_BOOT) && (timeout--)) ++ mdelay(1); ++ ++ return !!(timeout < 0); ++} ++ ++static int __devinit lis302dl_probe(struct spi_device *spi) ++{ ++ int rc; ++ struct lis302dl_info *lis; ++ u_int8_t wai; ++ unsigned long flags; ++ struct lis302dl_platform_data *pdata = spi->dev.platform_data; ++ ++ spi->mode = SPI_MODE_3; ++ rc = spi_setup(spi); ++ if (rc < 0) { ++ dev_err(&spi->dev, "spi_setup failed\n"); ++ return rc; ++ } ++ ++ lis = kzalloc(sizeof(*lis), GFP_KERNEL); ++ if (!lis) ++ return -ENOMEM; ++ ++ lis->dev = &spi->dev; ++ lis->spi = spi; ++ ++ dev_set_drvdata(lis->dev, lis); ++ ++ lis->pdata = pdata; ++ ++ rc = sysfs_create_group(&lis->dev->kobj, &lis302dl_attr_group); ++ if (rc) { ++ dev_err(lis->dev, "error creating sysfs group\n"); ++ goto bail_free_lis; ++ } ++ ++ /* initialize input layer details */ ++ lis->input_dev = input_allocate_device(); ++ if (!lis->input_dev) { ++ dev_err(lis->dev, "Unable to allocate input device\n"); ++ goto bail_sysfs; ++ } ++ ++ input_set_drvdata(lis->input_dev, lis); ++ lis->input_dev->name = pdata->name; ++ /* SPI Bus not defined as a valid bus for input subsystem*/ ++ lis->input_dev->id.bustype = BUS_I2C; /* lie about it */ ++ lis->input_dev->open = lis302dl_input_open; ++ lis->input_dev->close = lis302dl_input_close; ++ ++ rc = input_register_device(lis->input_dev); ++ if (rc) { ++ dev_err(lis->dev, "error %d registering input device\n", rc); ++ goto bail_inp_dev; ++ } ++ ++ local_irq_save(flags); ++ /* Configure our IO */ ++ (lis->pdata->lis302dl_suspend_io)(lis, 1); ++ ++ wai = __reg_read(lis, LIS302DL_REG_WHO_AM_I); ++ if (wai != LIS302DL_WHO_AM_I_MAGIC) { ++ dev_err(lis->dev, "unknown who_am_i signature 0x%02x\n", wai); ++ dev_set_drvdata(lis->dev, NULL); ++ rc = -ENODEV; ++ local_irq_restore(flags); ++ goto bail_inp_reg; ++ } ++ ++ set_bit(EV_ABS, lis->input_dev->evbit); ++ input_set_abs_params(lis->input_dev, ABS_X, 0, 0, 0, 0); ++ input_set_abs_params(lis->input_dev, ABS_Y, 0, 0, 0, 0); ++ input_set_abs_params(lis->input_dev, ABS_Z, 0, 0, 0, 0); ++ ++ ++ lis->threshold = 0; ++ lis->duration = 0; ++ memset(&lis->wakeup, 0, sizeof(lis->wakeup)); ++ ++ if (__lis302dl_reset_device(lis)) ++ dev_err(lis->dev, "device BOOT reload failed\n"); ++ ++ /* force us powered */ ++ __reg_write(lis, LIS302DL_REG_CTRL1, LIS302DL_CTRL1_PD | ++ LIS302DL_CTRL1_Xen | ++ LIS302DL_CTRL1_Yen | ++ LIS302DL_CTRL1_Zen); ++ mdelay(1); ++ ++ __reg_write(lis, LIS302DL_REG_CTRL2, 0); ++ __reg_write(lis, LIS302DL_REG_CTRL3, ++ LIS302DL_CTRL3_PP_OD | LIS302DL_CTRL3_IHL); ++ __reg_write(lis, LIS302DL_REG_FF_WU_THS_1, 0x0); ++ __reg_write(lis, LIS302DL_REG_FF_WU_DURATION_1, 0x00); ++ __reg_write(lis, LIS302DL_REG_FF_WU_CFG_1, 0x0); ++ ++ /* start off in powered down mode; we power up when someone opens us */ ++ __reg_write(lis, LIS302DL_REG_CTRL1, LIS302DL_CTRL1_Xen | ++ LIS302DL_CTRL1_Yen | LIS302DL_CTRL1_Zen); ++ ++ if (pdata->open_drain) ++ /* switch interrupt to open collector, active-low */ ++ __reg_write(lis, LIS302DL_REG_CTRL3, ++ LIS302DL_CTRL3_PP_OD | LIS302DL_CTRL3_IHL); ++ else ++ /* push-pull, active-low */ ++ __reg_write(lis, LIS302DL_REG_CTRL3, LIS302DL_CTRL3_IHL); ++ ++ __lis302dl_int_mode(lis->dev, 1, LIS302DL_INTMODE_GND); ++ __lis302dl_int_mode(lis->dev, 2, LIS302DL_INTMODE_GND); ++ ++ __reg_read(lis, LIS302DL_REG_STATUS); ++ __reg_read(lis, LIS302DL_REG_FF_WU_SRC_1); ++ __reg_read(lis, LIS302DL_REG_FF_WU_SRC_2); ++ __reg_read(lis, LIS302DL_REG_CLICK_SRC); ++ local_irq_restore(flags); ++ ++ dev_info(lis->dev, "Found %s\n", pdata->name); ++ ++ lis->pdata = pdata; ++ ++ set_irq_handler(lis->pdata->interrupt, handle_level_irq); ++ ++ rc = request_irq(lis->pdata->interrupt, lis302dl_interrupt, ++ IRQF_TRIGGER_LOW, "lis302dl", lis); ++ ++ if (rc < 0) { ++ dev_err(lis->dev, "error requesting IRQ %d\n", ++ lis->pdata->interrupt); ++ goto bail_inp_reg; ++ } ++ return 0; ++ ++bail_inp_reg: ++ input_unregister_device(lis->input_dev); ++bail_inp_dev: ++ input_free_device(lis->input_dev); ++bail_sysfs: ++ sysfs_remove_group(&lis->dev->kobj, &lis302dl_attr_group); ++bail_free_lis: ++ kfree(lis); ++ return rc; ++} ++ ++static int __devexit lis302dl_remove(struct spi_device *spi) ++{ ++ struct lis302dl_info *lis = dev_get_drvdata(&spi->dev); ++ unsigned long flags; ++ ++ /* Disable interrupts */ ++ if (lis->flags & LIS302DL_F_IRQ_WAKE) ++ disable_irq_wake(lis->pdata->interrupt); ++ free_irq(lis->pdata->interrupt, lis); ++ ++ /* Reset and power down the device */ ++ local_irq_save(flags); ++ __reg_write(lis, LIS302DL_REG_CTRL3, 0x00); ++ __reg_write(lis, LIS302DL_REG_CTRL2, 0x00); ++ __reg_write(lis, LIS302DL_REG_CTRL1, 0x00); ++ local_irq_restore(flags); ++ ++ /* Cleanup resources */ ++ sysfs_remove_group(&spi->dev.kobj, &lis302dl_attr_group); ++ input_unregister_device(lis->input_dev); ++ if (lis->input_dev) ++ input_free_device(lis->input_dev); ++ dev_set_drvdata(lis->dev, NULL); ++ kfree(lis); ++ ++ return 0; ++} ++ ++#ifdef CONFIG_PM ++ ++static u8 regs_to_save[] = { ++ LIS302DL_REG_CTRL2, ++ LIS302DL_REG_CTRL3, ++ LIS302DL_REG_FF_WU_CFG_1, ++ LIS302DL_REG_FF_WU_THS_1, ++ LIS302DL_REG_FF_WU_DURATION_1, ++ LIS302DL_REG_FF_WU_CFG_2, ++ LIS302DL_REG_FF_WU_THS_2, ++ LIS302DL_REG_FF_WU_DURATION_2, ++ LIS302DL_REG_CLICK_CFG, ++ LIS302DL_REG_CLICK_THSY_X, ++ LIS302DL_REG_CLICK_THSZ, ++ LIS302DL_REG_CLICK_TIME_LIMIT, ++ LIS302DL_REG_CLICK_LATENCY, ++ LIS302DL_REG_CLICK_WINDOW, ++ LIS302DL_REG_CTRL1, ++}; ++ ++static int lis302dl_suspend(struct spi_device *spi, pm_message_t state) ++{ ++ struct lis302dl_info *lis = dev_get_drvdata(&spi->dev); ++ unsigned long flags; ++ u_int8_t tmp; ++ int n; ++ ++ /* determine if we want to wake up from the accel. */ ++ if (lis->flags & LIS302DL_F_WUP_CLICK) ++ return 0; ++ ++ disable_irq(lis->pdata->interrupt); ++ local_irq_save(flags); ++ ++ /* ++ * When we share SPI over multiple sensors, there is a race here ++ * that one or more sensors will lose. In that case, the shared ++ * SPI bus GPIO will be in sleep mode and partially pulled down. So ++ * we explicitly put our IO into "wake" mode here before the final ++ * traffic to the sensor. ++ */ ++ (lis->pdata->lis302dl_suspend_io)(lis, 1); ++ ++ /* save registers */ ++ for (n = 0; n < ARRAY_SIZE(regs_to_save); n++) ++ lis->regs[regs_to_save[n]] = ++ __reg_read(lis, regs_to_save[n]); ++ ++ /* power down or enable wakeup */ ++ ++ if (lis->wakeup.threshold == 0) { ++ tmp = __reg_read(lis, LIS302DL_REG_CTRL1); ++ tmp &= ~LIS302DL_CTRL1_PD; ++ __reg_write(lis, LIS302DL_REG_CTRL1, tmp); ++ } else ++ __enable_wakeup(lis); ++ ++ /* place our IO to the device in sleep-compatible states */ ++ (lis->pdata->lis302dl_suspend_io)(lis, 0); ++ ++ local_irq_restore(flags); ++ ++ return 0; ++} ++ ++static int lis302dl_resume(struct spi_device *spi) ++{ ++ struct lis302dl_info *lis = dev_get_drvdata(&spi->dev); ++ unsigned long flags; ++ int n; ++ ++ if (lis->flags & LIS302DL_F_WUP_CLICK) ++ return 0; ++ ++ local_irq_save(flags); ++ ++ /* get our IO to the device back in operational states */ ++ (lis->pdata->lis302dl_suspend_io)(lis, 1); ++ ++ /* resume from powerdown first! */ ++ __reg_write(lis, LIS302DL_REG_CTRL1, ++ LIS302DL_CTRL1_PD | ++ LIS302DL_CTRL1_Xen | ++ LIS302DL_CTRL1_Yen | ++ LIS302DL_CTRL1_Zen); ++ mdelay(1); ++ ++ if (__lis302dl_reset_device(lis)) ++ dev_err(&spi->dev, "device BOOT reload failed\n"); ++ ++ /* restore registers after resume */ ++ for (n = 0; n < ARRAY_SIZE(regs_to_save); n++) ++ __reg_write(lis, regs_to_save[n], lis->regs[regs_to_save[n]]); ++ ++ /* if someone had us open, reset the non-wake threshold stuff */ ++ if (lis->flags & LIS302DL_F_INPUT_OPEN) ++ __enable_data_collection(lis); ++ ++ local_irq_restore(flags); ++ enable_irq(lis->pdata->interrupt); ++ ++ return 0; ++} ++#else ++#define lis302dl_suspend NULL ++#define lis302dl_resume NULL ++#endif ++ ++static struct spi_driver lis302dl_spi_driver = { ++ .driver = { ++ .name = "lis302dl", ++ .owner = THIS_MODULE, ++ }, ++ ++ .probe = lis302dl_probe, ++ .remove = __devexit_p(lis302dl_remove), ++ .suspend = lis302dl_suspend, ++ .resume = lis302dl_resume, ++}; ++ ++static int __devinit lis302dl_init(void) ++{ ++ return spi_register_driver(&lis302dl_spi_driver); ++} ++ ++static void __exit lis302dl_exit(void) ++{ ++ spi_unregister_driver(&lis302dl_spi_driver); ++} ++ ++MODULE_AUTHOR("Harald Welte "); ++MODULE_LICENSE("GPL"); ++ ++module_init(lis302dl_init); ++module_exit(lis302dl_exit); +diff --git a/drivers/spi/spi_bitbang.c b/drivers/spi/spi_bitbang.c +index f1db395..5c50329 100644 +--- a/drivers/spi/spi_bitbang.c ++++ b/drivers/spi/spi_bitbang.c +@@ -253,134 +253,139 @@ static int spi_bitbang_bufs(struct spi_device *spi, struct spi_transfer *t) + * Drivers can provide word-at-a-time i/o primitives, or provide + * transfer-at-a-time ones to leverage dma or fifo hardware. + */ +-static void bitbang_work(struct work_struct *work) ++/* Synchronous non blocking transfer */ ++int ++spi_bitbang_transfer_sync(struct spi_device *spi, struct spi_message *m) + { +- struct spi_bitbang *bitbang = +- container_of(work, struct spi_bitbang, work); +- unsigned long flags; +- int do_setup = -1; +- int (*setup_transfer)(struct spi_device *, +- struct spi_transfer *); ++ struct spi_bitbang *bitbang = spi_master_get_devdata(spi->master); ++ struct spi_transfer *t; ++ unsigned long flags; ++ int cs_change = 1; ++ int status; ++ int nsecs; ++ int (*setup_transfer)(struct spi_device *, struct spi_transfer *); ++ ++ /* FIXME this is made-up ... the correct value is known to ++ * word-at-a-time bitbang code, and presumably chipselect() ++ * should enforce these requirements too? ++ */ ++ nsecs = 100; ++ cs_change = 1; ++ status = 0; ++ setup_transfer = NULL; ++ ++ local_irq_save(flags); ++ list_for_each_entry (t, &m->transfers, transfer_list) { ++ /* override or restore speed and wordsize */ ++ if (t->speed_hz || t->bits_per_word) { ++ setup_transfer = bitbang->setup_transfer; ++ if (!setup_transfer) { ++ status = -ENOPROTOOPT; ++ break; ++ } ++ } ++ if (setup_transfer) { ++ status = setup_transfer(spi, t); ++ if (status < 0) ++ break; ++ } + +- setup_transfer = bitbang->setup_transfer; ++ /* set up default clock polarity, and activate chip; ++ * this implicitly updates clock and spi modes as ++ * previously recorded for this device via setup(). ++ * (and also deselects any other chip that might be ++ * selected ...) ++ */ + +- spin_lock_irqsave(&bitbang->lock, flags); +- bitbang->busy = 1; +- while (!list_empty(&bitbang->queue)) { +- struct spi_message *m; +- struct spi_device *spi; +- unsigned nsecs; +- struct spi_transfer *t = NULL; +- unsigned tmp; +- unsigned cs_change; +- int status; ++ if (cs_change) { ++ bitbang->chipselect(spi, BITBANG_CS_ACTIVE); ++ ndelay(nsecs); ++ } + +- m = container_of(bitbang->queue.next, struct spi_message, +- queue); +- list_del_init(&m->queue); +- spin_unlock_irqrestore(&bitbang->lock, flags); ++ cs_change = t->cs_change; ++ if (!t->tx_buf && !t->rx_buf && t->len) { ++ status = -EINVAL; ++ break; ++ } + +- /* FIXME this is made-up ... the correct value is known to +- * word-at-a-time bitbang code, and presumably chipselect() +- * should enforce these requirements too? ++ /* transfer data. the lower level code handles any ++ * new dma mappings it needs. our caller always gave ++ * us dma-safe buffers. + */ +- nsecs = 100; ++ if (t->len) { ++ /* REVISIT dma API still needs a designated ++ * DMA_ADDR_INVALID; ~0 might be better. ++ */ ++ if (!m->is_dma_mapped) ++ t->rx_dma = t->tx_dma = 0; ++ status = bitbang->txrx_bufs(spi, t); ++ } + +- spi = m->spi; +- tmp = 0; +- cs_change = 1; ++ if (status > 0) ++ m->actual_length += status; ++ if (status != t->len) { ++ /* always report some kind of error */ ++ if (status >= 0) ++ status = -EREMOTEIO; ++ break; ++ } + status = 0; ++ /* protocol tweaks before next transfer */ ++ if (t->delay_usecs) ++ udelay(t->delay_usecs); ++ if (!cs_change) ++ continue; ++ if (t->transfer_list.next == &m->transfers) ++ break; ++ /* sometimes a short mid-message deselect of the chip ++ * may be needed to terminate a mode or command ++ */ ++ ndelay(nsecs); ++ bitbang->chipselect(spi, BITBANG_CS_INACTIVE); ++ ndelay(nsecs); ++ } + +- list_for_each_entry (t, &m->transfers, transfer_list) { +- +- /* override speed or wordsize? */ +- if (t->speed_hz || t->bits_per_word) +- do_setup = 1; +- +- /* init (-1) or override (1) transfer params */ +- if (do_setup != 0) { +- if (!setup_transfer) { +- status = -ENOPROTOOPT; +- break; +- } +- status = setup_transfer(spi, t); +- if (status < 0) +- break; +- } ++ m->status = status; ++ if (m->complete) ++ m->complete(m->context); + +- /* set up default clock polarity, and activate chip; +- * this implicitly updates clock and spi modes as +- * previously recorded for this device via setup(). +- * (and also deselects any other chip that might be +- * selected ...) +- */ +- if (cs_change) { +- bitbang->chipselect(spi, BITBANG_CS_ACTIVE); +- ndelay(nsecs); +- } +- cs_change = t->cs_change; +- if (!t->tx_buf && !t->rx_buf && t->len) { +- status = -EINVAL; +- break; +- } ++ /* restore speed and wordsize */ ++ if (setup_transfer) ++ setup_transfer(spi, NULL); + +- /* transfer data. the lower level code handles any +- * new dma mappings it needs. our caller always gave +- * us dma-safe buffers. +- */ +- if (t->len) { +- /* REVISIT dma API still needs a designated +- * DMA_ADDR_INVALID; ~0 might be better. +- */ +- if (!m->is_dma_mapped) +- t->rx_dma = t->tx_dma = 0; +- status = bitbang->txrx_bufs(spi, t); +- } +- if (status > 0) +- m->actual_length += status; +- if (status != t->len) { +- /* always report some kind of error */ +- if (status >= 0) +- status = -EREMOTEIO; +- break; +- } +- status = 0; +- +- /* protocol tweaks before next transfer */ +- if (t->delay_usecs) +- udelay(t->delay_usecs); ++ /* normally deactivate chipselect ... unless no error and ++ * cs_change has hinted that the next message will probably ++ * be for this chip too. ++ */ ++ if (!(status == 0 && cs_change)) { ++ ndelay(nsecs); ++ bitbang->chipselect(spi, BITBANG_CS_INACTIVE); ++ ndelay(nsecs); ++ } + +- if (!cs_change) +- continue; +- if (t->transfer_list.next == &m->transfers) +- break; ++ local_irq_restore(flags); + +- /* sometimes a short mid-message deselect of the chip +- * may be needed to terminate a mode or command +- */ +- ndelay(nsecs); +- bitbang->chipselect(spi, BITBANG_CS_INACTIVE); +- ndelay(nsecs); +- } ++ return status; ++} ++EXPORT_SYMBOL_GPL(spi_bitbang_transfer_sync); + +- m->status = status; +- m->complete(m->context); ++static void bitbang_work(struct work_struct *work) ++{ ++ struct spi_bitbang *bitbang = ++ container_of(work, struct spi_bitbang, work); ++ unsigned long flags; + +- /* restore speed and wordsize if it was overridden */ +- if (do_setup == 1) +- setup_transfer(spi, NULL); +- do_setup = 0; ++ spin_lock_irqsave(&bitbang->lock, flags); ++ bitbang->busy = 1; ++ while (!list_empty(&bitbang->queue)) { ++ struct spi_message *m; + +- /* normally deactivate chipselect ... unless no error and +- * cs_change has hinted that the next message will probably +- * be for this chip too. +- */ +- if (!(status == 0 && cs_change)) { +- ndelay(nsecs); +- bitbang->chipselect(spi, BITBANG_CS_INACTIVE); +- ndelay(nsecs); +- } ++ m = container_of(bitbang->queue.next, struct spi_message, ++ queue); ++ list_del_init(&m->queue); + ++ spin_unlock_irqrestore(&bitbang->lock, flags); ++ spi_bitbang_transfer_sync(m->spi, m); + spin_lock_irqsave(&bitbang->lock, flags); + } + bitbang->busy = 0; +@@ -455,6 +460,10 @@ int spi_bitbang_start(struct spi_bitbang *bitbang) + + if (!bitbang->master->transfer) + bitbang->master->transfer = spi_bitbang_transfer; ++ ++ if (!bitbang->master->transfer_sync && bitbang->non_blocking_transfer) ++ bitbang->master->transfer_sync = spi_bitbang_transfer_sync; ++ + if (!bitbang->txrx_bufs) { + bitbang->use_dma = 0; + bitbang->txrx_bufs = spi_bitbang_bufs; +diff --git a/drivers/spi/spi_s3c24xx_gpio.c b/drivers/spi/spi_s3c24xx_gpio.c +index bbf9371..5685b78 100644 +--- a/drivers/spi/spi_s3c24xx_gpio.c ++++ b/drivers/spi/spi_s3c24xx_gpio.c +@@ -92,7 +92,7 @@ static void s3c2410_spigpio_chipselect(struct spi_device *dev, int value) + struct s3c2410_spigpio *sg = spidev_to_sg(dev); + + if (sg->info && sg->info->chip_select) +- (sg->info->chip_select)(sg->info, value); ++ (sg->info->chip_select)(sg->info, dev->chip_select, value); + } + + static int s3c2410_spigpio_probe(struct platform_device *dev) +@@ -113,14 +113,17 @@ static int s3c2410_spigpio_probe(struct platform_device *dev) + + platform_set_drvdata(dev, sp); + +- /* copy in the plkatform data */ ++ /* copy in the platform data */ + info = sp->info = dev->dev.platform_data; + ++ master->num_chipselect = info->num_chipselect; ++ + /* setup spi bitbang adaptor */ + sp->bitbang.master = spi_master_get(master); + sp->bitbang.master->bus_num = info->bus_num; + sp->bitbang.master->num_chipselect = info->num_chipselect; + sp->bitbang.chipselect = s3c2410_spigpio_chipselect; ++ sp->bitbang.non_blocking_transfer = info->non_blocking_transfer; + + sp->bitbang.txrx_word[SPI_MODE_0] = s3c2410_spigpio_txrx_mode0; + sp->bitbang.txrx_word[SPI_MODE_1] = s3c2410_spigpio_txrx_mode1; +diff --git a/include/linux/lis302dl.h b/include/linux/lis302dl.h +new file mode 100644 +index 0000000..0c1fc30 +--- /dev/null ++++ b/include/linux/lis302dl.h +@@ -0,0 +1,152 @@ ++#ifndef _LINUX_LIS302DL_H ++#define _LINUX_LIS302DL_H ++ ++#include ++#include ++#include ++#include ++ ++struct lis302dl_info; ++ ++struct lis302dl_platform_data { ++ char *name; ++ unsigned long pin_chip_select; ++ unsigned long pin_clk; ++ unsigned long pin_mosi; ++ unsigned long pin_miso; ++ int open_drain; ++ int interrupt; ++ void (*lis302dl_suspend_io)(struct lis302dl_info *, int resuming); ++}; ++ ++struct lis302dl_info { ++ struct lis302dl_platform_data *pdata; ++ struct device *dev; ++ struct input_dev *input_dev; ++ unsigned int flags; ++ unsigned int threshold; ++ unsigned int duration; ++ u32 overruns; ++ struct { ++ unsigned int threshold; /* mg */ ++ unsigned int duration; /* ms */ ++ } wakeup; ++ ++ struct spi_device *spi; ++ u_int8_t regs[0x40]; ++}; ++ ++enum lis302dl_reg { ++ LIS302DL_REG_WHO_AM_I = 0x0f, ++ LIS302DL_REG_CTRL1 = 0x20, ++ LIS302DL_REG_CTRL2 = 0x21, ++ LIS302DL_REG_CTRL3 = 0x22, ++ LIS302DL_REG_HP_FILTER_RESET = 0x23, ++ LIS302DL_REG_STATUS = 0x27, ++ LIS302DL_REG_OUT_X = 0x29, ++ LIS302DL_REG_OUT_Y = 0x2b, ++ LIS302DL_REG_OUT_Z = 0x2d, ++ LIS302DL_REG_FF_WU_CFG_1 = 0x30, ++ LIS302DL_REG_FF_WU_SRC_1 = 0x31, ++ LIS302DL_REG_FF_WU_THS_1 = 0x32, ++ LIS302DL_REG_FF_WU_DURATION_1 = 0x33, ++ LIS302DL_REG_FF_WU_CFG_2 = 0x34, ++ LIS302DL_REG_FF_WU_SRC_2 = 0x35, ++ LIS302DL_REG_FF_WU_THS_2 = 0x36, ++ LIS302DL_REG_FF_WU_DURATION_2 = 0x37, ++ LIS302DL_REG_CLICK_CFG = 0x38, ++ LIS302DL_REG_CLICK_SRC = 0x39, ++ LIS302DL_REG_CLICK_THSY_X = 0x3b, ++ LIS302DL_REG_CLICK_THSZ = 0x3c, ++ LIS302DL_REG_CLICK_TIME_LIMIT = 0x3d, ++ LIS302DL_REG_CLICK_LATENCY = 0x3e, ++ LIS302DL_REG_CLICK_WINDOW = 0x3f, ++}; ++ ++enum lis302dl_reg_ctrl1 { ++ LIS302DL_CTRL1_Xen = 0x01, ++ LIS302DL_CTRL1_Yen = 0x02, ++ LIS302DL_CTRL1_Zen = 0x04, ++ LIS302DL_CTRL1_STM = 0x08, ++ LIS302DL_CTRL1_STP = 0x10, ++ LIS302DL_CTRL1_FS = 0x20, ++ LIS302DL_CTRL1_PD = 0x40, ++ LIS302DL_CTRL1_DR = 0x80, ++}; ++ ++enum lis302dl_reg_ctrl2 { ++ LIS302DL_CTRL2_HPC1 = 0x01, ++ LIS302DL_CTRL2_HPC2 = 0x02, ++ LIS302DL_CTRL2_HPFF1 = 0x04, ++ LIS302DL_CTRL2_HPFF2 = 0x08, ++ LIS302DL_CTRL2_FDS = 0x10, ++ LIS302DL_CTRL2_BOOT = 0x40, ++ LIS302DL_CTRL2_SIM = 0x80, ++}; ++enum lis302dl_reg_ctrl3 { ++ LIS302DL_CTRL3_PP_OD = 0x40, ++ LIS302DL_CTRL3_IHL = 0x80, ++}; ++ ++enum lis302dl_reg_status { ++ LIS302DL_STATUS_XDA = 0x01, ++ LIS302DL_STATUS_YDA = 0x02, ++ LIS302DL_STATUS_ZDA = 0x04, ++ LIS302DL_STATUS_XYZDA = 0x08, ++ LIS302DL_STATUS_XOR = 0x10, ++ LIS302DL_STATUS_YOR = 0x20, ++ LIS302DL_STATUS_ZOR = 0x40, ++ LIS302DL_STATUS_XYZOR = 0x80, ++}; ++ ++/* Wakeup/freefall interrupt defs */ ++enum lis302dl_reg_ffwucfg { ++ LIS302DL_FFWUCFG_XLIE = 0x01, ++ LIS302DL_FFWUCFG_XHIE = 0x02, ++ LIS302DL_FFWUCFG_YLIE = 0x04, ++ LIS302DL_FFWUCFG_YHIE = 0x08, ++ LIS302DL_FFWUCFG_ZLIE = 0x10, ++ LIS302DL_FFWUCFG_ZHIE = 0x20, ++ LIS302DL_FFWUCFG_LIR = 0x40, ++ LIS302DL_FFWUCFG_AOI = 0x80, ++}; ++ ++enum lis302dl_reg_ffwuths { ++ LIS302DL_FFWUTHS_DCRM = 0x80, ++}; ++ ++enum lis302dl_reg_ffwusrc { ++ LIS302DL_FFWUSRC_XL = 0x01, ++ LIS302DL_FFWUSRC_XH = 0x02, ++ LIS302DL_FFWUSRC_YL = 0x04, ++ LIS302DL_FFWUSRC_YH = 0x08, ++ LIS302DL_FFWUSRC_ZL = 0x10, ++ LIS302DL_FFWUSRC_ZH = 0x20, ++ LIS302DL_FFWUSRC_IA = 0x40, ++}; ++ ++enum lis302dl_reg_cloik_src { ++ LIS302DL_CLICKSRC_SINGLE_X = 0x01, ++ LIS302DL_CLICKSRC_DOUBLE_X = 0x02, ++ LIS302DL_CLICKSRC_SINGLE_Y = 0x04, ++ LIS302DL_CLICKSRC_DOUBLE_Y = 0x08, ++ LIS302DL_CLICKSRC_SINGLE_Z = 0x10, ++ LIS302DL_CLICKSRC_DOUBLE_Z = 0x20, ++ LIS302DL_CLICKSRC_IA = 0x40, ++}; ++ ++#define LIS302DL_WHO_AM_I_MAGIC 0x3b ++ ++#define LIS302DL_F_WUP_FF_1 0x0001 /* wake up from free fall */ ++#define LIS302DL_F_WUP_FF_2 0x0002 ++#define LIS302DL_F_WUP_FF 0x0003 ++#define LIS302DL_F_WUP_CLICK 0x0004 ++#define LIS302DL_F_POWER 0x0010 ++#define LIS302DL_F_FS 0x0020 /* ADC full scale */ ++#define LIS302DL_F_INPUT_OPEN 0x0040 /* Set if input device is opened */ ++#define LIS302DL_F_IRQ_WAKE 0x0080 /* IRQ is setup in wake mode */ ++#define LIS302DL_F_DR 0x0100 /* Data rate, 400Hz/100Hz */ ++ ++ ++#endif /* _LINUX_LIS302DL_H */ ++ +diff --git a/include/linux/spi/spi.h b/include/linux/spi/spi.h +index 97b60b3..9c5484b 100644 +--- a/include/linux/spi/spi.h ++++ b/include/linux/spi/spi.h +@@ -291,6 +291,13 @@ struct spi_master { + int (*transfer)(struct spi_device *spi, + struct spi_message *mesg); + ++ /* ++ * Synchronous non blocking transfer function. Should guarantee ++ * data availability when it returns ++ */ ++ int (*transfer_sync)(struct spi_device *spi, ++ struct spi_message *mesg); ++ + /* called on release() to free memory provided by spi_master */ + void (*cleanup)(struct spi_device *spi); + }; +@@ -542,6 +549,29 @@ static inline void spi_message_free(struct spi_message *m) + extern int spi_setup(struct spi_device *spi); + extern int spi_async(struct spi_device *spi, struct spi_message *message); + ++/** ++ * spi_non_blocking_transfer - Synchronous, non blocking transfer ++ * @spi: device with which data will be exchanged ++ * @message: describes the data transfers with optional completion handlers ++ * Context: any (irqs may be blocked, etc) ++ * ++ * Data is guaranteed to be written or read when this function returns. ++ * ++ * Note : This may not be supported by all spi masters. ++ */ ++ ++static inline int ++spi_non_blocking_transfer(struct spi_device *spi, struct spi_message *message) ++{ ++ if (unlikely(!spi->master->transfer_sync)) { ++ dev_err(&spi->master->dev, ++ "non-blocking transfers not supported\n"); ++ return -EIO; ++ } ++ ++ return spi->master->transfer_sync(spi, message); ++} ++ + /*---------------------------------------------------------------------------*/ + + /* All these synchronous SPI transfer routines are utilities layered +diff --git a/include/linux/spi/spi_bitbang.h b/include/linux/spi/spi_bitbang.h +index eed4254..f92de01 100644 +--- a/include/linux/spi/spi_bitbang.h ++++ b/include/linux/spi/spi_bitbang.h +@@ -31,6 +31,9 @@ struct spi_bitbang { + u8 use_dma; + u8 flags; /* extra spi->mode support */ + ++ /* Support for synchronous non blocking transfers */ ++ int non_blocking_transfer; ++ + struct spi_master *master; + + /* setup_transfer() changes clock and/or wordsize to match settings +@@ -62,6 +65,8 @@ extern void spi_bitbang_cleanup(struct spi_device *spi); + extern int spi_bitbang_transfer(struct spi_device *spi, struct spi_message *m); + extern int spi_bitbang_setup_transfer(struct spi_device *spi, + struct spi_transfer *t); ++extern int spi_bitbang_transfer_sync(struct spi_device *spi, ++ struct spi_message *m); + + /* start or stop queue processing */ + extern int spi_bitbang_start(struct spi_bitbang *spi); +-- +1.7.0.4 + diff --git a/recipes/linux/linux-openmoko-2.6.32/0017-accels.patch.patch b/recipes/linux/linux-openmoko-2.6.32/0017-accels.patch.patch deleted file mode 100644 index 16f379d055..0000000000 --- a/recipes/linux/linux-openmoko-2.6.32/0017-accels.patch.patch +++ /dev/null @@ -1,1759 +0,0 @@ -From a08be3ba79daf13baca6de98249c8784ede31297 Mon Sep 17 00:00:00 2001 -From: Radek Polak -Date: Fri, 9 Apr 2010 09:15:40 +0200 -Subject: [PATCH 17/22] accels.patch - -adds support for accelerometers. You will need include/linux/lis302dl.h and -drivers/input/misc/lis302dl.c from andy-tracking. The patch needs -spi_bitbang_transfer_sync() and bitbang_work() to be ported correctly (some -fixes from original 2.6.32 are missing). - -Signed-off-by: Martin Jansa ---- - arch/arm/mach-s3c2410/include/mach/spi-gpio.h | 3 +- - arch/arm/mach-s3c2442/mach-gta02.c | 157 ++++ - drivers/input/misc/Kconfig | 9 + - drivers/input/misc/Makefile | 1 + - drivers/input/misc/lis302dl.c | 952 +++++++++++++++++++++++++ - drivers/spi/spi_bitbang.c | 231 ++++--- - drivers/spi/spi_s3c24xx_gpio.c | 7 +- - include/linux/lis302dl.h | 152 ++++ - include/linux/spi/spi.h | 30 + - include/linux/spi/spi_bitbang.h | 5 + - 10 files changed, 1433 insertions(+), 114 deletions(-) - create mode 100644 drivers/input/misc/lis302dl.c - create mode 100644 include/linux/lis302dl.h - -diff --git a/arch/arm/mach-s3c2410/include/mach/spi-gpio.h b/arch/arm/mach-s3c2410/include/mach/spi-gpio.h -index 980a099..0ff8949 100644 ---- a/arch/arm/mach-s3c2410/include/mach/spi-gpio.h -+++ b/arch/arm/mach-s3c2410/include/mach/spi-gpio.h -@@ -21,7 +21,8 @@ struct s3c2410_spigpio_info { - int num_chipselect; - int bus_num; - -- void (*chip_select)(struct s3c2410_spigpio_info *spi, int cs); -+ int non_blocking_transfer; -+ void (*chip_select)(struct s3c2410_spigpio_info *spi, int csid, int cs); - }; - - -diff --git a/arch/arm/mach-s3c2442/mach-gta02.c b/arch/arm/mach-s3c2442/mach-gta02.c -index b580b1b..8e3cc91 100644 ---- a/arch/arm/mach-s3c2442/mach-gta02.c -+++ b/arch/arm/mach-s3c2442/mach-gta02.c -@@ -63,6 +63,7 @@ - - #include - #include -+#include - - #include - #include -@@ -120,6 +121,22 @@ - #include - #endif - -+#define S3C2410_GPIONO(bank,offset) ((bank) + (offset)) -+ -+#define S3C2410_GPIO_BANKD (32*3) -+#define S3C2410_GPIO_BANKG (32*6) -+ -+#define S3C2410_GPG5 S3C2410_GPIONO(S3C2410_GPIO_BANKG, 5) -+#define S3C2410_GPG6 S3C2410_GPIONO(S3C2410_GPIO_BANKG, 6) -+#define S3C2410_GPG7 S3C2410_GPIONO(S3C2410_GPIO_BANKG, 7) -+#define S3C2410_GPD12 S3C2410_GPIONO(S3C2410_GPIO_BANKD, 12) -+#define S3C2410_GPD13 S3C2410_GPIONO(S3C2410_GPIO_BANKD, 13) -+ -+#define BITBANG_CS_ACTIVE 1 /* normally nCS, active low */ -+#define BITBANG_CS_INACTIVE 0 -+ -+#define S3C_SYSTEM_REV_ATAG GTA02v6_SYSTEM_REV -+ - struct pcf50633 *gta02_pcf; - - /* -@@ -776,6 +793,60 @@ const struct jbt6k74_platform_data jbt6k74_pdata = { - .gpio_reset = GTA02_GPIO_GLAMO(4), - }; - -+/*----------- SPI: Accelerometers attached to SPI of s3c244x ----------------- */ -+ -+void gta02_lis302dl_suspend_io(struct lis302dl_info *lis, int resume) -+{ -+ struct lis302dl_platform_data *pdata = lis->pdata; -+ -+ if (!resume) { -+ /* -+ * we don't want to power them with a high level -+ * because GSENSOR_3V3 is not up during suspend -+ */ -+ s3c2410_gpio_setpin(pdata->pin_chip_select, 0); -+ s3c2410_gpio_setpin(pdata->pin_clk, 0); -+ s3c2410_gpio_setpin(pdata->pin_mosi, 0); -+ /* misnomer: it is a pullDOWN in 2442 */ -+ s3c2410_gpio_pullup(pdata->pin_miso, 1); -+ return; -+ } -+ -+ /* back to normal */ -+ s3c2410_gpio_setpin(pdata->pin_chip_select, 1); -+ s3c2410_gpio_setpin(pdata->pin_clk, 1); -+ /* misnomer: it is a pullDOWN in 2442 */ -+ s3c2410_gpio_pullup(pdata->pin_miso, 0); -+ -+ s3c2410_gpio_cfgpin(pdata->pin_chip_select, S3C2410_GPIO_OUTPUT); -+ s3c2410_gpio_cfgpin(pdata->pin_clk, S3C2410_GPIO_OUTPUT); -+ s3c2410_gpio_cfgpin(pdata->pin_mosi, S3C2410_GPIO_OUTPUT); -+ s3c2410_gpio_cfgpin(pdata->pin_miso, S3C2410_GPIO_INPUT); -+ -+} -+ -+struct lis302dl_platform_data lis302_pdata_top = { -+ .name = "lis302-1 (top)", -+ .pin_chip_select= S3C2410_GPD12, -+ .pin_clk = S3C2410_GPG7, -+ .pin_mosi = S3C2410_GPG6, -+ .pin_miso = S3C2410_GPG5, -+ .interrupt = GTA02_IRQ_GSENSOR_1, -+ .open_drain = 1, /* altered at runtime by PCB rev */ -+ .lis302dl_suspend_io = gta02_lis302dl_suspend_io, -+}; -+ -+struct lis302dl_platform_data lis302_pdata_bottom = { -+ .name = "lis302-2 (bottom)", -+ .pin_chip_select= S3C2410_GPD13, -+ .pin_clk = S3C2410_GPG7, -+ .pin_mosi = S3C2410_GPG6, -+ .pin_miso = S3C2410_GPG5, -+ .interrupt = GTA02_IRQ_GSENSOR_2, -+ .open_drain = 1, /* altered at runtime by PCB rev */ -+ .lis302dl_suspend_io = gta02_lis302dl_suspend_io, -+}; -+ - static struct spi_board_info gta02_spi_board_info[] = { - { - .modalias = "jbt6k74", -@@ -786,6 +857,81 @@ static struct spi_board_info gta02_spi_board_info[] = { - .bus_num = 2, - .chip_select = 0 - }, -+ { -+ .modalias = "lis302dl", -+ /* platform_data */ -+ .platform_data = &lis302_pdata_top, -+ /* controller_data */ -+ /* irq */ -+ .max_speed_hz = 100 * 1000, -+ .bus_num = 3, -+ .chip_select = 0, -+ }, -+ { -+ .modalias = "lis302dl", -+ /* platform_data */ -+ .platform_data = &lis302_pdata_bottom, -+ /* controller_data */ -+ /* irq */ -+ .max_speed_hz = 100 * 1000, -+ .bus_num = 3, -+ .chip_select = 1, -+ }, -+}; -+ -+static void gta02_lis302_chip_select(struct s3c2410_spigpio_info *info, int csid, int cs) -+{ -+ -+ /* -+ * Huh... "quirk"... CS on this device is not really "CS" like you can -+ * expect. -+ * -+ * When it is 0 it selects SPI interface mode. -+ * When it is 1 it selects I2C interface mode. -+ * -+ * Because we have 2 devices on one interface we have to make sure -+ * that the "disabled" device (actually in I2C mode) don't think we're -+ * talking to it. -+ * -+ * When we talk to the "enabled" device, the "disabled" device sees -+ * the clocks as I2C clocks, creating havoc. -+ * -+ * I2C sees MOSI going LOW while CLK HIGH as a START action, thus we -+ * must ensure this is never issued. -+ */ -+ -+ int cs_gpio, other_cs_gpio; -+ -+ cs_gpio = csid ? S3C2410_GPD13 : S3C2410_GPD12; -+ other_cs_gpio = (1 - csid) ? S3C2410_GPD13 : S3C2410_GPD12; -+ -+ -+ if (cs == BITBANG_CS_ACTIVE) { -+ s3c2410_gpio_setpin(other_cs_gpio, 1); -+ s3c2410_gpio_setpin(cs_gpio, 1); -+ s3c2410_gpio_setpin(info->pin_clk, 1); -+ s3c2410_gpio_setpin(cs_gpio, 0); -+ } else { -+ s3c2410_gpio_setpin(cs_gpio, 1); -+ s3c2410_gpio_setpin(other_cs_gpio, 1); -+ } -+} -+ -+static struct s3c2410_spigpio_info gta02_spigpio_cfg = { -+ .pin_clk = S3C2410_GPG7, -+ .pin_mosi = S3C2410_GPG6, -+ .pin_miso = S3C2410_GPG5, -+ .bus_num = 3, -+ .num_chipselect = 2, -+ .chip_select = gta02_lis302_chip_select, -+ .non_blocking_transfer = 1, -+}; -+ -+static struct platform_device gta02_spi_gpio_dev = { -+ .name = "spi_s3c24xx_gpio", -+ .dev = { -+ .platform_data = >a02_spigpio_cfg, -+ }, - }; - - /* BQ27000 Battery */ -@@ -1136,6 +1282,7 @@ static struct platform_device *gta02_devices[] __initdata = { - static struct platform_device *gta02_devices_pmu_children[] = { - &s3c_device_ts, - >a02_glamo_dev, -+ >a02_spi_gpio_dev, - &s3c_device_timer[2], - >a02_hdq_device, - >a02_gps_userspace_consumer -@@ -1362,6 +1509,16 @@ static void __init gta02_machine_init(void) - /* Set the panic callback to make AUX LED blink at ~5Hz. */ - panic_blink = gta02_panic_blink; - -+ switch (S3C_SYSTEM_REV_ATAG) { -+ case GTA02v6_SYSTEM_REV: -+ /* we need push-pull interrupt from motion sensors */ -+ lis302_pdata_top.open_drain = 0; -+ lis302_pdata_bottom.open_drain = 0; -+ break; -+ default: -+ break; -+ } -+ - s3c_device_ts.name = "s3c2440-ts"; - - bus_register_notifier(&platform_bus_type, >a02_device_register_notifier); -diff --git a/drivers/input/misc/Kconfig b/drivers/input/misc/Kconfig -index a9bb254..2e9bc5d 100644 ---- a/drivers/input/misc/Kconfig -+++ b/drivers/input/misc/Kconfig -@@ -317,4 +317,13 @@ config INPUT_PCAP - To compile this driver as a module, choose M here: the - module will be called pcap_keys. - -+config INPUT_LIS302DL -+ tristate "STmicro LIS302DL 3-axis accelerometer" -+ depends on SPI_MASTER -+ help -+ SPI driver for the STmicro LIS302DL 3-axis accelerometer. -+ -+ The userspece interface is a 3-axis (X/Y/Z) relative movement -+ Linux input device, reporting REL_[XYZ] events. -+ - endif -diff --git a/drivers/input/misc/Makefile b/drivers/input/misc/Makefile -index a8b8485..7e63293 100644 ---- a/drivers/input/misc/Makefile -+++ b/drivers/input/misc/Makefile -@@ -30,4 +30,5 @@ obj-$(CONFIG_INPUT_WINBOND_CIR) += winbond-cir.o - obj-$(CONFIG_INPUT_WISTRON_BTNS) += wistron_btns.o - obj-$(CONFIG_INPUT_WM831X_ON) += wm831x-on.o - obj-$(CONFIG_INPUT_YEALINK) += yealink.o -+obj-$(CONFIG_INPUT_LIS302DL) += lis302dl.o - -diff --git a/drivers/input/misc/lis302dl.c b/drivers/input/misc/lis302dl.c -new file mode 100644 -index 0000000..d345bfb ---- /dev/null -+++ b/drivers/input/misc/lis302dl.c -@@ -0,0 +1,952 @@ -+/* Linux kernel driver for the ST LIS302D 3-axis accelerometer -+ * -+ * Copyright (C) 2007-2008 by Openmoko, Inc. -+ * Author: Harald Welte -+ * converted to private bitbang by: -+ * Andy Green -+ * ability to set acceleration threshold added by: -+ * Simon Kagstrom -+ * All rights reserved. -+ * -+ * This program is free software; you can redistribute it and/or -+ * modify it under the terms of the GNU General Public License as -+ * published by the Free Software Foundation; either version 2 of -+ * the License, or (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, -+ * MA 02111-1307 USA -+ * -+ * TODO -+ * * statistics for overflow events -+ * * configuration interface (sysfs) for -+ * * enable/disable x/y/z axis data ready -+ * * enable/disable resume from freee fall / click -+ * * free fall / click parameters -+ * * high pass filter parameters -+ */ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#include -+ -+/* Utility functions */ -+static u8 __reg_read(struct lis302dl_info *lis, u8 reg) -+{ -+ struct spi_message msg; -+ struct spi_transfer t; -+ u8 data[2] = {0xc0 | reg}; -+ int rc; -+ -+ spi_message_init(&msg); -+ memset(&t, 0, sizeof t); -+ t.len = 2; -+ spi_message_add_tail(&t, &msg); -+ t.tx_buf = &data[0]; -+ t.rx_buf = &data[0]; -+ -+ /* Should complete without blocking */ -+ rc = spi_non_blocking_transfer(lis->spi, &msg); -+ if (rc < 0) { -+ dev_err(lis->dev, "Error reading register\n"); -+ return rc; -+ } -+ -+ return data[1]; -+} -+ -+static void __reg_write(struct lis302dl_info *lis, u8 reg, u8 val) -+{ -+ struct spi_message msg; -+ struct spi_transfer t; -+ u8 data[2] = {reg, val}; -+ -+ spi_message_init(&msg); -+ memset(&t, 0, sizeof t); -+ t.len = 2; -+ spi_message_add_tail(&t, &msg); -+ t.tx_buf = &data[0]; -+ t.rx_buf = &data[0]; -+ -+ /* Completes without blocking */ -+ if (spi_non_blocking_transfer(lis->spi, &msg) < 0) -+ dev_err(lis->dev, "Error writing register\n"); -+} -+ -+static void __reg_set_bit_mask(struct lis302dl_info *lis, u8 reg, u8 mask, -+ u8 val) -+{ -+ u_int8_t tmp; -+ -+ val &= mask; -+ -+ tmp = __reg_read(lis, reg); -+ tmp &= ~mask; -+ tmp |= val; -+ __reg_write(lis, reg, tmp); -+} -+ -+static int __ms_to_duration(struct lis302dl_info *lis, int ms) -+{ -+ /* If we have 400 ms sampling rate, the stepping is 2.5 ms, -+ * on 100 ms the stepping is 10ms */ -+ if (lis->flags & LIS302DL_F_DR) -+ return min((ms * 10) / 25, 637); -+ -+ return min(ms / 10, 2550); -+} -+ -+static int __duration_to_ms(struct lis302dl_info *lis, int duration) -+{ -+ if (lis->flags & LIS302DL_F_DR) -+ return (duration * 25) / 10; -+ -+ return duration * 10; -+} -+ -+static u8 __mg_to_threshold(struct lis302dl_info *lis, int mg) -+{ -+ /* If FS is set each bit is 71mg, otherwise 18mg. The THS register -+ * has 7 bits for the threshold value */ -+ if (lis->flags & LIS302DL_F_FS) -+ return min(mg / 71, 127); -+ -+ return min(mg / 18, 127); -+} -+ -+static int __threshold_to_mg(struct lis302dl_info *lis, u8 threshold) -+{ -+ if (lis->flags & LIS302DL_F_FS) -+ return threshold * 71; -+ -+ return threshold * 18; -+} -+ -+/* interrupt handling related */ -+ -+enum lis302dl_intmode { -+ LIS302DL_INTMODE_GND = 0x00, -+ LIS302DL_INTMODE_FF_WU_1 = 0x01, -+ LIS302DL_INTMODE_FF_WU_2 = 0x02, -+ LIS302DL_INTMODE_FF_WU_12 = 0x03, -+ LIS302DL_INTMODE_DATA_READY = 0x04, -+ LIS302DL_INTMODE_CLICK = 0x07, -+}; -+ -+static void __lis302dl_int_mode(struct device *dev, int int_pin, -+ enum lis302dl_intmode mode) -+{ -+ struct lis302dl_info *lis = dev_get_drvdata(dev); -+ -+ switch (int_pin) { -+ case 1: -+ __reg_set_bit_mask(lis, LIS302DL_REG_CTRL3, 0x07, mode); -+ break; -+ case 2: -+ __reg_set_bit_mask(lis, LIS302DL_REG_CTRL3, 0x38, mode << 3); -+ break; -+ default: -+ BUG(); -+ } -+} -+ -+static void __enable_wakeup(struct lis302dl_info *lis) -+{ -+ __reg_write(lis, LIS302DL_REG_CTRL1, 0); -+ -+ /* First zero to get to a known state */ -+ __reg_write(lis, LIS302DL_REG_FF_WU_CFG_1, LIS302DL_FFWUCFG_XHIE | -+ LIS302DL_FFWUCFG_YHIE | LIS302DL_FFWUCFG_ZHIE | -+ LIS302DL_FFWUCFG_LIR); -+ __reg_write(lis, LIS302DL_REG_FF_WU_THS_1, -+ __mg_to_threshold(lis, lis->wakeup.threshold)); -+ __reg_write(lis, LIS302DL_REG_FF_WU_DURATION_1, -+ __ms_to_duration(lis, lis->wakeup.duration)); -+ -+ /* Route the interrupt for wakeup */ -+ __lis302dl_int_mode(lis->dev, 1, -+ LIS302DL_INTMODE_FF_WU_1); -+ -+ __reg_read(lis, LIS302DL_REG_HP_FILTER_RESET); -+ __reg_read(lis, LIS302DL_REG_OUT_X); -+ __reg_read(lis, LIS302DL_REG_OUT_Y); -+ __reg_read(lis, LIS302DL_REG_OUT_Z); -+ __reg_read(lis, LIS302DL_REG_STATUS); -+ __reg_read(lis, LIS302DL_REG_FF_WU_SRC_1); -+ __reg_read(lis, LIS302DL_REG_FF_WU_SRC_2); -+ __reg_write(lis, LIS302DL_REG_CTRL1, LIS302DL_CTRL1_PD | 7); -+} -+ -+static void __enable_data_collection(struct lis302dl_info *lis) -+{ -+ u_int8_t ctrl1 = LIS302DL_CTRL1_PD | LIS302DL_CTRL1_Xen | -+ LIS302DL_CTRL1_Yen | LIS302DL_CTRL1_Zen; -+ -+ /* make sure we're powered up and generate data ready */ -+ __reg_set_bit_mask(lis, LIS302DL_REG_CTRL1, ctrl1, ctrl1); -+ -+ /* If the threshold is zero, let the device generated an interrupt -+ * on each datum */ -+ if (lis->threshold == 0) { -+ __reg_write(lis, LIS302DL_REG_CTRL2, 0); -+ __lis302dl_int_mode(lis->dev, 1, LIS302DL_INTMODE_DATA_READY); -+ __lis302dl_int_mode(lis->dev, 2, LIS302DL_INTMODE_DATA_READY); -+ } else { -+ __reg_write(lis, LIS302DL_REG_CTRL2, -+ LIS302DL_CTRL2_HPFF1); -+ __reg_write(lis, LIS302DL_REG_FF_WU_THS_1, -+ __mg_to_threshold(lis, lis->threshold)); -+ __reg_write(lis, LIS302DL_REG_FF_WU_DURATION_1, -+ __ms_to_duration(lis, lis->duration)); -+ -+ /* Clear the HP filter "starting point" */ -+ __reg_read(lis, LIS302DL_REG_HP_FILTER_RESET); -+ __reg_write(lis, LIS302DL_REG_FF_WU_CFG_1, -+ LIS302DL_FFWUCFG_XHIE | LIS302DL_FFWUCFG_YHIE | -+ LIS302DL_FFWUCFG_ZHIE | LIS302DL_FFWUCFG_LIR); -+ __lis302dl_int_mode(lis->dev, 1, LIS302DL_INTMODE_FF_WU_12); -+ __lis302dl_int_mode(lis->dev, 2, LIS302DL_INTMODE_FF_WU_12); -+ } -+} -+ -+#if 0 -+static void _report_btn_single(struct input_dev *inp, int btn) -+{ -+ input_report_key(inp, btn, 1); -+ input_sync(inp); -+ input_report_key(inp, btn, 0); -+} -+ -+static void _report_btn_double(struct input_dev *inp, int btn) -+{ -+ input_report_key(inp, btn, 1); -+ input_sync(inp); -+ input_report_key(inp, btn, 0); -+ input_sync(inp); -+ input_report_key(inp, btn, 1); -+ input_sync(inp); -+ input_report_key(inp, btn, 0); -+} -+#endif -+ -+ -+static void lis302dl_bitbang_read_sample(struct lis302dl_info *lis) -+{ -+ u8 data[(LIS302DL_REG_OUT_Z - LIS302DL_REG_STATUS) + 2] = {0xC0 | LIS302DL_REG_STATUS}; -+ u8 *read = data + 1; -+ unsigned long flags; -+ int mg_per_sample = __threshold_to_mg(lis, 1); -+ struct spi_message msg; -+ struct spi_transfer t; -+ -+ spi_message_init(&msg); -+ memset(&t, 0, sizeof t); -+ t.len = sizeof(data); -+ spi_message_add_tail(&t, &msg); -+ t.tx_buf = &data[0]; -+ t.rx_buf = &data[0]; -+ -+ /* grab the set of register containing status and XYZ data */ -+ -+ local_irq_save(flags); -+ -+ /* Should complete without blocking */ -+ if (spi_non_blocking_transfer(lis->spi, &msg) < 0) -+ dev_err(lis->dev, "Error reading registers\n"); -+ -+ local_irq_restore(flags); -+ -+ /* -+ * at the minute the test below fails 50% of the time due to -+ * a problem with level interrupts causing ISRs to get called twice. -+ * This is a workaround for that, but actually this test is still -+ * valid and the information can be used for overrrun stats. -+ */ -+ -+ /* has any kind of overrun been observed by the lis302dl? */ -+ if (read[0] & (LIS302DL_STATUS_XOR | -+ LIS302DL_STATUS_YOR | -+ LIS302DL_STATUS_ZOR)) -+ lis->overruns++; -+ -+ /* we have a valid sample set? */ -+ if (read[0] & LIS302DL_STATUS_XYZDA) { -+ input_report_abs(lis->input_dev, ABS_X, mg_per_sample * -+ (s8)read[LIS302DL_REG_OUT_X - LIS302DL_REG_STATUS]); -+ input_report_abs(lis->input_dev, ABS_Y, mg_per_sample * -+ (s8)read[LIS302DL_REG_OUT_Y - LIS302DL_REG_STATUS]); -+ input_report_abs(lis->input_dev, ABS_Z, mg_per_sample * -+ (s8)read[LIS302DL_REG_OUT_Z - LIS302DL_REG_STATUS]); -+ -+ input_sync(lis->input_dev); -+ } -+ -+ if (lis->threshold) -+ /* acknowledge the wakeup source */ -+ __reg_read(lis, LIS302DL_REG_FF_WU_SRC_1); -+} -+ -+static irqreturn_t lis302dl_interrupt(int irq, void *_lis) -+{ -+ struct lis302dl_info *lis = _lis; -+ -+ lis302dl_bitbang_read_sample(lis); -+ return IRQ_HANDLED; -+} -+ -+/* sysfs */ -+ -+static ssize_t show_overruns(struct device *dev, struct device_attribute *attr, -+ char *buf) -+{ -+ struct lis302dl_info *lis = dev_get_drvdata(dev); -+ -+ return sprintf(buf, "%u\n", lis->overruns); -+} -+ -+static DEVICE_ATTR(overruns, S_IRUGO, show_overruns, NULL); -+ -+static ssize_t show_rate(struct device *dev, struct device_attribute *attr, -+ char *buf) -+{ -+ struct lis302dl_info *lis = dev_get_drvdata(dev); -+ u8 ctrl1; -+ unsigned long flags; -+ -+ local_irq_save(flags); -+ ctrl1 = __reg_read(lis, LIS302DL_REG_CTRL1); -+ local_irq_restore(flags); -+ -+ return sprintf(buf, "%d\n", ctrl1 & LIS302DL_CTRL1_DR ? 400 : 100); -+} -+ -+static ssize_t set_rate(struct device *dev, struct device_attribute *attr, -+ const char *buf, size_t count) -+{ -+ struct lis302dl_info *lis = dev_get_drvdata(dev); -+ unsigned long flags; -+ -+ local_irq_save(flags); -+ -+ if (!strcmp(buf, "400\n")) { -+ __reg_set_bit_mask(lis, LIS302DL_REG_CTRL1, LIS302DL_CTRL1_DR, -+ LIS302DL_CTRL1_DR); -+ lis->flags |= LIS302DL_F_DR; -+ } else { -+ __reg_set_bit_mask(lis, LIS302DL_REG_CTRL1, LIS302DL_CTRL1_DR, -+ 0); -+ lis->flags &= ~LIS302DL_F_DR; -+ } -+ local_irq_restore(flags); -+ -+ return count; -+} -+ -+static DEVICE_ATTR(sample_rate, S_IRUGO | S_IWUSR, show_rate, set_rate); -+ -+static ssize_t show_scale(struct device *dev, struct device_attribute *attr, -+ char *buf) -+{ -+ struct lis302dl_info *lis = dev_get_drvdata(dev); -+ u_int8_t ctrl1; -+ unsigned long flags; -+ -+ local_irq_save(flags); -+ ctrl1 = __reg_read(lis, LIS302DL_REG_CTRL1); -+ local_irq_restore(flags); -+ -+ return sprintf(buf, "%s\n", ctrl1 & LIS302DL_CTRL1_FS ? "9.2" : "2.3"); -+} -+ -+static ssize_t set_scale(struct device *dev, struct device_attribute *attr, -+ const char *buf, size_t count) -+{ -+ struct lis302dl_info *lis = dev_get_drvdata(dev); -+ unsigned long flags; -+ -+ local_irq_save(flags); -+ -+ if (!strcmp(buf, "9.2\n")) { -+ __reg_set_bit_mask(lis, LIS302DL_REG_CTRL1, LIS302DL_CTRL1_FS, -+ LIS302DL_CTRL1_FS); -+ lis->flags |= LIS302DL_F_FS; -+ } else { -+ __reg_set_bit_mask(lis, LIS302DL_REG_CTRL1, LIS302DL_CTRL1_FS, -+ 0); -+ lis->flags &= ~LIS302DL_F_FS; -+ } -+ -+ if (lis->flags & LIS302DL_F_INPUT_OPEN) -+ __enable_data_collection(lis); -+ -+ local_irq_restore(flags); -+ -+ return count; -+} -+ -+static DEVICE_ATTR(full_scale, S_IRUGO | S_IWUSR, show_scale, set_scale); -+ -+static ssize_t show_threshold(struct device *dev, struct device_attribute *attr, -+ char *buf) -+{ -+ struct lis302dl_info *lis = dev_get_drvdata(dev); -+ -+ /* Display the device view of the threshold setting */ -+ return sprintf(buf, "%d\n", __threshold_to_mg(lis, -+ __mg_to_threshold(lis, lis->threshold))); -+} -+ -+static ssize_t set_threshold(struct device *dev, struct device_attribute *attr, -+ const char *buf, size_t count) -+{ -+ struct lis302dl_info *lis = dev_get_drvdata(dev); -+ unsigned int val; -+ -+ if (sscanf(buf, "%u\n", &val) != 1) -+ return -EINVAL; -+ /* 8g is the maximum if FS is 1 */ -+ if (val > 8000) -+ return -ERANGE; -+ -+ /* Set the threshold and write it out if the device is used */ -+ lis->threshold = val; -+ -+ if (lis->flags & LIS302DL_F_INPUT_OPEN) { -+ unsigned long flags; -+ -+ local_irq_save(flags); -+ __enable_data_collection(lis); -+ local_irq_restore(flags); -+ } -+ -+ return count; -+} -+ -+static DEVICE_ATTR(threshold, S_IRUGO | S_IWUSR, show_threshold, set_threshold); -+ -+static ssize_t show_duration(struct device *dev, struct device_attribute *attr, -+ char *buf) -+{ -+ struct lis302dl_info *lis = dev_get_drvdata(dev); -+ -+ return sprintf(buf, "%d\n", __duration_to_ms(lis, -+ __ms_to_duration(lis, lis->duration))); -+} -+ -+static ssize_t set_duration(struct device *dev, struct device_attribute *attr, -+ const char *buf, size_t count) -+{ -+ struct lis302dl_info *lis = dev_get_drvdata(dev); -+ unsigned int val; -+ -+ if (sscanf(buf, "%u\n", &val) != 1) -+ return -EINVAL; -+ if (val > 2550) -+ return -ERANGE; -+ -+ lis->duration = val; -+ if (lis->flags & LIS302DL_F_INPUT_OPEN) -+ __reg_write(lis, LIS302DL_REG_FF_WU_DURATION_1, -+ __ms_to_duration(lis, lis->duration)); -+ -+ return count; -+} -+ -+static DEVICE_ATTR(duration, S_IRUGO | S_IWUSR, show_duration, set_duration); -+ -+static ssize_t lis302dl_dump(struct device *dev, struct device_attribute *attr, -+ char *buf) -+{ -+ struct lis302dl_info *lis = dev_get_drvdata(dev); -+ int n = 0; -+ u8 reg[0x40]; -+ char *end = buf; -+ unsigned long flags; -+ -+ local_irq_save(flags); -+ -+ for (n = 0; n < sizeof(reg); n++) -+ reg[n] = __reg_read(lis, n); -+ -+ local_irq_restore(flags); -+ -+ for (n = 0; n < sizeof(reg); n += 16) { -+ hex_dump_to_buffer(reg + n, 16, 16, 1, end, 128, 0); -+ end += strlen(end); -+ *end++ = '\n'; -+ *end++ = '\0'; -+ } -+ -+ return end - buf; -+} -+static DEVICE_ATTR(dump, S_IRUGO, lis302dl_dump, NULL); -+ -+/* Configure freefall/wakeup interrupts */ -+static ssize_t set_wakeup_threshold(struct device *dev, -+ struct device_attribute *attr, const char *buf, size_t count) -+{ -+ struct lis302dl_info *lis = dev_get_drvdata(dev); -+ unsigned int threshold; -+ -+ if (sscanf(buf, "%u\n", &threshold) != 1) -+ return -EINVAL; -+ -+ if (threshold > 8000) -+ return -ERANGE; -+ -+ /* Zero turns the feature off */ -+ if (threshold == 0) { -+ if (lis->flags & LIS302DL_F_IRQ_WAKE) { -+ disable_irq_wake(lis->pdata->interrupt); -+ lis->flags &= ~LIS302DL_F_IRQ_WAKE; -+ } -+ -+ return count; -+ } -+ -+ lis->wakeup.threshold = threshold; -+ -+ if (!(lis->flags & LIS302DL_F_IRQ_WAKE)) { -+ enable_irq_wake(lis->pdata->interrupt); -+ lis->flags |= LIS302DL_F_IRQ_WAKE; -+ } -+ -+ return count; -+} -+ -+static ssize_t show_wakeup_threshold(struct device *dev, -+ struct device_attribute *attr, char *buf) -+{ -+ struct lis302dl_info *lis = dev_get_drvdata(dev); -+ -+ /* All events off? */ -+ if (lis->wakeup.threshold == 0) -+ return sprintf(buf, "off\n"); -+ -+ return sprintf(buf, "%u\n", lis->wakeup.threshold); -+} -+ -+static DEVICE_ATTR(wakeup_threshold, S_IRUGO | S_IWUSR, show_wakeup_threshold, -+ set_wakeup_threshold); -+ -+static ssize_t set_wakeup_duration(struct device *dev, -+ struct device_attribute *attr, const char *buf, size_t count) -+{ -+ struct lis302dl_info *lis = dev_get_drvdata(dev); -+ unsigned int duration; -+ -+ if (sscanf(buf, "%u\n", &duration) != 1) -+ return -EINVAL; -+ -+ if (duration > 2550) -+ return -ERANGE; -+ -+ lis->wakeup.duration = duration; -+ -+ return count; -+} -+ -+static ssize_t show_wakeup_duration(struct device *dev, -+ struct device_attribute *attr, char *buf) -+{ -+ struct lis302dl_info *lis = dev_get_drvdata(dev); -+ -+ return sprintf(buf, "%u\n", lis->wakeup.duration); -+} -+ -+static DEVICE_ATTR(wakeup_duration, S_IRUGO | S_IWUSR, show_wakeup_duration, -+ set_wakeup_duration); -+ -+static struct attribute *lis302dl_sysfs_entries[] = { -+ &dev_attr_sample_rate.attr, -+ &dev_attr_full_scale.attr, -+ &dev_attr_threshold.attr, -+ &dev_attr_duration.attr, -+ &dev_attr_dump.attr, -+ &dev_attr_wakeup_threshold.attr, -+ &dev_attr_wakeup_duration.attr, -+ &dev_attr_overruns.attr, -+ NULL -+}; -+ -+static struct attribute_group lis302dl_attr_group = { -+ .name = NULL, -+ .attrs = lis302dl_sysfs_entries, -+}; -+ -+/* input device handling and driver core interaction */ -+ -+static int lis302dl_input_open(struct input_dev *inp) -+{ -+ struct lis302dl_info *lis = input_get_drvdata(inp); -+ unsigned long flags; -+ -+ local_irq_save(flags); -+ -+ __enable_data_collection(lis); -+ lis->flags |= LIS302DL_F_INPUT_OPEN; -+ -+ local_irq_restore(flags); -+ -+ return 0; -+} -+ -+static void lis302dl_input_close(struct input_dev *inp) -+{ -+ struct lis302dl_info *lis = input_get_drvdata(inp); -+ u_int8_t ctrl1 = LIS302DL_CTRL1_Xen | LIS302DL_CTRL1_Yen | -+ LIS302DL_CTRL1_Zen; -+ unsigned long flags; -+ -+ local_irq_save(flags); -+ -+ /* since the input core already serializes access and makes sure we -+ * only see close() for the close of the last user, we can safely -+ * disable the data ready events */ -+ __reg_set_bit_mask(lis, LIS302DL_REG_CTRL1, ctrl1, 0x00); -+ lis->flags &= ~LIS302DL_F_INPUT_OPEN; -+ -+ /* however, don't power down the whole device if still needed */ -+ if (!(lis->flags & LIS302DL_F_WUP_FF || -+ lis->flags & LIS302DL_F_WUP_CLICK)) { -+ __reg_set_bit_mask(lis, LIS302DL_REG_CTRL1, LIS302DL_CTRL1_PD, -+ 0x00); -+ } -+ local_irq_restore(flags); -+} -+ -+/* get the device to reload its coefficients from EEPROM and wait for it -+ * to complete -+ */ -+ -+static int __lis302dl_reset_device(struct lis302dl_info *lis) -+{ -+ int timeout = 10; -+ -+ __reg_write(lis, LIS302DL_REG_CTRL2, -+ LIS302DL_CTRL2_BOOT | LIS302DL_CTRL2_FDS); -+ -+ while ((__reg_read(lis, LIS302DL_REG_CTRL2) -+ & LIS302DL_CTRL2_BOOT) && (timeout--)) -+ mdelay(1); -+ -+ return !!(timeout < 0); -+} -+ -+static int __devinit lis302dl_probe(struct spi_device *spi) -+{ -+ int rc; -+ struct lis302dl_info *lis; -+ u_int8_t wai; -+ unsigned long flags; -+ struct lis302dl_platform_data *pdata = spi->dev.platform_data; -+ -+ spi->mode = SPI_MODE_3; -+ rc = spi_setup(spi); -+ if (rc < 0) { -+ dev_err(&spi->dev, "spi_setup failed\n"); -+ return rc; -+ } -+ -+ lis = kzalloc(sizeof(*lis), GFP_KERNEL); -+ if (!lis) -+ return -ENOMEM; -+ -+ lis->dev = &spi->dev; -+ lis->spi = spi; -+ -+ dev_set_drvdata(lis->dev, lis); -+ -+ lis->pdata = pdata; -+ -+ rc = sysfs_create_group(&lis->dev->kobj, &lis302dl_attr_group); -+ if (rc) { -+ dev_err(lis->dev, "error creating sysfs group\n"); -+ goto bail_free_lis; -+ } -+ -+ /* initialize input layer details */ -+ lis->input_dev = input_allocate_device(); -+ if (!lis->input_dev) { -+ dev_err(lis->dev, "Unable to allocate input device\n"); -+ goto bail_sysfs; -+ } -+ -+ input_set_drvdata(lis->input_dev, lis); -+ lis->input_dev->name = pdata->name; -+ /* SPI Bus not defined as a valid bus for input subsystem*/ -+ lis->input_dev->id.bustype = BUS_I2C; /* lie about it */ -+ lis->input_dev->open = lis302dl_input_open; -+ lis->input_dev->close = lis302dl_input_close; -+ -+ rc = input_register_device(lis->input_dev); -+ if (rc) { -+ dev_err(lis->dev, "error %d registering input device\n", rc); -+ goto bail_inp_dev; -+ } -+ -+ local_irq_save(flags); -+ /* Configure our IO */ -+ (lis->pdata->lis302dl_suspend_io)(lis, 1); -+ -+ wai = __reg_read(lis, LIS302DL_REG_WHO_AM_I); -+ if (wai != LIS302DL_WHO_AM_I_MAGIC) { -+ dev_err(lis->dev, "unknown who_am_i signature 0x%02x\n", wai); -+ dev_set_drvdata(lis->dev, NULL); -+ rc = -ENODEV; -+ local_irq_restore(flags); -+ goto bail_inp_reg; -+ } -+ -+ set_bit(EV_ABS, lis->input_dev->evbit); -+ input_set_abs_params(lis->input_dev, ABS_X, 0, 0, 0, 0); -+ input_set_abs_params(lis->input_dev, ABS_Y, 0, 0, 0, 0); -+ input_set_abs_params(lis->input_dev, ABS_Z, 0, 0, 0, 0); -+ -+ -+ lis->threshold = 0; -+ lis->duration = 0; -+ memset(&lis->wakeup, 0, sizeof(lis->wakeup)); -+ -+ if (__lis302dl_reset_device(lis)) -+ dev_err(lis->dev, "device BOOT reload failed\n"); -+ -+ /* force us powered */ -+ __reg_write(lis, LIS302DL_REG_CTRL1, LIS302DL_CTRL1_PD | -+ LIS302DL_CTRL1_Xen | -+ LIS302DL_CTRL1_Yen | -+ LIS302DL_CTRL1_Zen); -+ mdelay(1); -+ -+ __reg_write(lis, LIS302DL_REG_CTRL2, 0); -+ __reg_write(lis, LIS302DL_REG_CTRL3, -+ LIS302DL_CTRL3_PP_OD | LIS302DL_CTRL3_IHL); -+ __reg_write(lis, LIS302DL_REG_FF_WU_THS_1, 0x0); -+ __reg_write(lis, LIS302DL_REG_FF_WU_DURATION_1, 0x00); -+ __reg_write(lis, LIS302DL_REG_FF_WU_CFG_1, 0x0); -+ -+ /* start off in powered down mode; we power up when someone opens us */ -+ __reg_write(lis, LIS302DL_REG_CTRL1, LIS302DL_CTRL1_Xen | -+ LIS302DL_CTRL1_Yen | LIS302DL_CTRL1_Zen); -+ -+ if (pdata->open_drain) -+ /* switch interrupt to open collector, active-low */ -+ __reg_write(lis, LIS302DL_REG_CTRL3, -+ LIS302DL_CTRL3_PP_OD | LIS302DL_CTRL3_IHL); -+ else -+ /* push-pull, active-low */ -+ __reg_write(lis, LIS302DL_REG_CTRL3, LIS302DL_CTRL3_IHL); -+ -+ __lis302dl_int_mode(lis->dev, 1, LIS302DL_INTMODE_GND); -+ __lis302dl_int_mode(lis->dev, 2, LIS302DL_INTMODE_GND); -+ -+ __reg_read(lis, LIS302DL_REG_STATUS); -+ __reg_read(lis, LIS302DL_REG_FF_WU_SRC_1); -+ __reg_read(lis, LIS302DL_REG_FF_WU_SRC_2); -+ __reg_read(lis, LIS302DL_REG_CLICK_SRC); -+ local_irq_restore(flags); -+ -+ dev_info(lis->dev, "Found %s\n", pdata->name); -+ -+ lis->pdata = pdata; -+ -+ set_irq_handler(lis->pdata->interrupt, handle_level_irq); -+ -+ rc = request_irq(lis->pdata->interrupt, lis302dl_interrupt, -+ IRQF_TRIGGER_LOW, "lis302dl", lis); -+ -+ if (rc < 0) { -+ dev_err(lis->dev, "error requesting IRQ %d\n", -+ lis->pdata->interrupt); -+ goto bail_inp_reg; -+ } -+ return 0; -+ -+bail_inp_reg: -+ input_unregister_device(lis->input_dev); -+bail_inp_dev: -+ input_free_device(lis->input_dev); -+bail_sysfs: -+ sysfs_remove_group(&lis->dev->kobj, &lis302dl_attr_group); -+bail_free_lis: -+ kfree(lis); -+ return rc; -+} -+ -+static int __devexit lis302dl_remove(struct spi_device *spi) -+{ -+ struct lis302dl_info *lis = dev_get_drvdata(&spi->dev); -+ unsigned long flags; -+ -+ /* Disable interrupts */ -+ if (lis->flags & LIS302DL_F_IRQ_WAKE) -+ disable_irq_wake(lis->pdata->interrupt); -+ free_irq(lis->pdata->interrupt, lis); -+ -+ /* Reset and power down the device */ -+ local_irq_save(flags); -+ __reg_write(lis, LIS302DL_REG_CTRL3, 0x00); -+ __reg_write(lis, LIS302DL_REG_CTRL2, 0x00); -+ __reg_write(lis, LIS302DL_REG_CTRL1, 0x00); -+ local_irq_restore(flags); -+ -+ /* Cleanup resources */ -+ sysfs_remove_group(&spi->dev.kobj, &lis302dl_attr_group); -+ input_unregister_device(lis->input_dev); -+ if (lis->input_dev) -+ input_free_device(lis->input_dev); -+ dev_set_drvdata(lis->dev, NULL); -+ kfree(lis); -+ -+ return 0; -+} -+ -+#ifdef CONFIG_PM -+ -+static u8 regs_to_save[] = { -+ LIS302DL_REG_CTRL2, -+ LIS302DL_REG_CTRL3, -+ LIS302DL_REG_FF_WU_CFG_1, -+ LIS302DL_REG_FF_WU_THS_1, -+ LIS302DL_REG_FF_WU_DURATION_1, -+ LIS302DL_REG_FF_WU_CFG_2, -+ LIS302DL_REG_FF_WU_THS_2, -+ LIS302DL_REG_FF_WU_DURATION_2, -+ LIS302DL_REG_CLICK_CFG, -+ LIS302DL_REG_CLICK_THSY_X, -+ LIS302DL_REG_CLICK_THSZ, -+ LIS302DL_REG_CLICK_TIME_LIMIT, -+ LIS302DL_REG_CLICK_LATENCY, -+ LIS302DL_REG_CLICK_WINDOW, -+ LIS302DL_REG_CTRL1, -+}; -+ -+static int lis302dl_suspend(struct spi_device *spi, pm_message_t state) -+{ -+ struct lis302dl_info *lis = dev_get_drvdata(&spi->dev); -+ unsigned long flags; -+ u_int8_t tmp; -+ int n; -+ -+ /* determine if we want to wake up from the accel. */ -+ if (lis->flags & LIS302DL_F_WUP_CLICK) -+ return 0; -+ -+ disable_irq(lis->pdata->interrupt); -+ local_irq_save(flags); -+ -+ /* -+ * When we share SPI over multiple sensors, there is a race here -+ * that one or more sensors will lose. In that case, the shared -+ * SPI bus GPIO will be in sleep mode and partially pulled down. So -+ * we explicitly put our IO into "wake" mode here before the final -+ * traffic to the sensor. -+ */ -+ (lis->pdata->lis302dl_suspend_io)(lis, 1); -+ -+ /* save registers */ -+ for (n = 0; n < ARRAY_SIZE(regs_to_save); n++) -+ lis->regs[regs_to_save[n]] = -+ __reg_read(lis, regs_to_save[n]); -+ -+ /* power down or enable wakeup */ -+ -+ if (lis->wakeup.threshold == 0) { -+ tmp = __reg_read(lis, LIS302DL_REG_CTRL1); -+ tmp &= ~LIS302DL_CTRL1_PD; -+ __reg_write(lis, LIS302DL_REG_CTRL1, tmp); -+ } else -+ __enable_wakeup(lis); -+ -+ /* place our IO to the device in sleep-compatible states */ -+ (lis->pdata->lis302dl_suspend_io)(lis, 0); -+ -+ local_irq_restore(flags); -+ -+ return 0; -+} -+ -+static int lis302dl_resume(struct spi_device *spi) -+{ -+ struct lis302dl_info *lis = dev_get_drvdata(&spi->dev); -+ unsigned long flags; -+ int n; -+ -+ if (lis->flags & LIS302DL_F_WUP_CLICK) -+ return 0; -+ -+ local_irq_save(flags); -+ -+ /* get our IO to the device back in operational states */ -+ (lis->pdata->lis302dl_suspend_io)(lis, 1); -+ -+ /* resume from powerdown first! */ -+ __reg_write(lis, LIS302DL_REG_CTRL1, -+ LIS302DL_CTRL1_PD | -+ LIS302DL_CTRL1_Xen | -+ LIS302DL_CTRL1_Yen | -+ LIS302DL_CTRL1_Zen); -+ mdelay(1); -+ -+ if (__lis302dl_reset_device(lis)) -+ dev_err(&spi->dev, "device BOOT reload failed\n"); -+ -+ /* restore registers after resume */ -+ for (n = 0; n < ARRAY_SIZE(regs_to_save); n++) -+ __reg_write(lis, regs_to_save[n], lis->regs[regs_to_save[n]]); -+ -+ /* if someone had us open, reset the non-wake threshold stuff */ -+ if (lis->flags & LIS302DL_F_INPUT_OPEN) -+ __enable_data_collection(lis); -+ -+ local_irq_restore(flags); -+ enable_irq(lis->pdata->interrupt); -+ -+ return 0; -+} -+#else -+#define lis302dl_suspend NULL -+#define lis302dl_resume NULL -+#endif -+ -+static struct spi_driver lis302dl_spi_driver = { -+ .driver = { -+ .name = "lis302dl", -+ .owner = THIS_MODULE, -+ }, -+ -+ .probe = lis302dl_probe, -+ .remove = __devexit_p(lis302dl_remove), -+ .suspend = lis302dl_suspend, -+ .resume = lis302dl_resume, -+}; -+ -+static int __devinit lis302dl_init(void) -+{ -+ return spi_register_driver(&lis302dl_spi_driver); -+} -+ -+static void __exit lis302dl_exit(void) -+{ -+ spi_unregister_driver(&lis302dl_spi_driver); -+} -+ -+MODULE_AUTHOR("Harald Welte "); -+MODULE_LICENSE("GPL"); -+ -+module_init(lis302dl_init); -+module_exit(lis302dl_exit); -diff --git a/drivers/spi/spi_bitbang.c b/drivers/spi/spi_bitbang.c -index f1db395..5c50329 100644 ---- a/drivers/spi/spi_bitbang.c -+++ b/drivers/spi/spi_bitbang.c -@@ -253,134 +253,139 @@ static int spi_bitbang_bufs(struct spi_device *spi, struct spi_transfer *t) - * Drivers can provide word-at-a-time i/o primitives, or provide - * transfer-at-a-time ones to leverage dma or fifo hardware. - */ --static void bitbang_work(struct work_struct *work) -+/* Synchronous non blocking transfer */ -+int -+spi_bitbang_transfer_sync(struct spi_device *spi, struct spi_message *m) - { -- struct spi_bitbang *bitbang = -- container_of(work, struct spi_bitbang, work); -- unsigned long flags; -- int do_setup = -1; -- int (*setup_transfer)(struct spi_device *, -- struct spi_transfer *); -+ struct spi_bitbang *bitbang = spi_master_get_devdata(spi->master); -+ struct spi_transfer *t; -+ unsigned long flags; -+ int cs_change = 1; -+ int status; -+ int nsecs; -+ int (*setup_transfer)(struct spi_device *, struct spi_transfer *); -+ -+ /* FIXME this is made-up ... the correct value is known to -+ * word-at-a-time bitbang code, and presumably chipselect() -+ * should enforce these requirements too? -+ */ -+ nsecs = 100; -+ cs_change = 1; -+ status = 0; -+ setup_transfer = NULL; -+ -+ local_irq_save(flags); -+ list_for_each_entry (t, &m->transfers, transfer_list) { -+ /* override or restore speed and wordsize */ -+ if (t->speed_hz || t->bits_per_word) { -+ setup_transfer = bitbang->setup_transfer; -+ if (!setup_transfer) { -+ status = -ENOPROTOOPT; -+ break; -+ } -+ } -+ if (setup_transfer) { -+ status = setup_transfer(spi, t); -+ if (status < 0) -+ break; -+ } - -- setup_transfer = bitbang->setup_transfer; -+ /* set up default clock polarity, and activate chip; -+ * this implicitly updates clock and spi modes as -+ * previously recorded for this device via setup(). -+ * (and also deselects any other chip that might be -+ * selected ...) -+ */ - -- spin_lock_irqsave(&bitbang->lock, flags); -- bitbang->busy = 1; -- while (!list_empty(&bitbang->queue)) { -- struct spi_message *m; -- struct spi_device *spi; -- unsigned nsecs; -- struct spi_transfer *t = NULL; -- unsigned tmp; -- unsigned cs_change; -- int status; -+ if (cs_change) { -+ bitbang->chipselect(spi, BITBANG_CS_ACTIVE); -+ ndelay(nsecs); -+ } - -- m = container_of(bitbang->queue.next, struct spi_message, -- queue); -- list_del_init(&m->queue); -- spin_unlock_irqrestore(&bitbang->lock, flags); -+ cs_change = t->cs_change; -+ if (!t->tx_buf && !t->rx_buf && t->len) { -+ status = -EINVAL; -+ break; -+ } - -- /* FIXME this is made-up ... the correct value is known to -- * word-at-a-time bitbang code, and presumably chipselect() -- * should enforce these requirements too? -+ /* transfer data. the lower level code handles any -+ * new dma mappings it needs. our caller always gave -+ * us dma-safe buffers. - */ -- nsecs = 100; -+ if (t->len) { -+ /* REVISIT dma API still needs a designated -+ * DMA_ADDR_INVALID; ~0 might be better. -+ */ -+ if (!m->is_dma_mapped) -+ t->rx_dma = t->tx_dma = 0; -+ status = bitbang->txrx_bufs(spi, t); -+ } - -- spi = m->spi; -- tmp = 0; -- cs_change = 1; -+ if (status > 0) -+ m->actual_length += status; -+ if (status != t->len) { -+ /* always report some kind of error */ -+ if (status >= 0) -+ status = -EREMOTEIO; -+ break; -+ } - status = 0; -+ /* protocol tweaks before next transfer */ -+ if (t->delay_usecs) -+ udelay(t->delay_usecs); -+ if (!cs_change) -+ continue; -+ if (t->transfer_list.next == &m->transfers) -+ break; -+ /* sometimes a short mid-message deselect of the chip -+ * may be needed to terminate a mode or command -+ */ -+ ndelay(nsecs); -+ bitbang->chipselect(spi, BITBANG_CS_INACTIVE); -+ ndelay(nsecs); -+ } - -- list_for_each_entry (t, &m->transfers, transfer_list) { -- -- /* override speed or wordsize? */ -- if (t->speed_hz || t->bits_per_word) -- do_setup = 1; -- -- /* init (-1) or override (1) transfer params */ -- if (do_setup != 0) { -- if (!setup_transfer) { -- status = -ENOPROTOOPT; -- break; -- } -- status = setup_transfer(spi, t); -- if (status < 0) -- break; -- } -+ m->status = status; -+ if (m->complete) -+ m->complete(m->context); - -- /* set up default clock polarity, and activate chip; -- * this implicitly updates clock and spi modes as -- * previously recorded for this device via setup(). -- * (and also deselects any other chip that might be -- * selected ...) -- */ -- if (cs_change) { -- bitbang->chipselect(spi, BITBANG_CS_ACTIVE); -- ndelay(nsecs); -- } -- cs_change = t->cs_change; -- if (!t->tx_buf && !t->rx_buf && t->len) { -- status = -EINVAL; -- break; -- } -+ /* restore speed and wordsize */ -+ if (setup_transfer) -+ setup_transfer(spi, NULL); - -- /* transfer data. the lower level code handles any -- * new dma mappings it needs. our caller always gave -- * us dma-safe buffers. -- */ -- if (t->len) { -- /* REVISIT dma API still needs a designated -- * DMA_ADDR_INVALID; ~0 might be better. -- */ -- if (!m->is_dma_mapped) -- t->rx_dma = t->tx_dma = 0; -- status = bitbang->txrx_bufs(spi, t); -- } -- if (status > 0) -- m->actual_length += status; -- if (status != t->len) { -- /* always report some kind of error */ -- if (status >= 0) -- status = -EREMOTEIO; -- break; -- } -- status = 0; -- -- /* protocol tweaks before next transfer */ -- if (t->delay_usecs) -- udelay(t->delay_usecs); -+ /* normally deactivate chipselect ... unless no error and -+ * cs_change has hinted that the next message will probably -+ * be for this chip too. -+ */ -+ if (!(status == 0 && cs_change)) { -+ ndelay(nsecs); -+ bitbang->chipselect(spi, BITBANG_CS_INACTIVE); -+ ndelay(nsecs); -+ } - -- if (!cs_change) -- continue; -- if (t->transfer_list.next == &m->transfers) -- break; -+ local_irq_restore(flags); - -- /* sometimes a short mid-message deselect of the chip -- * may be needed to terminate a mode or command -- */ -- ndelay(nsecs); -- bitbang->chipselect(spi, BITBANG_CS_INACTIVE); -- ndelay(nsecs); -- } -+ return status; -+} -+EXPORT_SYMBOL_GPL(spi_bitbang_transfer_sync); - -- m->status = status; -- m->complete(m->context); -+static void bitbang_work(struct work_struct *work) -+{ -+ struct spi_bitbang *bitbang = -+ container_of(work, struct spi_bitbang, work); -+ unsigned long flags; - -- /* restore speed and wordsize if it was overridden */ -- if (do_setup == 1) -- setup_transfer(spi, NULL); -- do_setup = 0; -+ spin_lock_irqsave(&bitbang->lock, flags); -+ bitbang->busy = 1; -+ while (!list_empty(&bitbang->queue)) { -+ struct spi_message *m; - -- /* normally deactivate chipselect ... unless no error and -- * cs_change has hinted that the next message will probably -- * be for this chip too. -- */ -- if (!(status == 0 && cs_change)) { -- ndelay(nsecs); -- bitbang->chipselect(spi, BITBANG_CS_INACTIVE); -- ndelay(nsecs); -- } -+ m = container_of(bitbang->queue.next, struct spi_message, -+ queue); -+ list_del_init(&m->queue); - -+ spin_unlock_irqrestore(&bitbang->lock, flags); -+ spi_bitbang_transfer_sync(m->spi, m); - spin_lock_irqsave(&bitbang->lock, flags); - } - bitbang->busy = 0; -@@ -455,6 +460,10 @@ int spi_bitbang_start(struct spi_bitbang *bitbang) - - if (!bitbang->master->transfer) - bitbang->master->transfer = spi_bitbang_transfer; -+ -+ if (!bitbang->master->transfer_sync && bitbang->non_blocking_transfer) -+ bitbang->master->transfer_sync = spi_bitbang_transfer_sync; -+ - if (!bitbang->txrx_bufs) { - bitbang->use_dma = 0; - bitbang->txrx_bufs = spi_bitbang_bufs; -diff --git a/drivers/spi/spi_s3c24xx_gpio.c b/drivers/spi/spi_s3c24xx_gpio.c -index bbf9371..5685b78 100644 ---- a/drivers/spi/spi_s3c24xx_gpio.c -+++ b/drivers/spi/spi_s3c24xx_gpio.c -@@ -92,7 +92,7 @@ static void s3c2410_spigpio_chipselect(struct spi_device *dev, int value) - struct s3c2410_spigpio *sg = spidev_to_sg(dev); - - if (sg->info && sg->info->chip_select) -- (sg->info->chip_select)(sg->info, value); -+ (sg->info->chip_select)(sg->info, dev->chip_select, value); - } - - static int s3c2410_spigpio_probe(struct platform_device *dev) -@@ -113,14 +113,17 @@ static int s3c2410_spigpio_probe(struct platform_device *dev) - - platform_set_drvdata(dev, sp); - -- /* copy in the plkatform data */ -+ /* copy in the platform data */ - info = sp->info = dev->dev.platform_data; - -+ master->num_chipselect = info->num_chipselect; -+ - /* setup spi bitbang adaptor */ - sp->bitbang.master = spi_master_get(master); - sp->bitbang.master->bus_num = info->bus_num; - sp->bitbang.master->num_chipselect = info->num_chipselect; - sp->bitbang.chipselect = s3c2410_spigpio_chipselect; -+ sp->bitbang.non_blocking_transfer = info->non_blocking_transfer; - - sp->bitbang.txrx_word[SPI_MODE_0] = s3c2410_spigpio_txrx_mode0; - sp->bitbang.txrx_word[SPI_MODE_1] = s3c2410_spigpio_txrx_mode1; -diff --git a/include/linux/lis302dl.h b/include/linux/lis302dl.h -new file mode 100644 -index 0000000..0c1fc30 ---- /dev/null -+++ b/include/linux/lis302dl.h -@@ -0,0 +1,152 @@ -+#ifndef _LINUX_LIS302DL_H -+#define _LINUX_LIS302DL_H -+ -+#include -+#include -+#include -+#include -+ -+struct lis302dl_info; -+ -+struct lis302dl_platform_data { -+ char *name; -+ unsigned long pin_chip_select; -+ unsigned long pin_clk; -+ unsigned long pin_mosi; -+ unsigned long pin_miso; -+ int open_drain; -+ int interrupt; -+ void (*lis302dl_suspend_io)(struct lis302dl_info *, int resuming); -+}; -+ -+struct lis302dl_info { -+ struct lis302dl_platform_data *pdata; -+ struct device *dev; -+ struct input_dev *input_dev; -+ unsigned int flags; -+ unsigned int threshold; -+ unsigned int duration; -+ u32 overruns; -+ struct { -+ unsigned int threshold; /* mg */ -+ unsigned int duration; /* ms */ -+ } wakeup; -+ -+ struct spi_device *spi; -+ u_int8_t regs[0x40]; -+}; -+ -+enum lis302dl_reg { -+ LIS302DL_REG_WHO_AM_I = 0x0f, -+ LIS302DL_REG_CTRL1 = 0x20, -+ LIS302DL_REG_CTRL2 = 0x21, -+ LIS302DL_REG_CTRL3 = 0x22, -+ LIS302DL_REG_HP_FILTER_RESET = 0x23, -+ LIS302DL_REG_STATUS = 0x27, -+ LIS302DL_REG_OUT_X = 0x29, -+ LIS302DL_REG_OUT_Y = 0x2b, -+ LIS302DL_REG_OUT_Z = 0x2d, -+ LIS302DL_REG_FF_WU_CFG_1 = 0x30, -+ LIS302DL_REG_FF_WU_SRC_1 = 0x31, -+ LIS302DL_REG_FF_WU_THS_1 = 0x32, -+ LIS302DL_REG_FF_WU_DURATION_1 = 0x33, -+ LIS302DL_REG_FF_WU_CFG_2 = 0x34, -+ LIS302DL_REG_FF_WU_SRC_2 = 0x35, -+ LIS302DL_REG_FF_WU_THS_2 = 0x36, -+ LIS302DL_REG_FF_WU_DURATION_2 = 0x37, -+ LIS302DL_REG_CLICK_CFG = 0x38, -+ LIS302DL_REG_CLICK_SRC = 0x39, -+ LIS302DL_REG_CLICK_THSY_X = 0x3b, -+ LIS302DL_REG_CLICK_THSZ = 0x3c, -+ LIS302DL_REG_CLICK_TIME_LIMIT = 0x3d, -+ LIS302DL_REG_CLICK_LATENCY = 0x3e, -+ LIS302DL_REG_CLICK_WINDOW = 0x3f, -+}; -+ -+enum lis302dl_reg_ctrl1 { -+ LIS302DL_CTRL1_Xen = 0x01, -+ LIS302DL_CTRL1_Yen = 0x02, -+ LIS302DL_CTRL1_Zen = 0x04, -+ LIS302DL_CTRL1_STM = 0x08, -+ LIS302DL_CTRL1_STP = 0x10, -+ LIS302DL_CTRL1_FS = 0x20, -+ LIS302DL_CTRL1_PD = 0x40, -+ LIS302DL_CTRL1_DR = 0x80, -+}; -+ -+enum lis302dl_reg_ctrl2 { -+ LIS302DL_CTRL2_HPC1 = 0x01, -+ LIS302DL_CTRL2_HPC2 = 0x02, -+ LIS302DL_CTRL2_HPFF1 = 0x04, -+ LIS302DL_CTRL2_HPFF2 = 0x08, -+ LIS302DL_CTRL2_FDS = 0x10, -+ LIS302DL_CTRL2_BOOT = 0x40, -+ LIS302DL_CTRL2_SIM = 0x80, -+}; -+enum lis302dl_reg_ctrl3 { -+ LIS302DL_CTRL3_PP_OD = 0x40, -+ LIS302DL_CTRL3_IHL = 0x80, -+}; -+ -+enum lis302dl_reg_status { -+ LIS302DL_STATUS_XDA = 0x01, -+ LIS302DL_STATUS_YDA = 0x02, -+ LIS302DL_STATUS_ZDA = 0x04, -+ LIS302DL_STATUS_XYZDA = 0x08, -+ LIS302DL_STATUS_XOR = 0x10, -+ LIS302DL_STATUS_YOR = 0x20, -+ LIS302DL_STATUS_ZOR = 0x40, -+ LIS302DL_STATUS_XYZOR = 0x80, -+}; -+ -+/* Wakeup/freefall interrupt defs */ -+enum lis302dl_reg_ffwucfg { -+ LIS302DL_FFWUCFG_XLIE = 0x01, -+ LIS302DL_FFWUCFG_XHIE = 0x02, -+ LIS302DL_FFWUCFG_YLIE = 0x04, -+ LIS302DL_FFWUCFG_YHIE = 0x08, -+ LIS302DL_FFWUCFG_ZLIE = 0x10, -+ LIS302DL_FFWUCFG_ZHIE = 0x20, -+ LIS302DL_FFWUCFG_LIR = 0x40, -+ LIS302DL_FFWUCFG_AOI = 0x80, -+}; -+ -+enum lis302dl_reg_ffwuths { -+ LIS302DL_FFWUTHS_DCRM = 0x80, -+}; -+ -+enum lis302dl_reg_ffwusrc { -+ LIS302DL_FFWUSRC_XL = 0x01, -+ LIS302DL_FFWUSRC_XH = 0x02, -+ LIS302DL_FFWUSRC_YL = 0x04, -+ LIS302DL_FFWUSRC_YH = 0x08, -+ LIS302DL_FFWUSRC_ZL = 0x10, -+ LIS302DL_FFWUSRC_ZH = 0x20, -+ LIS302DL_FFWUSRC_IA = 0x40, -+}; -+ -+enum lis302dl_reg_cloik_src { -+ LIS302DL_CLICKSRC_SINGLE_X = 0x01, -+ LIS302DL_CLICKSRC_DOUBLE_X = 0x02, -+ LIS302DL_CLICKSRC_SINGLE_Y = 0x04, -+ LIS302DL_CLICKSRC_DOUBLE_Y = 0x08, -+ LIS302DL_CLICKSRC_SINGLE_Z = 0x10, -+ LIS302DL_CLICKSRC_DOUBLE_Z = 0x20, -+ LIS302DL_CLICKSRC_IA = 0x40, -+}; -+ -+#define LIS302DL_WHO_AM_I_MAGIC 0x3b -+ -+#define LIS302DL_F_WUP_FF_1 0x0001 /* wake up from free fall */ -+#define LIS302DL_F_WUP_FF_2 0x0002 -+#define LIS302DL_F_WUP_FF 0x0003 -+#define LIS302DL_F_WUP_CLICK 0x0004 -+#define LIS302DL_F_POWER 0x0010 -+#define LIS302DL_F_FS 0x0020 /* ADC full scale */ -+#define LIS302DL_F_INPUT_OPEN 0x0040 /* Set if input device is opened */ -+#define LIS302DL_F_IRQ_WAKE 0x0080 /* IRQ is setup in wake mode */ -+#define LIS302DL_F_DR 0x0100 /* Data rate, 400Hz/100Hz */ -+ -+ -+#endif /* _LINUX_LIS302DL_H */ -+ -diff --git a/include/linux/spi/spi.h b/include/linux/spi/spi.h -index 97b60b3..9c5484b 100644 ---- a/include/linux/spi/spi.h -+++ b/include/linux/spi/spi.h -@@ -291,6 +291,13 @@ struct spi_master { - int (*transfer)(struct spi_device *spi, - struct spi_message *mesg); - -+ /* -+ * Synchronous non blocking transfer function. Should guarantee -+ * data availability when it returns -+ */ -+ int (*transfer_sync)(struct spi_device *spi, -+ struct spi_message *mesg); -+ - /* called on release() to free memory provided by spi_master */ - void (*cleanup)(struct spi_device *spi); - }; -@@ -542,6 +549,29 @@ static inline void spi_message_free(struct spi_message *m) - extern int spi_setup(struct spi_device *spi); - extern int spi_async(struct spi_device *spi, struct spi_message *message); - -+/** -+ * spi_non_blocking_transfer - Synchronous, non blocking transfer -+ * @spi: device with which data will be exchanged -+ * @message: describes the data transfers with optional completion handlers -+ * Context: any (irqs may be blocked, etc) -+ * -+ * Data is guaranteed to be written or read when this function returns. -+ * -+ * Note : This may not be supported by all spi masters. -+ */ -+ -+static inline int -+spi_non_blocking_transfer(struct spi_device *spi, struct spi_message *message) -+{ -+ if (unlikely(!spi->master->transfer_sync)) { -+ dev_err(&spi->master->dev, -+ "non-blocking transfers not supported\n"); -+ return -EIO; -+ } -+ -+ return spi->master->transfer_sync(spi, message); -+} -+ - /*---------------------------------------------------------------------------*/ - - /* All these synchronous SPI transfer routines are utilities layered -diff --git a/include/linux/spi/spi_bitbang.h b/include/linux/spi/spi_bitbang.h -index eed4254..f92de01 100644 ---- a/include/linux/spi/spi_bitbang.h -+++ b/include/linux/spi/spi_bitbang.h -@@ -31,6 +31,9 @@ struct spi_bitbang { - u8 use_dma; - u8 flags; /* extra spi->mode support */ - -+ /* Support for synchronous non blocking transfers */ -+ int non_blocking_transfer; -+ - struct spi_master *master; - - /* setup_transfer() changes clock and/or wordsize to match settings -@@ -62,6 +65,8 @@ extern void spi_bitbang_cleanup(struct spi_device *spi); - extern int spi_bitbang_transfer(struct spi_device *spi, struct spi_message *m); - extern int spi_bitbang_setup_transfer(struct spi_device *spi, - struct spi_transfer *t); -+extern int spi_bitbang_transfer_sync(struct spi_device *spi, -+ struct spi_message *m); - - /* start or stop queue processing */ - extern int spi_bitbang_start(struct spi_bitbang *spi); --- -1.7.0.4 - diff --git a/recipes/linux/linux-openmoko-2.6.32/0017-usbhost.patch.patch b/recipes/linux/linux-openmoko-2.6.32/0017-usbhost.patch.patch new file mode 100644 index 0000000000..16ed3746fd --- /dev/null +++ b/recipes/linux/linux-openmoko-2.6.32/0017-usbhost.patch.patch @@ -0,0 +1,233 @@ +From d71534de6ab5e132d0798df30408042c229cbb62 Mon Sep 17 00:00:00 2001 +From: Radek Polak +Date: Fri, 9 Apr 2010 09:17:28 +0200 +Subject: [PATCH 18/22] usbhost.patch + +adds support for usb host mode and adds usb host pm sysfs node. I just copied +and modified how modem is powered up and backported changes in ohci-s3c2410.c. +No idea if this is the right approach, but it works - my usb keyboard is now +working after: + +echo 1 > /sys/devices/platform/s3c2440-i2c/i2c-0/0-0073/pcf50633-gpio/reg- +fixed-voltage.2/gta02-pm-usbhost.0/power_on +echo host > /sys/devices/platform/s3c2410-ohci/usb_mode + +Signed-off-by: Martin Jansa +--- + arch/arm/mach-s3c2442/Makefile | 1 + + arch/arm/mach-s3c2442/mach-gta02.c | 50 ++++++++++++++++++++++++++++++++++- + drivers/usb/host/ohci-s3c2410.c | 48 ++++++++++++++++++++++++++++++++++ + 3 files changed, 97 insertions(+), 2 deletions(-) + +diff --git a/arch/arm/mach-s3c2442/Makefile b/arch/arm/mach-s3c2442/Makefile +index 6247ca0..3e7145c 100644 +--- a/arch/arm/mach-s3c2442/Makefile ++++ b/arch/arm/mach-s3c2442/Makefile +@@ -17,6 +17,7 @@ obj-$(CONFIG_MACH_NEO1973_GTA02) += mach-gta02.o \ + gta02-pm-bt.o \ + gta02-pm-gps.o \ + gta02-pm-gsm.o \ ++ gta02-pm-usbhost.o \ + gta02-pm-wlan.o + # Machine support + +diff --git a/arch/arm/mach-s3c2442/mach-gta02.c b/arch/arm/mach-s3c2442/mach-gta02.c +index 8e3cc91..f1d4d51 100644 +--- a/arch/arm/mach-s3c2442/mach-gta02.c ++++ b/arch/arm/mach-s3c2442/mach-gta02.c +@@ -322,6 +322,10 @@ static struct platform_device gta02_pm_gsm_dev = { + .name = "gta02-pm-gsm", + }; + ++static struct platform_device gta02_pm_usbhost_dev = { ++ .name = "gta02-pm-usbhost", ++}; ++ + static struct platform_device gta02_pm_wlan_dev = { + .name = "gta02-pm-wlan", + }; +@@ -331,6 +335,11 @@ static struct regulator_consumer_supply gsm_supply_consumer = { + .supply = "GSM", + }; + ++static struct regulator_consumer_supply usbhost_supply_consumer = { ++ .dev = >a02_pm_usbhost_dev.dev, ++ .supply = "USBHOST", ++}; ++ + static struct regulator_init_data gsm_supply_init_data = { + .constraints = { + .min_uV = 3700000, +@@ -342,6 +351,17 @@ static struct regulator_init_data gsm_supply_init_data = { + .consumer_supplies = &gsm_supply_consumer, + }; + ++static struct regulator_init_data usbhost_supply_init_data = { ++ .constraints = { ++ .min_uV = 3700000, ++ .max_uV = 3700000, ++ .valid_modes_mask = REGULATOR_MODE_NORMAL, ++ .valid_ops_mask = REGULATOR_CHANGE_STATUS, ++ }, ++ .num_consumer_supplies = 1, ++ .consumer_supplies = &usbhost_supply_consumer, ++}; ++ + static struct fixed_voltage_config gsm_supply_config = { + .supply_name = "GSM", + .microvolts = 3700000, +@@ -350,6 +370,14 @@ static struct fixed_voltage_config gsm_supply_config = { + .init_data = &gsm_supply_init_data, + }; + ++static struct fixed_voltage_config usbhost_supply_config = { ++ .supply_name = "USBHOST", ++ .microvolts = 3700000, ++ .gpio = GTA02_GPIO_PCF(PCF50633_GPO), ++ .enable_high = 1, ++ .init_data = &usbhost_supply_init_data, ++}; ++ + static struct platform_device gta02_gsm_supply_device = { + .name = "reg-fixed-voltage", + .id = 1, +@@ -358,6 +386,14 @@ static struct platform_device gta02_gsm_supply_device = { + }, + }; + ++static struct platform_device gta02_usbhost_supply_device = { ++ .name = "reg-fixed-voltage", ++ .id = 2, ++ .dev = { ++ .platform_data = &usbhost_supply_config, ++ }, ++}; ++ + static struct regulator_bulk_data gta02_gps_consumer_supply = { + .supply = "GPS", + }; +@@ -1332,12 +1368,17 @@ static struct platform_device* gta02_glamo_gpio_children[] = { + + static struct platform_device* gta02_pcf50633_gpio_children[] = { + >a02_gsm_supply_device, ++ >a02_usbhost_supply_device, + }; + + static struct platform_device* gta02_gsm_supply_children[] = { + >a02_pm_gsm_dev, + }; + ++static struct platform_device* gta02_usbhost_supply_children[] = { ++ >a02_pm_usbhost_dev, ++}; ++ + static struct platform_device* gta02_hdq_children[] = { + &bq27000_battery_device, + }; +@@ -1364,14 +1405,19 @@ static struct gta02_device_children gta02_device_children[] = { + }, + { + .dev_name = "pcf50633-gpio", +- .num_children = 1, ++ .num_children = 2, + .children = gta02_pcf50633_gpio_children, + }, + { + .dev_name = "reg-fixed-voltage.1", + .num_children = 1, + .children = gta02_gsm_supply_children, +- } ++ }, ++ { ++ .dev_name = "reg-fixed-voltage.2", ++ .num_children = 1, ++ .children = gta02_usbhost_supply_children, ++ }, + }; + + static int gta02_add_child_devices(struct device *parent, +diff --git a/drivers/usb/host/ohci-s3c2410.c b/drivers/usb/host/ohci-s3c2410.c +index a68af2d..02bd7b0 100644 +--- a/drivers/usb/host/ohci-s3c2410.c ++++ b/drivers/usb/host/ohci-s3c2410.c +@@ -22,6 +22,10 @@ + #include + #include + #include ++#include ++#include ++#include ++#include + + #define valid_port(idx) ((idx) == 1 || (idx) == 2) + +@@ -306,6 +310,42 @@ static void s3c2410_hcd_oc(struct s3c2410_hcd_info *info, int port_oc) + local_irq_restore(flags); + } + ++/* switching of USB pads */ ++static ssize_t show_usb_mode(struct device *dev, struct device_attribute *attr, ++ char *buf) ++{ ++ if (__raw_readl(S3C24XX_MISCCR) & S3C2410_MISCCR_USBHOST) ++ return sprintf(buf, "host\n"); ++ ++ return sprintf(buf, "device\n"); ++} ++ ++static ssize_t set_usb_mode(struct device *dev, struct device_attribute *attr, ++ const char *buf, size_t count) ++{ ++ if (!strncmp(buf, "host", 4)) { ++ printk("s3c2410: changing usb to host\n"); ++ s3c2410_modify_misccr(S3C2410_MISCCR_USBHOST, ++ S3C2410_MISCCR_USBHOST); ++ /* FIXME: ++ * - call machine-specific disable-pullup function i ++ * - enable +Vbus (if hardware supports it) ++ */ ++ s3c2410_gpio_setpin(GTA02_GPIO_USB_PULLUP, 0); ++ } else if (!strncmp(buf, "device", 6)) { ++ printk("s3c2410: changing usb to device\n"); ++ s3c2410_modify_misccr(S3C2410_MISCCR_USBHOST, 0); ++ s3c2410_gpio_setpin(GTA02_GPIO_USB_PULLUP, 1); ++ } else { ++ printk("s3c2410: unknown mode\n"); ++ return -EINVAL; ++ } ++ ++ return count; ++} ++ ++static DEVICE_ATTR(usb_mode, S_IRUGO | S_IWUSR, show_usb_mode, set_usb_mode); ++ + /* may be called without controller electrically present */ + /* may be called with controller, bus, and devices active */ + +@@ -323,6 +363,7 @@ static void s3c2410_hcd_oc(struct s3c2410_hcd_info *info, int port_oc) + static void + usb_hcd_s3c2410_remove (struct usb_hcd *hcd, struct platform_device *dev) + { ++ device_remove_file(&dev->dev, &dev_attr_usb_mode); + usb_remove_hcd(hcd); + s3c2410_stop_hc(dev); + iounmap(hcd->regs); +@@ -390,8 +431,15 @@ static int usb_hcd_s3c2410_probe (const struct hc_driver *driver, + if (retval != 0) + goto err_ioremap; + ++ retval = device_create_file(&dev->dev, &dev_attr_usb_mode); ++ if (retval != 0) ++ goto err_hcd; ++ + return 0; + ++ err_hcd: ++ usb_remove_hcd(hcd); ++ + err_ioremap: + s3c2410_stop_hc(dev); + iounmap(hcd->regs); +-- +1.7.0.4 + diff --git a/recipes/linux/linux-openmoko-2.6.32/0018-ar6000_delay.patch.patch b/recipes/linux/linux-openmoko-2.6.32/0018-ar6000_delay.patch.patch new file mode 100644 index 0000000000..54200d558f --- /dev/null +++ b/recipes/linux/linux-openmoko-2.6.32/0018-ar6000_delay.patch.patch @@ -0,0 +1,211 @@ +From cf93a0f8d2d61a2e13590c261dee4c4d74412db7 Mon Sep 17 00:00:00 2001 +From: Radek Polak +Date: Fri, 9 Apr 2010 09:18:02 +0200 +Subject: [PATCH 19/22] ar6000_delay.patch + +patch from https://docs.openmoko.org/trac/ticket/2327 - wifi is working good +(100% until now) for me with this patch. + +Signed-off-by: Martin Jansa +--- + arch/arm/mach-s3c2442/gta02-pm-usbhost.c | 174 ++++++++++++++++++++++++++++++ + drivers/ar6000/hif/hif2.c | 2 + + 2 files changed, 176 insertions(+), 0 deletions(-) + create mode 100644 arch/arm/mach-s3c2442/gta02-pm-usbhost.c + +diff --git a/arch/arm/mach-s3c2442/gta02-pm-usbhost.c b/arch/arm/mach-s3c2442/gta02-pm-usbhost.c +new file mode 100644 +index 0000000..233340a +--- /dev/null ++++ b/arch/arm/mach-s3c2442/gta02-pm-usbhost.c +@@ -0,0 +1,174 @@ ++/* ++ * USBHOST Management code for the Openmoko Freerunner GSM Phone ++ * ++ * (C) 2007 by Openmoko Inc. ++ * Author: Harald Welte ++ * All rights reserved. ++ * ++ * 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 ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include ++#include ++ ++#include ++ ++#include ++#include ++#include ++ ++static struct regulator *gta02_usbhost_regulator; ++ ++static ssize_t usbhost_read(struct device *dev, struct device_attribute *attr, ++ char *buf) ++{ ++ if (!strcmp(attr->attr.name, "power_on")) { ++ if (regulator_is_enabled(gta02_usbhost_regulator)) ++ goto out_1; ++ } ++ ++ return strlcpy(buf, "0\n", 3); ++out_1: ++ return strlcpy(buf, "1\n", 3); ++} ++ ++static void usbhost_on_off(struct device *dev, int on) ++{ ++ ++ on = !!on; ++ ++ if (on == regulator_is_enabled(gta02_usbhost_regulator)) ++ return; ++ ++ if (!on) { ++ regulator_disable(gta02_usbhost_regulator); ++ return; ++ } ++ ++ regulator_enable(gta02_usbhost_regulator); ++} ++ ++static ssize_t usbhost_write(struct device *dev, struct device_attribute *attr, ++ const char *buf, size_t count) ++{ ++ unsigned long on = simple_strtoul(buf, NULL, 10); ++ ++ if (!strcmp(attr->attr.name, "power_on")) { ++ usbhost_on_off(dev, on); ++ ++ return count; ++ } ++ ++ return count; ++} ++ ++static DEVICE_ATTR(power_on, 0644, usbhost_read, usbhost_write); ++ ++#ifdef CONFIG_PM ++ ++static int gta02_usbhost_suspend(struct device *dev) ++{ ++ return 0; ++} ++ ++static int gta02_usbhost_suspend_late(struct device *dev) ++{ ++ return 0; ++} ++ ++static int gta02_usbhost_resume(struct device *dev) ++{ ++ return 0; ++} ++ ++static struct dev_pm_ops gta02_usbhost_pm_ops = { ++ .suspend = gta02_usbhost_suspend, ++ .suspend_noirq = gta02_usbhost_suspend_late, ++ .resume = gta02_usbhost_resume, ++}; ++ ++#define GTA02_USBHOST_PM_OPS (>a02_usbhost_pm_ops) ++ ++#else ++#define GTA02_USBHOST_PM_OPS NULL ++#endif /* CONFIG_PM */ ++ ++static struct attribute *gta02_usbhost_sysfs_entries[] = { ++ &dev_attr_power_on.attr, ++ NULL ++}; ++ ++static struct attribute_group gta02_usbhost_attr_group = { ++ .name = NULL, ++ .attrs = gta02_usbhost_sysfs_entries, ++}; ++ ++static int __init gta02_usbhost_probe(struct platform_device *pdev) ++{ ++ int ret; ++ ++ gta02_usbhost_regulator = regulator_get_exclusive(&pdev->dev, "USBHOST"); ++ ++ if (IS_ERR(gta02_usbhost_regulator)) { ++ ret = PTR_ERR(gta02_usbhost_regulator); ++ dev_err(&pdev->dev, "Failed to get regulator: %d\n", ret); ++ return ret; ++ } ++ ++ ret = sysfs_create_group(&pdev->dev.kobj, >a02_usbhost_attr_group); ++ if (ret) { ++ dev_err(&pdev->dev, "Failed to create sysfs entries: %d\n", ret); ++ return ret; ++ } ++ ++ return 0; ++} ++ ++static int gta02_usbhost_remove(struct platform_device *pdev) ++{ ++ usbhost_on_off(&pdev->dev, 0); ++ ++ sysfs_remove_group(&pdev->dev.kobj, >a02_usbhost_attr_group); ++ regulator_put(gta02_usbhost_regulator); ++ ++ return 0; ++} ++ ++static struct platform_driver gta02_usbhost_driver = { ++ .probe = gta02_usbhost_probe, ++ .remove = gta02_usbhost_remove, ++ .driver = { ++ .name = "gta02-pm-usbhost", ++ .pm = GTA02_USBHOST_PM_OPS, ++ }, ++}; ++ ++static int __devinit gta02_usbhost_init(void) ++{ ++ return platform_driver_register(>a02_usbhost_driver); ++} ++module_init(gta02_usbhost_init); ++ ++static void gta02_usbhost_exit(void) ++{ ++ platform_driver_unregister(>a02_usbhost_driver); ++} ++module_exit(gta02_usbhost_exit); ++ ++MODULE_LICENSE("GPL"); ++MODULE_AUTHOR("Harald Welte "); ++MODULE_DESCRIPTION("Openmoko Freerunner USBHOST Power Management"); +diff --git a/drivers/ar6000/hif/hif2.c b/drivers/ar6000/hif/hif2.c +index 386d96e..90178d0 100644 +--- a/drivers/ar6000/hif/hif2.c ++++ b/drivers/ar6000/hif/hif2.c +@@ -517,6 +517,8 @@ static int ar6000_do_activate(struct hif_device *hif) + goto out_func_ready; + } + ++ mdelay (10); ++ + ret = htcCallbacks.deviceInsertedHandler(hif); + if (ret == A_OK) + return 0; +-- +1.7.0.4 + diff --git a/recipes/linux/linux-openmoko-2.6.32/0018-usbhost.patch.patch b/recipes/linux/linux-openmoko-2.6.32/0018-usbhost.patch.patch deleted file mode 100644 index 16ed3746fd..0000000000 --- a/recipes/linux/linux-openmoko-2.6.32/0018-usbhost.patch.patch +++ /dev/null @@ -1,233 +0,0 @@ -From d71534de6ab5e132d0798df30408042c229cbb62 Mon Sep 17 00:00:00 2001 -From: Radek Polak -Date: Fri, 9 Apr 2010 09:17:28 +0200 -Subject: [PATCH 18/22] usbhost.patch - -adds support for usb host mode and adds usb host pm sysfs node. I just copied -and modified how modem is powered up and backported changes in ohci-s3c2410.c. -No idea if this is the right approach, but it works - my usb keyboard is now -working after: - -echo 1 > /sys/devices/platform/s3c2440-i2c/i2c-0/0-0073/pcf50633-gpio/reg- -fixed-voltage.2/gta02-pm-usbhost.0/power_on -echo host > /sys/devices/platform/s3c2410-ohci/usb_mode - -Signed-off-by: Martin Jansa ---- - arch/arm/mach-s3c2442/Makefile | 1 + - arch/arm/mach-s3c2442/mach-gta02.c | 50 ++++++++++++++++++++++++++++++++++- - drivers/usb/host/ohci-s3c2410.c | 48 ++++++++++++++++++++++++++++++++++ - 3 files changed, 97 insertions(+), 2 deletions(-) - -diff --git a/arch/arm/mach-s3c2442/Makefile b/arch/arm/mach-s3c2442/Makefile -index 6247ca0..3e7145c 100644 ---- a/arch/arm/mach-s3c2442/Makefile -+++ b/arch/arm/mach-s3c2442/Makefile -@@ -17,6 +17,7 @@ obj-$(CONFIG_MACH_NEO1973_GTA02) += mach-gta02.o \ - gta02-pm-bt.o \ - gta02-pm-gps.o \ - gta02-pm-gsm.o \ -+ gta02-pm-usbhost.o \ - gta02-pm-wlan.o - # Machine support - -diff --git a/arch/arm/mach-s3c2442/mach-gta02.c b/arch/arm/mach-s3c2442/mach-gta02.c -index 8e3cc91..f1d4d51 100644 ---- a/arch/arm/mach-s3c2442/mach-gta02.c -+++ b/arch/arm/mach-s3c2442/mach-gta02.c -@@ -322,6 +322,10 @@ static struct platform_device gta02_pm_gsm_dev = { - .name = "gta02-pm-gsm", - }; - -+static struct platform_device gta02_pm_usbhost_dev = { -+ .name = "gta02-pm-usbhost", -+}; -+ - static struct platform_device gta02_pm_wlan_dev = { - .name = "gta02-pm-wlan", - }; -@@ -331,6 +335,11 @@ static struct regulator_consumer_supply gsm_supply_consumer = { - .supply = "GSM", - }; - -+static struct regulator_consumer_supply usbhost_supply_consumer = { -+ .dev = >a02_pm_usbhost_dev.dev, -+ .supply = "USBHOST", -+}; -+ - static struct regulator_init_data gsm_supply_init_data = { - .constraints = { - .min_uV = 3700000, -@@ -342,6 +351,17 @@ static struct regulator_init_data gsm_supply_init_data = { - .consumer_supplies = &gsm_supply_consumer, - }; - -+static struct regulator_init_data usbhost_supply_init_data = { -+ .constraints = { -+ .min_uV = 3700000, -+ .max_uV = 3700000, -+ .valid_modes_mask = REGULATOR_MODE_NORMAL, -+ .valid_ops_mask = REGULATOR_CHANGE_STATUS, -+ }, -+ .num_consumer_supplies = 1, -+ .consumer_supplies = &usbhost_supply_consumer, -+}; -+ - static struct fixed_voltage_config gsm_supply_config = { - .supply_name = "GSM", - .microvolts = 3700000, -@@ -350,6 +370,14 @@ static struct fixed_voltage_config gsm_supply_config = { - .init_data = &gsm_supply_init_data, - }; - -+static struct fixed_voltage_config usbhost_supply_config = { -+ .supply_name = "USBHOST", -+ .microvolts = 3700000, -+ .gpio = GTA02_GPIO_PCF(PCF50633_GPO), -+ .enable_high = 1, -+ .init_data = &usbhost_supply_init_data, -+}; -+ - static struct platform_device gta02_gsm_supply_device = { - .name = "reg-fixed-voltage", - .id = 1, -@@ -358,6 +386,14 @@ static struct platform_device gta02_gsm_supply_device = { - }, - }; - -+static struct platform_device gta02_usbhost_supply_device = { -+ .name = "reg-fixed-voltage", -+ .id = 2, -+ .dev = { -+ .platform_data = &usbhost_supply_config, -+ }, -+}; -+ - static struct regulator_bulk_data gta02_gps_consumer_supply = { - .supply = "GPS", - }; -@@ -1332,12 +1368,17 @@ static struct platform_device* gta02_glamo_gpio_children[] = { - - static struct platform_device* gta02_pcf50633_gpio_children[] = { - >a02_gsm_supply_device, -+ >a02_usbhost_supply_device, - }; - - static struct platform_device* gta02_gsm_supply_children[] = { - >a02_pm_gsm_dev, - }; - -+static struct platform_device* gta02_usbhost_supply_children[] = { -+ >a02_pm_usbhost_dev, -+}; -+ - static struct platform_device* gta02_hdq_children[] = { - &bq27000_battery_device, - }; -@@ -1364,14 +1405,19 @@ static struct gta02_device_children gta02_device_children[] = { - }, - { - .dev_name = "pcf50633-gpio", -- .num_children = 1, -+ .num_children = 2, - .children = gta02_pcf50633_gpio_children, - }, - { - .dev_name = "reg-fixed-voltage.1", - .num_children = 1, - .children = gta02_gsm_supply_children, -- } -+ }, -+ { -+ .dev_name = "reg-fixed-voltage.2", -+ .num_children = 1, -+ .children = gta02_usbhost_supply_children, -+ }, - }; - - static int gta02_add_child_devices(struct device *parent, -diff --git a/drivers/usb/host/ohci-s3c2410.c b/drivers/usb/host/ohci-s3c2410.c -index a68af2d..02bd7b0 100644 ---- a/drivers/usb/host/ohci-s3c2410.c -+++ b/drivers/usb/host/ohci-s3c2410.c -@@ -22,6 +22,10 @@ - #include - #include - #include -+#include -+#include -+#include -+#include - - #define valid_port(idx) ((idx) == 1 || (idx) == 2) - -@@ -306,6 +310,42 @@ static void s3c2410_hcd_oc(struct s3c2410_hcd_info *info, int port_oc) - local_irq_restore(flags); - } - -+/* switching of USB pads */ -+static ssize_t show_usb_mode(struct device *dev, struct device_attribute *attr, -+ char *buf) -+{ -+ if (__raw_readl(S3C24XX_MISCCR) & S3C2410_MISCCR_USBHOST) -+ return sprintf(buf, "host\n"); -+ -+ return sprintf(buf, "device\n"); -+} -+ -+static ssize_t set_usb_mode(struct device *dev, struct device_attribute *attr, -+ const char *buf, size_t count) -+{ -+ if (!strncmp(buf, "host", 4)) { -+ printk("s3c2410: changing usb to host\n"); -+ s3c2410_modify_misccr(S3C2410_MISCCR_USBHOST, -+ S3C2410_MISCCR_USBHOST); -+ /* FIXME: -+ * - call machine-specific disable-pullup function i -+ * - enable +Vbus (if hardware supports it) -+ */ -+ s3c2410_gpio_setpin(GTA02_GPIO_USB_PULLUP, 0); -+ } else if (!strncmp(buf, "device", 6)) { -+ printk("s3c2410: changing usb to device\n"); -+ s3c2410_modify_misccr(S3C2410_MISCCR_USBHOST, 0); -+ s3c2410_gpio_setpin(GTA02_GPIO_USB_PULLUP, 1); -+ } else { -+ printk("s3c2410: unknown mode\n"); -+ return -EINVAL; -+ } -+ -+ return count; -+} -+ -+static DEVICE_ATTR(usb_mode, S_IRUGO | S_IWUSR, show_usb_mode, set_usb_mode); -+ - /* may be called without controller electrically present */ - /* may be called with controller, bus, and devices active */ - -@@ -323,6 +363,7 @@ static void s3c2410_hcd_oc(struct s3c2410_hcd_info *info, int port_oc) - static void - usb_hcd_s3c2410_remove (struct usb_hcd *hcd, struct platform_device *dev) - { -+ device_remove_file(&dev->dev, &dev_attr_usb_mode); - usb_remove_hcd(hcd); - s3c2410_stop_hc(dev); - iounmap(hcd->regs); -@@ -390,8 +431,15 @@ static int usb_hcd_s3c2410_probe (const struct hc_driver *driver, - if (retval != 0) - goto err_ioremap; - -+ retval = device_create_file(&dev->dev, &dev_attr_usb_mode); -+ if (retval != 0) -+ goto err_hcd; -+ - return 0; - -+ err_hcd: -+ usb_remove_hcd(hcd); -+ - err_ioremap: - s3c2410_stop_hc(dev); - iounmap(hcd->regs); --- -1.7.0.4 - diff --git a/recipes/linux/linux-openmoko-2.6.32/0019-ar6000_delay.patch.patch b/recipes/linux/linux-openmoko-2.6.32/0019-ar6000_delay.patch.patch deleted file mode 100644 index 54200d558f..0000000000 --- a/recipes/linux/linux-openmoko-2.6.32/0019-ar6000_delay.patch.patch +++ /dev/null @@ -1,211 +0,0 @@ -From cf93a0f8d2d61a2e13590c261dee4c4d74412db7 Mon Sep 17 00:00:00 2001 -From: Radek Polak -Date: Fri, 9 Apr 2010 09:18:02 +0200 -Subject: [PATCH 19/22] ar6000_delay.patch - -patch from https://docs.openmoko.org/trac/ticket/2327 - wifi is working good -(100% until now) for me with this patch. - -Signed-off-by: Martin Jansa ---- - arch/arm/mach-s3c2442/gta02-pm-usbhost.c | 174 ++++++++++++++++++++++++++++++ - drivers/ar6000/hif/hif2.c | 2 + - 2 files changed, 176 insertions(+), 0 deletions(-) - create mode 100644 arch/arm/mach-s3c2442/gta02-pm-usbhost.c - -diff --git a/arch/arm/mach-s3c2442/gta02-pm-usbhost.c b/arch/arm/mach-s3c2442/gta02-pm-usbhost.c -new file mode 100644 -index 0000000..233340a ---- /dev/null -+++ b/arch/arm/mach-s3c2442/gta02-pm-usbhost.c -@@ -0,0 +1,174 @@ -+/* -+ * USBHOST Management code for the Openmoko Freerunner GSM Phone -+ * -+ * (C) 2007 by Openmoko Inc. -+ * Author: Harald Welte -+ * All rights reserved. -+ * -+ * 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 -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#include -+#include -+ -+#include -+ -+#include -+#include -+#include -+ -+static struct regulator *gta02_usbhost_regulator; -+ -+static ssize_t usbhost_read(struct device *dev, struct device_attribute *attr, -+ char *buf) -+{ -+ if (!strcmp(attr->attr.name, "power_on")) { -+ if (regulator_is_enabled(gta02_usbhost_regulator)) -+ goto out_1; -+ } -+ -+ return strlcpy(buf, "0\n", 3); -+out_1: -+ return strlcpy(buf, "1\n", 3); -+} -+ -+static void usbhost_on_off(struct device *dev, int on) -+{ -+ -+ on = !!on; -+ -+ if (on == regulator_is_enabled(gta02_usbhost_regulator)) -+ return; -+ -+ if (!on) { -+ regulator_disable(gta02_usbhost_regulator); -+ return; -+ } -+ -+ regulator_enable(gta02_usbhost_regulator); -+} -+ -+static ssize_t usbhost_write(struct device *dev, struct device_attribute *attr, -+ const char *buf, size_t count) -+{ -+ unsigned long on = simple_strtoul(buf, NULL, 10); -+ -+ if (!strcmp(attr->attr.name, "power_on")) { -+ usbhost_on_off(dev, on); -+ -+ return count; -+ } -+ -+ return count; -+} -+ -+static DEVICE_ATTR(power_on, 0644, usbhost_read, usbhost_write); -+ -+#ifdef CONFIG_PM -+ -+static int gta02_usbhost_suspend(struct device *dev) -+{ -+ return 0; -+} -+ -+static int gta02_usbhost_suspend_late(struct device *dev) -+{ -+ return 0; -+} -+ -+static int gta02_usbhost_resume(struct device *dev) -+{ -+ return 0; -+} -+ -+static struct dev_pm_ops gta02_usbhost_pm_ops = { -+ .suspend = gta02_usbhost_suspend, -+ .suspend_noirq = gta02_usbhost_suspend_late, -+ .resume = gta02_usbhost_resume, -+}; -+ -+#define GTA02_USBHOST_PM_OPS (>a02_usbhost_pm_ops) -+ -+#else -+#define GTA02_USBHOST_PM_OPS NULL -+#endif /* CONFIG_PM */ -+ -+static struct attribute *gta02_usbhost_sysfs_entries[] = { -+ &dev_attr_power_on.attr, -+ NULL -+}; -+ -+static struct attribute_group gta02_usbhost_attr_group = { -+ .name = NULL, -+ .attrs = gta02_usbhost_sysfs_entries, -+}; -+ -+static int __init gta02_usbhost_probe(struct platform_device *pdev) -+{ -+ int ret; -+ -+ gta02_usbhost_regulator = regulator_get_exclusive(&pdev->dev, "USBHOST"); -+ -+ if (IS_ERR(gta02_usbhost_regulator)) { -+ ret = PTR_ERR(gta02_usbhost_regulator); -+ dev_err(&pdev->dev, "Failed to get regulator: %d\n", ret); -+ return ret; -+ } -+ -+ ret = sysfs_create_group(&pdev->dev.kobj, >a02_usbhost_attr_group); -+ if (ret) { -+ dev_err(&pdev->dev, "Failed to create sysfs entries: %d\n", ret); -+ return ret; -+ } -+ -+ return 0; -+} -+ -+static int gta02_usbhost_remove(struct platform_device *pdev) -+{ -+ usbhost_on_off(&pdev->dev, 0); -+ -+ sysfs_remove_group(&pdev->dev.kobj, >a02_usbhost_attr_group); -+ regulator_put(gta02_usbhost_regulator); -+ -+ return 0; -+} -+ -+static struct platform_driver gta02_usbhost_driver = { -+ .probe = gta02_usbhost_probe, -+ .remove = gta02_usbhost_remove, -+ .driver = { -+ .name = "gta02-pm-usbhost", -+ .pm = GTA02_USBHOST_PM_OPS, -+ }, -+}; -+ -+static int __devinit gta02_usbhost_init(void) -+{ -+ return platform_driver_register(>a02_usbhost_driver); -+} -+module_init(gta02_usbhost_init); -+ -+static void gta02_usbhost_exit(void) -+{ -+ platform_driver_unregister(>a02_usbhost_driver); -+} -+module_exit(gta02_usbhost_exit); -+ -+MODULE_LICENSE("GPL"); -+MODULE_AUTHOR("Harald Welte "); -+MODULE_DESCRIPTION("Openmoko Freerunner USBHOST Power Management"); -diff --git a/drivers/ar6000/hif/hif2.c b/drivers/ar6000/hif/hif2.c -index 386d96e..90178d0 100644 ---- a/drivers/ar6000/hif/hif2.c -+++ b/drivers/ar6000/hif/hif2.c -@@ -517,6 +517,8 @@ static int ar6000_do_activate(struct hif_device *hif) - goto out_func_ready; - } - -+ mdelay (10); -+ - ret = htcCallbacks.deviceInsertedHandler(hif); - if (ret == A_OK) - return 0; --- -1.7.0.4 - diff --git a/recipes/linux/linux-openmoko-2.6.32/0019-save_regs.patch.patch b/recipes/linux/linux-openmoko-2.6.32/0019-save_regs.patch.patch new file mode 100644 index 0000000000..8fc2cea326 --- /dev/null +++ b/recipes/linux/linux-openmoko-2.6.32/0019-save_regs.patch.patch @@ -0,0 +1,140 @@ +From a9d6c115089a0a34fbca89c539de50148a2cf34e Mon Sep 17 00:00:00 2001 +From: Radek Polak +Date: Fri, 9 Apr 2010 09:22:23 +0200 +Subject: [PATCH 20/22] save_regs.patch + +With this patch wifi can survive suspend. +--- + drivers/mmc/core/core.c | 3 +- + drivers/mmc/host/s3cmci.c | 46 +++++++++++++++++++++++++++++++++++++++++++- + drivers/mmc/host/s3cmci.h | 8 +++++++ + include/linux/mmc/core.h | 2 + + 4 files changed, 56 insertions(+), 3 deletions(-) + +diff --git a/drivers/mmc/core/core.c b/drivers/mmc/core/core.c +index 7dab2e5..7df08dd 100644 +--- a/drivers/mmc/core/core.c ++++ b/drivers/mmc/core/core.c +@@ -59,10 +59,11 @@ static int mmc_schedule_delayed_work(struct delayed_work *work, + /* + * Internal function. Flush all scheduled work from the MMC work queue. + */ +-static void mmc_flush_scheduled_work(void) ++void mmc_flush_scheduled_work(void) + { + flush_workqueue(workqueue); + } ++EXPORT_SYMBOL_GPL(mmc_flush_scheduled_work); + + /** + * mmc_request_done - finish processing an MMC request +diff --git a/drivers/mmc/host/s3cmci.c b/drivers/mmc/host/s3cmci.c +index fba147c..06423cb 100644 +--- a/drivers/mmc/host/s3cmci.c ++++ b/drivers/mmc/host/s3cmci.c +@@ -1879,19 +1879,61 @@ MODULE_DEVICE_TABLE(platform, s3cmci_driver_ids); + + #ifdef CONFIG_PM + ++static int save_regs(struct mmc_host *mmc) ++{ ++ struct s3cmci_host *host = mmc_priv(mmc); ++ unsigned long flags; ++ unsigned from; ++ u32 *to = host->saved; ++ ++ mmc_flush_scheduled_work(); ++ ++ local_irq_save(flags); ++ for (from = S3C2410_SDICON; from != S3C2410_SDIIMSK+4; from += 4) ++ if (from != host->sdidata) ++ *to++ = readl(host->base + from); ++ BUG_ON(to-host->saved != ARRAY_SIZE(host->saved)); ++ local_irq_restore(flags); ++ ++ return 0; ++} ++ ++static int restore_regs(struct mmc_host *mmc) ++{ ++ struct s3cmci_host *host = mmc_priv(mmc); ++ unsigned long flags; ++ unsigned to; ++ u32 *from = host->saved; ++ ++ /* ++ * Before we begin with the necromancy, make sure we don't ++ * inadvertently start something we'll regret microseconds later. ++ */ ++ from[S3C2410_SDICMDCON - S3C2410_SDICON] = 0; ++ ++ local_irq_save(flags); ++ for (to = S3C2410_SDICON; to != S3C2410_SDIIMSK+4; to += 4) ++ if (to != host->sdidata) ++ writel(*from++, host->base + to); ++ BUG_ON(from-host->saved != ARRAY_SIZE(host->saved)); ++ local_irq_restore(flags); ++ ++ return 0; ++} ++ + static int s3cmci_suspend(struct device *dev) + { + struct mmc_host *mmc = platform_get_drvdata(to_platform_device(dev)); + struct pm_message event = { PM_EVENT_SUSPEND }; + +- return mmc_suspend_host(mmc, event); ++ return save_regs(mmc); + } + + static int s3cmci_resume(struct device *dev) + { + struct mmc_host *mmc = platform_get_drvdata(to_platform_device(dev)); + +- return mmc_resume_host(mmc); ++ return restore_regs(mmc); + } + + static struct dev_pm_ops s3cmci_pm = { +diff --git a/drivers/mmc/host/s3cmci.h b/drivers/mmc/host/s3cmci.h +index c76b53d..551e715 100644 +--- a/drivers/mmc/host/s3cmci.h ++++ b/drivers/mmc/host/s3cmci.h +@@ -8,6 +8,8 @@ + * published by the Free Software Foundation. + */ + ++#include ++ + enum s3cmci_waitfor { + COMPLETION_NONE, + COMPLETION_FINALIZE, +@@ -27,6 +29,12 @@ struct s3cmci_host { + int irq; + int irq_cd; + int dma; ++ /* ++ * Here's where we save the registers during suspend. Note that we skip ++ * SDIDATA, which is at different positions on 2410 and 2440, so ++ * there's no "+1" in the array size. ++ */ ++ u32 saved[(S3C2410_SDIIMSK-S3C2410_SDICON)/4]; + + unsigned long clk_rate; + unsigned long clk_div; +diff --git a/include/linux/mmc/core.h b/include/linux/mmc/core.h +index e4898e9..b49d674 100644 +--- a/include/linux/mmc/core.h ++++ b/include/linux/mmc/core.h +@@ -129,6 +129,8 @@ struct mmc_request { + struct mmc_host; + struct mmc_card; + ++extern void mmc_flush_scheduled_work(void); ++ + extern void mmc_wait_for_req(struct mmc_host *, struct mmc_request *); + extern int mmc_wait_for_cmd(struct mmc_host *, struct mmc_command *, int); + extern int mmc_wait_for_app_cmd(struct mmc_host *, struct mmc_card *, +-- +1.7.0.4 + diff --git a/recipes/linux/linux-openmoko-2.6.32/0020-Fix-KMS-framebuffer-physical-address.patch b/recipes/linux/linux-openmoko-2.6.32/0020-Fix-KMS-framebuffer-physical-address.patch new file mode 100644 index 0000000000..3ce4d59042 --- /dev/null +++ b/recipes/linux/linux-openmoko-2.6.32/0020-Fix-KMS-framebuffer-physical-address.patch @@ -0,0 +1,38 @@ +From 1b83b6d7f2e1bf5473cd17a742737a1cfe450509 Mon Sep 17 00:00:00 2001 +From: Thomas White +Date: Fri, 20 Nov 2009 22:06:30 +0100 +Subject: [PATCH 24/24] Fix KMS framebuffer physical address + +This allows "/dev/fb0" to work correctly with mmap(). + +Signed-off-by: Thomas White +--- + drivers/mfd/glamo/glamo-kms-fb.c | 5 ++--- + 1 files changed, 2 insertions(+), 3 deletions(-) + +diff --git a/drivers/mfd/glamo/glamo-kms-fb.c b/drivers/mfd/glamo/glamo-kms-fb.c +index 6d4b9ea..04de83b 100644 +--- a/drivers/mfd/glamo/glamo-kms-fb.c ++++ b/drivers/mfd/glamo/glamo-kms-fb.c +@@ -387,9 +387,6 @@ int glamofb_create(struct drm_device *dev, uint32_t fb_width, + info->fbops = &glamofb_ops; + + info->fix.line_length = fb->pitch; +- info->fix.smem_start = dev->mode_config.fb_base +- + (unsigned long) gdrm->vram->start; +- info->fix.smem_len = size; + + info->flags = FBINFO_DEFAULT; + +@@ -401,6 +398,8 @@ int glamofb_create(struct drm_device *dev, uint32_t fb_width, + ret = -ENOSPC; + goto out_unref; + } ++ info->fix.smem_start = (unsigned long)gdrm->vram->start + offs; ++ info->fix.smem_len = size; + info->screen_size = size; + + info->pseudo_palette = fb->pseudo_palette; +-- +1.7.0.4 + diff --git a/recipes/linux/linux-openmoko-2.6.32/0020-save_regs.patch.patch b/recipes/linux/linux-openmoko-2.6.32/0020-save_regs.patch.patch deleted file mode 100644 index 8fc2cea326..0000000000 --- a/recipes/linux/linux-openmoko-2.6.32/0020-save_regs.patch.patch +++ /dev/null @@ -1,140 +0,0 @@ -From a9d6c115089a0a34fbca89c539de50148a2cf34e Mon Sep 17 00:00:00 2001 -From: Radek Polak -Date: Fri, 9 Apr 2010 09:22:23 +0200 -Subject: [PATCH 20/22] save_regs.patch - -With this patch wifi can survive suspend. ---- - drivers/mmc/core/core.c | 3 +- - drivers/mmc/host/s3cmci.c | 46 +++++++++++++++++++++++++++++++++++++++++++- - drivers/mmc/host/s3cmci.h | 8 +++++++ - include/linux/mmc/core.h | 2 + - 4 files changed, 56 insertions(+), 3 deletions(-) - -diff --git a/drivers/mmc/core/core.c b/drivers/mmc/core/core.c -index 7dab2e5..7df08dd 100644 ---- a/drivers/mmc/core/core.c -+++ b/drivers/mmc/core/core.c -@@ -59,10 +59,11 @@ static int mmc_schedule_delayed_work(struct delayed_work *work, - /* - * Internal function. Flush all scheduled work from the MMC work queue. - */ --static void mmc_flush_scheduled_work(void) -+void mmc_flush_scheduled_work(void) - { - flush_workqueue(workqueue); - } -+EXPORT_SYMBOL_GPL(mmc_flush_scheduled_work); - - /** - * mmc_request_done - finish processing an MMC request -diff --git a/drivers/mmc/host/s3cmci.c b/drivers/mmc/host/s3cmci.c -index fba147c..06423cb 100644 ---- a/drivers/mmc/host/s3cmci.c -+++ b/drivers/mmc/host/s3cmci.c -@@ -1879,19 +1879,61 @@ MODULE_DEVICE_TABLE(platform, s3cmci_driver_ids); - - #ifdef CONFIG_PM - -+static int save_regs(struct mmc_host *mmc) -+{ -+ struct s3cmci_host *host = mmc_priv(mmc); -+ unsigned long flags; -+ unsigned from; -+ u32 *to = host->saved; -+ -+ mmc_flush_scheduled_work(); -+ -+ local_irq_save(flags); -+ for (from = S3C2410_SDICON; from != S3C2410_SDIIMSK+4; from += 4) -+ if (from != host->sdidata) -+ *to++ = readl(host->base + from); -+ BUG_ON(to-host->saved != ARRAY_SIZE(host->saved)); -+ local_irq_restore(flags); -+ -+ return 0; -+} -+ -+static int restore_regs(struct mmc_host *mmc) -+{ -+ struct s3cmci_host *host = mmc_priv(mmc); -+ unsigned long flags; -+ unsigned to; -+ u32 *from = host->saved; -+ -+ /* -+ * Before we begin with the necromancy, make sure we don't -+ * inadvertently start something we'll regret microseconds later. -+ */ -+ from[S3C2410_SDICMDCON - S3C2410_SDICON] = 0; -+ -+ local_irq_save(flags); -+ for (to = S3C2410_SDICON; to != S3C2410_SDIIMSK+4; to += 4) -+ if (to != host->sdidata) -+ writel(*from++, host->base + to); -+ BUG_ON(from-host->saved != ARRAY_SIZE(host->saved)); -+ local_irq_restore(flags); -+ -+ return 0; -+} -+ - static int s3cmci_suspend(struct device *dev) - { - struct mmc_host *mmc = platform_get_drvdata(to_platform_device(dev)); - struct pm_message event = { PM_EVENT_SUSPEND }; - -- return mmc_suspend_host(mmc, event); -+ return save_regs(mmc); - } - - static int s3cmci_resume(struct device *dev) - { - struct mmc_host *mmc = platform_get_drvdata(to_platform_device(dev)); - -- return mmc_resume_host(mmc); -+ return restore_regs(mmc); - } - - static struct dev_pm_ops s3cmci_pm = { -diff --git a/drivers/mmc/host/s3cmci.h b/drivers/mmc/host/s3cmci.h -index c76b53d..551e715 100644 ---- a/drivers/mmc/host/s3cmci.h -+++ b/drivers/mmc/host/s3cmci.h -@@ -8,6 +8,8 @@ - * published by the Free Software Foundation. - */ - -+#include -+ - enum s3cmci_waitfor { - COMPLETION_NONE, - COMPLETION_FINALIZE, -@@ -27,6 +29,12 @@ struct s3cmci_host { - int irq; - int irq_cd; - int dma; -+ /* -+ * Here's where we save the registers during suspend. Note that we skip -+ * SDIDATA, which is at different positions on 2410 and 2440, so -+ * there's no "+1" in the array size. -+ */ -+ u32 saved[(S3C2410_SDIIMSK-S3C2410_SDICON)/4]; - - unsigned long clk_rate; - unsigned long clk_div; -diff --git a/include/linux/mmc/core.h b/include/linux/mmc/core.h -index e4898e9..b49d674 100644 ---- a/include/linux/mmc/core.h -+++ b/include/linux/mmc/core.h -@@ -129,6 +129,8 @@ struct mmc_request { - struct mmc_host; - struct mmc_card; - -+extern void mmc_flush_scheduled_work(void); -+ - extern void mmc_wait_for_req(struct mmc_host *, struct mmc_request *); - extern int mmc_wait_for_cmd(struct mmc_host *, struct mmc_command *, int); - extern int mmc_wait_for_app_cmd(struct mmc_host *, struct mmc_card *, --- -1.7.0.4 - diff --git a/recipes/linux/linux-openmoko-2.6.32/0021-Reject-modes-with-clock-0.patch b/recipes/linux/linux-openmoko-2.6.32/0021-Reject-modes-with-clock-0.patch new file mode 100644 index 0000000000..7201602551 --- /dev/null +++ b/recipes/linux/linux-openmoko-2.6.32/0021-Reject-modes-with-clock-0.patch @@ -0,0 +1,25 @@ +From 6a6957d634daa88f381e44353c98f27e4c39300a Mon Sep 17 00:00:00 2001 +From: Thomas White +Date: Sun, 18 Apr 2010 14:25:14 +0200 +Subject: [PATCH 27/31] Reject modes with clock=0 + +Signed-off-by: Thomas White +--- + drivers/mfd/glamo/glamo-display.c | 1 + + 1 files changed, 1 insertions(+), 0 deletions(-) + +diff --git a/drivers/mfd/glamo/glamo-display.c b/drivers/mfd/glamo/glamo-display.c +index 24a1a31..f57d273 100644 +--- a/drivers/mfd/glamo/glamo-display.c ++++ b/drivers/mfd/glamo/glamo-display.c +@@ -522,6 +522,7 @@ static bool glamo_encoder_mode_fixup(struct drm_encoder *encoder, + struct drm_display_mode *mode, + struct drm_display_mode *adjusted_mode) + { ++ if ( mode->clock == 0 ) return false; + return true; + } + +-- +1.7.0.4 + diff --git a/recipes/linux/linux-openmoko-2.6.32/0021-gta02_defconfig.patch b/recipes/linux/linux-openmoko-2.6.32/0021-gta02_defconfig.patch deleted file mode 100644 index 5c78c31e90..0000000000 --- a/recipes/linux/linux-openmoko-2.6.32/0021-gta02_defconfig.patch +++ /dev/null @@ -1,2143 +0,0 @@ -From a081bd86a59ed4520551f490534ceece886d087e Mon Sep 17 00:00:00 2001 -From: Radek Polak -Date: Fri, 9 Apr 2010 09:24:43 +0200 -Subject: [PATCH 21/22] gta02_defconfig - -config used for qtmoko-v20. It has all freerunner hardware built in - so that -you can boot and your phone hardware is working even without /lib/modules. I -have (hopefully) all drivers from 2.6.29 as modules (usb keyboards etc). ---- - arch/arm/configs/gta02_defconfig | 2121 ++++++++++++++++++++++++++++++++++++++ - 1 files changed, 2121 insertions(+), 0 deletions(-) - create mode 100644 arch/arm/configs/gta02_defconfig - -diff --git a/arch/arm/configs/gta02_defconfig b/arch/arm/configs/gta02_defconfig -new file mode 100644 -index 0000000..73d26ba ---- /dev/null -+++ b/arch/arm/configs/gta02_defconfig -@@ -0,0 +1,2121 @@ -+# -+# Automatically generated make config: don't edit -+# Linux kernel version: 2.6.32 -+# Wed Apr 7 23:27:29 2010 -+# -+CONFIG_ARM=y -+CONFIG_HAVE_PWM=y -+CONFIG_SYS_SUPPORTS_APM_EMULATION=y -+CONFIG_GENERIC_GPIO=y -+CONFIG_NO_IOPORT=y -+CONFIG_GENERIC_HARDIRQS=y -+CONFIG_STACKTRACE_SUPPORT=y -+CONFIG_HAVE_LATENCYTOP_SUPPORT=y -+CONFIG_LOCKDEP_SUPPORT=y -+CONFIG_TRACE_IRQFLAGS_SUPPORT=y -+CONFIG_HARDIRQS_SW_RESEND=y -+CONFIG_GENERIC_IRQ_PROBE=y -+CONFIG_RWSEM_GENERIC_SPINLOCK=y -+CONFIG_ARCH_HAS_CPUFREQ=y -+CONFIG_GENERIC_HWEIGHT=y -+CONFIG_GENERIC_CALIBRATE_DELAY=y -+CONFIG_FIQ=y -+CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ=y -+CONFIG_VECTORS_BASE=0xffff0000 -+CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" -+CONFIG_CONSTRUCTORS=y -+ -+# -+# General setup -+# -+CONFIG_EXPERIMENTAL=y -+CONFIG_BROKEN_ON_SMP=y -+CONFIG_INIT_ENV_ARG_LIMIT=32 -+CONFIG_LOCALVERSION="v20" -+# CONFIG_LOCALVERSION_AUTO is not set -+CONFIG_SWAP=y -+CONFIG_SYSVIPC=y -+CONFIG_SYSVIPC_SYSCTL=y -+# CONFIG_POSIX_MQUEUE is not set -+# CONFIG_BSD_PROCESS_ACCT is not set -+# CONFIG_TASKSTATS is not set -+# CONFIG_AUDIT is not set -+ -+# -+# RCU Subsystem -+# -+CONFIG_TREE_RCU=y -+# CONFIG_TREE_PREEMPT_RCU is not set -+# CONFIG_RCU_TRACE is not set -+CONFIG_RCU_FANOUT=32 -+# CONFIG_RCU_FANOUT_EXACT is not set -+# CONFIG_TREE_RCU_TRACE is not set -+# CONFIG_IKCONFIG is not set -+CONFIG_LOG_BUF_SHIFT=18 -+# CONFIG_GROUP_SCHED is not set -+# CONFIG_CGROUPS is not set -+# CONFIG_SYSFS_DEPRECATED_V2 is not set -+# CONFIG_RELAY is not set -+CONFIG_NAMESPACES=y -+# CONFIG_UTS_NS is not set -+# CONFIG_IPC_NS is not set -+# CONFIG_USER_NS is not set -+# CONFIG_PID_NS is not set -+# CONFIG_NET_NS is not set -+CONFIG_BLK_DEV_INITRD=y -+CONFIG_INITRAMFS_SOURCE="" -+CONFIG_RD_GZIP=y -+CONFIG_RD_BZIP2=y -+CONFIG_RD_LZMA=y -+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set -+CONFIG_SYSCTL=y -+CONFIG_ANON_INODES=y -+# CONFIG_EMBEDDED is not set -+CONFIG_UID16=y -+CONFIG_SYSCTL_SYSCALL=y -+CONFIG_KALLSYMS=y -+# CONFIG_KALLSYMS_EXTRA_PASS is not set -+CONFIG_HOTPLUG=y -+CONFIG_PRINTK=y -+CONFIG_BUG=y -+CONFIG_ELF_CORE=y -+CONFIG_BASE_FULL=y -+CONFIG_FUTEX=y -+CONFIG_EPOLL=y -+CONFIG_SIGNALFD=y -+CONFIG_TIMERFD=y -+CONFIG_EVENTFD=y -+CONFIG_SHMEM=y -+CONFIG_AIO=y -+ -+# -+# Kernel Performance Events And Counters -+# -+CONFIG_VM_EVENT_COUNTERS=y -+CONFIG_COMPAT_BRK=y -+CONFIG_SLAB=y -+# CONFIG_SLUB is not set -+# CONFIG_SLOB is not set -+# CONFIG_PROFILING is not set -+CONFIG_HAVE_OPROFILE=y -+# CONFIG_KPROBES is not set -+CONFIG_HAVE_KPROBES=y -+CONFIG_HAVE_KRETPROBES=y -+CONFIG_HAVE_CLK=y -+ -+# -+# GCOV-based kernel profiling -+# -+CONFIG_SLOW_WORK=y -+CONFIG_HAVE_GENERIC_DMA_COHERENT=y -+CONFIG_SLABINFO=y -+CONFIG_RT_MUTEXES=y -+CONFIG_BASE_SMALL=0 -+CONFIG_MODULES=y -+# CONFIG_MODULE_FORCE_LOAD is not set -+CONFIG_MODULE_UNLOAD=y -+CONFIG_MODULE_FORCE_UNLOAD=y -+# CONFIG_MODVERSIONS is not set -+# CONFIG_MODULE_SRCVERSION_ALL is not set -+CONFIG_BLOCK=y -+# CONFIG_LBDAF is not set -+# CONFIG_BLK_DEV_BSG is not set -+# CONFIG_BLK_DEV_INTEGRITY is not set -+ -+# -+# IO Schedulers -+# -+CONFIG_IOSCHED_NOOP=y -+CONFIG_IOSCHED_AS=m -+CONFIG_IOSCHED_DEADLINE=y -+CONFIG_IOSCHED_CFQ=m -+# CONFIG_DEFAULT_AS is not set -+CONFIG_DEFAULT_DEADLINE=y -+# CONFIG_DEFAULT_CFQ is not set -+# CONFIG_DEFAULT_NOOP is not set -+CONFIG_DEFAULT_IOSCHED="deadline" -+CONFIG_FREEZER=y -+ -+# -+# System Type -+# -+CONFIG_MMU=y -+# CONFIG_ARCH_AAEC2000 is not set -+# CONFIG_ARCH_INTEGRATOR is not set -+# CONFIG_ARCH_REALVIEW is not set -+# CONFIG_ARCH_VERSATILE is not set -+# CONFIG_ARCH_AT91 is not set -+# CONFIG_ARCH_CLPS711X is not set -+# CONFIG_ARCH_GEMINI is not set -+# CONFIG_ARCH_EBSA110 is not set -+# CONFIG_ARCH_EP93XX is not set -+# CONFIG_ARCH_FOOTBRIDGE is not set -+# CONFIG_ARCH_MXC is not set -+# CONFIG_ARCH_STMP3XXX is not set -+# CONFIG_ARCH_NETX is not set -+# CONFIG_ARCH_H720X is not set -+# CONFIG_ARCH_NOMADIK is not set -+# CONFIG_ARCH_IOP13XX is not set -+# CONFIG_ARCH_IOP32X is not set -+# CONFIG_ARCH_IOP33X is not set -+# CONFIG_ARCH_IXP23XX is not set -+# CONFIG_ARCH_IXP2000 is not set -+# CONFIG_ARCH_IXP4XX is not set -+# CONFIG_ARCH_L7200 is not set -+# CONFIG_ARCH_KIRKWOOD is not set -+# CONFIG_ARCH_LOKI is not set -+# CONFIG_ARCH_MV78XX0 is not set -+# CONFIG_ARCH_ORION5X is not set -+# CONFIG_ARCH_MMP is not set -+# CONFIG_ARCH_KS8695 is not set -+# CONFIG_ARCH_NS9XXX is not set -+# CONFIG_ARCH_W90X900 is not set -+# CONFIG_ARCH_PNX4008 is not set -+# CONFIG_ARCH_PXA is not set -+# CONFIG_ARCH_MSM is not set -+# CONFIG_ARCH_RPC is not set -+# CONFIG_ARCH_SA1100 is not set -+CONFIG_ARCH_S3C2410=y -+# CONFIG_ARCH_S3C64XX is not set -+# CONFIG_ARCH_S5PC1XX is not set -+# CONFIG_ARCH_SHARK is not set -+# CONFIG_ARCH_LH7A40X is not set -+# CONFIG_ARCH_U300 is not set -+# CONFIG_ARCH_DAVINCI is not set -+# CONFIG_ARCH_OMAP is not set -+# CONFIG_ARCH_BCMRING is not set -+CONFIG_PLAT_S3C24XX=y -+CONFIG_S3C2410_CLOCK=y -+CONFIG_CPU_S3C244X=y -+CONFIG_S3C24XX_PWM=y -+CONFIG_S3C24XX_GPIO_EXTRA=64 -+CONFIG_S3C24XX_GPIO_EXTRA64=y -+CONFIG_S3C2410_DMA=y -+# CONFIG_S3C2410_DMA_DEBUG is not set -+CONFIG_S3C24XX_ADC=y -+CONFIG_PLAT_S3C=y -+CONFIG_CPU_LLSERIAL_S3C2440_ONLY=y -+CONFIG_CPU_LLSERIAL_S3C2440=y -+ -+# -+# Boot options -+# -+# CONFIG_S3C_BOOT_WATCHDOG is not set -+# CONFIG_S3C_BOOT_ERROR_RESET is not set -+CONFIG_S3C_BOOT_UART_FORCE_FIFO=y -+ -+# -+# Power management -+# -+# CONFIG_S3C2410_PM_DEBUG is not set -+# CONFIG_S3C2410_PM_CHECK is not set -+CONFIG_S3C_LOWLEVEL_UART_PORT=2 -+CONFIG_S3C_GPIO_SPACE=0 -+CONFIG_S3C_DMA=y -+CONFIG_S3C_DEV_USB_HOST=y -+CONFIG_S3C_DEV_NAND=y -+ -+# -+# S3C2400 Machines -+# -+CONFIG_CPU_S3C2410_DMA=y -+CONFIG_S3C2410_PM=y -+CONFIG_S3C2410_GPIO=y -+ -+# -+# S3C2410 Machines -+# -+# CONFIG_ARCH_SMDK2410 is not set -+# CONFIG_ARCH_H1940 is not set -+# CONFIG_MACH_N30 is not set -+# CONFIG_ARCH_BAST is not set -+# CONFIG_MACH_OTOM is not set -+# CONFIG_MACH_AML_M5900 is not set -+# CONFIG_MACH_TCT_HAMMER is not set -+# CONFIG_MACH_VR1000 is not set -+# CONFIG_MACH_QT2410 is not set -+ -+# -+# S3C2412 Machines -+# -+# CONFIG_MACH_JIVE is not set -+# CONFIG_MACH_SMDK2413 is not set -+# CONFIG_MACH_SMDK2412 is not set -+# CONFIG_MACH_VSTMS is not set -+ -+# -+# S3C2440 Machines -+# -+# CONFIG_MACH_ANUBIS is not set -+# CONFIG_MACH_OSIRIS is not set -+# CONFIG_MACH_RX3715 is not set -+# CONFIG_ARCH_S3C2440 is not set -+# CONFIG_MACH_NEXCODER_2440 is not set -+# CONFIG_MACH_AT2440EVB is not set -+# CONFIG_MACH_MINI2440 is not set -+CONFIG_CPU_S3C2442=y -+ -+# -+# S3C2442 Machines -+# -+CONFIG_MACH_NEO1973_GTA02=y -+ -+# -+# S3C2443 Machines -+# -+# CONFIG_MACH_SMDK2443 is not set -+ -+# -+# Processor Type -+# -+CONFIG_CPU_32=y -+CONFIG_CPU_ARM920T=y -+CONFIG_CPU_32v4T=y -+CONFIG_CPU_ABRT_EV4T=y -+CONFIG_CPU_PABRT_LEGACY=y -+CONFIG_CPU_CACHE_V4WT=y -+CONFIG_CPU_CACHE_VIVT=y -+CONFIG_CPU_COPY_V4WB=y -+CONFIG_CPU_TLB_V4WBI=y -+CONFIG_CPU_CP15=y -+CONFIG_CPU_CP15_MMU=y -+ -+# -+# Processor Features -+# -+CONFIG_ARM_THUMB=y -+# CONFIG_CPU_ICACHE_DISABLE is not set -+# CONFIG_CPU_DCACHE_DISABLE is not set -+# CONFIG_CPU_DCACHE_WRITETHROUGH is not set -+CONFIG_ARM_L1_CACHE_SHIFT=5 -+ -+# -+# Bus support -+# -+# CONFIG_PCI_SYSCALL is not set -+# CONFIG_ARCH_SUPPORTS_MSI is not set -+# CONFIG_PCCARD is not set -+ -+# -+# Kernel Features -+# -+CONFIG_VMSPLIT_3G=y -+# CONFIG_VMSPLIT_2G is not set -+# CONFIG_VMSPLIT_1G is not set -+CONFIG_PAGE_OFFSET=0xC0000000 -+CONFIG_PREEMPT_NONE=y -+# CONFIG_PREEMPT_VOLUNTARY is not set -+# CONFIG_PREEMPT is not set -+CONFIG_HZ=200 -+CONFIG_AEABI=y -+# CONFIG_OABI_COMPAT is not set -+# CONFIG_ARCH_SPARSEMEM_DEFAULT is not set -+# CONFIG_ARCH_SELECT_MEMORY_MODEL is not set -+# CONFIG_HIGHMEM is not set -+CONFIG_SELECT_MEMORY_MODEL=y -+CONFIG_FLATMEM_MANUAL=y -+# CONFIG_DISCONTIGMEM_MANUAL is not set -+# CONFIG_SPARSEMEM_MANUAL is not set -+CONFIG_FLATMEM=y -+CONFIG_FLAT_NODE_MEM_MAP=y -+CONFIG_PAGEFLAGS_EXTENDED=y -+CONFIG_SPLIT_PTLOCK_CPUS=4096 -+# CONFIG_PHYS_ADDR_T_64BIT is not set -+CONFIG_ZONE_DMA_FLAG=0 -+CONFIG_VIRT_TO_BUS=y -+CONFIG_HAVE_MLOCK=y -+CONFIG_HAVE_MLOCKED_PAGE_BIT=y -+# CONFIG_KSM is not set -+CONFIG_DEFAULT_MMAP_MIN_ADDR=4096 -+CONFIG_ALIGNMENT_TRAP=y -+# CONFIG_UACCESS_WITH_MEMCPY is not set -+ -+# -+# Boot options -+# -+CONFIG_ZBOOT_ROM_TEXT=0x0 -+CONFIG_ZBOOT_ROM_BSS=0x0 -+CONFIG_CMDLINE="unused -- bootloader passes ATAG list" -+# CONFIG_XIP_KERNEL is not set -+# CONFIG_KEXEC is not set -+ -+# -+# CPU Power Management -+# -+# CONFIG_CPU_FREQ is not set -+CONFIG_CPU_IDLE=y -+CONFIG_CPU_IDLE_GOV_LADDER=y -+ -+# -+# Floating point emulation -+# -+ -+# -+# At least one emulation must be selected -+# -+ -+# -+# Userspace binary formats -+# -+CONFIG_BINFMT_ELF=y -+# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set -+CONFIG_HAVE_AOUT=y -+# CONFIG_BINFMT_AOUT is not set -+# CONFIG_BINFMT_MISC is not set -+ -+# -+# Power management options -+# -+CONFIG_PM=y -+# CONFIG_PM_DEBUG is not set -+CONFIG_PM_SLEEP=y -+CONFIG_SUSPEND=y -+CONFIG_SUSPEND_FREEZER=y -+# CONFIG_APM_EMULATION is not set -+# CONFIG_PM_RUNTIME is not set -+CONFIG_ARCH_SUSPEND_POSSIBLE=y -+CONFIG_NET=y -+ -+# -+# Networking options -+# -+CONFIG_PACKET=y -+CONFIG_PACKET_MMAP=y -+CONFIG_UNIX=y -+CONFIG_XFRM=y -+CONFIG_XFRM_USER=m -+# CONFIG_XFRM_SUB_POLICY is not set -+CONFIG_XFRM_MIGRATE=y -+# CONFIG_XFRM_STATISTICS is not set -+CONFIG_XFRM_IPCOMP=m -+CONFIG_NET_KEY=m -+CONFIG_NET_KEY_MIGRATE=y -+CONFIG_INET=y -+CONFIG_IP_MULTICAST=y -+CONFIG_IP_ADVANCED_ROUTER=y -+CONFIG_ASK_IP_FIB_HASH=y -+# CONFIG_IP_FIB_TRIE is not set -+CONFIG_IP_FIB_HASH=y -+CONFIG_IP_MULTIPLE_TABLES=y -+# CONFIG_IP_ROUTE_MULTIPATH is not set -+# CONFIG_IP_ROUTE_VERBOSE is not set -+CONFIG_IP_PNP=y -+# CONFIG_IP_PNP_DHCP is not set -+# CONFIG_IP_PNP_BOOTP is not set -+# CONFIG_IP_PNP_RARP is not set -+CONFIG_NET_IPIP=m -+CONFIG_NET_IPGRE=m -+# CONFIG_NET_IPGRE_BROADCAST is not set -+CONFIG_IP_MROUTE=y -+# CONFIG_IP_PIMSM_V1 is not set -+# CONFIG_IP_PIMSM_V2 is not set -+# CONFIG_ARPD is not set -+CONFIG_SYN_COOKIES=y -+CONFIG_INET_AH=m -+CONFIG_INET_ESP=m -+CONFIG_INET_IPCOMP=m -+CONFIG_INET_XFRM_TUNNEL=m -+CONFIG_INET_TUNNEL=m -+CONFIG_INET_XFRM_MODE_TRANSPORT=m -+CONFIG_INET_XFRM_MODE_TUNNEL=m -+CONFIG_INET_XFRM_MODE_BEET=m -+# CONFIG_INET_LRO is not set -+CONFIG_INET_DIAG=y -+CONFIG_INET_TCP_DIAG=y -+CONFIG_TCP_CONG_ADVANCED=y -+# CONFIG_TCP_CONG_BIC is not set -+# CONFIG_TCP_CONG_CUBIC is not set -+CONFIG_TCP_CONG_WESTWOOD=y -+# CONFIG_TCP_CONG_HTCP is not set -+# CONFIG_TCP_CONG_HSTCP is not set -+# CONFIG_TCP_CONG_HYBLA is not set -+# CONFIG_TCP_CONG_VEGAS is not set -+# CONFIG_TCP_CONG_SCALABLE is not set -+# CONFIG_TCP_CONG_LP is not set -+# CONFIG_TCP_CONG_VENO is not set -+# CONFIG_TCP_CONG_YEAH is not set -+# CONFIG_TCP_CONG_ILLINOIS is not set -+# CONFIG_DEFAULT_BIC is not set -+# CONFIG_DEFAULT_CUBIC is not set -+# CONFIG_DEFAULT_HTCP is not set -+# CONFIG_DEFAULT_VEGAS is not set -+CONFIG_DEFAULT_WESTWOOD=y -+# CONFIG_DEFAULT_RENO is not set -+CONFIG_DEFAULT_TCP_CONG="westwood" -+CONFIG_TCP_MD5SIG=y -+CONFIG_IPV6=m -+# CONFIG_IPV6_PRIVACY is not set -+# CONFIG_IPV6_ROUTER_PREF is not set -+# CONFIG_IPV6_OPTIMISTIC_DAD is not set -+CONFIG_INET6_AH=m -+CONFIG_INET6_ESP=m -+CONFIG_INET6_IPCOMP=m -+# CONFIG_IPV6_MIP6 is not set -+CONFIG_INET6_XFRM_TUNNEL=m -+CONFIG_INET6_TUNNEL=m -+CONFIG_INET6_XFRM_MODE_TRANSPORT=m -+CONFIG_INET6_XFRM_MODE_TUNNEL=m -+CONFIG_INET6_XFRM_MODE_BEET=m -+# CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set -+CONFIG_IPV6_SIT=m -+CONFIG_IPV6_NDISC_NODETYPE=y -+CONFIG_IPV6_TUNNEL=m -+# CONFIG_IPV6_MULTIPLE_TABLES is not set -+# CONFIG_IPV6_MROUTE is not set -+# CONFIG_NETWORK_SECMARK is not set -+CONFIG_NETFILTER=y -+# CONFIG_NETFILTER_DEBUG is not set -+CONFIG_NETFILTER_ADVANCED=y -+CONFIG_BRIDGE_NETFILTER=y -+ -+# -+# Core Netfilter Configuration -+# -+CONFIG_NETFILTER_NETLINK=m -+CONFIG_NETFILTER_NETLINK_QUEUE=m -+CONFIG_NETFILTER_NETLINK_LOG=m -+CONFIG_NF_CONNTRACK=m -+CONFIG_NF_CT_ACCT=y -+CONFIG_NF_CONNTRACK_MARK=y -+# CONFIG_NF_CONNTRACK_EVENTS is not set -+# CONFIG_NF_CT_PROTO_DCCP is not set -+CONFIG_NF_CT_PROTO_GRE=m -+CONFIG_NF_CT_PROTO_SCTP=m -+# CONFIG_NF_CT_PROTO_UDPLITE is not set -+# CONFIG_NF_CONNTRACK_AMANDA is not set -+CONFIG_NF_CONNTRACK_FTP=m -+CONFIG_NF_CONNTRACK_H323=m -+CONFIG_NF_CONNTRACK_IRC=m -+CONFIG_NF_CONNTRACK_NETBIOS_NS=m -+CONFIG_NF_CONNTRACK_PPTP=m -+CONFIG_NF_CONNTRACK_SANE=m -+CONFIG_NF_CONNTRACK_SIP=m -+CONFIG_NF_CONNTRACK_TFTP=m -+CONFIG_NF_CT_NETLINK=m -+# CONFIG_NETFILTER_TPROXY is not set -+CONFIG_NETFILTER_XTABLES=m -+CONFIG_NETFILTER_XT_TARGET_CLASSIFY=m -+CONFIG_NETFILTER_XT_TARGET_CONNMARK=m -+CONFIG_NETFILTER_XT_TARGET_DSCP=m -+CONFIG_NETFILTER_XT_TARGET_HL=m -+# CONFIG_NETFILTER_XT_TARGET_LED is not set -+CONFIG_NETFILTER_XT_TARGET_MARK=m -+CONFIG_NETFILTER_XT_TARGET_NFLOG=m -+CONFIG_NETFILTER_XT_TARGET_NFQUEUE=m -+CONFIG_NETFILTER_XT_TARGET_NOTRACK=m -+# CONFIG_NETFILTER_XT_TARGET_RATEEST is not set -+# CONFIG_NETFILTER_XT_TARGET_TRACE is not set -+CONFIG_NETFILTER_XT_TARGET_TCPMSS=m -+# CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP is not set -+# CONFIG_NETFILTER_XT_MATCH_CLUSTER is not set -+# CONFIG_NETFILTER_XT_MATCH_COMMENT is not set -+CONFIG_NETFILTER_XT_MATCH_CONNBYTES=m -+# CONFIG_NETFILTER_XT_MATCH_CONNLIMIT is not set -+CONFIG_NETFILTER_XT_MATCH_CONNMARK=m -+CONFIG_NETFILTER_XT_MATCH_CONNTRACK=m -+CONFIG_NETFILTER_XT_MATCH_DCCP=m -+CONFIG_NETFILTER_XT_MATCH_DSCP=m -+CONFIG_NETFILTER_XT_MATCH_ESP=m -+CONFIG_NETFILTER_XT_MATCH_HASHLIMIT=m -+CONFIG_NETFILTER_XT_MATCH_HELPER=m -+CONFIG_NETFILTER_XT_MATCH_HL=m -+CONFIG_NETFILTER_XT_MATCH_IPRANGE=m -+CONFIG_NETFILTER_XT_MATCH_LENGTH=m -+CONFIG_NETFILTER_XT_MATCH_LIMIT=m -+CONFIG_NETFILTER_XT_MATCH_MAC=m -+CONFIG_NETFILTER_XT_MATCH_MARK=m -+CONFIG_NETFILTER_XT_MATCH_MULTIPORT=m -+# CONFIG_NETFILTER_XT_MATCH_OWNER is not set -+CONFIG_NETFILTER_XT_MATCH_POLICY=m -+CONFIG_NETFILTER_XT_MATCH_PHYSDEV=m -+CONFIG_NETFILTER_XT_MATCH_PKTTYPE=m -+CONFIG_NETFILTER_XT_MATCH_QUOTA=m -+# CONFIG_NETFILTER_XT_MATCH_RATEEST is not set -+CONFIG_NETFILTER_XT_MATCH_REALM=m -+CONFIG_NETFILTER_XT_MATCH_RECENT=m -+# CONFIG_NETFILTER_XT_MATCH_RECENT_PROC_COMPAT is not set -+CONFIG_NETFILTER_XT_MATCH_SCTP=m -+CONFIG_NETFILTER_XT_MATCH_STATE=m -+CONFIG_NETFILTER_XT_MATCH_STATISTIC=m -+CONFIG_NETFILTER_XT_MATCH_STRING=m -+CONFIG_NETFILTER_XT_MATCH_TCPMSS=m -+CONFIG_NETFILTER_XT_MATCH_TIME=m -+# CONFIG_NETFILTER_XT_MATCH_U32 is not set -+# CONFIG_NETFILTER_XT_MATCH_OSF is not set -+# CONFIG_IP_VS is not set -+ -+# -+# IP: Netfilter Configuration -+# -+CONFIG_NF_DEFRAG_IPV4=m -+CONFIG_NF_CONNTRACK_IPV4=m -+CONFIG_NF_CONNTRACK_PROC_COMPAT=y -+# CONFIG_IP_NF_QUEUE is not set -+CONFIG_IP_NF_IPTABLES=m -+CONFIG_IP_NF_MATCH_ADDRTYPE=m -+CONFIG_IP_NF_MATCH_AH=m -+CONFIG_IP_NF_MATCH_ECN=m -+CONFIG_IP_NF_MATCH_TTL=m -+CONFIG_IP_NF_FILTER=m -+CONFIG_IP_NF_TARGET_REJECT=m -+CONFIG_IP_NF_TARGET_LOG=m -+CONFIG_IP_NF_TARGET_ULOG=m -+CONFIG_NF_NAT=m -+CONFIG_NF_NAT_NEEDED=y -+CONFIG_IP_NF_TARGET_MASQUERADE=m -+CONFIG_IP_NF_TARGET_NETMAP=m -+CONFIG_IP_NF_TARGET_REDIRECT=m -+CONFIG_NF_NAT_SNMP_BASIC=m -+CONFIG_NF_NAT_PROTO_GRE=m -+CONFIG_NF_NAT_PROTO_SCTP=m -+CONFIG_NF_NAT_FTP=m -+CONFIG_NF_NAT_IRC=m -+CONFIG_NF_NAT_TFTP=m -+# CONFIG_NF_NAT_AMANDA is not set -+CONFIG_NF_NAT_PPTP=m -+CONFIG_NF_NAT_H323=m -+CONFIG_NF_NAT_SIP=m -+CONFIG_IP_NF_MANGLE=m -+CONFIG_IP_NF_TARGET_CLUSTERIP=m -+CONFIG_IP_NF_TARGET_ECN=m -+CONFIG_IP_NF_TARGET_TTL=m -+CONFIG_IP_NF_RAW=m -+# CONFIG_IP_NF_ARPTABLES is not set -+ -+# -+# IPv6: Netfilter Configuration -+# -+CONFIG_NF_CONNTRACK_IPV6=m -+# CONFIG_IP6_NF_QUEUE is not set -+CONFIG_IP6_NF_IPTABLES=m -+CONFIG_IP6_NF_MATCH_AH=m -+CONFIG_IP6_NF_MATCH_EUI64=m -+CONFIG_IP6_NF_MATCH_FRAG=m -+CONFIG_IP6_NF_MATCH_OPTS=m -+CONFIG_IP6_NF_MATCH_HL=m -+CONFIG_IP6_NF_MATCH_IPV6HEADER=m -+CONFIG_IP6_NF_MATCH_MH=m -+CONFIG_IP6_NF_MATCH_RT=m -+CONFIG_IP6_NF_TARGET_HL=m -+CONFIG_IP6_NF_TARGET_LOG=m -+CONFIG_IP6_NF_FILTER=m -+CONFIG_IP6_NF_TARGET_REJECT=m -+CONFIG_IP6_NF_MANGLE=m -+# CONFIG_IP6_NF_RAW is not set -+CONFIG_BRIDGE_NF_EBTABLES=m -+CONFIG_BRIDGE_EBT_BROUTE=m -+CONFIG_BRIDGE_EBT_T_FILTER=m -+CONFIG_BRIDGE_EBT_T_NAT=m -+CONFIG_BRIDGE_EBT_802_3=m -+CONFIG_BRIDGE_EBT_AMONG=m -+CONFIG_BRIDGE_EBT_ARP=m -+CONFIG_BRIDGE_EBT_IP=m -+# CONFIG_BRIDGE_EBT_IP6 is not set -+CONFIG_BRIDGE_EBT_LIMIT=m -+CONFIG_BRIDGE_EBT_MARK=m -+CONFIG_BRIDGE_EBT_PKTTYPE=m -+CONFIG_BRIDGE_EBT_STP=m -+CONFIG_BRIDGE_EBT_VLAN=m -+CONFIG_BRIDGE_EBT_ARPREPLY=m -+CONFIG_BRIDGE_EBT_DNAT=m -+CONFIG_BRIDGE_EBT_MARK_T=m -+CONFIG_BRIDGE_EBT_REDIRECT=m -+CONFIG_BRIDGE_EBT_SNAT=m -+CONFIG_BRIDGE_EBT_LOG=m -+CONFIG_BRIDGE_EBT_ULOG=m -+# CONFIG_BRIDGE_EBT_NFLOG is not set -+# CONFIG_IP_DCCP is not set -+# CONFIG_IP_SCTP is not set -+# CONFIG_RDS is not set -+# CONFIG_TIPC is not set -+# CONFIG_ATM is not set -+CONFIG_STP=y -+CONFIG_BRIDGE=y -+# CONFIG_NET_DSA is not set -+# CONFIG_VLAN_8021Q is not set -+# CONFIG_DECNET is not set -+CONFIG_LLC=y -+# CONFIG_LLC2 is not set -+# CONFIG_IPX is not set -+# CONFIG_ATALK is not set -+# CONFIG_X25 is not set -+# CONFIG_LAPB is not set -+# CONFIG_ECONET is not set -+# CONFIG_WAN_ROUTER is not set -+# CONFIG_PHONET is not set -+# CONFIG_IEEE802154 is not set -+CONFIG_NET_SCHED=y -+ -+# -+# Queueing/Scheduling -+# -+CONFIG_NET_SCH_CBQ=m -+CONFIG_NET_SCH_HTB=m -+CONFIG_NET_SCH_HFSC=m -+CONFIG_NET_SCH_PRIO=m -+# CONFIG_NET_SCH_MULTIQ is not set -+CONFIG_NET_SCH_RED=m -+CONFIG_NET_SCH_SFQ=m -+CONFIG_NET_SCH_TEQL=m -+CONFIG_NET_SCH_TBF=m -+CONFIG_NET_SCH_GRED=m -+CONFIG_NET_SCH_DSMARK=m -+CONFIG_NET_SCH_NETEM=m -+# CONFIG_NET_SCH_DRR is not set -+ -+# -+# Classification -+# -+CONFIG_NET_CLS=y -+CONFIG_NET_CLS_BASIC=m -+CONFIG_NET_CLS_TCINDEX=m -+CONFIG_NET_CLS_ROUTE4=m -+CONFIG_NET_CLS_ROUTE=y -+CONFIG_NET_CLS_FW=m -+CONFIG_NET_CLS_U32=m -+CONFIG_CLS_U32_PERF=y -+CONFIG_CLS_U32_MARK=y -+CONFIG_NET_CLS_RSVP=m -+CONFIG_NET_CLS_RSVP6=m -+# CONFIG_NET_CLS_FLOW is not set -+# CONFIG_NET_EMATCH is not set -+# CONFIG_NET_CLS_ACT is not set -+# CONFIG_NET_CLS_IND is not set -+CONFIG_NET_SCH_FIFO=y -+# CONFIG_DCB is not set -+ -+# -+# Network testing -+# -+# CONFIG_NET_PKTGEN is not set -+# CONFIG_HAMRADIO is not set -+# CONFIG_CAN is not set -+# CONFIG_IRDA is not set -+CONFIG_BT=y -+CONFIG_BT_L2CAP=y -+CONFIG_BT_SCO=y -+CONFIG_BT_RFCOMM=y -+CONFIG_BT_RFCOMM_TTY=y -+CONFIG_BT_BNEP=y -+CONFIG_BT_BNEP_MC_FILTER=y -+CONFIG_BT_BNEP_PROTO_FILTER=y -+CONFIG_BT_HIDP=y -+ -+# -+# Bluetooth device drivers -+# -+CONFIG_BT_HCIBTUSB=y -+# CONFIG_BT_HCIBTSDIO is not set -+# CONFIG_BT_HCIUART is not set -+# CONFIG_BT_HCIBCM203X is not set -+# CONFIG_BT_HCIBPA10X is not set -+# CONFIG_BT_HCIBFUSB is not set -+# CONFIG_BT_HCIVHCI is not set -+# CONFIG_BT_MRVL is not set -+# CONFIG_AF_RXRPC is not set -+CONFIG_FIB_RULES=y -+CONFIG_WIRELESS=y -+# CONFIG_CFG80211 is not set -+CONFIG_CFG80211_DEFAULT_PS_VALUE=0 -+CONFIG_WIRELESS_OLD_REGULATORY=y -+CONFIG_WIRELESS_EXT=y -+CONFIG_WIRELESS_EXT_SYSFS=y -+# CONFIG_LIB80211 is not set -+ -+# -+# CFG80211 needs to be enabled for MAC80211 -+# -+# CONFIG_WIMAX is not set -+# CONFIG_RFKILL is not set -+# CONFIG_NET_9P is not set -+ -+# -+# Device Drivers -+# -+ -+# -+# Generic Driver Options -+# -+CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" -+CONFIG_DEVTMPFS=y -+CONFIG_DEVTMPFS_MOUNT=y -+CONFIG_STANDALONE=y -+CONFIG_PREVENT_FIRMWARE_BUILD=y -+CONFIG_FW_LOADER=y -+# CONFIG_FIRMWARE_IN_KERNEL is not set -+CONFIG_EXTRA_FIRMWARE="" -+# CONFIG_SYS_HYPERVISOR is not set -+CONFIG_CONNECTOR=m -+CONFIG_MTD=y -+# CONFIG_MTD_DEBUG is not set -+# CONFIG_MTD_TESTS is not set -+CONFIG_MTD_CONCAT=y -+CONFIG_MTD_PARTITIONS=y -+# CONFIG_MTD_REDBOOT_PARTS is not set -+CONFIG_MTD_CMDLINE_PARTS=y -+# CONFIG_MTD_AFS_PARTS is not set -+# CONFIG_MTD_AR7_PARTS is not set -+ -+# -+# User Modules And Translation Layers -+# -+CONFIG_MTD_CHAR=y -+CONFIG_MTD_BLKDEVS=y -+CONFIG_MTD_BLOCK=y -+# CONFIG_FTL is not set -+# CONFIG_NFTL is not set -+# CONFIG_INFTL is not set -+# CONFIG_RFD_FTL is not set -+# CONFIG_SSFDC is not set -+# CONFIG_MTD_OOPS is not set -+ -+# -+# RAM/ROM/Flash chip drivers -+# -+CONFIG_MTD_CFI=y -+# CONFIG_MTD_JEDECPROBE is not set -+CONFIG_MTD_GEN_PROBE=y -+# CONFIG_MTD_CFI_ADV_OPTIONS is not set -+CONFIG_MTD_MAP_BANK_WIDTH_1=y -+CONFIG_MTD_MAP_BANK_WIDTH_2=y -+CONFIG_MTD_MAP_BANK_WIDTH_4=y -+# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set -+# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set -+# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set -+CONFIG_MTD_CFI_I1=y -+CONFIG_MTD_CFI_I2=y -+# CONFIG_MTD_CFI_I4 is not set -+# CONFIG_MTD_CFI_I8 is not set -+CONFIG_MTD_CFI_INTELEXT=y -+# CONFIG_MTD_CFI_AMDSTD is not set -+# CONFIG_MTD_CFI_STAA is not set -+CONFIG_MTD_CFI_UTIL=y -+# CONFIG_MTD_RAM is not set -+CONFIG_MTD_ROM=y -+CONFIG_MTD_ABSENT=y -+ -+# -+# Mapping drivers for chip access -+# -+# CONFIG_MTD_COMPLEX_MAPPINGS is not set -+CONFIG_MTD_PHYSMAP=y -+# CONFIG_MTD_PHYSMAP_COMPAT is not set -+# CONFIG_MTD_ARM_INTEGRATOR is not set -+# CONFIG_MTD_PLATRAM is not set -+ -+# -+# Self-contained MTD device drivers -+# -+# CONFIG_MTD_DATAFLASH is not set -+# CONFIG_MTD_M25P80 is not set -+# CONFIG_MTD_SST25L is not set -+# CONFIG_MTD_SLRAM is not set -+# CONFIG_MTD_PHRAM is not set -+# CONFIG_MTD_MTDRAM is not set -+# CONFIG_MTD_BLOCK2MTD is not set -+ -+# -+# Disk-On-Chip Device Drivers -+# -+# CONFIG_MTD_DOC2000 is not set -+# CONFIG_MTD_DOC2001 is not set -+# CONFIG_MTD_DOC2001PLUS is not set -+CONFIG_MTD_NAND=y -+CONFIG_MTD_NAND_VERIFY_WRITE=y -+# CONFIG_MTD_NAND_ECC_SMC is not set -+# CONFIG_MTD_NAND_MUSEUM_IDS is not set -+# CONFIG_MTD_NAND_GPIO is not set -+CONFIG_MTD_NAND_IDS=y -+CONFIG_MTD_NAND_S3C2410=y -+# CONFIG_MTD_NAND_S3C2410_DEBUG is not set -+CONFIG_MTD_NAND_S3C2410_HWECC=y -+# CONFIG_MTD_NAND_S3C2410_CLKSTOP is not set -+# CONFIG_MTD_NAND_DISKONCHIP is not set -+# CONFIG_MTD_NAND_NANDSIM is not set -+# CONFIG_MTD_NAND_PLATFORM is not set -+# CONFIG_MTD_ALAUDA is not set -+# CONFIG_MTD_ONENAND is not set -+ -+# -+# LPDDR flash memory drivers -+# -+# CONFIG_MTD_LPDDR is not set -+ -+# -+# UBI - Unsorted block images -+# -+# CONFIG_MTD_UBI is not set -+# CONFIG_PARPORT is not set -+CONFIG_BLK_DEV=y -+# CONFIG_BLK_DEV_COW_COMMON is not set -+CONFIG_BLK_DEV_LOOP=m -+# CONFIG_BLK_DEV_CRYPTOLOOP is not set -+# CONFIG_BLK_DEV_NBD is not set -+CONFIG_BLK_DEV_UB=m -+CONFIG_BLK_DEV_RAM=y -+CONFIG_BLK_DEV_RAM_COUNT=16 -+CONFIG_BLK_DEV_RAM_SIZE=4096 -+# CONFIG_BLK_DEV_XIP is not set -+# CONFIG_CDROM_PKTCDVD is not set -+# CONFIG_ATA_OVER_ETH is not set -+# CONFIG_MG_DISK is not set -+# CONFIG_MISC_DEVICES is not set -+CONFIG_HAVE_IDE=y -+# CONFIG_IDE is not set -+ -+# -+# SCSI device support -+# -+# CONFIG_RAID_ATTRS is not set -+CONFIG_SCSI=m -+CONFIG_SCSI_DMA=y -+# CONFIG_SCSI_TGT is not set -+# CONFIG_SCSI_NETLINK is not set -+CONFIG_SCSI_PROC_FS=y -+ -+# -+# SCSI support type (disk, tape, CD-ROM) -+# -+CONFIG_BLK_DEV_SD=m -+# CONFIG_CHR_DEV_ST is not set -+# CONFIG_CHR_DEV_OSST is not set -+CONFIG_BLK_DEV_SR=m -+# CONFIG_BLK_DEV_SR_VENDOR is not set -+CONFIG_CHR_DEV_SG=m -+# CONFIG_CHR_DEV_SCH is not set -+CONFIG_SCSI_MULTI_LUN=y -+# CONFIG_SCSI_CONSTANTS is not set -+# CONFIG_SCSI_LOGGING is not set -+CONFIG_SCSI_SCAN_ASYNC=y -+CONFIG_SCSI_WAIT_SCAN=m -+ -+# -+# SCSI Transports -+# -+# CONFIG_SCSI_SPI_ATTRS is not set -+# CONFIG_SCSI_FC_ATTRS is not set -+# CONFIG_SCSI_ISCSI_ATTRS is not set -+# CONFIG_SCSI_SAS_LIBSAS is not set -+# CONFIG_SCSI_SRP_ATTRS is not set -+CONFIG_SCSI_LOWLEVEL=y -+# CONFIG_ISCSI_TCP is not set -+# CONFIG_LIBFC is not set -+# CONFIG_LIBFCOE is not set -+# CONFIG_SCSI_DEBUG is not set -+# CONFIG_SCSI_DH is not set -+# CONFIG_SCSI_OSD_INITIATOR is not set -+# CONFIG_ATA is not set -+# CONFIG_MD is not set -+CONFIG_NETDEVICES=y -+# CONFIG_DUMMY is not set -+# CONFIG_BONDING is not set -+# CONFIG_MACVLAN is not set -+# CONFIG_EQUALIZER is not set -+CONFIG_TUN=m -+# CONFIG_VETH is not set -+# CONFIG_NET_ETHERNET is not set -+CONFIG_MII=m -+# CONFIG_NETDEV_1000 is not set -+# CONFIG_NETDEV_10000 is not set -+CONFIG_WLAN=y -+# CONFIG_WLAN_PRE80211 is not set -+# CONFIG_WLAN_80211 is not set -+ -+# -+# Enable WiMAX (Networking options) to see the WiMAX drivers -+# -+ -+# -+# USB Network Adapters -+# -+CONFIG_USB_CATC=m -+CONFIG_USB_KAWETH=m -+CONFIG_USB_PEGASUS=m -+CONFIG_USB_RTL8150=m -+# CONFIG_USB_USBNET is not set -+# CONFIG_WAN is not set -+CONFIG_PPP=m -+CONFIG_PPP_MULTILINK=y -+CONFIG_PPP_FILTER=y -+CONFIG_PPP_ASYNC=m -+CONFIG_PPP_SYNC_TTY=m -+CONFIG_PPP_DEFLATE=m -+CONFIG_PPP_BSDCOMP=m -+CONFIG_PPP_MPPE=m -+# CONFIG_PPPOE is not set -+# CONFIG_PPPOL2TP is not set -+# CONFIG_SLIP is not set -+CONFIG_SLHC=m -+# CONFIG_NETCONSOLE is not set -+# CONFIG_NETPOLL is not set -+# CONFIG_NET_POLL_CONTROLLER is not set -+# CONFIG_ISDN is not set -+# CONFIG_PHONE is not set -+ -+# -+# Input device support -+# -+CONFIG_INPUT=y -+# CONFIG_INPUT_FF_MEMLESS is not set -+# CONFIG_INPUT_POLLDEV is not set -+ -+# -+# Userland interfaces -+# -+CONFIG_INPUT_MOUSEDEV=y -+# CONFIG_INPUT_MOUSEDEV_PSAUX is not set -+CONFIG_INPUT_MOUSEDEV_SCREEN_X=480 -+CONFIG_INPUT_MOUSEDEV_SCREEN_Y=640 -+CONFIG_INPUT_JOYDEV=m -+CONFIG_INPUT_EVDEV=y -+# CONFIG_INPUT_EVBUG is not set -+ -+# -+# Input Device Drivers -+# -+CONFIG_INPUT_KEYBOARD=y -+# CONFIG_KEYBOARD_ADP5588 is not set -+# CONFIG_KEYBOARD_ATKBD is not set -+# CONFIG_QT2160 is not set -+# CONFIG_KEYBOARD_LKKBD is not set -+CONFIG_KEYBOARD_GPIO=y -+# CONFIG_KEYBOARD_MATRIX is not set -+# CONFIG_KEYBOARD_LM8323 is not set -+# CONFIG_KEYBOARD_MAX7359 is not set -+# CONFIG_KEYBOARD_NEWTON is not set -+# CONFIG_KEYBOARD_OPENCORES is not set -+CONFIG_KEYBOARD_STOWAWAY=m -+# CONFIG_KEYBOARD_SUNKBD is not set -+# CONFIG_KEYBOARD_XTKBD is not set -+# CONFIG_INPUT_MOUSE is not set -+# CONFIG_INPUT_JOYSTICK is not set -+# CONFIG_INPUT_TABLET is not set -+CONFIG_INPUT_TOUCHSCREEN=y -+CONFIG_TOUCHSCREEN_FILTER=y -+CONFIG_TOUCHSCREEN_FILTER_GROUP=y -+CONFIG_TOUCHSCREEN_FILTER_MEDIAN=y -+CONFIG_TOUCHSCREEN_FILTER_MEAN=y -+CONFIG_TOUCHSCREEN_FILTER_LINEAR=y -+CONFIG_TOUCHSCREEN_S3C2410=y -+# CONFIG_TOUCHSCREEN_S3C2410_DEBUG is not set -+# CONFIG_TOUCHSCREEN_ADS7846 is not set -+# CONFIG_TOUCHSCREEN_AD7877 is not set -+# CONFIG_TOUCHSCREEN_AD7879_I2C is not set -+# CONFIG_TOUCHSCREEN_AD7879_SPI is not set -+# CONFIG_TOUCHSCREEN_AD7879 is not set -+# CONFIG_TOUCHSCREEN_EETI is not set -+# CONFIG_TOUCHSCREEN_FUJITSU is not set -+# CONFIG_TOUCHSCREEN_GUNZE is not set -+# CONFIG_TOUCHSCREEN_ELO is not set -+# CONFIG_TOUCHSCREEN_WACOM_W8001 is not set -+# CONFIG_TOUCHSCREEN_MCS5000 is not set -+# CONFIG_TOUCHSCREEN_MTOUCH is not set -+# CONFIG_TOUCHSCREEN_INEXIO is not set -+# CONFIG_TOUCHSCREEN_MK712 is not set -+# CONFIG_TOUCHSCREEN_PENMOUNT is not set -+# CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set -+# CONFIG_TOUCHSCREEN_TOUCHWIN is not set -+# CONFIG_TOUCHSCREEN_USB_COMPOSITE is not set -+# CONFIG_TOUCHSCREEN_TOUCHIT213 is not set -+# CONFIG_TOUCHSCREEN_TSC2007 is not set -+# CONFIG_TOUCHSCREEN_W90X900 is not set -+CONFIG_INPUT_MISC=y -+# CONFIG_INPUT_ATI_REMOTE is not set -+# CONFIG_INPUT_ATI_REMOTE2 is not set -+# CONFIG_INPUT_KEYSPAN_REMOTE is not set -+# CONFIG_INPUT_POWERMATE is not set -+# CONFIG_INPUT_YEALINK is not set -+# CONFIG_INPUT_CM109 is not set -+CONFIG_INPUT_UINPUT=m -+CONFIG_INPUT_PCF50633_PMU=y -+# CONFIG_INPUT_GPIO_ROTARY_ENCODER is not set -+CONFIG_INPUT_LIS302DL=y -+ -+# -+# Hardware I/O ports -+# -+CONFIG_SERIO=y -+# CONFIG_SERIO_SERPORT is not set -+# CONFIG_SERIO_RAW is not set -+# CONFIG_GAMEPORT is not set -+ -+# -+# Character devices -+# -+CONFIG_VT=y -+CONFIG_CONSOLE_TRANSLATIONS=y -+CONFIG_VT_CONSOLE=y -+CONFIG_HW_CONSOLE=y -+CONFIG_VT_HW_CONSOLE_BINDING=y -+# CONFIG_DEVKMEM is not set -+# CONFIG_SERIAL_NONSTANDARD is not set -+ -+# -+# Serial drivers -+# -+# CONFIG_SERIAL_8250 is not set -+ -+# -+# Non-8250 serial port support -+# -+CONFIG_SERIAL_SAMSUNG=y -+CONFIG_SERIAL_SAMSUNG_UARTS=3 -+CONFIG_SERIAL_SAMSUNG_CONSOLE=y -+CONFIG_SERIAL_S3C2440=y -+# CONFIG_SERIAL_MAX3100 is not set -+CONFIG_SERIAL_CORE=y -+CONFIG_SERIAL_CORE_CONSOLE=y -+CONFIG_UNIX98_PTYS=y -+# CONFIG_DEVPTS_MULTIPLE_INSTANCES is not set -+# CONFIG_LEGACY_PTYS is not set -+# CONFIG_IPMI_HANDLER is not set -+# CONFIG_HW_RANDOM is not set -+# CONFIG_R3964 is not set -+# CONFIG_RAW_DRIVER is not set -+# CONFIG_TCG_TPM is not set -+CONFIG_I2C=y -+CONFIG_I2C_BOARDINFO=y -+# CONFIG_I2C_COMPAT is not set -+CONFIG_I2C_CHARDEV=y -+# CONFIG_I2C_HELPER_AUTO is not set -+ -+# -+# I2C Algorithms -+# -+# CONFIG_I2C_ALGOBIT is not set -+# CONFIG_I2C_ALGOPCF is not set -+# CONFIG_I2C_ALGOPCA is not set -+ -+# -+# I2C Hardware Bus support -+# -+ -+# -+# I2C system bus drivers (mostly embedded / system-on-chip) -+# -+# CONFIG_I2C_DESIGNWARE is not set -+# CONFIG_I2C_GPIO is not set -+# CONFIG_I2C_OCORES is not set -+CONFIG_I2C_S3C2410=y -+# CONFIG_I2C_SIMTEC is not set -+ -+# -+# External I2C/SMBus adapter drivers -+# -+# CONFIG_I2C_PARPORT_LIGHT is not set -+# CONFIG_I2C_TAOS_EVM is not set -+# CONFIG_I2C_TINY_USB is not set -+ -+# -+# Other I2C/SMBus bus drivers -+# -+# CONFIG_I2C_PCA_PLATFORM is not set -+# CONFIG_I2C_STUB is not set -+ -+# -+# Miscellaneous I2C Chip support -+# -+# CONFIG_DS1682 is not set -+# CONFIG_SENSORS_TSL2550 is not set -+# CONFIG_I2C_DEBUG_CORE is not set -+# CONFIG_I2C_DEBUG_ALGO is not set -+# CONFIG_I2C_DEBUG_BUS is not set -+# CONFIG_I2C_DEBUG_CHIP is not set -+CONFIG_SPI=y -+CONFIG_SPI_MASTER=y -+ -+# -+# SPI Master Controller Drivers -+# -+CONFIG_SPI_BITBANG=y -+CONFIG_SPI_GPIO=y -+CONFIG_SPI_S3C24XX=y -+CONFIG_SPI_S3C24XX_GPIO=y -+ -+# -+# SPI Protocol Masters -+# -+# CONFIG_SPI_SPIDEV is not set -+# CONFIG_SPI_TLE62X0 is not set -+ -+# -+# PPS support -+# -+# CONFIG_PPS is not set -+CONFIG_ARCH_REQUIRE_GPIOLIB=y -+CONFIG_GPIOLIB=y -+CONFIG_GPIO_SYSFS=y -+ -+# -+# Memory mapped GPIO expanders: -+# -+ -+# -+# I2C GPIO expanders: -+# -+# CONFIG_GPIO_MAX732X is not set -+# CONFIG_GPIO_PCA953X is not set -+# CONFIG_GPIO_PCF857X is not set -+CONFIG_GPIO_PCF50633=y -+ -+# -+# PCI GPIO expanders: -+# -+ -+# -+# SPI GPIO expanders: -+# -+# CONFIG_GPIO_MAX7301 is not set -+# CONFIG_GPIO_MCP23S08 is not set -+# CONFIG_GPIO_MC33880 is not set -+ -+# -+# AC97 GPIO expanders: -+# -+# CONFIG_W1 is not set -+CONFIG_POWER_SUPPLY=y -+# CONFIG_POWER_SUPPLY_DEBUG is not set -+# CONFIG_PDA_POWER is not set -+# CONFIG_BATTERY_DS2760 is not set -+# CONFIG_BATTERY_DS2782 is not set -+# CONFIG_BATTERY_BQ27x00 is not set -+# CONFIG_BATTERY_MAX17040 is not set -+CONFIG_CHARGER_PCF50633=y -+CONFIG_BATTERY_BQ27000_HDQ=y -+CONFIG_HDQ_GPIO_BITBANG=y -+CONFIG_BATTERY_PLATFORM=y -+# CONFIG_HWMON is not set -+# CONFIG_THERMAL is not set -+CONFIG_WATCHDOG=y -+# CONFIG_WATCHDOG_NOWAYOUT is not set -+ -+# -+# Watchdog Device Drivers -+# -+# CONFIG_SOFT_WATCHDOG is not set -+CONFIG_S3C2410_WATCHDOG=y -+ -+# -+# USB-based Watchdog Cards -+# -+# CONFIG_USBPCWATCHDOG is not set -+CONFIG_SSB_POSSIBLE=y -+ -+# -+# Sonics Silicon Backplane -+# -+# CONFIG_SSB is not set -+ -+# -+# Multifunction device drivers -+# -+CONFIG_MFD_CORE=y -+# CONFIG_MFD_SM501 is not set -+# CONFIG_MFD_ASIC3 is not set -+# CONFIG_HTC_EGPIO is not set -+# CONFIG_HTC_PASIC3 is not set -+# CONFIG_TPS65010 is not set -+# CONFIG_TWL4030_CORE is not set -+# CONFIG_MFD_TMIO is not set -+# CONFIG_MFD_T7L66XB is not set -+# CONFIG_MFD_TC6387XB is not set -+# CONFIG_MFD_TC6393XB is not set -+# CONFIG_PMIC_DA903X is not set -+# CONFIG_MFD_WM8400 is not set -+# CONFIG_MFD_WM831X is not set -+# CONFIG_MFD_WM8350_I2C is not set -+CONFIG_MFD_PCF50633=y -+# CONFIG_MFD_MC13783 is not set -+CONFIG_PCF50633_ADC=y -+# CONFIG_AB3100_CORE is not set -+# CONFIG_EZX_PCAP is not set -+CONFIG_MFD_GLAMO=y -+CONFIG_MFD_GLAMO_FB=y -+CONFIG_MFD_GLAMO_GPIO=y -+CONFIG_MFD_GLAMO_MCI=y -+CONFIG_REGULATOR=y -+# CONFIG_REGULATOR_DEBUG is not set -+CONFIG_REGULATOR_FIXED_VOLTAGE=y -+# CONFIG_REGULATOR_VIRTUAL_CONSUMER is not set -+CONFIG_REGULATOR_USERSPACE_CONSUMER=y -+# CONFIG_REGULATOR_BQ24022 is not set -+# CONFIG_REGULATOR_MAX1586 is not set -+CONFIG_REGULATOR_PCF50633=y -+# CONFIG_REGULATOR_LP3971 is not set -+# CONFIG_REGULATOR_TPS65023 is not set -+# CONFIG_REGULATOR_TPS6507X is not set -+# CONFIG_MEDIA_SUPPORT is not set -+ -+# -+# Graphics support -+# -+# CONFIG_VGASTATE is not set -+CONFIG_VIDEO_OUTPUT_CONTROL=y -+CONFIG_FB=y -+# CONFIG_FIRMWARE_EDID is not set -+# CONFIG_FB_DDC is not set -+# CONFIG_FB_BOOT_VESA_SUPPORT is not set -+CONFIG_FB_CFB_FILLRECT=y -+CONFIG_FB_CFB_COPYAREA=y -+CONFIG_FB_CFB_IMAGEBLIT=y -+# CONFIG_FB_CFB_REV_PIXELS_IN_BYTE is not set -+# CONFIG_FB_SYS_FILLRECT is not set -+# CONFIG_FB_SYS_COPYAREA is not set -+# CONFIG_FB_SYS_IMAGEBLIT is not set -+# CONFIG_FB_FOREIGN_ENDIAN is not set -+# CONFIG_FB_SYS_FOPS is not set -+# CONFIG_FB_SVGALIB is not set -+# CONFIG_FB_MACMODES is not set -+# CONFIG_FB_BACKLIGHT is not set -+# CONFIG_FB_MODE_HELPERS is not set -+# CONFIG_FB_TILEBLITTING is not set -+ -+# -+# Frame buffer hardware drivers -+# -+# CONFIG_FB_UVESA is not set -+# CONFIG_FB_S1D13XXX is not set -+# CONFIG_FB_TMIO is not set -+# CONFIG_FB_S3C2410 is not set -+# CONFIG_FB_VIRTUAL is not set -+# CONFIG_FB_METRONOME is not set -+# CONFIG_FB_MB862XX is not set -+# CONFIG_FB_BROADSHEET is not set -+CONFIG_BACKLIGHT_LCD_SUPPORT=y -+CONFIG_LCD_CLASS_DEVICE=y -+# CONFIG_LCD_LMS283GF05 is not set -+# CONFIG_LCD_LTV350QV is not set -+# CONFIG_LCD_ILI9320 is not set -+# CONFIG_LCD_TDO24M is not set -+# CONFIG_LCD_VGG2432A4 is not set -+# CONFIG_LCD_PLATFORM is not set -+CONFIG_LCD_JBT6K74=y -+CONFIG_BACKLIGHT_CLASS_DEVICE=y -+# CONFIG_BACKLIGHT_GENERIC is not set -+# CONFIG_BACKLIGHT_PWM is not set -+CONFIG_BACKLIGHT_PCF50633=y -+ -+# -+# Display device support -+# -+# CONFIG_DISPLAY_SUPPORT is not set -+ -+# -+# Console display driver support -+# -+# CONFIG_VGA_CONSOLE is not set -+CONFIG_DUMMY_CONSOLE=y -+CONFIG_FRAMEBUFFER_CONSOLE=y -+# CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY is not set -+# CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set -+CONFIG_FONTS=y -+# CONFIG_FONT_8x8 is not set -+# CONFIG_FONT_8x16 is not set -+CONFIG_FONT_6x11=y -+# CONFIG_FONT_7x14 is not set -+# CONFIG_FONT_PEARL_8x8 is not set -+# CONFIG_FONT_ACORN_8x8 is not set -+# CONFIG_FONT_MINI_4x6 is not set -+# CONFIG_FONT_SUN8x16 is not set -+# CONFIG_FONT_SUN12x22 is not set -+# CONFIG_FONT_10x18 is not set -+CONFIG_LOGO=y -+# CONFIG_LOGO_LINUX_MONO is not set -+# CONFIG_LOGO_LINUX_VGA16 is not set -+# CONFIG_LOGO_LINUX_CLUT224 is not set -+CONFIG_SOUND=y -+CONFIG_SOUND_OSS_CORE=y -+CONFIG_SOUND_OSS_CORE_PRECLAIM=y -+CONFIG_SND=y -+CONFIG_SND_TIMER=y -+CONFIG_SND_PCM=y -+CONFIG_SND_JACK=y -+CONFIG_SND_SEQUENCER=y -+CONFIG_SND_SEQ_DUMMY=y -+CONFIG_SND_OSSEMUL=y -+CONFIG_SND_MIXER_OSS=y -+CONFIG_SND_PCM_OSS=y -+CONFIG_SND_PCM_OSS_PLUGINS=y -+CONFIG_SND_SEQUENCER_OSS=y -+# CONFIG_SND_DYNAMIC_MINORS is not set -+# CONFIG_SND_SUPPORT_OLD_API is not set -+# CONFIG_SND_VERBOSE_PROCFS is not set -+# CONFIG_SND_VERBOSE_PRINTK is not set -+# CONFIG_SND_DEBUG is not set -+# CONFIG_SND_RAWMIDI_SEQ is not set -+# CONFIG_SND_OPL3_LIB_SEQ is not set -+# CONFIG_SND_OPL4_LIB_SEQ is not set -+# CONFIG_SND_SBAWE_SEQ is not set -+# CONFIG_SND_EMU10K1_SEQ is not set -+# CONFIG_SND_DRIVERS is not set -+# CONFIG_SND_ARM is not set -+# CONFIG_SND_SPI is not set -+# CONFIG_SND_USB is not set -+CONFIG_SND_SOC=y -+CONFIG_SND_S3C24XX_SOC=y -+CONFIG_SND_S3C24XX_SOC_I2S=y -+CONFIG_SND_S3C24XX_SOC_NEO1973_WM8753=y -+# CONFIG_SND_S3C24XX_SOC_LN2440SBC_ALC650 is not set -+# CONFIG_SND_S3C24XX_SOC_S3C24XX_UDA134X is not set -+# CONFIG_SND_S3C24XX_SOC_SIMTEC_TLV320AIC23 is not set -+# CONFIG_SND_S3C24XX_SOC_SIMTEC_HERMES is not set -+CONFIG_SND_SOC_I2C_AND_SPI=y -+# CONFIG_SND_SOC_ALL_CODECS is not set -+CONFIG_SND_SOC_WM8753=y -+# CONFIG_SOUND_PRIME is not set -+CONFIG_HID_SUPPORT=y -+CONFIG_HID=y -+# CONFIG_HIDRAW is not set -+ -+# -+# USB Input Devices -+# -+CONFIG_USB_HID=y -+# CONFIG_HID_PID is not set -+# CONFIG_USB_HIDDEV is not set -+ -+# -+# Special HID drivers -+# -+CONFIG_HID_A4TECH=y -+CONFIG_HID_APPLE=y -+CONFIG_HID_BELKIN=y -+CONFIG_HID_CHERRY=y -+CONFIG_HID_CHICONY=y -+CONFIG_HID_CYPRESS=y -+CONFIG_HID_DRAGONRISE=y -+# CONFIG_DRAGONRISE_FF is not set -+CONFIG_HID_EZKEY=y -+CONFIG_HID_KYE=y -+CONFIG_HID_GYRATION=y -+CONFIG_HID_TWINHAN=y -+CONFIG_HID_KENSINGTON=y -+CONFIG_HID_LOGITECH=y -+# CONFIG_LOGITECH_FF is not set -+# CONFIG_LOGIRUMBLEPAD2_FF is not set -+CONFIG_HID_MICROSOFT=y -+CONFIG_HID_MONTEREY=y -+CONFIG_HID_NTRIG=y -+CONFIG_HID_PANTHERLORD=y -+# CONFIG_PANTHERLORD_FF is not set -+CONFIG_HID_PETALYNX=y -+CONFIG_HID_SAMSUNG=y -+CONFIG_HID_SONY=y -+CONFIG_HID_SUNPLUS=y -+CONFIG_HID_GREENASIA=y -+# CONFIG_GREENASIA_FF is not set -+CONFIG_HID_SMARTJOYPLUS=y -+# CONFIG_SMARTJOYPLUS_FF is not set -+CONFIG_HID_TOPSEED=y -+CONFIG_HID_THRUSTMASTER=y -+# CONFIG_THRUSTMASTER_FF is not set -+CONFIG_HID_WACOM=y -+CONFIG_HID_ZEROPLUS=y -+# CONFIG_ZEROPLUS_FF is not set -+CONFIG_USB_SUPPORT=y -+CONFIG_USB_ARCH_HAS_HCD=y -+CONFIG_USB_ARCH_HAS_OHCI=y -+# CONFIG_USB_ARCH_HAS_EHCI is not set -+CONFIG_USB=y -+# CONFIG_USB_DEBUG is not set -+CONFIG_USB_ANNOUNCE_NEW_DEVICES=y -+ -+# -+# Miscellaneous USB options -+# -+# CONFIG_USB_DEVICEFS is not set -+# CONFIG_USB_DEVICE_CLASS is not set -+# CONFIG_USB_DYNAMIC_MINORS is not set -+CONFIG_USB_SUSPEND=y -+# CONFIG_USB_OTG is not set -+# CONFIG_USB_MON is not set -+# CONFIG_USB_WUSB is not set -+# CONFIG_USB_WUSB_CBAF is not set -+ -+# -+# USB Host Controller Drivers -+# -+# CONFIG_USB_C67X00_HCD is not set -+# CONFIG_USB_OXU210HP_HCD is not set -+# CONFIG_USB_ISP116X_HCD is not set -+# CONFIG_USB_ISP1760_HCD is not set -+# CONFIG_USB_ISP1362_HCD is not set -+CONFIG_USB_OHCI_HCD=y -+# CONFIG_USB_OHCI_BIG_ENDIAN_DESC is not set -+# CONFIG_USB_OHCI_BIG_ENDIAN_MMIO is not set -+CONFIG_USB_OHCI_LITTLE_ENDIAN=y -+# CONFIG_USB_SL811_HCD is not set -+# CONFIG_USB_R8A66597_HCD is not set -+# CONFIG_USB_HWA_HCD is not set -+# CONFIG_USB_MUSB_HDRC is not set -+# CONFIG_USB_GADGET_MUSB_HDRC is not set -+ -+# -+# USB Device Class drivers -+# -+CONFIG_USB_ACM=m -+CONFIG_USB_PRINTER=m -+# CONFIG_USB_WDM is not set -+CONFIG_USB_TMC=m -+ -+# -+# NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may -+# -+ -+# -+# also be needed; see USB_STORAGE Help for more info -+# -+CONFIG_USB_STORAGE=m -+# CONFIG_USB_STORAGE_DEBUG is not set -+CONFIG_USB_STORAGE_DATAFAB=m -+CONFIG_USB_STORAGE_FREECOM=m -+# CONFIG_USB_STORAGE_ISD200 is not set -+CONFIG_USB_STORAGE_USBAT=m -+CONFIG_USB_STORAGE_SDDR09=m -+CONFIG_USB_STORAGE_SDDR55=m -+CONFIG_USB_STORAGE_JUMPSHOT=m -+CONFIG_USB_STORAGE_ALAUDA=m -+# CONFIG_USB_STORAGE_ONETOUCH is not set -+CONFIG_USB_STORAGE_KARMA=m -+# CONFIG_USB_STORAGE_CYPRESS_ATACB is not set -+# CONFIG_USB_LIBUSUAL is not set -+ -+# -+# USB Imaging devices -+# -+# CONFIG_USB_MDC800 is not set -+# CONFIG_USB_MICROTEK is not set -+ -+# -+# USB port drivers -+# -+CONFIG_USB_SERIAL=m -+CONFIG_USB_EZUSB=y -+CONFIG_USB_SERIAL_GENERIC=y -+CONFIG_USB_SERIAL_AIRCABLE=m -+CONFIG_USB_SERIAL_ARK3116=m -+CONFIG_USB_SERIAL_BELKIN=m -+# CONFIG_USB_SERIAL_CH341 is not set -+CONFIG_USB_SERIAL_WHITEHEAT=m -+CONFIG_USB_SERIAL_DIGI_ACCELEPORT=m -+# CONFIG_USB_SERIAL_CP210X is not set -+CONFIG_USB_SERIAL_CYPRESS_M8=m -+CONFIG_USB_SERIAL_EMPEG=m -+CONFIG_USB_SERIAL_FTDI_SIO=m -+CONFIG_USB_SERIAL_FUNSOFT=m -+CONFIG_USB_SERIAL_VISOR=m -+CONFIG_USB_SERIAL_IPAQ=m -+CONFIG_USB_SERIAL_IR=m -+CONFIG_USB_SERIAL_EDGEPORT=m -+CONFIG_USB_SERIAL_EDGEPORT_TI=m -+CONFIG_USB_SERIAL_GARMIN=m -+CONFIG_USB_SERIAL_IPW=m -+# CONFIG_USB_SERIAL_IUU is not set -+CONFIG_USB_SERIAL_KEYSPAN_PDA=m -+CONFIG_USB_SERIAL_KEYSPAN=m -+CONFIG_USB_SERIAL_KLSI=m -+CONFIG_USB_SERIAL_KOBIL_SCT=m -+CONFIG_USB_SERIAL_MCT_U232=m -+CONFIG_USB_SERIAL_MOS7720=m -+CONFIG_USB_SERIAL_MOS7840=m -+# CONFIG_USB_SERIAL_MOTOROLA is not set -+CONFIG_USB_SERIAL_NAVMAN=m -+CONFIG_USB_SERIAL_PL2303=m -+# CONFIG_USB_SERIAL_OTI6858 is not set -+# CONFIG_USB_SERIAL_QUALCOMM is not set -+# CONFIG_USB_SERIAL_SPCP8X5 is not set -+CONFIG_USB_SERIAL_HP4X=m -+CONFIG_USB_SERIAL_SAFE=m -+CONFIG_USB_SERIAL_SAFE_PADDED=y -+# CONFIG_USB_SERIAL_SIEMENS_MPI is not set -+CONFIG_USB_SERIAL_SIERRAWIRELESS=m -+# CONFIG_USB_SERIAL_SYMBOL is not set -+CONFIG_USB_SERIAL_TI=m -+CONFIG_USB_SERIAL_CYBERJACK=m -+CONFIG_USB_SERIAL_XIRCOM=m -+CONFIG_USB_SERIAL_OPTION=m -+CONFIG_USB_SERIAL_OMNINET=m -+# CONFIG_USB_SERIAL_OPTICON is not set -+# CONFIG_USB_SERIAL_DEBUG is not set -+ -+# -+# USB Miscellaneous drivers -+# -+# CONFIG_USB_EMI62 is not set -+# CONFIG_USB_EMI26 is not set -+# CONFIG_USB_ADUTUX is not set -+# CONFIG_USB_SEVSEG is not set -+# CONFIG_USB_RIO500 is not set -+# CONFIG_USB_LEGOTOWER is not set -+# CONFIG_USB_LCD is not set -+CONFIG_USB_BERRY_CHARGE=m -+# CONFIG_USB_LED is not set -+# CONFIG_USB_CYPRESS_CY7C63 is not set -+# CONFIG_USB_CYTHERM is not set -+# CONFIG_USB_IDMOUSE is not set -+# CONFIG_USB_FTDI_ELAN is not set -+# CONFIG_USB_APPLEDISPLAY is not set -+# CONFIG_USB_LD is not set -+CONFIG_USB_TRANCEVIBRATOR=m -+CONFIG_USB_IOWARRIOR=m -+# CONFIG_USB_TEST is not set -+# CONFIG_USB_ISIGHTFW is not set -+# CONFIG_USB_VST is not set -+CONFIG_USB_GADGET=y -+# CONFIG_USB_GADGET_DEBUG_FILES is not set -+CONFIG_USB_GADGET_VBUS_DRAW=500 -+CONFIG_USB_GADGET_SELECTED=y -+# CONFIG_USB_GADGET_AT91 is not set -+# CONFIG_USB_GADGET_ATMEL_USBA is not set -+# CONFIG_USB_GADGET_FSL_USB2 is not set -+# CONFIG_USB_GADGET_LH7A40X is not set -+# CONFIG_USB_GADGET_OMAP is not set -+# CONFIG_USB_GADGET_PXA25X is not set -+# CONFIG_USB_GADGET_R8A66597 is not set -+# CONFIG_USB_GADGET_PXA27X is not set -+# CONFIG_USB_GADGET_S3C_HSOTG is not set -+# CONFIG_USB_GADGET_IMX is not set -+CONFIG_USB_GADGET_S3C2410=y -+CONFIG_USB_S3C2410=y -+# CONFIG_USB_S3C2410_DEBUG is not set -+# CONFIG_USB_GADGET_M66592 is not set -+# CONFIG_USB_GADGET_AMD5536UDC is not set -+# CONFIG_USB_GADGET_FSL_QE is not set -+# CONFIG_USB_GADGET_CI13XXX is not set -+# CONFIG_USB_GADGET_NET2280 is not set -+# CONFIG_USB_GADGET_GOKU is not set -+# CONFIG_USB_GADGET_LANGWELL is not set -+# CONFIG_USB_GADGET_DUMMY_HCD is not set -+# CONFIG_USB_GADGET_DUALSPEED is not set -+# CONFIG_USB_ZERO is not set -+# CONFIG_USB_AUDIO is not set -+CONFIG_USB_ETH=y -+CONFIG_USB_ETH_RNDIS=y -+# CONFIG_USB_ETH_EEM is not set -+# CONFIG_USB_GADGETFS is not set -+# CONFIG_USB_FILE_STORAGE is not set -+# CONFIG_USB_G_SERIAL is not set -+# CONFIG_USB_MIDI_GADGET is not set -+# CONFIG_USB_G_PRINTER is not set -+# CONFIG_USB_CDC_COMPOSITE is not set -+ -+# -+# OTG and related infrastructure -+# -+# CONFIG_USB_GPIO_VBUS is not set -+# CONFIG_NOP_USB_XCEIV is not set -+CONFIG_MMC=y -+# CONFIG_MMC_DEBUG is not set -+CONFIG_MMC_UNSAFE_RESUME=y -+ -+# -+# MMC/SD/SDIO Card Drivers -+# -+CONFIG_MMC_BLOCK=y -+CONFIG_MMC_BLOCK_BOUNCE=y -+# CONFIG_SDIO_UART is not set -+# CONFIG_MMC_TEST is not set -+ -+# -+# MMC/SD/SDIO Host Controller Drivers -+# -+# CONFIG_MMC_SDHCI is not set -+# CONFIG_MMC_AT91 is not set -+# CONFIG_MMC_ATMELMCI is not set -+# CONFIG_MMC_SPI is not set -+CONFIG_MMC_S3C=y -+# CONFIG_MMC_S3C_HW_SDIO_IRQ is not set -+CONFIG_MMC_S3C_PIO=y -+# CONFIG_MMC_S3C_DMA is not set -+# CONFIG_MMC_S3C_PIODMA is not set -+# CONFIG_MEMSTICK is not set -+CONFIG_NEW_LEDS=y -+CONFIG_LEDS_CLASS=y -+ -+# -+# LED drivers -+# -+# CONFIG_LEDS_S3C24XX is not set -+# CONFIG_LEDS_PCA9532 is not set -+CONFIG_LEDS_GPIO=y -+CONFIG_LEDS_GPIO_PLATFORM=y -+# CONFIG_LEDS_LP3944 is not set -+# CONFIG_LEDS_PCA955X is not set -+# CONFIG_LEDS_DAC124S085 is not set -+# CONFIG_LEDS_PWM is not set -+# CONFIG_LEDS_BD2802 is not set -+ -+# -+# LED Triggers -+# -+CONFIG_LEDS_TRIGGERS=y -+CONFIG_LEDS_TRIGGER_TIMER=y -+CONFIG_LEDS_TRIGGER_HEARTBEAT=y -+# CONFIG_LEDS_TRIGGER_BACKLIGHT is not set -+# CONFIG_LEDS_TRIGGER_GPIO is not set -+# CONFIG_LEDS_TRIGGER_DEFAULT_ON is not set -+ -+# -+# iptables trigger is under Netfilter config (LED target) -+# -+# CONFIG_ACCESSIBILITY is not set -+CONFIG_RTC_LIB=y -+CONFIG_RTC_CLASS=y -+CONFIG_RTC_HCTOSYS=y -+CONFIG_RTC_HCTOSYS_DEVICE="rtc0" -+# CONFIG_RTC_DEBUG is not set -+ -+# -+# RTC interfaces -+# -+CONFIG_RTC_INTF_SYSFS=y -+CONFIG_RTC_INTF_PROC=y -+CONFIG_RTC_INTF_DEV=y -+# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set -+# CONFIG_RTC_DRV_TEST is not set -+ -+# -+# I2C RTC drivers -+# -+# CONFIG_RTC_DRV_DS1307 is not set -+# CONFIG_RTC_DRV_DS1374 is not set -+# CONFIG_RTC_DRV_DS1672 is not set -+# CONFIG_RTC_DRV_MAX6900 is not set -+# CONFIG_RTC_DRV_RS5C372 is not set -+# CONFIG_RTC_DRV_ISL1208 is not set -+# CONFIG_RTC_DRV_X1205 is not set -+# CONFIG_RTC_DRV_PCF8563 is not set -+# CONFIG_RTC_DRV_PCF8583 is not set -+# CONFIG_RTC_DRV_M41T80 is not set -+# CONFIG_RTC_DRV_S35390A is not set -+# CONFIG_RTC_DRV_FM3130 is not set -+# CONFIG_RTC_DRV_RX8581 is not set -+# CONFIG_RTC_DRV_RX8025 is not set -+ -+# -+# SPI RTC drivers -+# -+# CONFIG_RTC_DRV_M41T94 is not set -+# CONFIG_RTC_DRV_DS1305 is not set -+# CONFIG_RTC_DRV_DS1390 is not set -+# CONFIG_RTC_DRV_MAX6902 is not set -+# CONFIG_RTC_DRV_R9701 is not set -+# CONFIG_RTC_DRV_RS5C348 is not set -+# CONFIG_RTC_DRV_DS3234 is not set -+# CONFIG_RTC_DRV_PCF2123 is not set -+ -+# -+# Platform RTC drivers -+# -+# CONFIG_RTC_DRV_CMOS is not set -+# CONFIG_RTC_DRV_DS1286 is not set -+# CONFIG_RTC_DRV_DS1511 is not set -+# CONFIG_RTC_DRV_DS1553 is not set -+# CONFIG_RTC_DRV_DS1742 is not set -+# CONFIG_RTC_DRV_STK17TA8 is not set -+# CONFIG_RTC_DRV_M48T86 is not set -+# CONFIG_RTC_DRV_M48T35 is not set -+# CONFIG_RTC_DRV_M48T59 is not set -+# CONFIG_RTC_DRV_BQ4802 is not set -+# CONFIG_RTC_DRV_V3020 is not set -+CONFIG_RTC_DRV_PCF50633=y -+ -+# -+# on-CPU RTC drivers -+# -+CONFIG_RTC_DRV_S3C=y -+# CONFIG_DMADEVICES is not set -+# CONFIG_AUXDISPLAY is not set -+# CONFIG_UIO is not set -+ -+# -+# TI VLYNQ -+# -+CONFIG_STAGING=y -+# CONFIG_STAGING_EXCLUDE_BUILD is not set -+# CONFIG_USB_IP_COMMON is not set -+# CONFIG_PRISM2_USB is not set -+# CONFIG_ECHO is not set -+# CONFIG_COMEDI is not set -+# CONFIG_ASUS_OLED is not set -+# CONFIG_INPUT_MIMIO is not set -+# CONFIG_TRANZPORT is not set -+ -+# -+# Android -+# -+ -+# -+# Qualcomm MSM Camera And Video -+# -+ -+# -+# Camera Sensor Selection -+# -+# CONFIG_INPUT_GPIO is not set -+# CONFIG_DST is not set -+# CONFIG_POHMELFS is not set -+# CONFIG_PLAN9AUTH is not set -+# CONFIG_LINE6_USB is not set -+# CONFIG_USB_SERIAL_QUATECH2 is not set -+# CONFIG_USB_SERIAL_QUATECH_USB2 is not set -+# CONFIG_VT6656 is not set -+# CONFIG_FB_UDL is not set -+ -+# -+# RAR Register Driver -+# -+# CONFIG_RAR_REGISTER is not set -+# CONFIG_IIO is not set -+CONFIG_AR6000_WLAN=y -+# CONFIG_AR6000_WLAN_DEBUG is not set -+# CONFIG_AR6000_WLAN_RESET is not set -+ -+# -+# File systems -+# -+CONFIG_EXT2_FS=y -+# CONFIG_EXT2_FS_XATTR is not set -+# CONFIG_EXT2_FS_XIP is not set -+CONFIG_EXT3_FS=y -+# CONFIG_EXT3_DEFAULTS_TO_ORDERED is not set -+# CONFIG_EXT3_FS_XATTR is not set -+# CONFIG_EXT4_FS is not set -+CONFIG_JBD=y -+CONFIG_REISERFS_FS=m -+# CONFIG_REISERFS_CHECK is not set -+# CONFIG_REISERFS_PROC_INFO is not set -+# CONFIG_REISERFS_FS_XATTR is not set -+# CONFIG_JFS_FS is not set -+# CONFIG_FS_POSIX_ACL is not set -+# CONFIG_XFS_FS is not set -+# CONFIG_OCFS2_FS is not set -+# CONFIG_BTRFS_FS is not set -+# CONFIG_NILFS2_FS is not set -+CONFIG_FILE_LOCKING=y -+CONFIG_FSNOTIFY=y -+# CONFIG_DNOTIFY is not set -+CONFIG_INOTIFY=y -+CONFIG_INOTIFY_USER=y -+# CONFIG_QUOTA is not set -+# CONFIG_AUTOFS_FS is not set -+CONFIG_AUTOFS4_FS=m -+CONFIG_FUSE_FS=m -+CONFIG_CUSE=m -+ -+# -+# Caches -+# -+# CONFIG_FSCACHE is not set -+ -+# -+# CD-ROM/DVD Filesystems -+# -+CONFIG_ISO9660_FS=m -+CONFIG_JOLIET=y -+# CONFIG_ZISOFS is not set -+CONFIG_UDF_FS=m -+CONFIG_UDF_NLS=y -+ -+# -+# DOS/FAT/NT Filesystems -+# -+CONFIG_FAT_FS=y -+# CONFIG_MSDOS_FS is not set -+CONFIG_VFAT_FS=y -+CONFIG_FAT_DEFAULT_CODEPAGE=437 -+CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" -+# CONFIG_NTFS_FS is not set -+ -+# -+# Pseudo filesystems -+# -+CONFIG_PROC_FS=y -+CONFIG_PROC_SYSCTL=y -+CONFIG_PROC_PAGE_MONITOR=y -+CONFIG_SYSFS=y -+CONFIG_TMPFS=y -+# CONFIG_TMPFS_POSIX_ACL is not set -+# CONFIG_HUGETLB_PAGE is not set -+CONFIG_CONFIGFS_FS=m -+CONFIG_MISC_FILESYSTEMS=y -+# CONFIG_ADFS_FS is not set -+# CONFIG_AFFS_FS is not set -+# CONFIG_HFS_FS is not set -+# CONFIG_HFSPLUS_FS is not set -+# CONFIG_BEFS_FS is not set -+# CONFIG_BFS_FS is not set -+# CONFIG_EFS_FS is not set -+CONFIG_JFFS2_FS=y -+CONFIG_JFFS2_FS_DEBUG=0 -+CONFIG_JFFS2_FS_WRITEBUFFER=y -+# CONFIG_JFFS2_FS_WBUF_VERIFY is not set -+CONFIG_JFFS2_SUMMARY=y -+# CONFIG_JFFS2_FS_XATTR is not set -+# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set -+CONFIG_JFFS2_ZLIB=y -+# CONFIG_JFFS2_LZO is not set -+CONFIG_JFFS2_RTIME=y -+# CONFIG_JFFS2_RUBIN is not set -+# CONFIG_CRAMFS is not set -+CONFIG_SQUASHFS=m -+# CONFIG_SQUASHFS_EMBEDDED is not set -+CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=3 -+# CONFIG_VXFS_FS is not set -+# CONFIG_MINIX_FS is not set -+# CONFIG_OMFS_FS is not set -+# CONFIG_HPFS_FS is not set -+# CONFIG_QNX4FS_FS is not set -+# CONFIG_ROMFS_FS is not set -+# CONFIG_SYSV_FS is not set -+# CONFIG_UFS_FS is not set -+CONFIG_NETWORK_FILESYSTEMS=y -+CONFIG_NFS_FS=m -+CONFIG_NFS_V3=y -+# CONFIG_NFS_V3_ACL is not set -+# CONFIG_NFS_V4 is not set -+CONFIG_NFSD=m -+CONFIG_NFSD_V3=y -+# CONFIG_NFSD_V3_ACL is not set -+# CONFIG_NFSD_V4 is not set -+CONFIG_LOCKD=m -+CONFIG_LOCKD_V4=y -+CONFIG_EXPORTFS=m -+CONFIG_NFS_COMMON=y -+CONFIG_SUNRPC=m -+# CONFIG_RPCSEC_GSS_KRB5 is not set -+# CONFIG_RPCSEC_GSS_SPKM3 is not set -+# CONFIG_SMB_FS is not set -+CONFIG_CIFS=m -+# CONFIG_CIFS_STATS is not set -+# CONFIG_CIFS_WEAK_PW_HASH is not set -+# CONFIG_CIFS_XATTR is not set -+# CONFIG_CIFS_DEBUG2 is not set -+# CONFIG_CIFS_EXPERIMENTAL is not set -+# CONFIG_NCP_FS is not set -+# CONFIG_CODA_FS is not set -+# CONFIG_AFS_FS is not set -+ -+# -+# Partition Types -+# -+CONFIG_PARTITION_ADVANCED=y -+# CONFIG_ACORN_PARTITION is not set -+# CONFIG_OSF_PARTITION is not set -+# CONFIG_AMIGA_PARTITION is not set -+# CONFIG_ATARI_PARTITION is not set -+# CONFIG_MAC_PARTITION is not set -+CONFIG_MSDOS_PARTITION=y -+# CONFIG_BSD_DISKLABEL is not set -+# CONFIG_MINIX_SUBPARTITION is not set -+# CONFIG_SOLARIS_X86_PARTITION is not set -+# CONFIG_UNIXWARE_DISKLABEL is not set -+# CONFIG_LDM_PARTITION is not set -+# CONFIG_SGI_PARTITION is not set -+# CONFIG_ULTRIX_PARTITION is not set -+# CONFIG_SUN_PARTITION is not set -+# CONFIG_KARMA_PARTITION is not set -+# CONFIG_EFI_PARTITION is not set -+# CONFIG_SYSV68_PARTITION is not set -+CONFIG_NLS=y -+CONFIG_NLS_DEFAULT="iso8859-1" -+CONFIG_NLS_CODEPAGE_437=y -+# CONFIG_NLS_CODEPAGE_737 is not set -+# CONFIG_NLS_CODEPAGE_775 is not set -+CONFIG_NLS_CODEPAGE_850=m -+# CONFIG_NLS_CODEPAGE_852 is not set -+# CONFIG_NLS_CODEPAGE_855 is not set -+# CONFIG_NLS_CODEPAGE_857 is not set -+# CONFIG_NLS_CODEPAGE_860 is not set -+# CONFIG_NLS_CODEPAGE_861 is not set -+# CONFIG_NLS_CODEPAGE_862 is not set -+# CONFIG_NLS_CODEPAGE_863 is not set -+# CONFIG_NLS_CODEPAGE_864 is not set -+# CONFIG_NLS_CODEPAGE_865 is not set -+CONFIG_NLS_CODEPAGE_866=m -+# CONFIG_NLS_CODEPAGE_869 is not set -+CONFIG_NLS_CODEPAGE_936=m -+CONFIG_NLS_CODEPAGE_950=m -+# CONFIG_NLS_CODEPAGE_932 is not set -+# CONFIG_NLS_CODEPAGE_949 is not set -+# CONFIG_NLS_CODEPAGE_874 is not set -+# CONFIG_NLS_ISO8859_8 is not set -+# CONFIG_NLS_CODEPAGE_1250 is not set -+CONFIG_NLS_CODEPAGE_1251=m -+# CONFIG_NLS_ASCII is not set -+CONFIG_NLS_ISO8859_1=y -+# CONFIG_NLS_ISO8859_2 is not set -+# CONFIG_NLS_ISO8859_3 is not set -+# CONFIG_NLS_ISO8859_4 is not set -+# CONFIG_NLS_ISO8859_5 is not set -+# CONFIG_NLS_ISO8859_6 is not set -+# CONFIG_NLS_ISO8859_7 is not set -+# CONFIG_NLS_ISO8859_9 is not set -+# CONFIG_NLS_ISO8859_13 is not set -+# CONFIG_NLS_ISO8859_14 is not set -+# CONFIG_NLS_ISO8859_15 is not set -+# CONFIG_NLS_KOI8_R is not set -+# CONFIG_NLS_KOI8_U is not set -+CONFIG_NLS_UTF8=m -+# CONFIG_DLM is not set -+ -+# -+# Kernel hacking -+# -+CONFIG_PRINTK_TIME=y -+# CONFIG_ENABLE_WARN_DEPRECATED is not set -+# CONFIG_ENABLE_MUST_CHECK is not set -+CONFIG_FRAME_WARN=1024 -+# CONFIG_MAGIC_SYSRQ is not set -+CONFIG_STRIP_ASM_SYMS=y -+# CONFIG_UNUSED_SYMBOLS is not set -+# CONFIG_DEBUG_FS is not set -+# CONFIG_HEADERS_CHECK is not set -+# CONFIG_DEBUG_KERNEL is not set -+CONFIG_DEBUG_BUGVERBOSE=y -+CONFIG_DEBUG_MEMORY_INIT=y -+CONFIG_FRAME_POINTER=y -+# CONFIG_RCU_CPU_STALL_DETECTOR is not set -+# CONFIG_LATENCYTOP is not set -+# CONFIG_SYSCTL_SYSCALL_CHECK is not set -+CONFIG_HAVE_FUNCTION_TRACER=y -+CONFIG_TRACING_SUPPORT=y -+# CONFIG_FTRACE is not set -+# CONFIG_SAMPLES is not set -+CONFIG_HAVE_ARCH_KGDB=y -+# CONFIG_ARM_UNWIND is not set -+# CONFIG_DEBUG_USER is not set -+CONFIG_DEBUG_S3C_UART=2 -+ -+# -+# Security options -+# -+# CONFIG_KEYS is not set -+# CONFIG_SECURITY is not set -+# CONFIG_SECURITYFS is not set -+# CONFIG_SECURITY_FILE_CAPABILITIES is not set -+CONFIG_CRYPTO=y -+ -+# -+# Crypto core or helper -+# -+CONFIG_CRYPTO_ALGAPI=y -+CONFIG_CRYPTO_ALGAPI2=y -+CONFIG_CRYPTO_AEAD=m -+CONFIG_CRYPTO_AEAD2=y -+CONFIG_CRYPTO_BLKCIPHER=m -+CONFIG_CRYPTO_BLKCIPHER2=y -+CONFIG_CRYPTO_HASH=y -+CONFIG_CRYPTO_HASH2=y -+CONFIG_CRYPTO_RNG2=y -+CONFIG_CRYPTO_PCOMP=y -+CONFIG_CRYPTO_MANAGER=m -+CONFIG_CRYPTO_MANAGER2=y -+CONFIG_CRYPTO_GF128MUL=m -+CONFIG_CRYPTO_NULL=m -+CONFIG_CRYPTO_WORKQUEUE=y -+# CONFIG_CRYPTO_CRYPTD is not set -+CONFIG_CRYPTO_AUTHENC=m -+CONFIG_CRYPTO_TEST=m -+ -+# -+# Authenticated Encryption with Associated Data -+# -+# CONFIG_CRYPTO_CCM is not set -+# CONFIG_CRYPTO_GCM is not set -+# CONFIG_CRYPTO_SEQIV is not set -+ -+# -+# Block modes -+# -+CONFIG_CRYPTO_CBC=m -+# CONFIG_CRYPTO_CTR is not set -+# CONFIG_CRYPTO_CTS is not set -+CONFIG_CRYPTO_ECB=m -+CONFIG_CRYPTO_LRW=m -+CONFIG_CRYPTO_PCBC=m -+# CONFIG_CRYPTO_XTS is not set -+ -+# -+# Hash modes -+# -+CONFIG_CRYPTO_HMAC=m -+CONFIG_CRYPTO_XCBC=m -+# CONFIG_CRYPTO_VMAC is not set -+ -+# -+# Digest -+# -+CONFIG_CRYPTO_CRC32C=m -+# CONFIG_CRYPTO_GHASH is not set -+CONFIG_CRYPTO_MD4=m -+CONFIG_CRYPTO_MD5=y -+CONFIG_CRYPTO_MICHAEL_MIC=m -+# CONFIG_CRYPTO_RMD128 is not set -+# CONFIG_CRYPTO_RMD160 is not set -+# CONFIG_CRYPTO_RMD256 is not set -+# CONFIG_CRYPTO_RMD320 is not set -+CONFIG_CRYPTO_SHA1=m -+CONFIG_CRYPTO_SHA256=m -+CONFIG_CRYPTO_SHA512=m -+CONFIG_CRYPTO_TGR192=m -+CONFIG_CRYPTO_WP512=m -+ -+# -+# Ciphers -+# -+# CONFIG_CRYPTO_AES is not set -+CONFIG_CRYPTO_ANUBIS=m -+CONFIG_CRYPTO_ARC4=m -+CONFIG_CRYPTO_BLOWFISH=m -+CONFIG_CRYPTO_CAMELLIA=m -+CONFIG_CRYPTO_CAST5=m -+CONFIG_CRYPTO_CAST6=m -+CONFIG_CRYPTO_DES=m -+CONFIG_CRYPTO_FCRYPT=m -+CONFIG_CRYPTO_KHAZAD=m -+# CONFIG_CRYPTO_SALSA20 is not set -+# CONFIG_CRYPTO_SEED is not set -+CONFIG_CRYPTO_SERPENT=m -+CONFIG_CRYPTO_TEA=m -+CONFIG_CRYPTO_TWOFISH=m -+CONFIG_CRYPTO_TWOFISH_COMMON=m -+ -+# -+# Compression -+# -+CONFIG_CRYPTO_DEFLATE=m -+CONFIG_CRYPTO_ZLIB=y -+# CONFIG_CRYPTO_LZO is not set -+ -+# -+# Random Number Generation -+# -+# CONFIG_CRYPTO_ANSI_CPRNG is not set -+# CONFIG_CRYPTO_HW is not set -+# CONFIG_BINARY_PRINTF is not set -+ -+# -+# Library routines -+# -+CONFIG_BITREVERSE=y -+CONFIG_GENERIC_FIND_LAST_BIT=y -+CONFIG_CRC_CCITT=y -+CONFIG_CRC16=y -+CONFIG_CRC_T10DIF=y -+CONFIG_CRC_ITU_T=y -+CONFIG_CRC32=y -+CONFIG_CRC7=y -+CONFIG_LIBCRC32C=m -+CONFIG_ZLIB_INFLATE=y -+CONFIG_ZLIB_DEFLATE=y -+CONFIG_DECOMPRESS_GZIP=y -+CONFIG_DECOMPRESS_BZIP2=y -+CONFIG_DECOMPRESS_LZMA=y -+CONFIG_TEXTSEARCH=y -+CONFIG_TEXTSEARCH_KMP=m -+CONFIG_TEXTSEARCH_BM=m -+CONFIG_TEXTSEARCH_FSM=m -+CONFIG_HAS_IOMEM=y -+CONFIG_HAS_DMA=y -+CONFIG_NLATTR=y --- -1.7.0.4 - diff --git a/recipes/linux/linux-openmoko-2.6.32/0022-JBT6k74-tweaks-Make-resolution-switch-work.patch b/recipes/linux/linux-openmoko-2.6.32/0022-JBT6k74-tweaks-Make-resolution-switch-work.patch new file mode 100644 index 0000000000..6acefa3382 --- /dev/null +++ b/recipes/linux/linux-openmoko-2.6.32/0022-JBT6k74-tweaks-Make-resolution-switch-work.patch @@ -0,0 +1,316 @@ +From 6296b2623da88372bc6762160ba2a990cc99902c Mon Sep 17 00:00:00 2001 +From: Thomas White +Date: Sat, 24 Apr 2010 21:04:46 +0200 +Subject: [PATCH 28/31] JBT6k74 tweaks: Make resolution switch work + +Signed-off-by: Thomas White +--- + arch/arm/mach-s3c2442/mach-gta02.c | 2 +- + drivers/mfd/glamo/glamo-display.c | 9 ++- + drivers/video/backlight/jbt6k74.c | 121 +++++++++++++++++++++++++++-------- + include/linux/jbt6k74.h | 4 +- + 4 files changed, 102 insertions(+), 34 deletions(-) + +diff --git a/arch/arm/mach-s3c2442/mach-gta02.c b/arch/arm/mach-s3c2442/mach-gta02.c +index 8b59fa7..9a30687 100644 +--- a/arch/arm/mach-s3c2442/mach-gta02.c ++++ b/arch/arm/mach-s3c2442/mach-gta02.c +@@ -246,7 +246,7 @@ static struct fb_videomode gta02_glamo_modes[] = { + .name = "240x320", + .xres = 240, + .yres = 320, +- .pixclock = 100000, ++ .pixclock = 40816, + .left_margin = 8, + .right_margin = 16, + .upper_margin = 2, +diff --git a/drivers/mfd/glamo/glamo-display.c b/drivers/mfd/glamo/glamo-display.c +index f57d273..a551968 100644 +--- a/drivers/mfd/glamo/glamo-display.c ++++ b/drivers/mfd/glamo/glamo-display.c +@@ -307,6 +307,7 @@ static int glamo_crtc_mode_set(struct drm_crtc *crtc, + printk(KERN_WARNING "[glamo-drm] Display is off - " + "enabling it before setting mode.\n"); + glamo_lcd_power(gdrm, 1); ++ msleep(500); + } + + glamo_lcd_cmd_mode(gdrm, 1); +@@ -355,14 +356,14 @@ static int glamo_crtc_mode_set(struct drm_crtc *crtc, + + glamo_lcd_cmd_mode(gdrm, 0); + ++ glamo_crtc_mode_set_base(crtc, 0, 0, old_fb); ++ + if ( mode->hdisplay == 240 ) { +- jbt6k74_setresolution(JBT_RESOLUTION_QVGA); ++ jbt6k74_finish_resolutionchange(JBT_RESOLUTION_QVGA); + } else { +- jbt6k74_setresolution(JBT_RESOLUTION_VGA); ++ jbt6k74_finish_resolutionchange(JBT_RESOLUTION_VGA); + } + +- glamo_crtc_mode_set_base(crtc, 0, 0, old_fb); +- + gcrtc->current_mode = *mode; + gcrtc->current_mode_set = 1; + gcrtc->current_fb = old_fb; +diff --git a/drivers/video/backlight/jbt6k74.c b/drivers/video/backlight/jbt6k74.c +index 40c31f6..43249ad 100644 +--- a/drivers/video/backlight/jbt6k74.c ++++ b/drivers/video/backlight/jbt6k74.c +@@ -104,6 +104,7 @@ enum jbt_register { + + static const char *jbt_power_mode_names[] = { + [JBT_POWER_MODE_OFF] = "off", ++ [JBT_POWER_MODE_STANDBY] = "standby", + [JBT_POWER_MODE_NORMAL] = "normal", + }; + +@@ -148,6 +149,8 @@ static int jbt_reg_write_nodata(struct jbt_info *jbt, uint8_t reg) + else + dev_err(&jbt->spi->dev, "Write failed: %d\n", ret); + ++ mdelay(1); ++ + return ret; + } + +@@ -165,6 +168,8 @@ static int jbt_reg_write(struct jbt_info *jbt, uint8_t reg, uint8_t data) + else + dev_err(&jbt->spi->dev, "Write failed: %d\n", ret); + ++ mdelay(1); ++ + return ret; + } + +@@ -183,6 +188,8 @@ static int jbt_reg_write16(struct jbt_info *jbt, uint8_t reg, uint16_t data) + else + dev_err(&jbt->spi->dev, "Write failed: %d\n", ret); + ++ mdelay(1); ++ + return ret; + } + +@@ -262,7 +269,7 @@ static int jbt_off_to_normal(struct jbt_info *jbt) + gpio_set_value_cansleep(pdata->gpio_reset, 1); + ret = regulator_bulk_enable(ARRAY_SIZE(jbt->supplies), jbt->supplies); + +- mdelay(30); ++ mdelay(120); + + /* three times command zero */ + ret |= jbt_reg_write_nodata(jbt, 0x00); +@@ -334,6 +341,49 @@ static int jbt_normal_to_off(struct jbt_info *jbt) + } + + ++static int jbt_normal_to_standby(struct jbt_info *jbt) ++{ ++ int ret; ++ ++ if ( jbt->power_mode != JBT_POWER_MODE_NORMAL ) return 0; ++ ++ /* Make sure we are 120 ms after SLEEP_{IN,OUT} */ ++ while (time_before(jiffies, jbt->next_sleep)) cpu_relax(); ++ ++ /* Sleep mode on */ ++ ret = jbt_reg_write_nodata(jbt, JBT_REG_DISPLAY_OFF); ++ ret |= jbt_reg_write16(jbt, JBT_REG_OUTPUT_CONTROL, 0x8000 | 1 << 3); ++ ++ ret |= jbt_reg_write_nodata(jbt, JBT_REG_SLEEP_IN); ++ jbt->next_sleep = jiffies + msecs_to_jiffies(150); ++ ++ jbt->power_mode = JBT_POWER_MODE_STANDBY; ++ ++ return ret ? -EIO : 0; ++} ++ ++ ++static int jbt_standby_to_normal(struct jbt_info *jbt) ++{ ++ int ret; ++ ++ if ( jbt->power_mode != JBT_POWER_MODE_STANDBY ) return 0; ++ ++ /* Make sure we are 120 ms after SLEEP_{IN,OUT} */ ++ while (time_before(jiffies, jbt->next_sleep)) cpu_relax(); ++ ++ ret = jbt_reg_write_nodata(jbt, JBT_REG_SLEEP_OUT); ++ jbt->next_sleep = jiffies + msecs_to_jiffies(150); ++ ++ ret |= jbt_reg_write_nodata(jbt, JBT_REG_DISPLAY_ON); ++ ret |= jbt_reg_write16(jbt, JBT_REG_OUTPUT_CONTROL, 0xdff9); ++ ++ jbt->power_mode = JBT_POWER_MODE_NORMAL; ++ ++ return ret ? -EIO : 0; ++} ++ ++ + static int jbt6k74_enter_power_mode(struct jbt_info *jbt, + enum jbt_power_mode new_mode) + { +@@ -354,6 +404,9 @@ static int jbt6k74_enter_power_mode(struct jbt_info *jbt, + case JBT_POWER_MODE_NORMAL: + ret = jbt_off_to_normal(jbt); + break; ++ case JBT_POWER_MODE_STANDBY: ++ ret = -EINVAL; ++ break; + } + break; + case JBT_POWER_MODE_NORMAL: +@@ -364,7 +417,14 @@ static int jbt6k74_enter_power_mode(struct jbt_info *jbt, + case JBT_POWER_MODE_OFF: + ret = jbt_normal_to_off(jbt); + break; ++ case JBT_POWER_MODE_STANDBY: ++ ret = -EINVAL; ++ break; + } ++ break; ++ case JBT_POWER_MODE_STANDBY: ++ ret = -EINVAL; ++ break; + } + + if (ret == 0) { +@@ -382,29 +442,46 @@ static int jbt6k74_enter_power_mode(struct jbt_info *jbt, + static int jbt6k74_set_resolution(struct jbt_info *jbt, + enum jbt_resolution new_resolution) + { ++ int old_resolution; + int ret = 0; +- enum jbt_resolution old_resolution; ++ ++ if ( !jbt ) return -1; + + mutex_lock(&jbt->lock); + +- if (jbt->resolution == new_resolution) +- goto out_unlock; ++ if ( jbt->resolution == new_resolution ) goto out_unlock; ++ if ( jbt->power_mode == JBT_POWER_MODE_OFF ) goto out_unlock; + + old_resolution = jbt->resolution; + jbt->resolution = new_resolution; + +- if (jbt->power_mode == JBT_POWER_MODE_NORMAL) { ++ if ( jbt->power_mode == JBT_POWER_MODE_NORMAL ) { ++ ++ ret = jbt_normal_to_standby(jbt); ++ ++ mdelay(25); ++ ++ if (jbt->resolution == JBT_RESOLUTION_VGA) { ++ /* Quad mode off */ ++ ret |= jbt_reg_write(jbt, JBT_REG_QUAD_RATE, 0x00); ++ ret = jbt_reg_write(jbt, JBT_REG_DISPLAY_MODE, 0x80); ++ } else { ++ /* Quad mode on */ ++ ret |= jbt_reg_write(jbt, JBT_REG_QUAD_RATE, 0x22); ++ ret = jbt_reg_write(jbt, JBT_REG_DISPLAY_MODE, 0x81); ++ } + +- /* "Reboot" the LCM */ +- ret = jbt_normal_to_off(jbt); +- mdelay(1000); +- ret |= jbt_off_to_normal(jbt); ++ mdelay(25); ++ ++ ret |= jbt_standby_to_normal(jbt); + + if (ret) { + jbt->resolution = old_resolution; +- dev_err(&jbt->spi->dev, "Failed to set resolution '%s')\n", ++ dev_err(&jbt->spi->dev, ++ "Failed to set resolution '%s')\n", + jbt_resolution_names[new_resolution]); + } ++ + } + + out_unlock: +@@ -737,26 +814,18 @@ static int __devexit jbt_remove(struct spi_device *spi) + return 0; + } + +-/* Begin horrible layering violations (in the interest of making stuff work) */ ++/* Begin horrible layering violations in the interest of making stuff work */ + +-int jbt6k74_setresolution(enum jbt_resolution new_resolution) ++int jbt6k74_finish_resolutionchange(enum jbt_resolution new_resolution) + { +- if ( !jbt_global ) { +- printk(KERN_CRIT "JBT not initialised!!!\n"); +- return -1; +- } +- jbt6k74_set_resolution(jbt_global, new_resolution); +- return 0; ++ if ( !jbt_global ) return 0; ++ return jbt6k74_set_resolution(jbt_global, new_resolution); + } +-EXPORT_SYMBOL_GPL(jbt6k74_setresolution); ++EXPORT_SYMBOL_GPL(jbt6k74_finish_resolutionchange); + +-/* This is utterly, totally horrible. I'm REALLY sorry... */ + void jbt6k74_setpower(enum jbt_power_mode new_power) + { +- if ( !jbt_global ) { +- printk(KERN_CRIT "JBT not initialised!!!\n"); +- return; +- } ++ if ( !jbt_global ) return; + jbt6k74_enter_power_mode(jbt_global, new_power); + } + EXPORT_SYMBOL_GPL(jbt6k74_setpower); +@@ -770,10 +839,8 @@ static int jbt_suspend(struct spi_device *spi, pm_message_t state) + + jbt->suspend_mode = jbt->power_mode; + +- printk(KERN_CRIT "[jbt] powering off for suspend\n"); + jbt6k74_enter_power_mode(jbt, JBT_POWER_MODE_OFF); + +- printk(KERN_CRIT "[jbt] done\n"); + dev_info(&spi->dev, "suspended\n"); + + return 0; +@@ -784,13 +851,11 @@ int jbt6k74_resume(struct spi_device *spi) + struct jbt_info *jbt = dev_get_drvdata(&spi->dev); + dev_info(&spi->dev, "starting resume: %d\n", jbt->suspend_mode); + +- printk(KERN_CRIT "[jbt] powering on for resume\n"); + mdelay(20); + + jbt->suspended = 0; + jbt6k74_enter_power_mode(jbt, jbt->suspend_mode); + +- printk(KERN_CRIT "[jbt] done\n"); + dev_info(&spi->dev, "resumed: %d\n", jbt->suspend_mode); + + return 0; +diff --git a/include/linux/jbt6k74.h b/include/linux/jbt6k74.h +index f430e5a..2010bdc 100644 +--- a/include/linux/jbt6k74.h ++++ b/include/linux/jbt6k74.h +@@ -10,11 +10,13 @@ enum jbt_resolution { + + enum jbt_power_mode { + JBT_POWER_MODE_OFF, ++ JBT_POWER_MODE_STANDBY, + JBT_POWER_MODE_NORMAL, + }; + + extern void jbt6k74_setpower(enum jbt_power_mode new_power); +-extern int jbt6k74_setresolution(enum jbt_resolution new_resolution); ++extern int jbt6k74_prepare_resolutionchange(enum jbt_resolution new_resolution); ++extern int jbt6k74_finish_resolutionchange(enum jbt_resolution new_resolution); + + + /* +-- +1.7.0.4 + diff --git a/recipes/linux/linux-openmoko-2.6.32/0022-gta02_drm_defconfig.patch b/recipes/linux/linux-openmoko-2.6.32/0022-gta02_drm_defconfig.patch deleted file mode 100644 index e722077f78..0000000000 --- a/recipes/linux/linux-openmoko-2.6.32/0022-gta02_drm_defconfig.patch +++ /dev/null @@ -1,2169 +0,0 @@ -From 91e56b8866d0cced4f17251eb509bd212dbd00f4 Mon Sep 17 00:00:00 2001 -From: Martin Jansa -Date: Fri, 9 Apr 2010 09:25:52 +0200 -Subject: [PATCH] gta02_drm_defconfig - -config used in SHR-U, KMS enabled ---- - arch/arm/configs/gta02_drm_defconfig | 2149 ++++++++++++++++++++++++++++++++++ - 1 files changed, 2149 insertions(+), 0 deletions(-) - create mode 100644 arch/arm/configs/gta02_drm_defconfig - -diff --git a/arch/arm/configs/gta02_drm_defconfig b/arch/arm/configs/gta02_drm_defconfig -new file mode 100644 -index 0000000..05aa130 ---- /dev/null -+++ b/arch/arm/configs/gta02_drm_defconfig -@@ -0,0 +1,2149 @@ -+# -+# Automatically generated make config: don't edit -+# Linux kernel version: 2.6.32.11 -+# Sun Apr 11 14:20:07 2010 -+# -+CONFIG_ARM=y -+CONFIG_HAVE_PWM=y -+CONFIG_SYS_SUPPORTS_APM_EMULATION=y -+CONFIG_GENERIC_GPIO=y -+CONFIG_NO_IOPORT=y -+CONFIG_GENERIC_HARDIRQS=y -+CONFIG_STACKTRACE_SUPPORT=y -+CONFIG_HAVE_LATENCYTOP_SUPPORT=y -+CONFIG_LOCKDEP_SUPPORT=y -+CONFIG_TRACE_IRQFLAGS_SUPPORT=y -+CONFIG_HARDIRQS_SW_RESEND=y -+CONFIG_GENERIC_IRQ_PROBE=y -+CONFIG_RWSEM_GENERIC_SPINLOCK=y -+CONFIG_ARCH_HAS_CPUFREQ=y -+CONFIG_GENERIC_HWEIGHT=y -+CONFIG_GENERIC_CALIBRATE_DELAY=y -+CONFIG_FIQ=y -+CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ=y -+CONFIG_VECTORS_BASE=0xffff0000 -+CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" -+CONFIG_CONSTRUCTORS=y -+ -+# -+# General setup -+# -+CONFIG_EXPERIMENTAL=y -+CONFIG_BROKEN_ON_SMP=y -+CONFIG_LOCK_KERNEL=y -+CONFIG_INIT_ENV_ARG_LIMIT=32 -+CONFIG_LOCALVERSION="" -+# CONFIG_LOCALVERSION_AUTO is not set -+CONFIG_SWAP=y -+CONFIG_SYSVIPC=y -+CONFIG_SYSVIPC_SYSCTL=y -+# CONFIG_POSIX_MQUEUE is not set -+# CONFIG_BSD_PROCESS_ACCT is not set -+# CONFIG_TASKSTATS is not set -+# CONFIG_AUDIT is not set -+ -+# -+# RCU Subsystem -+# -+CONFIG_TREE_RCU=y -+# CONFIG_TREE_PREEMPT_RCU is not set -+# CONFIG_RCU_TRACE is not set -+CONFIG_RCU_FANOUT=32 -+# CONFIG_RCU_FANOUT_EXACT is not set -+# CONFIG_TREE_RCU_TRACE is not set -+CONFIG_IKCONFIG=m -+CONFIG_IKCONFIG_PROC=y -+CONFIG_LOG_BUF_SHIFT=18 -+# CONFIG_GROUP_SCHED is not set -+# CONFIG_CGROUPS is not set -+# CONFIG_SYSFS_DEPRECATED_V2 is not set -+# CONFIG_RELAY is not set -+CONFIG_NAMESPACES=y -+# CONFIG_UTS_NS is not set -+# CONFIG_IPC_NS is not set -+# CONFIG_USER_NS is not set -+# CONFIG_PID_NS is not set -+# CONFIG_NET_NS is not set -+CONFIG_BLK_DEV_INITRD=y -+CONFIG_INITRAMFS_SOURCE="" -+CONFIG_RD_GZIP=y -+CONFIG_RD_BZIP2=y -+CONFIG_RD_LZMA=y -+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set -+CONFIG_SYSCTL=y -+CONFIG_ANON_INODES=y -+# CONFIG_EMBEDDED is not set -+CONFIG_UID16=y -+CONFIG_SYSCTL_SYSCALL=y -+CONFIG_KALLSYMS=y -+CONFIG_KALLSYMS_ALL=y -+# CONFIG_KALLSYMS_EXTRA_PASS is not set -+CONFIG_HOTPLUG=y -+CONFIG_PRINTK=y -+CONFIG_BUG=y -+CONFIG_ELF_CORE=y -+CONFIG_BASE_FULL=y -+CONFIG_FUTEX=y -+CONFIG_EPOLL=y -+CONFIG_SIGNALFD=y -+CONFIG_TIMERFD=y -+CONFIG_EVENTFD=y -+CONFIG_SHMEM=y -+CONFIG_AIO=y -+ -+# -+# Kernel Performance Events And Counters -+# -+CONFIG_VM_EVENT_COUNTERS=y -+CONFIG_COMPAT_BRK=y -+CONFIG_SLAB=y -+# CONFIG_SLUB is not set -+# CONFIG_SLOB is not set -+# CONFIG_PROFILING is not set -+CONFIG_HAVE_OPROFILE=y -+# CONFIG_KPROBES is not set -+CONFIG_HAVE_KPROBES=y -+CONFIG_HAVE_KRETPROBES=y -+CONFIG_HAVE_CLK=y -+ -+# -+# GCOV-based kernel profiling -+# -+# CONFIG_GCOV_KERNEL is not set -+CONFIG_SLOW_WORK=y -+# CONFIG_SLOW_WORK_DEBUG is not set -+CONFIG_HAVE_GENERIC_DMA_COHERENT=y -+CONFIG_SLABINFO=y -+CONFIG_RT_MUTEXES=y -+CONFIG_BASE_SMALL=0 -+CONFIG_MODULES=y -+# CONFIG_MODULE_FORCE_LOAD is not set -+CONFIG_MODULE_UNLOAD=y -+CONFIG_MODULE_FORCE_UNLOAD=y -+# CONFIG_MODVERSIONS is not set -+# CONFIG_MODULE_SRCVERSION_ALL is not set -+CONFIG_BLOCK=y -+# CONFIG_LBDAF is not set -+CONFIG_BLK_DEV_BSG=y -+# CONFIG_BLK_DEV_INTEGRITY is not set -+ -+# -+# IO Schedulers -+# -+CONFIG_IOSCHED_NOOP=y -+CONFIG_IOSCHED_AS=m -+CONFIG_IOSCHED_DEADLINE=y -+CONFIG_IOSCHED_CFQ=m -+# CONFIG_DEFAULT_AS is not set -+CONFIG_DEFAULT_DEADLINE=y -+# CONFIG_DEFAULT_CFQ is not set -+# CONFIG_DEFAULT_NOOP is not set -+CONFIG_DEFAULT_IOSCHED="deadline" -+CONFIG_FREEZER=y -+ -+# -+# System Type -+# -+CONFIG_MMU=y -+# CONFIG_ARCH_AAEC2000 is not set -+# CONFIG_ARCH_INTEGRATOR is not set -+# CONFIG_ARCH_REALVIEW is not set -+# CONFIG_ARCH_VERSATILE is not set -+# CONFIG_ARCH_AT91 is not set -+# CONFIG_ARCH_CLPS711X is not set -+# CONFIG_ARCH_GEMINI is not set -+# CONFIG_ARCH_EBSA110 is not set -+# CONFIG_ARCH_EP93XX is not set -+# CONFIG_ARCH_FOOTBRIDGE is not set -+# CONFIG_ARCH_MXC is not set -+# CONFIG_ARCH_STMP3XXX is not set -+# CONFIG_ARCH_NETX is not set -+# CONFIG_ARCH_H720X is not set -+# CONFIG_ARCH_NOMADIK is not set -+# CONFIG_ARCH_IOP13XX is not set -+# CONFIG_ARCH_IOP32X is not set -+# CONFIG_ARCH_IOP33X is not set -+# CONFIG_ARCH_IXP23XX is not set -+# CONFIG_ARCH_IXP2000 is not set -+# CONFIG_ARCH_IXP4XX is not set -+# CONFIG_ARCH_L7200 is not set -+# CONFIG_ARCH_KIRKWOOD is not set -+# CONFIG_ARCH_LOKI is not set -+# CONFIG_ARCH_MV78XX0 is not set -+# CONFIG_ARCH_ORION5X is not set -+# CONFIG_ARCH_MMP is not set -+# CONFIG_ARCH_KS8695 is not set -+# CONFIG_ARCH_NS9XXX is not set -+# CONFIG_ARCH_W90X900 is not set -+# CONFIG_ARCH_PNX4008 is not set -+# CONFIG_ARCH_PXA is not set -+# CONFIG_ARCH_MSM is not set -+# CONFIG_ARCH_RPC is not set -+# CONFIG_ARCH_SA1100 is not set -+CONFIG_ARCH_S3C2410=y -+# CONFIG_ARCH_S3C64XX is not set -+# CONFIG_ARCH_S5PC1XX is not set -+# CONFIG_ARCH_SHARK is not set -+# CONFIG_ARCH_LH7A40X is not set -+# CONFIG_ARCH_U300 is not set -+# CONFIG_ARCH_DAVINCI is not set -+# CONFIG_ARCH_OMAP is not set -+# CONFIG_ARCH_BCMRING is not set -+CONFIG_PLAT_S3C24XX=y -+CONFIG_S3C2410_CLOCK=y -+CONFIG_CPU_S3C244X=y -+CONFIG_S3C24XX_PWM=y -+CONFIG_S3C24XX_GPIO_EXTRA=64 -+CONFIG_S3C24XX_GPIO_EXTRA64=y -+CONFIG_S3C2410_DMA=y -+# CONFIG_S3C2410_DMA_DEBUG is not set -+CONFIG_S3C24XX_ADC=y -+CONFIG_PLAT_S3C=y -+CONFIG_CPU_LLSERIAL_S3C2440_ONLY=y -+CONFIG_CPU_LLSERIAL_S3C2440=y -+ -+# -+# Boot options -+# -+CONFIG_S3C_BOOT_WATCHDOG=y -+CONFIG_S3C_BOOT_ERROR_RESET=y -+CONFIG_S3C_BOOT_UART_FORCE_FIFO=y -+ -+# -+# Power management -+# -+# CONFIG_S3C2410_PM_DEBUG is not set -+# CONFIG_S3C2410_PM_CHECK is not set -+CONFIG_S3C_LOWLEVEL_UART_PORT=2 -+CONFIG_S3C_GPIO_SPACE=0 -+CONFIG_S3C_DMA=y -+CONFIG_S3C_DEV_USB_HOST=y -+CONFIG_S3C_DEV_NAND=y -+ -+# -+# S3C2400 Machines -+# -+CONFIG_CPU_S3C2410_DMA=y -+CONFIG_S3C2410_PM=y -+CONFIG_S3C2410_GPIO=y -+ -+# -+# S3C2410 Machines -+# -+# CONFIG_ARCH_SMDK2410 is not set -+# CONFIG_ARCH_H1940 is not set -+# CONFIG_MACH_N30 is not set -+# CONFIG_ARCH_BAST is not set -+# CONFIG_MACH_OTOM is not set -+# CONFIG_MACH_AML_M5900 is not set -+# CONFIG_MACH_TCT_HAMMER is not set -+# CONFIG_MACH_VR1000 is not set -+# CONFIG_MACH_QT2410 is not set -+ -+# -+# S3C2412 Machines -+# -+# CONFIG_MACH_JIVE is not set -+# CONFIG_MACH_SMDK2413 is not set -+# CONFIG_MACH_SMDK2412 is not set -+# CONFIG_MACH_VSTMS is not set -+ -+# -+# S3C2440 Machines -+# -+# CONFIG_MACH_ANUBIS is not set -+# CONFIG_MACH_OSIRIS is not set -+# CONFIG_MACH_RX3715 is not set -+# CONFIG_ARCH_S3C2440 is not set -+# CONFIG_MACH_NEXCODER_2440 is not set -+# CONFIG_MACH_AT2440EVB is not set -+# CONFIG_MACH_MINI2440 is not set -+CONFIG_CPU_S3C2442=y -+ -+# -+# S3C2442 Machines -+# -+CONFIG_MACH_NEO1973_GTA02=y -+ -+# -+# S3C2443 Machines -+# -+# CONFIG_MACH_SMDK2443 is not set -+ -+# -+# Processor Type -+# -+CONFIG_CPU_32=y -+CONFIG_CPU_ARM920T=y -+CONFIG_CPU_32v4T=y -+CONFIG_CPU_ABRT_EV4T=y -+CONFIG_CPU_PABRT_LEGACY=y -+CONFIG_CPU_CACHE_V4WT=y -+CONFIG_CPU_CACHE_VIVT=y -+CONFIG_CPU_COPY_V4WB=y -+CONFIG_CPU_TLB_V4WBI=y -+CONFIG_CPU_CP15=y -+CONFIG_CPU_CP15_MMU=y -+ -+# -+# Processor Features -+# -+CONFIG_ARM_THUMB=y -+# CONFIG_CPU_ICACHE_DISABLE is not set -+# CONFIG_CPU_DCACHE_DISABLE is not set -+# CONFIG_CPU_DCACHE_WRITETHROUGH is not set -+CONFIG_ARM_L1_CACHE_SHIFT=5 -+ -+# -+# Bus support -+# -+# CONFIG_PCI_SYSCALL is not set -+# CONFIG_ARCH_SUPPORTS_MSI is not set -+# CONFIG_PCCARD is not set -+ -+# -+# Kernel Features -+# -+CONFIG_VMSPLIT_3G=y -+# CONFIG_VMSPLIT_2G is not set -+# CONFIG_VMSPLIT_1G is not set -+CONFIG_PAGE_OFFSET=0xC0000000 -+# CONFIG_PREEMPT_NONE is not set -+# CONFIG_PREEMPT_VOLUNTARY is not set -+CONFIG_PREEMPT=y -+CONFIG_HZ=200 -+CONFIG_AEABI=y -+# CONFIG_OABI_COMPAT is not set -+# CONFIG_ARCH_SPARSEMEM_DEFAULT is not set -+# CONFIG_ARCH_SELECT_MEMORY_MODEL is not set -+# CONFIG_HIGHMEM is not set -+CONFIG_SELECT_MEMORY_MODEL=y -+CONFIG_FLATMEM_MANUAL=y -+# CONFIG_DISCONTIGMEM_MANUAL is not set -+# CONFIG_SPARSEMEM_MANUAL is not set -+CONFIG_FLATMEM=y -+CONFIG_FLAT_NODE_MEM_MAP=y -+CONFIG_PAGEFLAGS_EXTENDED=y -+CONFIG_SPLIT_PTLOCK_CPUS=4096 -+# CONFIG_PHYS_ADDR_T_64BIT is not set -+CONFIG_ZONE_DMA_FLAG=0 -+CONFIG_VIRT_TO_BUS=y -+CONFIG_HAVE_MLOCK=y -+CONFIG_HAVE_MLOCKED_PAGE_BIT=y -+# CONFIG_KSM is not set -+CONFIG_DEFAULT_MMAP_MIN_ADDR=4096 -+CONFIG_ALIGNMENT_TRAP=y -+# CONFIG_UACCESS_WITH_MEMCPY is not set -+ -+# -+# Boot options -+# -+CONFIG_ZBOOT_ROM_TEXT=0x0 -+CONFIG_ZBOOT_ROM_BSS=0x0 -+CONFIG_CMDLINE="unused -- bootloader passes ATAG list quiet " -+# CONFIG_XIP_KERNEL is not set -+# CONFIG_KEXEC is not set -+ -+# -+# CPU Power Management -+# -+# CONFIG_CPU_FREQ is not set -+CONFIG_CPU_IDLE=y -+CONFIG_CPU_IDLE_GOV_LADDER=y -+ -+# -+# Floating point emulation -+# -+ -+# -+# At least one emulation must be selected -+# -+ -+# -+# Userspace binary formats -+# -+CONFIG_BINFMT_ELF=y -+# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set -+CONFIG_HAVE_AOUT=y -+# CONFIG_BINFMT_AOUT is not set -+# CONFIG_BINFMT_MISC is not set -+ -+# -+# Power management options -+# -+CONFIG_PM=y -+# CONFIG_PM_DEBUG is not set -+CONFIG_PM_SLEEP=y -+CONFIG_SUSPEND=y -+CONFIG_SUSPEND_FREEZER=y -+# CONFIG_APM_EMULATION is not set -+# CONFIG_PM_RUNTIME is not set -+CONFIG_ARCH_SUSPEND_POSSIBLE=y -+CONFIG_NET=y -+ -+# -+# Networking options -+# -+CONFIG_PACKET=y -+CONFIG_PACKET_MMAP=y -+CONFIG_UNIX=y -+CONFIG_XFRM=y -+CONFIG_XFRM_USER=m -+# CONFIG_XFRM_SUB_POLICY is not set -+CONFIG_XFRM_MIGRATE=y -+# CONFIG_XFRM_STATISTICS is not set -+CONFIG_XFRM_IPCOMP=m -+CONFIG_NET_KEY=m -+CONFIG_NET_KEY_MIGRATE=y -+CONFIG_INET=y -+CONFIG_IP_MULTICAST=y -+CONFIG_IP_ADVANCED_ROUTER=y -+CONFIG_ASK_IP_FIB_HASH=y -+# CONFIG_IP_FIB_TRIE is not set -+CONFIG_IP_FIB_HASH=y -+CONFIG_IP_MULTIPLE_TABLES=y -+# CONFIG_IP_ROUTE_MULTIPATH is not set -+# CONFIG_IP_ROUTE_VERBOSE is not set -+CONFIG_IP_PNP=y -+# CONFIG_IP_PNP_DHCP is not set -+# CONFIG_IP_PNP_BOOTP is not set -+# CONFIG_IP_PNP_RARP is not set -+CONFIG_NET_IPIP=m -+CONFIG_NET_IPGRE=m -+# CONFIG_NET_IPGRE_BROADCAST is not set -+CONFIG_IP_MROUTE=y -+# CONFIG_IP_PIMSM_V1 is not set -+# CONFIG_IP_PIMSM_V2 is not set -+# CONFIG_ARPD is not set -+CONFIG_SYN_COOKIES=y -+CONFIG_INET_AH=m -+CONFIG_INET_ESP=m -+CONFIG_INET_IPCOMP=m -+CONFIG_INET_XFRM_TUNNEL=m -+CONFIG_INET_TUNNEL=m -+CONFIG_INET_XFRM_MODE_TRANSPORT=m -+CONFIG_INET_XFRM_MODE_TUNNEL=m -+CONFIG_INET_XFRM_MODE_BEET=m -+# CONFIG_INET_LRO is not set -+CONFIG_INET_DIAG=y -+CONFIG_INET_TCP_DIAG=y -+CONFIG_TCP_CONG_ADVANCED=y -+# CONFIG_TCP_CONG_BIC is not set -+# CONFIG_TCP_CONG_CUBIC is not set -+CONFIG_TCP_CONG_WESTWOOD=y -+# CONFIG_TCP_CONG_HTCP is not set -+# CONFIG_TCP_CONG_HSTCP is not set -+# CONFIG_TCP_CONG_HYBLA is not set -+# CONFIG_TCP_CONG_VEGAS is not set -+# CONFIG_TCP_CONG_SCALABLE is not set -+# CONFIG_TCP_CONG_LP is not set -+# CONFIG_TCP_CONG_VENO is not set -+# CONFIG_TCP_CONG_YEAH is not set -+# CONFIG_TCP_CONG_ILLINOIS is not set -+# CONFIG_DEFAULT_BIC is not set -+# CONFIG_DEFAULT_CUBIC is not set -+# CONFIG_DEFAULT_HTCP is not set -+# CONFIG_DEFAULT_VEGAS is not set -+CONFIG_DEFAULT_WESTWOOD=y -+# CONFIG_DEFAULT_RENO is not set -+CONFIG_DEFAULT_TCP_CONG="westwood" -+CONFIG_TCP_MD5SIG=y -+CONFIG_IPV6=m -+# CONFIG_IPV6_PRIVACY is not set -+# CONFIG_IPV6_ROUTER_PREF is not set -+# CONFIG_IPV6_OPTIMISTIC_DAD is not set -+CONFIG_INET6_AH=m -+CONFIG_INET6_ESP=m -+CONFIG_INET6_IPCOMP=m -+# CONFIG_IPV6_MIP6 is not set -+CONFIG_INET6_XFRM_TUNNEL=m -+CONFIG_INET6_TUNNEL=m -+CONFIG_INET6_XFRM_MODE_TRANSPORT=m -+CONFIG_INET6_XFRM_MODE_TUNNEL=m -+CONFIG_INET6_XFRM_MODE_BEET=m -+# CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set -+CONFIG_IPV6_SIT=m -+CONFIG_IPV6_NDISC_NODETYPE=y -+CONFIG_IPV6_TUNNEL=m -+# CONFIG_IPV6_MULTIPLE_TABLES is not set -+# CONFIG_IPV6_MROUTE is not set -+# CONFIG_NETWORK_SECMARK is not set -+CONFIG_NETFILTER=y -+# CONFIG_NETFILTER_DEBUG is not set -+CONFIG_NETFILTER_ADVANCED=y -+CONFIG_BRIDGE_NETFILTER=y -+ -+# -+# Core Netfilter Configuration -+# -+CONFIG_NETFILTER_NETLINK=m -+CONFIG_NETFILTER_NETLINK_QUEUE=m -+CONFIG_NETFILTER_NETLINK_LOG=m -+CONFIG_NF_CONNTRACK=m -+CONFIG_NF_CT_ACCT=y -+CONFIG_NF_CONNTRACK_MARK=y -+# CONFIG_NF_CONNTRACK_EVENTS is not set -+# CONFIG_NF_CT_PROTO_DCCP is not set -+CONFIG_NF_CT_PROTO_GRE=m -+CONFIG_NF_CT_PROTO_SCTP=m -+# CONFIG_NF_CT_PROTO_UDPLITE is not set -+# CONFIG_NF_CONNTRACK_AMANDA is not set -+CONFIG_NF_CONNTRACK_FTP=m -+CONFIG_NF_CONNTRACK_H323=m -+CONFIG_NF_CONNTRACK_IRC=m -+CONFIG_NF_CONNTRACK_NETBIOS_NS=m -+CONFIG_NF_CONNTRACK_PPTP=m -+CONFIG_NF_CONNTRACK_SANE=m -+CONFIG_NF_CONNTRACK_SIP=m -+CONFIG_NF_CONNTRACK_TFTP=m -+CONFIG_NF_CT_NETLINK=m -+# CONFIG_NETFILTER_TPROXY is not set -+CONFIG_NETFILTER_XTABLES=m -+CONFIG_NETFILTER_XT_TARGET_CLASSIFY=m -+CONFIG_NETFILTER_XT_TARGET_CONNMARK=m -+CONFIG_NETFILTER_XT_TARGET_DSCP=m -+CONFIG_NETFILTER_XT_TARGET_HL=m -+# CONFIG_NETFILTER_XT_TARGET_LED is not set -+CONFIG_NETFILTER_XT_TARGET_MARK=m -+CONFIG_NETFILTER_XT_TARGET_NFLOG=m -+CONFIG_NETFILTER_XT_TARGET_NFQUEUE=m -+CONFIG_NETFILTER_XT_TARGET_NOTRACK=m -+# CONFIG_NETFILTER_XT_TARGET_RATEEST is not set -+# CONFIG_NETFILTER_XT_TARGET_TRACE is not set -+CONFIG_NETFILTER_XT_TARGET_TCPMSS=m -+# CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP is not set -+# CONFIG_NETFILTER_XT_MATCH_CLUSTER is not set -+# CONFIG_NETFILTER_XT_MATCH_COMMENT is not set -+CONFIG_NETFILTER_XT_MATCH_CONNBYTES=m -+# CONFIG_NETFILTER_XT_MATCH_CONNLIMIT is not set -+CONFIG_NETFILTER_XT_MATCH_CONNMARK=m -+CONFIG_NETFILTER_XT_MATCH_CONNTRACK=m -+CONFIG_NETFILTER_XT_MATCH_DCCP=m -+CONFIG_NETFILTER_XT_MATCH_DSCP=m -+CONFIG_NETFILTER_XT_MATCH_ESP=m -+CONFIG_NETFILTER_XT_MATCH_HASHLIMIT=m -+CONFIG_NETFILTER_XT_MATCH_HELPER=m -+CONFIG_NETFILTER_XT_MATCH_HL=m -+CONFIG_NETFILTER_XT_MATCH_IPRANGE=m -+CONFIG_NETFILTER_XT_MATCH_LENGTH=m -+CONFIG_NETFILTER_XT_MATCH_LIMIT=m -+CONFIG_NETFILTER_XT_MATCH_MAC=m -+CONFIG_NETFILTER_XT_MATCH_MARK=m -+CONFIG_NETFILTER_XT_MATCH_MULTIPORT=m -+# CONFIG_NETFILTER_XT_MATCH_OWNER is not set -+CONFIG_NETFILTER_XT_MATCH_POLICY=m -+CONFIG_NETFILTER_XT_MATCH_PHYSDEV=m -+CONFIG_NETFILTER_XT_MATCH_PKTTYPE=m -+CONFIG_NETFILTER_XT_MATCH_QUOTA=m -+# CONFIG_NETFILTER_XT_MATCH_RATEEST is not set -+CONFIG_NETFILTER_XT_MATCH_REALM=m -+CONFIG_NETFILTER_XT_MATCH_RECENT=m -+# CONFIG_NETFILTER_XT_MATCH_RECENT_PROC_COMPAT is not set -+CONFIG_NETFILTER_XT_MATCH_SCTP=m -+CONFIG_NETFILTER_XT_MATCH_STATE=m -+CONFIG_NETFILTER_XT_MATCH_STATISTIC=m -+CONFIG_NETFILTER_XT_MATCH_STRING=m -+CONFIG_NETFILTER_XT_MATCH_TCPMSS=m -+CONFIG_NETFILTER_XT_MATCH_TIME=m -+# CONFIG_NETFILTER_XT_MATCH_U32 is not set -+# CONFIG_NETFILTER_XT_MATCH_OSF is not set -+# CONFIG_IP_VS is not set -+ -+# -+# IP: Netfilter Configuration -+# -+CONFIG_NF_DEFRAG_IPV4=m -+CONFIG_NF_CONNTRACK_IPV4=m -+CONFIG_NF_CONNTRACK_PROC_COMPAT=y -+# CONFIG_IP_NF_QUEUE is not set -+CONFIG_IP_NF_IPTABLES=m -+CONFIG_IP_NF_MATCH_ADDRTYPE=m -+CONFIG_IP_NF_MATCH_AH=m -+CONFIG_IP_NF_MATCH_ECN=m -+CONFIG_IP_NF_MATCH_TTL=m -+CONFIG_IP_NF_FILTER=m -+CONFIG_IP_NF_TARGET_REJECT=m -+CONFIG_IP_NF_TARGET_LOG=m -+CONFIG_IP_NF_TARGET_ULOG=m -+CONFIG_NF_NAT=m -+CONFIG_NF_NAT_NEEDED=y -+CONFIG_IP_NF_TARGET_MASQUERADE=m -+CONFIG_IP_NF_TARGET_NETMAP=m -+CONFIG_IP_NF_TARGET_REDIRECT=m -+CONFIG_NF_NAT_SNMP_BASIC=m -+CONFIG_NF_NAT_PROTO_GRE=m -+CONFIG_NF_NAT_PROTO_SCTP=m -+CONFIG_NF_NAT_FTP=m -+CONFIG_NF_NAT_IRC=m -+CONFIG_NF_NAT_TFTP=m -+# CONFIG_NF_NAT_AMANDA is not set -+CONFIG_NF_NAT_PPTP=m -+CONFIG_NF_NAT_H323=m -+CONFIG_NF_NAT_SIP=m -+CONFIG_IP_NF_MANGLE=m -+CONFIG_IP_NF_TARGET_CLUSTERIP=m -+CONFIG_IP_NF_TARGET_ECN=m -+CONFIG_IP_NF_TARGET_TTL=m -+CONFIG_IP_NF_RAW=m -+# CONFIG_IP_NF_ARPTABLES is not set -+ -+# -+# IPv6: Netfilter Configuration -+# -+CONFIG_NF_CONNTRACK_IPV6=m -+# CONFIG_IP6_NF_QUEUE is not set -+CONFIG_IP6_NF_IPTABLES=m -+CONFIG_IP6_NF_MATCH_AH=m -+CONFIG_IP6_NF_MATCH_EUI64=m -+CONFIG_IP6_NF_MATCH_FRAG=m -+CONFIG_IP6_NF_MATCH_OPTS=m -+CONFIG_IP6_NF_MATCH_HL=m -+CONFIG_IP6_NF_MATCH_IPV6HEADER=m -+CONFIG_IP6_NF_MATCH_MH=m -+CONFIG_IP6_NF_MATCH_RT=m -+CONFIG_IP6_NF_TARGET_HL=m -+CONFIG_IP6_NF_TARGET_LOG=m -+CONFIG_IP6_NF_FILTER=m -+CONFIG_IP6_NF_TARGET_REJECT=m -+CONFIG_IP6_NF_MANGLE=m -+# CONFIG_IP6_NF_RAW is not set -+CONFIG_BRIDGE_NF_EBTABLES=m -+CONFIG_BRIDGE_EBT_BROUTE=m -+CONFIG_BRIDGE_EBT_T_FILTER=m -+CONFIG_BRIDGE_EBT_T_NAT=m -+CONFIG_BRIDGE_EBT_802_3=m -+CONFIG_BRIDGE_EBT_AMONG=m -+CONFIG_BRIDGE_EBT_ARP=m -+CONFIG_BRIDGE_EBT_IP=m -+# CONFIG_BRIDGE_EBT_IP6 is not set -+CONFIG_BRIDGE_EBT_LIMIT=m -+CONFIG_BRIDGE_EBT_MARK=m -+CONFIG_BRIDGE_EBT_PKTTYPE=m -+CONFIG_BRIDGE_EBT_STP=m -+CONFIG_BRIDGE_EBT_VLAN=m -+CONFIG_BRIDGE_EBT_ARPREPLY=m -+CONFIG_BRIDGE_EBT_DNAT=m -+CONFIG_BRIDGE_EBT_MARK_T=m -+CONFIG_BRIDGE_EBT_REDIRECT=m -+CONFIG_BRIDGE_EBT_SNAT=m -+CONFIG_BRIDGE_EBT_LOG=m -+CONFIG_BRIDGE_EBT_ULOG=m -+# CONFIG_BRIDGE_EBT_NFLOG is not set -+# CONFIG_IP_DCCP is not set -+# CONFIG_IP_SCTP is not set -+# CONFIG_RDS is not set -+# CONFIG_TIPC is not set -+# CONFIG_ATM is not set -+CONFIG_STP=y -+CONFIG_BRIDGE=y -+# CONFIG_NET_DSA is not set -+# CONFIG_VLAN_8021Q is not set -+# CONFIG_DECNET is not set -+CONFIG_LLC=y -+# CONFIG_LLC2 is not set -+# CONFIG_IPX is not set -+# CONFIG_ATALK is not set -+# CONFIG_X25 is not set -+# CONFIG_LAPB is not set -+# CONFIG_ECONET is not set -+# CONFIG_WAN_ROUTER is not set -+# CONFIG_PHONET is not set -+# CONFIG_IEEE802154 is not set -+CONFIG_NET_SCHED=y -+ -+# -+# Queueing/Scheduling -+# -+CONFIG_NET_SCH_CBQ=m -+CONFIG_NET_SCH_HTB=m -+CONFIG_NET_SCH_HFSC=m -+CONFIG_NET_SCH_PRIO=m -+# CONFIG_NET_SCH_MULTIQ is not set -+CONFIG_NET_SCH_RED=m -+CONFIG_NET_SCH_SFQ=m -+CONFIG_NET_SCH_TEQL=m -+CONFIG_NET_SCH_TBF=m -+CONFIG_NET_SCH_GRED=m -+CONFIG_NET_SCH_DSMARK=m -+CONFIG_NET_SCH_NETEM=m -+# CONFIG_NET_SCH_DRR is not set -+ -+# -+# Classification -+# -+CONFIG_NET_CLS=y -+CONFIG_NET_CLS_BASIC=m -+CONFIG_NET_CLS_TCINDEX=m -+CONFIG_NET_CLS_ROUTE4=m -+CONFIG_NET_CLS_ROUTE=y -+CONFIG_NET_CLS_FW=m -+CONFIG_NET_CLS_U32=m -+CONFIG_CLS_U32_PERF=y -+CONFIG_CLS_U32_MARK=y -+CONFIG_NET_CLS_RSVP=m -+CONFIG_NET_CLS_RSVP6=m -+# CONFIG_NET_CLS_FLOW is not set -+# CONFIG_NET_EMATCH is not set -+# CONFIG_NET_CLS_ACT is not set -+# CONFIG_NET_CLS_IND is not set -+CONFIG_NET_SCH_FIFO=y -+# CONFIG_DCB is not set -+ -+# -+# Network testing -+# -+# CONFIG_NET_PKTGEN is not set -+# CONFIG_HAMRADIO is not set -+# CONFIG_CAN is not set -+# CONFIG_IRDA is not set -+CONFIG_BT=y -+CONFIG_BT_L2CAP=y -+CONFIG_BT_SCO=y -+CONFIG_BT_RFCOMM=y -+CONFIG_BT_RFCOMM_TTY=y -+CONFIG_BT_BNEP=y -+CONFIG_BT_BNEP_MC_FILTER=y -+CONFIG_BT_BNEP_PROTO_FILTER=y -+CONFIG_BT_HIDP=y -+ -+# -+# Bluetooth device drivers -+# -+CONFIG_BT_HCIBTUSB=y -+# CONFIG_BT_HCIBTSDIO is not set -+# CONFIG_BT_HCIUART is not set -+# CONFIG_BT_HCIBCM203X is not set -+# CONFIG_BT_HCIBPA10X is not set -+# CONFIG_BT_HCIBFUSB is not set -+# CONFIG_BT_HCIVHCI is not set -+# CONFIG_BT_MRVL is not set -+# CONFIG_AF_RXRPC is not set -+CONFIG_FIB_RULES=y -+CONFIG_WIRELESS=y -+# CONFIG_CFG80211 is not set -+CONFIG_CFG80211_DEFAULT_PS_VALUE=0 -+CONFIG_WIRELESS_OLD_REGULATORY=y -+CONFIG_WIRELESS_EXT=y -+CONFIG_WIRELESS_EXT_SYSFS=y -+# CONFIG_LIB80211 is not set -+ -+# -+# CFG80211 needs to be enabled for MAC80211 -+# -+# CONFIG_WIMAX is not set -+CONFIG_RFKILL=y -+CONFIG_RFKILL_LEDS=y -+CONFIG_RFKILL_INPUT=y -+# CONFIG_NET_9P is not set -+ -+# -+# Device Drivers -+# -+ -+# -+# Generic Driver Options -+# -+CONFIG_UEVENT_HELPER_PATH="" -+CONFIG_DEVTMPFS=y -+CONFIG_DEVTMPFS_MOUNT=y -+CONFIG_STANDALONE=y -+CONFIG_PREVENT_FIRMWARE_BUILD=y -+CONFIG_FW_LOADER=y -+# CONFIG_FIRMWARE_IN_KERNEL is not set -+CONFIG_EXTRA_FIRMWARE="" -+# CONFIG_SYS_HYPERVISOR is not set -+CONFIG_CONNECTOR=m -+CONFIG_MTD=y -+# CONFIG_MTD_DEBUG is not set -+# CONFIG_MTD_TESTS is not set -+CONFIG_MTD_CONCAT=y -+CONFIG_MTD_PARTITIONS=y -+# CONFIG_MTD_REDBOOT_PARTS is not set -+CONFIG_MTD_CMDLINE_PARTS=y -+# CONFIG_MTD_AFS_PARTS is not set -+# CONFIG_MTD_AR7_PARTS is not set -+ -+# -+# User Modules And Translation Layers -+# -+CONFIG_MTD_CHAR=y -+CONFIG_MTD_BLKDEVS=y -+CONFIG_MTD_BLOCK=y -+# CONFIG_FTL is not set -+# CONFIG_NFTL is not set -+# CONFIG_INFTL is not set -+# CONFIG_RFD_FTL is not set -+# CONFIG_SSFDC is not set -+# CONFIG_MTD_OOPS is not set -+ -+# -+# RAM/ROM/Flash chip drivers -+# -+CONFIG_MTD_CFI=y -+# CONFIG_MTD_JEDECPROBE is not set -+CONFIG_MTD_GEN_PROBE=y -+# CONFIG_MTD_CFI_ADV_OPTIONS is not set -+CONFIG_MTD_MAP_BANK_WIDTH_1=y -+CONFIG_MTD_MAP_BANK_WIDTH_2=y -+CONFIG_MTD_MAP_BANK_WIDTH_4=y -+# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set -+# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set -+# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set -+CONFIG_MTD_CFI_I1=y -+CONFIG_MTD_CFI_I2=y -+# CONFIG_MTD_CFI_I4 is not set -+# CONFIG_MTD_CFI_I8 is not set -+CONFIG_MTD_CFI_INTELEXT=y -+# CONFIG_MTD_CFI_AMDSTD is not set -+# CONFIG_MTD_CFI_STAA is not set -+CONFIG_MTD_CFI_UTIL=y -+# CONFIG_MTD_RAM is not set -+CONFIG_MTD_ROM=y -+CONFIG_MTD_ABSENT=y -+ -+# -+# Mapping drivers for chip access -+# -+# CONFIG_MTD_COMPLEX_MAPPINGS is not set -+CONFIG_MTD_PHYSMAP=y -+# CONFIG_MTD_PHYSMAP_COMPAT is not set -+# CONFIG_MTD_ARM_INTEGRATOR is not set -+# CONFIG_MTD_PLATRAM is not set -+ -+# -+# Self-contained MTD device drivers -+# -+# CONFIG_MTD_DATAFLASH is not set -+# CONFIG_MTD_M25P80 is not set -+# CONFIG_MTD_SST25L is not set -+# CONFIG_MTD_SLRAM is not set -+# CONFIG_MTD_PHRAM is not set -+# CONFIG_MTD_MTDRAM is not set -+# CONFIG_MTD_BLOCK2MTD is not set -+ -+# -+# Disk-On-Chip Device Drivers -+# -+# CONFIG_MTD_DOC2000 is not set -+# CONFIG_MTD_DOC2001 is not set -+# CONFIG_MTD_DOC2001PLUS is not set -+CONFIG_MTD_NAND=y -+CONFIG_MTD_NAND_VERIFY_WRITE=y -+# CONFIG_MTD_NAND_ECC_SMC is not set -+# CONFIG_MTD_NAND_MUSEUM_IDS is not set -+# CONFIG_MTD_NAND_GPIO is not set -+CONFIG_MTD_NAND_IDS=y -+CONFIG_MTD_NAND_S3C2410=y -+# CONFIG_MTD_NAND_S3C2410_DEBUG is not set -+CONFIG_MTD_NAND_S3C2410_HWECC=y -+# CONFIG_MTD_NAND_S3C2410_CLKSTOP is not set -+# CONFIG_MTD_NAND_DISKONCHIP is not set -+# CONFIG_MTD_NAND_NANDSIM is not set -+# CONFIG_MTD_NAND_PLATFORM is not set -+# CONFIG_MTD_ALAUDA is not set -+# CONFIG_MTD_ONENAND is not set -+ -+# -+# LPDDR flash memory drivers -+# -+# CONFIG_MTD_LPDDR is not set -+ -+# -+# UBI - Unsorted block images -+# -+CONFIG_MTD_UBI=y -+CONFIG_MTD_UBI_WL_THRESHOLD=4096 -+CONFIG_MTD_UBI_BEB_RESERVE=1 -+CONFIG_MTD_UBI_GLUEBI=y -+ -+# -+# UBI debugging options -+# -+CONFIG_MTD_UBI_DEBUG=y -+# CONFIG_MTD_UBI_DEBUG_MSG is not set -+# CONFIG_MTD_UBI_DEBUG_PARANOID is not set -+CONFIG_MTD_UBI_DEBUG_DISABLE_BGT=y -+# CONFIG_MTD_UBI_DEBUG_EMULATE_BITFLIPS is not set -+# CONFIG_MTD_UBI_DEBUG_EMULATE_WRITE_FAILURES is not set -+# CONFIG_MTD_UBI_DEBUG_EMULATE_ERASE_FAILURES is not set -+ -+# -+# Additional UBI debugging messages -+# -+# CONFIG_MTD_UBI_DEBUG_MSG_BLD is not set -+# CONFIG_MTD_UBI_DEBUG_MSG_EBA is not set -+# CONFIG_MTD_UBI_DEBUG_MSG_WL is not set -+# CONFIG_MTD_UBI_DEBUG_MSG_IO is not set -+# CONFIG_PARPORT is not set -+CONFIG_BLK_DEV=y -+# CONFIG_BLK_DEV_COW_COMMON is not set -+CONFIG_BLK_DEV_LOOP=m -+# CONFIG_BLK_DEV_CRYPTOLOOP is not set -+# CONFIG_BLK_DEV_NBD is not set -+CONFIG_BLK_DEV_UB=m -+CONFIG_BLK_DEV_RAM=y -+CONFIG_BLK_DEV_RAM_COUNT=16 -+CONFIG_BLK_DEV_RAM_SIZE=4096 -+# CONFIG_BLK_DEV_XIP is not set -+# CONFIG_CDROM_PKTCDVD is not set -+# CONFIG_ATA_OVER_ETH is not set -+# CONFIG_MG_DISK is not set -+# CONFIG_MISC_DEVICES is not set -+CONFIG_HAVE_IDE=y -+# CONFIG_IDE is not set -+ -+# -+# SCSI device support -+# -+# CONFIG_RAID_ATTRS is not set -+CONFIG_SCSI=m -+CONFIG_SCSI_DMA=y -+# CONFIG_SCSI_TGT is not set -+# CONFIG_SCSI_NETLINK is not set -+CONFIG_SCSI_PROC_FS=y -+ -+# -+# SCSI support type (disk, tape, CD-ROM) -+# -+CONFIG_BLK_DEV_SD=m -+# CONFIG_CHR_DEV_ST is not set -+# CONFIG_CHR_DEV_OSST is not set -+CONFIG_BLK_DEV_SR=m -+# CONFIG_BLK_DEV_SR_VENDOR is not set -+CONFIG_CHR_DEV_SG=m -+# CONFIG_CHR_DEV_SCH is not set -+CONFIG_SCSI_MULTI_LUN=y -+# CONFIG_SCSI_CONSTANTS is not set -+# CONFIG_SCSI_LOGGING is not set -+CONFIG_SCSI_SCAN_ASYNC=y -+CONFIG_SCSI_WAIT_SCAN=m -+ -+# -+# SCSI Transports -+# -+# CONFIG_SCSI_SPI_ATTRS is not set -+# CONFIG_SCSI_FC_ATTRS is not set -+# CONFIG_SCSI_ISCSI_ATTRS is not set -+# CONFIG_SCSI_SAS_ATTRS is not set -+# CONFIG_SCSI_SAS_LIBSAS is not set -+# CONFIG_SCSI_SRP_ATTRS is not set -+CONFIG_SCSI_LOWLEVEL=y -+# CONFIG_ISCSI_TCP is not set -+# CONFIG_LIBFC is not set -+# CONFIG_LIBFCOE is not set -+# CONFIG_SCSI_DEBUG is not set -+# CONFIG_SCSI_DH is not set -+# CONFIG_SCSI_OSD_INITIATOR is not set -+# CONFIG_ATA is not set -+# CONFIG_MD is not set -+CONFIG_NETDEVICES=y -+# CONFIG_DUMMY is not set -+# CONFIG_BONDING is not set -+# CONFIG_MACVLAN is not set -+# CONFIG_EQUALIZER is not set -+CONFIG_TUN=m -+# CONFIG_VETH is not set -+# CONFIG_NET_ETHERNET is not set -+CONFIG_MII=m -+# CONFIG_NETDEV_1000 is not set -+# CONFIG_NETDEV_10000 is not set -+CONFIG_WLAN=y -+# CONFIG_WLAN_PRE80211 is not set -+# CONFIG_WLAN_80211 is not set -+ -+# -+# Enable WiMAX (Networking options) to see the WiMAX drivers -+# -+ -+# -+# USB Network Adapters -+# -+CONFIG_USB_CATC=m -+CONFIG_USB_KAWETH=m -+CONFIG_USB_PEGASUS=m -+CONFIG_USB_RTL8150=m -+CONFIG_USB_USBNET=m -+# CONFIG_USB_NET_AX8817X is not set -+CONFIG_USB_NET_CDCETHER=m -+# CONFIG_USB_NET_CDC_EEM is not set -+# CONFIG_USB_NET_DM9601 is not set -+# CONFIG_USB_NET_SMSC95XX is not set -+# CONFIG_USB_NET_GL620A is not set -+CONFIG_USB_NET_NET1080=m -+# CONFIG_USB_NET_PLUSB is not set -+# CONFIG_USB_NET_MCS7830 is not set -+# CONFIG_USB_NET_RNDIS_HOST is not set -+CONFIG_USB_NET_CDC_SUBSET=m -+# CONFIG_USB_ALI_M5632 is not set -+# CONFIG_USB_AN2720 is not set -+CONFIG_USB_BELKIN=y -+CONFIG_USB_ARMLINUX=y -+# CONFIG_USB_EPSON2888 is not set -+# CONFIG_USB_KC2190 is not set -+CONFIG_USB_NET_ZAURUS=m -+# CONFIG_USB_HSO is not set -+# CONFIG_USB_NET_INT51X1 is not set -+# CONFIG_WAN is not set -+CONFIG_PPP=m -+CONFIG_PPP_MULTILINK=y -+CONFIG_PPP_FILTER=y -+CONFIG_PPP_ASYNC=m -+CONFIG_PPP_SYNC_TTY=m -+CONFIG_PPP_DEFLATE=m -+CONFIG_PPP_BSDCOMP=m -+CONFIG_PPP_MPPE=m -+# CONFIG_PPPOE is not set -+# CONFIG_PPPOL2TP is not set -+# CONFIG_SLIP is not set -+CONFIG_SLHC=m -+# CONFIG_NETCONSOLE is not set -+# CONFIG_NETPOLL is not set -+# CONFIG_NET_POLL_CONTROLLER is not set -+# CONFIG_ISDN is not set -+# CONFIG_PHONE is not set -+ -+# -+# Input device support -+# -+CONFIG_INPUT=y -+# CONFIG_INPUT_FF_MEMLESS is not set -+# CONFIG_INPUT_POLLDEV is not set -+ -+# -+# Userland interfaces -+# -+CONFIG_INPUT_MOUSEDEV=y -+# CONFIG_INPUT_MOUSEDEV_PSAUX is not set -+CONFIG_INPUT_MOUSEDEV_SCREEN_X=480 -+CONFIG_INPUT_MOUSEDEV_SCREEN_Y=640 -+CONFIG_INPUT_JOYDEV=m -+CONFIG_INPUT_EVDEV=y -+# CONFIG_INPUT_EVBUG is not set -+ -+# -+# Input Device Drivers -+# -+CONFIG_INPUT_KEYBOARD=y -+# CONFIG_KEYBOARD_ADP5588 is not set -+# CONFIG_KEYBOARD_ATKBD is not set -+# CONFIG_QT2160 is not set -+# CONFIG_KEYBOARD_LKKBD is not set -+CONFIG_KEYBOARD_GPIO=y -+# CONFIG_KEYBOARD_MATRIX is not set -+# CONFIG_KEYBOARD_LM8323 is not set -+# CONFIG_KEYBOARD_MAX7359 is not set -+# CONFIG_KEYBOARD_NEWTON is not set -+# CONFIG_KEYBOARD_OPENCORES is not set -+CONFIG_KEYBOARD_STOWAWAY=m -+# CONFIG_KEYBOARD_SUNKBD is not set -+# CONFIG_KEYBOARD_XTKBD is not set -+# CONFIG_INPUT_MOUSE is not set -+# CONFIG_INPUT_JOYSTICK is not set -+# CONFIG_INPUT_TABLET is not set -+CONFIG_INPUT_TOUCHSCREEN=y -+CONFIG_TOUCHSCREEN_FILTER=y -+CONFIG_TOUCHSCREEN_FILTER_GROUP=y -+CONFIG_TOUCHSCREEN_FILTER_MEDIAN=y -+CONFIG_TOUCHSCREEN_FILTER_MEAN=y -+CONFIG_TOUCHSCREEN_FILTER_LINEAR=y -+CONFIG_TOUCHSCREEN_S3C2410=y -+# CONFIG_TOUCHSCREEN_S3C2410_DEBUG is not set -+# CONFIG_TOUCHSCREEN_ADS7846 is not set -+# CONFIG_TOUCHSCREEN_AD7877 is not set -+# CONFIG_TOUCHSCREEN_AD7879_I2C is not set -+# CONFIG_TOUCHSCREEN_AD7879_SPI is not set -+# CONFIG_TOUCHSCREEN_AD7879 is not set -+# CONFIG_TOUCHSCREEN_EETI is not set -+# CONFIG_TOUCHSCREEN_FUJITSU is not set -+# CONFIG_TOUCHSCREEN_GUNZE is not set -+# CONFIG_TOUCHSCREEN_ELO is not set -+# CONFIG_TOUCHSCREEN_WACOM_W8001 is not set -+# CONFIG_TOUCHSCREEN_MCS5000 is not set -+# CONFIG_TOUCHSCREEN_MTOUCH is not set -+# CONFIG_TOUCHSCREEN_INEXIO is not set -+# CONFIG_TOUCHSCREEN_MK712 is not set -+# CONFIG_TOUCHSCREEN_PENMOUNT is not set -+# CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set -+# CONFIG_TOUCHSCREEN_TOUCHWIN is not set -+# CONFIG_TOUCHSCREEN_USB_COMPOSITE is not set -+# CONFIG_TOUCHSCREEN_TOUCHIT213 is not set -+# CONFIG_TOUCHSCREEN_TSC2007 is not set -+# CONFIG_TOUCHSCREEN_W90X900 is not set -+CONFIG_INPUT_MISC=y -+# CONFIG_INPUT_ATI_REMOTE is not set -+# CONFIG_INPUT_ATI_REMOTE2 is not set -+# CONFIG_INPUT_KEYSPAN_REMOTE is not set -+# CONFIG_INPUT_POWERMATE is not set -+# CONFIG_INPUT_YEALINK is not set -+# CONFIG_INPUT_CM109 is not set -+CONFIG_INPUT_UINPUT=m -+CONFIG_INPUT_PCF50633_PMU=y -+# CONFIG_INPUT_GPIO_ROTARY_ENCODER is not set -+CONFIG_INPUT_LIS302DL=y -+ -+# -+# Hardware I/O ports -+# -+CONFIG_SERIO=y -+# CONFIG_SERIO_SERPORT is not set -+# CONFIG_SERIO_RAW is not set -+# CONFIG_GAMEPORT is not set -+ -+# -+# Character devices -+# -+CONFIG_VT=y -+CONFIG_CONSOLE_TRANSLATIONS=y -+CONFIG_VT_CONSOLE=y -+CONFIG_HW_CONSOLE=y -+CONFIG_VT_HW_CONSOLE_BINDING=y -+# CONFIG_DEVKMEM is not set -+# CONFIG_SERIAL_NONSTANDARD is not set -+ -+# -+# Serial drivers -+# -+# CONFIG_SERIAL_8250 is not set -+ -+# -+# Non-8250 serial port support -+# -+CONFIG_SERIAL_SAMSUNG=y -+CONFIG_SERIAL_SAMSUNG_UARTS=3 -+CONFIG_SERIAL_SAMSUNG_CONSOLE=y -+CONFIG_SERIAL_S3C2440=y -+# CONFIG_SERIAL_MAX3100 is not set -+CONFIG_SERIAL_CORE=y -+CONFIG_SERIAL_CORE_CONSOLE=y -+CONFIG_UNIX98_PTYS=y -+# CONFIG_DEVPTS_MULTIPLE_INSTANCES is not set -+# CONFIG_LEGACY_PTYS is not set -+# CONFIG_IPMI_HANDLER is not set -+# CONFIG_HW_RANDOM is not set -+# CONFIG_R3964 is not set -+# CONFIG_RAW_DRIVER is not set -+# CONFIG_TCG_TPM is not set -+CONFIG_I2C=y -+CONFIG_I2C_BOARDINFO=y -+CONFIG_I2C_COMPAT=y -+CONFIG_I2C_CHARDEV=y -+# CONFIG_I2C_HELPER_AUTO is not set -+ -+# -+# I2C Algorithms -+# -+CONFIG_I2C_ALGOBIT=y -+# CONFIG_I2C_ALGOPCF is not set -+# CONFIG_I2C_ALGOPCA is not set -+ -+# -+# I2C Hardware Bus support -+# -+ -+# -+# I2C system bus drivers (mostly embedded / system-on-chip) -+# -+# CONFIG_I2C_DESIGNWARE is not set -+# CONFIG_I2C_GPIO is not set -+# CONFIG_I2C_OCORES is not set -+CONFIG_I2C_S3C2410=y -+# CONFIG_I2C_SIMTEC is not set -+ -+# -+# External I2C/SMBus adapter drivers -+# -+# CONFIG_I2C_PARPORT_LIGHT is not set -+# CONFIG_I2C_TAOS_EVM is not set -+# CONFIG_I2C_TINY_USB is not set -+ -+# -+# Other I2C/SMBus bus drivers -+# -+# CONFIG_I2C_PCA_PLATFORM is not set -+# CONFIG_I2C_STUB is not set -+ -+# -+# Miscellaneous I2C Chip support -+# -+# CONFIG_DS1682 is not set -+# CONFIG_SENSORS_TSL2550 is not set -+# CONFIG_I2C_DEBUG_CORE is not set -+# CONFIG_I2C_DEBUG_ALGO is not set -+# CONFIG_I2C_DEBUG_BUS is not set -+# CONFIG_I2C_DEBUG_CHIP is not set -+CONFIG_SPI=y -+CONFIG_SPI_MASTER=y -+ -+# -+# SPI Master Controller Drivers -+# -+CONFIG_SPI_BITBANG=y -+CONFIG_SPI_GPIO=y -+CONFIG_SPI_S3C24XX=y -+CONFIG_SPI_S3C24XX_GPIO=y -+ -+# -+# SPI Protocol Masters -+# -+# CONFIG_SPI_SPIDEV is not set -+# CONFIG_SPI_TLE62X0 is not set -+ -+# -+# PPS support -+# -+# CONFIG_PPS is not set -+CONFIG_ARCH_REQUIRE_GPIOLIB=y -+CONFIG_GPIOLIB=y -+CONFIG_GPIO_SYSFS=y -+ -+# -+# Memory mapped GPIO expanders: -+# -+ -+# -+# I2C GPIO expanders: -+# -+# CONFIG_GPIO_MAX732X is not set -+# CONFIG_GPIO_PCA953X is not set -+# CONFIG_GPIO_PCF857X is not set -+CONFIG_GPIO_PCF50633=y -+ -+# -+# PCI GPIO expanders: -+# -+ -+# -+# SPI GPIO expanders: -+# -+# CONFIG_GPIO_MAX7301 is not set -+# CONFIG_GPIO_MCP23S08 is not set -+# CONFIG_GPIO_MC33880 is not set -+ -+# -+# AC97 GPIO expanders: -+# -+# CONFIG_W1 is not set -+CONFIG_POWER_SUPPLY=y -+# CONFIG_POWER_SUPPLY_DEBUG is not set -+# CONFIG_PDA_POWER is not set -+# CONFIG_BATTERY_DS2760 is not set -+# CONFIG_BATTERY_DS2782 is not set -+# CONFIG_BATTERY_BQ27x00 is not set -+# CONFIG_BATTERY_MAX17040 is not set -+CONFIG_CHARGER_PCF50633=y -+CONFIG_BATTERY_BQ27000_HDQ=y -+CONFIG_HDQ_GPIO_BITBANG=y -+# CONFIG_BATTERY_PLATFORM is not set -+# CONFIG_HWMON is not set -+# CONFIG_THERMAL is not set -+CONFIG_WATCHDOG=y -+CONFIG_WATCHDOG_NOWAYOUT=y -+ -+# -+# Watchdog Device Drivers -+# -+CONFIG_SOFT_WATCHDOG=y -+CONFIG_S3C2410_WATCHDOG=y -+ -+# -+# USB-based Watchdog Cards -+# -+# CONFIG_USBPCWATCHDOG is not set -+CONFIG_SSB_POSSIBLE=y -+ -+# -+# Sonics Silicon Backplane -+# -+# CONFIG_SSB is not set -+ -+# -+# Multifunction device drivers -+# -+CONFIG_MFD_CORE=y -+# CONFIG_MFD_SM501 is not set -+# CONFIG_MFD_ASIC3 is not set -+# CONFIG_HTC_EGPIO is not set -+# CONFIG_HTC_PASIC3 is not set -+# CONFIG_TPS65010 is not set -+# CONFIG_TWL4030_CORE is not set -+# CONFIG_MFD_TMIO is not set -+# CONFIG_MFD_T7L66XB is not set -+# CONFIG_MFD_TC6387XB is not set -+# CONFIG_MFD_TC6393XB is not set -+# CONFIG_PMIC_DA903X is not set -+# CONFIG_MFD_WM8400 is not set -+# CONFIG_MFD_WM831X is not set -+# CONFIG_MFD_WM8350_I2C is not set -+CONFIG_MFD_PCF50633=y -+# CONFIG_MFD_MC13783 is not set -+CONFIG_PCF50633_ADC=y -+# CONFIG_AB3100_CORE is not set -+# CONFIG_EZX_PCAP is not set -+CONFIG_MFD_GLAMO=y -+# CONFIG_MFD_GLAMO_FB is not set -+CONFIG_MFD_GLAMO_GPIO=y -+CONFIG_MFD_GLAMO_MCI=y -+CONFIG_MFD_GLAMO_DRM=y -+CONFIG_REGULATOR=y -+# CONFIG_REGULATOR_DEBUG is not set -+CONFIG_REGULATOR_FIXED_VOLTAGE=y -+# CONFIG_REGULATOR_VIRTUAL_CONSUMER is not set -+# CONFIG_REGULATOR_USERSPACE_CONSUMER is not set -+# CONFIG_REGULATOR_BQ24022 is not set -+# CONFIG_REGULATOR_MAX1586 is not set -+CONFIG_REGULATOR_PCF50633=y -+# CONFIG_REGULATOR_LP3971 is not set -+# CONFIG_REGULATOR_TPS65023 is not set -+# CONFIG_REGULATOR_TPS6507X is not set -+# CONFIG_MEDIA_SUPPORT is not set -+ -+# -+# Graphics support -+# -+CONFIG_DRM=y -+CONFIG_DRM_KMS_HELPER=y -+# CONFIG_DRM_MGA is not set -+# CONFIG_DRM_VIA is not set -+# CONFIG_DRM_SAVAGE is not set -+# CONFIG_VGASTATE is not set -+CONFIG_VIDEO_OUTPUT_CONTROL=y -+CONFIG_FB=y -+# CONFIG_FIRMWARE_EDID is not set -+# CONFIG_FB_DDC is not set -+# CONFIG_FB_BOOT_VESA_SUPPORT is not set -+CONFIG_FB_CFB_FILLRECT=y -+CONFIG_FB_CFB_COPYAREA=y -+CONFIG_FB_CFB_IMAGEBLIT=y -+# CONFIG_FB_CFB_REV_PIXELS_IN_BYTE is not set -+# CONFIG_FB_SYS_FILLRECT is not set -+# CONFIG_FB_SYS_COPYAREA is not set -+# CONFIG_FB_SYS_IMAGEBLIT is not set -+# CONFIG_FB_FOREIGN_ENDIAN is not set -+# CONFIG_FB_SYS_FOPS is not set -+# CONFIG_FB_SVGALIB is not set -+# CONFIG_FB_MACMODES is not set -+# CONFIG_FB_BACKLIGHT is not set -+# CONFIG_FB_MODE_HELPERS is not set -+# CONFIG_FB_TILEBLITTING is not set -+ -+# -+# Frame buffer hardware drivers -+# -+# CONFIG_FB_UVESA is not set -+# CONFIG_FB_S1D13XXX is not set -+# CONFIG_FB_TMIO is not set -+# CONFIG_FB_S3C2410 is not set -+# CONFIG_FB_VIRTUAL is not set -+# CONFIG_FB_METRONOME is not set -+# CONFIG_FB_MB862XX is not set -+# CONFIG_FB_BROADSHEET is not set -+CONFIG_BACKLIGHT_LCD_SUPPORT=y -+CONFIG_LCD_CLASS_DEVICE=y -+# CONFIG_LCD_LMS283GF05 is not set -+# CONFIG_LCD_LTV350QV is not set -+# CONFIG_LCD_ILI9320 is not set -+# CONFIG_LCD_TDO24M is not set -+# CONFIG_LCD_VGG2432A4 is not set -+# CONFIG_LCD_PLATFORM is not set -+CONFIG_LCD_JBT6K74=y -+CONFIG_BACKLIGHT_CLASS_DEVICE=y -+# CONFIG_BACKLIGHT_GENERIC is not set -+CONFIG_BACKLIGHT_PWM=y -+CONFIG_BACKLIGHT_PCF50633=y -+ -+# -+# Display device support -+# -+# CONFIG_DISPLAY_SUPPORT is not set -+ -+# -+# Console display driver support -+# -+# CONFIG_VGA_CONSOLE is not set -+CONFIG_DUMMY_CONSOLE=y -+CONFIG_FRAMEBUFFER_CONSOLE=y -+# CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY is not set -+# CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set -+# CONFIG_FONTS is not set -+CONFIG_FONT_8x8=y -+CONFIG_FONT_8x16=y -+# CONFIG_LOGO is not set -+CONFIG_SOUND=y -+CONFIG_SOUND_OSS_CORE=y -+CONFIG_SOUND_OSS_CORE_PRECLAIM=y -+CONFIG_SND=y -+CONFIG_SND_TIMER=y -+CONFIG_SND_PCM=y -+CONFIG_SND_JACK=y -+CONFIG_SND_SEQUENCER=y -+CONFIG_SND_SEQ_DUMMY=y -+CONFIG_SND_OSSEMUL=y -+CONFIG_SND_MIXER_OSS=y -+CONFIG_SND_PCM_OSS=y -+CONFIG_SND_PCM_OSS_PLUGINS=y -+CONFIG_SND_SEQUENCER_OSS=y -+# CONFIG_SND_DYNAMIC_MINORS is not set -+# CONFIG_SND_SUPPORT_OLD_API is not set -+# CONFIG_SND_VERBOSE_PROCFS is not set -+# CONFIG_SND_VERBOSE_PRINTK is not set -+# CONFIG_SND_DEBUG is not set -+# CONFIG_SND_RAWMIDI_SEQ is not set -+# CONFIG_SND_OPL3_LIB_SEQ is not set -+# CONFIG_SND_OPL4_LIB_SEQ is not set -+# CONFIG_SND_SBAWE_SEQ is not set -+# CONFIG_SND_EMU10K1_SEQ is not set -+# CONFIG_SND_DRIVERS is not set -+# CONFIG_SND_ARM is not set -+# CONFIG_SND_SPI is not set -+# CONFIG_SND_USB is not set -+CONFIG_SND_SOC=y -+CONFIG_SND_S3C24XX_SOC=y -+CONFIG_SND_S3C24XX_SOC_I2S=y -+CONFIG_SND_S3C24XX_SOC_NEO1973_WM8753=y -+# CONFIG_SND_S3C24XX_SOC_LN2440SBC_ALC650 is not set -+# CONFIG_SND_S3C24XX_SOC_S3C24XX_UDA134X is not set -+# CONFIG_SND_S3C24XX_SOC_SIMTEC_TLV320AIC23 is not set -+# CONFIG_SND_S3C24XX_SOC_SIMTEC_HERMES is not set -+CONFIG_SND_SOC_I2C_AND_SPI=y -+# CONFIG_SND_SOC_ALL_CODECS is not set -+CONFIG_SND_SOC_WM8753=y -+# CONFIG_SOUND_PRIME is not set -+CONFIG_HID_SUPPORT=y -+CONFIG_HID=y -+# CONFIG_HIDRAW is not set -+ -+# -+# USB Input Devices -+# -+CONFIG_USB_HID=y -+# CONFIG_HID_PID is not set -+# CONFIG_USB_HIDDEV is not set -+ -+# -+# Special HID drivers -+# -+CONFIG_HID_A4TECH=y -+CONFIG_HID_APPLE=y -+CONFIG_HID_BELKIN=y -+CONFIG_HID_CHERRY=y -+CONFIG_HID_CHICONY=y -+CONFIG_HID_CYPRESS=y -+CONFIG_HID_DRAGONRISE=y -+# CONFIG_DRAGONRISE_FF is not set -+CONFIG_HID_EZKEY=y -+CONFIG_HID_KYE=y -+CONFIG_HID_GYRATION=y -+CONFIG_HID_TWINHAN=y -+CONFIG_HID_KENSINGTON=y -+CONFIG_HID_LOGITECH=y -+# CONFIG_LOGITECH_FF is not set -+# CONFIG_LOGIRUMBLEPAD2_FF is not set -+CONFIG_HID_MICROSOFT=y -+CONFIG_HID_MONTEREY=y -+CONFIG_HID_NTRIG=y -+CONFIG_HID_PANTHERLORD=y -+# CONFIG_PANTHERLORD_FF is not set -+CONFIG_HID_PETALYNX=y -+CONFIG_HID_SAMSUNG=y -+CONFIG_HID_SONY=y -+CONFIG_HID_SUNPLUS=y -+CONFIG_HID_GREENASIA=y -+# CONFIG_GREENASIA_FF is not set -+CONFIG_HID_SMARTJOYPLUS=y -+# CONFIG_SMARTJOYPLUS_FF is not set -+CONFIG_HID_TOPSEED=y -+CONFIG_HID_THRUSTMASTER=y -+# CONFIG_THRUSTMASTER_FF is not set -+CONFIG_HID_WACOM=y -+CONFIG_HID_ZEROPLUS=y -+# CONFIG_ZEROPLUS_FF is not set -+CONFIG_USB_SUPPORT=y -+CONFIG_USB_ARCH_HAS_HCD=y -+CONFIG_USB_ARCH_HAS_OHCI=y -+# CONFIG_USB_ARCH_HAS_EHCI is not set -+CONFIG_USB=y -+# CONFIG_USB_DEBUG is not set -+CONFIG_USB_ANNOUNCE_NEW_DEVICES=y -+ -+# -+# Miscellaneous USB options -+# -+# CONFIG_USB_DEVICEFS is not set -+# CONFIG_USB_DEVICE_CLASS is not set -+# CONFIG_USB_DYNAMIC_MINORS is not set -+CONFIG_USB_SUSPEND=y -+# CONFIG_USB_OTG is not set -+# CONFIG_USB_MON is not set -+# CONFIG_USB_WUSB is not set -+# CONFIG_USB_WUSB_CBAF is not set -+ -+# -+# USB Host Controller Drivers -+# -+# CONFIG_USB_C67X00_HCD is not set -+# CONFIG_USB_OXU210HP_HCD is not set -+# CONFIG_USB_ISP116X_HCD is not set -+# CONFIG_USB_ISP1760_HCD is not set -+# CONFIG_USB_ISP1362_HCD is not set -+CONFIG_USB_OHCI_HCD=y -+# CONFIG_USB_OHCI_BIG_ENDIAN_DESC is not set -+# CONFIG_USB_OHCI_BIG_ENDIAN_MMIO is not set -+CONFIG_USB_OHCI_LITTLE_ENDIAN=y -+# CONFIG_USB_SL811_HCD is not set -+# CONFIG_USB_R8A66597_HCD is not set -+# CONFIG_USB_HWA_HCD is not set -+# CONFIG_USB_MUSB_HDRC is not set -+# CONFIG_USB_GADGET_MUSB_HDRC is not set -+ -+# -+# USB Device Class drivers -+# -+CONFIG_USB_ACM=m -+CONFIG_USB_PRINTER=m -+# CONFIG_USB_WDM is not set -+CONFIG_USB_TMC=m -+ -+# -+# NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may -+# -+ -+# -+# also be needed; see USB_STORAGE Help for more info -+# -+CONFIG_USB_STORAGE=m -+# CONFIG_USB_STORAGE_DEBUG is not set -+CONFIG_USB_STORAGE_DATAFAB=m -+CONFIG_USB_STORAGE_FREECOM=m -+# CONFIG_USB_STORAGE_ISD200 is not set -+CONFIG_USB_STORAGE_USBAT=m -+CONFIG_USB_STORAGE_SDDR09=m -+CONFIG_USB_STORAGE_SDDR55=m -+CONFIG_USB_STORAGE_JUMPSHOT=m -+CONFIG_USB_STORAGE_ALAUDA=m -+# CONFIG_USB_STORAGE_ONETOUCH is not set -+CONFIG_USB_STORAGE_KARMA=m -+# CONFIG_USB_STORAGE_CYPRESS_ATACB is not set -+# CONFIG_USB_LIBUSUAL is not set -+ -+# -+# USB Imaging devices -+# -+# CONFIG_USB_MDC800 is not set -+# CONFIG_USB_MICROTEK is not set -+ -+# -+# USB port drivers -+# -+CONFIG_USB_SERIAL=m -+CONFIG_USB_EZUSB=y -+CONFIG_USB_SERIAL_GENERIC=y -+CONFIG_USB_SERIAL_AIRCABLE=m -+CONFIG_USB_SERIAL_ARK3116=m -+CONFIG_USB_SERIAL_BELKIN=m -+# CONFIG_USB_SERIAL_CH341 is not set -+CONFIG_USB_SERIAL_WHITEHEAT=m -+CONFIG_USB_SERIAL_DIGI_ACCELEPORT=m -+# CONFIG_USB_SERIAL_CP210X is not set -+CONFIG_USB_SERIAL_CYPRESS_M8=m -+CONFIG_USB_SERIAL_EMPEG=m -+CONFIG_USB_SERIAL_FTDI_SIO=m -+CONFIG_USB_SERIAL_FUNSOFT=m -+CONFIG_USB_SERIAL_VISOR=m -+CONFIG_USB_SERIAL_IPAQ=m -+CONFIG_USB_SERIAL_IR=m -+CONFIG_USB_SERIAL_EDGEPORT=m -+CONFIG_USB_SERIAL_EDGEPORT_TI=m -+CONFIG_USB_SERIAL_GARMIN=m -+CONFIG_USB_SERIAL_IPW=m -+# CONFIG_USB_SERIAL_IUU is not set -+CONFIG_USB_SERIAL_KEYSPAN_PDA=m -+CONFIG_USB_SERIAL_KEYSPAN=m -+CONFIG_USB_SERIAL_KLSI=m -+CONFIG_USB_SERIAL_KOBIL_SCT=m -+CONFIG_USB_SERIAL_MCT_U232=m -+CONFIG_USB_SERIAL_MOS7720=m -+CONFIG_USB_SERIAL_MOS7840=m -+# CONFIG_USB_SERIAL_MOTOROLA is not set -+CONFIG_USB_SERIAL_NAVMAN=m -+CONFIG_USB_SERIAL_PL2303=m -+# CONFIG_USB_SERIAL_OTI6858 is not set -+# CONFIG_USB_SERIAL_QUALCOMM is not set -+# CONFIG_USB_SERIAL_SPCP8X5 is not set -+CONFIG_USB_SERIAL_HP4X=m -+CONFIG_USB_SERIAL_SAFE=m -+CONFIG_USB_SERIAL_SAFE_PADDED=y -+# CONFIG_USB_SERIAL_SIEMENS_MPI is not set -+CONFIG_USB_SERIAL_SIERRAWIRELESS=m -+# CONFIG_USB_SERIAL_SYMBOL is not set -+CONFIG_USB_SERIAL_TI=m -+CONFIG_USB_SERIAL_CYBERJACK=m -+CONFIG_USB_SERIAL_XIRCOM=m -+CONFIG_USB_SERIAL_OPTION=m -+CONFIG_USB_SERIAL_OMNINET=m -+# CONFIG_USB_SERIAL_OPTICON is not set -+# CONFIG_USB_SERIAL_DEBUG is not set -+ -+# -+# USB Miscellaneous drivers -+# -+# CONFIG_USB_EMI62 is not set -+# CONFIG_USB_EMI26 is not set -+# CONFIG_USB_ADUTUX is not set -+# CONFIG_USB_SEVSEG is not set -+# CONFIG_USB_RIO500 is not set -+# CONFIG_USB_LEGOTOWER is not set -+# CONFIG_USB_LCD is not set -+CONFIG_USB_BERRY_CHARGE=m -+# CONFIG_USB_LED is not set -+# CONFIG_USB_CYPRESS_CY7C63 is not set -+# CONFIG_USB_CYTHERM is not set -+# CONFIG_USB_IDMOUSE is not set -+# CONFIG_USB_FTDI_ELAN is not set -+# CONFIG_USB_APPLEDISPLAY is not set -+# CONFIG_USB_LD is not set -+CONFIG_USB_TRANCEVIBRATOR=m -+CONFIG_USB_IOWARRIOR=m -+# CONFIG_USB_TEST is not set -+# CONFIG_USB_ISIGHTFW is not set -+# CONFIG_USB_VST is not set -+CONFIG_USB_GADGET=y -+# CONFIG_USB_GADGET_DEBUG_FILES is not set -+# CONFIG_USB_GADGET_DEBUG_FS is not set -+CONFIG_USB_GADGET_VBUS_DRAW=500 -+CONFIG_USB_GADGET_SELECTED=y -+# CONFIG_USB_GADGET_AT91 is not set -+# CONFIG_USB_GADGET_ATMEL_USBA is not set -+# CONFIG_USB_GADGET_FSL_USB2 is not set -+# CONFIG_USB_GADGET_LH7A40X is not set -+# CONFIG_USB_GADGET_OMAP is not set -+# CONFIG_USB_GADGET_PXA25X is not set -+# CONFIG_USB_GADGET_R8A66597 is not set -+# CONFIG_USB_GADGET_PXA27X is not set -+# CONFIG_USB_GADGET_S3C_HSOTG is not set -+# CONFIG_USB_GADGET_IMX is not set -+CONFIG_USB_GADGET_S3C2410=y -+CONFIG_USB_S3C2410=y -+# CONFIG_USB_S3C2410_DEBUG is not set -+# CONFIG_USB_GADGET_M66592 is not set -+# CONFIG_USB_GADGET_AMD5536UDC is not set -+# CONFIG_USB_GADGET_FSL_QE is not set -+# CONFIG_USB_GADGET_CI13XXX is not set -+# CONFIG_USB_GADGET_NET2280 is not set -+# CONFIG_USB_GADGET_GOKU is not set -+# CONFIG_USB_GADGET_LANGWELL is not set -+# CONFIG_USB_GADGET_DUMMY_HCD is not set -+# CONFIG_USB_GADGET_DUALSPEED is not set -+# CONFIG_USB_ZERO is not set -+# CONFIG_USB_AUDIO is not set -+CONFIG_USB_ETH=y -+CONFIG_USB_ETH_RNDIS=y -+# CONFIG_USB_ETH_EEM is not set -+# CONFIG_USB_GADGETFS is not set -+# CONFIG_USB_FILE_STORAGE is not set -+# CONFIG_USB_G_SERIAL is not set -+# CONFIG_USB_MIDI_GADGET is not set -+# CONFIG_USB_G_PRINTER is not set -+# CONFIG_USB_CDC_COMPOSITE is not set -+ -+# -+# OTG and related infrastructure -+# -+# CONFIG_USB_GPIO_VBUS is not set -+# CONFIG_NOP_USB_XCEIV is not set -+CONFIG_MMC=y -+# CONFIG_MMC_DEBUG is not set -+CONFIG_MMC_UNSAFE_RESUME=y -+ -+# -+# MMC/SD/SDIO Card Drivers -+# -+CONFIG_MMC_BLOCK=y -+CONFIG_MMC_BLOCK_BOUNCE=y -+# CONFIG_SDIO_UART is not set -+# CONFIG_MMC_TEST is not set -+ -+# -+# MMC/SD/SDIO Host Controller Drivers -+# -+# CONFIG_MMC_SDHCI is not set -+# CONFIG_MMC_AT91 is not set -+# CONFIG_MMC_ATMELMCI is not set -+# CONFIG_MMC_SPI is not set -+CONFIG_MMC_S3C=y -+# CONFIG_MMC_S3C_HW_SDIO_IRQ is not set -+CONFIG_MMC_S3C_PIO=y -+# CONFIG_MMC_S3C_DMA is not set -+# CONFIG_MMC_S3C_PIODMA is not set -+# CONFIG_MEMSTICK is not set -+CONFIG_NEW_LEDS=y -+CONFIG_LEDS_CLASS=y -+ -+# -+# LED drivers -+# -+# CONFIG_LEDS_S3C24XX is not set -+# CONFIG_LEDS_PCA9532 is not set -+CONFIG_LEDS_GPIO=y -+CONFIG_LEDS_GPIO_PLATFORM=y -+# CONFIG_LEDS_LP3944 is not set -+# CONFIG_LEDS_PCA955X is not set -+# CONFIG_LEDS_DAC124S085 is not set -+# CONFIG_LEDS_PWM is not set -+# CONFIG_LEDS_BD2802 is not set -+ -+# -+# LED Triggers -+# -+CONFIG_LEDS_TRIGGERS=y -+CONFIG_LEDS_TRIGGER_TIMER=y -+CONFIG_LEDS_TRIGGER_HEARTBEAT=y -+# CONFIG_LEDS_TRIGGER_BACKLIGHT is not set -+# CONFIG_LEDS_TRIGGER_GPIO is not set -+# CONFIG_LEDS_TRIGGER_DEFAULT_ON is not set -+ -+# -+# iptables trigger is under Netfilter config (LED target) -+# -+# CONFIG_ACCESSIBILITY is not set -+CONFIG_RTC_LIB=y -+CONFIG_RTC_CLASS=y -+CONFIG_RTC_HCTOSYS=y -+CONFIG_RTC_HCTOSYS_DEVICE="rtc0" -+# CONFIG_RTC_DEBUG is not set -+ -+# -+# RTC interfaces -+# -+CONFIG_RTC_INTF_SYSFS=y -+CONFIG_RTC_INTF_PROC=y -+CONFIG_RTC_INTF_DEV=y -+# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set -+# CONFIG_RTC_DRV_TEST is not set -+ -+# -+# I2C RTC drivers -+# -+# CONFIG_RTC_DRV_DS1307 is not set -+# CONFIG_RTC_DRV_DS1374 is not set -+# CONFIG_RTC_DRV_DS1672 is not set -+# CONFIG_RTC_DRV_MAX6900 is not set -+# CONFIG_RTC_DRV_RS5C372 is not set -+# CONFIG_RTC_DRV_ISL1208 is not set -+# CONFIG_RTC_DRV_X1205 is not set -+# CONFIG_RTC_DRV_PCF8563 is not set -+# CONFIG_RTC_DRV_PCF8583 is not set -+# CONFIG_RTC_DRV_M41T80 is not set -+# CONFIG_RTC_DRV_S35390A is not set -+# CONFIG_RTC_DRV_FM3130 is not set -+# CONFIG_RTC_DRV_RX8581 is not set -+# CONFIG_RTC_DRV_RX8025 is not set -+ -+# -+# SPI RTC drivers -+# -+# CONFIG_RTC_DRV_M41T94 is not set -+# CONFIG_RTC_DRV_DS1305 is not set -+# CONFIG_RTC_DRV_DS1390 is not set -+# CONFIG_RTC_DRV_MAX6902 is not set -+# CONFIG_RTC_DRV_R9701 is not set -+# CONFIG_RTC_DRV_RS5C348 is not set -+# CONFIG_RTC_DRV_DS3234 is not set -+# CONFIG_RTC_DRV_PCF2123 is not set -+ -+# -+# Platform RTC drivers -+# -+# CONFIG_RTC_DRV_CMOS is not set -+# CONFIG_RTC_DRV_DS1286 is not set -+# CONFIG_RTC_DRV_DS1511 is not set -+# CONFIG_RTC_DRV_DS1553 is not set -+# CONFIG_RTC_DRV_DS1742 is not set -+# CONFIG_RTC_DRV_STK17TA8 is not set -+# CONFIG_RTC_DRV_M48T86 is not set -+# CONFIG_RTC_DRV_M48T35 is not set -+# CONFIG_RTC_DRV_M48T59 is not set -+# CONFIG_RTC_DRV_BQ4802 is not set -+# CONFIG_RTC_DRV_V3020 is not set -+CONFIG_RTC_DRV_PCF50633=y -+ -+# -+# on-CPU RTC drivers -+# -+CONFIG_RTC_DRV_S3C=y -+# CONFIG_DMADEVICES is not set -+# CONFIG_AUXDISPLAY is not set -+# CONFIG_UIO is not set -+ -+# -+# TI VLYNQ -+# -+# CONFIG_STAGING is not set -+CONFIG_AR6000_WLAN=y -+# CONFIG_AR6000_WLAN_DEBUG is not set -+# CONFIG_AR6000_WLAN_RESET is not set -+ -+# -+# File systems -+# -+CONFIG_EXT2_FS=y -+# CONFIG_EXT2_FS_XATTR is not set -+# CONFIG_EXT2_FS_XIP is not set -+CONFIG_EXT3_FS=y -+# CONFIG_EXT3_DEFAULTS_TO_ORDERED is not set -+# CONFIG_EXT3_FS_XATTR is not set -+# CONFIG_EXT4_FS is not set -+CONFIG_JBD=y -+# CONFIG_JBD_DEBUG is not set -+CONFIG_REISERFS_FS=m -+# CONFIG_REISERFS_CHECK is not set -+# CONFIG_REISERFS_PROC_INFO is not set -+# CONFIG_REISERFS_FS_XATTR is not set -+# CONFIG_JFS_FS is not set -+CONFIG_FS_POSIX_ACL=y -+# CONFIG_XFS_FS is not set -+# CONFIG_OCFS2_FS is not set -+# CONFIG_BTRFS_FS is not set -+# CONFIG_NILFS2_FS is not set -+CONFIG_FILE_LOCKING=y -+CONFIG_FSNOTIFY=y -+# CONFIG_DNOTIFY is not set -+CONFIG_INOTIFY=y -+CONFIG_INOTIFY_USER=y -+# CONFIG_QUOTA is not set -+# CONFIG_AUTOFS_FS is not set -+CONFIG_AUTOFS4_FS=m -+CONFIG_FUSE_FS=m -+CONFIG_CUSE=m -+CONFIG_GENERIC_ACL=y -+ -+# -+# Caches -+# -+# CONFIG_FSCACHE is not set -+ -+# -+# CD-ROM/DVD Filesystems -+# -+CONFIG_ISO9660_FS=m -+CONFIG_JOLIET=y -+# CONFIG_ZISOFS is not set -+CONFIG_UDF_FS=m -+CONFIG_UDF_NLS=y -+ -+# -+# DOS/FAT/NT Filesystems -+# -+CONFIG_FAT_FS=m -+# CONFIG_MSDOS_FS is not set -+CONFIG_VFAT_FS=m -+CONFIG_FAT_DEFAULT_CODEPAGE=437 -+CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" -+# CONFIG_NTFS_FS is not set -+ -+# -+# Pseudo filesystems -+# -+CONFIG_PROC_FS=y -+CONFIG_PROC_SYSCTL=y -+CONFIG_PROC_PAGE_MONITOR=y -+CONFIG_SYSFS=y -+CONFIG_TMPFS=y -+CONFIG_TMPFS_POSIX_ACL=y -+# CONFIG_HUGETLB_PAGE is not set -+CONFIG_CONFIGFS_FS=m -+CONFIG_MISC_FILESYSTEMS=y -+# CONFIG_ADFS_FS is not set -+# CONFIG_AFFS_FS is not set -+# CONFIG_HFS_FS is not set -+# CONFIG_HFSPLUS_FS is not set -+# CONFIG_BEFS_FS is not set -+# CONFIG_BFS_FS is not set -+# CONFIG_EFS_FS is not set -+CONFIG_JFFS2_FS=y -+CONFIG_JFFS2_FS_DEBUG=0 -+CONFIG_JFFS2_FS_WRITEBUFFER=y -+# CONFIG_JFFS2_FS_WBUF_VERIFY is not set -+CONFIG_JFFS2_SUMMARY=y -+# CONFIG_JFFS2_FS_XATTR is not set -+# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set -+CONFIG_JFFS2_ZLIB=y -+# CONFIG_JFFS2_LZO is not set -+CONFIG_JFFS2_RTIME=y -+# CONFIG_JFFS2_RUBIN is not set -+CONFIG_UBIFS_FS=y -+CONFIG_UBIFS_FS_XATTR=y -+CONFIG_UBIFS_FS_ADVANCED_COMPR=y -+CONFIG_UBIFS_FS_LZO=y -+CONFIG_UBIFS_FS_ZLIB=y -+CONFIG_UBIFS_FS_DEBUG=y -+CONFIG_UBIFS_FS_DEBUG_MSG_LVL=0 -+CONFIG_UBIFS_FS_DEBUG_CHKS=y -+# CONFIG_CRAMFS is not set -+CONFIG_SQUASHFS=m -+# CONFIG_SQUASHFS_EMBEDDED is not set -+CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=3 -+# CONFIG_VXFS_FS is not set -+# CONFIG_MINIX_FS is not set -+# CONFIG_OMFS_FS is not set -+# CONFIG_HPFS_FS is not set -+# CONFIG_QNX4FS_FS is not set -+# CONFIG_ROMFS_FS is not set -+# CONFIG_SYSV_FS is not set -+# CONFIG_UFS_FS is not set -+CONFIG_NETWORK_FILESYSTEMS=y -+CONFIG_NFS_FS=m -+CONFIG_NFS_V3=y -+CONFIG_NFS_V3_ACL=y -+CONFIG_NFS_V4=y -+# CONFIG_NFS_V4_1 is not set -+CONFIG_NFSD=m -+CONFIG_NFSD_V2_ACL=y -+CONFIG_NFSD_V3=y -+CONFIG_NFSD_V3_ACL=y -+CONFIG_NFSD_V4=y -+CONFIG_LOCKD=m -+CONFIG_LOCKD_V4=y -+CONFIG_EXPORTFS=m -+CONFIG_NFS_ACL_SUPPORT=m -+CONFIG_NFS_COMMON=y -+CONFIG_SUNRPC=m -+CONFIG_SUNRPC_GSS=m -+CONFIG_RPCSEC_GSS_KRB5=m -+# CONFIG_RPCSEC_GSS_SPKM3 is not set -+# CONFIG_SMB_FS is not set -+CONFIG_CIFS=m -+# CONFIG_CIFS_STATS is not set -+# CONFIG_CIFS_WEAK_PW_HASH is not set -+# CONFIG_CIFS_XATTR is not set -+# CONFIG_CIFS_DEBUG2 is not set -+# CONFIG_CIFS_EXPERIMENTAL is not set -+# CONFIG_NCP_FS is not set -+# CONFIG_CODA_FS is not set -+# CONFIG_AFS_FS is not set -+ -+# -+# Partition Types -+# -+CONFIG_PARTITION_ADVANCED=y -+# CONFIG_ACORN_PARTITION is not set -+# CONFIG_OSF_PARTITION is not set -+# CONFIG_AMIGA_PARTITION is not set -+# CONFIG_ATARI_PARTITION is not set -+# CONFIG_MAC_PARTITION is not set -+CONFIG_MSDOS_PARTITION=y -+# CONFIG_BSD_DISKLABEL is not set -+# CONFIG_MINIX_SUBPARTITION is not set -+# CONFIG_SOLARIS_X86_PARTITION is not set -+# CONFIG_UNIXWARE_DISKLABEL is not set -+# CONFIG_LDM_PARTITION is not set -+# CONFIG_SGI_PARTITION is not set -+# CONFIG_ULTRIX_PARTITION is not set -+# CONFIG_SUN_PARTITION is not set -+# CONFIG_KARMA_PARTITION is not set -+# CONFIG_EFI_PARTITION is not set -+# CONFIG_SYSV68_PARTITION is not set -+CONFIG_NLS=y -+CONFIG_NLS_DEFAULT="iso8859-1" -+CONFIG_NLS_CODEPAGE_437=y -+# CONFIG_NLS_CODEPAGE_737 is not set -+# CONFIG_NLS_CODEPAGE_775 is not set -+CONFIG_NLS_CODEPAGE_850=m -+# CONFIG_NLS_CODEPAGE_852 is not set -+# CONFIG_NLS_CODEPAGE_855 is not set -+# CONFIG_NLS_CODEPAGE_857 is not set -+# CONFIG_NLS_CODEPAGE_860 is not set -+# CONFIG_NLS_CODEPAGE_861 is not set -+# CONFIG_NLS_CODEPAGE_862 is not set -+# CONFIG_NLS_CODEPAGE_863 is not set -+# CONFIG_NLS_CODEPAGE_864 is not set -+# CONFIG_NLS_CODEPAGE_865 is not set -+CONFIG_NLS_CODEPAGE_866=m -+# CONFIG_NLS_CODEPAGE_869 is not set -+CONFIG_NLS_CODEPAGE_936=m -+CONFIG_NLS_CODEPAGE_950=m -+# CONFIG_NLS_CODEPAGE_932 is not set -+# CONFIG_NLS_CODEPAGE_949 is not set -+# CONFIG_NLS_CODEPAGE_874 is not set -+# CONFIG_NLS_ISO8859_8 is not set -+CONFIG_NLS_CODEPAGE_1250=m -+CONFIG_NLS_CODEPAGE_1251=m -+CONFIG_NLS_ASCII=m -+CONFIG_NLS_ISO8859_1=m -+CONFIG_NLS_ISO8859_2=m -+# CONFIG_NLS_ISO8859_3 is not set -+# CONFIG_NLS_ISO8859_4 is not set -+# CONFIG_NLS_ISO8859_5 is not set -+# CONFIG_NLS_ISO8859_6 is not set -+# CONFIG_NLS_ISO8859_7 is not set -+# CONFIG_NLS_ISO8859_9 is not set -+# CONFIG_NLS_ISO8859_13 is not set -+# CONFIG_NLS_ISO8859_14 is not set -+# CONFIG_NLS_ISO8859_15 is not set -+# CONFIG_NLS_KOI8_R is not set -+# CONFIG_NLS_KOI8_U is not set -+CONFIG_NLS_UTF8=m -+# CONFIG_DLM is not set -+ -+# -+# Kernel hacking -+# -+CONFIG_PRINTK_TIME=y -+# CONFIG_ENABLE_WARN_DEPRECATED is not set -+# CONFIG_ENABLE_MUST_CHECK is not set -+CONFIG_FRAME_WARN=1024 -+# CONFIG_MAGIC_SYSRQ is not set -+CONFIG_STRIP_ASM_SYMS=y -+# CONFIG_UNUSED_SYMBOLS is not set -+CONFIG_DEBUG_FS=y -+# CONFIG_HEADERS_CHECK is not set -+# CONFIG_DEBUG_KERNEL is not set -+CONFIG_DEBUG_BUGVERBOSE=y -+CONFIG_DEBUG_MEMORY_INIT=y -+CONFIG_FRAME_POINTER=y -+# CONFIG_RCU_CPU_STALL_DETECTOR is not set -+# CONFIG_LATENCYTOP is not set -+# CONFIG_SYSCTL_SYSCALL_CHECK is not set -+CONFIG_HAVE_FUNCTION_TRACER=y -+CONFIG_TRACING_SUPPORT=y -+# CONFIG_FTRACE is not set -+# CONFIG_DYNAMIC_DEBUG is not set -+# CONFIG_SAMPLES is not set -+CONFIG_HAVE_ARCH_KGDB=y -+# CONFIG_ARM_UNWIND is not set -+# CONFIG_DEBUG_USER is not set -+CONFIG_DEBUG_S3C_UART=2 -+ -+# -+# Security options -+# -+# CONFIG_KEYS is not set -+# CONFIG_SECURITY is not set -+# CONFIG_SECURITYFS is not set -+# CONFIG_SECURITY_FILE_CAPABILITIES is not set -+CONFIG_CRYPTO=y -+ -+# -+# Crypto core or helper -+# -+CONFIG_CRYPTO_ALGAPI=y -+CONFIG_CRYPTO_ALGAPI2=y -+CONFIG_CRYPTO_AEAD=m -+CONFIG_CRYPTO_AEAD2=y -+CONFIG_CRYPTO_BLKCIPHER=m -+CONFIG_CRYPTO_BLKCIPHER2=y -+CONFIG_CRYPTO_HASH=y -+CONFIG_CRYPTO_HASH2=y -+CONFIG_CRYPTO_RNG2=y -+CONFIG_CRYPTO_PCOMP=y -+CONFIG_CRYPTO_MANAGER=m -+CONFIG_CRYPTO_MANAGER2=y -+CONFIG_CRYPTO_GF128MUL=m -+CONFIG_CRYPTO_NULL=m -+CONFIG_CRYPTO_WORKQUEUE=y -+# CONFIG_CRYPTO_CRYPTD is not set -+CONFIG_CRYPTO_AUTHENC=m -+CONFIG_CRYPTO_TEST=m -+ -+# -+# Authenticated Encryption with Associated Data -+# -+# CONFIG_CRYPTO_CCM is not set -+# CONFIG_CRYPTO_GCM is not set -+# CONFIG_CRYPTO_SEQIV is not set -+ -+# -+# Block modes -+# -+CONFIG_CRYPTO_CBC=m -+# CONFIG_CRYPTO_CTR is not set -+# CONFIG_CRYPTO_CTS is not set -+CONFIG_CRYPTO_ECB=m -+CONFIG_CRYPTO_LRW=m -+CONFIG_CRYPTO_PCBC=m -+# CONFIG_CRYPTO_XTS is not set -+ -+# -+# Hash modes -+# -+CONFIG_CRYPTO_HMAC=m -+CONFIG_CRYPTO_XCBC=m -+# CONFIG_CRYPTO_VMAC is not set -+ -+# -+# Digest -+# -+CONFIG_CRYPTO_CRC32C=m -+# CONFIG_CRYPTO_GHASH is not set -+CONFIG_CRYPTO_MD4=m -+CONFIG_CRYPTO_MD5=y -+CONFIG_CRYPTO_MICHAEL_MIC=m -+# CONFIG_CRYPTO_RMD128 is not set -+# CONFIG_CRYPTO_RMD160 is not set -+# CONFIG_CRYPTO_RMD256 is not set -+# CONFIG_CRYPTO_RMD320 is not set -+CONFIG_CRYPTO_SHA1=m -+CONFIG_CRYPTO_SHA256=m -+CONFIG_CRYPTO_SHA512=m -+CONFIG_CRYPTO_TGR192=m -+CONFIG_CRYPTO_WP512=m -+ -+# -+# Ciphers -+# -+# CONFIG_CRYPTO_AES is not set -+CONFIG_CRYPTO_ANUBIS=m -+CONFIG_CRYPTO_ARC4=m -+CONFIG_CRYPTO_BLOWFISH=m -+CONFIG_CRYPTO_CAMELLIA=m -+CONFIG_CRYPTO_CAST5=m -+CONFIG_CRYPTO_CAST6=m -+CONFIG_CRYPTO_DES=m -+CONFIG_CRYPTO_FCRYPT=m -+CONFIG_CRYPTO_KHAZAD=m -+# CONFIG_CRYPTO_SALSA20 is not set -+# CONFIG_CRYPTO_SEED is not set -+CONFIG_CRYPTO_SERPENT=m -+CONFIG_CRYPTO_TEA=m -+CONFIG_CRYPTO_TWOFISH=m -+CONFIG_CRYPTO_TWOFISH_COMMON=m -+ -+# -+# Compression -+# -+CONFIG_CRYPTO_DEFLATE=y -+CONFIG_CRYPTO_ZLIB=y -+CONFIG_CRYPTO_LZO=y -+ -+# -+# Random Number Generation -+# -+# CONFIG_CRYPTO_ANSI_CPRNG is not set -+# CONFIG_CRYPTO_HW is not set -+# CONFIG_BINARY_PRINTF is not set -+ -+# -+# Library routines -+# -+CONFIG_BITREVERSE=y -+CONFIG_GENERIC_FIND_LAST_BIT=y -+CONFIG_CRC_CCITT=y -+CONFIG_CRC16=y -+CONFIG_CRC_T10DIF=y -+CONFIG_CRC_ITU_T=y -+CONFIG_CRC32=y -+CONFIG_CRC7=y -+CONFIG_LIBCRC32C=m -+CONFIG_ZLIB_INFLATE=y -+CONFIG_ZLIB_DEFLATE=y -+CONFIG_LZO_COMPRESS=y -+CONFIG_LZO_DECOMPRESS=y -+CONFIG_DECOMPRESS_GZIP=y -+CONFIG_DECOMPRESS_BZIP2=y -+CONFIG_DECOMPRESS_LZMA=y -+CONFIG_TEXTSEARCH=y -+CONFIG_TEXTSEARCH_KMP=m -+CONFIG_TEXTSEARCH_BM=m -+CONFIG_TEXTSEARCH_FSM=m -+CONFIG_HAS_IOMEM=y -+CONFIG_HAS_DMA=y -+CONFIG_NLATTR=y --- -1.7.0.4 - diff --git a/recipes/linux/linux-openmoko-2.6.32/0023-Re-enable-Glamo-fence-IRQ-if-it-sticks.patch b/recipes/linux/linux-openmoko-2.6.32/0023-Re-enable-Glamo-fence-IRQ-if-it-sticks.patch deleted file mode 100644 index a24350f8c6..0000000000 --- a/recipes/linux/linux-openmoko-2.6.32/0023-Re-enable-Glamo-fence-IRQ-if-it-sticks.patch +++ /dev/null @@ -1,36 +0,0 @@ -From 348d0334015689a22c9dbd8dd0291360c960a764 Mon Sep 17 00:00:00 2001 -From: Thomas White -Date: Tue, 13 Apr 2010 22:18:41 +0200 -Subject: [PATCH 23/24] Re-enable Glamo fence IRQ if it sticks - -Also fix a formatting typo. - -Signed-off-by: Thomas White ---- - drivers/mfd/glamo/glamo-fence.c | 3 ++- - 1 files changed, 2 insertions(+), 1 deletions(-) - -diff --git a/drivers/mfd/glamo/glamo-fence.c b/drivers/mfd/glamo/glamo-fence.c -index 9119675..ba3ed88 100644 ---- a/drivers/mfd/glamo/glamo-fence.c -+++ b/drivers/mfd/glamo/glamo-fence.c -@@ -98,7 +98,7 @@ static void glamo_fence_emit(struct glamo_fence *fence) - - static void glamo_fence_enable(struct glamodrm_handle *gdrm) - { -- enable_irq( GLAMO_IRQ_2D); -+ enable_irq(GLAMO_IRQ_2D); - } - - -@@ -168,6 +168,7 @@ static void glamo_fence_debodge(struct glamodrm_handle *gdrm) - - glamo_cmdq_wait(gdrm, GLAMO_ENGINE_ALL); - glamo_engine_reset(gdrm->glamo_core, GLAMO_ENGINE_2D); -+ glamo_fence_enable(gdrm); - - read_lock(&gdrm->fence_list_lock); - list_for_each(tmp, &gdrm->fence_list) { --- -1.7.0.4 - diff --git a/recipes/linux/linux-openmoko-2.6.32/0023-Remove-a-couple-of-debugging-messages.patch b/recipes/linux/linux-openmoko-2.6.32/0023-Remove-a-couple-of-debugging-messages.patch new file mode 100644 index 0000000000..7ec2a9582e --- /dev/null +++ b/recipes/linux/linux-openmoko-2.6.32/0023-Remove-a-couple-of-debugging-messages.patch @@ -0,0 +1,35 @@ +From 171e3f48e87b7ce366116b4dc5af5b1286c19554 Mon Sep 17 00:00:00 2001 +From: Thomas White +Date: Sat, 24 Apr 2010 21:10:09 +0200 +Subject: [PATCH 29/31] Remove a couple of debugging messages + +Signed-off-by: Thomas White +--- + drivers/mfd/glamo/glamo-kms-fb.c | 4 ---- + 1 files changed, 0 insertions(+), 4 deletions(-) + +diff --git a/drivers/mfd/glamo/glamo-kms-fb.c b/drivers/mfd/glamo/glamo-kms-fb.c +index 04de83b..d76dd24 100644 +--- a/drivers/mfd/glamo/glamo-kms-fb.c ++++ b/drivers/mfd/glamo/glamo-kms-fb.c +@@ -253,8 +253,6 @@ static void glamofb_on(struct fb_info *info) + struct drm_device *dev = par->dev; + struct glamodrm_handle *gdrm = dev->dev_private; + +- printk(KERN_CRIT "Turning on display...\n"); +- + gdrm = dev->dev_private; + + glamo_lcd_power(gdrm, 1); +@@ -266,8 +264,6 @@ static void glamofb_off(struct fb_info *info, int dpms_mode) + struct drm_device *dev = par->dev; + struct glamodrm_handle *gdrm = dev->dev_private; + +- printk(KERN_CRIT "Turning off display...\n"); +- + glamo_lcd_power(gdrm, 0); + } + +-- +1.7.0.4 + diff --git a/recipes/linux/linux-openmoko-2.6.32/0024-Enable-dummy-frames-when-switching-resolution.patch b/recipes/linux/linux-openmoko-2.6.32/0024-Enable-dummy-frames-when-switching-resolution.patch new file mode 100644 index 0000000000..1e97ace698 --- /dev/null +++ b/recipes/linux/linux-openmoko-2.6.32/0024-Enable-dummy-frames-when-switching-resolution.patch @@ -0,0 +1,26 @@ +From ed45a9c582b2626a7f44e9fe64ae313d9dcbfbfb Mon Sep 17 00:00:00 2001 +From: Thomas White +Date: Sat, 24 Apr 2010 21:45:38 +0200 +Subject: [PATCH 30/31] Enable dummy frames when switching resolution + +Signed-off-by: Thomas White +--- + drivers/video/backlight/jbt6k74.c | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +diff --git a/drivers/video/backlight/jbt6k74.c b/drivers/video/backlight/jbt6k74.c +index 43249ad..91651e7 100644 +--- a/drivers/video/backlight/jbt6k74.c ++++ b/drivers/video/backlight/jbt6k74.c +@@ -217,7 +217,7 @@ static int jbt_init_regs(struct jbt_info *jbt) + * to avoid red / blue flicker + */ + ret |= jbt_reg_write(jbt, JBT_REG_ASW_SLEW, 0x00 | (1 << 5)); +- ret |= jbt_reg_write(jbt, JBT_REG_DUMMY_DISPLAY, 0x00); ++ ret |= jbt_reg_write(jbt, JBT_REG_DUMMY_DISPLAY, 0xff); + + ret |= jbt_reg_write(jbt, JBT_REG_SLEEP_OUT_FR_A, 0x11); + ret |= jbt_reg_write(jbt, JBT_REG_SLEEP_OUT_FR_B, 0x11); +-- +1.7.0.4 + diff --git a/recipes/linux/linux-openmoko-2.6.32/0024-Fix-KMS-framebuffer-physical-address.patch b/recipes/linux/linux-openmoko-2.6.32/0024-Fix-KMS-framebuffer-physical-address.patch deleted file mode 100644 index 3ce4d59042..0000000000 --- a/recipes/linux/linux-openmoko-2.6.32/0024-Fix-KMS-framebuffer-physical-address.patch +++ /dev/null @@ -1,38 +0,0 @@ -From 1b83b6d7f2e1bf5473cd17a742737a1cfe450509 Mon Sep 17 00:00:00 2001 -From: Thomas White -Date: Fri, 20 Nov 2009 22:06:30 +0100 -Subject: [PATCH 24/24] Fix KMS framebuffer physical address - -This allows "/dev/fb0" to work correctly with mmap(). - -Signed-off-by: Thomas White ---- - drivers/mfd/glamo/glamo-kms-fb.c | 5 ++--- - 1 files changed, 2 insertions(+), 3 deletions(-) - -diff --git a/drivers/mfd/glamo/glamo-kms-fb.c b/drivers/mfd/glamo/glamo-kms-fb.c -index 6d4b9ea..04de83b 100644 ---- a/drivers/mfd/glamo/glamo-kms-fb.c -+++ b/drivers/mfd/glamo/glamo-kms-fb.c -@@ -387,9 +387,6 @@ int glamofb_create(struct drm_device *dev, uint32_t fb_width, - info->fbops = &glamofb_ops; - - info->fix.line_length = fb->pitch; -- info->fix.smem_start = dev->mode_config.fb_base -- + (unsigned long) gdrm->vram->start; -- info->fix.smem_len = size; - - info->flags = FBINFO_DEFAULT; - -@@ -401,6 +398,8 @@ int glamofb_create(struct drm_device *dev, uint32_t fb_width, - ret = -ENOSPC; - goto out_unref; - } -+ info->fix.smem_start = (unsigned long)gdrm->vram->start + offs; -+ info->fix.smem_len = size; - info->screen_size = size; - - info->pseudo_palette = fb->pseudo_palette; --- -1.7.0.4 - diff --git a/recipes/linux/linux-openmoko-2.6.32/0025-pcf50633-fix-merge.patch b/recipes/linux/linux-openmoko-2.6.32/0025-pcf50633-fix-merge.patch new file mode 100644 index 0000000000..612b332a94 --- /dev/null +++ b/recipes/linux/linux-openmoko-2.6.32/0025-pcf50633-fix-merge.patch @@ -0,0 +1,28 @@ +From 475d20cdb1bfefd32d5ed64dff745648df6311ed Mon Sep 17 00:00:00 2001 +From: Martin Jansa +Date: Mon, 26 Apr 2010 10:40:05 +0200 +Subject: [PATCH 25/31] pcf50633: fix merge + +from: http://git.openmoko.org/?p=kernel.git;a=blobdiff;f=arch/arm/mach-s3c2442/mach-gta02.c;h=a96903712cb0139133350d6443d9cee33f0397fd;hp=083b54c9bcf0b5311c29d38c976e3c6b04fe32d5;hb=8833244fb8a818a8429d686ba2b5626a1f2681bc;hpb=2f04ffc8dd97e15ce30358c3bf00cf6a0e7dcc19 +--- + arch/arm/mach-s3c2442/mach-gta02.c | 4 ++-- + 1 files changed, 2 insertions(+), 2 deletions(-) + +diff --git a/arch/arm/mach-s3c2442/mach-gta02.c b/arch/arm/mach-s3c2442/mach-gta02.c +index f1d4d51..8b59fa7 100644 +--- a/arch/arm/mach-s3c2442/mach-gta02.c ++++ b/arch/arm/mach-s3c2442/mach-gta02.c +@@ -631,8 +631,8 @@ struct pcf50633_platform_data gta02_pcf_pdata = { + .min_uV = 2000000, + .max_uV = 3300000, + .valid_modes_mask = REGULATOR_MODE_NORMAL, +- .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE | +- REGULATOR_CHANGE_VOLTAGE, ++ .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE | ++ REGULATOR_CHANGE_STATUS, + .always_on = 1, + }, + .num_consumer_supplies = ARRAY_SIZE(hcldo_consumers), +-- +1.7.0.4 + diff --git a/recipes/linux/linux-openmoko-2.6.32/0031-ar6000-minimise-possibility-of-race-in-ar6000_ioctl_.patch b/recipes/linux/linux-openmoko-2.6.32/0031-ar6000-minimise-possibility-of-race-in-ar6000_ioctl_.patch new file mode 100644 index 0000000000..4640a6b71a --- /dev/null +++ b/recipes/linux/linux-openmoko-2.6.32/0031-ar6000-minimise-possibility-of-race-in-ar6000_ioctl_.patch @@ -0,0 +1,33 @@ +From 926753617ff0961104567c7c0944d5a4bb2b94e5 Mon Sep 17 00:00:00 2001 +From: Paul Fertser +Date: Sat, 6 Mar 2010 15:44:10 +0300 +Subject: [PATCH 31/31] ar6000: minimise possibility of race in ar6000_ioctl_siwscan + +This stupid patch should make driver not do NULL pointer dereference when +there's a race between scan and removing of the device. As clumsy as the +rest of the driver, this is not a proper solution, of course. + +Screw the anonymous dev who's written the original code! + +Signed-off-by: Paul Fertser +--- + drivers/ar6000/ar6000/wireless_ext.c | 3 +++ + 1 files changed, 3 insertions(+), 0 deletions(-) + +diff --git a/drivers/ar6000/ar6000/wireless_ext.c b/drivers/ar6000/ar6000/wireless_ext.c +index af78ae0..52a4675 100644 +--- a/drivers/ar6000/ar6000/wireless_ext.c ++++ b/drivers/ar6000/ar6000/wireless_ext.c +@@ -1813,6 +1813,9 @@ ar6000_ioctl_siwscan(struct net_device *dev, + wait_event_interruptible_timeout(ar6000_scan_queue, ar->scan_complete, + 5 * HZ); + ++ if (ar->arWmiReady == FALSE || ar->arWlanState == WLAN_DISABLED) ++ return -EIO; ++ + if (wmi_bssfilter_cmd(ar->arWmi, NONE_BSS_FILTER, 0) != A_OK) { + printk("Couldn't set filtering\n"); + ret = -EIO; +-- +1.7.0.4 + diff --git a/recipes/linux/linux-openmoko-2.6.32_git.bb b/recipes/linux/linux-openmoko-2.6.32_git.bb index 99c6c4398f..bb1bc50082 100644 --- a/recipes/linux/linux-openmoko-2.6.32_git.bb +++ b/recipes/linux/linux-openmoko-2.6.32_git.bb @@ -3,12 +3,11 @@ require linux-openmoko.inc DESCRIPTION_${PN} = "Linux ${KERNEL_RELEASE} kernel for the Openmoko Neo GSM Smartphones" -KERNEL_RELEASE="2.6.32.11" +KERNEL_RELEASE="2.6.32.12" -SRCREV = "14be1091928fcce66812a85129768fb253b36420" +SRCREV = "a9254be10ac2294ea20165a87c09ea6afcf66d94" OEV = "oe1" PV = "${KERNEL_RELEASE}-${OEV}+gitr${SRCPV}" -PR = "r8" SRC_URI = "\ git://git.openmoko.org/git/kernel.git;protocol=git;branch=om-gta02-2.6.32 \ @@ -31,20 +30,20 @@ SRC_URI = "\ file://0012-Report-all-FB-modes-given-by-the-lower-levels.patch;patch=1 \ file://0013-Change-connector-type-to-LVDS.patch;patch=1 \ file://0014-Clean-up-JBT-hooks-and-allow-resolution-switching.patch;patch=1 \ - file://0015-ar6000-send-userspace-an-event-on-disconnection.patch;patch=1 \ - file://0016-Enable-display-before-trying-to-set-mode-or-base.patch;patch=1 \ - file://0017-accels.patch.patch;patch=1 \ - file://0018-usbhost.patch.patch;patch=1 \ - file://0019-ar6000_delay.patch.patch;patch=1 \ - file://0020-save_regs.patch.patch;patch=1 \ - file://0021-gta02_defconfig.patch;patch=1 \ - file://0022-gta02_drm_defconfig.patch;patch=1 \ - file://0023-Re-enable-Glamo-fence-IRQ-if-it-sticks.patch;patch=1 \ - file://0024-Fix-KMS-framebuffer-physical-address.patch;patch=1 \ + file://0015-Enable-display-before-trying-to-set-mode-or-base.patch;patch=1 \ + file://0016-accels.patch.patch;patch=1 \ + file://0017-usbhost.patch.patch;patch=1 \ + file://0018-ar6000_delay.patch.patch;patch=1 \ + file://0019-save_regs.patch.patch;patch=1 \ + file://0020-Fix-KMS-framebuffer-physical-address.patch;patch=1 \ + file://0021-Reject-modes-with-clock-0.patch;patch=1 \ + file://0022-JBT6k74-tweaks-Make-resolution-switch-work.patch;patch=1 \ + file://0023-Remove-a-couple-of-debugging-messages.patch;patch=1 \ + file://0024-Enable-dummy-frames-when-switching-resolution.patch;patch=1 \ " -SRC_URI[stablepatch.md5sum] = "855c248334a71ef5ca3d8cb89d51334f" -SRC_URI[stablepatch.sha256sum] = "edb26ff62b2f95b0d6e5c434d777af2815600a990f1c7c5d2c7faad9b4e4bc2b" +SRC_URI[stablepatch.md5sum] = "9d097d34648a1734b1a7f97c5d000f03" +SRC_URI[stablepatch.sha256sum] = "e03ffcd2c88e936e581e5f7a7c675d11345064f2e3df96e335e5438c6593e3e7" S = "${WORKDIR}/git" -- cgit v1.2.3