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        if (!clk)
  50                return;
  51
  52        WARN_ON(clk->enabled == 0);
  53
  54        spin_lock_irqsave(&clocks_lock, flags);
  55        if (--clk->enabled == 0)
  56                (clk->enable)(clk, 0);
  57        spin_unlock_irqrestore(&clocks_lock, flags);
  58}
  59EXPORT_SYMBOL(clk_disable);
  60
  61unsigned long clk_get_rate(struct clk *clk)
  62{
  63        return 15000000;
  64}
  65EXPORT_SYMBOL(clk_get_rate);
  66
  67void nuc900_clk_enable(struct clk *clk, int enable)
  68{
  69        unsigned int clocks = clk->cken;
  70        unsigned long clken;
  71
  72        clken = __raw_readl(W90X900_VA_CLKPWR);
  73
  74        if (enable)
  75                clken |= clocks;
  76        else
  77                clken &= ~clocks;
  78
  79        __raw_writel(clken, W90X900_VA_CLKPWR);
  80}
  81
  82void nuc900_subclk_enable(struct clk *clk, int enable)
  83{
  84        unsigned int clocks = clk->cken;
  85        unsigned long clken;
  86
  87        clken = __raw_readl(W90X900_VA_CLKPWR + SUBCLK);
  88
  89        if (enable)
  90                clken |= clocks;
  91        else
  92                clken &= ~clocks;
  93
  94        __raw_writel(clken, W90X900_VA_CLKPWR + SUBCLK);
  95}
  96
  97/* dummy functions, should not be called */
  98long clk_round_rate(struct clk *clk, unsigned long rate)
  99{
 100        WARN_ON(clk);
 101        return 0;
 102}
 103EXPORT_SYMBOL(clk_round_rate);
 104
 105int clk_set_rate(struct clk *clk, unsigned long rate)
 106{
 107        WARN_ON(clk);
 108        return 0;
 109}
 110EXPORT_SYMBOL(clk_set_rate);
 111
 112int clk_set_parent(struct clk *clk, struct clk *parent)
 113{
 114        WARN_ON(clk);
 115        return 0;
 116}
 117EXPORT_SYMBOL(clk_set_parent);
 118
 119struct clk *clk_get_parent(struct clk *clk)
 120{
 121        WARN_ON(clk);
 122        return NULL;
 123}
 124EXPORT_SYMBOL(clk_get_parent);
 125