ARM: tegra: core SoC support changes for 3.13
This branch includes: * SoC fuse values are used as device randomness at boot. * Initial support for the Tegra124 SoC is added. When coupled with an appropriate clock driver, which should also be merged for 3.13, we are able to boot to user-space using an initrd. * The powergate code gains support for Tegra114. This branch is based on previous pull request tegra-for-3.13-cleanup. -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.11 (GNU/Linux) iQIcBAABAgAGBQJSYbeKAAoJEMzrak5tbycx3tIQAKmPgax0hf4te1f1Z5mNpafK 07ri4iuGiBSflfXsz+WL5WvfLBr0ONB6q5sqwrUIYk1iCxkNT3uXS/Z67V6YobF/ U3URwpM2/p09k7LGbP/TqnprwMYzFDaPNpJBBAYh++dzSD9QzcB5CJ6EWGtP0OnL FvtBF2HIbCRlSqUlOVDSHXwyf/y3jqSg3XSPOYeqPWYF/a7WQGf/wXSgAZusohB+ K93gMmHp4KFgoW1udqOCbC7kzl0B96+nkiAq55JL9WbuJ6V56xmrf2+J9rcd3c4x o5+y8mRd2Zp1Llk+LTFHAmBtdO/aWhP286kPCKapsneKsi268lciR82/QEMvday8 iBbcnxK1bwwKJTLW4HJI6u+aKrxF0uk9usdeJw5wFEh7pMD0Zvh9D02S34Qdu5mu DoSu5xSLZ4pb3ChPK5IH1cKWKOGM0pR/mWxkUVfg9f0E4yenFepS9+2zP40xEz3W CiLbLdmoAExiZkqvadYgOnA47u4z57NByPyKEeH0jMCbX0M39QCg+DDBRZrjt0OV XJrToVdZYk7syDxW94nnFWKNCJT+oqpn3j8xUAz7OplEFEZ3My0Ndz1vaY5glv6d CuylPtx5+GmEZJH8Lynh8tBAE20+ngbqMDo7awnl4U/+XsNgqli88GZEwHD+XxWp /45R36Fm/MyA8hD/ymM5 =2btl -----END PGP SIGNATURE----- Merge tag 'tegra-for-3.13-soc-v2' of git://git.kernel.org/pub/scm/linux/kernel/git/swarren/linux-tegra into next/soc From Stephen Warren: ARM: tegra: core SoC support changes for 3.13 This branch includes: * SoC fuse values are used as device randomness at boot. * Initial support for the Tegra124 SoC is added. When coupled with an appropriate clock driver, which should also be merged for 3.13, we are able to boot to user-space using an initrd. * The powergate code gains support for Tegra114. This branch is based on previous pull request tegra-for-3.13-cleanup. * tag 'tegra-for-3.13-soc-v2' of git://git.kernel.org/pub/scm/linux/kernel/git/swarren/linux-tegra: ARM: tegra: Add Tegra114 powergate support ARM: tegra: Constify list of CPU domains ARM: tegra: Remove duplicate powergate defines ARM: tegra: add LP1 support code for Tegra124 ARM: tegra: re-calculate the LP1 data for Tegra30/114 ARM: tegra: enable CPU idle for Tegra124 ARM: tegra: make tegra_resume can work with current and later chips ARM: tegra: CPU hotplug support for Tegra124 ARM: tegra: add PMC compatible value for Tegra124 ARM: tegra: add Tegra124 SoC support ARM: tegra: add fuses as device randomness ARM: tegra: fix ARCH_TEGRA_114_SOC select sort order ARM: tegra: make tegra_init_fuse() __init ARM: tegra: remove much of iomap.h ARM: tegra: move resume vector define to irammap.h ARM: tegra: delete gpio-names.h ARM: tegra: delete stale header content ARM: tegra: remove common.c ARM: tegra: split tegra_pmc_init() in two Signed-off-by: Kevin Hilman <khilman@linaro.org>
This commit is contained in:
Коммит
4dcf03346a
|
@ -53,14 +53,22 @@ config ARCH_TEGRA_3x_SOC
|
|||
|
||||
config ARCH_TEGRA_114_SOC
|
||||
bool "Enable support for Tegra114 family"
|
||||
select HAVE_ARM_ARCH_TIMER
|
||||
select ARM_ERRATA_798181
|
||||
select ARM_L1_CACHE_SHIFT_6
|
||||
select HAVE_ARM_ARCH_TIMER
|
||||
select PINCTRL_TEGRA114
|
||||
help
|
||||
Support for NVIDIA Tegra T114 processor family, based on the
|
||||
ARM CortexA15MP CPU
|
||||
|
||||
config ARCH_TEGRA_124_SOC
|
||||
bool "Enable support for Tegra124 family"
|
||||
select ARM_L1_CACHE_SHIFT_6
|
||||
select HAVE_ARM_ARCH_TIMER
|
||||
help
|
||||
Support for NVIDIA Tegra T124 processor family, based on the
|
||||
ARM CortexA15MP CPU
|
||||
|
||||
config TEGRA_AHB
|
||||
bool "Enable AHB driver for NVIDIA Tegra SoCs"
|
||||
default y
|
||||
|
|
|
@ -1,6 +1,5 @@
|
|||
asflags-y += -march=armv7-a
|
||||
|
||||
obj-y += common.o
|
||||
obj-y += io.o
|
||||
obj-y += irq.o
|
||||
obj-y += fuse.o
|
||||
|
@ -36,5 +35,10 @@ obj-$(CONFIG_ARCH_TEGRA_114_SOC) += pm-tegra30.o
|
|||
ifeq ($(CONFIG_CPU_IDLE),y)
|
||||
obj-$(CONFIG_ARCH_TEGRA_114_SOC) += cpuidle-tegra114.o
|
||||
endif
|
||||
obj-$(CONFIG_ARCH_TEGRA_124_SOC) += sleep-tegra30.o
|
||||
obj-$(CONFIG_ARCH_TEGRA_124_SOC) += pm-tegra30.o
|
||||
ifeq ($(CONFIG_CPU_IDLE),y)
|
||||
obj-$(CONFIG_ARCH_TEGRA_124_SOC) += cpuidle-tegra114.o
|
||||
endif
|
||||
|
||||
obj-$(CONFIG_ARCH_TEGRA_2x_SOC) += board-paz00.o
|
||||
|
|
|
@ -20,12 +20,11 @@
|
|||
#include <linux/platform_device.h>
|
||||
#include <linux/rfkill-gpio.h>
|
||||
#include "board.h"
|
||||
#include "board-paz00.h"
|
||||
|
||||
static struct rfkill_gpio_platform_data wifi_rfkill_platform_data = {
|
||||
.name = "wifi_rfkill",
|
||||
.reset_gpio = TEGRA_WIFI_RST,
|
||||
.shutdown_gpio = TEGRA_WIFI_PWRN,
|
||||
.reset_gpio = 25, /* PD1 */
|
||||
.shutdown_gpio = 85, /* PK5 */
|
||||
.type = RFKILL_TYPE_WLAN,
|
||||
};
|
||||
|
||||
|
|
|
@ -1,25 +0,0 @@
|
|||
/*
|
||||
* arch/arm/mach-tegra/board-paz00.h
|
||||
*
|
||||
* Copyright (C) 2010 Marc Dietrich <marvin24@gmx.de>
|
||||
*
|
||||
* This software is licensed under the terms of the GNU General Public
|
||||
* License version 2, as published by the Free Software Foundation, and
|
||||
* may be copied, distributed, and modified under those terms.
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef _MACH_TEGRA_BOARD_PAZ00_H
|
||||
#define _MACH_TEGRA_BOARD_PAZ00_H
|
||||
|
||||
#include "gpio-names.h"
|
||||
|
||||
#define TEGRA_WIFI_PWRN TEGRA_GPIO_PK5
|
||||
#define TEGRA_WIFI_RST TEGRA_GPIO_PD1
|
||||
|
||||
#endif
|
|
@ -25,20 +25,8 @@
|
|||
#include <linux/types.h>
|
||||
#include <linux/reboot.h>
|
||||
|
||||
void tegra_assert_system_reset(enum reboot_mode mode, const char *cmd);
|
||||
|
||||
void __init tegra_init_early(void);
|
||||
void __init tegra_map_common_io(void);
|
||||
void __init tegra_init_irq(void);
|
||||
void __init tegra_dt_init_irq(void);
|
||||
|
||||
void tegra_init_late(void);
|
||||
|
||||
#ifdef CONFIG_DEBUG_FS
|
||||
int tegra_clk_debugfs_init(void);
|
||||
#else
|
||||
static inline int tegra_clk_debugfs_init(void) { return 0; }
|
||||
#endif
|
||||
|
||||
int __init tegra_powergate_init(void);
|
||||
#if defined(CONFIG_ARCH_TEGRA_2x_SOC) && defined(CONFIG_DEBUG_FS)
|
||||
|
|
|
@ -1,115 +0,0 @@
|
|||
/*
|
||||
* arch/arm/mach-tegra/common.c
|
||||
*
|
||||
* Copyright (c) 2013 NVIDIA Corporation. All rights reserved.
|
||||
* Copyright (C) 2010 Google, Inc.
|
||||
*
|
||||
* Author:
|
||||
* Colin Cross <ccross@android.com>
|
||||
*
|
||||
* This software is licensed under the terms of the GNU General Public
|
||||
* License version 2, as published by the Free Software Foundation, and
|
||||
* may be copied, distributed, and modified under those terms.
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <linux/init.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/clk.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/reboot.h>
|
||||
#include <linux/irqchip.h>
|
||||
#include <linux/clk-provider.h>
|
||||
|
||||
#include <asm/hardware/cache-l2x0.h>
|
||||
|
||||
#include "board.h"
|
||||
#include "common.h"
|
||||
#include "cpuidle.h"
|
||||
#include "fuse.h"
|
||||
#include "iomap.h"
|
||||
#include "irq.h"
|
||||
#include "pmc.h"
|
||||
#include "apbio.h"
|
||||
#include "sleep.h"
|
||||
#include "pm.h"
|
||||
#include "reset.h"
|
||||
|
||||
/*
|
||||
* Storage for debug-macro.S's state.
|
||||
*
|
||||
* This must be in .data not .bss so that it gets initialized each time the
|
||||
* kernel is loaded. The data is declared here rather than debug-macro.S so
|
||||
* that multiple inclusions of debug-macro.S point at the same data.
|
||||
*/
|
||||
u32 tegra_uart_config[4] = {
|
||||
/* Debug UART initialization required */
|
||||
1,
|
||||
/* Debug UART physical address */
|
||||
0,
|
||||
/* Debug UART virtual address */
|
||||
0,
|
||||
/* Scratch space for debug macro */
|
||||
0,
|
||||
};
|
||||
|
||||
#ifdef CONFIG_OF
|
||||
void __init tegra_dt_init_irq(void)
|
||||
{
|
||||
of_clk_init(NULL);
|
||||
tegra_pmc_init();
|
||||
tegra_init_irq();
|
||||
irqchip_init();
|
||||
tegra_legacy_irq_syscore_init();
|
||||
}
|
||||
#endif
|
||||
|
||||
void tegra_assert_system_reset(enum reboot_mode mode, const char *cmd)
|
||||
{
|
||||
void __iomem *reset = IO_ADDRESS(TEGRA_PMC_BASE + 0);
|
||||
u32 reg;
|
||||
|
||||
reg = readl_relaxed(reset);
|
||||
reg |= 0x10;
|
||||
writel_relaxed(reg, reset);
|
||||
}
|
||||
|
||||
static void __init tegra_init_cache(void)
|
||||
{
|
||||
#ifdef CONFIG_CACHE_L2X0
|
||||
int ret;
|
||||
void __iomem *p = IO_ADDRESS(TEGRA_ARM_PERIF_BASE) + 0x3000;
|
||||
u32 aux_ctrl, cache_type;
|
||||
|
||||
cache_type = readl(p + L2X0_CACHE_TYPE);
|
||||
aux_ctrl = (cache_type & 0x700) << (17-8);
|
||||
aux_ctrl |= 0x7C400001;
|
||||
|
||||
ret = l2x0_of_init(aux_ctrl, 0x8200c3fe);
|
||||
if (!ret)
|
||||
l2x0_saved_regs_addr = virt_to_phys(&l2x0_saved_regs);
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
void __init tegra_init_early(void)
|
||||
{
|
||||
tegra_cpu_reset_handler_init();
|
||||
tegra_apb_io_init();
|
||||
tegra_init_fuse();
|
||||
tegra_init_cache();
|
||||
tegra_powergate_init();
|
||||
tegra_hotplug_init();
|
||||
}
|
||||
|
||||
void __init tegra_init_late(void)
|
||||
{
|
||||
tegra_init_suspend();
|
||||
tegra_cpuidle_init();
|
||||
tegra_powergate_debugfs_init();
|
||||
}
|
|
@ -39,7 +39,9 @@ void __init tegra_cpuidle_init(void)
|
|||
tegra30_cpuidle_init();
|
||||
break;
|
||||
case TEGRA114:
|
||||
if (IS_ENABLED(CONFIG_ARCH_TEGRA_114_SOC))
|
||||
case TEGRA124:
|
||||
if (IS_ENABLED(CONFIG_ARCH_TEGRA_114_SOC) ||
|
||||
IS_ENABLED(CONFIG_ARCH_TEGRA_124_SOC))
|
||||
tegra114_cpuidle_init();
|
||||
break;
|
||||
}
|
||||
|
|
|
@ -87,6 +87,7 @@ void flowctrl_cpu_suspend_enter(unsigned int cpuid)
|
|||
break;
|
||||
case TEGRA30:
|
||||
case TEGRA114:
|
||||
case TEGRA124:
|
||||
/* clear wfe bitmap */
|
||||
reg &= ~TEGRA30_FLOW_CTRL_CSR_WFE_BITMAP;
|
||||
/* clear wfi bitmap */
|
||||
|
@ -125,6 +126,7 @@ void flowctrl_cpu_suspend_exit(unsigned int cpuid)
|
|||
break;
|
||||
case TEGRA30:
|
||||
case TEGRA114:
|
||||
case TEGRA124:
|
||||
/* clear wfe bitmap */
|
||||
reg &= ~TEGRA30_FLOW_CTRL_CSR_WFE_BITMAP;
|
||||
/* clear wfi bitmap */
|
||||
|
|
|
@ -21,14 +21,26 @@
|
|||
#include <linux/kernel.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/export.h>
|
||||
#include <linux/random.h>
|
||||
#include <linux/tegra-soc.h>
|
||||
|
||||
#include "fuse.h"
|
||||
#include "iomap.h"
|
||||
#include "apbio.h"
|
||||
|
||||
/* Tegra20 only */
|
||||
#define FUSE_UID_LOW 0x108
|
||||
#define FUSE_UID_HIGH 0x10c
|
||||
|
||||
/* Tegra30 and later */
|
||||
#define FUSE_VENDOR_CODE 0x200
|
||||
#define FUSE_FAB_CODE 0x204
|
||||
#define FUSE_LOT_CODE_0 0x208
|
||||
#define FUSE_LOT_CODE_1 0x20c
|
||||
#define FUSE_WAFER_ID 0x210
|
||||
#define FUSE_X_COORDINATE 0x214
|
||||
#define FUSE_Y_COORDINATE 0x218
|
||||
|
||||
#define FUSE_SKU_INFO 0x110
|
||||
|
||||
#define TEGRA20_FUSE_SPARE_BIT 0x200
|
||||
|
@ -112,21 +124,51 @@ u32 tegra_read_chipid(void)
|
|||
return readl_relaxed(IO_ADDRESS(TEGRA_APB_MISC_BASE) + 0x804);
|
||||
}
|
||||
|
||||
void tegra_init_fuse(void)
|
||||
static void __init tegra20_fuse_init_randomness(void)
|
||||
{
|
||||
u32 randomness[2];
|
||||
|
||||
randomness[0] = tegra_fuse_readl(FUSE_UID_LOW);
|
||||
randomness[1] = tegra_fuse_readl(FUSE_UID_HIGH);
|
||||
|
||||
add_device_randomness(randomness, sizeof(randomness));
|
||||
}
|
||||
|
||||
/* Applies to Tegra30 or later */
|
||||
static void __init tegra30_fuse_init_randomness(void)
|
||||
{
|
||||
u32 randomness[7];
|
||||
|
||||
randomness[0] = tegra_fuse_readl(FUSE_VENDOR_CODE);
|
||||
randomness[1] = tegra_fuse_readl(FUSE_FAB_CODE);
|
||||
randomness[2] = tegra_fuse_readl(FUSE_LOT_CODE_0);
|
||||
randomness[3] = tegra_fuse_readl(FUSE_LOT_CODE_1);
|
||||
randomness[4] = tegra_fuse_readl(FUSE_WAFER_ID);
|
||||
randomness[5] = tegra_fuse_readl(FUSE_X_COORDINATE);
|
||||
randomness[6] = tegra_fuse_readl(FUSE_Y_COORDINATE);
|
||||
|
||||
add_device_randomness(randomness, sizeof(randomness));
|
||||
}
|
||||
|
||||
void __init tegra_init_fuse(void)
|
||||
{
|
||||
u32 id;
|
||||
u32 randomness[5];
|
||||
|
||||
u32 reg = readl(IO_ADDRESS(TEGRA_CLK_RESET_BASE + 0x48));
|
||||
reg |= 1 << 28;
|
||||
writel(reg, IO_ADDRESS(TEGRA_CLK_RESET_BASE + 0x48));
|
||||
|
||||
reg = tegra_fuse_readl(FUSE_SKU_INFO);
|
||||
randomness[0] = reg;
|
||||
tegra_sku_id = reg & 0xFF;
|
||||
|
||||
reg = tegra_apb_readl(TEGRA_APB_MISC_BASE + STRAP_OPT);
|
||||
randomness[1] = reg;
|
||||
tegra_bct_strapping = (reg & RAM_ID_MASK) >> RAM_CODE_SHIFT;
|
||||
|
||||
id = tegra_read_chipid();
|
||||
randomness[2] = id;
|
||||
tegra_chip_id = (id >> 8) & 0xff;
|
||||
|
||||
switch (tegra_chip_id) {
|
||||
|
@ -149,6 +191,18 @@ void tegra_init_fuse(void)
|
|||
|
||||
tegra_revision = tegra_get_revision(id);
|
||||
tegra_init_speedo_data();
|
||||
randomness[3] = (tegra_cpu_process_id << 16) | tegra_core_process_id;
|
||||
randomness[4] = (tegra_cpu_speedo_id << 16) | tegra_soc_speedo_id;
|
||||
|
||||
add_device_randomness(randomness, sizeof(randomness));
|
||||
switch (tegra_chip_id) {
|
||||
case TEGRA20:
|
||||
tegra20_fuse_init_randomness();
|
||||
case TEGRA30:
|
||||
case TEGRA114:
|
||||
default:
|
||||
tegra30_fuse_init_randomness();
|
||||
}
|
||||
|
||||
pr_info("Tegra Revision: %s SKU: %d CPU Process: %d Core Process: %d\n",
|
||||
tegra_revision_name[tegra_revision],
|
||||
|
|
|
@ -29,6 +29,7 @@
|
|||
#define TEGRA20 0x20
|
||||
#define TEGRA30 0x30
|
||||
#define TEGRA114 0x35
|
||||
#define TEGRA124 0x40
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
enum tegra_revision {
|
||||
|
|
|
@ -1,247 +0,0 @@
|
|||
/*
|
||||
* arch/arm/mach-tegra/include/mach/gpio-names.h
|
||||
*
|
||||
* Copyright (c) 2010 Google, Inc
|
||||
*
|
||||
* Author:
|
||||
* Erik Gilling <konkers@google.com>
|
||||
*
|
||||
* This software is licensed under the terms of the GNU General Public
|
||||
* License version 2, as published by the Free Software Foundation, and
|
||||
* may be copied, distributed, and modified under those terms.
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef __MACH_TEGRA_GPIO_NAMES_H
|
||||
#define __MACH_TEGRA_GPIO_NAMES_H
|
||||
|
||||
#define TEGRA_GPIO_PA0 0
|
||||
#define TEGRA_GPIO_PA1 1
|
||||
#define TEGRA_GPIO_PA2 2
|
||||
#define TEGRA_GPIO_PA3 3
|
||||
#define TEGRA_GPIO_PA4 4
|
||||
#define TEGRA_GPIO_PA5 5
|
||||
#define TEGRA_GPIO_PA6 6
|
||||
#define TEGRA_GPIO_PA7 7
|
||||
#define TEGRA_GPIO_PB0 8
|
||||
#define TEGRA_GPIO_PB1 9
|
||||
#define TEGRA_GPIO_PB2 10
|
||||
#define TEGRA_GPIO_PB3 11
|
||||
#define TEGRA_GPIO_PB4 12
|
||||
#define TEGRA_GPIO_PB5 13
|
||||
#define TEGRA_GPIO_PB6 14
|
||||
#define TEGRA_GPIO_PB7 15
|
||||
#define TEGRA_GPIO_PC0 16
|
||||
#define TEGRA_GPIO_PC1 17
|
||||
#define TEGRA_GPIO_PC2 18
|
||||
#define TEGRA_GPIO_PC3 19
|
||||
#define TEGRA_GPIO_PC4 20
|
||||
#define TEGRA_GPIO_PC5 21
|
||||
#define TEGRA_GPIO_PC6 22
|
||||
#define TEGRA_GPIO_PC7 23
|
||||
#define TEGRA_GPIO_PD0 24
|
||||
#define TEGRA_GPIO_PD1 25
|
||||
#define TEGRA_GPIO_PD2 26
|
||||
#define TEGRA_GPIO_PD3 27
|
||||
#define TEGRA_GPIO_PD4 28
|
||||
#define TEGRA_GPIO_PD5 29
|
||||
#define TEGRA_GPIO_PD6 30
|
||||
#define TEGRA_GPIO_PD7 31
|
||||
#define TEGRA_GPIO_PE0 32
|
||||
#define TEGRA_GPIO_PE1 33
|
||||
#define TEGRA_GPIO_PE2 34
|
||||
#define TEGRA_GPIO_PE3 35
|
||||
#define TEGRA_GPIO_PE4 36
|
||||
#define TEGRA_GPIO_PE5 37
|
||||
#define TEGRA_GPIO_PE6 38
|
||||
#define TEGRA_GPIO_PE7 39
|
||||
#define TEGRA_GPIO_PF0 40
|
||||
#define TEGRA_GPIO_PF1 41
|
||||
#define TEGRA_GPIO_PF2 42
|
||||
#define TEGRA_GPIO_PF3 43
|
||||
#define TEGRA_GPIO_PF4 44
|
||||
#define TEGRA_GPIO_PF5 45
|
||||
#define TEGRA_GPIO_PF6 46
|
||||
#define TEGRA_GPIO_PF7 47
|
||||
#define TEGRA_GPIO_PG0 48
|
||||
#define TEGRA_GPIO_PG1 49
|
||||
#define TEGRA_GPIO_PG2 50
|
||||
#define TEGRA_GPIO_PG3 51
|
||||
#define TEGRA_GPIO_PG4 52
|
||||
#define TEGRA_GPIO_PG5 53
|
||||
#define TEGRA_GPIO_PG6 54
|
||||
#define TEGRA_GPIO_PG7 55
|
||||
#define TEGRA_GPIO_PH0 56
|
||||
#define TEGRA_GPIO_PH1 57
|
||||
#define TEGRA_GPIO_PH2 58
|
||||
#define TEGRA_GPIO_PH3 59
|
||||
#define TEGRA_GPIO_PH4 60
|
||||
#define TEGRA_GPIO_PH5 61
|
||||
#define TEGRA_GPIO_PH6 62
|
||||
#define TEGRA_GPIO_PH7 63
|
||||
#define TEGRA_GPIO_PI0 64
|
||||
#define TEGRA_GPIO_PI1 65
|
||||
#define TEGRA_GPIO_PI2 66
|
||||
#define TEGRA_GPIO_PI3 67
|
||||
#define TEGRA_GPIO_PI4 68
|
||||
#define TEGRA_GPIO_PI5 69
|
||||
#define TEGRA_GPIO_PI6 70
|
||||
#define TEGRA_GPIO_PI7 71
|
||||
#define TEGRA_GPIO_PJ0 72
|
||||
#define TEGRA_GPIO_PJ1 73
|
||||
#define TEGRA_GPIO_PJ2 74
|
||||
#define TEGRA_GPIO_PJ3 75
|
||||
#define TEGRA_GPIO_PJ4 76
|
||||
#define TEGRA_GPIO_PJ5 77
|
||||
#define TEGRA_GPIO_PJ6 78
|
||||
#define TEGRA_GPIO_PJ7 79
|
||||
#define TEGRA_GPIO_PK0 80
|
||||
#define TEGRA_GPIO_PK1 81
|
||||
#define TEGRA_GPIO_PK2 82
|
||||
#define TEGRA_GPIO_PK3 83
|
||||
#define TEGRA_GPIO_PK4 84
|
||||
#define TEGRA_GPIO_PK5 85
|
||||
#define TEGRA_GPIO_PK6 86
|
||||
#define TEGRA_GPIO_PK7 87
|
||||
#define TEGRA_GPIO_PL0 88
|
||||
#define TEGRA_GPIO_PL1 89
|
||||
#define TEGRA_GPIO_PL2 90
|
||||
#define TEGRA_GPIO_PL3 91
|
||||
#define TEGRA_GPIO_PL4 92
|
||||
#define TEGRA_GPIO_PL5 93
|
||||
#define TEGRA_GPIO_PL6 94
|
||||
#define TEGRA_GPIO_PL7 95
|
||||
#define TEGRA_GPIO_PM0 96
|
||||
#define TEGRA_GPIO_PM1 97
|
||||
#define TEGRA_GPIO_PM2 98
|
||||
#define TEGRA_GPIO_PM3 99
|
||||
#define TEGRA_GPIO_PM4 100
|
||||
#define TEGRA_GPIO_PM5 101
|
||||
#define TEGRA_GPIO_PM6 102
|
||||
#define TEGRA_GPIO_PM7 103
|
||||
#define TEGRA_GPIO_PN0 104
|
||||
#define TEGRA_GPIO_PN1 105
|
||||
#define TEGRA_GPIO_PN2 106
|
||||
#define TEGRA_GPIO_PN3 107
|
||||
#define TEGRA_GPIO_PN4 108
|
||||
#define TEGRA_GPIO_PN5 109
|
||||
#define TEGRA_GPIO_PN6 110
|
||||
#define TEGRA_GPIO_PN7 111
|
||||
#define TEGRA_GPIO_PO0 112
|
||||
#define TEGRA_GPIO_PO1 113
|
||||
#define TEGRA_GPIO_PO2 114
|
||||
#define TEGRA_GPIO_PO3 115
|
||||
#define TEGRA_GPIO_PO4 116
|
||||
#define TEGRA_GPIO_PO5 117
|
||||
#define TEGRA_GPIO_PO6 118
|
||||
#define TEGRA_GPIO_PO7 119
|
||||
#define TEGRA_GPIO_PP0 120
|
||||
#define TEGRA_GPIO_PP1 121
|
||||
#define TEGRA_GPIO_PP2 122
|
||||
#define TEGRA_GPIO_PP3 123
|
||||
#define TEGRA_GPIO_PP4 124
|
||||
#define TEGRA_GPIO_PP5 125
|
||||
#define TEGRA_GPIO_PP6 126
|
||||
#define TEGRA_GPIO_PP7 127
|
||||
#define TEGRA_GPIO_PQ0 128
|
||||
#define TEGRA_GPIO_PQ1 129
|
||||
#define TEGRA_GPIO_PQ2 130
|
||||
#define TEGRA_GPIO_PQ3 131
|
||||
#define TEGRA_GPIO_PQ4 132
|
||||
#define TEGRA_GPIO_PQ5 133
|
||||
#define TEGRA_GPIO_PQ6 134
|
||||
#define TEGRA_GPIO_PQ7 135
|
||||
#define TEGRA_GPIO_PR0 136
|
||||
#define TEGRA_GPIO_PR1 137
|
||||
#define TEGRA_GPIO_PR2 138
|
||||
#define TEGRA_GPIO_PR3 139
|
||||
#define TEGRA_GPIO_PR4 140
|
||||
#define TEGRA_GPIO_PR5 141
|
||||
#define TEGRA_GPIO_PR6 142
|
||||
#define TEGRA_GPIO_PR7 143
|
||||
#define TEGRA_GPIO_PS0 144
|
||||
#define TEGRA_GPIO_PS1 145
|
||||
#define TEGRA_GPIO_PS2 146
|
||||
#define TEGRA_GPIO_PS3 147
|
||||
#define TEGRA_GPIO_PS4 148
|
||||
#define TEGRA_GPIO_PS5 149
|
||||
#define TEGRA_GPIO_PS6 150
|
||||
#define TEGRA_GPIO_PS7 151
|
||||
#define TEGRA_GPIO_PT0 152
|
||||
#define TEGRA_GPIO_PT1 153
|
||||
#define TEGRA_GPIO_PT2 154
|
||||
#define TEGRA_GPIO_PT3 155
|
||||
#define TEGRA_GPIO_PT4 156
|
||||
#define TEGRA_GPIO_PT5 157
|
||||
#define TEGRA_GPIO_PT6 158
|
||||
#define TEGRA_GPIO_PT7 159
|
||||
#define TEGRA_GPIO_PU0 160
|
||||
#define TEGRA_GPIO_PU1 161
|
||||
#define TEGRA_GPIO_PU2 162
|
||||
#define TEGRA_GPIO_PU3 163
|
||||
#define TEGRA_GPIO_PU4 164
|
||||
#define TEGRA_GPIO_PU5 165
|
||||
#define TEGRA_GPIO_PU6 166
|
||||
#define TEGRA_GPIO_PU7 167
|
||||
#define TEGRA_GPIO_PV0 168
|
||||
#define TEGRA_GPIO_PV1 169
|
||||
#define TEGRA_GPIO_PV2 170
|
||||
#define TEGRA_GPIO_PV3 171
|
||||
#define TEGRA_GPIO_PV4 172
|
||||
#define TEGRA_GPIO_PV5 173
|
||||
#define TEGRA_GPIO_PV6 174
|
||||
#define TEGRA_GPIO_PV7 175
|
||||
#define TEGRA_GPIO_PW0 176
|
||||
#define TEGRA_GPIO_PW1 177
|
||||
#define TEGRA_GPIO_PW2 178
|
||||
#define TEGRA_GPIO_PW3 179
|
||||
#define TEGRA_GPIO_PW4 180
|
||||
#define TEGRA_GPIO_PW5 181
|
||||
#define TEGRA_GPIO_PW6 182
|
||||
#define TEGRA_GPIO_PW7 183
|
||||
#define TEGRA_GPIO_PX0 184
|
||||
#define TEGRA_GPIO_PX1 185
|
||||
#define TEGRA_GPIO_PX2 186
|
||||
#define TEGRA_GPIO_PX3 187
|
||||
#define TEGRA_GPIO_PX4 188
|
||||
#define TEGRA_GPIO_PX5 189
|
||||
#define TEGRA_GPIO_PX6 190
|
||||
#define TEGRA_GPIO_PX7 191
|
||||
#define TEGRA_GPIO_PY0 192
|
||||
#define TEGRA_GPIO_PY1 193
|
||||
#define TEGRA_GPIO_PY2 194
|
||||
#define TEGRA_GPIO_PY3 195
|
||||
#define TEGRA_GPIO_PY4 196
|
||||
#define TEGRA_GPIO_PY5 197
|
||||
#define TEGRA_GPIO_PY6 198
|
||||
#define TEGRA_GPIO_PY7 199
|
||||
#define TEGRA_GPIO_PZ0 200
|
||||
#define TEGRA_GPIO_PZ1 201
|
||||
#define TEGRA_GPIO_PZ2 202
|
||||
#define TEGRA_GPIO_PZ3 203
|
||||
#define TEGRA_GPIO_PZ4 204
|
||||
#define TEGRA_GPIO_PZ5 205
|
||||
#define TEGRA_GPIO_PZ6 206
|
||||
#define TEGRA_GPIO_PZ7 207
|
||||
#define TEGRA_GPIO_PAA0 208
|
||||
#define TEGRA_GPIO_PAA1 209
|
||||
#define TEGRA_GPIO_PAA2 210
|
||||
#define TEGRA_GPIO_PAA3 211
|
||||
#define TEGRA_GPIO_PAA4 212
|
||||
#define TEGRA_GPIO_PAA5 213
|
||||
#define TEGRA_GPIO_PAA6 214
|
||||
#define TEGRA_GPIO_PAA7 215
|
||||
#define TEGRA_GPIO_PBB0 216
|
||||
#define TEGRA_GPIO_PBB1 217
|
||||
#define TEGRA_GPIO_PBB2 218
|
||||
#define TEGRA_GPIO_PBB3 219
|
||||
#define TEGRA_GPIO_PBB4 220
|
||||
#define TEGRA_GPIO_PBB5 221
|
||||
#define TEGRA_GPIO_PBB6 222
|
||||
#define TEGRA_GPIO_PBB7 223
|
||||
|
||||
#endif
|
|
@ -57,4 +57,6 @@ void __init tegra_hotplug_init(void)
|
|||
tegra_hotplug_shutdown = tegra30_hotplug_shutdown;
|
||||
if (IS_ENABLED(CONFIG_ARCH_TEGRA_114_SOC) && tegra_chip_id == TEGRA114)
|
||||
tegra_hotplug_shutdown = tegra30_hotplug_shutdown;
|
||||
if (IS_ENABLED(CONFIG_ARCH_TEGRA_124_SOC) && tegra_chip_id == TEGRA124)
|
||||
tegra_hotplug_shutdown = tegra30_hotplug_shutdown;
|
||||
}
|
||||
|
|
|
@ -24,44 +24,12 @@
|
|||
#define TEGRA_IRAM_BASE 0x40000000
|
||||
#define TEGRA_IRAM_SIZE SZ_256K
|
||||
|
||||
#define TEGRA_IRAM_CODE_AREA (TEGRA_IRAM_BASE + SZ_4K)
|
||||
|
||||
#define TEGRA_HOST1X_BASE 0x50000000
|
||||
#define TEGRA_HOST1X_SIZE 0x24000
|
||||
|
||||
#define TEGRA_ARM_PERIF_BASE 0x50040000
|
||||
#define TEGRA_ARM_PERIF_SIZE SZ_8K
|
||||
|
||||
#define TEGRA_ARM_PL310_BASE 0x50043000
|
||||
#define TEGRA_ARM_PL310_SIZE SZ_4K
|
||||
|
||||
#define TEGRA_ARM_INT_DIST_BASE 0x50041000
|
||||
#define TEGRA_ARM_INT_DIST_SIZE SZ_4K
|
||||
|
||||
#define TEGRA_MPE_BASE 0x54040000
|
||||
#define TEGRA_MPE_SIZE SZ_256K
|
||||
|
||||
#define TEGRA_VI_BASE 0x54080000
|
||||
#define TEGRA_VI_SIZE SZ_256K
|
||||
|
||||
#define TEGRA_ISP_BASE 0x54100000
|
||||
#define TEGRA_ISP_SIZE SZ_256K
|
||||
|
||||
#define TEGRA_DISPLAY_BASE 0x54200000
|
||||
#define TEGRA_DISPLAY_SIZE SZ_256K
|
||||
|
||||
#define TEGRA_DISPLAY2_BASE 0x54240000
|
||||
#define TEGRA_DISPLAY2_SIZE SZ_256K
|
||||
|
||||
#define TEGRA_HDMI_BASE 0x54280000
|
||||
#define TEGRA_HDMI_SIZE SZ_256K
|
||||
|
||||
#define TEGRA_GART_BASE 0x58000000
|
||||
#define TEGRA_GART_SIZE SZ_32M
|
||||
|
||||
#define TEGRA_RES_SEMA_BASE 0x60001000
|
||||
#define TEGRA_RES_SEMA_SIZE SZ_4K
|
||||
|
||||
#define TEGRA_PRIMARY_ICTLR_BASE 0x60004000
|
||||
#define TEGRA_PRIMARY_ICTLR_SIZE SZ_64
|
||||
|
||||
|
@ -98,51 +66,15 @@
|
|||
#define TEGRA_FLOW_CTRL_BASE 0x60007000
|
||||
#define TEGRA_FLOW_CTRL_SIZE 20
|
||||
|
||||
#define TEGRA_AHB_DMA_BASE 0x60008000
|
||||
#define TEGRA_AHB_DMA_SIZE SZ_4K
|
||||
|
||||
#define TEGRA_AHB_DMA_CH0_BASE 0x60009000
|
||||
#define TEGRA_AHB_DMA_CH0_SIZE 32
|
||||
|
||||
#define TEGRA_APB_DMA_BASE 0x6000A000
|
||||
#define TEGRA_APB_DMA_SIZE SZ_4K
|
||||
|
||||
#define TEGRA_APB_DMA_CH0_BASE 0x6000B000
|
||||
#define TEGRA_APB_DMA_CH0_SIZE 32
|
||||
|
||||
#define TEGRA_AHB_GIZMO_BASE 0x6000C004
|
||||
#define TEGRA_AHB_GIZMO_SIZE 0x10C
|
||||
|
||||
#define TEGRA_SB_BASE 0x6000C200
|
||||
#define TEGRA_SB_SIZE 256
|
||||
|
||||
#define TEGRA_STATMON_BASE 0x6000C400
|
||||
#define TEGRA_STATMON_SIZE SZ_1K
|
||||
|
||||
#define TEGRA_GPIO_BASE 0x6000D000
|
||||
#define TEGRA_GPIO_SIZE SZ_4K
|
||||
|
||||
#define TEGRA_EXCEPTION_VECTORS_BASE 0x6000F000
|
||||
#define TEGRA_EXCEPTION_VECTORS_SIZE SZ_4K
|
||||
|
||||
#define TEGRA_APB_MISC_BASE 0x70000000
|
||||
#define TEGRA_APB_MISC_SIZE SZ_4K
|
||||
|
||||
#define TEGRA_APB_MISC_DAS_BASE 0x70000c00
|
||||
#define TEGRA_APB_MISC_DAS_SIZE SZ_128
|
||||
|
||||
#define TEGRA_AC97_BASE 0x70002000
|
||||
#define TEGRA_AC97_SIZE SZ_512
|
||||
|
||||
#define TEGRA_SPDIF_BASE 0x70002400
|
||||
#define TEGRA_SPDIF_SIZE SZ_512
|
||||
|
||||
#define TEGRA_I2S1_BASE 0x70002800
|
||||
#define TEGRA_I2S1_SIZE SZ_256
|
||||
|
||||
#define TEGRA_I2S2_BASE 0x70002A00
|
||||
#define TEGRA_I2S2_SIZE SZ_256
|
||||
|
||||
#define TEGRA_UARTA_BASE 0x70006000
|
||||
#define TEGRA_UARTA_SIZE SZ_64
|
||||
|
||||
|
@ -158,108 +90,27 @@
|
|||
#define TEGRA_UARTE_BASE 0x70006400
|
||||
#define TEGRA_UARTE_SIZE SZ_256
|
||||
|
||||
#define TEGRA_NAND_BASE 0x70008000
|
||||
#define TEGRA_NAND_SIZE SZ_256
|
||||
|
||||
#define TEGRA_HSMMC_BASE 0x70008500
|
||||
#define TEGRA_HSMMC_SIZE SZ_256
|
||||
|
||||
#define TEGRA_SNOR_BASE 0x70009000
|
||||
#define TEGRA_SNOR_SIZE SZ_4K
|
||||
|
||||
#define TEGRA_PWFM_BASE 0x7000A000
|
||||
#define TEGRA_PWFM_SIZE SZ_256
|
||||
|
||||
#define TEGRA_PWFM0_BASE 0x7000A000
|
||||
#define TEGRA_PWFM0_SIZE 4
|
||||
|
||||
#define TEGRA_PWFM1_BASE 0x7000A010
|
||||
#define TEGRA_PWFM1_SIZE 4
|
||||
|
||||
#define TEGRA_PWFM2_BASE 0x7000A020
|
||||
#define TEGRA_PWFM2_SIZE 4
|
||||
|
||||
#define TEGRA_PWFM3_BASE 0x7000A030
|
||||
#define TEGRA_PWFM3_SIZE 4
|
||||
|
||||
#define TEGRA_MIPI_BASE 0x7000B000
|
||||
#define TEGRA_MIPI_SIZE SZ_256
|
||||
|
||||
#define TEGRA_I2C_BASE 0x7000C000
|
||||
#define TEGRA_I2C_SIZE SZ_256
|
||||
|
||||
#define TEGRA_TWC_BASE 0x7000C100
|
||||
#define TEGRA_TWC_SIZE SZ_256
|
||||
|
||||
#define TEGRA_SPI_BASE 0x7000C380
|
||||
#define TEGRA_SPI_SIZE 48
|
||||
|
||||
#define TEGRA_I2C2_BASE 0x7000C400
|
||||
#define TEGRA_I2C2_SIZE SZ_256
|
||||
|
||||
#define TEGRA_I2C3_BASE 0x7000C500
|
||||
#define TEGRA_I2C3_SIZE SZ_256
|
||||
|
||||
#define TEGRA_OWR_BASE 0x7000C600
|
||||
#define TEGRA_OWR_SIZE 80
|
||||
|
||||
#define TEGRA_DVC_BASE 0x7000D000
|
||||
#define TEGRA_DVC_SIZE SZ_512
|
||||
|
||||
#define TEGRA_SPI1_BASE 0x7000D400
|
||||
#define TEGRA_SPI1_SIZE SZ_512
|
||||
|
||||
#define TEGRA_SPI2_BASE 0x7000D600
|
||||
#define TEGRA_SPI2_SIZE SZ_512
|
||||
|
||||
#define TEGRA_SPI3_BASE 0x7000D800
|
||||
#define TEGRA_SPI3_SIZE SZ_512
|
||||
|
||||
#define TEGRA_SPI4_BASE 0x7000DA00
|
||||
#define TEGRA_SPI4_SIZE SZ_512
|
||||
|
||||
#define TEGRA_RTC_BASE 0x7000E000
|
||||
#define TEGRA_RTC_SIZE SZ_256
|
||||
|
||||
#define TEGRA_KBC_BASE 0x7000E200
|
||||
#define TEGRA_KBC_SIZE SZ_256
|
||||
|
||||
#define TEGRA_PMC_BASE 0x7000E400
|
||||
#define TEGRA_PMC_SIZE SZ_256
|
||||
|
||||
#define TEGRA_MC_BASE 0x7000F000
|
||||
#define TEGRA_MC_SIZE SZ_1K
|
||||
|
||||
#define TEGRA_EMC_BASE 0x7000F400
|
||||
#define TEGRA_EMC_SIZE SZ_1K
|
||||
|
||||
#define TEGRA_FUSE_BASE 0x7000F800
|
||||
#define TEGRA_FUSE_SIZE SZ_1K
|
||||
|
||||
#define TEGRA_KFUSE_BASE 0x7000FC00
|
||||
#define TEGRA_KFUSE_SIZE SZ_1K
|
||||
|
||||
#define TEGRA_EMC0_BASE 0x7001A000
|
||||
#define TEGRA_EMC0_SIZE SZ_2K
|
||||
|
||||
#define TEGRA_EMC1_BASE 0x7001A800
|
||||
#define TEGRA_EMC1_SIZE SZ_2K
|
||||
|
||||
#define TEGRA124_EMC_BASE 0x7001B000
|
||||
#define TEGRA124_EMC_SIZE SZ_2K
|
||||
|
||||
#define TEGRA_CSITE_BASE 0x70040000
|
||||
#define TEGRA_CSITE_SIZE SZ_256K
|
||||
|
||||
#define TEGRA_SDMMC1_BASE 0xC8000000
|
||||
#define TEGRA_SDMMC1_SIZE SZ_512
|
||||
|
||||
#define TEGRA_SDMMC2_BASE 0xC8000200
|
||||
#define TEGRA_SDMMC2_SIZE SZ_512
|
||||
|
||||
#define TEGRA_SDMMC3_BASE 0xC8000400
|
||||
#define TEGRA_SDMMC3_SIZE SZ_512
|
||||
|
||||
#define TEGRA_SDMMC4_BASE 0xC8000600
|
||||
#define TEGRA_SDMMC4_SIZE SZ_512
|
||||
|
||||
/* On TEGRA, many peripherals are very closely packed in
|
||||
* two 256MB io windows (that actually only use about 64KB
|
||||
* at the start of each).
|
||||
|
|
|
@ -23,4 +23,10 @@
|
|||
#define TEGRA_IRAM_RESET_HANDLER_OFFSET 0
|
||||
#define TEGRA_IRAM_RESET_HANDLER_SIZE SZ_1K
|
||||
|
||||
/*
|
||||
* This area is used for LPx resume vector, only while LPx power state is
|
||||
* active. At other times, the AVP may use this area for arbitrary purposes
|
||||
*/
|
||||
#define TEGRA_IRAM_LPx_RESUME_AREA (TEGRA_IRAM_BASE + SZ_4K)
|
||||
|
||||
#endif
|
||||
|
|
|
@ -176,6 +176,8 @@ static int tegra_boot_secondary(unsigned int cpu,
|
|||
return tegra30_boot_secondary(cpu, idle);
|
||||
if (IS_ENABLED(CONFIG_ARCH_TEGRA_114_SOC) && tegra_chip_id == TEGRA114)
|
||||
return tegra114_boot_secondary(cpu, idle);
|
||||
if (IS_ENABLED(CONFIG_ARCH_TEGRA_124_SOC) && tegra_chip_id == TEGRA124)
|
||||
return tegra114_boot_secondary(cpu, idle);
|
||||
|
||||
return -EINVAL;
|
||||
}
|
||||
|
|
|
@ -59,8 +59,10 @@ static void tegra_tear_down_cpu_init(void)
|
|||
break;
|
||||
case TEGRA30:
|
||||
case TEGRA114:
|
||||
case TEGRA124:
|
||||
if (IS_ENABLED(CONFIG_ARCH_TEGRA_3x_SOC) ||
|
||||
IS_ENABLED(CONFIG_ARCH_TEGRA_114_SOC))
|
||||
IS_ENABLED(CONFIG_ARCH_TEGRA_114_SOC) ||
|
||||
IS_ENABLED(CONFIG_ARCH_TEGRA_124_SOC))
|
||||
tegra_tear_down_cpu = tegra30_tear_down_cpu;
|
||||
break;
|
||||
}
|
||||
|
@ -216,8 +218,10 @@ static bool tegra_lp1_iram_hook(void)
|
|||
break;
|
||||
case TEGRA30:
|
||||
case TEGRA114:
|
||||
case TEGRA124:
|
||||
if (IS_ENABLED(CONFIG_ARCH_TEGRA_3x_SOC) ||
|
||||
IS_ENABLED(CONFIG_ARCH_TEGRA_114_SOC))
|
||||
IS_ENABLED(CONFIG_ARCH_TEGRA_114_SOC) ||
|
||||
IS_ENABLED(CONFIG_ARCH_TEGRA_124_SOC))
|
||||
tegra30_lp1_iram_hook();
|
||||
break;
|
||||
default:
|
||||
|
@ -244,8 +248,10 @@ static bool tegra_sleep_core_init(void)
|
|||
break;
|
||||
case TEGRA30:
|
||||
case TEGRA114:
|
||||
case TEGRA124:
|
||||
if (IS_ENABLED(CONFIG_ARCH_TEGRA_3x_SOC) ||
|
||||
IS_ENABLED(CONFIG_ARCH_TEGRA_114_SOC))
|
||||
IS_ENABLED(CONFIG_ARCH_TEGRA_114_SOC) ||
|
||||
IS_ENABLED(CONFIG_ARCH_TEGRA_124_SOC))
|
||||
tegra30_sleep_core_init();
|
||||
break;
|
||||
default:
|
||||
|
@ -263,10 +269,10 @@ static void tegra_suspend_enter_lp1(void)
|
|||
tegra_pmc_suspend();
|
||||
|
||||
/* copy the reset vector & SDRAM shutdown code into IRAM */
|
||||
memcpy(iram_save_addr, IO_ADDRESS(TEGRA_IRAM_CODE_AREA),
|
||||
iram_save_size);
|
||||
memcpy(IO_ADDRESS(TEGRA_IRAM_CODE_AREA), tegra_lp1_iram.start_addr,
|
||||
memcpy(iram_save_addr, IO_ADDRESS(TEGRA_IRAM_LPx_RESUME_AREA),
|
||||
iram_save_size);
|
||||
memcpy(IO_ADDRESS(TEGRA_IRAM_LPx_RESUME_AREA),
|
||||
tegra_lp1_iram.start_addr, iram_save_size);
|
||||
|
||||
*((u32 *)tegra_cpu_lp1_mask) = 1;
|
||||
}
|
||||
|
@ -276,7 +282,7 @@ static void tegra_suspend_exit_lp1(void)
|
|||
tegra_pmc_resume();
|
||||
|
||||
/* restore IRAM */
|
||||
memcpy(IO_ADDRESS(TEGRA_IRAM_CODE_AREA), iram_save_addr,
|
||||
memcpy(IO_ADDRESS(TEGRA_IRAM_LPx_RESUME_AREA), iram_save_addr,
|
||||
iram_save_size);
|
||||
|
||||
*(u32 *)tegra_cpu_lp1_mask = 0;
|
||||
|
|
|
@ -37,9 +37,6 @@ void tegra30_sleep_core_init(void);
|
|||
|
||||
extern unsigned long l2x0_saved_regs_addr;
|
||||
|
||||
void save_cpu_arch_register(void);
|
||||
void restore_cpu_arch_register(void);
|
||||
|
||||
void tegra_clear_cpu_in_lp2(void);
|
||||
bool tegra_set_cpu_in_lp2(void);
|
||||
|
||||
|
|
|
@ -20,6 +20,7 @@
|
|||
#include <linux/io.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/of_address.h>
|
||||
#include <linux/tegra-powergate.h>
|
||||
|
||||
#include "flowctrl.h"
|
||||
#include "fuse.h"
|
||||
|
@ -43,12 +44,6 @@
|
|||
#define PMC_CPUPWRGOOD_TIMER 0xc8
|
||||
#define PMC_CPUPWROFF_TIMER 0xcc
|
||||
|
||||
#define TEGRA_POWERGATE_PCIE 3
|
||||
#define TEGRA_POWERGATE_VDEC 4
|
||||
#define TEGRA_POWERGATE_CPU1 9
|
||||
#define TEGRA_POWERGATE_CPU2 10
|
||||
#define TEGRA_POWERGATE_CPU3 11
|
||||
|
||||
static u8 tegra_cpu_domains[] = {
|
||||
0xFF, /* not available for CPU0 */
|
||||
TEGRA_POWERGATE_CPU1,
|
||||
|
@ -166,6 +161,15 @@ int tegra_pmc_cpu_remove_clamping(int cpuid)
|
|||
return tegra_pmc_powergate_remove_clamping(id);
|
||||
}
|
||||
|
||||
void tegra_pmc_restart(enum reboot_mode mode, const char *cmd)
|
||||
{
|
||||
u32 val;
|
||||
|
||||
val = tegra_pmc_readl(0);
|
||||
val |= 0x10;
|
||||
tegra_pmc_writel(val, 0);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PM_SLEEP
|
||||
static void set_power_timers(u32 us_on, u32 us_off, unsigned long rate)
|
||||
{
|
||||
|
@ -279,13 +283,35 @@ void tegra_pmc_suspend_init(void)
|
|||
#endif
|
||||
|
||||
static const struct of_device_id matches[] __initconst = {
|
||||
{ .compatible = "nvidia,tegra124-pmc" },
|
||||
{ .compatible = "nvidia,tegra114-pmc" },
|
||||
{ .compatible = "nvidia,tegra30-pmc" },
|
||||
{ .compatible = "nvidia,tegra20-pmc" },
|
||||
{ }
|
||||
};
|
||||
|
||||
static void __init tegra_pmc_parse_dt(void)
|
||||
void __init tegra_pmc_init_irq(void)
|
||||
{
|
||||
struct device_node *np;
|
||||
u32 val;
|
||||
|
||||
np = of_find_matching_node(NULL, matches);
|
||||
BUG_ON(!np);
|
||||
|
||||
tegra_pmc_base = of_iomap(np, 0);
|
||||
|
||||
tegra_pmc_invert_interrupt = of_property_read_bool(np,
|
||||
"nvidia,invert-interrupt");
|
||||
|
||||
val = tegra_pmc_readl(PMC_CTRL);
|
||||
if (tegra_pmc_invert_interrupt)
|
||||
val |= PMC_CTRL_INTR_LOW;
|
||||
else
|
||||
val &= ~PMC_CTRL_INTR_LOW;
|
||||
tegra_pmc_writel(val, PMC_CTRL);
|
||||
}
|
||||
|
||||
void __init tegra_pmc_init(void)
|
||||
{
|
||||
struct device_node *np;
|
||||
u32 prop;
|
||||
|
@ -296,10 +322,6 @@ static void __init tegra_pmc_parse_dt(void)
|
|||
np = of_find_matching_node(NULL, matches);
|
||||
BUG_ON(!np);
|
||||
|
||||
tegra_pmc_base = of_iomap(np, 0);
|
||||
|
||||
tegra_pmc_invert_interrupt = of_property_read_bool(np,
|
||||
"nvidia,invert-interrupt");
|
||||
tegra_pclk = of_clk_get_by_name(np, "pclk");
|
||||
WARN_ON(IS_ERR(tegra_pclk));
|
||||
|
||||
|
@ -365,17 +387,3 @@ static void __init tegra_pmc_parse_dt(void)
|
|||
|
||||
pmc_pm_data.suspend_mode = suspend_mode;
|
||||
}
|
||||
|
||||
void __init tegra_pmc_init(void)
|
||||
{
|
||||
u32 val;
|
||||
|
||||
tegra_pmc_parse_dt();
|
||||
|
||||
val = tegra_pmc_readl(PMC_CTRL);
|
||||
if (tegra_pmc_invert_interrupt)
|
||||
val |= PMC_CTRL_INTR_LOW;
|
||||
else
|
||||
val &= ~PMC_CTRL_INTR_LOW;
|
||||
tegra_pmc_writel(val, PMC_CTRL);
|
||||
}
|
||||
|
|
|
@ -18,6 +18,8 @@
|
|||
#ifndef __MACH_TEGRA_PMC_H
|
||||
#define __MACH_TEGRA_PMC_H
|
||||
|
||||
#include <linux/reboot.h>
|
||||
|
||||
enum tegra_suspend_mode {
|
||||
TEGRA_SUSPEND_NONE = 0,
|
||||
TEGRA_SUSPEND_LP2, /* CPU voltage off */
|
||||
|
@ -39,6 +41,9 @@ bool tegra_pmc_cpu_is_powered(int cpuid);
|
|||
int tegra_pmc_cpu_power_on(int cpuid);
|
||||
int tegra_pmc_cpu_remove_clamping(int cpuid);
|
||||
|
||||
void tegra_pmc_restart(enum reboot_mode mode, const char *cmd);
|
||||
|
||||
void tegra_pmc_init_irq(void);
|
||||
void tegra_pmc_init(void);
|
||||
|
||||
#endif
|
||||
|
|
|
@ -42,8 +42,16 @@
|
|||
|
||||
static int tegra_num_powerdomains;
|
||||
static int tegra_num_cpu_domains;
|
||||
static u8 *tegra_cpu_domains;
|
||||
static u8 tegra30_cpu_domains[] = {
|
||||
static const u8 *tegra_cpu_domains;
|
||||
|
||||
static const u8 tegra30_cpu_domains[] = {
|
||||
TEGRA_POWERGATE_CPU,
|
||||
TEGRA_POWERGATE_CPU1,
|
||||
TEGRA_POWERGATE_CPU2,
|
||||
TEGRA_POWERGATE_CPU3,
|
||||
};
|
||||
|
||||
static const u8 tegra114_cpu_domains[] = {
|
||||
TEGRA_POWERGATE_CPU0,
|
||||
TEGRA_POWERGATE_CPU1,
|
||||
TEGRA_POWERGATE_CPU2,
|
||||
|
@ -189,6 +197,11 @@ int __init tegra_powergate_init(void)
|
|||
tegra_num_cpu_domains = 4;
|
||||
tegra_cpu_domains = tegra30_cpu_domains;
|
||||
break;
|
||||
case TEGRA114:
|
||||
tegra_num_powerdomains = 23;
|
||||
tegra_num_cpu_domains = 4;
|
||||
tegra_cpu_domains = tegra114_cpu_domains;
|
||||
break;
|
||||
default:
|
||||
/* Unknown Tegra variant. Disable powergating */
|
||||
tegra_num_powerdomains = 0;
|
||||
|
@ -229,6 +242,27 @@ static const char * const powergate_name_t30[] = {
|
|||
[TEGRA_POWERGATE_3D1] = "3d1",
|
||||
};
|
||||
|
||||
static const char * const powergate_name_t114[] = {
|
||||
[TEGRA_POWERGATE_CPU] = "cpu0",
|
||||
[TEGRA_POWERGATE_3D] = "3d",
|
||||
[TEGRA_POWERGATE_VENC] = "venc",
|
||||
[TEGRA_POWERGATE_VDEC] = "vdec",
|
||||
[TEGRA_POWERGATE_MPE] = "mpe",
|
||||
[TEGRA_POWERGATE_HEG] = "heg",
|
||||
[TEGRA_POWERGATE_CPU1] = "cpu1",
|
||||
[TEGRA_POWERGATE_CPU2] = "cpu2",
|
||||
[TEGRA_POWERGATE_CPU3] = "cpu3",
|
||||
[TEGRA_POWERGATE_CELP] = "celp",
|
||||
[TEGRA_POWERGATE_CPU0] = "cpu0",
|
||||
[TEGRA_POWERGATE_C0NC] = "c0nc",
|
||||
[TEGRA_POWERGATE_C1NC] = "c1nc",
|
||||
[TEGRA_POWERGATE_DIS] = "dis",
|
||||
[TEGRA_POWERGATE_DISB] = "disb",
|
||||
[TEGRA_POWERGATE_XUSBA] = "xusba",
|
||||
[TEGRA_POWERGATE_XUSBB] = "xusbb",
|
||||
[TEGRA_POWERGATE_XUSBC] = "xusbc",
|
||||
};
|
||||
|
||||
static int powergate_show(struct seq_file *s, void *data)
|
||||
{
|
||||
int i;
|
||||
|
@ -236,9 +270,14 @@ static int powergate_show(struct seq_file *s, void *data)
|
|||
seq_printf(s, " powergate powered\n");
|
||||
seq_printf(s, "------------------\n");
|
||||
|
||||
for (i = 0; i < tegra_num_powerdomains; i++)
|
||||
for (i = 0; i < tegra_num_powerdomains; i++) {
|
||||
if (!powergate_name[i])
|
||||
continue;
|
||||
|
||||
seq_printf(s, " %9s %7s\n", powergate_name[i],
|
||||
tegra_powergate_is_powered(i) ? "yes" : "no");
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -265,6 +304,9 @@ int __init tegra_powergate_debugfs_init(void)
|
|||
case TEGRA30:
|
||||
powergate_name = powergate_name_t30;
|
||||
break;
|
||||
case TEGRA114:
|
||||
powergate_name = powergate_name_t114;
|
||||
break;
|
||||
}
|
||||
|
||||
if (powergate_name) {
|
||||
|
|
|
@ -45,17 +45,11 @@
|
|||
ENTRY(tegra_resume)
|
||||
check_cpu_part_num 0xc09, r8, r9
|
||||
bleq v7_invalidate_l1
|
||||
blne tegra_init_l2_for_a15
|
||||
|
||||
cpu_id r0
|
||||
tegra_get_soc_id TEGRA_APB_MISC_BASE, r6
|
||||
cmp r6, #TEGRA114
|
||||
beq no_cpu0_chk
|
||||
|
||||
cmp r0, #0 @ CPU0?
|
||||
THUMB( it ne )
|
||||
bne cpu_resume @ no
|
||||
no_cpu0_chk:
|
||||
|
||||
/* Are we on Tegra20? */
|
||||
cmp r6, #TEGRA20
|
||||
|
@ -75,7 +69,7 @@ no_cpu0_chk:
|
|||
|
||||
mov32 r9, 0xc09
|
||||
cmp r8, r9
|
||||
bne not_ca9
|
||||
bne end_ca9_scu_l2_resume
|
||||
#ifdef CONFIG_HAVE_ARM_SCU
|
||||
/* enable SCU */
|
||||
mov32 r0, TEGRA_ARM_PERIF_BASE
|
||||
|
@ -86,7 +80,10 @@ no_cpu0_chk:
|
|||
|
||||
/* L2 cache resume & re-enable */
|
||||
l2_cache_resume r0, r1, r2, l2x0_saved_regs_addr
|
||||
not_ca9:
|
||||
end_ca9_scu_l2_resume:
|
||||
mov32 r9, 0xc0f
|
||||
cmp r8, r9
|
||||
bleq tegra_init_l2_for_a15
|
||||
|
||||
b cpu_resume
|
||||
ENDPROC(tegra_resume)
|
||||
|
|
|
@ -82,7 +82,7 @@ void __init tegra_cpu_reset_handler_init(void)
|
|||
|
||||
#ifdef CONFIG_PM_SLEEP
|
||||
__tegra_cpu_reset_handler_data[TEGRA_RESET_STARTUP_LP1] =
|
||||
TEGRA_IRAM_CODE_AREA;
|
||||
TEGRA_IRAM_LPx_RESUME_AREA;
|
||||
__tegra_cpu_reset_handler_data[TEGRA_RESET_STARTUP_LP2] =
|
||||
virt_to_phys((void *)tegra_resume);
|
||||
#endif
|
||||
|
|
|
@ -25,6 +25,7 @@
|
|||
#include <asm/cp15.h>
|
||||
#include <asm/cache.h>
|
||||
|
||||
#include "irammap.h"
|
||||
#include "sleep.h"
|
||||
#include "flowctrl.h"
|
||||
|
||||
|
@ -235,7 +236,7 @@ ENTRY(tegra20_sleep_core_finish)
|
|||
mov32 r0, tegra20_tear_down_core
|
||||
mov32 r1, tegra20_iram_start
|
||||
sub r0, r0, r1
|
||||
mov32 r1, TEGRA_IRAM_CODE_AREA
|
||||
mov32 r1, TEGRA_IRAM_LPx_RESUME_AREA
|
||||
add r0, r0, r1
|
||||
|
||||
mov pc, r3
|
||||
|
@ -328,7 +329,7 @@ tegra20_iram_start:
|
|||
* The physical address of tegra_resume expected to be stored in
|
||||
* PMC_SCRATCH41.
|
||||
*
|
||||
* NOTE: THIS *MUST* BE RELOCATED TO TEGRA_IRAM_CODE_AREA.
|
||||
* NOTE: THIS *MUST* BE RELOCATED TO TEGRA_IRAM_LPx_RESUME_AREA.
|
||||
*/
|
||||
ENTRY(tegra20_lp1_reset)
|
||||
/*
|
||||
|
|
|
@ -20,6 +20,7 @@
|
|||
#include <asm/asm-offsets.h>
|
||||
#include <asm/cache.h>
|
||||
|
||||
#include "irammap.h"
|
||||
#include "fuse.h"
|
||||
#include "sleep.h"
|
||||
#include "flowctrl.h"
|
||||
|
@ -262,7 +263,7 @@ ENTRY(tegra30_sleep_core_finish)
|
|||
mov32 r0, tegra30_tear_down_core
|
||||
mov32 r1, tegra30_iram_start
|
||||
sub r0, r0, r1
|
||||
mov32 r1, TEGRA_IRAM_CODE_AREA
|
||||
mov32 r1, TEGRA_IRAM_LPx_RESUME_AREA
|
||||
add r0, r0, r1
|
||||
|
||||
mov pc, r3
|
||||
|
@ -314,7 +315,7 @@ tegra30_iram_start:
|
|||
* The physical address of tegra_resume expected to be stored in
|
||||
* PMC_SCRATCH41.
|
||||
*
|
||||
* NOTE: THIS *MUST* BE RELOCATED TO TEGRA_IRAM_CODE_AREA.
|
||||
* NOTE: THIS *MUST* BE RELOCATED TO TEGRA_IRAM_LPx_RESUME_AREA.
|
||||
*/
|
||||
ENTRY(tegra30_lp1_reset)
|
||||
/*
|
||||
|
@ -382,7 +383,7 @@ _pll_m_c_x_done:
|
|||
add r1, r1, #LOCK_DELAY
|
||||
wait_until r1, r7, r3
|
||||
|
||||
adr r5, tegra30_sdram_pad_save
|
||||
adr r5, tegra_sdram_pad_save
|
||||
|
||||
ldr r4, [r5, #0x18] @ restore CLK_SOURCE_MSELECT
|
||||
str r4, [r0, #CLK_RESET_CLK_SOURCE_MSELECT]
|
||||
|
@ -407,8 +408,12 @@ _pll_m_c_x_done:
|
|||
cmp r10, #TEGRA30
|
||||
movweq r0, #:lower16:TEGRA_EMC_BASE @ r0 reserved for emc base
|
||||
movteq r0, #:upper16:TEGRA_EMC_BASE
|
||||
movwne r0, #:lower16:TEGRA_EMC0_BASE
|
||||
movtne r0, #:upper16:TEGRA_EMC0_BASE
|
||||
cmp r10, #TEGRA114
|
||||
movweq r0, #:lower16:TEGRA_EMC0_BASE
|
||||
movteq r0, #:upper16:TEGRA_EMC0_BASE
|
||||
cmp r10, #TEGRA124
|
||||
movweq r0, #:lower16:TEGRA124_EMC_BASE
|
||||
movteq r0, #:upper16:TEGRA124_EMC_BASE
|
||||
|
||||
exit_self_refresh:
|
||||
ldr r1, [r5, #0xC] @ restore EMC_XM2VTTGENPADCTRL
|
||||
|
@ -537,6 +542,7 @@ tegra30_sdram_pad_address:
|
|||
.word TEGRA_PMC_BASE + PMC_IO_DPD_STATUS @0x14
|
||||
.word TEGRA_CLK_RESET_BASE + CLK_RESET_CLK_SOURCE_MSELECT @0x18
|
||||
.word TEGRA_CLK_RESET_BASE + CLK_RESET_SCLK_BURST @0x1c
|
||||
tegra30_sdram_pad_address_end:
|
||||
|
||||
tegra114_sdram_pad_address:
|
||||
.word TEGRA_EMC0_BASE + EMC_CFG @0x0
|
||||
|
@ -552,16 +558,28 @@ tegra114_sdram_pad_address:
|
|||
.word TEGRA_EMC1_BASE + EMC_AUTO_CAL_INTERVAL @0x28
|
||||
.word TEGRA_EMC1_BASE + EMC_XM2VTTGENPADCTRL @0x2c
|
||||
.word TEGRA_EMC1_BASE + EMC_XM2VTTGENPADCTRL2 @0x30
|
||||
tegra114_sdram_pad_adress_end:
|
||||
|
||||
tegra124_sdram_pad_address:
|
||||
.word TEGRA124_EMC_BASE + EMC_CFG @0x0
|
||||
.word TEGRA124_EMC_BASE + EMC_ZCAL_INTERVAL @0x4
|
||||
.word TEGRA124_EMC_BASE + EMC_AUTO_CAL_INTERVAL @0x8
|
||||
.word TEGRA124_EMC_BASE + EMC_XM2VTTGENPADCTRL @0xc
|
||||
.word TEGRA124_EMC_BASE + EMC_XM2VTTGENPADCTRL2 @0x10
|
||||
.word TEGRA_PMC_BASE + PMC_IO_DPD_STATUS @0x14
|
||||
.word TEGRA_CLK_RESET_BASE + CLK_RESET_CLK_SOURCE_MSELECT @0x18
|
||||
.word TEGRA_CLK_RESET_BASE + CLK_RESET_SCLK_BURST @0x1c
|
||||
tegra124_sdram_pad_address_end:
|
||||
|
||||
tegra30_sdram_pad_size:
|
||||
.word tegra114_sdram_pad_address - tegra30_sdram_pad_address
|
||||
.word tegra30_sdram_pad_address_end - tegra30_sdram_pad_address
|
||||
|
||||
tegra114_sdram_pad_size:
|
||||
.word tegra30_sdram_pad_size - tegra114_sdram_pad_address
|
||||
.word tegra114_sdram_pad_adress_end - tegra114_sdram_pad_address
|
||||
|
||||
.type tegra30_sdram_pad_save, %object
|
||||
tegra30_sdram_pad_save:
|
||||
.rept (tegra30_sdram_pad_size - tegra114_sdram_pad_address) / 4
|
||||
.type tegra_sdram_pad_save, %object
|
||||
tegra_sdram_pad_save:
|
||||
.rept (tegra114_sdram_pad_adress_end - tegra114_sdram_pad_address) / 4
|
||||
.long 0
|
||||
.endr
|
||||
|
||||
|
@ -692,13 +710,18 @@ halted:
|
|||
*/
|
||||
tegra30_sdram_self_refresh:
|
||||
|
||||
adr r8, tegra30_sdram_pad_save
|
||||
adr r8, tegra_sdram_pad_save
|
||||
tegra_get_soc_id TEGRA_APB_MISC_BASE, r10
|
||||
cmp r10, #TEGRA30
|
||||
adreq r2, tegra30_sdram_pad_address
|
||||
ldreq r3, tegra30_sdram_pad_size
|
||||
adrne r2, tegra114_sdram_pad_address
|
||||
ldrne r3, tegra114_sdram_pad_size
|
||||
cmp r10, #TEGRA114
|
||||
adreq r2, tegra114_sdram_pad_address
|
||||
ldreq r3, tegra114_sdram_pad_size
|
||||
cmp r10, #TEGRA124
|
||||
adreq r2, tegra124_sdram_pad_address
|
||||
ldreq r3, tegra30_sdram_pad_size
|
||||
|
||||
mov r9, #0
|
||||
|
||||
padsave:
|
||||
|
@ -716,7 +739,10 @@ padsave_done:
|
|||
|
||||
cmp r10, #TEGRA30
|
||||
ldreq r0, =TEGRA_EMC_BASE @ r0 reserved for emc base addr
|
||||
ldrne r0, =TEGRA_EMC0_BASE
|
||||
cmp r10, #TEGRA114
|
||||
ldreq r0, =TEGRA_EMC0_BASE
|
||||
cmp r10, #TEGRA124
|
||||
ldreq r0, =TEGRA124_EMC_BASE
|
||||
|
||||
enter_self_refresh:
|
||||
cmp r10, #TEGRA30
|
||||
|
|
|
@ -33,17 +33,80 @@
|
|||
#include <linux/slab.h>
|
||||
#include <linux/sys_soc.h>
|
||||
#include <linux/usb/tegra_usb_phy.h>
|
||||
#include <linux/clk-provider.h>
|
||||
#include <linux/clk/tegra.h>
|
||||
#include <linux/irqchip.h>
|
||||
|
||||
#include <asm/hardware/cache-l2x0.h>
|
||||
#include <asm/mach-types.h>
|
||||
#include <asm/mach/arch.h>
|
||||
#include <asm/mach/time.h>
|
||||
#include <asm/setup.h>
|
||||
|
||||
#include "apbio.h"
|
||||
#include "board.h"
|
||||
#include "common.h"
|
||||
#include "cpuidle.h"
|
||||
#include "fuse.h"
|
||||
#include "iomap.h"
|
||||
#include "irq.h"
|
||||
#include "pmc.h"
|
||||
#include "pm.h"
|
||||
#include "reset.h"
|
||||
#include "sleep.h"
|
||||
|
||||
/*
|
||||
* Storage for debug-macro.S's state.
|
||||
*
|
||||
* This must be in .data not .bss so that it gets initialized each time the
|
||||
* kernel is loaded. The data is declared here rather than debug-macro.S so
|
||||
* that multiple inclusions of debug-macro.S point at the same data.
|
||||
*/
|
||||
u32 tegra_uart_config[4] = {
|
||||
/* Debug UART initialization required */
|
||||
1,
|
||||
/* Debug UART physical address */
|
||||
0,
|
||||
/* Debug UART virtual address */
|
||||
0,
|
||||
/* Scratch space for debug macro */
|
||||
0,
|
||||
};
|
||||
|
||||
static void __init tegra_init_cache(void)
|
||||
{
|
||||
#ifdef CONFIG_CACHE_L2X0
|
||||
int ret;
|
||||
void __iomem *p = IO_ADDRESS(TEGRA_ARM_PERIF_BASE) + 0x3000;
|
||||
u32 aux_ctrl, cache_type;
|
||||
|
||||
cache_type = readl(p + L2X0_CACHE_TYPE);
|
||||
aux_ctrl = (cache_type & 0x700) << (17-8);
|
||||
aux_ctrl |= 0x7C400001;
|
||||
|
||||
ret = l2x0_of_init(aux_ctrl, 0x8200c3fe);
|
||||
if (!ret)
|
||||
l2x0_saved_regs_addr = virt_to_phys(&l2x0_saved_regs);
|
||||
#endif
|
||||
}
|
||||
|
||||
static void __init tegra_init_early(void)
|
||||
{
|
||||
tegra_cpu_reset_handler_init();
|
||||
tegra_apb_io_init();
|
||||
tegra_init_fuse();
|
||||
tegra_init_cache();
|
||||
tegra_powergate_init();
|
||||
tegra_hotplug_init();
|
||||
}
|
||||
|
||||
static void __init tegra_dt_init_irq(void)
|
||||
{
|
||||
tegra_pmc_init_irq();
|
||||
tegra_init_irq();
|
||||
irqchip_init();
|
||||
tegra_legacy_irq_syscore_init();
|
||||
}
|
||||
|
||||
static void __init tegra_dt_init(void)
|
||||
{
|
||||
|
@ -51,6 +114,8 @@ static void __init tegra_dt_init(void)
|
|||
struct soc_device *soc_dev;
|
||||
struct device *parent = NULL;
|
||||
|
||||
tegra_pmc_init();
|
||||
|
||||
tegra_clocks_apply_init_table();
|
||||
|
||||
soc_dev_attr = kzalloc(sizeof(*soc_dev_attr), GFP_KERNEL);
|
||||
|
@ -80,6 +145,12 @@ out:
|
|||
of_platform_populate(NULL, of_default_bus_match_table, NULL, parent);
|
||||
}
|
||||
|
||||
static void __init tegra_dt_init_time(void)
|
||||
{
|
||||
of_clk_init(NULL);
|
||||
clocksource_of_init();
|
||||
}
|
||||
|
||||
static void __init paz00_init(void)
|
||||
{
|
||||
if (IS_ENABLED(CONFIG_ARCH_TEGRA_2x_SOC))
|
||||
|
@ -97,7 +168,9 @@ static void __init tegra_dt_init_late(void)
|
|||
{
|
||||
int i;
|
||||
|
||||
tegra_init_late();
|
||||
tegra_init_suspend();
|
||||
tegra_cpuidle_init();
|
||||
tegra_powergate_debugfs_init();
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(board_init_funcs); i++) {
|
||||
if (of_machine_is_compatible(board_init_funcs[i].machine)) {
|
||||
|
@ -108,6 +181,7 @@ static void __init tegra_dt_init_late(void)
|
|||
}
|
||||
|
||||
static const char * const tegra_dt_board_compat[] = {
|
||||
"nvidia,tegra124",
|
||||
"nvidia,tegra114",
|
||||
"nvidia,tegra30",
|
||||
"nvidia,tegra20",
|
||||
|
@ -119,9 +193,9 @@ DT_MACHINE_START(TEGRA_DT, "NVIDIA Tegra SoC (Flattened Device Tree)")
|
|||
.smp = smp_ops(tegra_smp_ops),
|
||||
.init_early = tegra_init_early,
|
||||
.init_irq = tegra_dt_init_irq,
|
||||
.init_time = clocksource_of_init,
|
||||
.init_time = tegra_dt_init_time,
|
||||
.init_machine = tegra_dt_init,
|
||||
.init_late = tegra_dt_init_late,
|
||||
.restart = tegra_assert_system_reset,
|
||||
.restart = tegra_pmc_restart,
|
||||
.dt_compat = tegra_dt_board_compat,
|
||||
MACHINE_END
|
||||
|
|
|
@ -34,8 +34,15 @@ struct clk;
|
|||
#define TEGRA_POWERGATE_CPU3 11
|
||||
#define TEGRA_POWERGATE_CELP 12
|
||||
#define TEGRA_POWERGATE_3D1 13
|
||||
#define TEGRA_POWERGATE_CPU0 14
|
||||
#define TEGRA_POWERGATE_C0NC 15
|
||||
#define TEGRA_POWERGATE_C1NC 16
|
||||
#define TEGRA_POWERGATE_DIS 18
|
||||
#define TEGRA_POWERGATE_DISB 19
|
||||
#define TEGRA_POWERGATE_XUSBA 20
|
||||
#define TEGRA_POWERGATE_XUSBB 21
|
||||
#define TEGRA_POWERGATE_XUSBC 22
|
||||
|
||||
#define TEGRA_POWERGATE_CPU0 TEGRA_POWERGATE_CPU
|
||||
#define TEGRA_POWERGATE_3D0 TEGRA_POWERGATE_3D
|
||||
|
||||
int tegra_powergate_is_powered(int id);
|
||||
|
|
Загрузка…
Ссылка в новой задаче