2009-06-10 15:50:44 +01:00
/*
* linux / arch / arm / mach - w90x900 / clock . c
*
* Copyright ( c ) 2008 Nuvoton technology corporation
*
* Wan ZongShun < mcuos . com @ gmail . com >
*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation ; either version 2 of the License .
*/
# include <linux/module.h>
# include <linux/kernel.h>
# include <linux/list.h>
# include <linux/errno.h>
# include <linux/err.h>
# include <linux/string.h>
# include <linux/clk.h>
# include <linux/spinlock.h>
# include <linux/platform_device.h>
# include <linux/io.h>
# include <mach/hardware.h>
# include "clock.h"
2009-07-14 15:10:43 +01:00
# define SUBCLK 0x24
2009-06-10 15:50:44 +01:00
static DEFINE_SPINLOCK ( clocks_lock ) ;
int clk_enable ( struct clk * clk )
{
unsigned long flags ;
spin_lock_irqsave ( & clocks_lock , flags ) ;
if ( clk - > enabled + + = = 0 )
( clk - > enable ) ( clk , 1 ) ;
spin_unlock_irqrestore ( & clocks_lock , flags ) ;
return 0 ;
}
EXPORT_SYMBOL ( clk_enable ) ;
void clk_disable ( struct clk * clk )
{
unsigned long flags ;
WARN_ON ( clk - > enabled = = 0 ) ;
spin_lock_irqsave ( & clocks_lock , flags ) ;
if ( - - clk - > enabled = = 0 )
( clk - > enable ) ( clk , 0 ) ;
spin_unlock_irqrestore ( & clocks_lock , flags ) ;
}
EXPORT_SYMBOL ( clk_disable ) ;
2009-08-14 15:36:44 +01:00
unsigned long clk_get_rate ( struct clk * clk )
{
return 15000000 ;
}
EXPORT_SYMBOL ( clk_get_rate ) ;
2009-08-21 07:07:46 +01:00
void nuc900_clk_enable ( struct clk * clk , int enable )
2009-06-10 15:50:44 +01:00
{
unsigned int clocks = clk - > cken ;
unsigned long clken ;
clken = __raw_readl ( W90X900_VA_CLKPWR ) ;
if ( enable )
clken | = clocks ;
else
clken & = ~ clocks ;
__raw_writel ( clken , W90X900_VA_CLKPWR ) ;
}
2009-08-21 07:07:46 +01:00
void nuc900_subclk_enable ( struct clk * clk , int enable )
2009-07-14 15:10:43 +01:00
{
unsigned int clocks = clk - > cken ;
unsigned long clken ;
clken = __raw_readl ( W90X900_VA_CLKPWR + SUBCLK ) ;
if ( enable )
clken | = clocks ;
else
clken & = ~ clocks ;
__raw_writel ( clken , W90X900_VA_CLKPWR + SUBCLK ) ;
}