linux/drivers/clk/st/clkgen-pll.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-or-later
   2/*
   3 * Copyright (C) 2014 STMicroelectronics (R&D) Limited
   4 */
   5
   6/*
   7 * Authors:
   8 * Stephen Gallimore <stephen.gallimore@st.com>,
   9 * Pankaj Dev <pankaj.dev@st.com>.
  10 */
  11
  12#include <linux/slab.h>
  13#include <linux/of_address.h>
  14#include <linux/clk.h>
  15#include <linux/clk-provider.h>
  16#include <linux/iopoll.h>
  17
  18#include "clkgen.h"
  19
  20static DEFINE_SPINLOCK(clkgena_c32_odf_lock);
  21DEFINE_SPINLOCK(clkgen_a9_lock);
  22
  23/*
  24 * PLL configuration register bits for PLL3200 C32
  25 */
  26#define C32_NDIV_MASK (0xff)
  27#define C32_IDF_MASK (0x7)
  28#define C32_ODF_MASK (0x3f)
  29#define C32_LDF_MASK (0x7f)
  30#define C32_CP_MASK (0x1f)
  31
  32#define C32_MAX_ODFS (4)
  33
  34/*
  35 * PLL configuration register bits for PLL4600 C28
  36 */
  37#define C28_NDIV_MASK (0xff)
  38#define C28_IDF_MASK (0x7)
  39#define C28_ODF_MASK (0x3f)
  40
  41struct clkgen_pll_data {
  42        struct clkgen_field pdn_status;
  43        struct clkgen_field pdn_ctrl;
  44        struct clkgen_field locked_status;
  45        struct clkgen_field mdiv;
  46        struct clkgen_field ndiv;
  47        struct clkgen_field pdiv;
  48        struct clkgen_field idf;
  49        struct clkgen_field ldf;
  50        struct clkgen_field cp;
  51        unsigned int num_odfs;
  52        struct clkgen_field odf[C32_MAX_ODFS];
  53        struct clkgen_field odf_gate[C32_MAX_ODFS];
  54        bool switch2pll_en;
  55        struct clkgen_field switch2pll;
  56        spinlock_t *lock;
  57        const struct clk_ops *ops;
  58};
  59
  60static const struct clk_ops stm_pll3200c32_ops;
  61static const struct clk_ops stm_pll3200c32_a9_ops;
  62static const struct clk_ops stm_pll4600c28_ops;
  63
  64static const struct clkgen_pll_data st_pll3200c32_cx_0 = {
  65        /* 407 C0 PLL0 */
  66        .pdn_status     = CLKGEN_FIELD(0x2a0,   0x1,                    8),
  67        .pdn_ctrl       = CLKGEN_FIELD(0x2a0,   0x1,                    8),
  68        .locked_status  = CLKGEN_FIELD(0x2a0,   0x1,                    24),
  69        .ndiv           = CLKGEN_FIELD(0x2a4,   C32_NDIV_MASK,          16),
  70        .idf            = CLKGEN_FIELD(0x2a4,   C32_IDF_MASK,           0x0),
  71        .num_odfs = 1,
  72        .odf            = { CLKGEN_FIELD(0x2b4, C32_ODF_MASK,           0) },
  73        .odf_gate       = { CLKGEN_FIELD(0x2b4, 0x1,                    6) },
  74        .ops            = &stm_pll3200c32_ops,
  75};
  76
  77static const struct clkgen_pll_data st_pll3200c32_cx_1 = {
  78        /* 407 C0 PLL1 */
  79        .pdn_status     = CLKGEN_FIELD(0x2c8,   0x1,                    8),
  80        .pdn_ctrl       = CLKGEN_FIELD(0x2c8,   0x1,                    8),
  81        .locked_status  = CLKGEN_FIELD(0x2c8,   0x1,                    24),
  82        .ndiv           = CLKGEN_FIELD(0x2cc,   C32_NDIV_MASK,          16),
  83        .idf            = CLKGEN_FIELD(0x2cc,   C32_IDF_MASK,           0x0),
  84        .num_odfs = 1,
  85        .odf            = { CLKGEN_FIELD(0x2dc, C32_ODF_MASK,           0) },
  86        .odf_gate       = { CLKGEN_FIELD(0x2dc, 0x1,                    6) },
  87        .ops            = &stm_pll3200c32_ops,
  88};
  89
  90static const struct clkgen_pll_data st_pll3200c32_407_a9 = {
  91        /* 407 A9 */
  92        .pdn_status     = CLKGEN_FIELD(0x1a8,   0x1,                    0),
  93        .pdn_ctrl       = CLKGEN_FIELD(0x1a8,   0x1,                    0),
  94        .locked_status  = CLKGEN_FIELD(0x87c,   0x1,                    0),
  95        .ndiv           = CLKGEN_FIELD(0x1b0,   C32_NDIV_MASK,          0),
  96        .idf            = CLKGEN_FIELD(0x1a8,   C32_IDF_MASK,           25),
  97        .num_odfs = 1,
  98        .odf            = { CLKGEN_FIELD(0x1b0, C32_ODF_MASK,           8) },
  99        .odf_gate       = { CLKGEN_FIELD(0x1ac, 0x1,                    28) },
 100        .switch2pll_en  = true,
 101        .cp             = CLKGEN_FIELD(0x1a8,   C32_CP_MASK,            1),
 102        .switch2pll     = CLKGEN_FIELD(0x1a4,   0x1,                    1),
 103        .lock = &clkgen_a9_lock,
 104        .ops            = &stm_pll3200c32_a9_ops,
 105};
 106
 107static struct clkgen_pll_data st_pll4600c28_418_a9 = {
 108        /* 418 A9 */
 109        .pdn_status     = CLKGEN_FIELD(0x1a8,   0x1,                    0),
 110        .pdn_ctrl       = CLKGEN_FIELD(0x1a8,   0x1,                    0),
 111        .locked_status  = CLKGEN_FIELD(0x87c,   0x1,                    0),
 112        .ndiv           = CLKGEN_FIELD(0x1b0,   C28_NDIV_MASK,          0),
 113        .idf            = CLKGEN_FIELD(0x1a8,   C28_IDF_MASK,           25),
 114        .num_odfs = 1,
 115        .odf            = { CLKGEN_FIELD(0x1b0, C28_ODF_MASK,           8) },
 116        .odf_gate       = { CLKGEN_FIELD(0x1ac, 0x1,                    28) },
 117        .switch2pll_en  = true,
 118        .switch2pll     = CLKGEN_FIELD(0x1a4,   0x1,                    1),
 119        .lock           = &clkgen_a9_lock,
 120        .ops            = &stm_pll4600c28_ops,
 121};
 122
 123/**
 124 * DOC: Clock Generated by PLL, rate set and enabled by bootloader
 125 *
 126 * Traits of this clock:
 127 * prepare - clk_(un)prepare only ensures parent is (un)prepared
 128 * enable - clk_enable/disable only ensures parent is enabled
 129 * rate - rate is fixed. No clk_set_rate support
 130 * parent - fixed parent.  No clk_set_parent support
 131 */
 132
 133/*
 134 * PLL clock that is integrated in the ClockGenA instances on the STiH415
 135 * and STiH416.
 136 *
 137 * @hw: handle between common and hardware-specific interfaces.
 138 * @regs_base: base of the PLL configuration register(s).
 139 *
 140 */
 141struct clkgen_pll {
 142        struct clk_hw           hw;
 143        struct clkgen_pll_data  *data;
 144        void __iomem            *regs_base;
 145        spinlock_t      *lock;
 146
 147        u32 ndiv;
 148        u32 idf;
 149        u32 odf;
 150        u32 cp;
 151};
 152
 153#define to_clkgen_pll(_hw) container_of(_hw, struct clkgen_pll, hw)
 154
 155struct stm_pll {
 156        unsigned long mdiv;
 157        unsigned long ndiv;
 158        unsigned long pdiv;
 159        unsigned long odf;
 160        unsigned long idf;
 161        unsigned long ldf;
 162        unsigned long cp;
 163};
 164
 165static int clkgen_pll_is_locked(struct clk_hw *hw)
 166{
 167        struct clkgen_pll *pll = to_clkgen_pll(hw);
 168        u32 locked = CLKGEN_READ(pll, locked_status);
 169
 170        return !!locked;
 171}
 172
 173static int clkgen_pll_is_enabled(struct clk_hw *hw)
 174{
 175        struct clkgen_pll *pll = to_clkgen_pll(hw);
 176        u32 poweroff = CLKGEN_READ(pll, pdn_status);
 177        return !poweroff;
 178}
 179
 180static int __clkgen_pll_enable(struct clk_hw *hw)
 181{
 182        struct clkgen_pll *pll = to_clkgen_pll(hw);
 183        void __iomem *base =  pll->regs_base;
 184        struct clkgen_field *field = &pll->data->locked_status;
 185        int ret = 0;
 186        u32 reg;
 187
 188        if (clkgen_pll_is_enabled(hw))
 189                return 0;
 190
 191        CLKGEN_WRITE(pll, pdn_ctrl, 0);
 192
 193        ret = readl_relaxed_poll_timeout(base + field->offset, reg,
 194                        !!((reg >> field->shift) & field->mask),  0, 10000);
 195
 196        if (!ret) {
 197                if (pll->data->switch2pll_en)
 198                        CLKGEN_WRITE(pll, switch2pll, 0);
 199
 200                pr_debug("%s:%s enabled\n", __clk_get_name(hw->clk), __func__);
 201        }
 202
 203        return ret;
 204}
 205
 206static int clkgen_pll_enable(struct clk_hw *hw)
 207{
 208        struct clkgen_pll *pll = to_clkgen_pll(hw);
 209        unsigned long flags = 0;
 210        int ret = 0;
 211
 212        if (pll->lock)
 213                spin_lock_irqsave(pll->lock, flags);
 214
 215        ret = __clkgen_pll_enable(hw);
 216
 217        if (pll->lock)
 218                spin_unlock_irqrestore(pll->lock, flags);
 219
 220        return ret;
 221}
 222
 223static void __clkgen_pll_disable(struct clk_hw *hw)
 224{
 225        struct clkgen_pll *pll = to_clkgen_pll(hw);
 226
 227        if (!clkgen_pll_is_enabled(hw))
 228                return;
 229
 230        if (pll->data->switch2pll_en)
 231                CLKGEN_WRITE(pll, switch2pll, 1);
 232
 233        CLKGEN_WRITE(pll, pdn_ctrl, 1);
 234
 235        pr_debug("%s:%s disabled\n", __clk_get_name(hw->clk), __func__);
 236}
 237
 238static void clkgen_pll_disable(struct clk_hw *hw)
 239{
 240        struct clkgen_pll *pll = to_clkgen_pll(hw);
 241        unsigned long flags = 0;
 242
 243        if (pll->lock)
 244                spin_lock_irqsave(pll->lock, flags);
 245
 246        __clkgen_pll_disable(hw);
 247
 248        if (pll->lock)
 249                spin_unlock_irqrestore(pll->lock, flags);
 250}
 251
 252static int clk_pll3200c32_get_params(unsigned long input, unsigned long output,
 253                          struct stm_pll *pll)
 254{
 255        unsigned long i, n;
 256        unsigned long deviation = ~0;
 257        unsigned long new_freq;
 258        long new_deviation;
 259        /* Charge pump table: highest ndiv value for cp=6 to 25 */
 260        static const unsigned char cp_table[] = {
 261                48, 56, 64, 72, 80, 88, 96, 104, 112, 120,
 262                128, 136, 144, 152, 160, 168, 176, 184, 192
 263        };
 264
 265        /* Output clock range: 800Mhz to 1600Mhz */
 266        if (output < 800000000 || output > 1600000000)
 267                return -EINVAL;
 268
 269        input /= 1000;
 270        output /= 1000;
 271
 272        for (i = 1; i <= 7 && deviation; i++) {
 273                n = i * output / (2 * input);
 274
 275                /* Checks */
 276                if (n < 8)
 277                        continue;
 278                if (n > 200)
 279                        break;
 280
 281                new_freq = (input * 2 * n) / i;
 282
 283                new_deviation = abs(new_freq - output);
 284
 285                if (!new_deviation || new_deviation < deviation) {
 286                        pll->idf  = i;
 287                        pll->ndiv = n;
 288                        deviation = new_deviation;
 289                }
 290        }
 291
 292        if (deviation == ~0) /* No solution found */
 293                return -EINVAL;
 294
 295        /* Computing recommended charge pump value */
 296        for (pll->cp = 6; pll->ndiv > cp_table[pll->cp-6]; (pll->cp)++)
 297                ;
 298
 299        return 0;
 300}
 301
 302static int clk_pll3200c32_get_rate(unsigned long input, struct stm_pll *pll,
 303                        unsigned long *rate)
 304{
 305        if (!pll->idf)
 306                pll->idf = 1;
 307
 308        *rate = ((2 * (input / 1000) * pll->ndiv) / pll->idf) * 1000;
 309
 310        return 0;
 311}
 312
 313static unsigned long recalc_stm_pll3200c32(struct clk_hw *hw,
 314                unsigned long parent_rate)
 315{
 316        struct clkgen_pll *pll = to_clkgen_pll(hw);
 317        unsigned long ndiv, idf;
 318        unsigned long rate = 0;
 319
 320        if (!clkgen_pll_is_enabled(hw) || !clkgen_pll_is_locked(hw))
 321                return 0;
 322
 323        ndiv = CLKGEN_READ(pll, ndiv);
 324        idf = CLKGEN_READ(pll, idf);
 325
 326        if (idf)
 327                /* Note: input is divided to avoid overflow */
 328                rate = ((2 * (parent_rate/1000) * ndiv) / idf) * 1000;
 329
 330        pr_debug("%s:%s rate %lu\n", clk_hw_get_name(hw), __func__, rate);
 331
 332        return rate;
 333}
 334
 335static long round_rate_stm_pll3200c32(struct clk_hw *hw, unsigned long rate,
 336                unsigned long *prate)
 337{
 338        struct stm_pll params;
 339
 340        if (!clk_pll3200c32_get_params(*prate, rate, &params))
 341                clk_pll3200c32_get_rate(*prate, &params, &rate);
 342        else {
 343                pr_debug("%s: %s rate %ld Invalid\n", __func__,
 344                         __clk_get_name(hw->clk), rate);
 345                return 0;
 346        }
 347
 348        pr_debug("%s: %s new rate %ld [ndiv=%u] [idf=%u]\n",
 349                 __func__, __clk_get_name(hw->clk),
 350                 rate, (unsigned int)params.ndiv,
 351                 (unsigned int)params.idf);
 352
 353        return rate;
 354}
 355
 356static int set_rate_stm_pll3200c32(struct clk_hw *hw, unsigned long rate,
 357                                unsigned long parent_rate)
 358{
 359        struct clkgen_pll *pll = to_clkgen_pll(hw);
 360        struct stm_pll params;
 361        long hwrate = 0;
 362        unsigned long flags = 0;
 363
 364        if (!rate || !parent_rate)
 365                return -EINVAL;
 366
 367        if (!clk_pll3200c32_get_params(parent_rate, rate, &params))
 368                clk_pll3200c32_get_rate(parent_rate, &params, &hwrate);
 369
 370        pr_debug("%s: %s new rate %ld [ndiv=0x%x] [idf=0x%x]\n",
 371                 __func__, __clk_get_name(hw->clk),
 372                 hwrate, (unsigned int)params.ndiv,
 373                 (unsigned int)params.idf);
 374
 375        if (!hwrate)
 376                return -EINVAL;
 377
 378        pll->ndiv = params.ndiv;
 379        pll->idf = params.idf;
 380        pll->cp = params.cp;
 381
 382        __clkgen_pll_disable(hw);
 383
 384        if (pll->lock)
 385                spin_lock_irqsave(pll->lock, flags);
 386
 387        CLKGEN_WRITE(pll, ndiv, pll->ndiv);
 388        CLKGEN_WRITE(pll, idf, pll->idf);
 389        CLKGEN_WRITE(pll, cp, pll->cp);
 390
 391        if (pll->lock)
 392                spin_unlock_irqrestore(pll->lock, flags);
 393
 394        __clkgen_pll_enable(hw);
 395
 396        return 0;
 397}
 398
 399/* PLL output structure
 400 * FVCO >> /2 >> FVCOBY2 (no output)
 401 *                 |> Divider (ODF) >> PHI
 402 *
 403 * FVCOby2 output = (input * 2 * NDIV) / IDF (assuming FRAC_CONTROL==L)
 404 *
 405 * Rules:
 406 *   4Mhz <= INFF input <= 350Mhz
 407 *   4Mhz <= INFIN (INFF / IDF) <= 50Mhz
 408 *   19.05Mhz <= FVCOby2 output (PHI w ODF=1) <= 3000Mhz
 409 *   1 <= i (register/dec value for IDF) <= 7
 410 *   8 <= n (register/dec value for NDIV) <= 246
 411 */
 412
 413static int clk_pll4600c28_get_params(unsigned long input, unsigned long output,
 414                          struct stm_pll *pll)
 415{
 416
 417        unsigned long i, infin, n;
 418        unsigned long deviation = ~0;
 419        unsigned long new_freq, new_deviation;
 420
 421        /* Output clock range: 19Mhz to 3000Mhz */
 422        if (output < 19000000 || output > 3000000000u)
 423                return -EINVAL;
 424
 425        /* For better jitter, IDF should be smallest and NDIV must be maximum */
 426        for (i = 1; i <= 7 && deviation; i++) {
 427                /* INFIN checks */
 428                infin = input / i;
 429                if (infin < 4000000 || infin > 50000000)
 430                        continue;       /* Invalid case */
 431
 432                n = output / (infin * 2);
 433                if (n < 8 || n > 246)
 434                        continue;       /* Invalid case */
 435                if (n < 246)
 436                        n++;    /* To work around 'y' when n=x.y */
 437
 438                for (; n >= 8 && deviation; n--) {
 439                        new_freq = infin * 2 * n;
 440                        if (new_freq < output)
 441                                break;  /* Optimization: shorting loop */
 442
 443                        new_deviation = new_freq - output;
 444                        if (!new_deviation || new_deviation < deviation) {
 445                                pll->idf  = i;
 446                                pll->ndiv = n;
 447                                deviation = new_deviation;
 448                        }
 449                }
 450        }
 451
 452        if (deviation == ~0) /* No solution found */
 453                return -EINVAL;
 454
 455        return 0;
 456}
 457
 458static int clk_pll4600c28_get_rate(unsigned long input, struct stm_pll *pll,
 459                        unsigned long *rate)
 460{
 461        if (!pll->idf)
 462                pll->idf = 1;
 463
 464        *rate = (input / pll->idf) * 2 * pll->ndiv;
 465
 466        return 0;
 467}
 468
 469static unsigned long recalc_stm_pll4600c28(struct clk_hw *hw,
 470                                    unsigned long parent_rate)
 471{
 472        struct clkgen_pll *pll = to_clkgen_pll(hw);
 473        struct stm_pll params;
 474        unsigned long rate;
 475
 476        if (!clkgen_pll_is_enabled(hw) || !clkgen_pll_is_locked(hw))
 477                return 0;
 478
 479        params.ndiv = CLKGEN_READ(pll, ndiv);
 480        params.idf = CLKGEN_READ(pll, idf);
 481
 482        clk_pll4600c28_get_rate(parent_rate, &params, &rate);
 483
 484        pr_debug("%s:%s rate %lu\n", __clk_get_name(hw->clk), __func__, rate);
 485
 486        return rate;
 487}
 488
 489static long round_rate_stm_pll4600c28(struct clk_hw *hw, unsigned long rate,
 490                                      unsigned long *prate)
 491{
 492        struct stm_pll params;
 493
 494        if (!clk_pll4600c28_get_params(*prate, rate, &params)) {
 495                clk_pll4600c28_get_rate(*prate, &params, &rate);
 496        } else {
 497                pr_debug("%s: %s rate %ld Invalid\n", __func__,
 498                         __clk_get_name(hw->clk), rate);
 499                return 0;
 500        }
 501
 502        pr_debug("%s: %s new rate %ld [ndiv=%u] [idf=%u]\n",
 503                 __func__, __clk_get_name(hw->clk),
 504                 rate, (unsigned int)params.ndiv,
 505                 (unsigned int)params.idf);
 506
 507        return rate;
 508}
 509
 510static int set_rate_stm_pll4600c28(struct clk_hw *hw, unsigned long rate,
 511                                   unsigned long parent_rate)
 512{
 513        struct clkgen_pll *pll = to_clkgen_pll(hw);
 514        struct stm_pll params;
 515        long hwrate;
 516        unsigned long flags = 0;
 517
 518        if (!rate || !parent_rate)
 519                return -EINVAL;
 520
 521        if (!clk_pll4600c28_get_params(parent_rate, rate, &params)) {
 522                clk_pll4600c28_get_rate(parent_rate, &params, &hwrate);
 523        } else {
 524                pr_debug("%s: %s rate %ld Invalid\n", __func__,
 525                         __clk_get_name(hw->clk), rate);
 526                return -EINVAL;
 527        }
 528
 529        pr_debug("%s: %s new rate %ld [ndiv=0x%x] [idf=0x%x]\n",
 530                 __func__, __clk_get_name(hw->clk),
 531                 hwrate, (unsigned int)params.ndiv,
 532                 (unsigned int)params.idf);
 533
 534        if (!hwrate)
 535                return -EINVAL;
 536
 537        pll->ndiv = params.ndiv;
 538        pll->idf = params.idf;
 539
 540        __clkgen_pll_disable(hw);
 541
 542        if (pll->lock)
 543                spin_lock_irqsave(pll->lock, flags);
 544
 545        CLKGEN_WRITE(pll, ndiv, pll->ndiv);
 546        CLKGEN_WRITE(pll, idf, pll->idf);
 547
 548        if (pll->lock)
 549                spin_unlock_irqrestore(pll->lock, flags);
 550
 551        __clkgen_pll_enable(hw);
 552
 553        return 0;
 554}
 555
 556static const struct clk_ops stm_pll3200c32_ops = {
 557        .enable         = clkgen_pll_enable,
 558        .disable        = clkgen_pll_disable,
 559        .is_enabled     = clkgen_pll_is_enabled,
 560        .recalc_rate    = recalc_stm_pll3200c32,
 561};
 562
 563static const struct clk_ops stm_pll3200c32_a9_ops = {
 564        .enable         = clkgen_pll_enable,
 565        .disable        = clkgen_pll_disable,
 566        .is_enabled     = clkgen_pll_is_enabled,
 567        .recalc_rate    = recalc_stm_pll3200c32,
 568        .round_rate     = round_rate_stm_pll3200c32,
 569        .set_rate       = set_rate_stm_pll3200c32,
 570};
 571
 572static const struct clk_ops stm_pll4600c28_ops = {
 573        .enable         = clkgen_pll_enable,
 574        .disable        = clkgen_pll_disable,
 575        .is_enabled     = clkgen_pll_is_enabled,
 576        .recalc_rate    = recalc_stm_pll4600c28,
 577        .round_rate     = round_rate_stm_pll4600c28,
 578        .set_rate       = set_rate_stm_pll4600c28,
 579};
 580
 581static struct clk * __init clkgen_pll_register(const char *parent_name,
 582                                struct clkgen_pll_data  *pll_data,
 583                                void __iomem *reg, unsigned long pll_flags,
 584                                const char *clk_name, spinlock_t *lock)
 585{
 586        struct clkgen_pll *pll;
 587        struct clk *clk;
 588        struct clk_init_data init;
 589
 590        pll = kzalloc(sizeof(*pll), GFP_KERNEL);
 591        if (!pll)
 592                return ERR_PTR(-ENOMEM);
 593
 594        init.name = clk_name;
 595        init.ops = pll_data->ops;
 596
 597        init.flags = pll_flags | CLK_GET_RATE_NOCACHE;
 598        init.parent_names = &parent_name;
 599        init.num_parents  = 1;
 600
 601        pll->data = pll_data;
 602        pll->regs_base = reg;
 603        pll->hw.init = &init;
 604        pll->lock = lock;
 605
 606        clk = clk_register(NULL, &pll->hw);
 607        if (IS_ERR(clk)) {
 608                kfree(pll);
 609                return clk;
 610        }
 611
 612        pr_debug("%s: parent %s rate %lu\n",
 613                        __clk_get_name(clk),
 614                        __clk_get_name(clk_get_parent(clk)),
 615                        clk_get_rate(clk));
 616
 617        return clk;
 618}
 619
 620static void __iomem * __init clkgen_get_register_base(
 621                                struct device_node *np)
 622{
 623        struct device_node *pnode;
 624        void __iomem *reg = NULL;
 625
 626        pnode = of_get_parent(np);
 627        if (!pnode)
 628                return NULL;
 629
 630        reg = of_iomap(pnode, 0);
 631
 632        of_node_put(pnode);
 633        return reg;
 634}
 635
 636static struct clk * __init clkgen_odf_register(const char *parent_name,
 637                                               void __iomem *reg,
 638                                               struct clkgen_pll_data *pll_data,
 639                                               unsigned long pll_flags, int odf,
 640                                               spinlock_t *odf_lock,
 641                                               const char *odf_name)
 642{
 643        struct clk *clk;
 644        unsigned long flags;
 645        struct clk_gate *gate;
 646        struct clk_divider *div;
 647
 648        flags = pll_flags | CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT;
 649
 650        gate = kzalloc(sizeof(*gate), GFP_KERNEL);
 651        if (!gate)
 652                return ERR_PTR(-ENOMEM);
 653
 654        gate->flags = CLK_GATE_SET_TO_DISABLE;
 655        gate->reg = reg + pll_data->odf_gate[odf].offset;
 656        gate->bit_idx = pll_data->odf_gate[odf].shift;
 657        gate->lock = odf_lock;
 658
 659        div = kzalloc(sizeof(*div), GFP_KERNEL);
 660        if (!div) {
 661                kfree(gate);
 662                return ERR_PTR(-ENOMEM);
 663        }
 664
 665        div->flags = CLK_DIVIDER_ONE_BASED | CLK_DIVIDER_ALLOW_ZERO;
 666        div->reg = reg + pll_data->odf[odf].offset;
 667        div->shift = pll_data->odf[odf].shift;
 668        div->width = fls(pll_data->odf[odf].mask);
 669        div->lock = odf_lock;
 670
 671        clk = clk_register_composite(NULL, odf_name, &parent_name, 1,
 672                                     NULL, NULL,
 673                                     &div->hw, &clk_divider_ops,
 674                                     &gate->hw, &clk_gate_ops,
 675                                     flags);
 676        if (IS_ERR(clk))
 677                return clk;
 678
 679        pr_debug("%s: parent %s rate %lu\n",
 680                        __clk_get_name(clk),
 681                        __clk_get_name(clk_get_parent(clk)),
 682                        clk_get_rate(clk));
 683        return clk;
 684}
 685
 686
 687static void __init clkgen_c32_pll_setup(struct device_node *np,
 688                struct clkgen_pll_data *data)
 689{
 690        struct clk *clk;
 691        const char *parent_name, *pll_name;
 692        void __iomem *pll_base;
 693        int num_odfs, odf;
 694        struct clk_onecell_data *clk_data;
 695        unsigned long pll_flags = 0;
 696
 697
 698        parent_name = of_clk_get_parent_name(np, 0);
 699        if (!parent_name)
 700                return;
 701
 702        pll_base = clkgen_get_register_base(np);
 703        if (!pll_base)
 704                return;
 705
 706        of_clk_detect_critical(np, 0, &pll_flags);
 707
 708        clk = clkgen_pll_register(parent_name, data, pll_base, pll_flags,
 709                                  np->name, data->lock);
 710        if (IS_ERR(clk))
 711                return;
 712
 713        pll_name = __clk_get_name(clk);
 714
 715        num_odfs = data->num_odfs;
 716
 717        clk_data = kzalloc(sizeof(*clk_data), GFP_KERNEL);
 718        if (!clk_data)
 719                return;
 720
 721        clk_data->clk_num = num_odfs;
 722        clk_data->clks = kcalloc(clk_data->clk_num, sizeof(struct clk *),
 723                                 GFP_KERNEL);
 724
 725        if (!clk_data->clks)
 726                goto err;
 727
 728        for (odf = 0; odf < num_odfs; odf++) {
 729                struct clk *clk;
 730                const char *clk_name;
 731                unsigned long odf_flags = 0;
 732
 733                if (of_property_read_string_index(np, "clock-output-names",
 734                                                  odf, &clk_name))
 735                        return;
 736
 737                of_clk_detect_critical(np, odf, &odf_flags);
 738
 739                clk = clkgen_odf_register(pll_name, pll_base, data, odf_flags,
 740                                odf, &clkgena_c32_odf_lock, clk_name);
 741                if (IS_ERR(clk))
 742                        goto err;
 743
 744                clk_data->clks[odf] = clk;
 745        }
 746
 747        of_clk_add_provider(np, of_clk_src_onecell_get, clk_data);
 748        return;
 749
 750err:
 751        kfree(pll_name);
 752        kfree(clk_data->clks);
 753        kfree(clk_data);
 754}
 755static void __init clkgen_c32_pll0_setup(struct device_node *np)
 756{
 757        clkgen_c32_pll_setup(np,
 758                        (struct clkgen_pll_data *) &st_pll3200c32_cx_0);
 759}
 760CLK_OF_DECLARE(c32_pll0, "st,clkgen-pll0", clkgen_c32_pll0_setup);
 761
 762static void __init clkgen_c32_pll1_setup(struct device_node *np)
 763{
 764        clkgen_c32_pll_setup(np,
 765                        (struct clkgen_pll_data *) &st_pll3200c32_cx_1);
 766}
 767CLK_OF_DECLARE(c32_pll1, "st,clkgen-pll1", clkgen_c32_pll1_setup);
 768
 769static void __init clkgen_c32_plla9_setup(struct device_node *np)
 770{
 771        clkgen_c32_pll_setup(np,
 772                        (struct clkgen_pll_data *) &st_pll3200c32_407_a9);
 773}
 774CLK_OF_DECLARE(c32_plla9, "st,stih407-clkgen-plla9", clkgen_c32_plla9_setup);
 775
 776static void __init clkgen_c28_plla9_setup(struct device_node *np)
 777{
 778        clkgen_c32_pll_setup(np,
 779                        (struct clkgen_pll_data *) &st_pll4600c28_418_a9);
 780}
 781CLK_OF_DECLARE(c28_plla9, "st,stih418-clkgen-plla9", clkgen_c28_plla9_setup);
 782