diff options
Diffstat (limited to 'drivers/amba/bus.c')
| -rw-r--r-- | drivers/amba/bus.c | 223 | 
1 files changed, 20 insertions, 203 deletions
diff --git a/drivers/amba/bus.c b/drivers/amba/bus.c index c6707278a6b..3cf61a127ee 100644 --- a/drivers/amba/bus.c +++ b/drivers/amba/bus.c @@ -83,163 +83,7 @@ static struct device_attribute amba_dev_attrs[] = {  	__ATTR_NULL,  }; -#ifdef CONFIG_PM_SLEEP - -static int amba_legacy_suspend(struct device *dev, pm_message_t mesg) -{ -	struct amba_driver *adrv = to_amba_driver(dev->driver); -	struct amba_device *adev = to_amba_device(dev); -	int ret = 0; - -	if (dev->driver && adrv->suspend) -		ret = adrv->suspend(adev, mesg); - -	return ret; -} - -static int amba_legacy_resume(struct device *dev) -{ -	struct amba_driver *adrv = to_amba_driver(dev->driver); -	struct amba_device *adev = to_amba_device(dev); -	int ret = 0; - -	if (dev->driver && adrv->resume) -		ret = adrv->resume(adev); - -	return ret; -} - -#endif /* CONFIG_PM_SLEEP */ - -#ifdef CONFIG_SUSPEND - -static int amba_pm_suspend(struct device *dev) -{ -	struct device_driver *drv = dev->driver; -	int ret = 0; - -	if (!drv) -		return 0; - -	if (drv->pm) { -		if (drv->pm->suspend) -			ret = drv->pm->suspend(dev); -	} else { -		ret = amba_legacy_suspend(dev, PMSG_SUSPEND); -	} - -	return ret; -} - -static int amba_pm_resume(struct device *dev) -{ -	struct device_driver *drv = dev->driver; -	int ret = 0; - -	if (!drv) -		return 0; - -	if (drv->pm) { -		if (drv->pm->resume) -			ret = drv->pm->resume(dev); -	} else { -		ret = amba_legacy_resume(dev); -	} - -	return ret; -} - -#else /* !CONFIG_SUSPEND */ - -#define amba_pm_suspend		NULL -#define amba_pm_resume		NULL - -#endif /* !CONFIG_SUSPEND */ - -#ifdef CONFIG_HIBERNATE_CALLBACKS - -static int amba_pm_freeze(struct device *dev) -{ -	struct device_driver *drv = dev->driver; -	int ret = 0; - -	if (!drv) -		return 0; - -	if (drv->pm) { -		if (drv->pm->freeze) -			ret = drv->pm->freeze(dev); -	} else { -		ret = amba_legacy_suspend(dev, PMSG_FREEZE); -	} - -	return ret; -} - -static int amba_pm_thaw(struct device *dev) -{ -	struct device_driver *drv = dev->driver; -	int ret = 0; - -	if (!drv) -		return 0; - -	if (drv->pm) { -		if (drv->pm->thaw) -			ret = drv->pm->thaw(dev); -	} else { -		ret = amba_legacy_resume(dev); -	} - -	return ret; -} - -static int amba_pm_poweroff(struct device *dev) -{ -	struct device_driver *drv = dev->driver; -	int ret = 0; - -	if (!drv) -		return 0; - -	if (drv->pm) { -		if (drv->pm->poweroff) -			ret = drv->pm->poweroff(dev); -	} else { -		ret = amba_legacy_suspend(dev, PMSG_HIBERNATE); -	} - -	return ret; -} - -static int amba_pm_restore(struct device *dev) -{ -	struct device_driver *drv = dev->driver; -	int ret = 0; - -	if (!drv) -		return 0; - -	if (drv->pm) { -		if (drv->pm->restore) -			ret = drv->pm->restore(dev); -	} else { -		ret = amba_legacy_resume(dev); -	} - -	return ret; -} - -#else /* !CONFIG_HIBERNATE_CALLBACKS */ - -#define amba_pm_freeze		NULL -#define amba_pm_thaw		NULL -#define amba_pm_poweroff		NULL -#define amba_pm_restore		NULL - -#endif /* !CONFIG_HIBERNATE_CALLBACKS */ - -#ifdef CONFIG_PM_RUNTIME +#ifdef CONFIG_PM  /*   * Hooks to provide runtime PM of the pclk (bus clock).  It is safe to   * enable/disable the bus clock at runtime PM suspend/resume as this @@ -251,7 +95,7 @@ static int amba_pm_runtime_suspend(struct device *dev)  	int ret = pm_generic_runtime_suspend(dev);  	if (ret == 0 && dev->driver) -		clk_disable(pcdev->pclk); +		clk_disable_unprepare(pcdev->pclk);  	return ret;  } @@ -262,7 +106,7 @@ static int amba_pm_runtime_resume(struct device *dev)  	int ret;  	if (dev->driver) { -		ret = clk_enable(pcdev->pclk); +		ret = clk_prepare_enable(pcdev->pclk);  		/* Failure is probably fatal to the system, but... */  		if (ret)  			return ret; @@ -272,30 +116,20 @@ static int amba_pm_runtime_resume(struct device *dev)  }  #endif -#ifdef CONFIG_PM -  static const struct dev_pm_ops amba_pm = { -	.suspend	= amba_pm_suspend, -	.resume		= amba_pm_resume, -	.freeze		= amba_pm_freeze, -	.thaw		= amba_pm_thaw, -	.poweroff	= amba_pm_poweroff, -	.restore	= amba_pm_restore, -	SET_RUNTIME_PM_OPS( +	.suspend	= pm_generic_suspend, +	.resume		= pm_generic_resume, +	.freeze		= pm_generic_freeze, +	.thaw		= pm_generic_thaw, +	.poweroff	= pm_generic_poweroff, +	.restore	= pm_generic_restore, +	SET_PM_RUNTIME_PM_OPS(  		amba_pm_runtime_suspend,  		amba_pm_runtime_resume,  		NULL  	)  }; -#define AMBA_PM (&amba_pm) - -#else /* !CONFIG_PM */ - -#define AMBA_PM	NULL - -#endif /* !CONFIG_PM */ -  /*   * Primecells are part of the Advanced Microcontroller Bus Architecture,   * so we call the bus "amba". @@ -305,7 +139,7 @@ struct bus_type amba_bustype = {  	.dev_attrs	= amba_dev_attrs,  	.match		= amba_match,  	.uevent		= amba_uevent, -	.pm		= AMBA_PM, +	.pm		= &amba_pm,  };  static int __init amba_init(void) @@ -317,36 +151,23 @@ postcore_initcall(amba_init);  static int amba_get_enable_pclk(struct amba_device *pcdev)  { -	struct clk *pclk = clk_get(&pcdev->dev, "apb_pclk");  	int ret; -	pcdev->pclk = pclk; - -	if (IS_ERR(pclk)) -		return PTR_ERR(pclk); - -	ret = clk_prepare(pclk); -	if (ret) { -		clk_put(pclk); -		return ret; -	} +	pcdev->pclk = clk_get(&pcdev->dev, "apb_pclk"); +	if (IS_ERR(pcdev->pclk)) +		return PTR_ERR(pcdev->pclk); -	ret = clk_enable(pclk); -	if (ret) { -		clk_unprepare(pclk); -		clk_put(pclk); -	} +	ret = clk_prepare_enable(pcdev->pclk); +	if (ret) +		clk_put(pcdev->pclk);  	return ret;  }  static void amba_put_disable_pclk(struct amba_device *pcdev)  { -	struct clk *pclk = pcdev->pclk; - -	clk_disable(pclk); -	clk_unprepare(pclk); -	clk_put(pclk); +	clk_disable_unprepare(pcdev->pclk); +	clk_put(pcdev->pclk);  }  /* @@ -552,7 +373,6 @@ amba_aphb_device_add(struct device *parent, const char *name,  	if (!dev)  		return ERR_PTR(-ENOMEM); -	dev->dma_mask = dma_mask;  	dev->dev.coherent_dma_mask = dma_mask;  	dev->irq[0] = irq1;  	dev->irq[1] = irq2; @@ -619,7 +439,7 @@ static void amba_device_initialize(struct amba_device *dev, const char *name)  		dev_set_name(&dev->dev, "%s", name);  	dev->dev.release = amba_device_release;  	dev->dev.bus = &amba_bustype; -	dev->dev.dma_mask = &dev->dma_mask; +	dev->dev.dma_mask = &dev->dev.coherent_dma_mask;  	dev->res.name = dev_name(&dev->dev);  } @@ -663,9 +483,6 @@ int amba_device_register(struct amba_device *dev, struct resource *parent)  	amba_device_initialize(dev, dev->dev.init_name);  	dev->dev.init_name = NULL; -	if (!dev->dev.coherent_dma_mask && dev->dma_mask) -		dev_warn(&dev->dev, "coherent dma mask is unset\n"); -  	return amba_device_add(dev, parent);  }  | 
