This source file includes following definitions.
- davinci_pll_recalc_rate
- davinci_pll_determine_rate
- davinci_pll_set_rate
- dm365_pll_recalc_rate
- davinci_pll_div_register
- davinci_pllen_rate_change
- davinci_pll_clk_register
- davinci_pll_auxclk_register
- davinci_pll_sysclkbp_clk_register
- davinci_pll_obsclk_register
- davinci_pll_sysclk_rate_change
- davinci_pll_sysclk_register
- of_davinci_pll_init
- davinci_pll_get_pdata
- davinci_pll_probe
- davinci_pll_driver_init
- davinci_pll_debug_init
   1 
   2 
   3 
   4 
   5 
   6 
   7 
   8 
   9 
  10 
  11 
  12 #include <linux/clk-provider.h>
  13 #include <linux/clk.h>
  14 #include <linux/clk/davinci.h>
  15 #include <linux/delay.h>
  16 #include <linux/err.h>
  17 #include <linux/io.h>
  18 #include <linux/kernel.h>
  19 #include <linux/mfd/syscon.h>
  20 #include <linux/notifier.h>
  21 #include <linux/of_address.h>
  22 #include <linux/of_device.h>
  23 #include <linux/of.h>
  24 #include <linux/platform_data/clk-davinci-pll.h>
  25 #include <linux/platform_device.h>
  26 #include <linux/regmap.h>
  27 #include <linux/slab.h>
  28 #include <linux/types.h>
  29 
  30 #include "pll.h"
  31 
  32 #define MAX_NAME_SIZE   20
  33 #define OSCIN_CLK_NAME  "oscin"
  34 
  35 #define REVID           0x000
  36 #define PLLCTL          0x100
  37 #define OCSEL           0x104
  38 #define PLLSECCTL       0x108
  39 #define PLLM            0x110
  40 #define PREDIV          0x114
  41 #define PLLDIV1         0x118
  42 #define PLLDIV2         0x11c
  43 #define PLLDIV3         0x120
  44 #define OSCDIV          0x124
  45 #define POSTDIV         0x128
  46 #define BPDIV           0x12c
  47 #define PLLCMD          0x138
  48 #define PLLSTAT         0x13c
  49 #define ALNCTL          0x140
  50 #define DCHANGE         0x144
  51 #define CKEN            0x148
  52 #define CKSTAT          0x14c
  53 #define SYSTAT          0x150
  54 #define PLLDIV4         0x160
  55 #define PLLDIV5         0x164
  56 #define PLLDIV6         0x168
  57 #define PLLDIV7         0x16c
  58 #define PLLDIV8         0x170
  59 #define PLLDIV9         0x174
  60 
  61 #define PLLCTL_PLLEN            BIT(0)
  62 #define PLLCTL_PLLPWRDN         BIT(1)
  63 #define PLLCTL_PLLRST           BIT(3)
  64 #define PLLCTL_PLLDIS           BIT(4)
  65 #define PLLCTL_PLLENSRC         BIT(5)
  66 #define PLLCTL_CLKMODE          BIT(8)
  67 
  68 
  69 #define DIV_RATIO_SHIFT         0
  70 #define DIV_RATIO_WIDTH         5
  71 #define DIV_ENABLE_SHIFT        15
  72 
  73 #define PLLCMD_GOSET            BIT(0)
  74 #define PLLSTAT_GOSTAT          BIT(0)
  75 
  76 #define CKEN_OBSCLK_SHIFT       1
  77 #define CKEN_AUXEN_SHIFT        0
  78 
  79 
  80 
  81 
  82 
  83 
  84 
  85 #define PLL_BYPASS_TIME         1
  86 
  87 
  88 #define PLL_RESET_TIME          1
  89 
  90 
  91 
  92 
  93 
  94 #define PLL_LOCK_TIME           20
  95 
  96 
  97 
  98 
  99 
 100 
 101 
 102 
 103 
 104 struct davinci_pll_clk {
 105         struct clk_hw hw;
 106         void __iomem *base;
 107         u32 pllm_min;
 108         u32 pllm_max;
 109         u32 pllm_mask;
 110 };
 111 
 112 #define to_davinci_pll_clk(_hw) \
 113         container_of((_hw), struct davinci_pll_clk, hw)
 114 
 115 static unsigned long davinci_pll_recalc_rate(struct clk_hw *hw,
 116                                              unsigned long parent_rate)
 117 {
 118         struct davinci_pll_clk *pll = to_davinci_pll_clk(hw);
 119         unsigned long rate = parent_rate;
 120         u32 mult;
 121 
 122         mult = readl(pll->base + PLLM) & pll->pllm_mask;
 123         rate *= mult + 1;
 124 
 125         return rate;
 126 }
 127 
 128 static int davinci_pll_determine_rate(struct clk_hw *hw,
 129                                       struct clk_rate_request *req)
 130 {
 131         struct davinci_pll_clk *pll = to_davinci_pll_clk(hw);
 132         struct clk_hw *parent = req->best_parent_hw;
 133         unsigned long parent_rate = req->best_parent_rate;
 134         unsigned long rate = req->rate;
 135         unsigned long best_rate, r;
 136         u32 mult;
 137 
 138         
 139         if (rate < req->min_rate)
 140                 return -EINVAL;
 141 
 142         rate = min(rate, req->max_rate);
 143         mult = rate / parent_rate;
 144         best_rate = parent_rate * mult;
 145 
 146         
 147         if (!(clk_hw_get_flags(hw) & CLK_SET_RATE_PARENT)) {
 148                 if (best_rate < req->min_rate)
 149                         return -EINVAL;
 150 
 151                 if (mult < pll->pllm_min || mult > pll->pllm_max)
 152                         return -EINVAL;
 153 
 154                 req->rate = best_rate;
 155 
 156                 return 0;
 157         }
 158 
 159         
 160         best_rate = 0;
 161 
 162         for (mult = pll->pllm_min; mult <= pll->pllm_max; mult++) {
 163                 parent_rate = clk_hw_round_rate(parent, rate / mult);
 164                 r = parent_rate * mult;
 165                 if (r < req->min_rate)
 166                         continue;
 167                 if (r > rate || r > req->max_rate)
 168                         break;
 169                 if (r > best_rate) {
 170                         best_rate = r;
 171                         req->rate = best_rate;
 172                         req->best_parent_rate = parent_rate;
 173                         if (best_rate == rate)
 174                                 break;
 175                 }
 176         }
 177 
 178         return 0;
 179 }
 180 
 181 static int davinci_pll_set_rate(struct clk_hw *hw, unsigned long rate,
 182                                 unsigned long parent_rate)
 183 {
 184         struct davinci_pll_clk *pll = to_davinci_pll_clk(hw);
 185         u32 mult;
 186 
 187         mult = rate / parent_rate;
 188         writel(mult - 1, pll->base + PLLM);
 189 
 190         return 0;
 191 }
 192 
 193 #ifdef CONFIG_DEBUG_FS
 194 static void davinci_pll_debug_init(struct clk_hw *hw, struct dentry *dentry);
 195 #else
 196 #define davinci_pll_debug_init NULL
 197 #endif
 198 
 199 static const struct clk_ops davinci_pll_ops = {
 200         .recalc_rate    = davinci_pll_recalc_rate,
 201         .determine_rate = davinci_pll_determine_rate,
 202         .set_rate       = davinci_pll_set_rate,
 203         .debug_init     = davinci_pll_debug_init,
 204 };
 205 
 206 
 207 static unsigned long dm365_pll_recalc_rate(struct clk_hw *hw,
 208                                            unsigned long parent_rate)
 209 {
 210         struct davinci_pll_clk *pll = to_davinci_pll_clk(hw);
 211         unsigned long rate = parent_rate;
 212         u32 mult;
 213 
 214         mult = readl(pll->base + PLLM) & pll->pllm_mask;
 215         rate *= mult * 2;
 216 
 217         return rate;
 218 }
 219 
 220 static const struct clk_ops dm365_pll_ops = {
 221         .recalc_rate    = dm365_pll_recalc_rate,
 222         .debug_init     = davinci_pll_debug_init,
 223 };
 224 
 225 
 226 
 227 
 228 
 229 
 230 
 231 
 232 
 233 
 234 static struct clk *davinci_pll_div_register(struct device *dev,
 235                                             const char *name,
 236                                             const char *parent_name,
 237                                             void __iomem *reg,
 238                                             bool fixed, u32 flags)
 239 {
 240         const char * const *parent_names = parent_name ? &parent_name : NULL;
 241         int num_parents = parent_name ? 1 : 0;
 242         const struct clk_ops *divider_ops = &clk_divider_ops;
 243         struct clk_gate *gate;
 244         struct clk_divider *divider;
 245         struct clk *clk;
 246         int ret;
 247 
 248         gate = kzalloc(sizeof(*gate), GFP_KERNEL);
 249         if (!gate)
 250                 return ERR_PTR(-ENOMEM);
 251 
 252         gate->reg = reg;
 253         gate->bit_idx = DIV_ENABLE_SHIFT;
 254 
 255         divider = kzalloc(sizeof(*divider), GFP_KERNEL);
 256         if (!divider) {
 257                 ret = -ENOMEM;
 258                 goto err_free_gate;
 259         }
 260 
 261         divider->reg = reg;
 262         divider->shift = DIV_RATIO_SHIFT;
 263         divider->width = DIV_RATIO_WIDTH;
 264 
 265         if (fixed) {
 266                 divider->flags |= CLK_DIVIDER_READ_ONLY;
 267                 divider_ops = &clk_divider_ro_ops;
 268         }
 269 
 270         clk = clk_register_composite(dev, name, parent_names, num_parents,
 271                                      NULL, NULL, ÷r->hw, divider_ops,
 272                                      &gate->hw, &clk_gate_ops, flags);
 273         if (IS_ERR(clk)) {
 274                 ret = PTR_ERR(clk);
 275                 goto err_free_divider;
 276         }
 277 
 278         return clk;
 279 
 280 err_free_divider:
 281         kfree(divider);
 282 err_free_gate:
 283         kfree(gate);
 284 
 285         return ERR_PTR(ret);
 286 }
 287 
 288 struct davinci_pllen_clk {
 289         struct clk_hw hw;
 290         void __iomem *base;
 291 };
 292 
 293 #define to_davinci_pllen_clk(_hw) \
 294         container_of((_hw), struct davinci_pllen_clk, hw)
 295 
 296 static const struct clk_ops davinci_pllen_ops = {
 297         
 298 };
 299 
 300 
 301 
 302 
 303 
 304 
 305 
 306 static int davinci_pllen_rate_change(struct notifier_block *nb,
 307                                      unsigned long flags, void *data)
 308 {
 309         struct clk_notifier_data *cnd = data;
 310         struct clk_hw *hw = __clk_get_hw(cnd->clk);
 311         struct davinci_pllen_clk *pll = to_davinci_pllen_clk(hw);
 312         u32 ctrl;
 313 
 314         ctrl = readl(pll->base + PLLCTL);
 315 
 316         if (flags == PRE_RATE_CHANGE) {
 317                 
 318                 ctrl &= ~(PLLCTL_PLLENSRC | PLLCTL_PLLEN);
 319                 writel(ctrl, pll->base + PLLCTL);
 320 
 321                 udelay(PLL_BYPASS_TIME);
 322 
 323                 
 324                 ctrl &= ~(PLLCTL_PLLRST | PLLCTL_PLLDIS);
 325                 writel(ctrl, pll->base + PLLCTL);
 326         } else {
 327                 udelay(PLL_RESET_TIME);
 328 
 329                 
 330                 ctrl |= PLLCTL_PLLRST;
 331                 writel(ctrl, pll->base + PLLCTL);
 332 
 333                 udelay(PLL_LOCK_TIME);
 334 
 335                 
 336                 ctrl |= PLLCTL_PLLEN;
 337                 writel(ctrl, pll->base + PLLCTL);
 338         }
 339 
 340         return NOTIFY_OK;
 341 }
 342 
 343 static struct notifier_block davinci_pllen_notifier = {
 344         .notifier_call = davinci_pllen_rate_change,
 345 };
 346 
 347 
 348 
 349 
 350 
 351 
 352 
 353 
 354 
 355 
 356 
 357 
 358 
 359 
 360 
 361 
 362 
 363 
 364 
 365 
 366 struct clk *davinci_pll_clk_register(struct device *dev,
 367                                      const struct davinci_pll_clk_info *info,
 368                                      const char *parent_name,
 369                                      void __iomem *base,
 370                                      struct regmap *cfgchip)
 371 {
 372         char prediv_name[MAX_NAME_SIZE];
 373         char pllout_name[MAX_NAME_SIZE];
 374         char postdiv_name[MAX_NAME_SIZE];
 375         char pllen_name[MAX_NAME_SIZE];
 376         struct clk_init_data init;
 377         struct davinci_pll_clk *pllout;
 378         struct davinci_pllen_clk *pllen;
 379         struct clk *oscin_clk = NULL;
 380         struct clk *prediv_clk = NULL;
 381         struct clk *pllout_clk;
 382         struct clk *postdiv_clk = NULL;
 383         struct clk *pllen_clk;
 384         int ret;
 385 
 386         if (info->flags & PLL_HAS_CLKMODE) {
 387                 
 388 
 389 
 390 
 391 
 392 
 393 
 394 
 395 
 396                 oscin_clk = clk_register_fixed_factor(dev, OSCIN_CLK_NAME,
 397                                                       parent_name, 0, 1, 1);
 398                 if (IS_ERR(oscin_clk))
 399                         return oscin_clk;
 400 
 401                 parent_name = OSCIN_CLK_NAME;
 402         }
 403 
 404         if (info->flags & PLL_HAS_PREDIV) {
 405                 bool fixed = info->flags & PLL_PREDIV_FIXED_DIV;
 406                 u32 flags = 0;
 407 
 408                 snprintf(prediv_name, MAX_NAME_SIZE, "%s_prediv", info->name);
 409 
 410                 if (info->flags & PLL_PREDIV_ALWAYS_ENABLED)
 411                         flags |= CLK_IS_CRITICAL;
 412 
 413                 
 414                 if (info->flags & PLL_PREDIV_FIXED8)
 415                         prediv_clk = clk_register_fixed_factor(dev, prediv_name,
 416                                                         parent_name, flags, 1, 8);
 417                 else
 418                         prediv_clk = davinci_pll_div_register(dev, prediv_name,
 419                                 parent_name, base + PREDIV, fixed, flags);
 420                 if (IS_ERR(prediv_clk)) {
 421                         ret = PTR_ERR(prediv_clk);
 422                         goto err_unregister_oscin;
 423                 }
 424 
 425                 parent_name = prediv_name;
 426         }
 427 
 428         
 429         if (info->unlock_reg) {
 430                 if (IS_ERR_OR_NULL(cfgchip))
 431                         dev_warn(dev, "Failed to get CFGCHIP (%ld)\n",
 432                                  PTR_ERR(cfgchip));
 433                 else
 434                         regmap_write_bits(cfgchip, info->unlock_reg,
 435                                           info->unlock_mask, 0);
 436         }
 437 
 438         pllout = kzalloc(sizeof(*pllout), GFP_KERNEL);
 439         if (!pllout) {
 440                 ret = -ENOMEM;
 441                 goto err_unregister_prediv;
 442         }
 443 
 444         snprintf(pllout_name, MAX_NAME_SIZE, "%s_pllout", info->name);
 445 
 446         init.name = pllout_name;
 447         if (info->flags & PLL_PLLM_2X)
 448                 init.ops = &dm365_pll_ops;
 449         else
 450                 init.ops = &davinci_pll_ops;
 451         init.parent_names = &parent_name;
 452         init.num_parents = 1;
 453         init.flags = 0;
 454 
 455         if (info->flags & PLL_HAS_PREDIV)
 456                 init.flags |= CLK_SET_RATE_PARENT;
 457 
 458         pllout->hw.init = &init;
 459         pllout->base = base;
 460         pllout->pllm_mask = info->pllm_mask;
 461         pllout->pllm_min = info->pllm_min;
 462         pllout->pllm_max = info->pllm_max;
 463 
 464         pllout_clk = clk_register(dev, &pllout->hw);
 465         if (IS_ERR(pllout_clk)) {
 466                 ret = PTR_ERR(pllout_clk);
 467                 goto err_free_pllout;
 468         }
 469 
 470         clk_hw_set_rate_range(&pllout->hw, info->pllout_min_rate,
 471                               info->pllout_max_rate);
 472 
 473         parent_name = pllout_name;
 474 
 475         if (info->flags & PLL_HAS_POSTDIV) {
 476                 bool fixed = info->flags & PLL_POSTDIV_FIXED_DIV;
 477                 u32 flags = CLK_SET_RATE_PARENT;
 478 
 479                 snprintf(postdiv_name, MAX_NAME_SIZE, "%s_postdiv", info->name);
 480 
 481                 if (info->flags & PLL_POSTDIV_ALWAYS_ENABLED)
 482                         flags |= CLK_IS_CRITICAL;
 483 
 484                 postdiv_clk = davinci_pll_div_register(dev, postdiv_name,
 485                                 parent_name, base + POSTDIV, fixed, flags);
 486                 if (IS_ERR(postdiv_clk)) {
 487                         ret = PTR_ERR(postdiv_clk);
 488                         goto err_unregister_pllout;
 489                 }
 490 
 491                 parent_name = postdiv_name;
 492         }
 493 
 494         pllen = kzalloc(sizeof(*pllout), GFP_KERNEL);
 495         if (!pllen) {
 496                 ret = -ENOMEM;
 497                 goto err_unregister_postdiv;
 498         }
 499 
 500         snprintf(pllen_name, MAX_NAME_SIZE, "%s_pllen", info->name);
 501 
 502         init.name = pllen_name;
 503         init.ops = &davinci_pllen_ops;
 504         init.parent_names = &parent_name;
 505         init.num_parents = 1;
 506         init.flags = CLK_SET_RATE_PARENT;
 507 
 508         pllen->hw.init = &init;
 509         pllen->base = base;
 510 
 511         pllen_clk = clk_register(dev, &pllen->hw);
 512         if (IS_ERR(pllen_clk)) {
 513                 ret = PTR_ERR(pllen_clk);
 514                 goto err_free_pllen;
 515         }
 516 
 517         clk_notifier_register(pllen_clk, &davinci_pllen_notifier);
 518 
 519         return pllout_clk;
 520 
 521 err_free_pllen:
 522         kfree(pllen);
 523 err_unregister_postdiv:
 524         clk_unregister(postdiv_clk);
 525 err_unregister_pllout:
 526         clk_unregister(pllout_clk);
 527 err_free_pllout:
 528         kfree(pllout);
 529 err_unregister_prediv:
 530         clk_unregister(prediv_clk);
 531 err_unregister_oscin:
 532         clk_unregister(oscin_clk);
 533 
 534         return ERR_PTR(ret);
 535 }
 536 
 537 
 538 
 539 
 540 
 541 
 542 
 543 struct clk *davinci_pll_auxclk_register(struct device *dev,
 544                                         const char *name,
 545                                         void __iomem *base)
 546 {
 547         return clk_register_gate(dev, name, OSCIN_CLK_NAME, 0, base + CKEN,
 548                                  CKEN_AUXEN_SHIFT, 0, NULL);
 549 }
 550 
 551 
 552 
 553 
 554 
 555 
 556 
 557 struct clk *davinci_pll_sysclkbp_clk_register(struct device *dev,
 558                                               const char *name,
 559                                               void __iomem *base)
 560 {
 561         return clk_register_divider(dev, name, OSCIN_CLK_NAME, 0, base + BPDIV,
 562                                     DIV_RATIO_SHIFT, DIV_RATIO_WIDTH,
 563                                     CLK_DIVIDER_READ_ONLY, NULL);
 564 }
 565 
 566 
 567 
 568 
 569 
 570 
 571 
 572 struct clk *
 573 davinci_pll_obsclk_register(struct device *dev,
 574                             const struct davinci_pll_obsclk_info *info,
 575                             void __iomem *base)
 576 {
 577         struct clk_mux *mux;
 578         struct clk_gate *gate;
 579         struct clk_divider *divider;
 580         struct clk *clk;
 581         u32 oscdiv;
 582         int ret;
 583 
 584         mux = kzalloc(sizeof(*mux), GFP_KERNEL);
 585         if (!mux)
 586                 return ERR_PTR(-ENOMEM);
 587 
 588         mux->reg = base + OCSEL;
 589         mux->table = info->table;
 590         mux->mask = info->ocsrc_mask;
 591 
 592         gate = kzalloc(sizeof(*gate), GFP_KERNEL);
 593         if (!gate) {
 594                 ret = -ENOMEM;
 595                 goto err_free_mux;
 596         }
 597 
 598         gate->reg = base + CKEN;
 599         gate->bit_idx = CKEN_OBSCLK_SHIFT;
 600 
 601         divider = kzalloc(sizeof(*divider), GFP_KERNEL);
 602         if (!divider) {
 603                 ret = -ENOMEM;
 604                 goto err_free_gate;
 605         }
 606 
 607         divider->reg = base + OSCDIV;
 608         divider->shift = DIV_RATIO_SHIFT;
 609         divider->width = DIV_RATIO_WIDTH;
 610 
 611         
 612         oscdiv = readl(base + OSCDIV);
 613         oscdiv |= BIT(DIV_ENABLE_SHIFT);
 614         writel(oscdiv, base + OSCDIV);
 615 
 616         clk = clk_register_composite(dev, info->name, info->parent_names,
 617                                      info->num_parents,
 618                                      &mux->hw, &clk_mux_ops,
 619                                      ÷r->hw, &clk_divider_ops,
 620                                      &gate->hw, &clk_gate_ops, 0);
 621 
 622         if (IS_ERR(clk)) {
 623                 ret = PTR_ERR(clk);
 624                 goto err_free_divider;
 625         }
 626 
 627         return clk;
 628 
 629 err_free_divider:
 630         kfree(divider);
 631 err_free_gate:
 632         kfree(gate);
 633 err_free_mux:
 634         kfree(mux);
 635 
 636         return ERR_PTR(ret);
 637 }
 638 
 639 
 640 static int davinci_pll_sysclk_rate_change(struct notifier_block *nb,
 641                                           unsigned long flags, void *data)
 642 {
 643         struct clk_notifier_data *cnd = data;
 644         struct clk_hw *hw = __clk_get_hw(clk_get_parent(cnd->clk));
 645         struct davinci_pllen_clk *pll = to_davinci_pllen_clk(hw);
 646         u32 pllcmd, pllstat;
 647 
 648         switch (flags) {
 649         case POST_RATE_CHANGE:
 650                 
 651                 pllcmd = readl(pll->base + PLLCMD);
 652                 pllcmd |= PLLCMD_GOSET;
 653                 writel(pllcmd, pll->base + PLLCMD);
 654                 
 655         case PRE_RATE_CHANGE:
 656                 
 657                 do {
 658                         pllstat = readl(pll->base + PLLSTAT);
 659                 } while (pllstat & PLLSTAT_GOSTAT);
 660                 break;
 661         }
 662 
 663         return NOTIFY_OK;
 664 }
 665 
 666 static struct notifier_block davinci_pll_sysclk_notifier = {
 667         .notifier_call = davinci_pll_sysclk_rate_change,
 668 };
 669 
 670 
 671 
 672 
 673 
 674 
 675 
 676 struct clk *
 677 davinci_pll_sysclk_register(struct device *dev,
 678                             const struct davinci_pll_sysclk_info *info,
 679                             void __iomem *base)
 680 {
 681         const struct clk_ops *divider_ops = &clk_divider_ops;
 682         struct clk_gate *gate;
 683         struct clk_divider *divider;
 684         struct clk *clk;
 685         u32 reg;
 686         u32 flags = 0;
 687         int ret;
 688 
 689         
 690         if (info->id < 4)
 691                 reg = PLLDIV1 + 4 * (info->id - 1);
 692         else
 693                 reg = PLLDIV4 + 4 * (info->id - 4);
 694 
 695         gate = kzalloc(sizeof(*gate), GFP_KERNEL);
 696         if (!gate)
 697                 return ERR_PTR(-ENOMEM);
 698 
 699         gate->reg = base + reg;
 700         gate->bit_idx = DIV_ENABLE_SHIFT;
 701 
 702         divider = kzalloc(sizeof(*divider), GFP_KERNEL);
 703         if (!divider) {
 704                 ret = -ENOMEM;
 705                 goto err_free_gate;
 706         }
 707 
 708         divider->reg = base + reg;
 709         divider->shift = DIV_RATIO_SHIFT;
 710         divider->width = info->ratio_width;
 711         divider->flags = 0;
 712 
 713         if (info->flags & SYSCLK_FIXED_DIV) {
 714                 divider->flags |= CLK_DIVIDER_READ_ONLY;
 715                 divider_ops = &clk_divider_ro_ops;
 716         }
 717 
 718         
 719         if (info->flags & SYSCLK_ARM_RATE)
 720                 flags |= CLK_SET_RATE_PARENT;
 721 
 722         if (info->flags & SYSCLK_ALWAYS_ENABLED)
 723                 flags |= CLK_IS_CRITICAL;
 724 
 725         clk = clk_register_composite(dev, info->name, &info->parent_name, 1,
 726                                      NULL, NULL, ÷r->hw, divider_ops,
 727                                      &gate->hw, &clk_gate_ops, flags);
 728         if (IS_ERR(clk)) {
 729                 ret = PTR_ERR(clk);
 730                 goto err_free_divider;
 731         }
 732 
 733         clk_notifier_register(clk, &davinci_pll_sysclk_notifier);
 734 
 735         return clk;
 736 
 737 err_free_divider:
 738         kfree(divider);
 739 err_free_gate:
 740         kfree(gate);
 741 
 742         return ERR_PTR(ret);
 743 }
 744 
 745 int of_davinci_pll_init(struct device *dev, struct device_node *node,
 746                         const struct davinci_pll_clk_info *info,
 747                         const struct davinci_pll_obsclk_info *obsclk_info,
 748                         const struct davinci_pll_sysclk_info **div_info,
 749                         u8 max_sysclk_id,
 750                         void __iomem *base,
 751                         struct regmap *cfgchip)
 752 {
 753         struct device_node *child;
 754         const char *parent_name;
 755         struct clk *clk;
 756 
 757         if (info->flags & PLL_HAS_CLKMODE)
 758                 parent_name = of_clk_get_parent_name(node, 0);
 759         else
 760                 parent_name = OSCIN_CLK_NAME;
 761 
 762         clk = davinci_pll_clk_register(dev, info, parent_name, base, cfgchip);
 763         if (IS_ERR(clk)) {
 764                 dev_err(dev, "failed to register %s\n", info->name);
 765                 return PTR_ERR(clk);
 766         }
 767 
 768         child = of_get_child_by_name(node, "pllout");
 769         if (of_device_is_available(child))
 770                 of_clk_add_provider(child, of_clk_src_simple_get, clk);
 771         of_node_put(child);
 772 
 773         child = of_get_child_by_name(node, "sysclk");
 774         if (of_device_is_available(child)) {
 775                 struct clk_onecell_data *clk_data;
 776                 struct clk **clks;
 777                 int n_clks =  max_sysclk_id + 1;
 778                 int i;
 779 
 780                 clk_data = kzalloc(sizeof(*clk_data), GFP_KERNEL);
 781                 if (!clk_data) {
 782                         of_node_put(child);
 783                         return -ENOMEM;
 784                 }
 785 
 786                 clks = kmalloc_array(n_clks, sizeof(*clks), GFP_KERNEL);
 787                 if (!clks) {
 788                         kfree(clk_data);
 789                         of_node_put(child);
 790                         return -ENOMEM;
 791                 }
 792 
 793                 clk_data->clks = clks;
 794                 clk_data->clk_num = n_clks;
 795 
 796                 for (i = 0; i < n_clks; i++)
 797                         clks[i] = ERR_PTR(-ENOENT);
 798 
 799                 for (; *div_info; div_info++) {
 800                         clk = davinci_pll_sysclk_register(dev, *div_info, base);
 801                         if (IS_ERR(clk))
 802                                 dev_warn(dev, "failed to register %s (%ld)\n",
 803                                          (*div_info)->name, PTR_ERR(clk));
 804                         else
 805                                 clks[(*div_info)->id] = clk;
 806                 }
 807                 of_clk_add_provider(child, of_clk_src_onecell_get, clk_data);
 808         }
 809         of_node_put(child);
 810 
 811         child = of_get_child_by_name(node, "auxclk");
 812         if (of_device_is_available(child)) {
 813                 char child_name[MAX_NAME_SIZE];
 814 
 815                 snprintf(child_name, MAX_NAME_SIZE, "%s_auxclk", info->name);
 816 
 817                 clk = davinci_pll_auxclk_register(dev, child_name, base);
 818                 if (IS_ERR(clk))
 819                         dev_warn(dev, "failed to register %s (%ld)\n",
 820                                  child_name, PTR_ERR(clk));
 821                 else
 822                         of_clk_add_provider(child, of_clk_src_simple_get, clk);
 823         }
 824         of_node_put(child);
 825 
 826         child = of_get_child_by_name(node, "obsclk");
 827         if (of_device_is_available(child)) {
 828                 if (obsclk_info)
 829                         clk = davinci_pll_obsclk_register(dev, obsclk_info, base);
 830                 else
 831                         clk = ERR_PTR(-EINVAL);
 832 
 833                 if (IS_ERR(clk))
 834                         dev_warn(dev, "failed to register obsclk (%ld)\n",
 835                                  PTR_ERR(clk));
 836                 else
 837                         of_clk_add_provider(child, of_clk_src_simple_get, clk);
 838         }
 839         of_node_put(child);
 840 
 841         return 0;
 842 }
 843 
 844 static struct davinci_pll_platform_data *davinci_pll_get_pdata(struct device *dev)
 845 {
 846         struct davinci_pll_platform_data *pdata = dev_get_platdata(dev);
 847 
 848         
 849 
 850 
 851 
 852         if (!pdata)
 853                 pdata = devm_kzalloc(dev, sizeof(*pdata), GFP_KERNEL);
 854         if (!pdata)
 855                 return NULL;
 856 
 857         
 858         if (dev->of_node)
 859                 pdata->cfgchip =
 860                         syscon_regmap_lookup_by_compatible("ti,da830-cfgchip");
 861 
 862         return pdata;
 863 }
 864 
 865 
 866 #ifdef CONFIG_ARCH_DAVINCI_DA850
 867 CLK_OF_DECLARE(da850_pll0, "ti,da850-pll0", of_da850_pll0_init);
 868 #endif
 869 
 870 static const struct of_device_id davinci_pll_of_match[] = {
 871 #ifdef CONFIG_ARCH_DAVINCI_DA850
 872         { .compatible = "ti,da850-pll1", .data = of_da850_pll1_init },
 873 #endif
 874         { }
 875 };
 876 
 877 static const struct platform_device_id davinci_pll_id_table[] = {
 878 #ifdef CONFIG_ARCH_DAVINCI_DA830
 879         { .name = "da830-pll",   .driver_data = (kernel_ulong_t)da830_pll_init   },
 880 #endif
 881 #ifdef CONFIG_ARCH_DAVINCI_DA850
 882         { .name = "da850-pll0",  .driver_data = (kernel_ulong_t)da850_pll0_init  },
 883         { .name = "da850-pll1",  .driver_data = (kernel_ulong_t)da850_pll1_init  },
 884 #endif
 885 #ifdef CONFIG_ARCH_DAVINCI_DM355
 886         { .name = "dm355-pll1",  .driver_data = (kernel_ulong_t)dm355_pll1_init  },
 887         { .name = "dm355-pll2",  .driver_data = (kernel_ulong_t)dm355_pll2_init  },
 888 #endif
 889 #ifdef CONFIG_ARCH_DAVINCI_DM365
 890         { .name = "dm365-pll1",  .driver_data = (kernel_ulong_t)dm365_pll1_init  },
 891         { .name = "dm365-pll2",  .driver_data = (kernel_ulong_t)dm365_pll2_init  },
 892 #endif
 893 #ifdef CONFIG_ARCH_DAVINCI_DM644x
 894         { .name = "dm644x-pll1", .driver_data = (kernel_ulong_t)dm644x_pll1_init },
 895         { .name = "dm644x-pll2", .driver_data = (kernel_ulong_t)dm644x_pll2_init },
 896 #endif
 897 #ifdef CONFIG_ARCH_DAVINCI_DM646x
 898         { .name = "dm646x-pll1", .driver_data = (kernel_ulong_t)dm646x_pll1_init },
 899         { .name = "dm646x-pll2", .driver_data = (kernel_ulong_t)dm646x_pll2_init },
 900 #endif
 901         { }
 902 };
 903 
 904 typedef int (*davinci_pll_init)(struct device *dev, void __iomem *base,
 905                                 struct regmap *cfgchip);
 906 
 907 static int davinci_pll_probe(struct platform_device *pdev)
 908 {
 909         struct device *dev = &pdev->dev;
 910         struct davinci_pll_platform_data *pdata;
 911         const struct of_device_id *of_id;
 912         davinci_pll_init pll_init = NULL;
 913         struct resource *res;
 914         void __iomem *base;
 915 
 916         of_id = of_match_device(davinci_pll_of_match, dev);
 917         if (of_id)
 918                 pll_init = of_id->data;
 919         else if (pdev->id_entry)
 920                 pll_init = (void *)pdev->id_entry->driver_data;
 921 
 922         if (!pll_init) {
 923                 dev_err(dev, "unable to find driver data\n");
 924                 return -EINVAL;
 925         }
 926 
 927         pdata = davinci_pll_get_pdata(dev);
 928         if (!pdata) {
 929                 dev_err(dev, "missing platform data\n");
 930                 return -EINVAL;
 931         }
 932 
 933         res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
 934         base = devm_ioremap_resource(dev, res);
 935         if (IS_ERR(base))
 936                 return PTR_ERR(base);
 937 
 938         return pll_init(dev, base, pdata->cfgchip);
 939 }
 940 
 941 static struct platform_driver davinci_pll_driver = {
 942         .probe          = davinci_pll_probe,
 943         .driver         = {
 944                 .name           = "davinci-pll-clk",
 945                 .of_match_table = davinci_pll_of_match,
 946         },
 947         .id_table       = davinci_pll_id_table,
 948 };
 949 
 950 static int __init davinci_pll_driver_init(void)
 951 {
 952         return platform_driver_register(&davinci_pll_driver);
 953 }
 954 
 955 
 956 postcore_initcall(davinci_pll_driver_init);
 957 
 958 #ifdef CONFIG_DEBUG_FS
 959 #include <linux/debugfs.h>
 960 
 961 #define DEBUG_REG(n)    \
 962 {                       \
 963         .name   = #n,   \
 964         .offset = n,    \
 965 }
 966 
 967 static const struct debugfs_reg32 davinci_pll_regs[] = {
 968         DEBUG_REG(REVID),
 969         DEBUG_REG(PLLCTL),
 970         DEBUG_REG(OCSEL),
 971         DEBUG_REG(PLLSECCTL),
 972         DEBUG_REG(PLLM),
 973         DEBUG_REG(PREDIV),
 974         DEBUG_REG(PLLDIV1),
 975         DEBUG_REG(PLLDIV2),
 976         DEBUG_REG(PLLDIV3),
 977         DEBUG_REG(OSCDIV),
 978         DEBUG_REG(POSTDIV),
 979         DEBUG_REG(BPDIV),
 980         DEBUG_REG(PLLCMD),
 981         DEBUG_REG(PLLSTAT),
 982         DEBUG_REG(ALNCTL),
 983         DEBUG_REG(DCHANGE),
 984         DEBUG_REG(CKEN),
 985         DEBUG_REG(CKSTAT),
 986         DEBUG_REG(SYSTAT),
 987         DEBUG_REG(PLLDIV4),
 988         DEBUG_REG(PLLDIV5),
 989         DEBUG_REG(PLLDIV6),
 990         DEBUG_REG(PLLDIV7),
 991         DEBUG_REG(PLLDIV8),
 992         DEBUG_REG(PLLDIV9),
 993 };
 994 
 995 static void davinci_pll_debug_init(struct clk_hw *hw, struct dentry *dentry)
 996 {
 997         struct davinci_pll_clk *pll = to_davinci_pll_clk(hw);
 998         struct debugfs_regset32 *regset;
 999 
1000         regset = kzalloc(sizeof(*regset), GFP_KERNEL);
1001         if (!regset)
1002                 return;
1003 
1004         regset->regs = davinci_pll_regs;
1005         regset->nregs = ARRAY_SIZE(davinci_pll_regs);
1006         regset->base = pll->base;
1007 
1008         debugfs_create_regset32("registers", 0400, dentry, regset);
1009 }
1010 #endif