From mboxrd@z Thu Jan 1 00:00:00 1970 From: Tom Rix Date: Tue, 27 Apr 2010 09:37:44 -0500 Subject: [U-Boot] [PATCH v5 2/3] ARM1176: TI: TNETV107X soc initial support In-Reply-To: <1271687391-22001-3-git-send-email-cyril@ti.com> References: <1271687391-22001-1-git-send-email-cyril@ti.com> <1271687391-22001-2-git-send-email-cyril@ti.com> <1271687391-22001-3-git-send-email-cyril@ti.com> Message-ID: <4BD6F6B8.3090503@bumblecow.com> List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: u-boot@lists.denx.de Cyril Chemparathy wrote: > TNETV107X is a Texas Instruments SoC based on an ARM1176 core, and with a > bunch on on-chip integrated peripherals. This is an initial commit with > basic functionality, more commits with drivers, etc. to follow. > > Signed-off-by: Cyril Chemparathy > --- > v5: rebased on master in u-boot-arm.git > v4: rebased on next in u-boot-arm.git (unchanged) > v3: unchanged from v2 > v2: macroized aemif configuration to reduce verbosity > v2: consolidated lpsc utilities, inlined clock enable/disable > > arch/arm/cpu/arm1176/tnetv107x/Makefile | 44 ++ > arch/arm/cpu/arm1176/tnetv107x/aemif.c | 151 +++++++ > arch/arm/cpu/arm1176/tnetv107x/clock.c | 542 +++++++++++++++++++++++ > arch/arm/cpu/arm1176/tnetv107x/init.c | 41 ++ > arch/arm/cpu/arm1176/tnetv107x/lowlevel_init.S | 25 + > arch/arm/cpu/arm1176/tnetv107x/mux.c | 463 +++++++++++++++++++ > arch/arm/cpu/arm1176/tnetv107x/timer.c | 125 ++++++ > arch/arm/cpu/arm1176/tnetv107x/wdt.c | 172 +++++++ > arch/arm/include/asm/arch-tnetv107x/clock.h | 50 ++ > arch/arm/include/asm/arch-tnetv107x/emif_defs.h | 1 + > arch/arm/include/asm/arch-tnetv107x/hardware.h | 184 ++++++++ > arch/arm/include/asm/arch-tnetv107x/mux.h | 307 +++++++++++++ > arch/arm/include/asm/arch-tnetv107x/nand_defs.h | 38 ++ > 13 files changed, 2143 insertions(+), 0 deletions(-) > create mode 100644 arch/arm/cpu/arm1176/tnetv107x/Makefile > create mode 100644 arch/arm/cpu/arm1176/tnetv107x/aemif.c > create mode 100644 arch/arm/cpu/arm1176/tnetv107x/clock.c > create mode 100644 arch/arm/cpu/arm1176/tnetv107x/init.c > create mode 100644 arch/arm/cpu/arm1176/tnetv107x/lowlevel_init.S > create mode 100644 arch/arm/cpu/arm1176/tnetv107x/mux.c > create mode 100644 arch/arm/cpu/arm1176/tnetv107x/timer.c > create mode 100644 arch/arm/cpu/arm1176/tnetv107x/wdt.c > create mode 100644 arch/arm/include/asm/arch-tnetv107x/clock.h > create mode 100644 arch/arm/include/asm/arch-tnetv107x/emif_defs.h > create mode 100644 arch/arm/include/asm/arch-tnetv107x/hardware.h > create mode 100644 arch/arm/include/asm/arch-tnetv107x/mux.h > create mode 100644 arch/arm/include/asm/arch-tnetv107x/nand_defs.h > > diff --git a/arch/arm/cpu/arm1176/tnetv107x/Makefile b/arch/arm/cpu/arm1176/tnetv107x/Makefile > new file mode 100644 > index 0000000..fe9d8a0 > --- /dev/null > +++ b/arch/arm/cpu/arm1176/tnetv107x/Makefile > @@ -0,0 +1,44 @@ > +# > +# See file CREDITS for list of people who contributed to this > +# project. > +# > +# 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., 675 Mass Ave, Cambridge, MA 02139, USA. > +# > + > +include $(TOPDIR)/config.mk > + > +LIB = $(obj)lib$(SOC).a > + > +COBJS += aemif.o clock.o init.o mux.o timer.o wdt.o > +SOBJS += lowlevel_init.o > + > +SRCS := $(START:.o=.S) $(SOBJS:.o=.S) $(COBJS:.o=.c) > + > +OBJS := $(addprefix $(obj),$(COBJS) $(SOBJS)) > +START := $(addprefix $(obj),$(START)) > + > +all: $(obj).depend $(LIB) > + > +$(LIB): $(OBJS) > + $(AR) $(ARFLAGS) $@ $(OBJS) > + > +######################################################################### > + > +# defines $(obj).depend target > +include $(SRCTREE)/rules.mk > + > +sinclude $(obj).depend > + > +######################################################################### > diff --git a/arch/arm/cpu/arm1176/tnetv107x/aemif.c b/arch/arm/cpu/arm1176/tnetv107x/aemif.c > new file mode 100644 > index 0000000..ae512b0 > --- /dev/null > +++ b/arch/arm/cpu/arm1176/tnetv107x/aemif.c > @@ -0,0 +1,151 @@ > +/* > + * TNETV107X: Asynchronous EMIF Configuration > + * > + * See file CREDITS for list of people who contributed to this > + * project. > + * > + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. > + */ > + > +#include > +#include > +#include > +#include > + > +#define ASYNC_EMIF_BASE TNETV107X_ASYNC_EMIF_CNTRL_BASE > +#define ASYNC_EMIF_CONFIG(cs) (ASYNC_EMIF_BASE+0x10+(cs)*4) > +#define ASYNC_EMIF_ONENAND_CONTROL (ASYNC_EMIF_BASE+0x5c) > +#define ASYNC_EMIF_NAND_CONTROL (ASYNC_EMIF_BASE+0x60) > +#define ASYNC_EMIF_WAITCYCLE_CONFIG (ASYNC_EMIF_BASE+0x4) > + > +#define CONFIG_SELECT_STROBE(v) ((v) ? 1 << 31 : 0) > +#define CONFIG_EXTEND_WAIT(v) ((v) ? 1 << 30 : 0) > +#define CONFIG_WR_SETUP(v) (((v) & 0x0f) << 26) > +#define CONFIG_WR_STROBE(v) (((v) & 0x3f) << 20) > +#define CONFIG_WR_HOLD(v) (((v) & 0x07) << 17) > +#define CONFIG_RD_SETUP(v) (((v) & 0x0f) << 13) > +#define CONFIG_RD_STROBE(v) (((v) & 0x3f) << 7) > +#define CONFIG_RD_HOLD(v) (((v) & 0x07) << 4) > +#define CONFIG_TURN_AROUND(v) (((v) & 0x03) << 2) > +#define CONFIG_WIDTH(v) (((v) & 0x03) << 0) > + > +#define NUM_CS 4 > +#define MASK 0xffffffff MASK is only used once. It would be ok to just use 0xffffffff here. > + > +#define set_config_field(reg, field, val) \ > + do { \ > + if (val != -1) { \ > + reg &= ~CONFIG_##field(MASK); \ > + reg |= CONFIG_##field(val); \ > + } \ > + } while (0) > + > +static struct async_emif_config default_async_emif_config[NUM_CS] = { > + { /* CS0 */ > + .mode = ASYNC_EMIF_MODE_NAND, > + .select_strobe = ASYNC_EMIF_CS0_SELECT_STROBE, > + .extend_wait = ASYNC_EMIF_CS0_EXTEND_WAIT, > + .wr_setup = ASYNC_EMIF_CS0_WR_SETUP, > + .wr_strobe = ASYNC_EMIF_CS0_WR_STROBE, > + .wr_hold = ASYNC_EMIF_CS0_WR_HOLD, > + .rd_setup = ASYNC_EMIF_CS0_RD_SETUP, > + .rd_strobe = ASYNC_EMIF_CS0_RD_STROBE, > + .rd_hold = ASYNC_EMIF_CS0_RD_HOLD, > + .turn_around = ASYNC_EMIF_CS0_TURN_AROUND, > + .width = ASYNC_EMIF_CS0_WIDTH, > + }, > + { /* CS1 */ > + .mode = ASYNC_EMIF_MODE_NOR, > + .select_strobe = ASYNC_EMIF_CS1_SELECT_STROBE, > + .extend_wait = ASYNC_EMIF_CS1_EXTEND_WAIT, > + .wr_setup = ASYNC_EMIF_CS1_WR_SETUP, > + .wr_strobe = ASYNC_EMIF_CS1_WR_STROBE, > + .wr_hold = ASYNC_EMIF_CS1_WR_HOLD, > + .rd_setup = ASYNC_EMIF_CS1_RD_SETUP, > + .rd_strobe = ASYNC_EMIF_CS1_RD_STROBE, > + .rd_hold = ASYNC_EMIF_CS1_RD_HOLD, > + .turn_around = ASYNC_EMIF_CS1_TURN_AROUND, > + .width = ASYNC_EMIF_CS1_WIDTH, > + }, > + { /* CS2 */ > + .mode = ASYNC_EMIF_MODE_NOR, > + .select_strobe = ASYNC_EMIF_CS2_SELECT_STROBE, > + .extend_wait = ASYNC_EMIF_CS2_EXTEND_WAIT, > + .wr_setup = ASYNC_EMIF_CS2_WR_SETUP, > + .wr_strobe = ASYNC_EMIF_CS2_WR_STROBE, > + .wr_hold = ASYNC_EMIF_CS2_WR_HOLD, > + .rd_setup = ASYNC_EMIF_CS2_RD_SETUP, > + .rd_strobe = ASYNC_EMIF_CS2_RD_STROBE, > + .rd_hold = ASYNC_EMIF_CS2_RD_HOLD, > + .turn_around = ASYNC_EMIF_CS2_TURN_AROUND, > + .width = ASYNC_EMIF_CS2_WIDTH, > + }, > + { /* CS3 */ > + .mode = ASYNC_EMIF_MODE_NOR, > + .select_strobe = ASYNC_EMIF_CS3_SELECT_STROBE, > + .extend_wait = ASYNC_EMIF_CS3_EXTEND_WAIT, > + .wr_setup = ASYNC_EMIF_CS3_WR_SETUP, > + .wr_strobe = ASYNC_EMIF_CS3_WR_STROBE, > + .wr_hold = ASYNC_EMIF_CS3_WR_HOLD, > + .rd_setup = ASYNC_EMIF_CS3_RD_SETUP, > + .rd_strobe = ASYNC_EMIF_CS3_RD_STROBE, > + .rd_hold = ASYNC_EMIF_CS3_RD_HOLD, > + .turn_around = ASYNC_EMIF_CS3_TURN_AROUND, > + .width = ASYNC_EMIF_CS3_WIDTH, > + }, > +}; > + A better place for all the preceding code would be in an arch *.h The NUM_CS should likely be a CONFIG_ paramter. > +void configure_async_emif(int cs, struct async_emif_config *cfg) > +{ > + unsigned long tmp; > + > + if (cfg->mode == ASYNC_EMIF_MODE_NAND) { > + tmp = __raw_readl(ASYNC_EMIF_NAND_CONTROL); > + tmp |= (1 << cs); > + __raw_writel(tmp, ASYNC_EMIF_NAND_CONTROL); > + > + } else if (cfg->mode == ASYNC_EMIF_MODE_ONENAND) { > + tmp = __raw_readl(ASYNC_EMIF_ONENAND_CONTROL); > + tmp |= (1 << cs); > + __raw_writel(tmp, ASYNC_EMIF_ONENAND_CONTROL); > + } > + > + tmp = __raw_readl(ASYNC_EMIF_CONFIG(cs)); > + > + set_config_field(tmp, SELECT_STROBE, cfg->select_strobe); > + set_config_field(tmp, EXTEND_WAIT, cfg->extend_wait); > + set_config_field(tmp, WR_SETUP, cfg->wr_setup); > + set_config_field(tmp, WR_STROBE, cfg->wr_strobe); > + set_config_field(tmp, WR_HOLD, cfg->wr_hold); > + set_config_field(tmp, RD_SETUP, cfg->rd_setup); > + set_config_field(tmp, RD_STROBE, cfg->rd_strobe); > + set_config_field(tmp, RD_HOLD, cfg->rd_hold); > + set_config_field(tmp, TURN_AROUND, cfg->turn_around); > + set_config_field(tmp, WIDTH, cfg->width); > + > + __raw_writel(tmp, ASYNC_EMIF_CONFIG(cs)); > +} > + > +void init_async_emif(void) > +{ > + int cs; > + > + mux_select_pin(TNETV107X_PIN_ASR_CS3); > + > + clk_enable(TNETV107X_LPSC_AEMIF); > + > + for (cs = 0; cs < NUM_CS; cs++) > + configure_async_emif(cs, &default_async_emif_config[cs]); > +} > diff --git a/arch/arm/cpu/arm1176/tnetv107x/clock.c b/arch/arm/cpu/arm1176/tnetv107x/clock.c > new file mode 100644 > index 0000000..861cea1 > --- /dev/null > +++ b/arch/arm/cpu/arm1176/tnetv107x/clock.c > @@ -0,0 +1,542 @@ > +/* > + * TNETV107X: Clock management APIs > + * > + * See file CREDITS for list of people who contributed to this > + * project. > + * > + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. > + */ > + > +#include > +#include > +#include > + > +#define CLOCK_BASE TNETV107X_CLOCK_CONTROL_BASE > +#define PSC_BASE TNETV107X_PSC_BASE > + > +#define MAX_PREDIV 64 > +#define MAX_POSTDIV 8 > +#define MAX_MULT 512 > +#define MAX_DIV (MAX_PREDIV * MAX_POSTDIV) > + > +/* LPSC registers */ > +#define PSC_PTCMD 0x120 > +#define PSC_PTSTAT 0x128 > +#define PSC_MDSTAT(n) (0x800 + (n) * 4) > +#define PSC_MDCTL(n) (0xA00 + (n) * 4) > + > +#define psc_reg_read(reg) __raw_readl((u32 *)(PSC_BASE + (reg))) > +#define psc_reg_write(reg, val) __raw_writel(val, (u32 *)(PSC_BASE + (reg))) > + > +/* PLL identifiers */ > +enum pll_type_e { > + SYS_PLL, > + TDM_PLL, > + ETH_PLL > +}; > + > +/* PLL configuration data */ > +struct pll_init_data { > + int config_enable; > + int pll; > + int internal_osc; > + unsigned long external_freq; > + unsigned long pll_freq; > + unsigned long div_freq[10]; > +}; > + > +/* SSPLL registers */ > +struct sspll_regs { > + u32 modes; > + u32 postdiv; > + u32 prediv; > + u32 mult_factor; > + u32 divider_range; > + u32 bw_divider; > + u32 spr_amount; > + u32 spr_rate_div; > + u32 diag; > +}; > + > +/* SSPLL base addresses */ > +static struct sspll_regs *sspll_regs[] = { > + (struct sspll_regs *)(CLOCK_BASE + 0x040), > + (struct sspll_regs *)(CLOCK_BASE + 0x080), > + (struct sspll_regs *)(CLOCK_BASE + 0x0c0), > +}; > + > +#define sspll_reg(pll, reg) (&(sspll_regs[pll]->reg)) > +#define sspll_reg_read(pll, reg) __raw_readl(sspll_reg(pll, reg)) > +#define sspll_reg_write(pll, reg, val) __raw_writel(val, sspll_reg(pll, reg)) > + > + > +/* PLL Control Registers */ > +struct pllctl_regs { > + u32 ctl; /* 00 */ > + u32 ocsel; /* 04 */ > + u32 secctl; /* 08 */ > + u32 __pad0; > + u32 mult; /* 10 */ > + u32 prediv; /* 14 */ > + u32 div1; /* 18 */ > + u32 div2; /* 1c */ > + u32 div3; /* 20 */ > + u32 oscdiv1; /* 24 */ > + u32 postdiv; /* 28 */ > + u32 bpdiv; /* 2c */ > + u32 wakeup; /* 30 */ > + u32 __pad1; > + u32 cmd; /* 38 */ > + u32 stat; /* 3c */ > + u32 alnctl; /* 40 */ > + u32 dchange; /* 44 */ > + u32 cken; /* 48 */ > + u32 ckstat; /* 4c */ > + u32 systat; /* 50 */ > + u32 ckctl; /* 54 */ > + u32 __pad2[2]; > + u32 div4; /* 60 */ > + u32 div5; /* 64 */ > + u32 div6; /* 68 */ > + u32 div7; /* 6c */ > + u32 div8; /* 70 */ > +}; > + > +struct lpsc_map { > + int pll, div; > +}; > + > +static struct pllctl_regs *pllctl_regs[] = { > + (struct pllctl_regs *)(CLOCK_BASE + 0x700), > + (struct pllctl_regs *)(CLOCK_BASE + 0x300), > + (struct pllctl_regs *)(CLOCK_BASE + 0x500), > +}; > + > +#define pllctl_reg(pll, reg) (&(pllctl_regs[pll]->reg)) > +#define pllctl_reg_read(pll, reg) __raw_readl(pllctl_reg(pll, reg)) > +#define pllctl_reg_write(pll, reg, val) __raw_writel(val, pllctl_reg(pll, reg)) > + > +#define pllctl_reg_rmw(pll, reg, mask, val) \ > + pllctl_reg_write(pll, reg, \ > + (pllctl_reg_read(pll, reg) & ~(mask)) | val) > + > +#define pllctl_reg_setbits(pll, reg, mask) \ > + pllctl_reg_rmw(pll, reg, 0, mask) > + > +#define pllctl_reg_clrbits(pll, reg, mask) \ > + pllctl_reg_rmw(pll, reg, mask, 0) > + > +/* PLLCTL Bits */ > +#define PLLCTL_CLKMODE (0x1 << 8) > +#define PLLCTL_PLLSELB (0x1 << 7) > +#define PLLCTL_PLLENSRC (0x1 << 5) > +#define PLLCTL_PLLDIS (0x1 << 4) > +#define PLLCTL_PLLRST (0x1 << 3) > +#define PLLCTL_PLLPWRDN (0x1 << 1) > +#define PLLCTL_PLLEN (0x1 << 0) > + > +static int pll_div_offset[] = { > +#define div_offset(reg) offsetof(struct pllctl_regs, reg) > + div_offset(div1), div_offset(div2), div_offset(div3), > + div_offset(div4), div_offset(div5), div_offset(div6), > + div_offset(div7), div_offset(div8), > +}; > + > +static unsigned long pll_bypass_mask[] = { 1, 4, 2 }; > +static unsigned long pll_div_mask[] = { 0x01ff, 0x00ff, 0x00ff }; > + > +/* Mappings from PLL+DIV to subsystem clocks */ > +#define sys_arm1176_clk {SYS_PLL, 0} > +#define sys_dsp_clk {SYS_PLL, 1} > +#define sys_ddr_clk {SYS_PLL, 2} > +#define sys_full_clk {SYS_PLL, 3} > +#define sys_lcd_clk {SYS_PLL, 4} > +#define sys_vlynq_ref_clk {SYS_PLL, 5} > +#define sys_tsc_clk {SYS_PLL, 6} > +#define sys_half_clk {SYS_PLL, 7} > + > +#define eth_clk_5 {ETH_PLL, 0} > +#define eth_clk_50 {ETH_PLL, 1} > +#define eth_clk_125 {ETH_PLL, 2} > +#define eth_clk_250 {ETH_PLL, 3} > +#define eth_clk_25 {ETH_PLL, 4} > + > +#define tdm_clk {TDM_PLL, 0} > +#define tdm_extra_clk {TDM_PLL, 1} > +#define tdm1_clk {TDM_PLL, 2} > + > +static const struct lpsc_map lpsc_clk_map[] = { > + [TNETV107X_LPSC_ARM] = sys_arm1176_clk, > + [TNETV107X_LPSC_GEM] = sys_dsp_clk, > + [TNETV107X_LPSC_DDR2_PHY] = sys_ddr_clk, > + [TNETV107X_LPSC_TPCC] = sys_full_clk, > + [TNETV107X_LPSC_TPTC0] = sys_full_clk, > + [TNETV107X_LPSC_TPTC1] = sys_full_clk, > + [TNETV107X_LPSC_RAM] = sys_full_clk, > + [TNETV107X_LPSC_MBX_LITE] = sys_arm1176_clk, > + [TNETV107X_LPSC_LCD] = sys_lcd_clk, > + [TNETV107X_LPSC_ETHSS] = eth_clk_125, > + [TNETV107X_LPSC_AEMIF] = sys_full_clk, > + [TNETV107X_LPSC_CHIP_CFG] = sys_half_clk, > + [TNETV107X_LPSC_TSC] = sys_tsc_clk, > + [TNETV107X_LPSC_ROM] = sys_half_clk, > + [TNETV107X_LPSC_UART2] = sys_half_clk, > + [TNETV107X_LPSC_PKTSEC] = sys_half_clk, > + [TNETV107X_LPSC_SECCTL] = sys_half_clk, > + [TNETV107X_LPSC_KEYMGR] = sys_half_clk, > + [TNETV107X_LPSC_KEYPAD] = sys_half_clk, > + [TNETV107X_LPSC_GPIO] = sys_half_clk, > + [TNETV107X_LPSC_MDIO] = sys_half_clk, > + [TNETV107X_LPSC_SDIO0] = sys_half_clk, > + [TNETV107X_LPSC_UART0] = sys_half_clk, > + [TNETV107X_LPSC_UART1] = sys_half_clk, > + [TNETV107X_LPSC_TIMER0] = sys_half_clk, > + [TNETV107X_LPSC_TIMER1] = sys_half_clk, > + [TNETV107X_LPSC_WDT_ARM] = sys_half_clk, > + [TNETV107X_LPSC_WDT_DSP] = sys_half_clk, > + [TNETV107X_LPSC_SSP] = sys_half_clk, > + [TNETV107X_LPSC_TDM0] = tdm_clk, > + [TNETV107X_LPSC_VLYNQ] = sys_vlynq_ref_clk, > + [TNETV107X_LPSC_MCDMA] = sys_half_clk, > + [TNETV107X_LPSC_USB0] = sys_half_clk, > + [TNETV107X_LPSC_TDM1] = tdm1_clk, > + [TNETV107X_LPSC_DEBUGSS] = sys_half_clk, > + [TNETV107X_LPSC_ETHSS_RGMII] = eth_clk_250, > + [TNETV107X_LPSC_SYSTEM] = sys_half_clk, > + [TNETV107X_LPSC_IMCOP] = sys_dsp_clk, > + [TNETV107X_LPSC_SPARE] = sys_half_clk, > + [TNETV107X_LPSC_SDIO1] = sys_half_clk, > + [TNETV107X_LPSC_USB1] = sys_half_clk, > + [TNETV107X_LPSC_USBSS] = sys_half_clk, > + [TNETV107X_LPSC_DDR2_EMIF1_VRST] = sys_ddr_clk, > + [TNETV107X_LPSC_DDR2_EMIF2_VCTL_RST] = sys_ddr_clk, > +}; > + > +static const struct pll_init_data plls[] = { > + [SYS_PLL] = { > + .config_enable = CONFIG_PLL_SYS_CONFIG, > + .pll = SYS_PLL, > + .internal_osc = CONFIG_PLL_SYS_INT_OSC, > + .external_freq = CONFIG_PLL_SYS_EXT_FREQ, > +#if (CONFIG_PLL_SYS_CONFIG) > + .pll_freq = CONFIG_PLL_SYS_PLL_FREQ, > + .div_freq = { > + CONFIG_PLL_SYS_ARM1176_CLK, > + CONFIG_PLL_SYS_DSP_CLK, > + CONFIG_PLL_SYS_DDR_CLK, > + CONFIG_PLL_SYS_FULL_CLK, > + CONFIG_PLL_SYS_LCD_CLK, > + CONFIG_PLL_SYS_VLYNQ_REF_CLK, > + CONFIG_PLL_SYS_TSC_CLK, > + CONFIG_PLL_SYS_HALF_CLK, > + }, > +#endif > + }, > + [TDM_PLL] = { > + .config_enable = CONFIG_PLL_TDM_CONFIG, > + .pll = TDM_PLL, > + .internal_osc = CONFIG_PLL_TDM_INT_OSC, > + .external_freq = CONFIG_PLL_TDM_EXT_FREQ, > +#if (CONFIG_PLL_TDM_CONFIG) > + .pll_freq = CONFIG_PLL_TDM_PLL_FREQ, > + .div_freq = { > + CONFIG_PLL_TDM_TDM0_CLK, > + CONFIG_PLL_TDM_TIMER_CLK, > + CONFIG_PLL_TDM_TDM1_CLK, > + }, > +#endif > + }, > + [ETH_PLL] = { > + .config_enable = CONFIG_PLL_ETH_CONFIG, > + .pll = ETH_PLL, > + .internal_osc = CONFIG_PLL_ETH_INT_OSC, > + .external_freq = CONFIG_PLL_ETH_EXT_FREQ, > +#if (CONFIG_PLL_ETH_CONFIG) > + .pll_freq = CONFIG_PLL_ETH_PLL_FREQ, > + .div_freq = { > + CONFIG_PLL_ETH_5_CLK, > + CONFIG_PLL_ETH_50_CLK, > + CONFIG_PLL_ETH_125_CLK, > + CONFIG_PLL_ETH_250_CLK, > + CONFIG_PLL_ETH_25_CLK, > + }, > +#endif > + }, > +}; > + Similar to above, the preceeding code is better placed in an arch *.h Please move. > +void clk_delay(void) > +{ > + int i; > + > + for (i = 0; i < 1000; i++) > + __asm__ __volatile__("mov r0, r0\n" : : : "memory"); > +} > + This delay is dependent on the clock frequency. Either generalize to use the clock frequency or add a detailed comment on the minimal expected delay time. > +static unsigned long pll_freq_get(int pll) > +{ > + unsigned long mult = 1, prediv = 1, postdiv = 1; > + unsigned long ref = CONFIG_SYS_INT_OSC_FREQ; > + unsigned long ret; > + u32 bypass; > + > + bypass = __raw_readl((u32 *)(CLOCK_BASE)); > + if (!(bypass & pll_bypass_mask[pll])) { > + mult = sspll_reg_read(pll, mult_factor); > + prediv = sspll_reg_read(pll, prediv) + 1; > + postdiv = sspll_reg_read(pll, postdiv) + 1; > + } > + > + if (pllctl_reg_read(pll, ctl) & PLLCTL_CLKMODE) > + ref = plls[pll].external_freq; > + > + if (!(pllctl_reg_read(pll, ctl) & PLLCTL_PLLEN)) > + return ref; > + > + ret = (unsigned long)(ref + ((unsigned long long)ref * mult) / 256); > + ret /= (prediv * postdiv); > + > + return ret; > +} > + > +static unsigned long __pll_div_freq_get(int pll, unsigned int fpll, > + int div) > +{ > + int divider = 1; > + unsigned long divreg; > + > + divreg = __raw_readl((void *)pllctl_regs[pll] + pll_div_offset[div]); > + > + if (divreg & (0x01 << 15)) > + divider = (divreg & pll_div_mask[pll]) + 1; This bit 0x01 << 15 should be a #define Add this to the appropriate arch *.h > + > + return fpll / divider; > +} > + > +static unsigned long pll_div_freq_get(int pll, int div) > +{ > + unsigned int fpll = pll_freq_get(pll); > + > + return __pll_div_freq_get(pll, fpll, div); > +} > + > +static void __pll_div_freq_set(int pll, unsigned int fpll, int div, > + unsigned long hz) > +{ > + int divider = (fpll / hz - 1); > + > + divider &= pll_div_mask[pll]; > + divider |= (0x01 << 15); /* enable */ > + Similar, this bit operation should be a #define. For other similar uses, fix globally > + __raw_writel(divider, (void *)pllctl_regs[pll] + pll_div_offset[div]); > + pllctl_reg_setbits(pll, alnctl, (1 << div)); > + pllctl_reg_setbits(pll, dchange, (1 << div)); > +} > + > +static unsigned long pll_div_freq_set(int pll, int div, unsigned long hz) > +{ > + unsigned int fpll = pll_freq_get(pll); > + > + __pll_div_freq_set(pll, fpll, div, hz); > + > + pllctl_reg_write(pll, cmd, 1); > + > + while (pllctl_reg_read(pll, stat) & 0x01) > + ; > + > + clk_delay(); > + > + return __pll_div_freq_get(pll, fpll, div); > +} > + > +unsigned long clk_get_rate(unsigned int clk) > +{ > + return pll_div_freq_get(lpsc_clk_map[clk].pll, lpsc_clk_map[clk].div); > +} > + > +long clk_round_rate(unsigned int clk, unsigned long hz) > +{ > + int fpll, divider, pll; > + May want to change type from int to long > + pll = lpsc_clk_map[clk].pll; > + fpll = pll_freq_get(pll); > + divider = (fpll / hz - 1); > + divider &= pll_div_mask[pll]; > + > + return fpll / (divider + 1); > +} > + > +int clk_set_rate(unsigned int clk, unsigned long _hz) > +{ > + unsigned long hz; > + > + hz = clk_round_rate(clk, _hz); > + if (hz != _hz) > + return -1; /* Cannot set to target freq */ > + > + return pll_div_freq_set(lpsc_clk_map[clk].pll, > + lpsc_clk_map[clk].div, hz); > +} > + > +static void __lpsc_set_state(int nmod, int lrstz, va_list args) > +{ va_list is not needed. Convert to normal parameter passing Other functions have similar calling. Apply this fix globally > + int i; > + u32 mdctl, state; > + unsigned int id; > + > + for (i = 0; i < nmod; i++) { > + id = va_arg(args, unsigned int); > + state = va_arg(args, u32); > + mdctl = psc_reg_read(PSC_MDCTL(id)); > + mdctl &= ~0x1f; > + mdctl |= state; > + if (lrstz == 0 || lrstz == 1) { > + mdctl &= ~(1 << 8); > + mdctl |= (lrstz << 8); Another example of bit operations Use #define > + } > + psc_reg_write(PSC_MDCTL(id), mdctl); > + } > +} > + > +static void __lpsc_wait_state(int nmod, va_list args) > +{ > + int i; > + u32 state; > + unsigned int id; > + > + for (i = 0; i < nmod; i++) { > + id = va_arg(args, unsigned int); > + state = va_arg(args, u32); > + while ((psc_reg_read(PSC_MDSTAT(id)) & 0x1f) != state) > + ; Add a comment about a busy wait. Apply this fix globally > + } > +} > + > +void lpsc_control(int nmod, int lrstz, ...) > +{ > + va_list args; No vargs > + > + va_start(args, lrstz); > + __lpsc_set_state(nmod, lrstz, args); > + va_end(args); > + > + psc_reg_write(PSC_PTCMD, 1); > + while (psc_reg_read(PSC_PTSTAT) & 1) > + ; > + > + va_start(args, lrstz); > + __lpsc_wait_state(nmod, args); > + va_end(args); > +} > + > +int lpsc_status(unsigned int id) > +{ > + return psc_reg_read(PSC_MDSTAT(id)) & 0x1f; > +} > + > +static void init_pll(const struct pll_init_data *data) > +{ > + unsigned long fpll; > + unsigned long best_pre = 0, best_post = 0, best_mult = 0; > + unsigned long div, prediv, postdiv, mult; > + unsigned long delta, actual; > + long best_delta = -1; > + int i; > + u32 tmp; > + > + if (!data->config_enable) > + return; > + > + tmp = pllctl_reg_read(data->pll, ctl); > + if (data->internal_osc) { > + tmp &= ~PLLCTL_CLKMODE; > + fpll = CONFIG_SYS_INT_OSC_FREQ; > + } else { > + tmp |= PLLCTL_CLKMODE; > + fpll = data->external_freq; > + } > + pllctl_reg_write(data->pll, ctl, tmp); > + > + mult = data->pll_freq / fpll; > + for (mult = MAX(mult, 1); mult <= MAX_MULT; mult++) { > + div = (fpll * mult) / data->pll_freq; > + if (div < 1 || div > MAX_DIV) > + continue; > + > + for (postdiv = 1; postdiv <= min(div, MAX_POSTDIV); postdiv++) { > + prediv = div / postdiv; > + if (prediv < 1 || prediv > MAX_PREDIV) > + continue; > + > + actual = (fpll / prediv) * (mult / postdiv); > + delta = (actual - data->pll_freq); > + delta = ABS(delta); > + if ((delta < best_delta) || (best_delta == -1)) { > + best_delta = delta; > + best_mult = mult; > + best_pre = prediv; > + best_post = postdiv; > + if (delta == 0) > + goto done; > + } > + } > + } Add a check that hursitics here produced a reasonable clock. If the best_* are not set, the last interation will likely be an error > +done: > + > + fpll = fpll * best_mult; > + fpll /= best_pre * best_post; > + > + pllctl_reg_clrbits(data->pll, ctl, PLLCTL_PLLENSRC); > + pllctl_reg_clrbits(data->pll, ctl, PLLCTL_PLLEN); > + > + clk_delay(); > + > + pllctl_reg_setbits(data->pll, ctl, PLLCTL_PLLRST); > + clk_delay(); > + > + pllctl_reg_clrbits(data->pll, ctl, PLLCTL_PLLPWRDN); > + pllctl_reg_clrbits(data->pll, ctl, PLLCTL_PLLDIS); > + clk_delay(); > + > + sspll_reg_write(data->pll, mult_factor, (best_mult - 1) << 8); > + sspll_reg_write(data->pll, prediv, best_pre - 1); > + sspll_reg_write(data->pll, postdiv, best_post - 1); > + > + for (i = 0; i < 10; i++) > + if (data->div_freq[i]) > + __pll_div_freq_set(data->pll, fpll, i, > + data->div_freq[i]); > + > + pllctl_reg_write(data->pll, cmd, 1); > + > + /* Wait for completion */ > + while (pllctl_reg_read(data->pll, stat) & 0x01) > + ; > + > + clk_delay(); > + > + pllctl_reg_clrbits(data->pll, ctl, PLLCTL_PLLRST); > + clk_delay(); > + > + pllctl_reg_setbits(data->pll, ctl, PLLCTL_PLLEN); > + clk_delay(); > +} > + > +void init_plls(void) > +{ > + int i; > + > + for (i = 0; i < ARRAY_SIZE(plls); i++) > + init_pll(&plls[i]); > +} > diff --git a/arch/arm/cpu/arm1176/tnetv107x/init.c b/arch/arm/cpu/arm1176/tnetv107x/init.c > new file mode 100644 > index 0000000..d906c72 > --- /dev/null > +++ b/arch/arm/cpu/arm1176/tnetv107x/init.c > @@ -0,0 +1,41 @@ > +/* > + * TNETV107X: Architecture initialization > + * > + * See file CREDITS for list of people who contributed to this > + * project. > + * > + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. > + */ > + > +#include > +#include > + > +void chip_configuration_unlock(void) > +{ > + __raw_writel(TNETV107X_KICK0_MAGIC, TNETV107X_KICK0); > + __raw_writel(TNETV107X_KICK1_MAGIC, TNETV107X_KICK1); > +} > + > +int arch_cpu_init(void) > +{ > + icache_enable(); > + chip_configuration_unlock(); > + init_plls(); > + init_timer(); > + init_async_emif(); > + init_wdt(); > + > + return 0; > +} > diff --git a/arch/arm/cpu/arm1176/tnetv107x/lowlevel_init.S b/arch/arm/cpu/arm1176/tnetv107x/lowlevel_init.S > new file mode 100644 > index 0000000..3ee32ef > --- /dev/null > +++ b/arch/arm/cpu/arm1176/tnetv107x/lowlevel_init.S > @@ -0,0 +1,25 @@ > +/* > + * TNETV107X: Low-level pre-relocation initialization > + * > + * See file CREDITS for list of people who contributed to this > + * project. > + * > + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. > + */ > + > +.globl lowlevel_init > +lowlevel_init: > + /* nothing for now, maybe needed for more exotic boot modes */ > + mov pc, lr > diff --git a/arch/arm/cpu/arm1176/tnetv107x/mux.c b/arch/arm/cpu/arm1176/tnetv107x/mux.c > new file mode 100644 > index 0000000..7b58133 > --- /dev/null > +++ b/arch/arm/cpu/arm1176/tnetv107x/mux.c > @@ -0,0 +1,463 @@ > +/* > + * TNETV107X: Pinmux configuration > + * > + * See file CREDITS for list of people who contributed to this > + * project. > + * > + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. > + */ > + > +#include > +#include > +#include > +#include > + > +#define MUX_MODE_1 0x00 > +#define MUX_MODE_2 0x04 > +#define MUX_MODE_3 0x0c > +#define MUX_MODE_4 0x1c > + > +#define MUX_DEBUG 0 > + > +static const struct pin_config pin_table[] = { > + TNETV107X_MUX_CFG(0, 0, MUX_MODE_1), > + TNETV107X_MUX_CFG(0, 0, MUX_MODE_2), Change these immedates '0, 0' into #defines Apply globally > + TNETV107X_MUX_CFG(0, 5, MUX_MODE_1), > + TNETV107X_MUX_CFG(0, 5, MUX_MODE_2), > + TNETV107X_MUX_CFG(0, 10, MUX_MODE_1), > + TNETV107X_MUX_CFG(0, 10, MUX_MODE_2), > + TNETV107X_MUX_CFG(0, 15, MUX_MODE_1), > + TNETV107X_MUX_CFG(0, 15, MUX_MODE_2), > + TNETV107X_MUX_CFG(0, 20, MUX_MODE_1), > + TNETV107X_MUX_CFG(0, 20, MUX_MODE_2), > + TNETV107X_MUX_CFG(0, 25, MUX_MODE_1), > + TNETV107X_MUX_CFG(0, 25, MUX_MODE_2), > + TNETV107X_MUX_CFG(1, 0, MUX_MODE_1), > + TNETV107X_MUX_CFG(1, 0, MUX_MODE_2), > + TNETV107X_MUX_CFG(1, 5, MUX_MODE_1), > + TNETV107X_MUX_CFG(1, 5, MUX_MODE_2), > + TNETV107X_MUX_CFG(1, 10, MUX_MODE_1), > + TNETV107X_MUX_CFG(1, 10, MUX_MODE_2), > + TNETV107X_MUX_CFG(1, 15, MUX_MODE_1), > + TNETV107X_MUX_CFG(1, 15, MUX_MODE_2), > + TNETV107X_MUX_CFG(1, 20, MUX_MODE_1), > + TNETV107X_MUX_CFG(1, 20, MUX_MODE_2), > + TNETV107X_MUX_CFG(1, 25, MUX_MODE_1), > + TNETV107X_MUX_CFG(1, 25, MUX_MODE_2), > + TNETV107X_MUX_CFG(2, 0, MUX_MODE_1), > + TNETV107X_MUX_CFG(2, 0, MUX_MODE_2), > + TNETV107X_MUX_CFG(2, 5, MUX_MODE_1), > + TNETV107X_MUX_CFG(2, 5, MUX_MODE_2), > + TNETV107X_MUX_CFG(2, 10, MUX_MODE_1), > + TNETV107X_MUX_CFG(2, 10, MUX_MODE_2), > + TNETV107X_MUX_CFG(2, 15, MUX_MODE_1), > + TNETV107X_MUX_CFG(2, 15, MUX_MODE_2), > + TNETV107X_MUX_CFG(2, 20, MUX_MODE_1), > + TNETV107X_MUX_CFG(2, 20, MUX_MODE_2), > + TNETV107X_MUX_CFG(2, 25, MUX_MODE_1), > + TNETV107X_MUX_CFG(2, 25, MUX_MODE_2), > + TNETV107X_MUX_CFG(3, 0, MUX_MODE_1), > + TNETV107X_MUX_CFG(3, 0, MUX_MODE_2), > + TNETV107X_MUX_CFG(3, 0, MUX_MODE_4), > + TNETV107X_MUX_CFG(3, 5, MUX_MODE_1), > + TNETV107X_MUX_CFG(3, 5, MUX_MODE_2), > + TNETV107X_MUX_CFG(3, 5, MUX_MODE_4), > + TNETV107X_MUX_CFG(3, 10, MUX_MODE_1), > + TNETV107X_MUX_CFG(3, 10, MUX_MODE_2), > + TNETV107X_MUX_CFG(3, 10, MUX_MODE_4), > + TNETV107X_MUX_CFG(3, 15, MUX_MODE_1), > + TNETV107X_MUX_CFG(3, 15, MUX_MODE_2), > + TNETV107X_MUX_CFG(3, 15, MUX_MODE_4), > + TNETV107X_MUX_CFG(3, 20, MUX_MODE_1), > + TNETV107X_MUX_CFG(3, 20, MUX_MODE_2), > + TNETV107X_MUX_CFG(3, 20, MUX_MODE_4), > + TNETV107X_MUX_CFG(3, 25, MUX_MODE_1), > + TNETV107X_MUX_CFG(3, 25, MUX_MODE_2), > + TNETV107X_MUX_CFG(3, 25, MUX_MODE_4), > + TNETV107X_MUX_CFG(4, 0, MUX_MODE_1), > + TNETV107X_MUX_CFG(4, 0, MUX_MODE_2), > + TNETV107X_MUX_CFG(4, 0, MUX_MODE_4), > + TNETV107X_MUX_CFG(4, 5, MUX_MODE_1), > + TNETV107X_MUX_CFG(4, 10, MUX_MODE_1), > + TNETV107X_MUX_CFG(4, 15, MUX_MODE_1), > + TNETV107X_MUX_CFG(4, 15, MUX_MODE_4), > + TNETV107X_MUX_CFG(4, 20, MUX_MODE_1), > + TNETV107X_MUX_CFG(4, 20, MUX_MODE_3), > + TNETV107X_MUX_CFG(4, 25, MUX_MODE_1), > + TNETV107X_MUX_CFG(4, 25, MUX_MODE_4), > + TNETV107X_MUX_CFG(5, 0, MUX_MODE_1), > + TNETV107X_MUX_CFG(5, 0, MUX_MODE_4), > + TNETV107X_MUX_CFG(5, 5, MUX_MODE_1), > + TNETV107X_MUX_CFG(5, 5, MUX_MODE_4), > + TNETV107X_MUX_CFG(5, 10, MUX_MODE_1), > + TNETV107X_MUX_CFG(5, 10, MUX_MODE_4), > + TNETV107X_MUX_CFG(5, 15, MUX_MODE_1), > + TNETV107X_MUX_CFG(5, 15, MUX_MODE_4), > + TNETV107X_MUX_CFG(5, 20, MUX_MODE_1), > + TNETV107X_MUX_CFG(5, 20, MUX_MODE_4), > + TNETV107X_MUX_CFG(5, 25, MUX_MODE_1), > + TNETV107X_MUX_CFG(5, 25, MUX_MODE_4), > + TNETV107X_MUX_CFG(6, 0, MUX_MODE_1), > + TNETV107X_MUX_CFG(6, 0, MUX_MODE_4), > + TNETV107X_MUX_CFG(6, 5, MUX_MODE_1), > + TNETV107X_MUX_CFG(6, 5, MUX_MODE_4), > + TNETV107X_MUX_CFG(6, 10, MUX_MODE_1), > + TNETV107X_MUX_CFG(6, 10, MUX_MODE_4), > + TNETV107X_MUX_CFG(6, 15, MUX_MODE_1), > + TNETV107X_MUX_CFG(6, 15, MUX_MODE_4), > + TNETV107X_MUX_CFG(6, 20, MUX_MODE_1), > + TNETV107X_MUX_CFG(6, 20, MUX_MODE_4), > + TNETV107X_MUX_CFG(6, 25, MUX_MODE_1), > + TNETV107X_MUX_CFG(6, 25, MUX_MODE_4), > + TNETV107X_MUX_CFG(7, 0, MUX_MODE_1), > + TNETV107X_MUX_CFG(7, 0, MUX_MODE_4), > + TNETV107X_MUX_CFG(7, 5, MUX_MODE_1), > + TNETV107X_MUX_CFG(7, 5, MUX_MODE_4), > + TNETV107X_MUX_CFG(7, 10, MUX_MODE_1), > + TNETV107X_MUX_CFG(7, 10, MUX_MODE_4), > + TNETV107X_MUX_CFG(7, 15, MUX_MODE_1), > + TNETV107X_MUX_CFG(7, 15, MUX_MODE_2), > + TNETV107X_MUX_CFG(7, 20, MUX_MODE_1), > + TNETV107X_MUX_CFG(7, 20, MUX_MODE_2), > + TNETV107X_MUX_CFG(7, 25, MUX_MODE_1), > + TNETV107X_MUX_CFG(7, 25, MUX_MODE_2), > + TNETV107X_MUX_CFG(8, 0, MUX_MODE_1), > + TNETV107X_MUX_CFG(8, 0, MUX_MODE_2), > + TNETV107X_MUX_CFG(8, 5, MUX_MODE_1), > + TNETV107X_MUX_CFG(8, 5, MUX_MODE_2), > + TNETV107X_MUX_CFG(8, 5, MUX_MODE_4), > + TNETV107X_MUX_CFG(8, 10, MUX_MODE_1), > + TNETV107X_MUX_CFG(8, 10, MUX_MODE_2), > + TNETV107X_MUX_CFG(9, 0, MUX_MODE_1), > + TNETV107X_MUX_CFG(9, 0, MUX_MODE_2), > + TNETV107X_MUX_CFG(9, 0, MUX_MODE_4), > + TNETV107X_MUX_CFG(9, 5, MUX_MODE_1), > + TNETV107X_MUX_CFG(9, 5, MUX_MODE_2), > + TNETV107X_MUX_CFG(9, 5, MUX_MODE_4), > + TNETV107X_MUX_CFG(9, 10, MUX_MODE_1), > + TNETV107X_MUX_CFG(9, 10, MUX_MODE_2), > + TNETV107X_MUX_CFG(9, 10, MUX_MODE_4), > + TNETV107X_MUX_CFG(9, 15, MUX_MODE_1), > + TNETV107X_MUX_CFG(9, 15, MUX_MODE_2), > + TNETV107X_MUX_CFG(9, 15, MUX_MODE_4), > + TNETV107X_MUX_CFG(9, 20, MUX_MODE_1), > + TNETV107X_MUX_CFG(9, 20, MUX_MODE_2), > + TNETV107X_MUX_CFG(9, 20, MUX_MODE_4), > + TNETV107X_MUX_CFG(10, 0, MUX_MODE_1), > + TNETV107X_MUX_CFG(10, 0, MUX_MODE_2), > + TNETV107X_MUX_CFG(10, 5, MUX_MODE_1), > + TNETV107X_MUX_CFG(10, 5, MUX_MODE_2), > + TNETV107X_MUX_CFG(10, 10, MUX_MODE_1), > + TNETV107X_MUX_CFG(10, 10, MUX_MODE_2), > + TNETV107X_MUX_CFG(10, 15, MUX_MODE_1), > + TNETV107X_MUX_CFG(10, 15, MUX_MODE_2), > + TNETV107X_MUX_CFG(10, 20, MUX_MODE_1), > + TNETV107X_MUX_CFG(10, 20, MUX_MODE_2), > + TNETV107X_MUX_CFG(10, 25, MUX_MODE_1), > + TNETV107X_MUX_CFG(10, 25, MUX_MODE_2), > + TNETV107X_MUX_CFG(11, 0, MUX_MODE_1), > + TNETV107X_MUX_CFG(11, 5, MUX_MODE_1), > + TNETV107X_MUX_CFG(12, 0, MUX_MODE_1), > + TNETV107X_MUX_CFG(12, 5, MUX_MODE_1), > + TNETV107X_MUX_CFG(12, 10, MUX_MODE_1), > + TNETV107X_MUX_CFG(12, 15, MUX_MODE_1), > + TNETV107X_MUX_CFG(12, 20, MUX_MODE_1), > + TNETV107X_MUX_CFG(12, 25, MUX_MODE_1), > + TNETV107X_MUX_CFG(13, 0, MUX_MODE_1), > + TNETV107X_MUX_CFG(13, 5, MUX_MODE_1), > + TNETV107X_MUX_CFG(13, 10, MUX_MODE_1), > + TNETV107X_MUX_CFG(13, 15, MUX_MODE_1), > + TNETV107X_MUX_CFG(14, 0, MUX_MODE_1), > + TNETV107X_MUX_CFG(14, 5, MUX_MODE_1), > + TNETV107X_MUX_CFG(14, 10, MUX_MODE_1), > + TNETV107X_MUX_CFG(14, 15, MUX_MODE_1), > + TNETV107X_MUX_CFG(14, 20, MUX_MODE_1), > + TNETV107X_MUX_CFG(14, 25, MUX_MODE_1), > + TNETV107X_MUX_CFG(15, 0, MUX_MODE_1), > + TNETV107X_MUX_CFG(15, 0, MUX_MODE_2), > + TNETV107X_MUX_CFG(15, 5, MUX_MODE_1), > + TNETV107X_MUX_CFG(15, 5, MUX_MODE_2), > + TNETV107X_MUX_CFG(15, 10, MUX_MODE_1), > + TNETV107X_MUX_CFG(15, 15, MUX_MODE_1), > + TNETV107X_MUX_CFG(15, 20, MUX_MODE_1), > + TNETV107X_MUX_CFG(15, 25, MUX_MODE_1), > + TNETV107X_MUX_CFG(16, 0, MUX_MODE_1), > + TNETV107X_MUX_CFG(16, 5, MUX_MODE_1), > + TNETV107X_MUX_CFG(16, 10, MUX_MODE_1), > + TNETV107X_MUX_CFG(16, 10, MUX_MODE_2), > + TNETV107X_MUX_CFG(16, 10, MUX_MODE_3), > + TNETV107X_MUX_CFG(16, 15, MUX_MODE_1), > + TNETV107X_MUX_CFG(16, 15, MUX_MODE_2), > + TNETV107X_MUX_CFG(17, 0, MUX_MODE_1), > + TNETV107X_MUX_CFG(17, 0, MUX_MODE_2), > + TNETV107X_MUX_CFG(17, 0, MUX_MODE_3), > + TNETV107X_MUX_CFG(17, 5, MUX_MODE_1), > + TNETV107X_MUX_CFG(17, 5, MUX_MODE_2), > + TNETV107X_MUX_CFG(17, 5, MUX_MODE_3), > + TNETV107X_MUX_CFG(17, 10, MUX_MODE_1), > + TNETV107X_MUX_CFG(17, 10, MUX_MODE_2), > + TNETV107X_MUX_CFG(17, 10, MUX_MODE_3), > + TNETV107X_MUX_CFG(17, 15, MUX_MODE_1), > + TNETV107X_MUX_CFG(17, 15, MUX_MODE_2), > + TNETV107X_MUX_CFG(17, 15, MUX_MODE_3), > + TNETV107X_MUX_CFG(18, 0, MUX_MODE_1), > + TNETV107X_MUX_CFG(18, 0, MUX_MODE_2), > + TNETV107X_MUX_CFG(18, 0, MUX_MODE_3), > + TNETV107X_MUX_CFG(18, 5, MUX_MODE_1), > + TNETV107X_MUX_CFG(18, 5, MUX_MODE_2), > + TNETV107X_MUX_CFG(18, 5, MUX_MODE_3), > + TNETV107X_MUX_CFG(18, 10, MUX_MODE_1), > + TNETV107X_MUX_CFG(18, 10, MUX_MODE_2), > + TNETV107X_MUX_CFG(18, 10, MUX_MODE_3), > + TNETV107X_MUX_CFG(18, 15, MUX_MODE_1), > + TNETV107X_MUX_CFG(18, 15, MUX_MODE_2), > + TNETV107X_MUX_CFG(18, 15, MUX_MODE_3), > + TNETV107X_MUX_CFG(19, 0, MUX_MODE_1), > + TNETV107X_MUX_CFG(19, 5, MUX_MODE_1), > + TNETV107X_MUX_CFG(19, 10, MUX_MODE_1), > + TNETV107X_MUX_CFG(19, 15, MUX_MODE_1), > + TNETV107X_MUX_CFG(19, 20, MUX_MODE_1), > + TNETV107X_MUX_CFG(19, 25, MUX_MODE_1), > + TNETV107X_MUX_CFG(20, 0, MUX_MODE_1), > + TNETV107X_MUX_CFG(20, 5, MUX_MODE_1), > + TNETV107X_MUX_CFG(20, 10, MUX_MODE_1), > + TNETV107X_MUX_CFG(20, 15, MUX_MODE_1), > + TNETV107X_MUX_CFG(20, 15, MUX_MODE_3), > + TNETV107X_MUX_CFG(20, 20, MUX_MODE_1), > + TNETV107X_MUX_CFG(20, 25, MUX_MODE_1), > + TNETV107X_MUX_CFG(21, 0, MUX_MODE_1), > + TNETV107X_MUX_CFG(21, 5, MUX_MODE_1), > + TNETV107X_MUX_CFG(21, 10, MUX_MODE_1), > + TNETV107X_MUX_CFG(21, 15, MUX_MODE_1), > + TNETV107X_MUX_CFG(21, 20, MUX_MODE_1), > + TNETV107X_MUX_CFG(21, 25, MUX_MODE_1), > + TNETV107X_MUX_CFG(22, 0, MUX_MODE_1), > + TNETV107X_MUX_CFG(22, 5, MUX_MODE_1), > + TNETV107X_MUX_CFG(22, 5, MUX_MODE_3), > + TNETV107X_MUX_CFG(22, 10, MUX_MODE_1), > + TNETV107X_MUX_CFG(22, 10, MUX_MODE_3), > + TNETV107X_MUX_CFG(22, 15, MUX_MODE_1), > + TNETV107X_MUX_CFG(22, 15, MUX_MODE_2), > + TNETV107X_MUX_CFG(22, 15, MUX_MODE_3), > + TNETV107X_MUX_CFG(22, 20, MUX_MODE_1), > + TNETV107X_MUX_CFG(22, 20, MUX_MODE_3), > + TNETV107X_MUX_CFG(22, 25, MUX_MODE_1), > + TNETV107X_MUX_CFG(22, 25, MUX_MODE_3), > + TNETV107X_MUX_CFG(23, 0, MUX_MODE_1), > + TNETV107X_MUX_CFG(23, 0, MUX_MODE_3), > + TNETV107X_MUX_CFG(23, 5, MUX_MODE_1), > + TNETV107X_MUX_CFG(23, 5, MUX_MODE_3), > + TNETV107X_MUX_CFG(23, 10, MUX_MODE_1), > + TNETV107X_MUX_CFG(23, 10, MUX_MODE_3), > + TNETV107X_MUX_CFG(24, 0, MUX_MODE_1), > + TNETV107X_MUX_CFG(24, 0, MUX_MODE_2), > + TNETV107X_MUX_CFG(24, 5, MUX_MODE_1), > + TNETV107X_MUX_CFG(24, 5, MUX_MODE_2), > + TNETV107X_MUX_CFG(24, 10, MUX_MODE_1), > + TNETV107X_MUX_CFG(24, 10, MUX_MODE_2), > + TNETV107X_MUX_CFG(24, 10, MUX_MODE_3), > + TNETV107X_MUX_CFG(24, 15, MUX_MODE_1), > + TNETV107X_MUX_CFG(24, 15, MUX_MODE_2), > + TNETV107X_MUX_CFG(24, 15, MUX_MODE_3), > + TNETV107X_MUX_CFG(24, 20, MUX_MODE_1), > + TNETV107X_MUX_CFG(24, 20, MUX_MODE_2), > + TNETV107X_MUX_CFG(24, 25, MUX_MODE_1), > + TNETV107X_MUX_CFG(24, 25, MUX_MODE_2), > + TNETV107X_MUX_CFG(25, 0, MUX_MODE_1), > + TNETV107X_MUX_CFG(25, 0, MUX_MODE_2), > + TNETV107X_MUX_CFG(25, 0, MUX_MODE_3), > + TNETV107X_MUX_CFG(25, 5, MUX_MODE_1), > + TNETV107X_MUX_CFG(25, 5, MUX_MODE_2), > + TNETV107X_MUX_CFG(25, 5, MUX_MODE_3), > + TNETV107X_MUX_CFG(25, 10, MUX_MODE_1), > + TNETV107X_MUX_CFG(25, 10, MUX_MODE_2), > + TNETV107X_MUX_CFG(25, 10, MUX_MODE_3), > + TNETV107X_MUX_CFG(25, 15, MUX_MODE_1), > + TNETV107X_MUX_CFG(25, 15, MUX_MODE_2), > + TNETV107X_MUX_CFG(25, 15, MUX_MODE_3), > + TNETV107X_MUX_CFG(25, 15, MUX_MODE_4), > + TNETV107X_MUX_CFG(26, 0, MUX_MODE_1), > + TNETV107X_MUX_CFG(26, 5, MUX_MODE_1), > + TNETV107X_MUX_CFG(26, 10, MUX_MODE_1), > + TNETV107X_MUX_CFG(26, 10, MUX_MODE_2), > + TNETV107X_MUX_CFG(26, 15, MUX_MODE_1), > + TNETV107X_MUX_CFG(26, 15, MUX_MODE_2), > + TNETV107X_MUX_CFG(26, 20, MUX_MODE_1), > + TNETV107X_MUX_CFG(26, 20, MUX_MODE_2), > + TNETV107X_MUX_CFG(26, 25, MUX_MODE_1), > + TNETV107X_MUX_CFG(26, 25, MUX_MODE_2), > +}; > + > +const int pin_table_size = sizeof(pin_table) / sizeof(pin_table[0]); > + > +static const short sdio0_pins[] = { > + TNETV107X_PIN_SDIO0_CLK, TNETV107X_PIN_SDIO0_CMD, > + TNETV107X_PIN_SDIO0_DATA0, > + TNETV107X_PIN_SDIO0_DATA1, TNETV107X_PIN_SDIO0_DATA2, > + TNETV107X_PIN_SDIO0_DATA3, > + -1 > +}; > + > +static const short sdio1_pins[] = { > + TNETV107X_PIN_SDIO1_CLK_0, TNETV107X_PIN_SDIO1_CMD_0, > + TNETV107X_PIN_SDIO1_DATA0_0, TNETV107X_PIN_SDIO1_DATA1_0, > + TNETV107X_PIN_SDIO1_DATA2_0, TNETV107X_PIN_SDIO1_DATA3_0, > + -1 > +}; > + > +static const short uart0_pins[] = { > + TNETV107X_PIN_UART0_CTS, TNETV107X_PIN_UART0_RD, > + TNETV107X_PIN_UART0_RTS, > + TNETV107X_PIN_UART0_TD, -1 > +}; > + > +static const short uart1_pins[] = { > + TNETV107X_PIN_UART1_RD, TNETV107X_PIN_UART1_TD, -1 > +}; > + > +static const short uart2_pins[] = { > + TNETV107X_PIN_UART2_CTS, TNETV107X_PIN_UART2_RD, > + TNETV107X_PIN_UART2_RTS, > + TNETV107X_PIN_UART2_TD, -1 > +}; > + > +static const short keypad_pins[] = { > + TNETV107X_PIN_KEYPAD_R0, TNETV107X_PIN_KEYPAD_R1, > + TNETV107X_PIN_KEYPAD_R2, > + TNETV107X_PIN_KEYPAD_R3, TNETV107X_PIN_KEYPAD_R4, > + TNETV107X_PIN_KEYPAD_R5, > + TNETV107X_PIN_KEYPAD_R6, TNETV107X_PIN_KEYPAD_C0, > + TNETV107X_PIN_KEYPAD_C1, > + TNETV107X_PIN_KEYPAD_C2, TNETV107X_PIN_KEYPAD_C3, > + TNETV107X_PIN_KEYPAD_C4, > + TNETV107X_PIN_KEYPAD_C5, TNETV107X_PIN_KEYPAD_C6, -1 > +}; > + > +static const short vlynq_pins[] = { > + TNETV107X_PIN_VLYNQ_CLK, TNETV107X_PIN_VLYNQ_RXD0, > + TNETV107X_PIN_VLYNQ_RXD1, > + TNETV107X_PIN_VLYNQ_TXD0, TNETV107X_PIN_VLYNQ_TXD1, -1 > +}; > + > +static const short lcd_pins[] = { > + TNETV107X_PIN_LCD_AC_NCS, TNETV107X_PIN_LCD_HSYNC_RNW, > + TNETV107X_PIN_LCD_VSYNC_A0, TNETV107X_PIN_LCD_PCLK_E, > + TNETV107X_PIN_LCD_PD00, > + TNETV107X_PIN_LCD_PD01, TNETV107X_PIN_LCD_PD02, TNETV107X_PIN_LCD_PD03, > + TNETV107X_PIN_LCD_PD04, TNETV107X_PIN_LCD_PD05, TNETV107X_PIN_LCD_PD06, > + TNETV107X_PIN_LCD_PD07, TNETV107X_PIN_LCD_PD08, TNETV107X_PIN_LCD_PD09, > + TNETV107X_PIN_LCD_PD10, TNETV107X_PIN_LCD_PD11, TNETV107X_PIN_LCD_PD12, > + TNETV107X_PIN_LCD_PD13, TNETV107X_PIN_LCD_PD14, TNETV107X_PIN_LCD_PD15, > + TNETV107X_PIN_LCD_PD16_0, TNETV107X_PIN_LCD_PD17_0, > + TNETV107X_PIN_LCD_PD18, > + TNETV107X_PIN_LCD_PD19_1, TNETV107X_PIN_LCD_PD20_0, > + TNETV107X_PIN_LCD_PD21_0, > + TNETV107X_PIN_LCD_PD22_0, TNETV107X_PIN_LCD_PD23_0, -1 > +}; > + > +static const short ssp_pins[] = { > + TNETV107X_PIN_SSP0_0, TNETV107X_PIN_SSP0_1, TNETV107X_PIN_SSP0_2, > + TNETV107X_PIN_SSP1_0, TNETV107X_PIN_SSP1_1, TNETV107X_PIN_SSP1_2, > + TNETV107X_PIN_SSP1_3, -1 > +}; > + > +static const short dummy[] = { -1 }; > + > +static const short *psc_pins[] = { > + [TNETV107X_LPSC_ARM] = dummy, Simplify Initialize with a #define > + [TNETV107X_LPSC_GEM] = dummy, > + [TNETV107X_LPSC_DDR2_PHY] = dummy, > + [TNETV107X_LPSC_TPCC] = dummy, > + [TNETV107X_LPSC_TPTC0] = dummy, > + [TNETV107X_LPSC_TPTC1] = dummy, > + [TNETV107X_LPSC_RAM] = dummy, > + [TNETV107X_LPSC_MBX_LITE] = dummy, > + [TNETV107X_LPSC_LCD] = lcd_pins, > + [TNETV107X_LPSC_ETHSS] = dummy, > + [TNETV107X_LPSC_AEMIF] = dummy, > + [TNETV107X_LPSC_CHIP_CFG] = dummy, > + [TNETV107X_LPSC_TSC] = dummy, > + [TNETV107X_LPSC_ROM] = dummy, > + [TNETV107X_LPSC_UART2] = uart2_pins, > + [TNETV107X_LPSC_PKTSEC] = dummy, > + [TNETV107X_LPSC_SECCTL] = dummy, > + [TNETV107X_LPSC_KEYMGR] = dummy, > + [TNETV107X_LPSC_KEYPAD] = keypad_pins, > + [TNETV107X_LPSC_GPIO] = dummy, > + [TNETV107X_LPSC_MDIO] = dummy, > + [TNETV107X_LPSC_SDIO0] = sdio0_pins, > + [TNETV107X_LPSC_UART0] = uart0_pins, > + [TNETV107X_LPSC_UART1] = uart1_pins, > + [TNETV107X_LPSC_TIMER0] = dummy, > + [TNETV107X_LPSC_TIMER1] = dummy, > + [TNETV107X_LPSC_WDT_ARM] = dummy, > + [TNETV107X_LPSC_WDT_DSP] = dummy, > + [TNETV107X_LPSC_SSP] = ssp_pins, > + [TNETV107X_LPSC_TDM0] = dummy, > + [TNETV107X_LPSC_VLYNQ] = vlynq_pins, > + [TNETV107X_LPSC_MCDMA] = dummy, > + [TNETV107X_LPSC_USB0] = dummy, > + [TNETV107X_LPSC_TDM1] = dummy, > + [TNETV107X_LPSC_DEBUGSS] = dummy, > + [TNETV107X_LPSC_ETHSS_RGMII] = dummy, > + [TNETV107X_LPSC_SYSTEM] = dummy, > + [TNETV107X_LPSC_IMCOP] = dummy, > + [TNETV107X_LPSC_SPARE] = dummy, > + [TNETV107X_LPSC_SDIO1] = sdio1_pins, > + [TNETV107X_LPSC_USB1] = dummy, > + [TNETV107X_LPSC_USBSS] = dummy, > + [TNETV107X_LPSC_DDR2_EMIF1_VRST] = dummy, > + [TNETV107X_LPSC_DDR2_EMIF2_VCTL_RST] = dummy, > +}; The preceding tables look like they could be used generally. If this is the case, move them to an arch *.h file. > + > +const int psc_pins_size = sizeof(psc_pins) / sizeof(psc_pins[0]); > + > +int mux_select_pin(unsigned index) > +{ > + const struct pin_config *cfg; > + unsigned long mask, mode, reg; > + > + if (index >= pin_table_size) > + return 0; > + > + cfg = &pin_table[index]; > + > + mask = 0x1f << cfg->mask_offset; > + mode = cfg->mode << cfg->mask_offset; > + > + reg = __raw_readl(TNETV107X_PINMUX(cfg->reg_index)); > + reg = (reg & ~mask) | mode; > + __raw_writel(reg, TNETV107X_PINMUX(cfg->reg_index)); > + > + return 1; > +} > + > +int mux_select_pins(const short *pins) > +{ > + int i, ret = 1; > + > + for (i = 0; pins[i] >= 0; i++) > + ret &= mux_select_pin(pins[i]); > + > + return ret; > +} > + > +int mux_select_module(int lpsc) > +{ > + if (lpsc >= psc_pins_size) > + return 0; > + > + return mux_select_pins(psc_pins[lpsc]); > +} > diff --git a/arch/arm/cpu/arm1176/tnetv107x/timer.c b/arch/arm/cpu/arm1176/tnetv107x/timer.c > new file mode 100644 > index 0000000..2ba3f54 > --- /dev/null > +++ b/arch/arm/cpu/arm1176/tnetv107x/timer.c > @@ -0,0 +1,125 @@ > +/* > + * TNETV107X: Timer implementation > + * > + * See file CREDITS for list of people who contributed to this > + * project. > + * > + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. > + */ > + > +#include > +#include > +#include > + > +struct timer_regs { > + u_int32_t pid12; > + u_int32_t pad[3]; > + u_int32_t tim12; > + u_int32_t tim34; > + u_int32_t prd12; > + u_int32_t prd34; > + u_int32_t tcr; > + u_int32_t tgcr; > + u_int32_t wdtcr; > +}; > + > +#define regs ((struct timer_regs *)CONFIG_SYS_TIMERBASE) > + > +#define TIMER_LOAD_VAL (CONFIG_SYS_HZ_CLOCK / CONFIG_SYS_HZ) > +#define TIM_CLK_DIV 16 > + > +static ulong timestamp; > +static ulong lastinc; > + > +void init_timer(void) > +{ > + clk_enable(TNETV107X_LPSC_TIMER0); > + > + lastinc = timestamp = 0; > + > + /* We are using timer34 in unchained 32-bit mode, full speed */ > + __raw_writel(0x0, ®s->tcr); > + __raw_writel(0x0, ®s->tgcr); > + __raw_writel(0x06 | ((TIM_CLK_DIV - 1) << 8), ®s->tgcr); > + __raw_writel(0x0, ®s->tim34); > + __raw_writel(TIMER_LOAD_VAL, ®s->prd34); > + __raw_writel(2 << 22, ®s->tcr); > +} > + > +int timer_init(void) > +{ > + return 0; > +} > + > +void reset_timer(void) > +{ > + lastinc = timestamp = 0; > + > + __raw_writel(0, ®s->tcr); > + __raw_writel(0, ®s->tim34); > + __raw_writel(2 << 22, ®s->tcr); > +} > + > +static ulong get_timer_raw(void) > +{ > + ulong now = __raw_readl(®s->tim34); > + > + if (now >= lastinc) > + timestamp += now - lastinc; > + else > + timestamp += now + TIMER_LOAD_VAL - lastinc; > + > + lastinc = now; > + > + return timestamp; > +} > + > +ulong get_timer(ulong base) > +{ > + return (get_timer_raw() / (TIMER_LOAD_VAL / TIM_CLK_DIV)) - base; > +} > + > +void set_timer(ulong t) > +{ > + timestamp = t; > +} > + > +unsigned long long get_ticks(void) > +{ > + return get_timer(0); > +} > + > +void __udelay(unsigned long usec) > +{ > + ulong tmo; > + ulong endtime; > + signed long diff; > + > + tmo = CONFIG_SYS_HZ_CLOCK / 1000; > + tmo *= usec; > + tmo /= (1000 * TIM_CLK_DIV); > + > + endtime = get_timer_raw() + tmo; > + > + do { > + ulong now = get_timer_raw(); > + diff = endtime - now; > + } while (diff >= 0); > +} > + > +ulong get_tbclk(void) > +{ > + return CONFIG_SYS_HZ; > +} > diff --git a/arch/arm/cpu/arm1176/tnetv107x/wdt.c b/arch/arm/cpu/arm1176/tnetv107x/wdt.c > new file mode 100644 > index 0000000..eeed136 > --- /dev/null > +++ b/arch/arm/cpu/arm1176/tnetv107x/wdt.c > @@ -0,0 +1,172 @@ > +/* > + * TNETV107X: Watchdog timer implementation (for reset) > + * > + * See file CREDITS for list of people who contributed to this > + * project. > + * > + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. > + */ > + > +#include > +#include > +#include > + > +#define MAX_DIV 0xFFFE0001 > + > +struct wdt_regs { > + u32 kick_lock; > + u32 kick; > + u32 change_lock; > + u32 change; > + u32 disable_lock; > + u32 disable; > + u32 prescale_lock; > + u32 prescale; > +}; > + > +static struct wdt_regs* regs = (struct wdt_regs *)TNETV107X_WDT0_ARM_BASE; > + > +#define wdt_reg_read(reg) __raw_readl(®s->reg) > +#define wdt_reg_write(reg, val) __raw_writel((val), ®s->reg) > + > +static int write_prescale_reg(unsigned long prescale_value) > +{ > + wdt_reg_write(prescale_lock, 0x5a5a); > + if ((wdt_reg_read(prescale_lock) & 0x3) != 0x1) > + return -1; Move 0x5a5a to a #define Similar for others > + > + wdt_reg_write(prescale_lock, 0xa5a5); > + if ((wdt_reg_read(prescale_lock) & 0x3) != 0x3) > + return -1; > + > + wdt_reg_write(prescale, prescale_value); > + > + return 0; > +} > + > +static int write_change_reg(unsigned long initial_timer_value) > +{ > + wdt_reg_write(change_lock, 0x6666); > + if ((wdt_reg_read(change_lock) & 0x3) != 0x1) > + return -1; > + > + wdt_reg_write(change_lock, 0xbbbb); > + if ((wdt_reg_read(change_lock) & 0x3) != 0x3) > + return -1; > + > + wdt_reg_write(change, initial_timer_value); > + > + return 0; > +} > + > +static int wdt_control(unsigned long disable_value) > +{ > + wdt_reg_write(disable_lock, 0x7777); > + if ((wdt_reg_read(disable_lock) & 0x3) != 0x1) > + return -1; > + > + wdt_reg_write(disable_lock, 0xcccc); > + if ((wdt_reg_read(disable_lock) & 0x3) != 0x2) > + return -1; > + > + wdt_reg_write(disable_lock, 0xdddd); > + if ((wdt_reg_read(disable_lock) & 0x3) != 0x3) > + return -1; > + > + wdt_reg_write(disable, disable_value); > + return 0; > +} > + > +static int wdt_set_period(unsigned long msec) > +{ > + unsigned long change_value, count_value; > + unsigned long prescale_value = 1; > + unsigned long refclk_khz, maxdiv; > + int ret; > + > + refclk_khz = clk_get_rate(TNETV107X_LPSC_WDT_ARM); > + maxdiv = (MAX_DIV / refclk_khz); > + > + if ((!msec) || (msec > maxdiv)) > + return -1; > + > + count_value = refclk_khz * msec; > + if (count_value > 0xffff) { > + change_value = count_value / 0xffff + 1; > + prescale_value = count_value / change_value; > + } else { > + change_value = count_value; > + } > + > + ret = write_prescale_reg(prescale_value - 1); > + if (ret) > + return ret; > + > + ret = write_change_reg(change_value); > + if (ret) > + return ret; > + > + return 0; > +} > + > +unsigned long last_wdt = -1; > + > +int wdt_start(unsigned long msecs) > +{ > + int ret; > + ret = wdt_control(0); > + if (ret) > + return ret; > + ret = wdt_set_period(msecs); > + if (ret) > + return ret; > + ret = wdt_control(1); > + if (ret) > + return ret; > + ret = wdt_kick(); > + last_wdt = msecs; > + return ret; > +} > + > +int wdt_stop(void) > +{ > + last_wdt = -1; > + return wdt_control(0); > +} > + > +int wdt_kick(void) > +{ > + wdt_reg_write(kick_lock, 0x5555); > + if ((wdt_reg_read(kick_lock) & 0x3) != 0x1) > + return -1; > + > + wdt_reg_write(kick_lock, 0xaaaa); > + if ((wdt_reg_read(kick_lock) & 0x3) != 0x3) > + return -1; > + > + wdt_reg_write(kick, 1); > + return 0; > +} > + > +void reset_cpu(ulong addr) > +{ > + wdt_start(1); > + wdt_kick(); > +} > + > +void init_wdt(void) > +{ > + clk_enable(TNETV107X_LPSC_WDT_ARM); > +} > diff --git a/arch/arm/include/asm/arch-tnetv107x/clock.h b/arch/arm/include/asm/arch-tnetv107x/clock.h > new file mode 100644 > index 0000000..369e11b > --- /dev/null > +++ b/arch/arm/include/asm/arch-tnetv107x/clock.h > @@ -0,0 +1,50 @@ > +/* > + * TNETV107X: Clock APIs > + * > + * See file CREDITS for list of people who contributed to this > + * project. > + * > + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. > + */ > + > +#ifndef __ASM_ARCH_CLOCK_H > +#define __ASM_ARCH_CLOCK_H > + > +#define PSC_MDCTL_NEXT_SWRSTDISABLE 0x0 > +#define PSC_MDCTL_NEXT_SYNCRST 0x1 > +#define PSC_MDCTL_NEXT_DISABLE 0x2 > +#define PSC_MDCTL_NEXT_ENABLE 0x3 > + > +#ifndef __ASSEMBLY__ > +int lpsc_status(unsigned int id); > +void lpsc_control(int nmod, int lrstz, ...); This this only called with 1 arg. vargs is not needed. Convert to a normal calling Convert other functions called from this function. > +void pinmux_enable(unsigned int id, int enable); > +unsigned long clk_get_rate(unsigned int clk); > +long clk_round_rate(unsigned int clk, unsigned long hz); > +int clk_set_rate(unsigned int clk, unsigned long hz); > + > +static inline void clk_enable(unsigned int id) > +{ > + lpsc_control(1, -1, id, PSC_MDCTL_NEXT_ENABLE); > +} > + > +static inline void clk_disable(unsigned int id) > +{ > + lpsc_control(1, -1, id, PSC_MDCTL_NEXT_DISABLE); > +} > + > +#endif > + > +#endif > diff --git a/arch/arm/include/asm/arch-tnetv107x/emif_defs.h b/arch/arm/include/asm/arch-tnetv107x/emif_defs.h > new file mode 100644 > index 0000000..9969a01 > --- /dev/null > +++ b/arch/arm/include/asm/arch-tnetv107x/emif_defs.h > @@ -0,0 +1 @@ > +#include > diff --git a/arch/arm/include/asm/arch-tnetv107x/hardware.h b/arch/arm/include/asm/arch-tnetv107x/hardware.h > new file mode 100644 > index 0000000..824555c > --- /dev/null > +++ b/arch/arm/include/asm/arch-tnetv107x/hardware.h > @@ -0,0 +1,184 @@ > +/* > + * TNETV107X: Hardware information > + * > + * See file CREDITS for list of people who contributed to this > + * project. > + * > + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. > + */ > + > +#ifndef __ASM_ARCH_HARDWARE_H > +#define __ASM_ARCH_HARDWARE_H > + > +#ifndef __ASSEMBLY__ > + > +#include > + > +#define DIV_CEILING(num, den) ((((num)+(den)-1)/(den))-1) > +#define DIV_FLOOR(num, den) (((num)/(den))-1) These two are not used anywhere and should be removed. > +#define ABS(x) (((x) < 0) ? -(x) : (x)) This is only used once. A macro is overkill This could be removed. > + > +#define ASYNC_EMIF_PRESERVE -1 > +struct async_emif_config { > + unsigned mode; > + unsigned select_strobe; > + unsigned extend_wait; > + unsigned wr_setup; > + unsigned wr_strobe; > + unsigned wr_hold; > + unsigned rd_setup; > + unsigned rd_strobe; > + unsigned rd_hold; > + unsigned turn_around; > + enum { > + ASYNC_EMIF_8 = 0, > + ASYNC_EMIF_16 = 1, > + ASYNC_EMIF_32 = 2, > + } width; > +}; > + > +void init_plls(void); > +void clk_delay(void); > + > +void init_async_emif(void); > +void suspend_async_emif(void); > +void restore_async_emif(void); > + > +void init_timer(void); > +void suspend_timer(void); > +void restore_timer(void); > + > +void init_wdt(void); > +void suspend_wdt(void); > +void restore_wdt(void); > +int wdt_start(unsigned long msecs); > +int wdt_stop(void); > +int wdt_kick(void); > + > +#endif > + > +/* Chip configuration unlock codes and registers */ > +#define TNETV107X_KICK0 (TNETV107X_CHIP_CONFIG_SYS_BASE+0x38) > +#define TNETV107X_KICK1 (TNETV107X_CHIP_CONFIG_SYS_BASE+0x3c) > +#define TNETV107X_PINMUX(n) (TNETV107X_CHIP_CONFIG_SYS_BASE+0x150+(n)*4) > +#define TNETV107X_KICK0_MAGIC 0x83e70b13 > +#define TNETV107X_KICK1_MAGIC 0x95a4f1e0 > + > +/* Module base addresses */ > +#define TNETV107X_TPCC_BASE 0x01C00000 > +#define TNETV107X_TPTC0_BASE 0x01C10000 > +#define TNETV107X_TPTC1_BASE 0x01C10400 > +#define TNETV107X_INTC_BASE 0x03000000 > +#define TNETV107X_LCD_CONTROLLER_BASE 0x08030000 > +#define TNETV107X_INTD_BASE 0x08038000 > +#define TNETV107X_INTD_IPC_BASE 0x08038000 > +#define TNETV107X_INTD_FAST_BASE 0x08039000 > +#define TNETV107X_INTD_ASYNC_BASE 0x0803A000 > +#define TNETV107X_INTD_SLOW_BASE 0x0803B000 > +#define TNETV107X_PKA_BASE 0x08040000 > +#define TNETV107X_RNG_BASE 0x08044000 > +#define TNETV107X_TIMER0_BASE 0x08086500 > +#define TNETV107X_TIMER1_BASE 0x08086600 > +#define TNETV107X_WDT0_ARM_BASE 0x08086700 > +#define TNETV107X_WDT1_DSP_BASE 0x08086800 > +#define TNETV107X_CHIP_CONFIG_SYS_BASE 0x08087000 > +#define TNETV107X_GPIO_BASE 0x08088000 > +#define TNETV107X_UART1_BASE 0x08088400 > +#define TNETV107X_TOUCHSCREEN_BASE 0x08088500 > +#define TNETV107X_SDIO0_BASE 0x08088700 > +#define TNETV107X_SDIO1_BASE 0x08088800 > +#define TNETV107X_MDIO_BASE 0x08088900 > +#define TNETV107X_KEYPAD_BASE 0x08088A00 > +#define TNETV107X_SSP_BASE 0x08088C00 > +#define TNETV107X_CLOCK_CONTROL_BASE 0x0808A000 > +#define TNETV107X_PSC_BASE 0x0808B000 > +#define TNETV107X_TDM0_BASE 0x08100000 > +#define TNETV107X_TDM1_BASE 0x08100100 > +#define TNETV107X_MCDMA_BASE 0x08108000 > +#define TNETV107X_UART0_DMA_BASE 0x08108200 > +#define TNETV107X_USBSS_BASE 0x08120000 > +#define TNETV107X_VLYNQ_CONTROL_BASE 0x0810D000 > +#define TNETV107X_ASYNC_EMIF_CNTRL_BASE 0x08200000 > +#define TNETV107X_VLYNQ_MEM_MAP_BASE 0x0C000000 > +#define TNETV107X_IMCOP_BASE 0x01CC0000 > +#define TNETV107X_MBX_LITE_BASE 0x07000000 > +#define TNETV107X_ETHSS_BASE 0x0803C000 > +#define TNETV107X_CPSW_BASE 0x0803C000 > +#define TNETV107X_SPF_BASE 0x0803C800 > +#define TNETV107X_IOPU_ETHSS_BASE 0x0803D000 > +#define TNETV107X_VTP_CNTRL_0 0x0803D800 > +#define TNETV107X_VTP_CNTRL_1 0x0803D900 > +#define TNETV107X_UART2_DMA_BASE 0x08108400 > +#define TNETV107X_INTERNAL_MEMORY 0x20000000 > +#define TNETV107X_ASYNC_EMIF_DATA_CE0_BASE 0x30000000 > +#define TNETV107X_ASYNC_EMIF_DATA_CE1_BASE 0x40000000 > +#define TNETV107X_ASYNC_EMIF_DATA_CE2_BASE 0x44000000 > +#define TNETV107X_ASYNC_EMIF_DATA_CE3_BASE 0x48000000 > +#define TNETV107X_DDR_EMIF_DATA_BASE 0x80000000 > +#define TNETV107X_DDR_EMIF_CONTROL_BASE 0x90000000 > + > +/* LPSC module definitions */ > +#define TNETV107X_LPSC_ARM 0 > +#define TNETV107X_LPSC_GEM 1 > +#define TNETV107X_LPSC_DDR2_PHY 2 > +#define TNETV107X_LPSC_TPCC 3 > +#define TNETV107X_LPSC_TPTC0 4 > +#define TNETV107X_LPSC_TPTC1 5 > +#define TNETV107X_LPSC_RAM 6 > +#define TNETV107X_LPSC_MBX_LITE 7 > +#define TNETV107X_LPSC_LCD 8 > +#define TNETV107X_LPSC_ETHSS 9 > +#define TNETV107X_LPSC_AEMIF 10 > +#define TNETV107X_LPSC_CHIP_CFG 11 > +#define TNETV107X_LPSC_TSC 12 > +#define TNETV107X_LPSC_ROM 13 > +#define TNETV107X_LPSC_UART2 14 > +#define TNETV107X_LPSC_PKTSEC 15 > +#define TNETV107X_LPSC_SECCTL 16 > +#define TNETV107X_LPSC_KEYMGR 17 > +#define TNETV107X_LPSC_KEYPAD 18 > +#define TNETV107X_LPSC_GPIO 19 > +#define TNETV107X_LPSC_MDIO 20 > +#define TNETV107X_LPSC_SDIO0 21 > +#define TNETV107X_LPSC_UART0 22 > +#define TNETV107X_LPSC_UART1 23 > +#define TNETV107X_LPSC_TIMER0 24 > +#define TNETV107X_LPSC_TIMER1 25 > +#define TNETV107X_LPSC_WDT_ARM 26 > +#define TNETV107X_LPSC_WDT_DSP 27 > +#define TNETV107X_LPSC_SSP 28 > +#define TNETV107X_LPSC_TDM0 29 > +#define TNETV107X_LPSC_VLYNQ 30 > +#define TNETV107X_LPSC_MCDMA 31 > +#define TNETV107X_LPSC_USB0 32 > +#define TNETV107X_LPSC_TDM1 33 > +#define TNETV107X_LPSC_DEBUGSS 34 > +#define TNETV107X_LPSC_ETHSS_RGMII 35 > +#define TNETV107X_LPSC_SYSTEM 36 > +#define TNETV107X_LPSC_IMCOP 37 > +#define TNETV107X_LPSC_SPARE 38 > +#define TNETV107X_LPSC_SDIO1 39 > +#define TNETV107X_LPSC_USB1 40 > +#define TNETV107X_LPSC_USBSS 41 > +#define TNETV107X_LPSC_DDR2_EMIF1_VRST 42 > +#define TNETV107X_LPSC_DDR2_EMIF2_VCTL_RST 43 > +#define TNETV107X_LPSC_MAX 44 > + > +/* Interrupt controller */ > +#define INTC_GLB_EN (TNETV107X_INTC_BASE + 0x10) > +#define INTC_HINT_EN (TNETV107X_INTC_BASE + 0x1500) > +#define INTC_EN_CLR0 (TNETV107X_INTC_BASE + 0x380) > + > +#endif /* __ASM_ARCH_HARDWARE_H */ > diff --git a/arch/arm/include/asm/arch-tnetv107x/mux.h b/arch/arm/include/asm/arch-tnetv107x/mux.h > new file mode 100644 > index 0000000..274c037 > --- /dev/null > +++ b/arch/arm/include/asm/arch-tnetv107x/mux.h > @@ -0,0 +1,307 @@ > +/* > + * TNETV107X: Pinmux APIs > + * > + * See file CREDITS for list of people who contributed to this > + * project. > + * > + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. > + */ > + > +#ifndef __ASM_ARCH_MUX_H > +#define __ASM_ARCH_MUX_H > + > +struct pin_config { > + unsigned char reg_index; > + unsigned char mask_offset; > + unsigned char mode; > +}; > + > +#define TNETV107X_MUX_CFG(reg, offset, mux_mode) \ > + { reg, offset, mux_mode } > + > +int mux_select_pin(unsigned index); These are already defined in asm/arch-tnetv107x/mux.h Remove this version > +int mux_select_pins(const short *pins); > +int mux_select_module(int lpsc); > + These are only used in mux.c Convert these to static > +enum tnetv107x_pin_mux_index { > + TNETV107X_PIN_ASR_A00, > + TNETV107X_PIN_GPIO32, > + TNETV107X_PIN_ASR_A01, > + TNETV107X_PIN_GPIO33, > + TNETV107X_PIN_ASR_A02, > + TNETV107X_PIN_GPIO34, > + TNETV107X_PIN_ASR_A03, > + TNETV107X_PIN_GPIO35, > + TNETV107X_PIN_ASR_A04, > + TNETV107X_PIN_GPIO36, > + TNETV107X_PIN_ASR_A05, > + TNETV107X_PIN_GPIO37, > + TNETV107X_PIN_ASR_A06, > + TNETV107X_PIN_GPIO38, > + TNETV107X_PIN_ASR_A07, > + TNETV107X_PIN_GPIO39, > + TNETV107X_PIN_ASR_A08, > + TNETV107X_PIN_GPIO40, > + TNETV107X_PIN_ASR_A09, > + TNETV107X_PIN_GPIO41, > + TNETV107X_PIN_ASR_A10, > + TNETV107X_PIN_GPIO42, > + TNETV107X_PIN_ASR_A11, > + TNETV107X_PIN_BOOT_STRP_0, > + TNETV107X_PIN_ASR_A12, > + TNETV107X_PIN_BOOT_STRP_1, > + TNETV107X_PIN_ASR_A13, > + TNETV107X_PIN_GPIO43, > + TNETV107X_PIN_ASR_A14, > + TNETV107X_PIN_GPIO44, > + TNETV107X_PIN_ASR_A15, > + TNETV107X_PIN_GPIO45, > + TNETV107X_PIN_ASR_A16, > + TNETV107X_PIN_GPIO46, > + TNETV107X_PIN_ASR_A17, > + TNETV107X_PIN_GPIO47, > + TNETV107X_PIN_ASR_A18, > + TNETV107X_PIN_GPIO48, > + TNETV107X_PIN_SDIO1_DATA3_0, > + TNETV107X_PIN_ASR_A19, > + TNETV107X_PIN_GPIO49, > + TNETV107X_PIN_SDIO1_DATA2_0, > + TNETV107X_PIN_ASR_A20, > + TNETV107X_PIN_GPIO50, > + TNETV107X_PIN_SDIO1_DATA1_0, > + TNETV107X_PIN_ASR_A21, > + TNETV107X_PIN_GPIO51, > + TNETV107X_PIN_SDIO1_DATA0_0, > + TNETV107X_PIN_ASR_A22, > + TNETV107X_PIN_GPIO52, > + TNETV107X_PIN_SDIO1_CMD_0, > + TNETV107X_PIN_ASR_A23, > + TNETV107X_PIN_GPIO53, > + TNETV107X_PIN_SDIO1_CLK_0, > + TNETV107X_PIN_ASR_BA_1, > + TNETV107X_PIN_GPIO54, > + TNETV107X_PIN_SYS_PLL_CLK, > + TNETV107X_PIN_ASR_CS0, > + TNETV107X_PIN_ASR_CS1, > + TNETV107X_PIN_ASR_CS2, > + TNETV107X_PIN_TDM_PLL_CLK, > + TNETV107X_PIN_ASR_CS3, > + TNETV107X_PIN_ETH_PHY_CLK, > + TNETV107X_PIN_ASR_D00, > + TNETV107X_PIN_GPIO55, > + TNETV107X_PIN_ASR_D01, > + TNETV107X_PIN_GPIO56, > + TNETV107X_PIN_ASR_D02, > + TNETV107X_PIN_GPIO57, > + TNETV107X_PIN_ASR_D03, > + TNETV107X_PIN_GPIO58, > + TNETV107X_PIN_ASR_D04, > + TNETV107X_PIN_GPIO59_0, > + TNETV107X_PIN_ASR_D05, > + TNETV107X_PIN_GPIO60_0, > + TNETV107X_PIN_ASR_D06, > + TNETV107X_PIN_GPIO61_0, > + TNETV107X_PIN_ASR_D07, > + TNETV107X_PIN_GPIO62_0, > + TNETV107X_PIN_ASR_D08, > + TNETV107X_PIN_GPIO63_0, > + TNETV107X_PIN_ASR_D09, > + TNETV107X_PIN_GPIO64_0, > + TNETV107X_PIN_ASR_D10, > + TNETV107X_PIN_SDIO1_DATA3_1, > + TNETV107X_PIN_ASR_D11, > + TNETV107X_PIN_SDIO1_DATA2_1, > + TNETV107X_PIN_ASR_D12, > + TNETV107X_PIN_SDIO1_DATA1_1, > + TNETV107X_PIN_ASR_D13, > + TNETV107X_PIN_SDIO1_DATA0_1, > + TNETV107X_PIN_ASR_D14, > + TNETV107X_PIN_SDIO1_CMD_1, > + TNETV107X_PIN_ASR_D15, > + TNETV107X_PIN_SDIO1_CLK_1, > + TNETV107X_PIN_ASR_OE, > + TNETV107X_PIN_BOOT_STRP_2, > + TNETV107X_PIN_ASR_RNW, > + TNETV107X_PIN_GPIO29_0, > + TNETV107X_PIN_ASR_WAIT, > + TNETV107X_PIN_GPIO30_0, > + TNETV107X_PIN_ASR_WE, > + TNETV107X_PIN_BOOT_STRP_3, > + TNETV107X_PIN_ASR_WE_DQM0, > + TNETV107X_PIN_GPIO31, > + TNETV107X_PIN_LCD_PD17_0, > + TNETV107X_PIN_ASR_WE_DQM1, > + TNETV107X_PIN_ASR_BA0_0, > + TNETV107X_PIN_VLYNQ_CLK, > + TNETV107X_PIN_GPIO14, > + TNETV107X_PIN_LCD_PD19_0, > + TNETV107X_PIN_VLYNQ_RXD0, > + TNETV107X_PIN_GPIO15, > + TNETV107X_PIN_LCD_PD20_0, > + TNETV107X_PIN_VLYNQ_RXD1, > + TNETV107X_PIN_GPIO16, > + TNETV107X_PIN_LCD_PD21_0, > + TNETV107X_PIN_VLYNQ_TXD0, > + TNETV107X_PIN_GPIO17, > + TNETV107X_PIN_LCD_PD22_0, > + TNETV107X_PIN_VLYNQ_TXD1, > + TNETV107X_PIN_GPIO18, > + TNETV107X_PIN_LCD_PD23_0, > + TNETV107X_PIN_SDIO0_CLK, > + TNETV107X_PIN_GPIO19, > + TNETV107X_PIN_SDIO0_CMD, > + TNETV107X_PIN_GPIO20, > + TNETV107X_PIN_SDIO0_DATA0, > + TNETV107X_PIN_GPIO21, > + TNETV107X_PIN_SDIO0_DATA1, > + TNETV107X_PIN_GPIO22, > + TNETV107X_PIN_SDIO0_DATA2, > + TNETV107X_PIN_GPIO23, > + TNETV107X_PIN_SDIO0_DATA3, > + TNETV107X_PIN_GPIO24, > + TNETV107X_PIN_EMU0, > + TNETV107X_PIN_EMU1, > + TNETV107X_PIN_RTCK, > + TNETV107X_PIN_TRST_N, > + TNETV107X_PIN_TCK, > + TNETV107X_PIN_TDI, > + TNETV107X_PIN_TDO, > + TNETV107X_PIN_TMS, > + TNETV107X_PIN_TDM1_CLK, > + TNETV107X_PIN_TDM1_RX, > + TNETV107X_PIN_TDM1_TX, > + TNETV107X_PIN_TDM1_FS, > + TNETV107X_PIN_KEYPAD_R0, > + TNETV107X_PIN_KEYPAD_R1, > + TNETV107X_PIN_KEYPAD_R2, > + TNETV107X_PIN_KEYPAD_R3, > + TNETV107X_PIN_KEYPAD_R4, > + TNETV107X_PIN_KEYPAD_R5, > + TNETV107X_PIN_KEYPAD_R6, > + TNETV107X_PIN_GPIO12, > + TNETV107X_PIN_KEYPAD_R7, > + TNETV107X_PIN_GPIO10, > + TNETV107X_PIN_KEYPAD_C0, > + TNETV107X_PIN_KEYPAD_C1, > + TNETV107X_PIN_KEYPAD_C2, > + TNETV107X_PIN_KEYPAD_C3, > + TNETV107X_PIN_KEYPAD_C4, > + TNETV107X_PIN_KEYPAD_C5, > + TNETV107X_PIN_KEYPAD_C6, > + TNETV107X_PIN_GPIO13, > + TNETV107X_PIN_TEST_CLK_IN, > + TNETV107X_PIN_KEYPAD_C7, > + TNETV107X_PIN_GPIO11, > + TNETV107X_PIN_SSP0_0, > + TNETV107X_PIN_SCC_DCLK, > + TNETV107X_PIN_LCD_PD20_1, > + TNETV107X_PIN_SSP0_1, > + TNETV107X_PIN_SCC_CS_N, > + TNETV107X_PIN_LCD_PD21_1, > + TNETV107X_PIN_SSP0_2, > + TNETV107X_PIN_SCC_D, > + TNETV107X_PIN_LCD_PD22_1, > + TNETV107X_PIN_SSP0_3, > + TNETV107X_PIN_SCC_RESETN, > + TNETV107X_PIN_LCD_PD23_1, > + TNETV107X_PIN_SSP1_0, > + TNETV107X_PIN_GPIO25, > + TNETV107X_PIN_UART2_CTS, > + TNETV107X_PIN_SSP1_1, > + TNETV107X_PIN_GPIO26, > + TNETV107X_PIN_UART2_RD, > + TNETV107X_PIN_SSP1_2, > + TNETV107X_PIN_GPIO27, > + TNETV107X_PIN_UART2_RTS, > + TNETV107X_PIN_SSP1_3, > + TNETV107X_PIN_GPIO28, > + TNETV107X_PIN_UART2_TD, > + TNETV107X_PIN_UART0_CTS, > + TNETV107X_PIN_UART0_RD, > + TNETV107X_PIN_UART0_RTS, > + TNETV107X_PIN_UART0_TD, > + TNETV107X_PIN_UART1_RD, > + TNETV107X_PIN_UART1_TD, > + TNETV107X_PIN_LCD_AC_NCS, > + TNETV107X_PIN_LCD_HSYNC_RNW, > + TNETV107X_PIN_LCD_VSYNC_A0, > + TNETV107X_PIN_LCD_MCLK, > + TNETV107X_PIN_LCD_PD16_0, > + TNETV107X_PIN_LCD_PCLK_E, > + TNETV107X_PIN_LCD_PD00, > + TNETV107X_PIN_LCD_PD01, > + TNETV107X_PIN_LCD_PD02, > + TNETV107X_PIN_LCD_PD03, > + TNETV107X_PIN_LCD_PD04, > + TNETV107X_PIN_LCD_PD05, > + TNETV107X_PIN_LCD_PD06, > + TNETV107X_PIN_LCD_PD07, > + TNETV107X_PIN_LCD_PD08, > + TNETV107X_PIN_GPIO59_1, > + TNETV107X_PIN_LCD_PD09, > + TNETV107X_PIN_GPIO60_1, > + TNETV107X_PIN_LCD_PD10, > + TNETV107X_PIN_ASR_BA0_1, > + TNETV107X_PIN_GPIO61_1, > + TNETV107X_PIN_LCD_PD11, > + TNETV107X_PIN_GPIO62_1, > + TNETV107X_PIN_LCD_PD12, > + TNETV107X_PIN_GPIO63_1, > + TNETV107X_PIN_LCD_PD13, > + TNETV107X_PIN_GPIO64_1, > + TNETV107X_PIN_LCD_PD14, > + TNETV107X_PIN_GPIO29_1, > + TNETV107X_PIN_LCD_PD15, > + TNETV107X_PIN_GPIO30_1, > + TNETV107X_PIN_EINT0, > + TNETV107X_PIN_GPIO08, > + TNETV107X_PIN_EINT1, > + TNETV107X_PIN_GPIO09, > + TNETV107X_PIN_GPIO00, > + TNETV107X_PIN_LCD_PD20_2, > + TNETV107X_PIN_TDM_CLK_IN_2, > + TNETV107X_PIN_GPIO01, > + TNETV107X_PIN_LCD_PD21_2, > + TNETV107X_PIN_24M_CLK_OUT_1, > + TNETV107X_PIN_GPIO02, > + TNETV107X_PIN_LCD_PD22_2, > + TNETV107X_PIN_GPIO03, > + TNETV107X_PIN_LCD_PD23_2, > + TNETV107X_PIN_GPIO04, > + TNETV107X_PIN_LCD_PD16_1, > + TNETV107X_PIN_USB0_RXERR, > + TNETV107X_PIN_GPIO05, > + TNETV107X_PIN_LCD_PD17_1, > + TNETV107X_PIN_TDM_CLK_IN_1, > + TNETV107X_PIN_GPIO06, > + TNETV107X_PIN_LCD_PD18, > + TNETV107X_PIN_24M_CLK_OUT_2, > + TNETV107X_PIN_GPIO07, > + TNETV107X_PIN_LCD_PD19_1, > + TNETV107X_PIN_USB1_RXERR, > + TNETV107X_PIN_ETH_PLL_CLK, > + TNETV107X_PIN_MDIO, > + TNETV107X_PIN_MDC, > + TNETV107X_PIN_AIC_MUTE_STAT_N, > + TNETV107X_PIN_TDM0_CLK, > + TNETV107X_PIN_AIC_HNS_EN_N, > + TNETV107X_PIN_TDM0_FS, > + TNETV107X_PIN_AIC_HDS_EN_STAT_N, > + TNETV107X_PIN_TDM0_TX, > + TNETV107X_PIN_AIC_HNF_EN_STAT_N, > + TNETV107X_PIN_TDM0_RX, > +}; > + > +#endif > diff --git a/arch/arm/include/asm/arch-tnetv107x/nand_defs.h b/arch/arm/include/asm/arch-tnetv107x/nand_defs.h > new file mode 100644 > index 0000000..961b710 > --- /dev/null > +++ b/arch/arm/include/asm/arch-tnetv107x/nand_defs.h > @@ -0,0 +1,38 @@ > +/* > + * TNETV107X: NAND definitions > + * > + * See file CREDITS for list of people who contributed to this > + * project. > + * > + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. > + */ > +#ifndef _NAND_DEFS_H_ > +#define _NAND_DEFS_H_ > + > +#include > +#include > + > +#define DAVINCI_ASYNC_EMIF_CNTRL_BASE TNETV107X_ASYNC_EMIF_CNTRL_BASE > + > +#define MASK_CLE 0x4000 > +#define MASK_ALE 0x2000 > + > +#define NAND_READ_START 0x00 > +#define NAND_READ_END 0x30 > +#define NAND_STATUS 0x70 > + > +extern void davinci_nand_init(struct nand_chip *nand); > + > +#endif Tom