forked from Minki/linux
673dd36f0d
Use the SoC infrastructure to hold the interrupt controller information (i.e., base address, default priorities, interrupt controller type, and the number of IRQs). The interrupt controller base, although initially put in the soc_info structure's intc_base field, is eventually put in the global 'davinci_intc_base' so the low-level interrupt code can access it without a dereference. These changes enable the SoC default irq priorities to be put in the SoC-specific files, and the interrupt controller to be at any base address. Signed-off-by: Mark A. Greer <mgreer@mvista.com> Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com>
95 lines
2.2 KiB
C
95 lines
2.2 KiB
C
/*
|
|
* Code commons to all DaVinci SoCs.
|
|
*
|
|
* Author: Mark A. Greer <mgreer@mvista.com>
|
|
*
|
|
* 2009 (c) MontaVista Software, Inc. This file is licensed under
|
|
* the terms of the GNU General Public License version 2. This program
|
|
* is licensed "as is" without any warranty of any kind, whether express
|
|
* or implied.
|
|
*/
|
|
#include <linux/module.h>
|
|
#include <linux/io.h>
|
|
|
|
#include <asm/tlb.h>
|
|
#include <asm/mach/map.h>
|
|
|
|
#include <mach/common.h>
|
|
#include <mach/cputype.h>
|
|
|
|
#include "clock.h"
|
|
|
|
struct davinci_soc_info davinci_soc_info;
|
|
EXPORT_SYMBOL(davinci_soc_info);
|
|
|
|
void __iomem *davinci_intc_base;
|
|
|
|
static struct davinci_id * __init davinci_get_id(u32 jtag_id)
|
|
{
|
|
int i;
|
|
struct davinci_id *dip;
|
|
u8 variant = (jtag_id & 0xf0000000) >> 28;
|
|
u16 part_no = (jtag_id & 0x0ffff000) >> 12;
|
|
|
|
for (i = 0, dip = davinci_soc_info.ids; i < davinci_soc_info.ids_num;
|
|
i++, dip++)
|
|
/* Don't care about the manufacturer right now */
|
|
if ((dip->part_no == part_no) && (dip->variant == variant))
|
|
return dip;
|
|
|
|
return NULL;
|
|
}
|
|
|
|
void __init davinci_common_init(struct davinci_soc_info *soc_info)
|
|
{
|
|
int ret;
|
|
struct davinci_id *dip;
|
|
|
|
if (!soc_info) {
|
|
ret = -EINVAL;
|
|
goto err;
|
|
}
|
|
|
|
memcpy(&davinci_soc_info, soc_info, sizeof(struct davinci_soc_info));
|
|
|
|
if (davinci_soc_info.io_desc && (davinci_soc_info.io_desc_num > 0))
|
|
iotable_init(davinci_soc_info.io_desc,
|
|
davinci_soc_info.io_desc_num);
|
|
|
|
/*
|
|
* Normally devicemaps_init() would flush caches and tlb after
|
|
* mdesc->map_io(), but we must also do it here because of the CPU
|
|
* revision check below.
|
|
*/
|
|
local_flush_tlb_all();
|
|
flush_cache_all();
|
|
|
|
/*
|
|
* We want to check CPU revision early for cpu_is_xxxx() macros.
|
|
* IO space mapping must be initialized before we can do that.
|
|
*/
|
|
davinci_soc_info.jtag_id = __raw_readl(davinci_soc_info.jtag_id_base);
|
|
|
|
dip = davinci_get_id(davinci_soc_info.jtag_id);
|
|
if (!dip) {
|
|
ret = -EINVAL;
|
|
goto err;
|
|
}
|
|
|
|
davinci_soc_info.cpu_id = dip->cpu_id;
|
|
pr_info("DaVinci %s variant 0x%x\n", dip->name, dip->variant);
|
|
|
|
if (davinci_soc_info.cpu_clks) {
|
|
ret = davinci_clk_init(davinci_soc_info.cpu_clks);
|
|
|
|
if (ret != 0)
|
|
goto err;
|
|
}
|
|
|
|
davinci_intc_base = davinci_soc_info.intc_base;
|
|
return;
|
|
|
|
err:
|
|
pr_err("davinci_common_init: SoC Initialization failed\n");
|
|
}
|