From: "Uwe Kleine-König" <u.kleine-koenig@pengutronix.de> To: Fabrice Gasnier <fabrice.gasnier@foss.st.com>, William Breathitt Gray <vilhelm.gray@gmail.com>, Maxime Coquelin <mcoquelin.stm32@gmail.com>, Alexandre Torgue <alexandre.torgue@foss.st.com> Cc: linux-iio@vger.kernel.org, linux-stm32@st-md-mailman.stormreply.com, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org Subject: [PATCH 7/8] counter: stm32-timer-cnt: Use container_of instead of struct counter_device::priv Date: Tue, 21 Dec 2021 11:45:45 +0100 [thread overview] Message-ID: <20211221104546.214066-8-u.kleine-koenig@pengutronix.de> (raw) In-Reply-To: <20211221104546.214066-1-u.kleine-koenig@pengutronix.de> Using counter->priv is a memory read and so more expensive than container_of which is only an addition. (In this case even a noop because the offset is 0.) So container_of is expected to be a tad faster, it's type-safe, and produces smaller code (ARCH=arm allmodconfig): add/remove: 0/0 grow/shrink: 0/11 up/down: 0/-132 (-132) Function old new delta stm32_timer_cnt_probe 436 424 -12 stm32_count_write 312 300 -12 stm32_count_read 236 224 -12 stm32_count_function_write 492 480 -12 stm32_count_function_read 396 384 -12 stm32_count_enable_write 488 476 -12 stm32_count_enable_read 236 224 -12 stm32_count_direction_read 240 228 -12 stm32_count_ceiling_write 200 188 -12 stm32_count_ceiling_read 236 224 -12 stm32_action_read 492 480 -12 Total: Before=5504, After=5372, chg -2.40% Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de> --- drivers/counter/stm32-timer-cnt.c | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/drivers/counter/stm32-timer-cnt.c b/drivers/counter/stm32-timer-cnt.c index 0546e932db0c..ac0bea6ce690 100644 --- a/drivers/counter/stm32-timer-cnt.c +++ b/drivers/counter/stm32-timer-cnt.c @@ -37,6 +37,11 @@ struct stm32_timer_cnt { struct stm32_timer_regs bak; }; +static inline struct stm32_timer_cnt *stm32_count_from_counter(struct counter_device *counter) +{ + return container_of(counter, struct stm32_timer_cnt, counter); +} + static const enum counter_function stm32_count_functions[] = { COUNTER_FUNCTION_INCREASE, COUNTER_FUNCTION_QUADRATURE_X2_A, @@ -47,7 +52,7 @@ static const enum counter_function stm32_count_functions[] = { static int stm32_count_read(struct counter_device *counter, struct counter_count *count, u64 *val) { - struct stm32_timer_cnt *const priv = counter->priv; + struct stm32_timer_cnt *const priv = stm32_count_from_counter(counter); u32 cnt; regmap_read(priv->regmap, TIM_CNT, &cnt); @@ -59,7 +64,7 @@ static int stm32_count_read(struct counter_device *counter, static int stm32_count_write(struct counter_device *counter, struct counter_count *count, const u64 val) { - struct stm32_timer_cnt *const priv = counter->priv; + struct stm32_timer_cnt *const priv = stm32_count_from_counter(counter); u32 ceiling; regmap_read(priv->regmap, TIM_ARR, &ceiling); @@ -73,7 +78,7 @@ static int stm32_count_function_read(struct counter_device *counter, struct counter_count *count, enum counter_function *function) { - struct stm32_timer_cnt *const priv = counter->priv; + struct stm32_timer_cnt *const priv = stm32_count_from_counter(counter); u32 smcr; regmap_read(priv->regmap, TIM_SMCR, &smcr); @@ -100,7 +105,7 @@ static int stm32_count_function_write(struct counter_device *counter, struct counter_count *count, enum counter_function function) { - struct stm32_timer_cnt *const priv = counter->priv; + struct stm32_timer_cnt *const priv = stm32_count_from_counter(counter); u32 cr1, sms; switch (function) { @@ -140,7 +145,7 @@ static int stm32_count_direction_read(struct counter_device *counter, struct counter_count *count, enum counter_count_direction *direction) { - struct stm32_timer_cnt *const priv = counter->priv; + struct stm32_timer_cnt *const priv = stm32_count_from_counter(counter); u32 cr1; regmap_read(priv->regmap, TIM_CR1, &cr1); @@ -153,7 +158,7 @@ static int stm32_count_direction_read(struct counter_device *counter, static int stm32_count_ceiling_read(struct counter_device *counter, struct counter_count *count, u64 *ceiling) { - struct stm32_timer_cnt *const priv = counter->priv; + struct stm32_timer_cnt *const priv = stm32_count_from_counter(counter); u32 arr; regmap_read(priv->regmap, TIM_ARR, &arr); @@ -166,7 +171,7 @@ static int stm32_count_ceiling_read(struct counter_device *counter, static int stm32_count_ceiling_write(struct counter_device *counter, struct counter_count *count, u64 ceiling) { - struct stm32_timer_cnt *const priv = counter->priv; + struct stm32_timer_cnt *const priv = stm32_count_from_counter(counter); if (ceiling > priv->max_arr) return -ERANGE; @@ -181,7 +186,7 @@ static int stm32_count_ceiling_write(struct counter_device *counter, static int stm32_count_enable_read(struct counter_device *counter, struct counter_count *count, u8 *enable) { - struct stm32_timer_cnt *const priv = counter->priv; + struct stm32_timer_cnt *const priv = stm32_count_from_counter(counter); u32 cr1; regmap_read(priv->regmap, TIM_CR1, &cr1); @@ -194,7 +199,7 @@ static int stm32_count_enable_read(struct counter_device *counter, static int stm32_count_enable_write(struct counter_device *counter, struct counter_count *count, u8 enable) { - struct stm32_timer_cnt *const priv = counter->priv; + struct stm32_timer_cnt *const priv = stm32_count_from_counter(counter); u32 cr1; if (enable) { @@ -336,7 +341,6 @@ static int stm32_timer_cnt_probe(struct platform_device *pdev) priv->counter.num_counts = 1; priv->counter.signals = stm32_signals; priv->counter.num_signals = ARRAY_SIZE(stm32_signals); - priv->counter.priv = priv; platform_set_drvdata(pdev, priv); -- 2.33.0
WARNING: multiple messages have this Message-ID (diff)
From: "Uwe Kleine-König" <u.kleine-koenig@pengutronix.de> To: Fabrice Gasnier <fabrice.gasnier@foss.st.com>, William Breathitt Gray <vilhelm.gray@gmail.com>, Maxime Coquelin <mcoquelin.stm32@gmail.com>, Alexandre Torgue <alexandre.torgue@foss.st.com> Cc: linux-iio@vger.kernel.org, linux-stm32@st-md-mailman.stormreply.com, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org Subject: [PATCH 7/8] counter: stm32-timer-cnt: Use container_of instead of struct counter_device::priv Date: Tue, 21 Dec 2021 11:45:45 +0100 [thread overview] Message-ID: <20211221104546.214066-8-u.kleine-koenig@pengutronix.de> (raw) In-Reply-To: <20211221104546.214066-1-u.kleine-koenig@pengutronix.de> Using counter->priv is a memory read and so more expensive than container_of which is only an addition. (In this case even a noop because the offset is 0.) So container_of is expected to be a tad faster, it's type-safe, and produces smaller code (ARCH=arm allmodconfig): add/remove: 0/0 grow/shrink: 0/11 up/down: 0/-132 (-132) Function old new delta stm32_timer_cnt_probe 436 424 -12 stm32_count_write 312 300 -12 stm32_count_read 236 224 -12 stm32_count_function_write 492 480 -12 stm32_count_function_read 396 384 -12 stm32_count_enable_write 488 476 -12 stm32_count_enable_read 236 224 -12 stm32_count_direction_read 240 228 -12 stm32_count_ceiling_write 200 188 -12 stm32_count_ceiling_read 236 224 -12 stm32_action_read 492 480 -12 Total: Before=5504, After=5372, chg -2.40% Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de> --- drivers/counter/stm32-timer-cnt.c | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/drivers/counter/stm32-timer-cnt.c b/drivers/counter/stm32-timer-cnt.c index 0546e932db0c..ac0bea6ce690 100644 --- a/drivers/counter/stm32-timer-cnt.c +++ b/drivers/counter/stm32-timer-cnt.c @@ -37,6 +37,11 @@ struct stm32_timer_cnt { struct stm32_timer_regs bak; }; +static inline struct stm32_timer_cnt *stm32_count_from_counter(struct counter_device *counter) +{ + return container_of(counter, struct stm32_timer_cnt, counter); +} + static const enum counter_function stm32_count_functions[] = { COUNTER_FUNCTION_INCREASE, COUNTER_FUNCTION_QUADRATURE_X2_A, @@ -47,7 +52,7 @@ static const enum counter_function stm32_count_functions[] = { static int stm32_count_read(struct counter_device *counter, struct counter_count *count, u64 *val) { - struct stm32_timer_cnt *const priv = counter->priv; + struct stm32_timer_cnt *const priv = stm32_count_from_counter(counter); u32 cnt; regmap_read(priv->regmap, TIM_CNT, &cnt); @@ -59,7 +64,7 @@ static int stm32_count_read(struct counter_device *counter, static int stm32_count_write(struct counter_device *counter, struct counter_count *count, const u64 val) { - struct stm32_timer_cnt *const priv = counter->priv; + struct stm32_timer_cnt *const priv = stm32_count_from_counter(counter); u32 ceiling; regmap_read(priv->regmap, TIM_ARR, &ceiling); @@ -73,7 +78,7 @@ static int stm32_count_function_read(struct counter_device *counter, struct counter_count *count, enum counter_function *function) { - struct stm32_timer_cnt *const priv = counter->priv; + struct stm32_timer_cnt *const priv = stm32_count_from_counter(counter); u32 smcr; regmap_read(priv->regmap, TIM_SMCR, &smcr); @@ -100,7 +105,7 @@ static int stm32_count_function_write(struct counter_device *counter, struct counter_count *count, enum counter_function function) { - struct stm32_timer_cnt *const priv = counter->priv; + struct stm32_timer_cnt *const priv = stm32_count_from_counter(counter); u32 cr1, sms; switch (function) { @@ -140,7 +145,7 @@ static int stm32_count_direction_read(struct counter_device *counter, struct counter_count *count, enum counter_count_direction *direction) { - struct stm32_timer_cnt *const priv = counter->priv; + struct stm32_timer_cnt *const priv = stm32_count_from_counter(counter); u32 cr1; regmap_read(priv->regmap, TIM_CR1, &cr1); @@ -153,7 +158,7 @@ static int stm32_count_direction_read(struct counter_device *counter, static int stm32_count_ceiling_read(struct counter_device *counter, struct counter_count *count, u64 *ceiling) { - struct stm32_timer_cnt *const priv = counter->priv; + struct stm32_timer_cnt *const priv = stm32_count_from_counter(counter); u32 arr; regmap_read(priv->regmap, TIM_ARR, &arr); @@ -166,7 +171,7 @@ static int stm32_count_ceiling_read(struct counter_device *counter, static int stm32_count_ceiling_write(struct counter_device *counter, struct counter_count *count, u64 ceiling) { - struct stm32_timer_cnt *const priv = counter->priv; + struct stm32_timer_cnt *const priv = stm32_count_from_counter(counter); if (ceiling > priv->max_arr) return -ERANGE; @@ -181,7 +186,7 @@ static int stm32_count_ceiling_write(struct counter_device *counter, static int stm32_count_enable_read(struct counter_device *counter, struct counter_count *count, u8 *enable) { - struct stm32_timer_cnt *const priv = counter->priv; + struct stm32_timer_cnt *const priv = stm32_count_from_counter(counter); u32 cr1; regmap_read(priv->regmap, TIM_CR1, &cr1); @@ -194,7 +199,7 @@ static int stm32_count_enable_read(struct counter_device *counter, static int stm32_count_enable_write(struct counter_device *counter, struct counter_count *count, u8 enable) { - struct stm32_timer_cnt *const priv = counter->priv; + struct stm32_timer_cnt *const priv = stm32_count_from_counter(counter); u32 cr1; if (enable) { @@ -336,7 +341,6 @@ static int stm32_timer_cnt_probe(struct platform_device *pdev) priv->counter.num_counts = 1; priv->counter.signals = stm32_signals; priv->counter.num_signals = ARRAY_SIZE(stm32_signals); - priv->counter.priv = priv; platform_set_drvdata(pdev, priv); -- 2.33.0 _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
next prev parent reply other threads:[~2021-12-21 10:46 UTC|newest] Thread overview: 25+ messages / expand[flat|nested] mbox.gz Atom feed top 2021-12-21 10:45 [PATCH 0/8] counter: Remove struct counter_device::priv Uwe Kleine-König 2021-12-21 10:45 ` Uwe Kleine-König 2021-12-21 10:45 ` [PATCH 1/8] counter: 104-quad-8: Use container_of instead of " Uwe Kleine-König 2021-12-21 10:45 ` [PATCH 2/8] counter: ftm-quaddec: " Uwe Kleine-König 2021-12-21 10:45 ` [PATCH 3/8] counter: intel-qeb: " Uwe Kleine-König 2021-12-21 10:45 ` [PATCH 4/8] counter: interrupt-cnt: " Uwe Kleine-König 2021-12-21 10:45 ` [PATCH 5/8] counter: microchip-tcp-capture: " Uwe Kleine-König 2021-12-21 10:45 ` Uwe Kleine-König 2021-12-21 10:45 ` [PATCH 6/8] counter: stm32-lptimer-cnt: " Uwe Kleine-König 2021-12-21 10:45 ` Uwe Kleine-König 2021-12-21 10:45 ` Uwe Kleine-König [this message] 2021-12-21 10:45 ` [PATCH 7/8] counter: stm32-timer-cnt: " Uwe Kleine-König 2021-12-21 10:45 ` [PATCH 8/8] counter: Remove unused member from struct counter_device Uwe Kleine-König 2021-12-21 11:12 ` [PATCH 0/8] counter: Remove struct counter_device::priv Lars-Peter Clausen 2021-12-21 11:12 ` Lars-Peter Clausen 2021-12-21 11:35 ` Uwe Kleine-König 2021-12-21 11:35 ` Uwe Kleine-König 2021-12-21 12:04 ` Lars-Peter Clausen 2021-12-21 12:04 ` Lars-Peter Clausen 2021-12-21 13:22 ` Uwe Kleine-König 2021-12-21 13:22 ` Uwe Kleine-König 2021-12-21 14:12 ` Lars-Peter Clausen 2021-12-21 14:12 ` Lars-Peter Clausen 2021-12-22 17:51 ` Uwe Kleine-König 2021-12-22 17:51 ` Uwe Kleine-König
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20211221104546.214066-8-u.kleine-koenig@pengutronix.de \ --to=u.kleine-koenig@pengutronix.de \ --cc=alexandre.torgue@foss.st.com \ --cc=fabrice.gasnier@foss.st.com \ --cc=linux-arm-kernel@lists.infradead.org \ --cc=linux-iio@vger.kernel.org \ --cc=linux-kernel@vger.kernel.org \ --cc=linux-stm32@st-md-mailman.stormreply.com \ --cc=mcoquelin.stm32@gmail.com \ --cc=vilhelm.gray@gmail.com \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.