Merge branch 'irq-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git...
[sfrench/cifs-2.6.git] / drivers / mfd / syscon.c
index b93fe4c4957a06c947650ae67987cec11aca7d48..7eaa40bc703fdfc0500a7df2905543a2efd806ac 100644 (file)
@@ -13,6 +13,7 @@
  */
 
 #include <linux/err.h>
+#include <linux/hwspinlock.h>
 #include <linux/io.h>
 #include <linux/module.h>
 #include <linux/list.h>
@@ -87,6 +88,24 @@ static struct syscon *of_syscon_register(struct device_node *np)
        if (ret)
                reg_io_width = 4;
 
+       ret = of_hwspin_lock_get_id(np, 0);
+       if (ret > 0 || (IS_ENABLED(CONFIG_HWSPINLOCK) && ret == 0)) {
+               syscon_config.use_hwlock = true;
+               syscon_config.hwlock_id = ret;
+               syscon_config.hwlock_mode = HWLOCK_IRQSTATE;
+       } else if (ret < 0) {
+               switch (ret) {
+               case -ENOENT:
+                       /* Ignore missing hwlock, it's optional. */
+                       break;
+               default:
+                       pr_err("Failed to retrieve valid hwlock: %d\n", ret);
+                       /* fall-through */
+               case -EPROBE_DEFER:
+                       goto err_regmap;
+               }
+       }
+
        syscon_config.reg_stride = reg_io_width;
        syscon_config.val_bits = reg_io_width * 8;
        syscon_config.max_register = resource_size(&res) - reg_io_width;