2 * Copyright (c) 2013, NVIDIA CORPORATION. All rights reserved.
4 * This software is licensed under the terms of the GNU General Public
5 * License version 2, as published by the Free Software Foundation, and
6 * may be copied, distributed, and modified under those terms.
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
15 #include <linux/export.h>
16 #include <linux/clk.h>
18 #include <mach/iomap.h>
19 #include <mach/tegra_usb_pad_ctrl.h>
21 static DEFINE_SPINLOCK(utmip_pad_lock);
22 static int utmip_pad_count;
23 static struct clk *utmi_pad_clk;
25 int utmi_phy_iddq_override(bool set)
27 unsigned long val, flags;
28 void __iomem *clk_base = IO_ADDRESS(TEGRA_CLK_RESET_BASE);
30 spin_lock_irqsave(&utmip_pad_lock, flags);
31 val = readl(clk_base + UTMIPLL_HW_PWRDN_CFG0);
32 if (set && !utmip_pad_count)
33 val |= UTMIPLL_HW_PWRDN_CFG0_IDDQ_OVERRIDE;
34 else if (!set && utmip_pad_count)
35 val &= ~UTMIPLL_HW_PWRDN_CFG0_IDDQ_OVERRIDE;
38 val |= UTMIPLL_HW_PWRDN_CFG0_IDDQ_SWCTL;
39 writel(val, clk_base + UTMIPLL_HW_PWRDN_CFG0);
42 spin_unlock_irqrestore(&utmip_pad_lock, flags);
45 EXPORT_SYMBOL_GPL(utmi_phy_iddq_override);
47 int utmi_phy_pad_enable(bool enableOTG)
49 unsigned long val, flags;
50 void __iomem *pad_base = IO_ADDRESS(TEGRA_USB_BASE);
53 utmi_pad_clk = clk_get_sys("utmip-pad", NULL);
55 clk_enable(utmi_pad_clk);
57 spin_lock_irqsave(&utmip_pad_lock, flags);
60 val = readl(pad_base + UTMIP_BIAS_CFG0);
64 val |= UTMIP_HSSQUELCH_LEVEL(0x2) | UTMIP_HSDISCON_LEVEL(0x1) |
65 UTMIP_HSDISCON_LEVEL_MSB;
66 writel(val, pad_base + UTMIP_BIAS_CFG0);
68 spin_unlock_irqrestore(&utmip_pad_lock, flags);
70 clk_disable(utmi_pad_clk);
74 EXPORT_SYMBOL_GPL(utmi_phy_pad_enable);
76 int utmi_phy_pad_disable(bool disableOTG)
78 unsigned long val, flags;
79 void __iomem *pad_base = IO_ADDRESS(TEGRA_USB_BASE);
82 utmi_pad_clk = clk_get_sys("utmip-pad", NULL);
84 clk_enable(utmi_pad_clk);
85 spin_lock_irqsave(&utmip_pad_lock, flags);
87 if (!utmip_pad_count) {
88 pr_err("%s: utmip pad already powered off\n", __func__);
91 if (--utmip_pad_count == 0) {
92 val = readl(pad_base + UTMIP_BIAS_CFG0);
93 val |= UTMIP_OTGPD | UTMIP_BIASPD;
94 val &= ~(UTMIP_HSSQUELCH_LEVEL(~0) | UTMIP_HSDISCON_LEVEL(~0) |
95 UTMIP_HSDISCON_LEVEL_MSB);
96 writel(val, pad_base + UTMIP_BIAS_CFG0);
97 } else if (disableOTG) {
98 val = readl(pad_base + UTMIP_BIAS_CFG0);
100 writel(val, pad_base + UTMIP_BIAS_CFG0);
103 spin_unlock_irqrestore(&utmip_pad_lock, flags);
104 clk_disable(utmi_pad_clk);
108 EXPORT_SYMBOL_GPL(utmi_phy_pad_disable);