diff options
author | Ryo Kataoka <ryo.kataoka.wt@renesas.com> | 2019-07-11 21:17:14 +0900 |
---|---|---|
committer | Ryo Kataoka <ryo.kataoka.wt@renesas.com> | 2019-07-11 21:17:14 +0900 |
commit | 85722b9814d554c968dbf61e2b358941ced4d0b1 (patch) | |
tree | c1ee604e06f6fcecbe389d6b78ecee66266bad31 | |
parent | ce83585d886fe9e329492839bcff4fd06045634c (diff) | |
parent | 6b92f96d09762a9fe172468ed302290cc4046318 (diff) | |
download | renesas-bsp-85722b9814d554c968dbf61e2b358941ced4d0b1.tar.gz |
Merge branch 'rcar-3.9.4/thermal.rc1' into v4.14.75-ltsi/rcar-3.9.6
* rcar-3.9.4/thermal.rc1:
thermal: rcar_gen3_thermal: fix interrupt type
thermal: rcar_gen3_thermal: Fix init value of IRQCTL register
thermal: rcar_gen3_thermal: disable interrupt in .remove
-rw-r--r-- | drivers/thermal/rcar_gen3_thermal.c | 48 |
1 files changed, 12 insertions, 36 deletions
diff --git a/drivers/thermal/rcar_gen3_thermal.c b/drivers/thermal/rcar_gen3_thermal.c index ae17e73d770b9..bba6af707aec4 100644 --- a/drivers/thermal/rcar_gen3_thermal.c +++ b/drivers/thermal/rcar_gen3_thermal.c @@ -24,7 +24,6 @@ #include <linux/of_device.h> #include <linux/platform_device.h> #include <linux/pm_runtime.h> -#include <linux/spinlock.h> #include <linux/sys_soc.h> #include <linux/thermal.h> #include <linux/of.h> @@ -145,7 +144,6 @@ struct rcar_gen3_thermal_tsc { struct rcar_gen3_thermal_priv { struct rcar_gen3_thermal_tsc *tscs[TSC_MAX_NUM]; unsigned int num_tscs; - spinlock_t lock; /* Protect interrupts on and off */ void (*thermal_init)(struct rcar_gen3_thermal_tsc *tsc); }; @@ -397,9 +395,7 @@ static irqreturn_t rcar_gen3_thermal_irq(int irq, void *data) { struct rcar_gen3_thermal_priv *priv = data; u32 status; - int i, ret = IRQ_HANDLED; - - spin_lock(&priv->lock); + int i; if (is_ths_typeA) { for (i = 0; i < priv->num_tscs; i++) { @@ -408,7 +404,8 @@ static irqreturn_t rcar_gen3_thermal_irq(int irq, void *data) rcar_gen3_thermal_write(priv->tscs[i], REG_GEN3_IRQSTR, 0); if (status) - ret = IRQ_WAKE_THREAD; + thermal_zone_device_update(priv->tscs[i]->zone, + THERMAL_EVENT_UNSPECIFIED); } } else { for (i = 0; i < priv->num_tscs; i++) { @@ -417,34 +414,11 @@ static irqreturn_t rcar_gen3_thermal_irq(int irq, void *data) rcar_gen3_thermal_write(priv->tscs[i], REG_GEN3_B_STR, 0); if (status) - ret = IRQ_WAKE_THREAD; + thermal_zone_device_update(priv->tscs[i]->zone, + THERMAL_EVENT_UNSPECIFIED); } } - if (ret == IRQ_WAKE_THREAD) - rcar_thermal_irq_set(priv, false); - - spin_unlock(&priv->lock); - - return ret; -} - -static irqreturn_t rcar_gen3_thermal_irq_thread(int irq, void *data) -{ - struct rcar_gen3_thermal_priv *priv = data; - unsigned long flags; - int i; - - for (i = 0; i < priv->num_tscs; i++) { - rcar_gen3_thermal_set_irq_temp(priv->tscs[i]); - thermal_zone_device_update(priv->tscs[i]->zone, - THERMAL_EVENT_UNSPECIFIED); - } - - spin_lock_irqsave(&priv->lock, flags); - rcar_thermal_irq_set(priv, true); - spin_unlock_irqrestore(&priv->lock, flags); - return IRQ_HANDLED; } @@ -501,7 +475,7 @@ static void rcar_gen3_thermal_init(struct rcar_gen3_thermal_tsc *tsc) usleep_range(1000, 2000); - rcar_gen3_thermal_write(tsc, REG_GEN3_IRQCTL, 0x3F); + 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); @@ -524,6 +498,9 @@ 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); @@ -596,7 +573,6 @@ static int rcar_gen3_thermal_probe(struct platform_device *pdev) iounmap(ptat_base); } - spin_lock_init(&priv->lock); platform_set_drvdata(pdev, priv); @@ -615,9 +591,9 @@ static int rcar_gen3_thermal_probe(struct platform_device *pdev) if (!irqname) return -ENOMEM; - ret = devm_request_threaded_irq(dev, irq, rcar_gen3_thermal_irq, - rcar_gen3_thermal_irq_thread, - IRQF_SHARED, irqname, priv); + ret = devm_request_threaded_irq(dev, irq, NULL, + rcar_gen3_thermal_irq, + IRQF_ONESHOT, irqname, priv); if (ret) return ret; } |