struct hdmi *hdmi = hdmi_dev->hdmi;
struct delayed_work *delay_work;
struct pinctrl_state *gpio_state;
+#ifdef CONFIG_PINCTRL
+ struct dev_pin_info *pins = hdmi_dev->dev->pins;
+#endif
if (action == FB_EARLY_EVENT_BLANK) {
switch (blank_mode) {
0, NULL);
if (delay_work)
flush_delayed_work(delay_work);
+ if (hdmi_dev->hdcp2_en)
+ hdmi_dev->hdcp2_en(0);
rockchip_hdmiv2_clk_disable(hdmi_dev);
- gpio_state = pinctrl_lookup_state(hdmi_dev->dev->pins->p, "gpio");
- pinctrl_select_state(hdmi_dev->dev->pins->p, gpio_state);
+ #ifdef CONFIG_PINCTRL
+ gpio_state =
+ pinctrl_lookup_state(pins->p,
+ "gpio");
+ pinctrl_select_state(pins->p,
+ gpio_state);
+ #endif
}
break;
}
case FB_BLANK_UNBLANK:
HDMIDBG("resume hdmi\n");
if (hdmi->sleep) {
- pinctrl_select_state(hdmi_dev->dev->pins->p,
- hdmi_dev->dev->pins->default_state);
+ #ifdef CONFIG_PINCTRL
+ pinctrl_select_state(pins->p,
+ pins->default_state);
+ #endif
rockchip_hdmiv2_clk_enable(hdmi_dev);
rockchip_hdmiv2_dev_initial(hdmi_dev);
if (hdmi->ops->hdcp_power_on_cb)
hdmi->ops->hdcp_power_on_cb();
+ if (hdmi_dev->hdcp2_reset)
+ hdmi_dev->hdcp2_reset();
+ if (hdmi_dev->hdcp2_en)
+ hdmi_dev->hdcp2_en(1);
hdmi_submit_work(hdmi, HDMI_RESUME_CTL,
0, NULL);
}
};
static struct miscdevice mdev;
-static struct hdcp *hdcp = NULL;
+static struct hdcp *hdcp;
static void hdcp_load_key(struct hdmi *hdmi, struct hdcp_keys *key)
{
hdcp_load_key(hdmi, hdcp->keys);
}
+void rockchip_hdmiv2_hdcp2_enable(int enable)
+{
+ struct hdmi_dev *hdmi_dev;
+
+ if (!hdcp) {
+ pr_err("rockchip hdmiv2 hdcp is not exist\n");
+ return;
+ }
+ hdmi_dev = hdcp->hdmi->property->priv;
+ if (hdmi_dev->soctype == HDMI_SOC_RK3368 &&
+ hdmi_dev->hdcp2_enable != enable) {
+ hdmi_dev->hdcp2_enable = enable;
+ if (hdmi_dev->hdcp2_enable == 0) {
+ hdmi_msk_reg(hdmi_dev, HDCP2REG_CTRL,
+ m_HDCP2_OVR_EN | m_HDCP2_FORCE,
+ v_HDCP2_OVR_EN(1) | v_HDCP2_FORCE(0));
+ hdmi_writel(hdmi_dev, HDCP2REG_MASK, 0xff);
+ hdmi_writel(hdmi_dev, HDCP2REG_MUTE, 0xff);
+ } else {
+ hdmi_msk_reg(hdmi_dev, HDCP2REG_CTRL,
+ m_HDCP2_OVR_EN | m_HDCP2_FORCE,
+ v_HDCP2_OVR_EN(0) | v_HDCP2_FORCE(0));
+ hdmi_writel(hdmi_dev, HDCP2REG_MASK, 0x00);
+ hdmi_writel(hdmi_dev, HDCP2REG_MUTE, 0x00);
+ }
+ }
+}
+EXPORT_SYMBOL(rockchip_hdmiv2_hdcp2_enable);
+
+void rockchip_hdmiv2_hdcp2_init(void (*hdcp2_enble)(int),
+ void (*hdcp2_reset)(void),
+ void (*hdcp2_start)(void))
+{
+ struct hdmi_dev *hdmi_dev;
+
+ if (!hdcp) {
+ pr_err("rockchip hdmiv2 hdcp is not exist\n");
+ return;
+ }
+ hdmi_dev = hdcp->hdmi->property->priv;
+ hdmi_dev->hdcp2_en = hdcp2_enble;
+ hdmi_dev->hdcp2_reset = hdcp2_reset;
+ hdmi_dev->hdcp2_start = hdcp2_start;
+}
+EXPORT_SYMBOL(rockchip_hdmiv2_hdcp2_init);
+
static void rockchip_hdmiv2_hdcp_start(struct hdmi *hdmi)
{
struct hdmi_dev *hdmi_dev = hdmi->property->priv;
if (!hdcp->enable)
return;
if (hdmi_dev->soctype == HDMI_SOC_RK3368) {
- hdmi_msk_reg(hdmi_dev, HDCP2REG_CTRL,
- m_HDCP2_OVR_EN | m_HDCP2_FORCE,
- v_HDCP2_OVR_EN(1) | v_HDCP2_FORCE(0));
- hdmi_writel(hdmi_dev, HDCP2REG_MASK, 0x00);
- hdmi_writel(hdmi_dev, HDCP2REG_MUTE, 0x00);
+ if (hdmi_dev->hdcp2_enable == 0) {
+ hdmi_msk_reg(hdmi_dev, HDCP2REG_CTRL,
+ m_HDCP2_OVR_EN | m_HDCP2_FORCE,
+ v_HDCP2_OVR_EN(1) | v_HDCP2_FORCE(0));
+ hdmi_writel(hdmi_dev, HDCP2REG_MASK, 0xff);
+ hdmi_writel(hdmi_dev, HDCP2REG_MUTE, 0xff);
+ } else {
+ hdmi_msk_reg(hdmi_dev, HDCP2REG_CTRL,
+ m_HDCP2_OVR_EN | m_HDCP2_FORCE,
+ v_HDCP2_OVR_EN(0) | v_HDCP2_FORCE(0));
+ hdmi_writel(hdmi_dev, HDCP2REG_MASK, 0x00);
+ hdmi_writel(hdmi_dev, HDCP2REG_MUTE, 0x00);
+ }
}
hdmi_msk_reg(hdmi_dev, FC_INVIDCONF,
hdmi_msk_reg(hdmi_dev, MC_CLKDIS,
m_HDCPCLK_DISABLE, v_HDCPCLK_DISABLE(0));
+ if (hdmi_dev->hdcp2_start)
+ hdmi_dev->hdcp2_start();
pr_info("%s success\n", __func__);
}
m_HDCPCLK_DISABLE, v_HDCPCLK_DISABLE(1));
hdmi_writel(hdmi_dev, A_APIINTMSK, 0xff);
hdmi_msk_reg(hdmi_dev, A_HDCPCFG0, m_RX_DETECT, v_RX_DETECT(0));
+ rockchip_hdmiv2_hdcp2_enable(0);
}
static ssize_t hdcp_enable_read(struct device *device,
else
hdcp_load_key(hdmi, hdcp->keys);
}
-
HDMIDBG("hbr mode.\n");
hdmi_writel(hdmi_dev, AUD_CONF2, 0x1);
word_length = I2S_24BIT_SAMPLE;
- } else if ((HDMI_AUDIO_FS_48000 == audio->rate)
- || (HDMI_AUDIO_FS_192000 == audio->rate)) {
+ } else if ((HDMI_AUDIO_FS_48000 == audio->rate) ||
+ (HDMI_AUDIO_FS_192000 == audio->rate)) {
HDMIDBG("nlpcm mode.\n");
hdmi_writel(hdmi_dev, AUD_CONF2, 0x2);
word_length = I2S_24BIT_SAMPLE;
if (hdcp2_int) {
hdmi_writel(hdmi_dev, HDCP2REG_STAT, hdcp2_int);
pr_info("hdcp2_int is 0x%02x\n", hdcp2_int);
+ if ((hdcp2_int & m_HDCP2_AUTH_FAIL ||
+ hdcp2_int & m_HDCP2_AUTH_LOST) &&
+ hdmi_dev->hdcp2_start) {
+ pr_info("hdcp2 failed or lost\n");
+ hdmi_dev->hdcp2_start();
+ }
}
return IRQ_HANDLED;
}