linux/arch/arm/mach-u300/clock.c
<<
>>
Prefs
   1/*
   2 *
   3 * arch/arm/mach-u300/clock.c
   4 *
   5 *
   6 * Copyright (C) 2007-2009 ST-Ericsson AB
   7 * License terms: GNU General Public License (GPL) version 2
   8 * Define clocks in the app platform.
   9 * Author: Linus Walleij <linus.walleij@stericsson.com>
  10 * Author: Jonas Aaberg <jonas.aberg@stericsson.com>
  11 *
  12 */
  13#include <linux/module.h>
  14#include <linux/kernel.h>
  15#include <linux/list.h>
  16#include <linux/errno.h>
  17#include <linux/err.h>
  18#include <linux/string.h>
  19#include <linux/clk.h>
  20#include <linux/mutex.h>
  21#include <linux/spinlock.h>
  22#include <linux/debugfs.h>
  23#include <linux/device.h>
  24#include <linux/init.h>
  25#include <linux/timer.h>
  26#include <linux/io.h>
  27#include <linux/seq_file.h>
  28
  29#include <asm/clkdev.h>
  30#include <mach/hardware.h>
  31#include <mach/syscon.h>
  32
  33#include "clock.h"
  34
  35/*
  36 * TODO:
  37 * - move all handling of the CCR register into this file and create
  38 *   a spinlock for the CCR register
  39 * - switch to the clkdevice lookup mechanism that maps clocks to
  40 *   device ID:s instead when it becomes available in kernel 2.6.29.
  41 * - implement rate get/set for all clocks that need it.
  42 */
  43
  44/*
  45 * Syscon clock I/O registers lock so clock requests don't collide
  46 * NOTE: this is a local lock only used to lock access to clock and
  47 * reset registers in syscon.
  48 */
  49static DEFINE_SPINLOCK(syscon_clkreg_lock);
  50static DEFINE_SPINLOCK(syscon_resetreg_lock);
  51
  52/*
  53 * The clocking hierarchy currently looks like this.
  54 * NOTE: the idea is NOT to show how the clocks are routed on the chip!
  55 * The ideas is to show dependencies, so a clock higher up in the
  56 * hierarchy has to be on in order for another clock to be on. Now,
  57 * both CPU and DMA can actually be on top of the hierarchy, and that
  58 * is not modeled currently. Instead we have the backbone AMBA bus on
  59 * top. This bus cannot be programmed in any way but conceptually it
  60 * needs to be active for the bridges and devices to transport data.
  61 *
  62 * Please be aware that a few clocks are hw controlled, which mean that
  63 * the hw itself can turn on/off or change the rate of the clock when
  64 * needed!
  65 *
  66 *  AMBA bus
  67 *  |
  68 *  +- CPU
  69 *  +- NANDIF NAND Flash interface
  70 *  +- SEMI Shared Memory interface
  71 *  +- ISP Image Signal Processor (U335 only)
  72 *  +- CDS (U335 only)
  73 *  +- DMA Direct Memory Access Controller
  74 *  +- AAIF APP/ACC Inteface (Mobile Scalable Link, MSL)
  75 *  +- APEX
  76 *  +- VIDEO_ENC AVE2/3 Video Encoder
  77 *  +- XGAM Graphics Accelerator Controller
  78 *  +- AHB
  79 *  |
  80 *  +- ahb:0 AHB Bridge
  81 *  |  |
  82 *  |  +- ahb:1 INTCON Interrupt controller
  83 *  |  +- ahb:3 MSPRO  Memory Stick Pro controller
  84 *  |  +- ahb:4 EMIF   External Memory interface
  85 *  |
  86 *  +- fast:0 FAST bridge
  87 *  |  |
  88 *  |  +- fast:1 MMCSD MMC/SD card reader controller
  89 *  |  +- fast:2 I2S0  PCM I2S channel 0 controller
  90 *  |  +- fast:3 I2S1  PCM I2S channel 1 controller
  91 *  |  +- fast:4 I2C0  I2C channel 0 controller
  92 *  |  +- fast:5 I2C1  I2C channel 1 controller
  93 *  |  +- fast:6 SPI   SPI controller
  94 *  |  +- fast:7 UART1 Secondary UART (U335 only)
  95 *  |
  96 *  +- slow:0 SLOW bridge
  97 *     |
  98 *     +- slow:1 SYSCON (not possible to control)
  99 *     +- slow:2 WDOG Watchdog
 100 *     +- slow:3 UART0 primary UART
 101 *     +- slow:4 TIMER_APP Application timer - used in Linux
 102 *     +- slow:5 KEYPAD controller
 103 *     +- slow:6 GPIO controller
 104 *     +- slow:7 RTC controller
 105 *     +- slow:8 BT Bus Tracer (not used currently)
 106 *     +- slow:9 EH Event Handler (not used currently)
 107 *     +- slow:a TIMER_ACC Access style timer (not used currently)
 108 *     +- slow:b PPM (U335 only, what is that?)
 109 */
 110
 111/*
 112 * Reset control functions. We remember if a block has been
 113 * taken out of reset and don't remove the reset assertion again
 114 * and vice versa. Currently we only remove resets so the
 115 * enablement function is defined out.
 116 */
 117static void syscon_block_reset_enable(struct clk *clk)
 118{
 119        u16 val;
 120        unsigned long iflags;
 121
 122        /* Not all blocks support resetting */
 123        if (!clk->res_reg || !clk->res_mask)
 124                return;
 125        spin_lock_irqsave(&syscon_resetreg_lock, iflags);
 126        val = readw(clk->res_reg);
 127        val |= clk->res_mask;
 128        writew(val, clk->res_reg);
 129        spin_unlock_irqrestore(&syscon_resetreg_lock, iflags);
 130        clk->reset = true;
 131}
 132
 133static void syscon_block_reset_disable(struct clk *clk)
 134{
 135        u16 val;
 136        unsigned long iflags;
 137
 138        /* Not all blocks support resetting */
 139        if (!clk->res_reg || !clk->res_mask)
 140                return;
 141        spin_lock_irqsave(&syscon_resetreg_lock, iflags);
 142        val = readw(clk->res_reg);
 143        val &= ~clk->res_mask;
 144        writew(val, clk->res_reg);
 145        spin_unlock_irqrestore(&syscon_resetreg_lock, iflags);
 146        clk->reset = false;
 147}
 148
 149int __clk_get(struct clk *clk)
 150{
 151        u16 val;
 152
 153        /* The MMC and MSPRO clocks need some special set-up */
 154        if (!strcmp(clk->name, "MCLK")) {
 155                /* Set default MMC clock divisor to 18.9 MHz */
 156                writew(0x0054U, U300_SYSCON_VBASE + U300_SYSCON_MMF0R);
 157                val = readw(U300_SYSCON_VBASE + U300_SYSCON_MMCR);
 158                /* Disable the MMC feedback clock */
 159                val &= ~U300_SYSCON_MMCR_MMC_FB_CLK_SEL_ENABLE;
 160                /* Disable MSPRO frequency */
 161                val &= ~U300_SYSCON_MMCR_MSPRO_FREQSEL_ENABLE;
 162                writew(val, U300_SYSCON_VBASE + U300_SYSCON_MMCR);
 163        }
 164        if (!strcmp(clk->name, "MSPRO")) {
 165                val = readw(U300_SYSCON_VBASE + U300_SYSCON_MMCR);
 166                /* Disable the MMC feedback clock */
 167                val &= ~U300_SYSCON_MMCR_MMC_FB_CLK_SEL_ENABLE;
 168                /* Enable MSPRO frequency */
 169                val |= U300_SYSCON_MMCR_MSPRO_FREQSEL_ENABLE;
 170                writew(val, U300_SYSCON_VBASE + U300_SYSCON_MMCR);
 171        }
 172        return 1;
 173}
 174EXPORT_SYMBOL(__clk_get);
 175
 176void __clk_put(struct clk *clk)
 177{
 178}
 179EXPORT_SYMBOL(__clk_put);
 180
 181static void syscon_clk_disable(struct clk *clk)
 182{
 183        unsigned long iflags;
 184
 185        /* Don't touch the hardware controlled clocks */
 186        if (clk->hw_ctrld)
 187                return;
 188
 189        spin_lock_irqsave(&syscon_clkreg_lock, iflags);
 190        writew(clk->clk_val, U300_SYSCON_VBASE + U300_SYSCON_SBCDR);
 191        spin_unlock_irqrestore(&syscon_clkreg_lock, iflags);
 192}
 193
 194static void syscon_clk_enable(struct clk *clk)
 195{
 196        unsigned long iflags;
 197
 198        /* Don't touch the hardware controlled clocks */
 199        if (clk->hw_ctrld)
 200                return;
 201
 202        spin_lock_irqsave(&syscon_clkreg_lock, iflags);
 203        writew(clk->clk_val, U300_SYSCON_VBASE + U300_SYSCON_SBCER);
 204        spin_unlock_irqrestore(&syscon_clkreg_lock, iflags);
 205}
 206
 207static u16 syscon_clk_get_rate(void)
 208{
 209        u16 val;
 210        unsigned long iflags;
 211
 212        spin_lock_irqsave(&syscon_clkreg_lock, iflags);
 213        val = readw(U300_SYSCON_VBASE + U300_SYSCON_CCR);
 214        val &= U300_SYSCON_CCR_CLKING_PERFORMANCE_MASK;
 215        spin_unlock_irqrestore(&syscon_clkreg_lock, iflags);
 216        return val;
 217}
 218
 219#ifdef CONFIG_MACH_U300_USE_I2S_AS_MASTER
 220static void enable_i2s0_vcxo(void)
 221{
 222        u16 val;
 223        unsigned long iflags;
 224
 225        spin_lock_irqsave(&syscon_clkreg_lock, iflags);
 226        /* Set I2S0 to use the VCXO 26 MHz clock */
 227        val = readw(U300_SYSCON_VBASE + U300_SYSCON_CCR);
 228        val |= U300_SYSCON_CCR_TURN_VCXO_ON;
 229        writew(val, U300_SYSCON_VBASE + U300_SYSCON_CCR);
 230        val |= U300_SYSCON_CCR_I2S0_USE_VCXO;
 231        writew(val, U300_SYSCON_VBASE + U300_SYSCON_CCR);
 232        val = readw(U300_SYSCON_VBASE + U300_SYSCON_CEFR);
 233        val |= U300_SYSCON_CEFR_I2S0_CLK_EN;
 234        writew(val, U300_SYSCON_VBASE + U300_SYSCON_CEFR);
 235        spin_unlock_irqrestore(&syscon_clkreg_lock, iflags);
 236}
 237
 238static void enable_i2s1_vcxo(void)
 239{
 240        u16 val;
 241        unsigned long iflags;
 242
 243        spin_lock_irqsave(&syscon_clkreg_lock, iflags);
 244        /* Set I2S1 to use the VCXO 26 MHz clock */
 245        val = readw(U300_SYSCON_VBASE + U300_SYSCON_CCR);
 246        val |= U300_SYSCON_CCR_TURN_VCXO_ON;
 247        writew(val, U300_SYSCON_VBASE + U300_SYSCON_CCR);
 248        val |= U300_SYSCON_CCR_I2S1_USE_VCXO;
 249        writew(val, U300_SYSCON_VBASE + U300_SYSCON_CCR);
 250        val = readw(U300_SYSCON_VBASE + U300_SYSCON_CEFR);
 251        val |= U300_SYSCON_CEFR_I2S1_CLK_EN;
 252        writew(val, U300_SYSCON_VBASE + U300_SYSCON_CEFR);
 253        spin_unlock_irqrestore(&syscon_clkreg_lock, iflags);
 254}
 255
 256static void disable_i2s0_vcxo(void)
 257{
 258        u16 val;
 259        unsigned long iflags;
 260
 261        spin_lock_irqsave(&syscon_clkreg_lock, iflags);
 262        /* Disable I2S0 use of the VCXO 26 MHz clock */
 263        val = readw(U300_SYSCON_VBASE + U300_SYSCON_CCR);
 264        val &= ~U300_SYSCON_CCR_I2S0_USE_VCXO;
 265        writew(val, U300_SYSCON_VBASE + U300_SYSCON_CCR);
 266        /* Deactivate VCXO if noone else is using VCXO */
 267        if (!(val & U300_SYSCON_CCR_I2S1_USE_VCXO))
 268                val &= ~U300_SYSCON_CCR_TURN_VCXO_ON;
 269        writew(val, U300_SYSCON_VBASE + U300_SYSCON_CCR);
 270        val = readw(U300_SYSCON_VBASE + U300_SYSCON_CEFR);
 271        val &= ~U300_SYSCON_CEFR_I2S0_CLK_EN;
 272        writew(val, U300_SYSCON_VBASE + U300_SYSCON_CEFR);
 273        spin_unlock_irqrestore(&syscon_clkreg_lock, iflags);
 274}
 275
 276static void disable_i2s1_vcxo(void)
 277{
 278        u16 val;
 279        unsigned long iflags;
 280
 281        spin_lock_irqsave(&syscon_clkreg_lock, iflags);
 282        /* Disable I2S1 use of the VCXO 26 MHz clock */
 283        val = readw(U300_SYSCON_VBASE + U300_SYSCON_CCR);
 284        val &= ~U300_SYSCON_CCR_I2S1_USE_VCXO;
 285        writew(val, U300_SYSCON_VBASE + U300_SYSCON_CCR);
 286        /* Deactivate VCXO if noone else is using VCXO */
 287        if (!(val & U300_SYSCON_CCR_I2S0_USE_VCXO))
 288                val &= ~U300_SYSCON_CCR_TURN_VCXO_ON;
 289        writew(val, U300_SYSCON_VBASE + U300_SYSCON_CCR);
 290        val = readw(U300_SYSCON_VBASE + U300_SYSCON_CEFR);
 291        val &= ~U300_SYSCON_CEFR_I2S0_CLK_EN;
 292        writew(val, U300_SYSCON_VBASE + U300_SYSCON_CEFR);
 293        spin_unlock_irqrestore(&syscon_clkreg_lock, iflags);
 294}
 295#endif /* CONFIG_MACH_U300_USE_I2S_AS_MASTER */
 296
 297
 298static void syscon_clk_rate_set_mclk(unsigned long rate)
 299{
 300        u16 val;
 301        u32 reg;
 302        unsigned long iflags;
 303
 304        switch (rate) {
 305        case 18900000:
 306                val = 0x0054;
 307                break;
 308        case 20800000:
 309                val = 0x0044;
 310                break;
 311        case 23100000:
 312                val = 0x0043;
 313                break;
 314        case 26000000:
 315                val = 0x0033;
 316                break;
 317        case 29700000:
 318                val = 0x0032;
 319                break;
 320        case 34700000:
 321                val = 0x0022;
 322                break;
 323        case 41600000:
 324                val = 0x0021;
 325                break;
 326        case 52000000:
 327                val = 0x0011;
 328                break;
 329        case 104000000:
 330                val = 0x0000;
 331                break;
 332        default:
 333                printk(KERN_ERR "Trying to set MCLK to unknown speed! %ld\n",
 334                       rate);
 335                return;
 336        }
 337
 338        spin_lock_irqsave(&syscon_clkreg_lock, iflags);
 339        reg = readw(U300_SYSCON_VBASE + U300_SYSCON_MMF0R) &
 340                ~U300_SYSCON_MMF0R_MASK;
 341        writew(reg | val, U300_SYSCON_VBASE + U300_SYSCON_MMF0R);
 342        spin_unlock_irqrestore(&syscon_clkreg_lock, iflags);
 343}
 344
 345void syscon_clk_rate_set_cpuclk(unsigned long rate)
 346{
 347        u16 val;
 348        unsigned long iflags;
 349
 350        switch (rate) {
 351        case 13000000:
 352                val = U300_SYSCON_CCR_CLKING_PERFORMANCE_LOW_POWER;
 353                break;
 354        case 52000000:
 355                val = U300_SYSCON_CCR_CLKING_PERFORMANCE_INTERMEDIATE;
 356                break;
 357        case 104000000:
 358                val = U300_SYSCON_CCR_CLKING_PERFORMANCE_HIGH;
 359                break;
 360        case 208000000:
 361                val = U300_SYSCON_CCR_CLKING_PERFORMANCE_BEST;
 362                break;
 363        default:
 364                return;
 365        }
 366        spin_lock_irqsave(&syscon_clkreg_lock, iflags);
 367        val |= readw(U300_SYSCON_VBASE + U300_SYSCON_CCR) &
 368                ~U300_SYSCON_CCR_CLKING_PERFORMANCE_MASK ;
 369        writew(val, U300_SYSCON_VBASE + U300_SYSCON_CCR);
 370        spin_unlock_irqrestore(&syscon_clkreg_lock, iflags);
 371}
 372EXPORT_SYMBOL(syscon_clk_rate_set_cpuclk);
 373
 374void clk_disable(struct clk *clk)
 375{
 376        unsigned long iflags;
 377
 378        spin_lock_irqsave(&clk->lock, iflags);
 379        if (clk->usecount > 0 && !(--clk->usecount)) {
 380                /* some blocks lack clocking registers and cannot be disabled */
 381                if (clk->disable)
 382                        clk->disable(clk);
 383                if (likely((u32)clk->parent))
 384                        clk_disable(clk->parent);
 385        }
 386#ifdef CONFIG_MACH_U300_USE_I2S_AS_MASTER
 387        if (unlikely(!strcmp(clk->name, "I2S0")))
 388                disable_i2s0_vcxo();
 389        if (unlikely(!strcmp(clk->name, "I2S1")))
 390                disable_i2s1_vcxo();
 391#endif
 392        spin_unlock_irqrestore(&clk->lock, iflags);
 393}
 394EXPORT_SYMBOL(clk_disable);
 395
 396int clk_enable(struct clk *clk)
 397{
 398        int ret = 0;
 399        unsigned long iflags;
 400
 401        spin_lock_irqsave(&clk->lock, iflags);
 402        if (clk->usecount++ == 0) {
 403                if (likely((u32)clk->parent))
 404                        ret = clk_enable(clk->parent);
 405
 406                if (unlikely(ret != 0))
 407                        clk->usecount--;
 408                else {
 409                        /* remove reset line (we never enable reset again) */
 410                        syscon_block_reset_disable(clk);
 411                        /* clocks without enable function are always on */
 412                        if (clk->enable)
 413                                clk->enable(clk);
 414#ifdef CONFIG_MACH_U300_USE_I2S_AS_MASTER
 415                        if (unlikely(!strcmp(clk->name, "I2S0")))
 416                                enable_i2s0_vcxo();
 417                        if (unlikely(!strcmp(clk->name, "I2S1")))
 418                                enable_i2s1_vcxo();
 419#endif
 420                }
 421        }
 422        spin_unlock_irqrestore(&clk->lock, iflags);
 423        return ret;
 424
 425}
 426EXPORT_SYMBOL(clk_enable);
 427
 428/* Returns the clock rate in Hz */
 429static unsigned long clk_get_rate_cpuclk(struct clk *clk)
 430{
 431        u16 val;
 432
 433        val = syscon_clk_get_rate();
 434
 435        switch (val) {
 436        case U300_SYSCON_CCR_CLKING_PERFORMANCE_LOW_POWER:
 437        case U300_SYSCON_CCR_CLKING_PERFORMANCE_LOW:
 438                return 13000000;
 439        case U300_SYSCON_CCR_CLKING_PERFORMANCE_INTERMEDIATE:
 440                return 52000000;
 441        case U300_SYSCON_CCR_CLKING_PERFORMANCE_HIGH:
 442                return 104000000;
 443        case U300_SYSCON_CCR_CLKING_PERFORMANCE_BEST:
 444                return 208000000;
 445        default:
 446                break;
 447        }
 448        return clk->rate;
 449}
 450
 451static unsigned long clk_get_rate_ahb_clk(struct clk *clk)
 452{
 453        u16 val;
 454
 455        val = syscon_clk_get_rate();
 456
 457        switch (val) {
 458        case U300_SYSCON_CCR_CLKING_PERFORMANCE_LOW_POWER:
 459        case U300_SYSCON_CCR_CLKING_PERFORMANCE_LOW:
 460                return 6500000;
 461        case U300_SYSCON_CCR_CLKING_PERFORMANCE_INTERMEDIATE:
 462                return 26000000;
 463        case U300_SYSCON_CCR_CLKING_PERFORMANCE_HIGH:
 464        case U300_SYSCON_CCR_CLKING_PERFORMANCE_BEST:
 465                return 52000000;
 466        default:
 467                break;
 468        }
 469        return clk->rate;
 470
 471}
 472
 473static unsigned long clk_get_rate_emif_clk(struct clk *clk)
 474{
 475        u16 val;
 476
 477        val = syscon_clk_get_rate();
 478
 479        switch (val) {
 480        case U300_SYSCON_CCR_CLKING_PERFORMANCE_LOW_POWER:
 481        case U300_SYSCON_CCR_CLKING_PERFORMANCE_LOW:
 482                return 13000000;
 483        case U300_SYSCON_CCR_CLKING_PERFORMANCE_INTERMEDIATE:
 484                return 52000000;
 485        case U300_SYSCON_CCR_CLKING_PERFORMANCE_HIGH:
 486        case U300_SYSCON_CCR_CLKING_PERFORMANCE_BEST:
 487                return 104000000;
 488        default:
 489                break;
 490        }
 491        return clk->rate;
 492
 493}
 494
 495static unsigned long clk_get_rate_xgamclk(struct clk *clk)
 496{
 497        u16 val;
 498
 499        val = syscon_clk_get_rate();
 500
 501        switch (val) {
 502        case U300_SYSCON_CCR_CLKING_PERFORMANCE_LOW_POWER:
 503        case U300_SYSCON_CCR_CLKING_PERFORMANCE_LOW:
 504                return 6500000;
 505        case U300_SYSCON_CCR_CLKING_PERFORMANCE_INTERMEDIATE:
 506                return 26000000;
 507        case U300_SYSCON_CCR_CLKING_PERFORMANCE_HIGH:
 508        case U300_SYSCON_CCR_CLKING_PERFORMANCE_BEST:
 509                return 52000000;
 510        default:
 511                break;
 512        }
 513
 514        return clk->rate;
 515}
 516
 517static unsigned long clk_get_rate_mclk(struct clk *clk)
 518{
 519        u16 val;
 520
 521        val = syscon_clk_get_rate();
 522
 523        switch (val) {
 524        case U300_SYSCON_CCR_CLKING_PERFORMANCE_LOW_POWER:
 525                /*
 526                 * Here, the 208 MHz PLL gets shut down and the always
 527                 * on 13 MHz PLL used for RTC etc kicks into use
 528                 * instead.
 529                 */
 530                return 13000000;
 531        case U300_SYSCON_CCR_CLKING_PERFORMANCE_LOW:
 532        case U300_SYSCON_CCR_CLKING_PERFORMANCE_INTERMEDIATE:
 533        case U300_SYSCON_CCR_CLKING_PERFORMANCE_HIGH:
 534        case U300_SYSCON_CCR_CLKING_PERFORMANCE_BEST:
 535        {
 536                /*
 537                 * This clock is under program control. The register is
 538                 * divided in two nybbles, bit 7-4 gives cycles-1 to count
 539                 * high, bit 3-0 gives cycles-1 to count low. Distribute
 540                 * these with no more than 1 cycle difference between
 541                 * low and high and add low and high to get the actual
 542                 * divisor. The base PLL is 208 MHz. Writing 0x00 will
 543                 * divide by 1 and 1 so the highest frequency possible
 544                 * is 104 MHz.
 545                 *
 546                 * e.g. 0x54 =>
 547                 * f = 208 / ((5+1) + (4+1)) = 208 / 11 = 18.9 MHz
 548                 */
 549                u16 val = readw(U300_SYSCON_VBASE + U300_SYSCON_MMF0R) &
 550                        U300_SYSCON_MMF0R_MASK;
 551                switch (val) {
 552                case 0x0054:
 553                        return 18900000;
 554                case 0x0044:
 555                        return 20800000;
 556                case 0x0043:
 557                        return 23100000;
 558                case 0x0033:
 559                        return 26000000;
 560                case 0x0032:
 561                        return 29700000;
 562                case 0x0022:
 563                        return 34700000;
 564                case 0x0021:
 565                        return 41600000;
 566                case 0x0011:
 567                        return 52000000;
 568                case 0x0000:
 569                        return 104000000;
 570                default:
 571                        break;
 572                }
 573        }
 574        default:
 575                break;
 576        }
 577
 578        return clk->rate;
 579}
 580
 581static unsigned long clk_get_rate_i2s_i2c_spi(struct clk *clk)
 582{
 583        u16 val;
 584
 585        val = syscon_clk_get_rate();
 586
 587        switch (val) {
 588        case U300_SYSCON_CCR_CLKING_PERFORMANCE_LOW_POWER:
 589        case U300_SYSCON_CCR_CLKING_PERFORMANCE_LOW:
 590                return 13000000;
 591        case U300_SYSCON_CCR_CLKING_PERFORMANCE_INTERMEDIATE:
 592        case U300_SYSCON_CCR_CLKING_PERFORMANCE_HIGH:
 593        case U300_SYSCON_CCR_CLKING_PERFORMANCE_BEST:
 594                return 26000000;
 595        default:
 596                break;
 597        }
 598
 599        return clk->rate;
 600}
 601
 602unsigned long clk_get_rate(struct clk *clk)
 603{
 604        if (clk->get_rate)
 605                return clk->get_rate(clk);
 606        else
 607                return clk->rate;
 608}
 609EXPORT_SYMBOL(clk_get_rate);
 610
 611static unsigned long clk_round_rate_mclk(struct clk *clk, unsigned long rate)
 612{
 613        if (rate >= 18900000)
 614                return 18900000;
 615        if (rate >= 20800000)
 616                return 20800000;
 617        if (rate >= 23100000)
 618                return 23100000;
 619        if (rate >= 26000000)
 620                return 26000000;
 621        if (rate >= 29700000)
 622                return 29700000;
 623        if (rate >= 34700000)
 624                return 34700000;
 625        if (rate >= 41600000)
 626                return 41600000;
 627        if (rate >= 52000000)
 628                return 52000000;
 629        return -EINVAL;
 630}
 631
 632static unsigned long clk_round_rate_cpuclk(struct clk *clk, unsigned long rate)
 633{
 634        if (rate >= 13000000)
 635                return 13000000;
 636        if (rate >= 52000000)
 637                return 52000000;
 638        if (rate >= 104000000)
 639                return 104000000;
 640        if (rate >= 208000000)
 641                return 208000000;
 642        return -EINVAL;
 643}
 644
 645/*
 646 * This adjusts a requested rate to the closest exact rate
 647 * a certain clock can provide. For a fixed clock it's
 648 * mostly clk->rate.
 649 */
 650long clk_round_rate(struct clk *clk, unsigned long rate)
 651{
 652        /* TODO: get apropriate switches for EMIFCLK, AHBCLK and MCLK */
 653        /* Else default to fixed value */
 654
 655        if (clk->round_rate) {
 656                return (long) clk->round_rate(clk, rate);
 657        } else {
 658                printk(KERN_ERR "clock: Failed to round rate of %s\n",
 659                       clk->name);
 660        }
 661        return (long) clk->rate;
 662}
 663EXPORT_SYMBOL(clk_round_rate);
 664
 665static int clk_set_rate_mclk(struct clk *clk, unsigned long rate)
 666{
 667        syscon_clk_rate_set_mclk(clk_round_rate(clk, rate));
 668        return 0;
 669}
 670
 671static int clk_set_rate_cpuclk(struct clk *clk, unsigned long rate)
 672{
 673        syscon_clk_rate_set_cpuclk(clk_round_rate(clk, rate));
 674        return 0;
 675}
 676
 677int clk_set_rate(struct clk *clk, unsigned long rate)
 678{
 679        /* TODO: set for EMIFCLK and AHBCLK */
 680        /* Else assume the clock is fixed and fail */
 681        if (clk->set_rate) {
 682                return clk->set_rate(clk, rate);
 683        } else {
 684                printk(KERN_ERR "clock: Failed to set %s to %ld hz\n",
 685                       clk->name, rate);
 686                return -EINVAL;
 687        }
 688}
 689EXPORT_SYMBOL(clk_set_rate);
 690
 691/*
 692 * Clock definitions. The clock parents are set to respective
 693 * bridge and the clock framework makes sure that the clocks have
 694 * parents activated and are brought out of reset when in use.
 695 *
 696 * Clocks that have hw_ctrld = true are hw controlled, and the hw
 697 * can by itself turn these clocks on and off.
 698 * So in other words, we don't really have to care about them.
 699 */
 700
 701static struct clk amba_clk = {
 702        .name       = "AMBA",
 703        .rate       = 52000000, /* this varies! */
 704        .hw_ctrld   = true,
 705        .reset      = false,
 706        .lock       = __SPIN_LOCK_UNLOCKED(amba_clk.lock),
 707};
 708
 709/*
 710 * These blocks are connected directly to the AMBA bus
 711 * with no bridge.
 712 */
 713
 714static struct clk cpu_clk = {
 715        .name       = "CPU",
 716        .parent     = &amba_clk,
 717        .rate       = 208000000, /* this varies! */
 718        .hw_ctrld   = true,
 719        .reset      = true,
 720        .res_reg    = U300_SYSCON_VBASE + U300_SYSCON_RRR,
 721        .res_mask   = U300_SYSCON_RRR_CPU_RESET_EN,
 722        .set_rate   = clk_set_rate_cpuclk,
 723        .get_rate   = clk_get_rate_cpuclk,
 724        .round_rate = clk_round_rate_cpuclk,
 725        .lock       = __SPIN_LOCK_UNLOCKED(cpu_clk.lock),
 726};
 727
 728static struct clk nandif_clk = {
 729        .name       = "NANDIF",
 730        .parent     = &amba_clk,
 731        .hw_ctrld   = false,
 732        .reset      = true,
 733        .res_reg    = U300_SYSCON_VBASE + U300_SYSCON_RRR,
 734        .res_mask   = U300_SYSCON_RRR_NANDIF_RESET_EN,
 735        .clk_val    = U300_SYSCON_SBCER_NANDIF_CLK_EN,
 736        .enable     = syscon_clk_enable,
 737        .disable    = syscon_clk_disable,
 738        .lock       = __SPIN_LOCK_UNLOCKED(nandif_clk.lock),
 739};
 740
 741static struct clk semi_clk = {
 742        .name       = "SEMI",
 743        .parent     = &amba_clk,
 744        .rate       = 0, /* FIXME */
 745        /* It is not possible to reset SEMI */
 746        .hw_ctrld   = false,
 747        .reset      = false,
 748        .clk_val    = U300_SYSCON_SBCER_SEMI_CLK_EN,
 749        .enable     = syscon_clk_enable,
 750        .disable    = syscon_clk_disable,
 751        .lock       = __SPIN_LOCK_UNLOCKED(semi_clk.lock),
 752};
 753
 754#ifdef CONFIG_MACH_U300_BS335
 755static struct clk isp_clk = {
 756        .name       = "ISP",
 757        .parent     = &amba_clk,
 758        .rate       = 0, /* FIXME */
 759        .hw_ctrld   = false,
 760        .reset      = true,
 761        .res_reg    = U300_SYSCON_VBASE + U300_SYSCON_RRR,
 762        .res_mask   = U300_SYSCON_RRR_ISP_RESET_EN,
 763        .clk_val    = U300_SYSCON_SBCER_ISP_CLK_EN,
 764        .enable     = syscon_clk_enable,
 765        .disable    = syscon_clk_disable,
 766        .lock       = __SPIN_LOCK_UNLOCKED(isp_clk.lock),
 767};
 768
 769static struct clk cds_clk = {
 770        .name       = "CDS",
 771        .parent     = &amba_clk,
 772        .rate       = 0, /* FIXME */
 773        .hw_ctrld   = false,
 774        .reset      = true,
 775        .res_reg    = U300_SYSCON_VBASE + U300_SYSCON_RRR,
 776        .res_mask   = U300_SYSCON_RRR_CDS_RESET_EN,
 777        .clk_val    = U300_SYSCON_SBCER_CDS_CLK_EN,
 778        .enable     = syscon_clk_enable,
 779        .disable    = syscon_clk_disable,
 780        .lock       = __SPIN_LOCK_UNLOCKED(cds_clk.lock),
 781};
 782#endif
 783
 784static struct clk dma_clk = {
 785        .name       = "DMA",
 786        .parent     = &amba_clk,
 787        .rate       = 52000000, /* this varies! */
 788        .hw_ctrld   = true,
 789        .reset      = true,
 790        .res_reg    = U300_SYSCON_VBASE + U300_SYSCON_RRR,
 791        .res_mask   = U300_SYSCON_RRR_DMAC_RESET_EN,
 792        .clk_val    = U300_SYSCON_SBCER_DMAC_CLK_EN,
 793        .enable     = syscon_clk_enable,
 794        .disable    = syscon_clk_disable,
 795        .lock       = __SPIN_LOCK_UNLOCKED(dma_clk.lock),
 796};
 797
 798static struct clk aaif_clk = {
 799        .name       = "AAIF",
 800        .parent     = &amba_clk,
 801        .rate       = 52000000, /* this varies! */
 802        .hw_ctrld   = true,
 803        .reset      = true,
 804        .res_reg    = U300_SYSCON_VBASE + U300_SYSCON_RRR,
 805        .res_mask   = U300_SYSCON_RRR_AAIF_RESET_EN,
 806        .clk_val    = U300_SYSCON_SBCER_AAIF_CLK_EN,
 807        .enable     = syscon_clk_enable,
 808        .disable    = syscon_clk_disable,
 809        .lock       = __SPIN_LOCK_UNLOCKED(aaif_clk.lock),
 810};
 811
 812static struct clk apex_clk = {
 813        .name       = "APEX",
 814        .parent     = &amba_clk,
 815        .rate       = 0, /* FIXME */
 816        .hw_ctrld   = true,
 817        .reset      = true,
 818        .res_reg    = U300_SYSCON_VBASE + U300_SYSCON_RRR,
 819        .res_mask   = U300_SYSCON_RRR_APEX_RESET_EN,
 820        .clk_val    = U300_SYSCON_SBCER_APEX_CLK_EN,
 821        .enable     = syscon_clk_enable,
 822        .disable    = syscon_clk_disable,
 823        .lock       = __SPIN_LOCK_UNLOCKED(apex_clk.lock),
 824};
 825
 826static struct clk video_enc_clk = {
 827        .name       = "VIDEO_ENC",
 828        .parent     = &amba_clk,
 829        .rate       = 208000000, /* this varies! */
 830        .hw_ctrld   = false,
 831        .reset      = false,
 832        .res_reg    = U300_SYSCON_VBASE + U300_SYSCON_RRR,
 833        /* This has XGAM in the name but refers to the video encoder */
 834        .res_mask   = U300_SYSCON_RRR_XGAM_VC_SYNC_RESET_EN,
 835        .clk_val    = U300_SYSCON_SBCER_VIDEO_ENC_CLK_EN,
 836        .enable     = syscon_clk_enable,
 837        .disable    = syscon_clk_disable,
 838        .lock       = __SPIN_LOCK_UNLOCKED(video_enc_clk.lock),
 839};
 840
 841static struct clk xgam_clk = {
 842        .name       = "XGAMCLK",
 843        .parent     = &amba_clk,
 844        .rate       = 52000000, /* this varies! */
 845        .hw_ctrld   = false,
 846        .reset      = true,
 847        .res_reg    = U300_SYSCON_VBASE + U300_SYSCON_RRR,
 848        .res_mask   = U300_SYSCON_RRR_XGAM_RESET_EN,
 849        .clk_val    = U300_SYSCON_SBCER_XGAM_CLK_EN,
 850        .get_rate   = clk_get_rate_xgamclk,
 851        .enable     = syscon_clk_enable,
 852        .disable    = syscon_clk_disable,
 853        .lock       = __SPIN_LOCK_UNLOCKED(xgam_clk.lock),
 854};
 855
 856/* This clock is used to activate the video encoder */
 857static struct clk ahb_clk = {
 858        .name       = "AHB",
 859        .parent     = &amba_clk,
 860        .rate       = 52000000, /* this varies! */
 861        .hw_ctrld   = false, /* This one is set to false due to HW bug */
 862        .reset      = true,
 863        .res_reg    = U300_SYSCON_VBASE + U300_SYSCON_RRR,
 864        .res_mask   = U300_SYSCON_RRR_AHB_RESET_EN,
 865        .clk_val    = U300_SYSCON_SBCER_AHB_CLK_EN,
 866        .enable     = syscon_clk_enable,
 867        .disable    = syscon_clk_disable,
 868        .get_rate   = clk_get_rate_ahb_clk,
 869        .lock       = __SPIN_LOCK_UNLOCKED(ahb_clk.lock),
 870};
 871
 872
 873/*
 874 * Clocks on the AHB bridge
 875 */
 876
 877static struct clk ahb_subsys_clk = {
 878        .name       = "AHB_SUBSYS",
 879        .parent     = &amba_clk,
 880        .rate       = 52000000, /* this varies! */
 881        .hw_ctrld   = true,
 882        .reset      = false,
 883        .clk_val    = U300_SYSCON_SBCER_AHB_SUBSYS_BRIDGE_CLK_EN,
 884        .enable     = syscon_clk_enable,
 885        .disable    = syscon_clk_disable,
 886        .get_rate   = clk_get_rate_ahb_clk,
 887        .lock       = __SPIN_LOCK_UNLOCKED(ahb_subsys_clk.lock),
 888};
 889
 890static struct clk intcon_clk = {
 891        .name       = "INTCON",
 892        .parent     = &ahb_subsys_clk,
 893        .rate       = 52000000, /* this varies! */
 894        .hw_ctrld   = false,
 895        .reset      = true,
 896        .res_reg    = U300_SYSCON_VBASE + U300_SYSCON_RRR,
 897        .res_mask   = U300_SYSCON_RRR_INTCON_RESET_EN,
 898        /* INTCON can be reset but not clock-gated */
 899        .lock       = __SPIN_LOCK_UNLOCKED(intcon_clk.lock),
 900
 901};
 902
 903static struct clk mspro_clk = {
 904        .name       = "MSPRO",
 905        .parent     = &ahb_subsys_clk,
 906        .rate       = 0, /* FIXME */
 907        .hw_ctrld   = false,
 908        .reset      = true,
 909        .res_reg    = U300_SYSCON_VBASE + U300_SYSCON_RRR,
 910        .res_mask   = U300_SYSCON_RRR_MSPRO_RESET_EN,
 911        .clk_val    = U300_SYSCON_SBCER_MSPRO_CLK_EN,
 912        .enable     = syscon_clk_enable,
 913        .disable    = syscon_clk_disable,
 914        .lock       = __SPIN_LOCK_UNLOCKED(mspro_clk.lock),
 915};
 916
 917static struct clk emif_clk = {
 918        .name       = "EMIF",
 919        .parent     = &ahb_subsys_clk,
 920        .rate       = 104000000, /* this varies! */
 921        .hw_ctrld   = false,
 922        .reset      = true,
 923        .res_reg    = U300_SYSCON_VBASE + U300_SYSCON_RRR,
 924        .res_mask   = U300_SYSCON_RRR_EMIF_RESET_EN,
 925        .clk_val    = U300_SYSCON_SBCER_EMIF_CLK_EN,
 926        .enable     = syscon_clk_enable,
 927        .disable    = syscon_clk_disable,
 928        .get_rate   = clk_get_rate_emif_clk,
 929        .lock       = __SPIN_LOCK_UNLOCKED(emif_clk.lock),
 930};
 931
 932
 933/*
 934 * Clocks on the FAST bridge
 935 */
 936static struct clk fast_clk = {
 937        .name       = "FAST_BRIDGE",
 938        .parent     = &amba_clk,
 939        .rate       = 13000000, /* this varies! */
 940        .hw_ctrld   = true,
 941        .reset      = true,
 942        .res_reg    = U300_SYSCON_VBASE + U300_SYSCON_RFR,
 943        .res_mask   = U300_SYSCON_RFR_FAST_BRIDGE_RESET_ENABLE,
 944        .clk_val    = U300_SYSCON_SBCER_FAST_BRIDGE_CLK_EN,
 945        .enable     = syscon_clk_enable,
 946        .disable    = syscon_clk_disable,
 947        .lock       = __SPIN_LOCK_UNLOCKED(fast_clk.lock),
 948};
 949
 950static struct clk mmcsd_clk = {
 951        .name       = "MCLK",
 952        .parent     = &fast_clk,
 953        .rate       = 18900000, /* this varies! */
 954        .hw_ctrld   = false,
 955        .reset      = true,
 956        .res_reg    = U300_SYSCON_VBASE + U300_SYSCON_RFR,
 957        .res_mask   = U300_SYSCON_RFR_MMC_RESET_ENABLE,
 958        .clk_val    = U300_SYSCON_SBCER_MMC_CLK_EN,
 959        .get_rate   = clk_get_rate_mclk,
 960        .set_rate   = clk_set_rate_mclk,
 961        .round_rate = clk_round_rate_mclk,
 962        .disable    = syscon_clk_disable,
 963        .enable     = syscon_clk_enable,
 964        .lock       = __SPIN_LOCK_UNLOCKED(mmcsd_clk.lock),
 965};
 966
 967static struct clk i2s0_clk = {
 968        .name       = "i2s0",
 969        .parent     = &fast_clk,
 970        .rate       = 26000000, /* this varies! */
 971        .hw_ctrld   = true,
 972        .reset      = true,
 973        .res_reg    = U300_SYSCON_VBASE + U300_SYSCON_RFR,
 974        .res_mask   = U300_SYSCON_RFR_PCM_I2S0_RESET_ENABLE,
 975        .clk_val    = U300_SYSCON_SBCER_I2S0_CORE_CLK_EN,
 976        .enable     = syscon_clk_enable,
 977        .disable    = syscon_clk_disable,
 978        .get_rate   = clk_get_rate_i2s_i2c_spi,
 979        .lock       = __SPIN_LOCK_UNLOCKED(i2s0_clk.lock),
 980};
 981
 982static struct clk i2s1_clk = {
 983        .name       = "i2s1",
 984        .parent     = &fast_clk,
 985        .rate       = 26000000, /* this varies! */
 986        .hw_ctrld   = true,
 987        .reset      = true,
 988        .res_reg    = U300_SYSCON_VBASE + U300_SYSCON_RFR,
 989        .res_mask   = U300_SYSCON_RFR_PCM_I2S1_RESET_ENABLE,
 990        .clk_val    = U300_SYSCON_SBCER_I2S1_CORE_CLK_EN,
 991        .enable     = syscon_clk_enable,
 992        .disable    = syscon_clk_disable,
 993        .get_rate   = clk_get_rate_i2s_i2c_spi,
 994        .lock       = __SPIN_LOCK_UNLOCKED(i2s1_clk.lock),
 995};
 996
 997static struct clk i2c0_clk = {
 998        .name       = "I2C0",
 999        .parent     = &fast_clk,
1000        .rate       = 26000000, /* this varies! */
1001        .hw_ctrld   = false,
1002        .reset      = true,
1003        .res_reg    = U300_SYSCON_VBASE + U300_SYSCON_RFR,
1004        .res_mask   = U300_SYSCON_RFR_I2C0_RESET_ENABLE,
1005        .clk_val    = U300_SYSCON_SBCER_I2C0_CLK_EN,
1006        .enable     = syscon_clk_enable,
1007        .disable    = syscon_clk_disable,
1008        .get_rate   = clk_get_rate_i2s_i2c_spi,
1009        .lock       = __SPIN_LOCK_UNLOCKED(i2c0_clk.lock),
1010};
1011
1012static struct clk i2c1_clk = {
1013        .name       = "I2C1",
1014        .parent     = &fast_clk,
1015        .rate       = 26000000, /* this varies! */
1016        .hw_ctrld   = false,
1017        .reset      = true,
1018        .res_reg    = U300_SYSCON_VBASE + U300_SYSCON_RFR,
1019        .res_mask   = U300_SYSCON_RFR_I2C1_RESET_ENABLE,
1020        .clk_val    = U300_SYSCON_SBCER_I2C1_CLK_EN,
1021        .enable     = syscon_clk_enable,
1022        .disable    = syscon_clk_disable,
1023        .get_rate   = clk_get_rate_i2s_i2c_spi,
1024        .lock       = __SPIN_LOCK_UNLOCKED(i2c1_clk.lock),
1025};
1026
1027static struct clk spi_clk = {
1028        .name       = "SPI",
1029        .parent     = &fast_clk,
1030        .rate       = 26000000, /* this varies! */
1031        .hw_ctrld   = false,
1032        .reset      = true,
1033        .res_reg    = U300_SYSCON_VBASE + U300_SYSCON_RFR,
1034        .res_mask   = U300_SYSCON_RFR_SPI_RESET_ENABLE,
1035        .clk_val    = U300_SYSCON_SBCER_SPI_CLK_EN,
1036        .enable     = syscon_clk_enable,
1037        .disable    = syscon_clk_disable,
1038        .get_rate   = clk_get_rate_i2s_i2c_spi,
1039        .lock       = __SPIN_LOCK_UNLOCKED(spi_clk.lock),
1040};
1041
1042#ifdef CONFIG_MACH_U300_BS335
1043static struct clk uart1_clk = {
1044        .name       = "UART1",
1045        .parent     = &fast_clk,
1046        .rate       = 13000000,
1047        .hw_ctrld   = false,
1048        .reset      = true,
1049        .res_reg    = U300_SYSCON_VBASE + U300_SYSCON_RFR,
1050        .res_mask   = U300_SYSCON_RFR_UART1_RESET_ENABLE,
1051        .clk_val    = U300_SYSCON_SBCER_UART1_CLK_EN,
1052        .enable     = syscon_clk_enable,
1053        .disable    = syscon_clk_disable,
1054        .lock       = __SPIN_LOCK_UNLOCKED(uart1_clk.lock),
1055};
1056#endif
1057
1058
1059/*
1060 * Clocks on the SLOW bridge
1061 */
1062static struct clk slow_clk = {
1063        .name       = "SLOW_BRIDGE",
1064        .parent     = &amba_clk,
1065        .rate       = 13000000,
1066        .hw_ctrld   = true,
1067        .reset      = true,
1068        .res_reg    = U300_SYSCON_VBASE + U300_SYSCON_RSR,
1069        .res_mask   = U300_SYSCON_RSR_SLOW_BRIDGE_RESET_EN,
1070        .clk_val    = U300_SYSCON_SBCER_SLOW_BRIDGE_CLK_EN,
1071        .enable     = syscon_clk_enable,
1072        .disable    = syscon_clk_disable,
1073        .lock       = __SPIN_LOCK_UNLOCKED(slow_clk.lock),
1074};
1075
1076/* TODO: implement SYSCON clock? */
1077
1078static struct clk wdog_clk = {
1079        .name       = "WDOG",
1080        .parent     = &slow_clk,
1081        .hw_ctrld   = false,
1082        .rate       = 32768,
1083        .reset      = false,
1084        /* This is always on, cannot be enabled/disabled or reset */
1085        .lock       = __SPIN_LOCK_UNLOCKED(wdog_clk.lock),
1086};
1087
1088/* This one is hardwired to PLL13 */
1089static struct clk uart_clk = {
1090        .name       = "UARTCLK",
1091        .parent     = &slow_clk,
1092        .rate       = 13000000,
1093        .hw_ctrld   = false,
1094        .reset      = true,
1095        .res_reg    = U300_SYSCON_VBASE + U300_SYSCON_RSR,
1096        .res_mask   = U300_SYSCON_RSR_UART_RESET_EN,
1097        .clk_val    = U300_SYSCON_SBCER_UART_CLK_EN,
1098        .enable     = syscon_clk_enable,
1099        .disable    = syscon_clk_disable,
1100        .lock       = __SPIN_LOCK_UNLOCKED(uart_clk.lock),
1101};
1102
1103static struct clk keypad_clk = {
1104        .name       = "KEYPAD",
1105        .parent     = &slow_clk,
1106        .rate       = 32768,
1107        .hw_ctrld   = false,
1108        .reset      = true,
1109        .res_reg    = U300_SYSCON_VBASE + U300_SYSCON_RSR,
1110        .res_mask   = U300_SYSCON_RSR_KEYPAD_RESET_EN,
1111        .clk_val    = U300_SYSCON_SBCER_KEYPAD_CLK_EN,
1112        .enable     = syscon_clk_enable,
1113        .disable    = syscon_clk_disable,
1114        .lock       = __SPIN_LOCK_UNLOCKED(keypad_clk.lock),
1115};
1116
1117static struct clk gpio_clk = {
1118        .name       = "GPIO",
1119        .parent     = &slow_clk,
1120        .rate       = 13000000,
1121        .hw_ctrld   = true,
1122        .reset      = true,
1123        .res_reg    = U300_SYSCON_VBASE + U300_SYSCON_RSR,
1124        .res_mask   = U300_SYSCON_RSR_GPIO_RESET_EN,
1125        .clk_val    = U300_SYSCON_SBCER_GPIO_CLK_EN,
1126        .enable     = syscon_clk_enable,
1127        .disable    = syscon_clk_disable,
1128        .lock       = __SPIN_LOCK_UNLOCKED(gpio_clk.lock),
1129};
1130
1131static struct clk rtc_clk = {
1132        .name       = "RTC",
1133        .parent     = &slow_clk,
1134        .rate       = 32768,
1135        .hw_ctrld   = true,
1136        .reset      = true,
1137        .res_reg    = U300_SYSCON_VBASE + U300_SYSCON_RSR,
1138        .res_mask   = U300_SYSCON_RSR_RTC_RESET_EN,
1139        /* This clock is always on, cannot be enabled/disabled */
1140        .lock       = __SPIN_LOCK_UNLOCKED(rtc_clk.lock),
1141};
1142
1143static struct clk bustr_clk = {
1144        .name       = "BUSTR",
1145        .parent     = &slow_clk,
1146        .rate       = 13000000,
1147        .hw_ctrld   = true,
1148        .reset      = true,
1149        .res_reg    = U300_SYSCON_VBASE + U300_SYSCON_RSR,
1150        .res_mask   = U300_SYSCON_RSR_BTR_RESET_EN,
1151        .clk_val    = U300_SYSCON_SBCER_BTR_CLK_EN,
1152        .enable     = syscon_clk_enable,
1153        .disable    = syscon_clk_disable,
1154        .lock       = __SPIN_LOCK_UNLOCKED(bustr_clk.lock),
1155};
1156
1157static struct clk evhist_clk = {
1158        .name       = "EVHIST",
1159        .parent     = &slow_clk,
1160        .rate       = 13000000,
1161        .hw_ctrld   = true,
1162        .reset      = true,
1163        .res_reg    = U300_SYSCON_VBASE + U300_SYSCON_RSR,
1164        .res_mask   = U300_SYSCON_RSR_EH_RESET_EN,
1165        .clk_val    = U300_SYSCON_SBCER_EH_CLK_EN,
1166        .enable     = syscon_clk_enable,
1167        .disable    = syscon_clk_disable,
1168        .lock       = __SPIN_LOCK_UNLOCKED(evhist_clk.lock),
1169};
1170
1171static struct clk timer_clk = {
1172        .name       = "TIMER",
1173        .parent     = &slow_clk,
1174        .rate       = 13000000,
1175        .hw_ctrld   = true,
1176        .reset      = true,
1177        .res_reg    = U300_SYSCON_VBASE + U300_SYSCON_RSR,
1178        .res_mask   = U300_SYSCON_RSR_ACC_TMR_RESET_EN,
1179        .clk_val    = U300_SYSCON_SBCER_ACC_TMR_CLK_EN,
1180        .enable     = syscon_clk_enable,
1181        .disable    = syscon_clk_disable,
1182        .lock       = __SPIN_LOCK_UNLOCKED(timer_clk.lock),
1183};
1184
1185static struct clk app_timer_clk = {
1186        .name       = "TIMER_APP",
1187        .parent     = &slow_clk,
1188        .rate       = 13000000,
1189        .hw_ctrld   = true,
1190        .reset      = true,
1191        .res_reg    = U300_SYSCON_VBASE + U300_SYSCON_RSR,
1192        .res_mask   = U300_SYSCON_RSR_APP_TMR_RESET_EN,
1193        .clk_val    = U300_SYSCON_SBCER_APP_TMR_CLK_EN,
1194        .enable     = syscon_clk_enable,
1195        .disable    = syscon_clk_disable,
1196        .lock       = __SPIN_LOCK_UNLOCKED(app_timer_clk.lock),
1197};
1198
1199#ifdef CONFIG_MACH_U300_BS335
1200static struct clk ppm_clk = {
1201        .name       = "PPM",
1202        .parent     = &slow_clk,
1203        .rate       = 0, /* FIXME */
1204        .hw_ctrld   = true, /* TODO: Look up if it is hw ctrld or not */
1205        .reset      = true,
1206        .res_reg    = U300_SYSCON_VBASE + U300_SYSCON_RSR,
1207        .res_mask   = U300_SYSCON_RSR_PPM_RESET_EN,
1208        .clk_val    = U300_SYSCON_SBCER_PPM_CLK_EN,
1209        .enable     = syscon_clk_enable,
1210        .disable    = syscon_clk_disable,
1211        .lock       = __SPIN_LOCK_UNLOCKED(ppm_clk.lock),
1212};
1213#endif
1214
1215#define DEF_LOOKUP(devid, clkref)               \
1216        {                                       \
1217        .dev_id = devid,                        \
1218        .clk = clkref,                          \
1219        }
1220
1221/*
1222 * Here we only define clocks that are meaningful to
1223 * look up through clockdevice.
1224 */
1225static struct clk_lookup lookups[] = {
1226        /* Connected directly to the AMBA bus */
1227        DEF_LOOKUP("amba",      &amba_clk),
1228        DEF_LOOKUP("cpu",       &cpu_clk),
1229        DEF_LOOKUP("fsmc",      &nandif_clk),
1230        DEF_LOOKUP("semi",      &semi_clk),
1231#ifdef CONFIG_MACH_U300_BS335
1232        DEF_LOOKUP("isp",       &isp_clk),
1233        DEF_LOOKUP("cds",       &cds_clk),
1234#endif
1235        DEF_LOOKUP("dma",       &dma_clk),
1236        DEF_LOOKUP("msl",       &aaif_clk),
1237        DEF_LOOKUP("apex",      &apex_clk),
1238        DEF_LOOKUP("video_enc", &video_enc_clk),
1239        DEF_LOOKUP("xgam",      &xgam_clk),
1240        DEF_LOOKUP("ahb",       &ahb_clk),
1241        /* AHB bridge clocks */
1242        DEF_LOOKUP("ahb_subsys", &ahb_subsys_clk),
1243        DEF_LOOKUP("intcon",    &intcon_clk),
1244        DEF_LOOKUP("mspro",     &mspro_clk),
1245        DEF_LOOKUP("pl172",     &emif_clk),
1246        /* FAST bridge clocks */
1247        DEF_LOOKUP("fast",      &fast_clk),
1248        DEF_LOOKUP("mmci",      &mmcsd_clk),
1249        /*
1250         * The .0 and .1 identifiers on these comes from the platform device
1251         * .id field and are assigned when the platform devices are registered.
1252         */
1253        DEF_LOOKUP("i2s.0",     &i2s0_clk),
1254        DEF_LOOKUP("i2s.1",     &i2s1_clk),
1255        DEF_LOOKUP("stu300.0",  &i2c0_clk),
1256        DEF_LOOKUP("stu300.1",  &i2c1_clk),
1257        DEF_LOOKUP("pl022",     &spi_clk),
1258#ifdef CONFIG_MACH_U300_BS335
1259        DEF_LOOKUP("uart1",     &uart1_clk),
1260#endif
1261        /* SLOW bridge clocks */
1262        DEF_LOOKUP("slow",      &slow_clk),
1263        DEF_LOOKUP("coh901327_wdog",      &wdog_clk),
1264        DEF_LOOKUP("uart0",     &uart_clk),
1265        DEF_LOOKUP("apptimer",  &app_timer_clk),
1266        DEF_LOOKUP("coh901461-keypad",    &keypad_clk),
1267        DEF_LOOKUP("u300-gpio", &gpio_clk),
1268        DEF_LOOKUP("rtc-coh901331",      &rtc_clk),
1269        DEF_LOOKUP("bustr",     &bustr_clk),
1270        DEF_LOOKUP("evhist",    &evhist_clk),
1271        DEF_LOOKUP("timer",     &timer_clk),
1272#ifdef CONFIG_MACH_U300_BS335
1273        DEF_LOOKUP("ppm",       &ppm_clk),
1274#endif
1275};
1276
1277static void __init clk_register(void)
1278{
1279        int i;
1280
1281        /* Register the lookups */
1282        for (i = 0; i < ARRAY_SIZE(lookups); i++)
1283                clkdev_add(&lookups[i]);
1284}
1285
1286/*
1287 * These are the clocks for cells registered as primecell drivers
1288 * on the AMBA bus. These must be on during AMBA device registration
1289 * since the bus probe will attempt to read magic configuration
1290 * registers for these devices. If they are deactivated these probes
1291 * will fail.
1292 *
1293 *
1294 * Please note that on emif, both RAM and NAND is connected in dual
1295 * RAM phones. On single RAM phones, ram is on semi and NAND on emif.
1296 *
1297 */
1298void u300_clock_primecells(void)
1299{
1300        clk_enable(&intcon_clk);
1301        clk_enable(&uart_clk);
1302#ifdef CONFIG_MACH_U300_BS335
1303        clk_enable(&uart1_clk);
1304#endif
1305        clk_enable(&spi_clk);
1306
1307        clk_enable(&mmcsd_clk);
1308
1309}
1310EXPORT_SYMBOL(u300_clock_primecells);
1311
1312void u300_unclock_primecells(void)
1313{
1314
1315        clk_disable(&intcon_clk);
1316        clk_disable(&uart_clk);
1317#ifdef CONFIG_MACH_U300_BS335
1318        clk_disable(&uart1_clk);
1319#endif
1320        clk_disable(&spi_clk);
1321        clk_disable(&mmcsd_clk);
1322
1323}
1324EXPORT_SYMBOL(u300_unclock_primecells);
1325
1326/*
1327 * The interrupt controller is enabled before the clock API is registered.
1328 */
1329void u300_enable_intcon_clock(void)
1330{
1331        clk_enable(&intcon_clk);
1332}
1333EXPORT_SYMBOL(u300_enable_intcon_clock);
1334
1335/*
1336 * The timer is enabled before the clock API is registered.
1337 */
1338void u300_enable_timer_clock(void)
1339{
1340        clk_enable(&app_timer_clk);
1341}
1342EXPORT_SYMBOL(u300_enable_timer_clock);
1343
1344#if (defined(CONFIG_DEBUG_FS) && defined(CONFIG_U300_DEBUG))
1345/*
1346 * The following makes it possible to view the status (especially
1347 * reference count and reset status) for the clocks in the platform
1348 * by looking into the special file <debugfs>/u300_clocks
1349 */
1350
1351/* A list of all clocks in the platform */
1352static struct clk *clks[] = {
1353        /* Top node clock for the AMBA bus */
1354        &amba_clk,
1355        /* Connected directly to the AMBA bus */
1356        &cpu_clk,
1357        &nandif_clk,
1358        &semi_clk,
1359#ifdef CONFIG_MACH_U300_BS335
1360        &isp_clk,
1361        &cds_clk,
1362#endif
1363        &dma_clk,
1364        &aaif_clk,
1365        &apex_clk,
1366        &video_enc_clk,
1367        &xgam_clk,
1368        &ahb_clk,
1369
1370        /* AHB bridge clocks */
1371        &ahb_subsys_clk,
1372        &intcon_clk,
1373        &mspro_clk,
1374        &emif_clk,
1375        /* FAST bridge clocks */
1376        &fast_clk,
1377        &mmcsd_clk,
1378        &i2s0_clk,
1379        &i2s1_clk,
1380        &i2c0_clk,
1381        &i2c1_clk,
1382        &spi_clk,
1383#ifdef CONFIG_MACH_U300_BS335
1384        &uart1_clk,
1385#endif
1386        /* SLOW bridge clocks */
1387        &slow_clk,
1388        &wdog_clk,
1389        &uart_clk,
1390        &app_timer_clk,
1391        &keypad_clk,
1392        &gpio_clk,
1393        &rtc_clk,
1394        &bustr_clk,
1395        &evhist_clk,
1396        &timer_clk,
1397#ifdef CONFIG_MACH_U300_BS335
1398        &ppm_clk,
1399#endif
1400};
1401
1402static int u300_clocks_show(struct seq_file *s, void *data)
1403{
1404        struct clk *clk;
1405        int i;
1406
1407        seq_printf(s, "CLOCK           DEVICE          RESET STATE\t" \
1408                   "ACTIVE\tUSERS\tHW CTRL FREQ\n");
1409        seq_printf(s, "---------------------------------------------" \
1410                   "-----------------------------------------\n");
1411        for (i = 0; i < ARRAY_SIZE(clks); i++) {
1412                clk = clks[i];
1413                if (clk != ERR_PTR(-ENOENT)) {
1414                        /* Format clock and device name nicely */
1415                        char cdp[33];
1416                        int chars;
1417
1418                        chars = snprintf(&cdp[0], 17, "%s", clk->name);
1419                        while (chars < 16) {
1420                                cdp[chars] = ' ';
1421                                chars++;
1422                        }
1423                        chars = snprintf(&cdp[16], 17, "%s", clk->dev ?
1424                                         dev_name(clk->dev) : "N/A");
1425                        while (chars < 16) {
1426                                cdp[chars+16] = ' ';
1427                                chars++;
1428                        }
1429                        cdp[32] = '\0';
1430                        if (clk->get_rate)
1431                                seq_printf(s,
1432                                           "%s%s\t%s\t%d\t%s\t%lu Hz\n",
1433                                           &cdp[0],
1434                                           clk->reset ?
1435                                           "ASSERTED" : "RELEASED",
1436                                           clk->usecount ? "ON" : "OFF",
1437                                           clk->usecount,
1438                                           clk->hw_ctrld  ? "YES" : "NO ",
1439                                           clk->get_rate(clk));
1440                        else
1441                                seq_printf(s,
1442                                           "%s%s\t%s\t%d\t%s\t" \
1443                                           "(unknown rate)\n",
1444                                           &cdp[0],
1445                                           clk->reset ?
1446                                           "ASSERTED" : "RELEASED",
1447                                           clk->usecount ? "ON" : "OFF",
1448                                           clk->usecount,
1449                                           clk->hw_ctrld  ? "YES" : "NO ");
1450                }
1451        }
1452        return 0;
1453}
1454
1455static int u300_clocks_open(struct inode *inode, struct file *file)
1456{
1457        return single_open(file, u300_clocks_show, NULL);
1458}
1459
1460static const struct file_operations u300_clocks_operations = {
1461        .open           = u300_clocks_open,
1462        .read           = seq_read,
1463        .llseek         = seq_lseek,
1464        .release        = single_release,
1465};
1466
1467static int __init init_clk_read_debugfs(void)
1468{
1469        /* Expose a simple debugfs interface to view all clocks */
1470        (void) debugfs_create_file("u300_clocks", S_IFREG | S_IRUGO,
1471                                   NULL, NULL,
1472                                   &u300_clocks_operations);
1473        return 0;
1474}
1475/*
1476 * This needs to come in after the core_initcall() for the
1477 * overall clocks, because debugfs is not available until
1478 * the subsystems come up.
1479 */
1480module_init(init_clk_read_debugfs);
1481#endif
1482
1483static int __init u300_clock_init(void)
1484{
1485        u16 val;
1486
1487        /*
1488         * FIXME: shall all this powermanagement stuff really live here???
1489         */
1490
1491        /* Set system to run at PLL208, max performance, a known state. */
1492        val = readw(U300_SYSCON_VBASE + U300_SYSCON_CCR);
1493        val &= ~U300_SYSCON_CCR_CLKING_PERFORMANCE_MASK;
1494        writew(val, U300_SYSCON_VBASE + U300_SYSCON_CCR);
1495        /* Wait for the PLL208 to lock if not locked in yet */
1496        while (!(readw(U300_SYSCON_VBASE + U300_SYSCON_CSR) &
1497                 U300_SYSCON_CSR_PLL208_LOCK_IND));
1498
1499        /* Power management enable */
1500        val = readw(U300_SYSCON_VBASE + U300_SYSCON_PMCR);
1501        val |= U300_SYSCON_PMCR_PWR_MGNT_ENABLE;
1502        writew(val, U300_SYSCON_VBASE + U300_SYSCON_PMCR);
1503
1504        clk_register();
1505
1506        /*
1507         * Some of these may be on when we boot the system so make sure they
1508         * are turned OFF.
1509         */
1510        syscon_block_reset_enable(&timer_clk);
1511        timer_clk.disable(&timer_clk);
1512
1513        /*
1514         * These shall be turned on by default when we boot the system
1515         * so make sure they are ON. (Adding CPU here is a bit too much.)
1516         * These clocks will be claimed by drivers later.
1517         */
1518        syscon_block_reset_disable(&semi_clk);
1519        syscon_block_reset_disable(&emif_clk);
1520        semi_clk.enable(&semi_clk);
1521        emif_clk.enable(&emif_clk);
1522
1523        return 0;
1524}
1525/* initialize clocking early to be available later in the boot */
1526core_initcall(u300_clock_init);
1527