Commit bca55958 authored by Benjamin Gaignard's avatar Benjamin Gaignard Committed by Mauro Carvalho Chehab

[media] sti: hdmi: add CEC notifier support

Implement the CEC notifier support to allow CEC drivers to
be informed when there is a new physical address.
Signed-off-by: default avatarBenjamin Gaignard <benjamin.gaignard@linaro.org>
Signed-off-by: default avatarHans Verkuil <hans.verkuil@cisco.com>
Acked-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@s-opensource.com>
parent e3a93adc
...@@ -771,6 +771,8 @@ static void sti_hdmi_disable(struct drm_bridge *bridge) ...@@ -771,6 +771,8 @@ static void sti_hdmi_disable(struct drm_bridge *bridge)
clk_disable_unprepare(hdmi->clk_pix); clk_disable_unprepare(hdmi->clk_pix);
hdmi->enabled = false; hdmi->enabled = false;
cec_notifier_set_phys_addr(hdmi->notifier, CEC_PHYS_ADDR_INVALID);
} }
/** /**
...@@ -973,6 +975,7 @@ static int sti_hdmi_connector_get_modes(struct drm_connector *connector) ...@@ -973,6 +975,7 @@ static int sti_hdmi_connector_get_modes(struct drm_connector *connector)
DRM_DEBUG_KMS("%s : %dx%d cm\n", DRM_DEBUG_KMS("%s : %dx%d cm\n",
(hdmi->hdmi_monitor ? "hdmi monitor" : "dvi monitor"), (hdmi->hdmi_monitor ? "hdmi monitor" : "dvi monitor"),
edid->width_cm, edid->height_cm); edid->width_cm, edid->height_cm);
cec_notifier_set_phys_addr_from_edid(hdmi->notifier, edid);
count = drm_add_edid_modes(connector, edid); count = drm_add_edid_modes(connector, edid);
drm_mode_connector_update_edid_property(connector, edid); drm_mode_connector_update_edid_property(connector, edid);
...@@ -1035,6 +1038,7 @@ sti_hdmi_connector_detect(struct drm_connector *connector, bool force) ...@@ -1035,6 +1038,7 @@ sti_hdmi_connector_detect(struct drm_connector *connector, bool force)
} }
DRM_DEBUG_DRIVER("hdmi cable disconnected\n"); DRM_DEBUG_DRIVER("hdmi cable disconnected\n");
cec_notifier_set_phys_addr(hdmi->notifier, CEC_PHYS_ADDR_INVALID);
return connector_status_disconnected; return connector_status_disconnected;
} }
...@@ -1423,6 +1427,10 @@ static int sti_hdmi_probe(struct platform_device *pdev) ...@@ -1423,6 +1427,10 @@ static int sti_hdmi_probe(struct platform_device *pdev)
goto release_adapter; goto release_adapter;
} }
hdmi->notifier = cec_notifier_get(&pdev->dev);
if (!hdmi->notifier)
goto release_adapter;
hdmi->reset = devm_reset_control_get(dev, "hdmi"); hdmi->reset = devm_reset_control_get(dev, "hdmi");
/* Take hdmi out of reset */ /* Take hdmi out of reset */
if (!IS_ERR(hdmi->reset)) if (!IS_ERR(hdmi->reset))
...@@ -1442,11 +1450,14 @@ static int sti_hdmi_remove(struct platform_device *pdev) ...@@ -1442,11 +1450,14 @@ static int sti_hdmi_remove(struct platform_device *pdev)
{ {
struct sti_hdmi *hdmi = dev_get_drvdata(&pdev->dev); struct sti_hdmi *hdmi = dev_get_drvdata(&pdev->dev);
cec_notifier_set_phys_addr(hdmi->notifier, CEC_PHYS_ADDR_INVALID);
i2c_put_adapter(hdmi->ddc_adapt); i2c_put_adapter(hdmi->ddc_adapt);
if (hdmi->audio_pdev) if (hdmi->audio_pdev)
platform_device_unregister(hdmi->audio_pdev); platform_device_unregister(hdmi->audio_pdev);
component_del(&pdev->dev, &sti_hdmi_ops); component_del(&pdev->dev, &sti_hdmi_ops);
cec_notifier_put(hdmi->notifier);
return 0; return 0;
} }
......
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <drm/drmP.h> #include <drm/drmP.h>
#include <media/cec-notifier.h>
#define HDMI_STA 0x0010 #define HDMI_STA 0x0010
#define HDMI_STA_DLL_LCK BIT(5) #define HDMI_STA_DLL_LCK BIT(5)
...@@ -64,6 +65,7 @@ static const struct drm_prop_enum_list colorspace_mode_names[] = { ...@@ -64,6 +65,7 @@ static const struct drm_prop_enum_list colorspace_mode_names[] = {
* @audio_pdev: ASoC hdmi-codec platform device * @audio_pdev: ASoC hdmi-codec platform device
* @audio: hdmi audio parameters. * @audio: hdmi audio parameters.
* @drm_connector: hdmi connector * @drm_connector: hdmi connector
* @notifier: hotplug detect notifier
*/ */
struct sti_hdmi { struct sti_hdmi {
struct device dev; struct device dev;
...@@ -89,6 +91,7 @@ struct sti_hdmi { ...@@ -89,6 +91,7 @@ struct sti_hdmi {
struct platform_device *audio_pdev; struct platform_device *audio_pdev;
struct hdmi_audio_params audio; struct hdmi_audio_params audio;
struct drm_connector *drm_connector; struct drm_connector *drm_connector;
struct cec_notifier *notifier;
}; };
u32 hdmi_read(struct sti_hdmi *hdmi, int offset); u32 hdmi_read(struct sti_hdmi *hdmi, int offset);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment