diff options
Diffstat (limited to 'drivers/thermal/rcar_gen3_thermal.c')
-rw-r--r-- | drivers/thermal/rcar_gen3_thermal.c | 115 |
1 files changed, 8 insertions, 107 deletions
diff --git a/drivers/thermal/rcar_gen3_thermal.c b/drivers/thermal/rcar_gen3_thermal.c index 0dd47dca3e77..75c69fe6e955 100644 --- a/drivers/thermal/rcar_gen3_thermal.c +++ b/drivers/thermal/rcar_gen3_thermal.c @@ -60,13 +60,14 @@ #define MCELSIUS(temp) ((temp) * 1000) #define GEN3_FUSE_MASK 0xFFF -#define TSC_MAX_NUM 3 +#define TSC_MAX_NUM 4 /* default THCODE values if FUSEs are missing */ static const int thcodes[TSC_MAX_NUM][3] = { { 3397, 2800, 2221 }, { 3393, 2795, 2216 }, { 3389, 2805, 2237 }, + { 3415, 2694, 2195 }, }; /* Structure for thermal temperature calculation */ @@ -188,70 +189,10 @@ static int rcar_gen3_thermal_get_temp(void *devdata, int *temp) return 0; } -static int rcar_gen3_thermal_mcelsius_to_temp(struct rcar_gen3_thermal_tsc *tsc, - int mcelsius) -{ - int celsius, val; - - celsius = DIV_ROUND_CLOSEST(mcelsius, 1000); - if (celsius <= INT_FIXPT(tsc->tj_t)) - val = celsius * tsc->coef.a1 + tsc->coef.b1; - else - val = celsius * tsc->coef.a2 + tsc->coef.b2; - - return INT_FIXPT(val); -} - -static int rcar_gen3_thermal_update_range(struct rcar_gen3_thermal_tsc *tsc) -{ - int temperature, low, high; - - rcar_gen3_thermal_get_temp(tsc, &temperature); - - low = temperature - MCELSIUS(1); - high = temperature + MCELSIUS(1); - - rcar_gen3_thermal_write(tsc, REG_GEN3_IRQTEMP1, - rcar_gen3_thermal_mcelsius_to_temp(tsc, low)); - - rcar_gen3_thermal_write(tsc, REG_GEN3_IRQTEMP2, - rcar_gen3_thermal_mcelsius_to_temp(tsc, high)); - - return 0; -} - static const struct thermal_zone_of_device_ops rcar_gen3_tz_of_ops = { .get_temp = rcar_gen3_thermal_get_temp, }; -static void rcar_thermal_irq_set(struct rcar_gen3_thermal_priv *priv, bool on) -{ - unsigned int i; - u32 val = on ? IRQ_TEMPD1 | IRQ_TEMP2 : 0; - - for (i = 0; i < priv->num_tscs; i++) - rcar_gen3_thermal_write(priv->tscs[i], REG_GEN3_IRQMSK, val); -} - -static irqreturn_t rcar_gen3_thermal_irq(int irq, void *data) -{ - struct rcar_gen3_thermal_priv *priv = data; - u32 status; - int i; - - for (i = 0; i < priv->num_tscs; i++) { - status = rcar_gen3_thermal_read(priv->tscs[i], REG_GEN3_IRQSTR); - rcar_gen3_thermal_write(priv->tscs[i], REG_GEN3_IRQSTR, 0); - if (status) { - rcar_gen3_thermal_update_range(priv->tscs[i]); - thermal_zone_device_update(priv->tscs[i]->zone, - THERMAL_EVENT_UNSPECIFIED); - } - } - - return IRQ_HANDLED; -} - static const struct soc_device_attribute r8a7795es1[] = { { .soc_id = "r8a7795", .revision = "ES1.*" }, { /* sentinel */ } @@ -268,7 +209,6 @@ static void rcar_gen3_thermal_init_r8a7795es1(struct rcar_gen3_thermal_tsc *tsc) rcar_gen3_thermal_write(tsc, REG_GEN3_IRQCTL, 0x3F); rcar_gen3_thermal_write(tsc, REG_GEN3_IRQMSK, 0); - rcar_gen3_thermal_write(tsc, REG_GEN3_IRQEN, IRQ_TEMPD1 | IRQ_TEMP2); rcar_gen3_thermal_write(tsc, REG_GEN3_CTSR, CTSR_PONM | CTSR_AOUT | CTSR_THBGR | CTSR_VMEN); @@ -294,7 +234,6 @@ static void rcar_gen3_thermal_init(struct rcar_gen3_thermal_tsc *tsc) rcar_gen3_thermal_write(tsc, REG_GEN3_IRQCTL, 0); rcar_gen3_thermal_write(tsc, REG_GEN3_IRQMSK, 0); - rcar_gen3_thermal_write(tsc, REG_GEN3_IRQEN, IRQ_TEMPD1 | IRQ_TEMP2); reg_val = rcar_gen3_thermal_read(tsc, REG_GEN3_THCTR); reg_val |= THCTR_THSST; @@ -338,6 +277,10 @@ static const struct of_device_id rcar_gen3_thermal_dt_ids[] = { .compatible = "renesas,r8a77980-thermal", .data = &rcar_gen3_ths_tj_1, }, + { + .compatible = "renesas,r8a779a0-thermal", + .data = &rcar_gen3_ths_tj_1, + }, {}, }; MODULE_DEVICE_TABLE(of, rcar_gen3_thermal_dt_ids); @@ -345,9 +288,6 @@ MODULE_DEVICE_TABLE(of, rcar_gen3_thermal_dt_ids); static int rcar_gen3_thermal_remove(struct platform_device *pdev) { struct device *dev = &pdev->dev; - struct rcar_gen3_thermal_priv *priv = dev_get_drvdata(dev); - - rcar_thermal_irq_set(priv, false); pm_runtime_put(dev); pm_runtime_disable(dev); @@ -369,8 +309,7 @@ static int rcar_gen3_thermal_probe(struct platform_device *pdev) const int *rcar_gen3_ths_tj_1 = of_device_get_match_data(dev); struct resource *res; struct thermal_zone_device *zone; - int ret, irq, i; - char *irqname; + int ret, i; /* default values if FUSEs are missing */ /* TODO: Read values from hardware on supported platforms */ @@ -386,28 +325,6 @@ static int rcar_gen3_thermal_probe(struct platform_device *pdev) platform_set_drvdata(pdev, priv); - /* - * Request 2 (of the 3 possible) IRQs, the driver only needs to - * to trigger on the low and high trip points of the current - * temp window at this point. - */ - for (i = 0; i < 2; i++) { - irq = platform_get_irq(pdev, i); - if (irq < 0) - return irq; - - irqname = devm_kasprintf(dev, GFP_KERNEL, "%s:ch%d", - dev_name(dev), i); - if (!irqname) - return -ENOMEM; - - ret = devm_request_threaded_irq(dev, irq, NULL, - rcar_gen3_thermal_irq, - IRQF_ONESHOT, irqname, priv); - if (ret) - return ret; - } - pm_runtime_enable(dev); pm_runtime_get_sync(dev); @@ -459,8 +376,6 @@ static int rcar_gen3_thermal_probe(struct platform_device *pdev) if (ret < 0) goto error_unregister; - rcar_gen3_thermal_update_range(tsc); - dev_info(dev, "TSC%d: Loaded %d trip points\n", i, ret); } @@ -471,8 +386,6 @@ static int rcar_gen3_thermal_probe(struct platform_device *pdev) goto error_unregister; } - rcar_thermal_irq_set(priv, true); - return 0; error_unregister: @@ -481,15 +394,6 @@ error_unregister: return ret; } -static int __maybe_unused rcar_gen3_thermal_suspend(struct device *dev) -{ - struct rcar_gen3_thermal_priv *priv = dev_get_drvdata(dev); - - rcar_thermal_irq_set(priv, false); - - return 0; -} - static int __maybe_unused rcar_gen3_thermal_resume(struct device *dev) { struct rcar_gen3_thermal_priv *priv = dev_get_drvdata(dev); @@ -499,15 +403,12 @@ static int __maybe_unused rcar_gen3_thermal_resume(struct device *dev) struct rcar_gen3_thermal_tsc *tsc = priv->tscs[i]; priv->thermal_init(tsc); - rcar_gen3_thermal_update_range(tsc); } - rcar_thermal_irq_set(priv, true); - return 0; } -static SIMPLE_DEV_PM_OPS(rcar_gen3_thermal_pm_ops, rcar_gen3_thermal_suspend, +static SIMPLE_DEV_PM_OPS(rcar_gen3_thermal_pm_ops, NULL, rcar_gen3_thermal_resume); static struct platform_driver rcar_gen3_thermal_driver = { |