Currently the cec_notifier_parse_hdmi_phandle function can only be used if the HDMI device associated with the CEC device is a platform device. Extend the function to cover I2C devices as well, as there do exist some I2C HDMI devices which don't handle CEC internally and need an external CEC adapter. Signed-off-by: Johan Fjeldtvedt <johfjeld@xxxxxxxxx> --- drivers/media/cec/core/cec-notifier.c | 30 +++++++++++++++++---------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/drivers/media/cec/core/cec-notifier.c b/drivers/media/cec/core/cec-notifier.c index 95f363bb1d19..eec114908c0f 100644 --- a/drivers/media/cec/core/cec-notifier.c +++ b/drivers/media/cec/core/cec-notifier.c @@ -221,19 +221,27 @@ struct device *cec_notifier_parse_hdmi_phandle(struct device *dev) dev_err(dev, "Failed to find HDMI node in device tree\n"); return ERR_PTR(-ENODEV); } + hdmi_pdev = of_find_device_by_node(np); - of_node_put(np); - if (hdmi_pdev) { + if (hdmi_pdev) hdmi_dev = &hdmi_pdev->dev; - /* - * Note that the device struct is only used as a key into the - * cec_notifiers list, it is never actually accessed. - * So we decrement the reference here so we don't leak - * memory. - */ - put_device(hdmi_dev); - return hdmi_dev; + if (!hdmi_dev) { + struct i2c_client *hdmi_client = of_find_i2c_device_by_node(np); + + if (hdmi_client) + hdmi_dev = &hdmi_client->dev; } - return ERR_PTR(-EPROBE_DEFER); + of_node_put(np); + if (!hdmi_dev) + return ERR_PTR(-EPROBE_DEFER); + + /* + * Note that the device struct is only used as a key into the + * cec_notifiers list, it is never actually accessed. + * So we decrement the reference here so we don't leak + * memory. + */ + put_device(hdmi_dev); + return hdmi_dev; } EXPORT_SYMBOL_GPL(cec_notifier_parse_hdmi_phandle); -- 2.25.1