1 // SPDX-License-Identifier: GPL-2.0-only
4 * Parts of this file are based on Ralink's 2.6.21 BSP
6 * Copyright (C) 2008 Imre Kaloz <kaloz@openwrt.org>
7 * Copyright (C) 2008-2011 Gabor Juhos <juhosg@openwrt.org>
8 * Copyright (C) 2013 John Crispin <john@phrozen.org>
11 #include <linux/kernel.h>
12 #include <linux/init.h>
13 #include <linux/slab.h>
14 #include <linux/sys_soc.h>
16 #include <asm/mipsregs.h>
17 #include <asm/mach-ralink/ralink_regs.h>
18 #include <asm/mach-ralink/rt3883.h>
22 static struct ralink_soc_info
*soc_info_ptr
;
24 static unsigned int __init
rt3883_get_soc_name0(void)
26 return __raw_readl(RT3883_SYSC_BASE
+ RT3883_SYSC_REG_CHIPID0_3
);
29 static unsigned int __init
rt3883_get_soc_name1(void)
31 return __raw_readl(RT3883_SYSC_BASE
+ RT3883_SYSC_REG_CHIPID4_7
);
34 static bool __init
rt3883_soc_valid(void)
36 if (rt3883_get_soc_name0() == RT3883_CHIP_NAME0
&&
37 rt3883_get_soc_name1() == RT3883_CHIP_NAME1
)
43 static const char __init
*rt3883_get_soc_name(void)
45 if (rt3883_soc_valid())
51 static unsigned int __init
rt3883_get_soc_id(void)
53 return __raw_readl(RT3883_SYSC_BASE
+ RT3883_SYSC_REG_REVID
);
56 static unsigned int __init
rt3883_get_soc_ver(void)
58 return (rt3883_get_soc_id() >> RT3883_REVID_VER_ID_SHIFT
) & RT3883_REVID_VER_ID_MASK
;
61 static unsigned int __init
rt3883_get_soc_rev(void)
63 return (rt3883_get_soc_id() & RT3883_REVID_ECO_ID_MASK
);
66 static int __init
rt3883_soc_dev_init(void)
68 struct soc_device
*soc_dev
;
69 struct soc_device_attribute
*soc_dev_attr
;
71 soc_dev_attr
= kzalloc(sizeof(*soc_dev_attr
), GFP_KERNEL
);
75 soc_dev_attr
->family
= "Ralink";
76 soc_dev_attr
->soc_id
= rt3883_get_soc_name();
78 soc_dev_attr
->data
= soc_info_ptr
;
80 soc_dev
= soc_device_register(soc_dev_attr
);
81 if (IS_ERR(soc_dev
)) {
83 return PTR_ERR(soc_dev
);
88 device_initcall(rt3883_soc_dev_init
);
90 void __init
prom_soc_init(struct ralink_soc_info
*soc_info
)
92 if (rt3883_soc_valid())
93 soc_info
->compatible
= "ralink,rt3883-soc";
95 panic("rt3883: unknown SoC, n0:%08x n1:%08x",
96 rt3883_get_soc_name0(), rt3883_get_soc_name1());
98 snprintf(soc_info
->sys_type
, RAMIPS_SYS_TYPE_LEN
,
99 "Ralink %s ver:%u eco:%u",
100 rt3883_get_soc_name(),
101 rt3883_get_soc_ver(),
102 rt3883_get_soc_rev());
104 soc_info
->mem_base
= RT3883_SDRAM_BASE
;
105 soc_info
->mem_size_min
= RT3883_MEM_SIZE_MIN
;
106 soc_info
->mem_size_max
= RT3883_MEM_SIZE_MAX
;
108 ralink_soc
= RT3883_SOC
;
109 soc_info_ptr
= soc_info
;