soc: imx: add i.MX51/i.MX53 unique id support
authorSebastian Reichel <sebastian.reichel@collabora.com>
Wed, 27 Jan 2021 17:40:24 +0000 (18:40 +0100)
committerShawn Guo <shawnguo@kernel.org>
Mon, 15 Mar 2021 04:21:48 +0000 (12:21 +0800)
i.MX51 and i.MX53 SoCs have a 64-bit SoC unique ID stored in IIM,
which can be used as SoC serial number. The same feature is already
implemented for i.MX6/i.MX7, so this complements support to earlier
SoCs.

Signed-off-by: Sebastian Reichel <sebastian.reichel@collabora.com>
Signed-off-by: Shawn Guo <shawnguo@kernel.org>
drivers/soc/imx/soc-imx.c

index 01bfea1cb64a86c2ccaa8871263754c1f4b2f4a3..0738c0f367929d8b142f4f1fc2fd9f1bfa8e1bae 100644 (file)
@@ -13,6 +13,8 @@
 #include <soc/imx/cpu.h>
 #include <soc/imx/revision.h>
 
+#define IIM_UID                0x820
+
 #define OCOTP_UID_H    0x420
 #define OCOTP_UID_L    0x410
 
@@ -32,6 +34,7 @@ static int __init imx_soc_device_init(void)
        u64 soc_uid = 0;
        u32 val;
        int ret;
+       int i;
 
        if (of_machine_is_compatible("fsl,ls1021a"))
                return 0;
@@ -68,9 +71,11 @@ static int __init imx_soc_device_init(void)
                soc_id = "i.MX35";
                break;
        case MXC_CPU_MX51:
+               ocotp_compat = "fsl,imx51-iim";
                soc_id = "i.MX51";
                break;
        case MXC_CPU_MX53:
+               ocotp_compat = "fsl,imx53-iim";
                soc_id = "i.MX53";
                break;
        case MXC_CPU_IMX6SL:
@@ -153,6 +158,13 @@ static int __init imx_soc_device_init(void)
                        regmap_read(ocotp, OCOTP_ULP_UID_1, &val);
                        soc_uid <<= 16;
                        soc_uid |= val & 0xffff;
+               } else if (__mxc_cpu_type == MXC_CPU_MX51 ||
+                          __mxc_cpu_type == MXC_CPU_MX53) {
+                       for (i=0; i < 8; i++) {
+                               regmap_read(ocotp, IIM_UID + i*4, &val);
+                               soc_uid <<= 8;
+                               soc_uid |= (val & 0xff);
+                       }
                } else {
                        regmap_read(ocotp, OCOTP_UID_H, &val);
                        soc_uid = val;