• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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)
22 static 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 
33 static 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 
45 static 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 
52 static 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 
71 static u64 usb_dmamask = DMA_BIT_MASK(32);
72 
73 static 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 
davinci_setup_usb(unsigned mA,unsigned potpgt_ms)85 void __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
101 static 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 
da8xx_register_usb20(unsigned mA,unsigned potpgt)114 int __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 
davinci_setup_usb(unsigned mA,unsigned potpgt_ms)130 void __init davinci_setup_usb(unsigned mA, unsigned potpgt_ms)
131 {
132 }
133 
134 #ifdef CONFIG_ARCH_DAVINCI_DA8XX
da8xx_register_usb20(unsigned mA,unsigned potpgt)135 int __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
144 static 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 
157 static u64 da8xx_usb11_dma_mask = DMA_BIT_MASK(32);
158 
159 static 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 
da8xx_register_usb11(struct da8xx_ohci_root_hub * pdata)170 int __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