Blame view
drivers/phy/phy-lpc18xx-usb-otg.c
3.35 KB
d2912cb15 treewide: Replace... |
1 |
// SPDX-License-Identifier: GPL-2.0-only |
cbf919bd3 phy: add lpc18xx ... |
2 3 4 5 |
/* * PHY driver for NXP LPC18xx/43xx internal USB OTG PHY * * Copyright (C) 2015 Joachim Eastwood <manabian@gmail.com> |
cbf919bd3 phy: add lpc18xx ... |
6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
*/ #include <linux/clk.h> #include <linux/err.h> #include <linux/mfd/syscon.h> #include <linux/module.h> #include <linux/of.h> #include <linux/phy/phy.h> #include <linux/platform_device.h> #include <linux/regmap.h> /* USB OTG PHY register offset and bit in CREG */ #define LPC18XX_CREG_CREG0 0x004 #define LPC18XX_CREG_CREG0_USB0PHY BIT(5) struct lpc18xx_usb_otg_phy { struct phy *phy; struct clk *clk; struct regmap *reg; }; static int lpc18xx_usb_otg_phy_init(struct phy *phy) { struct lpc18xx_usb_otg_phy *lpc = phy_get_drvdata(phy); int ret; |
cfd093bbb phy: lpc18xx-usb-... |
31 32 |
/* The PHY must be clocked at 480 MHz */ ret = clk_set_rate(lpc->clk, 480000000); |
cbf919bd3 phy: add lpc18xx ... |
33 34 |
if (ret) return ret; |
cfd093bbb phy: lpc18xx-usb-... |
35 |
return clk_prepare(lpc->clk); |
cbf919bd3 phy: add lpc18xx ... |
36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
} static int lpc18xx_usb_otg_phy_exit(struct phy *phy) { struct lpc18xx_usb_otg_phy *lpc = phy_get_drvdata(phy); clk_unprepare(lpc->clk); return 0; } static int lpc18xx_usb_otg_phy_power_on(struct phy *phy) { struct lpc18xx_usb_otg_phy *lpc = phy_get_drvdata(phy); int ret; ret = clk_enable(lpc->clk); if (ret) return ret; /* The bit in CREG is cleared to enable the PHY */ |
124380cb0 phy: lpc18xx-usb-... |
57 |
ret = regmap_update_bits(lpc->reg, LPC18XX_CREG_CREG0, |
cbf919bd3 phy: add lpc18xx ... |
58 |
LPC18XX_CREG_CREG0_USB0PHY, 0); |
124380cb0 phy: lpc18xx-usb-... |
59 60 61 62 63 64 |
if (ret) { clk_disable(lpc->clk); return ret; } return 0; |
cbf919bd3 phy: add lpc18xx ... |
65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 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 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 |
} static int lpc18xx_usb_otg_phy_power_off(struct phy *phy) { struct lpc18xx_usb_otg_phy *lpc = phy_get_drvdata(phy); int ret; ret = regmap_update_bits(lpc->reg, LPC18XX_CREG_CREG0, LPC18XX_CREG_CREG0_USB0PHY, LPC18XX_CREG_CREG0_USB0PHY); if (ret) return ret; clk_disable(lpc->clk); return 0; } static const struct phy_ops lpc18xx_usb_otg_phy_ops = { .init = lpc18xx_usb_otg_phy_init, .exit = lpc18xx_usb_otg_phy_exit, .power_on = lpc18xx_usb_otg_phy_power_on, .power_off = lpc18xx_usb_otg_phy_power_off, .owner = THIS_MODULE, }; static int lpc18xx_usb_otg_phy_probe(struct platform_device *pdev) { struct phy_provider *phy_provider; struct lpc18xx_usb_otg_phy *lpc; lpc = devm_kzalloc(&pdev->dev, sizeof(*lpc), GFP_KERNEL); if (!lpc) return -ENOMEM; lpc->reg = syscon_node_to_regmap(pdev->dev.of_node->parent); if (IS_ERR(lpc->reg)) { dev_err(&pdev->dev, "failed to get syscon "); return PTR_ERR(lpc->reg); } lpc->clk = devm_clk_get(&pdev->dev, NULL); if (IS_ERR(lpc->clk)) { dev_err(&pdev->dev, "failed to get clock "); return PTR_ERR(lpc->clk); } lpc->phy = devm_phy_create(&pdev->dev, NULL, &lpc18xx_usb_otg_phy_ops); if (IS_ERR(lpc->phy)) { dev_err(&pdev->dev, "failed to create PHY "); return PTR_ERR(lpc->phy); } phy_set_drvdata(lpc->phy, lpc); phy_provider = devm_of_phy_provider_register(&pdev->dev, of_phy_simple_xlate); return PTR_ERR_OR_ZERO(phy_provider); } static const struct of_device_id lpc18xx_usb_otg_phy_match[] = { { .compatible = "nxp,lpc1850-usb-otg-phy" }, { } }; MODULE_DEVICE_TABLE(of, lpc18xx_usb_otg_phy_match); static struct platform_driver lpc18xx_usb_otg_phy_driver = { .probe = lpc18xx_usb_otg_phy_probe, .driver = { .name = "lpc18xx-usb-otg-phy", .of_match_table = lpc18xx_usb_otg_phy_match, }, }; module_platform_driver(lpc18xx_usb_otg_phy_driver); MODULE_AUTHOR("Joachim Eastwood <manabian@gmail.com>"); MODULE_DESCRIPTION("NXP LPC18xx/43xx USB OTG PHY driver"); MODULE_LICENSE("GPL v2"); |