@@ -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, },
{ },
@@ -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),
};