diff options
Diffstat (limited to 'arch/arm/mach-davinci/common.c')
| -rw-r--r-- | arch/arm/mach-davinci/common.c | 108 | 
1 files changed, 108 insertions, 0 deletions
diff --git a/arch/arm/mach-davinci/common.c b/arch/arm/mach-davinci/common.c new file mode 100644 index 00000000000..61ede19c6b5 --- /dev/null +++ b/arch/arm/mach-davinci/common.c @@ -0,0 +1,108 @@ +/* + * 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 <linux/etherdevice.h> + +#include <asm/tlb.h> +#include <asm/mach/map.h> + +#include <mach/common.h> +#include <mach/cputype.h> +#include <mach/emac.h> + +#include "clock.h" + +struct davinci_soc_info davinci_soc_info; +EXPORT_SYMBOL(davinci_soc_info); + +void __iomem *davinci_intc_base; +int davinci_intc_type; + +void davinci_get_mac_addr(struct memory_accessor *mem_acc, void *context) +{ +	char *mac_addr = davinci_soc_info.emac_pdata->mac_addr; +	off_t offset = (off_t)context; + +	/* Read MAC addr from EEPROM */ +	if (mem_acc->read(mem_acc, mac_addr, offset, ETH_ALEN) == ETH_ALEN) +		pr_info("Read MAC addr from EEPROM: %pM\n", mac_addr); +} + +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; +	davinci_intc_type = davinci_soc_info.intc_type; +	return; + +err: +	pr_err("davinci_common_init: SoC Initialization failed\n"); +}  |