tegra.c 4.7 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
 * 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.
 *
 */

19
#include <linux/clocksource.h>
G
Grant Likely 已提交
20 21 22 23 24 25 26 27 28 29 30 31 32
#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>
33 34
#include <linux/slab.h>
#include <linux/sys_soc.h>
S
Stephen Warren 已提交
35
#include <linux/usb/tegra_usb_phy.h>
36
#include <linux/clk-provider.h>
37
#include <linux/clk/tegra.h>
S
Stephen Warren 已提交
38
#include <linux/irqchip.h>
G
Grant Likely 已提交
39

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

S
Stephen Warren 已提交
46
#include "apbio.h"
G
Grant Likely 已提交
47
#include "board.h"
48
#include "common.h"
S
Stephen Warren 已提交
49
#include "cpuidle.h"
50
#include "fuse.h"
51
#include "iomap.h"
S
Stephen Warren 已提交
52
#include "irq.h"
53
#include "pmc.h"
S
Stephen Warren 已提交
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 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109
#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();
}
S
Stephen Warren 已提交
110

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

117 118
	tegra_pmc_init();

119 120
	tegra_clocks_apply_init_table();

121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139
	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);

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

148 149 150 151 152 153
static void __init tegra_dt_init_time(void)
{
	of_clk_init(NULL);
	clocksource_of_init();
}

154 155
static void __init paz00_init(void)
{
156 157
	if (IS_ENABLED(CONFIG_ARCH_TEGRA_2x_SOC))
		tegra_paz00_wifikill_init();
158 159
}

160 161 162 163
static struct {
	char *machine;
	void (*init)(void);
} board_init_funcs[] = {
164
	{ "compal,paz00", paz00_init },
165 166 167 168 169 170
};

static void __init tegra_dt_init_late(void)
{
	int i;

S
Stephen Warren 已提交
171 172 173
	tegra_init_suspend();
	tegra_cpuidle_init();
	tegra_powergate_debugfs_init();
174 175 176 177 178 179 180 181 182

	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;
		}
	}
}

183 184 185
static const char * const tegra_dt_board_compat[] = {
	"nvidia,tegra114",
	"nvidia,tegra30",
186
	"nvidia,tegra20",
G
Grant Likely 已提交
187 188 189
	NULL
};

190
DT_MACHINE_START(TEGRA_DT, "NVIDIA Tegra SoC (Flattened Device Tree)")
G
Grant Likely 已提交
191
	.map_io		= tegra_map_common_io,
192
	.smp		= smp_ops(tegra_smp_ops),
193
	.init_early	= tegra_init_early,
194
	.init_irq	= tegra_dt_init_irq,
195
	.init_time	= tegra_dt_init_time,
G
Grant Likely 已提交
196
	.init_machine	= tegra_dt_init,
197
	.init_late	= tegra_dt_init_late,
S
Stephen Warren 已提交
198
	.restart	= tegra_pmc_restart,
199
	.dt_compat	= tegra_dt_board_compat,
G
Grant Likely 已提交
200
MACHINE_END