diff options
Diffstat (limited to 'arch/arm/mach-imx/cpu.c')
-rw-r--r-- | arch/arm/mach-imx/cpu.c | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/arch/arm/mach-imx/cpu.c b/arch/arm/mach-imx/cpu.c index a02b47a0be36..7a08bb59e0fd 100644 --- a/arch/arm/mach-imx/cpu.c +++ b/arch/arm/mach-imx/cpu.c @@ -71,6 +71,50 @@ 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_IMX6DL || __mxc_cpu_type == MXC_CPU_IMX6SX || + __mxc_cpu_type == MXC_CPU_IMX6Q) { + np = of_find_compatible_node(NULL, NULL, "fsl,imx6q-ocotp"); + } else if (__mxc_cpu_type == MXC_CPU_IMX6SL) { + np = of_find_compatible_node(NULL, NULL, "fsl,imx6sl-ocotp"); + } else if (__mxc_cpu_type == MXC_CPU_IMX6UL) { + np = of_find_compatible_node(NULL, NULL, "fsl,imx6ul-ocotp"); + } else if (__mxc_cpu_type == MXC_CPU_IMX6ULL) { + np = of_find_compatible_node(NULL, NULL, "fsl,imx6ull-ocotp");; + } else if (__mxc_cpu_type == MXC_CPU_IMX7D) { + np = of_find_compatible_node(NULL, NULL, "fsl,imx7d-ocotp"); + } else { + return uid; + } + + if (!np) { + pr_warn("failed to find ocotp node\n"); + return uid; + } + + ocotp_base = of_iomap(np, 0); + if (!ocotp_base) { + pr_warn("failed to map ocotp\n"); + goto put_node; + } + + uid = readl_relaxed(ocotp_base + 0x420); + uid = (uid << 0x20); + uid |= readl_relaxed(ocotp_base + 0x410); + + iounmap(ocotp_base); + +put_node: + of_node_put(np); + + return uid; +} + struct device * __init imx_soc_device_init(void) { struct soc_device_attribute *soc_dev_attr; @@ -117,27 +161,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: |