]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
soc/tegra: fuse: Register cell lookups for compatibility
authorThierry Reding <treding@nvidia.com>
Tue, 20 Aug 2019 14:01:04 +0000 (16:01 +0200)
committerThierry Reding <treding@nvidia.com>
Wed, 16 Oct 2019 12:33:16 +0000 (14:33 +0200)
Typically nvmem cells would be stored in device tree. However, for
compatibility with device trees that don't contain nvmem cell
definitions, register lookups for cells currently used by consumers.
This allows the consumers to use the same API to query cells from the
device tree or using the legacy mechanism.

Signed-off-by: Thierry Reding <treding@nvidia.com>
drivers/soc/tegra/fuse/fuse-tegra.c
drivers/soc/tegra/fuse/fuse-tegra30.c
drivers/soc/tegra/fuse/fuse.h

index cbe3d6f1907412864dd9d7c3eb03fdc076b900a4..4d719d4b8d5a04f87a43879a214a79b809827f57 100644 (file)
@@ -423,6 +423,15 @@ 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);
 
+       if (fuse->soc->lookups) {
+               size_t size = sizeof(*fuse->lookups) * fuse->soc->num_lookups;
+
+               fuse->lookups = kmemdup(fuse->soc->lookups, size, GFP_KERNEL);
+               if (!fuse->lookups)
+                       return -ENOMEM;
+
+               nvmem_add_cell_lookups(fuse->lookups, fuse->soc->num_lookups);
+       }
 
        return 0;
 }
index be9424a8717349a9071c2b504017ecc063469778..b8daaf5b7291bfe5d24092ba8099db90ac0967e3 100644 (file)
@@ -8,6 +8,7 @@
 #include <linux/err.h>
 #include <linux/io.h>
 #include <linux/kernel.h>
+#include <linux/nvmem-consumer.h>
 #include <linux/of_device.h>
 #include <linux/of_address.h>
 #include <linux/platform_device.h>
@@ -127,6 +128,70 @@ const struct tegra_fuse_soc tegra114_fuse_soc = {
 #endif
 
 #if defined(CONFIG_ARCH_TEGRA_124_SOC) || defined(CONFIG_ARCH_TEGRA_132_SOC)
+static const struct nvmem_cell_lookup tegra124_fuse_lookups[] = {
+       {
+               .nvmem_name = "fuse",
+               .cell_name = "xusb-pad-calibration",
+               .dev_id = "7009f000.padctl",
+               .con_id = "calibration",
+       }, {
+               .nvmem_name = "fuse",
+               .cell_name = "sata-calibration",
+               .dev_id = "70020000.sata",
+               .con_id = "calibration",
+       }, {
+               .nvmem_name = "fuse",
+               .cell_name = "tsensor-common",
+               .dev_id = "700e2000.thermal-sensor",
+               .con_id = "common",
+       }, {
+               .nvmem_name = "fuse",
+               .cell_name = "tsensor-realignment",
+               .dev_id = "700e2000.thermal-sensor",
+               .con_id = "realignment",
+       }, {
+               .nvmem_name = "fuse",
+               .cell_name = "tsensor-cpu0",
+               .dev_id = "700e2000.thermal-sensor",
+               .con_id = "cpu0",
+       }, {
+               .nvmem_name = "fuse",
+               .cell_name = "tsensor-cpu1",
+               .dev_id = "700e2000.thermal-sensor",
+               .con_id = "cpu1",
+       }, {
+               .nvmem_name = "fuse",
+               .cell_name = "tsensor-cpu2",
+               .dev_id = "700e2000.thermal-sensor",
+               .con_id = "cpu2",
+       }, {
+               .nvmem_name = "fuse",
+               .cell_name = "tsensor-cpu3",
+               .dev_id = "700e2000.thermal-sensor",
+               .con_id = "cpu3",
+       }, {
+               .nvmem_name = "fuse",
+               .cell_name = "tsensor-mem0",
+               .dev_id = "700e2000.thermal-sensor",
+               .con_id = "mem0",
+       }, {
+               .nvmem_name = "fuse",
+               .cell_name = "tsensor-mem1",
+               .dev_id = "700e2000.thermal-sensor",
+               .con_id = "mem1",
+       }, {
+               .nvmem_name = "fuse",
+               .cell_name = "tsensor-gpu",
+               .dev_id = "700e2000.thermal-sensor",
+               .con_id = "gpu",
+       }, {
+               .nvmem_name = "fuse",
+               .cell_name = "tsensor-pllx",
+               .dev_id = "700e2000.thermal-sensor",
+               .con_id = "pllx",
+       },
+};
+
 static const struct tegra_fuse_info tegra124_fuse_info = {
        .read = tegra30_fuse_read,
        .size = 0x300,
@@ -137,10 +202,81 @@ const struct tegra_fuse_soc tegra124_fuse_soc = {
        .init = tegra30_fuse_init,
        .speedo_init = tegra124_init_speedo_data,
        .info = &tegra124_fuse_info,
+       .lookups = tegra124_fuse_lookups,
+       .num_lookups = ARRAY_SIZE(tegra124_fuse_lookups),
 };
 #endif
 
 #if defined(CONFIG_ARCH_TEGRA_210_SOC)
+static const struct nvmem_cell_lookup tegra210_fuse_lookups[] = {
+       {
+               .nvmem_name = "fuse",
+               .cell_name = "tsensor-cpu1",
+               .dev_id = "700e2000.thermal-sensor",
+               .con_id = "cpu1",
+       }, {
+               .nvmem_name = "fuse",
+               .cell_name = "tsensor-cpu2",
+               .dev_id = "700e2000.thermal-sensor",
+               .con_id = "cpu2",
+       }, {
+               .nvmem_name = "fuse",
+               .cell_name = "tsensor-cpu0",
+               .dev_id = "700e2000.thermal-sensor",
+               .con_id = "cpu0",
+       }, {
+               .nvmem_name = "fuse",
+               .cell_name = "xusb-pad-calibration",
+               .dev_id = "7009f000.padctl",
+               .con_id = "calibration",
+       }, {
+               .nvmem_name = "fuse",
+               .cell_name = "tsensor-cpu3",
+               .dev_id = "700e2000.thermal-sensor",
+               .con_id = "cpu3",
+       }, {
+               .nvmem_name = "fuse",
+               .cell_name = "sata-calibration",
+               .dev_id = "70020000.sata",
+               .con_id = "calibration",
+       }, {
+               .nvmem_name = "fuse",
+               .cell_name = "tsensor-gpu",
+               .dev_id = "700e2000.thermal-sensor",
+               .con_id = "gpu",
+       }, {
+               .nvmem_name = "fuse",
+               .cell_name = "tsensor-mem0",
+               .dev_id = "700e2000.thermal-sensor",
+               .con_id = "mem0",
+       }, {
+               .nvmem_name = "fuse",
+               .cell_name = "tsensor-mem1",
+               .dev_id = "700e2000.thermal-sensor",
+               .con_id = "mem1",
+       }, {
+               .nvmem_name = "fuse",
+               .cell_name = "tsensor-pllx",
+               .dev_id = "700e2000.thermal-sensor",
+               .con_id = "pllx",
+       }, {
+               .nvmem_name = "fuse",
+               .cell_name = "tsensor-common",
+               .dev_id = "700e2000.thermal-sensor",
+               .con_id = "common",
+       }, {
+               .nvmem_name = "fuse",
+               .cell_name = "gpu-calibration",
+               .dev_id = "57000000.gpu",
+               .con_id = "calibration",
+       }, {
+               .nvmem_name = "fuse",
+               .cell_name = "xusb-pad-calibration-ext",
+               .dev_id = "7009f000.padctl",
+               .con_id = "calibration-ext",
+       },
+};
+
 static const struct tegra_fuse_info tegra210_fuse_info = {
        .read = tegra30_fuse_read,
        .size = 0x300,
@@ -151,10 +287,26 @@ const struct tegra_fuse_soc tegra210_fuse_soc = {
        .init = tegra30_fuse_init,
        .speedo_init = tegra210_init_speedo_data,
        .info = &tegra210_fuse_info,
+       .lookups = tegra210_fuse_lookups,
+       .num_lookups = ARRAY_SIZE(tegra210_fuse_lookups),
 };
 #endif
 
 #if defined(CONFIG_ARCH_TEGRA_186_SOC)
+static const struct nvmem_cell_lookup tegra186_fuse_lookups[] = {
+       {
+               .nvmem_name = "fuse",
+               .cell_name = "xusb-pad-calibration",
+               .dev_id = "3520000.padctl",
+               .con_id = "calibration",
+       }, {
+               .nvmem_name = "fuse",
+               .cell_name = "xusb-pad-calibration-ext",
+               .dev_id = "3520000.padctl",
+               .con_id = "calibration-ext",
+       },
+};
+
 static const struct tegra_fuse_info tegra186_fuse_info = {
        .read = tegra30_fuse_read,
        .size = 0x300,
@@ -164,5 +316,7 @@ static const struct tegra_fuse_info tegra186_fuse_info = {
 const struct tegra_fuse_soc tegra186_fuse_soc = {
        .init = tegra30_fuse_init,
        .info = &tegra186_fuse_info,
+       .lookups = tegra186_fuse_lookups,
+       .num_lookups = ARRAY_SIZE(tegra186_fuse_lookups),
 };
 #endif
index 32bf6c070ae70342474581fd03cee02f2c0ac719..0f74c2c34af0c36c3af631ea3818d0de825fbd27 100644 (file)
@@ -13,6 +13,7 @@
 #include <linux/dmaengine.h>
 #include <linux/types.h>
 
+struct nvmem_cell_lookup;
 struct nvmem_device;
 struct tegra_fuse;
 
@@ -28,6 +29,9 @@ struct tegra_fuse_soc {
        int (*probe)(struct tegra_fuse *fuse);
 
        const struct tegra_fuse_info *info;
+
+       const struct nvmem_cell_lookup *lookups;
+       unsigned int num_lookups;
 };
 
 struct tegra_fuse {
@@ -51,6 +55,7 @@ struct tegra_fuse {
        } apbdma;
 
        struct nvmem_device *nvmem;
+       struct nvmem_cell_lookup *lookups;
 };
 
 void tegra_init_revision(void);