#include <linux/export.h>
#include <linux/i2c.h>
#include <linux/irq.h>
+#include <linux/minmax.h>
#include <linux/module.h>
#include <linux/mutex.h>
#include <linux/of.h>
static int dw_hdmi_qp_bridge_clear_hdmi_infoframe(struct drm_bridge *bridge)
{
- /* FIXME: add support for this InfoFrame */
+ struct dw_hdmi_qp *hdmi = bridge->driver_private;
- drm_warn_once(bridge->encoder->dev, "HDMI VSI not supported\n");
+ dw_hdmi_qp_mod(hdmi, 0, PKTSCHED_VSI_TX_EN, PKTSCHED_PKT_EN);
return 0;
}
return 0;
}
+static void dw_hdmi_qp_write_pkt(struct dw_hdmi_qp *hdmi, const u8 *buffer,
+ size_t start, size_t len, unsigned int reg)
+{
+ u32 val = 0;
+ size_t i;
+
+ for (i = start; i < start + len; i++)
+ val |= buffer[i] << ((i % 4) * BITS_PER_BYTE);
+
+ dw_hdmi_qp_write(hdmi, val, reg);
+}
+
+static void dw_hdmi_qp_write_infoframe(struct dw_hdmi_qp *hdmi, const u8 *buffer,
+ size_t len, unsigned int reg)
+{
+ size_t i;
+
+ /* InfoFrame packet header */
+ dw_hdmi_qp_write_pkt(hdmi, buffer, 1, 2, reg);
+
+ /* InfoFrame packet body */
+ for (i = 0; i < len - 3; i += 4)
+ dw_hdmi_qp_write_pkt(hdmi, buffer + 3, i, min(len - i - 3, 4),
+ reg + i + 4);
+}
+
static int dw_hdmi_qp_bridge_write_avi_infoframe(struct drm_bridge *bridge,
const u8 *buffer, size_t len)
{
static int dw_hdmi_qp_bridge_write_hdmi_infoframe(struct drm_bridge *bridge,
const u8 *buffer, size_t len)
{
+ struct dw_hdmi_qp *hdmi = bridge->driver_private;
+
dw_hdmi_qp_bridge_clear_hdmi_infoframe(bridge);
- /* FIXME: add support for the HDMI VSI */
+ dw_hdmi_qp_write_infoframe(hdmi, buffer, len, PKT_VSI_CONTENTS0);
+
+ dw_hdmi_qp_mod(hdmi, 0, PKTSCHED_VSI_FIELDRATE, PKTSCHED_PKT_CONFIG1);
+ dw_hdmi_qp_mod(hdmi, PKTSCHED_VSI_TX_EN, PKTSCHED_VSI_TX_EN,
+ PKTSCHED_PKT_EN);
return 0;
}
#define PKTSCHED_PRQUEUE2_CONFIG2 0xa94
#define PKTSCHED_PKT_CONFIG0 0xa98
#define PKTSCHED_PKT_CONFIG1 0xa9c
+#define PKTSCHED_VSI_FIELDRATE BIT(14)
#define PKTSCHED_DRMI_FIELDRATE BIT(13)
#define PKTSCHED_AVI_FIELDRATE BIT(12)
#define PKTSCHED_PKT_CONFIG2 0xaa0
#define PKTSCHED_DRMI_TX_EN BIT(17)
#define PKTSCHED_AUDI_TX_EN BIT(15)
#define PKTSCHED_AVI_TX_EN BIT(13)
+#define PKTSCHED_VSI_TX_EN BIT(12)
#define PKTSCHED_EMP_CVTEM_TX_EN BIT(10)
#define PKTSCHED_AMD_TX_EN BIT(8)
#define PKTSCHED_GCP_TX_EN BIT(3)