#include <linux/pm.h>
 #include <linux/regmap.h>
 
-static struct regmap *map;
-static u32 offset;
-static u32 value;
-static u32 mask;
+struct syscon_poweroff_data {
+       struct regmap *map;
+       u32 offset;
+       u32 value;
+       u32 mask;
+};
+
+static struct syscon_poweroff_data *data;
 
 static void syscon_poweroff(void)
 {
        /* Issue the poweroff */
-       regmap_update_bits(map, offset, mask, value);
+       regmap_update_bits(data->map, data->offset, data->mask, data->value);
 
        mdelay(1000);
 
        struct device *dev = &pdev->dev;
        int mask_err, value_err;
 
-       map = syscon_regmap_lookup_by_phandle(dev->of_node, "regmap");
-       if (IS_ERR(map)) {
-               map = syscon_node_to_regmap(dev->parent->of_node);
-               if (IS_ERR(map)) {
+       data = devm_kzalloc(dev, sizeof(*data), GFP_KERNEL);
+       if (!data)
+               return -ENOMEM;
+
+       data->map = syscon_regmap_lookup_by_phandle(dev->of_node, "regmap");
+       if (IS_ERR(data->map)) {
+               data->map = syscon_node_to_regmap(dev->parent->of_node);
+               if (IS_ERR(data->map)) {
                        dev_err(dev, "unable to get syscon");
-                       return PTR_ERR(map);
+                       return PTR_ERR(data->map);
                }
        }
 
-       if (of_property_read_u32(dev->of_node, "offset", &offset)) {
+       if (of_property_read_u32(dev->of_node, "offset", &data->offset)) {
                dev_err(dev, "unable to read 'offset'");
                return -EINVAL;
        }
 
-       value_err = of_property_read_u32(dev->of_node, "value", &value);
-       mask_err = of_property_read_u32(dev->of_node, "mask", &mask);
+       value_err = of_property_read_u32(dev->of_node, "value", &data->value);
+       mask_err = of_property_read_u32(dev->of_node, "mask", &data->mask);
        if (value_err && mask_err) {
                dev_err(dev, "unable to read 'value' and 'mask'");
                return -EINVAL;
 
        if (value_err) {
                /* support old binding */
-               value = mask;
-               mask = 0xFFFFFFFF;
+               data->value = data->mask;
+               data->mask = 0xFFFFFFFF;
        } else if (mask_err) {
                /* support value without mask*/
-               mask = 0xFFFFFFFF;
+               data->mask = 0xFFFFFFFF;
        }
 
        if (pm_power_off) {