diff mbox

[v3] davinci: dm646x-evm: Add support for IDE

Message ID 1247853636-14417-1-git-send-email-hemantp@ti.com (mailing list archive)
State Accepted
Headers show

Commit Message

Hemant Pedanekar July 17, 2009, 6 p.m. UTC
Controls ATA_RSTn and ATA_PWD through CPLD register 0 to enable ATA. An I2C
driver is added for the same. Calls ide init if enabled in configuration.

Signed-off-by: Hemant Pedanekar <hemantp@ti.com>
---
 arch/arm/mach-davinci/board-dm646x-evm.c |   59 ++++++++++++++++++++++++++++++
 1 files changed, 59 insertions(+), 0 deletions(-)

Comments

Kevin Hilman July 17, 2009, 9:16 p.m. UTC | #1
Hemant Pedanekar <hemantp@ti.com> writes:

> Controls ATA_RSTn and ATA_PWD through CPLD register 0 to enable ATA. An I2C
> driver is added for the same. Calls ide init if enabled in configuration.
>
> Signed-off-by: Hemant Pedanekar <hemantp@ti.com>

This one looks good.  Pushing today.

Kevin

> ---
>  arch/arm/mach-davinci/board-dm646x-evm.c |   59 ++++++++++++++++++++++++++++++
>  1 files changed, 59 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..206cb5a 100644
> --- a/arch/arm/mach-davinci/board-dm646x-evm.c
> +++ b/arch/arm/mach-davinci/board-dm646x-evm.c
> @@ -49,6 +49,17 @@
>  #include <mach/emac.h>
>  #include <mach/common.h>
>  
> +#if defined(CONFIG_BLK_DEV_PALMCHIP_BK3710) || \
> +    defined(CONFIG_BLK_DEV_PALMCHIP_BK3710_MODULE)
> +#define HAS_ATA 1
> +#else
> +#define HAS_ATA 0
> +#endif
> +
> +/* CPLD Register 0 bits to control ATA */
> +#define DM646X_EVM_ATA_RST		BIT(0)
> +#define DM646X_EVM_ATA_PWD		BIT(1)
> +
>  #define DM646X_EVM_PHY_MASK		(0x2)
>  #define DM646X_EVM_MDIO_FREQUENCY	(2200000) /* PHY bus frequency */
>  
> @@ -56,6 +67,47 @@ static struct davinci_uart_config uart_config __initdata = {
>  	.enabled_uarts = (1 << 0),
>  };
>  
> +/* CPLD Register 0 Client: used for I/O Control */
> +static int cpld_reg0_probe(struct i2c_client *client,
> +			const struct i2c_device_id *id)
> +{
> +	if (HAS_ATA) {
> +		u8 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 = &data,
> +			},
> +		};
> +
> +		/* Clear ATA_RSTn and ATA_PWD bits to enable ATA operation. */
> +		i2c_transfer(client->adapter, msg, 1);
> +		data &= ~(DM646X_EVM_ATA_RST | DM646X_EVM_ATA_PWD);
> +		i2c_transfer(client->adapter, msg + 1, 1);
> +	}
> +
> +	return 0;
> +}
> +
> +static const struct i2c_device_id cpld_reg_ids[] = {
> +	{ "cpld_reg0", 0, },
> +	{ },
> +};
> +
> +static struct i2c_driver dm6467evm_cpld_driver = {
> +	.driver.name	= "cpld_reg0",
> +	.id_table	= cpld_reg_ids,
> +	.probe		= cpld_reg0_probe,
> +};
> +
>  /* LEDS */
>  
>  static struct gpio_led evm_leds[] = {
> @@ -247,6 +299,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 +312,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));
>  }
>  
> @@ -274,6 +330,9 @@ 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)
> +		dm646x_init_ide();
> +
>  	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
> Davinci-linux-open-source@linux.davincidsp.com
> http://linux.davincidsp.com/mailman/listinfo/davinci-linux-open-source
diff mbox

Patch

diff --git a/arch/arm/mach-davinci/board-dm646x-evm.c b/arch/arm/mach-davinci/board-dm646x-evm.c
index 575c6ca..206cb5a 100644
--- a/arch/arm/mach-davinci/board-dm646x-evm.c
+++ b/arch/arm/mach-davinci/board-dm646x-evm.c
@@ -49,6 +49,17 @@ 
 #include <mach/emac.h>
 #include <mach/common.h>
 
+#if defined(CONFIG_BLK_DEV_PALMCHIP_BK3710) || \
+    defined(CONFIG_BLK_DEV_PALMCHIP_BK3710_MODULE)
+#define HAS_ATA 1
+#else
+#define HAS_ATA 0
+#endif
+
+/* CPLD Register 0 bits to control ATA */
+#define DM646X_EVM_ATA_RST		BIT(0)
+#define DM646X_EVM_ATA_PWD		BIT(1)
+
 #define DM646X_EVM_PHY_MASK		(0x2)
 #define DM646X_EVM_MDIO_FREQUENCY	(2200000) /* PHY bus frequency */
 
@@ -56,6 +67,47 @@  static struct davinci_uart_config uart_config __initdata = {
 	.enabled_uarts = (1 << 0),
 };
 
+/* CPLD Register 0 Client: used for I/O Control */
+static int cpld_reg0_probe(struct i2c_client *client,
+			const struct i2c_device_id *id)
+{
+	if (HAS_ATA) {
+		u8 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 = &data,
+			},
+		};
+
+		/* Clear ATA_RSTn and ATA_PWD bits to enable ATA operation. */
+		i2c_transfer(client->adapter, msg, 1);
+		data &= ~(DM646X_EVM_ATA_RST | DM646X_EVM_ATA_PWD);
+		i2c_transfer(client->adapter, msg + 1, 1);
+	}
+
+	return 0;
+}
+
+static const struct i2c_device_id cpld_reg_ids[] = {
+	{ "cpld_reg0", 0, },
+	{ },
+};
+
+static struct i2c_driver dm6467evm_cpld_driver = {
+	.driver.name	= "cpld_reg0",
+	.id_table	= cpld_reg_ids,
+	.probe		= cpld_reg0_probe,
+};
+
 /* LEDS */
 
 static struct gpio_led evm_leds[] = {
@@ -247,6 +299,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 +312,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));
 }
 
@@ -274,6 +330,9 @@  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)
+		dm646x_init_ide();
+
 	soc_info->emac_pdata->phy_mask = DM646X_EVM_PHY_MASK;
 	soc_info->emac_pdata->mdio_max_freq = DM646X_EVM_MDIO_FREQUENCY;
 }