linux/arch/arm/mach-davinci/usb.c
<<
>>
Prefs
   1/*
   2 * USB
   3 */
   4#include <linux/init.h>
   5#include <linux/platform_device.h>
   6#include <linux/dma-mapping.h>
   7
   8#include <linux/usb/musb.h>
   9
  10#include <mach/common.h>
  11#include <mach/irqs.h>
  12#include <mach/cputype.h>
  13#include <mach/da8xx.h>
  14#include <linux/platform_data/usb-davinci.h>
  15
  16#define DAVINCI_USB_OTG_BASE    0x01c64000
  17
  18#define DA8XX_USB0_BASE         0x01e00000
  19#define DA8XX_USB1_BASE         0x01e25000
  20
  21#if IS_ENABLED(CONFIG_USB_MUSB_HDRC)
  22static struct musb_hdrc_eps_bits musb_eps[] = {
  23        { "ep1_tx", 8, },
  24        { "ep1_rx", 8, },
  25        { "ep2_tx", 8, },
  26        { "ep2_rx", 8, },
  27        { "ep3_tx", 5, },
  28        { "ep3_rx", 5, },
  29        { "ep4_tx", 5, },
  30        { "ep4_rx", 5, },
  31};
  32
  33static struct musb_hdrc_config musb_config = {
  34        .multipoint     = true,
  35        .dyn_fifo       = true,
  36        .soft_con       = true,
  37        .dma            = true,
  38
  39        .num_eps        = 5,
  40        .dma_channels   = 8,
  41        .ram_bits       = 10,
  42        .eps_bits       = musb_eps,
  43};
  44
  45static struct musb_hdrc_platform_data usb_data = {
  46        /* OTG requires a Mini-AB connector */
  47        .mode           = MUSB_OTG,
  48        .clock          = "usb",
  49        .config         = &musb_config,
  50};
  51
  52static struct resource usb_resources[] = {
  53        {
  54                /* physical address */
  55                .start          = DAVINCI_USB_OTG_BASE,
  56                .end            = DAVINCI_USB_OTG_BASE + 0x5ff,
  57                .flags          = IORESOURCE_MEM,
  58        },
  59        {
  60                .start          = IRQ_USBINT,
  61                .flags          = IORESOURCE_IRQ,
  62                .name           = "mc"
  63        },
  64        {
  65                /* placeholder for the dedicated CPPI IRQ */
  66                .flags          = IORESOURCE_IRQ,
  67                .name           = "dma"
  68        },
  69};
  70
  71static u64 usb_dmamask = DMA_BIT_MASK(32);
  72
  73static struct platform_device usb_dev = {
  74        .name           = "musb-davinci",
  75        .id             = -1,
  76        .dev = {
  77                .platform_data          = &usb_data,
  78                .dma_mask               = &usb_dmamask,
  79                .coherent_dma_mask      = DMA_BIT_MASK(32),
  80        },
  81        .resource       = usb_resources,
  82        .num_resources  = ARRAY_SIZE(usb_resources),
  83};
  84
  85void __init davinci_setup_usb(unsigned mA, unsigned potpgt_ms)
  86{
  87        usb_data.power = mA > 510 ? 255 : mA / 2;
  88        usb_data.potpgt = (potpgt_ms + 1) / 2;
  89
  90        if (cpu_is_davinci_dm646x()) {
  91                /* Override the defaults as DM6467 uses different IRQs. */
  92                usb_dev.resource[1].start = IRQ_DM646X_USBINT;
  93                usb_dev.resource[2].start = IRQ_DM646X_USBDMAINT;
  94        } else  /* other devices don't have dedicated CPPI IRQ */
  95                usb_dev.num_resources = 2;
  96
  97        platform_device_register(&usb_dev);
  98}
  99
 100#ifdef CONFIG_ARCH_DAVINCI_DA8XX
 101static struct resource da8xx_usb20_resources[] = {
 102        {
 103                .start          = DA8XX_USB0_BASE,
 104                .end            = DA8XX_USB0_BASE + SZ_64K - 1,
 105                .flags          = IORESOURCE_MEM,
 106        },
 107        {
 108                .start          = IRQ_DA8XX_USB_INT,
 109                .flags          = IORESOURCE_IRQ,
 110                .name           = "mc",
 111        },
 112};
 113
 114int __init da8xx_register_usb20(unsigned mA, unsigned potpgt)
 115{
 116        usb_data.clock  = "usb20";
 117        usb_data.power  = mA > 510 ? 255 : mA / 2;
 118        usb_data.potpgt = (potpgt + 1) / 2;
 119
 120        usb_dev.resource = da8xx_usb20_resources;
 121        usb_dev.num_resources = ARRAY_SIZE(da8xx_usb20_resources);
 122        usb_dev.name = "musb-da8xx";
 123
 124        return platform_device_register(&usb_dev);
 125}
 126#endif  /* CONFIG_DAVINCI_DA8XX */
 127
 128#else
 129
 130void __init davinci_setup_usb(unsigned mA, unsigned potpgt_ms)
 131{
 132}
 133
 134#ifdef CONFIG_ARCH_DAVINCI_DA8XX
 135int __init da8xx_register_usb20(unsigned mA, unsigned potpgt)
 136{
 137        return 0;
 138}
 139#endif
 140
 141#endif  /* CONFIG_USB_MUSB_HDRC */
 142
 143#ifdef  CONFIG_ARCH_DAVINCI_DA8XX
 144static struct resource da8xx_usb11_resources[] = {
 145        [0] = {
 146                .start  = DA8XX_USB1_BASE,
 147                .end    = DA8XX_USB1_BASE + SZ_4K - 1,
 148                .flags  = IORESOURCE_MEM,
 149        },
 150        [1] = {
 151                .start  = IRQ_DA8XX_IRQN,
 152                .end    = IRQ_DA8XX_IRQN,
 153                .flags  = IORESOURCE_IRQ,
 154        },
 155};
 156
 157static u64 da8xx_usb11_dma_mask = DMA_BIT_MASK(32);
 158
 159static struct platform_device da8xx_usb11_device = {
 160        .name           = "ohci",
 161        .id             = 0,
 162        .dev = {
 163                .dma_mask               = &da8xx_usb11_dma_mask,
 164                .coherent_dma_mask      = DMA_BIT_MASK(32),
 165        },
 166        .num_resources  = ARRAY_SIZE(da8xx_usb11_resources),
 167        .resource       = da8xx_usb11_resources,
 168};
 169
 170int __init da8xx_register_usb11(struct da8xx_ohci_root_hub *pdata)
 171{
 172        da8xx_usb11_device.dev.platform_data = pdata;
 173        return platform_device_register(&da8xx_usb11_device);
 174}
 175#endif  /* CONFIG_DAVINCI_DA8XX */
 176