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

cec: add cec_adapter to cec_notifier_cec_adap_unregister()

It is possible for one HDMI connector to have multiple CEC adapters. The
typical real-world scenario is that where one adapter is used when the
device is in standby, and one that's better/smarter when the device is
powered up.

The cec-notifier changes were made with that in mind, but I missed that in
order to support this you need to tell cec_notifier_cec_adap_unregister()
which adapter you are unregistering from the notifier.

Add this additional argument. It is currently unused, but once all drivers
use this, the CEC core will be adapted for these use-cases.

Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Acked-by: Mauro Carvalho Chehab <mchehab+samsung@kernel.org>
Link: https://patchwork.freedesktop.org/patch/msgid/e9fc8740-6be6-43a7-beee-ce2d7b54936e@xs4all.nl

+28 -22
+2 -2
drivers/gpu/drm/bridge/synopsys/dw-hdmi-cec.c
··· 285 285 286 286 ret = cec_register_adapter(cec->adap, pdev->dev.parent); 287 287 if (ret < 0) { 288 - cec_notifier_cec_adap_unregister(cec->notify); 288 + cec_notifier_cec_adap_unregister(cec->notify, cec->adap); 289 289 return ret; 290 290 } 291 291 ··· 302 302 { 303 303 struct dw_hdmi_cec *cec = platform_get_drvdata(pdev); 304 304 305 - cec_notifier_cec_adap_unregister(cec->notify); 305 + cec_notifier_cec_adap_unregister(cec->notify, cec->adap); 306 306 cec_unregister_adapter(cec->adap); 307 307 308 308 return 0;
+2 -2
drivers/gpu/drm/i2c/tda9950.c
··· 465 465 466 466 ret = cec_register_adapter(priv->adap, priv->hdmi); 467 467 if (ret < 0) { 468 - cec_notifier_cec_adap_unregister(priv->notify); 468 + cec_notifier_cec_adap_unregister(priv->notify, priv->adap); 469 469 return ret; 470 470 } 471 471 ··· 482 482 { 483 483 struct tda9950_priv *priv = i2c_get_clientdata(client); 484 484 485 - cec_notifier_cec_adap_unregister(priv->notify); 485 + cec_notifier_cec_adap_unregister(priv->notify, priv->adap); 486 486 cec_unregister_adapter(priv->adap); 487 487 488 488 return 0;
+3 -2
drivers/media/cec/cec-notifier.c
··· 153 153 } 154 154 EXPORT_SYMBOL_GPL(cec_notifier_cec_adap_register); 155 155 156 - void cec_notifier_cec_adap_unregister(struct cec_notifier *n) 156 + void cec_notifier_cec_adap_unregister(struct cec_notifier *n, 157 + struct cec_adapter *adap) 157 158 { 158 159 if (!n) 159 160 return; 160 161 161 162 mutex_lock(&n->lock); 162 - n->cec_adap->notifier = NULL; 163 + adap->notifier = NULL; 163 164 n->cec_adap = NULL; 164 165 n->callback = NULL; 165 166 mutex_unlock(&n->lock);
+4 -2
drivers/media/platform/cros-ec-cec/cros-ec-cec.c
··· 314 314 return 0; 315 315 316 316 out_probe_notify: 317 - cec_notifier_cec_adap_unregister(cros_ec_cec->notify); 317 + cec_notifier_cec_adap_unregister(cros_ec_cec->notify, 318 + cros_ec_cec->adap); 318 319 out_probe_adapter: 319 320 cec_delete_adapter(cros_ec_cec->adap); 320 321 return ret; ··· 336 335 return ret; 337 336 } 338 337 339 - cec_notifier_cec_adap_unregister(cros_ec_cec->notify); 338 + cec_notifier_cec_adap_unregister(cros_ec_cec->notify, 339 + cros_ec_cec->adap); 340 340 cec_unregister_adapter(cros_ec_cec->adap); 341 341 342 342 return 0;
+2 -2
drivers/media/platform/meson/ao-cec-g12a.c
··· 736 736 clk_disable_unprepare(ao_cec->core); 737 737 738 738 out_probe_notify: 739 - cec_notifier_cec_adap_unregister(ao_cec->notify); 739 + cec_notifier_cec_adap_unregister(ao_cec->notify, ao_cec->adap); 740 740 741 741 out_probe_adapter: 742 742 cec_delete_adapter(ao_cec->adap); ··· 752 752 753 753 clk_disable_unprepare(ao_cec->core); 754 754 755 - cec_notifier_cec_adap_unregister(ao_cec->notify); 755 + cec_notifier_cec_adap_unregister(ao_cec->notify, ao_cec->adap); 756 756 757 757 cec_unregister_adapter(ao_cec->adap); 758 758
+2 -2
drivers/media/platform/meson/ao-cec.c
··· 688 688 clk_disable_unprepare(ao_cec->core); 689 689 690 690 out_probe_notify: 691 - cec_notifier_cec_adap_unregister(ao_cec->notify); 691 + cec_notifier_cec_adap_unregister(ao_cec->notify, ao_cec->adap); 692 692 693 693 out_probe_adapter: 694 694 cec_delete_adapter(ao_cec->adap); ··· 704 704 705 705 clk_disable_unprepare(ao_cec->core); 706 706 707 - cec_notifier_cec_adap_unregister(ao_cec->notify); 707 + cec_notifier_cec_adap_unregister(ao_cec->notify, ao_cec->adap); 708 708 cec_unregister_adapter(ao_cec->adap); 709 709 710 710 return 0;
+2 -2
drivers/media/platform/s5p-cec/s5p_cec.c
··· 239 239 return 0; 240 240 241 241 err_notifier: 242 - cec_notifier_cec_adap_unregister(cec->notifier); 242 + cec_notifier_cec_adap_unregister(cec->notifier, cec->adap); 243 243 244 244 err_delete_adapter: 245 245 cec_delete_adapter(cec->adap); ··· 250 250 { 251 251 struct s5p_cec_dev *cec = platform_get_drvdata(pdev); 252 252 253 - cec_notifier_cec_adap_unregister(cec->notifier); 253 + cec_notifier_cec_adap_unregister(cec->notifier, cec->adap); 254 254 cec_unregister_adapter(cec->adap); 255 255 pm_runtime_disable(&pdev->dev); 256 256 return 0;
+2 -2
drivers/media/platform/seco-cec/seco-cec.c
··· 671 671 return ret; 672 672 673 673 err_notifier: 674 - cec_notifier_cec_adap_unregister(secocec->notifier); 674 + cec_notifier_cec_adap_unregister(secocec->notifier, secocec->cec_adap); 675 675 err_delete_adapter: 676 676 cec_delete_adapter(secocec->cec_adap); 677 677 err: ··· 692 692 693 693 dev_dbg(&pdev->dev, "IR disabled"); 694 694 } 695 - cec_notifier_cec_adap_unregister(secocec->notifier); 695 + cec_notifier_cec_adap_unregister(secocec->notifier, secocec->cec_adap); 696 696 cec_unregister_adapter(secocec->cec_adap); 697 697 698 698 release_region(BRA_SMB_BASE_ADDR, 7);
+2 -2
drivers/media/platform/sti/cec/stih-cec.c
··· 359 359 return 0; 360 360 361 361 err_notifier: 362 - cec_notifier_cec_adap_unregister(cec->notifier); 362 + cec_notifier_cec_adap_unregister(cec->notifier, cec->adap); 363 363 364 364 err_delete_adapter: 365 365 cec_delete_adapter(cec->adap); ··· 370 370 { 371 371 struct stih_cec *cec = platform_get_drvdata(pdev); 372 372 373 - cec_notifier_cec_adap_unregister(cec->notifier); 373 + cec_notifier_cec_adap_unregister(cec->notifier, cec->adap); 374 374 cec_unregister_adapter(cec->adap); 375 375 376 376 return 0;
+2 -2
drivers/media/platform/tegra-cec/tegra_cec.c
··· 409 409 return 0; 410 410 411 411 err_notifier: 412 - cec_notifier_cec_adap_unregister(cec->notifier); 412 + cec_notifier_cec_adap_unregister(cec->notifier, cec->adap); 413 413 err_adapter: 414 414 cec_delete_adapter(cec->adap); 415 415 err_clk: ··· 423 423 424 424 clk_disable_unprepare(cec->clk); 425 425 426 - cec_notifier_cec_adap_unregister(cec->notifier); 426 + cec_notifier_cec_adap_unregister(cec->notifier, cec->adap); 427 427 cec_unregister_adapter(cec->adap); 428 428 429 429 return 0;
+5 -2
include/media/cec-notifier.h
··· 93 93 * cec_notifier_cec_adap_unregister - decrease refcount and delete when the 94 94 * refcount reaches 0. 95 95 * @n: notifier. If NULL, then this function does nothing. 96 + * @adap: the cec adapter that registered this notifier. 96 97 */ 97 - void cec_notifier_cec_adap_unregister(struct cec_notifier *n); 98 + void cec_notifier_cec_adap_unregister(struct cec_notifier *n, 99 + struct cec_adapter *adap); 98 100 99 101 /** 100 102 * cec_notifier_set_phys_addr - set a new physical address. ··· 162 160 return (struct cec_notifier *)0xdeadfeed; 163 161 } 164 162 165 - static inline void cec_notifier_cec_adap_unregister(struct cec_notifier *n) 163 + static inline void cec_notifier_cec_adap_unregister(struct cec_notifier *n, 164 + struct cec_adapter *adap) 166 165 { 167 166 } 168 167