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