// SPDX-License-Identifier: GPL-2.0
/*
 * Allwinner SoCs hstimer driver.
 *
 * Copyright (C) 2013 Maxime Ripard
 *
 * Maxime Ripard <maxime.ripard@free-electrons.com>
 */

#include <linux/clk.h>
#include <linux/clockchips.h>
#include <linux/clocksource.h>
#include <linux/delay.h>
#include <linux/interrupt.h>
#include <linux/irq.h>
#include <linux/irqreturn.h>
#include <linux/reset.h>
#include <linux/slab.h>
#include <linux/platform_device.h>

#define TIMER_IRQ_EN_REG			0x00
#define TIMER_IRQ_EN(val)			BIT(val)
#define TIMER_IRQ_ST_REG			0x04
#define TIMER_CTL_REG(val, offset)		(0x20 * (val) + 0x10 + (offset))
#define TIMER_CTL_ENABLE			BIT(0)
#define TIMER_CTL_RELOAD			BIT(1)
#define TIMER_CTL_CLK_PRES(val)			(((val) & 0x7) << 4)
#define TIMER_CTL_ONESHOT			BIT(7)
#define TIMER_INTVAL_LO_REG(val, offset)	(0x20 * (val) + 0x14 + (offset))
#define TIMER_INTVAL_HI_REG(val, offset)	(0x20 * (val) + 0x18 + (offset))
#define TIMER_CNTVAL_LO_REG(val, offset)	(0x20 * (val) + 0x1c + (offset))
#define TIMER_CNTVAL_HI_REG(val, offset)	(0x20 * (val) + 0x20 + (offset))

#define TIMER_SYNC_TICKS	3

/**
 * struct sunxi_timer_quirks - Differences between SoC variants.
 *
 * @from_ctl_base_offset: offset applied from ctl register onwards
 */
struct sunxi_timer_quirks {
	u32 from_ctl_base_offset;
};

struct sun5i_timer {
	void __iomem		*base;
	struct clk		*clk;
	struct notifier_block	clk_rate_cb;
	u32			ticks_per_jiffy;
	struct clocksource	clksrc;
	struct clock_event_device	clkevt;
	const struct sunxi_timer_quirks *quirks;
};

#define nb_to_sun5i_timer(x) \
	container_of(x, struct sun5i_timer, clk_rate_cb)
#define clksrc_to_sun5i_timer(x) \
	container_of(x, struct sun5i_timer, clksrc)
#define clkevt_to_sun5i_timer(x) \
	container_of(x, struct sun5i_timer, clkevt)

/*
 * When we disable a timer, we need to wait at least for 2 cycles of
 * the timer source clock. We will use for that the clocksource timer
 * that is already setup and runs at the same frequency than the other
 * timers, and we never will be disabled.
 */
static void sun5i_clkevt_sync(struct sun5i_timer *ce)
{
	u32 offset = ce->quirks->from_ctl_base_offset;
	u32 old = readl(ce->base + TIMER_CNTVAL_LO_REG(1, offset));

	while ((old - readl(ce->base + TIMER_CNTVAL_LO_REG(1, offset))) <
	       TIMER_SYNC_TICKS)
		cpu_relax();
}

static void sun5i_clkevt_time_stop(struct sun5i_timer *ce, u8 timer)
{
	u32 offset = ce->quirks->from_ctl_base_offset;
	u32 val = readl(ce->base + TIMER_CTL_REG(timer, offset));

	writel(val & ~TIMER_CTL_ENABLE,
	       ce->base + TIMER_CTL_REG(timer, offset));

	sun5i_clkevt_sync(ce);
}

static void sun5i_clkevt_time_setup(struct sun5i_timer *ce, u8 timer, u32 delay)
{
	u32 offset = ce->quirks->from_ctl_base_offset;

	writel(delay, ce->base + TIMER_INTVAL_LO_REG(timer, offset));
}

static void sun5i_clkevt_time_start(struct sun5i_timer *ce, u8 timer, bool periodic)
{
	u32 offset = ce->quirks->from_ctl_base_offset;
	u32 val = readl(ce->base + TIMER_CTL_REG(timer, offset));

	if (periodic)
		val &= ~TIMER_CTL_ONESHOT;
	else
		val |= TIMER_CTL_ONESHOT;

	writel(val | TIMER_CTL_ENABLE | TIMER_CTL_RELOAD,
	       ce->base + TIMER_CTL_REG(timer, offset));
}

static int sun5i_clkevt_shutdown(struct clock_event_device *clkevt)
{
	struct sun5i_timer *ce = clkevt_to_sun5i_timer(clkevt);

	sun5i_clkevt_time_stop(ce, 0);
	return 0;
}

static int sun5i_clkevt_set_oneshot(struct clock_event_device *clkevt)
{
	struct sun5i_timer *ce = clkevt_to_sun5i_timer(clkevt);

	sun5i_clkevt_time_stop(ce, 0);
	sun5i_clkevt_time_start(ce, 0, false);
	return 0;
}

static int sun5i_clkevt_set_periodic(struct clock_event_device *clkevt)
{
	struct sun5i_timer *ce = clkevt_to_sun5i_timer(clkevt);

	sun5i_clkevt_time_stop(ce, 0);
	sun5i_clkevt_time_setup(ce, 0, ce->ticks_per_jiffy);
	sun5i_clkevt_time_start(ce, 0, true);
	return 0;
}

static int sun5i_clkevt_next_event(unsigned long evt,
				   struct clock_event_device *clkevt)
{
	struct sun5i_timer *ce = clkevt_to_sun5i_timer(clkevt);

	sun5i_clkevt_time_stop(ce, 0);
	sun5i_clkevt_time_setup(ce, 0, evt - TIMER_SYNC_TICKS);
	sun5i_clkevt_time_start(ce, 0, false);

	return 0;
}

static irqreturn_t sun5i_timer_interrupt(int irq, void *dev_id)
{
	struct sun5i_timer *ce = dev_id;

	writel(0x1, ce->base + TIMER_IRQ_ST_REG);
	ce->clkevt.event_handler(&ce->clkevt);

	return IRQ_HANDLED;
}

static u64 sun5i_clksrc_read(struct clocksource *clksrc)
{
	struct sun5i_timer *cs = clksrc_to_sun5i_timer(clksrc);
	u32 offset = cs->quirks->from_ctl_base_offset;

	return ~readl(cs->base + TIMER_CNTVAL_LO_REG(1, offset));
}

static int sun5i_rate_cb(struct notifier_block *nb,
			 unsigned long event, void *data)
{
	struct clk_notifier_data *ndata = data;
	struct sun5i_timer *cs = nb_to_sun5i_timer(nb);

	switch (event) {
	case PRE_RATE_CHANGE:
		clocksource_unregister(&cs->clksrc);
		break;

	case POST_RATE_CHANGE:
		clocksource_register_hz(&cs->clksrc, ndata->new_rate);
		clockevents_update_freq(&cs->clkevt, ndata->new_rate);
		cs->ticks_per_jiffy = DIV_ROUND_UP(ndata->new_rate, HZ);
		break;

	default:
		break;
	}

	return NOTIFY_DONE;
}

static int sun5i_setup_clocksource(struct platform_device *pdev,
				   unsigned long rate)
{
	struct sun5i_timer *cs = platform_get_drvdata(pdev);
	u32 offset = cs->quirks->from_ctl_base_offset;
	void __iomem *base = cs->base;
	int ret;

	writel(~0, base + TIMER_INTVAL_LO_REG(1, offset));
	writel(TIMER_CTL_ENABLE | TIMER_CTL_RELOAD,
	       base + TIMER_CTL_REG(1, offset));

	cs->clksrc.name = pdev->dev.of_node->name;
	cs->clksrc.rating = 340;
	cs->clksrc.read = sun5i_clksrc_read;
	cs->clksrc.mask = CLOCKSOURCE_MASK(32);
	cs->clksrc.flags = CLOCK_SOURCE_IS_CONTINUOUS;
	cs->clksrc.owner = THIS_MODULE;

	ret = clocksource_register_hz(&cs->clksrc, rate);
	if (ret) {
		dev_err(&pdev->dev, "Couldn't register clock source.\n");
		return ret;
	}

	return 0;
}

static int sun5i_setup_clockevent(struct platform_device *pdev,
				  unsigned long rate, int irq)
{
	struct device *dev = &pdev->dev;
	struct sun5i_timer *ce = platform_get_drvdata(pdev);
	void __iomem *base = ce->base;
	int ret;
	u32 val;

	ce->clkevt.name = dev->of_node->name;
	ce->clkevt.features = CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT;
	ce->clkevt.set_next_event = sun5i_clkevt_next_event;
	ce->clkevt.set_state_shutdown = sun5i_clkevt_shutdown;
	ce->clkevt.set_state_periodic = sun5i_clkevt_set_periodic;
	ce->clkevt.set_state_oneshot = sun5i_clkevt_set_oneshot;
	ce->clkevt.tick_resume = sun5i_clkevt_shutdown;
	ce->clkevt.rating = 340;
	ce->clkevt.irq = irq;
	ce->clkevt.cpumask = cpu_possible_mask;
	ce->clkevt.owner = THIS_MODULE;

	/* Enable timer0 interrupt */
	val = readl(base + TIMER_IRQ_EN_REG);
	writel(val | TIMER_IRQ_EN(0), base + TIMER_IRQ_EN_REG);

	clockevents_config_and_register(&ce->clkevt, rate,
					TIMER_SYNC_TICKS, 0xffffffff);

	ret = devm_request_irq(dev, irq, sun5i_timer_interrupt,
			       IRQF_TIMER | IRQF_IRQPOLL,
			       "sun5i_timer0", ce);
	if (ret) {
		dev_err(dev, "Unable to register interrupt\n");
		return ret;
	}

	return 0;
}

static int sun5i_timer_probe(struct platform_device *pdev)
{
	const struct sunxi_timer_quirks *quirks;
	struct device *dev = &pdev->dev;
	struct sun5i_timer *st;
	struct reset_control *rstc;
	void __iomem *timer_base;
	struct clk *clk;
	unsigned long rate;
	int irq, ret;

	st = devm_kzalloc(dev, sizeof(*st), GFP_KERNEL);
	if (!st)
		return -ENOMEM;

	platform_set_drvdata(pdev, st);

	timer_base = devm_platform_ioremap_resource(pdev, 0);
	if (IS_ERR(timer_base)) {
		dev_err(dev, "Can't map registers\n");
		return PTR_ERR(timer_base);
	}

	irq = platform_get_irq(pdev, 0);
	if (irq < 0)
		return irq;

	clk = devm_clk_get_enabled(dev, NULL);
	if (IS_ERR(clk)) {
		dev_err(dev, "Can't get timer clock\n");
		return PTR_ERR(clk);
	}

	rate = clk_get_rate(clk);
	if (!rate) {
		dev_err(dev, "Couldn't get parent clock rate\n");
		return -EINVAL;
	}

	quirks = of_device_get_match_data(&pdev->dev);
	if (!quirks) {
		dev_err(&pdev->dev, "Failed to determine the quirks to use\n");
		return -ENODEV;
	}

	st->base = timer_base;
	st->ticks_per_jiffy = DIV_ROUND_UP(rate, HZ);
	st->clk = clk;
	st->clk_rate_cb.notifier_call = sun5i_rate_cb;
	st->clk_rate_cb.next = NULL;
	st->quirks = quirks;

	ret = devm_clk_notifier_register(dev, clk, &st->clk_rate_cb);
	if (ret) {
		dev_err(dev, "Unable to register clock notifier.\n");
		return ret;
	}

	rstc = devm_reset_control_get_optional_exclusive(dev, NULL);
	if (IS_ERR(rstc))
		return dev_err_probe(dev, PTR_ERR(rstc),
				     "failed to get reset\n");
	if (rstc)
		reset_control_deassert(rstc);

	ret = sun5i_setup_clocksource(pdev, rate);
	if (ret)
		return ret;

	ret = sun5i_setup_clockevent(pdev, rate, irq);
	if (ret)
		goto err_unreg_clocksource;

	return 0;

err_unreg_clocksource:
	clocksource_unregister(&st->clksrc);
	return ret;
}

static void sun5i_timer_remove(struct platform_device *pdev)
{
	struct sun5i_timer *st = platform_get_drvdata(pdev);

	clocksource_unregister(&st->clksrc);
}

static const struct sunxi_timer_quirks sun5i_sun7i_hstimer_quirks = {
	.from_ctl_base_offset = 0x0,
};

static const struct sunxi_timer_quirks sun20i_d1_hstimer_quirks = {
	.from_ctl_base_offset = 0x10,
};

static const struct of_device_id sun5i_timer_of_match[] = {
	{
		.compatible = "allwinner,sun5i-a13-hstimer",
		.data = &sun5i_sun7i_hstimer_quirks,
	},
	{
		.compatible = "allwinner,sun7i-a20-hstimer",
		.data = &sun5i_sun7i_hstimer_quirks,
	},
	{
		.compatible = "allwinner,sun20i-d1-hstimer",
		.data = &sun20i_d1_hstimer_quirks,
	},
	{},
};
MODULE_DEVICE_TABLE(of, sun5i_timer_of_match);

static struct platform_driver sun5i_timer_driver = {
	.probe		= sun5i_timer_probe,
	.remove		= sun5i_timer_remove,
	.driver	= {
		.name	= "sun5i-timer",
		.of_match_table = sun5i_timer_of_match,
		.suppress_bind_attrs = true,
	},
};
module_platform_driver(sun5i_timer_driver);
