diff options
author | Bhuvanchandra DV <bhuvanchandra.dv@toradex.com> | 2017-02-20 22:49:34 +0530 |
---|---|---|
committer | Marcel Ziswiler <marcel.ziswiler@toradex.com> | 2017-12-21 14:27:38 +0100 |
commit | 50f955925a96ebe0f00851492f3368fbc73243bd (patch) | |
tree | 0ea9a8dd418357b1c453ef90ae3cec13062efc8e | |
parent | b4032aa0f648d96a6cb230d925a7752669f0739c (diff) |
imx: Expose SoC unique ID
Expose SoC unique ID read from OCOTP registers.
Signed-off-by: Bhuvanchandra DV <bhuvanchandra.dv@toradex.com>
Acked-by: Max Krummenacher <max.krummenacher@toradex.com>
(cherry picked from commit 9090b5b90ccc350611a769230eab3fbc20c9d302)
-rw-r--r-- | arch/arm/mach-imx/cpu.c | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/arch/arm/mach-imx/cpu.c b/arch/arm/mach-imx/cpu.c index 3a28b16936f4..3cfcbe43d6dd 100644 --- a/arch/arm/mach-imx/cpu.c +++ b/arch/arm/mach-imx/cpu.c @@ -71,6 +71,35 @@ void __init imx_aips_allow_unprivileged_access( } } +static unsigned long long __init imx_get_soc_uid(void) +{ + struct device_node *np; + void __iomem *ocotp_base; + u64 uid = 0ull; + + if (__mxc_cpu_type == MXC_CPU_IMX6SL || __mxc_cpu_type == MXC_CPU_IMX6DL || + __mxc_cpu_type == MXC_CPU_IMX6SX || __mxc_cpu_type == MXC_CPU_IMX6Q || + __mxc_cpu_type == MXC_CPU_IMX6UL || __mxc_cpu_type == MXC_CPU_IMX6ULL) { + np = of_find_compatible_node(NULL, NULL, "fsl,imx6q-ocotp"); + } else if (__mxc_cpu_type == MXC_CPU_IMX7D) { + np = of_find_compatible_node(NULL, NULL, "fsl,imx7d-ocotp"); + } else { + return uid; + } + + ocotp_base = of_iomap(np, 0); + WARN_ON(!ocotp_base); + + uid = readl_relaxed(ocotp_base + 0x420); + uid = (uid << 0x20); + uid |= readl_relaxed(ocotp_base + 0x410); + + iounmap(ocotp_base); + of_node_put(np); + + return uid; +} + struct device * __init imx_soc_device_init(void) { struct soc_device_attribute *soc_dev_attr; @@ -117,27 +146,35 @@ struct device * __init imx_soc_device_init(void) soc_id = "i.MX53"; break; case MXC_CPU_IMX6SL: + soc_dev_attr->unique_id = kasprintf(GFP_KERNEL, "%llx", imx_get_soc_uid()); soc_id = "i.MX6SL"; break; case MXC_CPU_IMX6DL: + soc_dev_attr->unique_id = kasprintf(GFP_KERNEL, "%llx", imx_get_soc_uid()); soc_id = "i.MX6DL"; break; case MXC_CPU_IMX6SX: + soc_dev_attr->unique_id = kasprintf(GFP_KERNEL, "%llx", imx_get_soc_uid()); soc_id = "i.MX6SX"; break; case MXC_CPU_IMX6Q: + soc_dev_attr->unique_id = kasprintf(GFP_KERNEL, "%llx", imx_get_soc_uid()); + if (imx_get_soc_revision() == IMX_CHIP_REVISION_2_0) soc_id = "i.MX6QP"; else soc_id = "i.MX6Q"; break; case MXC_CPU_IMX6UL: + soc_dev_attr->unique_id = kasprintf(GFP_KERNEL, "%llx", imx_get_soc_uid()); soc_id = "i.MX6UL"; break; case MXC_CPU_IMX6ULL: + soc_dev_attr->unique_id = kasprintf(GFP_KERNEL, "%llx", imx_get_soc_uid()); soc_id = "i.MX6ULL"; break; case MXC_CPU_IMX7D: + soc_dev_attr->unique_id = kasprintf(GFP_KERNEL, "%llx", imx_get_soc_uid()); soc_id = "i.MX7D"; break; case MXC_CPU_IMX6SLL: |