Patch "rtc: m41t80: avoid i2c read in m41t80_sqw_recalc_rate" has been added to the 4.14-stable tree
Subsystems (2)
This is a note to let you know that I've just added the patch titled
rtc: m41t80: avoid i2c read in m41t80_sqw_recalc_rate
to the 4.14-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
rtc-m41t80-avoid-i2c-read-in-m41t80_sqw_recalc_rate.patch
and it can be found in the queue-4.14 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
2cb90ed3de1e279dbaf23df141f54eb9fb1861e6Mon Sep 17 00:00:00 2001
From: Troy Kisky <[email protected]>
Date: Thu, 2 Nov 2017 18:58:14 -0700
Subject: rtc: m41t80: avoid i2c read in m41t80_sqw_recalc_rate
From: Troy Kisky <[email protected]>
commit 2cb90ed3de1e279dbaf23df141f54eb9fb1861e6 upstream.
This is a little more efficient, and avoids the warning
WARNING: possible circular locking dependency detected 4.14.0-rc7-00007 #14 Not tainted
------------------------------------------------------
alsactl/330 is trying to acquire lock:
(prepare_lock){+.+.}, at: [<c049300c>] clk_prepare_lock+0x80/0xf4
but task is already holding lock:
(i2c_register_adapter){+.+.}, at: [<c0690ae0>]
i2c_adapter_lock_bus+0x14/0x18
which lock already depends on the new lock.
the existing dependency chain (in reverse order) is:
-> #1 (i2c_register_adapter){+.+.}:
rt_mutex_lock+0x44/0x5c
i2c_adapter_lock_bus+0x14/0x18
i2c_transfer+0xa8/0xbc
i2c_smbus_xfer+0x20c/0x5d8
i2c_smbus_read_byte_data+0x38/0x48
m41t80_sqw_recalc_rate+0x24/0x58--- drivers/rtc/rtc-m41t80.c | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-)
drivers/rtc/rtc-m41t80.c +17 -11
@@ -154,6 +154,7 @@ struct m41t80_data {struct rtc_device *rtc;#ifdef CONFIG_COMMON_CLK struct clk_hw sqw; +unsigned long freq;#endif };
@@ -443,26 +444,28 @@ static SIMPLE_DEV_PM_OPS(m41t80_pm, m41t#ifdef CONFIG_COMMON_CLK #define sqw_to_m41t80_data (_hw) container_of(_hw, struct m41t80_data, sqw) -static unsigned long m41t80_sqw_recalc_rate (struct clk_hw *hw, -unsigned long parent_rate) +static unsigned long m41t80_decode_freq (int setting) +{ +return (setting ==0 ) ?0 : (setting ==1 ) ?M41T80_SQW_MAX_FREQ : +M41T80_SQW_MAX_FREQ >> setting; +} + +static unsigned long m41t80_get_freq (struct m41t80_data *m41t80) { -struct m41t80_data *m41t80 =sqw_to_m41t80_data (hw);struct i2c_client *client = m41t80->client;int reg_sqw = (m41t80->features &M41T80_FEATURE_SQ_ALT ) ?M41T80_REG_WDAY :M41T80_REG_SQW ;int ret =i2c_smbus_read_byte_data (client, reg_sqw); -unsigned long val =M41T80_SQW_MAX_FREQ ;if (ret <0 )return 0 ; +return m41t80_decode_freq (ret >>4 ); +} - ret >>=4 ; -if (ret ==0 ) - val =0 ; -else if (ret >1 ) - val = val / (1 << ret); - -return val; +static unsigned long m41t80_sqw_recalc_rate (struct clk_hw *hw, +unsigned long parent_rate) +{ +return sqw_to_m41t80_data (hw)->freq; } static long m41t80_sqw_round_rate(struct clk_hw *hw, unsigned long rate,
@@ -505,6 +508,8 @@ static int m41t80_sqw_set_rate(struct cl reg = (reg &0x0f ) | (val <<4 ); ret =i2c_smbus_write_byte_data (client, reg_sqw, reg); +if (!ret) + m41t80->freq =m41t80_decode_freq (val);return ret; }
@@ -579,6 +584,7 @@ static struct clk *m41t80_sqw_register_c init.parent_names =NULL ; init.num_parents =0 ; m41t80->sqw.init = &init; + m41t80->freq =m41t80_get_freq (m41t80);/* optional override of the clockname */ of_property_read_string (node,"clock-output-names" , &init.name);
Patches currently in stable-queue which might be from [email protected] are
queue-4.14/rtc-m41t80-m41t80_sqw_set_rate-should-return-0-on-success.patch queue-4.14/rtc-m41t80-avoid-i2c-read-in-m41t80_sqw_is_prepared.patch queue-4.14/rtc-m41t80-avoid-i2c-read-in-m41t80_sqw_recalc_rate.patch queue-4.14/rtc-m41t80-remove-unneeded-checks-from-m41t80_sqw_set_rate.patch queue-4.14/rtc-m41t80-fix-m41t80_sqw_round_rate-return-value.patch