tegra.c 4.5 KB
Newer Older
G
Grant Likely 已提交
1
/*
2
 * NVIDIA Tegra SoC device tree board support
G
Grant Likely 已提交
3
 *
4
 * Copyright (C) 2011, 2013, NVIDIA Corporation
G
Grant Likely 已提交
5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
 * Copyright (C) 2010 Secret Lab Technologies, Ltd.
 * Copyright (C) 2010 Google, Inc.
 *
 * 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/kernel.h>
#include <linux/init.h>
#include <linux/platform_device.h>
#include <linux/serial_8250.h>
#include <linux/clk.h>
#include <linux/dma-mapping.h>
#include <linux/irqdomain.h>
#include <linux/of.h>
#include <linux/of_address.h>
#include <linux/of_fdt.h>
#include <linux/of_platform.h>
#include <linux/pda_power.h>
#include <linux/io.h>
32 33
#include <linux/slab.h>
#include <linux/sys_soc.h>
S
Stephen Warren 已提交
34
#include <linux/usb/tegra_usb_phy.h>
35
#include <linux/clk/tegra.h>
S
Stephen Warren 已提交
36
#include <linux/irqchip.h>
G
Grant Likely 已提交
37

S
Stephen Warren 已提交
38
#include <asm/hardware/cache-l2x0.h>
G
Grant Likely 已提交
39 40 41 42 43
#include <asm/mach-types.h>
#include <asm/mach/arch.h>
#include <asm/mach/time.h>
#include <asm/setup.h>

S
Stephen Warren 已提交
44
#include "apbio.h"
G
Grant Likely 已提交
45
#include "board.h"
46
#include "common.h"
S
Stephen Warren 已提交
47
#include "cpuidle.h"
48
#include "fuse.h"
49
#include "iomap.h"
S
Stephen Warren 已提交
50
#include "irq.h"
51
#include "pmc.h"
S
Stephen Warren 已提交
52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94
#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_apb_io_init();
	tegra_init_fuse();
95
	tegra_cpu_reset_handler_init();
S
Stephen Warren 已提交
96 97 98 99 100 101 102 103 104 105 106 107
	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();
}
S
Stephen Warren 已提交
108

G
Grant Likely 已提交
109 110
static void __init tegra_dt_init(void)
{
111 112 113 114
	struct soc_device_attribute *soc_dev_attr;
	struct soc_device *soc_dev;
	struct device *parent = NULL;

115 116
	tegra_pmc_init();

117 118
	tegra_clocks_apply_init_table();

119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137
	soc_dev_attr = kzalloc(sizeof(*soc_dev_attr), GFP_KERNEL);
	if (!soc_dev_attr)
		goto out;

	soc_dev_attr->family = kasprintf(GFP_KERNEL, "Tegra");
	soc_dev_attr->revision = kasprintf(GFP_KERNEL, "%d", tegra_revision);
	soc_dev_attr->soc_id = kasprintf(GFP_KERNEL, "%d", tegra_chip_id);

	soc_dev = soc_device_register(soc_dev_attr);
	if (IS_ERR(soc_dev)) {
		kfree(soc_dev_attr->family);
		kfree(soc_dev_attr->revision);
		kfree(soc_dev_attr->soc_id);
		kfree(soc_dev_attr);
		goto out;
	}

	parent = soc_device_to_device(soc_dev);

138 139 140 141
	/*
	 * Finished with the static registrations now; fill in the missing
	 * devices
	 */
142
out:
143
	of_platform_populate(NULL, of_default_bus_match_table, NULL, parent);
G
Grant Likely 已提交
144 145
}

146 147
static void __init paz00_init(void)
{
148 149
	if (IS_ENABLED(CONFIG_ARCH_TEGRA_2x_SOC))
		tegra_paz00_wifikill_init();
150 151
}

152 153 154 155
static struct {
	char *machine;
	void (*init)(void);
} board_init_funcs[] = {
156
	{ "compal,paz00", paz00_init },
157 158 159 160 161 162
};

static void __init tegra_dt_init_late(void)
{
	int i;

S
Stephen Warren 已提交
163 164 165
	tegra_init_suspend();
	tegra_cpuidle_init();
	tegra_powergate_debugfs_init();
166 167 168 169 170 171 172 173 174

	for (i = 0; i < ARRAY_SIZE(board_init_funcs); i++) {
		if (of_machine_is_compatible(board_init_funcs[i].machine)) {
			board_init_funcs[i].init();
			break;
		}
	}
}

175
static const char * const tegra_dt_board_compat[] = {
J
Joseph Lo 已提交
176
	"nvidia,tegra124",
177 178
	"nvidia,tegra114",
	"nvidia,tegra30",
179
	"nvidia,tegra20",
G
Grant Likely 已提交
180 181 182
	NULL
};

183
DT_MACHINE_START(TEGRA_DT, "NVIDIA Tegra SoC (Flattened Device Tree)")
G
Grant Likely 已提交
184
	.map_io		= tegra_map_common_io,
185
	.smp		= smp_ops(tegra_smp_ops),
186
	.init_early	= tegra_init_early,
187
	.init_irq	= tegra_dt_init_irq,
G
Grant Likely 已提交
188
	.init_machine	= tegra_dt_init,
189
	.init_late	= tegra_dt_init_late,
S
Stephen Warren 已提交
190
	.restart	= tegra_pmc_restart,
191
	.dt_compat	= tegra_dt_board_compat,
G
Grant Likely 已提交
192
MACHINE_END