Path: blob/master/arch/arm/mach-davinci/tnetv107x.c
10699 views
/*1* Texas Instruments TNETV107X SoC Support2*3* Copyright (C) 2010 Texas Instruments4*5* This program is free software; you can redistribute it and/or6* modify it under the terms of the GNU General Public License as7* published by the Free Software Foundation version 2.8*9* This program is distributed "as is" WITHOUT ANY WARRANTY of any10* kind, whether express or implied; without even the implied warranty11* of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the12* GNU General Public License for more details.13*/14#include <linux/kernel.h>15#include <linux/init.h>16#include <linux/clk.h>17#include <linux/io.h>18#include <linux/err.h>19#include <linux/platform_device.h>2021#include <asm/mach/map.h>2223#include <mach/common.h>24#include <mach/time.h>25#include <mach/cputype.h>26#include <mach/psc.h>27#include <mach/cp_intc.h>28#include <mach/irqs.h>29#include <mach/gpio.h>30#include <mach/hardware.h>31#include <mach/tnetv107x.h>3233#include "clock.h"34#include "mux.h"3536/* Base addresses for on-chip devices */37#define TNETV107X_INTC_BASE 0x0300000038#define TNETV107X_TIMER0_BASE 0x0808650039#define TNETV107X_TIMER1_BASE 0x0808660040#define TNETV107X_CHIP_CFG_BASE 0x0808700041#define TNETV107X_GPIO_BASE 0x0808800042#define TNETV107X_CLOCK_CONTROL_BASE 0x0808a00043#define TNETV107X_PSC_BASE 0x0808b0004445/* Reference clock frequencies */46#define OSC_FREQ_ONCHIP (24000 * 1000)47#define OSC_FREQ_OFFCHIP_SYS (25000 * 1000)48#define OSC_FREQ_OFFCHIP_ETH (25000 * 1000)49#define OSC_FREQ_OFFCHIP_TDM (19200 * 1000)5051#define N_PLLS 35253/* Clock Control Registers */54struct clk_ctrl_regs {55u32 pll_bypass;56u32 _reserved0;57u32 gem_lrst;58u32 _reserved1;59u32 pll_unlock_stat;60u32 sys_unlock;61u32 eth_unlock;62u32 tdm_unlock;63};6465/* SSPLL Registers */66struct sspll_regs {67u32 modes;68u32 post_div;69u32 pre_div;70u32 mult_factor;71u32 divider_range;72u32 bw_divider;73u32 spr_amount;74u32 spr_rate_div;75u32 diag;76};7778/* Watchdog Timer Registers */79struct wdt_regs {80u32 kick_lock;81u32 kick;82u32 change_lock;83u32 change ;84u32 disable_lock;85u32 disable;86u32 prescale_lock;87u32 prescale;88};8990static struct clk_ctrl_regs __iomem *clk_ctrl_regs;9192static struct sspll_regs __iomem *sspll_regs[N_PLLS];93static int sspll_regs_base[N_PLLS] = { 0x40, 0x80, 0xc0 };9495/* PLL bypass bit shifts in clk_ctrl_regs->pll_bypass register */96static u32 bypass_mask[N_PLLS] = { BIT(0), BIT(2), BIT(1) };9798/* offchip (external) reference clock frequencies */99static u32 pll_ext_freq[] = {100OSC_FREQ_OFFCHIP_SYS,101OSC_FREQ_OFFCHIP_TDM,102OSC_FREQ_OFFCHIP_ETH103};104105/* PSC control registers */106static u32 psc_regs[] = { TNETV107X_PSC_BASE };107108/* Host map for interrupt controller */109static u32 intc_host_map[] = { 0x01010000, 0x01010101, -1 };110111static unsigned long clk_sspll_recalc(struct clk *clk);112113/* Level 1 - the PLLs */114#define define_pll_clk(cname, pll, divmask, base) \115static struct pll_data pll_##cname##_data = { \116.num = pll, \117.div_ratio_mask = divmask, \118.phys_base = base + \119TNETV107X_CLOCK_CONTROL_BASE, \120}; \121static struct clk pll_##cname##_clk = { \122.name = "pll_" #cname "_clk", \123.pll_data = &pll_##cname##_data, \124.flags = CLK_PLL, \125.recalc = clk_sspll_recalc, \126}127128define_pll_clk(sys, 0, 0x1ff, 0x600);129define_pll_clk(tdm, 1, 0x0ff, 0x200);130define_pll_clk(eth, 2, 0x0ff, 0x400);131132/* Level 2 - divided outputs from the PLLs */133#define define_pll_div_clk(pll, cname, div) \134static struct clk pll##_##cname##_clk = { \135.name = #pll "_" #cname "_clk", \136.parent = &pll_##pll##_clk, \137.flags = CLK_PLL, \138.div_reg = PLLDIV##div, \139.set_rate = davinci_set_sysclk_rate, \140}141142define_pll_div_clk(sys, arm1176, 1);143define_pll_div_clk(sys, dsp, 2);144define_pll_div_clk(sys, ddr, 3);145define_pll_div_clk(sys, full, 4);146define_pll_div_clk(sys, lcd, 5);147define_pll_div_clk(sys, vlynq_ref, 6);148define_pll_div_clk(sys, tsc, 7);149define_pll_div_clk(sys, half, 8);150151define_pll_div_clk(eth, 5mhz, 1);152define_pll_div_clk(eth, 50mhz, 2);153define_pll_div_clk(eth, 125mhz, 3);154define_pll_div_clk(eth, 250mhz, 4);155define_pll_div_clk(eth, 25mhz, 5);156157define_pll_div_clk(tdm, 0, 1);158define_pll_div_clk(tdm, extra, 2);159define_pll_div_clk(tdm, 1, 3);160161162/* Level 3 - LPSC gated clocks */163#define __lpsc_clk(cname, _parent, mod, flg) \164static struct clk clk_##cname = { \165.name = #cname, \166.parent = &_parent, \167.lpsc = TNETV107X_LPSC_##mod,\168.flags = flg, \169}170171#define lpsc_clk_enabled(cname, parent, mod) \172__lpsc_clk(cname, parent, mod, ALWAYS_ENABLED)173174#define lpsc_clk(cname, parent, mod) \175__lpsc_clk(cname, parent, mod, 0)176177lpsc_clk_enabled(arm, sys_arm1176_clk, ARM);178lpsc_clk_enabled(gem, sys_dsp_clk, GEM);179lpsc_clk_enabled(ddr2_phy, sys_ddr_clk, DDR2_PHY);180lpsc_clk_enabled(tpcc, sys_full_clk, TPCC);181lpsc_clk_enabled(tptc0, sys_full_clk, TPTC0);182lpsc_clk_enabled(tptc1, sys_full_clk, TPTC1);183lpsc_clk_enabled(ram, sys_full_clk, RAM);184lpsc_clk_enabled(aemif, sys_full_clk, AEMIF);185lpsc_clk_enabled(chipcfg, sys_half_clk, CHIP_CFG);186lpsc_clk_enabled(rom, sys_half_clk, ROM);187lpsc_clk_enabled(secctl, sys_half_clk, SECCTL);188lpsc_clk_enabled(keymgr, sys_half_clk, KEYMGR);189lpsc_clk_enabled(gpio, sys_half_clk, GPIO);190lpsc_clk_enabled(debugss, sys_half_clk, DEBUGSS);191lpsc_clk_enabled(system, sys_half_clk, SYSTEM);192lpsc_clk_enabled(ddr2_vrst, sys_ddr_clk, DDR2_EMIF1_VRST);193lpsc_clk_enabled(ddr2_vctl_rst, sys_ddr_clk, DDR2_EMIF2_VCTL_RST);194lpsc_clk_enabled(wdt_arm, sys_half_clk, WDT_ARM);195lpsc_clk_enabled(timer1, sys_half_clk, TIMER1);196197lpsc_clk(mbx_lite, sys_arm1176_clk, MBX_LITE);198lpsc_clk(ethss, eth_125mhz_clk, ETHSS);199lpsc_clk(tsc, sys_tsc_clk, TSC);200lpsc_clk(uart0, sys_half_clk, UART0);201lpsc_clk(uart1, sys_half_clk, UART1);202lpsc_clk(uart2, sys_half_clk, UART2);203lpsc_clk(pktsec, sys_half_clk, PKTSEC);204lpsc_clk(keypad, sys_half_clk, KEYPAD);205lpsc_clk(mdio, sys_half_clk, MDIO);206lpsc_clk(sdio0, sys_half_clk, SDIO0);207lpsc_clk(sdio1, sys_half_clk, SDIO1);208lpsc_clk(timer0, sys_half_clk, TIMER0);209lpsc_clk(wdt_dsp, sys_half_clk, WDT_DSP);210lpsc_clk(ssp, sys_half_clk, SSP);211lpsc_clk(tdm0, tdm_0_clk, TDM0);212lpsc_clk(tdm1, tdm_1_clk, TDM1);213lpsc_clk(vlynq, sys_vlynq_ref_clk, VLYNQ);214lpsc_clk(mcdma, sys_half_clk, MCDMA);215lpsc_clk(usbss, sys_half_clk, USBSS);216lpsc_clk(usb0, clk_usbss, USB0);217lpsc_clk(usb1, clk_usbss, USB1);218lpsc_clk(ethss_rgmii, eth_250mhz_clk, ETHSS_RGMII);219lpsc_clk(imcop, sys_dsp_clk, IMCOP);220lpsc_clk(spare, sys_half_clk, SPARE);221222/* LCD needs a full power down to clear controller state */223__lpsc_clk(lcd, sys_lcd_clk, LCD, PSC_SWRSTDISABLE);224225226/* Level 4 - leaf clocks for LPSC modules shared across drivers */227static struct clk clk_rng = { .name = "rng", .parent = &clk_pktsec };228static struct clk clk_pka = { .name = "pka", .parent = &clk_pktsec };229230static struct clk_lookup clks[] = {231CLK(NULL, "pll_sys_clk", &pll_sys_clk),232CLK(NULL, "pll_eth_clk", &pll_eth_clk),233CLK(NULL, "pll_tdm_clk", &pll_tdm_clk),234CLK(NULL, "sys_arm1176_clk", &sys_arm1176_clk),235CLK(NULL, "sys_dsp_clk", &sys_dsp_clk),236CLK(NULL, "sys_ddr_clk", &sys_ddr_clk),237CLK(NULL, "sys_full_clk", &sys_full_clk),238CLK(NULL, "sys_lcd_clk", &sys_lcd_clk),239CLK(NULL, "sys_vlynq_ref_clk", &sys_vlynq_ref_clk),240CLK(NULL, "sys_tsc_clk", &sys_tsc_clk),241CLK(NULL, "sys_half_clk", &sys_half_clk),242CLK(NULL, "eth_5mhz_clk", ð_5mhz_clk),243CLK(NULL, "eth_50mhz_clk", ð_50mhz_clk),244CLK(NULL, "eth_125mhz_clk", ð_125mhz_clk),245CLK(NULL, "eth_250mhz_clk", ð_250mhz_clk),246CLK(NULL, "eth_25mhz_clk", ð_25mhz_clk),247CLK(NULL, "tdm_0_clk", &tdm_0_clk),248CLK(NULL, "tdm_extra_clk", &tdm_extra_clk),249CLK(NULL, "tdm_1_clk", &tdm_1_clk),250CLK(NULL, "clk_arm", &clk_arm),251CLK(NULL, "clk_gem", &clk_gem),252CLK(NULL, "clk_ddr2_phy", &clk_ddr2_phy),253CLK(NULL, "clk_tpcc", &clk_tpcc),254CLK(NULL, "clk_tptc0", &clk_tptc0),255CLK(NULL, "clk_tptc1", &clk_tptc1),256CLK(NULL, "clk_ram", &clk_ram),257CLK(NULL, "clk_mbx_lite", &clk_mbx_lite),258CLK("tnetv107x-fb.0", NULL, &clk_lcd),259CLK(NULL, "clk_ethss", &clk_ethss),260CLK(NULL, "aemif", &clk_aemif),261CLK(NULL, "clk_chipcfg", &clk_chipcfg),262CLK("tnetv107x-ts.0", NULL, &clk_tsc),263CLK(NULL, "clk_rom", &clk_rom),264CLK(NULL, "uart2", &clk_uart2),265CLK(NULL, "clk_pktsec", &clk_pktsec),266CLK("tnetv107x-rng.0", NULL, &clk_rng),267CLK("tnetv107x-pka.0", NULL, &clk_pka),268CLK(NULL, "clk_secctl", &clk_secctl),269CLK(NULL, "clk_keymgr", &clk_keymgr),270CLK("tnetv107x-keypad.0", NULL, &clk_keypad),271CLK(NULL, "clk_gpio", &clk_gpio),272CLK(NULL, "clk_mdio", &clk_mdio),273CLK("davinci_mmc.0", NULL, &clk_sdio0),274CLK(NULL, "uart0", &clk_uart0),275CLK(NULL, "uart1", &clk_uart1),276CLK(NULL, "timer0", &clk_timer0),277CLK(NULL, "timer1", &clk_timer1),278CLK("tnetv107x_wdt.0", NULL, &clk_wdt_arm),279CLK(NULL, "clk_wdt_dsp", &clk_wdt_dsp),280CLK("ti-ssp", NULL, &clk_ssp),281CLK(NULL, "clk_tdm0", &clk_tdm0),282CLK(NULL, "clk_vlynq", &clk_vlynq),283CLK(NULL, "clk_mcdma", &clk_mcdma),284CLK(NULL, "clk_usbss", &clk_usbss),285CLK(NULL, "clk_usb0", &clk_usb0),286CLK(NULL, "clk_usb1", &clk_usb1),287CLK(NULL, "clk_tdm1", &clk_tdm1),288CLK(NULL, "clk_debugss", &clk_debugss),289CLK(NULL, "clk_ethss_rgmii", &clk_ethss_rgmii),290CLK(NULL, "clk_system", &clk_system),291CLK(NULL, "clk_imcop", &clk_imcop),292CLK(NULL, "clk_spare", &clk_spare),293CLK("davinci_mmc.1", NULL, &clk_sdio1),294CLK(NULL, "clk_ddr2_vrst", &clk_ddr2_vrst),295CLK(NULL, "clk_ddr2_vctl_rst", &clk_ddr2_vctl_rst),296CLK(NULL, NULL, NULL),297};298299static const struct mux_config pins[] = {300#ifdef CONFIG_DAVINCI_MUX301MUX_CFG(TNETV107X, ASR_A00, 0, 0, 0x1f, 0x00, false)302MUX_CFG(TNETV107X, GPIO32, 0, 0, 0x1f, 0x04, false)303MUX_CFG(TNETV107X, ASR_A01, 0, 5, 0x1f, 0x00, false)304MUX_CFG(TNETV107X, GPIO33, 0, 5, 0x1f, 0x04, false)305MUX_CFG(TNETV107X, ASR_A02, 0, 10, 0x1f, 0x00, false)306MUX_CFG(TNETV107X, GPIO34, 0, 10, 0x1f, 0x04, false)307MUX_CFG(TNETV107X, ASR_A03, 0, 15, 0x1f, 0x00, false)308MUX_CFG(TNETV107X, GPIO35, 0, 15, 0x1f, 0x04, false)309MUX_CFG(TNETV107X, ASR_A04, 0, 20, 0x1f, 0x00, false)310MUX_CFG(TNETV107X, GPIO36, 0, 20, 0x1f, 0x04, false)311MUX_CFG(TNETV107X, ASR_A05, 0, 25, 0x1f, 0x00, false)312MUX_CFG(TNETV107X, GPIO37, 0, 25, 0x1f, 0x04, false)313MUX_CFG(TNETV107X, ASR_A06, 1, 0, 0x1f, 0x00, false)314MUX_CFG(TNETV107X, GPIO38, 1, 0, 0x1f, 0x04, false)315MUX_CFG(TNETV107X, ASR_A07, 1, 5, 0x1f, 0x00, false)316MUX_CFG(TNETV107X, GPIO39, 1, 5, 0x1f, 0x04, false)317MUX_CFG(TNETV107X, ASR_A08, 1, 10, 0x1f, 0x00, false)318MUX_CFG(TNETV107X, GPIO40, 1, 10, 0x1f, 0x04, false)319MUX_CFG(TNETV107X, ASR_A09, 1, 15, 0x1f, 0x00, false)320MUX_CFG(TNETV107X, GPIO41, 1, 15, 0x1f, 0x04, false)321MUX_CFG(TNETV107X, ASR_A10, 1, 20, 0x1f, 0x00, false)322MUX_CFG(TNETV107X, GPIO42, 1, 20, 0x1f, 0x04, false)323MUX_CFG(TNETV107X, ASR_A11, 1, 25, 0x1f, 0x00, false)324MUX_CFG(TNETV107X, BOOT_STRP_0, 1, 25, 0x1f, 0x04, false)325MUX_CFG(TNETV107X, ASR_A12, 2, 0, 0x1f, 0x00, false)326MUX_CFG(TNETV107X, BOOT_STRP_1, 2, 0, 0x1f, 0x04, false)327MUX_CFG(TNETV107X, ASR_A13, 2, 5, 0x1f, 0x00, false)328MUX_CFG(TNETV107X, GPIO43, 2, 5, 0x1f, 0x04, false)329MUX_CFG(TNETV107X, ASR_A14, 2, 10, 0x1f, 0x00, false)330MUX_CFG(TNETV107X, GPIO44, 2, 10, 0x1f, 0x04, false)331MUX_CFG(TNETV107X, ASR_A15, 2, 15, 0x1f, 0x00, false)332MUX_CFG(TNETV107X, GPIO45, 2, 15, 0x1f, 0x04, false)333MUX_CFG(TNETV107X, ASR_A16, 2, 20, 0x1f, 0x00, false)334MUX_CFG(TNETV107X, GPIO46, 2, 20, 0x1f, 0x04, false)335MUX_CFG(TNETV107X, ASR_A17, 2, 25, 0x1f, 0x00, false)336MUX_CFG(TNETV107X, GPIO47, 2, 25, 0x1f, 0x04, false)337MUX_CFG(TNETV107X, ASR_A18, 3, 0, 0x1f, 0x00, false)338MUX_CFG(TNETV107X, GPIO48, 3, 0, 0x1f, 0x04, false)339MUX_CFG(TNETV107X, SDIO1_DATA3_0, 3, 0, 0x1f, 0x1c, false)340MUX_CFG(TNETV107X, ASR_A19, 3, 5, 0x1f, 0x00, false)341MUX_CFG(TNETV107X, GPIO49, 3, 5, 0x1f, 0x04, false)342MUX_CFG(TNETV107X, SDIO1_DATA2_0, 3, 5, 0x1f, 0x1c, false)343MUX_CFG(TNETV107X, ASR_A20, 3, 10, 0x1f, 0x00, false)344MUX_CFG(TNETV107X, GPIO50, 3, 10, 0x1f, 0x04, false)345MUX_CFG(TNETV107X, SDIO1_DATA1_0, 3, 10, 0x1f, 0x1c, false)346MUX_CFG(TNETV107X, ASR_A21, 3, 15, 0x1f, 0x00, false)347MUX_CFG(TNETV107X, GPIO51, 3, 15, 0x1f, 0x04, false)348MUX_CFG(TNETV107X, SDIO1_DATA0_0, 3, 15, 0x1f, 0x1c, false)349MUX_CFG(TNETV107X, ASR_A22, 3, 20, 0x1f, 0x00, false)350MUX_CFG(TNETV107X, GPIO52, 3, 20, 0x1f, 0x04, false)351MUX_CFG(TNETV107X, SDIO1_CMD_0, 3, 20, 0x1f, 0x1c, false)352MUX_CFG(TNETV107X, ASR_A23, 3, 25, 0x1f, 0x00, false)353MUX_CFG(TNETV107X, GPIO53, 3, 25, 0x1f, 0x04, false)354MUX_CFG(TNETV107X, SDIO1_CLK_0, 3, 25, 0x1f, 0x1c, false)355MUX_CFG(TNETV107X, ASR_BA_1, 4, 0, 0x1f, 0x00, false)356MUX_CFG(TNETV107X, GPIO54, 4, 0, 0x1f, 0x04, false)357MUX_CFG(TNETV107X, SYS_PLL_CLK, 4, 0, 0x1f, 0x1c, false)358MUX_CFG(TNETV107X, ASR_CS0, 4, 5, 0x1f, 0x00, false)359MUX_CFG(TNETV107X, ASR_CS1, 4, 10, 0x1f, 0x00, false)360MUX_CFG(TNETV107X, ASR_CS2, 4, 15, 0x1f, 0x00, false)361MUX_CFG(TNETV107X, TDM_PLL_CLK, 4, 15, 0x1f, 0x1c, false)362MUX_CFG(TNETV107X, ASR_CS3, 4, 20, 0x1f, 0x00, false)363MUX_CFG(TNETV107X, ETH_PHY_CLK, 4, 20, 0x1f, 0x0c, false)364MUX_CFG(TNETV107X, ASR_D00, 4, 25, 0x1f, 0x00, false)365MUX_CFG(TNETV107X, GPIO55, 4, 25, 0x1f, 0x1c, false)366MUX_CFG(TNETV107X, ASR_D01, 5, 0, 0x1f, 0x00, false)367MUX_CFG(TNETV107X, GPIO56, 5, 0, 0x1f, 0x1c, false)368MUX_CFG(TNETV107X, ASR_D02, 5, 5, 0x1f, 0x00, false)369MUX_CFG(TNETV107X, GPIO57, 5, 5, 0x1f, 0x1c, false)370MUX_CFG(TNETV107X, ASR_D03, 5, 10, 0x1f, 0x00, false)371MUX_CFG(TNETV107X, GPIO58, 5, 10, 0x1f, 0x1c, false)372MUX_CFG(TNETV107X, ASR_D04, 5, 15, 0x1f, 0x00, false)373MUX_CFG(TNETV107X, GPIO59_0, 5, 15, 0x1f, 0x1c, false)374MUX_CFG(TNETV107X, ASR_D05, 5, 20, 0x1f, 0x00, false)375MUX_CFG(TNETV107X, GPIO60_0, 5, 20, 0x1f, 0x1c, false)376MUX_CFG(TNETV107X, ASR_D06, 5, 25, 0x1f, 0x00, false)377MUX_CFG(TNETV107X, GPIO61_0, 5, 25, 0x1f, 0x1c, false)378MUX_CFG(TNETV107X, ASR_D07, 6, 0, 0x1f, 0x00, false)379MUX_CFG(TNETV107X, GPIO62_0, 6, 0, 0x1f, 0x1c, false)380MUX_CFG(TNETV107X, ASR_D08, 6, 5, 0x1f, 0x00, false)381MUX_CFG(TNETV107X, GPIO63_0, 6, 5, 0x1f, 0x1c, false)382MUX_CFG(TNETV107X, ASR_D09, 6, 10, 0x1f, 0x00, false)383MUX_CFG(TNETV107X, GPIO64_0, 6, 10, 0x1f, 0x1c, false)384MUX_CFG(TNETV107X, ASR_D10, 6, 15, 0x1f, 0x00, false)385MUX_CFG(TNETV107X, SDIO1_DATA3_1, 6, 15, 0x1f, 0x1c, false)386MUX_CFG(TNETV107X, ASR_D11, 6, 20, 0x1f, 0x00, false)387MUX_CFG(TNETV107X, SDIO1_DATA2_1, 6, 20, 0x1f, 0x1c, false)388MUX_CFG(TNETV107X, ASR_D12, 6, 25, 0x1f, 0x00, false)389MUX_CFG(TNETV107X, SDIO1_DATA1_1, 6, 25, 0x1f, 0x1c, false)390MUX_CFG(TNETV107X, ASR_D13, 7, 0, 0x1f, 0x00, false)391MUX_CFG(TNETV107X, SDIO1_DATA0_1, 7, 0, 0x1f, 0x1c, false)392MUX_CFG(TNETV107X, ASR_D14, 7, 5, 0x1f, 0x00, false)393MUX_CFG(TNETV107X, SDIO1_CMD_1, 7, 5, 0x1f, 0x1c, false)394MUX_CFG(TNETV107X, ASR_D15, 7, 10, 0x1f, 0x00, false)395MUX_CFG(TNETV107X, SDIO1_CLK_1, 7, 10, 0x1f, 0x1c, false)396MUX_CFG(TNETV107X, ASR_OE, 7, 15, 0x1f, 0x00, false)397MUX_CFG(TNETV107X, BOOT_STRP_2, 7, 15, 0x1f, 0x04, false)398MUX_CFG(TNETV107X, ASR_RNW, 7, 20, 0x1f, 0x00, false)399MUX_CFG(TNETV107X, GPIO29_0, 7, 20, 0x1f, 0x04, false)400MUX_CFG(TNETV107X, ASR_WAIT, 7, 25, 0x1f, 0x00, false)401MUX_CFG(TNETV107X, GPIO30_0, 7, 25, 0x1f, 0x04, false)402MUX_CFG(TNETV107X, ASR_WE, 8, 0, 0x1f, 0x00, false)403MUX_CFG(TNETV107X, BOOT_STRP_3, 8, 0, 0x1f, 0x04, false)404MUX_CFG(TNETV107X, ASR_WE_DQM0, 8, 5, 0x1f, 0x00, false)405MUX_CFG(TNETV107X, GPIO31, 8, 5, 0x1f, 0x04, false)406MUX_CFG(TNETV107X, LCD_PD17_0, 8, 5, 0x1f, 0x1c, false)407MUX_CFG(TNETV107X, ASR_WE_DQM1, 8, 10, 0x1f, 0x00, false)408MUX_CFG(TNETV107X, ASR_BA0_0, 8, 10, 0x1f, 0x04, false)409MUX_CFG(TNETV107X, VLYNQ_CLK, 9, 0, 0x1f, 0x00, false)410MUX_CFG(TNETV107X, GPIO14, 9, 0, 0x1f, 0x04, false)411MUX_CFG(TNETV107X, LCD_PD19_0, 9, 0, 0x1f, 0x1c, false)412MUX_CFG(TNETV107X, VLYNQ_RXD0, 9, 5, 0x1f, 0x00, false)413MUX_CFG(TNETV107X, GPIO15, 9, 5, 0x1f, 0x04, false)414MUX_CFG(TNETV107X, LCD_PD20_0, 9, 5, 0x1f, 0x1c, false)415MUX_CFG(TNETV107X, VLYNQ_RXD1, 9, 10, 0x1f, 0x00, false)416MUX_CFG(TNETV107X, GPIO16, 9, 10, 0x1f, 0x04, false)417MUX_CFG(TNETV107X, LCD_PD21_0, 9, 10, 0x1f, 0x1c, false)418MUX_CFG(TNETV107X, VLYNQ_TXD0, 9, 15, 0x1f, 0x00, false)419MUX_CFG(TNETV107X, GPIO17, 9, 15, 0x1f, 0x04, false)420MUX_CFG(TNETV107X, LCD_PD22_0, 9, 15, 0x1f, 0x1c, false)421MUX_CFG(TNETV107X, VLYNQ_TXD1, 9, 20, 0x1f, 0x00, false)422MUX_CFG(TNETV107X, GPIO18, 9, 20, 0x1f, 0x04, false)423MUX_CFG(TNETV107X, LCD_PD23_0, 9, 20, 0x1f, 0x1c, false)424MUX_CFG(TNETV107X, SDIO0_CLK, 10, 0, 0x1f, 0x00, false)425MUX_CFG(TNETV107X, GPIO19, 10, 0, 0x1f, 0x04, false)426MUX_CFG(TNETV107X, SDIO0_CMD, 10, 5, 0x1f, 0x00, false)427MUX_CFG(TNETV107X, GPIO20, 10, 5, 0x1f, 0x04, false)428MUX_CFG(TNETV107X, SDIO0_DATA0, 10, 10, 0x1f, 0x00, false)429MUX_CFG(TNETV107X, GPIO21, 10, 10, 0x1f, 0x04, false)430MUX_CFG(TNETV107X, SDIO0_DATA1, 10, 15, 0x1f, 0x00, false)431MUX_CFG(TNETV107X, GPIO22, 10, 15, 0x1f, 0x04, false)432MUX_CFG(TNETV107X, SDIO0_DATA2, 10, 20, 0x1f, 0x00, false)433MUX_CFG(TNETV107X, GPIO23, 10, 20, 0x1f, 0x04, false)434MUX_CFG(TNETV107X, SDIO0_DATA3, 10, 25, 0x1f, 0x00, false)435MUX_CFG(TNETV107X, GPIO24, 10, 25, 0x1f, 0x04, false)436MUX_CFG(TNETV107X, EMU0, 11, 0, 0x1f, 0x00, false)437MUX_CFG(TNETV107X, EMU1, 11, 5, 0x1f, 0x00, false)438MUX_CFG(TNETV107X, RTCK, 12, 0, 0x1f, 0x00, false)439MUX_CFG(TNETV107X, TRST_N, 12, 5, 0x1f, 0x00, false)440MUX_CFG(TNETV107X, TCK, 12, 10, 0x1f, 0x00, false)441MUX_CFG(TNETV107X, TDI, 12, 15, 0x1f, 0x00, false)442MUX_CFG(TNETV107X, TDO, 12, 20, 0x1f, 0x00, false)443MUX_CFG(TNETV107X, TMS, 12, 25, 0x1f, 0x00, false)444MUX_CFG(TNETV107X, TDM1_CLK, 13, 0, 0x1f, 0x00, false)445MUX_CFG(TNETV107X, TDM1_RX, 13, 5, 0x1f, 0x00, false)446MUX_CFG(TNETV107X, TDM1_TX, 13, 10, 0x1f, 0x00, false)447MUX_CFG(TNETV107X, TDM1_FS, 13, 15, 0x1f, 0x00, false)448MUX_CFG(TNETV107X, KEYPAD_R0, 14, 0, 0x1f, 0x00, false)449MUX_CFG(TNETV107X, KEYPAD_R1, 14, 5, 0x1f, 0x00, false)450MUX_CFG(TNETV107X, KEYPAD_R2, 14, 10, 0x1f, 0x00, false)451MUX_CFG(TNETV107X, KEYPAD_R3, 14, 15, 0x1f, 0x00, false)452MUX_CFG(TNETV107X, KEYPAD_R4, 14, 20, 0x1f, 0x00, false)453MUX_CFG(TNETV107X, KEYPAD_R5, 14, 25, 0x1f, 0x00, false)454MUX_CFG(TNETV107X, KEYPAD_R6, 15, 0, 0x1f, 0x00, false)455MUX_CFG(TNETV107X, GPIO12, 15, 0, 0x1f, 0x04, false)456MUX_CFG(TNETV107X, KEYPAD_R7, 15, 5, 0x1f, 0x00, false)457MUX_CFG(TNETV107X, GPIO10, 15, 5, 0x1f, 0x04, false)458MUX_CFG(TNETV107X, KEYPAD_C0, 15, 10, 0x1f, 0x00, false)459MUX_CFG(TNETV107X, KEYPAD_C1, 15, 15, 0x1f, 0x00, false)460MUX_CFG(TNETV107X, KEYPAD_C2, 15, 20, 0x1f, 0x00, false)461MUX_CFG(TNETV107X, KEYPAD_C3, 15, 25, 0x1f, 0x00, false)462MUX_CFG(TNETV107X, KEYPAD_C4, 16, 0, 0x1f, 0x00, false)463MUX_CFG(TNETV107X, KEYPAD_C5, 16, 5, 0x1f, 0x00, false)464MUX_CFG(TNETV107X, KEYPAD_C6, 16, 10, 0x1f, 0x00, false)465MUX_CFG(TNETV107X, GPIO13, 16, 10, 0x1f, 0x04, false)466MUX_CFG(TNETV107X, TEST_CLK_IN, 16, 10, 0x1f, 0x0c, false)467MUX_CFG(TNETV107X, KEYPAD_C7, 16, 15, 0x1f, 0x00, false)468MUX_CFG(TNETV107X, GPIO11, 16, 15, 0x1f, 0x04, false)469MUX_CFG(TNETV107X, SSP0_0, 17, 0, 0x1f, 0x00, false)470MUX_CFG(TNETV107X, SCC_DCLK, 17, 0, 0x1f, 0x04, false)471MUX_CFG(TNETV107X, LCD_PD20_1, 17, 0, 0x1f, 0x0c, false)472MUX_CFG(TNETV107X, SSP0_1, 17, 5, 0x1f, 0x00, false)473MUX_CFG(TNETV107X, SCC_CS_N, 17, 5, 0x1f, 0x04, false)474MUX_CFG(TNETV107X, LCD_PD21_1, 17, 5, 0x1f, 0x0c, false)475MUX_CFG(TNETV107X, SSP0_2, 17, 10, 0x1f, 0x00, false)476MUX_CFG(TNETV107X, SCC_D, 17, 10, 0x1f, 0x04, false)477MUX_CFG(TNETV107X, LCD_PD22_1, 17, 10, 0x1f, 0x0c, false)478MUX_CFG(TNETV107X, SSP0_3, 17, 15, 0x1f, 0x00, false)479MUX_CFG(TNETV107X, SCC_RESETN, 17, 15, 0x1f, 0x04, false)480MUX_CFG(TNETV107X, LCD_PD23_1, 17, 15, 0x1f, 0x0c, false)481MUX_CFG(TNETV107X, SSP1_0, 18, 0, 0x1f, 0x00, false)482MUX_CFG(TNETV107X, GPIO25, 18, 0, 0x1f, 0x04, false)483MUX_CFG(TNETV107X, UART2_CTS, 18, 0, 0x1f, 0x0c, false)484MUX_CFG(TNETV107X, SSP1_1, 18, 5, 0x1f, 0x00, false)485MUX_CFG(TNETV107X, GPIO26, 18, 5, 0x1f, 0x04, false)486MUX_CFG(TNETV107X, UART2_RD, 18, 5, 0x1f, 0x0c, false)487MUX_CFG(TNETV107X, SSP1_2, 18, 10, 0x1f, 0x00, false)488MUX_CFG(TNETV107X, GPIO27, 18, 10, 0x1f, 0x04, false)489MUX_CFG(TNETV107X, UART2_RTS, 18, 10, 0x1f, 0x0c, false)490MUX_CFG(TNETV107X, SSP1_3, 18, 15, 0x1f, 0x00, false)491MUX_CFG(TNETV107X, GPIO28, 18, 15, 0x1f, 0x04, false)492MUX_CFG(TNETV107X, UART2_TD, 18, 15, 0x1f, 0x0c, false)493MUX_CFG(TNETV107X, UART0_CTS, 19, 0, 0x1f, 0x00, false)494MUX_CFG(TNETV107X, UART0_RD, 19, 5, 0x1f, 0x00, false)495MUX_CFG(TNETV107X, UART0_RTS, 19, 10, 0x1f, 0x00, false)496MUX_CFG(TNETV107X, UART0_TD, 19, 15, 0x1f, 0x00, false)497MUX_CFG(TNETV107X, UART1_RD, 19, 20, 0x1f, 0x00, false)498MUX_CFG(TNETV107X, UART1_TD, 19, 25, 0x1f, 0x00, false)499MUX_CFG(TNETV107X, LCD_AC_NCS, 20, 0, 0x1f, 0x00, false)500MUX_CFG(TNETV107X, LCD_HSYNC_RNW, 20, 5, 0x1f, 0x00, false)501MUX_CFG(TNETV107X, LCD_VSYNC_A0, 20, 10, 0x1f, 0x00, false)502MUX_CFG(TNETV107X, LCD_MCLK, 20, 15, 0x1f, 0x00, false)503MUX_CFG(TNETV107X, LCD_PD16_0, 20, 15, 0x1f, 0x0c, false)504MUX_CFG(TNETV107X, LCD_PCLK_E, 20, 20, 0x1f, 0x00, false)505MUX_CFG(TNETV107X, LCD_PD00, 20, 25, 0x1f, 0x00, false)506MUX_CFG(TNETV107X, LCD_PD01, 21, 0, 0x1f, 0x00, false)507MUX_CFG(TNETV107X, LCD_PD02, 21, 5, 0x1f, 0x00, false)508MUX_CFG(TNETV107X, LCD_PD03, 21, 10, 0x1f, 0x00, false)509MUX_CFG(TNETV107X, LCD_PD04, 21, 15, 0x1f, 0x00, false)510MUX_CFG(TNETV107X, LCD_PD05, 21, 20, 0x1f, 0x00, false)511MUX_CFG(TNETV107X, LCD_PD06, 21, 25, 0x1f, 0x00, false)512MUX_CFG(TNETV107X, LCD_PD07, 22, 0, 0x1f, 0x00, false)513MUX_CFG(TNETV107X, LCD_PD08, 22, 5, 0x1f, 0x00, false)514MUX_CFG(TNETV107X, GPIO59_1, 22, 5, 0x1f, 0x0c, false)515MUX_CFG(TNETV107X, LCD_PD09, 22, 10, 0x1f, 0x00, false)516MUX_CFG(TNETV107X, GPIO60_1, 22, 10, 0x1f, 0x0c, false)517MUX_CFG(TNETV107X, LCD_PD10, 22, 15, 0x1f, 0x00, false)518MUX_CFG(TNETV107X, ASR_BA0_1, 22, 15, 0x1f, 0x04, false)519MUX_CFG(TNETV107X, GPIO61_1, 22, 15, 0x1f, 0x0c, false)520MUX_CFG(TNETV107X, LCD_PD11, 22, 20, 0x1f, 0x00, false)521MUX_CFG(TNETV107X, GPIO62_1, 22, 20, 0x1f, 0x0c, false)522MUX_CFG(TNETV107X, LCD_PD12, 22, 25, 0x1f, 0x00, false)523MUX_CFG(TNETV107X, GPIO63_1, 22, 25, 0x1f, 0x0c, false)524MUX_CFG(TNETV107X, LCD_PD13, 23, 0, 0x1f, 0x00, false)525MUX_CFG(TNETV107X, GPIO64_1, 23, 0, 0x1f, 0x0c, false)526MUX_CFG(TNETV107X, LCD_PD14, 23, 5, 0x1f, 0x00, false)527MUX_CFG(TNETV107X, GPIO29_1, 23, 5, 0x1f, 0x0c, false)528MUX_CFG(TNETV107X, LCD_PD15, 23, 10, 0x1f, 0x00, false)529MUX_CFG(TNETV107X, GPIO30_1, 23, 10, 0x1f, 0x0c, false)530MUX_CFG(TNETV107X, EINT0, 24, 0, 0x1f, 0x00, false)531MUX_CFG(TNETV107X, GPIO08, 24, 0, 0x1f, 0x04, false)532MUX_CFG(TNETV107X, EINT1, 24, 5, 0x1f, 0x00, false)533MUX_CFG(TNETV107X, GPIO09, 24, 5, 0x1f, 0x04, false)534MUX_CFG(TNETV107X, GPIO00, 24, 10, 0x1f, 0x00, false)535MUX_CFG(TNETV107X, LCD_PD20_2, 24, 10, 0x1f, 0x04, false)536MUX_CFG(TNETV107X, TDM_CLK_IN_2, 24, 10, 0x1f, 0x0c, false)537MUX_CFG(TNETV107X, GPIO01, 24, 15, 0x1f, 0x00, false)538MUX_CFG(TNETV107X, LCD_PD21_2, 24, 15, 0x1f, 0x04, false)539MUX_CFG(TNETV107X, 24M_CLK_OUT_1, 24, 15, 0x1f, 0x0c, false)540MUX_CFG(TNETV107X, GPIO02, 24, 20, 0x1f, 0x00, false)541MUX_CFG(TNETV107X, LCD_PD22_2, 24, 20, 0x1f, 0x04, false)542MUX_CFG(TNETV107X, GPIO03, 24, 25, 0x1f, 0x00, false)543MUX_CFG(TNETV107X, LCD_PD23_2, 24, 25, 0x1f, 0x04, false)544MUX_CFG(TNETV107X, GPIO04, 25, 0, 0x1f, 0x00, false)545MUX_CFG(TNETV107X, LCD_PD16_1, 25, 0, 0x1f, 0x04, false)546MUX_CFG(TNETV107X, USB0_RXERR, 25, 0, 0x1f, 0x0c, false)547MUX_CFG(TNETV107X, GPIO05, 25, 5, 0x1f, 0x00, false)548MUX_CFG(TNETV107X, LCD_PD17_1, 25, 5, 0x1f, 0x04, false)549MUX_CFG(TNETV107X, TDM_CLK_IN_1, 25, 5, 0x1f, 0x0c, false)550MUX_CFG(TNETV107X, GPIO06, 25, 10, 0x1f, 0x00, false)551MUX_CFG(TNETV107X, LCD_PD18, 25, 10, 0x1f, 0x04, false)552MUX_CFG(TNETV107X, 24M_CLK_OUT_2, 25, 10, 0x1f, 0x0c, false)553MUX_CFG(TNETV107X, GPIO07, 25, 15, 0x1f, 0x00, false)554MUX_CFG(TNETV107X, LCD_PD19_1, 25, 15, 0x1f, 0x04, false)555MUX_CFG(TNETV107X, USB1_RXERR, 25, 15, 0x1f, 0x0c, false)556MUX_CFG(TNETV107X, ETH_PLL_CLK, 25, 15, 0x1f, 0x1c, false)557MUX_CFG(TNETV107X, MDIO, 26, 0, 0x1f, 0x00, false)558MUX_CFG(TNETV107X, MDC, 26, 5, 0x1f, 0x00, false)559MUX_CFG(TNETV107X, AIC_MUTE_STAT_N, 26, 10, 0x1f, 0x00, false)560MUX_CFG(TNETV107X, TDM0_CLK, 26, 10, 0x1f, 0x04, false)561MUX_CFG(TNETV107X, AIC_HNS_EN_N, 26, 15, 0x1f, 0x00, false)562MUX_CFG(TNETV107X, TDM0_FS, 26, 15, 0x1f, 0x04, false)563MUX_CFG(TNETV107X, AIC_HDS_EN_STAT_N, 26, 20, 0x1f, 0x00, false)564MUX_CFG(TNETV107X, TDM0_TX, 26, 20, 0x1f, 0x04, false)565MUX_CFG(TNETV107X, AIC_HNF_EN_STAT_N, 26, 25, 0x1f, 0x00, false)566MUX_CFG(TNETV107X, TDM0_RX, 26, 25, 0x1f, 0x04, false)567#endif568};569570/* FIQ are pri 0-1; otherwise 2-7, with 7 lowest priority */571static u8 irq_prios[TNETV107X_N_CP_INTC_IRQ] = {572/* fill in default priority 7 */573[0 ... (TNETV107X_N_CP_INTC_IRQ - 1)] = 7,574/* now override as needed, e.g. [xxx] = 5 */575};576577/* Contents of JTAG ID register used to identify exact cpu type */578static struct davinci_id ids[] = {579{580.variant = 0x0,581.part_no = 0xb8a1,582.manufacturer = 0x017,583.cpu_id = DAVINCI_CPU_ID_TNETV107X,584.name = "tnetv107x rev 1.0",585},586{587.variant = 0x1,588.part_no = 0xb8a1,589.manufacturer = 0x017,590.cpu_id = DAVINCI_CPU_ID_TNETV107X,591.name = "tnetv107x rev 1.1/1.2",592},593};594595static struct davinci_timer_instance timer_instance[2] = {596{597.base = TNETV107X_TIMER0_BASE,598.bottom_irq = IRQ_TNETV107X_TIMER_0_TINT12,599.top_irq = IRQ_TNETV107X_TIMER_0_TINT34,600},601{602.base = TNETV107X_TIMER1_BASE,603.bottom_irq = IRQ_TNETV107X_TIMER_1_TINT12,604.top_irq = IRQ_TNETV107X_TIMER_1_TINT34,605},606};607608static struct davinci_timer_info timer_info = {609.timers = timer_instance,610.clockevent_id = T0_BOT,611.clocksource_id = T0_TOP,612};613614/*615* TNETV107X platforms do not use the static mappings from Davinci616* IO_PHYS/IO_VIRT. This SOC's interesting MMRs are at different addresses,617* and changing IO_PHYS would break away from existing Davinci SOCs.618*619* The primary impact of the current model is that IO_ADDRESS() is not to be620* used to map registers on TNETV107X.621*622* 1. The first chunk is for INTC: This needs to be mapped in via iotable623* because ioremap() does not seem to be operational at the time when624* irqs are initialized. Without this, consistent dma init bombs.625*626* 2. The second chunk maps in register areas that need to be populated into627* davinci_soc_info. Note that alignment restrictions come into play if628* low-level debug is enabled (see note in <mach/tnetv107x.h>).629*/630static struct map_desc io_desc[] = {631{ /* INTC */632.virtual = IO_VIRT,633.pfn = __phys_to_pfn(TNETV107X_INTC_BASE),634.length = SZ_16K,635.type = MT_DEVICE636},637{ /* Most of the rest */638.virtual = TNETV107X_IO_VIRT,639.pfn = __phys_to_pfn(TNETV107X_IO_BASE),640.length = IO_SIZE - SZ_1M,641.type = MT_DEVICE642},643};644645static unsigned long clk_sspll_recalc(struct clk *clk)646{647int pll;648unsigned long mult = 0, prediv = 1, postdiv = 1;649unsigned long ref = OSC_FREQ_ONCHIP, ret;650u32 tmp;651652if (WARN_ON(!clk->pll_data))653return clk->rate;654655if (!clk_ctrl_regs) {656void __iomem *tmp;657658tmp = ioremap(TNETV107X_CLOCK_CONTROL_BASE, SZ_4K);659660if (WARN(!tmp, "failed ioremap for clock control regs\n"))661return clk->parent ? clk->parent->rate : 0;662663for (pll = 0; pll < N_PLLS; pll++)664sspll_regs[pll] = tmp + sspll_regs_base[pll];665666clk_ctrl_regs = tmp;667}668669pll = clk->pll_data->num;670671tmp = __raw_readl(&clk_ctrl_regs->pll_bypass);672if (!(tmp & bypass_mask[pll])) {673mult = __raw_readl(&sspll_regs[pll]->mult_factor);674prediv = __raw_readl(&sspll_regs[pll]->pre_div) + 1;675postdiv = __raw_readl(&sspll_regs[pll]->post_div) + 1;676}677678tmp = __raw_readl(clk->pll_data->base + PLLCTL);679if (tmp & PLLCTL_CLKMODE)680ref = pll_ext_freq[pll];681682clk->pll_data->input_rate = ref;683684tmp = __raw_readl(clk->pll_data->base + PLLCTL);685if (!(tmp & PLLCTL_PLLEN))686return ref;687688ret = ref;689if (mult)690ret += ((unsigned long long)ref * mult) / 256;691692ret /= (prediv * postdiv);693694return ret;695}696697static void tnetv107x_watchdog_reset(struct platform_device *pdev)698{699struct wdt_regs __iomem *regs;700701regs = ioremap(pdev->resource[0].start, SZ_4K);702703/* disable watchdog */704__raw_writel(0x7777, ®s->disable_lock);705__raw_writel(0xcccc, ®s->disable_lock);706__raw_writel(0xdddd, ®s->disable_lock);707__raw_writel(0, ®s->disable);708709/* program prescale */710__raw_writel(0x5a5a, ®s->prescale_lock);711__raw_writel(0xa5a5, ®s->prescale_lock);712__raw_writel(0, ®s->prescale);713714/* program countdown */715__raw_writel(0x6666, ®s->change_lock);716__raw_writel(0xbbbb, ®s->change_lock);717__raw_writel(1, ®s->change);718719/* enable watchdog */720__raw_writel(0x7777, ®s->disable_lock);721__raw_writel(0xcccc, ®s->disable_lock);722__raw_writel(0xdddd, ®s->disable_lock);723__raw_writel(1, ®s->disable);724725/* kick */726__raw_writel(0x5555, ®s->kick_lock);727__raw_writel(0xaaaa, ®s->kick_lock);728__raw_writel(1, ®s->kick);729}730731static struct davinci_soc_info tnetv107x_soc_info = {732.io_desc = io_desc,733.io_desc_num = ARRAY_SIZE(io_desc),734.ids = ids,735.ids_num = ARRAY_SIZE(ids),736.jtag_id_reg = TNETV107X_CHIP_CFG_BASE + 0x018,737.cpu_clks = clks,738.psc_bases = psc_regs,739.psc_bases_num = ARRAY_SIZE(psc_regs),740.pinmux_base = TNETV107X_CHIP_CFG_BASE + 0x150,741.pinmux_pins = pins,742.pinmux_pins_num = ARRAY_SIZE(pins),743.intc_type = DAVINCI_INTC_TYPE_CP_INTC,744.intc_base = TNETV107X_INTC_BASE,745.intc_irq_prios = irq_prios,746.intc_irq_num = TNETV107X_N_CP_INTC_IRQ,747.intc_host_map = intc_host_map,748.gpio_base = TNETV107X_GPIO_BASE,749.gpio_type = GPIO_TYPE_TNETV107X,750.gpio_num = TNETV107X_N_GPIO,751.timer_info = &timer_info,752.serial_dev = &tnetv107x_serial_device,753.reset = tnetv107x_watchdog_reset,754.reset_device = &tnetv107x_wdt_device,755};756757void __init tnetv107x_init(void)758{759davinci_common_init(&tnetv107x_soc_info);760}761762763