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