Merge branch 'omap-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tmlind...
[sfrench/cifs-2.6.git] / arch / arm / mach-omap2 / board-am3517evm.c
index fada04ea1d5cf3a2356753063d11318c8aebd8fd..07399505312b19fac8331d1d0b5367e85418a422 100644 (file)
@@ -18,6 +18,7 @@
 
 #include <linux/kernel.h>
 #include <linux/init.h>
+#include <linux/clk.h>
 #include <linux/platform_device.h>
 #include <linux/gpio.h>
 #include <linux/i2c/pca953x.h>
 #include "mux.h"
 #include "control.h"
 
-#define AM35XX_EVM_PHY_MASK            (0xF)
 #define AM35XX_EVM_MDIO_FREQUENCY      (1000000)
 
+static struct mdio_platform_data am3517_evm_mdio_pdata = {
+       .bus_freq       = AM35XX_EVM_MDIO_FREQUENCY,
+};
+
+static struct resource am3517_mdio_resources[] = {
+       {
+               .start  = AM35XX_IPSS_EMAC_BASE + AM35XX_EMAC_MDIO_OFFSET,
+               .end    = AM35XX_IPSS_EMAC_BASE + AM35XX_EMAC_MDIO_OFFSET +
+                         SZ_4K - 1,
+               .flags  = IORESOURCE_MEM,
+       },
+};
+
+static struct platform_device am3517_mdio_device = {
+       .name           = "davinci_mdio",
+       .id             = 0,
+       .num_resources  = ARRAY_SIZE(am3517_mdio_resources),
+       .resource       = am3517_mdio_resources,
+       .dev.platform_data = &am3517_evm_mdio_pdata,
+};
+
 static struct emac_platform_data am3517_evm_emac_pdata = {
-       .phy_mask       = AM35XX_EVM_PHY_MASK,
-       .mdio_max_freq  = AM35XX_EVM_MDIO_FREQUENCY,
        .rmii_en        = 1,
 };
 
 static struct resource am3517_emac_resources[] = {
        {
                .start  = AM35XX_IPSS_EMAC_BASE,
-               .end    = AM35XX_IPSS_EMAC_BASE + 0x3FFFF,
+               .end    = AM35XX_IPSS_EMAC_BASE + 0x2FFFF,
                .flags  = IORESOURCE_MEM,
        },
        {
@@ -113,7 +132,6 @@ static void am3517_evm_ethernet_init(struct emac_platform_data *pdata)
        pdata->ctrl_reg_offset          = AM35XX_EMAC_CNTRL_OFFSET;
        pdata->ctrl_mod_reg_offset      = AM35XX_EMAC_CNTRL_MOD_OFFSET;
        pdata->ctrl_ram_offset          = AM35XX_EMAC_CNTRL_RAM_OFFSET;
-       pdata->mdio_reg_offset          = AM35XX_EMAC_MDIO_OFFSET;
        pdata->ctrl_ram_size            = AM35XX_EMAC_CNTRL_RAM_SIZE;
        pdata->version                  = EMAC_VERSION_2;
        pdata->hw_ram_addr              = AM35XX_EMAC_HW_RAM_ADDR;
@@ -121,6 +139,9 @@ static void am3517_evm_ethernet_init(struct emac_platform_data *pdata)
        pdata->interrupt_disable        = am3517_disable_ethernet_int;
        am3517_emac_device.dev.platform_data    = pdata;
        platform_device_register(&am3517_emac_device);
+       platform_device_register(&am3517_mdio_device);
+       clk_add_alias(NULL, dev_name(&am3517_mdio_device.dev),
+                     NULL, &am3517_emac_device.dev);
 
        regval = omap_ctrl_readl(AM35XX_CONTROL_IP_SW_RESET);
        regval = regval & (~(AM35XX_CPGMACSS_SW_RST));
@@ -374,6 +395,31 @@ static void __init am3517_evm_init_irq(void)
        omap_gpio_init();
 }
 
+static struct omap_musb_board_data musb_board_data = {
+       .interface_type         = MUSB_INTERFACE_ULPI,
+       .mode                   = MUSB_OTG,
+       .power                  = 500,
+};
+
+static __init void am3517_evm_musb_init(void)
+{
+       u32 devconf2;
+
+       /*
+        * Set up USB clock/mode in the DEVCONF2 register.
+        */
+       devconf2 = omap_ctrl_readl(AM35XX_CONTROL_DEVCONF2);
+
+       /* USB2.0 PHY reference clock is 13 MHz */
+       devconf2 &= ~(CONF2_REFFREQ | CONF2_OTGMODE | CONF2_PHY_GPIOMODE);
+       devconf2 |=  CONF2_REFFREQ_13MHZ | CONF2_SESENDEN | CONF2_VBDTCTEN
+                       | CONF2_DATPOL;
+
+       omap_ctrl_writel(devconf2, AM35XX_CONTROL_DEVCONF2);
+
+       usb_musb_init(&musb_board_data);
+}
+
 static const struct ehci_hcd_omap_platform_data ehci_pdata __initconst = {
        .port_mode[0] = EHCI_HCD_OMAP_MODE_PHY,
 #if defined(CONFIG_PANEL_SHARP_LQ043T1DG01) || \
@@ -392,6 +438,8 @@ static const struct ehci_hcd_omap_platform_data ehci_pdata __initconst = {
 
 #ifdef CONFIG_OMAP_MUX
 static struct omap_board_mux board_mux[] __initdata = {
+       /* USB OTG DRVVBUS offset = 0x212 */
+       OMAP3_MUX(SAD2D_MCAD23, OMAP_MUX_MODE0 | OMAP_PIN_INPUT_PULLDOWN),
        { .reg_offset = OMAP_MUX_TERMINATOR },
 };
 #else
@@ -458,11 +506,12 @@ static void __init am3517_evm_init(void)
                                ARRAY_SIZE(am3517evm_i2c1_boardinfo));
        /*Ethernet*/
        am3517_evm_ethernet_init(&am3517_evm_emac_pdata);
+
+       /* MUSB */
+       am3517_evm_musb_init();
 }
 
 MACHINE_START(OMAP3517EVM, "OMAP3517/AM3517 EVM")
-       .phys_io        = 0x48000000,
-       .io_pg_offst    = ((0xd8000000) >> 18) & 0xfffc,
        .boot_params    = 0x80000100,
        .map_io         = omap3_map_io,
        .reserve        = omap_reserve,