All pastes #1038957 Raw Edit

Diff

public text v1 · immutable
#1038957 ·published 2008-06-04 20:31 UTC
rendered paste body
From d467dab9075d817433a487ad909cde1146ec6212 Mon Sep 17 00:00:00 2001From: Philipp Zabel <philipp.zabel@gmail.com>Date: Fri, 28 Mar 2008 18:04:51 +0100Subject: [PATCH] WIP: experimental hx4700 support--- arch/arm/mach-pxa/Kconfig         |   17 +- arch/arm/mach-pxa/Makefile        |    1 + arch/arm/mach-pxa/hx4700.c        |  746 +++++++++++++++++++++++++++++++++++++ include/asm-arm/arch-pxa/hx4700.h |  149 ++++++++ 4 files changed, 907 insertions(+), 6 deletions(-) create mode 100644 arch/arm/mach-pxa/hx4700.c create mode 100644 include/asm-arm/arch-pxa/hx4700.hdiff --git a/arch/arm/mach-pxa/Kconfig b/arch/arm/mach-pxa/Kconfigindex cd33f3f..988872f 100644--- a/arch/arm/mach-pxa/Kconfig+++ b/arch/arm/mach-pxa/Kconfig@@ -58,6 +58,17 @@ config PXA_SHARPSL 	  SL-C3000 (Spitz), SL-C3100 (Borzoi) or SL-C6000x (Tosa) 	  handheld computer. +config MACH_MAGICIAN+	bool "Enable HTC Magician Support"+	select PXA27x+	select IWMMXT+	select HAVE_PWM++config MACH_H4700+	bool "Enable HP iPAQ hx4700 Support"+	select PXA27x+	select IWMMXT+ config ARCH_PXA_ESERIES 	bool "PXA based Toshiba e-series PDAs" 	select PXA25x@@ -129,12 +140,6 @@ config MACH_ARMCORE 	select PXA27x 	select IWMMXT -config MACH_MAGICIAN-	bool "Enable HTC Magician Support"-	depends on ARCH_PXA-	select PXA27x-	select IWMMXT- config MACH_PCM027 	bool "Phytec phyCORE-PXA270 CPU module (PCM-027)" 	select PXA27xdiff --git a/arch/arm/mach-pxa/Makefile b/arch/arm/mach-pxa/Makefileindex 2721c32..c26c45e 100644--- a/arch/arm/mach-pxa/Makefile+++ b/arch/arm/mach-pxa/Makefile@@ -36,6 +36,7 @@ obj-$(CONFIG_MACH_PCM990_BASEBOARD)	+= pcm990-baseboard.o obj-$(CONFIG_MACH_TOSA)		+= tosa.o obj-$(CONFIG_MACH_EM_X270)	+= em-x270.o obj-$(CONFIG_MACH_MAGICIAN)	+= magician.o+obj-$(CONFIG_MACH_H4700)	+= hx4700.o obj-$(CONFIG_ARCH_PXA_ESERIES)	+= eseries.o  ifeq ($(CONFIG_MACH_ZYLONITE),y)diff --git a/arch/arm/mach-pxa/hx4700.c b/arch/arm/mach-pxa/hx4700.cnew file mode 100644index 0000000..85ef656--- /dev/null+++ b/arch/arm/mach-pxa/hx4700.c@@ -0,0 +1,746 @@+/*+ * Support for HP iPAQ hx4700 PDAs.+ *+ * Copyright (c) 2008 Philipp Zabel+ * Copyright (c) 2006 Anton Vorontsov <cbou@mail.ru>+ * Copyright (c) 2005 SDG Systems, LLC+ *+ * Based on code:+ *    Copyright 2004 Hewlett-Packard Company.+ *+ * This program is free software; you can redistribute it and/or modify+ * it under the terms of the GNU General Public License as published by+ * the Free Software Foundation; either version 2 of the License, or+ * (at your option) any later version.+ *+ */++#include <linux/kernel.h>+#include <linux/init.h>+#include <linux/platform_device.h>+#include <linux/delay.h>+#include <linux/fb.h>+#include <linux/gpio.h>+#include <linux/gpio_keys.h>+#include <linux/input.h>+#include <linux/lcd.h>+#include <linux/mfd/htc-egpio.h>+#include <linux/mfd/asic3.h>+#include <linux/pda_power.h>+#include <linux/pwm_backlight.h>++#include <asm/hardware.h>+#include <asm/mach-types.h>+#include <asm/mach/arch.h>++#include <asm/arch/hx4700.h>+#include <asm/arch/i2c.h>+#include <asm/arch/irda.h>+#include <asm/arch/mfp-pxa27x.h>+#include <asm/arch/pxa-regs.h>++#include <video/w100fb.h>++#include "devices.h"+#include "generic.h"++/* Physical address space information */++#define HX4700_ATI_W3220_PHYS	PXA_CS2_PHYS /* ATI Imageon 3220 Graphics */+#define HX4700_ASIC3_PHYS	PXA_CS3_PHYS+#define HX4700_ASIC3_SD_PHYS	(PXA_CS3_PHYS + 0x02000000) /* 0x0e000000 */+#define HX4700_EGPIO_WLAN_PHYS	PXA_CS5_PHYS /* TI WLAN, EGPIO, External UART */++static unsigned long hx4700_pin_config[] = {++	/* SDRAM and Static Memory I/O Signals */+	GPIO20_nSDCS_2,+	GPIO21_nSDCS_3,+	GPIO15_nCS_1,+	GPIO78_nCS_2,   /* PASIC3 */+	GPIO79_nCS_3,   /* EGPIO CPLD */+	GPIO80_nCS_4,+	GPIO33_nCS_5,++	/* PC CARD */+	GPIO48_nPOE,+	GPIO49_nPWE,+	GPIO50_nPIOR,+	GPIO51_nPIOW,+	GPIO54_nPCE_2,+	GPIO55_nPREG,+	GPIO56_nPWAIT,+	GPIO57_nIOIS16,+	GPIO85_nPCE_1,+	GPIO104_PSKTSEL,++	/* I2C */+	GPIO117_I2C_SCL,+	GPIO118_I2C_SDA,++	/* FFUART (RS-232) */+	GPIO34_FFUART_RXD,+	GPIO35_FFUART_CTS,+	GPIO36_FFUART_DCD,+	GPIO37_FFUART_DSR,+	GPIO38_FFUART_RI,+	GPIO39_FFUART_TXD,+	GPIO40_FFUART_DTR,+	GPIO41_FFUART_RTS,++	/* BTUART */+	GPIO42_BTUART_RXD,+	GPIO43_BTUART_TXD,+	GPIO44_BTUART_CTS,+	GPIO45_BTUART_RTS,++	/* PWM 1 */+//	GPIO17_PWM1_OUT,++	/* I2S */+	GPIO28_I2S_BITCLK_OUT,+	GPIO29_I2S_SDATA_IN,+	GPIO30_I2S_SDATA_OUT,+	GPIO31_I2S_SYNC,+	GPIO113_I2S_SYSCLK,++	/* SSP 1 (NavPoint) */+	GPIO23_SSP1_SCLK,+	GPIO24_SSP1_SFRM,+	GPIO25_SSP1_TXD,+	GPIO26_SSP1_RXD,++	/* SSP 2 (Touchpanel) */+	GPIO19_SSP2_SCLK,+	GPIO86_SSP2_RXD,+	GPIO87_SSP2_TXD,+	GPIO88_SSP2_SFRM,++	/* HX4700 specific input GPIOs */+	GPIO12_GPIO,	/* ASIC3_IRQ */+	GPIO13_GPIO,	/* W3220_IRQ */+	GPIO14_GPIO,	/* nWLAN_IRQ */++//	GPIO10_GPIO,	/* GSM_IRQ */+//	GPIO13_GPIO,	/* CPLD_IRQ */+//	GPIO107_GPIO,	/* DS1WM_IRQ */+//	GPIO108_GPIO,	/* GSM_READY */+//	GPIO115_GPIO,	/* nPEN_IRQ */+	GPIO66_GPIO,	/* nSDIO_IRQ */+};++/*+ * IRDA+ */++/* for pxaficp_ir */+static void hx4700_irda_transceiver_mode(struct device *dev, int mode)+{+	gpio_set_value(GPIO105_HX4700_nIR_ON, (mode & IR_OFF));+}++static struct pxaficp_platform_data hx4700_ficp_info = {+	.transceiver_cap  = IR_SIRMODE | IR_OFF,+	.transceiver_mode = hx4700_irda_transceiver_mode,+};++/*+ * GPIO Keys+ */++static struct gpio_keys_button hx4700_gpio_buttons[] = {+	{KEY_POWER,    GPIO0_HX4700_nKEY_POWER,   1, "Power button" },+	{KEY_MAIL,     GPIO94_HX4700_KEY_AP3,  0, "Mail button" },+	{KEY_F10,      GPIO99_HX4700_KEY_AP1,  0, "Contacts button" },+//	{KEY_RECORD,   HX4700_ASIC3_GPIO_BASE+ASIC3_GPIOD_IRQ_BASE+GPIOD_AUD_RECORD_N, 1, "Record button" },+//	{KEY_CALENDAR, HX4700_ASIC3_GPIO_BASE+ASIC3_GPIOD_IRQ_BASE+GPIOD_KEY_AP2_N, 1, "Calendar button" },+//	{KEY_HOMEPAGE, HX4700_ASIC3_GPIO_BASE+ASIC3_GPIOD_IRQ_BASE+GPIOD_KEY_AP4_N, 1, "Home button" },+};++static struct gpio_keys_platform_data hx4700_gpio_keys_data = {+	.buttons = hx4700_gpio_buttons,+	.nbuttons = ARRAY_SIZE(hx4700_gpio_buttons),+};++static struct platform_device gpio_keys = {+	.name = "gpio-keys",+	.dev = {+		.platform_data = &hx4700_gpio_keys_data,+	},+};++/*+ * EGPIO+ */++static struct resource egpio_resources[] = {+	[0] = {+		.start = PXA_CS5_PHYS,+		.end   = PXA_CS5_PHYS + 0x4,+		.flags = IORESOURCE_MEM,+	},+};++static struct htc_egpio_chip egpio_chips[] = {+	[0] = {+		.reg_start = 0,+		.gpio_base = HX4700_EGPIO_BASE,+		.num_gpios = 8,+		.direction = HTC_EGPIO_OUTPUT,+	},+};++static struct htc_egpio_platform_data egpio_info = {+	.reg_width = 16,+	.bus_width = 16,+	.chip      = egpio_chips,+	.num_chips = ARRAY_SIZE(egpio_chips),+};++struct platform_device egpio = {+	.name          = "htc-egpio",+	.id            = -1,+	.resource      = egpio_resources,+	.num_resources = ARRAY_SIZE(egpio_resources),+	.dev  = {+		.platform_data = &egpio_info,+	},+};++/*+ * LCD - Sony something connected to ATI Imageon w3220 + */++#define HX4700_ATI_W3220_PHYS	PXA_CS2_PHYS++static int lcd_power;++static void lcd_hw_init(void)+{+	// printk( KERN_NOTICE "LCD init: clear values\n" );+	gpio_set_value(GPIO84_HX4700_LCD_SQN, 1);+	gpio_set_value(GPIO110_HX4700_LCD_LVDD_3V3_ON, 0);+	gpio_set_value(GPIO111_HX4700_LCD_AVDD_3V3_ON, 0);+	gpio_set_value(GPIO70_HX4700_LCD_SLIN1, 0);+	gpio_set_value(GPIO62_HX4700_LCD_nRESET, 0);+	mdelay(10);+	gpio_set_value(GPIO59_HX4700_LCD_PC1, 0);+	gpio_set_value(GPIO110_HX4700_LCD_LVDD_3V3_ON, 0);+	mdelay(20);++	// printk( KERN_NOTICE "LCD init: set values\n" );+	gpio_set_value(GPIO110_HX4700_LCD_LVDD_3V3_ON, 1);+	mdelay(5);+	gpio_set_value(GPIO111_HX4700_LCD_AVDD_3V3_ON, 1);+	// init w3220 regs?++	mdelay(5);+	gpio_set_value(GPIO70_HX4700_LCD_SLIN1, 1);+	mdelay(10);+	gpio_set_value(GPIO62_HX4700_LCD_nRESET, 1);+	mdelay(10);+	gpio_set_value(GPIO59_HX4700_LCD_PC1, 1);+	mdelay(10);+	gpio_set_value(GPIO112_HX4700_LCD_N2V7_7V3_ON, 1);+}++static void lcd_hw_off(void)+{+	gpio_set_value(GPIO59_HX4700_LCD_PC1, 0);+	gpio_set_value(GPIO62_HX4700_LCD_nRESET, 0);+	mdelay(10);+	gpio_set_value(GPIO112_HX4700_LCD_N2V7_7V3_ON, 0);+	mdelay(10);+	gpio_set_value(GPIO111_HX4700_LCD_AVDD_3V3_ON, 0);+	mdelay(10);+	gpio_set_value(GPIO110_HX4700_LCD_LVDD_3V3_ON, 0);+}++static int hx4700_lcd_set_power(struct lcd_device *lm, int level)+{+	switch (level) {+	case FB_BLANK_UNBLANK:+		lcd_hw_init();+		break;+	case FB_BLANK_NORMAL:+	case FB_BLANK_VSYNC_SUSPEND:+	case FB_BLANK_HSYNC_SUSPEND:+	case FB_BLANK_POWERDOWN:+		lcd_hw_off();+		break;+	}+	lcd_power = level;+	return 0;+}++static int hx4700_lcd_get_power(struct lcd_device *lm)+{+	return lcd_power;+}++static struct lcd_ops w3220_fb0_lcd = {+	.get_power = hx4700_lcd_get_power,+	.set_power = hx4700_lcd_set_power,+};++static struct lcd_device *atifb_lcd_dev;++#ifdef CONFIG_PM++unsigned long ati_gpios[4];++static void+hx4700_lcd_suspend(struct w100fb_par *wfb)+{+	ati_gpios[0] = w100fb_gpio_read(W100_GPIO_PORT_A);+	ati_gpios[1] = w100fb_gpcntl_read(W100_GPIO_PORT_A);+	ati_gpios[2] = w100fb_gpio_read(W100_GPIO_PORT_B);+	ati_gpios[3] = w100fb_gpcntl_read(W100_GPIO_PORT_B);+	w100fb_gpio_write(W100_GPIO_PORT_A, 0xDFE00000);+	w100fb_gpcntl_write(W100_GPIO_PORT_A, 0xFFFF0000);+	w100fb_gpio_write(W100_GPIO_PORT_B, 0x00000000);+	w100fb_gpcntl_write(W100_GPIO_PORT_B, 0xFFFFFFFF);+	lcd_hw_off();+}++static void+hx4700_lcd_resume(struct w100fb_par *wfb)+{+	w100fb_gpio_write(W100_GPIO_PORT_A, ati_gpios[0]);+	w100fb_gpcntl_write(W100_GPIO_PORT_A, ati_gpios[1]);+	w100fb_gpio_write(W100_GPIO_PORT_B, ati_gpios[2]);+	w100fb_gpcntl_write(W100_GPIO_PORT_B, ati_gpios[3]);+	lcd_hw_init();+}++#else+#define hx4700_lcd_resume	NULL+#define hx4700_lcd_suspend	NULL+#endif++struct w100_tg_info hx4700_tg_info = {+	.suspend	= hx4700_lcd_suspend,+	.resume		= hx4700_lcd_resume,+};++//  				 W3220_VGA		QVGA+static struct w100_gen_regs hx4700_w100_regs = {+	.lcd_format =        0x00000003,+	.lcdd_cntl1 =        0x00000000,+	.lcdd_cntl2 =        0x0003ffff,+	.genlcd_cntl1 =      0x00abf003,	//  0x00fff003+	.genlcd_cntl2 =      0x00000003,	+	.genlcd_cntl3 =      0x000102aa,+};++static struct w100_mode hx4700_w100_modes[] = {+{+	.xres 		= 480,+	.yres 		= 640,+	.left_margin 	= 15,+	.right_margin 	= 16,+	.upper_margin 	= 8,+	.lower_margin 	= 7,+	.crtc_ss	= 0x00000000,+	.crtc_ls	= 0xa1ff01f9,	// 0x21ff01f9,+	.crtc_gs	= 0xc0000000,	// 0x40000000,+	.crtc_vpos_gs	= 0x0000028f,+	.crtc_ps1_active = 0x00000000,	// 0x41060010+	.crtc_rev	= 0,+	.crtc_dclk	= 0x80000000,+	.crtc_gclk	= 0x040a0104,+	.crtc_goe	= 0,+	.pll_freq 	= 95,+	.pixclk_divider = 4,+	.pixclk_divider_rotated = 4,+	.pixclk_src     = CLK_SRC_PLL,+	.sysclk_divider = 0,+	.sysclk_src     = CLK_SRC_PLL,+},+{+	.xres 		= 240,+	.yres 		= 320,+	.left_margin 	= 9,+	.right_margin 	= 8,+	.upper_margin 	= 5,+	.lower_margin 	= 4,+	.crtc_ss	= 0x80150014,+	.crtc_ls	= 0xa0fb00f7,+	.crtc_gs	= 0xc0080007,+	.crtc_vpos_gs	= 0x00080007,+	.crtc_rev	= 0x0000000a,+	.crtc_dclk	= 0x81700030,+	.crtc_gclk	= 0x8015010f,+	.crtc_goe	= 0x00000000,+	.pll_freq 	= 95,+	.pixclk_divider = 4,+	.pixclk_divider_rotated = 4,+	.pixclk_src     = CLK_SRC_PLL,+	.sysclk_divider = 0,+	.sysclk_src     = CLK_SRC_PLL,+},+};++struct w100_mem_info hx4700_mem_info = {+	.ext_cntl = 0x09640011,+	.sdram_mode_reg = 0x00600021,+	.ext_timing_cntl = 0x1a001545,	// 0x15001545,+	.io_cntl = 0x7ddd7333,+	.size = 0x1fffff,+};++struct w100_bm_mem_info hx4700_bm_mem_info = {+	.ext_mem_bw = 0x50413e01,+	.offset = 0,+	.ext_timing_ctl = 0x00043f7f,+	.ext_cntl = 0x00000010,+	.mode_reg = 0x00250000,+	.io_cntl = 0x0fff0000,+	.config = 0x08301480,+};++static struct w100_gpio_regs hx4700_w100_gpio_info = {+	.init_data1 = 0xdfe00100,	// GPIO_DATA+	.gpio_dir1  = 0xffff0000,	// GPIO_CNTL1+	.gpio_oe1   = 0x00000000,	// GPIO_CNTL2+	.init_data2 = 0x00000000,	// GPIO_DATA2+	.gpio_dir2  = 0x00000000,	// GPIO_CNTL3+	.gpio_oe2   = 0x00000000,	// GPIO_CNTL4+};++static struct w100fb_mach_info hx4700_fb_info = {+	.tg        = &hx4700_tg_info,+	.mem       = &hx4700_mem_info, +	.bm_mem    = &hx4700_bm_mem_info, +	.gpio      = &hx4700_w100_gpio_info,+	.regs      = &hx4700_w100_regs,+	.modelist  = hx4700_w100_modes,+	.num_modes = 2,+	.xtal_freq = 16000000,+};++static struct resource hx4700_fb_resources[] = {+	[0] = {+		.start	= HX4700_ATI_W3220_PHYS,+		.end	= HX4700_ATI_W3220_PHYS + 0x00ffffff,+		.flags	= IORESOURCE_MEM,+	},+};++static struct platform_device hx4700_fb_device = {+	.name	= "w100fb",+	.id	= -1,+	.dev	= {+		.platform_data = &hx4700_fb_info,+	},+	.num_resources	= ARRAY_SIZE( hx4700_fb_resources ),+	.resource	= hx4700_fb_resources,+};++/*+ * Backlight+ */++static struct platform_pwm_backlight_data backlight_data = {+	.pwm_id         = 1,+	.max_brightness = 200,+	.dft_brightness = 100,+	.pwm_period_ns  = 30923,+};++static struct platform_device backlight = {+	.name = "pwm-backlight",+	.dev  = {+		.parent        = &pxa27x_device_pwm1.dev,+		.platform_data = &backlight_data,+	},+};++/*+ * LEDs+ */++/*+ * ASIC3+ */++static struct platform_device hx4700_gpio_keys;++static struct platform_device *hx4700_asic3_devices[] __initdata = {+//	&hx4700_serial,+//	&hx4700_udc,+	&hx4700_gpio_keys,+//	&hx4700_leds_pdev,+};++static struct asic3_platform_data asic3_platform_data = {++   /* Setting ASIC3 GPIO registers to the below initialization states+    * hx4700 asic3 information: http://handhelds.org/moin/moin.cgi/HpIpaqHx4700Hardware+    *+    * dir:	Direction of the GPIO pin. 0: input, 1: output.+    *      	If unknown, set as output to avoid power consuming floating input nodes+    * init:	Initial state of the GPIO bits+    *+    * These registers are configured as they are on Wince, and are configured+    * this way on bootldr.+    */+        .gpio_a = {+	//	.mask           = 0xffff,+		.dir            = 0xffff, // Unknown, set as outputs so far+	  	.sleep_mask     = 0xffff,+		.alt_function   = 0xffff,+		.sleep_conf     = 0x000c,+        },+        .gpio_b = {+	//	.mask           = 0xffff,+		.dir            = 0xffff, // Unknown, set as outputs so far+	  	.sleep_mask     = 0xffff,+		.alt_function   = 0xffff,+                .sleep_conf     = 0x000c,+        },+        .gpio_c = {+	//	.mask           = 0xffff,+                .dir            = 0x6067,+	// GPIOC_SD_CS_N | GPIOC_CIOW_N | GPIOC_CIOR_N  | GPIOC_PWAIT_N | GPIOC_PIOS16_N,+	  	.sleep_mask     = 0xffff,+		.alt_function   = 0xfff7, // GPIOC_LED_RED | GPIOC_LED_GREEN | GPIOC_LED_BLUE,+                .sleep_conf     = 0x000c,+        },+        .gpio_d = {+	//	.mask           = 0xffff,+		.dir            = 0x0000, // Only inputs+	//	.trigger_type   = 0x67ff,+	  	.sleep_mask     = 0x9800,+		.alt_function   = 0x9800,+		.sleep_conf     = 0x000c,+        },+	.bus_shift = 1,+	.irq_base = IRQ_BOARD_START,++	.gpio_base = HX4700_ASIC3_GPIO_BASE,++//	.child_devs	 = hx4700_asic3_devices,+//	.num_child_devs = ARRAY_SIZE(hx4700_asic3_devices),+};++#define IPAQ_ASIC3_MAP_SIZE 8192++static struct resource asic3_resources[] = {+        /* GPIO part */+	[0] = {+		.start	= HX4700_ASIC3_PHYS,+		.end	= HX4700_ASIC3_PHYS + IPAQ_ASIC3_MAP_SIZE - 1,+		.flags	= IORESOURCE_MEM,+	},+	[1] = {+		.start	= gpio_to_irq(GPIO12_HX4700_ASIC3_IRQ),+		.end	= gpio_to_irq(GPIO12_HX4700_ASIC3_IRQ),+		.flags	= IORESOURCE_IRQ,+	},+        /* SD part */+#if 0+	[2] = {+		.start	= HX4700_ASIC3_SD_PHYS,+		.end	= HX4700_ASIC3_SD_PHYS + IPAQ_ASIC3_MAP_SIZE - 1,+		.flags	= IORESOURCE_MEM,+	},+	[3] = {+		.start	= gpio_to_irq(GPIO66_HX4700_ASIC3_nSDIO_IRQ),+		.end	= gpio_to_irq(GPIO66_HX4700_ASIC3_nSDIO_IRQ),+		.flags	= IORESOURCE_IRQ,+	},+#endif+};++struct platform_device asic3 = {+	.name		= "asic3",+	.id		= -1,+	.num_resources	= ARRAY_SIZE(asic3_resources),+	.resource	= asic3_resources,+	.dev = {+		.platform_data = &asic3_platform_data,+	},+};++/*+ * External power+ */++static int power_supply_init(struct device *dev)+{+	int ret;++//	gpio_set_value(GPIO96_HX4700_USB_CHARGE_RATE, flags & PDA_POWER_CHARGE_USB);++	ret = gpio_request(GPIOD_nAC_IN, "nAC_IN");+	if (ret)+		goto err_cs_ac;+	ret = gpio_request(GPIOD_nUSBC_DETECT, "nUSBC_DETECT");+	if (ret)+		goto err_cs_usb;+	ret = gpio_request(GPIO96_HX4700_USB_CHARGE_RATE, "USB_CHARGE_RATE");+	if (ret)+		goto err_chg_rate;+	ret = gpio_request(GPIO72_HX4700_nCHARGE_EN, "nCHARGE_EN");+	if (!ret)+		ret = gpio_direction_output(GPIO72_HX4700_nCHARGE_EN, 0);+	if (ret)+		goto err_nchg_en;++	return 0;++err_nchg_en:+	gpio_free(GPIO96_HX4700_USB_CHARGE_RATE);+err_chg_rate:+	gpio_free(GPIOD_nUSBC_DETECT);+err_cs_usb:+	gpio_free(GPIOD_nAC_IN);+err_cs_ac:+	return ret;+}++static int hx4700_is_ac_online(void)+{+	return !gpio_get_value(GPIOD_nAC_IN);+}++static int hx4700_is_usb_online(void)+{+	return !gpio_get_value(GPIOD_nUSBC_DETECT);+}++static void hx4700_set_charge(int flags)+{+	gpio_set_value(GPIO72_HX4700_nCHARGE_EN, !(flags & PDA_POWER_CHARGE_AC));+	gpio_set_value(GPIO96_HX4700_USB_CHARGE_RATE, flags & PDA_POWER_CHARGE_USB);+}++static void power_supply_exit(struct device *dev)+{+	gpio_free(GPIO72_HX4700_nCHARGE_EN);+	gpio_free(GPIO96_HX4700_USB_CHARGE_RATE);+	gpio_free(GPIOD_nAC_IN);+	gpio_free(GPIOD_nUSBC_DETECT);+}++static char *hx4700_supplicants[] = {+	"ds2760-battery.0", "backup-battery"+};++static struct pda_power_pdata power_supply_info = {+	.init            = power_supply_init,+	.is_ac_online    = hx4700_is_ac_online,+	.is_usb_online   = hx4700_is_usb_online,+	.set_charge      = hx4700_set_charge,+	.exit            = power_supply_exit,+	.supplied_to     = hx4700_supplicants,+	.num_supplicants = ARRAY_SIZE(hx4700_supplicants),+};++static struct resource power_supply_resources[] = {+	[0] = {+		.name  = "ac",+		.flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHEDGE |+		         IORESOURCE_IRQ_LOWEDGE,+		.start = gpio_to_irq(GPIOD_nAC_IN),+		.end   = gpio_to_irq(GPIOD_nAC_IN),+	},+	[1] = {+		.name  = "usb",+		.flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHEDGE |+		         IORESOURCE_IRQ_LOWEDGE,+		.start = gpio_to_irq(GPIOD_nUSBC_DETECT),+		.end   = gpio_to_irq(GPIOD_nUSBC_DETECT),+	},+};++static struct platform_device power_supply = {+	.name = "pda-power",+	.id   = -1,+	.dev  = {+		.platform_data = &power_supply_info,+	},+	.resource      = power_supply_resources,+	.num_resources = ARRAY_SIZE(power_supply_resources),+};++/*+ * StrataFlash+ */++/*+ * TSC2046 Touchscreen+ */++/*+ * USB Device Controller+ */++/*+ * Platform devices+ */++static struct platform_device *devices[] __initdata = {+	&gpio_keys,+	&egpio,+	&backlight,+//	&ads7846_ssp,+//	&ads7846_ts,+	&asic3,+	&power_supply,+//	&hx4700_backup_batt,+//	&strataflash,+	&hx4700_fb_device,+//	&hx4700_navpt,+//	&hx4700_bt,+//	&hx4700_wlan,+};++static void __init hx4700_init( void )+{+	int err;++	gpio_request(GPIO12_HX4700_ASIC3_IRQ, "ASIC3_IRQ");+	gpio_request(GPIO13_HX4700_W3220_IRQ, "W3220_IRQ");+	gpio_request(GPIO14_HX4700_nWLAN_IRQ, "nWLAN_IRQ");++	pxa2xx_mfp_config(ARRAY_AND_SIZE(hx4700_pin_config));++	platform_add_devices(devices, ARRAY_SIZE(devices));++	err = gpio_request(GPIO71_HX4700_ASIC3_nRESET, "ASIC3_nRESET");+	if (!err) {+		gpio_direction_output(GPIO71_HX4700_ASIC3_nRESET, 0);+		mdelay(10);+		gpio_set_value(GPIO71_HX4700_ASIC3_nRESET, 1);+		mdelay(10);+	}+	err = gpio_request(GPIO82_HX4700_EUART_RESET, "EUART_RESET");+	if (!err)+		gpio_direction_output(GPIO82_HX4700_EUART_RESET, 1);++	/* Enable RS232 in case we'd have boot console there. In case +	   cable is not actually attached, it will be turned off as +	   soon as hx4700_serial is initialized. */+	err = gpio_request(GPIO32_HX4700_RS232_ON, "RS232_ON");+	if (!err)+		gpio_direction_output(GPIO32_HX4700_RS232_ON, 1);++	err = gpio_request(GPIO105_HX4700_nIR_ON, "nIR_EN");+	if (!err) {+		gpio_direction_output(GPIO105_HX4700_nIR_ON, 1);+		pxa_set_ficp_info(&hx4700_ficp_info);+	}+	pxa_set_i2c_info(NULL);+}++MACHINE_START(H4700, "HP iPAQ HX4700")+	.phys_io	= 0x40000000,+	.io_pg_offst	= (io_p2v(0x40000000) >> 18) & 0xfffc,+	.boot_params	= 0xa0000100,+	.map_io		= pxa_map_io,+	.init_irq	= pxa27x_init_irq,+	.init_machine = hx4700_init,+	.timer = &pxa_timer,+MACHINE_ENDdiff --git a/include/asm-arm/arch-pxa/hx4700.h b/include/asm-arm/arch-pxa/hx4700.hnew file mode 100644index 0000000..7162156--- /dev/null+++ b/include/asm-arm/arch-pxa/hx4700.h@@ -0,0 +1,149 @@+/* + * include/asm-arm/arch-pxa/hx4700-gpio.h+ * History:+ *+ * 2004-12-10 Michael Opdenacker. Wrote down GPIO settings as identified by Jamey Hicks.+ *            Reused the h2200-gpio.h file as a template.+ */++#ifndef _HX4700_H_+#define _HX4700_H_++#define GPIO0_HX4700_nKEY_POWER			0+#define GPIO_NR_HX4700_GP_RST_N			1++#define GPIO_NR_HX4700_PWR_SCL			3+#define GPIO_NR_HX4700_PWR_SDA			4+#define GPIO_NR_HX4700_PWR_CAP0			5+#define GPIO_NR_HX4700_PWR_CAP1			6+#define GPIO_NR_HX4700_PWR_CAP2			7+#define GPIO_NR_HX4700_PWR_CAP3			8+#define GPIO_NR_HX4700_CLK_PIO_CPU_13MHz 	9+#define GPIO_NR_HX4700_CLK_TOUT_32KHz		10+#define GPIO_NR_HX4700_CPU_BF_DOOR_N		11++#define GPIO12_HX4700_ASIC3_IRQ		12+#define GPIO13_HX4700_W3220_IRQ		13+#define GPIO14_HX4700_nWLAN_IRQ		14+++#define GPIO_NR_HX4700_RDY			18+#define GPIO22_HX4700_LCD_RL			22+#define GPIO_NR_HX4700_CODEC_ON			27+#define GPIO32_HX4700_RS232_ON			32++#define GPIO_NR_HX4700_CPU_BATT_FAULT_N		52++#define GPIO_NR_HX4700_TOUCHPANEL_IRQ_N		58+#define GPIO59_HX4700_LCD_PC1			59+#define GPIO_NR_HX4700_CF_RNB			60	/* HaRET: I 1 0 FE */+#define GPIO_NR_HX4700_W3220_RESET_N		61+#define GPIO62_HX4700_LCD_nRESET		62+#define GPIO_NR_HX4700_CPU_SS_RESET_N		63++#define GPIO_NR_HX4700_TOUCHPANEL_PEN_PU	65+#define GPIO66_HX4700_ASIC3_nSDIO_IRQ		66+#define GPIO_NR_HX4700_EUART_PS			67++#define GPIO70_HX4700_LCD_SLIN1		70+#define GPIO71_HX4700_ASIC3_nRESET		71+#define GPIO72_HX4700_nCHARGE_EN		72+#define GPIO73_HX4700_LCD_UD_1			73++#define GPIO_NR_HX4700_EARPHONE_DET_N		75+#define GPIO76_HX4700_USB_PUEN			76++#define GPIO_NR_HX4700_CPU_GP_RESET_N		81+#define GPIO82_HX4700_EUART_RESET		82+#define GPIO_NR_HX4700_WLAN_RESET_N		83+#define GPIO84_HX4700_LCD_SQN			84+#define GPIO_NR_HX4700_PCE1_N			85++#define GPIO_NR_HX4700_FLASH_VPEN		91+#define GPIO_NR_HX4700_HP_DRIVER		92+#define GPIO_NR_HX4700_EUART_INT		93+#define GPIO94_HX4700_KEY_AP3			94+#define GPIO_NR_HX4700_BATT_OFF			95+#define GPIO96_HX4700_USB_CHARGE_RATE		96+#define GPIO97_HX4700_nBL_DETECT		97+#define GPIO99_HX4700_KEY_AP1			99+#define GPIO_NR_HX4700_AUTO_SENSE		100	/* to backlight circuit */++#define GPIO_NR_HX4700_SYNAPTICS_POWER_ON	102+#define GPIO_NR_HX4700_SYNAPTICS_INT		103+#define GPIO105_HX4700_nIR_ON			105+#define GPIO_NR_HX4700_CPU_BT_RESET_N		106+#define GPIO_NR_HX4700_SPK_SD_N			107++#define GPIO_NR_HX4700_CODEC_PDN_N		109+#define GPIO110_HX4700_LCD_LVDD_3V3_ON		110+#define GPIO111_HX4700_LCD_AVDD_3V3_ON		111+#define GPIO112_HX4700_LCD_N2V7_7V3_ON		112++#define GPIO_NR_HX4700_CF_RESET			114	/* HaRET: O 0 0 */+#define GPIO_NR_HX4700_USB2_DREQ		115+#define GPIO_NR_HX4700_CPU_HW_RESET_N		116++/*+ * ASIC3 IRQs+ */++/*+ * ASIC3 GPIOs+ */++#define HX4700_ASIC3_GPIO_BASE	128+#define GPIOC_BASE		(HX4700_ASIC3_GPIO_BASE + 32)+#define GPIOD_BASE		(HX4700_ASIC3_GPIO_BASE + 48)++#define GPIOC_LED_RED		(GPIOC_BASE + 0)	/* Output */+#define GPIOC_LED_GREEN		(GPIOC_BASE + 1)	/* Output */+#define GPIOC_LED_BLUE		(GPIOC_BASE + 2)	/* Output */+#define GPIOC_nSD_CS		(GPIOC_BASE + 3)	/* Output */+#define GPIOC_CF_nCD		(GPIOC_BASE + 4)	/* Input */+#define GPIOC_nCIOW		(GPIOC_BASE + 5)	// Output, to CF socket+#define GPIOC_nCIOR		(GPIOC_BASE + 6)	// Output, to CF socket+#define GPIOC_nPCE1		(GPIOC_BASE + 7)	// Input, from CPU+#define GPIOC_nPCE2		(GPIOC_BASE + 8)	// Input, from CPU+#define GPIOC_nPOE		(GPIOC_BASE + 9)	// Input, from CPU+#define GPIOC_CF_nPWE		(GPIOC_BASE + 10)	// Input+#define GPIOC_PSKTSEL		(GPIOC_BASE + 11)	// Input, from CPU+#define GPIOC_nPREG		(GPIOC_BASE + 12)	// Input, from CPU+#define GPIOC_nPWAIT		(GPIOC_BASE + 13)	// Output, to CPU+#define GPIOC_nPIOS16		(GPIOC_BASE + 14)	// Output, to CPU+#define GPIOC_nPIOR		(GPIOC_BASE + 15)	// Input, from CPU++#define GPIOD_CPU_SS_INT	(GPIOD_BASE + 0)	/* Input */+#define GPIOD_nKEY_AP2		(GPIOD_BASE + 1)	/* Input, application button */+#define GPIOD_BLUETOOTH_WAKEUP	(GPIOD_BASE + 2)	/* Input, from Bluetooth module */+#define GPIOD_nKEY_AP4		(GPIOD_BASE + 3)	/* Input, application button */+#define GPIOD_CF_nCD		(GPIOD_BASE + 4)	/* Input, from CF socket */+#define GPIOD_nPIO		(GPIOD_BASE + 5)	/* Input */+#define GPIOD_nKEY_RECORD	(GPIOD_BASE + 6)	/* Input, Record button */+#define GPIOD_nSDIO_DETECT	(GPIOD_BASE + 7)	/* Input, from SD socket */+#define GPIOD_COM_DCD		(GPIOD_BASE + 8)	/* Input */+#define GPIOD_nAC_IN		(GPIOD_BASE + 9)	/* Input, detect AC adapter */+#define GPIOD_nSDIO_IRQ		(GPIOD_BASE + 10)	/* Input, also connected to CPU */+#define GPIOD_nCIOIS16		(GPIOD_BASE + 11)	/* Input, from CF socket */+#define GPIOD_nCWAIT		(GPIOD_BASE + 12)	/* Input, from CF socket */+#define GPIOD_CF_RNB		(GPIOD_BASE + 13)	/* Input */+#define GPIOD_nUSBC_DETECT	(GPIOD_BASE + 14)	/* Input */+#define GPIOD_ASIC3_nPIOW	(GPIOD_BASE + 15)	/* Input, from CPU */++/*+ * EGPIOs+ */++#define HX4700_EGPIO_BASE	192++#define EGPIO0_VCC_3V3_EN		(HX4700_EGPIO_BASE + 0)	/* WLAN support chip power */+#define EGPIO1_WL_VREG_EN		(HX4700_EGPIO_BASE + 1)	/* WLAN Power */+#define EGPIO2_VCC_2V1_WL_EN		(HX4700_EGPIO_BASE + 2)	/* unused */+#define EGPIO3_SS_PWR_ON		(HX4700_EGPIO_BASE + 3)	/* smart slot power on */+#define EGPIO4_CF_3V3_ON		(HX4700_EGPIO_BASE + 4)	/* CF 3.3V enable */+#define EGPIO5_BT_3V3_ON		(HX4700_EGPIO_BASE + 5)	/* Bluetooth 3.3V enable */+#define EGPIO6_WL1V8_EN			(HX4700_EGPIO_BASE + 6)	/* WLAN 1.8V enable */+#define EGPIO7_VCC_3V3_WL_EN		(HX4700_EGPIO_BASE + 7)	/* WLAN 3.3V enable */+#define EGPIO8_USB_3V3_ON		(HX4700_EGPIO_BASE + 8)	/* unused */++#endif /* _HX4700_H_ */-- 1.5.5.3