Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0-only
0002 /*
0003  * Code commons to all DaVinci SoCs.
0004  *
0005  * Author: Mark A. Greer <mgreer@mvista.com>
0006  *
0007  * 2009 (c) MontaVista Software, Inc.
0008  */
0009 #include <linux/module.h>
0010 #include <linux/io.h>
0011 #include <linux/etherdevice.h>
0012 #include <linux/davinci_emac.h>
0013 #include <linux/dma-mapping.h>
0014 
0015 #include <asm/tlb.h>
0016 #include <asm/mach/map.h>
0017 
0018 #include "common.h"
0019 #include "cputype.h"
0020 
0021 struct davinci_soc_info davinci_soc_info;
0022 EXPORT_SYMBOL(davinci_soc_info);
0023 
0024 static int __init davinci_init_id(struct davinci_soc_info *soc_info)
0025 {
0026     int         i;
0027     struct davinci_id   *dip;
0028     u8          variant;
0029     u16         part_no;
0030     void __iomem        *base;
0031 
0032     base = ioremap(soc_info->jtag_id_reg, SZ_4K);
0033     if (!base) {
0034         pr_err("Unable to map JTAG ID register\n");
0035         return -ENOMEM;
0036     }
0037 
0038     soc_info->jtag_id = __raw_readl(base);
0039     iounmap(base);
0040 
0041     variant = (soc_info->jtag_id & 0xf0000000) >> 28;
0042     part_no = (soc_info->jtag_id & 0x0ffff000) >> 12;
0043 
0044     for (i = 0, dip = soc_info->ids; i < soc_info->ids_num;
0045             i++, dip++)
0046         /* Don't care about the manufacturer right now */
0047         if ((dip->part_no == part_no) && (dip->variant == variant)) {
0048             soc_info->cpu_id = dip->cpu_id;
0049             pr_info("DaVinci %s variant 0x%x\n", dip->name,
0050                     dip->variant);
0051             return 0;
0052         }
0053 
0054     pr_err("Unknown DaVinci JTAG ID 0x%x\n", soc_info->jtag_id);
0055     return -EINVAL;
0056 }
0057 
0058 void __init davinci_common_init(const struct davinci_soc_info *soc_info)
0059 {
0060     int ret;
0061 
0062     if (!soc_info) {
0063         ret = -EINVAL;
0064         goto err;
0065     }
0066 
0067     memcpy(&davinci_soc_info, soc_info, sizeof(struct davinci_soc_info));
0068 
0069     if (davinci_soc_info.io_desc && (davinci_soc_info.io_desc_num > 0))
0070         iotable_init(davinci_soc_info.io_desc,
0071                 davinci_soc_info.io_desc_num);
0072 
0073     /*
0074      * Normally devicemaps_init() would flush caches and tlb after
0075      * mdesc->map_io(), but we must also do it here because of the CPU
0076      * revision check below.
0077      */
0078     local_flush_tlb_all();
0079     flush_cache_all();
0080 
0081     /*
0082      * We want to check CPU revision early for cpu_is_xxxx() macros.
0083      * IO space mapping must be initialized before we can do that.
0084      */
0085     ret = davinci_init_id(&davinci_soc_info);
0086     if (ret < 0)
0087         goto err;
0088 
0089 
0090     return;
0091 
0092 err:
0093     panic("davinci_common_init: SoC Initialization failed\n");
0094 }
0095 
0096 void __init davinci_init_late(void)
0097 {
0098     davinci_cpufreq_init();
0099 }