static void gang_buffer_offsets(struct tegra_channel *chan)
{
- int i;
+ bool reverse = false;
+ int i, ports;
u32 offset = 0;
for (i = 0; i < chan->total_ports; i++) {
switch (chan->gang_mode) {
+ case CAMERA_GANG_R_L:
+ reverse = true;
case CAMERA_NO_GANG_MODE:
case CAMERA_GANG_L_R:
- case CAMERA_GANG_R_L:
offset = chan->gang_bytesperline;
break;
- case CAMERA_GANG_T_B:
case CAMERA_GANG_B_T:
+ reverse = true;
+ case CAMERA_GANG_T_B:
offset = chan->gang_sizeimage;
break;
default:
}
offset = ((offset + TEGRA_SURFACE_ALIGNMENT - 1) &
~(TEGRA_SURFACE_ALIGNMENT - 1));
- chan->buffer_offset[i] = i * offset;
+ ports = reverse ? (chan->total_ports - 1 - i) : i;
+ chan->buffer_offset[i] = ports * offset;
}
}
* on gang mode and surface stride alignment
*/
if ((width > 1920) && (height > 1080)) {
- chan->gang_mode = CAMERA_GANG_L_R;
+ chan->gang_mode = chan->gang_mode_default;
chan->valid_ports = chan->total_ports;
} else {
chan->gang_mode = CAMERA_NO_GANG_MODE;
next_port = (next_port % (PORT_F + 1));
chan->port[i] = next_port;
}
+
+ if (chan->numlanes > 4) {
+ /* Get Gang mode */
+ ret = of_property_read_u32(ep, "gang-mode", &value);
+ if (ret != 0 || value < 1 || value > 4) {
+ dev_err(&chan->video.dev,
+ "%s: invalid gang mode value"
+ ", default to CAMERA_GANG_L_R\n",
+ __func__);
+ value = CAMERA_GANG_L_R;
+ }
+ chan->gang_mode_default = value;
+ }
}
}
unsigned int saved_ctx_bypass;
unsigned int saved_ctx_pgmode;
unsigned int gang_mode;
+ unsigned int gang_mode_default;
unsigned int gang_width;
unsigned int gang_height;
unsigned int gang_bytesperline;