[PATCH v2 2/2] ARM: mvebu: Use system controller to get the soc id when possible
Jason Cooper
jason at lakedaemon.net
Fri Jun 20 12:00:52 PDT 2014
On Fri, Jun 20, 2014 at 04:35:53PM +0200, Gregory CLEMENT wrote:
> On Armada 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 at 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..927d88627a6e 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_system_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 12c66cac967d..922b1380b0be 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
whitespace?
> #define PCIE_DEV_REV_OFF 0x8
>
> @@ -54,7 +56,7 @@ int mvebu_get_soc_id(u32 *dev, u32 *rev)
> return -ENODEV;
> }
>
> -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
s/regsiter/register/
> + */
> + if (!mvebu_system_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..de90821129da 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_system_controller_get_soc_id(u32 *dev, u32 *rev)
> +{
> + if (of_machine_is_compatible("marvell,armada38x") &&
As Sergei commented on your documentation patch, we try to avoid
wildcards in compatible strings. Perhaps a match list would be more
appropriate?
> + 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 -ENODEV;
> +}
> +
> #ifdef CONFIG_SMP
> void mvebu_system_controller_set_cpu_boot_addr(void *boot_addr)
> {
> --
> 1.8.1.2
>
thx,
Jason.
More information about the linux-arm-kernel
mailing list