1874,1878c1874 < /* < * Does the exact opposite of set_fmt_params < * It makes sure the DataPath register is sane after tear down < */ < static void unset_fmt_params(struct vip_stream *stream) --- > static void vip_disable_sc_path(struct vip_stream *stream) 1883,1884c1879 < stream->sequence = 0; < stream->field = V4L2_FIELD_TOP; --- > vip_dbg(3, dev, "%s:\n", __func__); 1886,1969c1881,1882 < if (port->csc == VIP_CSC_Y2R) { < if (port->port_id == VIP_PORTA) { < vip_set_slice_path(dev, VIP_CSC_SRC_DATA_SELECT, 0); < vip_set_slice_path(dev, < VIP_MULTI_CHANNEL_DATA_SELECT, 0); < vip_set_slice_path(dev, VIP_RGB_OUT_HI_DATA_SELECT, 0); < vip_set_slice_path(dev, VIP_RGB_SRC_DATA_SELECT, 0); < } else { < vip_set_slice_path(dev, VIP_CSC_SRC_DATA_SELECT, 0); < vip_set_slice_path(dev, < VIP_MULTI_CHANNEL_DATA_SELECT, 0); < vip_set_slice_path(dev, VIP_RGB_OUT_LO_DATA_SELECT, 0); < } < /* We are done */ < return; < } else if (port->csc == VIP_CSC_R2Y) { < if (port->scaler && port->fmt->coplanar) { < if (port->port_id == VIP_PORTA) { < vip_set_slice_path(dev, < VIP_CSC_SRC_DATA_SELECT, 0); < vip_set_slice_path(dev, < VIP_SC_SRC_DATA_SELECT, 0); < vip_set_slice_path(dev, < VIP_CHR_DS_1_SRC_DATA_SELECT, < 0); < vip_set_slice_path(dev, < VIP_CHR_DS_1_DATA_BYPASS, 0); < vip_set_slice_path(dev, < VIP_RGB_OUT_HI_DATA_SELECT, < 0); < } < } else if (port->scaler) { < if (port->port_id == VIP_PORTA) { < vip_set_slice_path(dev, < VIP_CSC_SRC_DATA_SELECT, 0); < vip_set_slice_path(dev, < VIP_SC_SRC_DATA_SELECT, 0); < vip_set_slice_path(dev, < VIP_CHR_DS_1_SRC_DATA_SELECT, < 0); < vip_set_slice_path(dev, < VIP_CHR_DS_1_DATA_BYPASS, 0); < vip_set_slice_path(dev, < VIP_RGB_OUT_HI_DATA_SELECT, < 0); < } < } else if (port->fmt->coplanar) { < if (port->port_id == VIP_PORTA) { < vip_set_slice_path(dev, < VIP_CSC_SRC_DATA_SELECT, 0); < vip_set_slice_path(dev, < VIP_CHR_DS_1_SRC_DATA_SELECT, < 0); < vip_set_slice_path(dev, < VIP_CHR_DS_1_DATA_BYPASS, 0); < vip_set_slice_path(dev, < VIP_RGB_OUT_HI_DATA_SELECT, < 0); < } < } else { < if (port->port_id == VIP_PORTA) { < vip_set_slice_path(dev, < VIP_CSC_SRC_DATA_SELECT, 0); < vip_set_slice_path(dev, < VIP_CHR_DS_1_SRC_DATA_SELECT, < 0); < vip_set_slice_path(dev, < VIP_CHR_DS_1_DATA_BYPASS, 0); < vip_set_slice_path(dev, < VIP_RGB_OUT_HI_DATA_SELECT, < 0); < } < } < /* We are done */ < return; < } else if (vip_is_fmt_rgb(port->fmt->fourcc)) { < if (port->port_id == VIP_PORTA) { < vip_set_slice_path(dev, < VIP_MULTI_CHANNEL_DATA_SELECT, 0); < vip_set_slice_path(dev, VIP_RGB_OUT_LO_DATA_SELECT, 0); < } < /* We are done */ < return; < } --- > if (port->scaler) > vip_set_slice_path(dev, VIP_SC_SRC_DATA_SELECT, 0); 1971,2025c1884,1885 < if (port->scaler && port->fmt->coplanar) { < if (port->port_id == VIP_PORTA) { < vip_set_slice_path(dev, VIP_SC_SRC_DATA_SELECT, 0); < vip_set_slice_path(dev, < VIP_CHR_DS_1_SRC_DATA_SELECT, 0); < vip_set_slice_path(dev, VIP_CHR_DS_1_DATA_BYPASS, 0); < vip_set_slice_path(dev, VIP_RGB_OUT_HI_DATA_SELECT, 0); < } else { < vip_set_slice_path(dev, VIP_SC_SRC_DATA_SELECT, 0); < vip_set_slice_path(dev, < VIP_CHR_DS_2_SRC_DATA_SELECT, 0); < vip_set_slice_path(dev, VIP_CHR_DS_1_DATA_BYPASS, 0); < vip_set_slice_path(dev, VIP_RGB_OUT_LO_DATA_SELECT, 0); < vip_set_slice_path(dev, < VIP_MULTI_CHANNEL_DATA_SELECT, 0); < } < } else if (port->scaler) { < if (port->port_id == VIP_PORTA) { < vip_set_slice_path(dev, VIP_SC_SRC_DATA_SELECT, 0); < vip_set_slice_path(dev, < VIP_CHR_DS_1_SRC_DATA_SELECT, 0); < vip_set_slice_path(dev, VIP_CHR_DS_1_DATA_BYPASS, 0); < vip_set_slice_path(dev, VIP_RGB_OUT_HI_DATA_SELECT, 0); < } else { < vip_set_slice_path(dev, VIP_SC_SRC_DATA_SELECT, 0); < vip_set_slice_path(dev, < VIP_CHR_DS_2_SRC_DATA_SELECT, 0); < vip_set_slice_path(dev, VIP_CHR_DS_1_DATA_BYPASS, 0); < vip_set_slice_path(dev, VIP_CHR_DS_2_DATA_BYPASS, 0); < vip_set_slice_path(dev, VIP_RGB_OUT_HI_DATA_SELECT, 0); < } < } else if (port->fmt->coplanar) { < if (port->port_id == VIP_PORTA) { < vip_set_slice_path(dev, < VIP_CHR_DS_1_SRC_DATA_SELECT, 0); < vip_set_slice_path(dev, VIP_CHR_DS_1_DATA_BYPASS, 0); < vip_set_slice_path(dev, VIP_RGB_OUT_HI_DATA_SELECT, 0); < } else { < vip_set_slice_path(dev, < VIP_CHR_DS_2_SRC_DATA_SELECT, 0); < vip_set_slice_path(dev, VIP_CHR_DS_2_DATA_BYPASS, 0); < vip_set_slice_path(dev, < VIP_MULTI_CHANNEL_DATA_SELECT, 0); < vip_set_slice_path(dev, VIP_RGB_OUT_LO_DATA_SELECT, 0); < } < } else { < /* < * We undo all data path setting except for the multi < * stream case. < * Because we cannot disrupt other on-going capture if only < * one stream is terminated the other might still be going < */ < vip_set_slice_path(dev, VIP_MULTI_CHANNEL_DATA_SELECT, 1); < vip_set_slice_path(dev, VIP_RGB_OUT_LO_DATA_SELECT, 0); < } --- > if (port->csc != VIP_CSC_NA) > vip_set_slice_path(dev, VIP_CSC_SRC_DATA_SELECT, 0); 2702c2562 < unset_fmt_params(stream); --- > vip_disable_sc_path(stream); 2932,2933d2791 < < memset(&f, 0, sizeof(f));