spi: sprd: adi: Change hwlock to be optional
[linux-2.6-microblaze.git] / drivers / spi / spi-sprd-adi.c
index 0d767eb..9a05128 100644 (file)
@@ -165,14 +165,16 @@ static int sprd_adi_read(struct sprd_adi *sadi, u32 reg_paddr, u32 *read_val)
        int read_timeout = ADI_READ_TIMEOUT;
        unsigned long flags;
        u32 val, rd_addr;
-       int ret;
-
-       ret = hwspin_lock_timeout_irqsave(sadi->hwlock,
-                                         ADI_HWSPINLOCK_TIMEOUT,
-                                         &flags);
-       if (ret) {
-               dev_err(sadi->dev, "get the hw lock failed\n");
-               return ret;
+       int ret = 0;
+
+       if (sadi->hwlock) {
+               ret = hwspin_lock_timeout_irqsave(sadi->hwlock,
+                                                 ADI_HWSPINLOCK_TIMEOUT,
+                                                 &flags);
+               if (ret) {
+                       dev_err(sadi->dev, "get the hw lock failed\n");
+                       return ret;
+               }
        }
 
        /*
@@ -219,7 +221,8 @@ static int sprd_adi_read(struct sprd_adi *sadi, u32 reg_paddr, u32 *read_val)
        *read_val = val & RD_VALUE_MASK;
 
 out:
-       hwspin_unlock_irqrestore(sadi->hwlock, &flags);
+       if (sadi->hwlock)
+               hwspin_unlock_irqrestore(sadi->hwlock, &flags);
        return ret;
 }
 
@@ -230,12 +233,14 @@ static int sprd_adi_write(struct sprd_adi *sadi, u32 reg_paddr, u32 val)
        unsigned long flags;
        int ret;
 
-       ret = hwspin_lock_timeout_irqsave(sadi->hwlock,
-                                         ADI_HWSPINLOCK_TIMEOUT,
-                                         &flags);
-       if (ret) {
-               dev_err(sadi->dev, "get the hw lock failed\n");
-               return ret;
+       if (sadi->hwlock) {
+               ret = hwspin_lock_timeout_irqsave(sadi->hwlock,
+                                                 ADI_HWSPINLOCK_TIMEOUT,
+                                                 &flags);
+               if (ret) {
+                       dev_err(sadi->dev, "get the hw lock failed\n");
+                       return ret;
+               }
        }
 
        ret = sprd_adi_drain_fifo(sadi);
@@ -261,7 +266,8 @@ static int sprd_adi_write(struct sprd_adi *sadi, u32 reg_paddr, u32 val)
        }
 
 out:
-       hwspin_unlock_irqrestore(sadi->hwlock, &flags);
+       if (sadi->hwlock)
+               hwspin_unlock_irqrestore(sadi->hwlock, &flags);
        return ret;
 }
 
@@ -476,16 +482,26 @@ static int sprd_adi_probe(struct platform_device *pdev)
        sadi->slave_pbase = res->start + ADI_SLAVE_OFFSET;
        sadi->ctlr = ctlr;
        sadi->dev = &pdev->dev;
-       ret = of_hwspin_lock_get_id_byname(np, "adi");
-       if (ret < 0) {
-               dev_err(&pdev->dev, "can not get the hardware spinlock\n");
-               goto put_ctlr;
-       }
-
-       sadi->hwlock = devm_hwspin_lock_request_specific(&pdev->dev, ret);
-       if (!sadi->hwlock) {
-               ret = -ENXIO;
-               goto put_ctlr;
+       ret = of_hwspin_lock_get_id(np, 0);
+       if (ret > 0 || (IS_ENABLED(CONFIG_HWSPINLOCK) && ret == 0)) {
+               sadi->hwlock =
+                       devm_hwspin_lock_request_specific(&pdev->dev, ret);
+               if (!sadi->hwlock) {
+                       ret = -ENXIO;
+                       goto put_ctlr;
+               }
+       } else {
+               switch (ret) {
+               case -ENOENT:
+                       dev_info(&pdev->dev, "no hardware spinlock supplied\n");
+                       break;
+               default:
+                       dev_err(&pdev->dev,
+                               "failed to find hwlock id, %d\n", ret);
+                       /* fall-through */
+               case -EPROBE_DEFER:
+                       goto put_ctlr;
+               }
        }
 
        sprd_adi_hw_init(sadi);