#include <linux/kernel.h>
 #include <linux/init.h>
+#include <linux/slab.h>
+#include <linux/sys_soc.h>
 
 #include <asm/mipsregs.h>
 #include <asm/mach-ralink/ralink_regs.h>
 
 #include "common.h"
 
+static struct ralink_soc_info *soc_info_ptr;
+
 void __init ralink_clk_init(void)
 {
        unsigned long cpu_rate, wmac_rate = 40000000;
 {
        return (rt2880_get_soc_id() & CHIP_ID_REV_MASK);
 }
+
+static int __init rt2880_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 = rt2880_get_soc_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(rt2880_soc_dev_init);
+
 void __init prom_soc_init(struct ralink_soc_info *soc_info)
 {
        if (rt2880_soc_valid())
        soc_info->mem_size_max = RT2880_MEM_SIZE_MAX;
 
        ralink_soc = RT2880_SOC;
+       soc_info_ptr = soc_info;
 }