|
@@ -23,6 +23,9 @@
|
|
#include <linux/gpio.h>
|
|
#include <linux/gpio.h>
|
|
#include <linux/smsc911x.h>
|
|
#include <linux/smsc911x.h>
|
|
#include <linux/platform_device.h>
|
|
#include <linux/platform_device.h>
|
|
|
|
+#include <linux/mfd/mc13783.h>
|
|
|
|
+#include <linux/spi/spi.h>
|
|
|
|
+#include <linux/regulator/machine.h>
|
|
|
|
|
|
#include <mach/hardware.h>
|
|
#include <mach/hardware.h>
|
|
#include <asm/mach-types.h>
|
|
#include <asm/mach-types.h>
|
|
@@ -31,26 +34,96 @@
|
|
#include <asm/memory.h>
|
|
#include <asm/memory.h>
|
|
#include <asm/mach/map.h>
|
|
#include <asm/mach/map.h>
|
|
#include <mach/common.h>
|
|
#include <mach/common.h>
|
|
-#include <mach/board-mx31pdk.h>
|
|
|
|
|
|
+#include <mach/board-mx31_3ds.h>
|
|
#include <mach/imx-uart.h>
|
|
#include <mach/imx-uart.h>
|
|
#include <mach/iomux-mx3.h>
|
|
#include <mach/iomux-mx3.h>
|
|
|
|
+#include <mach/mxc_nand.h>
|
|
|
|
+#include <mach/spi.h>
|
|
#include "devices.h"
|
|
#include "devices.h"
|
|
|
|
|
|
/*!
|
|
/*!
|
|
- * @file mx31pdk.c
|
|
|
|
|
|
+ * @file mx31_3ds.c
|
|
*
|
|
*
|
|
* @brief This file contains the board-specific initialization routines.
|
|
* @brief This file contains the board-specific initialization routines.
|
|
*
|
|
*
|
|
* @ingroup System
|
|
* @ingroup System
|
|
*/
|
|
*/
|
|
|
|
|
|
-static int mx31pdk_pins[] = {
|
|
|
|
|
|
+static int mx31_3ds_pins[] = {
|
|
/* UART1 */
|
|
/* UART1 */
|
|
MX31_PIN_CTS1__CTS1,
|
|
MX31_PIN_CTS1__CTS1,
|
|
MX31_PIN_RTS1__RTS1,
|
|
MX31_PIN_RTS1__RTS1,
|
|
MX31_PIN_TXD1__TXD1,
|
|
MX31_PIN_TXD1__TXD1,
|
|
MX31_PIN_RXD1__RXD1,
|
|
MX31_PIN_RXD1__RXD1,
|
|
IOMUX_MODE(MX31_PIN_GPIO1_1, IOMUX_CONFIG_GPIO),
|
|
IOMUX_MODE(MX31_PIN_GPIO1_1, IOMUX_CONFIG_GPIO),
|
|
|
|
+ /* SPI 1 */
|
|
|
|
+ MX31_PIN_CSPI2_SCLK__SCLK,
|
|
|
|
+ MX31_PIN_CSPI2_MOSI__MOSI,
|
|
|
|
+ MX31_PIN_CSPI2_MISO__MISO,
|
|
|
|
+ MX31_PIN_CSPI2_SPI_RDY__SPI_RDY,
|
|
|
|
+ MX31_PIN_CSPI2_SS0__SS0,
|
|
|
|
+ MX31_PIN_CSPI2_SS2__SS2, /*CS for MC13783 */
|
|
|
|
+ /* MC13783 IRQ */
|
|
|
|
+ IOMUX_MODE(MX31_PIN_GPIO1_3, IOMUX_CONFIG_GPIO),
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+/* Regulators */
|
|
|
|
+static struct regulator_init_data pwgtx_init = {
|
|
|
|
+ .constraints = {
|
|
|
|
+ .boot_on = 1,
|
|
|
|
+ .always_on = 1,
|
|
|
|
+ },
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+static struct mc13783_regulator_init_data mx31_3ds_regulators[] = {
|
|
|
|
+ {
|
|
|
|
+ .id = MC13783_REGU_PWGT1SPI, /* Power Gate for ARM core. */
|
|
|
|
+ .init_data = &pwgtx_init,
|
|
|
|
+ }, {
|
|
|
|
+ .id = MC13783_REGU_PWGT2SPI, /* Power Gate for L2 Cache. */
|
|
|
|
+ .init_data = &pwgtx_init,
|
|
|
|
+ },
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+/* MC13783 */
|
|
|
|
+static struct mc13783_platform_data mc13783_pdata __initdata = {
|
|
|
|
+ .regulators = mx31_3ds_regulators,
|
|
|
|
+ .num_regulators = ARRAY_SIZE(mx31_3ds_regulators),
|
|
|
|
+ .flags = MC13783_USE_REGULATOR,
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+/* SPI */
|
|
|
|
+static int spi1_internal_chipselect[] = {
|
|
|
|
+ MXC_SPI_CS(0),
|
|
|
|
+ MXC_SPI_CS(2),
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+static struct spi_imx_master spi1_pdata = {
|
|
|
|
+ .chipselect = spi1_internal_chipselect,
|
|
|
|
+ .num_chipselect = ARRAY_SIZE(spi1_internal_chipselect),
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+static struct spi_board_info mx31_3ds_spi_devs[] __initdata = {
|
|
|
|
+ {
|
|
|
|
+ .modalias = "mc13783",
|
|
|
|
+ .max_speed_hz = 1000000,
|
|
|
|
+ .bus_num = 1,
|
|
|
|
+ .chip_select = 1, /* SS2 */
|
|
|
|
+ .platform_data = &mc13783_pdata,
|
|
|
|
+ .irq = IOMUX_TO_IRQ(MX31_PIN_GPIO1_3),
|
|
|
|
+ .mode = SPI_CS_HIGH,
|
|
|
|
+ },
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+/*
|
|
|
|
+ * NAND Flash
|
|
|
|
+ */
|
|
|
|
+static struct mxc_nand_platform_data imx31_3ds_nand_flash_pdata = {
|
|
|
|
+ .width = 1,
|
|
|
|
+ .hw_ecc = 1,
|
|
|
|
+#ifdef MACH_MX31_3DS_MXC_NAND_USE_BBT
|
|
|
|
+ .flash_bbt = 1,
|
|
|
|
+#endif
|
|
};
|
|
};
|
|
|
|
|
|
static struct imxuart_platform_data uart_pdata = {
|
|
static struct imxuart_platform_data uart_pdata = {
|
|
@@ -95,7 +168,7 @@ static struct platform_device smsc911x_device = {
|
|
* LEDs, switches, interrupts for Ethernet.
|
|
* LEDs, switches, interrupts for Ethernet.
|
|
*/
|
|
*/
|
|
|
|
|
|
-static void mx31pdk_expio_irq_handler(uint32_t irq, struct irq_desc *desc)
|
|
|
|
|
|
+static void mx31_3ds_expio_irq_handler(uint32_t irq, struct irq_desc *desc)
|
|
{
|
|
{
|
|
uint32_t imr_val;
|
|
uint32_t imr_val;
|
|
uint32_t int_valid;
|
|
uint32_t int_valid;
|
|
@@ -163,7 +236,7 @@ static struct irq_chip expio_irq_chip = {
|
|
.unmask = expio_unmask_irq,
|
|
.unmask = expio_unmask_irq,
|
|
};
|
|
};
|
|
|
|
|
|
-static int __init mx31pdk_init_expio(void)
|
|
|
|
|
|
+static int __init mx31_3ds_init_expio(void)
|
|
{
|
|
{
|
|
int i;
|
|
int i;
|
|
int ret;
|
|
int ret;
|
|
@@ -176,7 +249,7 @@ static int __init mx31pdk_init_expio(void)
|
|
return -ENODEV;
|
|
return -ENODEV;
|
|
}
|
|
}
|
|
|
|
|
|
- pr_info("i.MX31PDK Debug board detected, rev = 0x%04X\n",
|
|
|
|
|
|
+ pr_info("i.MX31 3DS Debug board detected, rev = 0x%04X\n",
|
|
__raw_readw(CPLD_CODE_VER_REG));
|
|
__raw_readw(CPLD_CODE_VER_REG));
|
|
|
|
|
|
/*
|
|
/*
|
|
@@ -201,7 +274,7 @@ static int __init mx31pdk_init_expio(void)
|
|
set_irq_flags(i, IRQF_VALID);
|
|
set_irq_flags(i, IRQF_VALID);
|
|
}
|
|
}
|
|
set_irq_type(EXPIO_PARENT_INT, IRQ_TYPE_LEVEL_LOW);
|
|
set_irq_type(EXPIO_PARENT_INT, IRQ_TYPE_LEVEL_LOW);
|
|
- set_irq_chained_handler(EXPIO_PARENT_INT, mx31pdk_expio_irq_handler);
|
|
|
|
|
|
+ set_irq_chained_handler(EXPIO_PARENT_INT, mx31_3ds_expio_irq_handler);
|
|
|
|
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
@@ -209,7 +282,7 @@ static int __init mx31pdk_init_expio(void)
|
|
/*
|
|
/*
|
|
* This structure defines the MX31 memory map.
|
|
* This structure defines the MX31 memory map.
|
|
*/
|
|
*/
|
|
-static struct map_desc mx31pdk_io_desc[] __initdata = {
|
|
|
|
|
|
+static struct map_desc mx31_3ds_io_desc[] __initdata = {
|
|
{
|
|
{
|
|
.virtual = MX31_CS5_BASE_ADDR_VIRT,
|
|
.virtual = MX31_CS5_BASE_ADDR_VIRT,
|
|
.pfn = __phys_to_pfn(MX31_CS5_BASE_ADDR),
|
|
.pfn = __phys_to_pfn(MX31_CS5_BASE_ADDR),
|
|
@@ -221,10 +294,10 @@ static struct map_desc mx31pdk_io_desc[] __initdata = {
|
|
/*
|
|
/*
|
|
* Set up static virtual mappings.
|
|
* Set up static virtual mappings.
|
|
*/
|
|
*/
|
|
-static void __init mx31pdk_map_io(void)
|
|
|
|
|
|
+static void __init mx31_3ds_map_io(void)
|
|
{
|
|
{
|
|
mx31_map_io();
|
|
mx31_map_io();
|
|
- iotable_init(mx31pdk_io_desc, ARRAY_SIZE(mx31pdk_io_desc));
|
|
|
|
|
|
+ iotable_init(mx31_3ds_io_desc, ARRAY_SIZE(mx31_3ds_io_desc));
|
|
}
|
|
}
|
|
|
|
|
|
/*!
|
|
/*!
|
|
@@ -232,35 +305,40 @@ static void __init mx31pdk_map_io(void)
|
|
*/
|
|
*/
|
|
static void __init mxc_board_init(void)
|
|
static void __init mxc_board_init(void)
|
|
{
|
|
{
|
|
- mxc_iomux_setup_multiple_pins(mx31pdk_pins, ARRAY_SIZE(mx31pdk_pins),
|
|
|
|
- "mx31pdk");
|
|
|
|
|
|
+ mxc_iomux_setup_multiple_pins(mx31_3ds_pins, ARRAY_SIZE(mx31_3ds_pins),
|
|
|
|
+ "mx31_3ds");
|
|
|
|
|
|
mxc_register_device(&mxc_uart_device0, &uart_pdata);
|
|
mxc_register_device(&mxc_uart_device0, &uart_pdata);
|
|
|
|
+ mxc_register_device(&mxc_nand_device, &imx31_3ds_nand_flash_pdata);
|
|
|
|
+
|
|
|
|
+ mxc_register_device(&mxc_spi_device1, &spi1_pdata);
|
|
|
|
+ spi_register_board_info(mx31_3ds_spi_devs,
|
|
|
|
+ ARRAY_SIZE(mx31_3ds_spi_devs));
|
|
|
|
|
|
- if (!mx31pdk_init_expio())
|
|
|
|
|
|
+ if (!mx31_3ds_init_expio())
|
|
platform_device_register(&smsc911x_device);
|
|
platform_device_register(&smsc911x_device);
|
|
}
|
|
}
|
|
|
|
|
|
-static void __init mx31pdk_timer_init(void)
|
|
|
|
|
|
+static void __init mx31_3ds_timer_init(void)
|
|
{
|
|
{
|
|
mx31_clocks_init(26000000);
|
|
mx31_clocks_init(26000000);
|
|
}
|
|
}
|
|
|
|
|
|
-static struct sys_timer mx31pdk_timer = {
|
|
|
|
- .init = mx31pdk_timer_init,
|
|
|
|
|
|
+static struct sys_timer mx31_3ds_timer = {
|
|
|
|
+ .init = mx31_3ds_timer_init,
|
|
};
|
|
};
|
|
|
|
|
|
/*
|
|
/*
|
|
* The following uses standard kernel macros defined in arch.h in order to
|
|
* The following uses standard kernel macros defined in arch.h in order to
|
|
- * initialize __mach_desc_MX31PDK data structure.
|
|
|
|
|
|
+ * initialize __mach_desc_MX31_3DS data structure.
|
|
*/
|
|
*/
|
|
MACHINE_START(MX31_3DS, "Freescale MX31PDK (3DS)")
|
|
MACHINE_START(MX31_3DS, "Freescale MX31PDK (3DS)")
|
|
/* Maintainer: Freescale Semiconductor, Inc. */
|
|
/* Maintainer: Freescale Semiconductor, Inc. */
|
|
.phys_io = MX31_AIPS1_BASE_ADDR,
|
|
.phys_io = MX31_AIPS1_BASE_ADDR,
|
|
.io_pg_offst = (MX31_AIPS1_BASE_ADDR_VIRT >> 18) & 0xfffc,
|
|
.io_pg_offst = (MX31_AIPS1_BASE_ADDR_VIRT >> 18) & 0xfffc,
|
|
.boot_params = MX3x_PHYS_OFFSET + 0x100,
|
|
.boot_params = MX3x_PHYS_OFFSET + 0x100,
|
|
- .map_io = mx31pdk_map_io,
|
|
|
|
|
|
+ .map_io = mx31_3ds_map_io,
|
|
.init_irq = mx31_init_irq,
|
|
.init_irq = mx31_init_irq,
|
|
.init_machine = mxc_board_init,
|
|
.init_machine = mxc_board_init,
|
|
- .timer = &mx31pdk_timer,
|
|
|
|
|
|
+ .timer = &mx31_3ds_timer,
|
|
MACHINE_END
|
|
MACHINE_END
|