// SPDX-License-Identifier: GPL-2.0
/*
 * Copyright (C) STMicroelectronics 2018 - All Rights Reserved
 * Author: David Hernandez Sanchez <david.hernandezsanchez@st.com> for
 * STMicroelectronics.
 */

#include <linux/clk.h>
#include <linux/clk-provider.h>
#include <linux/delay.h>
#include <linux/err.h>
#include <linux/interrupt.h>
#include <linux/io.h>
#include <linux/iopoll.h>
#include <linux/module.h>
#include <linux/of.h>
#include <linux/of_address.h>
#include <linux/of_device.h>
#include <linux/platform_device.h>
#include <linux/thermal.h>

#include "../thermal_core.h"
#include "../thermal_hwmon.h"

/* DTS register offsets */
#define DTS_CFGR1_OFFSET	0x0
#define DTS_T0VALR1_OFFSET	0x8
#define DTS_RAMPVALR_OFFSET	0X10
#define DTS_ITR1_OFFSET		0x14
#define DTS_DR_OFFSET		0x1C
#define DTS_SR_OFFSET		0x20
#define DTS_ITENR_OFFSET	0x24
#define DTS_CIFR_OFFSET		0x28

/* DTS_CFGR1 register mask definitions */
#define HSREF_CLK_DIV_MASK	GENMASK(30, 24)
#define TS1_SMP_TIME_MASK	GENMASK(19, 16)
#define TS1_INTRIG_SEL_MASK	GENMASK(11, 8)

/* DTS_T0VALR1 register mask definitions */
#define TS1_T0_MASK		GENMASK(17, 16)
#define TS1_FMT0_MASK		GENMASK(15, 0)

/* DTS_RAMPVALR register mask definitions */
#define TS1_RAMP_COEFF_MASK	GENMASK(15, 0)

/* DTS_ITR1 register mask definitions */
#define TS1_HITTHD_MASK		GENMASK(31, 16)
#define TS1_LITTHD_MASK		GENMASK(15, 0)

/* DTS_DR register mask definitions */
#define TS1_MFREQ_MASK		GENMASK(15, 0)

/* Less significant bit position definitions */
#define TS1_T0_POS		16
#define TS1_SMP_TIME_POS	16
#define TS1_HITTHD_POS		16
#define HSREF_CLK_DIV_POS	24

/* DTS_CFGR1 bit definitions */
#define TS1_EN			BIT(0)
#define TS1_START		BIT(4)
#define REFCLK_SEL		BIT(20)
#define REFCLK_LSE		REFCLK_SEL
#define Q_MEAS_OPT		BIT(21)
#define CALIBRATION_CONTROL	Q_MEAS_OPT

/* DTS_SR bit definitions */
#define TS_RDY			BIT(15)
/* Bit definitions below are common for DTS_SR, DTS_ITENR and DTS_CIFR */
#define HIGH_THRESHOLD		BIT(2)
#define LOW_THRESHOLD		BIT(1)

/* Constants */
#define ADJUST			100
#define ONE_MHZ			1000000
#define POLL_TIMEOUT		5000
#define STARTUP_TIME		40
#define TS1_T0_VAL0		30
#define TS1_T0_VAL1		130
#define NO_HW_TRIG		0

/* The Thermal Framework expects millidegrees */
#define mcelsius(temp)		((temp) * 1000)

/* The Sensor expects oC degrees */
#define celsius(temp)		((temp) / 1000)

struct stm_thermal_sensor {
	struct device *dev;
	struct thermal_zone_device *th_dev;
	enum thermal_device_mode mode;
	struct clk *clk;
	int high_temp;
	int low_temp;
	int temp_critical;
	int temp_passive;
	unsigned int low_temp_enabled;
	int num_trips;
	int irq;
	unsigned int irq_enabled;
	void __iomem *base;
	int t0, fmt0, ramp_coeff;
};

static irqreturn_t stm_thermal_alarm_irq(int irq, void *sdata)
{
	struct stm_thermal_sensor *sensor = sdata;

	disable_irq_nosync(irq);
	sensor->irq_enabled = false;

	return IRQ_WAKE_THREAD;
}

static irqreturn_t stm_thermal_alarm_irq_thread(int irq, void *sdata)
{
	u32 value;
	struct stm_thermal_sensor *sensor = sdata;

	/* read IT reason in SR and clear flags */
	value = readl_relaxed(sensor->base + DTS_SR_OFFSET);

	if ((value & LOW_THRESHOLD) == LOW_THRESHOLD)
		writel_relaxed(LOW_THRESHOLD, sensor->base + DTS_CIFR_OFFSET);

	if ((value & HIGH_THRESHOLD) == HIGH_THRESHOLD)
		writel_relaxed(HIGH_THRESHOLD, sensor->base + DTS_CIFR_OFFSET);

	thermal_zone_device_update(sensor->th_dev, THERMAL_EVENT_UNSPECIFIED);

	return IRQ_HANDLED;
}

static int stm_sensor_power_on(struct stm_thermal_sensor *sensor)
{
	int ret;
	u32 value;

	/* Enable sensor */
	value = readl_relaxed(sensor->base + DTS_CFGR1_OFFSET);
	value |= TS1_EN;
	writel_relaxed(value, sensor->base + DTS_CFGR1_OFFSET);

	/*
	 * The DTS block can be enabled by setting TSx_EN bit in
	 * DTS_CFGRx register. It requires a startup time of
	 * 40μs. Use 5 ms as arbitrary timeout.
	 */
	ret = readl_poll_timeout(sensor->base + DTS_SR_OFFSET,
				 value, (value & TS_RDY),
				 STARTUP_TIME, POLL_TIMEOUT);
	if (ret)
		return ret;

	/* Start continuous measuring */
	value = readl_relaxed(sensor->base +
			      DTS_CFGR1_OFFSET);
	value |= TS1_START;
	writel_relaxed(value, sensor->base +
		       DTS_CFGR1_OFFSET);

	return 0;
}

static int stm_sensor_power_off(struct stm_thermal_sensor *sensor)
{
	u32 value;

	/* Stop measuring */
	value = readl_relaxed(sensor->base + DTS_CFGR1_OFFSET);
	value &= ~TS1_START;
	writel_relaxed(value, sensor->base + DTS_CFGR1_OFFSET);

	/* Ensure stop is taken into account */
	usleep_range(STARTUP_TIME, POLL_TIMEOUT);

	/* Disable sensor */
	value = readl_relaxed(sensor->base + DTS_CFGR1_OFFSET);
	value &= ~TS1_EN;
	writel_relaxed(value, sensor->base + DTS_CFGR1_OFFSET);

	/* Ensure disable is taken into account */
	return readl_poll_timeout(sensor->base + DTS_SR_OFFSET, value,
				  !(value & TS_RDY),
				  STARTUP_TIME, POLL_TIMEOUT);
}

static int stm_thermal_calibration(struct stm_thermal_sensor *sensor)
{
	u32 value, clk_freq;
	u32 prescaler;

	/* Figure out prescaler value for PCLK during calibration */
	clk_freq = clk_get_rate(sensor->clk);
	if (!clk_freq)
		return -EINVAL;

	prescaler = 0;
	clk_freq /= ONE_MHZ;
	if (clk_freq) {
		while (prescaler <= clk_freq)
			prescaler++;
	}

	value = readl_relaxed(sensor->base + DTS_CFGR1_OFFSET);

	/* Clear prescaler */
	value &= ~HSREF_CLK_DIV_MASK;

	/* Set prescaler. pclk_freq/prescaler < 1MHz */
	value |= (prescaler << HSREF_CLK_DIV_POS);

	/* Select PCLK as reference clock */
	value &= ~REFCLK_SEL;

	/* Set maximal sampling time for better precision */
	value |= TS1_SMP_TIME_MASK;

	/* Measure with calibration */
	value &= ~CALIBRATION_CONTROL;

	/* select trigger */
	value &= ~TS1_INTRIG_SEL_MASK;
	value |= NO_HW_TRIG;

	writel_relaxed(value, sensor->base + DTS_CFGR1_OFFSET);

	return 0;
}

/* Fill in DTS structure with factory sensor values */
static int stm_thermal_read_factory_settings(struct stm_thermal_sensor *sensor)
{
	/* Retrieve engineering calibration temperature */
	sensor->t0 = readl_relaxed(sensor->base + DTS_T0VALR1_OFFSET) &
					TS1_T0_MASK;
	if (!sensor->t0)
		sensor->t0 = TS1_T0_VAL0;
	else
		sensor->t0 = TS1_T0_VAL1;

	/* Retrieve fmt0 and put it on Hz */
	sensor->fmt0 = ADJUST * (readl_relaxed(sensor->base +
				 DTS_T0VALR1_OFFSET) & TS1_FMT0_MASK);

	/* Retrieve ramp coefficient */
	sensor->ramp_coeff = readl_relaxed(sensor->base + DTS_RAMPVALR_OFFSET) &
					   TS1_RAMP_COEFF_MASK;

	if (!sensor->fmt0 || !sensor->ramp_coeff) {
		dev_err(sensor->dev, "%s: wrong setting\n", __func__);
		return -EINVAL;
	}

	dev_dbg(sensor->dev, "%s: T0 = %doC, FMT0 = %dHz, RAMP_COEFF = %dHz/oC",
		__func__, sensor->t0, sensor->fmt0, sensor->ramp_coeff);

	return 0;
}

static int stm_thermal_calculate_threshold(struct stm_thermal_sensor *sensor,
					   int temp, u32 *th)
{
	int freqM;
	u32 sampling_time;

	/* Retrieve the number of periods to sample */
	sampling_time = (readl_relaxed(sensor->base + DTS_CFGR1_OFFSET) &
			TS1_SMP_TIME_MASK) >> TS1_SMP_TIME_POS;

	/* Figure out the CLK_PTAT frequency for a given temperature */
	freqM = ((temp - sensor->t0) * sensor->ramp_coeff)
		 + sensor->fmt0;

	dev_dbg(sensor->dev, "%s: freqM for threshold = %d Hz",
		__func__, freqM);

	/* Figure out the threshold sample number */
	*th = clk_get_rate(sensor->clk);
	if (!*th)
		return -EINVAL;

	*th = *th / freqM;

	*th *= sampling_time;

	return 0;
}

static int stm_thermal_set_threshold(struct stm_thermal_sensor *sensor)
{
	u32 value, th;
	int ret;

	value = readl_relaxed(sensor->base + DTS_ITR1_OFFSET);

	/* Erase threshold content */
	value &= ~(TS1_LITTHD_MASK | TS1_HITTHD_MASK);

	/* Retrieve the sample threshold number th for a given temperature */
	ret = stm_thermal_calculate_threshold(sensor, sensor->high_temp, &th);
	if (ret)
		return ret;

	value |= th & TS1_LITTHD_MASK;

	if (sensor->low_temp_enabled) {
		/* Retrieve the sample threshold */
		ret = stm_thermal_calculate_threshold(sensor, sensor->low_temp,
						      &th);
		if (ret)
			return ret;

		value |= (TS1_HITTHD_MASK  & (th << TS1_HITTHD_POS));
	}

	/* Write value on the Low interrupt threshold */
	writel_relaxed(value, sensor->base + DTS_ITR1_OFFSET);

	return 0;
}

/* Disable temperature interrupt */
static int stm_disable_irq(struct stm_thermal_sensor *sensor)
{
	u32 value;

	/* Disable IT generation for low and high thresholds */
	value = readl_relaxed(sensor->base + DTS_ITENR_OFFSET);
	writel_relaxed(value & ~(LOW_THRESHOLD | HIGH_THRESHOLD),
		       sensor->base + DTS_ITENR_OFFSET);

	dev_dbg(sensor->dev, "%s: IT disabled on sensor side", __func__);

	return 0;
}

/* Enable temperature interrupt */
static int stm_enable_irq(struct stm_thermal_sensor *sensor)
{
	u32 value;

	/*
	 * Code below enables High temperature threshold using a low threshold
	 * sampling value
	 */

	/* Make sure LOW_THRESHOLD IT is clear before enabling */
	writel_relaxed(LOW_THRESHOLD, sensor->base + DTS_CIFR_OFFSET);

	/* Enable IT generation for low threshold */
	value = readl_relaxed(sensor->base + DTS_ITENR_OFFSET);
	value |= LOW_THRESHOLD;

	/* Enable the low temperature threshold if needed */
	if (sensor->low_temp_enabled) {
		/* Make sure HIGH_THRESHOLD IT is clear before enabling */
		writel_relaxed(HIGH_THRESHOLD, sensor->base + DTS_CIFR_OFFSET);

		/* Enable IT generation for high threshold */
		value |= HIGH_THRESHOLD;
	}

	/* Enable thresholds */
	writel_relaxed(value, sensor->base + DTS_ITENR_OFFSET);

	dev_dbg(sensor->dev, "%s: IT enabled on sensor side", __func__);

	return 0;
}

static int stm_thermal_update_threshold(struct stm_thermal_sensor *sensor)
{
	int ret;

	sensor->mode = THERMAL_DEVICE_DISABLED;

	ret = stm_sensor_power_off(sensor);
	if (ret)
		return ret;

	ret = stm_disable_irq(sensor);
	if (ret)
		return ret;

	ret = stm_thermal_set_threshold(sensor);
	if (ret)
		return ret;

	ret = stm_enable_irq(sensor);
	if (ret)
		return ret;

	ret = stm_sensor_power_on(sensor);
	if (ret)
		return ret;

	sensor->mode = THERMAL_DEVICE_ENABLED;

	return 0;
}

/* Callback to get temperature from HW */
static int stm_thermal_get_temp(void *data, int *temp)
{
	struct stm_thermal_sensor *sensor = data;
	u32 sampling_time;
	int freqM, ret;

	if (sensor->mode != THERMAL_DEVICE_ENABLED)
		return -EAGAIN;

	/* Retrieve the number of samples */
	ret = readl_poll_timeout(sensor->base + DTS_DR_OFFSET, freqM,
				 (freqM & TS1_MFREQ_MASK), STARTUP_TIME,
				 POLL_TIMEOUT);

	if (ret)
		return ret;

	if (!freqM)
		return -ENODATA;

	/* Retrieve the number of periods sampled */
	sampling_time = (readl_relaxed(sensor->base + DTS_CFGR1_OFFSET) &
			TS1_SMP_TIME_MASK) >> TS1_SMP_TIME_POS;

	/* Figure out the number of samples per period */
	freqM /= sampling_time;

	/* Figure out the CLK_PTAT frequency */
	freqM = clk_get_rate(sensor->clk) / freqM;
	if (!freqM)
		return -EINVAL;

	dev_dbg(sensor->dev, "%s: freqM=%d\n", __func__, freqM);

	/* Figure out the temperature in mili celsius */
	*temp = mcelsius(sensor->t0 + ((freqM - sensor->fmt0) /
			 sensor->ramp_coeff));

	dev_dbg(sensor->dev, "%s: temperature = %d millicelsius",
		__func__, *temp);

	/* Update thresholds */
	if (sensor->num_trips > 1) {
		/* Update alarm threshold value to next higher trip point */
		if (sensor->high_temp == sensor->temp_passive &&
		    celsius(*temp) >= sensor->temp_passive) {
			sensor->high_temp = sensor->temp_critical;
			sensor->low_temp = sensor->temp_passive;
			sensor->low_temp_enabled = true;
			ret = stm_thermal_update_threshold(sensor);
			if (ret)
				return ret;
		}

		if (sensor->high_temp == sensor->temp_critical &&
		    celsius(*temp) < sensor->temp_passive) {
			sensor->high_temp = sensor->temp_passive;
			sensor->low_temp_enabled = false;
			ret = stm_thermal_update_threshold(sensor);
			if (ret)
				return ret;
		}

		/*
		 * Re-enable alarm IRQ if temperature below critical
		 * temperature
		 */
		if (!sensor->irq_enabled &&
		    (celsius(*temp) < sensor->temp_critical)) {
			sensor->irq_enabled = true;
			enable_irq(sensor->irq);
		}
	}

	return 0;
}

/* Registers DTS irq to be visible by GIC */
static int stm_register_irq(struct stm_thermal_sensor *sensor)
{
	struct device *dev = sensor->dev;
	struct platform_device *pdev = to_platform_device(dev);
	int ret;

	sensor->irq = platform_get_irq(pdev, 0);
	if (sensor->irq < 0) {
		dev_err(dev, "%s: Unable to find IRQ\n", __func__);
		return sensor->irq;
	}

	ret = devm_request_threaded_irq(dev, sensor->irq,
					stm_thermal_alarm_irq,
					stm_thermal_alarm_irq_thread,
					IRQF_ONESHOT,
					dev->driver->name, sensor);
	if (ret) {
		dev_err(dev, "%s: Failed to register IRQ %d\n", __func__,
			sensor->irq);
		return ret;
	}

	sensor->irq_enabled = true;

	dev_dbg(dev, "%s: thermal IRQ registered", __func__);

	return 0;
}

static int stm_thermal_sensor_off(struct stm_thermal_sensor *sensor)
{
	int ret;

	ret = stm_sensor_power_off(sensor);
	if (ret)
		return ret;

	clk_disable_unprepare(sensor->clk);

	return 0;
}

static int stm_thermal_prepare(struct stm_thermal_sensor *sensor)
{
	int ret;
	struct device *dev = sensor->dev;

	ret = clk_prepare_enable(sensor->clk);
	if (ret)
		return ret;

	ret = stm_thermal_read_factory_settings(sensor);
	if (ret)
		goto thermal_unprepare;

	ret = stm_thermal_calibration(sensor);
	if (ret)
		goto thermal_unprepare;

	/* Set threshold(s) for IRQ */
	ret = stm_thermal_set_threshold(sensor);
	if (ret)
		goto thermal_unprepare;

	ret = stm_enable_irq(sensor);
	if (ret)
		goto thermal_unprepare;

	ret = stm_sensor_power_on(sensor);
	if (ret) {
		dev_err(dev, "%s: failed to power on sensor\n", __func__);
		goto irq_disable;
	}

	return 0;

irq_disable:
	stm_disable_irq(sensor);

thermal_unprepare:
	clk_disable_unprepare(sensor->clk);

	return ret;
}

#ifdef CONFIG_PM_SLEEP
static int stm_thermal_suspend(struct device *dev)
{
	int ret;
	struct platform_device *pdev = to_platform_device(dev);
	struct stm_thermal_sensor *sensor = platform_get_drvdata(pdev);

	ret = stm_thermal_sensor_off(sensor);
	if (ret)
		return ret;

	sensor->mode = THERMAL_DEVICE_DISABLED;

	return 0;
}

static int stm_thermal_resume(struct device *dev)
{
	int ret;
	struct platform_device *pdev = to_platform_device(dev);
	struct stm_thermal_sensor *sensor = platform_get_drvdata(pdev);

	ret = stm_thermal_prepare(sensor);
	if (ret)
		return ret;

	sensor->mode = THERMAL_DEVICE_ENABLED;

	return 0;
}
#endif /* CONFIG_PM_SLEEP */

SIMPLE_DEV_PM_OPS(stm_thermal_pm_ops, stm_thermal_suspend, stm_thermal_resume);

static const struct thermal_zone_of_device_ops stm_tz_ops = {
	.get_temp	= stm_thermal_get_temp,
};

static const struct of_device_id stm_thermal_of_match[] = {
		{ .compatible = "st,stm32-thermal"},
	{ /* sentinel */ }
};
MODULE_DEVICE_TABLE(of, stm_thermal_of_match);

static int stm_thermal_probe(struct platform_device *pdev)
{
	struct stm_thermal_sensor *sensor;
	struct resource *res;
	const struct thermal_trip *trip;
	void __iomem *base;
	int ret, i;

	if (!pdev->dev.of_node) {
		dev_err(&pdev->dev, "%s: device tree node not found\n",
			__func__);
		return -EINVAL;
	}

	sensor = devm_kzalloc(&pdev->dev, sizeof(*sensor), GFP_KERNEL);
	if (!sensor)
		return -ENOMEM;

	platform_set_drvdata(pdev, sensor);

	sensor->dev = &pdev->dev;

	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
	base = devm_ioremap_resource(&pdev->dev, res);
	if (IS_ERR(base))
		return PTR_ERR(base);

	/* Populate sensor */
	sensor->base = base;

	sensor->clk = devm_clk_get(&pdev->dev, "pclk");
	if (IS_ERR(sensor->clk)) {
		dev_err(&pdev->dev, "%s: failed to fetch PCLK clock\n",
			__func__);
		return PTR_ERR(sensor->clk);
	}

	/* Register IRQ into GIC */
	ret = stm_register_irq(sensor);
	if (ret)
		return ret;

	sensor->th_dev = devm_thermal_zone_of_sensor_register(&pdev->dev, 0,
							      sensor,
							      &stm_tz_ops);

	if (IS_ERR(sensor->th_dev)) {
		dev_err(&pdev->dev, "%s: thermal zone sensor registering KO\n",
			__func__);
		ret = PTR_ERR(sensor->th_dev);
		return ret;
	}

	if (!sensor->th_dev->ops->get_crit_temp) {
		/* Critical point must be provided */
		ret = -EINVAL;
		goto err_tz;
	}

	ret = sensor->th_dev->ops->get_crit_temp(sensor->th_dev,
			&sensor->temp_critical);
	if (ret) {
		dev_err(&pdev->dev,
			"Not able to read critical_temp: %d\n", ret);
		goto err_tz;
	}

	sensor->temp_critical = celsius(sensor->temp_critical);

	/* Set thresholds for IRQ */
	sensor->high_temp = sensor->temp_critical;

	trip = of_thermal_get_trip_points(sensor->th_dev);
	sensor->num_trips = of_thermal_get_ntrips(sensor->th_dev);

	/* Find out passive temperature if it exists */
	for (i = (sensor->num_trips - 1); i >= 0;  i--) {
		if (trip[i].type == THERMAL_TRIP_PASSIVE) {
			sensor->temp_passive = celsius(trip[i].temperature);
			/* Update high temperature threshold */
			sensor->high_temp = sensor->temp_passive;
			}
	}

	/*
	 * Ensure low_temp_enabled flag is disabled.
	 * By disabling low_temp_enabled, low threshold IT will not be
	 * configured neither enabled because it is not needed as high
	 * threshold is set on the lowest temperature trip point after
	 * probe.
	 */
	sensor->low_temp_enabled = false;

	/* Configure and enable HW sensor */
	ret = stm_thermal_prepare(sensor);
	if (ret) {
		dev_err(&pdev->dev,
			"Not able to enable sensor: %d\n", ret);
		goto err_tz;
	}

	/*
	 * Thermal_zone doesn't enable hwmon as default,
	 * enable it here
	 */
	sensor->th_dev->tzp->no_hwmon = false;
	ret = thermal_add_hwmon_sysfs(sensor->th_dev);
	if (ret)
		goto err_tz;

	sensor->mode = THERMAL_DEVICE_ENABLED;

	dev_info(&pdev->dev, "%s: Driver initialized successfully\n",
		 __func__);

	return 0;

err_tz:
	thermal_zone_of_sensor_unregister(&pdev->dev, sensor->th_dev);
	return ret;
}

static int stm_thermal_remove(struct platform_device *pdev)
{
	struct stm_thermal_sensor *sensor = platform_get_drvdata(pdev);

	stm_thermal_sensor_off(sensor);
	thermal_remove_hwmon_sysfs(sensor->th_dev);
	thermal_zone_of_sensor_unregister(&pdev->dev, sensor->th_dev);

	return 0;
}

static struct platform_driver stm_thermal_driver = {
	.driver = {
		.name	= "stm_thermal",
		.pm     = &stm_thermal_pm_ops,
		.of_match_table = stm_thermal_of_match,
	},
	.probe		= stm_thermal_probe,
	.remove		= stm_thermal_remove,
};
module_platform_driver(stm_thermal_driver);

MODULE_DESCRIPTION("STMicroelectronics STM32 Thermal Sensor Driver");
MODULE_AUTHOR("David Hernandez Sanchez <david.hernandezsanchez@st.com>");
MODULE_LICENSE("GPL v2");
MODULE_ALIAS("platform:stm_thermal");
