dwc3-exynos.c revision 19fda7cd59eac8e537f63a4d9bd5973bf78a8c38
1d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov/**
2d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov * dwc3-exynos.c - Samsung EXYNOS DWC3 Specific Glue layer
3d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov *
4d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov * Copyright (c) 2012 Samsung Electronics Co., Ltd.
5d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov *		http://www.samsung.com
6d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov *
7d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov * Author: Anton Tikhomirov <av.tikhomirov@samsung.com>
8d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov *
9d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov * This program is free software; you can redistribute it and/or modify
10d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov * it under the terms of the GNU General Public License as published by
11d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov * the Free Software Foundation; either version 2 of the License, or
12d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov * (at your option) any later version.
13d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov */
14d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov
15d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov#include <linux/module.h>
16d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov#include <linux/kernel.h>
17d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov#include <linux/slab.h>
18d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov#include <linux/platform_device.h>
19d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov#include <linux/platform_data/dwc3-exynos.h>
20d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov#include <linux/dma-mapping.h>
21d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov#include <linux/clk.h>
22d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi#include <linux/usb/otg.h>
23d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi#include <linux/usb/nop-usb-xceiv.h>
24accefdd4b234f029a530928ee930b9dcac88fe84Vivek Gautam#include <linux/of.h>
25adcf20dcd2629112c467f30a2c057479979ae64cVivek Gautam#include <linux/of_platform.h>
26d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov
27d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirovstruct dwc3_exynos {
28d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi	struct platform_device	*usb2_phy;
29d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi	struct platform_device	*usb3_phy;
30d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov	struct device		*dev;
31d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov
32d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov	struct clk		*clk;
33d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov};
34d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov
3541ac7b3ab7fe1d6175839947a877fdf95cbd2211Bill Pembertonstatic int dwc3_exynos_register_phys(struct dwc3_exynos *exynos)
36d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi{
37d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi	struct nop_usb_xceiv_platform_data pdata;
38d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi	struct platform_device	*pdev;
39d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi	int			ret;
40d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi
41d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi	memset(&pdata, 0x00, sizeof(pdata));
42d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi
43b0e45ddb96d5a972a8b76354f036b90549ae85b3Vivek Gautam	pdev = platform_device_alloc("nop_usb_xceiv", PLATFORM_DEVID_AUTO);
44d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi	if (!pdev)
45d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi		return -ENOMEM;
46d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi
47d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi	exynos->usb2_phy = pdev;
48d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi	pdata.type = USB_PHY_TYPE_USB2;
49d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi
50d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi	ret = platform_device_add_data(exynos->usb2_phy, &pdata, sizeof(pdata));
51d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi	if (ret)
52d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi		goto err1;
53d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi
54b0e45ddb96d5a972a8b76354f036b90549ae85b3Vivek Gautam	pdev = platform_device_alloc("nop_usb_xceiv", PLATFORM_DEVID_AUTO);
55d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi	if (!pdev) {
56d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi		ret = -ENOMEM;
57d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi		goto err1;
58d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi	}
59d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi
60d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi	exynos->usb3_phy = pdev;
61d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi	pdata.type = USB_PHY_TYPE_USB3;
62d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi
63d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi	ret = platform_device_add_data(exynos->usb3_phy, &pdata, sizeof(pdata));
64d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi	if (ret)
65d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi		goto err2;
66d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi
67d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi	ret = platform_device_add(exynos->usb2_phy);
68d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi	if (ret)
69d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi		goto err2;
70d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi
71d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi	ret = platform_device_add(exynos->usb3_phy);
72d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi	if (ret)
73d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi		goto err3;
74d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi
75d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi	return 0;
76d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi
77d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbierr3:
78d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi	platform_device_del(exynos->usb2_phy);
79d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi
80d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbierr2:
81d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi	platform_device_put(exynos->usb3_phy);
82d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi
83d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbierr1:
84d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi	platform_device_put(exynos->usb2_phy);
85d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi
86d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi	return ret;
87d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi}
88d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi
89adcf20dcd2629112c467f30a2c057479979ae64cVivek Gautamstatic int dwc3_exynos_remove_child(struct device *dev, void *unused)
90adcf20dcd2629112c467f30a2c057479979ae64cVivek Gautam{
91adcf20dcd2629112c467f30a2c057479979ae64cVivek Gautam	struct platform_device *pdev = to_platform_device(dev);
92adcf20dcd2629112c467f30a2c057479979ae64cVivek Gautam
93adcf20dcd2629112c467f30a2c057479979ae64cVivek Gautam	platform_device_unregister(pdev);
94adcf20dcd2629112c467f30a2c057479979ae64cVivek Gautam
95adcf20dcd2629112c467f30a2c057479979ae64cVivek Gautam	return 0;
96adcf20dcd2629112c467f30a2c057479979ae64cVivek Gautam}
97adcf20dcd2629112c467f30a2c057479979ae64cVivek Gautam
98accefdd4b234f029a530928ee930b9dcac88fe84Vivek Gautamstatic u64 dwc3_exynos_dma_mask = DMA_BIT_MASK(32);
99accefdd4b234f029a530928ee930b9dcac88fe84Vivek Gautam
10041ac7b3ab7fe1d6175839947a877fdf95cbd2211Bill Pembertonstatic int dwc3_exynos_probe(struct platform_device *pdev)
101d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov{
102d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov	struct dwc3_exynos	*exynos;
103d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov	struct clk		*clk;
10420b97dc18323938a92319abf031936b7d2686eafJingoo Han	struct device		*dev = &pdev->dev;
105adcf20dcd2629112c467f30a2c057479979ae64cVivek Gautam	struct device_node	*node = dev->of_node;
106d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov
107d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov	int			ret = -ENOMEM;
108d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov
10920b97dc18323938a92319abf031936b7d2686eafJingoo Han	exynos = devm_kzalloc(dev, sizeof(*exynos), GFP_KERNEL);
110d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov	if (!exynos) {
11120b97dc18323938a92319abf031936b7d2686eafJingoo Han		dev_err(dev, "not enough memory\n");
112adcf20dcd2629112c467f30a2c057479979ae64cVivek Gautam		goto err1;
113d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov	}
114d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov
115accefdd4b234f029a530928ee930b9dcac88fe84Vivek Gautam	/*
116accefdd4b234f029a530928ee930b9dcac88fe84Vivek Gautam	 * Right now device-tree probed devices don't get dma_mask set.
117accefdd4b234f029a530928ee930b9dcac88fe84Vivek Gautam	 * Since shared usb code relies on it, set it here for now.
118accefdd4b234f029a530928ee930b9dcac88fe84Vivek Gautam	 * Once we move to full device tree support this will vanish off.
119accefdd4b234f029a530928ee930b9dcac88fe84Vivek Gautam	 */
120adcf20dcd2629112c467f30a2c057479979ae64cVivek Gautam	if (!dev->dma_mask)
121adcf20dcd2629112c467f30a2c057479979ae64cVivek Gautam		dev->dma_mask = &dwc3_exynos_dma_mask;
122accefdd4b234f029a530928ee930b9dcac88fe84Vivek Gautam
123d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov	platform_set_drvdata(pdev, exynos);
124d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov
125d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi	ret = dwc3_exynos_register_phys(exynos);
126d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi	if (ret) {
12720b97dc18323938a92319abf031936b7d2686eafJingoo Han		dev_err(dev, "couldn't register PHYs\n");
128adcf20dcd2629112c467f30a2c057479979ae64cVivek Gautam		goto err1;
129d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov	}
130d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov
13120b97dc18323938a92319abf031936b7d2686eafJingoo Han	clk = devm_clk_get(dev, "usbdrd30");
132d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov	if (IS_ERR(clk)) {
13320b97dc18323938a92319abf031936b7d2686eafJingoo Han		dev_err(dev, "couldn't get clock\n");
134d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov		ret = -EINVAL;
13520b97dc18323938a92319abf031936b7d2686eafJingoo Han		goto err1;
136d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov	}
137d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov
13820b97dc18323938a92319abf031936b7d2686eafJingoo Han	exynos->dev	= dev;
139d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov	exynos->clk	= clk;
140d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov
141ddb5147cea10308fac7d4ea44cbd164929199e03Vivek Gautam	clk_prepare_enable(exynos->clk);
142d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov
143adcf20dcd2629112c467f30a2c057479979ae64cVivek Gautam	if (node) {
144adcf20dcd2629112c467f30a2c057479979ae64cVivek Gautam		ret = of_platform_populate(node, NULL, NULL, dev);
145adcf20dcd2629112c467f30a2c057479979ae64cVivek Gautam		if (ret) {
146adcf20dcd2629112c467f30a2c057479979ae64cVivek Gautam			dev_err(dev, "failed to add dwc3 core\n");
147adcf20dcd2629112c467f30a2c057479979ae64cVivek Gautam			goto err2;
148adcf20dcd2629112c467f30a2c057479979ae64cVivek Gautam		}
149adcf20dcd2629112c467f30a2c057479979ae64cVivek Gautam	} else {
150adcf20dcd2629112c467f30a2c057479979ae64cVivek Gautam		dev_err(dev, "no device node, failed to add dwc3 core\n");
151adcf20dcd2629112c467f30a2c057479979ae64cVivek Gautam		ret = -ENODEV;
15220b97dc18323938a92319abf031936b7d2686eafJingoo Han		goto err2;
153d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov	}
154d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov
155d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov	return 0;
156d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov
15720b97dc18323938a92319abf031936b7d2686eafJingoo Hanerr2:
158ddb5147cea10308fac7d4ea44cbd164929199e03Vivek Gautam	clk_disable_unprepare(clk);
159d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomiroverr1:
160d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov	return ret;
161d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov}
162d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov
163fb4e98ab63433c4d3a1588ea91c73f1cd7ebaa00Bill Pembertonstatic int dwc3_exynos_remove(struct platform_device *pdev)
164d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov{
165d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov	struct dwc3_exynos	*exynos = platform_get_drvdata(pdev);
166d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov
167d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi	platform_device_unregister(exynos->usb2_phy);
168d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi	platform_device_unregister(exynos->usb3_phy);
169adcf20dcd2629112c467f30a2c057479979ae64cVivek Gautam	device_for_each_child(&pdev->dev, NULL, dwc3_exynos_remove_child);
170d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov
171ddb5147cea10308fac7d4ea44cbd164929199e03Vivek Gautam	clk_disable_unprepare(exynos->clk);
172d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov
173d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov	return 0;
174d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov}
175d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov
176accefdd4b234f029a530928ee930b9dcac88fe84Vivek Gautam#ifdef CONFIG_OF
177accefdd4b234f029a530928ee930b9dcac88fe84Vivek Gautamstatic const struct of_device_id exynos_dwc3_match[] = {
178fe29db8fb22f5aa67af4bf30b85a0451c989a88bVivek Gautam	{ .compatible = "samsung,exynos5250-dwusb3" },
179accefdd4b234f029a530928ee930b9dcac88fe84Vivek Gautam	{},
180accefdd4b234f029a530928ee930b9dcac88fe84Vivek Gautam};
181accefdd4b234f029a530928ee930b9dcac88fe84Vivek GautamMODULE_DEVICE_TABLE(of, exynos_dwc3_match);
182accefdd4b234f029a530928ee930b9dcac88fe84Vivek Gautam#endif
183accefdd4b234f029a530928ee930b9dcac88fe84Vivek Gautam
18419fda7cd59eac8e537f63a4d9bd5973bf78a8c38Jingoo Han#ifdef CONFIG_PM_SLEEP
1850646caf754aa3ce55ef978d7f4a3e3d0aab7a187Vikas Sajjanstatic int dwc3_exynos_suspend(struct device *dev)
1860646caf754aa3ce55ef978d7f4a3e3d0aab7a187Vikas Sajjan{
1870646caf754aa3ce55ef978d7f4a3e3d0aab7a187Vikas Sajjan	struct dwc3_exynos *exynos = dev_get_drvdata(dev);
1880646caf754aa3ce55ef978d7f4a3e3d0aab7a187Vikas Sajjan
1890646caf754aa3ce55ef978d7f4a3e3d0aab7a187Vikas Sajjan	clk_disable(exynos->clk);
1900646caf754aa3ce55ef978d7f4a3e3d0aab7a187Vikas Sajjan
1910646caf754aa3ce55ef978d7f4a3e3d0aab7a187Vikas Sajjan	return 0;
1920646caf754aa3ce55ef978d7f4a3e3d0aab7a187Vikas Sajjan}
1930646caf754aa3ce55ef978d7f4a3e3d0aab7a187Vikas Sajjan
1940646caf754aa3ce55ef978d7f4a3e3d0aab7a187Vikas Sajjanstatic int dwc3_exynos_resume(struct device *dev)
1950646caf754aa3ce55ef978d7f4a3e3d0aab7a187Vikas Sajjan{
1960646caf754aa3ce55ef978d7f4a3e3d0aab7a187Vikas Sajjan	struct dwc3_exynos *exynos = dev_get_drvdata(dev);
1970646caf754aa3ce55ef978d7f4a3e3d0aab7a187Vikas Sajjan
1980646caf754aa3ce55ef978d7f4a3e3d0aab7a187Vikas Sajjan	clk_enable(exynos->clk);
1990646caf754aa3ce55ef978d7f4a3e3d0aab7a187Vikas Sajjan
2000646caf754aa3ce55ef978d7f4a3e3d0aab7a187Vikas Sajjan	/* runtime set active to reflect active state. */
2010646caf754aa3ce55ef978d7f4a3e3d0aab7a187Vikas Sajjan	pm_runtime_disable(dev);
2020646caf754aa3ce55ef978d7f4a3e3d0aab7a187Vikas Sajjan	pm_runtime_set_active(dev);
2030646caf754aa3ce55ef978d7f4a3e3d0aab7a187Vikas Sajjan	pm_runtime_enable(dev);
2040646caf754aa3ce55ef978d7f4a3e3d0aab7a187Vikas Sajjan
2050646caf754aa3ce55ef978d7f4a3e3d0aab7a187Vikas Sajjan	return 0;
2060646caf754aa3ce55ef978d7f4a3e3d0aab7a187Vikas Sajjan}
2070646caf754aa3ce55ef978d7f4a3e3d0aab7a187Vikas Sajjan
2080646caf754aa3ce55ef978d7f4a3e3d0aab7a187Vikas Sajjanstatic const struct dev_pm_ops dwc3_exynos_dev_pm_ops = {
2090646caf754aa3ce55ef978d7f4a3e3d0aab7a187Vikas Sajjan	SET_SYSTEM_SLEEP_PM_OPS(dwc3_exynos_suspend, dwc3_exynos_resume)
2100646caf754aa3ce55ef978d7f4a3e3d0aab7a187Vikas Sajjan};
2110646caf754aa3ce55ef978d7f4a3e3d0aab7a187Vikas Sajjan
2120646caf754aa3ce55ef978d7f4a3e3d0aab7a187Vikas Sajjan#define DEV_PM_OPS	(&dwc3_exynos_dev_pm_ops)
2130646caf754aa3ce55ef978d7f4a3e3d0aab7a187Vikas Sajjan#else
2140646caf754aa3ce55ef978d7f4a3e3d0aab7a187Vikas Sajjan#define DEV_PM_OPS	NULL
21519fda7cd59eac8e537f63a4d9bd5973bf78a8c38Jingoo Han#endif /* CONFIG_PM_SLEEP */
2160646caf754aa3ce55ef978d7f4a3e3d0aab7a187Vikas Sajjan
217d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirovstatic struct platform_driver dwc3_exynos_driver = {
218d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov	.probe		= dwc3_exynos_probe,
2197690417db5085f0de03aa70b8ca01b0118e8a1b4Bill Pemberton	.remove		= dwc3_exynos_remove,
220d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov	.driver		= {
221d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov		.name	= "exynos-dwc3",
222accefdd4b234f029a530928ee930b9dcac88fe84Vivek Gautam		.of_match_table = of_match_ptr(exynos_dwc3_match),
2230646caf754aa3ce55ef978d7f4a3e3d0aab7a187Vikas Sajjan		.pm	= DEV_PM_OPS,
224d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov	},
225d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov};
226d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov
227d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirovmodule_platform_driver(dwc3_exynos_driver);
228d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov
229d28a9689c93195d39f91f35a9519876688605b65Anton TikhomirovMODULE_ALIAS("platform:exynos-dwc3");
230d28a9689c93195d39f91f35a9519876688605b65Anton TikhomirovMODULE_AUTHOR("Anton Tikhomirov <av.tikhomirov@samsung.com>");
231d28a9689c93195d39f91f35a9519876688605b65Anton TikhomirovMODULE_LICENSE("GPL");
232d28a9689c93195d39f91f35a9519876688605b65Anton TikhomirovMODULE_DESCRIPTION("DesignWare USB3 EXYNOS Glue Layer");
233