|
@@ -19,10 +19,12 @@
|
|
|
#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
|