This patch depends on "Add clock info and update mux setup for ATA" patch
submitted earlier.

An I2C driver is added for controlling the CPLD register 0, which drives
ATA_RSTn and ATA_PWD.

Signed-off-by: Hemant Pedanekar <[email protected]>
---
 arch/arm/mach-davinci/board-dm646x-evm.c |  102 ++++++++++++++++++++++++++++++
 1 files changed, 102 insertions(+), 0 deletions(-)

diff --git a/arch/arm/mach-davinci/board-dm646x-evm.c 
b/arch/arm/mach-davinci/board-dm646x-evm.c
index 575c6ca..99382d8 100644
--- a/arch/arm/mach-davinci/board-dm646x-evm.c
+++ b/arch/arm/mach-davinci/board-dm646x-evm.c
@@ -44,6 +44,7 @@
 #include <mach/common.h>
 #include <mach/psc.h>
 #include <mach/serial.h>
+#include <mach/mux.h>
 #include <mach/i2c.h>
 #include <mach/mmc.h>
 #include <mach/emac.h>
@@ -52,10 +53,88 @@
 #define DM646X_EVM_PHY_MASK            (0x2)
 #define DM646X_EVM_MDIO_FREQUENCY      (2200000) /* PHY bus frequency */
 
+#define DAVINCI_CFC_ATA_BASE           0x01C66000
+
 static struct davinci_uart_config uart_config __initdata = {
        .enabled_uarts = (1 << 0),
 };
 
+static struct resource ide_resources[] = {
+       {
+               .start          = DAVINCI_CFC_ATA_BASE,
+               .end            = DAVINCI_CFC_ATA_BASE + 0x7ff,
+               .flags          = IORESOURCE_MEM,
+       },
+       {
+               .start          = IRQ_DM646X_IDE,
+               .end            = IRQ_DM646X_IDE,
+               .flags          = IORESOURCE_IRQ,
+       },
+};
+
+static u64 ide_dma_mask = DMA_BIT_MASK(32);
+
+static struct platform_device ide_dev = {
+       .name           = "palm_bk3710",
+       .id             = -1,
+       .resource       = ide_resources,
+       .num_resources  = ARRAY_SIZE(ide_resources),
+       .dev = {
+               .dma_mask               = &ide_dma_mask,
+               .coherent_dma_mask      = DMA_BIT_MASK(32),
+       },
+};
+
+/* CPLD Register 0: used for I/O Control */
+static struct i2c_client *cpld_reg0_client;
+
+static int cpld_reg0_probe(struct i2c_client *client,
+               const struct i2c_device_id *id)
+{
+       char data;
+       struct i2c_msg msg[2] = {
+               {
+                       .addr = client->addr,
+                       .flags = I2C_M_RD,
+                       .len = 1,
+                       .buf = &data,
+               },
+               {
+                       .addr = client->addr,
+                       .flags = 0,
+                       .len = 1,
+                       .buf = (void __force *)&data,
+               },
+       };
+
+       cpld_reg0_client = client;
+
+       /* Control on-board CPLD to enable ATA */
+       i2c_transfer(cpld_reg0_client->adapter, msg, 1);
+       data &= ~3;
+       i2c_transfer(cpld_reg0_client->adapter, msg + 1, 1);
+
+       return 0;
+}
+
+static int cpld_reg0_remove(struct i2c_client *client)
+{
+       cpld_reg0_client = NULL;
+       return 0;
+}
+
+static const struct i2c_device_id cpld_reg_ids[] = {
+       { "cpld_reg0", 0, },
+       { /* end of list */ },
+};
+
+static struct i2c_driver dm6467evm_cpld_driver = {
+       .driver.name    = "cpld_reg0",
+       .id_table       = cpld_reg_ids,
+       .probe          = cpld_reg0_probe,
+       .remove         = cpld_reg0_remove,
+};
+
 /* LEDS */
 
 static struct gpio_led evm_leds[] = {
@@ -247,6 +326,9 @@ static struct i2c_board_info __initdata i2c_info[] =  {
                I2C_BOARD_INFO("pcf8574a", 0x38),
                .platform_data  = &pcf_data,
        },
+       {
+               I2C_BOARD_INFO("cpld_reg0", 0x3a),
+       },
 };
 
 static struct davinci_i2c_platform_data i2c_pdata = {
@@ -257,6 +339,7 @@ static struct davinci_i2c_platform_data i2c_pdata = {
 static void __init evm_init_i2c(void)
 {
        davinci_init_i2c(&i2c_pdata);
+       i2c_add_driver(&dm6467evm_cpld_driver);
        i2c_register_board_info(1, i2c_info, ARRAY_SIZE(i2c_info));
 }
 
@@ -265,6 +348,20 @@ static void __init davinci_map_io(void)
        dm646x_init();
 }
 
+#if defined(CONFIG_IDE) || \
+    defined(CONFIG_IDE_MODULE)
+#define HAS_ATA 1
+#else
+#define HAS_ATA 0
+#endif
+
+#if defined(CONFIG_BLK_DEV_PALMCHIP_BK3710) || \
+    defined(CONFIG_BLK_DEV_PALMCHIP_BK3710_MODULE)
+#define HAS_ATA 1
+#else
+#define HAS_ATA 0
+#endif
+
 static __init void evm_init(void)
 {
        struct davinci_soc_info *soc_info = &davinci_soc_info;
@@ -274,6 +371,11 @@ static __init void evm_init(void)
        dm646x_init_mcasp0(&dm646x_evm_snd_data[0]);
        dm646x_init_mcasp1(&dm646x_evm_snd_data[1]);
 
+       if (HAS_ATA) {
+               davinci_cfg_reg(DM646X_ATAEN);
+               platform_device_register(&ide_dev);
+       }
+
        soc_info->emac_pdata->phy_mask = DM646X_EVM_PHY_MASK;
        soc_info->emac_pdata->mdio_max_freq = DM646X_EVM_MDIO_FREQUENCY;
 }
-- 
1.6.2.4

_______________________________________________
Davinci-linux-open-source mailing list
[email protected]
http://linux.davincidsp.com/mailman/listinfo/davinci-linux-open-source

Reply via email to