* update Treo680, generalise it and add Centro support @ 2009-08-27 0:43 Tomáš Čech 2009-08-27 0:43 ` [PATCH 1/5] Treo680: pxamci simplify to use GPIO Tomáš Čech 0 siblings, 1 reply; 22+ messages in thread From: Tomáš Čech @ 2009-08-27 0:43 UTC (permalink / raw) To: linux-arm-kernel Hi, this set of patches update Treo680 code a bit and generalise it. It also shows the way I'd like to add other Palm smartphones (Treo 755p and hopefully others). If this is not acceptable way of doing that, tell me, please. Thanks for your time, Best regards, Tomas Cech ^ permalink raw reply [flat|nested] 22+ messages in thread
* [PATCH 1/5] Treo680: pxamci simplify to use GPIO 2009-08-27 0:43 update Treo680, generalise it and add Centro support Tomáš Čech @ 2009-08-27 0:43 ` Tomáš Čech 2009-08-27 0:43 ` [PATCH 2/5] Treo680: remove unused LCD power GPIO Tomáš Čech 2009-08-31 10:44 ` [PATCH 1/5] Treo680: pxamci simplify to use GPIO Pavel Machek 0 siblings, 2 replies; 22+ messages in thread From: Tomáš Čech @ 2009-08-27 0:43 UTC (permalink / raw) To: linux-arm-kernel From: Tom?? ?ech <sleep walker@suse.cz> --- arch/arm/mach-pxa/treo680.c | 84 ++---------------------------------------- 1 files changed, 4 insertions(+), 80 deletions(-) diff --git a/arch/arm/mach-pxa/treo680.c b/arch/arm/mach-pxa/treo680.c index a06f19e..050ad8e 100644 --- a/arch/arm/mach-pxa/treo680.c +++ b/arch/arm/mach-pxa/treo680.c @@ -153,87 +153,11 @@ static unsigned long treo680_pin_config[] __initdata = { /****************************************************************************** * SD/MMC card controller ******************************************************************************/ -static int treo680_mci_init(struct device *dev, - irq_handler_t treo680_detect_int, void *data) -{ - int err = 0; - - /* Setup an interrupt for detecting card insert/remove events */ - err = gpio_request(GPIO_NR_TREO680_SD_DETECT_N, "SD IRQ"); - - if (err) - goto err; - - err = gpio_direction_input(GPIO_NR_TREO680_SD_DETECT_N); - if (err) - goto err2; - - err = request_irq(gpio_to_irq(GPIO_NR_TREO680_SD_DETECT_N), - treo680_detect_int, IRQF_DISABLED | IRQF_SAMPLE_RANDOM | - IRQF_TRIGGER_FALLING | IRQF_TRIGGER_RISING, - "SD/MMC card detect", data); - - if (err) { - dev_err(dev, "%s: cannot request SD/MMC card detect IRQ\n", - __func__); - goto err2; - } - - err = gpio_request(GPIO_NR_TREO680_SD_POWER, "SD_POWER"); - if (err) - goto err3; - - err = gpio_direction_output(GPIO_NR_TREO680_SD_POWER, 1); - if (err) - goto err4; - - err = gpio_request(GPIO_NR_TREO680_SD_READONLY, "SD_READONLY"); - if (err) - goto err4; - - err = gpio_direction_input(GPIO_NR_TREO680_SD_READONLY); - if (err) - goto err5; - - return 0; - -err5: - gpio_free(GPIO_NR_TREO680_SD_READONLY); -err4: - gpio_free(GPIO_NR_TREO680_SD_POWER); -err3: - free_irq(gpio_to_irq(GPIO_NR_TREO680_SD_DETECT_N), data); -err2: - gpio_free(GPIO_NR_TREO680_SD_DETECT_N); -err: - return err; -} - -static void treo680_mci_exit(struct device *dev, void *data) -{ - gpio_free(GPIO_NR_TREO680_SD_READONLY); - gpio_free(GPIO_NR_TREO680_SD_POWER); - free_irq(gpio_to_irq(GPIO_NR_TREO680_SD_DETECT_N), data); - gpio_free(GPIO_NR_TREO680_SD_DETECT_N); -} - -static void treo680_mci_power(struct device *dev, unsigned int vdd) -{ - struct pxamci_platform_data *p_d = dev->platform_data; - gpio_set_value(GPIO_NR_TREO680_SD_POWER, p_d->ocr_mask & (1 << vdd)); -} - -static int treo680_mci_get_ro(struct device *dev) -{ - return gpio_get_value(GPIO_NR_TREO680_SD_READONLY); -} - static struct pxamci_platform_data treo680_mci_platform_data = { - .ocr_mask = MMC_VDD_32_33 | MMC_VDD_33_34, - .setpower = treo680_mci_power, - .get_ro = treo680_mci_get_ro, - .init = treo680_mci_init, - .exit = treo680_mci_exit, + .ocr_mask = MMC_VDD_32_33 | MMC_VDD_33_34, + .gpio_card_detect = GPIO_NR_TREO680_SD_DETECT_N, + .gpio_card_ro = GPIO_NR_TREO680_SD_READONLY, + .gpio_power = GPIO_NR_TREO680_SD_POWER, }; /****************************************************************************** -- 1.6.3.3 ^ permalink raw reply related [flat|nested] 22+ messages in thread
* [PATCH 2/5] Treo680: remove unused LCD power GPIO 2009-08-27 0:43 ` [PATCH 1/5] Treo680: pxamci simplify to use GPIO Tomáš Čech @ 2009-08-27 0:43 ` Tomáš Čech 2009-08-27 0:43 ` [PATCH 3/5] Treo680: fix freed GPIO in treo680_irda_shutdown() Tomáš Čech 2009-08-31 10:44 ` [PATCH 1/5] Treo680: pxamci simplify to use GPIO Pavel Machek 1 sibling, 1 reply; 22+ messages in thread From: Tomáš Čech @ 2009-08-27 0:43 UTC (permalink / raw) To: linux-arm-kernel From: Tom?? ?ech <sleep walker@suse.cz> --- arch/arm/mach-pxa/treo680.c | 10 +--------- 1 files changed, 1 insertions(+), 9 deletions(-) diff --git a/arch/arm/mach-pxa/treo680.c b/arch/arm/mach-pxa/treo680.c index 050ad8e..57bccc3 100644 --- a/arch/arm/mach-pxa/treo680.c +++ b/arch/arm/mach-pxa/treo680.c @@ -254,16 +254,9 @@ static int treo680_backlight_init(struct device *dev) ret = gpio_direction_output(GPIO_NR_TREO680_BL_POWER, 0); if (ret) goto err2; - ret = gpio_request(GPIO_NR_TREO680_LCD_POWER, "LCD POWER"); - if (ret) - goto err2; - ret = gpio_direction_output(GPIO_NR_TREO680_LCD_POWER, 0); - if (ret) - goto err3; return 0; -err3: - gpio_free(GPIO_NR_TREO680_LCD_POWER); + err2: gpio_free(GPIO_NR_TREO680_BL_POWER); err: @@ -279,7 +272,6 @@ static int treo680_backlight_notify(int brightness) static void treo680_backlight_exit(struct device *dev) { gpio_free(GPIO_NR_TREO680_BL_POWER); - gpio_free(GPIO_NR_TREO680_LCD_POWER); } static struct platform_pwm_backlight_data treo680_backlight_data = { -- 1.6.3.3 ^ permalink raw reply related [flat|nested] 22+ messages in thread
* [PATCH 3/5] Treo680: fix freed GPIO in treo680_irda_shutdown() 2009-08-27 0:43 ` [PATCH 2/5] Treo680: remove unused LCD power GPIO Tomáš Čech @ 2009-08-27 0:43 ` Tomáš Čech 2009-08-27 0:43 ` [PATCH 4/5] PalmGSM: generalisation of Treo680 code to PalmGSM Tomáš Čech 0 siblings, 1 reply; 22+ messages in thread From: Tomáš Čech @ 2009-08-27 0:43 UTC (permalink / raw) To: linux-arm-kernel From: Tom?? ?ech <sleep walker@suse.cz> --- arch/arm/mach-pxa/treo680.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/arch/arm/mach-pxa/treo680.c b/arch/arm/mach-pxa/treo680.c index 57bccc3..d88114c 100644 --- a/arch/arm/mach-pxa/treo680.c +++ b/arch/arm/mach-pxa/treo680.c @@ -325,7 +325,7 @@ err1: static void treo680_irda_shutdown(struct device *dev) { - gpio_free(GPIO_NR_TREO680_AMP_EN); + gpio_free(GPIO_NR_TREO680_IR_EN); } static struct pxaficp_platform_data treo680_ficp_info = { -- 1.6.3.3 ^ permalink raw reply related [flat|nested] 22+ messages in thread
* [PATCH 4/5] PalmGSM: generalisation of Treo680 code to PalmGSM 2009-08-27 0:43 ` [PATCH 3/5] Treo680: fix freed GPIO in treo680_irda_shutdown() Tomáš Čech @ 2009-08-27 0:43 ` Tomáš Čech 2009-08-27 0:43 ` [PATCH 5/5] PalmGSM: add basic Centro support Tomáš Čech 2009-08-27 2:31 ` [PATCH 4/5] PalmGSM: generalisation of Treo680 code to PalmGSM Eric Miao 0 siblings, 2 replies; 22+ messages in thread From: Tomáš Čech @ 2009-08-27 0:43 UTC (permalink / raw) To: linux-arm-kernel From: Tom?? ?ech <sleep walker@suse.cz> --- arch/arm/mach-pxa/Kconfig | 5 + arch/arm/mach-pxa/Makefile | 2 +- arch/arm/mach-pxa/include/mach/palmgsm.h | 60 ++++ arch/arm/mach-pxa/include/mach/treo680.h | 49 --- arch/arm/mach-pxa/palmgsm.c | 559 ++++++++++++++++++++++++++++++ arch/arm/mach-pxa/treo680.c | 528 ---------------------------- 6 files changed, 625 insertions(+), 578 deletions(-) create mode 100644 arch/arm/mach-pxa/include/mach/palmgsm.h delete mode 100644 arch/arm/mach-pxa/include/mach/treo680.h create mode 100644 arch/arm/mach-pxa/palmgsm.c delete mode 100644 arch/arm/mach-pxa/treo680.c diff --git a/arch/arm/mach-pxa/Kconfig b/arch/arm/mach-pxa/Kconfig index 904f36a..441f1d6 100644 --- a/arch/arm/mach-pxa/Kconfig +++ b/arch/arm/mach-pxa/Kconfig @@ -401,12 +401,17 @@ config MACH_PALMZ72 Say Y here if you intend to run this kernel on Palm Zire 72 handheld computer. +config PALMGSM + depends on ARCH_PXA_PALM + bool + config MACH_TREO680 bool "Palm Treo 680" default y depends on ARCH_PXA_PALM select PXA27x select IWMMXT + select PALMGSM help Say Y here if you intend to run this kernel on Palm Treo 680 smartphone. diff --git a/arch/arm/mach-pxa/Makefile b/arch/arm/mach-pxa/Makefile index d4c6122..b811878 100644 --- a/arch/arm/mach-pxa/Makefile +++ b/arch/arm/mach-pxa/Makefile @@ -62,7 +62,7 @@ obj-$(CONFIG_MACH_PALMT5) += palmt5.o obj-$(CONFIG_MACH_PALMTX) += palmtx.o obj-$(CONFIG_MACH_PALMLD) += palmld.o obj-$(CONFIG_MACH_PALMZ72) += palmz72.o -obj-$(CONFIG_MACH_TREO680) += treo680.o +obj-$(CONFIG_PALMGSM) += palmgsm.o obj-$(CONFIG_ARCH_VIPER) += viper.o ifeq ($(CONFIG_MACH_ZYLONITE),y) diff --git a/arch/arm/mach-pxa/include/mach/palmgsm.h b/arch/arm/mach-pxa/include/mach/palmgsm.h new file mode 100644 index 0000000..8d1a3bc --- /dev/null +++ b/arch/arm/mach-pxa/include/mach/palmgsm.h @@ -0,0 +1,60 @@ +/* + * GPIOs and interrupts for Palm smartphones + * + * currently supported: + * Palm Treo 680 (GSM) + * + * Author: Tomas Cech <sleep_walker@suse.cz> + * + * 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. + * + * find more info at www.hackndev.com + * + */ + + +#ifndef _INCLUDE_PALMGSM_H_ +#define _INCLUDE_PALMGSM_H_ + +/* Generic GPIOs */ +#define GPIO_NR_PALMGSM_POWER_DETECT 0 +#define GPIO_NR_PALMGSM_AMP_EN 27 +#define GPIO_NR_PALMGSM_GREEN_LED 20 +#define GPIO_NR_PALMGSM_RED_LED 79 +#define GPIO_NR_PALMGSM_SD_DETECT_N 113 +#define GPIO_NR_PALMGSM_EP_DETECT_N 116 +#define GPIO_NR_PALMGSM_USB_DETECT 1 +#define GPIO_NR_PALMGSM_USB_PULLUP 114 +#define GPIO_NR_PALMGSM_GSM_POWER 40 +#define GPIO_NR_PALMGSM_GSM_RESET 87 +#define GPIO_NR_PALMGSM_GSM_WAKE 57 +#define GPIO_NR_PALMGSM_GSM_HOST_WAKE 14 +#define GPIO_NR_PALMGSM_GSM_TRIGGER 10 +#define GPIO_NR_PALMGSM_IR_EN 115 +#define GPIO_NR_PALMGSM_IR_TXD 47 +#define GPIO_NR_PALMGSM_BL_POWER 38 +#define GPIO_NR_PALMGSM_LCD_POWER 25 +#define GPIO_NR_PALMGSM_CAM_EN 83 + +/* Treo680 specific GPIOs */ +#define GPIO_NR_TREO680_SD_READONLY 33 +#define GPIO_NR_TREO680_SD_POWER 42 +#define GPIO_NR_TREO680_VIBRATE_EN 44 +#define GPIO_NR_TREO680_KEYB_BL 24 +#define GPIO_NR_TREO680_BT_EN 43 + +/* Various addresses */ +#define PALMGSM_PHYS_RAM_START 0xa0000000 +#define PALMGSM_PHYS_IO_START 0x40000000 +#define PALMGSM_STR_BASE 0xa2000000 + +/* BACKLIGHT */ +#define PALMGSM_MAX_INTENSITY 254 +#define PALMGSM_DEFAULT_INTENSITY 160 +#define PALMGSM_LIMIT_MASK 0x7F +#define PALMGSM_PRESCALER 63 +#define PALMGSM_PERIOD_NS 3500 + +#endif diff --git a/arch/arm/mach-pxa/include/mach/treo680.h b/arch/arm/mach-pxa/include/mach/treo680.h deleted file mode 100644 index af443b2..0000000 --- a/arch/arm/mach-pxa/include/mach/treo680.h +++ /dev/null @@ -1,49 +0,0 @@ -/* - * GPIOs and interrupts for Palm Treo 680 smartphone - * - * 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. - * - */ - -#ifndef _INCLUDE_TREO680_H_ -#define _INCLUDE_TREO680_H_ - -/* GPIOs */ -#define GPIO_NR_TREO680_POWER_DETECT 0 -#define GPIO_NR_TREO680_AMP_EN 27 -#define GPIO_NR_TREO680_KEYB_BL 24 -#define GPIO_NR_TREO680_VIBRATE_EN 44 -#define GPIO_NR_TREO680_GREEN_LED 20 -#define GPIO_NR_TREO680_RED_LED 79 -#define GPIO_NR_TREO680_SD_DETECT_N 113 -#define GPIO_NR_TREO680_SD_READONLY 33 -#define GPIO_NR_TREO680_EP_DETECT_N 116 -#define GPIO_NR_TREO680_SD_POWER 42 -#define GPIO_NR_TREO680_USB_DETECT 1 -#define GPIO_NR_TREO680_USB_PULLUP 114 -#define GPIO_NR_TREO680_GSM_POWER 40 -#define GPIO_NR_TREO680_GSM_RESET 87 -#define GPIO_NR_TREO680_GSM_WAKE 57 -#define GPIO_NR_TREO680_GSM_HOST_WAKE 14 -#define GPIO_NR_TREO680_GSM_TRIGGER 10 -#define GPIO_NR_TREO680_BT_EN 43 -#define GPIO_NR_TREO680_IR_EN 115 -#define GPIO_NR_TREO680_IR_TXD 47 -#define GPIO_NR_TREO680_BL_POWER 38 -#define GPIO_NR_TREO680_LCD_POWER 25 - -/* Various addresses */ -#define TREO680_PHYS_RAM_START 0xa0000000 -#define TREO680_PHYS_IO_START 0x40000000 -#define TREO680_STR_BASE 0xa2000000 - -/* BACKLIGHT */ -#define TREO680_MAX_INTENSITY 254 -#define TREO680_DEFAULT_INTENSITY 160 -#define TREO680_LIMIT_MASK 0x7F -#define TREO680_PRESCALER 63 -#define TREO680_PERIOD_NS 3500 - -#endif diff --git a/arch/arm/mach-pxa/palmgsm.c b/arch/arm/mach-pxa/palmgsm.c new file mode 100644 index 0000000..99eb468 --- /dev/null +++ b/arch/arm/mach-pxa/palmgsm.c @@ -0,0 +1,559 @@ +/* + * Hardware definitions for Palm smartphones + * + * currently supported: + * Palm Treo 680 (GSM) + * + * Author: Tomas Cech <sleep_walker@suse.cz> + * + * 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. + * + * (find more info at www.hackndev.com) + * + */ + +#include <linux/platform_device.h> +#include <linux/delay.h> +#include <linux/irq.h> +#include <linux/gpio_keys.h> +#include <linux/input.h> +#include <linux/pda_power.h> +#include <linux/pwm_backlight.h> +#include <linux/gpio.h> +#include <linux/wm97xx_batt.h> +#include <linux/power_supply.h> +#include <linux/sysdev.h> +#include <linux/w1-gpio.h> + +#include <asm/mach-types.h> +#include <asm/mach/arch.h> +#include <asm/mach/map.h> + +#include <mach/pxa27x.h> +#include <mach/pxa27x-udc.h> +#include <mach/audio.h> +#include <mach/palmgsm.h> +#include <mach/mmc.h> +#include <mach/pxafb.h> +#include <mach/irda.h> +#include <mach/pxa27x_keypad.h> +#include <mach/udc.h> +#include <mach/ohci.h> +#include <mach/pxa2xx-regs.h> +#include <mach/palmasoc.h> +#include <mach/camera.h> + +#include <sound/pxa2xx-lib.h> + +#include "generic.h" +#include "devices.h" + +/****************************************************************************** + * Pin configuration + ******************************************************************************/ +static unsigned long palmgsm_pin_config[] __initdata = { + /* MMC */ + GPIO32_MMC_CLK, + GPIO92_MMC_DAT_0, + GPIO109_MMC_DAT_1, + GPIO110_MMC_DAT_2, + GPIO111_MMC_DAT_3, + GPIO112_MMC_CMD, + GPIO113_GPIO, /* SD detect */ + + /* AC97 */ + GPIO28_AC97_BITCLK, + GPIO29_AC97_SDATA_IN_0, + GPIO30_AC97_SDATA_OUT, + GPIO31_AC97_SYNC, + GPIO89_AC97_SYSCLK, + GPIO95_AC97_nRESET, + + /* IrDA */ + GPIO46_FICP_RXD, + GPIO47_FICP_TXD, + + /* PWM */ + GPIO16_PWM0_OUT, + + /* USB */ + GPIO1_GPIO | WAKEUP_ON_EDGE_BOTH, /* usb detect */ + + /* MATRIX KEYPAD */ + GPIO101_KP_MKIN_1, + GPIO102_KP_MKIN_2, + GPIO97_KP_MKIN_3, + GPIO98_KP_MKIN_4, + GPIO91_KP_MKIN_6, + GPIO13_KP_MKIN_7, + GPIO103_KP_MKOUT_0 | MFP_LPM_DRIVE_HIGH, + GPIO104_KP_MKOUT_1, + GPIO105_KP_MKOUT_2, + GPIO106_KP_MKOUT_3, + GPIO107_KP_MKOUT_4, + GPIO108_KP_MKOUT_5, + GPIO96_KP_MKOUT_6, + GPIO93_KP_DKIN_0 | WAKEUP_ON_LEVEL_HIGH, /* Hotsync button */ + + /* LCD */ + GPIO58_LCD_LDD_0, + GPIO59_LCD_LDD_1, + GPIO60_LCD_LDD_2, + GPIO61_LCD_LDD_3, + GPIO62_LCD_LDD_4, + GPIO63_LCD_LDD_5, + GPIO64_LCD_LDD_6, + GPIO65_LCD_LDD_7, + GPIO66_LCD_LDD_8, + GPIO67_LCD_LDD_9, + GPIO68_LCD_LDD_10, + GPIO69_LCD_LDD_11, + GPIO70_LCD_LDD_12, + GPIO71_LCD_LDD_13, + GPIO72_LCD_LDD_14, + GPIO73_LCD_LDD_15, + GPIO74_LCD_FCLK, + GPIO75_LCD_LCLK, + GPIO76_LCD_PCLK, + + /* Quick Capture Interface */ + GPIO84_CIF_FV, + GPIO85_CIF_LV, + GPIO53_CIF_MCLK, + GPIO54_CIF_PCLK, + GPIO81_CIF_DD_0, + GPIO55_CIF_DD_1, + GPIO51_CIF_DD_2, + GPIO50_CIF_DD_3, + GPIO52_CIF_DD_4, + GPIO48_CIF_DD_5, + GPIO17_CIF_DD_6, + GPIO12_CIF_DD_7, + + /* I2C */ + GPIO117_I2C_SCL, + GPIO118_I2C_SDA, + + /* GSM */ + GPIO14_GPIO | WAKEUP_ON_EDGE_BOTH, /* GSM host wake up */ + GPIO34_FFUART_RXD, + GPIO35_FFUART_CTS, + GPIO39_FFUART_TXD, + GPIO41_FFUART_RTS, + + /* MISC. */ + GPIO0_GPIO | WAKEUP_ON_EDGE_BOTH, /* external power detect */ + GPIO15_GPIO | WAKEUP_ON_EDGE_BOTH, /* silent switch */ + GPIO116_GPIO, /* headphone detect */ + GPIO11_GPIO | WAKEUP_ON_EDGE_BOTH, /* bluetooth host wake up */ +}; + +#ifdef CONFIG_MACH_TREO680 +static unsigned long treo680_pin_config[] __initdata = { + GPIO33_GPIO, /* SD read only */ + + /* MATRIX KEYPAD - different wake up source */ + GPIO100_KP_MKIN_0 | WAKEUP_ON_LEVEL_HIGH, + GPIO99_KP_MKIN_5, +}; +#endif + +/****************************************************************************** + * SD/MMC card controller + ******************************************************************************/ +#ifdef CONFIG_MACH_TREO680 +static struct pxamci_platform_data treo680_mci_platform_data = { + .ocr_mask = MMC_VDD_32_33 | MMC_VDD_33_34, + .gpio_card_detect = GPIO_NR_PALMGSM_SD_DETECT_N, + .gpio_card_ro = GPIO_NR_TREO680_SD_READONLY, + .gpio_power = GPIO_NR_TREO680_SD_POWER, +}; +#endif + +/****************************************************************************** + * GPIO keyboard + ******************************************************************************/ +#ifdef CONFIG_MACH_TREO680 +static unsigned int treo680_matrix_keys[] = { + KEY(0, 0, KEY_F8), /* Red/Off/Power */ + KEY(0, 1, KEY_LEFT), + KEY(0, 2, KEY_LEFTCTRL), /* Alternate */ + KEY(0, 3, KEY_L), + KEY(0, 4, KEY_A), + KEY(0, 5, KEY_Q), + KEY(0, 6, KEY_P), + + KEY(1, 0, KEY_RIGHTCTRL), /* Menu */ + KEY(1, 1, KEY_RIGHT), + KEY(1, 2, KEY_LEFTSHIFT), /* Left shift */ + KEY(1, 3, KEY_Z), + KEY(1, 4, KEY_S), + KEY(1, 5, KEY_W), + + KEY(2, 0, KEY_F1), /* Phone */ + KEY(2, 1, KEY_UP), + KEY(2, 2, KEY_0), + KEY(2, 3, KEY_X), + KEY(2, 4, KEY_D), + KEY(2, 5, KEY_E), + + KEY(3, 0, KEY_F10), /* Calendar */ + KEY(3, 1, KEY_DOWN), + KEY(3, 2, KEY_SPACE), + KEY(3, 3, KEY_C), + KEY(3, 4, KEY_F), + KEY(3, 5, KEY_R), + + KEY(4, 0, KEY_F12), /* Mail */ + KEY(4, 1, KEY_KPENTER), + KEY(4, 2, KEY_RIGHTALT), /* Alt */ + KEY(4, 3, KEY_V), + KEY(4, 4, KEY_G), + KEY(4, 5, KEY_T), + + KEY(5, 0, KEY_F9), /* Home */ + KEY(5, 1, KEY_PAGEUP), /* Side up */ + KEY(5, 2, KEY_DOT), + KEY(5, 3, KEY_B), + KEY(5, 4, KEY_H), + KEY(5, 5, KEY_Y), + + KEY(6, 0, KEY_TAB), /* Side Activate */ + KEY(6, 1, KEY_PAGEDOWN), /* Side down */ + KEY(6, 2, KEY_ENTER), + KEY(6, 3, KEY_N), + KEY(6, 4, KEY_J), + KEY(6, 5, KEY_U), + + KEY(7, 0, KEY_F6), /* Green/Call */ + KEY(7, 1, KEY_O), + KEY(7, 2, KEY_BACKSPACE), + KEY(7, 3, KEY_M), + KEY(7, 4, KEY_K), + KEY(7, 5, KEY_I), +}; + +static struct pxa27x_keypad_platform_data treo680_keypad_platform_data = { + .matrix_key_rows = 8, + .matrix_key_cols = 7, + .matrix_key_map = treo680_matrix_keys, + .matrix_key_map_size = ARRAY_SIZE(treo680_matrix_keys), + .direct_key_map = { KEY_CONNECT }, + .direct_key_num = 1, + + .debounce_interval = 30, +}; +#endif + +/****************************************************************************** + * aSoC audio + ******************************************************************************/ + +static pxa2xx_audio_ops_t palmgsm_ac97_pdata = { + .reset_gpio = 95, +}; + +/****************************************************************************** + * Backlight + ******************************************************************************/ +static int palmgsm_backlight_init(struct device *dev) +{ + int ret; + + ret = gpio_request(GPIO_NR_PALMGSM_BL_POWER, "BL POWER"); + if (ret) + goto err; + ret = gpio_direction_output(GPIO_NR_PALMGSM_BL_POWER, 0); + if (ret) + goto err2; + + return 0; + +err2: + gpio_free(GPIO_NR_PALMGSM_BL_POWER); +err: + return ret; +} + +static int palmgsm_backlight_notify(int brightness) +{ + gpio_set_value(GPIO_NR_PALMGSM_BL_POWER, brightness); + return PALMGSM_MAX_INTENSITY - brightness; +}; + +static void palmgsm_backlight_exit(struct device *dev) +{ + gpio_free(GPIO_NR_PALMGSM_BL_POWER); +} + +static struct platform_pwm_backlight_data palmgsm_backlight_data = { + .pwm_id = 0, + .max_brightness = PALMGSM_MAX_INTENSITY, + .dft_brightness = PALMGSM_DEFAULT_INTENSITY, + .pwm_period_ns = PALMGSM_PERIOD_NS, + .init = palmgsm_backlight_init, + .notify = palmgsm_backlight_notify, + .exit = palmgsm_backlight_exit, +}; + +static struct platform_device palmgsm_backlight = { + .name = "pwm-backlight", + .dev = { + .parent = &pxa27x_device_pwm0.dev, + .platform_data = &palmgsm_backlight_data, + }, +}; + +/****************************************************************************** + * IrDA + ******************************************************************************/ +static void palmgsm_transceiver_mode(struct device *dev, int mode) +{ + gpio_set_value(GPIO_NR_PALMGSM_IR_EN, mode & IR_OFF); + pxa2xx_transceiver_mode(dev, mode); +} + +static int palmgsm_irda_startup(struct device *dev) +{ + int err; + + err = gpio_request(GPIO_NR_PALMGSM_IR_EN, "Ir port disable"); + if (err) + goto err1; + + err = gpio_direction_output(GPIO_NR_PALMGSM_IR_EN, 1); + if (err) + goto err2; + + return 0; + +err2: + dev_err(dev, "palmgsm_irda: cannot change IR gpio direction\n"); + gpio_free(GPIO_NR_PALMGSM_IR_EN); +err1: + dev_err(dev, "palmgsm_irda: cannot allocate IR gpio\n"); + return err; +} + +static void palmgsm_irda_shutdown(struct device *dev) +{ + gpio_free(GPIO_NR_PALMGSM_IR_EN); +} + +static struct pxaficp_platform_data palmgsm_ficp_info = { + .transceiver_cap = IR_FIRMODE | IR_SIRMODE | IR_OFF, + .startup = palmgsm_irda_startup, + .shutdown = palmgsm_irda_shutdown, + .transceiver_mode = palmgsm_transceiver_mode, +}; + +/****************************************************************************** + * UDC + ******************************************************************************/ +static struct pxa2xx_udc_mach_info palmgsm_udc_info __initdata = { + .gpio_vbus = GPIO_NR_PALMGSM_USB_DETECT, + .gpio_vbus_inverted = 1, + .gpio_pullup = GPIO_NR_PALMGSM_USB_PULLUP, +}; + + +/****************************************************************************** + * USB host + ******************************************************************************/ +#ifdef CONFIG_MACH_TREO680 +static struct pxaohci_platform_data treo680_ohci_info = { + .port_mode = PMM_PERPORT_MODE, + .flags = ENABLE_PORT1 | ENABLE_PORT3, + .power_budget = 0, +}; +#endif + +/****************************************************************************** + * Power supply + ******************************************************************************/ +static int power_supply_init(struct device *dev) +{ + int ret; + + ret = gpio_request(GPIO_NR_PALMGSM_POWER_DETECT, "CABLE_STATE_AC"); + if (ret) + goto err1; + ret = gpio_direction_input(GPIO_NR_PALMGSM_POWER_DETECT); + if (ret) + goto err2; + + return 0; + +err2: + gpio_free(GPIO_NR_PALMGSM_POWER_DETECT); +err1: + return ret; +} + +static int palmgsm_is_ac_online(void) +{ + return gpio_get_value(GPIO_NR_PALMGSM_POWER_DETECT); +} + +static void power_supply_exit(struct device *dev) +{ + gpio_free(GPIO_NR_PALMGSM_POWER_DETECT); +} + +static char *palmgsm_supplicants[] = { + "main-battery", +}; + +static struct pda_power_pdata power_supply_info = { + .init = power_supply_init, + .is_ac_online = palmgsm_is_ac_online, + .exit = power_supply_exit, + .supplied_to = palmgsm_supplicants, + .num_supplicants = ARRAY_SIZE(palmgsm_supplicants), +}; + +static struct platform_device power_supply = { + .name = "pda-power", + .id = -1, + .dev = { + .platform_data = &power_supply_info, + }, +}; + +/****************************************************************************** + * Vibra and LEDs + ******************************************************************************/ +#ifdef CONFIG_MACH_TREO680 +static struct gpio_led treo680_gpio_leds[] = { + { + .name = "treo680:vibra:vibra", + .default_trigger = "none", + .gpio = GPIO_NR_TREO680_VIBRATE_EN, + }, + { + .name = "treo680:green:led", + .default_trigger = "mmc0", + .gpio = GPIO_NR_PALMGSM_GREEN_LED, + }, + { + .name = "treo680:keybbl:keybbl", + .default_trigger = "none", + .gpio = GPIO_NR_TREO680_KEYB_BL, + }, +}; + +static struct gpio_led_platform_data treo680_gpio_led_info = { + .leds = treo680_gpio_leds, + .num_leds = ARRAY_SIZE(treo680_gpio_leds), +}; + +static struct platform_device treo680_leds = { + .name = "leds-gpio", + .id = -1, + .dev = { + .platform_data = &treo680_gpio_led_info, + } +}; +#endif + +/****************************************************************************** + * Framebuffer + ******************************************************************************/ +/* TODO: add support for 324x324 */ +static struct pxafb_mode_info palmgsm_lcd_modes[] = { +{ + .pixclock = 86538, + .xres = 320, + .yres = 320, + .bpp = 16, + + .left_margin = 20, + .right_margin = 8, + .upper_margin = 8, + .lower_margin = 5, + + .hsync_len = 4, + .vsync_len = 1, +}, +}; + +static struct pxafb_mach_info palmgsm_lcd_screen = { + .modes = palmgsm_lcd_modes, + .num_modes = ARRAY_SIZE(palmgsm_lcd_modes), + .lcd_conn = LCD_COLOR_TFT_16BPP | LCD_PCLK_EDGE_FALL, +}; + +/****************************************************************************** + * Power management - standby + ******************************************************************************/ +static void __init palmgsm_pm_init(void) +{ + static u32 resume[] = { + 0xe3a00101, /* mov r0, #0x40000000 */ + 0xe380060f, /* orr r0, r0, #0x00f00000 */ + 0xe590f008, /* ldr pc, [r0, #0x08] */ + }; + + /* this is where the bootloader jumps */ + memcpy(phys_to_virt(PALMGSM_STR_BASE), resume, sizeof(resume)); +} + +/****************************************************************************** + * Machine init + ******************************************************************************/ +static struct platform_device *palmgsm_devices[] __initdata = { + &palmgsm_backlight, + &power_supply, +}; + +#ifdef CONFIG_MACH_TREO680 +static struct platform_device *treo680_devices[] __initdata = { + &treo680_leds, +}; +#endif + +/* setup udc GPIOs initial state */ +static void __init palmgsm_udc_init(void) +{ + if (!gpio_request(GPIO_NR_PALMGSM_USB_PULLUP, "UDC Vbus")) { + gpio_direction_output(GPIO_NR_PALMGSM_USB_PULLUP, 1); + gpio_free(GPIO_NR_PALMGSM_USB_PULLUP); + } +} + +static void __init palmgsm_init(void) +{ + palmgsm_pm_init(); + pxa2xx_mfp_config(ARRAY_AND_SIZE(palmgsm_pin_config)); + set_pxa_fb_info(&palmgsm_lcd_screen); + palmgsm_udc_init(); + pxa_set_udc_info(&palmgsm_udc_info); + pxa_set_ac97_info(&palmgsm_ac97_pdata); + pxa_set_ficp_info(&palmgsm_ficp_info); + + platform_add_devices(ARRAY_AND_SIZE(palmgsm_devices)); +} + +#ifdef CONFIG_MACH_TREO680 +static void __init treo680_init(void) +{ + palmgsm_init(); + pxa2xx_mfp_config(ARRAY_AND_SIZE(treo680_pin_config)); + pxa_set_keypad_info(&treo680_keypad_platform_data); + pxa_set_mci_info(&treo680_mci_platform_data); + pxa_set_ohci_info(&treo680_ohci_info); + platform_add_devices(ARRAY_AND_SIZE(treo680_devices)); +} + +MACHINE_START(TREO680, "Palm Treo 680") + .phys_io = PALMGSM_PHYS_IO_START, + .io_pg_offst = io_p2v(0x40000000), + .boot_params = 0xa0000100, + .map_io = pxa_map_io, + .init_irq = pxa27x_init_irq, + .timer = &pxa_timer, + .init_machine = treo680_init, +MACHINE_END +#endif diff --git a/arch/arm/mach-pxa/treo680.c b/arch/arm/mach-pxa/treo680.c deleted file mode 100644 index d88114c..0000000 --- a/arch/arm/mach-pxa/treo680.c +++ /dev/null @@ -1,528 +0,0 @@ -/* - * Hardware definitions for Palm Treo 680 - * - * Author: Tomas Cech <sleep_walker@suse.cz> - * - * 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. - * - * (find more info at www.hackndev.com) - * - */ - -#include <linux/platform_device.h> -#include <linux/delay.h> -#include <linux/irq.h> -#include <linux/gpio_keys.h> -#include <linux/input.h> -#include <linux/pda_power.h> -#include <linux/pwm_backlight.h> -#include <linux/gpio.h> -#include <linux/wm97xx_batt.h> -#include <linux/power_supply.h> -#include <linux/sysdev.h> -#include <linux/w1-gpio.h> - -#include <asm/mach-types.h> -#include <asm/mach/arch.h> -#include <asm/mach/map.h> - -#include <mach/pxa27x.h> -#include <mach/pxa27x-udc.h> -#include <mach/audio.h> -#include <mach/treo680.h> -#include <mach/mmc.h> -#include <mach/pxafb.h> -#include <mach/irda.h> -#include <mach/pxa27x_keypad.h> -#include <mach/udc.h> -#include <mach/ohci.h> -#include <mach/pxa2xx-regs.h> -#include <mach/palmasoc.h> -#include <mach/camera.h> - -#include <sound/pxa2xx-lib.h> - -#include "generic.h" -#include "devices.h" - -/****************************************************************************** - * Pin configuration - ******************************************************************************/ -static unsigned long treo680_pin_config[] __initdata = { - /* MMC */ - GPIO32_MMC_CLK, - GPIO92_MMC_DAT_0, - GPIO109_MMC_DAT_1, - GPIO110_MMC_DAT_2, - GPIO111_MMC_DAT_3, - GPIO112_MMC_CMD, - GPIO33_GPIO, /* SD read only */ - GPIO113_GPIO, /* SD detect */ - - /* AC97 */ - GPIO28_AC97_BITCLK, - GPIO29_AC97_SDATA_IN_0, - GPIO30_AC97_SDATA_OUT, - GPIO31_AC97_SYNC, - GPIO89_AC97_SYSCLK, - GPIO95_AC97_nRESET, - - /* IrDA */ - GPIO46_FICP_RXD, - GPIO47_FICP_TXD, - - /* PWM */ - GPIO16_PWM0_OUT, - - /* USB */ - GPIO1_GPIO | WAKEUP_ON_EDGE_BOTH, /* usb detect */ - - /* MATRIX KEYPAD */ - GPIO100_KP_MKIN_0 | WAKEUP_ON_LEVEL_HIGH, - GPIO101_KP_MKIN_1, - GPIO102_KP_MKIN_2, - GPIO97_KP_MKIN_3, - GPIO98_KP_MKIN_4, - GPIO99_KP_MKIN_5, - GPIO91_KP_MKIN_6, - GPIO13_KP_MKIN_7, - GPIO103_KP_MKOUT_0 | MFP_LPM_DRIVE_HIGH, - GPIO104_KP_MKOUT_1, - GPIO105_KP_MKOUT_2, - GPIO106_KP_MKOUT_3, - GPIO107_KP_MKOUT_4, - GPIO108_KP_MKOUT_5, - GPIO96_KP_MKOUT_6, - GPIO93_KP_DKIN_0 | WAKEUP_ON_LEVEL_HIGH, /* Hotsync button */ - - /* LCD */ - GPIO58_LCD_LDD_0, - GPIO59_LCD_LDD_1, - GPIO60_LCD_LDD_2, - GPIO61_LCD_LDD_3, - GPIO62_LCD_LDD_4, - GPIO63_LCD_LDD_5, - GPIO64_LCD_LDD_6, - GPIO65_LCD_LDD_7, - GPIO66_LCD_LDD_8, - GPIO67_LCD_LDD_9, - GPIO68_LCD_LDD_10, - GPIO69_LCD_LDD_11, - GPIO70_LCD_LDD_12, - GPIO71_LCD_LDD_13, - GPIO72_LCD_LDD_14, - GPIO73_LCD_LDD_15, - GPIO74_LCD_FCLK, - GPIO75_LCD_LCLK, - GPIO76_LCD_PCLK, - - /* Quick Capture Interface */ - GPIO84_CIF_FV, - GPIO85_CIF_LV, - GPIO53_CIF_MCLK, - GPIO54_CIF_PCLK, - GPIO81_CIF_DD_0, - GPIO55_CIF_DD_1, - GPIO51_CIF_DD_2, - GPIO50_CIF_DD_3, - GPIO52_CIF_DD_4, - GPIO48_CIF_DD_5, - GPIO17_CIF_DD_6, - GPIO12_CIF_DD_7, - - /* I2C */ - GPIO117_I2C_SCL, - GPIO118_I2C_SDA, - - /* GSM */ - GPIO14_GPIO | WAKEUP_ON_EDGE_BOTH, /* GSM host wake up */ - GPIO34_FFUART_RXD, - GPIO35_FFUART_CTS, - GPIO39_FFUART_TXD, - GPIO41_FFUART_RTS, - - /* MISC. */ - GPIO0_GPIO | WAKEUP_ON_EDGE_BOTH, /* external power detect */ - GPIO15_GPIO | WAKEUP_ON_EDGE_BOTH, /* silent switch */ - GPIO116_GPIO, /* headphone detect */ - GPIO11_GPIO | WAKEUP_ON_EDGE_BOTH, /* bluetooth host wake up */ -}; - -/****************************************************************************** - * SD/MMC card controller - ******************************************************************************/ -static struct pxamci_platform_data treo680_mci_platform_data = { - .ocr_mask = MMC_VDD_32_33 | MMC_VDD_33_34, - .gpio_card_detect = GPIO_NR_TREO680_SD_DETECT_N, - .gpio_card_ro = GPIO_NR_TREO680_SD_READONLY, - .gpio_power = GPIO_NR_TREO680_SD_POWER, -}; - -/****************************************************************************** - * GPIO keyboard - ******************************************************************************/ -static unsigned int treo680_matrix_keys[] = { - KEY(0, 0, KEY_F8), /* Red/Off/Power */ - KEY(0, 1, KEY_LEFT), - KEY(0, 2, KEY_LEFTCTRL), /* Alternate */ - KEY(0, 3, KEY_L), - KEY(0, 4, KEY_A), - KEY(0, 5, KEY_Q), - KEY(0, 6, KEY_P), - - KEY(1, 0, KEY_RIGHTCTRL), /* Menu */ - KEY(1, 1, KEY_RIGHT), - KEY(1, 2, KEY_LEFTSHIFT), /* Left shift */ - KEY(1, 3, KEY_Z), - KEY(1, 4, KEY_S), - KEY(1, 5, KEY_W), - - KEY(2, 0, KEY_F1), /* Phone */ - KEY(2, 1, KEY_UP), - KEY(2, 2, KEY_0), - KEY(2, 3, KEY_X), - KEY(2, 4, KEY_D), - KEY(2, 5, KEY_E), - - KEY(3, 0, KEY_F10), /* Calendar */ - KEY(3, 1, KEY_DOWN), - KEY(3, 2, KEY_SPACE), - KEY(3, 3, KEY_C), - KEY(3, 4, KEY_F), - KEY(3, 5, KEY_R), - - KEY(4, 0, KEY_F12), /* Mail */ - KEY(4, 1, KEY_KPENTER), - KEY(4, 2, KEY_RIGHTALT), /* Alt */ - KEY(4, 3, KEY_V), - KEY(4, 4, KEY_G), - KEY(4, 5, KEY_T), - - KEY(5, 0, KEY_F9), /* Home */ - KEY(5, 1, KEY_PAGEUP), /* Side up */ - KEY(5, 2, KEY_DOT), - KEY(5, 3, KEY_B), - KEY(5, 4, KEY_H), - KEY(5, 5, KEY_Y), - - KEY(6, 0, KEY_TAB), /* Side Activate */ - KEY(6, 1, KEY_PAGEDOWN), /* Side down */ - KEY(6, 2, KEY_ENTER), - KEY(6, 3, KEY_N), - KEY(6, 4, KEY_J), - KEY(6, 5, KEY_U), - - KEY(7, 0, KEY_F6), /* Green/Call */ - KEY(7, 1, KEY_O), - KEY(7, 2, KEY_BACKSPACE), - KEY(7, 3, KEY_M), - KEY(7, 4, KEY_K), - KEY(7, 5, KEY_I), -}; - -static struct pxa27x_keypad_platform_data treo680_keypad_platform_data = { - .matrix_key_rows = 8, - .matrix_key_cols = 7, - .matrix_key_map = treo680_matrix_keys, - .matrix_key_map_size = ARRAY_SIZE(treo680_matrix_keys), - .direct_key_map = { KEY_CONNECT }, - .direct_key_num = 1, - - .debounce_interval = 30, -}; - -/****************************************************************************** - * aSoC audio - ******************************************************************************/ - -static pxa2xx_audio_ops_t treo680_ac97_pdata = { - .reset_gpio = 95, -}; - -/****************************************************************************** - * Backlight - ******************************************************************************/ -static int treo680_backlight_init(struct device *dev) -{ - int ret; - - ret = gpio_request(GPIO_NR_TREO680_BL_POWER, "BL POWER"); - if (ret) - goto err; - ret = gpio_direction_output(GPIO_NR_TREO680_BL_POWER, 0); - if (ret) - goto err2; - - return 0; - -err2: - gpio_free(GPIO_NR_TREO680_BL_POWER); -err: - return ret; -} - -static int treo680_backlight_notify(int brightness) -{ - gpio_set_value(GPIO_NR_TREO680_BL_POWER, brightness); - return TREO680_MAX_INTENSITY - brightness; -}; - -static void treo680_backlight_exit(struct device *dev) -{ - gpio_free(GPIO_NR_TREO680_BL_POWER); -} - -static struct platform_pwm_backlight_data treo680_backlight_data = { - .pwm_id = 0, - .max_brightness = TREO680_MAX_INTENSITY, - .dft_brightness = TREO680_DEFAULT_INTENSITY, - .pwm_period_ns = TREO680_PERIOD_NS, - .init = treo680_backlight_init, - .notify = treo680_backlight_notify, - .exit = treo680_backlight_exit, -}; - -static struct platform_device treo680_backlight = { - .name = "pwm-backlight", - .dev = { - .parent = &pxa27x_device_pwm0.dev, - .platform_data = &treo680_backlight_data, - }, -}; - -/****************************************************************************** - * IrDA - ******************************************************************************/ -static void treo680_transceiver_mode(struct device *dev, int mode) -{ - gpio_set_value(GPIO_NR_TREO680_IR_EN, mode & IR_OFF); - pxa2xx_transceiver_mode(dev, mode); -} - -static int treo680_irda_startup(struct device *dev) -{ - int err; - - err = gpio_request(GPIO_NR_TREO680_IR_EN, "Ir port disable"); - if (err) - goto err1; - - err = gpio_direction_output(GPIO_NR_TREO680_IR_EN, 1); - if (err) - goto err2; - - return 0; - -err2: - dev_err(dev, "treo680_irda: cannot change IR gpio direction\n"); - gpio_free(GPIO_NR_TREO680_IR_EN); -err1: - dev_err(dev, "treo680_irda: cannot allocate IR gpio\n"); - return err; -} - -static void treo680_irda_shutdown(struct device *dev) -{ - gpio_free(GPIO_NR_TREO680_IR_EN); -} - -static struct pxaficp_platform_data treo680_ficp_info = { - .transceiver_cap = IR_FIRMODE | IR_SIRMODE | IR_OFF, - .startup = treo680_irda_startup, - .shutdown = treo680_irda_shutdown, - .transceiver_mode = treo680_transceiver_mode, -}; - -/****************************************************************************** - * UDC - ******************************************************************************/ -static struct pxa2xx_udc_mach_info treo680_udc_info __initdata = { - .gpio_vbus = GPIO_NR_TREO680_USB_DETECT, - .gpio_vbus_inverted = 1, - .gpio_pullup = GPIO_NR_TREO680_USB_PULLUP, -}; - - -/****************************************************************************** - * USB host - ******************************************************************************/ -static struct pxaohci_platform_data treo680_ohci_info = { - .port_mode = PMM_PERPORT_MODE, - .flags = ENABLE_PORT1 | ENABLE_PORT3, - .power_budget = 0, -}; - -/****************************************************************************** - * Power supply - ******************************************************************************/ -static int power_supply_init(struct device *dev) -{ - int ret; - - ret = gpio_request(GPIO_NR_TREO680_POWER_DETECT, "CABLE_STATE_AC"); - if (ret) - goto err1; - ret = gpio_direction_input(GPIO_NR_TREO680_POWER_DETECT); - if (ret) - goto err2; - - return 0; - -err2: - gpio_free(GPIO_NR_TREO680_POWER_DETECT); -err1: - return ret; -} - -static int treo680_is_ac_online(void) -{ - return gpio_get_value(GPIO_NR_TREO680_POWER_DETECT); -} - -static void power_supply_exit(struct device *dev) -{ - gpio_free(GPIO_NR_TREO680_POWER_DETECT); -} - -static char *treo680_supplicants[] = { - "main-battery", -}; - -static struct pda_power_pdata power_supply_info = { - .init = power_supply_init, - .is_ac_online = treo680_is_ac_online, - .exit = power_supply_exit, - .supplied_to = treo680_supplicants, - .num_supplicants = ARRAY_SIZE(treo680_supplicants), -}; - -static struct platform_device power_supply = { - .name = "pda-power", - .id = -1, - .dev = { - .platform_data = &power_supply_info, - }, -}; - -/****************************************************************************** - * Vibra and LEDs - ******************************************************************************/ -static struct gpio_led gpio_leds[] = { - { - .name = "treo680:vibra:vibra", - .default_trigger = "none", - .gpio = GPIO_NR_TREO680_VIBRATE_EN, - }, - { - .name = "treo680:green:led", - .default_trigger = "mmc0", - .gpio = GPIO_NR_TREO680_GREEN_LED, - }, - { - .name = "treo680:keybbl:keybbl", - .default_trigger = "none", - .gpio = GPIO_NR_TREO680_KEYB_BL, - }, -}; - -static struct gpio_led_platform_data gpio_led_info = { - .leds = gpio_leds, - .num_leds = ARRAY_SIZE(gpio_leds), -}; - -static struct platform_device treo680_leds = { - .name = "leds-gpio", - .id = -1, - .dev = { - .platform_data = &gpio_led_info, - } -}; - - -/****************************************************************************** - * Framebuffer - ******************************************************************************/ -/* TODO: add support for 324x324 */ -static struct pxafb_mode_info treo680_lcd_modes[] = { -{ - .pixclock = 86538, - .xres = 320, - .yres = 320, - .bpp = 16, - - .left_margin = 20, - .right_margin = 8, - .upper_margin = 8, - .lower_margin = 5, - - .hsync_len = 4, - .vsync_len = 1, -}, -}; - -static struct pxafb_mach_info treo680_lcd_screen = { - .modes = treo680_lcd_modes, - .num_modes = ARRAY_SIZE(treo680_lcd_modes), - .lcd_conn = LCD_COLOR_TFT_16BPP | LCD_PCLK_EDGE_FALL, -}; - -/****************************************************************************** - * Power management - standby - ******************************************************************************/ -static void __init treo680_pm_init(void) -{ - static u32 resume[] = { - 0xe3a00101, /* mov r0, #0x40000000 */ - 0xe380060f, /* orr r0, r0, #0x00f00000 */ - 0xe590f008, /* ldr pc, [r0, #0x08] */ - }; - - /* this is where the bootloader jumps */ - memcpy(phys_to_virt(TREO680_STR_BASE), resume, sizeof(resume)); -} - -/****************************************************************************** - * Machine init - ******************************************************************************/ -static struct platform_device *devices[] __initdata = { - &treo680_backlight, - &treo680_leds, - &power_supply, -}; - -/* setup udc GPIOs initial state */ -static void __init treo680_udc_init(void) -{ - if (!gpio_request(GPIO_NR_TREO680_USB_PULLUP, "UDC Vbus")) { - gpio_direction_output(GPIO_NR_TREO680_USB_PULLUP, 1); - gpio_free(GPIO_NR_TREO680_USB_PULLUP); - } -} - -static void __init treo680_init(void) -{ - treo680_pm_init(); - pxa2xx_mfp_config(ARRAY_AND_SIZE(treo680_pin_config)); - pxa_set_keypad_info(&treo680_keypad_platform_data); - set_pxa_fb_info(&treo680_lcd_screen); - pxa_set_mci_info(&treo680_mci_platform_data); - treo680_udc_init(); - pxa_set_udc_info(&treo680_udc_info); - pxa_set_ac97_info(&treo680_ac97_pdata); - pxa_set_ficp_info(&treo680_ficp_info); - pxa_set_ohci_info(&treo680_ohci_info); - - platform_add_devices(devices, ARRAY_SIZE(devices)); -} - -MACHINE_START(TREO680, "Palm Treo 680") - .phys_io = TREO680_PHYS_IO_START, - .io_pg_offst = io_p2v(0x40000000), - .boot_params = 0xa0000100, - .map_io = pxa_map_io, - .init_irq = pxa27x_init_irq, - .timer = &pxa_timer, - .init_machine = treo680_init, -MACHINE_END -- 1.6.3.3 ^ permalink raw reply related [flat|nested] 22+ messages in thread
* [PATCH 5/5] PalmGSM: add basic Centro support 2009-08-27 0:43 ` [PATCH 4/5] PalmGSM: generalisation of Treo680 code to PalmGSM Tomáš Čech @ 2009-08-27 0:43 ` Tomáš Čech 2009-08-27 13:35 ` Marek Vasut 2009-08-27 2:31 ` [PATCH 4/5] PalmGSM: generalisation of Treo680 code to PalmGSM Eric Miao 1 sibling, 1 reply; 22+ messages in thread From: Tomáš Čech @ 2009-08-27 0:43 UTC (permalink / raw) To: linux-arm-kernel From: Tom?? ?ech <sleep walker@suse.cz> --- arch/arm/mach-pxa/Kconfig | 11 ++ arch/arm/mach-pxa/include/mach/palmgsm.h | 7 ++ arch/arm/mach-pxa/palmgsm.c | 160 ++++++++++++++++++++++++++++++ arch/arm/mm/mmu.c | 2 +- 4 files changed, 179 insertions(+), 1 deletions(-) diff --git a/arch/arm/mach-pxa/Kconfig b/arch/arm/mach-pxa/Kconfig index 441f1d6..6f0232a 100644 --- a/arch/arm/mach-pxa/Kconfig +++ b/arch/arm/mach-pxa/Kconfig @@ -405,6 +405,17 @@ config PALMGSM depends on ARCH_PXA_PALM bool +config MACH_CENTRO + bool "Palm Centro 685" + default y + depends on ARCH_PXA_PALM + select PXA27x + select IWMMXT + select PALMGSM + help + Say Y here if you intend to run this kernel on Palm Centro 685 + smartphone. + config MACH_TREO680 bool "Palm Treo 680" default y diff --git a/arch/arm/mach-pxa/include/mach/palmgsm.h b/arch/arm/mach-pxa/include/mach/palmgsm.h index 8d1a3bc..6e52946 100644 --- a/arch/arm/mach-pxa/include/mach/palmgsm.h +++ b/arch/arm/mach-pxa/include/mach/palmgsm.h @@ -3,6 +3,7 @@ * * currently supported: * Palm Treo 680 (GSM) + * Palm Centro 685 (GSM) * * Author: Tomas Cech <sleep_walker@suse.cz> * @@ -45,6 +46,12 @@ #define GPIO_NR_TREO680_KEYB_BL 24 #define GPIO_NR_TREO680_BT_EN 43 +/* Centro685 specific GPIOs */ +#define GPIO_NR_CENTRO_SD_POWER 21 +#define GPIO_NR_CENTRO_VIBRATE_EN 22 +#define GPIO_NR_CENTRO_KEYB_BL 33 +#define GPIO_NR_CENTRO_BT_EN 80 + /* Various addresses */ #define PALMGSM_PHYS_RAM_START 0xa0000000 #define PALMGSM_PHYS_IO_START 0x40000000 diff --git a/arch/arm/mach-pxa/palmgsm.c b/arch/arm/mach-pxa/palmgsm.c index 99eb468..90c3a51 100644 --- a/arch/arm/mach-pxa/palmgsm.c +++ b/arch/arm/mach-pxa/palmgsm.c @@ -3,6 +3,7 @@ * * currently supported: * Palm Treo 680 (GSM) + * Palm Centro 685 (GSM) * * Author: Tomas Cech <sleep_walker@suse.cz> * @@ -160,6 +161,21 @@ static unsigned long treo680_pin_config[] __initdata = { }; #endif +#ifdef CONFIG_MACH_CENTRO +static unsigned long centro685_pin_config[] __initdata = { + /* Bluetooth attached to BT UART*/ + MFP_CFG_OUT(GPIO80, AF0, DRIVE_LOW), /* power: LOW = off */ + GPIO42_BTUART_RXD, + GPIO43_BTUART_TXD, + GPIO44_BTUART_CTS, + GPIO45_BTUART_RTS, + + /* MATRIX KEYPAD - different wake up source */ + GPIO100_KP_MKIN_0, + GPIO99_KP_MKIN_5 | WAKEUP_ON_LEVEL_HIGH, +}; +#endif + /****************************************************************************** * SD/MMC card controller ******************************************************************************/ @@ -172,6 +188,15 @@ static struct pxamci_platform_data treo680_mci_platform_data = { }; #endif +#ifdef CONFIG_MACH_CENTRO +static struct pxamci_platform_data centro_mci_platform_data = { + .ocr_mask = MMC_VDD_32_33 | MMC_VDD_33_34, + .gpio_card_detect = GPIO_NR_PALMGSM_SD_DETECT_N, + .gpio_power = GPIO_NR_TREO680_SD_POWER, + .gpio_power_invert = 1, +}; +#endif + /****************************************************************************** * GPIO keyboard ******************************************************************************/ @@ -247,6 +272,78 @@ static struct pxa27x_keypad_platform_data treo680_keypad_platform_data = { }; #endif +#ifdef CONFIG_MACH_CENTRO +static unsigned int centro_matrix_keys[] = { + KEY(0, 0, KEY_F9), /* Home */ + KEY(0, 1, KEY_LEFT), + KEY(0, 2, KEY_LEFTCTRL), /* Alternate */ + KEY(0, 3, KEY_L), + KEY(0, 4, KEY_A), + KEY(0, 5, KEY_Q), + KEY(0, 6, KEY_P), + + KEY(1, 0, KEY_RIGHTCTRL), /* Menu */ + KEY(1, 1, KEY_RIGHT), + KEY(1, 2, KEY_LEFTSHIFT), /* Left shift */ + KEY(1, 3, KEY_Z), + KEY(1, 4, KEY_S), + KEY(1, 5, KEY_W), + + KEY(2, 0, KEY_F1), /* Phone */ + KEY(2, 1, KEY_UP), + KEY(2, 2, KEY_0), + KEY(2, 3, KEY_X), + KEY(2, 4, KEY_D), + KEY(2, 5, KEY_E), + + KEY(3, 0, KEY_F10), /* Calendar */ + KEY(3, 1, KEY_DOWN), + KEY(3, 2, KEY_SPACE), + KEY(3, 3, KEY_C), + KEY(3, 4, KEY_F), + KEY(3, 5, KEY_R), + + KEY(4, 0, KEY_F12), /* Mail */ + KEY(4, 1, KEY_KPENTER), + KEY(4, 2, KEY_RIGHTALT), /* Alt */ + KEY(4, 3, KEY_V), + KEY(4, 4, KEY_G), + KEY(4, 5, KEY_T), + + KEY(5, 0, KEY_F8), /* Red/Off/Power */ + KEY(5, 1, KEY_PAGEUP), /* Side up */ + KEY(5, 2, KEY_DOT), + KEY(5, 3, KEY_B), + KEY(5, 4, KEY_H), + KEY(5, 5, KEY_Y), + + KEY(6, 0, KEY_TAB), /* Side Activate */ + KEY(6, 1, KEY_PAGEDOWN), /* Side down */ + KEY(6, 2, KEY_ENTER), + KEY(6, 3, KEY_N), + KEY(6, 4, KEY_J), + KEY(6, 5, KEY_U), + + KEY(7, 0, KEY_F6), /* Green/Call */ + KEY(7, 1, KEY_O), + KEY(7, 2, KEY_BACKSPACE), + KEY(7, 3, KEY_M), + KEY(7, 4, KEY_K), + KEY(7, 5, KEY_I), +}; + +static struct pxa27x_keypad_platform_data centro_keypad_platform_data = { + .matrix_key_rows = 8, + .matrix_key_cols = 7, + .matrix_key_map = centro_matrix_keys, + .matrix_key_map_size = ARRAY_SIZE(centro_matrix_keys), + .direct_key_map = { KEY_CONNECT }, + .direct_key_num = 1, + + .debounce_interval = 30, +}; +#endif + /****************************************************************************** * aSoC audio ******************************************************************************/ @@ -458,6 +555,40 @@ static struct platform_device treo680_leds = { }; #endif +#ifdef CONFIG_MACH_CENTRO +static struct gpio_led centro_gpio_leds[] = { + { + .name = "centro:vibra:vibra", + .default_trigger = "none", + .gpio = GPIO_NR_CENTRO_VIBRATE_EN, + }, + { + .name = "centro:green:led", + .default_trigger = "mmc0", + .gpio = GPIO_NR_PALMGSM_GREEN_LED, + }, + { + .name = "centro:keybbl:keybbl", + .default_trigger = "none", + .active_low = 1, + .gpio = GPIO_NR_CENTRO_KEYB_BL, + }, +}; + +static struct gpio_led_platform_data centro_gpio_led_info = { + .leds = centro_gpio_leds, + .num_leds = ARRAY_SIZE(centro_gpio_leds), +}; + +static struct platform_device centro_leds = { + .name = "leds-gpio", + .id = -1, + .dev = { + .platform_data = ¢ro_gpio_led_info, + } +}; +#endif + /****************************************************************************** * Framebuffer ******************************************************************************/ @@ -514,6 +645,12 @@ static struct platform_device *treo680_devices[] __initdata = { }; #endif +#ifdef CONFIG_MACH_CENTRO +static struct platform_device *centro_devices[] __initdata = { + ¢ro_leds, +}; +#endif + /* setup udc GPIOs initial state */ static void __init palmgsm_udc_init(void) { @@ -557,3 +694,26 @@ MACHINE_START(TREO680, "Palm Treo 680") .init_machine = treo680_init, MACHINE_END #endif + +#ifdef CONFIG_MACH_CENTRO +static void __init centro_init(void) +{ + palmgsm_init(); + pxa2xx_mfp_config(ARRAY_AND_SIZE(centro685_pin_config)); + pxa_set_mci_info(¢ro_mci_platform_data); + + pxa_set_keypad_info(¢ro_keypad_platform_data); + + platform_add_devices(ARRAY_AND_SIZE(centro_devices)); + } + +MACHINE_START(CENTRO, "Palm Centro 685") + .phys_io = PALMGSM_PHYS_IO_START, + .io_pg_offst = io_p2v(0x40000000), + .boot_params = 0xa0000100, + .map_io = pxa_map_io, + .init_irq = pxa27x_init_irq, + .timer = &pxa_timer, + .init_machine = centro_init, +MACHINE_END +#endif diff --git a/arch/arm/mm/mmu.c b/arch/arm/mm/mmu.c index 4722582..4f51395 100644 --- a/arch/arm/mm/mmu.c +++ b/arch/arm/mm/mmu.c @@ -836,7 +836,7 @@ void __init reserve_node_zero(pg_data_t *pgdat) BOOTMEM_EXCLUSIVE); } - if (machine_is_treo680()) { + if (machine_is_treo680() || machine_is_centro()) { reserve_bootmem_node(pgdat, 0xa0000000, 0x1000, BOOTMEM_EXCLUSIVE); reserve_bootmem_node(pgdat, 0xa2000000, 0x1000, -- 1.6.3.3 ^ permalink raw reply related [flat|nested] 22+ messages in thread
* [PATCH 5/5] PalmGSM: add basic Centro support 2009-08-27 0:43 ` [PATCH 5/5] PalmGSM: add basic Centro support Tomáš Čech @ 2009-08-27 13:35 ` Marek Vasut 2009-08-28 20:18 ` Tomáš 'Sleep_Walker' Čech 0 siblings, 1 reply; 22+ messages in thread From: Marek Vasut @ 2009-08-27 13:35 UTC (permalink / raw) To: linux-arm-kernel Dne ?t 27. srpna 2009 02:43:31 Tom?? ?ech napsal(a): > From: Tom?? ?ech <sleep walker@suse.cz> > > --- ... > + { > + .name = "centro:green:led", > + .default_trigger = "mmc0", > + .gpio = GPIO_NR_PALMGSM_GREEN_LED, > + }, > + { > + .name = "centro:keybbl:keybbl", Should be 'centro:white:keybbl' I think...see Documentation/leds-class.txt > + .default_trigger = "none", > + .active_low = 1, > + .gpio = GPIO_NR_CENTRO_KEYB_BL, > + }, And there is also that red led on the device, does it work already too? > +}; > + > +static struct gpio_led_platform_data centro_gpio_led_info = { > + .leds = centro_gpio_leds, > + .num_leds = ARRAY_SIZE(centro_gpio_leds), > +}; ... ^ permalink raw reply [flat|nested] 22+ messages in thread
* [PATCH 5/5] PalmGSM: add basic Centro support 2009-08-27 13:35 ` Marek Vasut @ 2009-08-28 20:18 ` Tomáš 'Sleep_Walker' Čech 0 siblings, 0 replies; 22+ messages in thread From: Tomáš 'Sleep_Walker' Čech @ 2009-08-28 20:18 UTC (permalink / raw) To: linux-arm-kernel Hi, Dne ?t 27. srpna 2009 15:35:37 Marek Vasut napsal(a): > Dne ?t 27. srpna 2009 02:43:31 Tom?? ?ech napsal(a): > > From: Tom?? ?ech <sleep walker@suse.cz> > > > > --- > ... > > + { > > + .name = "centro:green:led", > > + .default_trigger = "mmc0", > > + .gpio = GPIO_NR_PALMGSM_GREEN_LED, > > + }, > > + { > > + .name = "centro:keybbl:keybbl", > > Should be 'centro:white:keybbl' I think...see Documentation/leds-class.txt I read it and I created the name accordingly, but if you don't accept this name, I would ommit color (centro::keybbl) - its color is white, but the buttons are light grey, dark grey and blue :) I don't care much about that... > > + .default_trigger = "none", > > + .active_low = 1, > > + .gpio = GPIO_NR_CENTRO_KEYB_BL, > > + }, > > And there is also that red led on the device, does it work already too? It seems that red led is out of my control now - it seems to be attached to GSM chip. It can be turned off only when power source is unplugged and GSM chip is powered down now. This is to be found. Best regards, Tomas Cech ^ permalink raw reply [flat|nested] 22+ messages in thread
* [PATCH 4/5] PalmGSM: generalisation of Treo680 code to PalmGSM 2009-08-27 0:43 ` [PATCH 4/5] PalmGSM: generalisation of Treo680 code to PalmGSM Tomáš Čech 2009-08-27 0:43 ` [PATCH 5/5] PalmGSM: add basic Centro support Tomáš Čech @ 2009-08-27 2:31 ` Eric Miao 2009-08-28 20:13 ` Tomáš 'Sleep_Walker' Čech 1 sibling, 1 reply; 22+ messages in thread From: Eric Miao @ 2009-08-27 2:31 UTC (permalink / raw) To: linux-arm-kernel On Thu, 27 Aug 2009, Tom?? ?ech wrote: > From: Tom?? ?ech <sleep walker@suse.cz> > > --- > arch/arm/mach-pxa/Kconfig | 5 + > arch/arm/mach-pxa/Makefile | 2 +- > arch/arm/mach-pxa/include/mach/palmgsm.h | 60 ++++ > arch/arm/mach-pxa/include/mach/treo680.h | 49 --- > arch/arm/mach-pxa/palmgsm.c | 559 ++++++++++++++++++++++++++++++ > arch/arm/mach-pxa/treo680.c | 528 ---------------------------- I don't actually care too much about the naming - as long as 685 can stay within treo680.c, I don't see any problem with that. The real question is: is palmgsm.c the proper name for all these devices? And you may want to try the switch '-M' in 'git format-patch' or 'git diff'. ^ permalink raw reply [flat|nested] 22+ messages in thread
* [PATCH 4/5] PalmGSM: generalisation of Treo680 code to PalmGSM 2009-08-27 2:31 ` [PATCH 4/5] PalmGSM: generalisation of Treo680 code to PalmGSM Eric Miao @ 2009-08-28 20:13 ` Tomáš 'Sleep_Walker' Čech 2009-08-31 10:43 ` Pavel Machek 0 siblings, 1 reply; 22+ messages in thread From: Tomáš 'Sleep_Walker' Čech @ 2009-08-28 20:13 UTC (permalink / raw) To: linux-arm-kernel Hi, Dne ?t 27. srpna 2009 04:31:42 Eric Miao napsal(a): > > On Thu, 27 Aug 2009, Tom?? ?ech wrote: > > > From: Tom?? ?ech <sleep walker@suse.cz> > > > > --- > > arch/arm/mach-pxa/Kconfig | 5 + > > arch/arm/mach-pxa/Makefile | 2 +- > > arch/arm/mach-pxa/include/mach/palmgsm.h | 60 ++++ > > arch/arm/mach-pxa/include/mach/treo680.h | 49 --- > > arch/arm/mach-pxa/palmgsm.c | 559 ++++++++++++++++++++++++++++++ > > arch/arm/mach-pxa/treo680.c | 528 ---------------------------- > > I don't actually care too much about the naming - as long as 685 can stay > within treo680.c, I don't see any problem with that. The real question is: > is palmgsm.c the proper name for all these devices? Well, actually your completely right. PalmGSM is not fitting for all devices to come, more fitting would be something like Palm smartphones because there are CDMA devices to come too. On the other hand, this name is the best I found so far. If you don't mind I would even so... > And you may want to try the switch '-M' in 'git format-patch' or 'git > diff'. Ah, right, thanks. Best regards, Tomas Cech ^ permalink raw reply [flat|nested] 22+ messages in thread
* [PATCH 4/5] PalmGSM: generalisation of Treo680 code to PalmGSM 2009-08-28 20:13 ` Tomáš 'Sleep_Walker' Čech @ 2009-08-31 10:43 ` Pavel Machek 2009-08-31 11:06 ` Tomáš 'Sleep_Walker' Čech 0 siblings, 1 reply; 22+ messages in thread From: Pavel Machek @ 2009-08-31 10:43 UTC (permalink / raw) To: linux-arm-kernel On Fri 2009-08-28 22:13:40, Tom???? 'Sleep_Walker' ??ech wrote: > Hi, > > Dne ??t 27. srpna 2009 04:31:42 Eric Miao napsal(a): > > > > On Thu, 27 Aug 2009, Tom???? ??ech wrote: > > > > > From: Tom???? ??ech <sleep walker@suse.cz> > > > > > > --- > > > arch/arm/mach-pxa/Kconfig | 5 + > > > arch/arm/mach-pxa/Makefile | 2 +- > > > arch/arm/mach-pxa/include/mach/palmgsm.h | 60 ++++ > > > arch/arm/mach-pxa/include/mach/treo680.h | 49 --- > > > arch/arm/mach-pxa/palmgsm.c | 559 ++++++++++++++++++++++++++++++ > > > arch/arm/mach-pxa/treo680.c | 528 ---------------------------- > > > > I don't actually care too much about the naming - as long as 685 can stay > > within treo680.c, I don't see any problem with that. The real question is: > > is palmgsm.c the proper name for all these devices? > > Well, actually your completely right. PalmGSM is not fitting for all devices to come, more fitting would be something like Palm smartphones because there are CDMA devices to come too. On the other hand, this name is the best I found so far. If you don't mind I would even so... > I believe treo680 was better name then. Don't change it if you don't need to... -- (english) http://www.livejournal.com/~pavelmachek (cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html ^ permalink raw reply [flat|nested] 22+ messages in thread
* [PATCH 4/5] PalmGSM: generalisation of Treo680 code to PalmGSM 2009-08-31 10:43 ` Pavel Machek @ 2009-08-31 11:06 ` Tomáš 'Sleep_Walker' Čech 2009-09-01 0:07 ` Pavel Machek 0 siblings, 1 reply; 22+ messages in thread From: Tomáš 'Sleep_Walker' Čech @ 2009-08-31 11:06 UTC (permalink / raw) To: linux-arm-kernel Hi! Dne Po 31. srpna 2009 12:43:50 Pavel Machek napsal(a): > On Fri 2009-08-28 22:13:40, Tom???? 'Sleep_Walker' ??ech wrote: > > Hi, > > > > Dne ??t 27. srpna 2009 04:31:42 Eric Miao napsal(a): > > > > > > On Thu, 27 Aug 2009, Tom???? ??ech wrote: > > > > > > > From: Tom???? ??ech <sleep walker@suse.cz> > > > > > > > > --- > > > > arch/arm/mach-pxa/Kconfig | 5 + > > > > arch/arm/mach-pxa/Makefile | 2 +- > > > > arch/arm/mach-pxa/include/mach/palmgsm.h | 60 ++++ > > > > arch/arm/mach-pxa/include/mach/treo680.h | 49 --- > > > > arch/arm/mach-pxa/palmgsm.c | 559 ++++++++++++++++++++++++++++++ > > > > arch/arm/mach-pxa/treo680.c | 528 ---------------------------- > > > > > > I don't actually care too much about the naming - as long as 685 can stay > > > within treo680.c, I don't see any problem with that. The real question is: > > > is palmgsm.c the proper name for all these devices? > > > > Well, actually your completely right. PalmGSM is not fitting for all devices to come, more fitting would be something like Palm smartphones because there are CDMA devices to come too. On the other hand, this name is the best I found so far. If you don't mind I would even so... > > > > I believe treo680 was better name then. Don't change it if you don't > need to... But I need to have different generic name - treo680 will be occupied by Treo680 specific stuff, which makes more sense, doesn't it? Best regards, Tomas Cech ^ permalink raw reply [flat|nested] 22+ messages in thread
* [PATCH 4/5] PalmGSM: generalisation of Treo680 code to PalmGSM 2009-08-31 11:06 ` Tomáš 'Sleep_Walker' Čech @ 2009-09-01 0:07 ` Pavel Machek 2009-09-01 1:22 ` Marek Vasut 2009-09-01 10:56 ` Tomáš 'Sleep_Walker' Čech 0 siblings, 2 replies; 22+ messages in thread From: Pavel Machek @ 2009-09-01 0:07 UTC (permalink / raw) To: linux-arm-kernel Ahoj! / Hi! > > > > > arch/arm/mach-pxa/Kconfig | 5 + > > > > > arch/arm/mach-pxa/Makefile | 2 +- > > > > > arch/arm/mach-pxa/include/mach/palmgsm.h | 60 ++++ > > > > > arch/arm/mach-pxa/include/mach/treo680.h | 49 --- > > > > > arch/arm/mach-pxa/palmgsm.c | 559 ++++++++++++++++++++++++++++++ > > > > > arch/arm/mach-pxa/treo680.c | 528 ---------------------------- > > > > > > > > I don't actually care too much about the naming - as long as 685 can stay > > > > within treo680.c, I don't see any problem with that. The real question is: > > > > is palmgsm.c the proper name for all these devices? > > > > > > Well, actually your completely right. PalmGSM is not fitting for all devices to come, more fitting would be something like Palm smartphones because there are CDMA devices to come too. On the other hand, this name is the best I found so far. If you don't mind I would even so... > > > > > > > I believe treo680 was better name then. Don't change it if you don't > > need to... > > But I need to have different generic name - treo680 will be occupied by Treo680 specific stuff, which makes more sense, doesn't it? > And rename generic code to treo.c? Then you could have treo.c for generic code, and treo680.c / treo685.c for specific models... palmgsm.c sounds like driver for their GSM chip... Pavel -- (english) http://www.livejournal.com/~pavelmachek (cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html ^ permalink raw reply [flat|nested] 22+ messages in thread
* [PATCH 4/5] PalmGSM: generalisation of Treo680 code to PalmGSM 2009-09-01 0:07 ` Pavel Machek @ 2009-09-01 1:22 ` Marek Vasut 2009-09-01 9:39 ` Eric Miao 2009-09-01 10:56 ` Tomáš 'Sleep_Walker' Čech 1 sibling, 1 reply; 22+ messages in thread From: Marek Vasut @ 2009-09-01 1:22 UTC (permalink / raw) To: linux-arm-kernel Dne ?t 1. z??? 2009 02:07:16 Pavel Machek napsal(a): > Ahoj! / Hi! Ahoj! / Hi! / Guten Tag! > > > > > > > arch/arm/mach-pxa/Kconfig | 5 + > > > > > > arch/arm/mach-pxa/Makefile | 2 +- > > > > > > arch/arm/mach-pxa/include/mach/palmgsm.h | 60 ++++ > > > > > > arch/arm/mach-pxa/include/mach/treo680.h | 49 --- > > > > > > arch/arm/mach-pxa/palmgsm.c | 559 > > > > > > ++++++++++++++++++++++++++++++ arch/arm/mach-pxa/treo680.c > > > > > > | 528 ---------------------------- > > > > > > > > > > I don't actually care too much about the naming - as long as 685 > > > > > can stay within treo680.c, I don't see any problem with that. The > > > > > real question is: is palmgsm.c the proper name for all these > > > > > devices? > > > > > > > > Well, actually your completely right. PalmGSM is not fitting for all > > > > devices to come, more fitting would be something like Palm > > > > smartphones because there are CDMA devices to come too. On the other > > > > hand, this name is the best I found so far. If you don't mind I would > > > > even so... > > > > > > I believe treo680 was better name then. Don't change it if you don't > > > need to... > > > > But I need to have different generic name - treo680 will be occupied by > > Treo680 specific stuff, which makes more sense, doesn't it? > > And rename generic code to treo.c? Then you could have treo.c for > generic code, and treo680.c / treo685.c for specific models... > > palmgsm.c sounds like driver for their GSM chip... > Pavel Yeah, or treo-common.c in case you'd want to split it into core file + model files. But treo.c/palm(smart)phone.c (?) seems more ok. I dont like the idea of splitting the code into more files (one big, and many small). Cheers! >From bogus@does.not.exist.com Mon Aug 24 09:56:15 2009 From: bogus@does.not.exist.com () Date: Mon, 24 Aug 2009 13:56:15 -0000 Subject: No subject Message-ID: <mailman.11.1253521360.2253.linux-arm-kernel@lists.infradead.org> on other things, by the api. Are there? I would guess there is something to do about the '.config' switch and two or three make files. Or am I wrong here and it's more complicated than it looks to me? > It's nice, but programming (and debugging) the RISC coprocessor it > self will not be easy, the code that implements the "scripts" for > each channel is provided by freescale as a byte array (see > arch/arm/mach-mx3/sdma_script_code_xxx.h) with not much documentation > other than the iMX31 reference manual. By the way, freescale answered to my request for that "API document=20 MOT-SFS-IAPI-SAS-001 (Version 0.4)":=20 > this information is regarding as confidential [...] > One will have to sign NDA agreement with Freescale. I didn't get why they are doing it, but that might be the reason this api is not included in the mainline/denx kernel. Thanks again and I will have a closer look on porting that api :-) Cheers Rene Rene Wolf LFK-Lenkflugk=F6rpersysteme GmbH Human Resources Operations & Policy, HRO Landshuter Stra=DFe 26, 85716 Unterschlei=DFheim, GERMANY Phone: +49 89 3179 8337 Fax: +49 8252 99 8964 E-Mail: rene.wolf at mbda-systems.de http://www.mbda.net <http://www.mbda.net/>=20 Chairman of the Supervisory Board: Antoine Bouvier Managing Director: Werner Kaltenegger Registered Office: Schrobenhausen Commercial Register: Amtsgericht Ingolstadt, HRB 4365=20 >From bogus@does.not.exist.com Mon Aug 24 09:56:15 2009 From: bogus@does.not.exist.com () Date: Mon, 24 Aug 2009 13:56:15 -0000 Subject: No subject Message-ID: <mailman.13.1253734826.2253.linux-arm-kernel@lists.infradead.org> image, reboots and then users get a rescue system trough ssh. From this point, the user can flash a new kernel and initrd which will ignore the 'root=...' the kernel argument. All theses steps are done without serial console. Due to this wrong memory size setting, this can't be done on ss4000e. One has to find a serial cable (not always easy) and then not forget to every time add the 'mem=...' stuff. Moreover, it's more fool proof. A rescue with memory limited to 256M will always work. I hope this will help you to ack or nack the patch. Thanks, Arnaud >From bogus@does.not.exist.com Mon Aug 24 09:56:15 2009 From: bogus@does.not.exist.com () Date: Mon, 24 Aug 2009 13:56:15 -0000 Subject: [PATCH] pxa: extend gpio pins from 128 to 256<br><br>GPIO pins exc= Message-ID: <mailman.16.1253875196.2253.linux-arm-kernel@lists.infradead.org> eeds 128 pins. So extend the maximum GPIO pins to 256.<br>And extend MFP pi= ns also.<br><br>Signed-off-by: Haojian Zhuang <<a href=3D"mailto:haojian= .zhuang@marvell.com">haojian.zhuang at marvell.com</a>><br> ---<br>=A0arch/arm/mach-pxa/include/mach/gpio.h |=A0=A0=A0 2 +-<br>=A0arch/= arm/mach-pxa/include/mach/irqs.h |=A0=A0=A0 2 +-<br>=A0arch/arm/mach-pxa/mf= p-pxa2xx.c=A0=A0=A0=A0=A0=A0=A0 |=A0=A0=A0 6 +++---<br>=A0arch/arm/mach-pxa= /pxa3xx.c=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 |=A0=A0=A0 2 +-<br>=A0arch/arm/p= lat-pxa/include/plat/mfp.h=A0 |=A0=A0=A0 2 +-<br> =A05 files changed, 7 insertions(+), 7 deletions(-)<br><br>diff --git a/arc= h/arm/mach-pxa/include/mach/gpio.h b/arch/arm/mach-pxa/include/mach/gpio.h<= br>index b024a8b..0cd683c 100644<br>--- a/arch/arm/mach-pxa/include/mach/gp= io.h<br> +++ b/arch/arm/mach-pxa/include/mach/gpio.h<br>@@ -99,7 +99,7 @@<br>=A0#def= ine GAFR(x)=A0=A0=A0 =A0=A0=A0 GPIO_REG(0x54 + (((x) & 0x70) >> 2= ))<br>=A0<br>=A0<br>-#define NR_BUILTIN_GPIO 128<br>+#define NR_BUILTIN_GPI= O 256<br>=A0<br> =A0#define gpio_to_bank(gpio)=A0=A0=A0 ((gpio) >> 5)<br>=A0#define gp= io_to_irq(gpio)=A0=A0=A0 IRQ_GPIO(gpio)<br>diff --git a/arch/arm/mach-pxa/i= nclude/mach/irqs.h b/arch/arm/mach-pxa/include/mach/irqs.h<br>index 3677a9a= ..9565b0f 100644<br> --- a/arch/arm/mach-pxa/include/mach/irqs.h<br>+++ b/arch/arm/mach-pxa/incl= ude/mach/irqs.h<br>@@ -106,7 +106,7 @@<br>=A0#endif<br>=A0<br>=A0#define PX= A_GPIO_IRQ_BASE=A0=A0=A0 PXA_IRQ(96)<br>-#define PXA_GPIO_IRQ_NUM=A0=A0=A0 = (192)<br>+#define PXA_GPIO_IRQ_NUM=A0=A0=A0 (256)<br> =A0<br>=A0#define GPIO_2_x_TO_IRQ(x)=A0=A0=A0 (PXA_GPIO_IRQ_BASE + (x))<br>= =A0#define IRQ_GPIO(x)=A0=A0=A0 (((x) < 2) ? (IRQ_GPIO0 + (x)) : GPIO_2_= x_TO_IRQ(x))<br>diff --git a/arch/arm/mach-pxa/mfp-pxa2xx.c b/arch/arm/mach= -pxa/mfp-pxa2xx.c<br> index cf6b720..767db92 100644<br>--- a/arch/arm/mach-pxa/mfp-pxa2xx.c<br>++= + b/arch/arm/mach-pxa/mfp-pxa2xx.c<br>@@ -41,7 +41,7 @@ struct gpio_desc {<= br>=A0=A0=A0=A0 unsigned long=A0=A0=A0 config;<br>=A0};<br>=A0<br>-static s= truct gpio_desc gpio_desc[MFP_PIN_GPIO127 + 1];<br> +static struct gpio_desc gpio_desc[MFP_PIN_GPIO255 + 1];<br>=A0<br>=A0stati= c unsigned long gpdr_lpm[4];<br>=A0<br>@@ -117,7 +117,7 @@ static inline in= t __mfp_validate(int mfp)<br>=A0{<br>=A0=A0=A0=A0 int gpio =3D mfp_to_gpio(= mfp);<br>=A0<br> -=A0=A0=A0 if ((mfp > MFP_PIN_GPIO127) || !gpio_desc[gpio].valid) {<br>+= =A0=A0=A0 if ((mfp > MFP_PIN_GPIO255) || !gpio_desc[gpio].valid) {<br>= =A0=A0=A0=A0 =A0=A0=A0 pr_warning("%s: GPIO%d is invalid pin\n", = __func__, gpio);<br>=A0=A0=A0=A0 =A0=A0=A0 return -1;<br> =A0=A0=A0=A0 }<br>@@ -169,7 +169,7 @@ int gpio_set_wake(unsigned int gpio, = unsigned int on)<br>=A0=A0=A0=A0 struct gpio_desc *d;<br>=A0=A0=A0=A0 unsig= ned long c, mux_taken;<br>=A0<br>-=A0=A0=A0 if (gpio > mfp_to_gpio(MFP_P= IN_GPIO127))<br>+=A0=A0=A0 if (gpio > mfp_to_gpio(MFP_PIN_GPIO255))<br> =A0=A0=A0=A0 =A0=A0=A0 return -EINVAL;<br>=A0<br>=A0=A0=A0=A0 d =3D &gp= io_desc[gpio];<br>diff --git a/arch/arm/mach-pxa/pxa3xx.c b/arch/arm/mach-p= xa/pxa3xx.c<br>index 09b7b1a..7783ac9 100644<br>--- a/arch/arm/mach-pxa/pxa= 3xx.c<br>+++ b/arch/arm/mach-pxa/pxa3xx.c<br> @@ -539,7 +539,7 @@ void __init pxa3xx_init_irq(void)<br>=A0=A0=A0=A0 __asm= __ __volatile__("mcr p15, 0, %0, c15, c1, 0\n": :"r"(va= lue));<br>=A0<br>=A0=A0=A0=A0 pxa_init_irq(56, pxa3xx_set_wake);<br>-=A0=A0= =A0 pxa_init_gpio(IRQ_GPIO_2_x, 2, 127, NULL);<br> +=A0=A0=A0 pxa_init_gpio(IRQ_GPIO_2_x, 2, 255, NULL);<br>=A0}<br>=A0<br>=A0= /*<br>diff --git a/arch/arm/plat-pxa/include/plat/mfp.h b/arch/arm/plat-pxa= /include/plat/mfp.h<br>index 22086e6..857a683 100644<br>--- a/arch/arm/plat= -pxa/include/plat/mfp.h<br> +++ b/arch/arm/plat-pxa/include/plat/mfp.h<br>@@ -16,7 +16,7 @@<br>=A0#ifnd= ef __ASM_PLAT_MFP_H<br>=A0#define __ASM_PLAT_MFP_H<br>=A0<br>-#define mfp_t= o_gpio(m)=A0=A0=A0 ((m) % 128)<br>+#define mfp_to_gpio(m)=A0=A0=A0 ((m) % 2= 56)<br>=A0<br>=A0/* list of all the configurable MFP pins */<br> =A0enum {<br>-- <br>1.5.6.5<br><br> --0016e646114219b34d0474649139-- --0016e646114219b354047464913b Content-Type: text/x-patch; charset=US-ASCII; name="0001-pxa-extend-gpio-pins-from-128-to-256.patch" Content-Disposition: attachment; filename="0001-pxa-extend-gpio-pins-from-128-to-256.patch" Content-Transfer-Encoding: base64 X-Attachment-Id: f_g019snqm0 RnJvbSAzNDE2MjhkOWM0NGQxMjAyODRjZDQ1ZThmYTVhYzliZDRhY2ZlNDY0IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBIYW9qaWFuIFpodWFuZyA8aGFvamlhbi56aHVhbmdAbWFydmVs bC5jb20+CkRhdGU6IEZyaSwgMjUgU2VwIDIwMDkgMTQ6Mjg6MTEgLTA0MDAKU3ViamVjdDogW1BB VENIXSBweGE6IGV4dGVuZCBncGlvIHBpbnMgZnJvbSAxMjggdG8gMjU2CgpHUElPIHBpbnMgZXhj ZWVkcyAxMjggcGlucy4gU28gZXh0ZW5kIHRoZSBtYXhpbXVtIEdQSU8gcGlucyB0byAyNTYuCkFu ZCBleHRlbmQgTUZQIHBpbnMgYWxzby4KClNpZ25lZC1vZmYtYnk6IEhhb2ppYW4gWmh1YW5nIDxo YW9qaWFuLnpodWFuZ0BtYXJ2ZWxsLmNvbT4KLS0tCiBhcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRl L21hY2gvZ3Bpby5oIHwgICAgMiArLQogYXJjaC9hcm0vbWFjaC1weGEvaW5jbHVkZS9tYWNoL2ly cXMuaCB8ICAgIDIgKy0KIGFyY2gvYXJtL21hY2gtcHhhL21mcC1weGEyeHguYyAgICAgICAgfCAg ICA2ICsrKy0tLQogYXJjaC9hcm0vbWFjaC1weGEvcHhhM3h4LmMgICAgICAgICAgICB8ICAgIDIg Ky0KIGFyY2gvYXJtL3BsYXQtcHhhL2luY2x1ZGUvcGxhdC9tZnAuaCAgfCAgICAyICstCiA1IGZp bGVzIGNoYW5nZWQsIDcgaW5zZXJ0aW9ucygrKSwgNyBkZWxldGlvbnMoLSkKCmRpZmYgLS1naXQg YS9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvZ3Bpby5oIGIvYXJjaC9hcm0vbWFjaC1w eGEvaW5jbHVkZS9tYWNoL2dwaW8uaAppbmRleCBiMDI0YThiLi4wY2Q2ODNjIDEwMDY0NAotLS0g YS9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvZ3Bpby5oCisrKyBiL2FyY2gvYXJtL21h Y2gtcHhhL2luY2x1ZGUvbWFjaC9ncGlvLmgKQEAgLTk5LDcgKzk5LDcgQEAKICNkZWZpbmUgR0FG Uih4KQkJR1BJT19SRUcoMHg1NCArICgoKHgpICYgMHg3MCkgPj4gMikpCiAKIAotI2RlZmluZSBO Ul9CVUlMVElOX0dQSU8gMTI4CisjZGVmaW5lIE5SX0JVSUxUSU5fR1BJTyAyNTYKIAogI2RlZmlu ZSBncGlvX3RvX2JhbmsoZ3BpbykJKChncGlvKSA+PiA1KQogI2RlZmluZSBncGlvX3RvX2lycShn cGlvKQlJUlFfR1BJTyhncGlvKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvaW5jbHVk ZS9tYWNoL2lycXMuaCBiL2FyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC9pcnFzLmgKaW5k ZXggMzY3N2E5YS4uOTU2NWIwZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvaW5jbHVk ZS9tYWNoL2lycXMuaAorKysgYi9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvaXJxcy5o CkBAIC0xMDYsNyArMTA2LDcgQEAKICNlbmRpZgogCiAjZGVmaW5lIFBYQV9HUElPX0lSUV9CQVNF CVBYQV9JUlEoOTYpCi0jZGVmaW5lIFBYQV9HUElPX0lSUV9OVU0JKDE5MikKKyNkZWZpbmUgUFhB X0dQSU9fSVJRX05VTQkoMjU2KQogCiAjZGVmaW5lIEdQSU9fMl94X1RPX0lSUSh4KQkoUFhBX0dQ SU9fSVJRX0JBU0UgKyAoeCkpCiAjZGVmaW5lIElSUV9HUElPKHgpCSgoKHgpIDwgMikgPyAoSVJR X0dQSU8wICsgKHgpKSA6IEdQSU9fMl94X1RPX0lSUSh4KSkKZGlmZiAtLWdpdCBhL2FyY2gvYXJt L21hY2gtcHhhL21mcC1weGEyeHguYyBiL2FyY2gvYXJtL21hY2gtcHhhL21mcC1weGEyeHguYwpp bmRleCBjZjZiNzIwLi43NjdkYjkyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9tZnAt cHhhMnh4LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvbWZwLXB4YTJ4eC5jCkBAIC00MSw3ICs0 MSw3IEBAIHN0cnVjdCBncGlvX2Rlc2MgewogCXVuc2lnbmVkIGxvbmcJY29uZmlnOwogfTsKIAot c3RhdGljIHN0cnVjdCBncGlvX2Rlc2MgZ3Bpb19kZXNjW01GUF9QSU5fR1BJTzEyNyArIDFdOwor c3RhdGljIHN0cnVjdCBncGlvX2Rlc2MgZ3Bpb19kZXNjW01GUF9QSU5fR1BJTzI1NSArIDFdOwog CiBzdGF0aWMgdW5zaWduZWQgbG9uZyBncGRyX2xwbVs0XTsKIApAQCAtMTE3LDcgKzExNyw3IEBA IHN0YXRpYyBpbmxpbmUgaW50IF9fbWZwX3ZhbGlkYXRlKGludCBtZnApCiB7CiAJaW50IGdwaW8g PSBtZnBfdG9fZ3BpbyhtZnApOwogCi0JaWYgKChtZnAgPiBNRlBfUElOX0dQSU8xMjcpIHx8ICFn cGlvX2Rlc2NbZ3Bpb10udmFsaWQpIHsKKwlpZiAoKG1mcCA+IE1GUF9QSU5fR1BJTzI1NSkgfHwg IWdwaW9fZGVzY1tncGlvXS52YWxpZCkgewogCQlwcl93YXJuaW5nKCIlczogR1BJTyVkIGlzIGlu dmFsaWQgcGluXG4iLCBfX2Z1bmNfXywgZ3Bpbyk7CiAJCXJldHVybiAtMTsKIAl9CkBAIC0xNjks NyArMTY5LDcgQEAgaW50IGdwaW9fc2V0X3dha2UodW5zaWduZWQgaW50IGdwaW8sIHVuc2lnbmVk IGludCBvbikKIAlzdHJ1Y3QgZ3Bpb19kZXNjICpkOwogCXVuc2lnbmVkIGxvbmcgYywgbXV4X3Rh a2VuOwogCi0JaWYgKGdwaW8gPiBtZnBfdG9fZ3BpbyhNRlBfUElOX0dQSU8xMjcpKQorCWlmIChn cGlvID4gbWZwX3RvX2dwaW8oTUZQX1BJTl9HUElPMjU1KSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAK IAlkID0gJmdwaW9fZGVzY1tncGlvXTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL3B4 YTN4eC5jIGIvYXJjaC9hcm0vbWFjaC1weGEvcHhhM3h4LmMKaW5kZXggMDliN2IxYS4uNzc4M2Fj OSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvcHhhM3h4LmMKKysrIGIvYXJjaC9hcm0v bWFjaC1weGEvcHhhM3h4LmMKQEAgLTUzOSw3ICs1MzksNyBAQCB2b2lkIF9faW5pdCBweGEzeHhf aW5pdF9pcnEodm9pZCkKIAlfX2FzbV9fIF9fdm9sYXRpbGVfXygibWNyIHAxNSwgMCwgJTAsIGMx NSwgYzEsIDBcbiI6IDoiciIodmFsdWUpKTsKIAogCXB4YV9pbml0X2lycSg1NiwgcHhhM3h4X3Nl dF93YWtlKTsKLQlweGFfaW5pdF9ncGlvKElSUV9HUElPXzJfeCwgMiwgMTI3LCBOVUxMKTsKKwlw eGFfaW5pdF9ncGlvKElSUV9HUElPXzJfeCwgMiwgMjU1LCBOVUxMKTsKIH0KIAogLyoKZGlmZiAt LWdpdCBhL2FyY2gvYXJtL3BsYXQtcHhhL2luY2x1ZGUvcGxhdC9tZnAuaCBiL2FyY2gvYXJtL3Bs YXQtcHhhL2luY2x1ZGUvcGxhdC9tZnAuaAppbmRleCAyMjA4NmU2Li44NTdhNjgzIDEwMDY0NAot LS0gYS9hcmNoL2FybS9wbGF0LXB4YS9pbmNsdWRlL3BsYXQvbWZwLmgKKysrIGIvYXJjaC9hcm0v cGxhdC1weGEvaW5jbHVkZS9wbGF0L21mcC5oCkBAIC0xNiw3ICsxNiw3IEBACiAjaWZuZGVmIF9f QVNNX1BMQVRfTUZQX0gKICNkZWZpbmUgX19BU01fUExBVF9NRlBfSAogCi0jZGVmaW5lIG1mcF90 b19ncGlvKG0pCSgobSkgJSAxMjgpCisjZGVmaW5lIG1mcF90b19ncGlvKG0pCSgobSkgJSAyNTYp CiAKIC8qIGxpc3Qgb2YgYWxsIHRoZSBjb25maWd1cmFibGUgTUZQIHBpbnMgKi8KIGVudW0gewot LSAKMS41LjYuNQoK --0016e646114219b354047464913b-- >From bogus@does.not.exist.com Mon Aug 24 09:56:15 2009 From: bogus@does.not.exist.com () Date: Mon, 24 Aug 2009 13:56:15 -0000 Subject: [PATCH] [MTD] [NAND] pxa3xx_nand: enable PXA3xx bad block manageme= Message-ID: <mailman.18.1253879884.2253.linux-arm-kernel@lists.infradead.org> nt<br><br>There's a custom bad block management in PXA3xx series.<br><b= r>This BBM needs to allocate a reserved area at the bottom of NAND chip.<br= > The reserved area should be protected from normal usage. The first block<br= >of NAND is also reserved in order to storing the relocation information.<b= r><br>When NAND controller finds a bad block, it marks the block as bad and= <br> allocate a unused block from reserved area in bottom. The new block is<br>u= sed to replace the original bad one. From OS view, there's no bad block= <br>at the time. It's handled by NAND driver. Then driver records the r= eplacement<br> in the first block.<br><br>The reserved area is also called as relocation a= rea. It occupies 2% of<br>the whole NAND space.<br><br>Signed-off-by: Haoji= an Zhuang <<a href=3D"mailto:haojian.zhuang@marvell.com">haojian.zhuang@= marvell.com</a>><br> ---<br>=A0arch/arm/plat-pxa/include/plat/pxa3xx_bbm.h |=A0=A0 62 ++++<br>= =A0drivers/mtd/Kconfig=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0=A0 |=A0=A0=A0 6 +<br>=A0drivers/mtd/Makefile=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 |=A0=A0=A0 1 +<br= >=A0drivers/mtd/nand/pxa3xx_nand.c=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 |= =A0 124 ++++++++<br> =A0drivers/mtd/pxa3xx_bbm.c=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0 |=A0 427 +++++++++++++++++++++++++++<br>=A05 files changed, 620 i= nsertions(+), 0 deletions(-)<br>=A0create mode 100644 arch/arm/plat-pxa/inc= lude/plat/pxa3xx_bbm.h<br>=A0create mode 100644 drivers/mtd/pxa3xx_bbm.c<br= > <br>diff --git a/arch/arm/plat-pxa/include/plat/pxa3xx_bbm.h b/arch/arm/pla= t-pxa/include/plat/pxa3xx_bbm.h<br>new file mode 100644<br>index 0000000..8= 508547<br>--- /dev/null<br>+++ b/arch/arm/plat-pxa/include/plat/pxa3xx_bbm.= h<br> @@ -0,0 +1,62 @@<br>+#ifndef=A0=A0=A0 __PXA3XX_BBT_H__<br>+#define=A0=A0=A0= __PXA3XX_BBT_H__<br>+<br>+#include <linux/types.h><br>+<br>+#define = PXA_RLTABLE_HEADER=A0=A0=A0 =A0=A0=A0 (0x524e)<br>+#define PXA_MAX_RLENTRY= =A0=A0=A0 =A0=A0=A0 =A0=A0=A0 (127)<br> +#define PXA_MAX_SLOT=A0=A0=A0 =A0=A0=A0 =A0=A0=A0 (40)<br>+#define PXA_BEG= IN_SLOT=A0=A0=A0 =A0=A0=A0 =A0=A0=A0 (2)<br>+#define PXA_BBM_MAGIC=A0=A0=A0= =A0=A0=A0 =A0=A0=A0 (0x4c56524d)=A0=A0=A0 /* MRVL */<br>+<br>+enum {<br>+= =A0=A0=A0 PXA3xx_BBM_NAND =3D 0,<br>+=A0=A0=A0 PXA3xx_BBM_ONENAND,<br>+=A0= =A0=A0 PXA3xx_BBM_INVALID =3D -1,<br> +};<br>+<br>+struct relocate_entry {<br>+=A0=A0=A0 unsigned short from;<br>= +=A0=A0=A0 unsigned short to;<br>+};<br>+<br>+struct relocate_table {<br>+= =A0=A0=A0 unsigned short header;<br>+=A0=A0=A0 unsigned short total;<br>+};= <br>+<br>+struct pxa3xx_bbm {<br> +=A0=A0=A0 int=A0=A0=A0 =A0=A0=A0 =A0=A0=A0 magic;<br>+=A0=A0=A0 /*<br>+=A0= =A0=A0 =A0* NOTES: this field impact the partition table. Please make sure<= br>+=A0=A0=A0 =A0* that this value align with partitions definition.<br>+= =A0=A0=A0 =A0*/<br>+=A0=A0=A0 int=A0=A0=A0 =A0=A0=A0 =A0=A0=A0 max_relocate= _entry;<br> +=A0=A0=A0 int=A0=A0=A0 =A0=A0=A0 =A0=A0=A0 max_slots;<br>+=A0=A0=A0 int=A0= =A0=A0 =A0=A0=A0 =A0=A0=A0 current_slot;<br>+<br>+=A0=A0=A0 void=A0=A0=A0 = =A0=A0=A0 =A0=A0=A0 *data_buf;<br>+<br>+=A0=A0=A0 /*<br>+=A0=A0=A0 =A0* The= se two fields should be in (one)nand_chip. Add here to handle<br>+=A0=A0=A0= =A0* onenand_chip and nand_chip at the same time.<br> +=A0=A0=A0 =A0*/<br>+=A0=A0=A0 int=A0=A0=A0 =A0=A0=A0 =A0=A0=A0 page_shift;= <br>+=A0=A0=A0 int=A0=A0=A0 =A0=A0=A0 =A0=A0=A0 erase_shift;<br>+<br>+=A0= =A0=A0 struct relocate_table=A0=A0=A0 *table;<br>+=A0=A0=A0 struct relocate= _entry=A0=A0=A0 *entry;<br>+<br>+=A0=A0=A0 void=A0=A0=A0 (*uninit)(struct m= td_info *mtd);<br> +=A0=A0=A0 loff_t=A0=A0=A0 (*search)(struct mtd_info *mtd,=A0=A0=A0 loff_t = ofs);<br>+=A0=A0=A0 int=A0=A0=A0 (*block_markbad)(struct mtd_info *mtd, int= block);<br>+=A0=A0=A0 int=A0=A0=A0 (*scan_bbt)(struct mtd_info *mtd);<br>+= };<br>+<br>+extern int verify_nand_bbm(struct mtd_info *mtd, struct pxa3xx_= bbm **bbm);<br> +extern int verify_onenand_bbm(struct mtd_info *mtd, struct pxa3xx_bbm **bb= m);<br>+extern int nand_badblockpos(struct mtd_info *mtd);<br>+extern int o= nenand_badblockpos(struct mtd_info *mtd);<br>+extern struct pxa3xx_bbm *pxa= 3xx_query_bbm(void);<br> +#endif<br>+<br>diff --git a/drivers/mtd/Kconfig b/drivers/mtd/Kconfig<br>i= ndex b8e35a0..3cdf7bf 100644<br>--- a/drivers/mtd/Kconfig<br>+++ b/drivers/= mtd/Kconfig<br>@@ -315,6 +315,12 @@ config MTD_OOPS<br>=A0=A0=A0=A0 =A0 To = use, add console=3DttyMTDx to the kernel command line,<br> =A0=A0=A0=A0 =A0 where x is the MTD device number to use.<br>=A0<br>+config= PXA3xx_BBM<br>+=A0=A0=A0 bool "Marvell PXA3xx Bad Block Management&qu= ot;<br>+=A0=A0=A0 depends on MTD && (MTD_NAND || MTD_ONENAND)<br>+= =A0=A0=A0 help<br>+=A0=A0=A0 =A0 This enables Marvell Bad block management = on NAND/ONENAND on PXA3xx.<br> +<br>=A0source "drivers/mtd/chips/Kconfig"<br>=A0<br>=A0source &q= uot;drivers/mtd/maps/Kconfig"<br>diff --git a/drivers/mtd/Makefile b/d= rivers/mtd/Makefile<br>index 82d1e4d..e637fa0 100644<br>--- a/drivers/mtd/M= akefile<br> +++ b/drivers/mtd/Makefile<br>@@ -25,6 +25,7 @@ obj-$(CONFIG_INFTL)=A0=A0= =A0 =A0=A0=A0 +=3D inftl.o<br>=A0obj-$(CONFIG_RFD_FTL)=A0=A0=A0 =A0=A0=A0 += =3D rfd_ftl.o<br>=A0obj-$(CONFIG_SSFDC)=A0=A0=A0 =A0=A0=A0 +=3D ssfdc.o<br>= =A0obj-$(CONFIG_MTD_OOPS)=A0=A0=A0 =A0=A0=A0 +=3D mtdoops.o<br> +obj-$(CONFIG_PXA3xx_BBM)=A0=A0=A0 +=3D pxa3xx_bbm.o<br>=A0<br>=A0nftl-objs= =A0=A0=A0 =A0=A0=A0 :=3D nftlcore.o nftlmount.o<br>=A0inftl-objs=A0=A0=A0 = =A0=A0=A0 :=3D inftlcore.o inftlmount.o<br>diff --git a/drivers/mtd/nand/px= a3xx_nand.c b/drivers/mtd/nand/pxa3xx_nand.c<br> index 134bfbc..d6c9524 100644<br>--- a/drivers/mtd/nand/pxa3xx_nand.c<br>++= + b/drivers/mtd/nand/pxa3xx_nand.c<br>@@ -24,6 +24,10 @@<br>=A0#include <= ;mach/dma.h><br>=A0#include <plat/pxa3xx_nand.h><br>=A0<br>+#ifdef= CONFIG_PXA3xx_BBM<br> +#include <plat/pxa3xx_bbm.h><br>+#endif<br>+<br>=A0#define=A0=A0=A0 = CHIP_DELAY_TIMEOUT=A0=A0=A0 (2 * HZ/10)<br>=A0<br>=A0/* registers and bit d= efinitions */<br>@@ -112,6 +116,14 @@ enum {<br>=A0<br>=A0struct pxa3xx_nan= d_info {<br>=A0=A0=A0=A0 struct nand_chip=A0=A0=A0 nand_chip;<br> +#ifdef CONFIG_PXA3xx_BBM<br>+=A0=A0=A0 /*<br>+=A0=A0=A0 =A0* Restriction: = nand_chip should be the first one of pxa3xx_nand_info.<br>+=A0=A0=A0 =A0* b= bm should be the second one of pxa3xx_nand_info.<br>+=A0=A0=A0 =A0* Marvell= PXA3xx BBM always access this field to get bbm.<br> +=A0=A0=A0 =A0*/<br>+=A0=A0=A0 struct pxa3xx_bbm=A0=A0=A0 *bbm;<br>+#endif<= br>=A0<br>=A0=A0=A0=A0 struct platform_device=A0=A0=A0 =A0*pdev;<br>=A0=A0= =A0=A0 const struct pxa3xx_nand_flash *flash_info;<br>@@ -365,6 +377,8 @@ s= tatic struct pxa3xx_nand_flash *builtin_flash_types[] =3D {<br> =A0/* convert nand flash controller clock cycles to nano-seconds */<br>=A0#= define cycle2ns(c, clk)=A0=A0=A0 ((((c) + 1) * 1000000 + clk / 500) / (clk = / 1000))<br>=A0<br>+static int pxa3xx_nand_relocate_addr(struct mtd_info *m= td, int page_addr);<br> +<br>=A0static void pxa3xx_nand_set_timing(struct pxa3xx_nand_info *info,<b= r>=A0=A0=A0=A0 =A0=A0=A0 =A0=A0=A0 =A0=A0=A0 =A0=A0 const struct pxa3xx_nan= d_timing *t)<br>=A0{<br>@@ -706,6 +720,8 @@ static void pxa3xx_nand_cmdfunc= (struct mtd_info *mtd, unsigned command,<br> =A0<br>=A0=A0=A0=A0 init_completion(&info->cmd_complete);<br>=A0<br>= +=A0=A0=A0 page_addr =3D pxa3xx_nand_relocate_addr(mtd, page_addr);<br>+<br= >=A0=A0=A0=A0 switch (command) {<br>=A0=A0=A0=A0 case NAND_CMD_READOOB:<br>= =A0=A0=A0=A0 =A0=A0=A0 /* disable HW ECC to get all the OOB data */<br> @@ -1165,6 +1181,113 @@ static struct nand_ecclayout hw_largepage_ecclayout= =3D {<br>=A0=A0=A0=A0 .oobfree =3D { {2, 38} }<br>=A0};<br>=A0<br>+#ifdef = CONFIG_PXA3xx_BBM<br>+int verify_nand_bbm(struct mtd_info *mtd, struct pxa3= xx_bbm **bbm)<br> +{<br>+=A0=A0=A0 struct nand_chip *info =3D mtd->priv;<br>+=A0=A0=A0 str= uct pxa3xx_bbm **nbbm =3D NULL;<br>+<br>+=A0=A0=A0 /* check whether current= flash is nand */<br>+=A0=A0=A0 nbbm =3D (struct pxa3xx_bbm **)(++info);<br= >+=A0=A0=A0 if (((unsigned int)nbbm < PAGE_OFFSET)<br> +=A0=A0=A0 =A0=A0=A0 || ((unsigned int)*nbbm < PAGE_OFFSET))<br>+=A0=A0= =A0 =A0=A0=A0 return PXA3xx_BBM_INVALID;<br>+<br>+=A0=A0=A0 if ((*nbbm)->= ;magic =3D=3D PXA_BBM_MAGIC) {<br>+=A0=A0=A0 =A0=A0=A0 pr_debug("%s:Fo= und Nand flash.\n", __func__);<br>+=A0=A0=A0 =A0=A0=A0 *bbm =3D *nbbm;= <br> +=A0=A0=A0 =A0=A0=A0 return PXA3xx_BBM_NAND;<br>+=A0=A0=A0 }<br>+=A0=A0=A0 = return PXA3xx_BBM_INVALID;<br>+}<br>+<br>+static int pxa3xx_nand_relocate_a= ddr(struct mtd_info *mtd, int page_addr)<br>+{<br>+=A0=A0=A0 struct pxa3xx_= nand_info *info =3D mtd->priv;<br> +=A0=A0=A0 struct pxa3xx_bbm *bbm =3D info->bbm;<br>+=A0=A0=A0 loff_t ad= dr;<br>+=A0=A0=A0 int ret;<br>+<br>+=A0=A0=A0 addr =3D page_addr << b= bm->page_shift;<br>+=A0=A0=A0 addr =3D bbm->search(mtd, addr);<br>+= =A0=A0=A0 ret =3D addr >> bbm->page_shift;<br> +=A0=A0=A0 return ret;<br>+}<br>+<br>+static int pxa3xx_nand_block_markbad(= struct mtd_info *mtd, loff_t ofs)<br>+{<br>+=A0=A0=A0 struct pxa3xx_nand_in= fo *info =3D mtd->priv;<br>+=A0=A0=A0 struct pxa3xx_bbm *bbm =3D info-&g= t;bbm;<br>+=A0=A0=A0 struct nand_chip *chip =3D mtd->priv;<br> +=A0=A0=A0 uint8_t buf[2] =3D { 0, 0 };<br>+=A0=A0=A0 int block, ret;<br>+<= br>+=A0=A0=A0 /* Get block number */<br>+=A0=A0=A0 block =3D (int)(ofs >= > chip->bbt_erase_shift);<br>+<br>+=A0=A0=A0 /* We write two bytes, s= o we dont have to mess with 16 bit<br> +=A0=A0=A0 =A0* access<br>+=A0=A0=A0 =A0*/<br>+=A0=A0=A0 ofs +=3D mtd->o= obsize;<br>+=A0=A0=A0 chip->ops.len =3D chip->ops.ooblen =3D 2;<br>+= =A0=A0=A0 chip->ops.datbuf =3D NULL;<br>+=A0=A0=A0 chip->ops.oobbuf = =3D buf;<br>+=A0=A0=A0 chip->ops.ooboffs =3D chip->badblockpos & = ~0x01;<br> +<br>+=A0=A0=A0 ret =3D mtd->write_oob(mtd, ofs, &chip->ops);<br>= +<br>+=A0=A0=A0 if (!ret)<br>+=A0=A0=A0 =A0=A0=A0 mtd->ecc_stats.badbloc= ks++;<br>+<br>+=A0=A0=A0 return bbm->block_markbad(mtd, block);<br>+}<br= >+<br>+static void pxa3xx_nand_init_mtd(struct mtd_info *mtd,<br> +=A0=A0=A0 =A0=A0=A0 =A0=A0=A0 =A0=A0=A0 =A0struct pxa3xx_nand_info *info)<= br>+{<br>+=A0=A0=A0 const struct pxa3xx_nand_flash *f =3D info->flash_in= fo;<br>+=A0=A0=A0 struct nand_chip *this =3D &info->nand_chip;<br>+= =A0=A0=A0 struct pxa3xx_bbm *bbm =3D NULL;<br>+<br> +=A0=A0=A0 this->options =3D (f->flash_width =3D=3D 16) ? NAND_BUSWID= TH_16: 0;<br>+<br>+=A0=A0=A0 this->waitfunc=A0=A0=A0 =A0=A0=A0 =3D pxa3x= x_nand_waitfunc;<br>+=A0=A0=A0 this->select_chip=A0=A0=A0 =3D pxa3xx_nan= d_select_chip;<br>+=A0=A0=A0 this->dev_ready=A0=A0=A0 =A0=A0=A0 =3D pxa3= xx_nand_dev_ready;<br> +=A0=A0=A0 this->cmdfunc=A0=A0=A0 =A0=A0=A0 =3D pxa3xx_nand_cmdfunc;<br>= +=A0=A0=A0 this->read_word=A0=A0=A0 =A0=A0=A0 =3D pxa3xx_nand_read_word;= <br>+=A0=A0=A0 this->read_byte=A0=A0=A0 =A0=A0=A0 =3D pxa3xx_nand_read_b= yte;<br>+=A0=A0=A0 this->read_buf=A0=A0=A0 =A0=A0=A0 =3D pxa3xx_nand_rea= d_buf;<br> +=A0=A0=A0 this->write_buf=A0=A0=A0 =A0=A0=A0 =3D pxa3xx_nand_write_buf;= <br>+=A0=A0=A0 this->verify_buf=A0=A0=A0 =3D pxa3xx_nand_verify_buf;<br>= +<br>+=A0=A0=A0 this->ecc.mode=A0=A0=A0 =A0=A0=A0 =3D NAND_ECC_HW;<br>+= =A0=A0=A0 this->ecc.hwctl=A0=A0=A0 =A0=A0=A0 =3D pxa3xx_nand_ecc_hwctl;<= br> +=A0=A0=A0 this->ecc.calculate=A0=A0=A0 =3D pxa3xx_nand_ecc_calculate;<b= r>+=A0=A0=A0 this->ecc.correct=A0=A0=A0 =3D pxa3xx_nand_ecc_correct;<br>= +=A0=A0=A0 this->ecc.size=A0=A0=A0 =A0=A0=A0 =3D f->page_size;<br>+<b= r>+=A0=A0=A0 if (f->page_size =3D=3D 2048)<br>+=A0=A0=A0 =A0=A0=A0 this-= >ecc.layout =3D &hw_largepage_ecclayout;<br> +=A0=A0=A0 else<br>+=A0=A0=A0 =A0=A0=A0 this->ecc.layout =3D &hw_sma= llpage_ecclayout;<br>+<br>+=A0=A0=A0 this->chip_delay =3D 25;<br>+<br>+= =A0=A0=A0 bbm =3D pxa3xx_query_bbm();<br>+=A0=A0=A0 if (bbm) {<br>+=A0=A0= =A0 =A0=A0=A0 /* Marvell PXA3xx BBM is initialized successfully */<br> +=A0=A0=A0 =A0=A0=A0 info->bbm =3D bbm;<br>+=A0=A0=A0 =A0=A0=A0 this->= ;scan_bbt =3D bbm->scan_bbt;<br>+=A0=A0=A0 =A0=A0=A0 this->block_mark= bad =3D pxa3xx_nand_block_markbad;<br>+=A0=A0=A0 }<br>+}<br>+#else<br>+stat= ic int pxa3xx_nand_relocate_addr(struct mtd_info *mtd, int page_addr)<br> +{<br>+=A0=A0=A0 return page_addr;<br>+}<br>+<br>=A0static void pxa3xx_nand= _init_mtd(struct mtd_info *mtd,<br>=A0=A0=A0=A0 =A0=A0=A0 =A0=A0=A0 =A0=A0= =A0 =A0struct pxa3xx_nand_info *info)<br>=A0{<br>@@ -1196,6 +1319,7 @@ stat= ic void pxa3xx_nand_init_mtd(struct mtd_info *mtd,<br> =A0<br>=A0=A0=A0=A0 this->chip_delay =3D 25;<br>=A0}<br>+#endif<br>=A0<b= r>=A0static int pxa3xx_nand_probe(struct platform_device *pdev)<br>=A0{<br>= diff --git a/drivers/mtd/pxa3xx_bbm.c b/drivers/mtd/pxa3xx_bbm.c<br>new fil= e mode 100644<br> index 0000000..bcc9a35<br>--- /dev/null<br>+++ b/drivers/mtd/pxa3xx_bbm.c<b= r>@@ -0,0 +1,427 @@<br>+/*<br>+ * linux/drivers/mtd/pxa3xx_bbm.c<br>+ *<br>= + * Support bad block management on PXA3xx.<br>+ * Copyright (C) 2007 Marve= ll International Ltd.<br> + *<br>+ * Haojian Zhuang <<a href=3D"mailto:haojian.zhuang@marvell.com"= >haojian.zhuang at marvell.com</a>><br>+ *<br>+ * This program is free soft= ware; you can redistribute it and/or modify<br>+ * it under the terms of th= e GNU General Public License version 2 as<br> + * published by the Free Software Foundation.<br>+ *<br>+ */<br>+<br>+#inc= lude <linux/mtd/mtd.h><br>+#include <linux/mtd/nand.h><br>+#inc= lude <plat/pxa3xx_bbm.h><br>+#include <asm/errno.h><br>+<br> +static struct pxa3xx_bbm *pxa3xx_bbm =3D NULL;<br>+<br>+/*<br>+ * bbm shou= ld be the next field of nand_chip or onenand_chip.<br>+ */<br>+static int v= erify_bbm_magic(struct mtd_info *mtd, struct pxa3xx_bbm **bbm)<br>+{<br>+= =A0=A0=A0 int ret;<br> +<br>+=A0=A0=A0 ret =3D verify_nand_bbm(mtd, bbm);<br>+=A0=A0=A0 return ret= ;<br>+}<br>+<br>+static void dump_rltable(struct pxa3xx_bbm *bbm)<br>+{<br>= +=A0=A0=A0 int i;<br>+<br>+=A0=A0=A0 if (bbm->table->total =3D=3D 0) = {<br>+=A0=A0=A0 =A0=A0=A0 pr_info("The relocation table is empty now\n= ");<br> +=A0=A0=A0 =A0=A0=A0 return;<br>+=A0=A0=A0 }<br>+=A0=A0=A0 for (i =3D 0; i = < bbm->table->total; i++) {<br>+=A0=A0=A0 =A0=A0=A0 if (bbm->en= try[i].from =3D=3D (unsigned short)(-1))<br>+=A0=A0=A0 =A0=A0=A0 =A0=A0=A0 = continue;<br>+=A0=A0=A0 =A0=A0=A0 if (bbm->entry[i].to =3D=3D (unsigned = short)(-1))<br> +=A0=A0=A0 =A0=A0=A0 =A0=A0=A0 pr_info("(%4d): block #%d is bad in rel= ocation area\n",<br>+=A0=A0=A0 =A0=A0=A0 =A0=A0=A0 =A0=A0=A0 i, bbm-&g= t;entry[i].from);<br>+=A0=A0=A0 =A0=A0=A0 else<br>+=A0=A0=A0 =A0=A0=A0 =A0= =A0=A0 pr_info("(%4d): block #%d is relocated to #%d\n",<br> +=A0=A0=A0 =A0=A0=A0 =A0=A0=A0 =A0=A0=A0 i, bbm->entry[i].from, bbm->= entry[i].to);<br>+=A0=A0=A0 }<br>+}<br>+<br>+/* Initialize the relocation t= able */<br>+static int pxa3xx_init_rltable(struct mtd_info *mtd)<br>+{<br>+= =A0=A0=A0 struct pxa3xx_bbm *bbm =3D NULL;<br> +=A0=A0=A0 int size =3D mtd->writesize + mtd->oobsize;<br>+=A0=A0=A0 = int pages, entries;<br>+<br>+=A0=A0=A0 if (verify_bbm_magic(mtd, &bbm) = < 0) {<br>+=A0=A0=A0 =A0=A0=A0 /* BBM don't support this type of fla= sh */<br>+=A0=A0=A0 =A0=A0=A0 return -EINVAL;<br> +=A0=A0=A0 }<br>+<br>+=A0=A0=A0 bbm->page_shift =3D ffs(mtd->writesiz= e) - 1;<br>+=A0=A0=A0 bbm->erase_shift =3D ffs(mtd->erasesize) - 1;<b= r>+<br>+=A0=A0=A0 pages =3D mtd->erasesize >> bbm->page_shift;<= br>+<br>+=A0=A0=A0 entries =3D mtd->size >> bbm->erase_shift;<b= r> +=A0=A0=A0 entries =3D (entries * 2) / 100;<br>+=A0=A0=A0 if (mtd->write= size =3D=3D 512)<br>+=A0=A0=A0 =A0=A0=A0 entries =3D (entries < PXA_MAX_= RLENTRY) ? entries<br>+=A0=A0=A0 =A0=A0=A0 =A0=A0=A0 =A0 : PXA_MAX_RLENTRY;= <br>+<br>+=A0=A0=A0 bbm->max_slots=A0=A0=A0 =3D PXA_MAX_SLOT;<br> +=A0=A0=A0 bbm->max_relocate_entry =3D entries;<br>+=A0=A0=A0 bbm->cu= rrent_slot =3D -1;<br>+<br>+=A0=A0=A0 bbm->data_buf =3D kzalloc(size, GF= P_KERNEL);<br>+=A0=A0=A0 if (bbm->data_buf =3D=3D NULL)<br>+=A0=A0=A0 = =A0=A0=A0 return -ENOMEM;<br>+<br>+=A0=A0=A0 bbm->table =3D (struct relo= cate_table *)bbm->data_buf;<br> +=A0=A0=A0 memset(bbm->table, 0, sizeof(struct relocate_table));<br>+<br= >+=A0=A0=A0 bbm->entry =3D (struct relocate_entry *)((uint8_t *)bbm->= data_buf +<br>+=A0=A0=A0 =A0=A0=A0 =A0=A0=A0 sizeof(struct relocate_entry))= ;<br>+=A0=A0=A0 memset(bbm->entry, 0, sizeof(struct relocate_entry)<br> +=A0=A0=A0 =A0=A0=A0 * bbm->max_relocate_entry);<br>+<br>+=A0=A0=A0 retu= rn 0;<br>+}<br>+<br>+/* Uninitialize the relocation table */<br>+static voi= d pxa3xx_uninit_rltable(struct mtd_info *mtd)<br>+{<br>+=A0=A0=A0 struct px= a3xx_bbm *bbm =3D NULL;<br> +<br>+=A0=A0=A0 if (verify_bbm_magic(mtd, &bbm) < 0) {<br>+=A0=A0=A0= =A0=A0=A0 /* BBM don't support this flash type */<br>+=A0=A0=A0 =A0=A0= =A0 return;<br>+=A0=A0=A0 }<br>+<br>+=A0=A0=A0 if (bbm) {<br>+=A0=A0=A0 =A0= =A0=A0 kfree(bbm->data_buf);<br>+=A0=A0=A0 =A0=A0=A0 bbm =3D NULL;<br> +=A0=A0=A0 }<br>+}<br>+<br>+/*<br>+ * Move larger data to left of pivot, an= d move smaller data to right of<br>+ * pivot.<br>+ */<br>+static int partit= ion(unsigned short *array, int left, int right, int pivot_idx)<br>+{<br>+= =A0=A0=A0 int i, pivot, base_idx;<br> +<br>+=A0=A0=A0 pivot =3D array[pivot_idx];<br>+=A0=A0=A0 swap(array[left],= array[right]);<br>+=A0=A0=A0 base_idx =3D left;<br>+<br>+=A0=A0=A0 for (i = =3D left; i < right; i++) {<br>+=A0=A0=A0 =A0=A0=A0 if (array[i] > pi= vot) {<br>+=A0=A0=A0 =A0=A0=A0 =A0=A0=A0 swap(array[i], array[base_idx]);<b= r> +=A0=A0=A0 =A0=A0=A0 =A0=A0=A0 base_idx++;<br>+=A0=A0=A0 =A0=A0=A0 }<br>+= =A0=A0=A0 }<br>+=A0=A0=A0 if (base_idx < right)<br>+=A0=A0=A0 =A0=A0=A0 = swap(array[base_idx], array[right]);<br>+=A0=A0=A0 return base_idx;<br>+}<b= r>+<br>+static int quick_sort(unsigned short *array, int left, int right)<b= r> +{<br>+=A0=A0=A0 int pivot_idx, new_idx;<br>+=A0=A0=A0 if (right > left)= {<br>+=A0=A0=A0 =A0=A0=A0 pivot_idx =3D left;<br>+=A0=A0=A0 =A0=A0=A0 new_= idx =3D partition(array, left, right, pivot_idx);<br>+=A0=A0=A0 =A0=A0=A0 q= uick_sort(array, left, new_idx - 1);<br>+=A0=A0=A0 =A0=A0=A0 quick_sort(arr= ay, new_idx + 1, right);<br> +=A0=A0=A0 }<br>+=A0=A0=A0 return 0;<br>+}<br>+<br>+/*<br>+ * Add the reloc= ation entry into the relocation table. If the relocated block<br>+ * is bad= , an new entry will be added into the bottom of the relocation table.<br>+ = */<br>+int update_rltable(struct mtd_info *mtd, int block)<br> +{<br>+=A0=A0=A0 struct pxa3xx_bbm *bbm =3D NULL;<br>+=A0=A0=A0 struct relo= cate_table *table =3D NULL;<br>+=A0=A0=A0 struct relocate_entry *entry =3D = NULL;<br>+=A0=A0=A0 struct erase_info instr;<br>+=A0=A0=A0 unsigned short a= rray[PXA_MAX_RLENTRY], addr;<br> +=A0=A0=A0 int i, idx, ret, relocated_idx =3D -1;<br>+<br>+=A0=A0=A0 if (ve= rify_bbm_magic(mtd, &bbm) < 0) {<br>+=A0=A0=A0 =A0=A0=A0 /* BBM don&= #39;t support this type of flash */<br>+=A0=A0=A0 =A0=A0=A0 return -EINVAL;= <br>+=A0=A0=A0 }<br>+<br>+=A0=A0=A0 table =3D bbm->table;<br> +=A0=A0=A0 entry =3D bbm->entry;<br>+<br>+=A0=A0=A0 /* identify whether = the block has been relocated */<br>+=A0=A0=A0 for (i =3D 0; i < table-&g= t;total; i++) {<br>+=A0=A0=A0 =A0=A0=A0 if (entry[i].from =3D=3D (unsigned = short)(-1))<br>+=A0=A0=A0 =A0=A0=A0 =A0=A0=A0 continue;<br> +=A0=A0=A0 =A0=A0=A0 if (block =3D=3D entry[i].from) {<br>+=A0=A0=A0 =A0=A0= =A0 =A0=A0=A0 relocated_idx =3D i;<br>+=A0=A0=A0 =A0=A0=A0 =A0=A0=A0 break;= <br>+=A0=A0=A0 =A0=A0=A0 }<br>+=A0=A0=A0 }<br>+<br>+scan:<br>+=A0=A0=A0 if = (table->total > bbm->max_relocate_entry) {<br>+=A0=A0=A0 =A0=A0=A0= pr_warning("Relocation entries exceed max num. Can't relocate&quo= t;);<br> +=A0=A0=A0 =A0=A0=A0 pr_warning(" block 0x%x\n", block);<br>+=A0= =A0=A0 =A0=A0=A0 return -ENOSPC;<br>+=A0=A0=A0 }<br>+<br>+=A0=A0=A0 memset(= array, 0, PXA_MAX_RLENTRY);<br>+=A0=A0=A0 /* Get all index of relocated blo= cks */<br>+=A0=A0=A0 for (i =3D 0, idx =3D 0; i < table->total; i++) = {<br> +=A0=A0=A0 =A0=A0=A0 array[idx] =3D (entry[i].to !=3D (unsigned short)(-1))= ? entry[i].to<br>+=A0=A0=A0 =A0=A0=A0 =A0=A0=A0 =A0=A0=A0 : entry[i].from;= <br>+=A0=A0=A0 =A0=A0=A0 idx++;<br>+=A0=A0=A0 }<br>+=A0=A0=A0 /* sort array= with descending order */<br>+=A0=A0=A0 quick_sort(array, 0, idx - 1);<br> +=A0=A0=A0 /*<br>+=A0=A0=A0 =A0* find the available block with the largest = number in reservered<br>+=A0=A0=A0 =A0* area<br>+=A0=A0=A0 =A0*/<br>+=A0=A0= =A0 addr =3D (unsigned short)((mtd->size >> bbm->erase_shift) -= 1);<br>+=A0=A0=A0 for (i =3D 0; i < bbm->max_relocate_entry; i++, ad= dr--) {<br> +=A0=A0=A0 =A0=A0=A0 if (addr < ((mtd->size >> bbm->erase_sh= ift)<br>+=A0=A0=A0 =A0=A0=A0 =A0=A0=A0 - bbm->max_relocate_entry)) {<br>= +=A0=A0=A0 =A0=A0=A0 =A0=A0=A0 pr_warning("Relocation area is already = full!\n");<br>+=A0=A0=A0 =A0=A0=A0 =A0=A0=A0 return -ENOSPC;<br> +=A0=A0=A0 =A0=A0=A0 }<br>+=A0=A0=A0 =A0=A0=A0 if (array[i] < addr) {<br= >+=A0=A0=A0 =A0=A0=A0 =A0=A0=A0 memset(&instr, 0, sizeof(struct erase_i= nfo));<br>+=A0=A0=A0 =A0=A0=A0 =A0=A0=A0 instr.mtd =3D mtd;<br>+=A0=A0=A0 = =A0=A0=A0 =A0=A0=A0 instr.addr =3D addr << bbm->erase_shift;<br>+= =A0=A0=A0 =A0=A0=A0 =A0=A0=A0 instr.len =3D 1 << bbm->erase_shift;= <br> +=A0=A0=A0 =A0=A0=A0 =A0=A0=A0 ret =3D mtd->erase(mtd, &instr);<br>+= =A0=A0=A0 =A0=A0=A0 =A0=A0=A0 if (ret =3D=3D 0) {<br>+=A0=A0=A0 =A0=A0=A0 = =A0=A0=A0 =A0=A0=A0 /* fill the recorder into relocation table */<br>+=A0= =A0=A0 =A0=A0=A0 =A0=A0=A0 =A0=A0=A0 if (relocated_idx =3D=3D -1) {<br>+=A0= =A0=A0 =A0=A0=A0 =A0=A0=A0 =A0=A0=A0 =A0=A0=A0 /* new entry in relocation t= able */<br> +=A0=A0=A0 =A0=A0=A0 =A0=A0=A0 =A0=A0=A0 =A0=A0=A0 entry[table->total].f= rom =3D block;<br>+=A0=A0=A0 =A0=A0=A0 =A0=A0=A0 =A0=A0=A0 =A0=A0=A0 entry[= table->total].to =3D addr;<br>+=A0=A0=A0 =A0=A0=A0 =A0=A0=A0 =A0=A0=A0 = =A0=A0=A0 table->total++;<br>+=A0=A0=A0 =A0=A0=A0 =A0=A0=A0 =A0=A0=A0 = =A0=A0=A0 goto done;<br>+=A0=A0=A0 =A0=A0=A0 =A0=A0=A0 =A0=A0=A0 } else {<b= r> +=A0=A0=A0 =A0=A0=A0 =A0=A0=A0 =A0=A0=A0 =A0=A0=A0 /* update entry in reloc= ation table */<br>+=A0=A0=A0 =A0=A0=A0 =A0=A0=A0 =A0=A0=A0 =A0=A0=A0 entry[= table->total].from<br>+=A0=A0=A0 =A0=A0=A0 =A0=A0=A0 =A0=A0=A0 =A0=A0=A0= =A0=A0=A0 =3D entry[relocated_idx].to;<br>+=A0=A0=A0 =A0=A0=A0 =A0=A0=A0 = =A0=A0=A0 =A0=A0=A0 entry[table->total].to<br>+=A0=A0=A0 =A0=A0=A0 =A0= =A0=A0 =A0=A0=A0 =A0=A0=A0 =A0=A0=A0 =3D (unsigned short)(-1);<br> +=A0=A0=A0 =A0=A0=A0 =A0=A0=A0 =A0=A0=A0 =A0=A0=A0 table->total++;<br>+= =A0=A0=A0 =A0=A0=A0 =A0=A0=A0 =A0=A0=A0 =A0=A0=A0 entry[relocated_idx].to = =3D addr;<br>+=A0=A0=A0 =A0=A0=A0 =A0=A0=A0 =A0=A0=A0 =A0=A0=A0 goto done;<= br>+=A0=A0=A0 =A0=A0=A0 =A0=A0=A0 =A0=A0=A0 }<br>+=A0=A0=A0 =A0=A0=A0 =A0= =A0=A0 } else {<br>+=A0=A0=A0 =A0=A0=A0 =A0=A0=A0 =A0=A0=A0 /* append new b= ad entry */<br> +=A0=A0=A0 =A0=A0=A0 =A0=A0=A0 =A0=A0=A0 entry[table->total].from =3D ad= dr;<br>+=A0=A0=A0 =A0=A0=A0 =A0=A0=A0 =A0=A0=A0 entry[table->total].to = =3D (unsigned short)(-1);<br>+=A0=A0=A0 =A0=A0=A0 =A0=A0=A0 =A0=A0=A0 table= ->total++;<br>+=A0=A0=A0 =A0=A0=A0 =A0=A0=A0 =A0=A0=A0 goto scan;<br>+= =A0=A0=A0 =A0=A0=A0 =A0=A0=A0 }<br>+=A0=A0=A0 =A0=A0=A0 }<br> +=A0=A0=A0 }<br>+<br>+done:<br>+=A0=A0=A0 return 0;<br>+}<br>+<br>+/* Write= the relocation table back to device, if there's room. */<br>+static in= t sync_rltable(struct mtd_info *mtd, int *idx)<br>+{<br>+=A0=A0=A0 struct p= xa3xx_bbm *bbm =3D NULL;<br> +=A0=A0=A0 unsigned char *tmp;<br>+=A0=A0=A0 size_t retlen;<br>+=A0=A0=A0 i= nt len, pages;<br>+<br>+=A0=A0=A0 if (verify_bbm_magic(mtd, &bbm) < = 0) {<br>+=A0=A0=A0 =A0=A0=A0 /* BBM don't support this type of flash */= <br>+=A0=A0=A0 =A0=A0=A0 return -EINVAL;<br> +=A0=A0=A0 }<br>+<br>+=A0=A0=A0 pages =3D mtd->erasesize >> bbm-&g= t;page_shift;<br>+=A0=A0=A0 if ((*idx >=3D pages) || (*idx <=3D (page= s - bbm->max_slots))) {<br>+=A0=A0=A0 =A0=A0=A0 printk(KERN_ERR "Wr= ong Slot is specified.\n");<br> +=A0=A0=A0 =A0=A0=A0 return -EINVAL;<br>+=A0=A0=A0 }<br>+<br>+=A0=A0=A0 /* = should write to the next slot*/<br>+=A0=A0=A0 (*idx)--;<br>+<br>+=A0=A0=A0 = len =3D 4;=A0=A0=A0 =A0=A0=A0 /* table header */<br>+=A0=A0=A0 len +=3D bbm= ->table->total << 2;<br>+<br>+=A0=A0=A0 tmp =3D (unsigned char = *)bbm->data_buf;<br> +=A0=A0=A0 mtd->write(mtd, (*idx) << bbm->page_shift,<br>+=A0= =A0=A0 =A0=A0=A0 =A0=A0 1 << bbm->page_shift, &retlen, tmp);<b= r>+<br>+=A0=A0=A0 return 0;<br>+}<br>+<br>+static int pxa3xx_scan_rltable(s= truct mtd_info *mtd)<br>+{<br> +=A0=A0=A0 struct pxa3xx_bbm *bbm =3D NULL;<br>+=A0=A0=A0 struct relocate_t= able *table;<br>+=A0=A0=A0 int page, max_page;<br>+=A0=A0=A0 size_t retlen;= <br>+=A0=A0=A0 int ret, retry_count =3D 3;<br>+<br>+=A0=A0=A0 if (verify_bb= m_magic(mtd, &bbm) < 0) {<br> +=A0=A0=A0 =A0=A0=A0 /* BBM don't support this type of flash */<br>+=A0= =A0=A0 =A0=A0=A0 return -EINVAL;<br>+=A0=A0=A0 }<br>+<br>+=A0=A0=A0 pxa3xx_= init_rltable(mtd);<br>+<br>+=A0=A0=A0 table =3D bbm->table;<br>+<br>+=A0= =A0=A0 bbm->current_slot =3D -1;<br>+=A0=A0=A0 page =3D (mtd->erasesi= ze >> bbm->page_shift) - bbm->max_slots;<br> +=A0=A0=A0 max_page =3D mtd->erasesize >> bbm->page_shift;<br>+= =A0=A0=A0 for (; page < max_page; page++, retry_count =3D 3) {<br>+retry= :<br>+=A0=A0=A0 =A0=A0=A0 memset(bbm->data_buf, 0, mtd->writesize + m= td->oobsize);<br>+=A0=A0=A0 =A0=A0=A0 ret =3D mtd->read(mtd, (page &l= t;< bbm->page_shift),<br> +=A0=A0=A0 =A0=A0=A0 =A0=A0=A0 =A0=A0=A0 mtd->writesize, &retlen, bb= m->data_buf);<br>+=A0=A0=A0 =A0=A0=A0 if (ret =3D=3D 0) {<br>+=A0=A0=A0 = =A0=A0=A0 =A0=A0=A0 if (table->header =3D=3D PXA_RLTABLE_HEADER) {<br>+= =A0=A0=A0 =A0=A0=A0 =A0=A0=A0 =A0=A0=A0 bbm->current_slot =3D page;<br>+= =A0=A0=A0 =A0=A0=A0 =A0=A0=A0 =A0=A0=A0 break;<br> +=A0=A0=A0 =A0=A0=A0 =A0=A0=A0 }<br>+=A0=A0=A0 =A0=A0=A0 } else {<br>+=A0= =A0=A0 =A0=A0=A0 =A0=A0=A0 if (retry_count--)<br>+=A0=A0=A0 =A0=A0=A0 =A0= =A0=A0 =A0=A0=A0 goto retry;<br>+=A0=A0=A0 =A0=A0=A0 }<br>+=A0=A0=A0 }<br>+= =A0=A0=A0 if (bbm->current_slot !=3D -1) {<br>+=A0=A0=A0 =A0=A0=A0 pr_de= bug("Found relocation table at page:%d\n",<br> +=A0=A0=A0 =A0=A0=A0 =A0=A0=A0 bbm->current_slot);<br>+=A0=A0=A0 =A0=A0= =A0 dump_rltable(bbm);<br>+=A0=A0=A0 } else {<br>+=A0=A0=A0 =A0=A0=A0 pr_er= r("Can't recognize relocation table.\n");<br>+=A0=A0=A0 =A0= =A0=A0 pr_err("CAUTION: It may cause unpredicated error\n");<br> +=A0=A0=A0 =A0=A0=A0 pr_err("Please re-initialize the flash.\n");= <br>+=A0=A0=A0 =A0=A0=A0 memset((unsigned char *)bbm->table, 0,<br>+=A0= =A0=A0 =A0=A0=A0 =A0=A0=A0 sizeof(struct relocate_table));<br>+=A0=A0=A0 = =A0=A0=A0 return -EFAULT;<br>+=A0=A0=A0 }<br>+=A0=A0=A0 return 0;<br> +}<br>+<br>+/*<br>+ * Find the relocated block of the bad one.<br>+ * If it= 's a good block, return 0. Otherwise, return a relocated one.<br>+ * id= x points to the next relocation entry<br>+ * If the relocated block is bad,= an new entry will be added into the<br> + * bottom of the relocation table.<br>+ */<br>+static loff_t pxa3xx_search= _rlentry(struct mtd_info *mtd, loff_t ofs)<br>+{<br>+=A0=A0=A0 struct pxa3x= x_bbm *bbm =3D NULL;<br>+=A0=A0=A0 struct relocate_table *table =3D NULL;<b= r>+=A0=A0=A0 struct relocate_entry *entry =3D NULL;<br> +=A0=A0=A0 int i, block;<br>+<br>+=A0=A0=A0 /*<br>+=A0=A0=A0 =A0* In SLC, b= lock 0 shouldn't be broken.<br>+=A0=A0=A0 =A0* In some command, address= is assigned to 0 if it doesn't need<br>+=A0=A0=A0 =A0* to operate addr= ess. So just skip it.<br>+=A0=A0=A0 =A0*/<br> +=A0=A0=A0 if (ofs <=3D 0)<br>+=A0=A0=A0 =A0=A0=A0 return ofs;<br>+<br>+= =A0=A0=A0 if (verify_bbm_magic(mtd, &bbm) < 0)<br>+=A0=A0=A0 =A0=A0= =A0 return ofs;<br>+<br>+=A0=A0=A0 table =3D bbm->table;<br>+=A0=A0=A0 e= ntry =3D bbm->entry;<br>+<br>+=A0=A0=A0 block =3D ofs >> bbm->e= rase_shift;<br> +<br>+=A0=A0=A0 if ((bbm->current_slot =3D=3D -1) || (table->total &l= t;=3D 0)<br>+=A0=A0=A0 =A0=A0=A0 || (block >=3D (mtd->size >> b= bm->erase_shift)))<br>+=A0=A0=A0 =A0=A0=A0 return ofs;<br>+<br>+=A0=A0= =A0 ofs =3D ofs - (block << bbm->erase_shift);=A0=A0=A0 /* save of= fset */<br> +<br>+=A0=A0=A0 for (i =3D 0; i < table->total; i++) {<br>+=A0=A0=A0 = =A0=A0=A0 if (block =3D=3D entry[i].from) {<br>+=A0=A0=A0 =A0=A0=A0 =A0=A0= =A0 block =3D entry[i].to;<br>+=A0=A0=A0 =A0=A0=A0 =A0=A0=A0 break;<br>+=A0= =A0=A0 =A0=A0=A0 }<br>+=A0=A0=A0 }<br>+=A0=A0=A0 ofs +=3D block << bb= m->erase_shift;<br> +=A0=A0=A0 return ofs;<br>+}<br>+<br>+static int pxa3xx_mark_rlentry(struct= mtd_info *mtd, int block)<br>+{<br>+=A0=A0=A0 struct pxa3xx_bbm *bbm =3D N= ULL;<br>+=A0=A0=A0 int ret =3D 0;<br>+<br>+=A0=A0=A0 ret =3D verify_bbm_mag= ic(mtd, &bbm);<br>+=A0=A0=A0 if (ret < 0) {<br> +=A0=A0=A0 =A0=A0=A0 /* BBM don't support this type of flash */<br>+=A0= =A0=A0 =A0=A0=A0 return -EINVAL;<br>+=A0=A0=A0 }<br>+<br>+=A0=A0=A0 ret =3D= update_rltable(mtd, block);<br>+=A0=A0=A0 if (ret)<br>+=A0=A0=A0 =A0=A0=A0= return ret;<br>+<br>+=A0=A0=A0 return sync_rltable(mtd, &(bbm->curr= ent_slot));<br> +}<br>+<br>+/* If Marvell BBM is used, return 0. Otherwise, return negative= value. */<br>+struct pxa3xx_bbm *pxa3xx_query_bbm(void)<br>+{<br>+=A0=A0= =A0 if (pxa3xx_bbm)<br>+=A0=A0=A0 =A0=A0=A0 return pxa3xx_bbm;<br>+=A0=A0= =A0 return NULL;<br>+}<br> +EXPORT_SYMBOL(pxa3xx_query_bbm);<br>+<br>+static int __init pxa3xx_bbm_ini= t(void)<br>+{<br>+=A0=A0=A0 struct pxa3xx_bbm *bbm;<br>+<br>+=A0=A0=A0 bbm = =3D kzalloc(sizeof(struct pxa3xx_bbm), GFP_KERNEL);<br>+=A0=A0=A0 if (!bbm)= <br>+=A0=A0=A0 =A0=A0=A0 return -ENOMEM;<br> +<br>+=A0=A0=A0 bbm->magic=A0=A0=A0 =A0=A0=A0 =3D PXA_BBM_MAGIC;<br>+=A0= =A0=A0 bbm->uninit=A0=A0=A0 =A0=A0=A0 =3D pxa3xx_uninit_rltable;<br>+=A0= =A0=A0 bbm->search=A0=A0=A0 =A0=A0=A0 =3D pxa3xx_search_rlentry;<br>+=A0= =A0=A0 bbm->block_markbad=A0=A0=A0 =3D pxa3xx_mark_rlentry;<br>+=A0=A0= =A0 bbm->scan_bbt=A0=A0=A0 =A0=A0=A0 =3D pxa3xx_scan_rltable;<br> +<br>+=A0=A0=A0 pxa3xx_bbm =3D bbm;<br>+<br>+=A0=A0=A0 return 0;<br>+}<br>+= subsys_initcall(pxa3xx_bbm_init);<br>+<br>+static void pxa3xx_bbm_exit(void= )<br>+{<br>+=A0=A0=A0 if (pxa3xx_bbm) {<br>+=A0=A0=A0 =A0=A0=A0 kfree(pxa3x= x_bbm);<br>+=A0=A0=A0 =A0=A0=A0 pxa3xx_bbm =3D NULL;<br> +=A0=A0=A0 }<br>+}<br>+module_exit(pxa3xx_bbm_exit);<br>+<br>+MODULE_LICENS= E("GPL");<br>+MODULE_DESCRIPTION("Marvell PXA3xx Bad Block M= anagement");<br>-- <br>1.5.6.5<br><br> --001517741a149782ca047465a8bd-- --001517741a149782d2047465a8bf Content-Type: text/x-patch; charset=US-ASCII; name="0001--MTD-NAND-pxa3xx_nand-enable-PXA3xx-bad-block-ma.patch" Content-Disposition: attachment; filename="0001--MTD-NAND-pxa3xx_nand-enable-PXA3xx-bad-block-ma.patch" Content-Transfer-Encoding: base64 X-Attachment-Id: f_g01cks240 RnJvbSA3ZTViYmI1MDgyZWYyYWZhYWIwOTY2ZDYwNTMwYWY0MTMxYzBjNGVlIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBIYW9qaWFuIFpodWFuZyA8aGFvamlhbi56aHVhbmdAbWFydmVs bC5jb20+CkRhdGU6IEZyaSwgMjUgU2VwIDIwMDkgMTU6MDA6MjggLTA0MDAKU3ViamVjdDogW1BB VENIXSBbTVREXSBbTkFORF0gcHhhM3h4X25hbmQ6IGVuYWJsZSBQWEEzeHggYmFkIGJsb2NrIG1h bmFnZW1lbnQKClRoZXJlJ3MgYSBjdXN0b20gYmFkIGJsb2NrIG1hbmFnZW1lbnQgaW4gUFhBM3h4 IHNlcmllcy4KClRoaXMgQkJNIG5lZWRzIHRvIGFsbG9jYXRlIGEgcmVzZXJ2ZWQgYXJlYSBhdCB0 aGUgYm90dG9tIG9mIE5BTkQgY2hpcC4KVGhlIHJlc2VydmVkIGFyZWEgc2hvdWxkIGJlIHByb3Rl Y3RlZCBmcm9tIG5vcm1hbCB1c2FnZS4gVGhlIGZpcnN0IGJsb2NrCm9mIE5BTkQgaXMgYWxzbyBy ZXNlcnZlZCBpbiBvcmRlciB0byBzdG9yaW5nIHRoZSByZWxvY2F0aW9uIGluZm9ybWF0aW9uLgoK V2hlbiBOQU5EIGNvbnRyb2xsZXIgZmluZHMgYSBiYWQgYmxvY2ssIGl0IG1hcmtzIHRoZSBibG9j ayBhcyBiYWQgYW5kCmFsbG9jYXRlIGEgdW51c2VkIGJsb2NrIGZyb20gcmVzZXJ2ZWQgYXJlYSBp biBib3R0b20uIFRoZSBuZXcgYmxvY2sgaXMKdXNlZCB0byByZXBsYWNlIHRoZSBvcmlnaW5hbCBi YWQgb25lLiBGcm9tIE9TIHZpZXcsIHRoZXJlJ3Mgbm8gYmFkIGJsb2NrCmF0IHRoZSB0aW1lLiBJ dCdzIGhhbmRsZWQgYnkgTkFORCBkcml2ZXIuIFRoZW4gZHJpdmVyIHJlY29yZHMgdGhlIHJlcGxh Y2VtZW50CmluIHRoZSBmaXJzdCBibG9jay4KClRoZSByZXNlcnZlZCBhcmVhIGlzIGFsc28gY2Fs bGVkIGFzIHJlbG9jYXRpb24gYXJlYS4gSXQgb2NjdXBpZXMgMiUgb2YKdGhlIHdob2xlIE5BTkQg c3BhY2UuCgpTaWduZWQtb2ZmLWJ5OiBIYW9qaWFuIFpodWFuZyA8aGFvamlhbi56aHVhbmdAbWFy dmVsbC5jb20+Ci0tLQogYXJjaC9hcm0vcGxhdC1weGEvaW5jbHVkZS9wbGF0L3B4YTN4eF9iYm0u aCB8ICAgNjIgKysrKwogZHJpdmVycy9tdGQvS2NvbmZpZyAgICAgICAgICAgICAgICAgICAgICAg ICB8ICAgIDYgKwogZHJpdmVycy9tdGQvTWFrZWZpbGUgICAgICAgICAgICAgICAgICAgICAgICB8 ICAgIDEgKwogZHJpdmVycy9tdGQvbmFuZC9weGEzeHhfbmFuZC5jICAgICAgICAgICAgICB8ICAx MjQgKysrKysrKysKIGRyaXZlcnMvbXRkL3B4YTN4eF9iYm0uYyAgICAgICAgICAgICAgICAgICAg fCAgNDI3ICsrKysrKysrKysrKysrKysrKysrKysrKysrKwogNSBmaWxlcyBjaGFuZ2VkLCA2MjAg aW5zZXJ0aW9ucygrKSwgMCBkZWxldGlvbnMoLSkKIGNyZWF0ZSBtb2RlIDEwMDY0NCBhcmNoL2Fy bS9wbGF0LXB4YS9pbmNsdWRlL3BsYXQvcHhhM3h4X2JibS5oCiBjcmVhdGUgbW9kZSAxMDA2NDQg ZHJpdmVycy9tdGQvcHhhM3h4X2JibS5jCgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1weGEv aW5jbHVkZS9wbGF0L3B4YTN4eF9iYm0uaCBiL2FyY2gvYXJtL3BsYXQtcHhhL2luY2x1ZGUvcGxh dC9weGEzeHhfYmJtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODUwODU0 NwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL3BsYXQtcHhhL2luY2x1ZGUvcGxhdC9weGEz eHhfYmJtLmgKQEAgLTAsMCArMSw2MiBAQAorI2lmbmRlZglfX1BYQTNYWF9CQlRfSF9fCisjZGVm aW5lCV9fUFhBM1hYX0JCVF9IX18KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNkZWZp bmUgUFhBX1JMVEFCTEVfSEVBREVSCQkoMHg1MjRlKQorI2RlZmluZSBQWEFfTUFYX1JMRU5UUlkJ CQkoMTI3KQorI2RlZmluZSBQWEFfTUFYX1NMT1QJCQkoNDApCisjZGVmaW5lIFBYQV9CRUdJTl9T TE9UCQkJKDIpCisjZGVmaW5lIFBYQV9CQk1fTUFHSUMJCQkoMHg0YzU2NTI0ZCkJLyogTVJWTCAq LworCitlbnVtIHsKKwlQWEEzeHhfQkJNX05BTkQgPSAwLAorCVBYQTN4eF9CQk1fT05FTkFORCwK KwlQWEEzeHhfQkJNX0lOVkFMSUQgPSAtMSwKK307CisKK3N0cnVjdCByZWxvY2F0ZV9lbnRyeSB7 CisJdW5zaWduZWQgc2hvcnQgZnJvbTsKKwl1bnNpZ25lZCBzaG9ydCB0bzsKK307CisKK3N0cnVj dCByZWxvY2F0ZV90YWJsZSB7CisJdW5zaWduZWQgc2hvcnQgaGVhZGVyOworCXVuc2lnbmVkIHNo b3J0IHRvdGFsOworfTsKKworc3RydWN0IHB4YTN4eF9iYm0geworCWludAkJCW1hZ2ljOworCS8q CisJICogTk9URVM6IHRoaXMgZmllbGQgaW1wYWN0IHRoZSBwYXJ0aXRpb24gdGFibGUuIFBsZWFz ZSBtYWtlIHN1cmUKKwkgKiB0aGF0IHRoaXMgdmFsdWUgYWxpZ24gd2l0aCBwYXJ0aXRpb25zIGRl ZmluaXRpb24uCisJICovCisJaW50CQkJbWF4X3JlbG9jYXRlX2VudHJ5OworCWludAkJCW1heF9z bG90czsKKwlpbnQJCQljdXJyZW50X3Nsb3Q7CisKKwl2b2lkCQkJKmRhdGFfYnVmOworCisJLyoK KwkgKiBUaGVzZSB0d28gZmllbGRzIHNob3VsZCBiZSBpbiAob25lKW5hbmRfY2hpcC4gQWRkIGhl cmUgdG8gaGFuZGxlCisJICogb25lbmFuZF9jaGlwIGFuZCBuYW5kX2NoaXAgYXQgdGhlIHNhbWUg dGltZS4KKwkgKi8KKwlpbnQJCQlwYWdlX3NoaWZ0OworCWludAkJCWVyYXNlX3NoaWZ0OworCisJ c3RydWN0IHJlbG9jYXRlX3RhYmxlCSp0YWJsZTsKKwlzdHJ1Y3QgcmVsb2NhdGVfZW50cnkJKmVu dHJ5OworCisJdm9pZAkoKnVuaW5pdCkoc3RydWN0IG10ZF9pbmZvICptdGQpOworCWxvZmZfdAko KnNlYXJjaCkoc3RydWN0IG10ZF9pbmZvICptdGQsCWxvZmZfdCBvZnMpOworCWludAkoKmJsb2Nr X21hcmtiYWQpKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBpbnQgYmxvY2spOworCWludAkoKnNjYW5f YmJ0KShzdHJ1Y3QgbXRkX2luZm8gKm10ZCk7Cit9OworCitleHRlcm4gaW50IHZlcmlmeV9uYW5k X2JibShzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgc3RydWN0IHB4YTN4eF9iYm0gKipiYm0pOworZXh0 ZXJuIGludCB2ZXJpZnlfb25lbmFuZF9iYm0oc3RydWN0IG10ZF9pbmZvICptdGQsIHN0cnVjdCBw eGEzeHhfYmJtICoqYmJtKTsKK2V4dGVybiBpbnQgbmFuZF9iYWRibG9ja3BvcyhzdHJ1Y3QgbXRk X2luZm8gKm10ZCk7CitleHRlcm4gaW50IG9uZW5hbmRfYmFkYmxvY2twb3Moc3RydWN0IG10ZF9p bmZvICptdGQpOworZXh0ZXJuIHN0cnVjdCBweGEzeHhfYmJtICpweGEzeHhfcXVlcnlfYmJtKHZv aWQpOworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL0tjb25maWcgYi9kcml2ZXJz L210ZC9LY29uZmlnCmluZGV4IGI4ZTM1YTAuLjNjZGY3YmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMv bXRkL0tjb25maWcKKysrIGIvZHJpdmVycy9tdGQvS2NvbmZpZwpAQCAtMzE1LDYgKzMxNSwxMiBA QCBjb25maWcgTVREX09PUFMKIAkgIFRvIHVzZSwgYWRkIGNvbnNvbGU9dHR5TVREeCB0byB0aGUg a2VybmVsIGNvbW1hbmQgbGluZSwKIAkgIHdoZXJlIHggaXMgdGhlIE1URCBkZXZpY2UgbnVtYmVy IHRvIHVzZS4KIAorY29uZmlnIFBYQTN4eF9CQk0KKwlib29sICJNYXJ2ZWxsIFBYQTN4eCBCYWQg QmxvY2sgTWFuYWdlbWVudCIKKwlkZXBlbmRzIG9uIE1URCAmJiAoTVREX05BTkQgfHwgTVREX09O RU5BTkQpCisJaGVscAorCSAgVGhpcyBlbmFibGVzIE1hcnZlbGwgQmFkIGJsb2NrIG1hbmFnZW1l bnQgb24gTkFORC9PTkVOQU5EIG9uIFBYQTN4eC4KKwogc291cmNlICJkcml2ZXJzL210ZC9jaGlw cy9LY29uZmlnIgogCiBzb3VyY2UgImRyaXZlcnMvbXRkL21hcHMvS2NvbmZpZyIKZGlmZiAtLWdp dCBhL2RyaXZlcnMvbXRkL01ha2VmaWxlIGIvZHJpdmVycy9tdGQvTWFrZWZpbGUKaW5kZXggODJk MWU0ZC4uZTYzN2ZhMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvTWFrZWZpbGUKKysrIGIvZHJp dmVycy9tdGQvTWFrZWZpbGUKQEAgLTI1LDYgKzI1LDcgQEAgb2JqLSQoQ09ORklHX0lORlRMKQkJ Kz0gaW5mdGwubwogb2JqLSQoQ09ORklHX1JGRF9GVEwpCQkrPSByZmRfZnRsLm8KIG9iai0kKENP TkZJR19TU0ZEQykJCSs9IHNzZmRjLm8KIG9iai0kKENPTkZJR19NVERfT09QUykJCSs9IG10ZG9v cHMubworb2JqLSQoQ09ORklHX1BYQTN4eF9CQk0pCSs9IHB4YTN4eF9iYm0ubwogCiBuZnRsLW9i anMJCTo9IG5mdGxjb3JlLm8gbmZ0bG1vdW50Lm8KIGluZnRsLW9ianMJCTo9IGluZnRsY29yZS5v IGluZnRsbW91bnQubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbmFuZC9weGEzeHhfbmFuZC5j IGIvZHJpdmVycy9tdGQvbmFuZC9weGEzeHhfbmFuZC5jCmluZGV4IDEzNGJmYmMuLmQ2Yzk1MjQg MTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL25hbmQvcHhhM3h4X25hbmQuYworKysgYi9kcml2ZXJz L210ZC9uYW5kL3B4YTN4eF9uYW5kLmMKQEAgLTI0LDYgKzI0LDEwIEBACiAjaW5jbHVkZSA8bWFj aC9kbWEuaD4KICNpbmNsdWRlIDxwbGF0L3B4YTN4eF9uYW5kLmg+CiAKKyNpZmRlZiBDT05GSUdf UFhBM3h4X0JCTQorI2luY2x1ZGUgPHBsYXQvcHhhM3h4X2JibS5oPgorI2VuZGlmCisKICNkZWZp bmUJQ0hJUF9ERUxBWV9USU1FT1VUCSgyICogSFovMTApCiAKIC8qIHJlZ2lzdGVycyBhbmQgYml0 IGRlZmluaXRpb25zICovCkBAIC0xMTIsNiArMTE2LDE0IEBAIGVudW0gewogCiBzdHJ1Y3QgcHhh M3h4X25hbmRfaW5mbyB7CiAJc3RydWN0IG5hbmRfY2hpcAluYW5kX2NoaXA7CisjaWZkZWYgQ09O RklHX1BYQTN4eF9CQk0KKwkvKgorCSAqIFJlc3RyaWN0aW9uOiBuYW5kX2NoaXAgc2hvdWxkIGJl IHRoZSBmaXJzdCBvbmUgb2YgcHhhM3h4X25hbmRfaW5mby4KKwkgKiBiYm0gc2hvdWxkIGJlIHRo ZSBzZWNvbmQgb25lIG9mIHB4YTN4eF9uYW5kX2luZm8uCisJICogTWFydmVsbCBQWEEzeHggQkJN IGFsd2F5cyBhY2Nlc3MgdGhpcyBmaWVsZCB0byBnZXQgYmJtLgorCSAqLworCXN0cnVjdCBweGEz eHhfYmJtCSpiYm07CisjZW5kaWYKIAogCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UJICpwZGV2Owog CWNvbnN0IHN0cnVjdCBweGEzeHhfbmFuZF9mbGFzaCAqZmxhc2hfaW5mbzsKQEAgLTM2NSw2ICsz NzcsOCBAQCBzdGF0aWMgc3RydWN0IHB4YTN4eF9uYW5kX2ZsYXNoICpidWlsdGluX2ZsYXNoX3R5 cGVzW10gPSB7CiAvKiBjb252ZXJ0IG5hbmQgZmxhc2ggY29udHJvbGxlciBjbG9jayBjeWNsZXMg dG8gbmFuby1zZWNvbmRzICovCiAjZGVmaW5lIGN5Y2xlMm5zKGMsIGNsaykJKCgoKGMpICsgMSkg KiAxMDAwMDAwICsgY2xrIC8gNTAwKSAvIChjbGsgLyAxMDAwKSkKIAorc3RhdGljIGludCBweGEz eHhfbmFuZF9yZWxvY2F0ZV9hZGRyKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBpbnQgcGFnZV9hZGRy KTsKKwogc3RhdGljIHZvaWQgcHhhM3h4X25hbmRfc2V0X3RpbWluZyhzdHJ1Y3QgcHhhM3h4X25h bmRfaW5mbyAqaW5mbywKIAkJCQkgICBjb25zdCBzdHJ1Y3QgcHhhM3h4X25hbmRfdGltaW5nICp0 KQogewpAQCAtNzA2LDYgKzcyMCw4IEBAIHN0YXRpYyB2b2lkIHB4YTN4eF9uYW5kX2NtZGZ1bmMo c3RydWN0IG10ZF9pbmZvICptdGQsIHVuc2lnbmVkIGNvbW1hbmQsCiAKIAlpbml0X2NvbXBsZXRp b24oJmluZm8tPmNtZF9jb21wbGV0ZSk7CiAKKwlwYWdlX2FkZHIgPSBweGEzeHhfbmFuZF9yZWxv Y2F0ZV9hZGRyKG10ZCwgcGFnZV9hZGRyKTsKKwogCXN3aXRjaCAoY29tbWFuZCkgewogCWNhc2Ug TkFORF9DTURfUkVBRE9PQjoKIAkJLyogZGlzYWJsZSBIVyBFQ0MgdG8gZ2V0IGFsbCB0aGUgT09C IGRhdGEgKi8KQEAgLTExNjUsNiArMTE4MSwxMTMgQEAgc3RhdGljIHN0cnVjdCBuYW5kX2VjY2xh eW91dCBod19sYXJnZXBhZ2VfZWNjbGF5b3V0ID0gewogCS5vb2JmcmVlID0geyB7MiwgMzh9IH0K IH07CiAKKyNpZmRlZiBDT05GSUdfUFhBM3h4X0JCTQoraW50IHZlcmlmeV9uYW5kX2JibShzdHJ1 Y3QgbXRkX2luZm8gKm10ZCwgc3RydWN0IHB4YTN4eF9iYm0gKipiYm0pCit7CisJc3RydWN0IG5h bmRfY2hpcCAqaW5mbyA9IG10ZC0+cHJpdjsKKwlzdHJ1Y3QgcHhhM3h4X2JibSAqKm5iYm0gPSBO VUxMOworCisJLyogY2hlY2sgd2hldGhlciBjdXJyZW50IGZsYXNoIGlzIG5hbmQgKi8KKwluYmJt ID0gKHN0cnVjdCBweGEzeHhfYmJtICoqKSgrK2luZm8pOworCWlmICgoKHVuc2lnbmVkIGludClu YmJtIDwgUEFHRV9PRkZTRVQpCisJCXx8ICgodW5zaWduZWQgaW50KSpuYmJtIDwgUEFHRV9PRkZT RVQpKQorCQlyZXR1cm4gUFhBM3h4X0JCTV9JTlZBTElEOworCisJaWYgKCgqbmJibSktPm1hZ2lj ID09IFBYQV9CQk1fTUFHSUMpIHsKKwkJcHJfZGVidWcoIiVzOkZvdW5kIE5hbmQgZmxhc2guXG4i LCBfX2Z1bmNfXyk7CisJCSpiYm0gPSAqbmJibTsKKwkJcmV0dXJuIFBYQTN4eF9CQk1fTkFORDsK Kwl9CisJcmV0dXJuIFBYQTN4eF9CQk1fSU5WQUxJRDsKK30KKworc3RhdGljIGludCBweGEzeHhf bmFuZF9yZWxvY2F0ZV9hZGRyKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBpbnQgcGFnZV9hZGRyKQor eworCXN0cnVjdCBweGEzeHhfbmFuZF9pbmZvICppbmZvID0gbXRkLT5wcml2OworCXN0cnVjdCBw eGEzeHhfYmJtICpiYm0gPSBpbmZvLT5iYm07CisJbG9mZl90IGFkZHI7CisJaW50IHJldDsKKwor CWFkZHIgPSBwYWdlX2FkZHIgPDwgYmJtLT5wYWdlX3NoaWZ0OworCWFkZHIgPSBiYm0tPnNlYXJj aChtdGQsIGFkZHIpOworCXJldCA9IGFkZHIgPj4gYmJtLT5wYWdlX3NoaWZ0OworCXJldHVybiBy ZXQ7Cit9CisKK3N0YXRpYyBpbnQgcHhhM3h4X25hbmRfYmxvY2tfbWFya2JhZChzdHJ1Y3QgbXRk X2luZm8gKm10ZCwgbG9mZl90IG9mcykKK3sKKwlzdHJ1Y3QgcHhhM3h4X25hbmRfaW5mbyAqaW5m byA9IG10ZC0+cHJpdjsKKwlzdHJ1Y3QgcHhhM3h4X2JibSAqYmJtID0gaW5mby0+YmJtOworCXN0 cnVjdCBuYW5kX2NoaXAgKmNoaXAgPSBtdGQtPnByaXY7CisJdWludDhfdCBidWZbMl0gPSB7IDAs IDAgfTsKKwlpbnQgYmxvY2ssIHJldDsKKworCS8qIEdldCBibG9jayBudW1iZXIgKi8KKwlibG9j ayA9IChpbnQpKG9mcyA+PiBjaGlwLT5iYnRfZXJhc2Vfc2hpZnQpOworCisJLyogV2Ugd3JpdGUg dHdvIGJ5dGVzLCBzbyB3ZSBkb250IGhhdmUgdG8gbWVzcyB3aXRoIDE2IGJpdAorCSAqIGFjY2Vz cworCSAqLworCW9mcyArPSBtdGQtPm9vYnNpemU7CisJY2hpcC0+b3BzLmxlbiA9IGNoaXAtPm9w cy5vb2JsZW4gPSAyOworCWNoaXAtPm9wcy5kYXRidWYgPSBOVUxMOworCWNoaXAtPm9wcy5vb2Ji dWYgPSBidWY7CisJY2hpcC0+b3BzLm9vYm9mZnMgPSBjaGlwLT5iYWRibG9ja3BvcyAmIH4weDAx OworCisJcmV0ID0gbXRkLT53cml0ZV9vb2IobXRkLCBvZnMsICZjaGlwLT5vcHMpOworCisJaWYg KCFyZXQpCisJCW10ZC0+ZWNjX3N0YXRzLmJhZGJsb2NrcysrOworCisJcmV0dXJuIGJibS0+Ymxv Y2tfbWFya2JhZChtdGQsIGJsb2NrKTsKK30KKworc3RhdGljIHZvaWQgcHhhM3h4X25hbmRfaW5p dF9tdGQoc3RydWN0IG10ZF9pbmZvICptdGQsCisJCQkJIHN0cnVjdCBweGEzeHhfbmFuZF9pbmZv ICppbmZvKQoreworCWNvbnN0IHN0cnVjdCBweGEzeHhfbmFuZF9mbGFzaCAqZiA9IGluZm8tPmZs YXNoX2luZm87CisJc3RydWN0IG5hbmRfY2hpcCAqdGhpcyA9ICZpbmZvLT5uYW5kX2NoaXA7CisJ c3RydWN0IHB4YTN4eF9iYm0gKmJibSA9IE5VTEw7CisKKwl0aGlzLT5vcHRpb25zID0gKGYtPmZs YXNoX3dpZHRoID09IDE2KSA/IE5BTkRfQlVTV0lEVEhfMTY6IDA7CisKKwl0aGlzLT53YWl0ZnVu YwkJPSBweGEzeHhfbmFuZF93YWl0ZnVuYzsKKwl0aGlzLT5zZWxlY3RfY2hpcAk9IHB4YTN4eF9u YW5kX3NlbGVjdF9jaGlwOworCXRoaXMtPmRldl9yZWFkeQkJPSBweGEzeHhfbmFuZF9kZXZfcmVh ZHk7CisJdGhpcy0+Y21kZnVuYwkJPSBweGEzeHhfbmFuZF9jbWRmdW5jOworCXRoaXMtPnJlYWRf d29yZAkJPSBweGEzeHhfbmFuZF9yZWFkX3dvcmQ7CisJdGhpcy0+cmVhZF9ieXRlCQk9IHB4YTN4 eF9uYW5kX3JlYWRfYnl0ZTsKKwl0aGlzLT5yZWFkX2J1ZgkJPSBweGEzeHhfbmFuZF9yZWFkX2J1 ZjsKKwl0aGlzLT53cml0ZV9idWYJCT0gcHhhM3h4X25hbmRfd3JpdGVfYnVmOworCXRoaXMtPnZl cmlmeV9idWYJPSBweGEzeHhfbmFuZF92ZXJpZnlfYnVmOworCisJdGhpcy0+ZWNjLm1vZGUJCT0g TkFORF9FQ0NfSFc7CisJdGhpcy0+ZWNjLmh3Y3RsCQk9IHB4YTN4eF9uYW5kX2VjY19od2N0bDsK Kwl0aGlzLT5lY2MuY2FsY3VsYXRlCT0gcHhhM3h4X25hbmRfZWNjX2NhbGN1bGF0ZTsKKwl0aGlz LT5lY2MuY29ycmVjdAk9IHB4YTN4eF9uYW5kX2VjY19jb3JyZWN0OworCXRoaXMtPmVjYy5zaXpl CQk9IGYtPnBhZ2Vfc2l6ZTsKKworCWlmIChmLT5wYWdlX3NpemUgPT0gMjA0OCkKKwkJdGhpcy0+ ZWNjLmxheW91dCA9ICZod19sYXJnZXBhZ2VfZWNjbGF5b3V0OworCWVsc2UKKwkJdGhpcy0+ZWNj LmxheW91dCA9ICZod19zbWFsbHBhZ2VfZWNjbGF5b3V0OworCisJdGhpcy0+Y2hpcF9kZWxheSA9 IDI1OworCisJYmJtID0gcHhhM3h4X3F1ZXJ5X2JibSgpOworCWlmIChiYm0pIHsKKwkJLyogTWFy dmVsbCBQWEEzeHggQkJNIGlzIGluaXRpYWxpemVkIHN1Y2Nlc3NmdWxseSAqLworCQlpbmZvLT5i Ym0gPSBiYm07CisJCXRoaXMtPnNjYW5fYmJ0ID0gYmJtLT5zY2FuX2JidDsKKwkJdGhpcy0+Ymxv Y2tfbWFya2JhZCA9IHB4YTN4eF9uYW5kX2Jsb2NrX21hcmtiYWQ7CisJfQorfQorI2Vsc2UKK3N0 YXRpYyBpbnQgcHhhM3h4X25hbmRfcmVsb2NhdGVfYWRkcihzdHJ1Y3QgbXRkX2luZm8gKm10ZCwg aW50IHBhZ2VfYWRkcikKK3sKKwlyZXR1cm4gcGFnZV9hZGRyOworfQorCiBzdGF0aWMgdm9pZCBw eGEzeHhfbmFuZF9pbml0X210ZChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwKIAkJCQkgc3RydWN0IHB4 YTN4eF9uYW5kX2luZm8gKmluZm8pCiB7CkBAIC0xMTk2LDYgKzEzMTksNyBAQCBzdGF0aWMgdm9p ZCBweGEzeHhfbmFuZF9pbml0X210ZChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwKIAogCXRoaXMtPmNo aXBfZGVsYXkgPSAyNTsKIH0KKyNlbmRpZgogCiBzdGF0aWMgaW50IHB4YTN4eF9uYW5kX3Byb2Jl KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL210 ZC9weGEzeHhfYmJtLmMgYi9kcml2ZXJzL210ZC9weGEzeHhfYmJtLmMKbmV3IGZpbGUgbW9kZSAx MDA2NDQKaW5kZXggMDAwMDAwMC4uYmNjOWEzNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMv bXRkL3B4YTN4eF9iYm0uYwpAQCAtMCwwICsxLDQyNyBAQAorLyoKKyAqIGxpbnV4L2RyaXZlcnMv bXRkL3B4YTN4eF9iYm0uYworICoKKyAqIFN1cHBvcnQgYmFkIGJsb2NrIG1hbmFnZW1lbnQgb24g UFhBM3h4LgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1hcnZlbGwgSW50ZXJuYXRpb25hbCBMdGQu CisgKgorICogSGFvamlhbiBaaHVhbmcgPGhhb2ppYW4uemh1YW5nQG1hcnZlbGwuY29tPgorICoK KyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBp dCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFs IFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNv ZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tdGQvbXRkLmg+ CisjaW5jbHVkZSA8bGludXgvbXRkL25hbmQuaD4KKyNpbmNsdWRlIDxwbGF0L3B4YTN4eF9iYm0u aD4KKyNpbmNsdWRlIDxhc20vZXJybm8uaD4KKworc3RhdGljIHN0cnVjdCBweGEzeHhfYmJtICpw eGEzeHhfYmJtID0gTlVMTDsKKworLyoKKyAqIGJibSBzaG91bGQgYmUgdGhlIG5leHQgZmllbGQg b2YgbmFuZF9jaGlwIG9yIG9uZW5hbmRfY2hpcC4KKyAqLworc3RhdGljIGludCB2ZXJpZnlfYmJt X21hZ2ljKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBzdHJ1Y3QgcHhhM3h4X2JibSAqKmJibSkKK3sK KwlpbnQgcmV0OworCisJcmV0ID0gdmVyaWZ5X25hbmRfYmJtKG10ZCwgYmJtKTsKKwlyZXR1cm4g cmV0OworfQorCitzdGF0aWMgdm9pZCBkdW1wX3JsdGFibGUoc3RydWN0IHB4YTN4eF9iYm0gKmJi bSkKK3sKKwlpbnQgaTsKKworCWlmIChiYm0tPnRhYmxlLT50b3RhbCA9PSAwKSB7CisJCXByX2lu Zm8oIlRoZSByZWxvY2F0aW9uIHRhYmxlIGlzIGVtcHR5IG5vd1xuIik7CisJCXJldHVybjsKKwl9 CisJZm9yIChpID0gMDsgaSA8IGJibS0+dGFibGUtPnRvdGFsOyBpKyspIHsKKwkJaWYgKGJibS0+ ZW50cnlbaV0uZnJvbSA9PSAodW5zaWduZWQgc2hvcnQpKC0xKSkKKwkJCWNvbnRpbnVlOworCQlp ZiAoYmJtLT5lbnRyeVtpXS50byA9PSAodW5zaWduZWQgc2hvcnQpKC0xKSkKKwkJCXByX2luZm8o IiglNGQpOiBibG9jayAjJWQgaXMgYmFkIGluIHJlbG9jYXRpb24gYXJlYVxuIiwKKwkJCQlpLCBi Ym0tPmVudHJ5W2ldLmZyb20pOworCQllbHNlCisJCQlwcl9pbmZvKCIoJTRkKTogYmxvY2sgIyVk IGlzIHJlbG9jYXRlZCB0byAjJWRcbiIsCisJCQkJaSwgYmJtLT5lbnRyeVtpXS5mcm9tLCBiYm0t PmVudHJ5W2ldLnRvKTsKKwl9Cit9CisKKy8qIEluaXRpYWxpemUgdGhlIHJlbG9jYXRpb24gdGFi bGUgKi8KK3N0YXRpYyBpbnQgcHhhM3h4X2luaXRfcmx0YWJsZShzdHJ1Y3QgbXRkX2luZm8gKm10 ZCkKK3sKKwlzdHJ1Y3QgcHhhM3h4X2JibSAqYmJtID0gTlVMTDsKKwlpbnQgc2l6ZSA9IG10ZC0+ d3JpdGVzaXplICsgbXRkLT5vb2JzaXplOworCWludCBwYWdlcywgZW50cmllczsKKworCWlmICh2 ZXJpZnlfYmJtX21hZ2ljKG10ZCwgJmJibSkgPCAwKSB7CisJCS8qIEJCTSBkb24ndCBzdXBwb3J0 IHRoaXMgdHlwZSBvZiBmbGFzaCAqLworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwliYm0tPnBh Z2Vfc2hpZnQgPSBmZnMobXRkLT53cml0ZXNpemUpIC0gMTsKKwliYm0tPmVyYXNlX3NoaWZ0ID0g ZmZzKG10ZC0+ZXJhc2VzaXplKSAtIDE7CisKKwlwYWdlcyA9IG10ZC0+ZXJhc2VzaXplID4+IGJi bS0+cGFnZV9zaGlmdDsKKworCWVudHJpZXMgPSBtdGQtPnNpemUgPj4gYmJtLT5lcmFzZV9zaGlm dDsKKwllbnRyaWVzID0gKGVudHJpZXMgKiAyKSAvIDEwMDsKKwlpZiAobXRkLT53cml0ZXNpemUg PT0gNTEyKQorCQllbnRyaWVzID0gKGVudHJpZXMgPCBQWEFfTUFYX1JMRU5UUlkpID8gZW50cmll cworCQkJICA6IFBYQV9NQVhfUkxFTlRSWTsKKworCWJibS0+bWF4X3Nsb3RzCT0gUFhBX01BWF9T TE9UOworCWJibS0+bWF4X3JlbG9jYXRlX2VudHJ5ID0gZW50cmllczsKKwliYm0tPmN1cnJlbnRf c2xvdCA9IC0xOworCisJYmJtLT5kYXRhX2J1ZiA9IGt6YWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7 CisJaWYgKGJibS0+ZGF0YV9idWYgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwliYm0t PnRhYmxlID0gKHN0cnVjdCByZWxvY2F0ZV90YWJsZSAqKWJibS0+ZGF0YV9idWY7CisJbWVtc2V0 KGJibS0+dGFibGUsIDAsIHNpemVvZihzdHJ1Y3QgcmVsb2NhdGVfdGFibGUpKTsKKworCWJibS0+ ZW50cnkgPSAoc3RydWN0IHJlbG9jYXRlX2VudHJ5ICopKCh1aW50OF90ICopYmJtLT5kYXRhX2J1 ZiArCisJCQlzaXplb2Yoc3RydWN0IHJlbG9jYXRlX2VudHJ5KSk7CisJbWVtc2V0KGJibS0+ZW50 cnksIDAsIHNpemVvZihzdHJ1Y3QgcmVsb2NhdGVfZW50cnkpCisJCSogYmJtLT5tYXhfcmVsb2Nh dGVfZW50cnkpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIFVuaW5pdGlhbGl6ZSB0aGUgcmVsb2Nh dGlvbiB0YWJsZSAqLworc3RhdGljIHZvaWQgcHhhM3h4X3VuaW5pdF9ybHRhYmxlKHN0cnVjdCBt dGRfaW5mbyAqbXRkKQoreworCXN0cnVjdCBweGEzeHhfYmJtICpiYm0gPSBOVUxMOworCisJaWYg KHZlcmlmeV9iYm1fbWFnaWMobXRkLCAmYmJtKSA8IDApIHsKKwkJLyogQkJNIGRvbid0IHN1cHBv cnQgdGhpcyBmbGFzaCB0eXBlICovCisJCXJldHVybjsKKwl9CisKKwlpZiAoYmJtKSB7CisJCWtm cmVlKGJibS0+ZGF0YV9idWYpOworCQliYm0gPSBOVUxMOworCX0KK30KKworLyoKKyAqIE1vdmUg bGFyZ2VyIGRhdGEgdG8gbGVmdCBvZiBwaXZvdCwgYW5kIG1vdmUgc21hbGxlciBkYXRhIHRvIHJp Z2h0IG9mCisgKiBwaXZvdC4KKyAqLworc3RhdGljIGludCBwYXJ0aXRpb24odW5zaWduZWQgc2hv cnQgKmFycmF5LCBpbnQgbGVmdCwgaW50IHJpZ2h0LCBpbnQgcGl2b3RfaWR4KQoreworCWludCBp LCBwaXZvdCwgYmFzZV9pZHg7CisKKwlwaXZvdCA9IGFycmF5W3Bpdm90X2lkeF07CisJc3dhcChh cnJheVtsZWZ0XSwgYXJyYXlbcmlnaHRdKTsKKwliYXNlX2lkeCA9IGxlZnQ7CisKKwlmb3IgKGkg PSBsZWZ0OyBpIDwgcmlnaHQ7IGkrKykgeworCQlpZiAoYXJyYXlbaV0gPiBwaXZvdCkgeworCQkJ c3dhcChhcnJheVtpXSwgYXJyYXlbYmFzZV9pZHhdKTsKKwkJCWJhc2VfaWR4Kys7CisJCX0KKwl9 CisJaWYgKGJhc2VfaWR4IDwgcmlnaHQpCisJCXN3YXAoYXJyYXlbYmFzZV9pZHhdLCBhcnJheVty aWdodF0pOworCXJldHVybiBiYXNlX2lkeDsKK30KKworc3RhdGljIGludCBxdWlja19zb3J0KHVu c2lnbmVkIHNob3J0ICphcnJheSwgaW50IGxlZnQsIGludCByaWdodCkKK3sKKwlpbnQgcGl2b3Rf aWR4LCBuZXdfaWR4OworCWlmIChyaWdodCA+IGxlZnQpIHsKKwkJcGl2b3RfaWR4ID0gbGVmdDsK KwkJbmV3X2lkeCA9IHBhcnRpdGlvbihhcnJheSwgbGVmdCwgcmlnaHQsIHBpdm90X2lkeCk7CisJ CXF1aWNrX3NvcnQoYXJyYXksIGxlZnQsIG5ld19pZHggLSAxKTsKKwkJcXVpY2tfc29ydChhcnJh eSwgbmV3X2lkeCArIDEsIHJpZ2h0KTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBBZGQg dGhlIHJlbG9jYXRpb24gZW50cnkgaW50byB0aGUgcmVsb2NhdGlvbiB0YWJsZS4gSWYgdGhlIHJl bG9jYXRlZCBibG9jaworICogaXMgYmFkLCBhbiBuZXcgZW50cnkgd2lsbCBiZSBhZGRlZCBpbnRv IHRoZSBib3R0b20gb2YgdGhlIHJlbG9jYXRpb24gdGFibGUuCisgKi8KK2ludCB1cGRhdGVfcmx0 YWJsZShzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgaW50IGJsb2NrKQoreworCXN0cnVjdCBweGEzeHhf YmJtICpiYm0gPSBOVUxMOworCXN0cnVjdCByZWxvY2F0ZV90YWJsZSAqdGFibGUgPSBOVUxMOwor CXN0cnVjdCByZWxvY2F0ZV9lbnRyeSAqZW50cnkgPSBOVUxMOworCXN0cnVjdCBlcmFzZV9pbmZv IGluc3RyOworCXVuc2lnbmVkIHNob3J0IGFycmF5W1BYQV9NQVhfUkxFTlRSWV0sIGFkZHI7CisJ aW50IGksIGlkeCwgcmV0LCByZWxvY2F0ZWRfaWR4ID0gLTE7CisKKwlpZiAodmVyaWZ5X2JibV9t YWdpYyhtdGQsICZiYm0pIDwgMCkgeworCQkvKiBCQk0gZG9uJ3Qgc3VwcG9ydCB0aGlzIHR5cGUg b2YgZmxhc2ggKi8KKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJdGFibGUgPSBiYm0tPnRhYmxl OworCWVudHJ5ID0gYmJtLT5lbnRyeTsKKworCS8qIGlkZW50aWZ5IHdoZXRoZXIgdGhlIGJsb2Nr IGhhcyBiZWVuIHJlbG9jYXRlZCAqLworCWZvciAoaSA9IDA7IGkgPCB0YWJsZS0+dG90YWw7IGkr KykgeworCQlpZiAoZW50cnlbaV0uZnJvbSA9PSAodW5zaWduZWQgc2hvcnQpKC0xKSkKKwkJCWNv bnRpbnVlOworCQlpZiAoYmxvY2sgPT0gZW50cnlbaV0uZnJvbSkgeworCQkJcmVsb2NhdGVkX2lk eCA9IGk7CisJCQlicmVhazsKKwkJfQorCX0KKworc2NhbjoKKwlpZiAodGFibGUtPnRvdGFsID4g YmJtLT5tYXhfcmVsb2NhdGVfZW50cnkpIHsKKwkJcHJfd2FybmluZygiUmVsb2NhdGlvbiBlbnRy aWVzIGV4Y2VlZCBtYXggbnVtLiBDYW4ndCByZWxvY2F0ZSIpOworCQlwcl93YXJuaW5nKCIgYmxv Y2sgMHgleFxuIiwgYmxvY2spOworCQlyZXR1cm4gLUVOT1NQQzsKKwl9CisKKwltZW1zZXQoYXJy YXksIDAsIFBYQV9NQVhfUkxFTlRSWSk7CisJLyogR2V0IGFsbCBpbmRleCBvZiByZWxvY2F0ZWQg YmxvY2tzICovCisJZm9yIChpID0gMCwgaWR4ID0gMDsgaSA8IHRhYmxlLT50b3RhbDsgaSsrKSB7 CisJCWFycmF5W2lkeF0gPSAoZW50cnlbaV0udG8gIT0gKHVuc2lnbmVkIHNob3J0KSgtMSkpID8g ZW50cnlbaV0udG8KKwkJCQk6IGVudHJ5W2ldLmZyb207CisJCWlkeCsrOworCX0KKwkvKiBzb3J0 IGFycmF5IHdpdGggZGVzY2VuZGluZyBvcmRlciAqLworCXF1aWNrX3NvcnQoYXJyYXksIDAsIGlk eCAtIDEpOworCS8qCisJICogZmluZCB0aGUgYXZhaWxhYmxlIGJsb2NrIHdpdGggdGhlIGxhcmdl c3QgbnVtYmVyIGluIHJlc2VydmVyZWQKKwkgKiBhcmVhCisJICovCisJYWRkciA9ICh1bnNpZ25l ZCBzaG9ydCkoKG10ZC0+c2l6ZSA+PiBiYm0tPmVyYXNlX3NoaWZ0KSAtIDEpOworCWZvciAoaSA9 IDA7IGkgPCBiYm0tPm1heF9yZWxvY2F0ZV9lbnRyeTsgaSsrLCBhZGRyLS0pIHsKKwkJaWYgKGFk ZHIgPCAoKG10ZC0+c2l6ZSA+PiBiYm0tPmVyYXNlX3NoaWZ0KQorCQkJLSBiYm0tPm1heF9yZWxv Y2F0ZV9lbnRyeSkpIHsKKwkJCXByX3dhcm5pbmcoIlJlbG9jYXRpb24gYXJlYSBpcyBhbHJlYWR5 IGZ1bGwhXG4iKTsKKwkJCXJldHVybiAtRU5PU1BDOworCQl9CisJCWlmIChhcnJheVtpXSA8IGFk ZHIpIHsKKwkJCW1lbXNldCgmaW5zdHIsIDAsIHNpemVvZihzdHJ1Y3QgZXJhc2VfaW5mbykpOwor CQkJaW5zdHIubXRkID0gbXRkOworCQkJaW5zdHIuYWRkciA9IGFkZHIgPDwgYmJtLT5lcmFzZV9z aGlmdDsKKwkJCWluc3RyLmxlbiA9IDEgPDwgYmJtLT5lcmFzZV9zaGlmdDsKKwkJCXJldCA9IG10 ZC0+ZXJhc2UobXRkLCAmaW5zdHIpOworCQkJaWYgKHJldCA9PSAwKSB7CisJCQkJLyogZmlsbCB0 aGUgcmVjb3JkZXIgaW50byByZWxvY2F0aW9uIHRhYmxlICovCisJCQkJaWYgKHJlbG9jYXRlZF9p ZHggPT0gLTEpIHsKKwkJCQkJLyogbmV3IGVudHJ5IGluIHJlbG9jYXRpb24gdGFibGUgKi8KKwkJ CQkJZW50cnlbdGFibGUtPnRvdGFsXS5mcm9tID0gYmxvY2s7CisJCQkJCWVudHJ5W3RhYmxlLT50 b3RhbF0udG8gPSBhZGRyOworCQkJCQl0YWJsZS0+dG90YWwrKzsKKwkJCQkJZ290byBkb25lOwor CQkJCX0gZWxzZSB7CisJCQkJCS8qIHVwZGF0ZSBlbnRyeSBpbiByZWxvY2F0aW9uIHRhYmxlICov CisJCQkJCWVudHJ5W3RhYmxlLT50b3RhbF0uZnJvbQorCQkJCQkJPSBlbnRyeVtyZWxvY2F0ZWRf aWR4XS50bzsKKwkJCQkJZW50cnlbdGFibGUtPnRvdGFsXS50bworCQkJCQkJPSAodW5zaWduZWQg c2hvcnQpKC0xKTsKKwkJCQkJdGFibGUtPnRvdGFsKys7CisJCQkJCWVudHJ5W3JlbG9jYXRlZF9p ZHhdLnRvID0gYWRkcjsKKwkJCQkJZ290byBkb25lOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJ LyogYXBwZW5kIG5ldyBiYWQgZW50cnkgKi8KKwkJCQllbnRyeVt0YWJsZS0+dG90YWxdLmZyb20g PSBhZGRyOworCQkJCWVudHJ5W3RhYmxlLT50b3RhbF0udG8gPSAodW5zaWduZWQgc2hvcnQpKC0x KTsKKwkJCQl0YWJsZS0+dG90YWwrKzsKKwkJCQlnb3RvIHNjYW47CisJCQl9CisJCX0KKwl9CisK K2RvbmU6CisJcmV0dXJuIDA7Cit9CisKKy8qIFdyaXRlIHRoZSByZWxvY2F0aW9uIHRhYmxlIGJh Y2sgdG8gZGV2aWNlLCBpZiB0aGVyZSdzIHJvb20uICovCitzdGF0aWMgaW50IHN5bmNfcmx0YWJs ZShzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgaW50ICppZHgpCit7CisJc3RydWN0IHB4YTN4eF9iYm0g KmJibSA9IE5VTEw7CisJdW5zaWduZWQgY2hhciAqdG1wOworCXNpemVfdCByZXRsZW47CisJaW50 IGxlbiwgcGFnZXM7CisKKwlpZiAodmVyaWZ5X2JibV9tYWdpYyhtdGQsICZiYm0pIDwgMCkgewor CQkvKiBCQk0gZG9uJ3Qgc3VwcG9ydCB0aGlzIHR5cGUgb2YgZmxhc2ggKi8KKwkJcmV0dXJuIC1F SU5WQUw7CisJfQorCisJcGFnZXMgPSBtdGQtPmVyYXNlc2l6ZSA+PiBiYm0tPnBhZ2Vfc2hpZnQ7 CisJaWYgKCgqaWR4ID49IHBhZ2VzKSB8fCAoKmlkeCA8PSAocGFnZXMgLSBiYm0tPm1heF9zbG90 cykpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiV3JvbmcgU2xvdCBpcyBzcGVjaWZpZWQuXG4iKTsK KwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogc2hvdWxkIHdyaXRlIHRvIHRoZSBuZXh0IHNs b3QqLworCSgqaWR4KS0tOworCisJbGVuID0gNDsJCS8qIHRhYmxlIGhlYWRlciAqLworCWxlbiAr PSBiYm0tPnRhYmxlLT50b3RhbCA8PCAyOworCisJdG1wID0gKHVuc2lnbmVkIGNoYXIgKiliYm0t PmRhdGFfYnVmOworCW10ZC0+d3JpdGUobXRkLCAoKmlkeCkgPDwgYmJtLT5wYWdlX3NoaWZ0LAor CQkgICAxIDw8IGJibS0+cGFnZV9zaGlmdCwgJnJldGxlbiwgdG1wKTsKKworCXJldHVybiAwOwor fQorCitzdGF0aWMgaW50IHB4YTN4eF9zY2FuX3JsdGFibGUoc3RydWN0IG10ZF9pbmZvICptdGQp Cit7CisJc3RydWN0IHB4YTN4eF9iYm0gKmJibSA9IE5VTEw7CisJc3RydWN0IHJlbG9jYXRlX3Rh YmxlICp0YWJsZTsKKwlpbnQgcGFnZSwgbWF4X3BhZ2U7CisJc2l6ZV90IHJldGxlbjsKKwlpbnQg cmV0LCByZXRyeV9jb3VudCA9IDM7CisKKwlpZiAodmVyaWZ5X2JibV9tYWdpYyhtdGQsICZiYm0p IDwgMCkgeworCQkvKiBCQk0gZG9uJ3Qgc3VwcG9ydCB0aGlzIHR5cGUgb2YgZmxhc2ggKi8KKwkJ cmV0dXJuIC1FSU5WQUw7CisJfQorCisJcHhhM3h4X2luaXRfcmx0YWJsZShtdGQpOworCisJdGFi bGUgPSBiYm0tPnRhYmxlOworCisJYmJtLT5jdXJyZW50X3Nsb3QgPSAtMTsKKwlwYWdlID0gKG10 ZC0+ZXJhc2VzaXplID4+IGJibS0+cGFnZV9zaGlmdCkgLSBiYm0tPm1heF9zbG90czsKKwltYXhf cGFnZSA9IG10ZC0+ZXJhc2VzaXplID4+IGJibS0+cGFnZV9zaGlmdDsKKwlmb3IgKDsgcGFnZSA8 IG1heF9wYWdlOyBwYWdlKyssIHJldHJ5X2NvdW50ID0gMykgeworcmV0cnk6CisJCW1lbXNldChi Ym0tPmRhdGFfYnVmLCAwLCBtdGQtPndyaXRlc2l6ZSArIG10ZC0+b29ic2l6ZSk7CisJCXJldCA9 IG10ZC0+cmVhZChtdGQsIChwYWdlIDw8IGJibS0+cGFnZV9zaGlmdCksCisJCQkJbXRkLT53cml0 ZXNpemUsICZyZXRsZW4sIGJibS0+ZGF0YV9idWYpOworCQlpZiAocmV0ID09IDApIHsKKwkJCWlm ICh0YWJsZS0+aGVhZGVyID09IFBYQV9STFRBQkxFX0hFQURFUikgeworCQkJCWJibS0+Y3VycmVu dF9zbG90ID0gcGFnZTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIChyZXRy eV9jb3VudC0tKQorCQkJCWdvdG8gcmV0cnk7CisJCX0KKwl9CisJaWYgKGJibS0+Y3VycmVudF9z bG90ICE9IC0xKSB7CisJCXByX2RlYnVnKCJGb3VuZCByZWxvY2F0aW9uIHRhYmxlIGF0IHBhZ2U6 JWRcbiIsCisJCQliYm0tPmN1cnJlbnRfc2xvdCk7CisJCWR1bXBfcmx0YWJsZShiYm0pOworCX0g ZWxzZSB7CisJCXByX2VycigiQ2FuJ3QgcmVjb2duaXplIHJlbG9jYXRpb24gdGFibGUuXG4iKTsK KwkJcHJfZXJyKCJDQVVUSU9OOiBJdCBtYXkgY2F1c2UgdW5wcmVkaWNhdGVkIGVycm9yXG4iKTsK KwkJcHJfZXJyKCJQbGVhc2UgcmUtaW5pdGlhbGl6ZSB0aGUgZmxhc2guXG4iKTsKKwkJbWVtc2V0 KCh1bnNpZ25lZCBjaGFyICopYmJtLT50YWJsZSwgMCwKKwkJCXNpemVvZihzdHJ1Y3QgcmVsb2Nh dGVfdGFibGUpKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCXJldHVybiAwOworfQorCisvKgor ICogRmluZCB0aGUgcmVsb2NhdGVkIGJsb2NrIG9mIHRoZSBiYWQgb25lLgorICogSWYgaXQncyBh IGdvb2QgYmxvY2ssIHJldHVybiAwLiBPdGhlcndpc2UsIHJldHVybiBhIHJlbG9jYXRlZCBvbmUu CisgKiBpZHggcG9pbnRzIHRvIHRoZSBuZXh0IHJlbG9jYXRpb24gZW50cnkKKyAqIElmIHRoZSBy ZWxvY2F0ZWQgYmxvY2sgaXMgYmFkLCBhbiBuZXcgZW50cnkgd2lsbCBiZSBhZGRlZCBpbnRvIHRo ZQorICogYm90dG9tIG9mIHRoZSByZWxvY2F0aW9uIHRhYmxlLgorICovCitzdGF0aWMgbG9mZl90 IHB4YTN4eF9zZWFyY2hfcmxlbnRyeShzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgbG9mZl90IG9mcykK K3sKKwlzdHJ1Y3QgcHhhM3h4X2JibSAqYmJtID0gTlVMTDsKKwlzdHJ1Y3QgcmVsb2NhdGVfdGFi bGUgKnRhYmxlID0gTlVMTDsKKwlzdHJ1Y3QgcmVsb2NhdGVfZW50cnkgKmVudHJ5ID0gTlVMTDsK KwlpbnQgaSwgYmxvY2s7CisKKwkvKgorCSAqIEluIFNMQywgYmxvY2sgMCBzaG91bGRuJ3QgYmUg YnJva2VuLgorCSAqIEluIHNvbWUgY29tbWFuZCwgYWRkcmVzcyBpcyBhc3NpZ25lZCB0byAwIGlm IGl0IGRvZXNuJ3QgbmVlZAorCSAqIHRvIG9wZXJhdGUgYWRkcmVzcy4gU28ganVzdCBza2lwIGl0 LgorCSAqLworCWlmIChvZnMgPD0gMCkKKwkJcmV0dXJuIG9mczsKKworCWlmICh2ZXJpZnlfYmJt X21hZ2ljKG10ZCwgJmJibSkgPCAwKQorCQlyZXR1cm4gb2ZzOworCisJdGFibGUgPSBiYm0tPnRh YmxlOworCWVudHJ5ID0gYmJtLT5lbnRyeTsKKworCWJsb2NrID0gb2ZzID4+IGJibS0+ZXJhc2Vf c2hpZnQ7CisKKwlpZiAoKGJibS0+Y3VycmVudF9zbG90ID09IC0xKSB8fCAodGFibGUtPnRvdGFs IDw9IDApCisJCXx8IChibG9jayA+PSAobXRkLT5zaXplID4+IGJibS0+ZXJhc2Vfc2hpZnQpKSkK KwkJcmV0dXJuIG9mczsKKworCW9mcyA9IG9mcyAtIChibG9jayA8PCBiYm0tPmVyYXNlX3NoaWZ0 KTsJLyogc2F2ZSBvZmZzZXQgKi8KKworCWZvciAoaSA9IDA7IGkgPCB0YWJsZS0+dG90YWw7IGkr KykgeworCQlpZiAoYmxvY2sgPT0gZW50cnlbaV0uZnJvbSkgeworCQkJYmxvY2sgPSBlbnRyeVtp XS50bzsKKwkJCWJyZWFrOworCQl9CisJfQorCW9mcyArPSBibG9jayA8PCBiYm0tPmVyYXNlX3No aWZ0OworCXJldHVybiBvZnM7Cit9CisKK3N0YXRpYyBpbnQgcHhhM3h4X21hcmtfcmxlbnRyeShz dHJ1Y3QgbXRkX2luZm8gKm10ZCwgaW50IGJsb2NrKQoreworCXN0cnVjdCBweGEzeHhfYmJtICpi Ym0gPSBOVUxMOworCWludCByZXQgPSAwOworCisJcmV0ID0gdmVyaWZ5X2JibV9tYWdpYyhtdGQs ICZiYm0pOworCWlmIChyZXQgPCAwKSB7CisJCS8qIEJCTSBkb24ndCBzdXBwb3J0IHRoaXMgdHlw ZSBvZiBmbGFzaCAqLworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXQgPSB1cGRhdGVfcmx0 YWJsZShtdGQsIGJsb2NrKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIHN5 bmNfcmx0YWJsZShtdGQsICYoYmJtLT5jdXJyZW50X3Nsb3QpKTsKK30KKworLyogSWYgTWFydmVs bCBCQk0gaXMgdXNlZCwgcmV0dXJuIDAuIE90aGVyd2lzZSwgcmV0dXJuIG5lZ2F0aXZlIHZhbHVl LiAqLworc3RydWN0IHB4YTN4eF9iYm0gKnB4YTN4eF9xdWVyeV9iYm0odm9pZCkKK3sKKwlpZiAo cHhhM3h4X2JibSkKKwkJcmV0dXJuIHB4YTN4eF9iYm07CisJcmV0dXJuIE5VTEw7Cit9CitFWFBP UlRfU1lNQk9MKHB4YTN4eF9xdWVyeV9iYm0pOworCitzdGF0aWMgaW50IF9faW5pdCBweGEzeHhf YmJtX2luaXQodm9pZCkKK3sKKwlzdHJ1Y3QgcHhhM3h4X2JibSAqYmJtOworCisJYmJtID0ga3ph bGxvYyhzaXplb2Yoc3RydWN0IHB4YTN4eF9iYm0pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWJibSkK KwkJcmV0dXJuIC1FTk9NRU07CisKKwliYm0tPm1hZ2ljCQk9IFBYQV9CQk1fTUFHSUM7CisJYmJt LT51bmluaXQJCT0gcHhhM3h4X3VuaW5pdF9ybHRhYmxlOworCWJibS0+c2VhcmNoCQk9IHB4YTN4 eF9zZWFyY2hfcmxlbnRyeTsKKwliYm0tPmJsb2NrX21hcmtiYWQJPSBweGEzeHhfbWFya19ybGVu dHJ5OworCWJibS0+c2Nhbl9iYnQJCT0gcHhhM3h4X3NjYW5fcmx0YWJsZTsKKworCXB4YTN4eF9i Ym0gPSBiYm07CisKKwlyZXR1cm4gMDsKK30KK3N1YnN5c19pbml0Y2FsbChweGEzeHhfYmJtX2lu aXQpOworCitzdGF0aWMgdm9pZCBweGEzeHhfYmJtX2V4aXQodm9pZCkKK3sKKwlpZiAocHhhM3h4 X2JibSkgeworCQlrZnJlZShweGEzeHhfYmJtKTsKKwkJcHhhM3h4X2JibSA9IE5VTEw7CisJfQor fQorbW9kdWxlX2V4aXQocHhhM3h4X2JibV9leGl0KTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIp OworTU9EVUxFX0RFU0NSSVBUSU9OKCJNYXJ2ZWxsIFBYQTN4eCBCYWQgQmxvY2sgTWFuYWdlbWVu dCIpOwotLSAKMS41LjYuNQoK --001517741a149782d2047465a8bf-- >From bogus@does.not.exist.com Mon Aug 24 09:56:15 2009 From: bogus@does.not.exist.com () Date: Mon, 24 Aug 2009 13:56:15 -0000 Subject: [PATCH] [MTD] [ONENAND] export onenand_command<br><br>Marvell PXA3= Message-ID: <mailman.22.1253879983.2253.linux-arm-kernel@lists.infradead.org> xx bad block management will replaces the bad block with good one.<br>The d= river have to implement custom command function. Export onenand_command()<b= r> in order to reuse the command function in onenand_base.c.<br><br>Signed-off= -by: Haojian Zhuang <<a href=3D"mailto:haojian.zhuang@marvell.com">haoji= an.zhuang at marvell.com</a>><br>---<br>=A0drivers/mtd/onenand/onenand_base= .c |=A0=A0=A0 3 ++-<br> =A0include/linux/mtd/onenand.h=A0=A0=A0=A0=A0=A0=A0 |=A0=A0=A0 2 ++<br>=A02= files changed, 4 insertions(+), 1 deletions(-)<br><br>diff --git a/drivers= /mtd/onenand/onenand_base.c b/drivers/mtd/onenand/onenand_base.c<br>index 6= e82909..8f7c73a 100644<br> --- a/drivers/mtd/onenand/onenand_base.c<br>+++ b/drivers/mtd/onenand/onena= nd_base.c<br>@@ -317,7 +317,7 @@ EXPORT_SYMBOL(flexonenand_region);<br>=A0 = * Send command to OneNAND device. This function is used for middle/large pa= ge<br> =A0 * devices (1KB/2KB Bytes per page)<br>=A0 */<br>-static int onenand_com= mand(struct mtd_info *mtd, int cmd, loff_t addr, size_t len)<br>+int onenan= d_command(struct mtd_info *mtd, int cmd, loff_t addr, size_t len)<br>=A0{<b= r> =A0=A0=A0=A0 struct onenand_chip *this =3D mtd->priv;<br>=A0=A0=A0=A0 in= t value, block, page;<br>@@ -433,6 +433,7 @@ static int onenand_command(str= uct mtd_info *mtd, int cmd, loff_t addr, size_t le<br>=A0<br>=A0=A0=A0=A0 r= eturn 0;<br>=A0}<br>+EXPORT_SYMBOL(onenand_command);<br> =A0<br>=A0/**<br>=A0 * onenand_read_ecc - return ecc status<br>diff --git a= /include/linux/mtd/onenand.h b/include/linux/mtd/onenand.h<br>index 8ed8733= ..c99737f 100644<br>--- a/include/linux/mtd/onenand.h<br>+++ b/include/linu= x/mtd/onenand.h<br> @@ -24,6 +24,8 @@<br>=A0extern int onenand_scan(struct mtd_info *mtd, int m= ax_chips);<br>=A0/* Free resources held by the OneNAND device */<br>=A0exte= rn void onenand_release(struct mtd_info *mtd);<br>+extern int onenand_comma= nd(struct mtd_info *mtd, int cmd,<br> +=A0=A0=A0 =A0=A0=A0 =A0=A0=A0 =A0=A0 loff_t addr, size_t len);<br>=A0<br>= =A0/*<br>=A0 * onenand_state_t - chip states<br>-- <br>1.5.6.5<br><br> --0016e645b8ca818e73047465ae8e-- --0016e645b8ca818e7c047465ae90 Content-Type: text/x-patch; charset=US-ASCII; name="0002--MTD-ONENAND-export-onenand_command.patch" Content-Disposition: attachment; filename="0002--MTD-ONENAND-export-onenand_command.patch" Content-Transfer-Encoding: base64 X-Attachment-Id: f_g01cnbl30 RnJvbSBmMTA0Yzc3OGM0Zjc2ZWJlMWI3ZDRiNDU3NWQ3ZTliMGRmZmM2ZDY5IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBIYW9qaWFuIFpodWFuZyA8aGFvamlhbi56aHVhbmdAbWFydmVs bC5jb20+CkRhdGU6IEZyaSwgMjUgU2VwIDIwMDkgMTU6MTU6NTYgLTA0MDAKU3ViamVjdDogW1BB VENIXSBbTVREXSBbT05FTkFORF0gZXhwb3J0IG9uZW5hbmRfY29tbWFuZAoKTWFydmVsbCBQWEEz eHggYmFkIGJsb2NrIG1hbmFnZW1lbnQgd2lsbCByZXBsYWNlcyB0aGUgYmFkIGJsb2NrIHdpdGgg Z29vZCBvbmUuClRoZSBkcml2ZXIgaGF2ZSB0byBpbXBsZW1lbnQgY3VzdG9tIGNvbW1hbmQgZnVu Y3Rpb24uIEV4cG9ydCBvbmVuYW5kX2NvbW1hbmQoKQppbiBvcmRlciB0byByZXVzZSB0aGUgY29t bWFuZCBmdW5jdGlvbiBpbiBvbmVuYW5kX2Jhc2UuYy4KClNpZ25lZC1vZmYtYnk6IEhhb2ppYW4g Wmh1YW5nIDxoYW9qaWFuLnpodWFuZ0BtYXJ2ZWxsLmNvbT4KLS0tCiBkcml2ZXJzL210ZC9vbmVu YW5kL29uZW5hbmRfYmFzZS5jIHwgICAgMyArKy0KIGluY2x1ZGUvbGludXgvbXRkL29uZW5hbmQu aCAgICAgICAgfCAgICAyICsrCiAyIGZpbGVzIGNoYW5nZWQsIDQgaW5zZXJ0aW9ucygrKSwgMSBk ZWxldGlvbnMoLSkKCmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9vbmVuYW5kL29uZW5hbmRfYmFz ZS5jIGIvZHJpdmVycy9tdGQvb25lbmFuZC9vbmVuYW5kX2Jhc2UuYwppbmRleCA2ZTgyOTA5Li44 ZjdjNzNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9vbmVuYW5kL29uZW5hbmRfYmFzZS5jCisr KyBiL2RyaXZlcnMvbXRkL29uZW5hbmQvb25lbmFuZF9iYXNlLmMKQEAgLTMxNyw3ICszMTcsNyBA QCBFWFBPUlRfU1lNQk9MKGZsZXhvbmVuYW5kX3JlZ2lvbik7CiAgKiBTZW5kIGNvbW1hbmQgdG8g T25lTkFORCBkZXZpY2UuIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBmb3IgbWlkZGxlL2xhcmdlIHBh Z2UKICAqIGRldmljZXMgKDFLQi8yS0IgQnl0ZXMgcGVyIHBhZ2UpCiAgKi8KLXN0YXRpYyBpbnQg b25lbmFuZF9jb21tYW5kKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBpbnQgY21kLCBsb2ZmX3QgYWRk ciwgc2l6ZV90IGxlbikKK2ludCBvbmVuYW5kX2NvbW1hbmQoc3RydWN0IG10ZF9pbmZvICptdGQs IGludCBjbWQsIGxvZmZfdCBhZGRyLCBzaXplX3QgbGVuKQogewogCXN0cnVjdCBvbmVuYW5kX2No aXAgKnRoaXMgPSBtdGQtPnByaXY7CiAJaW50IHZhbHVlLCBibG9jaywgcGFnZTsKQEAgLTQzMyw2 ICs0MzMsNyBAQCBzdGF0aWMgaW50IG9uZW5hbmRfY29tbWFuZChzdHJ1Y3QgbXRkX2luZm8gKm10 ZCwgaW50IGNtZCwgbG9mZl90IGFkZHIsIHNpemVfdCBsZQogCiAJcmV0dXJuIDA7CiB9CitFWFBP UlRfU1lNQk9MKG9uZW5hbmRfY29tbWFuZCk7CiAKIC8qKgogICogb25lbmFuZF9yZWFkX2VjYyAt IHJldHVybiBlY2Mgc3RhdHVzCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L210ZC9vbmVuYW5k LmggYi9pbmNsdWRlL2xpbnV4L210ZC9vbmVuYW5kLmgKaW5kZXggOGVkODczMy4uYzk5NzM3ZiAx MDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tdGQvb25lbmFuZC5oCisrKyBiL2luY2x1ZGUvbGlu dXgvbXRkL29uZW5hbmQuaApAQCAtMjQsNiArMjQsOCBAQAogZXh0ZXJuIGludCBvbmVuYW5kX3Nj YW4oc3RydWN0IG10ZF9pbmZvICptdGQsIGludCBtYXhfY2hpcHMpOwogLyogRnJlZSByZXNvdXJj ZXMgaGVsZCBieSB0aGUgT25lTkFORCBkZXZpY2UgKi8KIGV4dGVybiB2b2lkIG9uZW5hbmRfcmVs ZWFzZShzdHJ1Y3QgbXRkX2luZm8gKm10ZCk7CitleHRlcm4gaW50IG9uZW5hbmRfY29tbWFuZChz dHJ1Y3QgbXRkX2luZm8gKm10ZCwgaW50IGNtZCwKKwkJCSAgIGxvZmZfdCBhZGRyLCBzaXplX3Qg bGVuKTsKIAogLyoKICAqIG9uZW5hbmRfc3RhdGVfdCAtIGNoaXAgc3RhdGVzCi0tIAoxLjUuNi41 Cgo= --0016e645b8ca818e7c047465ae90-- >From bogus@does.not.exist.com Mon Aug 24 09:56:15 2009 From: bogus@does.not.exist.com () Date: Mon, 24 Aug 2009 13:56:15 -0000 Subject: [PATCH] [MTD] [ONENAND] supports custom bbm<br><br>In onenand driv= Message-ID: <mailman.26.1253880048.2253.linux-arm-kernel@lists.infradead.org> er, the default bad block management is embedded. Custom BBM<br>can't b= e used. Now make it to support custom BBM.<br><br>Signed-off-by: Haojian Zh= uang <<a href=3D"mailto:haojian.zhuang@marvell.com">haojian.zhuang at marve= ll.com</a>><br> ---<br>=A0drivers/mtd/onenand/onenand_base.c |=A0=A0 23 +++++++++++++++++++= ++++<br>=A01 files changed, 23 insertions(+), 0 deletions(-)<br><br>diff --= git a/drivers/mtd/onenand/onenand_base.c b/drivers/mtd/onenand/onenand_base= .c<br> index 8f7c73a..cc6bccb 100644<br>--- a/drivers/mtd/onenand/onenand_base.c<b= r>+++ b/drivers/mtd/onenand/onenand_base.c<br>@@ -2136,6 +2136,29 @@ static= int onenand_block_isbad_nolock(struct mtd_info *mtd, loff_t ofs, int allo<= br> =A0{<br>=A0=A0=A0=A0 struct onenand_chip *this =3D mtd->priv;<br>=A0=A0= =A0=A0 struct bbm_info *bbm =3D this->bbm;<br>+=A0=A0=A0 struct mtd_oob_= ops ops;<br>+=A0=A0=A0 unsigned char *buf =3D this->page_buf;<br>+=A0=A0= =A0 int ret;<br>+<br>+=A0=A0=A0 if (!bbm) {<br> +=A0=A0=A0 =A0=A0=A0 ops.mode =3D MTD_OOB_PLACE;<br>+=A0=A0=A0 =A0=A0=A0 op= s.ooblen =3D 2;<br>+=A0=A0=A0 =A0=A0=A0 ops.oobbuf =3D buf;<br>+=A0=A0=A0 = =A0=A0=A0 ops.len =3D 0;<br>+=A0=A0=A0 =A0=A0=A0 ops.ooboffs =3D 0;<br>+=A0= =A0=A0 =A0=A0=A0 ops.retlen =3D 0;<br>+=A0=A0=A0 =A0=A0=A0 ops.oobretlen = =3D 0;<br>+<br>+=A0=A0=A0 =A0=A0=A0 ofs =3D (ofs >> this->erase_sh= ift) << this->erase_shift;<br> +=A0=A0=A0 =A0=A0=A0 ret =3D onenand_read_oob_nolock(mtd, ofs, &ops);<b= r>+=A0=A0=A0 =A0=A0=A0 if (ret =3D=3D ONENAND_BBT_READ_FATAL_ERROR)<br>+=A0= =A0=A0 =A0=A0=A0 =A0=A0=A0 return -EIO;<br>+<br>+=A0=A0=A0 =A0=A0=A0 if ((b= uf[ONENAND_BADBLOCK_POS] & 0x01) =3D=3D 0) {<br>+=A0=A0=A0 =A0=A0=A0 = =A0=A0=A0 return -EIO;<br> +=A0=A0=A0 =A0=A0=A0 }<br>+=A0=A0=A0 =A0=A0=A0 return 0;<br>+=A0=A0=A0 }<br= >=A0<br>=A0=A0=A0=A0 /* Return info from the table */<br>=A0=A0=A0=A0 retur= n bbm->isbad_bbt(mtd, ofs, allowbbt);<br>-- <br>1.5.6.5<br><br> --0015175ce06877dbdd047465b2b8-- --0015175ce06877dbe4047465b2ba Content-Type: text/x-patch; charset=US-ASCII; name="0003--MTD-ONENAND-supports-custom-bbm.patch" Content-Disposition: attachment; filename="0003--MTD-ONENAND-supports-custom-bbm.patch" Content-Transfer-Encoding: base64 X-Attachment-Id: f_g01coo1l0 RnJvbSA4ZTMyZjQ5NDJkYzgzOWZlNzZhYzMzYmM3MGFhNzQwMWRlNDk2YzU1IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBIYW9qaWFuIFpodWFuZyA8aGFvamlhbi56aHVhbmdAbWFydmVs bC5jb20+CkRhdGU6IEZyaSwgMjUgU2VwIDIwMDkgMTU6MjE6NTAgLTA0MDAKU3ViamVjdDogW1BB VENIXSBbTVREXSBbT05FTkFORF0gc3VwcG9ydHMgY3VzdG9tIGJibQoKSW4gb25lbmFuZCBkcml2 ZXIsIHRoZSBkZWZhdWx0IGJhZCBibG9jayBtYW5hZ2VtZW50IGlzIGVtYmVkZGVkLiBDdXN0b20g QkJNCmNhbid0IGJlIHVzZWQuIE5vdyBtYWtlIGl0IHRvIHN1cHBvcnQgY3VzdG9tIEJCTS4KClNp Z25lZC1vZmYtYnk6IEhhb2ppYW4gWmh1YW5nIDxoYW9qaWFuLnpodWFuZ0BtYXJ2ZWxsLmNvbT4K LS0tCiBkcml2ZXJzL210ZC9vbmVuYW5kL29uZW5hbmRfYmFzZS5jIHwgICAyMyArKysrKysrKysr KysrKysrKysrKysrKwogMSBmaWxlcyBjaGFuZ2VkLCAyMyBpbnNlcnRpb25zKCspLCAwIGRlbGV0 aW9ucygtKQoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL29uZW5hbmQvb25lbmFuZF9iYXNlLmMg Yi9kcml2ZXJzL210ZC9vbmVuYW5kL29uZW5hbmRfYmFzZS5jCmluZGV4IDhmN2M3M2EuLmNjNmJj Y2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL29uZW5hbmQvb25lbmFuZF9iYXNlLmMKKysrIGIv ZHJpdmVycy9tdGQvb25lbmFuZC9vbmVuYW5kX2Jhc2UuYwpAQCAtMjEzNiw2ICsyMTM2LDI5IEBA IHN0YXRpYyBpbnQgb25lbmFuZF9ibG9ja19pc2JhZF9ub2xvY2soc3RydWN0IG10ZF9pbmZvICpt dGQsIGxvZmZfdCBvZnMsIGludCBhbGxvCiB7CiAJc3RydWN0IG9uZW5hbmRfY2hpcCAqdGhpcyA9 IG10ZC0+cHJpdjsKIAlzdHJ1Y3QgYmJtX2luZm8gKmJibSA9IHRoaXMtPmJibTsKKwlzdHJ1Y3Qg bXRkX29vYl9vcHMgb3BzOworCXVuc2lnbmVkIGNoYXIgKmJ1ZiA9IHRoaXMtPnBhZ2VfYnVmOwor CWludCByZXQ7CisKKwlpZiAoIWJibSkgeworCQlvcHMubW9kZSA9IE1URF9PT0JfUExBQ0U7CisJ CW9wcy5vb2JsZW4gPSAyOworCQlvcHMub29iYnVmID0gYnVmOworCQlvcHMubGVuID0gMDsKKwkJ b3BzLm9vYm9mZnMgPSAwOworCQlvcHMucmV0bGVuID0gMDsKKwkJb3BzLm9vYnJldGxlbiA9IDA7 CisKKwkJb2ZzID0gKG9mcyA+PiB0aGlzLT5lcmFzZV9zaGlmdCkgPDwgdGhpcy0+ZXJhc2Vfc2hp ZnQ7CisJCXJldCA9IG9uZW5hbmRfcmVhZF9vb2Jfbm9sb2NrKG10ZCwgb2ZzLCAmb3BzKTsKKwkJ aWYgKHJldCA9PSBPTkVOQU5EX0JCVF9SRUFEX0ZBVEFMX0VSUk9SKQorCQkJcmV0dXJuIC1FSU87 CisKKwkJaWYgKChidWZbT05FTkFORF9CQURCTE9DS19QT1NdICYgMHgwMSkgPT0gMCkgeworCQkJ cmV0dXJuIC1FSU87CisJCX0KKwkJcmV0dXJuIDA7CisJfQogCiAJLyogUmV0dXJuIGluZm8gZnJv bSB0aGUgdGFibGUgKi8KIAlyZXR1cm4gYmJtLT5pc2JhZF9iYnQobXRkLCBvZnMsIGFsbG93YmJ0 KTsKLS0gCjEuNS42LjUKCg== --0015175ce06877dbe4047465b2ba-- >From bogus@does.not.exist.com Mon Aug 24 09:56:15 2009 From: bogus@does.not.exist.com () Date: Mon, 24 Aug 2009 13:56:15 -0000 Subject: [PATCH] [MTD] [ONENAND] add pxa3xx onenand<br><br>In order to supp= Message-ID: <mailman.30.1253880112.2253.linux-arm-kernel@lists.infradead.org> ort Marvell PXA3xx bad block management, add pxa3xx onenand<br>device drive= r. Since there's some specific operation in it.<br><br>Either pxa3xx on= enand or generic onenand device driver can be supported.<br> <br>Signed-off-by: Haojian Zhuang <<a href=3D"mailto:haojian.zhuang@marv= ell.com">haojian.zhuang at marvell.com</a>><br>---<br>=A0drivers/mtd/onenan= d/Kconfig=A0 |=A0=A0=A0 7 +<br>=A0drivers/mtd/onenand/Makefile |=A0=A0=A0 1= +<br>=A0drivers/mtd/onenand/pxa3xx.c |=A0 248 ++++++++++++++++++++++++++++= ++++++++++++++<br> =A0drivers/mtd/pxa3xx_bbm.c=A0=A0=A0=A0 |=A0=A0=A0 4 +<br>=A04 files change= d, 260 insertions(+), 0 deletions(-)<br>=A0create mode 100644 drivers/mtd/o= nenand/pxa3xx.c<br><br>diff --git a/drivers/mtd/onenand/Kconfig b/drivers/m= td/onenand/Kconfig<br> index 79fa79e..d2878ac 100644<br>--- a/drivers/mtd/onenand/Kconfig<br>+++ b= /drivers/mtd/onenand/Kconfig<br>@@ -34,6 +34,13 @@ config MTD_ONENAND_OMAP2= <br>=A0=A0=A0=A0 =A0 Support for a OneNAND flash device connected to an OMA= P2/OMAP3 CPU<br> =A0=A0=A0=A0 =A0 via the GPMC memory controller.<br>=A0<br>+config MTD_ONEN= AND_PXA3xx<br>+=A0=A0=A0 tristate "OneNAND on PXA3xx/MMP support"= <br>+=A0=A0=A0 depends on MTD_ONENAND && (ARCH_PXA || ARCH_MMP)<br>= +=A0=A0=A0 help<br>+=A0=A0=A0 =A0 Support for a OneNAND flash device connec= ted to an PXA3xx CPU<br> +=A0=A0=A0 =A0 via the static memory controller.<br>+<br>=A0config MTD_ONEN= AND_OTP<br>=A0=A0=A0=A0 bool "OneNAND OTP Support"<br>=A0=A0=A0= =A0 select HAVE_MTD_OTP<br>diff --git a/drivers/mtd/onenand/Makefile b/driv= ers/mtd/onenand/Makefile<br> index 64b6cc6..66cc1fb 100644<br>--- a/drivers/mtd/onenand/Makefile<br>+++ = b/drivers/mtd/onenand/Makefile<br>@@ -8,6 +8,7 @@ obj-$(CONFIG_MTD_ONENAND)= =A0=A0=A0 =A0=A0=A0 +=3D onenand.o<br>=A0# Board specific.<br>=A0obj-$(CONF= IG_MTD_ONENAND_GENERIC)=A0=A0=A0 +=3D generic.o<br> =A0obj-$(CONFIG_MTD_ONENAND_OMAP2)=A0=A0=A0 =A0=A0=A0 +=3D omap2.o<br>+obj-= $(CONFIG_MTD_ONENAND_PXA3xx)=A0=A0=A0 +=3D pxa3xx.o<br>=A0<br>=A0# Simulato= r<br>=A0obj-$(CONFIG_MTD_ONENAND_SIM)=A0=A0=A0 =A0=A0=A0 +=3D onenand_sim.o= <br>diff --git a/drivers/mtd/onenand/pxa3xx.c b/drivers/mtd/onenand/pxa3xx.= c<br> new file mode 100644<br>index 0000000..d97ec15<br>--- /dev/null<br>+++ b/dr= ivers/mtd/onenand/pxa3xx.c<br>@@ -0,0 +1,248 @@<br>+/*<br>+ *=A0 linux/driv= ers/mtd/onenand/onenand_base.c<br>+ *<br>+ *=A0 Copyright (C) 2007 Marvell = Internal Ltd.<br> + *<br>+ *=A0 Haojian Zhuang <<a href=3D"mailto:haojian.zhuang@marvell.c= om">haojian.zhuang at marvell.com</a>><br>+ *<br>+ * This program is free s= oftware; you can redistribute it and/or modify<br>+ * it under the terms of= the GNU General Public License version 2 as<br> + * published by the Free Software Foundation.<br>+ */<br>+<br>+#include &l= t;linux/module.h><br>+#include <linux/init.h><br>+#include <lin= ux/platform_device.h><br>+#include <linux/mtd/mtd.h><br>+#include = <linux/mtd/onenand.h><br> +#include <linux/mtd/partitions.h><br>+<br>+#include <asm/io.h>= <br>+#include <asm/mach/flash.h><br>+<br>+#ifdef CONFIG_PXA3xx_BBM<br= >+#include <plat/pxa3xx_bbm.h><br>+#endif<br>+<br>+#define DRIVER_NAM= E=A0=A0=A0 "pxa3xx-onenand"<br> +<br>+<br>+#ifdef CONFIG_MTD_PARTITIONS<br>+static const char *part_probes[= ] =3D { "cmdlinepart", NULL,=A0 };<br>+#endif<br>+<br>+struct pxa= 3xx_onenand_info {<br>+=A0=A0=A0 struct onenand_chip=A0=A0=A0 onenand;<br>+= #ifdef CONFIG_PXA3xx_BBM<br> +=A0=A0=A0 /*<br>+=A0=A0=A0 =A0* Restriction: onenand_chip should be the fi= rst one of<br>+=A0=A0=A0 =A0* pxa3xx_onenand_info.<br>+=A0=A0=A0 =A0* bbm s= hould be the second one of pxa3xx_nand_info.<br>+=A0=A0=A0 =A0* Marvell PXA= 3xx BBM always access this field to get bbm.<br> +=A0=A0=A0 =A0*/<br>+=A0=A0=A0 struct pxa3xx_bbm=A0=A0=A0 *bbm;<br>+#endif<= br>+=A0=A0=A0 struct mtd_info=A0=A0=A0 =A0=A0=A0 mtd;<br>+=A0=A0=A0 struct = mtd_partition=A0=A0=A0 *parts;<br>+};<br>+<br>+#ifdef CONFIG_PXA3xx_BBM<br>= +static int pxa3xx_onenand_block_markbad(struct mtd_info *mtd, loff_t ofs)<= br> +{<br>+=A0=A0=A0 struct pxa3xx_onenand_info *info =3D mtd->priv;<br>+=A0= =A0=A0 struct pxa3xx_bbm *bbm =3D info->bbm;<br>+=A0=A0=A0 struct onenan= d_chip *this =3D mtd->priv;<br>+=A0=A0=A0 unsigned char buf[2] =3D {0, 0= };<br>+=A0=A0=A0 struct mtd_oob_ops ops =3D {<br> +=A0=A0=A0 =A0=A0=A0 .mode =3D MTD_OOB_PLACE,<br>+=A0=A0=A0 =A0=A0=A0 .oobl= en =3D 2,<br>+=A0=A0=A0 =A0=A0=A0 .oobbuf =3D buf,<br>+=A0=A0=A0 =A0=A0=A0 = .ooboffs =3D 0,<br>+=A0=A0=A0 };<br>+=A0=A0=A0 int block, ret;<br>+<br>+=A0= =A0=A0 /* Get block number */<br>+=A0=A0=A0 block =3D onenand_block(this, o= fs);<br> +<br>+=A0=A0=A0=A0=A0=A0=A0 /* We write two bytes, so we dont have to mess = with 16 bit access */<br>+=A0=A0=A0=A0=A0=A0=A0 ofs +=3D mtd->oobsize + = (ONENAND_BADBLOCK_POS & ~0x01);<br>+=A0=A0=A0 /* FIXME : What to do whe= n marking SLC block in partition<br> +=A0=A0=A0 =A0* =A0=A0=A0 =A0=A0 with MLC erasesize? For now, it is not adv= isable to<br>+=A0=A0=A0 =A0*=A0=A0=A0 =A0=A0 create partitions containing b= oth SLC and MLC regions.<br>+=A0=A0=A0 =A0*/<br>+=A0=A0=A0 ret =3D mtd->= write_oob(mtd, ofs, &ops);<br>+=A0=A0=A0 if (ret)<br> +=A0=A0=A0 =A0=A0=A0 return ret;<br>+<br>+=A0=A0=A0 return bbm->block_ma= rkbad(mtd, block);<br>+}<br>+<br>+int verify_onenand_bbm(struct mtd_info *m= td, struct pxa3xx_bbm **bbm)<br>+{<br>+=A0=A0=A0 struct onenand_chip *chip = =3D mtd->priv;<br>+=A0=A0=A0 struct pxa3xx_bbm **nbbm =3D NULL;<br> +<br>+=A0=A0=A0 /* check whether current flash is onenand */<br>+=A0=A0=A0 = nbbm =3D (struct pxa3xx_bbm **)(++chip);<br>+=A0=A0=A0 if (((unsigned int)n= bbm < PAGE_OFFSET)<br>+=A0=A0=A0 =A0=A0=A0 || ((unsigned int)*nbbm < = PAGE_OFFSET))<br>+=A0=A0=A0 =A0=A0=A0 return PXA3xx_BBM_INVALID;<br> +<br>+=A0=A0=A0 if ((*nbbm)->magic =3D=3D PXA_BBM_MAGIC) {<br>+=A0=A0=A0= =A0=A0=A0 pr_debug("%s:Found Onenand flash.\n", __func__);<br>+= =A0=A0=A0 =A0=A0=A0 *bbm =3D *nbbm;<br>+=A0=A0=A0 =A0=A0=A0 return PXA3xx_B= BM_ONENAND;<br>+=A0=A0=A0 }<br>+=A0=A0=A0 return PXA3xx_BBM_INVALID;<br> +}<br>+<br>+/**<br>+ * pxa3xx_onenand_command - Send command to OneNAND dev= ice<br>+ * @param mtd=A0=A0=A0 =A0=A0=A0 MTD device structure<br>+ * @param= cmd=A0=A0=A0 =A0=A0=A0 the command to be sent<br>+ * @param addr=A0=A0=A0 = =A0=A0=A0 offset to read from or write to<br> + * @param len=A0=A0=A0 =A0=A0=A0 number of bytes to read or write<br>+ *<b= r>+ * Send command to OneNAND device. This function is used for middle/larg= e page<br>+ * devices (1KB/2KB Bytes per page)<br>+ */<br>+static int pxa3x= x_onenand_command(struct mtd_info *mtd, int cmd,<br> +=A0=A0=A0 =A0=A0=A0 =A0=A0=A0 =A0=A0=A0 =A0 loff_t addr, size_t len)<br>+{= <br>+=A0=A0=A0 struct pxa3xx_onenand_info *info =3D mtd->priv;<br>+=A0= =A0=A0 struct pxa3xx_bbm *bbm =3D info->bbm;<br>+<br>+=A0=A0=A0 /* Get r= eolocated address */<br>+=A0=A0=A0 addr =3D bbm->search(mtd, addr);<br> +=A0=A0=A0 return onenand_command(mtd, cmd, addr, len);<br>+}<br>+<br>+stat= ic void pxa3xx_onenand_init_chip(struct pxa3xx_onenand_info *info)<br>+{<br= >+=A0=A0=A0 struct onenand_chip *this =3D &info->onenand;<br>+=A0=A0= =A0 struct pxa3xx_bbm *bbm =3D NULL;<br> +<br>+=A0=A0=A0 bbm =3D pxa3xx_query_bbm();<br>+=A0=A0=A0 if (bbm) {<br>+= =A0=A0=A0 =A0=A0=A0 /* Marvell PXA3xx BBM is initialized successfully */<br= >+=A0=A0=A0 =A0=A0=A0 info->bbm =3D bbm;<br>+=A0=A0=A0 =A0=A0=A0 this-&g= t;scan_bbt =3D bbm->scan_bbt;<br>+=A0=A0=A0 =A0=A0=A0 this->block_mar= kbad =3D pxa3xx_onenand_block_markbad;<br> +=A0=A0=A0 =A0=A0=A0 this->command =3D pxa3xx_onenand_command;<br>+=A0= =A0=A0 }<br>+}<br>+#else<br>+static void pxa3xx_onenand_init_chip(struct px= a3xx_onenand_info *info) {}<br>+#endif<br>+<br>+static int __devinit pxa3xx= _onenand_probe(struct platform_device *pdev)<br> +{<br>+=A0=A0=A0 struct pxa3xx_onenand_info *info =3D NULL;<br>+=A0=A0=A0 s= truct flash_platform_data *pdata =3D pdev->dev.platform_data;<br>+=A0=A0= =A0 struct resource *res =3D pdev->resource;<br>+=A0=A0=A0 unsigned long= size =3D res->end - res->start + 1;<br> +=A0=A0=A0 int err;<br>+<br>+=A0=A0=A0 info =3D kzalloc(sizeof(struct pxa3x= x_onenand_info), GFP_KERNEL);<br>+=A0=A0=A0 if (!info)<br>+=A0=A0=A0 =A0=A0= =A0 return -ENOMEM;<br>+<br>+=A0=A0=A0 if (!request_mem_region(res->star= t, size, pdev->dev.driver->name)) {<br> +=A0=A0=A0 =A0=A0=A0 err =3D -EBUSY;<br>+=A0=A0=A0 =A0=A0=A0 goto out_free_= info;<br>+=A0=A0=A0 }<br>+<br>+=A0=A0=A0 info->onenand.base =3D ioremap(= res->start, size);<br>+=A0=A0=A0 if (!info->onenand.base) {<br>+=A0= =A0=A0 =A0=A0=A0 err =3D -ENOMEM;<br>+=A0=A0=A0 =A0=A0=A0 goto out_release_= mem_region;<br> +=A0=A0=A0 }<br>+<br>+=A0=A0=A0 info->onenand.mmcontrol =3D pdata->mm= control;<br>+=A0=A0=A0 info->onenand.irq =3D platform_get_irq(pdev, 0);<= br>+<br>+=A0=A0=A0 pxa3xx_onenand_init_chip(info);<br>+<br>+=A0=A0=A0 info-= ><a href=3D"http://mtd.name">mtd.name</a> =3D dev_name(&pdev->dev= );<br> +=A0=A0=A0 info->mtd.priv =3D &info->onenand;<br>+=A0=A0=A0 info-= >mtd.owner =3D THIS_MODULE;<br>+<br>+=A0=A0=A0 if (onenand_scan(&inf= o->mtd, 1)) {<br>+=A0=A0=A0 =A0=A0=A0 err =3D -ENXIO;<br>+=A0=A0=A0 =A0= =A0=A0 goto out_iounmap;<br>+=A0=A0=A0 }<br>+<br>+#ifdef CONFIG_MTD_PARTITI= ONS<br> +=A0=A0=A0 err =3D parse_mtd_partitions(&info->mtd, part_probes, &am= p;info->parts, 0);<br>+=A0=A0=A0 if (err > 0)<br>+=A0=A0=A0 =A0=A0=A0= add_mtd_partitions(&info->mtd, info->parts, err);<br>+=A0=A0=A0 = else if (err <=3D 0 && pdata->parts)<br> +=A0=A0=A0 =A0=A0=A0 add_mtd_partitions(&info->mtd, pdata->parts,= pdata->nr_parts);<br>+=A0=A0=A0 else<br>+#endif<br>+=A0=A0=A0 =A0=A0=A0= err =3D add_mtd_device(&info->mtd);<br>+<br>+=A0=A0=A0 platform_set= _drvdata(pdev, info);<br>+<br>+=A0=A0=A0 return 0;<br> +<br>+out_iounmap:<br>+=A0=A0=A0 iounmap(info->onenand.base);<br>+out_re= lease_mem_region:<br>+=A0=A0=A0 release_mem_region(res->start, size);<br= >+out_free_info:<br>+=A0=A0=A0 kfree(info);<br>+<br>+=A0=A0=A0 return err;<= br>+}<br>+<br>+static int __devexit pxa3xx_onenand_remove(struct platform_d= evice *pdev)<br> +{<br>+=A0=A0=A0 struct pxa3xx_onenand_info *info =3D platform_get_drvdata(= pdev);<br>+=A0=A0=A0 struct resource *res =3D pdev->resource;<br>+=A0=A0= =A0 unsigned long size =3D res->end - res->start + 1;<br>+<br>+=A0=A0= =A0 platform_set_drvdata(pdev, NULL);<br> +<br>+=A0=A0=A0 if (info) {<br>+=A0=A0=A0 =A0=A0=A0 if (info->parts)<br>= +=A0=A0=A0 =A0=A0=A0 =A0=A0=A0 del_mtd_partitions(&info->mtd);<br>+= =A0=A0=A0 =A0=A0=A0 else<br>+=A0=A0=A0 =A0=A0=A0 =A0=A0=A0 del_mtd_device(&= amp;info->mtd);<br>+<br>+=A0=A0=A0 =A0=A0=A0 onenand_release(&info-&= gt;mtd);<br> +=A0=A0=A0 =A0=A0=A0 release_mem_region(res->start, size);<br>+=A0=A0=A0= =A0=A0=A0 iounmap(info->onenand.base);<br>+=A0=A0=A0 =A0=A0=A0 kfree(in= fo);<br>+=A0=A0=A0 }<br>+<br>+=A0=A0=A0 return 0;<br>+}<br>+<br>+static str= uct platform_driver pxa3xx_onenand_driver =3D {<br> +=A0=A0=A0 .driver =3D {<br>+=A0=A0=A0 =A0=A0=A0 .name=A0=A0=A0 =A0=A0=A0 = =3D DRIVER_NAME,<br>+=A0=A0=A0 =A0=A0=A0 .owner=A0=A0=A0 =A0=A0=A0 =3D THIS= _MODULE,<br>+=A0=A0=A0 },<br>+=A0=A0=A0 .probe=A0=A0=A0 =A0=A0=A0 =3D pxa3x= x_onenand_probe,<br>+=A0=A0=A0 .remove=A0=A0=A0 =A0=A0=A0 =3D __devexit_p(p= xa3xx_onenand_remove),<br>+};<br> +<br>+MODULE_ALIAS(DRIVER_NAME);<br>+<br>+static int __init pxa3xx_onenand_= init(void)<br>+{<br>+=A0=A0=A0 return platform_driver_register(&pxa3xx_= onenand_driver);<br>+}<br>+<br>+static void __exit pxa3xx_onenand_exit(void= )<br> +{<br>+=A0=A0=A0 platform_driver_unregister(&pxa3xx_onenand_driver);<br= >+}<br>+<br>+module_init(pxa3xx_onenand_init);<br>+module_exit(pxa3xx_onena= nd_exit);<br>+<br>+MODULE_LICENSE("GPL");<br>+MODULE_AUTHOR("= ;Haojian Zhuang <<a href=3D"mailto:haojian.zhuang@marvell.com">haojian.z= huang at marvell.com</a>>");<br> +MODULE_DESCRIPTION("Glue layer for OneNAND flash on Marvell PXA3xx&qu= ot;);<br>diff --git a/drivers/mtd/pxa3xx_bbm.c b/drivers/mtd/pxa3xx_bbm.c<b= r>index bcc9a35..070e5d1 100644<br>--- a/drivers/mtd/pxa3xx_bbm.c<br>+++ b/= drivers/mtd/pxa3xx_bbm.c<br> @@ -27,6 +27,10 @@ static int verify_bbm_magic(struct mtd_info *mtd, struct= pxa3xx_bbm **bbm)<br>=A0=A0=A0=A0 int ret;<br>=A0<br>=A0=A0=A0=A0 ret =3D = verify_nand_bbm(mtd, bbm);<br>+=A0=A0=A0 if (ret >=3D 0)<br>+=A0=A0=A0 = =A0=A0=A0 return ret;<br>+<br>+=A0=A0=A0 ret =3D verify_onenand_bbm(mtd, bb= m);<br> =A0=A0=A0=A0 return ret;<br>=A0}<br>=A0<br>-- <br>1.5.6.5<br><br> --0016e644c18e3e1667047465b6ab-- --0016e644c18e3e1679047465b6ad Content-Type: text/x-patch; charset=US-ASCII; name="0004--MTD-ONENAND-add-pxa3xx-onenand.patch" Content-Disposition: attachment; filename="0004--MTD-ONENAND-add-pxa3xx-onenand.patch" Content-Transfer-Encoding: base64 X-Attachment-Id: f_g01cq8fx0 RnJvbSA3M2Y2ODZhMDBiYTRlZmVlNjJhZDYxZTNiNjViMzM3OTM5ZGIwMzhlIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBIYW9qaWFuIFpodWFuZyA8aGFvamlhbi56aHVhbmdAbWFydmVs bC5jb20+CkRhdGU6IEZyaSwgMjUgU2VwIDIwMDkgMTU6MjU6MDMgLTA0MDAKU3ViamVjdDogW1BB VENIXSBbTVREXSBbT05FTkFORF0gYWRkIHB4YTN4eCBvbmVuYW5kCgpJbiBvcmRlciB0byBzdXBw b3J0IE1hcnZlbGwgUFhBM3h4IGJhZCBibG9jayBtYW5hZ2VtZW50LCBhZGQgcHhhM3h4IG9uZW5h bmQKZGV2aWNlIGRyaXZlci4gU2luY2UgdGhlcmUncyBzb21lIHNwZWNpZmljIG9wZXJhdGlvbiBp biBpdC4KCkVpdGhlciBweGEzeHggb25lbmFuZCBvciBnZW5lcmljIG9uZW5hbmQgZGV2aWNlIGRy aXZlciBjYW4gYmUgc3VwcG9ydGVkLgoKU2lnbmVkLW9mZi1ieTogSGFvamlhbiBaaHVhbmcgPGhh b2ppYW4uemh1YW5nQG1hcnZlbGwuY29tPgotLS0KIGRyaXZlcnMvbXRkL29uZW5hbmQvS2NvbmZp ZyAgfCAgICA3ICsKIGRyaXZlcnMvbXRkL29uZW5hbmQvTWFrZWZpbGUgfCAgICAxICsKIGRyaXZl cnMvbXRkL29uZW5hbmQvcHhhM3h4LmMgfCAgMjQ4ICsrKysrKysrKysrKysrKysrKysrKysrKysr KysrKysrKysrKysrKysrKwogZHJpdmVycy9tdGQvcHhhM3h4X2JibS5jICAgICB8ICAgIDQgKwog NCBmaWxlcyBjaGFuZ2VkLCAyNjAgaW5zZXJ0aW9ucygrKSwgMCBkZWxldGlvbnMoLSkKIGNyZWF0 ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL210ZC9vbmVuYW5kL3B4YTN4eC5jCgpkaWZmIC0tZ2l0IGEv ZHJpdmVycy9tdGQvb25lbmFuZC9LY29uZmlnIGIvZHJpdmVycy9tdGQvb25lbmFuZC9LY29uZmln CmluZGV4IDc5ZmE3OWUuLmQyODc4YWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL29uZW5hbmQv S2NvbmZpZworKysgYi9kcml2ZXJzL210ZC9vbmVuYW5kL0tjb25maWcKQEAgLTM0LDYgKzM0LDEz IEBAIGNvbmZpZyBNVERfT05FTkFORF9PTUFQMgogCSAgU3VwcG9ydCBmb3IgYSBPbmVOQU5EIGZs YXNoIGRldmljZSBjb25uZWN0ZWQgdG8gYW4gT01BUDIvT01BUDMgQ1BVCiAJICB2aWEgdGhlIEdQ TUMgbWVtb3J5IGNvbnRyb2xsZXIuCiAKK2NvbmZpZyBNVERfT05FTkFORF9QWEEzeHgKKwl0cmlz dGF0ZSAiT25lTkFORCBvbiBQWEEzeHgvTU1QIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBNVERfT05F TkFORCAmJiAoQVJDSF9QWEEgfHwgQVJDSF9NTVApCisJaGVscAorCSAgU3VwcG9ydCBmb3IgYSBP bmVOQU5EIGZsYXNoIGRldmljZSBjb25uZWN0ZWQgdG8gYW4gUFhBM3h4IENQVQorCSAgdmlhIHRo ZSBzdGF0aWMgbWVtb3J5IGNvbnRyb2xsZXIuCisKIGNvbmZpZyBNVERfT05FTkFORF9PVFAKIAli b29sICJPbmVOQU5EIE9UUCBTdXBwb3J0IgogCXNlbGVjdCBIQVZFX01URF9PVFAKZGlmZiAtLWdp dCBhL2RyaXZlcnMvbXRkL29uZW5hbmQvTWFrZWZpbGUgYi9kcml2ZXJzL210ZC9vbmVuYW5kL01h a2VmaWxlCmluZGV4IDY0YjZjYzYuLjY2Y2MxZmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL29u ZW5hbmQvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9tdGQvb25lbmFuZC9NYWtlZmlsZQpAQCAtOCw2 ICs4LDcgQEAgb2JqLSQoQ09ORklHX01URF9PTkVOQU5EKQkJKz0gb25lbmFuZC5vCiAjIEJvYXJk IHNwZWNpZmljLgogb2JqLSQoQ09ORklHX01URF9PTkVOQU5EX0dFTkVSSUMpCSs9IGdlbmVyaWMu bwogb2JqLSQoQ09ORklHX01URF9PTkVOQU5EX09NQVAyKQkJKz0gb21hcDIubworb2JqLSQoQ09O RklHX01URF9PTkVOQU5EX1BYQTN4eCkJKz0gcHhhM3h4Lm8KIAogIyBTaW11bGF0b3IKIG9iai0k KENPTkZJR19NVERfT05FTkFORF9TSU0pCQkrPSBvbmVuYW5kX3NpbS5vCmRpZmYgLS1naXQgYS9k cml2ZXJzL210ZC9vbmVuYW5kL3B4YTN4eC5jIGIvZHJpdmVycy9tdGQvb25lbmFuZC9weGEzeHgu YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTdlYzE1Ci0tLSAvZGV2L251 bGwKKysrIGIvZHJpdmVycy9tdGQvb25lbmFuZC9weGEzeHguYwpAQCAtMCwwICsxLDI0OCBAQAor LyoKKyAqICBsaW51eC9kcml2ZXJzL210ZC9vbmVuYW5kL29uZW5hbmRfYmFzZS5jCisgKgorICog IENvcHlyaWdodCAoQykgMjAwNyBNYXJ2ZWxsIEludGVybmFsIEx0ZC4KKyAqCisgKiAgSGFvamlh biBaaHVhbmcgPGhhb2ppYW4uemh1YW5nQG1hcnZlbGwuY29tPgorICoKKyAqIFRoaXMgcHJvZ3Jh bSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5 CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNl IHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRp b24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lu aXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51 eC9tdGQvbXRkLmg+CisjaW5jbHVkZSA8bGludXgvbXRkL29uZW5hbmQuaD4KKyNpbmNsdWRlIDxs aW51eC9tdGQvcGFydGl0aW9ucy5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8 YXNtL21hY2gvZmxhc2guaD4KKworI2lmZGVmIENPTkZJR19QWEEzeHhfQkJNCisjaW5jbHVkZSA8 cGxhdC9weGEzeHhfYmJtLmg+CisjZW5kaWYKKworI2RlZmluZSBEUklWRVJfTkFNRQkicHhhM3h4 LW9uZW5hbmQiCisKKworI2lmZGVmIENPTkZJR19NVERfUEFSVElUSU9OUworc3RhdGljIGNvbnN0 IGNoYXIgKnBhcnRfcHJvYmVzW10gPSB7ICJjbWRsaW5lcGFydCIsIE5VTEwsICB9OworI2VuZGlm CisKK3N0cnVjdCBweGEzeHhfb25lbmFuZF9pbmZvIHsKKwlzdHJ1Y3Qgb25lbmFuZF9jaGlwCW9u ZW5hbmQ7CisjaWZkZWYgQ09ORklHX1BYQTN4eF9CQk0KKwkvKgorCSAqIFJlc3RyaWN0aW9uOiBv bmVuYW5kX2NoaXAgc2hvdWxkIGJlIHRoZSBmaXJzdCBvbmUgb2YKKwkgKiBweGEzeHhfb25lbmFu ZF9pbmZvLgorCSAqIGJibSBzaG91bGQgYmUgdGhlIHNlY29uZCBvbmUgb2YgcHhhM3h4X25hbmRf aW5mby4KKwkgKiBNYXJ2ZWxsIFBYQTN4eCBCQk0gYWx3YXlzIGFjY2VzcyB0aGlzIGZpZWxkIHRv IGdldCBiYm0uCisJICovCisJc3RydWN0IHB4YTN4eF9iYm0JKmJibTsKKyNlbmRpZgorCXN0cnVj dCBtdGRfaW5mbwkJbXRkOworCXN0cnVjdCBtdGRfcGFydGl0aW9uCSpwYXJ0czsKK307CisKKyNp ZmRlZiBDT05GSUdfUFhBM3h4X0JCTQorc3RhdGljIGludCBweGEzeHhfb25lbmFuZF9ibG9ja19t YXJrYmFkKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBsb2ZmX3Qgb2ZzKQoreworCXN0cnVjdCBweGEz eHhfb25lbmFuZF9pbmZvICppbmZvID0gbXRkLT5wcml2OworCXN0cnVjdCBweGEzeHhfYmJtICpi Ym0gPSBpbmZvLT5iYm07CisJc3RydWN0IG9uZW5hbmRfY2hpcCAqdGhpcyA9IG10ZC0+cHJpdjsK Kwl1bnNpZ25lZCBjaGFyIGJ1ZlsyXSA9IHswLCAwfTsKKwlzdHJ1Y3QgbXRkX29vYl9vcHMgb3Bz ID0geworCQkubW9kZSA9IE1URF9PT0JfUExBQ0UsCisJCS5vb2JsZW4gPSAyLAorCQkub29iYnVm ID0gYnVmLAorCQkub29ib2ZmcyA9IDAsCisJfTsKKwlpbnQgYmxvY2ssIHJldDsKKworCS8qIEdl dCBibG9jayBudW1iZXIgKi8KKwlibG9jayA9IG9uZW5hbmRfYmxvY2sodGhpcywgb2ZzKTsKKwor ICAgICAgICAvKiBXZSB3cml0ZSB0d28gYnl0ZXMsIHNvIHdlIGRvbnQgaGF2ZSB0byBtZXNzIHdp dGggMTYgYml0IGFjY2VzcyAqLworICAgICAgICBvZnMgKz0gbXRkLT5vb2JzaXplICsgKE9ORU5B TkRfQkFEQkxPQ0tfUE9TICYgfjB4MDEpOworCS8qIEZJWE1FIDogV2hhdCB0byBkbyB3aGVuIG1h cmtpbmcgU0xDIGJsb2NrIGluIHBhcnRpdGlvbgorCSAqIAkgICB3aXRoIE1MQyBlcmFzZXNpemU/ IEZvciBub3csIGl0IGlzIG5vdCBhZHZpc2FibGUgdG8KKwkgKgkgICBjcmVhdGUgcGFydGl0aW9u cyBjb250YWluaW5nIGJvdGggU0xDIGFuZCBNTEMgcmVnaW9ucy4KKwkgKi8KKwlyZXQgPSBtdGQt PndyaXRlX29vYihtdGQsIG9mcywgJm9wcyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwor CXJldHVybiBiYm0tPmJsb2NrX21hcmtiYWQobXRkLCBibG9jayk7Cit9CisKK2ludCB2ZXJpZnlf b25lbmFuZF9iYm0oc3RydWN0IG10ZF9pbmZvICptdGQsIHN0cnVjdCBweGEzeHhfYmJtICoqYmJt KQoreworCXN0cnVjdCBvbmVuYW5kX2NoaXAgKmNoaXAgPSBtdGQtPnByaXY7CisJc3RydWN0IHB4 YTN4eF9iYm0gKipuYmJtID0gTlVMTDsKKworCS8qIGNoZWNrIHdoZXRoZXIgY3VycmVudCBmbGFz aCBpcyBvbmVuYW5kICovCisJbmJibSA9IChzdHJ1Y3QgcHhhM3h4X2JibSAqKikoKytjaGlwKTsK KwlpZiAoKCh1bnNpZ25lZCBpbnQpbmJibSA8IFBBR0VfT0ZGU0VUKQorCQl8fCAoKHVuc2lnbmVk IGludCkqbmJibSA8IFBBR0VfT0ZGU0VUKSkKKwkJcmV0dXJuIFBYQTN4eF9CQk1fSU5WQUxJRDsK KworCWlmICgoKm5iYm0pLT5tYWdpYyA9PSBQWEFfQkJNX01BR0lDKSB7CisJCXByX2RlYnVnKCIl czpGb3VuZCBPbmVuYW5kIGZsYXNoLlxuIiwgX19mdW5jX18pOworCQkqYmJtID0gKm5iYm07CisJ CXJldHVybiBQWEEzeHhfQkJNX09ORU5BTkQ7CisJfQorCXJldHVybiBQWEEzeHhfQkJNX0lOVkFM SUQ7Cit9CisKKy8qKgorICogcHhhM3h4X29uZW5hbmRfY29tbWFuZCAtIFNlbmQgY29tbWFuZCB0 byBPbmVOQU5EIGRldmljZQorICogQHBhcmFtIG10ZAkJTVREIGRldmljZSBzdHJ1Y3R1cmUKKyAq IEBwYXJhbSBjbWQJCXRoZSBjb21tYW5kIHRvIGJlIHNlbnQKKyAqIEBwYXJhbSBhZGRyCQlvZmZz ZXQgdG8gcmVhZCBmcm9tIG9yIHdyaXRlIHRvCisgKiBAcGFyYW0gbGVuCQludW1iZXIgb2YgYnl0 ZXMgdG8gcmVhZCBvciB3cml0ZQorICoKKyAqIFNlbmQgY29tbWFuZCB0byBPbmVOQU5EIGRldmlj ZS4gVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGZvciBtaWRkbGUvbGFyZ2UgcGFnZQorICogZGV2aWNl cyAoMUtCLzJLQiBCeXRlcyBwZXIgcGFnZSkKKyAqLworc3RhdGljIGludCBweGEzeHhfb25lbmFu ZF9jb21tYW5kKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBpbnQgY21kLAorCQkJCSAgbG9mZl90IGFk ZHIsIHNpemVfdCBsZW4pCit7CisJc3RydWN0IHB4YTN4eF9vbmVuYW5kX2luZm8gKmluZm8gPSBt dGQtPnByaXY7CisJc3RydWN0IHB4YTN4eF9iYm0gKmJibSA9IGluZm8tPmJibTsKKworCS8qIEdl dCByZW9sb2NhdGVkIGFkZHJlc3MgKi8KKwlhZGRyID0gYmJtLT5zZWFyY2gobXRkLCBhZGRyKTsK KwlyZXR1cm4gb25lbmFuZF9jb21tYW5kKG10ZCwgY21kLCBhZGRyLCBsZW4pOworfQorCitzdGF0 aWMgdm9pZCBweGEzeHhfb25lbmFuZF9pbml0X2NoaXAoc3RydWN0IHB4YTN4eF9vbmVuYW5kX2lu Zm8gKmluZm8pCit7CisJc3RydWN0IG9uZW5hbmRfY2hpcCAqdGhpcyA9ICZpbmZvLT5vbmVuYW5k OworCXN0cnVjdCBweGEzeHhfYmJtICpiYm0gPSBOVUxMOworCisJYmJtID0gcHhhM3h4X3F1ZXJ5 X2JibSgpOworCWlmIChiYm0pIHsKKwkJLyogTWFydmVsbCBQWEEzeHggQkJNIGlzIGluaXRpYWxp emVkIHN1Y2Nlc3NmdWxseSAqLworCQlpbmZvLT5iYm0gPSBiYm07CisJCXRoaXMtPnNjYW5fYmJ0 ID0gYmJtLT5zY2FuX2JidDsKKwkJdGhpcy0+YmxvY2tfbWFya2JhZCA9IHB4YTN4eF9vbmVuYW5k X2Jsb2NrX21hcmtiYWQ7CisJCXRoaXMtPmNvbW1hbmQgPSBweGEzeHhfb25lbmFuZF9jb21tYW5k OworCX0KK30KKyNlbHNlCitzdGF0aWMgdm9pZCBweGEzeHhfb25lbmFuZF9pbml0X2NoaXAoc3Ry dWN0IHB4YTN4eF9vbmVuYW5kX2luZm8gKmluZm8pIHt9CisjZW5kaWYKKworc3RhdGljIGludCBf X2RldmluaXQgcHhhM3h4X29uZW5hbmRfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRl dikKK3sKKwlzdHJ1Y3QgcHhhM3h4X29uZW5hbmRfaW5mbyAqaW5mbyA9IE5VTEw7CisJc3RydWN0 IGZsYXNoX3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJ c3RydWN0IHJlc291cmNlICpyZXMgPSBwZGV2LT5yZXNvdXJjZTsKKwl1bnNpZ25lZCBsb25nIHNp emUgPSByZXMtPmVuZCAtIHJlcy0+c3RhcnQgKyAxOworCWludCBlcnI7CisKKwlpbmZvID0ga3ph bGxvYyhzaXplb2Yoc3RydWN0IHB4YTN4eF9vbmVuYW5kX2luZm8pLCBHRlBfS0VSTkVMKTsKKwlp ZiAoIWluZm8pCisJCXJldHVybiAtRU5PTUVNOworCisJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24o cmVzLT5zdGFydCwgc2l6ZSwgcGRldi0+ZGV2LmRyaXZlci0+bmFtZSkpIHsKKwkJZXJyID0gLUVC VVNZOworCQlnb3RvIG91dF9mcmVlX2luZm87CisJfQorCisJaW5mby0+b25lbmFuZC5iYXNlID0g aW9yZW1hcChyZXMtPnN0YXJ0LCBzaXplKTsKKwlpZiAoIWluZm8tPm9uZW5hbmQuYmFzZSkgewor CQllcnIgPSAtRU5PTUVNOworCQlnb3RvIG91dF9yZWxlYXNlX21lbV9yZWdpb247CisJfQorCisJ aW5mby0+b25lbmFuZC5tbWNvbnRyb2wgPSBwZGF0YS0+bW1jb250cm9sOworCWluZm8tPm9uZW5h bmQuaXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKKworCXB4YTN4eF9vbmVuYW5kX2lu aXRfY2hpcChpbmZvKTsKKworCWluZm8tPm10ZC5uYW1lID0gZGV2X25hbWUoJnBkZXYtPmRldik7 CisJaW5mby0+bXRkLnByaXYgPSAmaW5mby0+b25lbmFuZDsKKwlpbmZvLT5tdGQub3duZXIgPSBU SElTX01PRFVMRTsKKworCWlmIChvbmVuYW5kX3NjYW4oJmluZm8tPm10ZCwgMSkpIHsKKwkJZXJy ID0gLUVOWElPOworCQlnb3RvIG91dF9pb3VubWFwOworCX0KKworI2lmZGVmIENPTkZJR19NVERf UEFSVElUSU9OUworCWVyciA9IHBhcnNlX210ZF9wYXJ0aXRpb25zKCZpbmZvLT5tdGQsIHBhcnRf cHJvYmVzLCAmaW5mby0+cGFydHMsIDApOworCWlmIChlcnIgPiAwKQorCQlhZGRfbXRkX3BhcnRp dGlvbnMoJmluZm8tPm10ZCwgaW5mby0+cGFydHMsIGVycik7CisJZWxzZSBpZiAoZXJyIDw9IDAg JiYgcGRhdGEtPnBhcnRzKQorCQlhZGRfbXRkX3BhcnRpdGlvbnMoJmluZm8tPm10ZCwgcGRhdGEt PnBhcnRzLCBwZGF0YS0+bnJfcGFydHMpOworCWVsc2UKKyNlbmRpZgorCQllcnIgPSBhZGRfbXRk X2RldmljZSgmaW5mby0+bXRkKTsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGluZm8p OworCisJcmV0dXJuIDA7CisKK291dF9pb3VubWFwOgorCWlvdW5tYXAoaW5mby0+b25lbmFuZC5i YXNlKTsKK291dF9yZWxlYXNlX21lbV9yZWdpb246CisJcmVsZWFzZV9tZW1fcmVnaW9uKHJlcy0+ c3RhcnQsIHNpemUpOworb3V0X2ZyZWVfaW5mbzoKKwlrZnJlZShpbmZvKTsKKworCXJldHVybiBl cnI7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IHB4YTN4eF9vbmVuYW5kX3JlbW92ZShzdHJ1 Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBweGEzeHhfb25lbmFuZF9pbmZv ICppbmZvID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IHJlc291cmNlICpy ZXMgPSBwZGV2LT5yZXNvdXJjZTsKKwl1bnNpZ25lZCBsb25nIHNpemUgPSByZXMtPmVuZCAtIHJl cy0+c3RhcnQgKyAxOworCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisKKwlp ZiAoaW5mbykgeworCQlpZiAoaW5mby0+cGFydHMpCisJCQlkZWxfbXRkX3BhcnRpdGlvbnMoJmlu Zm8tPm10ZCk7CisJCWVsc2UKKwkJCWRlbF9tdGRfZGV2aWNlKCZpbmZvLT5tdGQpOworCisJCW9u ZW5hbmRfcmVsZWFzZSgmaW5mby0+bXRkKTsKKwkJcmVsZWFzZV9tZW1fcmVnaW9uKHJlcy0+c3Rh cnQsIHNpemUpOworCQlpb3VubWFwKGluZm8tPm9uZW5hbmQuYmFzZSk7CisJCWtmcmVlKGluZm8p OworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBw eGEzeHhfb25lbmFuZF9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUJCT0gRFJJVkVS X05BTUUsCisJCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwl9LAorCS5wcm9iZQkJPSBweGEzeHhf b25lbmFuZF9wcm9iZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKHB4YTN4eF9vbmVuYW5kX3Jl bW92ZSksCit9OworCitNT0RVTEVfQUxJQVMoRFJJVkVSX05BTUUpOworCitzdGF0aWMgaW50IF9f aW5pdCBweGEzeHhfb25lbmFuZF9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZl cl9yZWdpc3RlcigmcHhhM3h4X29uZW5hbmRfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19l eGl0IHB4YTN4eF9vbmVuYW5kX2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdp c3RlcigmcHhhM3h4X29uZW5hbmRfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQocHhhM3h4X29u ZW5hbmRfaW5pdCk7Cittb2R1bGVfZXhpdChweGEzeHhfb25lbmFuZF9leGl0KTsKKworTU9EVUxF X0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FVVEhPUigiSGFvamlhbiBaaHVhbmcgPGhhb2ppYW4u emh1YW5nQG1hcnZlbGwuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJHbHVlIGxheWVyIGZv ciBPbmVOQU5EIGZsYXNoIG9uIE1hcnZlbGwgUFhBM3h4Iik7CmRpZmYgLS1naXQgYS9kcml2ZXJz L210ZC9weGEzeHhfYmJtLmMgYi9kcml2ZXJzL210ZC9weGEzeHhfYmJtLmMKaW5kZXggYmNjOWEz NS4uMDcwZTVkMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvcHhhM3h4X2JibS5jCisrKyBiL2Ry aXZlcnMvbXRkL3B4YTN4eF9iYm0uYwpAQCAtMjcsNiArMjcsMTAgQEAgc3RhdGljIGludCB2ZXJp ZnlfYmJtX21hZ2ljKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBzdHJ1Y3QgcHhhM3h4X2JibSAqKmJi bSkKIAlpbnQgcmV0OwogCiAJcmV0ID0gdmVyaWZ5X25hbmRfYmJtKG10ZCwgYmJtKTsKKwlpZiAo cmV0ID49IDApCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSB2ZXJpZnlfb25lbmFuZF9iYm0obXRk LCBiYm0pOwogCXJldHVybiByZXQ7CiB9CiAKLS0gCjEuNS42LjUKCg== --0016e644c18e3e1679047465b6ad-- >From bogus@does.not.exist.com Mon Aug 24 09:56:15 2009 From: bogus@does.not.exist.com () Date: Mon, 24 Aug 2009 13:56:15 -0000 Subject: [PATCH] pxa: support pxa3xx onenand in saar and ttc dkb<br><br>Mar= Message-ID: <mailman.34.1253880186.2253.linux-arm-kernel@lists.infradead.org> vell PXA3xx bad block management is supported in pxa3xx onenand<br>device d= river. Enable it in saar and ttc dkb platform.<br><br>Signed-off-by: Haojia= n Zhuang <<a href=3D"mailto:haojian.zhuang@marvell.com">haojian.zhuang at m= arvell.com</a>><br> ---<br>=A0arch/arm/mach-mmp/ttc_dkb.c |=A0=A0=A0 2 +-<br>=A0arch/arm/mach-p= xa/saar.c=A0=A0=A0 |=A0=A0=A0 2 +-<br>=A02 files changed, 2 insertions(+), = 2 deletions(-)<br><br>diff --git a/arch/arm/mach-mmp/ttc_dkb.c b/arch/arm/m= ach-mmp/ttc_dkb.c<br> index 57d0535..dbd8cfd 100644<br>--- a/arch/arm/mach-mmp/ttc_dkb.c<br>+++ b= /arch/arm/mach-mmp/ttc_dkb.c<br>@@ -100,7 +100,7 @@ static struct resource = ttc_dkb_resource_onenand[] =3D {<br>=A0};<br>=A0<br>=A0static struct platfo= rm_device ttc_dkb_device_onenand =3D {<br> -=A0=A0=A0 .name=A0=A0=A0 =A0=A0=A0 =3D "onenand",<br>+=A0=A0=A0 = .name=A0=A0=A0 =A0=A0=A0 =3D "pxa3xx-onenand",<br>=A0=A0=A0=A0 .i= d=A0=A0=A0 =A0=A0=A0 =3D -1,<br>=A0=A0=A0=A0 .dev=A0=A0=A0 =A0=A0=A0 =3D {<= br>=A0=A0=A0=A0 =A0=A0=A0 .platform_data=A0=A0=A0 =3D &ttc_dkb_onenand_= info,<br>diff --git a/arch/arm/mach-pxa/saar.c b/arch/arm/mach-pxa/saar.c<b= r> index 8b7ea09..6892867 100644<br>--- a/arch/arm/mach-pxa/saar.c<br>+++ b/ar= ch/arm/mach-pxa/saar.c<br>@@ -556,7 +556,7 @@ static struct resource saar_r= esource_onenand[] =3D {<br>=A0};<br>=A0<br>=A0static struct platform_device= saar_device_onenand =3D {<br> -=A0=A0=A0 .name=A0=A0=A0 =A0=A0=A0 =3D "onenand",<br>+=A0=A0=A0 = .name=A0=A0=A0 =A0=A0=A0 =3D "pxa3xx-onenand",<br>=A0=A0=A0=A0 .i= d=A0=A0=A0 =A0=A0=A0 =3D -1,<br>=A0=A0=A0=A0 .dev=A0=A0=A0 =A0=A0=A0 =3D {<= br>=A0=A0=A0=A0 =A0=A0=A0 .platform_data=A0=A0=A0 =3D &saar_onenand_inf= o,<br>-- <br>1.5.6.5<br><br> --001517741a14b62254047465bad3-- --001517741a14b6225c047465bad5 Content-Type: text/x-patch; charset=US-ASCII; name="0005-pxa-support-pxa3xx-onenand-in-saar-and-ttc-dkb.patch" Content-Disposition: attachment; filename="0005-pxa-support-pxa3xx-onenand-in-saar-and-ttc-dkb.patch" Content-Transfer-Encoding: base64 X-Attachment-Id: f_g01crvu20 RnJvbSBmYjgyNjM0MWJmZmEzNjRjYjA0ODAyNjc0ZGRhNDU3NjhlM2Y4NmIxIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBIYW9qaWFuIFpodWFuZyA8aGFvamlhbi56aHVhbmdAbWFydmVs bC5jb20+CkRhdGU6IEZyaSwgMjUgU2VwIDIwMDkgMTU6NDM6MTMgLTA0MDAKU3ViamVjdDogW1BB VENIXSBweGE6IHN1cHBvcnQgcHhhM3h4IG9uZW5hbmQgaW4gc2FhciBhbmQgdHRjIGRrYgoKTWFy dmVsbCBQWEEzeHggYmFkIGJsb2NrIG1hbmFnZW1lbnQgaXMgc3VwcG9ydGVkIGluIHB4YTN4eCBv bmVuYW5kCmRldmljZSBkcml2ZXIuIEVuYWJsZSBpdCBpbiBzYWFyIGFuZCB0dGMgZGtiIHBsYXRm b3JtLgoKU2lnbmVkLW9mZi1ieTogSGFvamlhbiBaaHVhbmcgPGhhb2ppYW4uemh1YW5nQG1hcnZl bGwuY29tPgotLS0KIGFyY2gvYXJtL21hY2gtbW1wL3R0Y19ka2IuYyB8ICAgIDIgKy0KIGFyY2gv YXJtL21hY2gtcHhhL3NhYXIuYyAgICB8ICAgIDIgKy0KIDIgZmlsZXMgY2hhbmdlZCwgMiBpbnNl cnRpb25zKCspLCAyIGRlbGV0aW9ucygtKQoKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbW1w L3R0Y19ka2IuYyBiL2FyY2gvYXJtL21hY2gtbW1wL3R0Y19ka2IuYwppbmRleCA1N2QwNTM1Li5k YmQ4Y2ZkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW1tcC90dGNfZGtiLmMKKysrIGIvYXJj aC9hcm0vbWFjaC1tbXAvdHRjX2RrYi5jCkBAIC0xMDAsNyArMTAwLDcgQEAgc3RhdGljIHN0cnVj dCByZXNvdXJjZSB0dGNfZGtiX3Jlc291cmNlX29uZW5hbmRbXSA9IHsKIH07CiAKIHN0YXRpYyBz dHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHR0Y19ka2JfZGV2aWNlX29uZW5hbmQgPSB7Ci0JLm5hbWUJ CT0gIm9uZW5hbmQiLAorCS5uYW1lCQk9ICJweGEzeHgtb25lbmFuZCIsCiAJLmlkCQk9IC0xLAog CS5kZXYJCT0gewogCQkucGxhdGZvcm1fZGF0YQk9ICZ0dGNfZGtiX29uZW5hbmRfaW5mbywKZGlm ZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL3NhYXIuYyBiL2FyY2gvYXJtL21hY2gtcHhhL3Nh YXIuYwppbmRleCA4YjdlYTA5Li42ODkyODY3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4 YS9zYWFyLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvc2Fhci5jCkBAIC01NTYsNyArNTU2LDcg QEAgc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzYWFyX3Jlc291cmNlX29uZW5hbmRbXSA9IHsKIH07 CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHNhYXJfZGV2aWNlX29uZW5hbmQgPSB7 Ci0JLm5hbWUJCT0gIm9uZW5hbmQiLAorCS5uYW1lCQk9ICJweGEzeHgtb25lbmFuZCIsCiAJLmlk CQk9IC0xLAogCS5kZXYJCT0gewogCQkucGxhdGZvcm1fZGF0YQk9ICZzYWFyX29uZW5hbmRfaW5m bywKLS0gCjEuNS42LjUKCg== --001517741a14b6225c047465bad5-- >From bogus@does.not.exist.com Mon Aug 24 09:56:15 2009 From: bogus@does.not.exist.com () Date: Mon, 24 Aug 2009 13:56:15 -0000 Subject: No subject Message-ID: <mailman.41.1254077218.2253.linux-arm-kernel@lists.infradead.org> #ifdef CONFIG_HOTPLUG_CPU ... void __cpuexit cpu_die(void) { unsigned int cpu = smp_processor_id(); local_irq_disable(); idle_task_exit(); /* * actual CPU shutdown procedure is at least platform (if not * CPU) specific */ platform_cpu_die(cpu); /* * Do not return to the idle loop - jump back to the secondary * cpu initialisation. There's some initialisation which needs * to be repeated to undo the effects of taking the CPU offline. */ __asm__("mov sp, %0\n" " b secondary_start_kernel" : : "r" (task_stack_page(current) + THREAD_SIZE - 8)); } #endif /* CONFIG_HOTPLUG_CPU */ Please look at the above and realise that cpu_die() is only ever defined in case that HOTPLUG_CPU is defined. So there is nothing to discard if HOTPLUG_CPU equals to n. And just to repeat myself.... The only correct use of __cpu* annotation is for function/data that is used with or without HOTPLUG_CPU equals to y. Which is NOT the case for cpu_die(). The __cpu* annotation is not a replacement for ifdeffed out code that is not relevant for the non-HOTPLUG_CPU case. Sam ^ permalink raw reply [flat|nested] 22+ messages in thread
* [PATCH 4/5] PalmGSM: generalisation of Treo680 code to PalmGSM 2009-09-01 1:22 ` Marek Vasut @ 2009-09-01 9:39 ` Eric Miao 2009-09-01 20:50 ` Tomáš 'Sleep_Walker' Čech 0 siblings, 1 reply; 22+ messages in thread From: Eric Miao @ 2009-09-01 9:39 UTC (permalink / raw) To: linux-arm-kernel Marek Vasut wrote: > Dne ?t 1. z??? 2009 02:07:16 Pavel Machek napsal(a): >> Ahoj! / Hi! > Ahoj! / Hi! / Guten Tag! >>>>>>> arch/arm/mach-pxa/Kconfig | 5 + >>>>>>> arch/arm/mach-pxa/Makefile | 2 +- >>>>>>> arch/arm/mach-pxa/include/mach/palmgsm.h | 60 ++++ >>>>>>> arch/arm/mach-pxa/include/mach/treo680.h | 49 --- >>>>>>> arch/arm/mach-pxa/palmgsm.c | 559 >>>>>>> ++++++++++++++++++++++++++++++ arch/arm/mach-pxa/treo680.c >>>>>>> | 528 ---------------------------- >>>>>> I don't actually care too much about the naming - as long as 685 >>>>>> can stay within treo680.c, I don't see any problem with that. The >>>>>> real question is: is palmgsm.c the proper name for all these >>>>>> devices? >>>>> Well, actually your completely right. PalmGSM is not fitting for all >>>>> devices to come, more fitting would be something like Palm >>>>> smartphones because there are CDMA devices to come too. On the other >>>>> hand, this name is the best I found so far. If you don't mind I would >>>>> even so... >>>> I believe treo680 was better name then. Don't change it if you don't >>>> need to... >>> But I need to have different generic name - treo680 will be occupied by >>> Treo680 specific stuff, which makes more sense, doesn't it? >> And rename generic code to treo.c? Then you could have treo.c for >> generic code, and treo680.c / treo685.c for specific models... >> >> palmgsm.c sounds like driver for their GSM chip... >> Pavel > > Yeah, or treo-common.c in case you'd want to split it into core file + model > files. But treo.c/palm(smart)phone.c (?) seems more ok. I dont like the idea of > splitting the code into more files (one big, and many small). > Well, treo680.c can just include all the specific stuffs in a single file as long as possibility is concerned. And #ifdef .. #endif can be used to include the code or not. See ezx.c for a good example. > Cheers! ^ permalink raw reply [flat|nested] 22+ messages in thread
* [PATCH 4/5] PalmGSM: generalisation of Treo680 code to PalmGSM 2009-09-01 9:39 ` Eric Miao @ 2009-09-01 20:50 ` Tomáš 'Sleep_Walker' Čech 0 siblings, 0 replies; 22+ messages in thread From: Tomáš 'Sleep_Walker' Čech @ 2009-09-01 20:50 UTC (permalink / raw) To: linux-arm-kernel Hi, Dne ?t 1. z??? 2009 11:39:47 Eric Miao napsal(a): > Marek Vasut wrote: > > Dne ?t 1. z??? 2009 02:07:16 Pavel Machek napsal(a): > >> Ahoj! / Hi! > > Ahoj! / Hi! / Guten Tag! > >>>>>>> arch/arm/mach-pxa/Kconfig | 5 + > >>>>>>> arch/arm/mach-pxa/Makefile | 2 +- > >>>>>>> arch/arm/mach-pxa/include/mach/palmgsm.h | 60 ++++ > >>>>>>> arch/arm/mach-pxa/include/mach/treo680.h | 49 --- > >>>>>>> arch/arm/mach-pxa/palmgsm.c | 559 > >>>>>>> ++++++++++++++++++++++++++++++ arch/arm/mach-pxa/treo680.c > >>>>>>> | 528 ---------------------------- > >>>>>> I don't actually care too much about the naming - as long as 685 > >>>>>> can stay within treo680.c, I don't see any problem with that. The > >>>>>> real question is: is palmgsm.c the proper name for all these > >>>>>> devices? > >>>>> Well, actually your completely right. PalmGSM is not fitting for all > >>>>> devices to come, more fitting would be something like Palm > >>>>> smartphones because there are CDMA devices to come too. On the other > >>>>> hand, this name is the best I found so far. If you don't mind I would > >>>>> even so... > >>>> I believe treo680 was better name then. Don't change it if you don't > >>>> need to... > >>> But I need to have different generic name - treo680 will be occupied by > >>> Treo680 specific stuff, which makes more sense, doesn't it? > >> And rename generic code to treo.c? Then you could have treo.c for > >> generic code, and treo680.c / treo685.c for specific models... > >> > >> palmgsm.c sounds like driver for their GSM chip... > >> Pavel > > > > Yeah, or treo-common.c in case you'd want to split it into core file + model > > files. But treo.c/palm(smart)phone.c (?) seems more ok. I dont like the idea of > > splitting the code into more files (one big, and many small). > > > > Well, treo680.c can just include all the specific stuffs in a single > file as long as possibility is concerned. And #ifdef .. #endif can > be used to include the code or not. See ezx.c for a good example. Well, I think I follow ezx.c example as much as I can - or it wasn't addressed to me? Best regards, Tomas Cech ^ permalink raw reply [flat|nested] 22+ messages in thread
* [PATCH 4/5] PalmGSM: generalisation of Treo680 code to PalmGSM 2009-09-01 0:07 ` Pavel Machek 2009-09-01 1:22 ` Marek Vasut @ 2009-09-01 10:56 ` Tomáš 'Sleep_Walker' Čech 1 sibling, 0 replies; 22+ messages in thread From: Tomáš 'Sleep_Walker' Čech @ 2009-09-01 10:56 UTC (permalink / raw) To: linux-arm-kernel Ahoj! :) Dne ?t 1. z??? 2009 02:07:16 Pavel Machek napsal(a): > Ahoj! / Hi! > > > > > > > arch/arm/mach-pxa/Kconfig | 5 + > > > > > > arch/arm/mach-pxa/Makefile | 2 +- > > > > > > arch/arm/mach-pxa/include/mach/palmgsm.h | 60 ++++ > > > > > > arch/arm/mach-pxa/include/mach/treo680.h | 49 --- > > > > > > arch/arm/mach-pxa/palmgsm.c | 559 ++++++++++++++++++++++++++++++ > > > > > > arch/arm/mach-pxa/treo680.c | 528 ---------------------------- > > > > > > > > > > I don't actually care too much about the naming - as long as 685 can stay > > > > > within treo680.c, I don't see any problem with that. The real question is: > > > > > is palmgsm.c the proper name for all these devices? > > > > > > > > Well, actually your completely right. PalmGSM is not fitting for all devices to come, more fitting would be something like Palm smartphones because there are CDMA devices to come too. On the other hand, this name is the best I found so far. If you don't mind I would even so... > > > > > > > > > > I believe treo680 was better name then. Don't change it if you don't > > > need to... > > > > But I need to have different generic name - treo680 will be occupied by Treo680 specific stuff, which makes more sense, doesn't it? > > > > And rename generic code to treo.c? Then you could have treo.c for > generic code, and treo680.c / treo685.c for specific models... > > palmgsm.c sounds like driver for their GSM chip... > Pavel > OK, treo.c would be best (even though that one model has name Centro), I'll recreate patch set. I'm just a bit afraid of treo650_, treo680, treo700p_, treo755p_ and treo_ naming (the code will be a bit more worse to read), but right - this is the best name. Thanks! Tomas Cech ^ permalink raw reply [flat|nested] 22+ messages in thread
* [PATCH 1/5] Treo680: pxamci simplify to use GPIO 2009-08-27 0:43 ` [PATCH 1/5] Treo680: pxamci simplify to use GPIO Tomáš Čech 2009-08-27 0:43 ` [PATCH 2/5] Treo680: remove unused LCD power GPIO Tomáš Čech @ 2009-08-31 10:44 ` Pavel Machek 2009-08-31 11:03 ` Tomáš 'Sleep_Walker' Čech 1 sibling, 1 reply; 22+ messages in thread From: Pavel Machek @ 2009-08-31 10:44 UTC (permalink / raw) To: linux-arm-kernel On Thu 2009-08-27 02:43:27, Tom???? ??ech wrote: > From: Tom???? ??ech <sleep walker@suse.cz> I see a space in email address. Is that right? It should be _, afaict. Pavel -- (english) http://www.livejournal.com/~pavelmachek (cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html ^ permalink raw reply [flat|nested] 22+ messages in thread
* [PATCH 1/5] Treo680: pxamci simplify to use GPIO 2009-08-31 10:44 ` [PATCH 1/5] Treo680: pxamci simplify to use GPIO Pavel Machek @ 2009-08-31 11:03 ` Tomáš 'Sleep_Walker' Čech 0 siblings, 0 replies; 22+ messages in thread From: Tomáš 'Sleep_Walker' Čech @ 2009-08-31 11:03 UTC (permalink / raw) To: linux-arm-kernel Hi! Dne Po 31. srpna 2009 12:44:18 Pavel Machek napsal(a): > On Thu 2009-08-27 02:43:27, Tom???? ??ech wrote: > > From: Tom???? ??ech <sleep walker@suse.cz> > > I see a space in email address. Is that right? It should be _, afaict. Interesting, I can see it too, but I've got it correctly in ~/.gitconfig. New set of patches seems to be generated correctly... Best regards, Tomas Cech ^ permalink raw reply [flat|nested] 22+ messages in thread
* update Treo680, generalise it and add Centro support - round 2 @ 2009-08-31 17:25 Tomáš Čech 2009-08-31 17:25 ` [PATCH 1/5] Treo680: pxamci simplify to use GPIO Tomáš Čech 0 siblings, 1 reply; 22+ messages in thread From: Tomáš Čech @ 2009-08-31 17:25 UTC (permalink / raw) To: linux-arm-kernel Hi, this is second round of patch set updating Treo680, generalising it and adding support for Palm Centro. Changes since last time: - patch set generated properly (with respect of file renames) - fixed name of keyboard backlight LED (now treo680:white:keybbl, centro:white:keybbl) Thanks for your time and comments. Best regards, Tomas Cech ^ permalink raw reply [flat|nested] 22+ messages in thread
* [PATCH 1/5] Treo680: pxamci simplify to use GPIO 2009-08-31 17:25 update Treo680, generalise it and add Centro support - round 2 Tomáš Čech @ 2009-08-31 17:25 ` Tomáš Čech 2009-08-31 17:25 ` [PATCH 2/5] Treo680: remove unused LCD power GPIO Tomáš Čech 0 siblings, 1 reply; 22+ messages in thread From: Tomáš Čech @ 2009-08-31 17:25 UTC (permalink / raw) To: linux-arm-kernel From: Tom?? ?ech <sleep walker@suse.cz> Signed-off-by: Tom?? ?ech <sleep_walker@suse.cz> --- arch/arm/mach-pxa/treo680.c | 84 ++---------------------------------------- 1 files changed, 4 insertions(+), 80 deletions(-) diff --git a/arch/arm/mach-pxa/treo680.c b/arch/arm/mach-pxa/treo680.c index a06f19e..050ad8e 100644 --- a/arch/arm/mach-pxa/treo680.c +++ b/arch/arm/mach-pxa/treo680.c @@ -153,87 +153,11 @@ static unsigned long treo680_pin_config[] __initdata = { /****************************************************************************** * SD/MMC card controller ******************************************************************************/ -static int treo680_mci_init(struct device *dev, - irq_handler_t treo680_detect_int, void *data) -{ - int err = 0; - - /* Setup an interrupt for detecting card insert/remove events */ - err = gpio_request(GPIO_NR_TREO680_SD_DETECT_N, "SD IRQ"); - - if (err) - goto err; - - err = gpio_direction_input(GPIO_NR_TREO680_SD_DETECT_N); - if (err) - goto err2; - - err = request_irq(gpio_to_irq(GPIO_NR_TREO680_SD_DETECT_N), - treo680_detect_int, IRQF_DISABLED | IRQF_SAMPLE_RANDOM | - IRQF_TRIGGER_FALLING | IRQF_TRIGGER_RISING, - "SD/MMC card detect", data); - - if (err) { - dev_err(dev, "%s: cannot request SD/MMC card detect IRQ\n", - __func__); - goto err2; - } - - err = gpio_request(GPIO_NR_TREO680_SD_POWER, "SD_POWER"); - if (err) - goto err3; - - err = gpio_direction_output(GPIO_NR_TREO680_SD_POWER, 1); - if (err) - goto err4; - - err = gpio_request(GPIO_NR_TREO680_SD_READONLY, "SD_READONLY"); - if (err) - goto err4; - - err = gpio_direction_input(GPIO_NR_TREO680_SD_READONLY); - if (err) - goto err5; - - return 0; - -err5: - gpio_free(GPIO_NR_TREO680_SD_READONLY); -err4: - gpio_free(GPIO_NR_TREO680_SD_POWER); -err3: - free_irq(gpio_to_irq(GPIO_NR_TREO680_SD_DETECT_N), data); -err2: - gpio_free(GPIO_NR_TREO680_SD_DETECT_N); -err: - return err; -} - -static void treo680_mci_exit(struct device *dev, void *data) -{ - gpio_free(GPIO_NR_TREO680_SD_READONLY); - gpio_free(GPIO_NR_TREO680_SD_POWER); - free_irq(gpio_to_irq(GPIO_NR_TREO680_SD_DETECT_N), data); - gpio_free(GPIO_NR_TREO680_SD_DETECT_N); -} - -static void treo680_mci_power(struct device *dev, unsigned int vdd) -{ - struct pxamci_platform_data *p_d = dev->platform_data; - gpio_set_value(GPIO_NR_TREO680_SD_POWER, p_d->ocr_mask & (1 << vdd)); -} - -static int treo680_mci_get_ro(struct device *dev) -{ - return gpio_get_value(GPIO_NR_TREO680_SD_READONLY); -} - static struct pxamci_platform_data treo680_mci_platform_data = { - .ocr_mask = MMC_VDD_32_33 | MMC_VDD_33_34, - .setpower = treo680_mci_power, - .get_ro = treo680_mci_get_ro, - .init = treo680_mci_init, - .exit = treo680_mci_exit, + .ocr_mask = MMC_VDD_32_33 | MMC_VDD_33_34, + .gpio_card_detect = GPIO_NR_TREO680_SD_DETECT_N, + .gpio_card_ro = GPIO_NR_TREO680_SD_READONLY, + .gpio_power = GPIO_NR_TREO680_SD_POWER, }; /****************************************************************************** -- 1.6.3.3 ^ permalink raw reply related [flat|nested] 22+ messages in thread
* [PATCH 2/5] Treo680: remove unused LCD power GPIO 2009-08-31 17:25 ` [PATCH 1/5] Treo680: pxamci simplify to use GPIO Tomáš Čech @ 2009-08-31 17:25 ` Tomáš Čech 2009-08-31 17:25 ` [PATCH 3/5] Treo680: fix freed GPIO in treo680_irda_shutdown() Tomáš Čech 0 siblings, 1 reply; 22+ messages in thread From: Tomáš Čech @ 2009-08-31 17:25 UTC (permalink / raw) To: linux-arm-kernel From: Tom?? ?ech <sleep walker@suse.cz> Signed-off-by: Tom?? ?ech <sleep_walker@suse.cz> --- arch/arm/mach-pxa/treo680.c | 10 +--------- 1 files changed, 1 insertions(+), 9 deletions(-) diff --git a/arch/arm/mach-pxa/treo680.c b/arch/arm/mach-pxa/treo680.c index 050ad8e..57bccc3 100644 --- a/arch/arm/mach-pxa/treo680.c +++ b/arch/arm/mach-pxa/treo680.c @@ -254,16 +254,9 @@ static int treo680_backlight_init(struct device *dev) ret = gpio_direction_output(GPIO_NR_TREO680_BL_POWER, 0); if (ret) goto err2; - ret = gpio_request(GPIO_NR_TREO680_LCD_POWER, "LCD POWER"); - if (ret) - goto err2; - ret = gpio_direction_output(GPIO_NR_TREO680_LCD_POWER, 0); - if (ret) - goto err3; return 0; -err3: - gpio_free(GPIO_NR_TREO680_LCD_POWER); + err2: gpio_free(GPIO_NR_TREO680_BL_POWER); err: @@ -279,7 +272,6 @@ static int treo680_backlight_notify(int brightness) static void treo680_backlight_exit(struct device *dev) { gpio_free(GPIO_NR_TREO680_BL_POWER); - gpio_free(GPIO_NR_TREO680_LCD_POWER); } static struct platform_pwm_backlight_data treo680_backlight_data = { -- 1.6.3.3 ^ permalink raw reply related [flat|nested] 22+ messages in thread
* [PATCH 3/5] Treo680: fix freed GPIO in treo680_irda_shutdown() 2009-08-31 17:25 ` [PATCH 2/5] Treo680: remove unused LCD power GPIO Tomáš Čech @ 2009-08-31 17:25 ` Tomáš Čech 2009-08-31 17:36 ` Marek Vasut 0 siblings, 1 reply; 22+ messages in thread From: Tomáš Čech @ 2009-08-31 17:25 UTC (permalink / raw) To: linux-arm-kernel From: Tom?? ?ech <sleep walker@suse.cz> Signed-off-by: Tom?? ?ech <sleep_walker@suse.cz> --- arch/arm/mach-pxa/treo680.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/arch/arm/mach-pxa/treo680.c b/arch/arm/mach-pxa/treo680.c index 57bccc3..d88114c 100644 --- a/arch/arm/mach-pxa/treo680.c +++ b/arch/arm/mach-pxa/treo680.c @@ -325,7 +325,7 @@ err1: static void treo680_irda_shutdown(struct device *dev) { - gpio_free(GPIO_NR_TREO680_AMP_EN); + gpio_free(GPIO_NR_TREO680_IR_EN); } static struct pxaficp_platform_data treo680_ficp_info = { -- 1.6.3.3 ^ permalink raw reply related [flat|nested] 22+ messages in thread
* [PATCH 3/5] Treo680: fix freed GPIO in treo680_irda_shutdown() 2009-08-31 17:25 ` [PATCH 3/5] Treo680: fix freed GPIO in treo680_irda_shutdown() Tomáš Čech @ 2009-08-31 17:36 ` Marek Vasut 2009-09-01 9:52 ` Eric Miao 0 siblings, 1 reply; 22+ messages in thread From: Marek Vasut @ 2009-08-31 17:36 UTC (permalink / raw) To: linux-arm-kernel Dne Po 31. srpna 2009 19:25:59 Tom?? ?ech napsal(a): > From: Tom?? ?ech <sleep walker@suse.cz> > > > Signed-off-by: Tom?? ?ech <sleep_walker@suse.cz> > --- > arch/arm/mach-pxa/treo680.c | 2 +- > 1 files changed, 1 insertions(+), 1 deletions(-) > > diff --git a/arch/arm/mach-pxa/treo680.c b/arch/arm/mach-pxa/treo680.c > index 57bccc3..d88114c 100644 > --- a/arch/arm/mach-pxa/treo680.c > +++ b/arch/arm/mach-pxa/treo680.c > @@ -325,7 +325,7 @@ err1: > > static void treo680_irda_shutdown(struct device *dev) > { > - gpio_free(GPIO_NR_TREO680_AMP_EN); > + gpio_free(GPIO_NR_TREO680_IR_EN); > } > > static struct pxaficp_platform_data treo680_ficp_info = { ... Seems OK to me, I think the first three patches can go in as is, Eric, could you merge them? Thanks Acked-by: Marek Vasut <marek.vasut@gmail.com> ^ permalink raw reply [flat|nested] 22+ messages in thread
* [PATCH 3/5] Treo680: fix freed GPIO in treo680_irda_shutdown() 2009-08-31 17:36 ` Marek Vasut @ 2009-09-01 9:52 ` Eric Miao 0 siblings, 0 replies; 22+ messages in thread From: Eric Miao @ 2009-09-01 9:52 UTC (permalink / raw) To: linux-arm-kernel Marek Vasut wrote: > Dne Po 31. srpna 2009 19:25:59 Tom?? ?ech napsal(a): >> From: Tom?? ?ech <sleep walker@suse.cz> >> >> >> Signed-off-by: Tom?? ?ech <sleep_walker@suse.cz> >> --- >> arch/arm/mach-pxa/treo680.c | 2 +- >> 1 files changed, 1 insertions(+), 1 deletions(-) >> >> diff --git a/arch/arm/mach-pxa/treo680.c b/arch/arm/mach-pxa/treo680.c >> index 57bccc3..d88114c 100644 >> --- a/arch/arm/mach-pxa/treo680.c >> +++ b/arch/arm/mach-pxa/treo680.c >> @@ -325,7 +325,7 @@ err1: >> >> static void treo680_irda_shutdown(struct device *dev) >> { >> - gpio_free(GPIO_NR_TREO680_AMP_EN); >> + gpio_free(GPIO_NR_TREO680_IR_EN); >> } >> >> static struct pxaficp_platform_data treo680_ficp_info = { > > ... > > Seems OK to me, I think the first three patches can go in as is, Eric, could > you merge them? Thanks > > Acked-by: Marek Vasut <marek.vasut@gmail.com> This has been merged by Russell in his patch tracking system, so really don't need to go via my tree now. ^ permalink raw reply [flat|nested] 22+ messages in thread
end of thread, other threads:[~2009-09-01 20:50 UTC | newest] Thread overview: 22+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2009-08-27 0:43 update Treo680, generalise it and add Centro support Tomáš Čech 2009-08-27 0:43 ` [PATCH 1/5] Treo680: pxamci simplify to use GPIO Tomáš Čech 2009-08-27 0:43 ` [PATCH 2/5] Treo680: remove unused LCD power GPIO Tomáš Čech 2009-08-27 0:43 ` [PATCH 3/5] Treo680: fix freed GPIO in treo680_irda_shutdown() Tomáš Čech 2009-08-27 0:43 ` [PATCH 4/5] PalmGSM: generalisation of Treo680 code to PalmGSM Tomáš Čech 2009-08-27 0:43 ` [PATCH 5/5] PalmGSM: add basic Centro support Tomáš Čech 2009-08-27 13:35 ` Marek Vasut 2009-08-28 20:18 ` Tomáš 'Sleep_Walker' Čech 2009-08-27 2:31 ` [PATCH 4/5] PalmGSM: generalisation of Treo680 code to PalmGSM Eric Miao 2009-08-28 20:13 ` Tomáš 'Sleep_Walker' Čech 2009-08-31 10:43 ` Pavel Machek 2009-08-31 11:06 ` Tomáš 'Sleep_Walker' Čech 2009-09-01 0:07 ` Pavel Machek 2009-09-01 1:22 ` Marek Vasut 2009-09-01 9:39 ` Eric Miao 2009-09-01 20:50 ` Tomáš 'Sleep_Walker' Čech 2009-09-01 10:56 ` Tomáš 'Sleep_Walker' Čech 2009-08-31 10:44 ` [PATCH 1/5] Treo680: pxamci simplify to use GPIO Pavel Machek 2009-08-31 11:03 ` Tomáš 'Sleep_Walker' Čech -- strict thread matches above, loose matches on Subject: below -- 2009-08-31 17:25 update Treo680, generalise it and add Centro support - round 2 Tomáš Čech 2009-08-31 17:25 ` [PATCH 1/5] Treo680: pxamci simplify to use GPIO Tomáš Čech 2009-08-31 17:25 ` [PATCH 2/5] Treo680: remove unused LCD power GPIO Tomáš Čech 2009-08-31 17:25 ` [PATCH 3/5] Treo680: fix freed GPIO in treo680_irda_shutdown() Tomáš Čech 2009-08-31 17:36 ` Marek Vasut 2009-09-01 9:52 ` Eric Miao
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).