static int svdm_dp_attention(int port, uint32_t *payload) { int cur_lvl; int lvl = PD_VDO_DPSTS_HPD_LVL(payload[1]); int irq = PD_VDO_DPSTS_HPD_IRQ(payload[1]); enum gpio_signal hpd = PORT_TO_HPD(port); cur_lvl = gpio_get_level(hpd); dp_status[port] = payload[1]; /* Its initial DP status message prior to config */ if (!(dp_flags[port] & DP_FLAGS_DP_ON)) { if (lvl) dp_flags[port] |= DP_FLAGS_HPD_HI_PENDING; return 1; } if (irq & cur_lvl) { gpio_set_level(hpd, 0); hook_call_deferred(PORT_TO_HPD_IRQ_DEFERRED(port), HPD_DSTREAM_DEBOUNCE_IRQ); } else if (irq & !cur_lvl) { CPRINTF("ERR:HPD:IRQ&LOW\n"); return 0; /* nak */ } else { gpio_set_level(hpd, lvl); } /* ack */ return 1; }
static void svdm_dp_post_config(int port) { dp_flags[port] |= DP_FLAGS_DP_ON; if (!(dp_flags[port] & DP_FLAGS_HPD_HI_PENDING)) return; gpio_set_level(PORT_TO_HPD(port), 1); }
static int svdm_dp_attention(int port, uint32_t *payload) { int cur_lvl; int lvl = PD_VDO_HPD_LVL(payload[1]); int irq = PD_VDO_HPD_IRQ(payload[1]); enum gpio_signal hpd = PORT_TO_HPD(port); cur_lvl = gpio_get_level(hpd); if (irq & cur_lvl) { gpio_set_level(hpd, 0); /* 250 usecs is minimum, 2msec is max */ if (port) hook_call_deferred(hpd1_irq_deferred, 300); else hook_call_deferred(hpd0_irq_deferred, 300); } else if (irq & !cur_lvl) { CPRINTF("PE ERR: IRQ_HPD w/ HPD_LOW\n"); return 0; /* nak */ } else { gpio_set_level(hpd, lvl); } /* ack */ return 1; }
static void svdm_exit_dp_mode(int port) { svdm_safe_dp_mode(port); gpio_set_level(PORT_TO_HPD(port), 0); }