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> 27d7078df6be6e9e5e3ac354859f5b8d60114391b4Felipe Balbi#include <linux/usb/usb_phy_generic.h> 28accefdd4b234f029a530928ee930b9dcac88fe84Vivek Gautam#include <linux/of.h> 29adcf20dcd2629112c467f30a2c057479979ae64cVivek Gautam#include <linux/of_platform.h> 30bd8ce544ec35ff362489a7e3c059cf496c06c68eVivek Gautam#include <linux/regulator/consumer.h> 31d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov 32d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirovstruct dwc3_exynos { 33d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi struct platform_device *usb2_phy; 34d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi struct platform_device *usb3_phy; 35d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov struct device *dev; 36d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov 37d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov struct clk *clk; 38bd8ce544ec35ff362489a7e3c059cf496c06c68eVivek Gautam struct regulator *vdd33; 39bd8ce544ec35ff362489a7e3c059cf496c06c68eVivek Gautam struct regulator *vdd10; 40d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov}; 41d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov 4241ac7b3ab7fe1d6175839947a877fdf95cbd2211Bill Pembertonstatic int dwc3_exynos_register_phys(struct dwc3_exynos *exynos) 43d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi{ 444525beeb9aadbb9e1cb3e9e135f4371553f26a70Felipe Balbi struct usb_phy_generic_platform_data pdata; 45d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi struct platform_device *pdev; 46d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi int ret; 47d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi 48d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi memset(&pdata, 0x00, sizeof(pdata)); 49d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi 504525beeb9aadbb9e1cb3e9e135f4371553f26a70Felipe Balbi pdev = platform_device_alloc("usb_phy_generic", PLATFORM_DEVID_AUTO); 51d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi if (!pdev) 52d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi return -ENOMEM; 53d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi 54d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi exynos->usb2_phy = pdev; 55d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi pdata.type = USB_PHY_TYPE_USB2; 5613518673f1419f2667985a6fca4543e44143408bHeikki Krogerus pdata.gpio_reset = -1; 57d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi 58d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi ret = platform_device_add_data(exynos->usb2_phy, &pdata, sizeof(pdata)); 59d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi if (ret) 60d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi goto err1; 61d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi 624525beeb9aadbb9e1cb3e9e135f4371553f26a70Felipe Balbi pdev = platform_device_alloc("usb_phy_generic", PLATFORM_DEVID_AUTO); 63d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi if (!pdev) { 64d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi ret = -ENOMEM; 65d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi goto err1; 66d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi } 67d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi 68d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi exynos->usb3_phy = pdev; 69d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi pdata.type = USB_PHY_TYPE_USB3; 70d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi 71d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi ret = platform_device_add_data(exynos->usb3_phy, &pdata, sizeof(pdata)); 72d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi if (ret) 73d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi goto err2; 74d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi 75d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi ret = platform_device_add(exynos->usb2_phy); 76d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi if (ret) 77d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi goto err2; 78d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi 79d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi ret = platform_device_add(exynos->usb3_phy); 80d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi if (ret) 81d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi goto err3; 82d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi 83d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi return 0; 84d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi 85d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbierr3: 86d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi platform_device_del(exynos->usb2_phy); 87d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi 88d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbierr2: 89d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi platform_device_put(exynos->usb3_phy); 90d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi 91d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbierr1: 92d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi platform_device_put(exynos->usb2_phy); 93d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi 94d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi return ret; 95d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi} 96d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi 97adcf20dcd2629112c467f30a2c057479979ae64cVivek Gautamstatic int dwc3_exynos_remove_child(struct device *dev, void *unused) 98adcf20dcd2629112c467f30a2c057479979ae64cVivek Gautam{ 99adcf20dcd2629112c467f30a2c057479979ae64cVivek Gautam struct platform_device *pdev = to_platform_device(dev); 100adcf20dcd2629112c467f30a2c057479979ae64cVivek Gautam 101adcf20dcd2629112c467f30a2c057479979ae64cVivek Gautam platform_device_unregister(pdev); 102adcf20dcd2629112c467f30a2c057479979ae64cVivek Gautam 103adcf20dcd2629112c467f30a2c057479979ae64cVivek Gautam return 0; 104adcf20dcd2629112c467f30a2c057479979ae64cVivek Gautam} 105adcf20dcd2629112c467f30a2c057479979ae64cVivek Gautam 10641ac7b3ab7fe1d6175839947a877fdf95cbd2211Bill Pembertonstatic int dwc3_exynos_probe(struct platform_device *pdev) 107d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov{ 108d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov struct dwc3_exynos *exynos; 109d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov struct clk *clk; 11020b97dc18323938a92319abf031936b7d2686eafJingoo Han struct device *dev = &pdev->dev; 111adcf20dcd2629112c467f30a2c057479979ae64cVivek Gautam struct device_node *node = dev->of_node; 112d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov 113b09e99ee7c2b7ee80cca128b93b07fb830e6ecadAndy Shevchenko int ret; 114d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov 11520b97dc18323938a92319abf031936b7d2686eafJingoo Han exynos = devm_kzalloc(dev, sizeof(*exynos), GFP_KERNEL); 116734d5a5393ed8eedf70f13c7078cb4a6134f49f2Jingoo Han if (!exynos) 117b09e99ee7c2b7ee80cca128b93b07fb830e6ecadAndy Shevchenko return -ENOMEM; 118d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov 119accefdd4b234f029a530928ee930b9dcac88fe84Vivek Gautam /* 120accefdd4b234f029a530928ee930b9dcac88fe84Vivek Gautam * Right now device-tree probed devices don't get dma_mask set. 121accefdd4b234f029a530928ee930b9dcac88fe84Vivek Gautam * Since shared usb code relies on it, set it here for now. 122accefdd4b234f029a530928ee930b9dcac88fe84Vivek Gautam * Once we move to full device tree support this will vanish off. 123accefdd4b234f029a530928ee930b9dcac88fe84Vivek Gautam */ 124e1fd7341837238c6c5380c5073887d238f706cf0Russell King ret = dma_coerce_mask_and_coherent(dev, DMA_BIT_MASK(32)); 12522d9d8e8316d7f69046c8805ce9aa8d9c43d4e5bRussell King if (ret) 126b09e99ee7c2b7ee80cca128b93b07fb830e6ecadAndy Shevchenko return ret; 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"); 133b09e99ee7c2b7ee80cca128b93b07fb830e6ecadAndy Shevchenko return ret; 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"); 139b09e99ee7c2b7ee80cca128b93b07fb830e6ecadAndy Shevchenko return -EINVAL; 140d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov } 141d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov 14220b97dc18323938a92319abf031936b7d2686eafJingoo Han exynos->dev = dev; 143d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov exynos->clk = clk; 144d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov 145ddb5147cea10308fac7d4ea44cbd164929199e03Vivek Gautam clk_prepare_enable(exynos->clk); 146d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov 147bd8ce544ec35ff362489a7e3c059cf496c06c68eVivek Gautam exynos->vdd33 = devm_regulator_get(dev, "vdd33"); 148bd8ce544ec35ff362489a7e3c059cf496c06c68eVivek Gautam if (IS_ERR(exynos->vdd33)) { 149bd8ce544ec35ff362489a7e3c059cf496c06c68eVivek Gautam ret = PTR_ERR(exynos->vdd33); 150bd8ce544ec35ff362489a7e3c059cf496c06c68eVivek Gautam goto err2; 151bd8ce544ec35ff362489a7e3c059cf496c06c68eVivek Gautam } 152bd8ce544ec35ff362489a7e3c059cf496c06c68eVivek Gautam ret = regulator_enable(exynos->vdd33); 153bd8ce544ec35ff362489a7e3c059cf496c06c68eVivek Gautam if (ret) { 154bd8ce544ec35ff362489a7e3c059cf496c06c68eVivek Gautam dev_err(dev, "Failed to enable VDD33 supply\n"); 155bd8ce544ec35ff362489a7e3c059cf496c06c68eVivek Gautam goto err2; 156bd8ce544ec35ff362489a7e3c059cf496c06c68eVivek Gautam } 157bd8ce544ec35ff362489a7e3c059cf496c06c68eVivek Gautam 158bd8ce544ec35ff362489a7e3c059cf496c06c68eVivek Gautam exynos->vdd10 = devm_regulator_get(dev, "vdd10"); 159bd8ce544ec35ff362489a7e3c059cf496c06c68eVivek Gautam if (IS_ERR(exynos->vdd10)) { 160bd8ce544ec35ff362489a7e3c059cf496c06c68eVivek Gautam ret = PTR_ERR(exynos->vdd10); 161bd8ce544ec35ff362489a7e3c059cf496c06c68eVivek Gautam goto err3; 162bd8ce544ec35ff362489a7e3c059cf496c06c68eVivek Gautam } 163bd8ce544ec35ff362489a7e3c059cf496c06c68eVivek Gautam ret = regulator_enable(exynos->vdd10); 164bd8ce544ec35ff362489a7e3c059cf496c06c68eVivek Gautam if (ret) { 165bd8ce544ec35ff362489a7e3c059cf496c06c68eVivek Gautam dev_err(dev, "Failed to enable VDD10 supply\n"); 166bd8ce544ec35ff362489a7e3c059cf496c06c68eVivek Gautam goto err3; 167bd8ce544ec35ff362489a7e3c059cf496c06c68eVivek Gautam } 168bd8ce544ec35ff362489a7e3c059cf496c06c68eVivek Gautam 169adcf20dcd2629112c467f30a2c057479979ae64cVivek Gautam if (node) { 170adcf20dcd2629112c467f30a2c057479979ae64cVivek Gautam ret = of_platform_populate(node, NULL, NULL, dev); 171adcf20dcd2629112c467f30a2c057479979ae64cVivek Gautam if (ret) { 172adcf20dcd2629112c467f30a2c057479979ae64cVivek Gautam dev_err(dev, "failed to add dwc3 core\n"); 173bd8ce544ec35ff362489a7e3c059cf496c06c68eVivek Gautam goto err4; 174adcf20dcd2629112c467f30a2c057479979ae64cVivek Gautam } 175adcf20dcd2629112c467f30a2c057479979ae64cVivek Gautam } else { 176adcf20dcd2629112c467f30a2c057479979ae64cVivek Gautam dev_err(dev, "no device node, failed to add dwc3 core\n"); 177adcf20dcd2629112c467f30a2c057479979ae64cVivek Gautam ret = -ENODEV; 178bd8ce544ec35ff362489a7e3c059cf496c06c68eVivek Gautam goto err4; 179d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov } 180d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov 181d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov return 0; 182d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov 183bd8ce544ec35ff362489a7e3c059cf496c06c68eVivek Gautamerr4: 184bd8ce544ec35ff362489a7e3c059cf496c06c68eVivek Gautam regulator_disable(exynos->vdd10); 185bd8ce544ec35ff362489a7e3c059cf496c06c68eVivek Gautamerr3: 186bd8ce544ec35ff362489a7e3c059cf496c06c68eVivek Gautam regulator_disable(exynos->vdd33); 18720b97dc18323938a92319abf031936b7d2686eafJingoo Hanerr2: 188ddb5147cea10308fac7d4ea44cbd164929199e03Vivek Gautam clk_disable_unprepare(clk); 189d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov return ret; 190d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov} 191d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov 192fb4e98ab63433c4d3a1588ea91c73f1cd7ebaa00Bill Pembertonstatic int dwc3_exynos_remove(struct platform_device *pdev) 193d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov{ 194d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov struct dwc3_exynos *exynos = platform_get_drvdata(pdev); 195d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov 196022d0547aa8b00ff5035ba6207ebc2c08ea0a51fPeter Chen device_for_each_child(&pdev->dev, NULL, dwc3_exynos_remove_child); 197d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi platform_device_unregister(exynos->usb2_phy); 198d720f057fda4bae91a5108a11587374b9e396c6aFelipe Balbi platform_device_unregister(exynos->usb3_phy); 199d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov 200ddb5147cea10308fac7d4ea44cbd164929199e03Vivek Gautam clk_disable_unprepare(exynos->clk); 201d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov 202bd8ce544ec35ff362489a7e3c059cf496c06c68eVivek Gautam regulator_disable(exynos->vdd33); 203bd8ce544ec35ff362489a7e3c059cf496c06c68eVivek Gautam regulator_disable(exynos->vdd10); 204bd8ce544ec35ff362489a7e3c059cf496c06c68eVivek Gautam 205d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov return 0; 206d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov} 207d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov 208accefdd4b234f029a530928ee930b9dcac88fe84Vivek Gautam#ifdef CONFIG_OF 209accefdd4b234f029a530928ee930b9dcac88fe84Vivek Gautamstatic const struct of_device_id exynos_dwc3_match[] = { 210fe29db8fb22f5aa67af4bf30b85a0451c989a88bVivek Gautam { .compatible = "samsung,exynos5250-dwusb3" }, 211accefdd4b234f029a530928ee930b9dcac88fe84Vivek Gautam {}, 212accefdd4b234f029a530928ee930b9dcac88fe84Vivek Gautam}; 213accefdd4b234f029a530928ee930b9dcac88fe84Vivek GautamMODULE_DEVICE_TABLE(of, exynos_dwc3_match); 214accefdd4b234f029a530928ee930b9dcac88fe84Vivek Gautam#endif 215accefdd4b234f029a530928ee930b9dcac88fe84Vivek Gautam 21619fda7cd59eac8e537f63a4d9bd5973bf78a8c38Jingoo Han#ifdef CONFIG_PM_SLEEP 2170646caf754aa3ce55ef978d7f4a3e3d0aab7a187Vikas Sajjanstatic int dwc3_exynos_suspend(struct device *dev) 2180646caf754aa3ce55ef978d7f4a3e3d0aab7a187Vikas Sajjan{ 2190646caf754aa3ce55ef978d7f4a3e3d0aab7a187Vikas Sajjan struct dwc3_exynos *exynos = dev_get_drvdata(dev); 2200646caf754aa3ce55ef978d7f4a3e3d0aab7a187Vikas Sajjan 2210646caf754aa3ce55ef978d7f4a3e3d0aab7a187Vikas Sajjan clk_disable(exynos->clk); 2220646caf754aa3ce55ef978d7f4a3e3d0aab7a187Vikas Sajjan 223bd8ce544ec35ff362489a7e3c059cf496c06c68eVivek Gautam regulator_disable(exynos->vdd33); 224bd8ce544ec35ff362489a7e3c059cf496c06c68eVivek Gautam regulator_disable(exynos->vdd10); 225bd8ce544ec35ff362489a7e3c059cf496c06c68eVivek Gautam 2260646caf754aa3ce55ef978d7f4a3e3d0aab7a187Vikas Sajjan return 0; 2270646caf754aa3ce55ef978d7f4a3e3d0aab7a187Vikas Sajjan} 2280646caf754aa3ce55ef978d7f4a3e3d0aab7a187Vikas Sajjan 2290646caf754aa3ce55ef978d7f4a3e3d0aab7a187Vikas Sajjanstatic int dwc3_exynos_resume(struct device *dev) 2300646caf754aa3ce55ef978d7f4a3e3d0aab7a187Vikas Sajjan{ 2310646caf754aa3ce55ef978d7f4a3e3d0aab7a187Vikas Sajjan struct dwc3_exynos *exynos = dev_get_drvdata(dev); 232bd8ce544ec35ff362489a7e3c059cf496c06c68eVivek Gautam int ret; 233bd8ce544ec35ff362489a7e3c059cf496c06c68eVivek Gautam 234bd8ce544ec35ff362489a7e3c059cf496c06c68eVivek Gautam ret = regulator_enable(exynos->vdd33); 235bd8ce544ec35ff362489a7e3c059cf496c06c68eVivek Gautam if (ret) { 236bd8ce544ec35ff362489a7e3c059cf496c06c68eVivek Gautam dev_err(dev, "Failed to enable VDD33 supply\n"); 237bd8ce544ec35ff362489a7e3c059cf496c06c68eVivek Gautam return ret; 238bd8ce544ec35ff362489a7e3c059cf496c06c68eVivek Gautam } 239bd8ce544ec35ff362489a7e3c059cf496c06c68eVivek Gautam ret = regulator_enable(exynos->vdd10); 240bd8ce544ec35ff362489a7e3c059cf496c06c68eVivek Gautam if (ret) { 241bd8ce544ec35ff362489a7e3c059cf496c06c68eVivek Gautam dev_err(dev, "Failed to enable VDD10 supply\n"); 242bd8ce544ec35ff362489a7e3c059cf496c06c68eVivek Gautam return ret; 243bd8ce544ec35ff362489a7e3c059cf496c06c68eVivek Gautam } 2440646caf754aa3ce55ef978d7f4a3e3d0aab7a187Vikas Sajjan 2450646caf754aa3ce55ef978d7f4a3e3d0aab7a187Vikas Sajjan clk_enable(exynos->clk); 2460646caf754aa3ce55ef978d7f4a3e3d0aab7a187Vikas Sajjan 2470646caf754aa3ce55ef978d7f4a3e3d0aab7a187Vikas Sajjan /* runtime set active to reflect active state. */ 2480646caf754aa3ce55ef978d7f4a3e3d0aab7a187Vikas Sajjan pm_runtime_disable(dev); 2490646caf754aa3ce55ef978d7f4a3e3d0aab7a187Vikas Sajjan pm_runtime_set_active(dev); 2500646caf754aa3ce55ef978d7f4a3e3d0aab7a187Vikas Sajjan pm_runtime_enable(dev); 2510646caf754aa3ce55ef978d7f4a3e3d0aab7a187Vikas Sajjan 2520646caf754aa3ce55ef978d7f4a3e3d0aab7a187Vikas Sajjan return 0; 2530646caf754aa3ce55ef978d7f4a3e3d0aab7a187Vikas Sajjan} 2540646caf754aa3ce55ef978d7f4a3e3d0aab7a187Vikas Sajjan 2550646caf754aa3ce55ef978d7f4a3e3d0aab7a187Vikas Sajjanstatic const struct dev_pm_ops dwc3_exynos_dev_pm_ops = { 2560646caf754aa3ce55ef978d7f4a3e3d0aab7a187Vikas Sajjan SET_SYSTEM_SLEEP_PM_OPS(dwc3_exynos_suspend, dwc3_exynos_resume) 2570646caf754aa3ce55ef978d7f4a3e3d0aab7a187Vikas Sajjan}; 2580646caf754aa3ce55ef978d7f4a3e3d0aab7a187Vikas Sajjan 2590646caf754aa3ce55ef978d7f4a3e3d0aab7a187Vikas Sajjan#define DEV_PM_OPS (&dwc3_exynos_dev_pm_ops) 2600646caf754aa3ce55ef978d7f4a3e3d0aab7a187Vikas Sajjan#else 2610646caf754aa3ce55ef978d7f4a3e3d0aab7a187Vikas Sajjan#define DEV_PM_OPS NULL 26219fda7cd59eac8e537f63a4d9bd5973bf78a8c38Jingoo Han#endif /* CONFIG_PM_SLEEP */ 2630646caf754aa3ce55ef978d7f4a3e3d0aab7a187Vikas Sajjan 264d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirovstatic struct platform_driver dwc3_exynos_driver = { 265d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov .probe = dwc3_exynos_probe, 2667690417db5085f0de03aa70b8ca01b0118e8a1b4Bill Pemberton .remove = dwc3_exynos_remove, 267d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov .driver = { 268d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov .name = "exynos-dwc3", 269accefdd4b234f029a530928ee930b9dcac88fe84Vivek Gautam .of_match_table = of_match_ptr(exynos_dwc3_match), 2700646caf754aa3ce55ef978d7f4a3e3d0aab7a187Vikas Sajjan .pm = DEV_PM_OPS, 271d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov }, 272d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov}; 273d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov 274d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirovmodule_platform_driver(dwc3_exynos_driver); 275d28a9689c93195d39f91f35a9519876688605b65Anton Tikhomirov 276d28a9689c93195d39f91f35a9519876688605b65Anton TikhomirovMODULE_ALIAS("platform:exynos-dwc3"); 277d28a9689c93195d39f91f35a9519876688605b65Anton TikhomirovMODULE_AUTHOR("Anton Tikhomirov <av.tikhomirov@samsung.com>"); 2785945f789c864d8676b297880cc6961fea4511a7aFelipe BalbiMODULE_LICENSE("GPL v2"); 279d28a9689c93195d39f91f35a9519876688605b65Anton TikhomirovMODULE_DESCRIPTION("DesignWare USB3 EXYNOS Glue Layer"); 280