blob: cc1a0ea5213980a8bf8463b44b02644238d6ce57 [file] [log] [blame]
Mayank Rana3cb43a32016-08-02 12:10:20 -07001/*
Pratham Pratap945af2a2018-01-24 18:29:33 +05302 * Copyright (c) 2014-2018, The Linux Foundation. All rights reserved.
Mayank Rana3cb43a32016-08-02 12:10:20 -07003 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License version 2 and
6 * only version 2 as published by the Free Software Foundation.
7 *
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.
12 */
13
14#include <linux/module.h>
15#include <linux/kernel.h>
16#include <linux/err.h>
17#include <linux/slab.h>
18#include <linux/clk.h>
Mayank Rana3cb43a32016-08-02 12:10:20 -070019#include <linux/delay.h>
20#include <linux/io.h>
21#include <linux/of.h>
22#include <linux/platform_device.h>
23#include <linux/power_supply.h>
24#include <linux/regulator/consumer.h>
25#include <linux/regulator/driver.h>
26#include <linux/regulator/machine.h>
27#include <linux/usb/phy.h>
Amit Nischal4d278212016-06-06 17:54:34 +053028#include <linux/reset.h>
Pratham Pratap945af2a2018-01-24 18:29:33 +053029#include <linux/nvmem-consumer.h>
Mayank Rana76a040f2017-11-20 14:10:37 -080030#include <linux/debugfs.h>
Hemant Kumar2bb3bdf2017-11-22 13:53:08 -080031#include <linux/hrtimer.h>
Mayank Rana3cb43a32016-08-02 12:10:20 -070032
Mayank Rana9c6b12d2017-06-22 16:23:26 -070033/* QUSB2PHY_PWR_CTRL1 register related bits */
Mayank Rana3cb43a32016-08-02 12:10:20 -070034#define PWR_CTRL1_POWR_DOWN BIT(0)
35
Mayank Rana9c6b12d2017-06-22 16:23:26 -070036/* QUSB2PHY_PLL_COMMON_STATUS_ONE register related bits */
Mayank Rana3cb43a32016-08-02 12:10:20 -070037#define CORE_READY_STATUS BIT(0)
38
Vamsi Krishna Samavedamf4da1dc2016-08-25 13:57:21 -070039/* Get TUNE value from efuse bit-mask */
40#define TUNE_VAL_MASK(val, pos, mask) ((val >> pos) & mask)
Mayank Rana3cb43a32016-08-02 12:10:20 -070041
Mayank Rana9c6b12d2017-06-22 16:23:26 -070042/* QUSB2PHY_INTR_CTRL register related bits */
Mayank Rana3cb43a32016-08-02 12:10:20 -070043#define DMSE_INTR_HIGH_SEL BIT(4)
44#define DPSE_INTR_HIGH_SEL BIT(3)
45#define CHG_DET_INTR_EN BIT(2)
46#define DMSE_INTR_EN BIT(1)
47#define DPSE_INTR_EN BIT(0)
48
Mayank Rana9c6b12d2017-06-22 16:23:26 -070049/* QUSB2PHY_PLL_CORE_INPUT_OVERRIDE register related bits */
Mayank Ranab7f212e2017-04-06 17:54:35 -070050#define CORE_PLL_RATE BIT(0)
51#define CORE_PLL_RATE_MUX BIT(1)
52#define CORE_PLL_EN BIT(2)
53#define CORE_PLL_EN_MUX BIT(3)
54#define CORE_PLL_EN_FROM_RESET BIT(4)
55#define CORE_RESET BIT(5)
56#define CORE_RESET_MUX BIT(6)
57
Mayank Rana3cb43a32016-08-02 12:10:20 -070058#define QUSB2PHY_1P8_VOL_MIN 1800000 /* uV */
59#define QUSB2PHY_1P8_VOL_MAX 1800000 /* uV */
60#define QUSB2PHY_1P8_HPM_LOAD 30000 /* uA */
61
62#define QUSB2PHY_3P3_VOL_MIN 3075000 /* uV */
63#define QUSB2PHY_3P3_VOL_MAX 3200000 /* uV */
64#define QUSB2PHY_3P3_HPM_LOAD 30000 /* uA */
65
66#define LINESTATE_DP BIT(0)
67#define LINESTATE_DM BIT(1)
68
Mayank Rana547e24c2017-11-01 15:47:04 -070069#define BIAS_CTRL_2_OVERRIDE_VAL 0x28
70
Hemant Kumar91f5e542017-11-20 16:25:46 -080071#define SQ_CTRL1_CHIRP_DISABLE 0x20
72#define SQ_CTRL2_CHIRP_DISABLE 0x80
73
Mayank Rana547e24c2017-11-01 15:47:04 -070074/* PERIPH_SS_PHY_REFGEN_NORTH_BG_CTRL register bits */
75#define BANDGAP_BYPASS BIT(0)
76
Mayank Rana9c6b12d2017-06-22 16:23:26 -070077enum qusb_phy_reg {
78 PORT_TUNE1,
79 PLL_COMMON_STATUS_ONE,
80 PWR_CTRL1,
81 INTR_CTRL,
82 PLL_CORE_INPUT_OVERRIDE,
83 TEST1,
Mayank Rana129111e2017-11-01 15:31:22 -070084 BIAS_CTRL_2,
Hemant Kumar91f5e542017-11-20 16:25:46 -080085 SQ_CTRL1,
86 SQ_CTRL2,
Mayank Rana9c6b12d2017-06-22 16:23:26 -070087 USB2_PHY_REG_MAX,
88};
89
Mayank Rana3cb43a32016-08-02 12:10:20 -070090struct qusb_phy {
91 struct usb_phy phy;
Hemant Kumar164cc1b2017-04-27 19:39:58 -070092 struct mutex lock;
Mayank Rana3cb43a32016-08-02 12:10:20 -070093 void __iomem *base;
Vamsi Krishna Samavedamf4da1dc2016-08-25 13:57:21 -070094 void __iomem *efuse_reg;
Mayank Rana547e24c2017-11-01 15:47:04 -070095 void __iomem *refgen_north_bg_reg;
Mayank Rana3cb43a32016-08-02 12:10:20 -070096
97 struct clk *ref_clk_src;
98 struct clk *ref_clk;
99 struct clk *cfg_ahb_clk;
Amit Nischal4d278212016-06-06 17:54:34 +0530100 struct reset_control *phy_reset;
Mayank Rana3cb43a32016-08-02 12:10:20 -0700101
102 struct regulator *vdd;
103 struct regulator *vdda33;
104 struct regulator *vdda18;
105 int vdd_levels[3]; /* none, low, high */
106 int init_seq_len;
107 int *qusb_phy_init_seq;
108 int host_init_seq_len;
109 int *qusb_phy_host_init_seq;
110
Mayank Rana9c6b12d2017-06-22 16:23:26 -0700111 unsigned int *phy_reg;
112 int qusb_phy_reg_offset_cnt;
113
Vamsi Krishna Samavedamf4da1dc2016-08-25 13:57:21 -0700114 u32 tune_val;
115 int efuse_bit_pos;
116 int efuse_num_of_bits;
Mayank Rana3cb43a32016-08-02 12:10:20 -0700117
Hemant Kumar164cc1b2017-04-27 19:39:58 -0700118 int power_enabled_ref;
Mayank Rana3cb43a32016-08-02 12:10:20 -0700119 bool clocks_enabled;
120 bool cable_connected;
121 bool suspended;
Mayank Ranadadae592017-07-21 09:03:32 -0700122 bool dpdm_enable;
Mayank Rana3cb43a32016-08-02 12:10:20 -0700123
124 struct regulator_desc dpdm_rdesc;
125 struct regulator_dev *dpdm_rdev;
126
Hemant Kumar91f5e542017-11-20 16:25:46 -0800127 u32 sq_ctrl1_default;
128 u32 sq_ctrl2_default;
129 bool chirp_disable;
130
Hemant Kumar2bb3bdf2017-11-22 13:53:08 -0800131 struct pinctrl *pinctrl;
132 struct pinctrl_state *atest_usb13_suspend;
133 struct pinctrl_state *atest_usb13_active;
134
Mayank Rana3cb43a32016-08-02 12:10:20 -0700135 /* emulation targets specific */
136 void __iomem *emu_phy_base;
137 bool emulation;
138 int *emu_init_seq;
139 int emu_init_seq_len;
140 int *phy_pll_reset_seq;
141 int phy_pll_reset_seq_len;
142 int *emu_dcm_reset_seq;
143 int emu_dcm_reset_seq_len;
Mayank Rana76a040f2017-11-20 14:10:37 -0800144
145 /* override TUNEX registers value */
146 struct dentry *root;
147 u8 tune[5];
Hemant Kumar2bb3bdf2017-11-22 13:53:08 -0800148
149 struct hrtimer timer;
Pratham Pratap945af2a2018-01-24 18:29:33 +0530150 int soc_min_rev;
Mayank Rana3cb43a32016-08-02 12:10:20 -0700151};
152
Pratham Pratap945af2a2018-01-24 18:29:33 +0530153#ifdef CONFIG_NVMEM
154/* Parse qfprom data for deciding on errata work-arounds */
155static long qfprom_read(struct device *dev, const char *name)
156{
157 struct nvmem_cell *cell;
158 ssize_t len = 0;
159 u32 *buf, val = 0;
160 long err = 0;
161
162 cell = nvmem_cell_get(dev, name);
163 if (IS_ERR(cell)) {
164 err = PTR_ERR(cell);
165 dev_err(dev, "failed opening nvmem cell err : %ld\n", err);
166 /* If entry does not exist, then that is not an error */
167 if (err == -ENOENT)
168 err = 0;
169 return err;
170 }
171
172 buf = (u32 *)nvmem_cell_read(cell, &len);
173 if (IS_ERR(buf) || !len) {
174 dev_err(dev, "Failed reading nvmem cell, err: %u, bytes fetched: %zd\n",
175 *buf, len);
176 if (!IS_ERR(buf)) {
177 kfree(buf);
178 err = -EINVAL;
179 } else {
180 err = PTR_ERR(buf);
181 }
182 } else {
183 val = *buf;
184 kfree(buf);
185 }
186
187 nvmem_cell_put(cell);
188 return err ? err : (long) val;
189}
190
191/* Reads the SoC version */
192static int qusb_phy_get_socrev(struct device *dev, struct qusb_phy *qphy)
193{
194 qphy->soc_min_rev = qfprom_read(dev, "minor_rev");
195 if (qphy->soc_min_rev < 0)
196 dev_err(dev, "failed getting soc_min_rev, err : %d\n",
197 qphy->soc_min_rev);
198
199 return qphy->soc_min_rev;
200};
201#else
202/* Reads the SoC version */
203static int qusb_phy_get_socrev(struct device *dev, struct qusb_phy *qphy)
204{
205 return 0;
206}
207#endif
208
Mayank Rana3cb43a32016-08-02 12:10:20 -0700209static void qusb_phy_enable_clocks(struct qusb_phy *qphy, bool on)
210{
211 dev_dbg(qphy->phy.dev, "%s(): clocks_enabled:%d on:%d\n",
212 __func__, qphy->clocks_enabled, on);
213
214 if (!qphy->clocks_enabled && on) {
215 clk_prepare_enable(qphy->ref_clk_src);
Devdutt Patnaik1c03dfd2017-03-19 23:38:43 -0700216 if (qphy->ref_clk)
217 clk_prepare_enable(qphy->ref_clk);
218
219 if (qphy->cfg_ahb_clk)
220 clk_prepare_enable(qphy->cfg_ahb_clk);
221
Mayank Rana3cb43a32016-08-02 12:10:20 -0700222 qphy->clocks_enabled = true;
223 }
224
225 if (qphy->clocks_enabled && !on) {
Devdutt Patnaik1c03dfd2017-03-19 23:38:43 -0700226 if (qphy->cfg_ahb_clk)
227 clk_disable_unprepare(qphy->cfg_ahb_clk);
228
229 if (qphy->ref_clk)
230 clk_disable_unprepare(qphy->ref_clk);
231
Mayank Rana3cb43a32016-08-02 12:10:20 -0700232 clk_disable_unprepare(qphy->ref_clk_src);
Mayank Rana3cb43a32016-08-02 12:10:20 -0700233 qphy->clocks_enabled = false;
234 }
235
236 dev_dbg(qphy->phy.dev, "%s(): clocks_enabled:%d\n", __func__,
237 qphy->clocks_enabled);
238}
239
240static int qusb_phy_config_vdd(struct qusb_phy *qphy, int high)
241{
242 int min, ret;
243
244 min = high ? 1 : 0; /* low or none? */
245 ret = regulator_set_voltage(qphy->vdd, qphy->vdd_levels[min],
246 qphy->vdd_levels[2]);
247 if (ret) {
248 dev_err(qphy->phy.dev, "unable to set voltage for qusb vdd\n");
249 return ret;
250 }
251
252 dev_dbg(qphy->phy.dev, "min_vol:%d max_vol:%d\n",
253 qphy->vdd_levels[min], qphy->vdd_levels[2]);
254 return ret;
255}
256
Hemant Kumar7dc63722017-04-27 17:51:11 -0700257static int qusb_phy_enable_power(struct qusb_phy *qphy, bool on)
Mayank Rana3cb43a32016-08-02 12:10:20 -0700258{
259 int ret = 0;
260
Hemant Kumar164cc1b2017-04-27 19:39:58 -0700261 mutex_lock(&qphy->lock);
Mayank Rana3cb43a32016-08-02 12:10:20 -0700262
Hemant Kumar164cc1b2017-04-27 19:39:58 -0700263 dev_dbg(qphy->phy.dev,
264 "%s:req to turn %s regulators. power_enabled_ref:%d\n",
265 __func__, on ? "on" : "off", qphy->power_enabled_ref);
266
267 if (on && ++qphy->power_enabled_ref > 1) {
268 dev_dbg(qphy->phy.dev, "PHYs' regulators are already on\n");
269 goto done;
Mayank Rana3cb43a32016-08-02 12:10:20 -0700270 }
271
Hemant Kumar164cc1b2017-04-27 19:39:58 -0700272 if (!on) {
273 if (on == qphy->power_enabled_ref) {
274 dev_dbg(qphy->phy.dev,
275 "PHYs' regulators are already off\n");
276 goto done;
277 }
278
279 qphy->power_enabled_ref--;
280 if (!qphy->power_enabled_ref)
281 goto disable_vdda33;
282
283 dev_dbg(qphy->phy.dev, "Skip turning off PHYs' regulators\n");
284 goto done;
285 }
Mayank Rana3cb43a32016-08-02 12:10:20 -0700286
Hemant Kumar7dc63722017-04-27 17:51:11 -0700287 ret = qusb_phy_config_vdd(qphy, true);
288 if (ret) {
289 dev_err(qphy->phy.dev, "Unable to config VDD:%d\n",
290 ret);
291 goto err_vdd;
292 }
Mayank Rana3cb43a32016-08-02 12:10:20 -0700293
Hemant Kumar7dc63722017-04-27 17:51:11 -0700294 ret = regulator_enable(qphy->vdd);
295 if (ret) {
296 dev_err(qphy->phy.dev, "Unable to enable VDD\n");
297 goto unconfig_vdd;
Mayank Rana3cb43a32016-08-02 12:10:20 -0700298 }
299
300 ret = regulator_set_load(qphy->vdda18, QUSB2PHY_1P8_HPM_LOAD);
301 if (ret < 0) {
302 dev_err(qphy->phy.dev, "Unable to set HPM of vdda18:%d\n", ret);
303 goto disable_vdd;
304 }
305
306 ret = regulator_set_voltage(qphy->vdda18, QUSB2PHY_1P8_VOL_MIN,
307 QUSB2PHY_1P8_VOL_MAX);
308 if (ret) {
309 dev_err(qphy->phy.dev,
310 "Unable to set voltage for vdda18:%d\n", ret);
311 goto put_vdda18_lpm;
312 }
313
314 ret = regulator_enable(qphy->vdda18);
315 if (ret) {
316 dev_err(qphy->phy.dev, "Unable to enable vdda18:%d\n", ret);
317 goto unset_vdda18;
318 }
319
320 ret = regulator_set_load(qphy->vdda33, QUSB2PHY_3P3_HPM_LOAD);
321 if (ret < 0) {
322 dev_err(qphy->phy.dev, "Unable to set HPM of vdda33:%d\n", ret);
323 goto disable_vdda18;
324 }
325
326 ret = regulator_set_voltage(qphy->vdda33, QUSB2PHY_3P3_VOL_MIN,
327 QUSB2PHY_3P3_VOL_MAX);
328 if (ret) {
329 dev_err(qphy->phy.dev,
330 "Unable to set voltage for vdda33:%d\n", ret);
331 goto put_vdda33_lpm;
332 }
333
334 ret = regulator_enable(qphy->vdda33);
335 if (ret) {
336 dev_err(qphy->phy.dev, "Unable to enable vdda33:%d\n", ret);
337 goto unset_vdd33;
338 }
339
Mayank Rana3cb43a32016-08-02 12:10:20 -0700340 pr_debug("%s(): QUSB PHY's regulators are turned ON.\n", __func__);
Hemant Kumar164cc1b2017-04-27 19:39:58 -0700341
342 mutex_unlock(&qphy->lock);
Mayank Rana3cb43a32016-08-02 12:10:20 -0700343 return ret;
344
345disable_vdda33:
346 ret = regulator_disable(qphy->vdda33);
347 if (ret)
348 dev_err(qphy->phy.dev, "Unable to disable vdda33:%d\n", ret);
349
350unset_vdd33:
351 ret = regulator_set_voltage(qphy->vdda33, 0, QUSB2PHY_3P3_VOL_MAX);
352 if (ret)
353 dev_err(qphy->phy.dev,
354 "Unable to set (0) voltage for vdda33:%d\n", ret);
355
356put_vdda33_lpm:
357 ret = regulator_set_load(qphy->vdda33, 0);
358 if (ret < 0)
359 dev_err(qphy->phy.dev, "Unable to set (0) HPM of vdda33\n");
360
361disable_vdda18:
362 ret = regulator_disable(qphy->vdda18);
363 if (ret)
364 dev_err(qphy->phy.dev, "Unable to disable vdda18:%d\n", ret);
365
366unset_vdda18:
367 ret = regulator_set_voltage(qphy->vdda18, 0, QUSB2PHY_1P8_VOL_MAX);
368 if (ret)
369 dev_err(qphy->phy.dev,
370 "Unable to set (0) voltage for vdda18:%d\n", ret);
371
372put_vdda18_lpm:
373 ret = regulator_set_load(qphy->vdda18, 0);
374 if (ret < 0)
375 dev_err(qphy->phy.dev, "Unable to set LPM of vdda18\n");
376
377disable_vdd:
Hemant Kumar7dc63722017-04-27 17:51:11 -0700378 ret = regulator_disable(qphy->vdd);
379 if (ret)
380 dev_err(qphy->phy.dev, "Unable to disable vdd:%d\n",
381 ret);
Mayank Rana3cb43a32016-08-02 12:10:20 -0700382
383unconfig_vdd:
Hemant Kumar7dc63722017-04-27 17:51:11 -0700384 ret = qusb_phy_config_vdd(qphy, false);
385 if (ret)
386 dev_err(qphy->phy.dev, "Unable unconfig VDD:%d\n",
387 ret);
Mayank Rana3cb43a32016-08-02 12:10:20 -0700388err_vdd:
Mayank Rana3cb43a32016-08-02 12:10:20 -0700389 dev_dbg(qphy->phy.dev, "QUSB PHY's regulators are turned OFF.\n");
Hemant Kumar164cc1b2017-04-27 19:39:58 -0700390
391 /* in case of error in turning on regulators */
392 if (qphy->power_enabled_ref)
393 qphy->power_enabled_ref--;
394done:
395 mutex_unlock(&qphy->lock);
Mayank Rana3cb43a32016-08-02 12:10:20 -0700396 return ret;
397}
398
Vamsi Krishna Samavedamf4da1dc2016-08-25 13:57:21 -0700399static void qusb_phy_get_tune1_param(struct qusb_phy *qphy)
Mayank Rana3cb43a32016-08-02 12:10:20 -0700400{
Vamsi Krishna Samavedamf4da1dc2016-08-25 13:57:21 -0700401 u8 reg;
Mayank Rana3cb43a32016-08-02 12:10:20 -0700402 u32 bit_mask = 1;
403
404 pr_debug("%s(): num_of_bits:%d bit_pos:%d\n", __func__,
Vamsi Krishna Samavedamf4da1dc2016-08-25 13:57:21 -0700405 qphy->efuse_num_of_bits,
406 qphy->efuse_bit_pos);
Mayank Rana3cb43a32016-08-02 12:10:20 -0700407
408 /* get bit mask based on number of bits to use with efuse reg */
Vamsi Krishna Samavedamf4da1dc2016-08-25 13:57:21 -0700409 bit_mask = (bit_mask << qphy->efuse_num_of_bits) - 1;
Mayank Rana3cb43a32016-08-02 12:10:20 -0700410
411 /*
Vamsi Krishna Samavedamf4da1dc2016-08-25 13:57:21 -0700412 * if efuse reg is updated (i.e non-zero) then use it to program
413 * tune parameters
Mayank Rana3cb43a32016-08-02 12:10:20 -0700414 */
Vamsi Krishna Samavedamf4da1dc2016-08-25 13:57:21 -0700415 qphy->tune_val = readl_relaxed(qphy->efuse_reg);
416 pr_debug("%s(): bit_mask:%d efuse based tune1 value:%d\n",
417 __func__, bit_mask, qphy->tune_val);
Mayank Rana3cb43a32016-08-02 12:10:20 -0700418
Vamsi Krishna Samavedamf4da1dc2016-08-25 13:57:21 -0700419 qphy->tune_val = TUNE_VAL_MASK(qphy->tune_val,
420 qphy->efuse_bit_pos, bit_mask);
Mayank Rana9c6b12d2017-06-22 16:23:26 -0700421 reg = readb_relaxed(qphy->base + qphy->phy_reg[PORT_TUNE1]);
Vamsi Krishna Samavedamf4da1dc2016-08-25 13:57:21 -0700422 if (qphy->tune_val) {
423 reg = reg & 0x0f;
424 reg |= (qphy->tune_val << 4);
425 }
Mayank Rana3cb43a32016-08-02 12:10:20 -0700426
Vamsi Krishna Samavedamf4da1dc2016-08-25 13:57:21 -0700427 qphy->tune_val = reg;
Mayank Rana3cb43a32016-08-02 12:10:20 -0700428}
429
430static void qusb_phy_write_seq(void __iomem *base, u32 *seq, int cnt,
431 unsigned long delay)
432{
433 int i;
434
435 pr_debug("Seq count:%d\n", cnt);
436 for (i = 0; i < cnt; i = i+2) {
437 pr_debug("write 0x%02x to 0x%02x\n", seq[i], seq[i+1]);
438 writel_relaxed(seq[i], base + seq[i+1]);
439 if (delay)
440 usleep_range(delay, (delay + 2000));
441 }
442}
443
Mayank Ranab7f212e2017-04-06 17:54:35 -0700444static void qusb_phy_reset(struct qusb_phy *qphy)
445{
446 int ret;
447
448 ret = reset_control_assert(qphy->phy_reset);
449 if (ret)
450 dev_err(qphy->phy.dev, "%s: phy_reset assert failed\n",
451 __func__);
452 usleep_range(100, 150);
453
454 ret = reset_control_deassert(qphy->phy_reset);
455 if (ret)
456 dev_err(qphy->phy.dev, "%s: phy_reset deassert failed\n",
457 __func__);
458}
459
Mayank Rana3cb43a32016-08-02 12:10:20 -0700460static void qusb_phy_host_init(struct usb_phy *phy)
461{
462 u8 reg;
463 struct qusb_phy *qphy = container_of(phy, struct qusb_phy, phy);
464
465 dev_dbg(phy->dev, "%s\n", __func__);
466
Mayank Ranab7f212e2017-04-06 17:54:35 -0700467 qusb_phy_reset(qphy);
Mayank Rana3cb43a32016-08-02 12:10:20 -0700468 qusb_phy_write_seq(qphy->base, qphy->qusb_phy_host_init_seq,
469 qphy->host_init_seq_len, 0);
470
471 /* Ensure above write is completed before turning ON ref clk */
472 wmb();
473
474 /* Require to get phy pll lock successfully */
475 usleep_range(150, 160);
476
Mayank Rana9c6b12d2017-06-22 16:23:26 -0700477 reg = readb_relaxed(qphy->base + qphy->phy_reg[PLL_COMMON_STATUS_ONE]);
Mayank Rana3cb43a32016-08-02 12:10:20 -0700478 dev_dbg(phy->dev, "QUSB2PHY_PLL_COMMON_STATUS_ONE:%x\n", reg);
479 if (!(reg & CORE_READY_STATUS)) {
480 dev_err(phy->dev, "QUSB PHY PLL LOCK fails:%x\n", reg);
481 WARN_ON(1);
482 }
483}
484
485static int qusb_phy_init(struct usb_phy *phy)
486{
487 struct qusb_phy *qphy = container_of(phy, struct qusb_phy, phy);
Mayank Rana76a040f2017-11-20 14:10:37 -0800488 int ret, p_index;
Mayank Rana3cb43a32016-08-02 12:10:20 -0700489 u8 reg;
490
491 dev_dbg(phy->dev, "%s\n", __func__);
492
Hemant Kumar7dc63722017-04-27 17:51:11 -0700493 ret = qusb_phy_enable_power(qphy, true);
Mayank Rana3cb43a32016-08-02 12:10:20 -0700494 if (ret)
495 return ret;
496
497 qusb_phy_enable_clocks(qphy, true);
498
Mayank Ranab7f212e2017-04-06 17:54:35 -0700499 qusb_phy_reset(qphy);
Mayank Rana3cb43a32016-08-02 12:10:20 -0700500 if (qphy->emulation) {
501 if (qphy->emu_init_seq)
Mayank Rana147f41d2016-08-12 10:07:45 -0700502 qusb_phy_write_seq(qphy->emu_phy_base + 0x8000,
503 qphy->emu_init_seq,
504 qphy->emu_init_seq_len, 10000);
Mayank Rana3cb43a32016-08-02 12:10:20 -0700505
506 if (qphy->qusb_phy_init_seq)
507 qusb_phy_write_seq(qphy->base, qphy->qusb_phy_init_seq,
508 qphy->init_seq_len, 0);
509
510 /* Wait for 5ms as per QUSB2 RUMI sequence */
511 usleep_range(5000, 7000);
512
513 if (qphy->phy_pll_reset_seq)
514 qusb_phy_write_seq(qphy->base, qphy->phy_pll_reset_seq,
515 qphy->phy_pll_reset_seq_len, 10000);
516
517 if (qphy->emu_dcm_reset_seq)
518 qusb_phy_write_seq(qphy->emu_phy_base,
519 qphy->emu_dcm_reset_seq,
520 qphy->emu_dcm_reset_seq_len, 10000);
521
522 return 0;
523 }
524
525 /* Disable the PHY */
Mayank Rana9c6b12d2017-06-22 16:23:26 -0700526 writel_relaxed(readl_relaxed(qphy->base + qphy->phy_reg[PWR_CTRL1]) |
Mayank Rana3cb43a32016-08-02 12:10:20 -0700527 PWR_CTRL1_POWR_DOWN,
Mayank Rana9c6b12d2017-06-22 16:23:26 -0700528 qphy->base + qphy->phy_reg[PWR_CTRL1]);
Mayank Rana3cb43a32016-08-02 12:10:20 -0700529
530 if (qphy->qusb_phy_init_seq)
531 qusb_phy_write_seq(qphy->base, qphy->qusb_phy_init_seq,
532 qphy->init_seq_len, 0);
Vamsi Krishna Samavedamf4da1dc2016-08-25 13:57:21 -0700533 if (qphy->efuse_reg) {
534 if (!qphy->tune_val)
535 qusb_phy_get_tune1_param(qphy);
Mayank Rana3cb43a32016-08-02 12:10:20 -0700536
Vamsi Krishna Samavedamf4da1dc2016-08-25 13:57:21 -0700537 pr_debug("%s(): Programming TUNE1 parameter as:%x\n", __func__,
538 qphy->tune_val);
539 writel_relaxed(qphy->tune_val,
Mayank Rana9c6b12d2017-06-22 16:23:26 -0700540 qphy->base + qphy->phy_reg[PORT_TUNE1]);
Mayank Rana3cb43a32016-08-02 12:10:20 -0700541 }
542
Mayank Rana76a040f2017-11-20 14:10:37 -0800543 /* if debugfs based tunex params are set, use that value. */
544 for (p_index = 0; p_index < 5; p_index++) {
545 if (qphy->tune[p_index])
546 writel_relaxed(qphy->tune[p_index],
547 qphy->base + qphy->phy_reg[PORT_TUNE1] +
548 (4 * p_index));
Mayank Rana3cb43a32016-08-02 12:10:20 -0700549 }
550
Mayank Rana547e24c2017-11-01 15:47:04 -0700551 if (qphy->refgen_north_bg_reg)
552 if (readl_relaxed(qphy->refgen_north_bg_reg) & BANDGAP_BYPASS)
553 writel_relaxed(BIAS_CTRL_2_OVERRIDE_VAL,
554 qphy->base + qphy->phy_reg[BIAS_CTRL_2]);
555
Mayank Rana3cb43a32016-08-02 12:10:20 -0700556 /* ensure above writes are completed before re-enabling PHY */
557 wmb();
558
559 /* Enable the PHY */
Mayank Rana9c6b12d2017-06-22 16:23:26 -0700560 writel_relaxed(readl_relaxed(qphy->base + qphy->phy_reg[PWR_CTRL1]) &
Mayank Rana3cb43a32016-08-02 12:10:20 -0700561 ~PWR_CTRL1_POWR_DOWN,
Mayank Rana9c6b12d2017-06-22 16:23:26 -0700562 qphy->base + qphy->phy_reg[PWR_CTRL1]);
Mayank Rana3cb43a32016-08-02 12:10:20 -0700563
564 /* Ensure above write is completed before turning ON ref clk */
565 wmb();
566
567 /* Require to get phy pll lock successfully */
568 usleep_range(150, 160);
569
Mayank Rana9c6b12d2017-06-22 16:23:26 -0700570 reg = readb_relaxed(qphy->base + qphy->phy_reg[PLL_COMMON_STATUS_ONE]);
Mayank Rana3cb43a32016-08-02 12:10:20 -0700571 dev_dbg(phy->dev, "QUSB2PHY_PLL_COMMON_STATUS_ONE:%x\n", reg);
572 if (!(reg & CORE_READY_STATUS)) {
573 dev_err(phy->dev, "QUSB PHY PLL LOCK fails:%x\n", reg);
574 WARN_ON(1);
575 }
576 return 0;
577}
578
Hemant Kumar2bb3bdf2017-11-22 13:53:08 -0800579static enum hrtimer_restart qusb_dis_ext_pulldown_timer(struct hrtimer *timer)
580{
581 struct qusb_phy *qphy = container_of(timer, struct qusb_phy, timer);
582 int ret = 0;
583
584 if (qphy->pinctrl && qphy->atest_usb13_suspend) {
585 ret = pinctrl_select_state(qphy->pinctrl,
586 qphy->atest_usb13_suspend);
587 if (ret < 0)
588 dev_err(qphy->phy.dev,
589 "pinctrl state suspend select failed\n");
590 }
591
592 return HRTIMER_NORESTART;
593}
594
595static void qusb_phy_enable_ext_pulldown(struct usb_phy *phy)
596{
597 struct qusb_phy *qphy = container_of(phy, struct qusb_phy, phy);
598 int ret = 0;
599
600 dev_dbg(phy->dev, "%s\n", __func__);
601
602 if (qphy->pinctrl && qphy->atest_usb13_active) {
603 ret = pinctrl_select_state(qphy->pinctrl,
604 qphy->atest_usb13_active);
605 if (ret < 0) {
606 dev_err(phy->dev,
607 "pinctrl state active select failed\n");
608 return;
609 }
610
611 hrtimer_start(&qphy->timer, ms_to_ktime(10), HRTIMER_MODE_REL);
612 }
613}
614
Mayank Rana3cb43a32016-08-02 12:10:20 -0700615static void qusb_phy_shutdown(struct usb_phy *phy)
616{
617 struct qusb_phy *qphy = container_of(phy, struct qusb_phy, phy);
618
619 dev_dbg(phy->dev, "%s\n", __func__);
620
Vamsi Krishna Samavedam246d8442017-10-17 21:15:55 -0700621 qusb_phy_enable_power(qphy, false);
Mayank Rana3cb43a32016-08-02 12:10:20 -0700622
Mayank Rana3cb43a32016-08-02 12:10:20 -0700623}
624
625static u32 qusb_phy_get_linestate(struct qusb_phy *qphy)
626{
627 u32 linestate = 0;
628
629 if (qphy->cable_connected) {
630 if (qphy->phy.flags & PHY_HSFS_MODE)
631 linestate |= LINESTATE_DP;
632 else if (qphy->phy.flags & PHY_LS_MODE)
633 linestate |= LINESTATE_DM;
634 }
635 return linestate;
636}
637
638/**
639 * Performs QUSB2 PHY suspend/resume functionality.
640 *
641 * @uphy - usb phy pointer.
642 * @suspend - to enable suspend or not. 1 - suspend, 0 - resume
643 *
644 */
645static int qusb_phy_set_suspend(struct usb_phy *phy, int suspend)
646{
647 struct qusb_phy *qphy = container_of(phy, struct qusb_phy, phy);
648 u32 linestate = 0, intr_mask = 0;
649
650 if (qphy->suspended && suspend) {
651 dev_dbg(phy->dev, "%s: USB PHY is already suspended\n",
652 __func__);
653 return 0;
654 }
655
656 if (suspend) {
657 /* Bus suspend case */
658 if (qphy->cable_connected ||
659 (qphy->phy.flags & PHY_HOST_MODE)) {
660 /* Disable all interrupts */
661 writel_relaxed(0x00,
Mayank Rana9c6b12d2017-06-22 16:23:26 -0700662 qphy->base + qphy->phy_reg[INTR_CTRL]);
Mayank Rana3cb43a32016-08-02 12:10:20 -0700663
664 linestate = qusb_phy_get_linestate(qphy);
665 /*
666 * D+/D- interrupts are level-triggered, but we are
667 * only interested if the line state changes, so enable
668 * the high/low trigger based on current state. In
669 * other words, enable the triggers _opposite_ of what
670 * the current D+/D- levels are.
671 * e.g. if currently D+ high, D- low (HS 'J'/Suspend),
672 * configure the mask to trigger on D+ low OR D- high
673 */
Mayank Rana9c6b12d2017-06-22 16:23:26 -0700674 intr_mask = DPSE_INTR_EN | DMSE_INTR_EN;
Mayank Rana3cb43a32016-08-02 12:10:20 -0700675 if (!(linestate & LINESTATE_DP)) /* D+ low */
676 intr_mask |= DPSE_INTR_HIGH_SEL;
677 if (!(linestate & LINESTATE_DM)) /* D- low */
678 intr_mask |= DMSE_INTR_HIGH_SEL;
679
680 writel_relaxed(intr_mask,
Mayank Rana9c6b12d2017-06-22 16:23:26 -0700681 qphy->base + qphy->phy_reg[INTR_CTRL]);
Mayank Rana3cb43a32016-08-02 12:10:20 -0700682
Mayank Ranab7f212e2017-04-06 17:54:35 -0700683 /* hold core PLL into reset */
684 writel_relaxed(CORE_PLL_EN_FROM_RESET |
685 CORE_RESET | CORE_RESET_MUX,
Mayank Rana9c6b12d2017-06-22 16:23:26 -0700686 qphy->base +
687 qphy->phy_reg[PLL_CORE_INPUT_OVERRIDE]);
Mayank Ranab7f212e2017-04-06 17:54:35 -0700688
Vijayavardhan Vennapusa46a01442017-07-06 10:52:30 +0530689 if (linestate & (LINESTATE_DP | LINESTATE_DM)) {
690 /* enable phy auto-resume */
691 writel_relaxed(0x91,
692 qphy->base + qphy->phy_reg[TEST1]);
693 /* flush the previous write before next write */
694 wmb();
695 writel_relaxed(0x90,
696 qphy->base + qphy->phy_reg[TEST1]);
697 }
Mayank Rana9c6b12d2017-06-22 16:23:26 -0700698
Mayank Rana3cb43a32016-08-02 12:10:20 -0700699 dev_dbg(phy->dev, "%s: intr_mask = %x\n",
700 __func__, intr_mask);
701
702 /* Makes sure that above write goes through */
703 wmb();
704 qusb_phy_enable_clocks(qphy, false);
705 } else { /* Cable disconnect case */
706 /* Disable all interrupts */
707 writel_relaxed(0x00,
Mayank Rana9c6b12d2017-06-22 16:23:26 -0700708 qphy->base + qphy->phy_reg[INTR_CTRL]);
Mayank Ranab7f212e2017-04-06 17:54:35 -0700709 qusb_phy_reset(qphy);
Mayank Rana3cb43a32016-08-02 12:10:20 -0700710 qusb_phy_enable_clocks(qphy, false);
Hemant Kumar7dc63722017-04-27 17:51:11 -0700711 qusb_phy_enable_power(qphy, false);
Mayank Rana3cb43a32016-08-02 12:10:20 -0700712 }
713 qphy->suspended = true;
714 } else {
715 /* Bus resume case */
716 if (qphy->cable_connected ||
717 (qphy->phy.flags & PHY_HOST_MODE)) {
718 qusb_phy_enable_clocks(qphy, true);
719 /* Clear all interrupts on resume */
720 writel_relaxed(0x00,
Mayank Rana9c6b12d2017-06-22 16:23:26 -0700721 qphy->base + qphy->phy_reg[INTR_CTRL]);
Mayank Rana3cb43a32016-08-02 12:10:20 -0700722
Mayank Ranab7f212e2017-04-06 17:54:35 -0700723 /* bring core PLL out of reset */
Mayank Rana9c6b12d2017-06-22 16:23:26 -0700724 writel_relaxed(CORE_PLL_EN_FROM_RESET, qphy->base +
725 qphy->phy_reg[PLL_CORE_INPUT_OVERRIDE]);
Mayank Ranab7f212e2017-04-06 17:54:35 -0700726
Mayank Rana3cb43a32016-08-02 12:10:20 -0700727 /* Makes sure that above write goes through */
728 wmb();
729 } else { /* Cable connect case */
Mayank Rana3cb43a32016-08-02 12:10:20 -0700730 qusb_phy_enable_clocks(qphy, true);
731 }
732 qphy->suspended = false;
733 }
734
735 return 0;
736}
737
738static int qusb_phy_notify_connect(struct usb_phy *phy,
739 enum usb_device_speed speed)
740{
741 struct qusb_phy *qphy = container_of(phy, struct qusb_phy, phy);
742
743 qphy->cable_connected = true;
744
745 if (qphy->qusb_phy_host_init_seq && qphy->phy.flags & PHY_HOST_MODE)
746 qusb_phy_host_init(phy);
747
748 dev_dbg(phy->dev, "QUSB PHY: connect notification cable_connected=%d\n",
749 qphy->cable_connected);
750 return 0;
751}
752
753static int qusb_phy_notify_disconnect(struct usb_phy *phy,
754 enum usb_device_speed speed)
755{
756 struct qusb_phy *qphy = container_of(phy, struct qusb_phy, phy);
757
758 qphy->cable_connected = false;
759
760 dev_dbg(phy->dev, "QUSB PHY: connect notification cable_connected=%d\n",
761 qphy->cable_connected);
762 return 0;
763}
764
Hemant Kumar91f5e542017-11-20 16:25:46 -0800765static int qusb_phy_disable_chirp(struct usb_phy *phy, bool disable)
766{
767 struct qusb_phy *qphy = container_of(phy, struct qusb_phy, phy);
768 int ret = 0;
769
770 dev_dbg(phy->dev, "%s qphy chirp disable %d disable %d\n", __func__,
771 qphy->chirp_disable, disable);
772
773 mutex_lock(&qphy->lock);
774
775 if (qphy->chirp_disable == disable) {
776 ret = -EALREADY;
777 goto done;
778 }
779
780 qphy->chirp_disable = disable;
781
782 if (disable) {
783 qphy->sq_ctrl1_default =
784 readl_relaxed(qphy->base + qphy->phy_reg[SQ_CTRL1]);
785 qphy->sq_ctrl2_default =
786 readl_relaxed(qphy->base + qphy->phy_reg[SQ_CTRL2]);
787
788 writel_relaxed(SQ_CTRL1_CHIRP_DISABLE,
789 qphy->base + qphy->phy_reg[SQ_CTRL1]);
790 readl_relaxed(qphy->base + qphy->phy_reg[SQ_CTRL1]);
791
792 writel_relaxed(SQ_CTRL1_CHIRP_DISABLE,
793 qphy->base + qphy->phy_reg[SQ_CTRL2]);
794 readl_relaxed(qphy->base + qphy->phy_reg[SQ_CTRL2]);
795
796 goto done;
797 }
798
799 writel_relaxed(qphy->sq_ctrl1_default,
800 qphy->base + qphy->phy_reg[SQ_CTRL1]);
801 readl_relaxed(qphy->base + qphy->phy_reg[SQ_CTRL1]);
802
803 writel_relaxed(qphy->sq_ctrl2_default,
804 qphy->base + qphy->phy_reg[SQ_CTRL2]);
805 readl_relaxed(qphy->base + qphy->phy_reg[SQ_CTRL2]);
806done:
807 mutex_unlock(&qphy->lock);
808 return ret;
809}
810
Mayank Rana3cb43a32016-08-02 12:10:20 -0700811static int qusb_phy_dpdm_regulator_enable(struct regulator_dev *rdev)
812{
Mayank Ranaa69fe6c2016-08-09 18:04:58 -0700813 int ret = 0;
Mayank Rana3cb43a32016-08-02 12:10:20 -0700814 struct qusb_phy *qphy = rdev_get_drvdata(rdev);
815
Mayank Ranadadae592017-07-21 09:03:32 -0700816 dev_dbg(qphy->phy.dev, "%s dpdm_enable:%d\n",
817 __func__, qphy->dpdm_enable);
Mayank Ranaa69fe6c2016-08-09 18:04:58 -0700818
Mayank Ranadadae592017-07-21 09:03:32 -0700819 if (!qphy->dpdm_enable) {
Hemant Kumar7dc63722017-04-27 17:51:11 -0700820 ret = qusb_phy_enable_power(qphy, true);
Mayank Ranadadae592017-07-21 09:03:32 -0700821 if (ret < 0) {
822 dev_dbg(qphy->phy.dev,
823 "dpdm regulator enable failed:%d\n", ret);
824 return ret;
Mayank Ranaa69fe6c2016-08-09 18:04:58 -0700825 }
Mayank Ranadadae592017-07-21 09:03:32 -0700826 qphy->dpdm_enable = true;
Mayank Ranaa69fe6c2016-08-09 18:04:58 -0700827 }
828
829 return ret;
Mayank Rana3cb43a32016-08-02 12:10:20 -0700830}
831
832static int qusb_phy_dpdm_regulator_disable(struct regulator_dev *rdev)
833{
Mayank Ranaa69fe6c2016-08-09 18:04:58 -0700834 int ret = 0;
Mayank Rana3cb43a32016-08-02 12:10:20 -0700835 struct qusb_phy *qphy = rdev_get_drvdata(rdev);
836
Mayank Ranadadae592017-07-21 09:03:32 -0700837 dev_dbg(qphy->phy.dev, "%s dpdm_enable:%d\n",
838 __func__, qphy->dpdm_enable);
Mayank Ranaa69fe6c2016-08-09 18:04:58 -0700839
Mayank Ranadadae592017-07-21 09:03:32 -0700840 if (qphy->dpdm_enable) {
Hemant Kumar7dc63722017-04-27 17:51:11 -0700841 ret = qusb_phy_enable_power(qphy, false);
Mayank Ranadadae592017-07-21 09:03:32 -0700842 if (ret < 0) {
843 dev_dbg(qphy->phy.dev,
844 "dpdm regulator disable failed:%d\n", ret);
845 return ret;
Mayank Ranaa69fe6c2016-08-09 18:04:58 -0700846 }
Mayank Ranadadae592017-07-21 09:03:32 -0700847 qphy->dpdm_enable = false;
Mayank Ranaa69fe6c2016-08-09 18:04:58 -0700848 }
849
850 return ret;
Mayank Rana3cb43a32016-08-02 12:10:20 -0700851}
852
853static int qusb_phy_dpdm_regulator_is_enabled(struct regulator_dev *rdev)
854{
855 struct qusb_phy *qphy = rdev_get_drvdata(rdev);
856
Mayank Ranadadae592017-07-21 09:03:32 -0700857 dev_dbg(qphy->phy.dev, "%s qphy->dpdm_enable = %d\n", __func__,
858 qphy->dpdm_enable);
859 return qphy->dpdm_enable;
Mayank Rana3cb43a32016-08-02 12:10:20 -0700860}
861
862static struct regulator_ops qusb_phy_dpdm_regulator_ops = {
863 .enable = qusb_phy_dpdm_regulator_enable,
864 .disable = qusb_phy_dpdm_regulator_disable,
865 .is_enabled = qusb_phy_dpdm_regulator_is_enabled,
866};
867
868static int qusb_phy_regulator_init(struct qusb_phy *qphy)
869{
870 struct device *dev = qphy->phy.dev;
871 struct regulator_config cfg = {};
872 struct regulator_init_data *init_data;
873
874 init_data = devm_kzalloc(dev, sizeof(*init_data), GFP_KERNEL);
875 if (!init_data)
876 return -ENOMEM;
877
878 init_data->constraints.valid_ops_mask |= REGULATOR_CHANGE_STATUS;
879 qphy->dpdm_rdesc.owner = THIS_MODULE;
880 qphy->dpdm_rdesc.type = REGULATOR_VOLTAGE;
881 qphy->dpdm_rdesc.ops = &qusb_phy_dpdm_regulator_ops;
882 qphy->dpdm_rdesc.name = kbasename(dev->of_node->full_name);
883
884 cfg.dev = dev;
885 cfg.init_data = init_data;
886 cfg.driver_data = qphy;
887 cfg.of_node = dev->of_node;
888
889 qphy->dpdm_rdev = devm_regulator_register(dev, &qphy->dpdm_rdesc, &cfg);
890 if (IS_ERR(qphy->dpdm_rdev))
891 return PTR_ERR(qphy->dpdm_rdev);
892
893 return 0;
894}
895
Mayank Rana76a040f2017-11-20 14:10:37 -0800896static int qusb_phy_create_debugfs(struct qusb_phy *qphy)
897{
898 struct dentry *file;
899 int ret = 0, i;
900 char name[6];
901
902 qphy->root = debugfs_create_dir(dev_name(qphy->phy.dev), NULL);
903 if (IS_ERR_OR_NULL(qphy->root)) {
904 dev_err(qphy->phy.dev,
905 "can't create debugfs root for %s\n",
906 dev_name(qphy->phy.dev));
907 ret = -ENOMEM;
908 goto create_err;
909 }
910
911 for (i = 0; i < 5; i++) {
912 snprintf(name, sizeof(name), "tune%d", (i + 1));
913 file = debugfs_create_x8(name, 0644, qphy->root,
914 &qphy->tune[i]);
915 if (IS_ERR_OR_NULL(file)) {
916 dev_err(qphy->phy.dev,
917 "can't create debugfs entry for %s\n", name);
918 debugfs_remove_recursive(qphy->root);
919 ret = ENOMEM;
920 goto create_err;
921 }
922 }
923
924create_err:
925 return ret;
926}
927
Mayank Rana3cb43a32016-08-02 12:10:20 -0700928static int qusb_phy_probe(struct platform_device *pdev)
929{
930 struct qusb_phy *qphy;
931 struct device *dev = &pdev->dev;
932 struct resource *res;
933 int ret = 0, size = 0;
934
935 qphy = devm_kzalloc(dev, sizeof(*qphy), GFP_KERNEL);
936 if (!qphy)
937 return -ENOMEM;
938
939 qphy->phy.dev = dev;
940 res = platform_get_resource_byname(pdev, IORESOURCE_MEM,
941 "qusb_phy_base");
942 qphy->base = devm_ioremap_resource(dev, res);
943 if (IS_ERR(qphy->base))
944 return PTR_ERR(qphy->base);
945
946 res = platform_get_resource_byname(pdev, IORESOURCE_MEM,
947 "emu_phy_base");
948 if (res) {
949 qphy->emu_phy_base = devm_ioremap_resource(dev, res);
950 if (IS_ERR(qphy->emu_phy_base)) {
951 dev_dbg(dev, "couldn't ioremap emu_phy_base\n");
952 qphy->emu_phy_base = NULL;
953 }
954 }
955
956 res = platform_get_resource_byname(pdev, IORESOURCE_MEM,
Vamsi Krishna Samavedamf4da1dc2016-08-25 13:57:21 -0700957 "efuse_addr");
Mayank Rana3cb43a32016-08-02 12:10:20 -0700958 if (res) {
Vamsi Krishna Samavedamf4da1dc2016-08-25 13:57:21 -0700959 qphy->efuse_reg = devm_ioremap_nocache(dev, res->start,
Mayank Rana3cb43a32016-08-02 12:10:20 -0700960 resource_size(res));
Vamsi Krishna Samavedamf4da1dc2016-08-25 13:57:21 -0700961 if (!IS_ERR_OR_NULL(qphy->efuse_reg)) {
Mayank Rana3cb43a32016-08-02 12:10:20 -0700962 ret = of_property_read_u32(dev->of_node,
Vamsi Krishna Samavedamf4da1dc2016-08-25 13:57:21 -0700963 "qcom,efuse-bit-pos",
964 &qphy->efuse_bit_pos);
Mayank Rana3cb43a32016-08-02 12:10:20 -0700965 if (!ret) {
966 ret = of_property_read_u32(dev->of_node,
Vamsi Krishna Samavedamf4da1dc2016-08-25 13:57:21 -0700967 "qcom,efuse-num-bits",
968 &qphy->efuse_num_of_bits);
Mayank Rana3cb43a32016-08-02 12:10:20 -0700969 }
970
971 if (ret) {
972 dev_err(dev,
Vamsi Krishna Samavedamf4da1dc2016-08-25 13:57:21 -0700973 "DT Value for efuse is invalid.\n");
Mayank Rana3cb43a32016-08-02 12:10:20 -0700974 return -EINVAL;
975 }
976 }
977 }
978
Mayank Rana547e24c2017-11-01 15:47:04 -0700979 res = platform_get_resource_byname(pdev, IORESOURCE_MEM,
980 "refgen_north_bg_reg_addr");
981 if (res)
982 qphy->refgen_north_bg_reg = devm_ioremap(dev, res->start,
983 resource_size(res));
984
Devdutt Patnaik1c03dfd2017-03-19 23:38:43 -0700985 /* ref_clk_src is needed irrespective of SE_CLK or DIFF_CLK usage */
Mayank Rana3cb43a32016-08-02 12:10:20 -0700986 qphy->ref_clk_src = devm_clk_get(dev, "ref_clk_src");
Devdutt Patnaik1c03dfd2017-03-19 23:38:43 -0700987 if (IS_ERR(qphy->ref_clk_src)) {
Mayank Rana3cb43a32016-08-02 12:10:20 -0700988 dev_dbg(dev, "clk get failed for ref_clk_src\n");
Devdutt Patnaik1c03dfd2017-03-19 23:38:43 -0700989 ret = PTR_ERR(qphy->ref_clk_src);
990 return ret;
991 }
Mayank Rana3cb43a32016-08-02 12:10:20 -0700992
Devdutt Patnaik1c03dfd2017-03-19 23:38:43 -0700993 /* ref_clk is needed only for DIFF_CLK case, hence make it optional. */
994 if (of_property_match_string(pdev->dev.of_node,
995 "clock-names", "ref_clk") >= 0) {
996 qphy->ref_clk = devm_clk_get(dev, "ref_clk");
997 if (IS_ERR(qphy->ref_clk)) {
998 ret = PTR_ERR(qphy->ref_clk);
999 if (ret != -EPROBE_DEFER)
1000 dev_dbg(dev,
1001 "clk get failed for ref_clk\n");
1002 return ret;
1003 }
1004
Mayank Rana3cb43a32016-08-02 12:10:20 -07001005 clk_set_rate(qphy->ref_clk, 19200000);
Devdutt Patnaik1c03dfd2017-03-19 23:38:43 -07001006 }
Mayank Rana3cb43a32016-08-02 12:10:20 -07001007
1008 if (of_property_match_string(pdev->dev.of_node,
1009 "clock-names", "cfg_ahb_clk") >= 0) {
1010 qphy->cfg_ahb_clk = devm_clk_get(dev, "cfg_ahb_clk");
1011 if (IS_ERR(qphy->cfg_ahb_clk)) {
1012 ret = PTR_ERR(qphy->cfg_ahb_clk);
1013 if (ret != -EPROBE_DEFER)
1014 dev_err(dev,
1015 "clk get failed for cfg_ahb_clk ret %d\n", ret);
1016 return ret;
1017 }
1018 }
1019
Amit Nischal4d278212016-06-06 17:54:34 +05301020 qphy->phy_reset = devm_reset_control_get(dev, "phy_reset");
Mayank Rana3cb43a32016-08-02 12:10:20 -07001021 if (IS_ERR(qphy->phy_reset))
1022 return PTR_ERR(qphy->phy_reset);
1023
1024 qphy->emulation = of_property_read_bool(dev->of_node,
1025 "qcom,emulation");
1026
1027 of_get_property(dev->of_node, "qcom,emu-init-seq", &size);
1028 if (size) {
1029 qphy->emu_init_seq = devm_kzalloc(dev,
1030 size, GFP_KERNEL);
1031 if (qphy->emu_init_seq) {
1032 qphy->emu_init_seq_len =
1033 (size / sizeof(*qphy->emu_init_seq));
1034 if (qphy->emu_init_seq_len % 2) {
1035 dev_err(dev, "invalid emu_init_seq_len\n");
1036 return -EINVAL;
1037 }
1038
1039 of_property_read_u32_array(dev->of_node,
Mayank Rana147f41d2016-08-12 10:07:45 -07001040 "qcom,emu-init-seq",
Mayank Rana3cb43a32016-08-02 12:10:20 -07001041 qphy->emu_init_seq,
1042 qphy->emu_init_seq_len);
1043 } else {
1044 dev_dbg(dev,
1045 "error allocating memory for emu_init_seq\n");
1046 }
1047 }
1048
Mayank Rana147f41d2016-08-12 10:07:45 -07001049 size = 0;
Mayank Rana3cb43a32016-08-02 12:10:20 -07001050 of_get_property(dev->of_node, "qcom,phy-pll-reset-seq", &size);
1051 if (size) {
1052 qphy->phy_pll_reset_seq = devm_kzalloc(dev,
1053 size, GFP_KERNEL);
1054 if (qphy->phy_pll_reset_seq) {
1055 qphy->phy_pll_reset_seq_len =
1056 (size / sizeof(*qphy->phy_pll_reset_seq));
1057 if (qphy->phy_pll_reset_seq_len % 2) {
1058 dev_err(dev, "invalid phy_pll_reset_seq_len\n");
1059 return -EINVAL;
1060 }
1061
1062 of_property_read_u32_array(dev->of_node,
1063 "qcom,phy-pll-reset-seq",
1064 qphy->phy_pll_reset_seq,
1065 qphy->phy_pll_reset_seq_len);
1066 } else {
1067 dev_dbg(dev,
1068 "error allocating memory for phy_pll_reset_seq\n");
1069 }
1070 }
1071
Mayank Rana147f41d2016-08-12 10:07:45 -07001072 size = 0;
Mayank Rana3cb43a32016-08-02 12:10:20 -07001073 of_get_property(dev->of_node, "qcom,emu-dcm-reset-seq", &size);
1074 if (size) {
1075 qphy->emu_dcm_reset_seq = devm_kzalloc(dev,
1076 size, GFP_KERNEL);
1077 if (qphy->emu_dcm_reset_seq) {
1078 qphy->emu_dcm_reset_seq_len =
1079 (size / sizeof(*qphy->emu_dcm_reset_seq));
1080 if (qphy->emu_dcm_reset_seq_len % 2) {
1081 dev_err(dev, "invalid emu_dcm_reset_seq_len\n");
1082 return -EINVAL;
1083 }
1084
1085 of_property_read_u32_array(dev->of_node,
1086 "qcom,emu-dcm-reset-seq",
1087 qphy->emu_dcm_reset_seq,
1088 qphy->emu_dcm_reset_seq_len);
1089 } else {
1090 dev_dbg(dev,
1091 "error allocating memory for emu_dcm_reset_seq\n");
1092 }
1093 }
1094
Mayank Rana147f41d2016-08-12 10:07:45 -07001095 size = 0;
Mayank Rana9c6b12d2017-06-22 16:23:26 -07001096 of_get_property(dev->of_node, "qcom,qusb-phy-reg-offset", &size);
1097 if (size) {
1098 qphy->phy_reg = devm_kzalloc(dev, size, GFP_KERNEL);
1099 if (qphy->phy_reg) {
1100 qphy->qusb_phy_reg_offset_cnt =
1101 size / sizeof(*qphy->phy_reg);
Mayank Rana129111e2017-11-01 15:31:22 -07001102 if (qphy->qusb_phy_reg_offset_cnt != USB2_PHY_REG_MAX) {
Mayank Rana9c6b12d2017-06-22 16:23:26 -07001103 dev_err(dev, "invalid reg offset count\n");
1104 return -EINVAL;
1105 }
1106
1107 of_property_read_u32_array(dev->of_node,
1108 "qcom,qusb-phy-reg-offset",
1109 qphy->phy_reg,
1110 qphy->qusb_phy_reg_offset_cnt);
1111 } else {
1112 dev_err(dev, "err mem alloc for qusb_phy_reg_offset\n");
1113 return -ENOMEM;
1114 }
1115 } else {
1116 dev_err(dev, "err provide qcom,qmp-phy-reg-offset\n");
1117 return -EINVAL;
1118 }
1119
1120 size = 0;
Mayank Rana3cb43a32016-08-02 12:10:20 -07001121 of_get_property(dev->of_node, "qcom,qusb-phy-init-seq", &size);
1122 if (size) {
1123 qphy->qusb_phy_init_seq = devm_kzalloc(dev,
1124 size, GFP_KERNEL);
1125 if (qphy->qusb_phy_init_seq) {
1126 qphy->init_seq_len =
1127 (size / sizeof(*qphy->qusb_phy_init_seq));
1128 if (qphy->init_seq_len % 2) {
1129 dev_err(dev, "invalid init_seq_len\n");
1130 return -EINVAL;
1131 }
1132
1133 of_property_read_u32_array(dev->of_node,
1134 "qcom,qusb-phy-init-seq",
1135 qphy->qusb_phy_init_seq,
1136 qphy->init_seq_len);
1137 } else {
1138 dev_err(dev,
1139 "error allocating memory for phy_init_seq\n");
1140 }
1141 }
1142
1143 qphy->host_init_seq_len = of_property_count_elems_of_size(dev->of_node,
1144 "qcom,qusb-phy-host-init-seq",
1145 sizeof(*qphy->qusb_phy_host_init_seq));
1146 if (qphy->host_init_seq_len > 0) {
1147 qphy->qusb_phy_host_init_seq = devm_kcalloc(dev,
1148 qphy->host_init_seq_len,
1149 sizeof(*qphy->qusb_phy_host_init_seq),
1150 GFP_KERNEL);
1151 if (qphy->qusb_phy_host_init_seq)
1152 of_property_read_u32_array(dev->of_node,
1153 "qcom,qusb-phy-host-init-seq",
1154 qphy->qusb_phy_host_init_seq,
1155 qphy->host_init_seq_len);
1156 else
1157 return -ENOMEM;
1158 }
1159
1160 ret = of_property_read_u32_array(dev->of_node, "qcom,vdd-voltage-level",
1161 (u32 *) qphy->vdd_levels,
1162 ARRAY_SIZE(qphy->vdd_levels));
1163 if (ret) {
1164 dev_err(dev, "error reading qcom,vdd-voltage-level property\n");
1165 return ret;
1166 }
1167
1168 qphy->vdd = devm_regulator_get(dev, "vdd");
1169 if (IS_ERR(qphy->vdd)) {
1170 dev_err(dev, "unable to get vdd supply\n");
1171 return PTR_ERR(qphy->vdd);
1172 }
1173
1174 qphy->vdda33 = devm_regulator_get(dev, "vdda33");
1175 if (IS_ERR(qphy->vdda33)) {
1176 dev_err(dev, "unable to get vdda33 supply\n");
1177 return PTR_ERR(qphy->vdda33);
1178 }
1179
1180 qphy->vdda18 = devm_regulator_get(dev, "vdda18");
1181 if (IS_ERR(qphy->vdda18)) {
1182 dev_err(dev, "unable to get vdda18 supply\n");
1183 return PTR_ERR(qphy->vdda18);
1184 }
1185
Pratham Pratap945af2a2018-01-24 18:29:33 +05301186 ret = qusb_phy_get_socrev(&pdev->dev, qphy);
1187 if (ret == -EPROBE_DEFER) {
1188 dev_err(&pdev->dev, "SoC version rd: fail: defer for now\n");
1189 return ret;
1190 }
Hemant Kumar2bb3bdf2017-11-22 13:53:08 -08001191 qphy->pinctrl = devm_pinctrl_get(dev);
1192 if (IS_ERR(qphy->pinctrl)) {
1193 ret = PTR_ERR(qphy->pinctrl);
1194 if (ret == -EPROBE_DEFER)
1195 return ret;
1196 dev_err(dev, "pinctrl not available\n");
1197 goto skip_pinctrl_config;
1198 }
1199 qphy->atest_usb13_suspend = pinctrl_lookup_state(qphy->pinctrl,
1200 "atest_usb13_suspend");
1201 if (IS_ERR(qphy->atest_usb13_suspend)) {
1202 dev_err(dev, "pinctrl lookup atest_usb13_suspend failed\n");
1203 goto skip_pinctrl_config;
1204 }
1205
1206 qphy->atest_usb13_active = pinctrl_lookup_state(qphy->pinctrl,
1207 "atest_usb13_active");
1208 if (IS_ERR(qphy->atest_usb13_active))
1209 dev_err(dev, "pinctrl lookup atest_usb13_active failed\n");
1210
1211 hrtimer_init(&qphy->timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
1212 qphy->timer.function = qusb_dis_ext_pulldown_timer;
1213
1214skip_pinctrl_config:
Hemant Kumar164cc1b2017-04-27 19:39:58 -07001215 mutex_init(&qphy->lock);
Mayank Rana3cb43a32016-08-02 12:10:20 -07001216 platform_set_drvdata(pdev, qphy);
1217
1218 qphy->phy.label = "msm-qusb-phy-v2";
1219 qphy->phy.init = qusb_phy_init;
1220 qphy->phy.set_suspend = qusb_phy_set_suspend;
1221 qphy->phy.shutdown = qusb_phy_shutdown;
1222 qphy->phy.type = USB_PHY_TYPE_USB2;
1223 qphy->phy.notify_connect = qusb_phy_notify_connect;
1224 qphy->phy.notify_disconnect = qusb_phy_notify_disconnect;
Pratham Pratap945af2a2018-01-24 18:29:33 +05301225
1226 /*
1227 * qusb_phy_disable_chirp is not required if soc version is
1228 * mentioned and is not base version.
1229 */
1230 if (qphy->soc_min_rev == 0)
1231 qphy->phy.disable_chirp = qusb_phy_disable_chirp;
1232
Hemant Kumar2bb3bdf2017-11-22 13:53:08 -08001233 qphy->phy.start_port_reset = qusb_phy_enable_ext_pulldown;
Mayank Rana3cb43a32016-08-02 12:10:20 -07001234
1235 ret = usb_add_phy_dev(&qphy->phy);
1236 if (ret)
1237 return ret;
1238
1239 ret = qusb_phy_regulator_init(qphy);
1240 if (ret)
1241 usb_remove_phy(&qphy->phy);
1242
Mayank Rana76a040f2017-11-20 14:10:37 -08001243 qusb_phy_create_debugfs(qphy);
1244
Mayank Rana3cb43a32016-08-02 12:10:20 -07001245 return ret;
1246}
1247
1248static int qusb_phy_remove(struct platform_device *pdev)
1249{
1250 struct qusb_phy *qphy = platform_get_drvdata(pdev);
1251
1252 usb_remove_phy(&qphy->phy);
Devdutt Patnaik1c03dfd2017-03-19 23:38:43 -07001253 qusb_phy_enable_clocks(qphy, false);
Hemant Kumar7dc63722017-04-27 17:51:11 -07001254 qusb_phy_enable_power(qphy, false);
Mayank Rana76a040f2017-11-20 14:10:37 -08001255 debugfs_remove_recursive(qphy->root);
Mayank Rana3cb43a32016-08-02 12:10:20 -07001256
1257 return 0;
1258}
1259
1260static const struct of_device_id qusb_phy_id_table[] = {
1261 { .compatible = "qcom,qusb2phy-v2", },
1262 { },
1263};
1264MODULE_DEVICE_TABLE(of, qusb_phy_id_table);
1265
1266static struct platform_driver qusb_phy_driver = {
1267 .probe = qusb_phy_probe,
1268 .remove = qusb_phy_remove,
1269 .driver = {
1270 .name = "msm-qusb-phy-v2",
1271 .of_match_table = of_match_ptr(qusb_phy_id_table),
1272 },
1273};
1274
1275module_platform_driver(qusb_phy_driver);
1276
1277MODULE_DESCRIPTION("MSM QUSB2 PHY v2 driver");
1278MODULE_LICENSE("GPL v2");