static void sun4i_hdmi_cec_pin_low(struct cec_adapter *adap) { struct sun4i_hdmi *hdmi = cec_get_drvdata(adap); /* Start driving the CEC pin low */ writel(SUN4I_HDMI_CEC_ENABLE, hdmi->base + SUN4I_HDMI_CEC); }
static int s5p_cec_adap_log_addr(struct cec_adapter *adap, u8 addr) { struct s5p_cec_dev *cec = cec_get_drvdata(adap); s5p_cec_set_addr(cec, addr); return 0; }
static int rain_cec_adap_transmit(struct cec_adapter *adap, u8 attempts, u32 signal_free_time, struct cec_msg *msg) { struct rain *rain = cec_get_drvdata(adap); char cmd[2 * CEC_MAX_MSG_SIZE + 16]; unsigned int i; int err; if (msg->len == 1) { snprintf(cmd, sizeof(cmd), "x%x", cec_msg_destination(msg)); } else { char hex[3]; snprintf(cmd, sizeof(cmd), "x%x %02x ", cec_msg_destination(msg), msg->msg[1]); for (i = 2; i < msg->len; i++) { snprintf(hex, sizeof(hex), "%02x", msg->msg[i]); strlcat(cmd, hex, sizeof(cmd)); } } mutex_lock(&rain->write_lock); err = rain_send(rain, cmd); mutex_unlock(&rain->write_lock); return err; }
static int drm_dp_cec_adap_enable(struct cec_adapter *adap, bool enable) { struct drm_dp_aux *aux = cec_get_drvdata(adap); u32 val = enable ? DP_CEC_TUNNELING_ENABLE : 0; ssize_t err = 0; err = drm_dp_dpcd_writeb(aux, DP_CEC_TUNNELING_CONTROL, val); return (enable && err < 0) ? err : 0; }
static void sun4i_hdmi_cec_pin_high(struct cec_adapter *adap) { struct sun4i_hdmi *hdmi = cec_get_drvdata(adap); /* * Stop driving the CEC pin, the pull up will take over * unless another CEC device is driving the pin low. */ writel(0, hdmi->base + SUN4I_HDMI_CEC); }
static int rain_cec_adap_log_addr(struct cec_adapter *adap, u8 log_addr) { struct rain *rain = cec_get_drvdata(adap); u8 cmd[16]; if (log_addr == CEC_LOG_ADDR_INVALID) log_addr = CEC_LOG_ADDR_UNREGISTERED; snprintf(cmd, sizeof(cmd), "A %x", log_addr); return rain_send_and_wait(rain, cmd, "ADR"); }
static int s5p_cec_adap_transmit(struct cec_adapter *adap, u8 attempts, u32 signal_free_time, struct cec_msg *msg) { struct s5p_cec_dev *cec = cec_get_drvdata(adap); /* * Unclear if 0 retries are allowed by the hardware, so have 1 as * the minimum. */ s5p_cec_copy_packet(cec, msg->msg, msg->len, max(1, attempts - 1)); return 0; }
static int drm_dp_cec_adap_log_addr(struct cec_adapter *adap, u8 addr) { struct drm_dp_aux *aux = cec_get_drvdata(adap); /* Bit 15 (logical address 15) should always be set */ u16 la_mask = 1 << CEC_LOG_ADDR_BROADCAST; u8 mask[2]; ssize_t err; if (addr != CEC_LOG_ADDR_INVALID) la_mask |= adap->log_addrs.log_addr_mask | (1 << addr); mask[0] = la_mask & 0xff; mask[1] = la_mask >> 8; err = drm_dp_dpcd_write(aux, DP_CEC_LOGICAL_ADDRESS_MASK, mask, 2); return (addr != CEC_LOG_ADDR_INVALID && err < 0) ? err : 0; }
static int drm_dp_cec_adap_transmit(struct cec_adapter *adap, u8 attempts, u32 signal_free_time, struct cec_msg *msg) { struct drm_dp_aux *aux = cec_get_drvdata(adap); unsigned int retries = min(5, attempts - 1); ssize_t err; err = drm_dp_dpcd_write(aux, DP_CEC_TX_MESSAGE_BUFFER, msg->msg, msg->len); if (err < 0) return err; err = drm_dp_dpcd_writeb(aux, DP_CEC_TX_MESSAGE_INFO, (msg->len - 1) | (retries << 4) | DP_CEC_TX_MESSAGE_SEND); return err < 0 ? err : 0; }
static int drm_dp_cec_adap_monitor_all_enable(struct cec_adapter *adap, bool enable) { struct drm_dp_aux *aux = cec_get_drvdata(adap); ssize_t err; u8 val; if (!(adap->capabilities & CEC_CAP_MONITOR_ALL)) return 0; err = drm_dp_dpcd_readb(aux, DP_CEC_TUNNELING_CONTROL, &val); if (err >= 0) { if (enable) val |= DP_CEC_SNOOPING_ENABLE; else val &= ~DP_CEC_SNOOPING_ENABLE; err = drm_dp_dpcd_writeb(aux, DP_CEC_TUNNELING_CONTROL, val); } return (enable && err < 0) ? err : 0; }
static void drm_dp_cec_adap_status(struct cec_adapter *adap, struct seq_file *file) { struct drm_dp_aux *aux = cec_get_drvdata(adap); struct drm_dp_desc desc; struct drm_dp_dpcd_ident *id = &desc.ident; if (drm_dp_read_desc(aux, &desc, true)) return; seq_printf(file, "OUI: %*phD\n", (int)sizeof(id->oui), id->oui); seq_printf(file, "ID: %*pE\n", (int)strnlen(id->device_id, sizeof(id->device_id)), id->device_id); seq_printf(file, "HW Rev: %d.%d\n", id->hw_rev >> 4, id->hw_rev & 0xf); /* * Show this both in decimal and hex: at least one vendor * always reports this in hex. */ seq_printf(file, "FW/SW Rev: %d.%d (0x%02x.0x%02x)\n", id->sw_major_rev, id->sw_minor_rev, id->sw_major_rev, id->sw_minor_rev); }
static int s5p_cec_adap_enable(struct cec_adapter *adap, bool enable) { struct s5p_cec_dev *cec = cec_get_drvdata(adap); if (enable) { pm_runtime_get_sync(cec->dev); s5p_cec_reset(cec); s5p_cec_set_divider(cec); s5p_cec_threshold(cec); s5p_cec_unmask_tx_interrupts(cec); s5p_cec_unmask_rx_interrupts(cec); s5p_cec_enable_rx(cec); } else { s5p_cec_mask_tx_interrupts(cec); s5p_cec_mask_rx_interrupts(cec); pm_runtime_disable(cec->dev); } return 0; }
static bool sun4i_hdmi_cec_pin_read(struct cec_adapter *adap) { struct sun4i_hdmi *hdmi = cec_get_drvdata(adap); return readl(hdmi->base + SUN4I_HDMI_CEC) & SUN4I_HDMI_CEC_RX; }