arm: tegra: soc device registration
Sachin Nikam [Fri, 21 Sep 2012 11:54:47 +0000 (16:54 +0530)]
soc_device_register() for getting soc machine, family,revision
and soc_id.

soc_id format is Revision:SKU:PackageID

Bug 1051923

Change-Id: I23c83554c5917e759934fe953e7afef86145f092
Signed-off-by: Sachin Nikam <snikam@nvidia.com>
Reviewed-on: http://git-master/r/134381
Reviewed-by: Automatic_Commit_Validation_User
GVS: Gerrit_Virtual_Submit

17 files changed:
arch/arm/mach-tegra/board-aruba.c
arch/arm/mach-tegra/board-cardhu.c
arch/arm/mach-tegra/board-curacao.c
arch/arm/mach-tegra/board-dalmore.c
arch/arm/mach-tegra/board-e1853.c
arch/arm/mach-tegra/board-enterprise.c
arch/arm/mach-tegra/board-harmony.c
arch/arm/mach-tegra/board-kai.c
arch/arm/mach-tegra/board-p1852.c
arch/arm/mach-tegra/board-paz00.c
arch/arm/mach-tegra/board-pluto.c
arch/arm/mach-tegra/board-seaboard.c
arch/arm/mach-tegra/board-trimslice.c
arch/arm/mach-tegra/board-ventana.c
arch/arm/mach-tegra/board-whistler.c
arch/arm/mach-tegra/board.h
arch/arm/mach-tegra/common.c

index 1d09f41..fe468b5 100644 (file)
@@ -508,6 +508,7 @@ static void __init tegra_aruba_init(void)
        tegra_clk_init_from_table(aruba_clk_init_table);
        tegra_enable_pinmux();
        aruba_pinmux_init();
+       tegra_soc_device_init("aruba");
 
        platform_add_devices(aruba_devices, ARRAY_SIZE(aruba_devices));
 
index 2451028..fef9082 100644 (file)
@@ -1389,6 +1389,7 @@ static void __init tegra_cardhu_init(void)
        tegra_clk_init_from_table(cardhu_clk_init_table);
        tegra_enable_pinmux();
        tegra_smmu_init();
+       tegra_soc_device_init("cardhu");
        cardhu_pinmux_init();
        cardhu_i2c_init();
        cardhu_spi_init();
index a82ae36..bc94793 100644 (file)
@@ -585,6 +585,7 @@ static void __init tegra_curacao_init(void)
        tegra_clk_init_from_table(curacao_clk_init_table);
        tegra_enable_pinmux();
        curacao_pinmux_init();
+       tegra_soc_device_init("curacao");
 
        if (tegra_revision == TEGRA_REVISION_QT)
                debug_uart_platform_data[0].uartclk = tegra_clk_measure_input_freq();
index b2d8f8d..e5d2884 100644 (file)
@@ -548,6 +548,7 @@ static void __init tegra_dalmore_init(void)
 {
        tegra_battery_edp_init(2500);
        tegra_clk_init_from_table(dalmore_clk_init_table);
+       tegra_soc_device_init("dalmore");
        tegra_enable_pinmux();
        dalmore_pinmux_init();
        dalmore_i2c_init();
index caf7d1e..1079360 100644 (file)
@@ -424,6 +424,7 @@ static void __init tegra_e1853_init(void)
        tegra_clk_init_from_table(e1853_clk_init_table);
        tegra_enable_pinmux();
        tegra_smmu_init();
+       tegra_soc_device_init("e1853");
        e1853_pinmux_init();
        e1853_i2c_init();
        e1853_gpio_init();
index b3132a8..418929e 100644 (file)
@@ -1101,6 +1101,7 @@ static void __init tegra_enterprise_init(void)
        tegra_clk_init_from_table(enterprise_clk_init_table);
        tegra_enable_pinmux();
        tegra_smmu_init();
+       tegra_soc_device_init("tegra_enterprise");
        enterprise_pinmux_init();
        enterprise_i2c_init();
        enterprise_uart_init();
index 33484be..ce6161b 100644 (file)
@@ -520,7 +520,7 @@ subsys_initcall_sync(harmony_wifi_prepower);
 static void __init tegra_harmony_init(void)
 {
        tegra_clk_init_from_table(harmony_clk_init_table);
-
+       tegra_soc_device_init("harmony");
        harmony_pinmux_init();
 
        harmony_uart_init();
index 4ec28d4..ad4fc0d 100644 (file)
@@ -870,6 +870,7 @@ static void __init tegra_kai_init(void)
        tegra_clk_init_from_table(kai_clk_init_table);
        tegra_enable_pinmux();
        tegra_smmu_init();
+       tegra_soc_device_init("kai");
        kai_pinmux_init();
        kai_i2c_init();
        kai_spi_init();
index a2d120f..80106ca 100644 (file)
@@ -633,6 +633,7 @@ static void __init tegra_p1852_init(void)
        tegra_clk_init_from_table(p1852_clk_init_table);
        tegra_enable_pinmux();
        tegra_smmu_init();
+       tegra_soc_device_init("p1852");
        p1852_pinmux_init();
        p1852_i2c_init();
        p1852_i2s_audio_init();
index fecddac..b765bbd 100644 (file)
@@ -201,7 +201,7 @@ static struct tegra_sdhci_platform_data sdhci_pdata4 = {
 static void __init tegra_paz00_init(void)
 {
        tegra_clk_init_from_table(paz00_clk_init_table);
-
+       tegra_soc_device_init("Toshiba AC100 / Dynabook AZ");
        paz00_pinmux_init();
 
        tegra_sdhci_device1.dev.platform_data = &sdhci_pdata1;
index e4ad29c..53e459b 100644 (file)
@@ -617,6 +617,7 @@ static void __init tegra_pluto_init(void)
 {
        tegra_battery_edp_init(2500);
        tegra_clk_init_from_table(pluto_clk_init_table);
+       tegra_soc_device_init("tegra_pluto");
        tegra_enable_pinmux();
        pluto_pinmux_init();
        pluto_i2c_init();
index 614d734..1abb45d 100644 (file)
@@ -248,7 +248,7 @@ static void __init tegra_seaboard_init(void)
        debug_uart_platform_data[0].membase = IO_ADDRESS(TEGRA_UARTD_BASE);
        debug_uart_platform_data[0].mapbase = TEGRA_UARTD_BASE;
        debug_uart_platform_data[0].irq = INT_UARTD;
-
+       tegra_soc_device_init("seaboard");
        seaboard_common_init();
 
        seaboard_i2c_init();
@@ -262,7 +262,7 @@ static void __init tegra_kaen_init(void)
        debug_uart_platform_data[0].irq = INT_UARTB;
 
        seaboard_audio_pdata.gpio_hp_mute = TEGRA_GPIO_KAEN_HP_MUTE;
-
+       tegra_soc_device_init("kaen");
        seaboard_common_init();
 
        seaboard_i2c_init();
@@ -274,7 +274,7 @@ static void __init tegra_wario_init(void)
        debug_uart_platform_data[0].membase = IO_ADDRESS(TEGRA_UARTB_BASE);
        debug_uart_platform_data[0].mapbase = TEGRA_UARTB_BASE;
        debug_uart_platform_data[0].irq = INT_UARTB;
-
+       tegra_soc_device_init("wario");
        seaboard_common_init();
 
        seaboard_i2c_init();
index 0b2cab1..114965c 100644 (file)
@@ -161,7 +161,7 @@ static __initdata struct tegra_clk_init_table trimslice_clk_init_table[] = {
 static void __init tegra_trimslice_init(void)
 {
        tegra_clk_init_from_table(trimslice_clk_init_table);
-
+       tegra_soc_device_init("trimslice");
        trimslice_pinmux_init();
 
        tegra_sdhci_device1.dev.platform_data = &sdhci_pdata1;
index 9e3e518..8461b12 100644 (file)
@@ -605,6 +605,7 @@ static void __init tegra_ventana_init(void)
 
        tegra_clk_init_from_table(ventana_clk_init_table);
        ventana_emc_init();
+       tegra_soc_device_init("ventana");
        tegra_enable_pinmux();
        ventana_pinmux_init();
        ventana_i2c_init();
index ae2375f..d531a10 100644 (file)
@@ -513,6 +513,7 @@ static void __init tegra_whistler_init(void)
        int modem_id = tegra_get_modem_id();
        tegra_clk_init_from_table(whistler_clk_init_table);
        whistler_emc_init();
+       tegra_soc_device_init("whistler");
        tegra_enable_pinmux();
        whistler_pinmux_init();
        whistler_i2c_init();
index d7c3eb3..8700754 100644 (file)
@@ -172,5 +172,6 @@ int get_maximum_cpu_current_supported(void);
 void tegra_enable_pinmux(void);
 enum image_type get_tegra_image_type(void);
 int tegra_get_cvb_alignment_uV(void);
+int tegra_soc_device_init(const char *machine);
 
 #endif
index af06579..76eb6f0 100644 (file)
@@ -33,6 +33,7 @@
 #include <linux/of.h>
 #include <linux/persistent_ram.h>
 #include <linux/dma-mapping.h>
+#include <linux/sys_soc.h>
 
 #include <asm/soc.h>
 #include <asm/hardware/cache-l2x0.h>
@@ -1249,6 +1250,81 @@ void tegra_enable_pinmux(void)
        platform_add_devices(pinmux_devices, ARRAY_SIZE(pinmux_devices));
 }
 
+static const char *tegra_revision_name[TEGRA_REVISION_MAX] = {
+       [TEGRA_REVISION_UNKNOWN] = "unknown",
+       [TEGRA_REVISION_A01]     = "A01",
+       [TEGRA_REVISION_A02]     = "A02",
+       [TEGRA_REVISION_A03]     = "A03",
+       [TEGRA_REVISION_A03p]    = "A03 prime",
+       [TEGRA_REVISION_A04]     = "A04",
+       [TEGRA_REVISION_A04p]    = "A04 prime",
+       [TEGRA_REVISION_QT]      = "QT",
+};
+
+static const char * __init tegra_get_revision(void)
+{
+       return kasprintf(GFP_KERNEL, "%s", tegra_revision_name[tegra_revision]);
+}
+
+static const char * __init tegra_get_family(void)
+{
+       void __iomem *chip_id = IO_ADDRESS(TEGRA_APB_MISC_BASE) + 0x804;
+       u32 cid = readl(chip_id);
+       cid = (cid >> 8) & 0xFF;
+
+       switch (cid) {
+       case TEGRA_CHIPID_TEGRA2:
+               cid = 2;
+               break;
+       case TEGRA_CHIPID_TEGRA3:
+               cid = 3;
+               break;
+       case TEGRA_CHIPID_TEGRA11:
+               cid = 11;
+               break;
+
+       case TEGRA_CHIPID_UNKNOWN:
+       default:
+               cid = 0;
+       }
+       return kasprintf(GFP_KERNEL, "Tegra%d", cid);
+}
+
+static const char * __init tegra_get_soc_id(void)
+{
+       int package_id = tegra_package_id();
+       return kasprintf(GFP_KERNEL, "REV=%s:SKU=0x%x:PID=0x%x",
+               tegra_revision_name[tegra_revision], tegra_sku_id, package_id);
+}
+
+static void __init tegra_soc_info_populate(struct soc_device_attribute
+       *soc_dev_attr, const char *machine)
+{
+       soc_dev_attr->soc_id = tegra_get_soc_id();
+       soc_dev_attr->machine  = machine;
+       soc_dev_attr->family   = tegra_get_family();
+       soc_dev_attr->revision = tegra_get_revision();
+}
+
+int __init tegra_soc_device_init(const char *machine)
+{
+       struct soc_device *soc_dev;
+       struct soc_device_attribute *soc_dev_attr;
+
+       soc_dev_attr = kzalloc(sizeof(*soc_dev_attr), GFP_KERNEL);
+       if (!soc_dev_attr)
+               return -ENOMEM;
+
+       tegra_soc_info_populate(soc_dev_attr, machine);
+
+       soc_dev = soc_device_register(soc_dev_attr);
+       if (IS_ERR_OR_NULL(soc_dev)) {
+               kfree(soc_dev_attr);
+               return -1;
+       }
+
+       return 0;
+}
 struct arm_soc_desc tegra_soc_desc __initdata = {
        .name           = "NVIDIA Tegra",
        soc_smp_init_ops(tegra_soc_smp_init_ops)