|
@@ -99,3 +99,140 @@ static void __iomem *cpld;
|
|
* 2 GByte Micron NAND (MT29F16G08FAA) using 128KB sectors. If you
|
|
* 2 GByte Micron NAND (MT29F16G08FAA) using 128KB sectors. If you
|
|
* swap chips with a different block size, partitioning will
|
|
* swap chips with a different block size, partitioning will
|
|
* need to be changed. This NAND chip MT29F16G08FAA is the default
|
|
* need to be changed. This NAND chip MT29F16G08FAA is the default
|
|
|
|
+ * NAND shipped with the Spectrum Digital DM365 EVM
|
|
|
|
+ */
|
|
|
|
+#define NAND_BLOCK_SIZE SZ_128K
|
|
|
|
+
|
|
|
|
+static struct mtd_partition davinci_nand_partitions[] = {
|
|
|
|
+ {
|
|
|
|
+ /* UBL (a few copies) plus U-Boot */
|
|
|
|
+ .name = "bootloader",
|
|
|
|
+ .offset = 0,
|
|
|
|
+ .size = 30 * NAND_BLOCK_SIZE,
|
|
|
|
+ .mask_flags = MTD_WRITEABLE, /* force read-only */
|
|
|
|
+ }, {
|
|
|
|
+ /* U-Boot environment */
|
|
|
|
+ .name = "params",
|
|
|
|
+ .offset = MTDPART_OFS_APPEND,
|
|
|
|
+ .size = 2 * NAND_BLOCK_SIZE,
|
|
|
|
+ .mask_flags = 0,
|
|
|
|
+ }, {
|
|
|
|
+ .name = "kernel",
|
|
|
|
+ .offset = MTDPART_OFS_APPEND,
|
|
|
|
+ .size = SZ_4M,
|
|
|
|
+ .mask_flags = 0,
|
|
|
|
+ }, {
|
|
|
|
+ .name = "filesystem1",
|
|
|
|
+ .offset = MTDPART_OFS_APPEND,
|
|
|
|
+ .size = SZ_512M,
|
|
|
|
+ .mask_flags = 0,
|
|
|
|
+ }, {
|
|
|
|
+ .name = "filesystem2",
|
|
|
|
+ .offset = MTDPART_OFS_APPEND,
|
|
|
|
+ .size = MTDPART_SIZ_FULL,
|
|
|
|
+ .mask_flags = 0,
|
|
|
|
+ }
|
|
|
|
+ /* two blocks with bad block table (and mirror) at the end */
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+static struct davinci_nand_pdata davinci_nand_data = {
|
|
|
|
+ .mask_chipsel = BIT(14),
|
|
|
|
+ .parts = davinci_nand_partitions,
|
|
|
|
+ .nr_parts = ARRAY_SIZE(davinci_nand_partitions),
|
|
|
|
+ .ecc_mode = NAND_ECC_HW,
|
|
|
|
+ .bbt_options = NAND_BBT_USE_FLASH,
|
|
|
|
+ .ecc_bits = 4,
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+static struct resource davinci_nand_resources[] = {
|
|
|
|
+ {
|
|
|
|
+ .start = DM365_ASYNC_EMIF_DATA_CE0_BASE,
|
|
|
|
+ .end = DM365_ASYNC_EMIF_DATA_CE0_BASE + SZ_32M - 1,
|
|
|
|
+ .flags = IORESOURCE_MEM,
|
|
|
|
+ }, {
|
|
|
|
+ .start = DM365_ASYNC_EMIF_CONTROL_BASE,
|
|
|
|
+ .end = DM365_ASYNC_EMIF_CONTROL_BASE + SZ_4K - 1,
|
|
|
|
+ .flags = IORESOURCE_MEM,
|
|
|
|
+ },
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+static struct platform_device davinci_nand_device = {
|
|
|
|
+ .name = "davinci_nand",
|
|
|
|
+ .id = 0,
|
|
|
|
+ .num_resources = ARRAY_SIZE(davinci_nand_resources),
|
|
|
|
+ .resource = davinci_nand_resources,
|
|
|
|
+ .dev = {
|
|
|
|
+ .platform_data = &davinci_nand_data,
|
|
|
|
+ },
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+static struct at24_platform_data eeprom_info = {
|
|
|
|
+ .byte_len = (256*1024) / 8,
|
|
|
|
+ .page_size = 64,
|
|
|
|
+ .flags = AT24_FLAG_ADDR16,
|
|
|
|
+ .setup = davinci_get_mac_addr,
|
|
|
|
+ .context = (void *)0x7f00,
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+static struct snd_platform_data dm365_evm_snd_data = {
|
|
|
|
+ .asp_chan_q = EVENTQ_3,
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+static struct i2c_board_info i2c_info[] = {
|
|
|
|
+ {
|
|
|
|
+ I2C_BOARD_INFO("24c256", 0x50),
|
|
|
|
+ .platform_data = &eeprom_info,
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ I2C_BOARD_INFO("tlv320aic3x", 0x18),
|
|
|
|
+ },
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+static struct davinci_i2c_platform_data i2c_pdata = {
|
|
|
|
+ .bus_freq = 400 /* kHz */,
|
|
|
|
+ .bus_delay = 0 /* usec */,
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+static int dm365evm_keyscan_enable(struct device *dev)
|
|
|
|
+{
|
|
|
|
+ return davinci_cfg_reg(DM365_KEYSCAN);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static unsigned short dm365evm_keymap[] = {
|
|
|
|
+ KEY_KP2,
|
|
|
|
+ KEY_LEFT,
|
|
|
|
+ KEY_EXIT,
|
|
|
|
+ KEY_DOWN,
|
|
|
|
+ KEY_ENTER,
|
|
|
|
+ KEY_UP,
|
|
|
|
+ KEY_KP1,
|
|
|
|
+ KEY_RIGHT,
|
|
|
|
+ KEY_MENU,
|
|
|
|
+ KEY_RECORD,
|
|
|
|
+ KEY_REWIND,
|
|
|
|
+ KEY_KPMINUS,
|
|
|
|
+ KEY_STOP,
|
|
|
|
+ KEY_FASTFORWARD,
|
|
|
|
+ KEY_KPPLUS,
|
|
|
|
+ KEY_PLAYPAUSE,
|
|
|
|
+ 0
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+static struct davinci_ks_platform_data dm365evm_ks_data = {
|
|
|
|
+ .device_enable = dm365evm_keyscan_enable,
|
|
|
|
+ .keymap = dm365evm_keymap,
|
|
|
|
+ .keymapsize = ARRAY_SIZE(dm365evm_keymap),
|
|
|
|
+ .rep = 1,
|
|
|
|
+ /* Scan period = strobe + interval */
|
|
|
|
+ .strobe = 0x5,
|
|
|
|
+ .interval = 0x2,
|
|
|
|
+ .matrix_type = DAVINCI_KEYSCAN_MATRIX_4X4,
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+static int cpld_mmc_get_cd(int module)
|
|
|
|
+{
|
|
|
|
+ if (!cpld)
|
|
|
|
+ return -ENXIO;
|
|
|
|
+
|
|
|
|
+ /* low == card present */
|
|
|
|
+ return !(__raw_readb(cpld + CPLD_CARDSTAT) & BIT(module ? 4 : 0));
|