soc/tegra: Register SoC device
authorThierry Reding <treding@nvidia.com>
Thu, 17 Aug 2017 14:42:17 +0000 (16:42 +0200)
committerThierry Reding <treding@nvidia.com>
Thu, 17 Aug 2017 14:43:13 +0000 (16:43 +0200)
Move this code from arch/arm/mach-tegra and make it common among 32-bit
and 64-bit Tegra SoCs. This is slightly complicated by the fact that on
32-bit Tegra, the SoC device is used as the parent for all devices that
are instantiated from device tree.

Signed-off-by: Thierry Reding <treding@nvidia.com>
arch/arm/mach-tegra/tegra.c
drivers/soc/tegra/Kconfig
drivers/soc/tegra/fuse/fuse-tegra.c
include/soc/tegra/fuse.h

index 649e9e8c7bccdf2e566ec0ad05c52c8a85a4fc04..02e712d2ea300b2040efefbfab43cc8cd9cab2e0 100644 (file)
@@ -84,35 +84,8 @@ static void __init tegra_dt_init_irq(void)
 
 static void __init tegra_dt_init(void)
 {
-       struct soc_device_attribute *soc_dev_attr;
-       struct soc_device *soc_dev;
-       struct device *parent = NULL;
+       struct device *parent = tegra_soc_device_register();
 
-       soc_dev_attr = kzalloc(sizeof(*soc_dev_attr), GFP_KERNEL);
-       if (!soc_dev_attr)
-               goto out;
-
-       soc_dev_attr->family = kasprintf(GFP_KERNEL, "Tegra");
-       soc_dev_attr->revision = kasprintf(GFP_KERNEL, "%d",
-                                          tegra_sku_info.revision);
-       soc_dev_attr->soc_id = kasprintf(GFP_KERNEL, "%u", tegra_get_chip_id());
-
-       soc_dev = soc_device_register(soc_dev_attr);
-       if (IS_ERR(soc_dev)) {
-               kfree(soc_dev_attr->family);
-               kfree(soc_dev_attr->revision);
-               kfree(soc_dev_attr->soc_id);
-               kfree(soc_dev_attr);
-               goto out;
-       }
-
-       parent = soc_device_to_device(soc_dev);
-
-       /*
-        * Finished with the static registrations now; fill in the missing
-        * devices
-        */
-out:
        of_platform_default_populate(NULL, NULL, parent);
 }
 
index 1beb7c347344ab59170a59d1fe7cb1c1003d387a..e9e277178c940042b0f086006cfb8d82da0d8620 100644 (file)
@@ -107,6 +107,11 @@ config ARCH_TEGRA_186_SOC
 endif
 endif
 
+config SOC_TEGRA_FUSE
+       def_bool y
+       depends on ARCH_TEGRA
+       select SOC_BUS
+
 config SOC_TEGRA_FLOWCTRL
        bool
 
index 7413f60fa855d7f128efe604a972ee361fdfea4b..e4f78de8f95fbd6a03e8141c846c454ddb0851b7 100644 (file)
 #include <linux/device.h>
 #include <linux/kobject.h>
 #include <linux/init.h>
-#include <linux/platform_device.h>
+#include <linux/io.h>
 #include <linux/of.h>
 #include <linux/of_address.h>
-#include <linux/io.h>
+#include <linux/platform_device.h>
+#include <linux/slab.h>
+#include <linux/sys_soc.h>
 
 #include <soc/tegra/common.h>
 #include <soc/tegra/fuse.h>
@@ -210,6 +212,31 @@ static void tegra_enable_fuse_clk(void __iomem *base)
        writel(reg, base + 0x14);
 }
 
+struct device * __init tegra_soc_device_register(void)
+{
+       struct soc_device_attribute *attr;
+       struct soc_device *dev;
+
+       attr = kzalloc(sizeof(*attr), GFP_KERNEL);
+       if (!attr)
+               return NULL;
+
+       attr->family = kasprintf(GFP_KERNEL, "Tegra");
+       attr->revision = kasprintf(GFP_KERNEL, "%d", tegra_sku_info.revision);
+       attr->soc_id = kasprintf(GFP_KERNEL, "%u", tegra_get_chip_id());
+
+       dev = soc_device_register(attr);
+       if (IS_ERR(dev)) {
+               kfree(attr->soc_id);
+               kfree(attr->revision);
+               kfree(attr->family);
+               kfree(attr);
+               return ERR_CAST(dev);
+       }
+
+       return soc_device_to_device(dev);
+}
+
 static int __init tegra_init_fuse(void)
 {
        const struct of_device_id *match;
@@ -311,6 +338,23 @@ static int __init tegra_init_fuse(void)
        pr_debug("Tegra CPU Speedo ID %d, SoC Speedo ID %d\n",
                 tegra_sku_info.cpu_speedo_id, tegra_sku_info.soc_speedo_id);
 
+
        return 0;
 }
 early_initcall(tegra_init_fuse);
+
+#ifdef CONFIG_ARM64
+static int __init tegra_init_soc(void)
+{
+       struct device *soc;
+
+       soc = tegra_soc_device_register();
+       if (IS_ERR(soc)) {
+               pr_err("failed to register SoC device: %ld\n", PTR_ERR(soc));
+               return PTR_ERR(soc);
+       }
+
+       return 0;
+}
+device_initcall(tegra_init_soc)
+#endif
index b4c9219e7f95659b803d1c7cd3f042ef7aa61022..9b6ea0c7211780182c4cce20735ade7ef673695d 100644 (file)
@@ -65,6 +65,8 @@ int tegra_fuse_readl(unsigned long offset, u32 *value);
 
 extern struct tegra_sku_info tegra_sku_info;
 
+struct device *tegra_soc_device_register(void);
+
 #endif /* __ASSEMBLY__ */
 
 #endif /* __SOC_TEGRA_FUSE_H__ */