// SPDX-License-Identifier: GPL-2.0
/*
 * Texas Instruments DRA7 reset driver
 *
 * Copyright (C) 2019 Texas Instruments Incorporated - http://www.ti.com/
 * Author: Keerthy <j-keerthy@ti.com>
 */

#include <asm/io.h>
#include <common.h>
#include <dm.h>
#include <reset-uclass.h>
#include <dm/device_compat.h>

struct dra7_reset_priv {
	u32 rstctrl;
	u32 rstst;
	u8 nreset;
};

static int dra7_reset_request(struct reset_ctl *reset_ctl)
{
	return 0;
}

static int dra7_reset_free(struct reset_ctl *reset_ctl)
{
	return 0;
}

static inline void dra7_reset_rmw(u32 addr, u32 value, u32 mask)
{
	writel(((readl(addr) & (~mask)) | (value & mask)), addr);
}

static int dra7_reset_deassert(struct reset_ctl *reset_ctl)
{
	struct dra7_reset_priv *priv = dev_get_priv(reset_ctl->dev);
	int mask = 1 << reset_ctl->id;

	if (reset_ctl->id < 0 || reset_ctl->id >= priv->nreset)
		return -EINVAL;

	dra7_reset_rmw(priv->rstctrl, 0x0, mask);

	while ((readl(priv->rstst) & mask) != mask)
		;

	return 0;
}

static int dra7_reset_assert(struct reset_ctl *reset_ctl)
{
	struct dra7_reset_priv *priv = dev_get_priv(reset_ctl->dev);
	int mask = 1 << reset_ctl->id;

	if (reset_ctl->id < 0 || reset_ctl->id >= priv->nreset)
		return -EINVAL;

	dra7_reset_rmw(priv->rstctrl, mask, 0x0);

	return 0;
}

struct reset_ops dra7_reset_ops = {
	.request = dra7_reset_request,
	.rfree = dra7_reset_free,
	.rst_assert = dra7_reset_assert,
	.rst_deassert = dra7_reset_deassert,
};

static const struct udevice_id dra7_reset_ids[] = {
	{ .compatible = "ti,dra7-reset" },
	{ }
};

static int dra7_reset_probe(struct udevice *dev)
{
	struct dra7_reset_priv *priv = dev_get_priv(dev);

	priv->rstctrl = dev_read_addr(dev);
	priv->rstst = priv->rstctrl + 0x4;
	priv->nreset = dev_read_u32_default(dev, "ti,nresets", 1);

	dev_info(dev, "dra7-reset successfully probed %s\n", dev->name);

	return 0;
}

U_BOOT_DRIVER(dra7_reset) = {
	.name = "dra7_reset",
	.id = UCLASS_RESET,
	.of_match = dra7_reset_ids,
	.probe = dra7_reset_probe,
	.ops = &dra7_reset_ops,
	.priv_auto = sizeof(struct dra7_reset_priv),
};
