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#include <linux/clkdev.h>
  29
  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 *  +- FSMC 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 no one 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 no one 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 appropriate 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       = "FSMC",
 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
 950/*
 951 * The MMCI apb_pclk is hardwired to the same terminal as the
 952 * external MCI clock. Thus this will be referenced twice.
 953 */
 954static struct clk mmcsd_clk = {
 955        .name       = "MCLK",
 956        .parent     = &fast_clk,
 957        .rate       = 18900000, /* this varies! */
 958        .hw_ctrld   = false,
 959        .reset      = true,
 960        .res_reg    = U300_SYSCON_VBASE + U300_SYSCON_RFR,
 961        .res_mask   = U300_SYSCON_RFR_MMC_RESET_ENABLE,
 962        .clk_val    = U300_SYSCON_SBCER_MMC_CLK_EN,
 963        .get_rate   = clk_get_rate_mclk,
 964        .set_rate   = clk_set_rate_mclk,
 965        .round_rate = clk_round_rate_mclk,
 966        .disable    = syscon_clk_disable,
 967        .enable     = syscon_clk_enable,
 968        .lock       = __SPIN_LOCK_UNLOCKED(mmcsd_clk.lock),
 969};
 970
 971static struct clk i2s0_clk = {
 972        .name       = "i2s0",
 973        .parent     = &fast_clk,
 974        .rate       = 26000000, /* this varies! */
 975        .hw_ctrld   = true,
 976        .reset      = true,
 977        .res_reg    = U300_SYSCON_VBASE + U300_SYSCON_RFR,
 978        .res_mask   = U300_SYSCON_RFR_PCM_I2S0_RESET_ENABLE,
 979        .clk_val    = U300_SYSCON_SBCER_I2S0_CORE_CLK_EN,
 980        .enable     = syscon_clk_enable,
 981        .disable    = syscon_clk_disable,
 982        .get_rate   = clk_get_rate_i2s_i2c_spi,
 983        .lock       = __SPIN_LOCK_UNLOCKED(i2s0_clk.lock),
 984};
 985
 986static struct clk i2s1_clk = {
 987        .name       = "i2s1",
 988        .parent     = &fast_clk,
 989        .rate       = 26000000, /* this varies! */
 990        .hw_ctrld   = true,
 991        .reset      = true,
 992        .res_reg    = U300_SYSCON_VBASE + U300_SYSCON_RFR,
 993        .res_mask   = U300_SYSCON_RFR_PCM_I2S1_RESET_ENABLE,
 994        .clk_val    = U300_SYSCON_SBCER_I2S1_CORE_CLK_EN,
 995        .enable     = syscon_clk_enable,
 996        .disable    = syscon_clk_disable,
 997        .get_rate   = clk_get_rate_i2s_i2c_spi,
 998        .lock       = __SPIN_LOCK_UNLOCKED(i2s1_clk.lock),
 999};
1000
1001static struct clk i2c0_clk = {
1002        .name       = "I2C0",
1003        .parent     = &fast_clk,
1004        .rate       = 26000000, /* this varies! */
1005        .hw_ctrld   = false,
1006        .reset      = true,
1007        .res_reg    = U300_SYSCON_VBASE + U300_SYSCON_RFR,
1008        .res_mask   = U300_SYSCON_RFR_I2C0_RESET_ENABLE,
1009        .clk_val    = U300_SYSCON_SBCER_I2C0_CLK_EN,
1010        .enable     = syscon_clk_enable,
1011        .disable    = syscon_clk_disable,
1012        .get_rate   = clk_get_rate_i2s_i2c_spi,
1013        .lock       = __SPIN_LOCK_UNLOCKED(i2c0_clk.lock),
1014};
1015
1016static struct clk i2c1_clk = {
1017        .name       = "I2C1",
1018        .parent     = &fast_clk,
1019        .rate       = 26000000, /* this varies! */
1020        .hw_ctrld   = false,
1021        .reset      = true,
1022        .res_reg    = U300_SYSCON_VBASE + U300_SYSCON_RFR,
1023        .res_mask   = U300_SYSCON_RFR_I2C1_RESET_ENABLE,
1024        .clk_val    = U300_SYSCON_SBCER_I2C1_CLK_EN,
1025        .enable     = syscon_clk_enable,
1026        .disable    = syscon_clk_disable,
1027        .get_rate   = clk_get_rate_i2s_i2c_spi,
1028        .lock       = __SPIN_LOCK_UNLOCKED(i2c1_clk.lock),
1029};
1030
1031/*
1032 * The SPI apb_pclk is hardwired to the same terminal as the
1033 * external SPI clock. Thus this will be referenced twice.
1034 */
1035static struct clk spi_clk = {
1036        .name       = "SPI",
1037        .parent     = &fast_clk,
1038        .rate       = 26000000, /* this varies! */
1039        .hw_ctrld   = false,
1040        .reset      = true,
1041        .res_reg    = U300_SYSCON_VBASE + U300_SYSCON_RFR,
1042        .res_mask   = U300_SYSCON_RFR_SPI_RESET_ENABLE,
1043        .clk_val    = U300_SYSCON_SBCER_SPI_CLK_EN,
1044        .enable     = syscon_clk_enable,
1045        .disable    = syscon_clk_disable,
1046        .get_rate   = clk_get_rate_i2s_i2c_spi,
1047        .lock       = __SPIN_LOCK_UNLOCKED(spi_clk.lock),
1048};
1049
1050#ifdef CONFIG_MACH_U300_BS335
1051static struct clk uart1_pclk = {
1052        .name       = "UART1_PCLK",
1053        .parent     = &fast_clk,
1054        .hw_ctrld   = false,
1055        .reset      = true,
1056        .res_reg    = U300_SYSCON_VBASE + U300_SYSCON_RFR,
1057        .res_mask   = U300_SYSCON_RFR_UART1_RESET_ENABLE,
1058        .clk_val    = U300_SYSCON_SBCER_UART1_CLK_EN,
1059        .enable     = syscon_clk_enable,
1060        .disable    = syscon_clk_disable,
1061        .lock       = __SPIN_LOCK_UNLOCKED(uart1_pclk.lock),
1062};
1063
1064/* This one is hardwired to PLL13 */
1065static struct clk uart1_clk = {
1066        .name       = "UART1_CLK",
1067        .rate       = 13000000,
1068        .hw_ctrld   = true,
1069        .lock       = __SPIN_LOCK_UNLOCKED(uart1_clk.lock),
1070};
1071#endif
1072
1073
1074/*
1075 * Clocks on the SLOW bridge
1076 */
1077static struct clk slow_clk = {
1078        .name       = "SLOW_BRIDGE",
1079        .parent     = &amba_clk,
1080        .rate       = 13000000,
1081        .hw_ctrld   = true,
1082        .reset      = true,
1083        .res_reg    = U300_SYSCON_VBASE + U300_SYSCON_RSR,
1084        .res_mask   = U300_SYSCON_RSR_SLOW_BRIDGE_RESET_EN,
1085        .clk_val    = U300_SYSCON_SBCER_SLOW_BRIDGE_CLK_EN,
1086        .enable     = syscon_clk_enable,
1087        .disable    = syscon_clk_disable,
1088        .lock       = __SPIN_LOCK_UNLOCKED(slow_clk.lock),
1089};
1090
1091/* TODO: implement SYSCON clock? */
1092
1093static struct clk wdog_clk = {
1094        .name       = "WDOG",
1095        .parent     = &slow_clk,
1096        .hw_ctrld   = false,
1097        .rate       = 32768,
1098        .reset      = false,
1099        /* This is always on, cannot be enabled/disabled or reset */
1100        .lock       = __SPIN_LOCK_UNLOCKED(wdog_clk.lock),
1101};
1102
1103static struct clk uart0_pclk = {
1104        .name       = "UART0_PCLK",
1105        .parent     = &slow_clk,
1106        .hw_ctrld   = false,
1107        .reset      = true,
1108        .res_reg    = U300_SYSCON_VBASE + U300_SYSCON_RSR,
1109        .res_mask   = U300_SYSCON_RSR_UART_RESET_EN,
1110        .clk_val    = U300_SYSCON_SBCER_UART_CLK_EN,
1111        .enable     = syscon_clk_enable,
1112        .disable    = syscon_clk_disable,
1113        .lock       = __SPIN_LOCK_UNLOCKED(uart0_pclk.lock),
1114};
1115
1116/* This one is hardwired to PLL13 */
1117static struct clk uart0_clk = {
1118        .name       = "UART0_CLK",
1119        .parent     = &slow_clk,
1120        .rate       = 13000000,
1121        .hw_ctrld   = true,
1122        .lock       = __SPIN_LOCK_UNLOCKED(uart0_clk.lock),
1123};
1124
1125static struct clk keypad_clk = {
1126        .name       = "KEYPAD",
1127        .parent     = &slow_clk,
1128        .rate       = 32768,
1129        .hw_ctrld   = false,
1130        .reset      = true,
1131        .res_reg    = U300_SYSCON_VBASE + U300_SYSCON_RSR,
1132        .res_mask   = U300_SYSCON_RSR_KEYPAD_RESET_EN,
1133        .clk_val    = U300_SYSCON_SBCER_KEYPAD_CLK_EN,
1134        .enable     = syscon_clk_enable,
1135        .disable    = syscon_clk_disable,
1136        .lock       = __SPIN_LOCK_UNLOCKED(keypad_clk.lock),
1137};
1138
1139static struct clk gpio_clk = {
1140        .name       = "GPIO",
1141        .parent     = &slow_clk,
1142        .rate       = 13000000,
1143        .hw_ctrld   = true,
1144        .reset      = true,
1145        .res_reg    = U300_SYSCON_VBASE + U300_SYSCON_RSR,
1146        .res_mask   = U300_SYSCON_RSR_GPIO_RESET_EN,
1147        .clk_val    = U300_SYSCON_SBCER_GPIO_CLK_EN,
1148        .enable     = syscon_clk_enable,
1149        .disable    = syscon_clk_disable,
1150        .lock       = __SPIN_LOCK_UNLOCKED(gpio_clk.lock),
1151};
1152
1153static struct clk rtc_clk = {
1154        .name       = "RTC",
1155        .parent     = &slow_clk,
1156        .rate       = 32768,
1157        .hw_ctrld   = true,
1158        .reset      = true,
1159        .res_reg    = U300_SYSCON_VBASE + U300_SYSCON_RSR,
1160        .res_mask   = U300_SYSCON_RSR_RTC_RESET_EN,
1161        /* This clock is always on, cannot be enabled/disabled */
1162        .lock       = __SPIN_LOCK_UNLOCKED(rtc_clk.lock),
1163};
1164
1165static struct clk bustr_clk = {
1166        .name       = "BUSTR",
1167        .parent     = &slow_clk,
1168        .rate       = 13000000,
1169        .hw_ctrld   = true,
1170        .reset      = true,
1171        .res_reg    = U300_SYSCON_VBASE + U300_SYSCON_RSR,
1172        .res_mask   = U300_SYSCON_RSR_BTR_RESET_EN,
1173        .clk_val    = U300_SYSCON_SBCER_BTR_CLK_EN,
1174        .enable     = syscon_clk_enable,
1175        .disable    = syscon_clk_disable,
1176        .lock       = __SPIN_LOCK_UNLOCKED(bustr_clk.lock),
1177};
1178
1179static struct clk evhist_clk = {
1180        .name       = "EVHIST",
1181        .parent     = &slow_clk,
1182        .rate       = 13000000,
1183        .hw_ctrld   = true,
1184        .reset      = true,
1185        .res_reg    = U300_SYSCON_VBASE + U300_SYSCON_RSR,
1186        .res_mask   = U300_SYSCON_RSR_EH_RESET_EN,
1187        .clk_val    = U300_SYSCON_SBCER_EH_CLK_EN,
1188        .enable     = syscon_clk_enable,
1189        .disable    = syscon_clk_disable,
1190        .lock       = __SPIN_LOCK_UNLOCKED(evhist_clk.lock),
1191};
1192
1193static struct clk timer_clk = {
1194        .name       = "TIMER",
1195        .parent     = &slow_clk,
1196        .rate       = 13000000,
1197        .hw_ctrld   = true,
1198        .reset      = true,
1199        .res_reg    = U300_SYSCON_VBASE + U300_SYSCON_RSR,
1200        .res_mask   = U300_SYSCON_RSR_ACC_TMR_RESET_EN,
1201        .clk_val    = U300_SYSCON_SBCER_ACC_TMR_CLK_EN,
1202        .enable     = syscon_clk_enable,
1203        .disable    = syscon_clk_disable,
1204        .lock       = __SPIN_LOCK_UNLOCKED(timer_clk.lock),
1205};
1206
1207/*
1208 * There is a binary divider in the hardware that divides
1209 * the 13MHz PLL by 13 down to 1 MHz.
1210 */
1211static struct clk app_timer_clk = {
1212        .name       = "TIMER_APP",
1213        .parent     = &slow_clk,
1214        .rate       = 1000000,
1215        .hw_ctrld   = true,
1216        .reset      = true,
1217        .res_reg    = U300_SYSCON_VBASE + U300_SYSCON_RSR,
1218        .res_mask   = U300_SYSCON_RSR_APP_TMR_RESET_EN,
1219        .clk_val    = U300_SYSCON_SBCER_APP_TMR_CLK_EN,
1220        .enable     = syscon_clk_enable,
1221        .disable    = syscon_clk_disable,
1222        .lock       = __SPIN_LOCK_UNLOCKED(app_timer_clk.lock),
1223};
1224
1225#ifdef CONFIG_MACH_U300_BS335
1226static struct clk ppm_clk = {
1227        .name       = "PPM",
1228        .parent     = &slow_clk,
1229        .rate       = 0, /* FIXME */
1230        .hw_ctrld   = true, /* TODO: Look up if it is hw ctrld or not */
1231        .reset      = true,
1232        .res_reg    = U300_SYSCON_VBASE + U300_SYSCON_RSR,
1233        .res_mask   = U300_SYSCON_RSR_PPM_RESET_EN,
1234        .clk_val    = U300_SYSCON_SBCER_PPM_CLK_EN,
1235        .enable     = syscon_clk_enable,
1236        .disable    = syscon_clk_disable,
1237        .lock       = __SPIN_LOCK_UNLOCKED(ppm_clk.lock),
1238};
1239#endif
1240
1241#define DEF_LOOKUP(devid, clkref)               \
1242        {                                       \
1243        .dev_id = devid,                        \
1244        .clk = clkref,                          \
1245        }
1246
1247#define DEF_LOOKUP_CON(devid, conid, clkref)    \
1248        {                                       \
1249        .dev_id = devid,                        \
1250        .con_id = conid,                        \
1251        .clk = clkref,                          \
1252        }
1253
1254/*
1255 * Here we only define clocks that are meaningful to
1256 * look up through clockdevice.
1257 */
1258static struct clk_lookup lookups[] = {
1259        /* Connected directly to the AMBA bus */
1260        DEF_LOOKUP("amba",      &amba_clk),
1261        DEF_LOOKUP("cpu",       &cpu_clk),
1262        DEF_LOOKUP("fsmc-nand", &nandif_clk),
1263        DEF_LOOKUP("semi",      &semi_clk),
1264#ifdef CONFIG_MACH_U300_BS335
1265        DEF_LOOKUP("isp",       &isp_clk),
1266        DEF_LOOKUP("cds",       &cds_clk),
1267#endif
1268        DEF_LOOKUP("dma",       &dma_clk),
1269        DEF_LOOKUP("msl",       &aaif_clk),
1270        DEF_LOOKUP("apex",      &apex_clk),
1271        DEF_LOOKUP("video_enc", &video_enc_clk),
1272        DEF_LOOKUP("xgam",      &xgam_clk),
1273        DEF_LOOKUP("ahb",       &ahb_clk),
1274        /* AHB bridge clocks */
1275        DEF_LOOKUP("ahb_subsys", &ahb_subsys_clk),
1276        DEF_LOOKUP("intcon",    &intcon_clk),
1277        DEF_LOOKUP_CON("intcon", "apb_pclk", &intcon_clk),
1278        DEF_LOOKUP("mspro",     &mspro_clk),
1279        DEF_LOOKUP("pl172",     &emif_clk),
1280        DEF_LOOKUP_CON("pl172", "apb_pclk", &emif_clk),
1281        /* FAST bridge clocks */
1282        DEF_LOOKUP("fast",      &fast_clk),
1283        DEF_LOOKUP("mmci",      &mmcsd_clk),
1284        DEF_LOOKUP_CON("mmci", "apb_pclk", &mmcsd_clk),
1285        /*
1286         * The .0 and .1 identifiers on these comes from the platform device
1287         * .id field and are assigned when the platform devices are registered.
1288         */
1289        DEF_LOOKUP("i2s.0",     &i2s0_clk),
1290        DEF_LOOKUP("i2s.1",     &i2s1_clk),
1291        DEF_LOOKUP("stu300.0",  &i2c0_clk),
1292        DEF_LOOKUP("stu300.1",  &i2c1_clk),
1293        DEF_LOOKUP("pl022",     &spi_clk),
1294        DEF_LOOKUP_CON("pl022", "apb_pclk", &spi_clk),
1295#ifdef CONFIG_MACH_U300_BS335
1296        DEF_LOOKUP("uart1",     &uart1_clk),
1297        DEF_LOOKUP_CON("uart1", "apb_pclk", &uart1_pclk),
1298#endif
1299        /* SLOW bridge clocks */
1300        DEF_LOOKUP("slow",      &slow_clk),
1301        DEF_LOOKUP("coh901327_wdog",      &wdog_clk),
1302        DEF_LOOKUP("uart0",     &uart0_clk),
1303        DEF_LOOKUP_CON("uart0", "apb_pclk", &uart0_pclk),
1304        DEF_LOOKUP("apptimer",  &app_timer_clk),
1305        DEF_LOOKUP("coh901461-keypad",    &keypad_clk),
1306        DEF_LOOKUP("u300-gpio", &gpio_clk),
1307        DEF_LOOKUP("rtc-coh901331",      &rtc_clk),
1308        DEF_LOOKUP("bustr",     &bustr_clk),
1309        DEF_LOOKUP("evhist",    &evhist_clk),
1310        DEF_LOOKUP("timer",     &timer_clk),
1311#ifdef CONFIG_MACH_U300_BS335
1312        DEF_LOOKUP("ppm",       &ppm_clk),
1313#endif
1314};
1315
1316static void __init clk_register(void)
1317{
1318        /* Register the lookups */
1319        clkdev_add_table(lookups, ARRAY_SIZE(lookups));
1320}
1321
1322#if (defined(CONFIG_DEBUG_FS) && defined(CONFIG_U300_DEBUG))
1323/*
1324 * The following makes it possible to view the status (especially
1325 * reference count and reset status) for the clocks in the platform
1326 * by looking into the special file <debugfs>/u300_clocks
1327 */
1328
1329/* A list of all clocks in the platform */
1330static struct clk *clks[] = {
1331        /* Top node clock for the AMBA bus */
1332        &amba_clk,
1333        /* Connected directly to the AMBA bus */
1334        &cpu_clk,
1335        &nandif_clk,
1336        &semi_clk,
1337#ifdef CONFIG_MACH_U300_BS335
1338        &isp_clk,
1339        &cds_clk,
1340#endif
1341        &dma_clk,
1342        &aaif_clk,
1343        &apex_clk,
1344        &video_enc_clk,
1345        &xgam_clk,
1346        &ahb_clk,
1347
1348        /* AHB bridge clocks */
1349        &ahb_subsys_clk,
1350        &intcon_clk,
1351        &mspro_clk,
1352        &emif_clk,
1353        /* FAST bridge clocks */
1354        &fast_clk,
1355        &mmcsd_clk,
1356        &i2s0_clk,
1357        &i2s1_clk,
1358        &i2c0_clk,
1359        &i2c1_clk,
1360        &spi_clk,
1361#ifdef CONFIG_MACH_U300_BS335
1362        &uart1_clk,
1363        &uart1_pclk,
1364#endif
1365        /* SLOW bridge clocks */
1366        &slow_clk,
1367        &wdog_clk,
1368        &uart0_clk,
1369        &uart0_pclk,
1370        &app_timer_clk,
1371        &keypad_clk,
1372        &gpio_clk,
1373        &rtc_clk,
1374        &bustr_clk,
1375        &evhist_clk,
1376        &timer_clk,
1377#ifdef CONFIG_MACH_U300_BS335
1378        &ppm_clk,
1379#endif
1380};
1381
1382static int u300_clocks_show(struct seq_file *s, void *data)
1383{
1384        struct clk *clk;
1385        int i;
1386
1387        seq_printf(s, "CLOCK           DEVICE          RESET STATE\t" \
1388                   "ACTIVE\tUSERS\tHW CTRL FREQ\n");
1389        seq_printf(s, "---------------------------------------------" \
1390                   "-----------------------------------------\n");
1391        for (i = 0; i < ARRAY_SIZE(clks); i++) {
1392                clk = clks[i];
1393                if (clk != ERR_PTR(-ENOENT)) {
1394                        /* Format clock and device name nicely */
1395                        char cdp[33];
1396                        int chars;
1397
1398                        chars = snprintf(&cdp[0], 17, "%s", clk->name);
1399                        while (chars < 16) {
1400                                cdp[chars] = ' ';
1401                                chars++;
1402                        }
1403                        chars = snprintf(&cdp[16], 17, "%s", clk->dev ?
1404                                         dev_name(clk->dev) : "N/A");
1405                        while (chars < 16) {
1406                                cdp[chars+16] = ' ';
1407                                chars++;
1408                        }
1409                        cdp[32] = '\0';
1410                        if (clk->get_rate || clk->rate != 0)
1411                                seq_printf(s,
1412                                           "%s%s\t%s\t%d\t%s\t%lu Hz\n",
1413                                           &cdp[0],
1414                                           clk->reset ?
1415                                           "ASSERTED" : "RELEASED",
1416                                           clk->usecount ? "ON" : "OFF",
1417                                           clk->usecount,
1418                                           clk->hw_ctrld  ? "YES" : "NO ",
1419                                           clk_get_rate(clk));
1420                        else
1421                                seq_printf(s,
1422                                           "%s%s\t%s\t%d\t%s\t" \
1423                                           "(unknown rate)\n",
1424                                           &cdp[0],
1425                                           clk->reset ?
1426                                           "ASSERTED" : "RELEASED",
1427                                           clk->usecount ? "ON" : "OFF",
1428                                           clk->usecount,
1429                                           clk->hw_ctrld  ? "YES" : "NO ");
1430                }
1431        }
1432        return 0;
1433}
1434
1435static int u300_clocks_open(struct inode *inode, struct file *file)
1436{
1437        return single_open(file, u300_clocks_show, NULL);
1438}
1439
1440static const struct file_operations u300_clocks_operations = {
1441        .open           = u300_clocks_open,
1442        .read           = seq_read,
1443        .llseek         = seq_lseek,
1444        .release        = single_release,
1445};
1446
1447static int __init init_clk_read_debugfs(void)
1448{
1449        /* Expose a simple debugfs interface to view all clocks */
1450        (void) debugfs_create_file("u300_clocks", S_IFREG | S_IRUGO,
1451                                   NULL, NULL,
1452                                   &u300_clocks_operations);
1453        return 0;
1454}
1455/*
1456 * This needs to come in after the core_initcall() for the
1457 * overall clocks, because debugfs is not available until
1458 * the subsystems come up.
1459 */
1460module_init(init_clk_read_debugfs);
1461#endif
1462
1463int __init u300_clock_init(void)
1464{
1465        u16 val;
1466
1467        /*
1468         * FIXME: shall all this powermanagement stuff really live here???
1469         */
1470
1471        /* Set system to run at PLL208, max performance, a known state. */
1472        val = readw(U300_SYSCON_VBASE + U300_SYSCON_CCR);
1473        val &= ~U300_SYSCON_CCR_CLKING_PERFORMANCE_MASK;
1474        writew(val, U300_SYSCON_VBASE + U300_SYSCON_CCR);
1475        /* Wait for the PLL208 to lock if not locked in yet */
1476        while (!(readw(U300_SYSCON_VBASE + U300_SYSCON_CSR) &
1477                 U300_SYSCON_CSR_PLL208_LOCK_IND));
1478
1479        /* Power management enable */
1480        val = readw(U300_SYSCON_VBASE + U300_SYSCON_PMCR);
1481        val |= U300_SYSCON_PMCR_PWR_MGNT_ENABLE;
1482        writew(val, U300_SYSCON_VBASE + U300_SYSCON_PMCR);
1483
1484        clk_register();
1485
1486        /*
1487         * Some of these may be on when we boot the system so make sure they
1488         * are turned OFF.
1489         */
1490        syscon_block_reset_enable(&timer_clk);
1491        timer_clk.disable(&timer_clk);
1492
1493        /*
1494         * These shall be turned on by default when we boot the system
1495         * so make sure they are ON. (Adding CPU here is a bit too much.)
1496         * These clocks will be claimed by drivers later.
1497         */
1498        syscon_block_reset_disable(&semi_clk);
1499        syscon_block_reset_disable(&emif_clk);
1500        clk_enable(&semi_clk);
1501        clk_enable(&emif_clk);
1502
1503        return 0;
1504}
1505
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.