forked from luck/tmp_suning_uos_patched
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:
parent
4b00951f6f
commit
95cf1468f7
|
@ -50,15 +50,4 @@ void clk_recalc_rate(struct clk *);
|
|||
int clk_register(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 */
|
||||
|
|
|
@ -245,7 +245,6 @@ static inline void do_perfcnt_IRQ(void)
|
|||
|
||||
#ifdef CONFIG_CPU_SUPPORTS_CPUFREQ
|
||||
#include <linux/cpufreq.h>
|
||||
extern void loongson2_cpu_wait(void);
|
||||
extern struct cpufreq_frequency_table loongson2_clockmod_table[];
|
||||
|
||||
/* Chip Config */
|
||||
|
|
|
@ -2,4 +2,4 @@
|
|||
# Makefile for the Linux/MIPS cpufreq.
|
||||
#
|
||||
|
||||
obj-$(CONFIG_LOONGSON2_CPUFREQ) += loongson2_cpufreq.o loongson2_clock.o
|
||||
obj-$(CONFIG_LOONGSON2_CPUFREQ) += loongson2_cpufreq.o
|
||||
|
|
|
@ -19,7 +19,7 @@
|
|||
|
||||
#include <asm/clock.h>
|
||||
|
||||
#include <loongson.h>
|
||||
#include <asm/mach-loongson/loongson.h>
|
||||
|
||||
static uint nowait;
|
||||
|
||||
|
@ -181,6 +181,25 @@ static struct platform_driver platform_driver = {
|
|||
.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)
|
||||
{
|
||||
int ret;
|
||||
|
|
|
@ -41,6 +41,7 @@ config LEMOTE_MACH2F
|
|||
select CSRC_R4K if ! MIPS_EXTERNAL_TIMER
|
||||
select DMA_NONCOHERENT
|
||||
select GENERIC_ISA_DMA_SUPPORT_BROKEN
|
||||
select HAVE_CLK
|
||||
select HW_HAS_PCI
|
||||
select I8259
|
||||
select IRQ_CPU
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
# 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
|
||||
|
|
|
@ -6,14 +6,17 @@
|
|||
* License. See the file "COPYING" in the main directory of this archive
|
||||
* for more details.
|
||||
*/
|
||||
|
||||
#include <linux/module.h>
|
||||
#include <linux/clk.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 <loongson.h>
|
||||
#include <asm/mach-loongson/loongson.h>
|
||||
|
||||
static LIST_HEAD(clock_list);
|
||||
static DEFINE_SPINLOCK(clock_lock);
|
||||
|
@ -88,12 +91,6 @@ void clk_put(struct clk *clk)
|
|||
EXPORT_SYMBOL(clk_put);
|
||||
|
||||
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 regval;
|
||||
|
@ -103,7 +100,7 @@ int clk_set_rate_ex(struct clk *clk, unsigned long rate, int algo_id)
|
|||
unsigned long 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);
|
||||
}
|
||||
|
||||
|
@ -129,7 +126,7 @@ int clk_set_rate_ex(struct clk *clk, unsigned long rate, int algo_id)
|
|||
|
||||
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)
|
||||
{
|
||||
|
@ -146,26 +143,3 @@ long clk_round_rate(struct clk *clk, unsigned long rate)
|
|||
return 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");
|
Loading…
Reference in New Issue
Block a user