xref: /kernel/linux/linux-6.6/arch/mips/ralink/rt288x.c (revision 62306a36)
162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci *
462306a36Sopenharmony_ci * Parts of this file are based on Ralink's 2.6.21 BSP
562306a36Sopenharmony_ci *
662306a36Sopenharmony_ci * Copyright (C) 2008-2011 Gabor Juhos <juhosg@openwrt.org>
762306a36Sopenharmony_ci * Copyright (C) 2008 Imre Kaloz <kaloz@openwrt.org>
862306a36Sopenharmony_ci * Copyright (C) 2013 John Crispin <john@phrozen.org>
962306a36Sopenharmony_ci */
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_ci#include <linux/kernel.h>
1262306a36Sopenharmony_ci#include <linux/init.h>
1362306a36Sopenharmony_ci#include <linux/slab.h>
1462306a36Sopenharmony_ci#include <linux/sys_soc.h>
1562306a36Sopenharmony_ci
1662306a36Sopenharmony_ci#include <asm/mipsregs.h>
1762306a36Sopenharmony_ci#include <asm/mach-ralink/ralink_regs.h>
1862306a36Sopenharmony_ci#include <asm/mach-ralink/rt288x.h>
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_ci#include "common.h"
2162306a36Sopenharmony_ci
2262306a36Sopenharmony_cistatic struct ralink_soc_info *soc_info_ptr;
2362306a36Sopenharmony_ci
2462306a36Sopenharmony_cistatic unsigned int __init rt2880_get_soc_name0(void)
2562306a36Sopenharmony_ci{
2662306a36Sopenharmony_ci	return __raw_readl(RT2880_SYSC_BASE + SYSC_REG_CHIP_NAME0);
2762306a36Sopenharmony_ci}
2862306a36Sopenharmony_ci
2962306a36Sopenharmony_cistatic unsigned int __init rt2880_get_soc_name1(void)
3062306a36Sopenharmony_ci{
3162306a36Sopenharmony_ci	return __raw_readl(RT2880_SYSC_BASE + SYSC_REG_CHIP_NAME1);
3262306a36Sopenharmony_ci}
3362306a36Sopenharmony_ci
3462306a36Sopenharmony_cistatic bool __init rt2880_soc_valid(void)
3562306a36Sopenharmony_ci{
3662306a36Sopenharmony_ci	if (rt2880_get_soc_name0() == RT2880_CHIP_NAME0 &&
3762306a36Sopenharmony_ci	    rt2880_get_soc_name1() == RT2880_CHIP_NAME1)
3862306a36Sopenharmony_ci		return true;
3962306a36Sopenharmony_ci	else
4062306a36Sopenharmony_ci		return false;
4162306a36Sopenharmony_ci}
4262306a36Sopenharmony_ci
4362306a36Sopenharmony_cistatic const char __init *rt2880_get_soc_name(void)
4462306a36Sopenharmony_ci{
4562306a36Sopenharmony_ci	if (rt2880_soc_valid())
4662306a36Sopenharmony_ci		return "RT2880";
4762306a36Sopenharmony_ci	else
4862306a36Sopenharmony_ci		return "invalid";
4962306a36Sopenharmony_ci}
5062306a36Sopenharmony_ci
5162306a36Sopenharmony_cistatic unsigned int __init rt2880_get_soc_id(void)
5262306a36Sopenharmony_ci{
5362306a36Sopenharmony_ci	return __raw_readl(RT2880_SYSC_BASE + SYSC_REG_CHIP_ID);
5462306a36Sopenharmony_ci}
5562306a36Sopenharmony_ci
5662306a36Sopenharmony_cistatic unsigned int __init rt2880_get_soc_ver(void)
5762306a36Sopenharmony_ci{
5862306a36Sopenharmony_ci	return (rt2880_get_soc_id() >> CHIP_ID_ID_SHIFT) & CHIP_ID_ID_MASK;
5962306a36Sopenharmony_ci}
6062306a36Sopenharmony_ci
6162306a36Sopenharmony_cistatic unsigned int __init rt2880_get_soc_rev(void)
6262306a36Sopenharmony_ci{
6362306a36Sopenharmony_ci	return (rt2880_get_soc_id() & CHIP_ID_REV_MASK);
6462306a36Sopenharmony_ci}
6562306a36Sopenharmony_ci
6662306a36Sopenharmony_cistatic int __init rt2880_soc_dev_init(void)
6762306a36Sopenharmony_ci{
6862306a36Sopenharmony_ci	struct soc_device *soc_dev;
6962306a36Sopenharmony_ci	struct soc_device_attribute *soc_dev_attr;
7062306a36Sopenharmony_ci
7162306a36Sopenharmony_ci	soc_dev_attr = kzalloc(sizeof(*soc_dev_attr), GFP_KERNEL);
7262306a36Sopenharmony_ci	if (!soc_dev_attr)
7362306a36Sopenharmony_ci		return -ENOMEM;
7462306a36Sopenharmony_ci
7562306a36Sopenharmony_ci	soc_dev_attr->family = "Ralink";
7662306a36Sopenharmony_ci	soc_dev_attr->soc_id = rt2880_get_soc_name();
7762306a36Sopenharmony_ci
7862306a36Sopenharmony_ci	soc_dev_attr->data = soc_info_ptr;
7962306a36Sopenharmony_ci
8062306a36Sopenharmony_ci	soc_dev = soc_device_register(soc_dev_attr);
8162306a36Sopenharmony_ci	if (IS_ERR(soc_dev)) {
8262306a36Sopenharmony_ci		kfree(soc_dev_attr);
8362306a36Sopenharmony_ci		return PTR_ERR(soc_dev);
8462306a36Sopenharmony_ci	}
8562306a36Sopenharmony_ci
8662306a36Sopenharmony_ci	return 0;
8762306a36Sopenharmony_ci}
8862306a36Sopenharmony_cidevice_initcall(rt2880_soc_dev_init);
8962306a36Sopenharmony_ci
9062306a36Sopenharmony_civoid __init prom_soc_init(struct ralink_soc_info *soc_info)
9162306a36Sopenharmony_ci{
9262306a36Sopenharmony_ci	if (rt2880_soc_valid())
9362306a36Sopenharmony_ci		soc_info->compatible = "ralink,r2880-soc";
9462306a36Sopenharmony_ci	else
9562306a36Sopenharmony_ci		panic("rt288x: unknown SoC, n0:%08x n1:%08x",
9662306a36Sopenharmony_ci		      rt2880_get_soc_name0(), rt2880_get_soc_name1());
9762306a36Sopenharmony_ci
9862306a36Sopenharmony_ci	snprintf(soc_info->sys_type, RAMIPS_SYS_TYPE_LEN,
9962306a36Sopenharmony_ci		"Ralink %s id:%u rev:%u",
10062306a36Sopenharmony_ci		rt2880_get_soc_name(),
10162306a36Sopenharmony_ci		rt2880_get_soc_ver(),
10262306a36Sopenharmony_ci		rt2880_get_soc_rev());
10362306a36Sopenharmony_ci
10462306a36Sopenharmony_ci	soc_info->mem_base = RT2880_SDRAM_BASE;
10562306a36Sopenharmony_ci	soc_info->mem_size_min = RT2880_MEM_SIZE_MIN;
10662306a36Sopenharmony_ci	soc_info->mem_size_max = RT2880_MEM_SIZE_MAX;
10762306a36Sopenharmony_ci
10862306a36Sopenharmony_ci	ralink_soc = RT2880_SOC;
10962306a36Sopenharmony_ci	soc_info_ptr = soc_info;
11062306a36Sopenharmony_ci}
111