if (!((val & ACP_PGFSM_STATUS_MASK) ==
ACP_POWER_ON_IN_PROGRESS))
rv_writel(ACP_PGFSM_CNTL_POWER_ON_MASK,
acp3x_base + mmACP_PGFSM_CONTROL);
timeout = 0; while (++timeout < 500) {
val = rv_readl(acp3x_base + mmACP_PGFSM_STATUS); if (!val) { /* ACP power On clears PME_EN. * Restore the value to its prior state
*/
rv_writel(adata->pme_en, acp3x_base + mmACP_PME_EN); return 0;
}
udelay(1);
} return -ETIMEDOUT;
}
staticint acp3x_reset(void __iomem *acp3x_base)
{
u32 val; int timeout;
rv_writel(1, acp3x_base + mmACP_SOFT_RESET);
timeout = 0; while (++timeout < 500) {
val = rv_readl(acp3x_base + mmACP_SOFT_RESET); if (val & ACP3x_SOFT_RESET__SoftResetAudDone_MASK) break;
cpu_relax();
}
rv_writel(0, acp3x_base + mmACP_SOFT_RESET);
timeout = 0; while (++timeout < 500) {
val = rv_readl(acp3x_base + mmACP_SOFT_RESET); if (!val) return 0;
cpu_relax();
} return -ETIMEDOUT;
}
/* power on */
ret = acp3x_power_on(adata); if (ret) {
pr_err("ACP3x power on failed\n"); return ret;
} /* Reset */
ret = acp3x_reset(acp3x_base); if (ret) {
pr_err("ACP3x reset failed\n"); return ret;
}
acp3x_enable_interrupts(acp3x_base); return 0;
}
staticint acp3x_deinit(void __iomem *acp3x_base)
{ int ret;
acp3x_disable_interrupts(acp3x_base); /* Reset */
ret = acp3x_reset(acp3x_base); if (ret) {
pr_err("ACP3x reset failed\n"); return ret;
} return 0;
}
unregister_devs: if (val == I2S_MODE) for (i = 0; i < ACP3x_DEVS; i++)
platform_device_unregister(adata->pdev[i]);
de_init: if (acp3x_deinit(adata->acp3x_base))
dev_err(&pci->dev, "ACP de-init failed\n");
release_regions:
pci_release_regions(pci);
disable_pci:
pci_disable_device(pci);
return ret;
}
staticint snd_acp3x_suspend(struct device *dev)
{ int ret; struct acp3x_dev_data *adata;
adata = dev_get_drvdata(dev);
ret = acp3x_deinit(adata->acp3x_base); if (ret)
dev_err(dev, "ACP de-init failed\n"); else
dev_dbg(dev, "ACP de-initialized\n");
return 0;
}
staticint snd_acp3x_resume(struct device *dev)
{ int ret; struct acp3x_dev_data *adata;
adata = dev_get_drvdata(dev);
ret = acp3x_init(adata); if (ret) {
dev_err(dev, "ACP init failed\n"); return ret;
} return 0;
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.