]> git.karo-electronics.de Git - linux-beck.git/commitdiff
Merge tag 'omap-board-for-v3.5' of git://git.kernel.org/pub/scm/linux/kernel/git...
authorOlof Johansson <olof@lixom.net>
Fri, 11 May 2012 06:38:20 +0000 (23:38 -0700)
committerOlof Johansson <olof@lixom.net>
Fri, 11 May 2012 06:38:32 +0000 (23:38 -0700)
Board specific changes for omap.

Note that these are based on omap-pm-regulator-for-v3.5 as
both branches are adding twl regulators.

By Paul Gortmaker (8) and others
via Linus Torvalds (38) and others
* tag 'omap-board-for-v3.5' of git://git.kernel.org/pub/scm/linux/kernel/git/tmlind/linux-omap:
  OMAP: omap4panda: Use common configuration for V1V8, V2V1 supplies
  OMAP: 4430SDP: Use common configuration for V1V8, V2V1 supplies
  OMAP4: twl-common: Add twl6030 V1V8, V2V1 SMPS common configuration
  ARM: OMAP: Mark Beagleboard-xM MMC bus as 4-bit
  Add MSUB support for the LogicPD OMAP3530 DevKits
  ARM: OMAP: rx51: Platform support for lis3lv02d accelerometer
  ARM: OMAP2+: craneboard: register emac device
  ARM: OMAP4: board-omap4panda: Register platform device for HDMI audio codec
  ARM: OMAP4: board-4430sdp: Register platform device for HDMI audio codec
  ARM: OMAP: devices: Register platform devices for HDMI audio
  ARM: OMAP3: igep0020: Add support for Micron NAND Flash storage memory
  ARM: OMAP2+: nand: Make board_onenand_init() visible to board code
  ARM: OMAP3: cm-t35: add support for power off
  ARM: OMAP: WiLink platform data for the PandaBoard
  ARM: OMAP2PLUS: Enable HIGHMEM
  ARM: OMAP: omap2plus_defconfig: Enable ehci-omap and sms95xx support

Signed-off-by: Olof Johansson <olof@lixom.net>
31 files changed:
arch/arm/configs/imx_v4_v5_defconfig
arch/arm/mach-imx/Kconfig
arch/arm/mach-imx/Makefile
arch/arm/mach-imx/eukrea_mbimx51-baseboard.c [deleted file]
arch/arm/mach-imx/eukrea_mbimxsd25-baseboard.c
arch/arm/mach-imx/eukrea_mbimxsd35-baseboard.c
arch/arm/mach-imx/eukrea_mbimxsd51-baseboard.c [moved from arch/arm/mach-imx/eukrea_mbimxsd-baseboard.c with 51% similarity]
arch/arm/mach-imx/mach-cpuimx51.c [deleted file]
arch/arm/mach-imx/mach-cpuimx51sd.c
arch/arm/mach-imx/mach-eukrea_cpuimx25.c
arch/arm/mach-imx/mach-imx27_visstrim_m10.c
arch/arm/mach-imx/mach-mx35_3ds.c
arch/arm/mach-mmp/Kconfig
arch/arm/mach-mmp/aspenite.c
arch/arm/mach-mmp/devices.c
arch/arm/mach-mmp/include/mach/devices.h
arch/arm/mach-mmp/include/mach/pxa168.h
arch/arm/mach-mmp/include/mach/pxa910.h
arch/arm/mach-mmp/include/mach/regs-usb.h [new file with mode: 0644]
arch/arm/mach-mmp/pxa168.c
arch/arm/mach-mmp/pxa910.c
arch/arm/mach-mmp/ttc_dkb.c
arch/arm/mach-pxa/hx4700.c
arch/arm/mach-pxa/include/mach/mioa701.h
arch/arm/mach-pxa/include/mach/pcm990_baseboard.h
arch/arm/mach-pxa/mioa701.c
arch/arm/mach-pxa/pcm990-baseboard.c
drivers/pcmcia/Kconfig
drivers/pcmcia/Makefile
drivers/pcmcia/pxa2xx_hx4700.c [new file with mode: 0644]
include/linux/mfd/asic3.h

index 6b31cb60daabd516579d55f1cb2b5a7198cb3776..09a02963cf58ab9fadbc6fc5d9ecfffdf2ba35c2 100644 (file)
@@ -92,6 +92,7 @@ CONFIG_INPUT_EVDEV=y
 # CONFIG_INPUT_MOUSE is not set
 CONFIG_INPUT_TOUCHSCREEN=y
 CONFIG_TOUCHSCREEN_ADS7846=m
+CONFIG_TOUCHSCREEN_MC13783=m
 # CONFIG_SERIO is not set
 # CONFIG_LEGACY_PTYS is not set
 CONFIG_SERIAL_8250=m
@@ -107,7 +108,8 @@ CONFIG_SPI_SPIDEV=y
 CONFIG_W1=y
 CONFIG_W1_MASTER_MXC=y
 CONFIG_W1_SLAVE_THERM=y
-# CONFIG_HWMON is not set
+CONFIG_HWMON=m
+CONFIG_SENSORS_MC13783_ADC=m
 CONFIG_WATCHDOG=y
 CONFIG_IMX2_WDT=y
 CONFIG_MFD_MC13XXX=y
index 7561eca131b0ba989c42afb1a5ec94fbce98f688..18399d10d1707788f548bad9f9e310f5cb9113d8 100644 (file)
@@ -163,6 +163,7 @@ config MACH_EUKREA_CPUIMX25SD
        select SOC_IMX25
        select IMX_HAVE_PLATFORM_FLEXCAN
        select IMX_HAVE_PLATFORM_FSL_USB2_UDC
+       select IMX_HAVE_PLATFORM_IMX2_WDT
        select IMX_HAVE_PLATFORM_IMXDI_RTC
        select IMX_HAVE_PLATFORM_IMX_FB
        select IMX_HAVE_PLATFORM_IMX_I2C
@@ -181,6 +182,7 @@ config MACH_EUKREA_MBIMXSD25_BASEBOARD
        bool "Eukrea MBIMXSD development board"
        select IMX_HAVE_PLATFORM_GPIO_KEYS
        select IMX_HAVE_PLATFORM_IMX_SSI
+       select IMX_HAVE_PLATFORM_SPI_IMX
        select LEDS_GPIO_REGISTER
        help
          This adds board specific devices that can be found on Eukrea's
@@ -606,6 +608,7 @@ config MACH_EUKREA_MBIMXSD35_BASEBOARD
        select IMX_HAVE_PLATFORM_GPIO_KEYS
        select IMX_HAVE_PLATFORM_IMX_SSI
        select IMX_HAVE_PLATFORM_IPU_CORE
+       select IMX_HAVE_PLATFORM_SPI_IMX
        select LEDS_GPIO_REGISTER
        help
          This adds board specific devices that can be found on Eukrea's
@@ -682,42 +685,13 @@ config MACH_MX51_3DS
          Include support for MX51PDK (3DS) platform. This includes specific
          configurations for the board and its peripherals.
 
-config MACH_EUKREA_CPUIMX51
-       bool "Support Eukrea CPUIMX51 module"
-       select SOC_IMX51
-       select IMX_HAVE_PLATFORM_FSL_USB2_UDC
-       select IMX_HAVE_PLATFORM_IMX_I2C
-       select IMX_HAVE_PLATFORM_IMX_UART
-       select IMX_HAVE_PLATFORM_MXC_EHCI
-       select IMX_HAVE_PLATFORM_MXC_NAND
-       select IMX_HAVE_PLATFORM_SPI_IMX
-       help
-         Include support for Eukrea CPUIMX51 platform. This includes
-         specific configurations for the module and its peripherals.
-
-choice
-       prompt "Baseboard"
-       depends on MACH_EUKREA_CPUIMX51
-       default MACH_EUKREA_MBIMX51_BASEBOARD
-
-config MACH_EUKREA_MBIMX51_BASEBOARD
-       prompt "Eukrea MBIMX51 development board"
-       bool
-       select IMX_HAVE_PLATFORM_IMX_KEYPAD
-       select IMX_HAVE_PLATFORM_SDHCI_ESDHC_IMX
-       select LEDS_GPIO_REGISTER
-       help
-         This adds board specific devices that can be found on Eukrea's
-         MBIMX51 evaluation board.
-
-endchoice
-
 config MACH_EUKREA_CPUIMX51SD
        bool "Support Eukrea CPUIMX51SD module"
        select SOC_IMX51
        select IMX_HAVE_PLATFORM_FSL_USB2_UDC
        select IMX_HAVE_PLATFORM_IMX_I2C
        select IMX_HAVE_PLATFORM_IMX_UART
+       select IMX_HAVE_PLATFORM_IMX2_WDT
        select IMX_HAVE_PLATFORM_MXC_EHCI
        select IMX_HAVE_PLATFORM_MXC_NAND
        select IMX_HAVE_PLATFORM_SPI_IMX
@@ -733,6 +707,7 @@ choice
 config MACH_EUKREA_MBIMXSD51_BASEBOARD
        prompt "Eukrea MBIMXSD development board"
        bool
+       select IMX_HAVE_PLATFORM_IMX_SSI
        select IMX_HAVE_PLATFORM_SDHCI_ESDHC_IMX
        select LEDS_GPIO_REGISTER
        help
index ab939c5046c37080692a37592944ccfa7a2c4100..4937c070a57e4cd2e0871449f2391d882d4bb5bd 100644 (file)
@@ -83,10 +83,8 @@ obj-$(CONFIG_MACH_MX53_EVK) += mach-mx53_evk.o
 obj-$(CONFIG_MACH_MX53_SMD) += mach-mx53_smd.o
 obj-$(CONFIG_MACH_MX53_LOCO) += mach-mx53_loco.o
 obj-$(CONFIG_MACH_MX53_ARD) += mach-mx53_ard.o
-obj-$(CONFIG_MACH_EUKREA_CPUIMX51) += mach-cpuimx51.o
-obj-$(CONFIG_MACH_EUKREA_MBIMX51_BASEBOARD) += eukrea_mbimx51-baseboard.o
 obj-$(CONFIG_MACH_EUKREA_CPUIMX51SD) += mach-cpuimx51sd.o
-obj-$(CONFIG_MACH_EUKREA_MBIMXSD51_BASEBOARD) += eukrea_mbimxsd-baseboard.o
+obj-$(CONFIG_MACH_EUKREA_MBIMXSD51_BASEBOARD) += eukrea_mbimxsd51-baseboard.o
 obj-$(CONFIG_MX51_EFIKA_COMMON) += mx51_efika.o
 obj-$(CONFIG_MACH_MX51_EFIKAMX) += mach-mx51_efikamx.o
 obj-$(CONFIG_MACH_MX51_EFIKASB) += mach-mx51_efikasb.o
diff --git a/arch/arm/mach-imx/eukrea_mbimx51-baseboard.c b/arch/arm/mach-imx/eukrea_mbimx51-baseboard.c
deleted file mode 100644 (file)
index a6a3ab8..0000000
+++ /dev/null
@@ -1,206 +0,0 @@
-/*
- *
- * Copyright (C) 2010 Eric BĂ©nard <eric@eukrea.com>
- *
- * The code contained herein is licensed under the GNU General Public
- * License. You may obtain a copy of the GNU General Public License
- * Version 2 or later at the following locations:
- *
- * http://www.opensource.org/licenses/gpl-license.html
- * http://www.gnu.org/copyleft/gpl.html
- */
-
-#include <linux/init.h>
-#include <linux/platform_device.h>
-#include <linux/serial_8250.h>
-#include <linux/i2c.h>
-#include <linux/gpio.h>
-#include <linux/io.h>
-#include <linux/interrupt.h>
-#include <linux/irq.h>
-#include <linux/i2c/tsc2007.h>
-#include <linux/leds.h>
-
-#include <mach/common.h>
-#include <mach/hardware.h>
-#include <mach/iomux-mx51.h>
-
-#include <asm/mach/arch.h>
-
-#include "devices-imx51.h"
-
-#define MBIMX51_TSC2007_GPIO   IMX_GPIO_NR(3, 30)
-#define MBIMX51_LED0           IMX_GPIO_NR(3, 5)
-#define MBIMX51_LED1           IMX_GPIO_NR(3, 6)
-#define MBIMX51_LED2           IMX_GPIO_NR(3, 7)
-#define MBIMX51_LED3           IMX_GPIO_NR(3, 8)
-
-static const struct gpio_led mbimx51_leds[] __initconst = {
-       {
-               .name                   = "led0",
-               .default_trigger        = "heartbeat",
-               .active_low             = 1,
-               .gpio                   = MBIMX51_LED0,
-       },
-       {
-               .name                   = "led1",
-               .default_trigger        = "nand-disk",
-               .active_low             = 1,
-               .gpio                   = MBIMX51_LED1,
-       },
-       {
-               .name                   = "led2",
-               .default_trigger        = "mmc0",
-               .active_low             = 1,
-               .gpio                   = MBIMX51_LED2,
-       },
-       {
-               .name                   = "led3",
-               .default_trigger        = "default-on",
-               .active_low             = 1,
-               .gpio                   = MBIMX51_LED3,
-       },
-};
-
-static const struct gpio_led_platform_data mbimx51_leds_info __initconst = {
-       .leds           = mbimx51_leds,
-       .num_leds       = ARRAY_SIZE(mbimx51_leds),
-};
-
-static iomux_v3_cfg_t mbimx51_pads[] = {
-       /* UART2 */
-       MX51_PAD_UART2_RXD__UART2_RXD,
-       MX51_PAD_UART2_TXD__UART2_TXD,
-
-       /* UART3 */
-       MX51_PAD_UART3_RXD__UART3_RXD,
-       MX51_PAD_UART3_TXD__UART3_TXD,
-       MX51_PAD_KEY_COL4__UART3_RTS,
-       MX51_PAD_KEY_COL5__UART3_CTS,
-
-       /* TSC2007 IRQ */
-       MX51_PAD_NANDF_D10__GPIO3_30,
-
-       /* LEDS */
-       MX51_PAD_DISPB2_SER_DIN__GPIO3_5,
-       MX51_PAD_DISPB2_SER_DIO__GPIO3_6,
-       MX51_PAD_DISPB2_SER_CLK__GPIO3_7,
-       MX51_PAD_DISPB2_SER_RS__GPIO3_8,
-
-       /* KPP */
-       MX51_PAD_KEY_ROW0__KEY_ROW0,
-       MX51_PAD_KEY_ROW1__KEY_ROW1,
-       MX51_PAD_KEY_ROW2__KEY_ROW2,
-       MX51_PAD_KEY_ROW3__KEY_ROW3,
-       MX51_PAD_KEY_COL0__KEY_COL0,
-       MX51_PAD_KEY_COL1__KEY_COL1,
-       MX51_PAD_KEY_COL2__KEY_COL2,
-       MX51_PAD_KEY_COL3__KEY_COL3,
-
-       /* SD 1 */
-       MX51_PAD_SD1_CMD__SD1_CMD,
-       MX51_PAD_SD1_CLK__SD1_CLK,
-       MX51_PAD_SD1_DATA0__SD1_DATA0,
-       MX51_PAD_SD1_DATA1__SD1_DATA1,
-       MX51_PAD_SD1_DATA2__SD1_DATA2,
-       MX51_PAD_SD1_DATA3__SD1_DATA3,
-
-       /* SD 2 */
-       MX51_PAD_SD2_CMD__SD2_CMD,
-       MX51_PAD_SD2_CLK__SD2_CLK,
-       MX51_PAD_SD2_DATA0__SD2_DATA0,
-       MX51_PAD_SD2_DATA1__SD2_DATA1,
-       MX51_PAD_SD2_DATA2__SD2_DATA2,
-       MX51_PAD_SD2_DATA3__SD2_DATA3,
-};
-
-static const struct imxuart_platform_data uart_pdata __initconst = {
-       .flags = IMXUART_HAVE_RTSCTS,
-};
-
-static int mbimx51_keymap[] = {
-       KEY(0, 0, KEY_1),
-       KEY(0, 1, KEY_2),
-       KEY(0, 2, KEY_3),
-       KEY(0, 3, KEY_UP),
-
-       KEY(1, 0, KEY_4),
-       KEY(1, 1, KEY_5),
-       KEY(1, 2, KEY_6),
-       KEY(1, 3, KEY_LEFT),
-
-       KEY(2, 0, KEY_7),
-       KEY(2, 1, KEY_8),
-       KEY(2, 2, KEY_9),
-       KEY(2, 3, KEY_RIGHT),
-
-       KEY(3, 0, KEY_0),
-       KEY(3, 1, KEY_DOWN),
-       KEY(3, 2, KEY_ESC),
-       KEY(3, 3, KEY_ENTER),
-};
-
-static const struct matrix_keymap_data mbimx51_map_data __initconst = {
-       .keymap         = mbimx51_keymap,
-       .keymap_size    = ARRAY_SIZE(mbimx51_keymap),
-};
-
-static int tsc2007_get_pendown_state(void)
-{
-       return !gpio_get_value(MBIMX51_TSC2007_GPIO);
-}
-
-struct tsc2007_platform_data tsc2007_data = {
-       .model = 2007,
-       .x_plate_ohms = 180,
-       .get_pendown_state = tsc2007_get_pendown_state,
-};
-
-static struct i2c_board_info mbimx51_i2c_devices[] = {
-       {
-               I2C_BOARD_INFO("tsc2007", 0x49),
-               .irq  = IMX_GPIO_TO_IRQ(MBIMX51_TSC2007_GPIO),
-               .platform_data = &tsc2007_data,
-       }, {
-               I2C_BOARD_INFO("tlv320aic23", 0x1a),
-       },
-};
-
-/*
- * baseboard initialization.
- */
-void __init eukrea_mbimx51_baseboard_init(void)
-{
-       mxc_iomux_v3_setup_multiple_pads(mbimx51_pads,
-                                       ARRAY_SIZE(mbimx51_pads));
-
-       imx51_add_imx_uart(1, NULL);
-       imx51_add_imx_uart(2, &uart_pdata);
-
-       gpio_request(MBIMX51_LED0, "LED0");
-       gpio_direction_output(MBIMX51_LED0, 1);
-       gpio_free(MBIMX51_LED0);
-       gpio_request(MBIMX51_LED1, "LED1");
-       gpio_direction_output(MBIMX51_LED1, 1);
-       gpio_free(MBIMX51_LED1);
-       gpio_request(MBIMX51_LED2, "LED2");
-       gpio_direction_output(MBIMX51_LED2, 1);
-       gpio_free(MBIMX51_LED2);
-       gpio_request(MBIMX51_LED3, "LED3");
-       gpio_direction_output(MBIMX51_LED3, 1);
-       gpio_free(MBIMX51_LED3);
-
-       gpio_led_register_device(-1, &mbimx51_leds_info);
-
-       imx51_add_imx_keypad(&mbimx51_map_data);
-
-       gpio_request(MBIMX51_TSC2007_GPIO, "tsc2007_irq");
-       gpio_direction_input(MBIMX51_TSC2007_GPIO);
-       irq_set_irq_type(gpio_to_irq(MBIMX51_TSC2007_GPIO),
-                                       IRQF_TRIGGER_FALLING);
-       i2c_register_board_info(1, mbimx51_i2c_devices,
-                               ARRAY_SIZE(mbimx51_i2c_devices));
-
-       imx51_add_sdhci_esdhc_imx(0, NULL);
-       imx51_add_sdhci_esdhc_imx(1, NULL);
-}
index 2cf603e11c4f36786f06299b00cc8ffd9e7f4125..dfd2da87c2df1e3214a6fac5bfca0ec18dee3193 100644 (file)
@@ -23,6 +23,7 @@
 #include <linux/leds.h>
 #include <linux/platform_device.h>
 #include <linux/input.h>
+#include <linux/spi/spi.h>
 #include <video/platform_lcd.h>
 
 #include <mach/hardware.h>
@@ -87,12 +88,22 @@ static iomux_v3_cfg_t eukrea_mbimxsd_pads[] = {
        /* CAN */
        MX25_PAD_GPIO_D__CAN2_RX,
        MX25_PAD_GPIO_C__CAN2_TX,
+       /* SPI1 */
+       MX25_PAD_CSPI1_MOSI__CSPI1_MOSI,
+       MX25_PAD_CSPI1_MISO__CSPI1_MISO,
+       MX25_PAD_CSPI1_SS0__GPIO_1_16,
+       MX25_PAD_CSPI1_SS1__GPIO_1_17,
+       MX25_PAD_CSPI1_SCLK__CSPI1_SCLK,
+       MX25_PAD_CSPI1_RDY__GPIO_2_22,
 };
 
-#define GPIO_LED1      83
-#define GPIO_SWITCH1   82
-#define GPIO_SD1CD     52
-#define GPIO_LCDPWR    26
+#define GPIO_LED1              IMX_GPIO_NR(3, 19)
+#define GPIO_SWITCH1   IMX_GPIO_NR(3, 18)
+#define GPIO_SD1CD             IMX_GPIO_NR(2, 20)
+#define GPIO_LCDPWR            IMX_GPIO_NR(1, 26)
+#define        GPIO_SPI1_SS0   IMX_GPIO_NR(1, 16)
+#define        GPIO_SPI1_SS1   IMX_GPIO_NR(1, 17)
+#define        GPIO_SPI1_IRQ   IMX_GPIO_NR(2, 22)
 
 static struct imx_fb_videomode eukrea_mximxsd_modes[] = {
        {
@@ -228,6 +239,30 @@ static struct esdhc_platform_data sd1_pdata = {
        .wp_type = ESDHC_WP_NONE,
 };
 
+static struct spi_board_info eukrea_mbimxsd25_spi_board_info[] __initdata = {
+       {
+               .modalias = "spidev",
+               .max_speed_hz = 20000000,
+               .bus_num = 0,
+               .chip_select = 0,
+               .mode = SPI_MODE_0,
+       },
+       {
+               .modalias = "spidev",
+               .max_speed_hz = 20000000,
+               .bus_num = 0,
+               .chip_select = 1,
+               .mode = SPI_MODE_0,
+       },
+};
+
+static int eukrea_mbimxsd25_spi_cs[] = {GPIO_SPI1_SS0, GPIO_SPI1_SS1};
+
+static const struct spi_imx_master eukrea_mbimxsd25_spi0_data __initconst = {
+       .chipselect     = eukrea_mbimxsd25_spi_cs,
+       .num_chipselect = ARRAY_SIZE(eukrea_mbimxsd25_spi_cs),
+};
+
 /*
  * system init for baseboard usage. Will be called by cpuimx25 init.
  *
@@ -257,11 +292,17 @@ void __init eukrea_mbimxsd25_baseboard_init(void)
 
        gpio_request(GPIO_LCDPWR, "LCDPWR");
        gpio_direction_output(GPIO_LCDPWR, 1);
-       gpio_free(GPIO_SWITCH1);
 
        i2c_register_board_info(0, eukrea_mbimxsd_i2c_devices,
                                ARRAY_SIZE(eukrea_mbimxsd_i2c_devices));
 
+       gpio_request(GPIO_SPI1_IRQ, "SPI1_IRQ");
+       gpio_direction_input(GPIO_SPI1_IRQ);
+       gpio_free(GPIO_SPI1_IRQ);
+       imx25_add_spi_imx0(&eukrea_mbimxsd25_spi0_data);
+       spi_register_board_info(eukrea_mbimxsd25_spi_board_info,
+               ARRAY_SIZE(eukrea_mbimxsd25_spi_board_info));
+
        platform_add_devices(platform_devices, ARRAY_SIZE(platform_devices));
        gpio_led_register_device(-1, &eukrea_mbimxsd_led_info);
        imx_add_gpio_keys(&eukrea_mbimxsd_button_data);
index fd8bf8a425a7a49c0daa7f90bb185c22f2ba2e7c..557f6c4860535f7bef1d7860acd0f57e54bda7a1 100644 (file)
@@ -27,6 +27,7 @@
 #include <linux/leds.h>
 #include <linux/platform_device.h>
 #include <linux/input.h>
+#include <linux/spi/spi.h>
 #include <video/platform_lcd.h>
 #include <linux/i2c.h>
 
@@ -158,12 +159,22 @@ static iomux_v3_cfg_t eukrea_mbimxsd_pads[] = {
        MX35_PAD_SD1_DATA3__ESDHC1_DAT3,
        /* SD1 CD */
        MX35_PAD_LD18__GPIO3_24,
+       /* SPI */
+       MX35_PAD_CSPI1_MOSI__CSPI1_MOSI,
+       MX35_PAD_CSPI1_MISO__CSPI1_MISO,
+       MX35_PAD_CSPI1_SS0__GPIO1_18,
+       MX35_PAD_CSPI1_SS1__GPIO1_19,
+       MX35_PAD_CSPI1_SCLK__CSPI1_SCLK,
+       MX35_PAD_CSPI1_SPI_RDY__GPIO3_5,
 };
 
 #define GPIO_LED1      IMX_GPIO_NR(3, 29)
 #define GPIO_SWITCH1   IMX_GPIO_NR(3, 25)
 #define GPIO_LCDPWR    IMX_GPIO_NR(1, 4)
 #define GPIO_SD1CD     IMX_GPIO_NR(3, 24)
+#define        GPIO_SPI1_SS0   IMX_GPIO_NR(1, 18)
+#define        GPIO_SPI1_SS1   IMX_GPIO_NR(1, 19)
+#define        GPIO_SPI1_IRQ   IMX_GPIO_NR(3, 5)
 
 static void eukrea_mbimxsd_lcd_power_set(struct plat_lcd_data *pd,
                                   unsigned int power)
@@ -239,6 +250,30 @@ static struct esdhc_platform_data sd1_pdata = {
        .wp_type = ESDHC_WP_NONE,
 };
 
+static struct spi_board_info eukrea_mbimxsd35_spi_board_info[] __initdata = {
+       {
+               .modalias = "spidev",
+               .max_speed_hz = 20000000,
+               .bus_num = 0,
+               .chip_select = 0,
+               .mode = SPI_MODE_0,
+       },
+       {
+               .modalias = "spidev",
+               .max_speed_hz = 20000000,
+               .bus_num = 0,
+               .chip_select = 1,
+               .mode = SPI_MODE_0,
+       },
+};
+
+static int eukrea_mbimxsd35_spi_cs[] = {GPIO_SPI1_SS0, GPIO_SPI1_SS1};
+
+static const struct spi_imx_master eukrea_mbimxsd35_spi0_data __initconst = {
+       .chipselect     = eukrea_mbimxsd35_spi_cs,
+       .num_chipselect = ARRAY_SIZE(eukrea_mbimxsd35_spi_cs),
+};
+
 /*
  * system init for baseboard usage. Will be called by cpuimx35 init.
  *
@@ -274,6 +309,13 @@ void __init eukrea_mbimxsd35_baseboard_init(void)
        i2c_register_board_info(0, eukrea_mbimxsd_i2c_devices,
                                ARRAY_SIZE(eukrea_mbimxsd_i2c_devices));
 
+       gpio_request(GPIO_SPI1_IRQ, "SPI1_IRQ");
+       gpio_direction_input(GPIO_SPI1_IRQ);
+       gpio_free(GPIO_SPI1_IRQ);
+       imx35_add_spi_imx0(&eukrea_mbimxsd35_spi0_data);
+       spi_register_board_info(eukrea_mbimxsd35_spi_board_info,
+               ARRAY_SIZE(eukrea_mbimxsd35_spi_board_info));
+
        platform_add_devices(platform_devices, ARRAY_SIZE(platform_devices));
        gpio_led_register_device(-1, &eukrea_mbimxsd_led_info);
        imx_add_gpio_keys(&eukrea_mbimxsd_button_data);
similarity index 51%
rename from arch/arm/mach-imx/eukrea_mbimxsd-baseboard.c
rename to arch/arm/mach-imx/eukrea_mbimxsd51-baseboard.c
index aaa592fdb9ce38b84e70985a9e1496cae0c9496b..96a24b73dc2309fc109c346524d22e39b84e3b67 100644 (file)
@@ -28,6 +28,8 @@
 #include <linux/platform_device.h>
 #include <linux/input.h>
 #include <linux/i2c.h>
+#include <video/platform_lcd.h>
+#include <linux/backlight.h>
 
 #include <asm/mach-types.h>
 #include <asm/mach/arch.h>
@@ -40,7 +42,7 @@
 
 #include "devices-imx51.h"
 
-static iomux_v3_cfg_t eukrea_mbimxsd_pads[] = {
+static iomux_v3_cfg_t eukrea_mbimxsd51_pads[] = {
        /* LED */
        MX51_PAD_NANDF_D10__GPIO3_30,
        /* SWITCH */
@@ -66,12 +68,64 @@ static iomux_v3_cfg_t eukrea_mbimxsd_pads[] = {
        NEW_PAD_CTRL(MX51_PAD_GPIO1_0__SD1_CD, PAD_CTL_PUS_22K_UP |
                        PAD_CTL_PKE | PAD_CTL_SRE_FAST |
                        PAD_CTL_DSE_HIGH | PAD_CTL_PUE | PAD_CTL_HYS),
+       /* SSI */
+       MX51_PAD_AUD3_BB_TXD__AUD3_TXD,
+       MX51_PAD_AUD3_BB_RXD__AUD3_RXD,
+       MX51_PAD_AUD3_BB_CK__AUD3_TXC,
+       MX51_PAD_AUD3_BB_FS__AUD3_TXFS,
+       /* LCD Backlight */
+       MX51_PAD_DI1_D1_CS__GPIO3_4,
+       /* LCD RST */
+       MX51_PAD_CSI1_D9__GPIO3_13,
 };
 
 #define GPIO_LED1      IMX_GPIO_NR(3, 30)
 #define GPIO_SWITCH1   IMX_GPIO_NR(3, 31)
+#define GPIO_LCDRST    IMX_GPIO_NR(3, 13)
+#define GPIO_LCDBL     IMX_GPIO_NR(3, 4)
 
-static const struct gpio_led eukrea_mbimxsd_leds[] __initconst = {
+static void eukrea_mbimxsd51_lcd_power_set(struct plat_lcd_data *pd,
+                                  unsigned int power)
+{
+       if (power)
+               gpio_direction_output(GPIO_LCDRST, 1);
+       else
+               gpio_direction_output(GPIO_LCDRST, 0);
+}
+
+static struct plat_lcd_data eukrea_mbimxsd51_lcd_power_data = {
+       .set_power              = eukrea_mbimxsd51_lcd_power_set,
+};
+
+static struct platform_device eukrea_mbimxsd51_lcd_powerdev = {
+       .name                   = "platform-lcd",
+       .dev.platform_data      = &eukrea_mbimxsd51_lcd_power_data,
+};
+
+static void eukrea_mbimxsd51_bl_set_intensity(int intensity)
+{
+       if (intensity)
+               gpio_direction_output(GPIO_LCDBL, 1);
+       else
+               gpio_direction_output(GPIO_LCDBL, 0);
+}
+
+static struct generic_bl_info eukrea_mbimxsd51_bl_info = {
+       .name                   = "eukrea_mbimxsd51-bl",
+       .max_intensity          = 0xff,
+       .default_intensity      = 0xff,
+       .set_bl_intensity       = eukrea_mbimxsd51_bl_set_intensity,
+};
+
+static struct platform_device eukrea_mbimxsd51_bl_dev = {
+       .name                   = "generic-bl",
+       .id                     = 1,
+       .dev = {
+               .platform_data  = &eukrea_mbimxsd51_bl_info,
+       },
+};
+
+static const struct gpio_led eukrea_mbimxsd51_leds[] __initconst = {
        {
                .name                   = "led1",
                .default_trigger        = "heartbeat",
@@ -81,12 +135,12 @@ static const struct gpio_led eukrea_mbimxsd_leds[] __initconst = {
 };
 
 static const struct gpio_led_platform_data
-               eukrea_mbimxsd_led_info __initconst = {
-       .leds           = eukrea_mbimxsd_leds,
-       .num_leds       = ARRAY_SIZE(eukrea_mbimxsd_leds),
+               eukrea_mbimxsd51_led_info __initconst = {
+       .leds           = eukrea_mbimxsd51_leds,
+       .num_leds       = ARRAY_SIZE(eukrea_mbimxsd51_leds),
 };
 
-static struct gpio_keys_button eukrea_mbimxsd_gpio_buttons[] = {
+static struct gpio_keys_button eukrea_mbimxsd51_gpio_buttons[] = {
        {
                .gpio           = GPIO_SWITCH1,
                .code           = BTN_0,
@@ -97,21 +151,39 @@ static struct gpio_keys_button eukrea_mbimxsd_gpio_buttons[] = {
 };
 
 static const struct gpio_keys_platform_data
-               eukrea_mbimxsd_button_data __initconst = {
-       .buttons        = eukrea_mbimxsd_gpio_buttons,
-       .nbuttons       = ARRAY_SIZE(eukrea_mbimxsd_gpio_buttons),
+               eukrea_mbimxsd51_button_data __initconst = {
+       .buttons        = eukrea_mbimxsd51_gpio_buttons,
+       .nbuttons       = ARRAY_SIZE(eukrea_mbimxsd51_gpio_buttons),
 };
 
 static const struct imxuart_platform_data uart_pdata __initconst = {
        .flags = IMXUART_HAVE_RTSCTS,
 };
 
-static struct i2c_board_info eukrea_mbimxsd_i2c_devices[] = {
+static struct i2c_board_info eukrea_mbimxsd51_i2c_devices[] = {
        {
                I2C_BOARD_INFO("tlv320aic23", 0x1a),
        },
 };
 
+static const
+struct imx_ssi_platform_data eukrea_mbimxsd51_ssi_pdata __initconst = {
+       .flags = IMX_SSI_SYN | IMX_SSI_NET | IMX_SSI_USE_I2S_SLAVE,
+};
+
+static int screen_type;
+
+static int __init eukrea_mbimxsd51_screen_type(char *options)
+{
+       if (!strcmp(options, "dvi"))
+               screen_type = 1;
+       else if (!strcmp(options, "tft"))
+               screen_type = 0;
+
+       return 0;
+}
+__setup("screen_type=", eukrea_mbimxsd51_screen_type);
+
 /*
  * system init for baseboard usage. Will be called by cpuimx51sd init.
  *
@@ -120,8 +192,8 @@ static struct i2c_board_info eukrea_mbimxsd_i2c_devices[] = {
  */
 void __init eukrea_mbimxsd51_baseboard_init(void)
 {
-       if (mxc_iomux_v3_setup_multiple_pads(eukrea_mbimxsd_pads,
-                       ARRAY_SIZE(eukrea_mbimxsd_pads)))
+       if (mxc_iomux_v3_setup_multiple_pads(eukrea_mbimxsd51_pads,
+                       ARRAY_SIZE(eukrea_mbimxsd51_pads)))
                printk(KERN_ERR "error setting mbimxsd pads !\n");
 
        imx51_add_imx_uart(1, NULL);
@@ -129,6 +201,8 @@ void __init eukrea_mbimxsd51_baseboard_init(void)
 
        imx51_add_sdhci_esdhc_imx(0, NULL);
 
+       imx51_add_imx_ssi(0, &eukrea_mbimxsd51_ssi_pdata);
+
        gpio_request(GPIO_LED1, "LED1");
        gpio_direction_output(GPIO_LED1, 1);
        gpio_free(GPIO_LED1);
@@ -137,9 +211,21 @@ void __init eukrea_mbimxsd51_baseboard_init(void)
        gpio_direction_input(GPIO_SWITCH1);
        gpio_free(GPIO_SWITCH1);
 
-       i2c_register_board_info(0, eukrea_mbimxsd_i2c_devices,
-                               ARRAY_SIZE(eukrea_mbimxsd_i2c_devices));
-
-       gpio_led_register_device(-1, &eukrea_mbimxsd_led_info);
-       imx_add_gpio_keys(&eukrea_mbimxsd_button_data);
+       gpio_request(GPIO_LCDRST, "LCDRST");
+       gpio_direction_output(GPIO_LCDRST, 0);
+       gpio_request(GPIO_LCDBL, "LCDBL");
+       gpio_direction_output(GPIO_LCDBL, 0);
+       if (!screen_type) {
+               platform_device_register(&eukrea_mbimxsd51_bl_dev);
+               platform_device_register(&eukrea_mbimxsd51_lcd_powerdev);
+       } else {
+               gpio_free(GPIO_LCDRST);
+               gpio_free(GPIO_LCDBL);
+       }
+
+       i2c_register_board_info(0, eukrea_mbimxsd51_i2c_devices,
+                               ARRAY_SIZE(eukrea_mbimxsd51_i2c_devices));
+
+       gpio_led_register_device(-1, &eukrea_mbimxsd51_led_info);
+       imx_add_gpio_keys(&eukrea_mbimxsd51_button_data);
 }
diff --git a/arch/arm/mach-imx/mach-cpuimx51.c b/arch/arm/mach-imx/mach-cpuimx51.c
deleted file mode 100644 (file)
index 944025d..0000000
+++ /dev/null
@@ -1,301 +0,0 @@
-/*
- *
- * Copyright (C) 2010 Eric BĂ©nard <eric@eukrea.com>
- *
- * based on board-mx51_babbage.c which is
- * Copyright 2009 Freescale Semiconductor, Inc. All Rights Reserved.
- * Copyright (C) 2009-2010 Amit Kucheria <amit.kucheria@canonical.com>
- *
- * The code contained herein is licensed under the GNU General Public
- * License. You may obtain a copy of the GNU General Public License
- * Version 2 or later at the following locations:
- *
- * http://www.opensource.org/licenses/gpl-license.html
- * http://www.gnu.org/copyleft/gpl.html
- */
-
-#include <linux/init.h>
-#include <linux/platform_device.h>
-#include <linux/serial_8250.h>
-#include <linux/i2c.h>
-#include <linux/gpio.h>
-#include <linux/delay.h>
-#include <linux/io.h>
-#include <linux/interrupt.h>
-
-#include <mach/eukrea-baseboards.h>
-#include <mach/common.h>
-#include <mach/hardware.h>
-#include <mach/iomux-mx51.h>
-
-#include <asm/setup.h>
-#include <asm/mach-types.h>
-#include <asm/mach/arch.h>
-#include <asm/mach/time.h>
-
-#include "devices-imx51.h"
-
-#define CPUIMX51_USBH1_STP     IMX_GPIO_NR(1, 27)
-#define CPUIMX51_QUARTA_GPIO   IMX_GPIO_NR(3, 28)
-#define CPUIMX51_QUARTB_GPIO   IMX_GPIO_NR(3, 25)
-#define CPUIMX51_QUARTC_GPIO   IMX_GPIO_NR(3, 26)
-#define CPUIMX51_QUARTD_GPIO   IMX_GPIO_NR(3, 27)
-#define CPUIMX51_QUART_XTAL    14745600
-#define CPUIMX51_QUART_REGSHIFT        17
-
-/* USB_CTRL_1 */
-#define MX51_USB_CTRL_1_OFFSET         0x10
-#define MX51_USB_CTRL_UH1_EXT_CLK_EN   (1 << 25)
-
-#define        MX51_USB_PLLDIV_12_MHZ          0x00
-#define        MX51_USB_PLL_DIV_19_2_MHZ       0x01
-#define        MX51_USB_PLL_DIV_24_MHZ         0x02
-
-static struct plat_serial8250_port serial_platform_data[] = {
-       {
-               .mapbase = (unsigned long)(MX51_CS1_BASE_ADDR + 0x400000),
-               .irq = IMX_GPIO_TO_IRQ(CPUIMX51_QUARTA_GPIO),
-               .irqflags = IRQF_TRIGGER_HIGH,
-               .uartclk = CPUIMX51_QUART_XTAL,
-               .regshift = CPUIMX51_QUART_REGSHIFT,
-               .iotype = UPIO_MEM,
-               .flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST | UPF_IOREMAP,
-       }, {
-               .mapbase = (unsigned long)(MX51_CS1_BASE_ADDR + 0x800000),
-               .irq = IMX_GPIO_TO_IRQ(CPUIMX51_QUARTB_GPIO),
-               .irqflags = IRQF_TRIGGER_HIGH,
-               .uartclk = CPUIMX51_QUART_XTAL,
-               .regshift = CPUIMX51_QUART_REGSHIFT,
-               .iotype = UPIO_MEM,
-               .flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST | UPF_IOREMAP,
-       }, {
-               .mapbase = (unsigned long)(MX51_CS1_BASE_ADDR + 0x1000000),
-               .irq = IMX_GPIO_TO_IRQ(CPUIMX51_QUARTC_GPIO),
-               .irqflags = IRQF_TRIGGER_HIGH,
-               .uartclk = CPUIMX51_QUART_XTAL,
-               .regshift = CPUIMX51_QUART_REGSHIFT,
-               .iotype = UPIO_MEM,
-               .flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST | UPF_IOREMAP,
-       }, {
-               .mapbase = (unsigned long)(MX51_CS1_BASE_ADDR + 0x2000000),
-               .irq = IMX_GPIO_TO_IRQ(CPUIMX51_QUARTD_GPIO),
-               .irqflags = IRQF_TRIGGER_HIGH,
-               .uartclk = CPUIMX51_QUART_XTAL,
-               .regshift = CPUIMX51_QUART_REGSHIFT,
-               .iotype = UPIO_MEM,
-               .flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST | UPF_IOREMAP,
-       }, {
-       }
-};
-
-static struct platform_device serial_device = {
-       .name = "serial8250",
-       .id = 0,
-       .dev = {
-               .platform_data = serial_platform_data,
-       },
-};
-
-static struct platform_device *devices[] __initdata = {
-       &serial_device,
-};
-
-static iomux_v3_cfg_t eukrea_cpuimx51_pads[] = {
-       /* UART1 */
-       MX51_PAD_UART1_RXD__UART1_RXD,
-       MX51_PAD_UART1_TXD__UART1_TXD,
-       MX51_PAD_UART1_RTS__UART1_RTS,
-       MX51_PAD_UART1_CTS__UART1_CTS,
-
-       /* I2C2 */
-       MX51_PAD_GPIO1_2__I2C2_SCL,
-       MX51_PAD_GPIO1_3__I2C2_SDA,
-       MX51_PAD_NANDF_D10__GPIO3_30,
-
-       /* QUART IRQ */
-       MX51_PAD_NANDF_D15__GPIO3_25,
-       MX51_PAD_NANDF_D14__GPIO3_26,
-       MX51_PAD_NANDF_D13__GPIO3_27,
-       MX51_PAD_NANDF_D12__GPIO3_28,
-
-       /* USB HOST1 */
-       MX51_PAD_USBH1_CLK__USBH1_CLK,
-       MX51_PAD_USBH1_DIR__USBH1_DIR,
-       MX51_PAD_USBH1_NXT__USBH1_NXT,
-       MX51_PAD_USBH1_DATA0__USBH1_DATA0,
-       MX51_PAD_USBH1_DATA1__USBH1_DATA1,
-       MX51_PAD_USBH1_DATA2__USBH1_DATA2,
-       MX51_PAD_USBH1_DATA3__USBH1_DATA3,
-       MX51_PAD_USBH1_DATA4__USBH1_DATA4,
-       MX51_PAD_USBH1_DATA5__USBH1_DATA5,
-       MX51_PAD_USBH1_DATA6__USBH1_DATA6,
-       MX51_PAD_USBH1_DATA7__USBH1_DATA7,
-       MX51_PAD_USBH1_STP__USBH1_STP,
-};
-
-static const struct mxc_nand_platform_data
-               eukrea_cpuimx51_nand_board_info __initconst = {
-       .width          = 1,
-       .hw_ecc         = 1,
-       .flash_bbt      = 1,
-};
-
-static const struct imxuart_platform_data uart_pdata __initconst = {
-       .flags = IMXUART_HAVE_RTSCTS,
-};
-
-static const
-struct imxi2c_platform_data eukrea_cpuimx51_i2c_data __initconst = {
-       .bitrate = 100000,
-};
-
-static struct i2c_board_info eukrea_cpuimx51_i2c_devices[] = {
-       {
-               I2C_BOARD_INFO("pcf8563", 0x51),
-       },
-};
-
-/* This function is board specific as the bit mask for the plldiv will also
-be different for other Freescale SoCs, thus a common bitmask is not
-possible and cannot get place in /plat-mxc/ehci.c.*/
-static int initialize_otg_port(struct platform_device *pdev)
-{
-       u32 v;
-       void __iomem *usb_base;
-       void __iomem *usbother_base;
-
-       usb_base = ioremap(MX51_USB_OTG_BASE_ADDR, SZ_4K);
-       if (!usb_base)
-               return -ENOMEM;
-       usbother_base = usb_base + MX5_USBOTHER_REGS_OFFSET;
-
-       /* Set the PHY clock to 19.2MHz */
-       v = __raw_readl(usbother_base + MXC_USB_PHY_CTR_FUNC2_OFFSET);
-       v &= ~MX5_USB_UTMI_PHYCTRL1_PLLDIV_MASK;
-       v |= MX51_USB_PLL_DIV_19_2_MHZ;
-       __raw_writel(v, usbother_base + MXC_USB_PHY_CTR_FUNC2_OFFSET);
-       iounmap(usb_base);
-
-       mdelay(10);
-
-       return mx51_initialize_usb_hw(0, MXC_EHCI_INTERNAL_PHY);
-}
-
-static int initialize_usbh1_port(struct platform_device *pdev)
-{
-       u32 v;
-       void __iomem *usb_base;
-       void __iomem *usbother_base;
-
-       usb_base = ioremap(MX51_USB_OTG_BASE_ADDR, SZ_4K);
-       if (!usb_base)
-               return -ENOMEM;
-       usbother_base = usb_base + MX5_USBOTHER_REGS_OFFSET;
-
-       /* The clock for the USBH1 ULPI port will come externally from the PHY. */
-       v = __raw_readl(usbother_base + MX51_USB_CTRL_1_OFFSET);
-       __raw_writel(v | MX51_USB_CTRL_UH1_EXT_CLK_EN, usbother_base + MX51_USB_CTRL_1_OFFSET);
-       iounmap(usb_base);
-
-       mdelay(10);
-
-       return mx51_initialize_usb_hw(1, MXC_EHCI_POWER_PINS_ENABLED |
-                       MXC_EHCI_ITC_NO_THRESHOLD);
-}
-
-static const struct mxc_usbh_platform_data dr_utmi_config __initconst = {
-       .init           = initialize_otg_port,
-       .portsc = MXC_EHCI_UTMI_16BIT,
-};
-
-static const struct fsl_usb2_platform_data usb_pdata __initconst = {
-       .operating_mode = FSL_USB2_DR_DEVICE,
-       .phy_mode       = FSL_USB2_PHY_UTMI_WIDE,
-};
-
-static const struct mxc_usbh_platform_data usbh1_config __initconst = {
-       .init           = initialize_usbh1_port,
-       .portsc = MXC_EHCI_MODE_ULPI,
-};
-
-static int otg_mode_host;
-
-static int __init eukrea_cpuimx51_otg_mode(char *options)
-{
-       if (!strcmp(options, "host"))
-               otg_mode_host = 1;
-       else if (!strcmp(options, "device"))
-               otg_mode_host = 0;
-       else
-               pr_info("otg_mode neither \"host\" nor \"device\". "
-                       "Defaulting to device\n");
-       return 0;
-}
-__setup("otg_mode=", eukrea_cpuimx51_otg_mode);
-
-/*
- * Board specific initialization.
- */
-static void __init eukrea_cpuimx51_init(void)
-{
-       imx51_soc_init();
-
-       mxc_iomux_v3_setup_multiple_pads(eukrea_cpuimx51_pads,
-                                       ARRAY_SIZE(eukrea_cpuimx51_pads));
-
-       imx51_add_imx_uart(0, &uart_pdata);
-       imx51_add_mxc_nand(&eukrea_cpuimx51_nand_board_info);
-
-       gpio_request(CPUIMX51_QUARTA_GPIO, "quarta_irq");
-       gpio_direction_input(CPUIMX51_QUARTA_GPIO);
-       gpio_free(CPUIMX51_QUARTA_GPIO);
-       gpio_request(CPUIMX51_QUARTB_GPIO, "quartb_irq");
-       gpio_direction_input(CPUIMX51_QUARTB_GPIO);
-       gpio_free(CPUIMX51_QUARTB_GPIO);
-       gpio_request(CPUIMX51_QUARTC_GPIO, "quartc_irq");
-       gpio_direction_input(CPUIMX51_QUARTC_GPIO);
-       gpio_free(CPUIMX51_QUARTC_GPIO);
-       gpio_request(CPUIMX51_QUARTD_GPIO, "quartd_irq");
-       gpio_direction_input(CPUIMX51_QUARTD_GPIO);
-       gpio_free(CPUIMX51_QUARTD_GPIO);
-
-       imx51_add_fec(NULL);
-       platform_add_devices(devices, ARRAY_SIZE(devices));
-
-       imx51_add_imx_i2c(1, &eukrea_cpuimx51_i2c_data);
-       i2c_register_board_info(1, eukrea_cpuimx51_i2c_devices,
-                               ARRAY_SIZE(eukrea_cpuimx51_i2c_devices));
-
-       if (otg_mode_host)
-               imx51_add_mxc_ehci_otg(&dr_utmi_config);
-       else {
-               initialize_otg_port(NULL);
-               imx51_add_fsl_usb2_udc(&usb_pdata);
-       }
-       imx51_add_mxc_ehci_hs(1, &usbh1_config);
-
-#ifdef CONFIG_MACH_EUKREA_MBIMX51_BASEBOARD
-       eukrea_mbimx51_baseboard_init();
-#endif
-}
-
-static void __init eukrea_cpuimx51_timer_init(void)
-{
-       mx51_clocks_init(32768, 24000000, 22579200, 0);
-}
-
-static struct sys_timer mxc_timer = {
-       .init   = eukrea_cpuimx51_timer_init,
-};
-
-MACHINE_START(EUKREA_CPUIMX51, "Eukrea CPUIMX51 Module")
-       /* Maintainer: Eric BĂ©nard <eric@eukrea.com> */
-       .atag_offset = 0x100,
-       .map_io = mx51_map_io,
-       .init_early = imx51_init_early,
-       .init_irq = mx51_init_irq,
-       .handle_irq = imx51_handle_irq,
-       .timer = &mxc_timer,
-       .init_machine = eukrea_cpuimx51_init,
-       .restart        = mxc_restart,
-MACHINE_END
index 9fbe923c8b087ab68d5e48a58570397824651d28..ce341a6874fc892e867319f43c16aa19f558c9d0 100644 (file)
 
 #define USBH1_RST              IMX_GPIO_NR(2, 28)
 #define ETH_RST                        IMX_GPIO_NR(2, 31)
-#define TSC2007_IRQGPIO                IMX_GPIO_NR(3, 12)
+#define TSC2007_IRQGPIO_REV2   IMX_GPIO_NR(3, 12)
+#define TSC2007_IRQGPIO_REV3   IMX_GPIO_NR(4, 0)
 #define CAN_IRQGPIO            IMX_GPIO_NR(1, 1)
 #define CAN_RST                        IMX_GPIO_NR(4, 15)
 #define CAN_NCS                        IMX_GPIO_NR(4, 24)
-#define CAN_RXOBF              IMX_GPIO_NR(1, 4)
+#define CAN_RXOBF_REV2         IMX_GPIO_NR(1, 4)
+#define CAN_RXOBF_REV3         IMX_GPIO_NR(3, 12)
 #define CAN_RX1BF              IMX_GPIO_NR(1, 6)
 #define CAN_TXORTS             IMX_GPIO_NR(1, 7)
 #define CAN_TX1RTS             IMX_GPIO_NR(1, 8)
@@ -90,6 +92,10 @@ static iomux_v3_cfg_t eukrea_cpuimx51sd_pads[] = {
        MX51_PAD_I2C1_CLK__GPIO4_16,
        MX51_PAD_I2C1_DAT__GPIO4_17,
 
+       /* I2C1 */
+       MX51_PAD_SD2_CMD__I2C1_SCL,
+       MX51_PAD_SD2_CLK__I2C1_SDA,
+
        /* CAN */
        MX51_PAD_CSPI1_MOSI__ECSPI1_MOSI,
        MX51_PAD_CSPI1_MISO__ECSPI1_MISO,
@@ -108,15 +114,27 @@ static iomux_v3_cfg_t eukrea_cpuimx51sd_pads[] = {
        NEW_PAD_CTRL(MX51_PAD_GPIO_NAND__GPIO_NAND, PAD_CTL_PUS_22K_UP |
                        PAD_CTL_PKE | PAD_CTL_SRE_FAST |
                        PAD_CTL_DSE_HIGH | PAD_CTL_PUE | PAD_CTL_HYS),
+       NEW_PAD_CTRL(MX51_PAD_NANDF_D8__GPIO4_0, PAD_CTL_PUS_22K_UP |
+                       PAD_CTL_PKE | PAD_CTL_SRE_FAST |
+                       PAD_CTL_DSE_HIGH | PAD_CTL_PUE | PAD_CTL_HYS),
 };
 
 static const struct imxuart_platform_data uart_pdata __initconst = {
        .flags = IMXUART_HAVE_RTSCTS,
 };
 
+static int tsc2007_get_pendown_state(void)
+{
+       if (mx51_revision() < IMX_CHIP_REVISION_3_0)
+               return !gpio_get_value(TSC2007_IRQGPIO_REV2);
+       else
+               return !gpio_get_value(TSC2007_IRQGPIO_REV3);
+}
+
 static struct tsc2007_platform_data tsc2007_info = {
        .model                  = 2007,
        .x_plate_ohms           = 180,
+       .get_pendown_state      = tsc2007_get_pendown_state,
 };
 
 static struct i2c_board_info eukrea_cpuimx51sd_i2c_devices[] = {
@@ -126,7 +144,6 @@ static struct i2c_board_info eukrea_cpuimx51sd_i2c_devices[] = {
                I2C_BOARD_INFO("tsc2007", 0x49),
                .type           = "tsc2007",
                .platform_data  = &tsc2007_info,
-               .irq            = IMX_GPIO_TO_IRQ(TSC2007_IRQGPIO),
        },
 };
 
@@ -255,10 +272,14 @@ static const struct spi_imx_master cpuimx51sd_ecspi1_pdata __initconst = {
        .num_chipselect = ARRAY_SIZE(cpuimx51sd_spi1_cs),
 };
 
-static struct platform_device *platform_devices[] __initdata = {
+static struct platform_device *rev2_platform_devices[] __initdata = {
        &hsi2c_gpio_device,
 };
 
+static const struct imxi2c_platform_data cpuimx51sd_i2c_data __initconst = {
+       .bitrate = 100000,
+};
+
 static void __init eukrea_cpuimx51sd_init(void)
 {
        imx51_soc_init();
@@ -272,6 +293,7 @@ static void __init eukrea_cpuimx51sd_init(void)
 
        imx51_add_imx_uart(0, &uart_pdata);
        imx51_add_mxc_nand(&eukrea_cpuimx51sd_nand_board_info);
+       imx51_add_imx2_wdt(0, NULL);
 
        gpio_request(ETH_RST, "eth_rst");
        gpio_set_value(ETH_RST, 1);
@@ -291,13 +313,25 @@ static void __init eukrea_cpuimx51sd_init(void)
        spi_register_board_info(cpuimx51sd_spi_device,
                                ARRAY_SIZE(cpuimx51sd_spi_device));
 
-       gpio_request(TSC2007_IRQGPIO, "tsc2007_irq");
-       gpio_direction_input(TSC2007_IRQGPIO);
-       gpio_free(TSC2007_IRQGPIO);
+       if (mx51_revision() < IMX_CHIP_REVISION_3_0) {
+               eukrea_cpuimx51sd_i2c_devices[1].irq =
+                       gpio_to_irq(TSC2007_IRQGPIO_REV2),
+               platform_add_devices(rev2_platform_devices,
+                       ARRAY_SIZE(rev2_platform_devices));
+               gpio_request(TSC2007_IRQGPIO_REV2, "tsc2007_irq");
+               gpio_direction_input(TSC2007_IRQGPIO_REV2);
+               gpio_free(TSC2007_IRQGPIO_REV2);
+       } else {
+               eukrea_cpuimx51sd_i2c_devices[1].irq =
+                       gpio_to_irq(TSC2007_IRQGPIO_REV3),
+               imx51_add_imx_i2c(0, &cpuimx51sd_i2c_data);
+               gpio_request(TSC2007_IRQGPIO_REV3, "tsc2007_irq");
+               gpio_direction_input(TSC2007_IRQGPIO_REV3);
+               gpio_free(TSC2007_IRQGPIO_REV3);
+       }
 
        i2c_register_board_info(0, eukrea_cpuimx51sd_i2c_devices,
                        ARRAY_SIZE(eukrea_cpuimx51sd_i2c_devices));
-       platform_add_devices(platform_devices, ARRAY_SIZE(platform_devices));
 
        if (otg_mode_host)
                imx51_add_mxc_ehci_otg(&dr_utmi_config);
index 76a97a598b9e9b69f29c69d2d2cebfe27be970bf..d1e04e676e33b0cb4c516560d72c61030c64a5bd 100644 (file)
@@ -106,6 +106,7 @@ static const struct mxc_usbh_platform_data usbh2_pdata __initconst = {
 static const struct fsl_usb2_platform_data otg_device_pdata __initconst = {
        .operating_mode = FSL_USB2_DR_DEVICE,
        .phy_mode       = FSL_USB2_PHY_UTMI,
+       .workaround     = FLS_USB2_WORKAROUND_ENGCM09152,
 };
 
 static int otg_mode_host;
@@ -135,6 +136,7 @@ static void __init eukrea_cpuimx25_init(void)
        imx25_add_mxc_nand(&eukrea_cpuimx25_nand_board_info);
        imx25_add_imxdi_rtc(NULL);
        imx25_add_fec(&mx25_fec_pdata);
+       imx25_add_imx2_wdt(NULL);
 
        i2c_register_board_info(0, eukrea_cpuimx25_i2c_devices,
                                ARRAY_SIZE(eukrea_cpuimx25_i2c_devices));
index f7b074f496f070b5654a6ab99407f4281dfe04d7..748ba2e311b56710ed195e27b3e5b3d26684364d 100644 (file)
@@ -38,6 +38,7 @@
 #include <asm/mach-types.h>
 #include <asm/mach/arch.h>
 #include <asm/mach/time.h>
+#include <asm/system.h>
 #include <mach/common.h>
 #include <mach/iomux-mx27.h>
 
 #define OTG_PHY_CS_GPIO (GPIO_PORTF + 17)
 #define SDHC1_IRQ IRQ_GPIOB(25)
 
+#define MOTHERBOARD_BIT2       (GPIO_PORTD + 31)
+#define MOTHERBOARD_BIT1       (GPIO_PORTD + 30)
+#define MOTHERBOARD_BIT0       (GPIO_PORTD + 29)
+
+#define EXPBOARD_BIT2          (GPIO_PORTD + 25)
+#define EXPBOARD_BIT1          (GPIO_PORTD + 27)
+#define EXPBOARD_BIT0          (GPIO_PORTD + 28)
+
 static const int visstrim_m10_pins[] __initconst = {
        /* UART1 (console) */
        PE12_PF_UART1_TXD,
@@ -119,6 +128,23 @@ static const int visstrim_m10_pins[] __initconst = {
        PB19_PF_CSI_D7,
        PB20_PF_CSI_VSYNC,
        PB21_PF_CSI_HSYNC,
+       /* mother board version */
+       MOTHERBOARD_BIT2 | GPIO_GPIO | GPIO_IN | GPIO_PUEN,
+       MOTHERBOARD_BIT1 | GPIO_GPIO | GPIO_IN | GPIO_PUEN,
+       MOTHERBOARD_BIT0 | GPIO_GPIO | GPIO_IN | GPIO_PUEN,
+       /* expansion board version */
+       EXPBOARD_BIT2 | GPIO_GPIO | GPIO_IN | GPIO_PUEN,
+       EXPBOARD_BIT1 | GPIO_GPIO | GPIO_IN | GPIO_PUEN,
+       EXPBOARD_BIT0 | GPIO_GPIO | GPIO_IN | GPIO_PUEN,
+};
+
+static struct gpio visstrim_m10_version_gpios[] = {
+       { EXPBOARD_BIT0, GPIOF_IN, "exp-version-0" },
+       { EXPBOARD_BIT1, GPIOF_IN, "exp-version-1" },
+       { EXPBOARD_BIT2, GPIOF_IN, "exp-version-2" },
+       { MOTHERBOARD_BIT0, GPIOF_IN, "mother-version-0" },
+       { MOTHERBOARD_BIT1, GPIOF_IN, "mother-version-1" },
+       { MOTHERBOARD_BIT2, GPIOF_IN, "mother-version-2" },
 };
 
 /* Camera */
@@ -369,11 +395,40 @@ static const struct imx_ssi_platform_data visstrim_m10_ssi_pdata __initconst = {
        .flags                  = IMX_SSI_DMA | IMX_SSI_SYN,
 };
 
+static void __init visstrim_m10_revision(void)
+{
+       int exp_version = 0;
+       int mo_version = 0;
+       int ret;
+
+       ret = gpio_request_array(visstrim_m10_version_gpios,
+                                ARRAY_SIZE(visstrim_m10_version_gpios));
+       if (ret) {
+               pr_err("Failed to request version gpios");
+               return;
+       }
+
+       /* Get expansion board version (negative logic) */
+       exp_version |= !gpio_get_value(EXPBOARD_BIT2) << 2;
+       exp_version |= !gpio_get_value(EXPBOARD_BIT1) << 1;
+       exp_version |= !gpio_get_value(EXPBOARD_BIT0);
+
+       /* Get mother board version (negative logic) */
+       mo_version |= !gpio_get_value(MOTHERBOARD_BIT2) << 2;
+       mo_version |= !gpio_get_value(MOTHERBOARD_BIT1) << 1;
+       mo_version |= !gpio_get_value(MOTHERBOARD_BIT0);
+
+       system_rev = 0x27000;
+       system_rev |= (mo_version << 4);
+       system_rev |= exp_version;
+}
+
 static void __init visstrim_m10_board_init(void)
 {
        int ret;
 
        imx27_soc_init();
+       visstrim_m10_revision();
 
        ret = mxc_gpio_setup_multiple_pins(visstrim_m10_pins,
                        ARRAY_SIZE(visstrim_m10_pins), "VISSTRIM_M10");
index 6ae51c6b95b7c02992d27d6f053b9fb289a92b36..e99b016bbbb6724197a0831927fbe85e24a6f8a9 100644 (file)
@@ -34,6 +34,8 @@
 #include <linux/usb/otg.h>
 
 #include <linux/mtd/physmap.h>
+#include <linux/mfd/mc13892.h>
+#include <linux/regulator/machine.h>
 
 #include <asm/mach-types.h>
 #include <asm/mach/arch.h>
@@ -253,6 +255,8 @@ static iomux_v3_cfg_t mx35pdk_pads[] = {
        MX35_PAD_CSI_MCLK__IPU_CSI_MCLK,
        MX35_PAD_CSI_PIXCLK__IPU_CSI_PIXCLK,
        MX35_PAD_CSI_VSYNC__IPU_CSI_VSYNC,
+       /*PMIC IRQ*/
+       MX35_PAD_GPIO2_0__GPIO2_0,
 };
 
 /*
@@ -317,6 +321,193 @@ static struct platform_device mx35_3ds_ov2640 = {
        },
 };
 
+static struct regulator_consumer_supply sw1_consumers[] = {
+       {
+               .supply = "cpu_vcc",
+       }
+};
+
+static struct regulator_consumer_supply vcam_consumers[] = {
+       /* sgtl5000 */
+       REGULATOR_SUPPLY("VDDA", "0-000a"),
+};
+
+static struct regulator_consumer_supply vaudio_consumers[] = {
+       REGULATOR_SUPPLY("cmos_vio", "soc-camera-pdrv.0"),
+};
+
+static struct regulator_init_data sw1_init = {
+       .constraints = {
+               .name = "SW1",
+               .min_uV = 600000,
+               .max_uV = 1375000,
+               .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE,
+               .valid_modes_mask = 0,
+               .always_on = 1,
+               .boot_on = 1,
+       },
+       .num_consumer_supplies = ARRAY_SIZE(sw1_consumers),
+       .consumer_supplies = sw1_consumers,
+};
+
+static struct regulator_init_data sw2_init = {
+       .constraints = {
+               .name = "SW2",
+               .always_on = 1,
+               .boot_on = 1,
+       }
+};
+
+static struct regulator_init_data sw3_init = {
+       .constraints = {
+               .name = "SW3",
+               .always_on = 1,
+               .boot_on = 1,
+       }
+};
+
+static struct regulator_init_data sw4_init = {
+       .constraints = {
+               .name = "SW4",
+               .always_on = 1,
+               .boot_on = 1,
+       }
+};
+
+static struct regulator_init_data viohi_init = {
+       .constraints = {
+               .name = "VIOHI",
+               .boot_on = 1,
+       }
+};
+
+static struct regulator_init_data vusb_init = {
+       .constraints = {
+               .name = "VUSB",
+               .boot_on = 1,
+       }
+};
+
+static struct regulator_init_data vdig_init = {
+       .constraints = {
+               .name = "VDIG",
+               .boot_on = 1,
+       }
+};
+
+static struct regulator_init_data vpll_init = {
+       .constraints = {
+               .name = "VPLL",
+               .boot_on = 1,
+       }
+};
+
+static struct regulator_init_data vusb2_init = {
+       .constraints = {
+               .name = "VUSB2",
+               .boot_on = 1,
+       }
+};
+
+static struct regulator_init_data vvideo_init = {
+       .constraints = {
+               .name = "VVIDEO",
+               .boot_on = 1
+       }
+};
+
+static struct regulator_init_data vaudio_init = {
+       .constraints = {
+               .name = "VAUDIO",
+               .min_uV = 2300000,
+               .max_uV = 3000000,
+               .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE,
+               .boot_on = 1
+       },
+       .num_consumer_supplies = ARRAY_SIZE(vaudio_consumers),
+       .consumer_supplies = vaudio_consumers,
+};
+
+static struct regulator_init_data vcam_init = {
+       .constraints = {
+               .name = "VCAM",
+               .min_uV = 2500000,
+               .max_uV = 3000000,
+               .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE |
+                                       REGULATOR_CHANGE_MODE,
+               .valid_modes_mask = REGULATOR_MODE_FAST | REGULATOR_MODE_NORMAL,
+               .boot_on = 1
+       },
+       .num_consumer_supplies = ARRAY_SIZE(vcam_consumers),
+       .consumer_supplies = vcam_consumers,
+};
+
+static struct regulator_init_data vgen1_init = {
+       .constraints = {
+               .name = "VGEN1",
+       }
+};
+
+static struct regulator_init_data vgen2_init = {
+       .constraints = {
+               .name = "VGEN2",
+               .boot_on = 1,
+       }
+};
+
+static struct regulator_init_data vgen3_init = {
+       .constraints = {
+               .name = "VGEN3",
+       }
+};
+
+static struct mc13xxx_regulator_init_data mx35_3ds_regulators[] = {
+       { .id = MC13892_SW1, .init_data = &sw1_init },
+       { .id = MC13892_SW2, .init_data = &sw2_init },
+       { .id = MC13892_SW3, .init_data = &sw3_init },
+       { .id = MC13892_SW4, .init_data = &sw4_init },
+       { .id = MC13892_VIOHI, .init_data = &viohi_init },
+       { .id = MC13892_VPLL, .init_data = &vpll_init },
+       { .id = MC13892_VDIG, .init_data = &vdig_init },
+       { .id = MC13892_VUSB2, .init_data = &vusb2_init },
+       { .id = MC13892_VVIDEO, .init_data = &vvideo_init },
+       { .id = MC13892_VAUDIO, .init_data = &vaudio_init },
+       { .id = MC13892_VCAM, .init_data = &vcam_init },
+       { .id = MC13892_VGEN1, .init_data = &vgen1_init },
+       { .id = MC13892_VGEN2, .init_data = &vgen2_init },
+       { .id = MC13892_VGEN3, .init_data = &vgen3_init },
+       { .id = MC13892_VUSB, .init_data = &vusb_init },
+};
+
+static struct mc13xxx_platform_data mx35_3ds_mc13892_data = {
+       .flags = MC13XXX_USE_RTC | MC13XXX_USE_TOUCHSCREEN,
+       .regulators = {
+               .num_regulators = ARRAY_SIZE(mx35_3ds_regulators),
+               .regulators = mx35_3ds_regulators,
+       },
+};
+
+#define GPIO_PMIC_INT IMX_GPIO_NR(2, 0)
+
+static struct i2c_board_info mx35_3ds_i2c_mc13892 = {
+
+       I2C_BOARD_INFO("mc13892", 0x08),
+       .platform_data = &mx35_3ds_mc13892_data,
+       .irq = IMX_GPIO_TO_IRQ(GPIO_PMIC_INT),
+};
+
+static void __init imx35_3ds_init_mc13892(void)
+{
+       int ret = gpio_request_one(GPIO_PMIC_INT, GPIOF_DIR_IN, "pmic irq");
+
+       if (ret) {
+               pr_err("failed to get pmic irq: %d\n", ret);
+               return;
+       }
+
+       i2c_register_board_info(0, &mx35_3ds_i2c_mc13892, 1);
+}
+
 static int mx35_3ds_otg_init(struct platform_device *pdev)
 {
        return mx35_initialize_usb_hw(pdev->id, MXC_EHCI_INTERNAL_PHY);
@@ -412,6 +603,8 @@ static void __init mx35_3ds_init(void)
        imx35_fb_pdev = imx35_add_mx3_sdc_fb(&mx3fb_pdata);
        mx35_3ds_lcd.dev.parent = &imx35_fb_pdev->dev;
        platform_device_register(&mx35_3ds_lcd);
+
+       imx35_3ds_init_mc13892();
 }
 
 static void __init mx35pdk_timer_init(void)
index 5a90b9a3ab6efa753ef830171f8f5b6f97df9b5d..fa03974fd8385a7c02f3e41412b6619ed15cd577 100644 (file)
@@ -113,4 +113,11 @@ config CPU_MMP2
        select CPU_PJ4
        help
          Select code specific to MMP2. MMP2 is ARMv7 compatible.
+
+config USB_EHCI_MV_U2O
+        bool "EHCI support for PXA USB OTG controller"
+       depends on USB_EHCI_MV
+       help
+         Enables support for OTG controller which can be switched to host mode.
+
 endif
index bf5d8e195c3efb03849660ffac3d923897e88b33..223090b1444d099e01f6c5d96799d06a6b589e35 100644 (file)
@@ -17,6 +17,7 @@
 #include <linux/mtd/partitions.h>
 #include <linux/mtd/nand.h>
 #include <linux/interrupt.h>
+#include <linux/platform_data/mv_usb.h>
 
 #include <asm/mach-types.h>
 #include <asm/mach/arch.h>
@@ -221,6 +222,21 @@ static struct pxa27x_keypad_platform_data aspenite_keypad_info __initdata = {
        .debounce_interval      = 30,
 };
 
+#if defined(CONFIG_USB_EHCI_MV)
+static char *pxa168_sph_clock_name[] = {
+       [0] = "PXA168-USBCLK",
+};
+
+static struct mv_usb_platform_data pxa168_sph_pdata = {
+       .clknum         = 1,
+       .clkname        = pxa168_sph_clock_name,
+       .mode           = MV_USB_MODE_HOST,
+       .phy_init       = pxa_usb_phy_init,
+       .phy_deinit     = pxa_usb_phy_deinit,
+       .set_vbus       = NULL,
+};
+#endif
+
 static void __init common_init(void)
 {
        mfp_config(ARRAY_AND_SIZE(common_pin_config));
@@ -236,6 +252,10 @@ static void __init common_init(void)
 
        /* off-chip devices */
        platform_device_register(&smc91x_device);
+
+#if defined(CONFIG_USB_EHCI_MV)
+       pxa168_add_usb_host(&pxa168_sph_pdata);
+#endif
 }
 
 MACHINE_START(ASPENITE, "PXA168-based Aspenite Development Platform")
index 191d9dea87316f173777737b54ccdbbc2e10fe90..dd2d8b103cc8e4416f3e6575524898548d104d4b 100644 (file)
@@ -9,9 +9,13 @@
 #include <linux/init.h>
 #include <linux/platform_device.h>
 #include <linux/dma-mapping.h>
+#include <linux/delay.h>
 
 #include <asm/irq.h>
+#include <mach/irqs.h>
 #include <mach/devices.h>
+#include <mach/cputype.h>
+#include <mach/regs-usb.h>
 
 int __init pxa_register_device(struct pxa_device_desc *desc,
                                void *data, size_t size)
@@ -67,3 +71,281 @@ int __init pxa_register_device(struct pxa_device_desc *desc,
 
        return platform_device_add(pdev);
 }
+
+#if defined(CONFIG_USB) || defined(CONFIG_USB_GADGET)
+
+/*****************************************************************************
+ * The registers read/write routines
+ *****************************************************************************/
+
+static unsigned int u2o_get(void __iomem *base, unsigned int offset)
+{
+       return readl_relaxed(base + offset);
+}
+
+static void u2o_set(void __iomem *base, unsigned int offset,
+               unsigned int value)
+{
+       u32 reg;
+
+       reg = readl_relaxed(base + offset);
+       reg |= value;
+       writel_relaxed(reg, base + offset);
+       readl_relaxed(base + offset);
+}
+
+static void u2o_clear(void __iomem *base, unsigned int offset,
+               unsigned int value)
+{
+       u32 reg;
+
+       reg = readl_relaxed(base + offset);
+       reg &= ~value;
+       writel_relaxed(reg, base + offset);
+       readl_relaxed(base + offset);
+}
+
+static void u2o_write(void __iomem *base, unsigned int offset,
+               unsigned int value)
+{
+       writel_relaxed(value, base + offset);
+       readl_relaxed(base + offset);
+}
+
+#if defined(CONFIG_USB_MV_UDC) || defined(CONFIG_USB_EHCI_MV)
+
+#if defined(CONFIG_CPU_PXA910) || defined(CONFIG_CPU_PXA168)
+
+static DEFINE_MUTEX(phy_lock);
+static int phy_init_cnt;
+
+static int usb_phy_init_internal(void __iomem *base)
+{
+       int loops;
+
+       pr_info("Init usb phy!!!\n");
+
+       /* Initialize the USB PHY power */
+       if (cpu_is_pxa910()) {
+               u2o_set(base, UTMI_CTRL, (1<<UTMI_CTRL_INPKT_DELAY_SOF_SHIFT)
+                       | (1<<UTMI_CTRL_PU_REF_SHIFT));
+       }
+
+       u2o_set(base, UTMI_CTRL, 1<<UTMI_CTRL_PLL_PWR_UP_SHIFT);
+       u2o_set(base, UTMI_CTRL, 1<<UTMI_CTRL_PWR_UP_SHIFT);
+
+       /* UTMI_PLL settings */
+       u2o_clear(base, UTMI_PLL, UTMI_PLL_PLLVDD18_MASK
+               | UTMI_PLL_PLLVDD12_MASK | UTMI_PLL_PLLCALI12_MASK
+               | UTMI_PLL_FBDIV_MASK | UTMI_PLL_REFDIV_MASK
+               | UTMI_PLL_ICP_MASK | UTMI_PLL_KVCO_MASK);
+
+       u2o_set(base, UTMI_PLL, 0xee<<UTMI_PLL_FBDIV_SHIFT
+               | 0xb<<UTMI_PLL_REFDIV_SHIFT | 3<<UTMI_PLL_PLLVDD18_SHIFT
+               | 3<<UTMI_PLL_PLLVDD12_SHIFT | 3<<UTMI_PLL_PLLCALI12_SHIFT
+               | 1<<UTMI_PLL_ICP_SHIFT | 3<<UTMI_PLL_KVCO_SHIFT);
+
+       /* UTMI_TX */
+       u2o_clear(base, UTMI_TX, UTMI_TX_REG_EXT_FS_RCAL_EN_MASK
+               | UTMI_TX_TXVDD12_MASK | UTMI_TX_CK60_PHSEL_MASK
+               | UTMI_TX_IMPCAL_VTH_MASK | UTMI_TX_REG_EXT_FS_RCAL_MASK
+               | UTMI_TX_AMP_MASK);
+       u2o_set(base, UTMI_TX, 3<<UTMI_TX_TXVDD12_SHIFT
+               | 4<<UTMI_TX_CK60_PHSEL_SHIFT | 4<<UTMI_TX_IMPCAL_VTH_SHIFT
+               | 8<<UTMI_TX_REG_EXT_FS_RCAL_SHIFT | 3<<UTMI_TX_AMP_SHIFT);
+
+       /* UTMI_RX */
+       u2o_clear(base, UTMI_RX, UTMI_RX_SQ_THRESH_MASK
+               | UTMI_REG_SQ_LENGTH_MASK);
+       u2o_set(base, UTMI_RX, 7<<UTMI_RX_SQ_THRESH_SHIFT
+               | 2<<UTMI_REG_SQ_LENGTH_SHIFT);
+
+       /* UTMI_IVREF */
+       if (cpu_is_pxa168())
+               /* fixing Microsoft Altair board interface with NEC hub issue -
+                * Set UTMI_IVREF from 0x4a3 to 0x4bf */
+               u2o_write(base, UTMI_IVREF, 0x4bf);
+
+       /* toggle VCOCAL_START bit of UTMI_PLL */
+       udelay(200);
+       u2o_set(base, UTMI_PLL, VCOCAL_START);
+       udelay(40);
+       u2o_clear(base, UTMI_PLL, VCOCAL_START);
+
+       /* toggle REG_RCAL_START bit of UTMI_TX */
+       udelay(400);
+       u2o_set(base, UTMI_TX, REG_RCAL_START);
+       udelay(40);
+       u2o_clear(base, UTMI_TX, REG_RCAL_START);
+       udelay(400);
+
+       /* Make sure PHY PLL is ready */
+       loops = 0;
+       while ((u2o_get(base, UTMI_PLL) & PLL_READY) == 0) {
+               mdelay(1);
+               loops++;
+               if (loops > 100) {
+                       printk(KERN_WARNING "calibrate timeout, UTMI_PLL %x\n",
+                               u2o_get(base, UTMI_PLL));
+                       break;
+               }
+       }
+
+       if (cpu_is_pxa168()) {
+               u2o_set(base, UTMI_RESERVE, 1 << 5);
+               /* Turn on UTMI PHY OTG extension */
+               u2o_write(base, UTMI_OTG_ADDON, 1);
+       }
+
+       return 0;
+}
+
+static int usb_phy_deinit_internal(void __iomem *base)
+{
+       pr_info("Deinit usb phy!!!\n");
+
+       if (cpu_is_pxa168())
+               u2o_clear(base, UTMI_OTG_ADDON, UTMI_OTG_ADDON_OTG_ON);
+
+       u2o_clear(base, UTMI_CTRL, UTMI_CTRL_RXBUF_PDWN);
+       u2o_clear(base, UTMI_CTRL, UTMI_CTRL_TXBUF_PDWN);
+       u2o_clear(base, UTMI_CTRL, UTMI_CTRL_USB_CLK_EN);
+       u2o_clear(base, UTMI_CTRL, 1<<UTMI_CTRL_PWR_UP_SHIFT);
+       u2o_clear(base, UTMI_CTRL, 1<<UTMI_CTRL_PLL_PWR_UP_SHIFT);
+
+       return 0;
+}
+
+int pxa_usb_phy_init(void __iomem *phy_reg)
+{
+       mutex_lock(&phy_lock);
+       if (phy_init_cnt++ == 0)
+               usb_phy_init_internal(phy_reg);
+       mutex_unlock(&phy_lock);
+       return 0;
+}
+
+void pxa_usb_phy_deinit(void __iomem *phy_reg)
+{
+       WARN_ON(phy_init_cnt == 0);
+
+       mutex_lock(&phy_lock);
+       if (--phy_init_cnt == 0)
+               usb_phy_deinit_internal(phy_reg);
+       mutex_unlock(&phy_lock);
+}
+#endif
+#endif
+#endif
+
+#ifdef CONFIG_USB_SUPPORT
+static u64 usb_dma_mask = ~(u32)0;
+
+#ifdef CONFIG_USB_MV_UDC
+struct resource pxa168_u2o_resources[] = {
+       /* regbase */
+       [0] = {
+               .start  = PXA168_U2O_REGBASE + U2x_CAPREGS_OFFSET,
+               .end    = PXA168_U2O_REGBASE + USB_REG_RANGE,
+               .flags  = IORESOURCE_MEM,
+               .name   = "capregs",
+       },
+       /* phybase */
+       [1] = {
+               .start  = PXA168_U2O_PHYBASE,
+               .end    = PXA168_U2O_PHYBASE + USB_PHY_RANGE,
+               .flags  = IORESOURCE_MEM,
+               .name   = "phyregs",
+       },
+       [2] = {
+               .start  = IRQ_PXA168_USB1,
+               .end    = IRQ_PXA168_USB1,
+               .flags  = IORESOURCE_IRQ,
+       },
+};
+
+struct platform_device pxa168_device_u2o = {
+       .name           = "mv-udc",
+       .id             = -1,
+       .resource       = pxa168_u2o_resources,
+       .num_resources  = ARRAY_SIZE(pxa168_u2o_resources),
+       .dev            =  {
+               .dma_mask       = &usb_dma_mask,
+               .coherent_dma_mask = 0xffffffff,
+       }
+};
+#endif /* CONFIG_USB_MV_UDC */
+
+#ifdef CONFIG_USB_EHCI_MV_U2O
+struct resource pxa168_u2oehci_resources[] = {
+       /* regbase */
+       [0] = {
+               .start  = PXA168_U2O_REGBASE + U2x_CAPREGS_OFFSET,
+               .end    = PXA168_U2O_REGBASE + USB_REG_RANGE,
+               .flags  = IORESOURCE_MEM,
+               .name   = "capregs",
+       },
+       /* phybase */
+       [1] = {
+               .start  = PXA168_U2O_PHYBASE,
+               .end    = PXA168_U2O_PHYBASE + USB_PHY_RANGE,
+               .flags  = IORESOURCE_MEM,
+               .name   = "phyregs",
+       },
+       [2] = {
+               .start  = IRQ_PXA168_USB1,
+               .end    = IRQ_PXA168_USB1,
+               .flags  = IORESOURCE_IRQ,
+       },
+};
+
+struct platform_device pxa168_device_u2oehci = {
+       .name           = "pxa-u2oehci",
+       .id             = -1,
+       .dev            = {
+               .dma_mask               = &usb_dma_mask,
+               .coherent_dma_mask      = 0xffffffff,
+       },
+
+       .num_resources  = ARRAY_SIZE(pxa168_u2oehci_resources),
+       .resource       = pxa168_u2oehci_resources,
+};
+#endif
+
+#if defined(CONFIG_USB_MV_OTG)
+struct resource pxa168_u2ootg_resources[] = {
+       /* regbase */
+       [0] = {
+               .start  = PXA168_U2O_REGBASE + U2x_CAPREGS_OFFSET,
+               .end    = PXA168_U2O_REGBASE + USB_REG_RANGE,
+               .flags  = IORESOURCE_MEM,
+               .name   = "capregs",
+       },
+       /* phybase */
+       [1] = {
+               .start  = PXA168_U2O_PHYBASE,
+               .end    = PXA168_U2O_PHYBASE + USB_PHY_RANGE,
+               .flags  = IORESOURCE_MEM,
+               .name   = "phyregs",
+       },
+       [2] = {
+               .start  = IRQ_PXA168_USB1,
+               .end    = IRQ_PXA168_USB1,
+               .flags  = IORESOURCE_IRQ,
+       },
+};
+
+struct platform_device pxa168_device_u2ootg = {
+       .name           = "mv-otg",
+       .id             = -1,
+       .dev  = {
+               .dma_mask          = &usb_dma_mask,
+               .coherent_dma_mask = 0xffffffff,
+       },
+
+       .num_resources  = ARRAY_SIZE(pxa168_u2ootg_resources),
+       .resource      = pxa168_u2ootg_resources,
+};
+#endif /* CONFIG_USB_MV_OTG */
+
+#endif
index d0ec7dae88e4c06f9050f4bf3b2223121109c8c0..21217ef11b64f38639221e2717fbcf20cd63d487 100644 (file)
@@ -50,4 +50,7 @@ struct pxa_device_desc mmp2_device_##_name __initdata = {             \
 }
 
 extern int pxa_register_device(struct pxa_device_desc *, void *, size_t);
+extern int pxa_usb_phy_init(void __iomem *phy_reg);
+extern void pxa_usb_phy_deinit(void __iomem *phy_reg);
+
 #endif /* __MACH_DEVICE_H */
index dc03d580a06d64737dab0962bcab81ffa296eddd..09dcd6e2b6a8431a5f64528631fd0c92a809cdbe 100644 (file)
@@ -16,6 +16,7 @@ extern void pxa168_clear_keypad_wakeup(void);
 #include <plat/pxa27x_keypad.h>
 #include <mach/cputype.h>
 #include <linux/pxa168_eth.h>
+#include <linux/platform_data/mv_usb.h>
 
 extern struct pxa_device_desc pxa168_device_uart1;
 extern struct pxa_device_desc pxa168_device_uart2;
@@ -36,12 +37,9 @@ extern struct pxa_device_desc pxa168_device_fb;
 extern struct pxa_device_desc pxa168_device_keypad;
 extern struct pxa_device_desc pxa168_device_eth;
 
-struct pxa168_usb_pdata {
-       /* If NULL, default phy init routine for PXA168 would be called */
-       int (*phy_init)(void __iomem *usb_phy_reg_base);
-};
 /* pdata can be NULL */
-int __init pxa168_add_usb_host(struct pxa168_usb_pdata *pdata);
+extern int __init pxa168_add_usb_host(struct mv_usb_platform_data *pdata);
+
 
 extern struct platform_device pxa168_device_gpio;
 
index e2e1f1e5e1249f908f7a8b531862d921abb00359..793634c837ef337e2da881c5a4e42db2df98a323 100644 (file)
@@ -20,6 +20,9 @@ extern struct pxa_device_desc pxa910_device_pwm2;
 extern struct pxa_device_desc pxa910_device_pwm3;
 extern struct pxa_device_desc pxa910_device_pwm4;
 extern struct pxa_device_desc pxa910_device_nand;
+extern struct platform_device pxa168_device_u2o;
+extern struct platform_device pxa168_device_u2ootg;
+extern struct platform_device pxa168_device_u2oehci;
 
 extern struct platform_device pxa910_device_gpio;
 extern struct platform_device pxa910_device_rtc;
diff --git a/arch/arm/mach-mmp/include/mach/regs-usb.h b/arch/arm/mach-mmp/include/mach/regs-usb.h
new file mode 100644 (file)
index 0000000..b047bf4
--- /dev/null
@@ -0,0 +1,253 @@
+/*
+ * Copyright (C) 2011 Marvell International Ltd. All rights reserved.
+ *
+ * This program is free software; you can redistribute  it and/or modify it
+ * under  the terms of  the GNU General  Public License as published by the
+ * Free Software Foundation;  either version 2 of the  License, or (at your
+ * option) any later version.
+ */
+
+#ifndef __ASM_ARCH_REGS_USB_H
+#define __ASM_ARCH_REGS_USB_H
+
+#define PXA168_U2O_REGBASE     (0xd4208000)
+#define PXA168_U2O_PHYBASE     (0xd4207000)
+
+#define PXA168_U2H_REGBASE      (0xd4209000)
+#define PXA168_U2H_PHYBASE      (0xd4206000)
+
+#define MMP3_HSIC1_REGBASE     (0xf0001000)
+#define MMP3_HSIC1_PHYBASE     (0xf0001800)
+
+#define MMP3_HSIC2_REGBASE     (0xf0002000)
+#define MMP3_HSIC2_PHYBASE     (0xf0002800)
+
+#define MMP3_FSIC_REGBASE      (0xf0003000)
+#define MMP3_FSIC_PHYBASE      (0xf0003800)
+
+
+#define USB_REG_RANGE          (0x1ff)
+#define USB_PHY_RANGE          (0xff)
+
+/* registers */
+#define U2x_CAPREGS_OFFSET       0x100
+
+/* phy regs */
+#define UTMI_REVISION          0x0
+#define UTMI_CTRL              0x4
+#define UTMI_PLL               0x8
+#define UTMI_TX                        0xc
+#define UTMI_RX                        0x10
+#define UTMI_IVREF             0x14
+#define UTMI_T0                        0x18
+#define UTMI_T1                        0x1c
+#define UTMI_T2                        0x20
+#define UTMI_T3                        0x24
+#define UTMI_T4                        0x28
+#define UTMI_T5                        0x2c
+#define UTMI_RESERVE           0x30
+#define UTMI_USB_INT           0x34
+#define UTMI_DBG_CTL           0x38
+#define UTMI_OTG_ADDON         0x3c
+
+/* For UTMICTRL Register */
+#define UTMI_CTRL_USB_CLK_EN                    (1 << 31)
+/* pxa168 */
+#define UTMI_CTRL_SUSPEND_SET1                  (1 << 30)
+#define UTMI_CTRL_SUSPEND_SET2                  (1 << 29)
+#define UTMI_CTRL_RXBUF_PDWN                    (1 << 24)
+#define UTMI_CTRL_TXBUF_PDWN                    (1 << 11)
+
+#define UTMI_CTRL_INPKT_DELAY_SHIFT             30
+#define UTMI_CTRL_INPKT_DELAY_SOF_SHIFT                28
+#define UTMI_CTRL_PU_REF_SHIFT                 20
+#define UTMI_CTRL_ARC_PULLDN_SHIFT              12
+#define UTMI_CTRL_PLL_PWR_UP_SHIFT              1
+#define UTMI_CTRL_PWR_UP_SHIFT                  0
+
+/* For UTMI_PLL Register */
+#define UTMI_PLL_PLLCALI12_SHIFT               29
+#define UTMI_PLL_PLLCALI12_MASK                        (0x3 << 29)
+
+#define UTMI_PLL_PLLVDD18_SHIFT                        27
+#define UTMI_PLL_PLLVDD18_MASK                 (0x3 << 27)
+
+#define UTMI_PLL_PLLVDD12_SHIFT                        25
+#define UTMI_PLL_PLLVDD12_MASK                 (0x3 << 25)
+
+#define UTMI_PLL_CLK_BLK_EN_SHIFT               24
+#define CLK_BLK_EN                              (0x1 << 24)
+#define PLL_READY                               (0x1 << 23)
+#define KVCO_EXT                                (0x1 << 22)
+#define VCOCAL_START                            (0x1 << 21)
+
+#define UTMI_PLL_KVCO_SHIFT                    15
+#define UTMI_PLL_KVCO_MASK                      (0x7 << 15)
+
+#define UTMI_PLL_ICP_SHIFT                     12
+#define UTMI_PLL_ICP_MASK                       (0x7 << 12)
+
+#define UTMI_PLL_FBDIV_SHIFT                    4
+#define UTMI_PLL_FBDIV_MASK                     (0xFF << 4)
+
+#define UTMI_PLL_REFDIV_SHIFT                   0
+#define UTMI_PLL_REFDIV_MASK                    (0xF << 0)
+
+/* For UTMI_TX Register */
+#define UTMI_TX_REG_EXT_FS_RCAL_SHIFT          27
+#define UTMI_TX_REG_EXT_FS_RCAL_MASK           (0xf << 27)
+
+#define UTMI_TX_REG_EXT_FS_RCAL_EN_SHIFT       26
+#define UTMI_TX_REG_EXT_FS_RCAL_EN_MASK                (0x1 << 26)
+
+#define UTMI_TX_TXVDD12_SHIFT                   22
+#define UTMI_TX_TXVDD12_MASK                    (0x3 << 22)
+
+#define UTMI_TX_CK60_PHSEL_SHIFT                17
+#define UTMI_TX_CK60_PHSEL_MASK                 (0xf << 17)
+
+#define UTMI_TX_IMPCAL_VTH_SHIFT                14
+#define UTMI_TX_IMPCAL_VTH_MASK                 (0x7 << 14)
+
+#define REG_RCAL_START                          (0x1 << 12)
+
+#define UTMI_TX_LOW_VDD_EN_SHIFT                11
+
+#define UTMI_TX_AMP_SHIFT                      0
+#define UTMI_TX_AMP_MASK                       (0x7 << 0)
+
+/* For UTMI_RX Register */
+#define UTMI_REG_SQ_LENGTH_SHIFT                15
+#define UTMI_REG_SQ_LENGTH_MASK                 (0x3 << 15)
+
+#define UTMI_RX_SQ_THRESH_SHIFT                 4
+#define UTMI_RX_SQ_THRESH_MASK                  (0xf << 4)
+
+#define UTMI_OTG_ADDON_OTG_ON                  (1 << 0)
+
+/* For MMP3 USB Phy */
+#define USB2_PLL_REG0          0x4
+#define USB2_PLL_REG1          0x8
+#define USB2_TX_REG0           0x10
+#define USB2_TX_REG1           0x14
+#define USB2_TX_REG2           0x18
+#define USB2_RX_REG0           0x20
+#define USB2_RX_REG1           0x24
+#define USB2_RX_REG2           0x28
+#define USB2_ANA_REG0          0x30
+#define USB2_ANA_REG1          0x34
+#define USB2_ANA_REG2          0x38
+#define USB2_DIG_REG0          0x3C
+#define USB2_DIG_REG1          0x40
+#define USB2_DIG_REG2          0x44
+#define USB2_DIG_REG3          0x48
+#define USB2_TEST_REG0         0x4C
+#define USB2_TEST_REG1         0x50
+#define USB2_TEST_REG2         0x54
+#define USB2_CHARGER_REG0      0x58
+#define USB2_OTG_REG0          0x5C
+#define USB2_PHY_MON0          0x60
+#define USB2_RESETVE_REG0      0x64
+#define USB2_ICID_REG0         0x78
+#define USB2_ICID_REG1         0x7C
+
+/* USB2_PLL_REG0 */
+/* This is for Ax stepping */
+#define USB2_PLL_FBDIV_SHIFT_MMP3              0
+#define USB2_PLL_FBDIV_MASK_MMP3               (0xFF << 0)
+
+#define USB2_PLL_REFDIV_SHIFT_MMP3             8
+#define USB2_PLL_REFDIV_MASK_MMP3              (0xF << 8)
+
+#define USB2_PLL_VDD12_SHIFT_MMP3              12
+#define USB2_PLL_VDD18_SHIFT_MMP3              14
+
+/* This is for B0 stepping */
+#define USB2_PLL_FBDIV_SHIFT_MMP3_B0           0
+#define USB2_PLL_REFDIV_SHIFT_MMP3_B0          9
+#define USB2_PLL_VDD18_SHIFT_MMP3_B0           14
+#define USB2_PLL_FBDIV_MASK_MMP3_B0            0x01FF
+#define USB2_PLL_REFDIV_MASK_MMP3_B0           0x3E00
+
+#define USB2_PLL_CAL12_SHIFT_MMP3              0
+#define USB2_PLL_CALI12_MASK_MMP3              (0x3 << 0)
+
+#define USB2_PLL_VCOCAL_START_SHIFT_MMP3       2
+
+#define USB2_PLL_KVCO_SHIFT_MMP3               4
+#define USB2_PLL_KVCO_MASK_MMP3                        (0x7<<4)
+
+#define USB2_PLL_ICP_SHIFT_MMP3                        8
+#define USB2_PLL_ICP_MASK_MMP3                 (0x7<<8)
+
+#define USB2_PLL_LOCK_BYPASS_SHIFT_MMP3                12
+
+#define USB2_PLL_PU_PLL_SHIFT_MMP3             13
+#define USB2_PLL_PU_PLL_MASK                   (0x1 << 13)
+
+#define USB2_PLL_READY_MASK_MMP3               (0x1 << 15)
+
+/* USB2_TX_REG0 */
+#define USB2_TX_IMPCAL_VTH_SHIFT_MMP3          8
+#define USB2_TX_IMPCAL_VTH_MASK_MMP3           (0x7 << 8)
+
+#define USB2_TX_RCAL_START_SHIFT_MMP3          13
+
+/* USB2_TX_REG1 */
+#define USB2_TX_CK60_PHSEL_SHIFT_MMP3          0
+#define USB2_TX_CK60_PHSEL_MASK_MMP3           (0xf << 0)
+
+#define USB2_TX_AMP_SHIFT_MMP3                 4
+#define USB2_TX_AMP_MASK_MMP3                  (0x7 << 4)
+
+#define USB2_TX_VDD12_SHIFT_MMP3               8
+#define USB2_TX_VDD12_MASK_MMP3                        (0x3 << 8)
+
+/* USB2_TX_REG2 */
+#define USB2_TX_DRV_SLEWRATE_SHIFT             10
+
+/* USB2_RX_REG0 */
+#define USB2_RX_SQ_THRESH_SHIFT_MMP3           4
+#define USB2_RX_SQ_THRESH_MASK_MMP3            (0xf << 4)
+
+#define USB2_RX_SQ_LENGTH_SHIFT_MMP3           10
+#define USB2_RX_SQ_LENGTH_MASK_MMP3            (0x3 << 10)
+
+/* USB2_ANA_REG1*/
+#define USB2_ANA_PU_ANA_SHIFT_MMP3             14
+
+/* USB2_OTG_REG0 */
+#define USB2_OTG_PU_OTG_SHIFT_MMP3             3
+
+/* fsic registers */
+#define FSIC_MISC                      0x4
+#define FSIC_INT                       0x28
+#define FSIC_CTRL                      0x30
+
+/* HSIC registers */
+#define HSIC_PAD_CTRL                  0x4
+
+#define HSIC_CTRL                      0x8
+#define HSIC_CTRL_HSIC_ENABLE          (1<<7)
+#define HSIC_CTRL_PLL_BYPASS           (1<<4)
+
+#define TEST_GRP_0                     0xc
+#define TEST_GRP_1                     0x10
+
+#define HSIC_INT                       0x14
+#define HSIC_INT_READY_INT_EN          (1<<10)
+#define HSIC_INT_CONNECT_INT_EN                (1<<9)
+#define HSIC_INT_CORE_INT_EN           (1<<8)
+#define HSIC_INT_HS_READY              (1<<2)
+#define HSIC_INT_CONNECT               (1<<1)
+#define HSIC_INT_CORE                  (1<<0)
+
+#define HSIC_CONFIG                    0x18
+#define USBHSIC_CTRL                   0x20
+
+#define HSIC_USB_CTRL                  0x28
+#define HSIC_USB_CTRL_CLKEN            1
+#define        HSIC_USB_CLK_PHY                0x0
+#define HSIC_USB_CLK_PMU               0x1
+
+#endif /* __ASM_ARCH_PXA_U2O_H */
index b24d2c32cba984c1b72a3b2f20761c944d24ced5..62d787c3447569da2815025accced28a6379b17c 100644 (file)
@@ -14,6 +14,7 @@
 #include <linux/io.h>
 #include <linux/clk.h>
 #include <linux/platform_device.h>
+#include <linux/platform_data/mv_usb.h>
 
 #include <asm/mach/time.h>
 #include <asm/system_misc.h>
@@ -27,6 +28,7 @@
 #include <mach/mfp.h>
 #include <linux/dma-mapping.h>
 #include <mach/pxa168.h>
+#include <mach/regs-usb.h>
 
 #include "common.h"
 #include "clock.h"
@@ -93,7 +95,7 @@ static struct clk_lookup pxa168_clkregs[] = {
        INIT_CLKREG(&clk_gpio, "pxa-gpio", NULL),
        INIT_CLKREG(&clk_keypad, "pxa27x-keypad", NULL),
        INIT_CLKREG(&clk_eth, "pxa168-eth", "MFUCLK"),
-       INIT_CLKREG(&clk_usb, "pxa168-ehci", "PXA168-USBCLK"),
+       INIT_CLKREG(&clk_usb, NULL, "PXA168-USBCLK"),
        INIT_CLKREG(&clk_rtc, "sa1100-rtc", NULL),
 };
 
@@ -184,17 +186,17 @@ struct platform_device pxa168_device_gpio = {
 struct resource pxa168_usb_host_resources[] = {
        /* USB Host conroller register base */
        [0] = {
-               .start  = 0xd4209000,
-               .end    = 0xd4209000 + 0x200,
+               .start  = PXA168_U2H_REGBASE + U2x_CAPREGS_OFFSET,
+               .end    = PXA168_U2H_REGBASE + USB_REG_RANGE,
                .flags  = IORESOURCE_MEM,
-               .name   = "pxa168-usb-host",
+               .name   = "capregs",
        },
        /* USB PHY register base */
        [1] = {
-               .start  = 0xd4206000,
-               .end    = 0xd4206000 + 0xff,
+               .start  = PXA168_U2H_PHYBASE,
+               .end    = PXA168_U2H_PHYBASE + USB_PHY_RANGE,
                .flags  = IORESOURCE_MEM,
-               .name   = "pxa168-usb-phy",
+               .name   = "phyregs",
        },
        [2] = {
                .start  = IRQ_PXA168_USB2,
@@ -205,7 +207,7 @@ struct resource pxa168_usb_host_resources[] = {
 
 static u64 pxa168_usb_host_dmamask = DMA_BIT_MASK(32);
 struct platform_device pxa168_device_usb_host = {
-       .name = "pxa168-ehci",
+       .name = "pxa-sph",
        .id   = -1,
        .dev  = {
                .dma_mask = &pxa168_usb_host_dmamask,
@@ -216,7 +218,7 @@ struct platform_device pxa168_device_usb_host = {
        .resource      = pxa168_usb_host_resources,
 };
 
-int __init pxa168_add_usb_host(struct pxa168_usb_pdata *pdata)
+int __init pxa168_add_usb_host(struct mv_usb_platform_data *pdata)
 {
        pxa168_device_usb_host.dev.platform_data = pdata;
        return platform_device_register(&pxa168_device_usb_host);
index 43f8bcc29b67734a733260381f256db6b1ce19e7..6da52e9f2bdcf7dc353687d71093887af9deb3f4 100644 (file)
@@ -109,7 +109,7 @@ static struct clk_lookup pxa910_clkregs[] = {
        INIT_CLKREG(&clk_pwm4, "pxa910-pwm.3", NULL),
        INIT_CLKREG(&clk_nand, "pxa3xx-nand", NULL),
        INIT_CLKREG(&clk_gpio, "pxa-gpio", NULL),
-       INIT_CLKREG(&clk_u2o, "pxa-u2o", "U2OCLK"),
+       INIT_CLKREG(&clk_u2o, NULL, "U2OCLK"),
        INIT_CLKREG(&clk_rtc, "sa1100-rtc", NULL),
 };
 
index 3fc9ed21f97d20d8c5a63a79b5dce8f0be05c1a9..266215393f44c9d3a84335d34804074211c5f74a 100644 (file)
@@ -17,6 +17,7 @@
 #include <linux/interrupt.h>
 #include <linux/i2c/pca953x.h>
 #include <linux/gpio.h>
+#include <linux/platform_data/mv_usb.h>
 
 #include <asm/mach-types.h>
 #include <asm/mach/arch.h>
@@ -25,6 +26,7 @@
 #include <mach/mfp-pxa910.h>
 #include <mach/pxa910.h>
 #include <mach/irqs.h>
+#include <mach/regs-usb.h>
 
 #include "common.h"
 
@@ -144,6 +146,26 @@ static struct i2c_board_info ttc_dkb_i2c_info[] = {
        },
 };
 
+#ifdef CONFIG_USB_SUPPORT
+#if defined(CONFIG_USB_MV_UDC) || defined(CONFIG_USB_EHCI_MV_U2O)
+
+static char *pxa910_usb_clock_name[] = {
+       [0] = "U2OCLK",
+};
+
+static struct mv_usb_platform_data ttc_usb_pdata = {
+       .clknum         = 1,
+       .clkname        = pxa910_usb_clock_name,
+       .vbus           = NULL,
+       .mode           = MV_USB_MODE_OTG,
+       .otg_force_a_bus_req = 1,
+       .phy_init       = pxa_usb_phy_init,
+       .phy_deinit     = pxa_usb_phy_deinit,
+       .set_vbus       = NULL,
+};
+#endif
+#endif
+
 static void __init ttc_dkb_init(void)
 {
        mfp_config(ARRAY_AND_SIZE(ttc_dkb_pin_config));
@@ -154,6 +176,21 @@ static void __init ttc_dkb_init(void)
        /* off-chip devices */
        pxa910_add_twsi(0, NULL, ARRAY_AND_SIZE(ttc_dkb_i2c_info));
        platform_add_devices(ARRAY_AND_SIZE(ttc_dkb_devices));
+
+#ifdef CONFIG_USB_MV_UDC
+       pxa168_device_u2o.dev.platform_data = &ttc_usb_pdata;
+       platform_device_register(&pxa168_device_u2o);
+#endif
+
+#ifdef CONFIG_USB_EHCI_MV_U2O
+       pxa168_device_u2oehci.dev.platform_data = &ttc_usb_pdata;
+       platform_device_register(&pxa168_device_u2oehci);
+#endif
+
+#ifdef CONFIG_USB_MV_OTG
+       pxa168_device_u2ootg.dev.platform_data = &ttc_usb_pdata;
+       platform_device_register(&pxa168_device_u2ootg);
+#endif
 }
 
 MACHINE_START(TTC_DKB, "PXA910-based TTC_DKB Development Platform")
index b83b95a2950342b298a8693b753217feacb4b5ab..6bd692d271c1ae3e1fca9f6b6dbf4cda667df7f3 100644 (file)
@@ -102,6 +102,10 @@ static unsigned long hx4700_pin_config[] __initdata = {
        GPIO44_BTUART_CTS,
        GPIO45_BTUART_RTS_LPM_LOW,
 
+       /* STUART (IRDA) */
+       GPIO46_STUART_RXD,
+       GPIO47_STUART_TXD,
+
        /* PWM 1 (Backlight) */
        GPIO17_PWM1_OUT,
 
@@ -125,7 +129,7 @@ static unsigned long hx4700_pin_config[] __initdata = {
        GPIO88_GPIO,
 
        /* HX4700 specific input GPIOs */
-       GPIO12_GPIO,    /* ASIC3_IRQ */
+       GPIO12_GPIO | WAKEUP_ON_EDGE_RISE,      /* ASIC3_IRQ */
        GPIO13_GPIO,    /* W3220_IRQ */
        GPIO14_GPIO,    /* nWLAN_IRQ */
 
@@ -227,7 +231,6 @@ static u16 asic3_gpio_config[] = {
        ASIC3_GPIOC0_LED0,              /* red */
        ASIC3_GPIOC1_LED1,              /* green */
        ASIC3_GPIOC2_LED2,              /* blue */
-       ASIC3_GPIOC4_CF_nCD,
        ASIC3_GPIOC5_nCIOW,
        ASIC3_GPIOC6_nCIOR,
        ASIC3_GPIOC7_nPCE_1,
@@ -241,6 +244,7 @@ static u16 asic3_gpio_config[] = {
        ASIC3_GPIOC15_nPIOR,
 
        /* GPIOD: input GPIOs, CF */
+       ASIC3_GPIOD4_CF_nCD,
        ASIC3_GPIOD11_nCIOIS16,
        ASIC3_GPIOD12_nCWAIT,
        ASIC3_GPIOD15_nPIOW,
@@ -291,6 +295,7 @@ static struct asic3_platform_data asic3_platform_data = {
        .gpio_config_num = ARRAY_SIZE(asic3_gpio_config),
        .irq_base        = IRQ_BOARD_START,
        .gpio_base       = HX4700_ASIC3_GPIO_BASE,
+       .clock_rate      = 4000000,
        .leds            = asic3_leds,
 };
 
@@ -859,6 +864,7 @@ static void __init hx4700_init(void)
        int ret;
 
        pxa2xx_mfp_config(ARRAY_AND_SIZE(hx4700_pin_config));
+       gpio_set_wake(GPIO12_HX4700_ASIC3_IRQ, 1);
        ret = gpio_request_array(ARRAY_AND_SIZE(global_gpios));
        if (ret)
                pr_err ("hx4700: Failed to request GPIOs.\n");
index 02868447b0b135d56b4e9c687233358280da77b3..e57f5c724e8a1e18ded7302bb6c7a29bd288c0ab 100644 (file)
@@ -61,6 +61,9 @@
 #define GPIO93_KEY_VOLUME_UP                   93
 #define GPIO94_KEY_VOLUME_DOWN                 94
 
+/* Camera */
+#define GPIO56_MT9M111_nOE                     56
+
 extern struct input_dev *mioa701_evdev;
 extern void mioa701_gpio_lpm_set(unsigned long mfp_pin);
 
index d72791695b2611ba3e55aeeab43623641d7baacf..0260aaa2fc178670e597014eff70f358a16c5ad1 100644 (file)
@@ -31,7 +31,6 @@
 #define PCM990_CTRL_INT_IRQ            PXA_GPIO_TO_IRQ(PCM990_CTRL_INT_IRQ_GPIO)
 #define PCM990_CTRL_INT_IRQ_EDGE       IRQ_TYPE_EDGE_RISING
 #define PCM990_CTRL_PHYS               PXA_CS1_PHYS    /* 16-Bit */
-#define PCM990_CTRL_BASE               0xea000000
 #define PCM990_CTRL_SIZE               (1*1024*1024)
 
 #define PCM990_CTRL_PWR_IRQ_GPIO       14
 #define PCM990_CTRL_MMC2DE     0x0004  /* R MMC2 Card detect */
 #define PCM990_CTRL_MMC2WP     0x0008  /* R MMC2 Card write protect */
 
-#define PCM990_CTRL_REG6       0x000C  /* Interrupt Clear REGISTER */
+#define PCM990_CTRL_INTSETCLR  0x000C  /* Interrupt Clear REGISTER */
 #define PCM990_CTRL_INTC0      0x0001  /* Clear Reg BT Detect */
 #define PCM990_CTRL_INTC1      0x0002  /* Clear Reg FR RI */
 #define PCM990_CTRL_INTC2      0x0004  /* Clear Reg MMC1 Detect */
 #define PCM990_CTRL_INTC3      0x0008  /* Clear Reg PM_5V off */
 
-#define PCM990_CTRL_REG7       0x000E  /* Interrupt Enable REGISTER */
+#define PCM990_CTRL_INTMSKENA  0x000E  /* Interrupt Enable REGISTER */
 #define PCM990_CTRL_ENAINT0    0x0001  /* Enable Int BT Detect */
 #define PCM990_CTRL_ENAINT1    0x0002  /* Enable Int FR RI */
 #define PCM990_CTRL_ENAINT2    0x0004  /* Enable Int MMC1 Detect */
 #define PCM990_CTRL_ACPRES     0x0004  /* DC Present */
 #define PCM990_CTRL_ACALARM    0x0008  /* Error Akku */
 
-#define PCM990_CTRL_P2V(x)     ((x) - PCM990_CTRL_PHYS + PCM990_CTRL_BASE)
-#define PCM990_CTRL_V2P(x)     ((x) - PCM990_CTRL_BASE + PCM990_CTRL_PHYS)
-
-#ifndef __ASSEMBLY__
-#  define __PCM990_CTRL_REG(x) \
-               (*((volatile unsigned char *)PCM990_CTRL_P2V(x)))
-#else
-#  define __PCM990_CTRL_REG(x) PCM990_CTRL_P2V(x)
-#endif
-
-#define PCM990_INTMSKENA __PCM990_CTRL_REG(PCM990_CTRL_PHYS + PCM990_CTRL_REG7)
-#define PCM990_INTSETCLR __PCM990_CTRL_REG(PCM990_CTRL_PHYS + PCM990_CTRL_REG6)
-#define PCM990_CTRL0   __PCM990_CTRL_REG(PCM990_CTRL_PHYS + PCM990_CTRL_REG0)
-#define PCM990_CTRL1   __PCM990_CTRL_REG(PCM990_CTRL_PHYS + PCM990_CTRL_REG1)
-#define PCM990_CTRL2   __PCM990_CTRL_REG(PCM990_CTRL_PHYS + PCM990_CTRL_REG2)
-#define PCM990_CTRL3   __PCM990_CTRL_REG(PCM990_CTRL_PHYS + PCM990_CTRL_REG3)
-#define PCM990_CTRL4   __PCM990_CTRL_REG(PCM990_CTRL_PHYS + PCM990_CTRL_REG4)
-#define PCM990_CTRL5   __PCM990_CTRL_REG(PCM990_CTRL_PHYS + PCM990_CTRL_REG5)
-#define PCM990_CTRL6   __PCM990_CTRL_REG(PCM990_CTRL_PHYS + PCM990_CTRL_REG6)
-#define PCM990_CTRL7   __PCM990_CTRL_REG(PCM990_CTRL_PHYS + PCM990_CTRL_REG7)
-#define PCM990_CTRL8   __PCM990_CTRL_REG(PCM990_CTRL_PHYS + PCM990_CTRL_REG8)
-#define PCM990_CTRL9   __PCM990_CTRL_REG(PCM990_CTRL_PHYS + PCM990_CTRL_REG9)
-#define PCM990_CTRL10  __PCM990_CTRL_REG(PCM990_CTRL_PHYS + PCM990_CTRL_REG10)
-#define PCM990_CTRL11  __PCM990_CTRL_REG(PCM990_CTRL_PHYS + PCM990_CTRL_REG11)
-
-
 /*
  * IDE
  */
 #define PCM990_IDE_PLD_P2V(x) ((x) - PCM990_IDE_PLD_PHYS + PCM990_IDE_PLD_BASE)
 #define PCM990_IDE_PLD_V2P(x) ((x) - PCM990_IDE_PLD_BASE + PCM990_IDE_PLD_PHYS)
 
-#ifndef __ASSEMBLY__
-# define  __PCM990_IDE_PLD_REG(x) \
-       (*((volatile unsigned char *)PCM990_IDE_PLD_P2V(x)))
-#else
-# define  __PCM990_IDE_PLD_REG(x)      PCM990_IDE_PLD_P2V(x)
-#endif
-
-#define PCM990_IDE0 \
-       __PCM990_IDE_PLD_REG(PCM990_IDE_PLD_PHYS + PCM990_IDE_PLD_REG0)
-#define PCM990_IDE1 \
-       __PCM990_IDE_PLD_REG(PCM990_IDE_PLD_PHYS + PCM990_IDE_PLD_REG1)
-#define PCM990_IDE2 \
-       __PCM990_IDE_PLD_REG(PCM990_IDE_PLD_PHYS + PCM990_IDE_PLD_REG2)
-#define PCM990_IDE3 \
-       __PCM990_IDE_PLD_REG(PCM990_IDE_PLD_PHYS + PCM990_IDE_PLD_REG3)
-#define PCM990_IDE4 \
-       __PCM990_IDE_PLD_REG(PCM990_IDE_PLD_PHYS + PCM990_IDE_PLD_REG4)
-
 /*
  * Compact Flash
  */
 #define PCM990_CF_CD_EDGE      IRQ_TYPE_EDGE_RISING
 
 #define PCM990_CF_PLD_PHYS     0x30000000      /* 16 bit wide */
-#define PCM990_CF_PLD_BASE     0xef000000
-#define PCM990_CF_PLD_SIZE     (1*1024*1024)
-#define PCM990_CF_PLD_P2V(x)   ((x) - PCM990_CF_PLD_PHYS + PCM990_CF_PLD_BASE)
-#define PCM990_CF_PLD_V2P(x)   ((x) - PCM990_CF_PLD_BASE + PCM990_CF_PLD_PHYS)
 
 /* visible CPLD (U6) registers */
 #define PCM990_CF_PLD_REG0     0x1000  /* OFFSET CF REGISTER 0 */
 #define PCM990_CF_REG6_CD1     0x0001  /* R CF Card_Detect1 */
 #define PCM990_CF_REG6_CD2     0x0002  /* R CF Card_Detect2 */
 
-#ifndef __ASSEMBLY__
-#  define  __PCM990_CF_PLD_REG(x) \
-       (*((volatile unsigned char *)PCM990_CF_PLD_P2V(x)))
-#else
-#  define  __PCM990_CF_PLD_REG(x)      PCM990_CF_PLD_P2V(x)
-#endif
-
-#define PCM990_CF0 __PCM990_CF_PLD_REG(PCM990_CF_PLD_PHYS + PCM990_CF_PLD_REG0)
-#define PCM990_CF1 __PCM990_CF_PLD_REG(PCM990_CF_PLD_PHYS + PCM990_CF_PLD_REG1)
-#define PCM990_CF2 __PCM990_CF_PLD_REG(PCM990_CF_PLD_PHYS + PCM990_CF_PLD_REG2)
-#define PCM990_CF3 __PCM990_CF_PLD_REG(PCM990_CF_PLD_PHYS + PCM990_CF_PLD_REG3)
-#define PCM990_CF4 __PCM990_CF_PLD_REG(PCM990_CF_PLD_PHYS + PCM990_CF_PLD_REG4)
-#define PCM990_CF5 __PCM990_CF_PLD_REG(PCM990_CF_PLD_PHYS + PCM990_CF_PLD_REG5)
-#define PCM990_CF6 __PCM990_CF_PLD_REG(PCM990_CF_PLD_PHYS + PCM990_CF_PLD_REG6)
-
 /*
  * Wolfson AC97 Touch
  */
index 061d57009cee98aec4335c745d3a7a51cfd975ea..929c62b47b761b9fab85dd6ffc78e7089dbb6a3e 100644 (file)
@@ -103,6 +103,7 @@ static unsigned long mioa701_pin_config[] = {
        GPIO82_CIF_DD_5,
        GPIO84_CIF_FV,
        GPIO85_CIF_LV,
+       MIO_CFG_OUT(GPIO56_MT9M111_nOE, AF0, DRIVE_LOW),
 
        /* Bluetooth */
        MIO_CFG_IN(GPIO14_BT_nACTIVITY, AF0),
@@ -705,6 +706,7 @@ static struct gpio global_gpios[] = {
        { GPIO9_CHARGE_EN, GPIOF_OUT_INIT_HIGH, "Charger enable" },
        { GPIO18_POWEROFF, GPIOF_OUT_INIT_LOW, "Power Off" },
        { GPIO87_LCD_POWER, GPIOF_OUT_INIT_LOW, "LCD Power" },
+       { GPIO56_MT9M111_nOE, GPIOF_OUT_INIT_LOW, "Camera nOE" },
 };
 
 static void __init mioa701_machine_init(void)
index abab4e2b122c088195f9fcbdc8708976c68da90a..cb723e84bc2710f7cd7a7955edabca98275e901d 100644 (file)
@@ -65,6 +65,18 @@ static unsigned long pcm990_pin_config[] __initdata = {
        GPIO31_AC97_SYNC,
 };
 
+static void __iomem *pcm990_cpld_base;
+
+static u8 pcm990_cpld_readb(unsigned int reg)
+{
+       return readb(pcm990_cpld_base + reg);
+}
+
+static void pcm990_cpld_writeb(u8 value, unsigned int reg)
+{
+       writeb(value, pcm990_cpld_base + reg);
+}
+
 /*
  * pcm990_lcd_power - control power supply to the LCD
  * @on: 0 = switch off, 1 = switch on
@@ -78,13 +90,13 @@ static void pcm990_lcd_power(int on, struct fb_var_screeninfo *var)
                /* enable LCD-Latches
                 * power on LCD
                 */
-               __PCM990_CTRL_REG(PCM990_CTRL_PHYS + PCM990_CTRL_REG3) =
-                       PCM990_CTRL_LCDPWR + PCM990_CTRL_LCDON;
+               pcm990_cpld_writeb(PCM990_CTRL_LCDPWR + PCM990_CTRL_LCDON,
+                               PCM990_CTRL_REG3);
        } else {
                /* disable LCD-Latches
                 * power off LCD
                 */
-               __PCM990_CTRL_REG(PCM990_CTRL_PHYS + PCM990_CTRL_REG3) = 0x00;
+               pcm990_cpld_writeb(0, PCM990_CTRL_REG3);
        }
 }
 #endif
@@ -243,15 +255,26 @@ static unsigned long pcm990_irq_enabled;
 static void pcm990_mask_ack_irq(struct irq_data *d)
 {
        int pcm990_irq = (d->irq - PCM027_IRQ(0));
-       PCM990_INTMSKENA = (pcm990_irq_enabled &= ~(1 << pcm990_irq));
+
+       pcm990_irq_enabled &= ~(1 << pcm990_irq);
+
+       pcm990_cpld_writeb(pcm990_irq_enabled, PCM990_CTRL_INTMSKENA);
 }
 
 static void pcm990_unmask_irq(struct irq_data *d)
 {
        int pcm990_irq = (d->irq - PCM027_IRQ(0));
+       u8 val;
+
        /* the irq can be acknowledged only if deasserted, so it's done here */
-       PCM990_INTSETCLR |= 1 << pcm990_irq;
-       PCM990_INTMSKENA  = (pcm990_irq_enabled |= (1 << pcm990_irq));
+
+       pcm990_irq_enabled |= (1 << pcm990_irq);
+
+       val = pcm990_cpld_readb(PCM990_CTRL_INTSETCLR);
+       val |= 1 << pcm990_irq;
+       pcm990_cpld_writeb(val, PCM990_CTRL_INTSETCLR);
+
+       pcm990_cpld_writeb(pcm990_irq_enabled, PCM990_CTRL_INTMSKENA);
 }
 
 static struct irq_chip pcm990_irq_chip = {
@@ -261,7 +284,10 @@ static struct irq_chip pcm990_irq_chip = {
 
 static void pcm990_irq_handler(unsigned int irq, struct irq_desc *desc)
 {
-       unsigned long pending = (~PCM990_INTSETCLR) & pcm990_irq_enabled;
+       unsigned long pending;
+
+       pending = ~pcm990_cpld_readb(PCM990_CTRL_INTSETCLR);
+       pending &= pcm990_irq_enabled;
 
        do {
                /* clear our parent IRQ */
@@ -270,7 +296,8 @@ static void pcm990_irq_handler(unsigned int irq, struct irq_desc *desc)
                        irq = PCM027_IRQ(0) + __ffs(pending);
                        generic_handle_irq(irq);
                }
-               pending = (~PCM990_INTSETCLR) & pcm990_irq_enabled;
+               pending = ~pcm990_cpld_readb(PCM990_CTRL_INTSETCLR);
+               pending &= pcm990_irq_enabled;
        } while (pending);
 }
 
@@ -285,8 +312,9 @@ static void __init pcm990_init_irq(void)
                set_irq_flags(irq, IRQF_VALID | IRQF_PROBE);
        }
 
-       PCM990_INTMSKENA = 0x00;        /* disable all Interrupts */
-       PCM990_INTSETCLR = 0xFF;
+       /* disable all Interrupts */
+       pcm990_cpld_writeb(0x0, PCM990_CTRL_INTMSKENA);
+       pcm990_cpld_writeb(0xff, PCM990_CTRL_INTSETCLR);
 
        irq_set_chained_handler(PCM990_CTRL_INT_IRQ, pcm990_irq_handler);
        irq_set_irq_type(PCM990_CTRL_INT_IRQ, PCM990_CTRL_INT_IRQ_EDGE);
@@ -309,13 +337,16 @@ static int pcm990_mci_init(struct device *dev, irq_handler_t mci_detect_int,
 static void pcm990_mci_setpower(struct device *dev, unsigned int vdd)
 {
        struct pxamci_platform_data *p_d = dev->platform_data;
+       u8 val;
+
+       val = pcm990_cpld_readb(PCM990_CTRL_REG5);
 
        if ((1 << vdd) & p_d->ocr_mask)
-               __PCM990_CTRL_REG(PCM990_CTRL_PHYS + PCM990_CTRL_REG5) =
-                                               PCM990_CTRL_MMC2PWR;
+               val |= PCM990_CTRL_MMC2PWR;
        else
-               __PCM990_CTRL_REG(PCM990_CTRL_PHYS + PCM990_CTRL_REG5) =
-                                               ~PCM990_CTRL_MMC2PWR;
+               val &= ~PCM990_CTRL_MMC2PWR;
+
+       pcm990_cpld_writeb(PCM990_CTRL_MMC2PWR, PCM990_CTRL_REG5);
 }
 
 static void pcm990_mci_exit(struct device *dev, void *data)
@@ -480,23 +511,6 @@ static struct platform_device pcm990_camera[] = {
 };
 #endif /* CONFIG_VIDEO_PXA27x ||CONFIG_VIDEO_PXA27x_MODULE */
 
-/*
- * enable generic access to the base board control CPLDs U6 and U7
- */
-static struct map_desc pcm990_io_desc[] __initdata = {
-       {
-               .virtual        = PCM990_CTRL_BASE,
-               .pfn            = __phys_to_pfn(PCM990_CTRL_PHYS),
-               .length         = PCM990_CTRL_SIZE,
-               .type           = MT_DEVICE     /* CPLD */
-       }, {
-               .virtual        = PCM990_CF_PLD_BASE,
-               .pfn            = __phys_to_pfn(PCM990_CF_PLD_PHYS),
-               .length         = PCM990_CF_PLD_SIZE,
-               .type           = MT_DEVICE     /* CPLD */
-       }
-};
-
 /*
  * system init for baseboard usage. Will be called by pcm027 init.
  *
@@ -507,8 +521,11 @@ void __init pcm990_baseboard_init(void)
 {
        pxa2xx_mfp_config(ARRAY_AND_SIZE(pcm990_pin_config));
 
-       /* register CPLD access */
-       iotable_init(ARRAY_AND_SIZE(pcm990_io_desc));
+       pcm990_cpld_base = ioremap(PCM990_CTRL_PHYS, PCM990_CTRL_SIZE);
+       if (!pcm990_cpld_base) {
+               pr_err("pcm990: failed to ioremap cpld\n");
+               return;
+       }
 
        /* register CPLD's IRQ controller */
        pcm990_init_irq();
index bba3ab2066eefafbc580630f17beda79717d915a..8fd255f7ee40e9f64ea04f606f7157ac28f7c808 100644 (file)
@@ -217,7 +217,7 @@ config PCMCIA_PXA2XX
                    || MACH_ARMCORE || ARCH_PXA_PALM || TRIZEPS_PCMCIA \
                    || ARCOM_PCMCIA || ARCH_PXA_ESERIES || MACH_STARGATE2 \
                    || MACH_VPAC270 || MACH_BALLOON3 || MACH_COLIBRI \
-                   || MACH_COLIBRI320)
+                   || MACH_COLIBRI320 || MACH_H4700)
        select PCMCIA_SA1111 if ARCH_LUBBOCK && SA1111
        select PCMCIA_SOC_COMMON
        help
index 47525de6a631f13fd36ffdaf06413258bb51c64d..7745b512a87c7c2ebb71c7be1d07435e4960118a 100644 (file)
@@ -69,6 +69,7 @@ pxa2xx-obj-$(CONFIG_MACH_VPAC270)             += pxa2xx_vpac270.o
 pxa2xx-obj-$(CONFIG_MACH_BALLOON3)             += pxa2xx_balloon3.o
 pxa2xx-obj-$(CONFIG_MACH_COLIBRI)              += pxa2xx_colibri.o
 pxa2xx-obj-$(CONFIG_MACH_COLIBRI320)           += pxa2xx_colibri.o
+pxa2xx-obj-$(CONFIG_MACH_H4700)                        += pxa2xx_hx4700.o
 
 obj-$(CONFIG_PCMCIA_PXA2XX)                    += pxa2xx_base.o $(pxa2xx-obj-y)
 
diff --git a/drivers/pcmcia/pxa2xx_hx4700.c b/drivers/pcmcia/pxa2xx_hx4700.c
new file mode 100644 (file)
index 0000000..7dfef3e
--- /dev/null
@@ -0,0 +1,121 @@
+/*
+ *  Copyright (C) 2012 Paul Parsons <lost.distance@yahoo.com>
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License version 2 as
+ *  published by the Free Software Foundation.
+ */
+
+#include <linux/module.h>
+#include <linux/platform_device.h>
+#include <linux/err.h>
+#include <linux/gpio.h>
+#include <linux/irq.h>
+
+#include <asm/mach-types.h>
+#include <mach/hx4700.h>
+
+#include "soc_common.h"
+
+static struct gpio gpios[] = {
+       { GPIO114_HX4700_CF_RESET,    GPIOF_OUT_INIT_LOW,   "CF reset"        },
+       { EGPIO4_CF_3V3_ON,           GPIOF_OUT_INIT_LOW,   "CF 3.3V enable"  },
+};
+
+static int hx4700_pcmcia_hw_init(struct soc_pcmcia_socket *skt)
+{
+       int ret;
+
+       ret = gpio_request_array(gpios, ARRAY_SIZE(gpios));
+       if (ret)
+               goto out;
+
+       /*
+        * IRQ type must be set before soc_pcmcia_hw_init() calls request_irq().
+        * The asic3 default IRQ type is level trigger low level detect, exactly
+        * the the signal present on GPIOD4_CF_nCD when a CF card is inserted.
+        * If the IRQ type is not changed, the asic3 interrupt handler will loop
+        * repeatedly because it is unable to clear the level trigger interrupt.
+        */
+       irq_set_irq_type(gpio_to_irq(GPIOD4_CF_nCD), IRQ_TYPE_EDGE_BOTH);
+
+       skt->stat[SOC_STAT_CD].gpio = GPIOD4_CF_nCD;
+       skt->stat[SOC_STAT_CD].name = "PCMCIA CD";
+       skt->stat[SOC_STAT_RDY].gpio = GPIO60_HX4700_CF_RNB;
+       skt->stat[SOC_STAT_RDY].name = "PCMCIA Ready";
+
+out:
+       return ret;
+}
+
+static void hx4700_pcmcia_hw_shutdown(struct soc_pcmcia_socket *skt)
+{
+       gpio_free_array(gpios, ARRAY_SIZE(gpios));
+}
+
+static void hx4700_pcmcia_socket_state(struct soc_pcmcia_socket *skt,
+       struct pcmcia_state *state)
+{
+       state->vs_3v = 1;
+       state->vs_Xv = 0;
+}
+
+static int hx4700_pcmcia_configure_socket(struct soc_pcmcia_socket *skt,
+       const socket_state_t *state)
+{
+       switch (state->Vcc) {
+       case 0:
+               gpio_set_value(EGPIO4_CF_3V3_ON, 0);
+               break;
+       case 33:
+               gpio_set_value(EGPIO4_CF_3V3_ON, 1);
+               break;
+       default:
+               printk(KERN_ERR "pcmcia: Unsupported Vcc: %d\n", state->Vcc);
+               return -EINVAL;
+       }
+
+       gpio_set_value(GPIO114_HX4700_CF_RESET, (state->flags & SS_RESET) != 0);
+
+       return 0;
+}
+
+static struct pcmcia_low_level hx4700_pcmcia_ops = {
+       .owner          = THIS_MODULE,
+       .nr             = 1,
+       .hw_init        = hx4700_pcmcia_hw_init,
+       .hw_shutdown    = hx4700_pcmcia_hw_shutdown,
+       .socket_state   = hx4700_pcmcia_socket_state,
+       .configure_socket = hx4700_pcmcia_configure_socket,
+};
+
+static struct platform_device *hx4700_pcmcia_device;
+
+static int __init hx4700_pcmcia_init(void)
+{
+       struct platform_device *pdev;
+
+       if (!machine_is_h4700())
+               return -ENODEV;
+
+       pdev = platform_device_register_data(NULL, "pxa2xx-pcmcia", -1,
+               &hx4700_pcmcia_ops, sizeof(hx4700_pcmcia_ops));
+       if (IS_ERR(pdev))
+               return PTR_ERR(pdev);
+
+       hx4700_pcmcia_device = pdev;
+
+       return 0;
+}
+
+static void __exit hx4700_pcmcia_exit(void)
+{
+       platform_device_unregister(hx4700_pcmcia_device);
+}
+
+module_init(hx4700_pcmcia_init);
+module_exit(hx4700_pcmcia_exit);
+
+MODULE_AUTHOR("Paul Parsons <lost.distance@yahoo.com>");
+MODULE_DESCRIPTION("HP iPAQ hx4700 PCMCIA driver");
+MODULE_LICENSE("GPL");
index ed793b77a1c5e2a77301964fc8822f18c4239e1c..ef6faa5cee46d49a3df43f0567146e777dc8c07c 100644 (file)
@@ -138,6 +138,7 @@ struct asic3_platform_data {
 #define ASIC3_GPIOC13_nPWAIT           ASIC3_CONFIG_GPIO(45, 1, 1, 0)
 #define ASIC3_GPIOC14_nPIOIS16         ASIC3_CONFIG_GPIO(46, 1, 1, 0)
 #define ASIC3_GPIOC15_nPIOR            ASIC3_CONFIG_GPIO(47, 1, 0, 0)
+#define ASIC3_GPIOD4_CF_nCD            ASIC3_CONFIG_GPIO(52, 1, 0, 0)
 #define ASIC3_GPIOD11_nCIOIS16         ASIC3_CONFIG_GPIO(59, 1, 0, 0)
 #define ASIC3_GPIOD12_nCWAIT           ASIC3_CONFIG_GPIO(60, 1, 0, 0)
 #define ASIC3_GPIOD15_nPIOW            ASIC3_CONFIG_GPIO(63, 1, 0, 0)