cec_notifier_phys_addr_invalidate must call cec_phys_addr_invalidate instead of cec_s_phys_addr. This ensures that the CEC framework knowns that there is no EDID.
Signed-off-by: Hans Verkuil <[email protected]> --- drivers/media/cec/core/cec-notifier.c | 13 +++++++++++ include/media/cec-notifier.h | 33 +++++++++++++++------------ 2 files changed, 32 insertions(+), 14 deletions(-) diff --git a/drivers/media/cec/core/cec-notifier.c b/drivers/media/cec/core/cec-notifier.c index 8cf1474d0361..2814ef7d4804 100644 --- a/drivers/media/cec/core/cec-notifier.c +++ b/drivers/media/cec/core/cec-notifier.c @@ -216,6 +216,19 @@ void cec_notifier_set_phys_addr_from_edid(struct cec_notifier *n, } EXPORT_SYMBOL_GPL(cec_notifier_set_phys_addr_from_edid); +void cec_notifier_phys_addr_invalidate(struct cec_notifier *n) +{ + if (!n) + return; + + mutex_lock(&n->lock); + n->phys_addr = CEC_PHYS_ADDR_INVALID; + if (n->cec_adap && !n->cec_adap->adap_controls_phys_addr) + cec_phys_addr_invalidate(n->cec_adap); + mutex_unlock(&n->lock); +} +EXPORT_SYMBOL_GPL(cec_notifier_phys_addr_invalidate); + struct device *cec_notifier_parse_hdmi_phandle(struct device *dev) { struct platform_device *hdmi_pdev; diff --git a/include/media/cec-notifier.h b/include/media/cec-notifier.h index b1c839734124..15e9bcb5b887 100644 --- a/include/media/cec-notifier.h +++ b/include/media/cec-notifier.h @@ -80,7 +80,10 @@ void cec_notifier_cec_adap_unregister(struct cec_notifier *n, * @n: the CEC notifier * @pa: the CEC physical address * - * Set a new CEC physical address. + * Set a new CEC physical address. @pa may be f.f.f.f, indicating that + * the EDID does not contain a valid Physical Address. + * Use @cec_notifier_phys_addr_invalidate() when there is no EDID at all, + * i.e. there is no video sink connected. * Does nothing if @n == NULL. */ void cec_notifier_set_phys_addr(struct cec_notifier *n, u16 pa); @@ -96,6 +99,17 @@ void cec_notifier_set_phys_addr(struct cec_notifier *n, u16 pa); void cec_notifier_set_phys_addr_from_edid(struct cec_notifier *n, const struct edid *edid); +/** + * cec_notifier_phys_addr_invalidate() - set the physical address to INVALID + * + * @n: the CEC notifier + * + * This is a simple helper function to invalidate the physical + * address when the video sink disappears. + * Does nothing if @n == NULL. + */ +void cec_notifier_phys_addr_invalidate(struct cec_notifier *n); + /** * cec_notifier_parse_hdmi_phandle - find the hdmi device from "hdmi-phandle" * @dev: the device with the "hdmi-phandle" device tree property @@ -143,6 +157,10 @@ static inline void cec_notifier_set_phys_addr_from_edid(struct cec_notifier *n, { } +static inline void cec_notifier_phys_addr_invalidate(struct cec_notifier *n) +{ +} + static inline struct device *cec_notifier_parse_hdmi_phandle(struct device *dev) { return ERR_PTR(-ENODEV); @@ -150,17 +168,4 @@ static inline struct device *cec_notifier_parse_hdmi_phandle(struct device *dev) #endif -/** - * cec_notifier_phys_addr_invalidate() - set the physical address to INVALID - * - * @n: the CEC notifier - * - * This is a simple helper function to invalidate the physical - * address. Does nothing if @n == NULL. - */ -static inline void cec_notifier_phys_addr_invalidate(struct cec_notifier *n) -{ - cec_notifier_set_phys_addr(n, CEC_PHYS_ADDR_INVALID); -} - #endif -- 2.53.0
