18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci * USB
48c2ecf20Sopenharmony_ci */
58c2ecf20Sopenharmony_ci#include <linux/dma-mapping.h>
68c2ecf20Sopenharmony_ci#include <linux/init.h>
78c2ecf20Sopenharmony_ci#include <linux/platform_device.h>
88c2ecf20Sopenharmony_ci#include <linux/platform_data/usb-davinci.h>
98c2ecf20Sopenharmony_ci#include <linux/usb/musb.h>
108c2ecf20Sopenharmony_ci
118c2ecf20Sopenharmony_ci#include <mach/common.h>
128c2ecf20Sopenharmony_ci#include <mach/cputype.h>
138c2ecf20Sopenharmony_ci
148c2ecf20Sopenharmony_ci#include "irqs.h"
158c2ecf20Sopenharmony_ci
168c2ecf20Sopenharmony_ci#define DAVINCI_USB_OTG_BASE	0x01c64000
178c2ecf20Sopenharmony_ci
188c2ecf20Sopenharmony_ci#if IS_ENABLED(CONFIG_USB_MUSB_HDRC)
198c2ecf20Sopenharmony_cistatic struct musb_hdrc_config musb_config = {
208c2ecf20Sopenharmony_ci	.multipoint	= true,
218c2ecf20Sopenharmony_ci
228c2ecf20Sopenharmony_ci	.num_eps	= 5,
238c2ecf20Sopenharmony_ci	.ram_bits	= 10,
248c2ecf20Sopenharmony_ci};
258c2ecf20Sopenharmony_ci
268c2ecf20Sopenharmony_cistatic struct musb_hdrc_platform_data usb_data = {
278c2ecf20Sopenharmony_ci	/* OTG requires a Mini-AB connector */
288c2ecf20Sopenharmony_ci	.mode           = MUSB_OTG,
298c2ecf20Sopenharmony_ci	.clock		= "usb",
308c2ecf20Sopenharmony_ci	.config		= &musb_config,
318c2ecf20Sopenharmony_ci};
328c2ecf20Sopenharmony_ci
338c2ecf20Sopenharmony_cistatic struct resource usb_resources[] = {
348c2ecf20Sopenharmony_ci	{
358c2ecf20Sopenharmony_ci		/* physical address */
368c2ecf20Sopenharmony_ci		.start          = DAVINCI_USB_OTG_BASE,
378c2ecf20Sopenharmony_ci		.end            = DAVINCI_USB_OTG_BASE + 0x5ff,
388c2ecf20Sopenharmony_ci		.flags          = IORESOURCE_MEM,
398c2ecf20Sopenharmony_ci	},
408c2ecf20Sopenharmony_ci	{
418c2ecf20Sopenharmony_ci		.start          = DAVINCI_INTC_IRQ(IRQ_USBINT),
428c2ecf20Sopenharmony_ci		.flags          = IORESOURCE_IRQ,
438c2ecf20Sopenharmony_ci		.name		= "mc"
448c2ecf20Sopenharmony_ci	},
458c2ecf20Sopenharmony_ci	{
468c2ecf20Sopenharmony_ci		/* placeholder for the dedicated CPPI IRQ */
478c2ecf20Sopenharmony_ci		.flags          = IORESOURCE_IRQ,
488c2ecf20Sopenharmony_ci		.name		= "dma"
498c2ecf20Sopenharmony_ci	},
508c2ecf20Sopenharmony_ci};
518c2ecf20Sopenharmony_ci
528c2ecf20Sopenharmony_cistatic u64 usb_dmamask = DMA_BIT_MASK(32);
538c2ecf20Sopenharmony_ci
548c2ecf20Sopenharmony_cistatic struct platform_device usb_dev = {
558c2ecf20Sopenharmony_ci	.name           = "musb-davinci",
568c2ecf20Sopenharmony_ci	.id             = -1,
578c2ecf20Sopenharmony_ci	.dev = {
588c2ecf20Sopenharmony_ci		.platform_data		= &usb_data,
598c2ecf20Sopenharmony_ci		.dma_mask		= &usb_dmamask,
608c2ecf20Sopenharmony_ci		.coherent_dma_mask      = DMA_BIT_MASK(32),
618c2ecf20Sopenharmony_ci	},
628c2ecf20Sopenharmony_ci	.resource       = usb_resources,
638c2ecf20Sopenharmony_ci	.num_resources  = ARRAY_SIZE(usb_resources),
648c2ecf20Sopenharmony_ci};
658c2ecf20Sopenharmony_ci
668c2ecf20Sopenharmony_civoid __init davinci_setup_usb(unsigned mA, unsigned potpgt_ms)
678c2ecf20Sopenharmony_ci{
688c2ecf20Sopenharmony_ci	usb_data.power = mA > 510 ? 255 : mA / 2;
698c2ecf20Sopenharmony_ci	usb_data.potpgt = (potpgt_ms + 1) / 2;
708c2ecf20Sopenharmony_ci
718c2ecf20Sopenharmony_ci	if (cpu_is_davinci_dm646x()) {
728c2ecf20Sopenharmony_ci		/* Override the defaults as DM6467 uses different IRQs. */
738c2ecf20Sopenharmony_ci		usb_dev.resource[1].start = DAVINCI_INTC_IRQ(IRQ_DM646X_USBINT);
748c2ecf20Sopenharmony_ci		usb_dev.resource[2].start = DAVINCI_INTC_IRQ(
758c2ecf20Sopenharmony_ci							IRQ_DM646X_USBDMAINT);
768c2ecf20Sopenharmony_ci	} else	/* other devices don't have dedicated CPPI IRQ */
778c2ecf20Sopenharmony_ci		usb_dev.num_resources = 2;
788c2ecf20Sopenharmony_ci
798c2ecf20Sopenharmony_ci	platform_device_register(&usb_dev);
808c2ecf20Sopenharmony_ci}
818c2ecf20Sopenharmony_ci
828c2ecf20Sopenharmony_ci#else
838c2ecf20Sopenharmony_ci
848c2ecf20Sopenharmony_civoid __init davinci_setup_usb(unsigned mA, unsigned potpgt_ms)
858c2ecf20Sopenharmony_ci{
868c2ecf20Sopenharmony_ci}
878c2ecf20Sopenharmony_ci
888c2ecf20Sopenharmony_ci#endif  /* CONFIG_USB_MUSB_HDRC */
89