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