int mhl_msc_command_done(struct mhl_tx_ctrl *mhl_ctrl, struct msc_command_struct *req) { bool dongle_pwr_en = false; switch (req->command) { case MHL_WRITE_STAT: if (req->offset == MHL_STATUS_REG_LINK_MODE) { if (req->payload.data[0] & MHL_STATUS_PATH_ENABLED) { /* Enable TMDS output */ mhl_tmds_ctrl(mhl_ctrl, TMDS_ENABLE); if (mhl_ctrl->devcap_state == MHL_DEVCAP_ALL) { dongle_pwr_en = mhl_ctrl->devcap[ MHL_DEV_CATEGORY_OFFSET] & MHL_DEV_CATEGORY_POW_BIT; if (dongle_pwr_en) mhl_drive_hpd(mhl_ctrl, HPD_UP); } } else { /* Disable TMDS output */ mhl_tmds_ctrl(mhl_ctrl, TMDS_DISABLE); mhl_drive_hpd(mhl_ctrl, HPD_DOWN); } } break; case MHL_READ_DEVCAP: mhl_update_devcap(mhl_ctrl, req->offset, req->retval); mhl_ctrl->devcap_state |= BIT(req->offset); switch (req->offset) { case MHL_DEV_CATEGORY_OFFSET: if (req->retval & MHL_DEV_CATEGORY_POW_BIT) pr_debug("%s: devcap pow bit set\n", __func__); else pr_debug("%s: devcap pow bit unset\n", __func__); break; case DEVCAP_OFFSET_RESERVED: mhl_tmds_ctrl(mhl_ctrl, TMDS_ENABLE); mhl_drive_hpd(mhl_ctrl, HPD_UP); break; case DEVCAP_OFFSET_MHL_VERSION: case DEVCAP_OFFSET_INT_STAT_SIZE: if (mhl_qualify_path_enable(mhl_ctrl)) mhl_tmds_ctrl(mhl_ctrl, TMDS_ENABLE); break; } break; case MHL_WRITE_BURST: mhl_msc_send_set_int( mhl_ctrl, MHL_RCHANGE_INT, MHL_INT_DSCR_CHG, MSC_PRIORITY_SEND); break; } return 0; }
int mhl_msc_command_done(struct mhl_tx_ctrl *mhl_ctrl, struct msc_command_struct *req) { switch (req->command) { case MHL_WRITE_STAT: if (req->offset == MHL_STATUS_REG_LINK_MODE) { if (req->payload.data[0] & MHL_STATUS_PATH_ENABLED) { /* Enable TMDS output */ mhl_tmds_ctrl(mhl_ctrl, TMDS_ENABLE); if (mhl_ctrl->devcap_state == MHL_DEVCAP_ALL) { mhl_drive_hpd(mhl_ctrl, HPD_UP); mhl_ctrl->tmds_ctrl_en = true; } } else { /* Disable TMDS output */ mhl_tmds_ctrl(mhl_ctrl, TMDS_DISABLE); mhl_drive_hpd(mhl_ctrl, HPD_DOWN); } } break; case MHL_READ_DEVCAP: mhl_update_devcap(mhl_ctrl, req->offset, req->retval); mhl_ctrl->devcap_state |= BIT(req->offset); switch (req->offset) { case MHL_DEV_CATEGORY_OFFSET: if (req->retval & MHL_DEV_CATEGORY_POW_BIT) pr_debug("%s: devcap pow bit set\n", __func__); else pr_debug("%s: devcap pow bit unset\n", __func__); power_supply_set_present(&mhl_ctrl->mhl_psy, !!(req->retval & MHL_DEV_CATEGORY_POW_BIT)); break; case DEVCAP_OFFSET_FEATURE_FLAG: mhl_rap_send_msc_msg(mhl_ctrl, MHL_RAP_CONTENT_ON); break; case DEVCAP_OFFSET_RESERVED: if (mhl_qualify_path_enable(mhl_ctrl)) { mhl_tmds_ctrl(mhl_ctrl, TMDS_ENABLE); mhl_drive_hpd(mhl_ctrl, HPD_UP); mhl_ctrl->tmds_ctrl_en = true; } break; } break; case MHL_WRITE_BURST: mhl_msc_send_set_int( mhl_ctrl, MHL_RCHANGE_INT, MHL_INT_DSCR_CHG, MSC_PRIORITY_SEND); break; } return 0; }
int mhl_msc_command_done(struct mhl_tx_ctrl *mhl_ctrl, struct msc_command_struct *req) { switch (req->command) { case MHL_WRITE_STAT: if (req->offset == MHL_STATUS_REG_LINK_MODE) { if (req->payload.data[0] & MHL_STATUS_PATH_ENABLED) /* Enable TMDS output */ mhl_tmds_ctrl(mhl_ctrl, TMDS_ENABLE); else /* Disable TMDS output */ mhl_tmds_ctrl(mhl_ctrl, TMDS_DISABLE); } break; case MHL_READ_DEVCAP: mhl_update_devcap(mhl_ctrl, req->offset, req->retval); mhl_ctrl->devcap_state |= BIT(req->offset); switch (req->offset) { case MHL_DEV_CATEGORY_OFFSET: if (req->retval & MHL_DEV_CATEGORY_POW_BIT) pr_debug("%s: devcap pow bit set\n", __func__); else pr_debug("%s: devcap pow bit unset\n", __func__); break; case DEVCAP_OFFSET_MHL_VERSION: case DEVCAP_OFFSET_INT_STAT_SIZE: break; } break; case MHL_WRITE_BURST: mhl_msc_send_set_int( mhl_ctrl, MHL_RCHANGE_INT, MHL_INT_DSCR_CHG, MSC_PRIORITY_SEND); break; } return 0; }