dwc3-exynos.c revision 22d9d8e8316d7f69046c8805ce9aa8d9c43d4e5b
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 *
95945f789c864d8676b297880cc6961fea4511a7aFelipe Balbi * This program is free software: you can redistribute it and/or modify
105945f789c864d8676b297880cc6961fea4511a7aFelipe Balbi * it under the terms of the GNU General Public License version 2  of
115945f789c864d8676b297880cc6961fea4511a7aFelipe Balbi * the License as published by the Free Software Foundation.
125945f789c864d8676b297880cc6961fea4511a7aFelipe Balbi *
135945f789c864d8676b297880cc6961fea4511a7aFelipe Balbi * This program is distributed in the hope that it will be useful,
145945f789c864d8676b297880cc6961fea4511a7aFelipe Balbi * but WITHOUT ANY WARRANTY; without even the implied warranty of
155945f789c864d8676b297880cc6961fea4511a7aFelipe Balbi * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
165945f789c864d8676b297880cc6961fea4511a7aFelipe Balbi * GNU General Public License for more details.
17d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov */
18d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov
19d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov#include <linux/module.h>
20d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov#include <linux/kernel.h>
21d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov#include <linux/slab.h>
22d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov#include <linux/platform_device.h>
23d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov#include <linux/platform_data/dwc3-exynos.h>
24d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov#include <linux/dma-mapping.h>
25d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov#include <linux/clk.h>
26d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi#include <linux/usb/otg.h>
273fa4d7344be0afebd80382ffeea6b1787cccf971Sebastian Andrzej Siewior#include <linux/usb/usb_phy_gen_xceiv.h>
28accefdd4b234f029a530928ee930b9dcac88fe84Vivek Gautam#include <linux/of.h>
29adcf20dcd2629112c467f30a2c057479979ae64cVivek Gautam#include <linux/of_platform.h>
30d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov
31d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirovstruct dwc3_exynos {
32d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi	struct platform_device	*usb2_phy;
33d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi	struct platform_device	*usb3_phy;
34d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov	struct device		*dev;
35d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov
36d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov	struct clk		*clk;
37d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov};
38d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov
3941ac7b3ab7fe1d6175839947a877fdf95cbd2211Bill Pembertonstatic int dwc3_exynos_register_phys(struct dwc3_exynos *exynos)
40d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi{
413fa4d7344be0afebd80382ffeea6b1787cccf971Sebastian Andrzej Siewior	struct usb_phy_gen_xceiv_platform_data pdata;
42d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi	struct platform_device	*pdev;
43d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi	int			ret;
44d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi
45d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi	memset(&pdata, 0x00, sizeof(pdata));
46d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi
473fa4d7344be0afebd80382ffeea6b1787cccf971Sebastian Andrzej Siewior	pdev = platform_device_alloc("usb_phy_gen_xceiv", PLATFORM_DEVID_AUTO);
48d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi	if (!pdev)
49d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi		return -ENOMEM;
50d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi
51d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi	exynos->usb2_phy = pdev;
52d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi	pdata.type = USB_PHY_TYPE_USB2;
53d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi
54d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi	ret = platform_device_add_data(exynos->usb2_phy, &pdata, sizeof(pdata));
55d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi	if (ret)
56d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi		goto err1;
57d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi
583fa4d7344be0afebd80382ffeea6b1787cccf971Sebastian Andrzej Siewior	pdev = platform_device_alloc("usb_phy_gen_xceiv", PLATFORM_DEVID_AUTO);
59d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi	if (!pdev) {
60d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi		ret = -ENOMEM;
61d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi		goto err1;
62d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi	}
63d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi
64d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi	exynos->usb3_phy = pdev;
65d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi	pdata.type = USB_PHY_TYPE_USB3;
66d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi
67d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi	ret = platform_device_add_data(exynos->usb3_phy, &pdata, sizeof(pdata));
68d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi	if (ret)
69d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi		goto err2;
70d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi
71d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi	ret = platform_device_add(exynos->usb2_phy);
72d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi	if (ret)
73d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi		goto err2;
74d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi
75d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi	ret = platform_device_add(exynos->usb3_phy);
76d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi	if (ret)
77d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi		goto err3;
78d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi
79d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi	return 0;
80d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi
81d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbierr3:
82d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi	platform_device_del(exynos->usb2_phy);
83d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi
84d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbierr2:
85d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi	platform_device_put(exynos->usb3_phy);
86d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi
87d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbierr1:
88d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi	platform_device_put(exynos->usb2_phy);
89d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi
90d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi	return ret;
91d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi}
92d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi
93adcf20dcd2629112c467f30a2c057479979ae64cVivek Gautamstatic int dwc3_exynos_remove_child(struct device *dev, void *unused)
94adcf20dcd2629112c467f30a2c057479979ae64cVivek Gautam{
95adcf20dcd2629112c467f30a2c057479979ae64cVivek Gautam	struct platform_device *pdev = to_platform_device(dev);
96adcf20dcd2629112c467f30a2c057479979ae64cVivek Gautam
97adcf20dcd2629112c467f30a2c057479979ae64cVivek Gautam	platform_device_unregister(pdev);
98adcf20dcd2629112c467f30a2c057479979ae64cVivek Gautam
99adcf20dcd2629112c467f30a2c057479979ae64cVivek Gautam	return 0;
100adcf20dcd2629112c467f30a2c057479979ae64cVivek Gautam}
101adcf20dcd2629112c467f30a2c057479979ae64cVivek Gautam
10241ac7b3ab7fe1d6175839947a877fdf95cbd2211Bill Pembertonstatic int dwc3_exynos_probe(struct platform_device *pdev)
103d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov{
104d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov	struct dwc3_exynos	*exynos;
105d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov	struct clk		*clk;
10620b97dc18323938a92319abf031936b7d2686eafJingoo Han	struct device		*dev = &pdev->dev;
107adcf20dcd2629112c467f30a2c057479979ae64cVivek Gautam	struct device_node	*node = dev->of_node;
108d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov
109d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov	int			ret = -ENOMEM;
110d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov
11120b97dc18323938a92319abf031936b7d2686eafJingoo Han	exynos = devm_kzalloc(dev, sizeof(*exynos), GFP_KERNEL);
112d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov	if (!exynos) {
11320b97dc18323938a92319abf031936b7d2686eafJingoo Han		dev_err(dev, "not enough memory\n");
114adcf20dcd2629112c467f30a2c057479979ae64cVivek Gautam		goto err1;
115d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov	}
116d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov
117accefdd4b234f029a530928ee930b9dcac88fe84Vivek Gautam	/*
118accefdd4b234f029a530928ee930b9dcac88fe84Vivek Gautam	 * Right now device-tree probed devices don't get dma_mask set.
119accefdd4b234f029a530928ee930b9dcac88fe84Vivek Gautam	 * Since shared usb code relies on it, set it here for now.
120accefdd4b234f029a530928ee930b9dcac88fe84Vivek Gautam	 * Once we move to full device tree support this will vanish off.
121accefdd4b234f029a530928ee930b9dcac88fe84Vivek Gautam	 */
122adcf20dcd2629112c467f30a2c057479979ae64cVivek Gautam	if (!dev->dma_mask)
1233b9561e9d9b88eca9d4ed6aab025dec2eeeed501Stephen Warren		dev->dma_mask = &dev->coherent_dma_mask;
12422d9d8e8316d7f69046c8805ce9aa8d9c43d4e5bRussell King	ret = dma_set_coherent_mask(dev, DMA_BIT_MASK(32));
12522d9d8e8316d7f69046c8805ce9aa8d9c43d4e5bRussell King	if (ret)
12622d9d8e8316d7f69046c8805ce9aa8d9c43d4e5bRussell King		goto err1;
127accefdd4b234f029a530928ee930b9dcac88fe84Vivek Gautam
128d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov	platform_set_drvdata(pdev, exynos);
129d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov
130d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi	ret = dwc3_exynos_register_phys(exynos);
131d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi	if (ret) {
13220b97dc18323938a92319abf031936b7d2686eafJingoo Han		dev_err(dev, "couldn't register PHYs\n");
133adcf20dcd2629112c467f30a2c057479979ae64cVivek Gautam		goto err1;
134d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov	}
135d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov
13620b97dc18323938a92319abf031936b7d2686eafJingoo Han	clk = devm_clk_get(dev, "usbdrd30");
137d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov	if (IS_ERR(clk)) {
13820b97dc18323938a92319abf031936b7d2686eafJingoo Han		dev_err(dev, "couldn't get clock\n");
139d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov		ret = -EINVAL;
14020b97dc18323938a92319abf031936b7d2686eafJingoo Han		goto err1;
141d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov	}
142d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov
14320b97dc18323938a92319abf031936b7d2686eafJingoo Han	exynos->dev	= dev;
144d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov	exynos->clk	= clk;
145d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov
146ddb5147cea10308fac7d4ea44cbd164929199e03Vivek Gautam	clk_prepare_enable(exynos->clk);
147d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov
148adcf20dcd2629112c467f30a2c057479979ae64cVivek Gautam	if (node) {
149adcf20dcd2629112c467f30a2c057479979ae64cVivek Gautam		ret = of_platform_populate(node, NULL, NULL, dev);
150adcf20dcd2629112c467f30a2c057479979ae64cVivek Gautam		if (ret) {
151adcf20dcd2629112c467f30a2c057479979ae64cVivek Gautam			dev_err(dev, "failed to add dwc3 core\n");
152adcf20dcd2629112c467f30a2c057479979ae64cVivek Gautam			goto err2;
153adcf20dcd2629112c467f30a2c057479979ae64cVivek Gautam		}
154adcf20dcd2629112c467f30a2c057479979ae64cVivek Gautam	} else {
155adcf20dcd2629112c467f30a2c057479979ae64cVivek Gautam		dev_err(dev, "no device node, failed to add dwc3 core\n");
156adcf20dcd2629112c467f30a2c057479979ae64cVivek Gautam		ret = -ENODEV;
15720b97dc18323938a92319abf031936b7d2686eafJingoo Han		goto err2;
158d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov	}
159d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov
160d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov	return 0;
161d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov
16220b97dc18323938a92319abf031936b7d2686eafJingoo Hanerr2:
163ddb5147cea10308fac7d4ea44cbd164929199e03Vivek Gautam	clk_disable_unprepare(clk);
164d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomiroverr1:
165d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov	return ret;
166d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov}
167d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov
168fb4e98ab63433c4d3a1588ea91c73f1cd7ebaa00Bill Pembertonstatic int dwc3_exynos_remove(struct platform_device *pdev)
169d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov{
170d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov	struct dwc3_exynos	*exynos = platform_get_drvdata(pdev);
171d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov
172022d0547aa8b00ff5035ba6207ebc2c08ea0a51fPeter Chen	device_for_each_child(&pdev->dev, NULL, dwc3_exynos_remove_child);
173d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi	platform_device_unregister(exynos->usb2_phy);
174d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi	platform_device_unregister(exynos->usb3_phy);
175d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov
176ddb5147cea10308fac7d4ea44cbd164929199e03Vivek Gautam	clk_disable_unprepare(exynos->clk);
177d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov
178d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov	return 0;
179d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov}
180d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov
181accefdd4b234f029a530928ee930b9dcac88fe84Vivek Gautam#ifdef CONFIG_OF
182accefdd4b234f029a530928ee930b9dcac88fe84Vivek Gautamstatic const struct of_device_id exynos_dwc3_match[] = {
183fe29db8fb22f5aa67af4bf30b85a0451c989a88bVivek Gautam	{ .compatible = "samsung,exynos5250-dwusb3" },
184accefdd4b234f029a530928ee930b9dcac88fe84Vivek Gautam	{},
185accefdd4b234f029a530928ee930b9dcac88fe84Vivek Gautam};
186accefdd4b234f029a530928ee930b9dcac88fe84Vivek GautamMODULE_DEVICE_TABLE(of, exynos_dwc3_match);
187accefdd4b234f029a530928ee930b9dcac88fe84Vivek Gautam#endif
188accefdd4b234f029a530928ee930b9dcac88fe84Vivek Gautam
18919fda7cd59eac8e537f63a4d9bd5973bf78a8c38Jingoo Han#ifdef CONFIG_PM_SLEEP
1900646caf754aa3ce55ef978d7f4a3e3d0aab7a187Vikas Sajjanstatic int dwc3_exynos_suspend(struct device *dev)
1910646caf754aa3ce55ef978d7f4a3e3d0aab7a187Vikas Sajjan{
1920646caf754aa3ce55ef978d7f4a3e3d0aab7a187Vikas Sajjan	struct dwc3_exynos *exynos = dev_get_drvdata(dev);
1930646caf754aa3ce55ef978d7f4a3e3d0aab7a187Vikas Sajjan
1940646caf754aa3ce55ef978d7f4a3e3d0aab7a187Vikas Sajjan	clk_disable(exynos->clk);
1950646caf754aa3ce55ef978d7f4a3e3d0aab7a187Vikas Sajjan
1960646caf754aa3ce55ef978d7f4a3e3d0aab7a187Vikas Sajjan	return 0;
1970646caf754aa3ce55ef978d7f4a3e3d0aab7a187Vikas Sajjan}
1980646caf754aa3ce55ef978d7f4a3e3d0aab7a187Vikas Sajjan
1990646caf754aa3ce55ef978d7f4a3e3d0aab7a187Vikas Sajjanstatic int dwc3_exynos_resume(struct device *dev)
2000646caf754aa3ce55ef978d7f4a3e3d0aab7a187Vikas Sajjan{
2010646caf754aa3ce55ef978d7f4a3e3d0aab7a187Vikas Sajjan	struct dwc3_exynos *exynos = dev_get_drvdata(dev);
2020646caf754aa3ce55ef978d7f4a3e3d0aab7a187Vikas Sajjan
2030646caf754aa3ce55ef978d7f4a3e3d0aab7a187Vikas Sajjan	clk_enable(exynos->clk);
2040646caf754aa3ce55ef978d7f4a3e3d0aab7a187Vikas Sajjan
2050646caf754aa3ce55ef978d7f4a3e3d0aab7a187Vikas Sajjan	/* runtime set active to reflect active state. */
2060646caf754aa3ce55ef978d7f4a3e3d0aab7a187Vikas Sajjan	pm_runtime_disable(dev);
2070646caf754aa3ce55ef978d7f4a3e3d0aab7a187Vikas Sajjan	pm_runtime_set_active(dev);
2080646caf754aa3ce55ef978d7f4a3e3d0aab7a187Vikas Sajjan	pm_runtime_enable(dev);
2090646caf754aa3ce55ef978d7f4a3e3d0aab7a187Vikas Sajjan
2100646caf754aa3ce55ef978d7f4a3e3d0aab7a187Vikas Sajjan	return 0;
2110646caf754aa3ce55ef978d7f4a3e3d0aab7a187Vikas Sajjan}
2120646caf754aa3ce55ef978d7f4a3e3d0aab7a187Vikas Sajjan
2130646caf754aa3ce55ef978d7f4a3e3d0aab7a187Vikas Sajjanstatic const struct dev_pm_ops dwc3_exynos_dev_pm_ops = {
2140646caf754aa3ce55ef978d7f4a3e3d0aab7a187Vikas Sajjan	SET_SYSTEM_SLEEP_PM_OPS(dwc3_exynos_suspend, dwc3_exynos_resume)
2150646caf754aa3ce55ef978d7f4a3e3d0aab7a187Vikas Sajjan};
2160646caf754aa3ce55ef978d7f4a3e3d0aab7a187Vikas Sajjan
2170646caf754aa3ce55ef978d7f4a3e3d0aab7a187Vikas Sajjan#define DEV_PM_OPS	(&dwc3_exynos_dev_pm_ops)
2180646caf754aa3ce55ef978d7f4a3e3d0aab7a187Vikas Sajjan#else
2190646caf754aa3ce55ef978d7f4a3e3d0aab7a187Vikas Sajjan#define DEV_PM_OPS	NULL
22019fda7cd59eac8e537f63a4d9bd5973bf78a8c38Jingoo Han#endif /* CONFIG_PM_SLEEP */
2210646caf754aa3ce55ef978d7f4a3e3d0aab7a187Vikas Sajjan
222d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirovstatic struct platform_driver dwc3_exynos_driver = {
223d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov	.probe		= dwc3_exynos_probe,
2247690417db5085f0de03aa70b8ca01b0118e8a1b4Bill Pemberton	.remove		= dwc3_exynos_remove,
225d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov	.driver		= {
226d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov		.name	= "exynos-dwc3",
227accefdd4b234f029a530928ee930b9dcac88fe84Vivek Gautam		.of_match_table = of_match_ptr(exynos_dwc3_match),
2280646caf754aa3ce55ef978d7f4a3e3d0aab7a187Vikas Sajjan		.pm	= DEV_PM_OPS,
229d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov	},
230d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov};
231d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov
232d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirovmodule_platform_driver(dwc3_exynos_driver);
233d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov
234d28a9689c93195d39f91f35a9519876688605b65Anton TikhomirovMODULE_ALIAS("platform:exynos-dwc3");
235d28a9689c93195d39f91f35a9519876688605b65Anton TikhomirovMODULE_AUTHOR("Anton Tikhomirov <av.tikhomirov@samsung.com>");
2365945f789c864d8676b297880cc6961fea4511a7aFelipe BalbiMODULE_LICENSE("GPL v2");
237d28a9689c93195d39f91f35a9519876688605b65Anton TikhomirovMODULE_DESCRIPTION("DesignWare USB3 EXYNOS Glue Layer");
238