-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
yaml --- r: 231870 b: refs/heads/master c: d4a67d9 h: refs/heads/master v: v3
- Loading branch information
Gabor Juhos
authored and
Ralf Baechle
committed
Jan 18, 2011
1 parent
c300439
commit 9128bd4
Showing
21 changed files
with
1,366 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,2 +1,2 @@ | ||
--- | ||
refs/heads/master: 94bb0c1ab293c298a8852e4f10c4215bad6daa9b | ||
refs/heads/master: d4a67d9dc8a5a80c4ec1814791af8c0252c158b8 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,12 @@ | ||
if ATH79 | ||
|
||
config SOC_AR71XX | ||
def_bool n | ||
|
||
config SOC_AR724X | ||
def_bool n | ||
|
||
config SOC_AR913X | ||
def_bool n | ||
|
||
endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,18 @@ | ||
# | ||
# Makefile for the Atheros AR71XX/AR724X/AR913X specific parts of the kernel | ||
# | ||
# Copyright (C) 2008-2011 Gabor Juhos <juhosg@openwrt.org> | ||
# Copyright (C) 2008 Imre Kaloz <kaloz@openwrt.org> | ||
# | ||
# This program is free software; you can redistribute it and/or modify it | ||
# under the terms of the GNU General Public License version 2 as published | ||
# by the Free Software Foundation. | ||
|
||
obj-y := prom.o setup.o irq.o common.o clock.o | ||
|
||
obj-$(CONFIG_EARLY_PRINTK) += early_printk.o | ||
|
||
# | ||
# Devices | ||
# | ||
obj-y += dev-common.o |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,7 @@ | ||
# | ||
# Atheros AR71xx/AR724x/AR913x | ||
# | ||
|
||
platform-$(CONFIG_ATH79) += ath79/ | ||
cflags-$(CONFIG_ATH79) += -I$(srctree)/arch/mips/include/asm/mach-ath79 | ||
load-$(CONFIG_ATH79) = 0xffffffff80060000 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,183 @@ | ||
/* | ||
* Atheros AR71XX/AR724X/AR913X common routines | ||
* | ||
* Copyright (C) 2011 Gabor Juhos <juhosg@openwrt.org> | ||
* | ||
* This program is free software; you can redistribute it and/or modify it | ||
* under the terms of the GNU General Public License version 2 as published | ||
* by the Free Software Foundation. | ||
*/ | ||
|
||
#include <linux/kernel.h> | ||
#include <linux/module.h> | ||
#include <linux/init.h> | ||
#include <linux/err.h> | ||
#include <linux/clk.h> | ||
|
||
#include <asm/mach-ath79/ath79.h> | ||
#include <asm/mach-ath79/ar71xx_regs.h> | ||
#include "common.h" | ||
|
||
#define AR71XX_BASE_FREQ 40000000 | ||
#define AR724X_BASE_FREQ 5000000 | ||
#define AR913X_BASE_FREQ 5000000 | ||
|
||
struct clk { | ||
unsigned long rate; | ||
}; | ||
|
||
static struct clk ath79_ref_clk; | ||
static struct clk ath79_cpu_clk; | ||
static struct clk ath79_ddr_clk; | ||
static struct clk ath79_ahb_clk; | ||
static struct clk ath79_wdt_clk; | ||
static struct clk ath79_uart_clk; | ||
|
||
static void __init ar71xx_clocks_init(void) | ||
{ | ||
u32 pll; | ||
u32 freq; | ||
u32 div; | ||
|
||
ath79_ref_clk.rate = AR71XX_BASE_FREQ; | ||
|
||
pll = ath79_pll_rr(AR71XX_PLL_REG_CPU_CONFIG); | ||
|
||
div = ((pll >> AR71XX_PLL_DIV_SHIFT) & AR71XX_PLL_DIV_MASK) + 1; | ||
freq = div * ath79_ref_clk.rate; | ||
|
||
div = ((pll >> AR71XX_CPU_DIV_SHIFT) & AR71XX_CPU_DIV_MASK) + 1; | ||
ath79_cpu_clk.rate = freq / div; | ||
|
||
div = ((pll >> AR71XX_DDR_DIV_SHIFT) & AR71XX_DDR_DIV_MASK) + 1; | ||
ath79_ddr_clk.rate = freq / div; | ||
|
||
div = (((pll >> AR71XX_AHB_DIV_SHIFT) & AR71XX_AHB_DIV_MASK) + 1) * 2; | ||
ath79_ahb_clk.rate = ath79_cpu_clk.rate / div; | ||
|
||
ath79_wdt_clk.rate = ath79_ahb_clk.rate; | ||
ath79_uart_clk.rate = ath79_ahb_clk.rate; | ||
} | ||
|
||
static void __init ar724x_clocks_init(void) | ||
{ | ||
u32 pll; | ||
u32 freq; | ||
u32 div; | ||
|
||
ath79_ref_clk.rate = AR724X_BASE_FREQ; | ||
pll = ath79_pll_rr(AR724X_PLL_REG_CPU_CONFIG); | ||
|
||
div = ((pll >> AR724X_PLL_DIV_SHIFT) & AR724X_PLL_DIV_MASK); | ||
freq = div * ath79_ref_clk.rate; | ||
|
||
div = ((pll >> AR724X_PLL_REF_DIV_SHIFT) & AR724X_PLL_REF_DIV_MASK); | ||
freq *= div; | ||
|
||
ath79_cpu_clk.rate = freq; | ||
|
||
div = ((pll >> AR724X_DDR_DIV_SHIFT) & AR724X_DDR_DIV_MASK) + 1; | ||
ath79_ddr_clk.rate = freq / div; | ||
|
||
div = (((pll >> AR724X_AHB_DIV_SHIFT) & AR724X_AHB_DIV_MASK) + 1) * 2; | ||
ath79_ahb_clk.rate = ath79_cpu_clk.rate / div; | ||
|
||
ath79_wdt_clk.rate = ath79_ahb_clk.rate; | ||
ath79_uart_clk.rate = ath79_ahb_clk.rate; | ||
} | ||
|
||
static void __init ar913x_clocks_init(void) | ||
{ | ||
u32 pll; | ||
u32 freq; | ||
u32 div; | ||
|
||
ath79_ref_clk.rate = AR913X_BASE_FREQ; | ||
pll = ath79_pll_rr(AR913X_PLL_REG_CPU_CONFIG); | ||
|
||
div = ((pll >> AR913X_PLL_DIV_SHIFT) & AR913X_PLL_DIV_MASK); | ||
freq = div * ath79_ref_clk.rate; | ||
|
||
ath79_cpu_clk.rate = freq; | ||
|
||
div = ((pll >> AR913X_DDR_DIV_SHIFT) & AR913X_DDR_DIV_MASK) + 1; | ||
ath79_ddr_clk.rate = freq / div; | ||
|
||
div = (((pll >> AR913X_AHB_DIV_SHIFT) & AR913X_AHB_DIV_MASK) + 1) * 2; | ||
ath79_ahb_clk.rate = ath79_cpu_clk.rate / div; | ||
|
||
ath79_wdt_clk.rate = ath79_ahb_clk.rate; | ||
ath79_uart_clk.rate = ath79_ahb_clk.rate; | ||
} | ||
|
||
void __init ath79_clocks_init(void) | ||
{ | ||
if (soc_is_ar71xx()) | ||
ar71xx_clocks_init(); | ||
else if (soc_is_ar724x()) | ||
ar724x_clocks_init(); | ||
else if (soc_is_ar913x()) | ||
ar913x_clocks_init(); | ||
else | ||
BUG(); | ||
|
||
pr_info("Clocks: CPU:%lu.%03luMHz, DDR:%lu.%03luMHz, AHB:%lu.%03luMHz, " | ||
"Ref:%lu.%03luMHz", | ||
ath79_cpu_clk.rate / 1000000, | ||
(ath79_cpu_clk.rate / 1000) % 1000, | ||
ath79_ddr_clk.rate / 1000000, | ||
(ath79_ddr_clk.rate / 1000) % 1000, | ||
ath79_ahb_clk.rate / 1000000, | ||
(ath79_ahb_clk.rate / 1000) % 1000, | ||
ath79_ref_clk.rate / 1000000, | ||
(ath79_ref_clk.rate / 1000) % 1000); | ||
} | ||
|
||
/* | ||
* Linux clock API | ||
*/ | ||
struct clk *clk_get(struct device *dev, const char *id) | ||
{ | ||
if (!strcmp(id, "ref")) | ||
return &ath79_ref_clk; | ||
|
||
if (!strcmp(id, "cpu")) | ||
return &ath79_cpu_clk; | ||
|
||
if (!strcmp(id, "ddr")) | ||
return &ath79_ddr_clk; | ||
|
||
if (!strcmp(id, "ahb")) | ||
return &ath79_ahb_clk; | ||
|
||
if (!strcmp(id, "wdt")) | ||
return &ath79_wdt_clk; | ||
|
||
if (!strcmp(id, "uart")) | ||
return &ath79_uart_clk; | ||
|
||
return ERR_PTR(-ENOENT); | ||
} | ||
EXPORT_SYMBOL(clk_get); | ||
|
||
int clk_enable(struct clk *clk) | ||
{ | ||
return 0; | ||
} | ||
EXPORT_SYMBOL(clk_enable); | ||
|
||
void clk_disable(struct clk *clk) | ||
{ | ||
} | ||
EXPORT_SYMBOL(clk_disable); | ||
|
||
unsigned long clk_get_rate(struct clk *clk) | ||
{ | ||
return clk->rate; | ||
} | ||
EXPORT_SYMBOL(clk_get_rate); | ||
|
||
void clk_put(struct clk *clk) | ||
{ | ||
} | ||
EXPORT_SYMBOL(clk_put); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,97 @@ | ||
/* | ||
* Atheros AR71XX/AR724X/AR913X common routines | ||
* | ||
* Copyright (C) 2008-2010 Gabor Juhos <juhosg@openwrt.org> | ||
* Copyright (C) 2008 Imre Kaloz <kaloz@openwrt.org> | ||
* | ||
* This program is free software; you can redistribute it and/or modify it | ||
* under the terms of the GNU General Public License version 2 as published | ||
* by the Free Software Foundation. | ||
*/ | ||
|
||
#include <linux/kernel.h> | ||
#include <linux/module.h> | ||
#include <linux/types.h> | ||
#include <linux/spinlock.h> | ||
|
||
#include <asm/mach-ath79/ath79.h> | ||
#include <asm/mach-ath79/ar71xx_regs.h> | ||
#include "common.h" | ||
|
||
static DEFINE_SPINLOCK(ath79_device_reset_lock); | ||
|
||
u32 ath79_cpu_freq; | ||
EXPORT_SYMBOL_GPL(ath79_cpu_freq); | ||
|
||
u32 ath79_ahb_freq; | ||
EXPORT_SYMBOL_GPL(ath79_ahb_freq); | ||
|
||
u32 ath79_ddr_freq; | ||
EXPORT_SYMBOL_GPL(ath79_ddr_freq); | ||
|
||
enum ath79_soc_type ath79_soc; | ||
|
||
void __iomem *ath79_pll_base; | ||
void __iomem *ath79_reset_base; | ||
EXPORT_SYMBOL_GPL(ath79_reset_base); | ||
void __iomem *ath79_ddr_base; | ||
|
||
void ath79_ddr_wb_flush(u32 reg) | ||
{ | ||
void __iomem *flush_reg = ath79_ddr_base + reg; | ||
|
||
/* Flush the DDR write buffer. */ | ||
__raw_writel(0x1, flush_reg); | ||
while (__raw_readl(flush_reg) & 0x1) | ||
; | ||
|
||
/* It must be run twice. */ | ||
__raw_writel(0x1, flush_reg); | ||
while (__raw_readl(flush_reg) & 0x1) | ||
; | ||
} | ||
EXPORT_SYMBOL_GPL(ath79_ddr_wb_flush); | ||
|
||
void ath79_device_reset_set(u32 mask) | ||
{ | ||
unsigned long flags; | ||
u32 reg; | ||
u32 t; | ||
|
||
if (soc_is_ar71xx()) | ||
reg = AR71XX_RESET_REG_RESET_MODULE; | ||
else if (soc_is_ar724x()) | ||
reg = AR724X_RESET_REG_RESET_MODULE; | ||
else if (soc_is_ar913x()) | ||
reg = AR913X_RESET_REG_RESET_MODULE; | ||
else | ||
BUG(); | ||
|
||
spin_lock_irqsave(&ath79_device_reset_lock, flags); | ||
t = ath79_reset_rr(reg); | ||
ath79_reset_wr(reg, t | mask); | ||
spin_unlock_irqrestore(&ath79_device_reset_lock, flags); | ||
} | ||
EXPORT_SYMBOL_GPL(ath79_device_reset_set); | ||
|
||
void ath79_device_reset_clear(u32 mask) | ||
{ | ||
unsigned long flags; | ||
u32 reg; | ||
u32 t; | ||
|
||
if (soc_is_ar71xx()) | ||
reg = AR71XX_RESET_REG_RESET_MODULE; | ||
else if (soc_is_ar724x()) | ||
reg = AR724X_RESET_REG_RESET_MODULE; | ||
else if (soc_is_ar913x()) | ||
reg = AR913X_RESET_REG_RESET_MODULE; | ||
else | ||
BUG(); | ||
|
||
spin_lock_irqsave(&ath79_device_reset_lock, flags); | ||
t = ath79_reset_rr(reg); | ||
ath79_reset_wr(reg, t & ~mask); | ||
spin_unlock_irqrestore(&ath79_device_reset_lock, flags); | ||
} | ||
EXPORT_SYMBOL_GPL(ath79_device_reset_clear); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,26 @@ | ||
/* | ||
* Atheros AR71XX/AR724X/AR913X common definitions | ||
* | ||
* Copyright (C) 2008-2011 Gabor Juhos <juhosg@openwrt.org> | ||
* Copyright (C) 2008 Imre Kaloz <kaloz@openwrt.org> | ||
* | ||
* Parts of this file are based on Atheros' 2.6.15 BSP | ||
* | ||
* This program is free software; you can redistribute it and/or modify it | ||
* under the terms of the GNU General Public License version 2 as published | ||
* by the Free Software Foundation. | ||
*/ | ||
|
||
#ifndef __ATH79_COMMON_H | ||
#define __ATH79_COMMON_H | ||
|
||
#include <linux/types.h> | ||
#include <linux/init.h> | ||
|
||
#define ATH79_MEM_SIZE_MIN (2 * 1024 * 1024) | ||
#define ATH79_MEM_SIZE_MAX (128 * 1024 * 1024) | ||
|
||
void ath79_clocks_init(void); | ||
void ath79_ddr_wb_flush(unsigned int reg); | ||
|
||
#endif /* __ATH79_COMMON_H */ |
Oops, something went wrong.