Commit 427fbe89 authored by Linus Torvalds's avatar Linus Torvalds

Merge branch 'next' of git://git.kernel.org/pub/scm/linux/kernel/git/rzhang/linux

Pull thermal fixes from Zhang Rui:

 - fix NULL pointer dereference on module load/probe for int3403_thermal
   driver

 - fix an emergency shutdown issue on exynos thermal driver

* 'next' of git://git.kernel.org/pub/scm/linux/kernel/git/rzhang/linux:
  thermal: exynos: Propagate error value from tmu_read()
  thermal: exynos: Reading temperature makes sense only when TMU is turned on
  thermal: int3403_thermal: Fix NULL pointer deref on module load / probe
parents 0d4cafd1 60abce9f
...@@ -194,6 +194,7 @@ static int int3403_cdev_add(struct int3403_priv *priv) ...@@ -194,6 +194,7 @@ static int int3403_cdev_add(struct int3403_priv *priv)
return -EFAULT; return -EFAULT;
} }
priv->priv = obj;
obj->max_state = p->package.count - 1; obj->max_state = p->package.count - 1;
obj->cdev = obj->cdev =
thermal_cooling_device_register(acpi_device_bid(priv->adev), thermal_cooling_device_register(acpi_device_bid(priv->adev),
...@@ -201,8 +202,6 @@ static int int3403_cdev_add(struct int3403_priv *priv) ...@@ -201,8 +202,6 @@ static int int3403_cdev_add(struct int3403_priv *priv)
if (IS_ERR(obj->cdev)) if (IS_ERR(obj->cdev))
result = PTR_ERR(obj->cdev); result = PTR_ERR(obj->cdev);
priv->priv = obj;
kfree(buf.pointer); kfree(buf.pointer);
/* TODO: add ACPI notification support */ /* TODO: add ACPI notification support */
......
...@@ -185,6 +185,7 @@ ...@@ -185,6 +185,7 @@
* @regulator: pointer to the TMU regulator structure. * @regulator: pointer to the TMU regulator structure.
* @reg_conf: pointer to structure to register with core thermal. * @reg_conf: pointer to structure to register with core thermal.
* @ntrip: number of supported trip points. * @ntrip: number of supported trip points.
* @enabled: current status of TMU device
* @tmu_initialize: SoC specific TMU initialization method * @tmu_initialize: SoC specific TMU initialization method
* @tmu_control: SoC specific TMU control method * @tmu_control: SoC specific TMU control method
* @tmu_read: SoC specific TMU temperature read method * @tmu_read: SoC specific TMU temperature read method
...@@ -205,6 +206,7 @@ struct exynos_tmu_data { ...@@ -205,6 +206,7 @@ struct exynos_tmu_data {
struct regulator *regulator; struct regulator *regulator;
struct thermal_zone_device *tzd; struct thermal_zone_device *tzd;
unsigned int ntrip; unsigned int ntrip;
bool enabled;
int (*tmu_initialize)(struct platform_device *pdev); int (*tmu_initialize)(struct platform_device *pdev);
void (*tmu_control)(struct platform_device *pdev, bool on); void (*tmu_control)(struct platform_device *pdev, bool on);
...@@ -398,6 +400,7 @@ static void exynos_tmu_control(struct platform_device *pdev, bool on) ...@@ -398,6 +400,7 @@ static void exynos_tmu_control(struct platform_device *pdev, bool on)
mutex_lock(&data->lock); mutex_lock(&data->lock);
clk_enable(data->clk); clk_enable(data->clk);
data->tmu_control(pdev, on); data->tmu_control(pdev, on);
data->enabled = on;
clk_disable(data->clk); clk_disable(data->clk);
mutex_unlock(&data->lock); mutex_unlock(&data->lock);
} }
...@@ -889,19 +892,24 @@ static void exynos7_tmu_control(struct platform_device *pdev, bool on) ...@@ -889,19 +892,24 @@ static void exynos7_tmu_control(struct platform_device *pdev, bool on)
static int exynos_get_temp(void *p, int *temp) static int exynos_get_temp(void *p, int *temp)
{ {
struct exynos_tmu_data *data = p; struct exynos_tmu_data *data = p;
int value, ret = 0;
if (!data || !data->tmu_read) if (!data || !data->tmu_read || !data->enabled)
return -EINVAL; return -EINVAL;
mutex_lock(&data->lock); mutex_lock(&data->lock);
clk_enable(data->clk); clk_enable(data->clk);
*temp = code_to_temp(data, data->tmu_read(data)) * MCELSIUS; value = data->tmu_read(data);
if (value < 0)
ret = value;
else
*temp = code_to_temp(data, value) * MCELSIUS;
clk_disable(data->clk); clk_disable(data->clk);
mutex_unlock(&data->lock); mutex_unlock(&data->lock);
return 0; return ret;
} }
#ifdef CONFIG_THERMAL_EMULATION #ifdef CONFIG_THERMAL_EMULATION
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment