MIPS: Loongson 2: Sort out clock managment.

For unexplainable reasons the Loongson 2 clock API was implemented in a
module so fixing this involved shifting large amounts of code around.

Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
This commit is contained in:
Ralf Baechle 2012-08-01 17:15:32 +02:00
parent 4b00951f6f
commit 95cf1468f7
7 changed files with 33 additions and 51 deletions

View File

@ -50,15 +50,4 @@ void clk_recalc_rate(struct clk *);
int clk_register(struct clk *); int clk_register(struct clk *);
void clk_unregister(struct clk *); void clk_unregister(struct clk *);
/* the exported API, in addition to clk_set_rate */
/**
* clk_set_rate_ex - set the clock rate for a clock source, with additional parameter
* @clk: clock source
* @rate: desired clock rate in Hz
* @algo_id: algorithm id to be passed down to ops->set_rate
*
* Returns success (0) or negative errno.
*/
int clk_set_rate_ex(struct clk *clk, unsigned long rate, int algo_id);
#endif /* __ASM_MIPS_CLOCK_H */ #endif /* __ASM_MIPS_CLOCK_H */

View File

@ -245,7 +245,6 @@ static inline void do_perfcnt_IRQ(void)
#ifdef CONFIG_CPU_SUPPORTS_CPUFREQ #ifdef CONFIG_CPU_SUPPORTS_CPUFREQ
#include <linux/cpufreq.h> #include <linux/cpufreq.h>
extern void loongson2_cpu_wait(void);
extern struct cpufreq_frequency_table loongson2_clockmod_table[]; extern struct cpufreq_frequency_table loongson2_clockmod_table[];
/* Chip Config */ /* Chip Config */

View File

@ -2,4 +2,4 @@
# Makefile for the Linux/MIPS cpufreq. # Makefile for the Linux/MIPS cpufreq.
# #
obj-$(CONFIG_LOONGSON2_CPUFREQ) += loongson2_cpufreq.o loongson2_clock.o obj-$(CONFIG_LOONGSON2_CPUFREQ) += loongson2_cpufreq.o

View File

@ -19,7 +19,7 @@
#include <asm/clock.h> #include <asm/clock.h>
#include <loongson.h> #include <asm/mach-loongson/loongson.h>
static uint nowait; static uint nowait;
@ -181,6 +181,25 @@ static struct platform_driver platform_driver = {
.id_table = platform_device_ids, .id_table = platform_device_ids,
}; };
/*
* This is the simple version of Loongson-2 wait, Maybe we need do this in
* interrupt disabled context.
*/
static DEFINE_SPINLOCK(loongson2_wait_lock);
static void loongson2_cpu_wait(void)
{
unsigned long flags;
u32 cpu_freq;
spin_lock_irqsave(&loongson2_wait_lock, flags);
cpu_freq = LOONGSON_CHIPCFG0;
LOONGSON_CHIPCFG0 &= ~0x7; /* Put CPU into wait mode */
LOONGSON_CHIPCFG0 = cpu_freq; /* Restore CPU state */
spin_unlock_irqrestore(&loongson2_wait_lock, flags);
}
static int __init cpufreq_init(void) static int __init cpufreq_init(void)
{ {
int ret; int ret;

View File

@ -41,6 +41,7 @@ config LEMOTE_MACH2F
select CSRC_R4K if ! MIPS_EXTERNAL_TIMER select CSRC_R4K if ! MIPS_EXTERNAL_TIMER
select DMA_NONCOHERENT select DMA_NONCOHERENT
select GENERIC_ISA_DMA_SUPPORT_BROKEN select GENERIC_ISA_DMA_SUPPORT_BROKEN
select HAVE_CLK
select HW_HAS_PCI select HW_HAS_PCI
select I8259 select I8259
select IRQ_CPU select IRQ_CPU

View File

@ -2,7 +2,7 @@
# Makefile for lemote loongson2f family machines # Makefile for lemote loongson2f family machines
# #
obj-y += machtype.o irq.o reset.o ec_kb3310b.o obj-y += clock.o machtype.o irq.o reset.o ec_kb3310b.o
# #
# Suspend Support # Suspend Support

View File

@ -6,14 +6,17 @@
* License. See the file "COPYING" in the main directory of this archive * License. See the file "COPYING" in the main directory of this archive
* for more details. * for more details.
*/ */
#include <linux/clk.h>
#include <linux/module.h>
#include <linux/cpufreq.h> #include <linux/cpufreq.h>
#include <linux/platform_device.h> #include <linux/errno.h>
#include <linux/export.h>
#include <linux/init.h>
#include <linux/list.h>
#include <linux/mutex.h>
#include <linux/spinlock.h>
#include <asm/clock.h> #include <asm/clock.h>
#include <asm/mach-loongson/loongson.h>
#include <loongson.h>
static LIST_HEAD(clock_list); static LIST_HEAD(clock_list);
static DEFINE_SPINLOCK(clock_lock); static DEFINE_SPINLOCK(clock_lock);
@ -88,12 +91,6 @@ void clk_put(struct clk *clk)
EXPORT_SYMBOL(clk_put); EXPORT_SYMBOL(clk_put);
int clk_set_rate(struct clk *clk, unsigned long rate) int clk_set_rate(struct clk *clk, unsigned long rate)
{
return clk_set_rate_ex(clk, rate, 0);
}
EXPORT_SYMBOL_GPL(clk_set_rate);
int clk_set_rate_ex(struct clk *clk, unsigned long rate, int algo_id)
{ {
int ret = 0; int ret = 0;
int regval; int regval;
@ -103,7 +100,7 @@ int clk_set_rate_ex(struct clk *clk, unsigned long rate, int algo_id)
unsigned long flags; unsigned long flags;
spin_lock_irqsave(&clock_lock, flags); spin_lock_irqsave(&clock_lock, flags);
ret = clk->ops->set_rate(clk, rate, algo_id); ret = clk->ops->set_rate(clk, rate, 0);
spin_unlock_irqrestore(&clock_lock, flags); spin_unlock_irqrestore(&clock_lock, flags);
} }
@ -129,7 +126,7 @@ int clk_set_rate_ex(struct clk *clk, unsigned long rate, int algo_id)
return ret; return ret;
} }
EXPORT_SYMBOL_GPL(clk_set_rate_ex); EXPORT_SYMBOL_GPL(clk_set_rate);
long clk_round_rate(struct clk *clk, unsigned long rate) long clk_round_rate(struct clk *clk, unsigned long rate)
{ {
@ -146,26 +143,3 @@ long clk_round_rate(struct clk *clk, unsigned long rate)
return rate; return rate;
} }
EXPORT_SYMBOL_GPL(clk_round_rate); EXPORT_SYMBOL_GPL(clk_round_rate);
/*
* This is the simple version of Loongson-2 wait, Maybe we need do this in
* interrupt disabled content
*/
DEFINE_SPINLOCK(loongson2_wait_lock);
void loongson2_cpu_wait(void)
{
u32 cpu_freq;
unsigned long flags;
spin_lock_irqsave(&loongson2_wait_lock, flags);
cpu_freq = LOONGSON_CHIPCFG0;
LOONGSON_CHIPCFG0 &= ~0x7; /* Put CPU into wait mode */
LOONGSON_CHIPCFG0 = cpu_freq; /* Restore CPU state */
spin_unlock_irqrestore(&loongson2_wait_lock, flags);
}
EXPORT_SYMBOL_GPL(loongson2_cpu_wait);
MODULE_AUTHOR("Yanhua <yanh@lemote.com>");
MODULE_DESCRIPTION("cpufreq driver for Loongson 2F");
MODULE_LICENSE("GPL");