Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0-or-later
0002 /*
0003  *  Author: Alexander Shiyan <shc_work@mail.ru>, 2016
0004  */
0005 
0006 #include <linux/io.h>
0007 #include <linux/of_fdt.h>
0008 #include <linux/platform_device.h>
0009 #include <linux/random.h>
0010 #include <linux/sizes.h>
0011 
0012 #include <linux/mfd/syscon/clps711x.h>
0013 
0014 #include <asm/system_info.h>
0015 #include <asm/system_misc.h>
0016 #include <asm/mach/arch.h>
0017 #include <asm/mach/map.h>
0018 
0019 #define CLPS711X_VIRT_BASE  IOMEM(0xfeff4000)
0020 #define CLPS711X_PHYS_BASE  (0x80000000)
0021 # define SYSFLG1        (0x0140)
0022 # define HALT           (0x0800)
0023 # define UNIQID         (0x2440)
0024 # define RANDID0        (0x2700)
0025 # define RANDID1        (0x2704)
0026 # define RANDID2        (0x2708)
0027 # define RANDID3        (0x270c)
0028 
0029 static struct map_desc clps711x_io_desc __initdata = {
0030     .virtual    = (unsigned long)CLPS711X_VIRT_BASE,
0031     .pfn        = __phys_to_pfn(CLPS711X_PHYS_BASE),
0032     .length     = 48 * SZ_1K,
0033     .type       = MT_DEVICE,
0034 };
0035 
0036 static void __init clps711x_map_io(void)
0037 {
0038     iotable_init(&clps711x_io_desc, 1);
0039 }
0040 
0041 static const struct resource clps711x_cpuidle_res =
0042     DEFINE_RES_MEM(CLPS711X_PHYS_BASE + HALT, SZ_128);
0043 
0044 static void __init clps711x_init(void)
0045 {
0046     u32 id[5];
0047 
0048     id[0] = readl(CLPS711X_VIRT_BASE + UNIQID);
0049     id[1] = readl(CLPS711X_VIRT_BASE + RANDID0);
0050     id[2] = readl(CLPS711X_VIRT_BASE + RANDID1);
0051     id[3] = readl(CLPS711X_VIRT_BASE + RANDID2);
0052     id[4] = readl(CLPS711X_VIRT_BASE + RANDID3);
0053     system_rev = SYSFLG1_VERID(readl(CLPS711X_VIRT_BASE + SYSFLG1));
0054 
0055     add_device_randomness(id, sizeof(id));
0056 
0057     system_serial_low = id[0];
0058 
0059     platform_device_register_simple("clps711x-cpuidle", PLATFORM_DEVID_NONE,
0060                     &clps711x_cpuidle_res, 1);
0061 }
0062 
0063 static void clps711x_restart(enum reboot_mode mode, const char *cmd)
0064 {
0065     soft_restart(0);
0066 }
0067 
0068 static const char *const clps711x_compat[] __initconst = {
0069     "cirrus,ep7209",
0070     NULL
0071 };
0072 
0073 DT_MACHINE_START(CLPS711X_DT, "Cirrus Logic CLPS711X (Device Tree Support)")
0074     .dt_compat  = clps711x_compat,
0075     .map_io     = clps711x_map_io,
0076     .init_late  = clps711x_init,
0077     .restart    = clps711x_restart,
0078 MACHINE_END