0001
0002
0003
0004
0005
0006 #define DSS_SUBSYS_NAME "PLL"
0007
0008 #include <linux/delay.h>
0009 #include <linux/clk.h>
0010 #include <linux/io.h>
0011 #include <linux/kernel.h>
0012 #include <linux/regulator/consumer.h>
0013 #include <linux/sched.h>
0014
0015 #include "omapdss.h"
0016 #include "dss.h"
0017
0018 #define PLL_CONTROL 0x0000
0019 #define PLL_STATUS 0x0004
0020 #define PLL_GO 0x0008
0021 #define PLL_CONFIGURATION1 0x000C
0022 #define PLL_CONFIGURATION2 0x0010
0023 #define PLL_CONFIGURATION3 0x0014
0024 #define PLL_SSC_CONFIGURATION1 0x0018
0025 #define PLL_SSC_CONFIGURATION2 0x001C
0026 #define PLL_CONFIGURATION4 0x0020
0027
0028 int dss_pll_register(struct dss_device *dss, struct dss_pll *pll)
0029 {
0030 int i;
0031
0032 for (i = 0; i < ARRAY_SIZE(dss->plls); ++i) {
0033 if (!dss->plls[i]) {
0034 dss->plls[i] = pll;
0035 pll->dss = dss;
0036 return 0;
0037 }
0038 }
0039
0040 return -EBUSY;
0041 }
0042
0043 void dss_pll_unregister(struct dss_pll *pll)
0044 {
0045 struct dss_device *dss = pll->dss;
0046 int i;
0047
0048 for (i = 0; i < ARRAY_SIZE(dss->plls); ++i) {
0049 if (dss->plls[i] == pll) {
0050 dss->plls[i] = NULL;
0051 pll->dss = NULL;
0052 return;
0053 }
0054 }
0055 }
0056
0057 struct dss_pll *dss_pll_find(struct dss_device *dss, const char *name)
0058 {
0059 int i;
0060
0061 for (i = 0; i < ARRAY_SIZE(dss->plls); ++i) {
0062 if (dss->plls[i] && strcmp(dss->plls[i]->name, name) == 0)
0063 return dss->plls[i];
0064 }
0065
0066 return NULL;
0067 }
0068
0069 struct dss_pll *dss_pll_find_by_src(struct dss_device *dss,
0070 enum dss_clk_source src)
0071 {
0072 struct dss_pll *pll;
0073
0074 switch (src) {
0075 default:
0076 case DSS_CLK_SRC_FCK:
0077 return NULL;
0078
0079 case DSS_CLK_SRC_HDMI_PLL:
0080 return dss_pll_find(dss, "hdmi");
0081
0082 case DSS_CLK_SRC_PLL1_1:
0083 case DSS_CLK_SRC_PLL1_2:
0084 case DSS_CLK_SRC_PLL1_3:
0085 pll = dss_pll_find(dss, "dsi0");
0086 if (!pll)
0087 pll = dss_pll_find(dss, "video0");
0088 return pll;
0089
0090 case DSS_CLK_SRC_PLL2_1:
0091 case DSS_CLK_SRC_PLL2_2:
0092 case DSS_CLK_SRC_PLL2_3:
0093 pll = dss_pll_find(dss, "dsi1");
0094 if (!pll)
0095 pll = dss_pll_find(dss, "video1");
0096 return pll;
0097 }
0098 }
0099
0100 unsigned int dss_pll_get_clkout_idx_for_src(enum dss_clk_source src)
0101 {
0102 switch (src) {
0103 case DSS_CLK_SRC_HDMI_PLL:
0104 return 0;
0105
0106 case DSS_CLK_SRC_PLL1_1:
0107 case DSS_CLK_SRC_PLL2_1:
0108 return 0;
0109
0110 case DSS_CLK_SRC_PLL1_2:
0111 case DSS_CLK_SRC_PLL2_2:
0112 return 1;
0113
0114 case DSS_CLK_SRC_PLL1_3:
0115 case DSS_CLK_SRC_PLL2_3:
0116 return 2;
0117
0118 default:
0119 return 0;
0120 }
0121 }
0122
0123 int dss_pll_enable(struct dss_pll *pll)
0124 {
0125 int r;
0126
0127 r = clk_prepare_enable(pll->clkin);
0128 if (r)
0129 return r;
0130
0131 if (pll->regulator) {
0132 r = regulator_enable(pll->regulator);
0133 if (r)
0134 goto err_reg;
0135 }
0136
0137 r = pll->ops->enable(pll);
0138 if (r)
0139 goto err_enable;
0140
0141 return 0;
0142
0143 err_enable:
0144 if (pll->regulator)
0145 regulator_disable(pll->regulator);
0146 err_reg:
0147 clk_disable_unprepare(pll->clkin);
0148 return r;
0149 }
0150
0151 void dss_pll_disable(struct dss_pll *pll)
0152 {
0153 pll->ops->disable(pll);
0154
0155 if (pll->regulator)
0156 regulator_disable(pll->regulator);
0157
0158 clk_disable_unprepare(pll->clkin);
0159
0160 memset(&pll->cinfo, 0, sizeof(pll->cinfo));
0161 }
0162
0163 int dss_pll_set_config(struct dss_pll *pll, const struct dss_pll_clock_info *cinfo)
0164 {
0165 int r;
0166
0167 r = pll->ops->set_config(pll, cinfo);
0168 if (r)
0169 return r;
0170
0171 pll->cinfo = *cinfo;
0172
0173 return 0;
0174 }
0175
0176 bool dss_pll_hsdiv_calc_a(const struct dss_pll *pll, unsigned long clkdco,
0177 unsigned long out_min, unsigned long out_max,
0178 dss_hsdiv_calc_func func, void *data)
0179 {
0180 const struct dss_pll_hw *hw = pll->hw;
0181 int m, m_start, m_stop;
0182 unsigned long out;
0183
0184 out_min = out_min ? out_min : 1;
0185 out_max = out_max ? out_max : ULONG_MAX;
0186
0187 m_start = max(DIV_ROUND_UP(clkdco, out_max), 1ul);
0188
0189 m_stop = min((unsigned)(clkdco / out_min), hw->mX_max);
0190
0191 for (m = m_start; m <= m_stop; ++m) {
0192 out = clkdco / m;
0193
0194 if (func(m, out, data))
0195 return true;
0196 }
0197
0198 return false;
0199 }
0200
0201
0202
0203
0204
0205 bool dss_pll_calc_a(const struct dss_pll *pll, unsigned long clkin,
0206 unsigned long pll_min, unsigned long pll_max,
0207 dss_pll_calc_func func, void *data)
0208 {
0209 const struct dss_pll_hw *hw = pll->hw;
0210 int n, n_start, n_stop, n_inc;
0211 int m, m_start, m_stop, m_inc;
0212 unsigned long fint, clkdco;
0213 unsigned long pll_hw_max;
0214 unsigned long fint_hw_min, fint_hw_max;
0215
0216 pll_hw_max = hw->clkdco_max;
0217
0218 fint_hw_min = hw->fint_min;
0219 fint_hw_max = hw->fint_max;
0220
0221 n_start = max(DIV_ROUND_UP(clkin, fint_hw_max), 1ul);
0222 n_stop = min((unsigned)(clkin / fint_hw_min), hw->n_max);
0223 n_inc = 1;
0224
0225 if (n_start > n_stop)
0226 return false;
0227
0228 if (hw->errata_i886) {
0229 swap(n_start, n_stop);
0230 n_inc = -1;
0231 }
0232
0233 pll_max = pll_max ? pll_max : ULONG_MAX;
0234
0235 for (n = n_start; n != n_stop; n += n_inc) {
0236 fint = clkin / n;
0237
0238 m_start = max(DIV_ROUND_UP(DIV_ROUND_UP(pll_min, fint), 2),
0239 1ul);
0240 m_stop = min3((unsigned)(pll_max / fint / 2),
0241 (unsigned)(pll_hw_max / fint / 2),
0242 hw->m_max);
0243 m_inc = 1;
0244
0245 if (m_start > m_stop)
0246 continue;
0247
0248 if (hw->errata_i886) {
0249 swap(m_start, m_stop);
0250 m_inc = -1;
0251 }
0252
0253 for (m = m_start; m != m_stop; m += m_inc) {
0254 clkdco = 2 * m * fint;
0255
0256 if (func(n, m, fint, clkdco, data))
0257 return true;
0258 }
0259 }
0260
0261 return false;
0262 }
0263
0264
0265
0266
0267
0268
0269
0270
0271
0272 bool dss_pll_calc_b(const struct dss_pll *pll, unsigned long clkin,
0273 unsigned long target_clkout, struct dss_pll_clock_info *cinfo)
0274 {
0275 unsigned long fint, clkdco, clkout;
0276 unsigned long target_clkdco;
0277 unsigned long min_dco;
0278 unsigned int n, m, mf, m2, sd;
0279 const struct dss_pll_hw *hw = pll->hw;
0280
0281 DSSDBG("clkin %lu, target clkout %lu\n", clkin, target_clkout);
0282
0283
0284 n = DIV_ROUND_UP(clkin, hw->fint_max);
0285 fint = clkin / n;
0286
0287
0288 min_dco = roundup(hw->clkdco_min, fint);
0289 m2 = DIV_ROUND_UP(min_dco, target_clkout);
0290 if (m2 == 0)
0291 m2 = 1;
0292
0293 target_clkdco = target_clkout * m2;
0294 m = target_clkdco / fint;
0295
0296 clkdco = fint * m;
0297
0298
0299 if (WARN_ON(target_clkdco - clkdco > fint))
0300 mf = 0;
0301 else
0302 mf = (u32)div_u64(262144ull * (target_clkdco - clkdco), fint);
0303
0304 if (mf > 0)
0305 clkdco += (u32)div_u64((u64)mf * fint, 262144);
0306
0307 clkout = clkdco / m2;
0308
0309
0310 sd = DIV_ROUND_UP(fint * m, 250000000);
0311
0312 DSSDBG("N = %u, M = %u, M.f = %u, M2 = %u, SD = %u\n",
0313 n, m, mf, m2, sd);
0314 DSSDBG("Fint %lu, clkdco %lu, clkout %lu\n", fint, clkdco, clkout);
0315
0316 cinfo->n = n;
0317 cinfo->m = m;
0318 cinfo->mf = mf;
0319 cinfo->mX[0] = m2;
0320 cinfo->sd = sd;
0321
0322 cinfo->fint = fint;
0323 cinfo->clkdco = clkdco;
0324 cinfo->clkout[0] = clkout;
0325
0326 return true;
0327 }
0328
0329 static int wait_for_bit_change(void __iomem *reg, int bitnum, int value)
0330 {
0331 unsigned long timeout;
0332 ktime_t wait;
0333 int t;
0334
0335
0336 t = 100;
0337 while (t-- > 0) {
0338 if (FLD_GET(readl_relaxed(reg), bitnum, bitnum) == value)
0339 return value;
0340 }
0341
0342
0343 timeout = jiffies + msecs_to_jiffies(500);
0344 while (time_before(jiffies, timeout)) {
0345 if (FLD_GET(readl_relaxed(reg), bitnum, bitnum) == value)
0346 return value;
0347
0348 wait = ns_to_ktime(1000 * 1000);
0349 set_current_state(TASK_UNINTERRUPTIBLE);
0350 schedule_hrtimeout(&wait, HRTIMER_MODE_REL);
0351 }
0352
0353 return !value;
0354 }
0355
0356 int dss_pll_wait_reset_done(struct dss_pll *pll)
0357 {
0358 void __iomem *base = pll->base;
0359
0360 if (wait_for_bit_change(base + PLL_STATUS, 0, 1) != 1)
0361 return -ETIMEDOUT;
0362 else
0363 return 0;
0364 }
0365
0366 static int dss_wait_hsdiv_ack(struct dss_pll *pll, u32 hsdiv_ack_mask)
0367 {
0368 int t = 100;
0369
0370 while (t-- > 0) {
0371 u32 v = readl_relaxed(pll->base + PLL_STATUS);
0372 v &= hsdiv_ack_mask;
0373 if (v == hsdiv_ack_mask)
0374 return 0;
0375 }
0376
0377 return -ETIMEDOUT;
0378 }
0379
0380 static bool pll_is_locked(u32 stat)
0381 {
0382
0383
0384
0385
0386
0387
0388
0389
0390
0391
0392
0393 return ((stat & 0x6f) == 0x3);
0394 }
0395
0396 int dss_pll_write_config_type_a(struct dss_pll *pll,
0397 const struct dss_pll_clock_info *cinfo)
0398 {
0399 const struct dss_pll_hw *hw = pll->hw;
0400 void __iomem *base = pll->base;
0401 int r = 0;
0402 u32 l;
0403
0404 l = 0;
0405 if (hw->has_stopmode)
0406 l = FLD_MOD(l, 1, 0, 0);
0407 l = FLD_MOD(l, cinfo->n - 1, hw->n_msb, hw->n_lsb);
0408 l = FLD_MOD(l, cinfo->m, hw->m_msb, hw->m_lsb);
0409
0410 l = FLD_MOD(l, cinfo->mX[0] ? cinfo->mX[0] - 1 : 0,
0411 hw->mX_msb[0], hw->mX_lsb[0]);
0412
0413 l = FLD_MOD(l, cinfo->mX[1] ? cinfo->mX[1] - 1 : 0,
0414 hw->mX_msb[1], hw->mX_lsb[1]);
0415 writel_relaxed(l, base + PLL_CONFIGURATION1);
0416
0417 l = 0;
0418
0419 l = FLD_MOD(l, cinfo->mX[2] ? cinfo->mX[2] - 1 : 0,
0420 hw->mX_msb[2], hw->mX_lsb[2]);
0421
0422 l = FLD_MOD(l, cinfo->mX[3] ? cinfo->mX[3] - 1 : 0,
0423 hw->mX_msb[3], hw->mX_lsb[3]);
0424 writel_relaxed(l, base + PLL_CONFIGURATION3);
0425
0426 l = readl_relaxed(base + PLL_CONFIGURATION2);
0427 if (hw->has_freqsel) {
0428 u32 f = cinfo->fint < 1000000 ? 0x3 :
0429 cinfo->fint < 1250000 ? 0x4 :
0430 cinfo->fint < 1500000 ? 0x5 :
0431 cinfo->fint < 1750000 ? 0x6 :
0432 0x7;
0433
0434 l = FLD_MOD(l, f, 4, 1);
0435 } else if (hw->has_selfreqdco) {
0436 u32 f = cinfo->clkdco < hw->clkdco_low ? 0x2 : 0x4;
0437
0438 l = FLD_MOD(l, f, 3, 1);
0439 }
0440 l = FLD_MOD(l, 1, 13, 13);
0441 l = FLD_MOD(l, 0, 14, 14);
0442 l = FLD_MOD(l, 0, 16, 16);
0443 l = FLD_MOD(l, 0, 18, 18);
0444 l = FLD_MOD(l, 1, 20, 20);
0445 if (hw->has_refsel)
0446 l = FLD_MOD(l, 3, 22, 21);
0447 l = FLD_MOD(l, 0, 23, 23);
0448 l = FLD_MOD(l, 0, 25, 25);
0449 writel_relaxed(l, base + PLL_CONFIGURATION2);
0450
0451 if (hw->errata_i932) {
0452 int cnt = 0;
0453 u32 sleep_time;
0454 const u32 max_lock_retries = 20;
0455
0456
0457
0458
0459
0460 sleep_time = DIV_ROUND_UP(1000*1000*1000, cinfo->fint);
0461
0462 for (cnt = 0; cnt < max_lock_retries; cnt++) {
0463 writel_relaxed(1, base + PLL_GO);
0464
0465
0466
0467
0468
0469 readl_relaxed(base + PLL_GO);
0470
0471 usleep_range(sleep_time, sleep_time + 5);
0472 l = readl_relaxed(base + PLL_STATUS);
0473
0474 if (pll_is_locked(l) &&
0475 !(readl_relaxed(base + PLL_GO) & 0x1))
0476 break;
0477
0478 }
0479
0480 if (cnt == max_lock_retries) {
0481 DSSERR("cannot lock PLL\n");
0482 r = -EIO;
0483 goto err;
0484 }
0485 } else {
0486 writel_relaxed(1, base + PLL_GO);
0487
0488 if (wait_for_bit_change(base + PLL_GO, 0, 0) != 0) {
0489 DSSERR("DSS DPLL GO bit not going down.\n");
0490 r = -EIO;
0491 goto err;
0492 }
0493
0494 if (wait_for_bit_change(base + PLL_STATUS, 1, 1) != 1) {
0495 DSSERR("cannot lock DSS DPLL\n");
0496 r = -EIO;
0497 goto err;
0498 }
0499 }
0500
0501 l = readl_relaxed(base + PLL_CONFIGURATION2);
0502 l = FLD_MOD(l, 1, 14, 14);
0503 l = FLD_MOD(l, cinfo->mX[0] ? 1 : 0, 16, 16);
0504 l = FLD_MOD(l, cinfo->mX[1] ? 1 : 0, 18, 18);
0505 l = FLD_MOD(l, 0, 20, 20);
0506 l = FLD_MOD(l, cinfo->mX[2] ? 1 : 0, 23, 23);
0507 l = FLD_MOD(l, cinfo->mX[3] ? 1 : 0, 25, 25);
0508 writel_relaxed(l, base + PLL_CONFIGURATION2);
0509
0510 r = dss_wait_hsdiv_ack(pll,
0511 (cinfo->mX[0] ? BIT(7) : 0) |
0512 (cinfo->mX[1] ? BIT(8) : 0) |
0513 (cinfo->mX[2] ? BIT(10) : 0) |
0514 (cinfo->mX[3] ? BIT(11) : 0));
0515 if (r) {
0516 DSSERR("failed to enable HSDIV clocks\n");
0517 goto err;
0518 }
0519
0520 err:
0521 return r;
0522 }
0523
0524 int dss_pll_write_config_type_b(struct dss_pll *pll,
0525 const struct dss_pll_clock_info *cinfo)
0526 {
0527 const struct dss_pll_hw *hw = pll->hw;
0528 void __iomem *base = pll->base;
0529 u32 l;
0530
0531 l = 0;
0532 l = FLD_MOD(l, cinfo->m, 20, 9);
0533 l = FLD_MOD(l, cinfo->n - 1, 8, 1);
0534 writel_relaxed(l, base + PLL_CONFIGURATION1);
0535
0536 l = readl_relaxed(base + PLL_CONFIGURATION2);
0537 l = FLD_MOD(l, 0x0, 12, 12);
0538 l = FLD_MOD(l, 0x1, 13, 13);
0539 l = FLD_MOD(l, 0x0, 14, 14);
0540 if (hw->has_refsel)
0541 l = FLD_MOD(l, 0x3, 22, 21);
0542
0543
0544 if (cinfo->clkdco > hw->clkdco_low)
0545 l = FLD_MOD(l, 0x4, 3, 1);
0546 else
0547 l = FLD_MOD(l, 0x2, 3, 1);
0548 writel_relaxed(l, base + PLL_CONFIGURATION2);
0549
0550 l = readl_relaxed(base + PLL_CONFIGURATION3);
0551 l = FLD_MOD(l, cinfo->sd, 17, 10);
0552 writel_relaxed(l, base + PLL_CONFIGURATION3);
0553
0554 l = readl_relaxed(base + PLL_CONFIGURATION4);
0555 l = FLD_MOD(l, cinfo->mX[0], 24, 18);
0556 l = FLD_MOD(l, cinfo->mf, 17, 0);
0557 writel_relaxed(l, base + PLL_CONFIGURATION4);
0558
0559 writel_relaxed(1, base + PLL_GO);
0560
0561 if (wait_for_bit_change(base + PLL_GO, 0, 0) != 0) {
0562 DSSERR("DSS DPLL GO bit not going down.\n");
0563 return -EIO;
0564 }
0565
0566 if (wait_for_bit_change(base + PLL_STATUS, 1, 1) != 1) {
0567 DSSERR("cannot lock DSS DPLL\n");
0568 return -ETIMEDOUT;
0569 }
0570
0571 return 0;
0572 }