static int brcm_rescal_reset_set()

in reset-brcmstb-rescal.c [23:53]


static int brcm_rescal_reset_set(struct reset_controller_dev *rcdev,
				 unsigned long id)
{
	struct brcm_rescal_reset *data =
		container_of(rcdev, struct brcm_rescal_reset, rcdev);
	void __iomem *base = data->base;
	u32 reg;
	int ret;

	reg = readl(base + BRCM_RESCAL_START);
	writel(reg | BRCM_RESCAL_START_BIT, base + BRCM_RESCAL_START);
	reg = readl(base + BRCM_RESCAL_START);
	if (!(reg & BRCM_RESCAL_START_BIT)) {
		dev_err(data->dev, "failed to start SATA/PCIe rescal\n");
		return -EIO;
	}

	ret = readl_poll_timeout(base + BRCM_RESCAL_STATUS, reg,
				 (reg & BRCM_RESCAL_STATUS_BIT), 100, 1000);
	if (ret) {
		dev_err(data->dev, "time out on SATA/PCIe rescal\n");
		return ret;
	}

	reg = readl(base + BRCM_RESCAL_START);
	writel(reg & ~BRCM_RESCAL_START_BIT, base + BRCM_RESCAL_START);

	dev_dbg(data->dev, "SATA/PCIe rescal success\n");

	return 0;
}