diff mbox

[v2,2/2] davinci: dm646x-evm: Add support for IDE

Message ID 1247148813-16412-1-git-send-email-hemantp@ti.com (mailing list archive)
State Rejected
Headers show

Commit Message

Hemant Pedanekar July 9, 2009, 2:13 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 |   69 ++++++++++++++++++++++++++++++
 1 files changed, 69 insertions(+), 0 deletions(-)

Comments

Kevin Hilman July 15, 2009, 11:12 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>
> ---
>  arch/arm/mach-davinci/board-dm646x-evm.c |   69 ++++++++++++++++++++++++++++++
>  1 files changed, 69 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..86419fb 100644
> --- a/arch/arm/mach-davinci/board-dm646x-evm.c
> +++ b/arch/arm/mach-davinci/board-dm646x-evm.c
> @@ -49,6 +49,13 @@
>  #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
> +
>  #define DM646X_EVM_PHY_MASK		(0x2)
>  #define DM646X_EVM_MDIO_FREQUENCY	(2200000) /* PHY bus frequency */
>  
> @@ -56,6 +63,61 @@ static struct davinci_uart_config uart_config __initdata = {
>  	.enabled_uarts = (1 << 0),
>  };
>  
> +/* CPLD Register 0: used for I/O Control */
> +static struct i2c_client *cpld_reg0_client;

Why do you need this global?  It's only used in _probe (then set to
NULL in _remove)

I suggest dropping it and just using 'client' in _probe.

> +static int cpld_reg0_probe(struct i2c_client *client,
> +		const struct i2c_device_id *id)

alignment

> +{
> +	cpld_reg0_client = client;
> +	if (HAS_ATA) {
> +		u8 data;
> +		struct i2c_msg msg[2] = {
> +			{
> +				.addr = cpld_reg0_client->addr,
> +				.flags = I2C_M_RD,
> +				.len = 1,
> +				.buf = &data,
> +			},
> +			{
> +				.addr = cpld_reg0_client->addr,
> +				.flags = 0,
> +				.len = 1,
> +				.buf = &data,
> +			},
> +		};
> +
> +		/*
> +		 * Set ATA_RSTn (bit-0) and ATA_PWD (bit-1) to '0' for ATA

Can you define these as BIT(x) values...

> +		 * operation.
> +		 */
> +		i2c_transfer(cpld_reg0_client->adapter, msg, 1);
> +		data &= ~3;

then use them here instad of hard-coded constant.

> +		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;
> +}

with global var gone, you can drop _remove hook

Kevin
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..86419fb 100644
--- a/arch/arm/mach-davinci/board-dm646x-evm.c
+++ b/arch/arm/mach-davinci/board-dm646x-evm.c
@@ -49,6 +49,13 @@ 
 #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
+
 #define DM646X_EVM_PHY_MASK		(0x2)
 #define DM646X_EVM_MDIO_FREQUENCY	(2200000) /* PHY bus frequency */
 
@@ -56,6 +63,61 @@  static struct davinci_uart_config uart_config __initdata = {
 	.enabled_uarts = (1 << 0),
 };
 
+/* 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)
+{
+	cpld_reg0_client = client;
+
+	if (HAS_ATA) {
+		u8 data;
+		struct i2c_msg msg[2] = {
+			{
+				.addr = cpld_reg0_client->addr,
+				.flags = I2C_M_RD,
+				.len = 1,
+				.buf = &data,
+			},
+			{
+				.addr = cpld_reg0_client->addr,
+				.flags = 0,
+				.len = 1,
+				.buf = &data,
+			},
+		};
+
+		/*
+		 * Set ATA_RSTn (bit-0) and ATA_PWD (bit-1) to '0' for ATA
+		 * operation.
+		 */
+		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, },
+	{ },
+};
+
+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 +309,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 +322,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 +340,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;
 }