Hi Lukasz, On Fri, 28 Feb 2025 at 22:58, Lukasz Luba <lukasz.luba@xxxxxxx> wrote: > > > > On 2/16/25 19:58, Anand Moon wrote: > > Using guard notation makes the code more compact and error handling > > more robust by ensuring that mutexes are released in all code paths > > when control leaves critical section. > > > > Signed-off-by: Anand Moon <linux.amoon@xxxxxxxxx> > > --- > > v3: new patch > > --- > > drivers/thermal/samsung/exynos_tmu.c | 21 +++++++-------------- > > 1 file changed, 7 insertions(+), 14 deletions(-) > > > > diff --git a/drivers/thermal/samsung/exynos_tmu.c b/drivers/thermal/samsung/exynos_tmu.c > > index fe090c1a93ab..a34ba3858d64 100644 > > --- a/drivers/thermal/samsung/exynos_tmu.c > > +++ b/drivers/thermal/samsung/exynos_tmu.c > > @@ -256,7 +256,7 @@ static int exynos_tmu_initialize(struct platform_device *pdev) > > unsigned int status; > > int ret = 0; > > > > - mutex_lock(&data->lock); > > + guard(mutex)(&data->lock); > > clk_enable(data->clk); > > clk_enable(data->clk_sec); > > > > @@ -270,7 +270,6 @@ static int exynos_tmu_initialize(struct platform_device *pdev) > > > > clk_disable(data->clk_sec); > > clk_disable(data->clk); > > - mutex_unlock(&data->lock); > > > > return ret; > > } > > @@ -292,13 +291,12 @@ static int exynos_thermal_zone_configure(struct platform_device *pdev) > > return ret; > > } > > > > - mutex_lock(&data->lock); > > + guard(mutex)(&data->lock); > > clk_enable(data->clk); > > > > data->tmu_set_crit_temp(data, temp / MCELSIUS); > > > > clk_disable(data->clk); > > - mutex_unlock(&data->lock); > > > > return 0; > > } > > @@ -325,12 +323,11 @@ static void exynos_tmu_control(struct platform_device *pdev, bool on) > > { > > struct exynos_tmu_data *data = platform_get_drvdata(pdev); > > > > - mutex_lock(&data->lock); > > + guard(mutex)(&data->lock); > > clk_enable(data->clk); > > data->tmu_control(pdev, on); > > data->enabled = on; > > clk_disable(data->clk); > > - mutex_unlock(&data->lock); > > } > > > > static void exynos_tmu_update_bit(struct exynos_tmu_data *data, int reg_off, > > @@ -645,7 +642,7 @@ static int exynos_get_temp(struct thermal_zone_device *tz, int *temp) > > */ > > return -EAGAIN; > > > > - mutex_lock(&data->lock); > > + guard(mutex)(&data->lock); > > clk_enable(data->clk); > > > > value = data->tmu_read(data); > > @@ -655,7 +652,6 @@ static int exynos_get_temp(struct thermal_zone_device *tz, int *temp) > > *temp = code_to_temp(data, value) * MCELSIUS; > > > > clk_disable(data->clk); > > - mutex_unlock(&data->lock); > > > > return ret; > > } > > @@ -720,11 +716,10 @@ static int exynos_tmu_set_emulation(struct thermal_zone_device *tz, int temp) > > if (temp && temp < MCELSIUS) > > goto out; > > > > - mutex_lock(&data->lock); > > + guard(mutex)(&data->lock); > > clk_enable(data->clk); > > data->tmu_set_emulation(data, temp); > > clk_disable(data->clk); > > - mutex_unlock(&data->lock); > > return 0; > > out: > > return ret; > > @@ -760,14 +755,13 @@ static irqreturn_t exynos_tmu_threaded_irq(int irq, void *id) > > > > thermal_zone_device_update(data->tzd, THERMAL_EVENT_UNSPECIFIED); > > > > - mutex_lock(&data->lock); > > + guard(mutex)(&data->lock); > > clk_enable(data->clk); > > > > /* TODO: take action based on particular interrupt */ > > data->tmu_clear_irqs(data); > > > > clk_disable(data->clk); > > - mutex_unlock(&data->lock); > > > > return IRQ_HANDLED; > > } > > @@ -987,7 +981,7 @@ static int exynos_set_trips(struct thermal_zone_device *tz, int low, int high) > > { > > struct exynos_tmu_data *data = thermal_zone_device_priv(tz); > > > > - mutex_lock(&data->lock); > > + guard(mutex)(&data->lock); > > clk_enable(data->clk); > > > > if (low > INT_MIN) > > @@ -1000,7 +994,6 @@ static int exynos_set_trips(struct thermal_zone_device *tz, int low, int high) > > data->tmu_disable_high(data); > > > > clk_disable(data->clk); > > - mutex_unlock(&data->lock); > > > > return 0; > > } Thanks for your review comments. > > IMO you should be able to even use something like we have > core framework: > > guard(thermal_zone)(tz); > > Your mutex name is simply 'lock' in the struct exynos_tmu_data > so you should be able to leverage this by: > > guard(exynos_tmu_data)(data); > > Please try that. Ok, I will check this Thanks -Anand