* [PATCH] ARM: mvebu: use system controller to get the soc id when possible
@ 2014-06-20 14:06 Gregory CLEMENT
2014-06-20 14:11 ` Arnd Bergmann
0 siblings, 1 reply; 3+ messages in thread
From: Gregory CLEMENT @ 2014-06-20 14:06 UTC (permalink / raw)
To: linux-arm-kernel
On 38x it is possible to get the SoC Id and the revision without using
the PCI register. Accessing the PCI registers implies enabling its
clock and, because of the initialization issue, not keeping them
enable. So if possible it is better to avoid it.
Armada 370 and Armada XP provides the SoC ID values from the system
controller but not the revision.
Armada 375 provides both but the SoC ID value looks buggy (0x6660
instead of 0x6720).
Signed-off-by: Gregory CLEMENT <gregory.clement@free-electrons.com>
---
arch/arm/mach-mvebu/common.h | 1 +
arch/arm/mach-mvebu/mvebu-soc-id.c | 20 +++++++++++++++++++-
arch/arm/mach-mvebu/system-controller.c | 19 +++++++++++++++++++
3 files changed, 39 insertions(+), 1 deletion(-)
diff --git a/arch/arm/mach-mvebu/common.h b/arch/arm/mach-mvebu/common.h
index b67fb7a10d8b..c1c3c28afbff 100644
--- a/arch/arm/mach-mvebu/common.h
+++ b/arch/arm/mach-mvebu/common.h
@@ -21,6 +21,7 @@ void mvebu_restart(enum reboot_mode mode, const char *cmd);
int mvebu_cpu_reset_deassert(int cpu);
void mvebu_pmsu_set_cpu_boot_addr(int hw_cpu, void *boot_addr);
void mvebu_system_controller_set_cpu_boot_addr(void *boot_addr);
+int mvebu_systeme_controller_get_soc_id(u32 *dev, u32 *rev);
void armada_xp_cpu_die(unsigned int cpu);
diff --git a/arch/arm/mach-mvebu/mvebu-soc-id.c b/arch/arm/mach-mvebu/mvebu-soc-id.c
index d0f35b4d4a23..f07388f96bfb 100644
--- a/arch/arm/mach-mvebu/mvebu-soc-id.c
+++ b/arch/arm/mach-mvebu/mvebu-soc-id.c
@@ -25,8 +25,10 @@
#include <linux/of_address.h>
#include <linux/slab.h>
#include <linux/sys_soc.h>
+#include "common.h"
#include "mvebu-soc-id.h"
+
#define PCIE_DEV_ID_OFF 0x0
#define PCIE_DEV_REV_OFF 0x8
@@ -54,7 +56,7 @@ int mvebu_get_soc_id(u32 *dev, u32 *rev)
return -1;
}
-static int __init mvebu_soc_id_init(void)
+static int __init get_soc_id_by_pci(void)
{
struct device_node *np;
int ret = 0;
@@ -129,6 +131,22 @@ clk_err:
return ret;
}
+
+static int __init mvebu_soc_id_init(void)
+{
+
+ /*
+ * First try to get the ID and the revision by the system
+ * regsiter and use PCI registers only if it is not possible
+ */
+ if (!mvebu_systeme_controller_get_soc_id(&soc_dev_id, &soc_rev)) {
+ is_id_valid = true;
+ pr_info("MVEBU SoC ID=0x%X, Rev=0x%X\n", soc_dev_id, soc_rev);
+ return 0;
+ }
+
+ return get_soc_id_by_pci();
+}
early_initcall(mvebu_soc_id_init);
static int __init mvebu_soc_device(void)
diff --git a/arch/arm/mach-mvebu/system-controller.c b/arch/arm/mach-mvebu/system-controller.c
index 0c5524ac75b7..8756bba443cd 100644
--- a/arch/arm/mach-mvebu/system-controller.c
+++ b/arch/arm/mach-mvebu/system-controller.c
@@ -39,6 +39,9 @@ struct mvebu_system_controller {
u32 system_soft_reset;
u32 resume_boot_addr;
+
+ u32 dev_id;
+ u32 rev_id;
};
static struct mvebu_system_controller *mvebu_sc;
@@ -47,6 +50,8 @@ static const struct mvebu_system_controller armada_370_xp_system_controller = {
.system_soft_reset_offset = 0x64,
.rstoutn_mask_reset_out_en = 0x1,
.system_soft_reset = 0x1,
+ .dev_id = 0x38,
+ .rev_id = 0x3c,
};
static const struct mvebu_system_controller armada_375_system_controller = {
@@ -55,6 +60,8 @@ static const struct mvebu_system_controller armada_375_system_controller = {
.rstoutn_mask_reset_out_en = 0x1,
.system_soft_reset = 0x1,
.resume_boot_addr = 0xd4,
+ .dev_id = 0x38,
+ .rev_id = 0x3c,
};
static const struct mvebu_system_controller orion_system_controller = {
@@ -101,6 +108,18 @@ void mvebu_restart(enum reboot_mode mode, const char *cmd)
;
}
+int mvebu_systeme_controller_get_soc_id(u32 *dev, u32 *rev)
+{
+ if (of_machine_is_compatible("marvell,armada38x") &&
+ system_controller_base) {
+ *dev = readl(system_controller_base + mvebu_sc->dev_id) >> 16;
+ *rev = (readl(system_controller_base + mvebu_sc->rev_id) >> 8)
+ & 0xF;
+ return 0;
+ } else
+ return -1;
+}
+
#ifdef CONFIG_SMP
void mvebu_system_controller_set_cpu_boot_addr(void *boot_addr)
{
--
1.8.1.2
^ permalink raw reply related [flat|nested] 3+ messages in thread
* [PATCH] ARM: mvebu: use system controller to get the soc id when possible
2014-06-20 14:06 [PATCH] ARM: mvebu: use system controller to get the soc id when possible Gregory CLEMENT
@ 2014-06-20 14:11 ` Arnd Bergmann
2014-06-20 14:14 ` Gregory CLEMENT
0 siblings, 1 reply; 3+ messages in thread
From: Arnd Bergmann @ 2014-06-20 14:11 UTC (permalink / raw)
To: linux-arm-kernel
On Friday 20 June 2014 16:06:14 Gregory CLEMENT wrote:
> +int mvebu_systeme_controller_get_soc_id(u32 *dev, u32 *rev)
s/systeme/system/
> +{
> + if (of_machine_is_compatible("marvell,armada38x") &&
> + system_controller_base) {
> + *dev = readl(system_controller_base + mvebu_sc->dev_id) >> 16;
> + *rev = (readl(system_controller_base + mvebu_sc->rev_id) >> 8)
> + & 0xF;
> + return 0;
> + } else
> + return -1;
> +}
Better return a proper errno code here rather than -1. How about -ENODEV?
Arnd
^ permalink raw reply [flat|nested] 3+ messages in thread
* [PATCH] ARM: mvebu: use system controller to get the soc id when possible
2014-06-20 14:11 ` Arnd Bergmann
@ 2014-06-20 14:14 ` Gregory CLEMENT
0 siblings, 0 replies; 3+ messages in thread
From: Gregory CLEMENT @ 2014-06-20 14:14 UTC (permalink / raw)
To: linux-arm-kernel
Hi Arnd,
On 20/06/2014 16:11, Arnd Bergmann wrote:
> On Friday 20 June 2014 16:06:14 Gregory CLEMENT wrote:
>> +int mvebu_systeme_controller_get_soc_id(u32 *dev, u32 *rev)
>
> s/systeme/system/
>
>> +{
>> + if (of_machine_is_compatible("marvell,armada38x") &&
>> + system_controller_base) {
>> + *dev = readl(system_controller_base + mvebu_sc->dev_id) >> 16;
>> + *rev = (readl(system_controller_base + mvebu_sc->rev_id) >> 8)
>> + & 0xF;
>> + return 0;
>> + } else
>> + return -1;
>> +}
>
> Better return a proper errno code here rather than -1. How about -ENODEV?
OK so I will also fix the mvebu_get_soc_id function
Thanks,
Gregory
--
Gregory Clement, Free Electrons
Kernel, drivers, real-time and embedded Linux
development, consulting, training and support.
http://free-electrons.com
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2014-06-20 14:14 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-06-20 14:06 [PATCH] ARM: mvebu: use system controller to get the soc id when possible Gregory CLEMENT
2014-06-20 14:11 ` Arnd Bergmann
2014-06-20 14:14 ` Gregory CLEMENT
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox