Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge tag 'counter-fixes-for-7.0' of ssh://gitolite.kernel.org/pub/scm/linux/kernel/git/wbg/counter into char-misc-linus

William writes:

Counter fixes for 7.0

Two fixes for rz-mut3-cnt: synchronize runtime PM usage count to toggle
state of the counter, and set counter->parent during probe to ensure the
current dev pointer is accessed during driver operation.

* tag 'counter-fixes-for-7.0' of ssh://gitolite.kernel.org/pub/scm/linux/kernel/git/wbg/counter:
counter: rz-mtu3-cnt: do not use struct rz_mtu3_channel's dev member
counter: rz-mtu3-cnt: prevent counter from being toggled multiple times

+35 -32
+35 -32
drivers/counter/rz-mtu3-cnt.c
··· 107 107 struct rz_mtu3_cnt *const priv = counter_priv(counter); 108 108 unsigned long tmdr; 109 109 110 - pm_runtime_get_sync(priv->ch->dev); 110 + pm_runtime_get_sync(counter->parent); 111 111 tmdr = rz_mtu3_shared_reg_read(priv->ch, RZ_MTU3_TMDR3); 112 - pm_runtime_put(priv->ch->dev); 112 + pm_runtime_put(counter->parent); 113 113 114 114 if (id == RZ_MTU3_32_BIT_CH && test_bit(RZ_MTU3_TMDR3_LWA, &tmdr)) 115 115 return false; ··· 165 165 if (ret) 166 166 return ret; 167 167 168 - pm_runtime_get_sync(ch->dev); 168 + pm_runtime_get_sync(counter->parent); 169 169 if (count->id == RZ_MTU3_32_BIT_CH) 170 170 *val = rz_mtu3_32bit_ch_read(ch, RZ_MTU3_TCNTLW); 171 171 else 172 172 *val = rz_mtu3_16bit_ch_read(ch, RZ_MTU3_TCNT); 173 - pm_runtime_put(ch->dev); 173 + pm_runtime_put(counter->parent); 174 174 mutex_unlock(&priv->lock); 175 175 176 176 return 0; ··· 187 187 if (ret) 188 188 return ret; 189 189 190 - pm_runtime_get_sync(ch->dev); 190 + pm_runtime_get_sync(counter->parent); 191 191 if (count->id == RZ_MTU3_32_BIT_CH) 192 192 rz_mtu3_32bit_ch_write(ch, RZ_MTU3_TCNTLW, val); 193 193 else 194 194 rz_mtu3_16bit_ch_write(ch, RZ_MTU3_TCNT, val); 195 - pm_runtime_put(ch->dev); 195 + pm_runtime_put(counter->parent); 196 196 mutex_unlock(&priv->lock); 197 197 198 198 return 0; 199 199 } 200 200 201 201 static int rz_mtu3_count_function_read_helper(struct rz_mtu3_channel *const ch, 202 - struct rz_mtu3_cnt *const priv, 202 + struct counter_device *const counter, 203 203 enum counter_function *function) 204 204 { 205 205 u8 timer_mode; 206 206 207 - pm_runtime_get_sync(ch->dev); 207 + pm_runtime_get_sync(counter->parent); 208 208 timer_mode = rz_mtu3_8bit_ch_read(ch, RZ_MTU3_TMDR1); 209 - pm_runtime_put(ch->dev); 209 + pm_runtime_put(counter->parent); 210 210 211 211 switch (timer_mode & RZ_MTU3_TMDR1_PH_CNT_MODE_MASK) { 212 212 case RZ_MTU3_TMDR1_PH_CNT_MODE_1: ··· 240 240 if (ret) 241 241 return ret; 242 242 243 - ret = rz_mtu3_count_function_read_helper(ch, priv, function); 243 + ret = rz_mtu3_count_function_read_helper(ch, counter, function); 244 244 mutex_unlock(&priv->lock); 245 245 246 246 return ret; ··· 279 279 return -EINVAL; 280 280 } 281 281 282 - pm_runtime_get_sync(ch->dev); 282 + pm_runtime_get_sync(counter->parent); 283 283 rz_mtu3_8bit_ch_write(ch, RZ_MTU3_TMDR1, timer_mode); 284 - pm_runtime_put(ch->dev); 284 + pm_runtime_put(counter->parent); 285 285 mutex_unlock(&priv->lock); 286 286 287 287 return 0; ··· 300 300 if (ret) 301 301 return ret; 302 302 303 - pm_runtime_get_sync(ch->dev); 303 + pm_runtime_get_sync(counter->parent); 304 304 tsr = rz_mtu3_8bit_ch_read(ch, RZ_MTU3_TSR); 305 - pm_runtime_put(ch->dev); 305 + pm_runtime_put(counter->parent); 306 306 307 307 *direction = (tsr & RZ_MTU3_TSR_TCFD) ? 308 308 COUNTER_COUNT_DIRECTION_FORWARD : COUNTER_COUNT_DIRECTION_BACKWARD; ··· 377 377 return -EINVAL; 378 378 } 379 379 380 - pm_runtime_get_sync(ch->dev); 380 + pm_runtime_get_sync(counter->parent); 381 381 if (count->id == RZ_MTU3_32_BIT_CH) 382 382 rz_mtu3_32bit_ch_write(ch, RZ_MTU3_TGRALW, ceiling); 383 383 else 384 384 rz_mtu3_16bit_ch_write(ch, RZ_MTU3_TGRA, ceiling); 385 385 386 386 rz_mtu3_8bit_ch_write(ch, RZ_MTU3_TCR, RZ_MTU3_TCR_CCLR_TGRA); 387 - pm_runtime_put(ch->dev); 387 + pm_runtime_put(counter->parent); 388 388 mutex_unlock(&priv->lock); 389 389 390 390 return 0; ··· 495 495 static int rz_mtu3_count_enable_write(struct counter_device *counter, 496 496 struct counter_count *count, u8 enable) 497 497 { 498 - struct rz_mtu3_channel *const ch = rz_mtu3_get_ch(counter, count->id); 499 498 struct rz_mtu3_cnt *const priv = counter_priv(counter); 500 499 int ret = 0; 501 500 501 + mutex_lock(&priv->lock); 502 + 503 + if (priv->count_is_enabled[count->id] == enable) 504 + goto exit; 505 + 502 506 if (enable) { 503 - mutex_lock(&priv->lock); 504 - pm_runtime_get_sync(ch->dev); 507 + pm_runtime_get_sync(counter->parent); 505 508 ret = rz_mtu3_initialize_counter(counter, count->id); 506 509 if (ret == 0) 507 510 priv->count_is_enabled[count->id] = true; 508 - mutex_unlock(&priv->lock); 509 511 } else { 510 - mutex_lock(&priv->lock); 511 512 rz_mtu3_terminate_counter(counter, count->id); 512 513 priv->count_is_enabled[count->id] = false; 513 - pm_runtime_put(ch->dev); 514 - mutex_unlock(&priv->lock); 514 + pm_runtime_put(counter->parent); 515 515 } 516 + 517 + exit: 518 + mutex_unlock(&priv->lock); 516 519 517 520 return ret; 518 521 } ··· 543 540 if (ret) 544 541 return ret; 545 542 546 - pm_runtime_get_sync(priv->ch->dev); 543 + pm_runtime_get_sync(counter->parent); 547 544 tmdr = rz_mtu3_shared_reg_read(priv->ch, RZ_MTU3_TMDR3); 548 - pm_runtime_put(priv->ch->dev); 545 + pm_runtime_put(counter->parent); 549 546 *cascade_enable = test_bit(RZ_MTU3_TMDR3_LWA, &tmdr); 550 547 mutex_unlock(&priv->lock); 551 548 ··· 562 559 if (ret) 563 560 return ret; 564 561 565 - pm_runtime_get_sync(priv->ch->dev); 562 + pm_runtime_get_sync(counter->parent); 566 563 rz_mtu3_shared_reg_update_bit(priv->ch, RZ_MTU3_TMDR3, 567 564 RZ_MTU3_TMDR3_LWA, cascade_enable); 568 - pm_runtime_put(priv->ch->dev); 565 + pm_runtime_put(counter->parent); 569 566 mutex_unlock(&priv->lock); 570 567 571 568 return 0; ··· 582 579 if (ret) 583 580 return ret; 584 581 585 - pm_runtime_get_sync(priv->ch->dev); 582 + pm_runtime_get_sync(counter->parent); 586 583 tmdr = rz_mtu3_shared_reg_read(priv->ch, RZ_MTU3_TMDR3); 587 - pm_runtime_put(priv->ch->dev); 584 + pm_runtime_put(counter->parent); 588 585 *ext_input_phase_clock_select = test_bit(RZ_MTU3_TMDR3_PHCKSEL, &tmdr); 589 586 mutex_unlock(&priv->lock); 590 587 ··· 601 598 if (ret) 602 599 return ret; 603 600 604 - pm_runtime_get_sync(priv->ch->dev); 601 + pm_runtime_get_sync(counter->parent); 605 602 rz_mtu3_shared_reg_update_bit(priv->ch, RZ_MTU3_TMDR3, 606 603 RZ_MTU3_TMDR3_PHCKSEL, 607 604 ext_input_phase_clock_select); 608 - pm_runtime_put(priv->ch->dev); 605 + pm_runtime_put(counter->parent); 609 606 mutex_unlock(&priv->lock); 610 607 611 608 return 0; ··· 643 640 if (ret) 644 641 return ret; 645 642 646 - ret = rz_mtu3_count_function_read_helper(ch, priv, &function); 643 + ret = rz_mtu3_count_function_read_helper(ch, counter, &function); 647 644 if (ret) { 648 645 mutex_unlock(&priv->lock); 649 646 return ret;