linux/arch/arm/mach-w90x900/clock.c
<<
>>
Prefs
   1/*
   2 * linux/arch/arm/mach-w90x900/clock.c
   3 *
   4 * Copyright (c) 2008 Nuvoton technology corporation
   5 *
   6 * Wan ZongShun <mcuos.com@gmail.com>
   7 *
   8 * This program is free software; you can redistribute it and/or modify
   9 * it under the terms of the GNU General Public License as published by
  10 * the Free Software Foundation; either version 2 of the License.
  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/spinlock.h>
  21#include <linux/platform_device.h>
  22#include <linux/io.h>
  23
  24#include <mach/hardware.h>
  25
  26#include "clock.h"
  27
  28#define SUBCLK 0x24
  29
  30static DEFINE_SPINLOCK(clocks_lock);
  31
  32int clk_enable(struct clk *clk)
  33{
  34        unsigned long flags;
  35
  36        spin_lock_irqsave(&clocks_lock, flags);
  37        if (clk->enabled++ == 0)
  38                (clk->enable)(clk, 1);
  39        spin_unlock_irqrestore(&clocks_lock, flags);
  40
  41        return 0;
  42}
  43EXPORT_SYMBOL(clk_enable);
  44
  45void clk_disable(struct clk *clk)
  46{
  47        unsigned long flags;
  48
  49        WARN_ON(clk->enabled == 0);
  50
  51        spin_lock_irqsave(&clocks_lock, flags);
  52        if (--clk->enabled == 0)
  53                (clk->enable)(clk, 0);
  54        spin_unlock_irqrestore(&clocks_lock, flags);
  55}
  56EXPORT_SYMBOL(clk_disable);
  57
  58unsigned long clk_get_rate(struct clk *clk)
  59{
  60        return 15000000;
  61}
  62EXPORT_SYMBOL(clk_get_rate);
  63
  64void nuc900_clk_enable(struct clk *clk, int enable)
  65{
  66        unsigned int clocks = clk->cken;
  67        unsigned long clken;
  68
  69        clken = __raw_readl(W90X900_VA_CLKPWR);
  70
  71        if (enable)
  72                clken |= clocks;
  73        else
  74                clken &= ~clocks;
  75
  76        __raw_writel(clken, W90X900_VA_CLKPWR);
  77}
  78
  79void nuc900_subclk_enable(struct clk *clk, int enable)
  80{
  81        unsigned int clocks = clk->cken;
  82        unsigned long clken;
  83
  84        clken = __raw_readl(W90X900_VA_CLKPWR + SUBCLK);
  85
  86        if (enable)
  87                clken |= clocks;
  88        else
  89                clken &= ~clocks;
  90
  91        __raw_writel(clken, W90X900_VA_CLKPWR + SUBCLK);
  92}
  93