xref: /openbmc/linux/arch/arm/mach-davinci/common.c (revision 2612e3bbc0386368a850140a6c9b990cd496a5ec)
10fdebc5eSThomas Gleixner // SPDX-License-Identifier: GPL-2.0-only
279c3c0b7SMark A. Greer /*
379c3c0b7SMark A. Greer  * Code commons to all DaVinci SoCs.
479c3c0b7SMark A. Greer  *
579c3c0b7SMark A. Greer  * Author: Mark A. Greer <mgreer@mvista.com>
679c3c0b7SMark A. Greer  *
70fdebc5eSThomas Gleixner  * 2009 (c) MontaVista Software, Inc.
879c3c0b7SMark A. Greer  */
979c3c0b7SMark A. Greer #include <linux/module.h>
1079c3c0b7SMark A. Greer #include <linux/io.h>
11b14dc0f9SMark A. Greer #include <linux/etherdevice.h>
128ee2bf9aSSriramakrishnan #include <linux/davinci_emac.h>
13fd24f903SJon Medhurst #include <linux/dma-mapping.h>
14*30955b4aSArnd Bergmann #include <linux/platform_data/davinci-cpufreq.h>
1579c3c0b7SMark A. Greer 
1679c3c0b7SMark A. Greer #include <asm/tlb.h>
1779c3c0b7SMark A. Greer #include <asm/mach/map.h>
1879c3c0b7SMark A. Greer 
19ca31807bSArnd Bergmann #include "common.h"
20ca31807bSArnd Bergmann #include "cputype.h"
2179c3c0b7SMark A. Greer 
2279c3c0b7SMark A. Greer struct davinci_soc_info davinci_soc_info;
2379c3c0b7SMark A. Greer EXPORT_SYMBOL(davinci_soc_info);
2479c3c0b7SMark A. Greer 
davinci_init_id(struct davinci_soc_info * soc_info)253347db83SCyril Chemparathy static int __init davinci_init_id(struct davinci_soc_info *soc_info)
26b9ab1279SMark A. Greer {
27b9ab1279SMark A. Greer 	int			i;
28b9ab1279SMark A. Greer 	struct davinci_id	*dip;
293347db83SCyril Chemparathy 	u8			variant;
303347db83SCyril Chemparathy 	u16			part_no;
313347db83SCyril Chemparathy 	void __iomem		*base;
32b9ab1279SMark A. Greer 
333347db83SCyril Chemparathy 	base = ioremap(soc_info->jtag_id_reg, SZ_4K);
343347db83SCyril Chemparathy 	if (!base) {
353347db83SCyril Chemparathy 		pr_err("Unable to map JTAG ID register\n");
363347db83SCyril Chemparathy 		return -ENOMEM;
373347db83SCyril Chemparathy 	}
383347db83SCyril Chemparathy 
393347db83SCyril Chemparathy 	soc_info->jtag_id = __raw_readl(base);
403347db83SCyril Chemparathy 	iounmap(base);
413347db83SCyril Chemparathy 
423347db83SCyril Chemparathy 	variant = (soc_info->jtag_id & 0xf0000000) >> 28;
433347db83SCyril Chemparathy 	part_no = (soc_info->jtag_id & 0x0ffff000) >> 12;
443347db83SCyril Chemparathy 
453347db83SCyril Chemparathy 	for (i = 0, dip = soc_info->ids; i < soc_info->ids_num;
46b9ab1279SMark A. Greer 			i++, dip++)
47b9ab1279SMark A. Greer 		/* Don't care about the manufacturer right now */
483347db83SCyril Chemparathy 		if ((dip->part_no == part_no) && (dip->variant == variant)) {
493347db83SCyril Chemparathy 			soc_info->cpu_id = dip->cpu_id;
503347db83SCyril Chemparathy 			pr_info("DaVinci %s variant 0x%x\n", dip->name,
513347db83SCyril Chemparathy 					dip->variant);
523347db83SCyril Chemparathy 			return 0;
533347db83SCyril Chemparathy 		}
54b9ab1279SMark A. Greer 
553347db83SCyril Chemparathy 	pr_err("Unknown DaVinci JTAG ID 0x%x\n", soc_info->jtag_id);
563347db83SCyril Chemparathy 	return -EINVAL;
57b9ab1279SMark A. Greer }
58b9ab1279SMark A. Greer 
davinci_common_init(const struct davinci_soc_info * soc_info)591a6d490bSBhumika Goyal void __init davinci_common_init(const struct davinci_soc_info *soc_info)
6079c3c0b7SMark A. Greer {
6179c3c0b7SMark A. Greer 	int ret;
6279c3c0b7SMark A. Greer 
6379c3c0b7SMark A. Greer 	if (!soc_info) {
6479c3c0b7SMark A. Greer 		ret = -EINVAL;
6579c3c0b7SMark A. Greer 		goto err;
6679c3c0b7SMark A. Greer 	}
6779c3c0b7SMark A. Greer 
6879c3c0b7SMark A. Greer 	memcpy(&davinci_soc_info, soc_info, sizeof(struct davinci_soc_info));
6979c3c0b7SMark A. Greer 
7079c3c0b7SMark A. Greer 	if (davinci_soc_info.io_desc && (davinci_soc_info.io_desc_num > 0))
7179c3c0b7SMark A. Greer 		iotable_init(davinci_soc_info.io_desc,
7279c3c0b7SMark A. Greer 				davinci_soc_info.io_desc_num);
7379c3c0b7SMark A. Greer 
7479c3c0b7SMark A. Greer 	/*
7579c3c0b7SMark A. Greer 	 * Normally devicemaps_init() would flush caches and tlb after
7679c3c0b7SMark A. Greer 	 * mdesc->map_io(), but we must also do it here because of the CPU
7779c3c0b7SMark A. Greer 	 * revision check below.
7879c3c0b7SMark A. Greer 	 */
7979c3c0b7SMark A. Greer 	local_flush_tlb_all();
8079c3c0b7SMark A. Greer 	flush_cache_all();
8179c3c0b7SMark A. Greer 
8279c3c0b7SMark A. Greer 	/*
8379c3c0b7SMark A. Greer 	 * We want to check CPU revision early for cpu_is_xxxx() macros.
8479c3c0b7SMark A. Greer 	 * IO space mapping must be initialized before we can do that.
8579c3c0b7SMark A. Greer 	 */
863347db83SCyril Chemparathy 	ret = davinci_init_id(&davinci_soc_info);
873347db83SCyril Chemparathy 	if (ret < 0)
88b9ab1279SMark A. Greer 		goto err;
8979c3c0b7SMark A. Greer 
9066e0c399SMark A. Greer 
9179c3c0b7SMark A. Greer 	return;
9279c3c0b7SMark A. Greer 
9379c3c0b7SMark A. Greer err:
9469872e93SSekhar Nori 	panic("davinci_common_init: SoC Initialization failed\n");
9579c3c0b7SMark A. Greer }
963aa3e840SShawn Guo 
davinci_init_late(void)973aa3e840SShawn Guo void __init davinci_init_late(void)
983aa3e840SShawn Guo {
993aa3e840SShawn Guo 	davinci_cpufreq_init();
1003aa3e840SShawn Guo }
101