mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-07-23 23:32:14 +00:00
MIPS: Add support for Texas Instruments AR7 System-on-a-Chip
This patch adds support for the Texas Instruments AR7 System-on-a-Chip. It supports the TNETD7100, 7200 and 7300 versions of the SoC. Signed-off-by: Matteo Croce <matteo@openwrt.org> Signed-off-by: Felix Fietkau <nbd@openwrt.org> Signed-off-by: Eugene Konev <ejka@openwrt.org> Signed-off-by: Nicolas Thill <nico@openwrt.org> Signed-off-by: Florian Fainelli <florian@openwrt.org> Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
This commit is contained in:
parent
7c5371c403
commit
7ca5dc145b
18 changed files with 3307 additions and 0 deletions
178
arch/mips/include/asm/mach-ar7/ar7.h
Normal file
178
arch/mips/include/asm/mach-ar7/ar7.h
Normal file
|
@ -0,0 +1,178 @@
|
|||
/*
|
||||
* Copyright (C) 2006,2007 Felix Fietkau <nbd@openwrt.org>
|
||||
* Copyright (C) 2006,2007 Eugene Konev <ejka@openwrt.org>
|
||||
*
|
||||
* 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, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
#ifndef __AR7_H__
|
||||
#define __AR7_H__
|
||||
|
||||
#include <linux/delay.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/errno.h>
|
||||
|
||||
#include <asm/addrspace.h>
|
||||
|
||||
#define AR7_SDRAM_BASE 0x14000000
|
||||
|
||||
#define AR7_REGS_BASE 0x08610000
|
||||
|
||||
#define AR7_REGS_MAC0 (AR7_REGS_BASE + 0x0000)
|
||||
#define AR7_REGS_GPIO (AR7_REGS_BASE + 0x0900)
|
||||
/* 0x08610A00 - 0x08610BFF (512 bytes, 128 bytes / clock) */
|
||||
#define AR7_REGS_POWER (AR7_REGS_BASE + 0x0a00)
|
||||
#define AR7_REGS_CLOCKS (AR7_REGS_POWER + 0x80)
|
||||
#define UR8_REGS_CLOCKS (AR7_REGS_POWER + 0x20)
|
||||
#define AR7_REGS_UART0 (AR7_REGS_BASE + 0x0e00)
|
||||
#define AR7_REGS_USB (AR7_REGS_BASE + 0x1200)
|
||||
#define AR7_REGS_RESET (AR7_REGS_BASE + 0x1600)
|
||||
#define AR7_REGS_VLYNQ0 (AR7_REGS_BASE + 0x1800)
|
||||
#define AR7_REGS_DCL (AR7_REGS_BASE + 0x1a00)
|
||||
#define AR7_REGS_VLYNQ1 (AR7_REGS_BASE + 0x1c00)
|
||||
#define AR7_REGS_MDIO (AR7_REGS_BASE + 0x1e00)
|
||||
#define AR7_REGS_IRQ (AR7_REGS_BASE + 0x2400)
|
||||
#define AR7_REGS_MAC1 (AR7_REGS_BASE + 0x2800)
|
||||
|
||||
#define AR7_REGS_WDT (AR7_REGS_BASE + 0x1f00)
|
||||
#define UR8_REGS_WDT (AR7_REGS_BASE + 0x0b00)
|
||||
#define UR8_REGS_UART1 (AR7_REGS_BASE + 0x0f00)
|
||||
|
||||
#define AR7_RESET_PEREPHERIAL 0x0
|
||||
#define AR7_RESET_SOFTWARE 0x4
|
||||
#define AR7_RESET_STATUS 0x8
|
||||
|
||||
#define AR7_RESET_BIT_CPMAC_LO 17
|
||||
#define AR7_RESET_BIT_CPMAC_HI 21
|
||||
#define AR7_RESET_BIT_MDIO 22
|
||||
#define AR7_RESET_BIT_EPHY 26
|
||||
|
||||
/* GPIO control registers */
|
||||
#define AR7_GPIO_INPUT 0x0
|
||||
#define AR7_GPIO_OUTPUT 0x4
|
||||
#define AR7_GPIO_DIR 0x8
|
||||
#define AR7_GPIO_ENABLE 0xc
|
||||
|
||||
#define AR7_CHIP_7100 0x18
|
||||
#define AR7_CHIP_7200 0x2b
|
||||
#define AR7_CHIP_7300 0x05
|
||||
|
||||
/* Interrupts */
|
||||
#define AR7_IRQ_UART0 15
|
||||
#define AR7_IRQ_UART1 16
|
||||
|
||||
/* Clocks */
|
||||
#define AR7_AFE_CLOCK 35328000
|
||||
#define AR7_REF_CLOCK 25000000
|
||||
#define AR7_XTAL_CLOCK 24000000
|
||||
|
||||
struct plat_cpmac_data {
|
||||
int reset_bit;
|
||||
int power_bit;
|
||||
u32 phy_mask;
|
||||
char dev_addr[6];
|
||||
};
|
||||
|
||||
struct plat_dsl_data {
|
||||
int reset_bit_dsl;
|
||||
int reset_bit_sar;
|
||||
};
|
||||
|
||||
extern int ar7_cpu_clock, ar7_bus_clock, ar7_dsp_clock;
|
||||
|
||||
static inline u16 ar7_chip_id(void)
|
||||
{
|
||||
return readl((void *)KSEG1ADDR(AR7_REGS_GPIO + 0x14)) & 0xffff;
|
||||
}
|
||||
|
||||
static inline u8 ar7_chip_rev(void)
|
||||
{
|
||||
return (readl((void *)KSEG1ADDR(AR7_REGS_GPIO + 0x14)) >> 16) & 0xff;
|
||||
}
|
||||
|
||||
static inline int ar7_cpu_freq(void)
|
||||
{
|
||||
return ar7_cpu_clock;
|
||||
}
|
||||
|
||||
static inline int ar7_bus_freq(void)
|
||||
{
|
||||
return ar7_bus_clock;
|
||||
}
|
||||
|
||||
static inline int ar7_vbus_freq(void)
|
||||
{
|
||||
return ar7_bus_clock / 2;
|
||||
}
|
||||
#define ar7_cpmac_freq ar7_vbus_freq
|
||||
|
||||
static inline int ar7_dsp_freq(void)
|
||||
{
|
||||
return ar7_dsp_clock;
|
||||
}
|
||||
|
||||
static inline int ar7_has_high_cpmac(void)
|
||||
{
|
||||
u16 chip_id = ar7_chip_id();
|
||||
switch (chip_id) {
|
||||
case AR7_CHIP_7100:
|
||||
case AR7_CHIP_7200:
|
||||
return 0;
|
||||
case AR7_CHIP_7300:
|
||||
return 1;
|
||||
default:
|
||||
return -ENXIO;
|
||||
}
|
||||
}
|
||||
#define ar7_has_high_vlynq ar7_has_high_cpmac
|
||||
#define ar7_has_second_uart ar7_has_high_cpmac
|
||||
|
||||
static inline void ar7_device_enable(u32 bit)
|
||||
{
|
||||
void *reset_reg =
|
||||
(void *)KSEG1ADDR(AR7_REGS_RESET + AR7_RESET_PEREPHERIAL);
|
||||
writel(readl(reset_reg) | (1 << bit), reset_reg);
|
||||
msleep(20);
|
||||
}
|
||||
|
||||
static inline void ar7_device_disable(u32 bit)
|
||||
{
|
||||
void *reset_reg =
|
||||
(void *)KSEG1ADDR(AR7_REGS_RESET + AR7_RESET_PEREPHERIAL);
|
||||
writel(readl(reset_reg) & ~(1 << bit), reset_reg);
|
||||
msleep(20);
|
||||
}
|
||||
|
||||
static inline void ar7_device_reset(u32 bit)
|
||||
{
|
||||
ar7_device_disable(bit);
|
||||
ar7_device_enable(bit);
|
||||
}
|
||||
|
||||
static inline void ar7_device_on(u32 bit)
|
||||
{
|
||||
void *power_reg = (void *)KSEG1ADDR(AR7_REGS_POWER);
|
||||
writel(readl(power_reg) | (1 << bit), power_reg);
|
||||
msleep(20);
|
||||
}
|
||||
|
||||
static inline void ar7_device_off(u32 bit)
|
||||
{
|
||||
void *power_reg = (void *)KSEG1ADDR(AR7_REGS_POWER);
|
||||
writel(readl(power_reg) & ~(1 << bit), power_reg);
|
||||
msleep(20);
|
||||
}
|
||||
|
||||
#endif /* __AR7_H__ */
|
110
arch/mips/include/asm/mach-ar7/gpio.h
Normal file
110
arch/mips/include/asm/mach-ar7/gpio.h
Normal file
|
@ -0,0 +1,110 @@
|
|||
/*
|
||||
* Copyright (C) 2007 Florian Fainelli <florian@openwrt.org>
|
||||
*
|
||||
* 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, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
#ifndef __AR7_GPIO_H__
|
||||
#define __AR7_GPIO_H__
|
||||
|
||||
#include <asm/mach-ar7/ar7.h>
|
||||
|
||||
#define AR7_GPIO_MAX 32
|
||||
|
||||
extern int gpio_request(unsigned gpio, const char *label);
|
||||
extern void gpio_free(unsigned gpio);
|
||||
|
||||
/* Common GPIO layer */
|
||||
static inline int gpio_get_value(unsigned gpio)
|
||||
{
|
||||
void __iomem *gpio_in =
|
||||
(void __iomem *)KSEG1ADDR(AR7_REGS_GPIO + AR7_GPIO_INPUT);
|
||||
|
||||
return readl(gpio_in) & (1 << gpio);
|
||||
}
|
||||
|
||||
static inline void gpio_set_value(unsigned gpio, int value)
|
||||
{
|
||||
void __iomem *gpio_out =
|
||||
(void __iomem *)KSEG1ADDR(AR7_REGS_GPIO + AR7_GPIO_OUTPUT);
|
||||
unsigned tmp;
|
||||
|
||||
tmp = readl(gpio_out) & ~(1 << gpio);
|
||||
if (value)
|
||||
tmp |= 1 << gpio;
|
||||
writel(tmp, gpio_out);
|
||||
}
|
||||
|
||||
static inline int gpio_direction_input(unsigned gpio)
|
||||
{
|
||||
void __iomem *gpio_dir =
|
||||
(void __iomem *)KSEG1ADDR(AR7_REGS_GPIO + AR7_GPIO_DIR);
|
||||
|
||||
if (gpio >= AR7_GPIO_MAX)
|
||||
return -EINVAL;
|
||||
|
||||
writel(readl(gpio_dir) | (1 << gpio), gpio_dir);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int gpio_direction_output(unsigned gpio, int value)
|
||||
{
|
||||
void __iomem *gpio_dir =
|
||||
(void __iomem *)KSEG1ADDR(AR7_REGS_GPIO + AR7_GPIO_DIR);
|
||||
|
||||
if (gpio >= AR7_GPIO_MAX)
|
||||
return -EINVAL;
|
||||
|
||||
gpio_set_value(gpio, value);
|
||||
writel(readl(gpio_dir) & ~(1 << gpio), gpio_dir);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int gpio_to_irq(unsigned gpio)
|
||||
{
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
static inline int irq_to_gpio(unsigned irq)
|
||||
{
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/* Board specific GPIO functions */
|
||||
static inline int ar7_gpio_enable(unsigned gpio)
|
||||
{
|
||||
void __iomem *gpio_en =
|
||||
(void __iomem *)KSEG1ADDR(AR7_REGS_GPIO + AR7_GPIO_ENABLE);
|
||||
|
||||
writel(readl(gpio_en) | (1 << gpio), gpio_en);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int ar7_gpio_disable(unsigned gpio)
|
||||
{
|
||||
void __iomem *gpio_en =
|
||||
(void __iomem *)KSEG1ADDR(AR7_REGS_GPIO + AR7_GPIO_ENABLE);
|
||||
|
||||
writel(readl(gpio_en) & ~(1 << gpio), gpio_en);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#include <asm-generic/gpio.h>
|
||||
|
||||
#endif
|
16
arch/mips/include/asm/mach-ar7/irq.h
Normal file
16
arch/mips/include/asm/mach-ar7/irq.h
Normal file
|
@ -0,0 +1,16 @@
|
|||
/*
|
||||
* This file is subject to the terms and conditions of the GNU General Public
|
||||
* License. See the file "COPYING" in the main directory of this archive
|
||||
* for more details.
|
||||
*
|
||||
* Shamelessly copied from asm-mips/mach-emma2rh/
|
||||
* Copyright (C) 2003 by Ralf Baechle
|
||||
*/
|
||||
#ifndef __ASM_AR7_IRQ_H
|
||||
#define __ASM_AR7_IRQ_H
|
||||
|
||||
#define NR_IRQS 256
|
||||
|
||||
#include_next <irq.h>
|
||||
|
||||
#endif /* __ASM_AR7_IRQ_H */
|
25
arch/mips/include/asm/mach-ar7/prom.h
Normal file
25
arch/mips/include/asm/mach-ar7/prom.h
Normal file
|
@ -0,0 +1,25 @@
|
|||
/*
|
||||
* Copyright (C) 2006, 2007 Florian Fainelli <florian@openwrt.org>
|
||||
*
|
||||
* 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, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
#ifndef __PROM_H__
|
||||
#define __PROM_H__
|
||||
|
||||
extern char *prom_getenv(const char *name);
|
||||
extern void prom_meminit(void);
|
||||
|
||||
#endif /* __PROM_H__ */
|
22
arch/mips/include/asm/mach-ar7/spaces.h
Normal file
22
arch/mips/include/asm/mach-ar7/spaces.h
Normal file
|
@ -0,0 +1,22 @@
|
|||
/*
|
||||
* This file is subject to the terms and conditions of the GNU General Public
|
||||
* License. See the file "COPYING" in the main directory of this archive
|
||||
* for more details.
|
||||
*
|
||||
* Copyright (C) 1994 - 1999, 2000, 03, 04 Ralf Baechle
|
||||
* Copyright (C) 2000, 2002 Maciej W. Rozycki
|
||||
* Copyright (C) 1990, 1999, 2000 Silicon Graphics, Inc.
|
||||
*/
|
||||
#ifndef _ASM_AR7_SPACES_H
|
||||
#define _ASM_AR7_SPACES_H
|
||||
|
||||
/*
|
||||
* This handles the memory map.
|
||||
* We handle pages at KSEG0 for kernels with 32 bit address space.
|
||||
*/
|
||||
#define PAGE_OFFSET 0x94000000UL
|
||||
#define PHYS_OFFSET 0x14000000UL
|
||||
|
||||
#include <asm/mach-generic/spaces.h>
|
||||
|
||||
#endif /* __ASM_AR7_SPACES_H */
|
25
arch/mips/include/asm/mach-ar7/war.h
Normal file
25
arch/mips/include/asm/mach-ar7/war.h
Normal file
|
@ -0,0 +1,25 @@
|
|||
/*
|
||||
* This file is subject to the terms and conditions of the GNU General Public
|
||||
* License. See the file "COPYING" in the main directory of this archive
|
||||
* for more details.
|
||||
*
|
||||
* Copyright (C) 2002, 2004, 2007 by Ralf Baechle <ralf@linux-mips.org>
|
||||
*/
|
||||
#ifndef __ASM_MIPS_MACH_AR7_WAR_H
|
||||
#define __ASM_MIPS_MACH_AR7_WAR_H
|
||||
|
||||
#define R4600_V1_INDEX_ICACHEOP_WAR 0
|
||||
#define R4600_V1_HIT_CACHEOP_WAR 0
|
||||
#define R4600_V2_HIT_CACHEOP_WAR 0
|
||||
#define R5432_CP0_INTERRUPT_WAR 0
|
||||
#define BCM1250_M3_WAR 0
|
||||
#define SIBYTE_1956_WAR 0
|
||||
#define MIPS4K_ICACHE_REFILL_WAR 0
|
||||
#define MIPS_CACHE_SYNC_WAR 0
|
||||
#define TX49XX_ICACHE_INDEX_INV_WAR 0
|
||||
#define RM9000_CDEX_SMP_WAR 0
|
||||
#define ICACHE_REFILLS_WORKAROUND_WAR 0
|
||||
#define R10000_LLSC_WAR 0
|
||||
#define MIPS34K_MISSED_ITLB_WAR 0
|
||||
|
||||
#endif /* __ASM_MIPS_MACH_AR7_WAR_H */
|
Loading…
Add table
Add a link
Reference in a new issue