]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
ENGR00269945: ARM: imx6: report soc info via soc device
authorShawn Guo <shawn.guo@freescale.com>
Tue, 13 Aug 2013 08:59:28 +0000 (16:59 +0800)
committerJason Liu <r64343@freescale.com>
Wed, 30 Oct 2013 01:54:32 +0000 (09:54 +0800)
The patch enables soc bus infrastructure and adds a function
imx_soc_device_init() to report soc info via soc device interface for
imx6qdl and imx6sl.  With the support, user space can get soc related
info by looking at sysfs like below.

  $ cat /sys/devices/soc0/machine
  Freescale i.MX6 Quad SABRE Smart Device Board
  $ cat /sys/devices/soc0/family
  Freescale i.MX
  $ cat /sys/devices/soc0/soc_id
  i.MX6Q
  $ cat /sys/devices/soc0/revision
  1.2

Signed-off-by: Shawn Guo <shawn.guo@freescale.com>
arch/arm/mach-imx/Kconfig
arch/arm/mach-imx/common.h
arch/arm/mach-imx/cpu.c
arch/arm/mach-imx/mach-imx6q.c
arch/arm/mach-imx/mach-imx6sl.c

index 943ce138c2fbf73762eb616e1913a20bd2d38429..0633cf9cc01ff85502bb440d5dfddac49c9a5344 100644 (file)
@@ -11,6 +11,7 @@ config ARCH_MXC
        select GENERIC_IRQ_CHIP
        select MIGHT_HAVE_CACHE_L2X0 if ARCH_MULTI_V6_V7
        select MULTI_IRQ_HANDLER
+       select SOC_BUS
        select SPARSE_IRQ
        select SRAM
        select USE_OF
index 550e97adc00fbd7e588bda43f83639b27ff95219..dba45f5ddcdb48a17ccd5af8b2d827f361651992 100644 (file)
@@ -82,6 +82,7 @@ extern int mxc_device_init(void);
 extern void imx_set_soc_revision(unsigned int rev);
 extern unsigned int imx_get_soc_revision(void);
 extern void imx_init_revision_from_anatop(void);
+extern struct device *imx_soc_device_init(void);
 
 enum mxc_cpu_pwr_mode {
        WAIT_CLOCKED,           /* wfi only */
index 51f6c51ca8783ed6fbac57cf7ca92723c89b8109..8ebcc20662b01e250cf25e191a226fafec730871 100644 (file)
@@ -1,6 +1,9 @@
 
 #include <linux/module.h>
 #include <linux/io.h>
+#include <linux/of.h>
+#include <linux/slab.h>
+#include <linux/sys_soc.h>
 
 #include "hardware.h"
 #include "common.h"
@@ -56,3 +59,80 @@ void __init imx_set_aips(void __iomem *base)
        reg = __raw_readl(base + 0x50) & 0x00FFFFFF;
        __raw_writel(reg, base + 0x50);
 }
+
+struct device * __init imx_soc_device_init(void)
+{
+       struct soc_device_attribute *soc_dev_attr;
+       struct soc_device *soc_dev;
+       struct device_node *root;
+       const char *soc_id;
+       int ret;
+
+       soc_dev_attr = kzalloc(sizeof(*soc_dev_attr), GFP_KERNEL);
+       if (!soc_dev_attr)
+               return NULL;
+
+       soc_dev_attr->family = "Freescale i.MX";
+
+       root = of_find_node_by_path("/");
+       ret = of_property_read_string(root, "model", &soc_dev_attr->machine);
+       if (ret)
+               goto free_soc;
+
+       switch (__mxc_cpu_type) {
+       case MXC_CPU_MX1:
+               soc_id = "i.MX1";
+               break;
+       case MXC_CPU_MX21:
+               soc_id = "i.MX21";
+               break;
+       case MXC_CPU_MX25:
+               soc_id = "i.MX25";
+               break;
+       case MXC_CPU_MX27:
+               soc_id = "i.MX27";
+               break;
+       case MXC_CPU_MX31:
+               soc_id = "i.MX31";
+               break;
+       case MXC_CPU_MX35:
+               soc_id = "i.MX35";
+               break;
+       case MXC_CPU_MX51:
+               soc_id = "i.MX51";
+               break;
+       case MXC_CPU_MX53:
+               soc_id = "i.MX53";
+               break;
+       case MXC_CPU_IMX6SL:
+               soc_id = "i.MX6SL";
+               break;
+       case MXC_CPU_IMX6DL:
+               soc_id = "i.MX6DL";
+               break;
+       case MXC_CPU_IMX6Q:
+               soc_id = "i.MX6Q";
+               break;
+       default:
+               soc_id = "Unknown";
+       }
+       soc_dev_attr->soc_id = soc_id;
+
+       soc_dev_attr->revision = kasprintf(GFP_KERNEL, "%d.%d",
+                                          (imx_soc_revision >> 4) & 0xf,
+                                          imx_soc_revision & 0xf);
+       if (!soc_dev_attr->revision)
+               goto free_soc;
+
+       soc_dev = soc_device_register(soc_dev_attr);
+       if (IS_ERR(soc_dev))
+               goto free_rev;
+
+       return soc_device_to_device(soc_dev);
+
+free_rev:
+       kfree(soc_dev_attr->revision);
+free_soc:
+       kfree(soc_dev_attr);
+       return NULL;
+}
index 4dfb488bd9fbb659ec8cbf25299b06883f7d2849..8e9aef644614619b5fd7951c81916d0afc6e8322 100644 (file)
@@ -198,9 +198,15 @@ static void __init imx6q_lvds_cabc_init(void)
 
 static void __init imx6q_init_machine(void)
 {
+       struct device *parent;
+
+       parent = imx_soc_device_init();
+       if (parent == NULL)
+               pr_warn("failed to initialize soc device\n");
+
        imx6q_enet_phy_init();
 
-       of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL);
+       of_platform_populate(NULL, of_default_bus_match_table, NULL, parent);
 
        imx_anatop_init();
        imx6q_pm_init();
index 65e9b887e7529342b6f8b2011b5332e7833defe6..8f1298df3ded2336ef4ad0c5550b65d7c1fd8eae 100644 (file)
 
 static void __init imx6sl_init_machine(void)
 {
+       struct device *parent;
+
        mxc_arch_reset_init_dt();
 
-       of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL);
+       parent = imx_soc_device_init();
+       if (parent == NULL)
+               pr_warn("failed to initialize soc device\n");
+
+       of_platform_populate(NULL, of_default_bus_match_table, NULL, parent);
 }
 
 static void __init imx6sl_init_irq(void)