rendered paste bodyFrom 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