#include <linux/list.h>
  #include <linux/of.h>
  #include <linux/bitops.h>
+ #include <linux/pm.h>
  
 +#ifdef CONFIG_ARM
  #include <asm/bug.h>
  #include <asm/signal.h>
 +#endif
  
 -#define ARB_TIMER                     0x008
 -#define ARB_ERR_CAP_CLR                       0x7e4
  #define  ARB_ERR_CAP_CLEAR            (1 << 0)
 -#define ARB_ERR_CAP_HI_ADDR           0x7e8
 -#define ARB_ERR_CAP_ADDR              0x7ec
 -#define ARB_ERR_CAP_DATA              0x7f0
 -#define ARB_ERR_CAP_STATUS            0x7f4
  #define  ARB_ERR_CAP_STATUS_TIMEOUT   (1 << 12)
  #define  ARB_ERR_CAP_STATUS_TEA               (1 << 11)
  #define  ARB_ERR_CAP_STATUS_BS_SHIFT  (1 << 2)
  
        return ret;
  }
- 
- void __init brcmstb_hook_fault_code(void)
- {
-       hook_fault_code(22, brcmstb_bus_error_handler, SIGBUS, 0,
-                       "imprecise external abort");
- }
 +#endif
  
  static irqreturn_t brcmstb_gisb_timeout_handler(int irq, void *dev_id)
  {
  
        list_add_tail(&gdev->next, &brcmstb_gisb_arb_device_list);
  
++#ifdef CONFIG_ARM
+       hook_fault_code(22, brcmstb_bus_error_handler, SIGBUS, 0,
+                       "imprecise external abort");
++#endif
+ 
        dev_info(&pdev->dev, "registered mem: %p, irqs: %d, %d\n",
                        gdev->base, timeout_irq, tea_irq);
  
        return 0;
  }
  
 -      gdev->saved_timeout = ioread32(gdev->base + ARB_TIMER);
+ #ifdef CONFIG_PM_SLEEP
+ static int brcmstb_gisb_arb_suspend(struct device *dev)
+ {
+       struct platform_device *pdev = to_platform_device(dev);
+       struct brcmstb_gisb_arb_device *gdev = platform_get_drvdata(pdev);
+ 
 -      iowrite32(gdev->saved_timeout, gdev->base + ARB_TIMER);
++      gdev->saved_timeout = gisb_read(gdev, ARB_TIMER);
+ 
+       return 0;
+ }
+ 
+ /* Make sure we provide the same timeout value that was configured before, and
+  * do this before the GISB timeout interrupt handler has any chance to run.
+  */
+ static int brcmstb_gisb_arb_resume_noirq(struct device *dev)
+ {
+       struct platform_device *pdev = to_platform_device(dev);
+       struct brcmstb_gisb_arb_device *gdev = platform_get_drvdata(pdev);
+ 
 -static const struct of_device_id brcmstb_gisb_arb_of_match[] = {
 -      { .compatible = "brcm,gisb-arb" },
 -      { },
 -};
 -
++      gisb_write(gdev, gdev->saved_timeout, ARB_TIMER);
+ 
+       return 0;
+ }
+ #else
+ #define brcmstb_gisb_arb_suspend       NULL
+ #define brcmstb_gisb_arb_resume_noirq  NULL
+ #endif
+ 
+ static const struct dev_pm_ops brcmstb_gisb_arb_pm_ops = {
+       .suspend        = brcmstb_gisb_arb_suspend,
+       .resume_noirq   = brcmstb_gisb_arb_resume_noirq,
+ };
+ 
  static struct platform_driver brcmstb_gisb_arb_driver = {
 -      .probe  = brcmstb_gisb_arb_probe,
        .driver = {
                .name   = "brcm-gisb-arb",
                .owner  = THIS_MODULE,