#include <linux/kernel.h>
 #include <linux/init.h>
 #include <linux/bug.h>
+#include <linux/slab.h>
+#include <linux/sys_soc.h>
 
 #include <asm/io.h>
 #include <asm/mipsregs.h>
 
 #include "common.h"
 
+static struct ralink_soc_info *soc_info_ptr;
+
 static unsigned long rt5350_get_mem_size(void)
 {
        unsigned long ret;
        return (rt305x_get_soc_id() & CHIP_ID_REV_MASK);
 }
 
+static const char __init *rt305x_get_soc_id_name(void)
+{
+       if (soc_is_rt3050())
+               return "rt3050";
+       else if (soc_is_rt3052())
+               return "rt3052";
+       else if (soc_is_rt3350())
+               return "rt3350";
+       else if (soc_is_rt3352())
+               return "rt3352";
+       else if (soc_is_rt5350())
+               return "rt5350";
+       else
+               return "invalid";
+}
+
+static int __init rt305x_soc_dev_init(void)
+{
+       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;
+
+       soc_dev_attr->family = "Ralink";
+       soc_dev_attr->soc_id = rt305x_get_soc_id_name();
+
+       soc_dev_attr->data = soc_info_ptr;
+
+       soc_dev = soc_device_register(soc_dev_attr);
+       if (IS_ERR(soc_dev)) {
+               kfree(soc_dev_attr);
+               return PTR_ERR(soc_dev);
+       }
+
+       return 0;
+}
+device_initcall(rt305x_soc_dev_init);
+
 void __init prom_soc_init(struct ralink_soc_info *soc_info)
 {
        const char *name = rt305x_get_soc_name(soc_info);
                soc_info->mem_size_min = RT3352_MEM_SIZE_MIN;
                soc_info->mem_size_max = RT3352_MEM_SIZE_MAX;
        }
+
+       soc_info_ptr = soc_info;
 }