Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0-only
0002 /*
0003  * Copyright (C) 2014 Texas Instruments Incorporated - https://www.ti.com/
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  * clkdco = clkin / n * m * 2
0203  * clkoutX = clkdco / mX
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  * This calculates a PLL config that will provide the target_clkout rate
0266  * for clkout. Additionally clkdco rate will be the same as clkout rate
0267  * when clkout rate is >= min_clkdco.
0268  *
0269  * clkdco = clkin / n * m + clkin / n * mf / 262144
0270  * clkout = clkdco / m2
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     /* Fint */
0284     n = DIV_ROUND_UP(clkin, hw->fint_max);
0285     fint = clkin / n;
0286 
0287     /* adjust m2 so that the clkdco will be high enough */
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     /* adjust clkdco with fractional mf */
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     /* sigma-delta */
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     /* first busyloop to see if the bit changes right away */
0336     t = 100;
0337     while (t-- > 0) {
0338         if (FLD_GET(readl_relaxed(reg), bitnum, bitnum) == value)
0339             return value;
0340     }
0341 
0342     /* then loop for 500ms, sleeping for 1ms in between */
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      * Required value for each bitfield listed below
0384      *
0385      * PLL_STATUS[6] = 0  PLL_BYPASS
0386      * PLL_STATUS[5] = 0  PLL_HIGHJITTER
0387      *
0388      * PLL_STATUS[3] = 0  PLL_LOSSREF
0389      * PLL_STATUS[2] = 0  PLL_RECAL
0390      * PLL_STATUS[1] = 1  PLL_LOCK
0391      * PLL_STATUS[0] = 1  PLL_CTRL_RESET_DONE
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);        /* PLL_STOPMODE */
0407     l = FLD_MOD(l, cinfo->n - 1, hw->n_msb, hw->n_lsb); /* PLL_REGN */
0408     l = FLD_MOD(l, cinfo->m, hw->m_msb, hw->m_lsb);     /* PLL_REGM */
0409     /* M4 */
0410     l = FLD_MOD(l, cinfo->mX[0] ? cinfo->mX[0] - 1 : 0,
0411             hw->mX_msb[0], hw->mX_lsb[0]);
0412     /* M5 */
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     /* M6 */
0419     l = FLD_MOD(l, cinfo->mX[2] ? cinfo->mX[2] - 1 : 0,
0420             hw->mX_msb[2], hw->mX_lsb[2]);
0421     /* M7 */
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);    /* PLL_FREQSEL */
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);    /* PLL_SELFREQDCO */
0439     }
0440     l = FLD_MOD(l, 1, 13, 13);      /* PLL_REFEN */
0441     l = FLD_MOD(l, 0, 14, 14);      /* PHY_CLKINEN */
0442     l = FLD_MOD(l, 0, 16, 16);      /* M4_CLOCK_EN */
0443     l = FLD_MOD(l, 0, 18, 18);      /* M5_CLOCK_EN */
0444     l = FLD_MOD(l, 1, 20, 20);      /* HSDIVBYPASS */
0445     if (hw->has_refsel)
0446         l = FLD_MOD(l, 3, 22, 21);  /* REFSEL = sysclk */
0447     l = FLD_MOD(l, 0, 23, 23);      /* M6_CLOCK_EN */
0448     l = FLD_MOD(l, 0, 25, 25);      /* M7_CLOCK_EN */
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          * Calculate wait time for PLL LOCK
0458          * 1000 REFCLK cycles in us.
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);   /* PLL_GO */
0464 
0465             /**
0466              * read the register back to ensure the write is
0467              * flushed
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);   /* 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);          /* PHY_CLKINEN */
0503     l = FLD_MOD(l, cinfo->mX[0] ? 1 : 0, 16, 16);   /* M4_CLOCK_EN */
0504     l = FLD_MOD(l, cinfo->mX[1] ? 1 : 0, 18, 18);   /* M5_CLOCK_EN */
0505     l = FLD_MOD(l, 0, 20, 20);          /* HSDIVBYPASS */
0506     l = FLD_MOD(l, cinfo->mX[2] ? 1 : 0, 23, 23);   /* M6_CLOCK_EN */
0507     l = FLD_MOD(l, cinfo->mX[3] ? 1 : 0, 25, 25);   /* M7_CLOCK_EN */
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);    /* PLL_REGM */
0533     l = FLD_MOD(l, cinfo->n - 1, 8, 1); /* PLL_REGN */
0534     writel_relaxed(l, base + PLL_CONFIGURATION1);
0535 
0536     l = readl_relaxed(base + PLL_CONFIGURATION2);
0537     l = FLD_MOD(l, 0x0, 12, 12);    /* PLL_HIGHFREQ divide by 2 */
0538     l = FLD_MOD(l, 0x1, 13, 13);    /* PLL_REFEN */
0539     l = FLD_MOD(l, 0x0, 14, 14);    /* PHY_CLKINEN */
0540     if (hw->has_refsel)
0541         l = FLD_MOD(l, 0x3, 22, 21);    /* REFSEL = SYSCLK */
0542 
0543     /* PLL_SELFREQDCO */
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);  /* PLL_REGSD */
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);   /* PLL_REGM2 */
0556     l = FLD_MOD(l, cinfo->mf, 17, 0);   /* PLL_REGM_F */
0557     writel_relaxed(l, base + PLL_CONFIGURATION4);
0558 
0559     writel_relaxed(1, base + PLL_GO);   /* 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 }