mirror of
https://github.com/edk2-porting/linux-next.git
synced 2025-01-22 12:33:59 +08:00
i2c: designware-pci: Cleanup driver power management
The PCI part of the DesignWare I2C driver does a lot of things that are not required anymore. For example drivers aren't supposed to handle PCI state transitions themselves. This is all provided by the PCI bus core already. In addition to that there is no point scheduling RPM suspend on driver's idle hook but instead we can use RPM autosuspend for this (which is enabled in the driver already). As a bonus, this patch also fixes following compile warning which is emitted when the driver was compiled without CONFIG_PM_RUNTIME set: drivers/i2c/busses/i2c-designware-pcidrv.c:245:12: warning: ‘i2c_dw_pci_runtime_idle’ defined but not used [-Wunused-function] Reported-by: xinhui.pan <xinhuix.pan@intel.com> Reported-by: Jingoo Han <jg1.han@samsung.com> Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com> Signed-off-by: Wolfram Sang <wsa@the-dreams.de>
This commit is contained in:
parent
6468276b22
commit
be58eda775
@ -138,69 +138,25 @@ static struct i2c_algorithm i2c_dw_algo = {
|
|||||||
.functionality = i2c_dw_func,
|
.functionality = i2c_dw_func,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#ifdef CONFIG_PM
|
||||||
static int i2c_dw_pci_suspend(struct device *dev)
|
static int i2c_dw_pci_suspend(struct device *dev)
|
||||||
{
|
{
|
||||||
struct pci_dev *pdev = container_of(dev, struct pci_dev, dev);
|
struct pci_dev *pdev = container_of(dev, struct pci_dev, dev);
|
||||||
struct dw_i2c_dev *i2c = pci_get_drvdata(pdev);
|
|
||||||
int err;
|
|
||||||
|
|
||||||
|
|
||||||
i2c_dw_disable(i2c);
|
|
||||||
|
|
||||||
err = pci_save_state(pdev);
|
|
||||||
if (err) {
|
|
||||||
dev_err(&pdev->dev, "pci_save_state failed\n");
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
|
|
||||||
err = pci_set_power_state(pdev, PCI_D3hot);
|
|
||||||
if (err) {
|
|
||||||
dev_err(&pdev->dev, "pci_set_power_state failed\n");
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
i2c_dw_disable(pci_get_drvdata(pdev));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int i2c_dw_pci_resume(struct device *dev)
|
static int i2c_dw_pci_resume(struct device *dev)
|
||||||
{
|
{
|
||||||
struct pci_dev *pdev = container_of(dev, struct pci_dev, dev);
|
struct pci_dev *pdev = container_of(dev, struct pci_dev, dev);
|
||||||
struct dw_i2c_dev *i2c = pci_get_drvdata(pdev);
|
|
||||||
int err;
|
|
||||||
u32 enabled;
|
|
||||||
|
|
||||||
enabled = i2c_dw_is_enabled(i2c);
|
return i2c_dw_init(pci_get_drvdata(pdev));
|
||||||
if (enabled)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
err = pci_set_power_state(pdev, PCI_D0);
|
|
||||||
if (err) {
|
|
||||||
dev_err(&pdev->dev, "pci_set_power_state() failed\n");
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
|
|
||||||
pci_restore_state(pdev);
|
|
||||||
|
|
||||||
i2c_dw_init(i2c);
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
static int i2c_dw_pci_runtime_idle(struct device *dev)
|
static UNIVERSAL_DEV_PM_OPS(i2c_dw_pm_ops, i2c_dw_pci_suspend,
|
||||||
{
|
i2c_dw_pci_resume, NULL);
|
||||||
int err = pm_schedule_suspend(dev, 500);
|
|
||||||
dev_dbg(dev, "runtime_idle called\n");
|
|
||||||
|
|
||||||
if (err != 0)
|
|
||||||
return 0;
|
|
||||||
return -EBUSY;
|
|
||||||
}
|
|
||||||
|
|
||||||
static const struct dev_pm_ops i2c_dw_pm_ops = {
|
|
||||||
.resume = i2c_dw_pci_resume,
|
|
||||||
.suspend = i2c_dw_pci_suspend,
|
|
||||||
SET_RUNTIME_PM_OPS(i2c_dw_pci_suspend, i2c_dw_pci_resume,
|
|
||||||
i2c_dw_pci_runtime_idle)
|
|
||||||
};
|
|
||||||
|
|
||||||
static u32 i2c_dw_get_clk_rate_khz(struct dw_i2c_dev *dev)
|
static u32 i2c_dw_get_clk_rate_khz(struct dw_i2c_dev *dev)
|
||||||
{
|
{
|
||||||
@ -290,6 +246,7 @@ static int i2c_dw_pci_probe(struct pci_dev *pdev,
|
|||||||
|
|
||||||
pm_runtime_set_autosuspend_delay(&pdev->dev, 1000);
|
pm_runtime_set_autosuspend_delay(&pdev->dev, 1000);
|
||||||
pm_runtime_use_autosuspend(&pdev->dev);
|
pm_runtime_use_autosuspend(&pdev->dev);
|
||||||
|
pm_runtime_put_autosuspend(&pdev->dev);
|
||||||
pm_runtime_allow(&pdev->dev);
|
pm_runtime_allow(&pdev->dev);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
Loading…
Reference in New Issue
Block a user