This patch adds platform support for USB controller on DM6467 platform.  The
 patch sets up the clock, memory map, USB VBUS control logic.

 Signed-off-by: Swaminathan S <[email protected]>

---
 arch/arm/mach-davinci/board-dm646x-evm.c |   34 ++++++++++++++++++++++++++++++
 arch/arm/mach-davinci/dm646x.c           |    8 +++++++
 2 files changed, 42 insertions(+), 0 deletions(-)

diff --git a/arch/arm/mach-davinci/board-dm646x-evm.c 
b/arch/arm/mach-davinci/board-dm646x-evm.c
index 8c88fd0..c48b0a4 100644
--- a/arch/arm/mach-davinci/board-dm646x-evm.c
+++ b/arch/arm/mach-davinci/board-dm646x-evm.c
@@ -59,6 +59,7 @@
 /* CPLD Register 0 bits to control ATA */
 #define DM646X_EVM_ATA_RST             BIT(0)
 #define DM646X_EVM_ATA_PWD             BIT(1)
+#define DM646X_EVM_USB_VBUS            BIT(7)
 
 #define DM646X_EVM_PHY_MASK            (0x2)
 #define DM646X_EVM_MDIO_FREQUENCY      (2200000) /* PHY bus frequency */
@@ -80,10 +81,13 @@ static struct davinci_uart_config uart_config __initdata = {
        .enabled_uarts = (1 << 0),
 };
 
+struct i2c_client *cple_reg0_client;
+
 /* CPLD Register 0 Client: used for I/O Control */
 static int cpld_reg0_probe(struct i2c_client *client,
                           const struct i2c_device_id *id)
 {
+       cple_reg0_client = client;
        if (HAS_ATA) {
                u8 data;
                struct i2c_msg msg[2] = {
@@ -107,9 +111,39 @@ static int cpld_reg0_probe(struct i2c_client *client,
                i2c_transfer(client->adapter, msg + 1, 1);
        }
 
+       setup_usb(500, 8);
+
        return 0;
 }
 
+void usb_vbus_control(u8 on)
+{
+       u8 data;
+       struct i2c_msg msg[2] = {
+               {
+                       .addr = cple_reg0_client->addr,
+                       .flags = I2C_M_RD,
+                       .len = 1,
+                       .buf = &data,
+               },
+               {
+                       .addr = cple_reg0_client->addr,
+                       .flags = 0,
+                       .len = 1,
+                       .buf = &data,
+               },
+       };
+
+       i2c_transfer(cple_reg0_client->adapter, msg, 1);
+       if (on)
+               data |= DM646X_EVM_USB_VBUS;
+       else
+               data &= ~DM646X_EVM_USB_VBUS;
+
+       i2c_transfer(cple_reg0_client->adapter, msg + 1, 1);
+}
+EXPORT_SYMBOL(usb_vbus_control);
+
 static const struct i2c_device_id cpld_reg_ids[] = {
        { "cpld_reg0", 0, },
        { },
diff --git a/arch/arm/mach-davinci/dm646x.c b/arch/arm/mach-davinci/dm646x.c
index a9b20e5..633a25b 100644
--- a/arch/arm/mach-davinci/dm646x.c
+++ b/arch/arm/mach-davinci/dm646x.c
@@ -315,6 +315,13 @@ static struct clk vpif1_clk = {
        .flags = ALWAYS_ENABLED,
 };
 
+static struct clk usb_clk = {
+       .name = "usb",
+       .parent = &pll1_sysclk3,
+       .lpsc = DAVINCI_LPSC_USB,
+       .flags = ALWAYS_ENABLED,
+};
+
 struct davinci_clk dm646x_clks[] = {
        CLK(NULL, "ref", &ref_clk),
        CLK(NULL, "aux", &aux_clkin),
@@ -355,6 +362,7 @@ struct davinci_clk dm646x_clks[] = {
        CLK("palm_bk3710", NULL, &ide_clk),
        CLK(NULL, "vpif0", &vpif0_clk),
        CLK(NULL, "vpif1", &vpif1_clk),
+       CLK(NULL, "usb", &usb_clk),
        CLK(NULL, NULL, NULL),
 };
 
-- 
1.6.0.rc1.64.g61192

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

Reply via email to