Blame view
drivers/usb/phy/phy-keystone.c
3.54 KB
25acdd08f
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
/* * phy-keystone - USB PHY, talking to dwc3 controller in Keystone. * * Copyright (C) 2013 Texas Instruments Incorporated - http://www.ti.com * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * Author: WingMan Kwok <w-kwok2@ti.com> * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * */ #include <linux/module.h> #include <linux/platform_device.h> |
d7078df6b
|
21 |
#include <linux/usb/usb_phy_generic.h> |
25acdd08f
|
22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
#include <linux/io.h> #include <linux/of.h> #include "phy-generic.h" /* USB PHY control register offsets */ #define USB_PHY_CTL_UTMI 0x0000 #define USB_PHY_CTL_PIPE 0x0004 #define USB_PHY_CTL_PARAM_1 0x0008 #define USB_PHY_CTL_PARAM_2 0x000c #define USB_PHY_CTL_CLOCK 0x0010 #define USB_PHY_CTL_PLL 0x0014 #define PHY_REF_SSP_EN BIT(29) struct keystone_usbphy { |
4525beeb9
|
38 |
struct usb_phy_generic usb_phy_gen; |
25acdd08f
|
39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 |
void __iomem *phy_ctrl; }; static inline u32 keystone_usbphy_readl(void __iomem *base, u32 offset) { return readl(base + offset); } static inline void keystone_usbphy_writel(void __iomem *base, u32 offset, u32 value) { writel(value, base + offset); } static int keystone_usbphy_init(struct usb_phy *phy) { struct keystone_usbphy *k_phy = dev_get_drvdata(phy->dev); u32 val; val = keystone_usbphy_readl(k_phy->phy_ctrl, USB_PHY_CTL_CLOCK); keystone_usbphy_writel(k_phy->phy_ctrl, USB_PHY_CTL_CLOCK, val | PHY_REF_SSP_EN); return 0; } static void keystone_usbphy_shutdown(struct usb_phy *phy) { struct keystone_usbphy *k_phy = dev_get_drvdata(phy->dev); u32 val; val = keystone_usbphy_readl(k_phy->phy_ctrl, USB_PHY_CTL_CLOCK); keystone_usbphy_writel(k_phy->phy_ctrl, USB_PHY_CTL_CLOCK, val &= ~PHY_REF_SSP_EN); } static int keystone_usbphy_probe(struct platform_device *pdev) { struct device *dev = &pdev->dev; struct keystone_usbphy *k_phy; struct resource *res; int ret; k_phy = devm_kzalloc(dev, sizeof(*k_phy), GFP_KERNEL); if (!k_phy) return -ENOMEM; res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
25acdd08f
|
86 87 88 |
k_phy->phy_ctrl = devm_ioremap_resource(dev, res); if (IS_ERR(k_phy->phy_ctrl)) return PTR_ERR(k_phy->phy_ctrl); |
c139e1425
|
89 |
ret = usb_phy_gen_create_phy(dev, &k_phy->usb_phy_gen, NULL); |
25acdd08f
|
90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 |
if (ret) return ret; k_phy->usb_phy_gen.phy.init = keystone_usbphy_init; k_phy->usb_phy_gen.phy.shutdown = keystone_usbphy_shutdown; platform_set_drvdata(pdev, k_phy); ret = usb_add_phy_dev(&k_phy->usb_phy_gen.phy); if (ret) return ret; return 0; } static int keystone_usbphy_remove(struct platform_device *pdev) { struct keystone_usbphy *k_phy = platform_get_drvdata(pdev); usb_remove_phy(&k_phy->usb_phy_gen.phy); return 0; } static const struct of_device_id keystone_usbphy_ids[] = { { .compatible = "ti,keystone-usbphy" }, { } }; MODULE_DEVICE_TABLE(of, keystone_usbphy_ids); static struct platform_driver keystone_usbphy_driver = { .probe = keystone_usbphy_probe, .remove = keystone_usbphy_remove, .driver = { .name = "keystone-usbphy", .owner = THIS_MODULE, |
ed40082da
|
126 |
.of_match_table = keystone_usbphy_ids, |
25acdd08f
|
127 128 129 130 131 132 133 134 135 |
}, }; module_platform_driver(keystone_usbphy_driver); MODULE_ALIAS("platform:keystone-usbphy"); MODULE_AUTHOR("Texas Instruments Inc."); MODULE_DESCRIPTION("Keystone USB phy driver"); MODULE_LICENSE("GPL v2"); |