Loading drivers/gpu/drm/omapdrm/omap_connector.c +12 −0 Original line number Diff line number Diff line Loading @@ -32,8 +32,16 @@ struct omap_connector { struct drm_connector base; struct omap_dss_device *dssdev; struct drm_encoder *encoder; bool hdmi_mode; }; bool omap_connector_get_hdmi_mode(struct drm_connector *connector) { struct omap_connector *omap_connector = to_omap_connector(connector); return omap_connector->hdmi_mode; } void copy_timings_omap_to_drm(struct drm_display_mode *mode, struct omap_video_timings *timings) { Loading Loading @@ -162,10 +170,14 @@ static int omap_connector_get_modes(struct drm_connector *connector) drm_mode_connector_update_edid_property( connector, edid); n = drm_add_edid_modes(connector, edid); omap_connector->hdmi_mode = drm_detect_hdmi_monitor(edid); } else { drm_mode_connector_update_edid_property( connector, NULL); } kfree(edid); } else { struct drm_display_mode *mode = drm_mode_create(dev); Loading drivers/gpu/drm/omapdrm/omap_drv.h +1 −0 Original line number Diff line number Diff line Loading @@ -194,6 +194,7 @@ struct drm_encoder *omap_connector_attached_encoder( struct drm_connector *connector); void omap_connector_flush(struct drm_connector *connector, int x, int y, int w, int h); bool omap_connector_get_hdmi_mode(struct drm_connector *connector); void copy_timings_omap_to_drm(struct drm_display_mode *mode, struct omap_video_timings *timings); Loading drivers/gpu/drm/omapdrm/omap_encoder.c +27 −0 Original line number Diff line number Diff line Loading @@ -17,6 +17,8 @@ * this program. If not, see <http://www.gnu.org/licenses/>. */ #include <drm/drm_edid.h> #include "omap_drv.h" #include "drm_crtc.h" Loading Loading @@ -89,6 +91,31 @@ static void omap_encoder_mode_set(struct drm_encoder *encoder, struct drm_display_mode *mode, struct drm_display_mode *adjusted_mode) { struct drm_device *dev = encoder->dev; struct omap_encoder *omap_encoder = to_omap_encoder(encoder); struct omap_dss_device *dssdev = omap_encoder->dssdev; struct drm_connector *connector; bool hdmi_mode; int r; hdmi_mode = false; list_for_each_entry(connector, &dev->mode_config.connector_list, head) { if (connector->encoder == encoder) { hdmi_mode = omap_connector_get_hdmi_mode(connector); break; } } if (dssdev->driver->set_hdmi_mode) dssdev->driver->set_hdmi_mode(dssdev, hdmi_mode); if (hdmi_mode && dssdev->driver->set_hdmi_infoframe) { struct hdmi_avi_infoframe avi; r = drm_hdmi_avi_infoframe_from_display_mode(&avi, adjusted_mode); if (r == 0) dssdev->driver->set_hdmi_infoframe(dssdev, &avi); } } static void omap_encoder_prepare(struct drm_encoder *encoder) Loading drivers/video/fbdev/omap2/displays-new/connector-hdmi.c +19 −0 Original line number Diff line number Diff line Loading @@ -262,6 +262,23 @@ static int hdmic_audio_config(struct omap_dss_device *dssdev, return 0; } static int hdmic_set_hdmi_mode(struct omap_dss_device *dssdev, bool hdmi_mode) { struct panel_drv_data *ddata = to_panel_data(dssdev); struct omap_dss_device *in = ddata->in; return in->ops.hdmi->set_hdmi_mode(in, hdmi_mode); } static int hdmic_set_infoframe(struct omap_dss_device *dssdev, const struct hdmi_avi_infoframe *avi) { struct panel_drv_data *ddata = to_panel_data(dssdev); struct omap_dss_device *in = ddata->in; return in->ops.hdmi->set_infoframe(in, avi); } static struct omap_dss_driver hdmic_driver = { .connect = hdmic_connect, .disconnect = hdmic_disconnect, Loading @@ -277,6 +294,8 @@ static struct omap_dss_driver hdmic_driver = { .read_edid = hdmic_read_edid, .detect = hdmic_detect, .set_hdmi_mode = hdmic_set_hdmi_mode, .set_hdmi_infoframe = hdmic_set_infoframe, .audio_enable = hdmic_audio_enable, .audio_disable = hdmic_audio_disable, Loading drivers/video/fbdev/omap2/displays-new/encoder-tpd12s015.c +20 −0 Original line number Diff line number Diff line Loading @@ -242,6 +242,24 @@ static int tpd_audio_config(struct omap_dss_device *dssdev, return in->ops.hdmi->audio_config(in, audio); } static int tpd_set_infoframe(struct omap_dss_device *dssdev, const struct hdmi_avi_infoframe *avi) { struct panel_drv_data *ddata = to_panel_data(dssdev); struct omap_dss_device *in = ddata->in; return in->ops.hdmi->set_infoframe(in, avi); } static int tpd_set_hdmi_mode(struct omap_dss_device *dssdev, bool hdmi_mode) { struct panel_drv_data *ddata = to_panel_data(dssdev); struct omap_dss_device *in = ddata->in; return in->ops.hdmi->set_hdmi_mode(in, hdmi_mode); } static const struct omapdss_hdmi_ops tpd_hdmi_ops = { .connect = tpd_connect, .disconnect = tpd_disconnect, Loading @@ -255,6 +273,8 @@ static const struct omapdss_hdmi_ops tpd_hdmi_ops = { .read_edid = tpd_read_edid, .detect = tpd_detect, .set_infoframe = tpd_set_infoframe, .set_hdmi_mode = tpd_set_hdmi_mode, .audio_enable = tpd_audio_enable, .audio_disable = tpd_audio_disable, Loading Loading
drivers/gpu/drm/omapdrm/omap_connector.c +12 −0 Original line number Diff line number Diff line Loading @@ -32,8 +32,16 @@ struct omap_connector { struct drm_connector base; struct omap_dss_device *dssdev; struct drm_encoder *encoder; bool hdmi_mode; }; bool omap_connector_get_hdmi_mode(struct drm_connector *connector) { struct omap_connector *omap_connector = to_omap_connector(connector); return omap_connector->hdmi_mode; } void copy_timings_omap_to_drm(struct drm_display_mode *mode, struct omap_video_timings *timings) { Loading Loading @@ -162,10 +170,14 @@ static int omap_connector_get_modes(struct drm_connector *connector) drm_mode_connector_update_edid_property( connector, edid); n = drm_add_edid_modes(connector, edid); omap_connector->hdmi_mode = drm_detect_hdmi_monitor(edid); } else { drm_mode_connector_update_edid_property( connector, NULL); } kfree(edid); } else { struct drm_display_mode *mode = drm_mode_create(dev); Loading
drivers/gpu/drm/omapdrm/omap_drv.h +1 −0 Original line number Diff line number Diff line Loading @@ -194,6 +194,7 @@ struct drm_encoder *omap_connector_attached_encoder( struct drm_connector *connector); void omap_connector_flush(struct drm_connector *connector, int x, int y, int w, int h); bool omap_connector_get_hdmi_mode(struct drm_connector *connector); void copy_timings_omap_to_drm(struct drm_display_mode *mode, struct omap_video_timings *timings); Loading
drivers/gpu/drm/omapdrm/omap_encoder.c +27 −0 Original line number Diff line number Diff line Loading @@ -17,6 +17,8 @@ * this program. If not, see <http://www.gnu.org/licenses/>. */ #include <drm/drm_edid.h> #include "omap_drv.h" #include "drm_crtc.h" Loading Loading @@ -89,6 +91,31 @@ static void omap_encoder_mode_set(struct drm_encoder *encoder, struct drm_display_mode *mode, struct drm_display_mode *adjusted_mode) { struct drm_device *dev = encoder->dev; struct omap_encoder *omap_encoder = to_omap_encoder(encoder); struct omap_dss_device *dssdev = omap_encoder->dssdev; struct drm_connector *connector; bool hdmi_mode; int r; hdmi_mode = false; list_for_each_entry(connector, &dev->mode_config.connector_list, head) { if (connector->encoder == encoder) { hdmi_mode = omap_connector_get_hdmi_mode(connector); break; } } if (dssdev->driver->set_hdmi_mode) dssdev->driver->set_hdmi_mode(dssdev, hdmi_mode); if (hdmi_mode && dssdev->driver->set_hdmi_infoframe) { struct hdmi_avi_infoframe avi; r = drm_hdmi_avi_infoframe_from_display_mode(&avi, adjusted_mode); if (r == 0) dssdev->driver->set_hdmi_infoframe(dssdev, &avi); } } static void omap_encoder_prepare(struct drm_encoder *encoder) Loading
drivers/video/fbdev/omap2/displays-new/connector-hdmi.c +19 −0 Original line number Diff line number Diff line Loading @@ -262,6 +262,23 @@ static int hdmic_audio_config(struct omap_dss_device *dssdev, return 0; } static int hdmic_set_hdmi_mode(struct omap_dss_device *dssdev, bool hdmi_mode) { struct panel_drv_data *ddata = to_panel_data(dssdev); struct omap_dss_device *in = ddata->in; return in->ops.hdmi->set_hdmi_mode(in, hdmi_mode); } static int hdmic_set_infoframe(struct omap_dss_device *dssdev, const struct hdmi_avi_infoframe *avi) { struct panel_drv_data *ddata = to_panel_data(dssdev); struct omap_dss_device *in = ddata->in; return in->ops.hdmi->set_infoframe(in, avi); } static struct omap_dss_driver hdmic_driver = { .connect = hdmic_connect, .disconnect = hdmic_disconnect, Loading @@ -277,6 +294,8 @@ static struct omap_dss_driver hdmic_driver = { .read_edid = hdmic_read_edid, .detect = hdmic_detect, .set_hdmi_mode = hdmic_set_hdmi_mode, .set_hdmi_infoframe = hdmic_set_infoframe, .audio_enable = hdmic_audio_enable, .audio_disable = hdmic_audio_disable, Loading
drivers/video/fbdev/omap2/displays-new/encoder-tpd12s015.c +20 −0 Original line number Diff line number Diff line Loading @@ -242,6 +242,24 @@ static int tpd_audio_config(struct omap_dss_device *dssdev, return in->ops.hdmi->audio_config(in, audio); } static int tpd_set_infoframe(struct omap_dss_device *dssdev, const struct hdmi_avi_infoframe *avi) { struct panel_drv_data *ddata = to_panel_data(dssdev); struct omap_dss_device *in = ddata->in; return in->ops.hdmi->set_infoframe(in, avi); } static int tpd_set_hdmi_mode(struct omap_dss_device *dssdev, bool hdmi_mode) { struct panel_drv_data *ddata = to_panel_data(dssdev); struct omap_dss_device *in = ddata->in; return in->ops.hdmi->set_hdmi_mode(in, hdmi_mode); } static const struct omapdss_hdmi_ops tpd_hdmi_ops = { .connect = tpd_connect, .disconnect = tpd_disconnect, Loading @@ -255,6 +273,8 @@ static const struct omapdss_hdmi_ops tpd_hdmi_ops = { .read_edid = tpd_read_edid, .detect = tpd_detect, .set_infoframe = tpd_set_infoframe, .set_hdmi_mode = tpd_set_hdmi_mode, .audio_enable = tpd_audio_enable, .audio_disable = tpd_audio_disable, Loading