forked from torvalds/linux
-
Notifications
You must be signed in to change notification settings - Fork 2
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
soc: nuvoton: Add SoC info driver for WPCM450
Add a SoC information driver for Nuvoton WPCM450 SoCs. It provides information such as the SoC revision. Usage example: # grep . /sys/devices/soc0/* /sys/devices/soc0/family:Nuvoton NPCM /sys/devices/soc0/revision:A3 /sys/devices/soc0/soc_id:WPCM450 Signed-off-by: Jonathan Neuschäfer <j.neuschaefer@gmx.net> Reviewed-by: Joel Stanley <joel@jms.id.au> Reviewed-by: Paul Menzel <pmenzel@molgen.mpg.de> Link: https://lore.kernel.org/r/20221031223926.241641-1-j.neuschaefer@gmx.net Signed-off-by: Joel Stanley <joel@jms.id.au> Link: https://lore.kernel.org/r/20230201051717.1005938-1-joel@jms.id.au Signed-off-by: Arnd Bergmann <arnd@arndb.de>
- Loading branch information
1 parent
0ad2185
commit 7dbb4a3
Showing
5 changed files
with
124 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,11 @@ | ||
# SPDX-License-Identifier: GPL-2.0 | ||
menuconfig WPCM450_SOC | ||
tristate "Nuvoton WPCM450 SoC driver" | ||
default y if ARCH_WPCM450 | ||
select SOC_BUS | ||
help | ||
Say Y here to compile the SoC information driver for Nuvoton | ||
WPCM450 SoCs. | ||
|
||
This driver provides information such as the SoC model and | ||
revision. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,2 @@ | ||
# SPDX-License-Identifier: GPL-2.0-only | ||
obj-$(CONFIG_WPCM450_SOC) += wpcm450-soc.o |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,109 @@ | ||
// SPDX-License-Identifier: GPL-2.0 | ||
/* | ||
* Nuvoton WPCM450 SoC Identification | ||
* | ||
* Copyright (C) 2022 Jonathan Neuschäfer | ||
*/ | ||
|
||
#include <linux/mfd/syscon.h> | ||
#include <linux/of.h> | ||
#include <linux/regmap.h> | ||
#include <linux/slab.h> | ||
#include <linux/sys_soc.h> | ||
|
||
#define GCR_PDID 0 | ||
#define PDID_CHIP(x) ((x) & 0x00ffffff) | ||
#define CHIP_WPCM450 0x926450 | ||
#define PDID_REV(x) ((x) >> 24) | ||
|
||
struct revision { | ||
u8 number; | ||
const char *name; | ||
}; | ||
|
||
static const struct revision revisions[] __initconst = { | ||
{ 0x00, "Z1" }, | ||
{ 0x03, "Z2" }, | ||
{ 0x04, "Z21" }, | ||
{ 0x08, "A1" }, | ||
{ 0x09, "A2" }, | ||
{ 0x0a, "A3" }, | ||
{} | ||
}; | ||
|
||
static const char * __init get_revision(unsigned int rev) | ||
{ | ||
int i; | ||
|
||
for (i = 0; revisions[i].name; i++) | ||
if (revisions[i].number == rev) | ||
return revisions[i].name; | ||
return NULL; | ||
} | ||
|
||
static struct soc_device_attribute *wpcm450_attr; | ||
static struct soc_device *wpcm450_soc; | ||
|
||
static int __init wpcm450_soc_init(void) | ||
{ | ||
struct soc_device_attribute *attr; | ||
struct soc_device *soc; | ||
const char *revision; | ||
struct regmap *gcr; | ||
u32 pdid; | ||
int ret; | ||
|
||
if (!of_machine_is_compatible("nuvoton,wpcm450")) | ||
return 0; | ||
|
||
gcr = syscon_regmap_lookup_by_compatible("nuvoton,wpcm450-gcr"); | ||
if (IS_ERR(gcr)) | ||
return PTR_ERR(gcr); | ||
ret = regmap_read(gcr, GCR_PDID, &pdid); | ||
if (ret) | ||
return ret; | ||
|
||
if (PDID_CHIP(pdid) != CHIP_WPCM450) { | ||
pr_warn("Unknown chip ID in GCR.PDID: 0x%06x\n", PDID_CHIP(pdid)); | ||
return -ENODEV; | ||
} | ||
|
||
revision = get_revision(PDID_REV(pdid)); | ||
if (!revision) { | ||
pr_warn("Unknown chip revision in GCR.PDID: 0x%02x\n", PDID_REV(pdid)); | ||
return -ENODEV; | ||
} | ||
|
||
attr = kzalloc(sizeof(*attr), GFP_KERNEL); | ||
if (!attr) | ||
return -ENOMEM; | ||
|
||
attr->family = "Nuvoton NPCM"; | ||
attr->soc_id = "WPCM450"; | ||
attr->revision = revision; | ||
soc = soc_device_register(attr); | ||
if (IS_ERR(soc)) { | ||
kfree(attr); | ||
pr_warn("Could not register SoC device\n"); | ||
return PTR_ERR(soc); | ||
} | ||
|
||
wpcm450_soc = soc; | ||
wpcm450_attr = attr; | ||
return 0; | ||
} | ||
module_init(wpcm450_soc_init); | ||
|
||
static void __exit wpcm450_soc_exit(void) | ||
{ | ||
if (wpcm450_soc) { | ||
soc_device_unregister(wpcm450_soc); | ||
wpcm450_soc = NULL; | ||
kfree(wpcm450_attr); | ||
} | ||
} | ||
module_exit(wpcm450_soc_exit); | ||
|
||
MODULE_LICENSE("GPL"); | ||
MODULE_AUTHOR("Jonathan Neuschäfer"); | ||
MODULE_DESCRIPTION("Nuvoton WPCM450 SoC Identification driver"); |