Add hdmi pixel clock support range check for imx8m.
Signed-off-by: Sandor Yu <Sandor.yu@nxp.com>
#include "API_AFE_t28hpc_hdmitx.h"
#include "t28hpc_hdmitx_table.h"
+/* check pixel clock rate in
+ * Table 8. HDMI TX pixel clock */
+int pixel_clock_range_t28hpc(struct drm_display_mode *mode)
+{
+ int i, row, rate;
+
+ row = T28HPC_HDMITX_CLOCK_CONTROL_TABLE_ROWS_PIXEL_OUT;
+ for (i = 0; i < row; i++) {
+ rate = t28hpc_hdmitx_clock_control_table_pixel_out[i][T8_PIXEL_CLK_FREQ_KHZ];
+ if (rate == mode->clock)
+ return 1;
+ }
+ return 0;
+}
+
int phy_cfg_hdp_t28hpc(state_struct *state,
int num_lanes,
struct drm_display_mode *mode,
int hdmi_get_hpd_state(state_struct *state, u8 *hpd);
int hdmi_write_hdr_metadata(state_struct *state,
union hdmi_infoframe *hdr_infoframe);
+int pixel_clock_range_t28hpc(struct drm_display_mode *mode);
#endif
connector);
enum drm_mode_status mode_status = MODE_OK;
struct drm_cmdline_mode *cmdline_mode;
+ int ret;
cmdline_mode = &connector->cmdline_mode;
else if (!hdp->is_4kp60 && mode->clock > 297000)
return MODE_CLOCK_HIGH;
+ ret = imx_hdp_call(hdp, pixel_clock_range, mode);
+ if (ret == 0) {
+ DRM_DEBUG("pixel clock %d out of range\n", mode->clock);
+ return MODE_CLOCK_RANGE;
+ }
+
/* 4096x2160 is not supported now */
if (mode->hdisplay > 3840)
return MODE_BAD_HVALUE;
if (mode->vdisplay > 2160)
return MODE_BAD_VVALUE;
+
return mode_status;
}
.get_edid_block = hdmi_get_edid_block,
.get_hpd_state = hdmi_get_hpd_state,
.write_hdr_metadata = hdmi_write_hdr_metadata,
+ .pixel_clock_range = pixel_clock_range_t28hpc,
};
static struct hdp_devtype imx8mq_hdmi_devtype = {
int (*pixel_clock_enable)(struct hdp_clks *clks);
void (*pixel_clock_disable)(struct hdp_clks *clks);
void (*pixel_clock_set_rate)(struct hdp_clks *clks);
+ int (*pixel_clock_range)(struct drm_display_mode *mode);
};
struct hdp_devtype {