/* * The mux state is determined by the enabled sink pad link. * Enabling or disabling the source pad link has no effect.
*/ if (local->flags & MEDIA_PAD_FL_SOURCE) return 0;
if (flags & MEDIA_LNK_FL_ENABLED) { struct v4l2_mbus_framefmt *source_mbusformat;
if (vmux->active == local->index) goto out;
if (vmux->active >= 0) {
ret = -EBUSY; goto out;
}
dev_dbg(sd->dev, "setting %d active\n", local->index);
ret = mux_control_try_select(vmux->mux, local->index); if (ret < 0) goto out;
vmux->active = local->index;
/* Propagate the active format to the source */
source_mbusformat = v4l2_subdev_state_get_format(sd_state,
source_pad);
*source_mbusformat = *v4l2_subdev_state_get_format(sd_state,
vmux->active);
} else { if (vmux->active != local->index) goto out;
/* All formats except LVDS and vendor specific formats are acceptable */ switch (sdformat->format.code) { case MEDIA_BUS_FMT_RGB444_1X12: case MEDIA_BUS_FMT_RGB444_2X8_PADHI_BE: case MEDIA_BUS_FMT_RGB444_2X8_PADHI_LE: case MEDIA_BUS_FMT_RGB555_2X8_PADHI_BE: case MEDIA_BUS_FMT_RGB555_2X8_PADHI_LE: case MEDIA_BUS_FMT_RGB565_1X16: case MEDIA_BUS_FMT_BGR565_2X8_BE: case MEDIA_BUS_FMT_BGR565_2X8_LE: case MEDIA_BUS_FMT_RGB565_2X8_BE: case MEDIA_BUS_FMT_RGB565_2X8_LE: case MEDIA_BUS_FMT_RGB666_1X18: case MEDIA_BUS_FMT_RBG888_1X24: case MEDIA_BUS_FMT_RGB666_1X24_CPADHI: case MEDIA_BUS_FMT_BGR888_1X24: case MEDIA_BUS_FMT_GBR888_1X24: case MEDIA_BUS_FMT_RGB888_1X24: case MEDIA_BUS_FMT_RGB888_2X12_BE: case MEDIA_BUS_FMT_RGB888_2X12_LE: case MEDIA_BUS_FMT_ARGB8888_1X32: case MEDIA_BUS_FMT_RGB888_1X32_PADHI: case MEDIA_BUS_FMT_RGB101010_1X30: case MEDIA_BUS_FMT_RGB121212_1X36: case MEDIA_BUS_FMT_RGB161616_1X48: case MEDIA_BUS_FMT_Y8_1X8: case MEDIA_BUS_FMT_UV8_1X8: case MEDIA_BUS_FMT_UYVY8_1_5X8: case MEDIA_BUS_FMT_VYUY8_1_5X8: case MEDIA_BUS_FMT_YUYV8_1_5X8: case MEDIA_BUS_FMT_YVYU8_1_5X8: case MEDIA_BUS_FMT_UYVY8_2X8: case MEDIA_BUS_FMT_VYUY8_2X8: case MEDIA_BUS_FMT_YUYV8_2X8: case MEDIA_BUS_FMT_YVYU8_2X8: case MEDIA_BUS_FMT_Y10_1X10: case MEDIA_BUS_FMT_UYVY10_2X10: case MEDIA_BUS_FMT_VYUY10_2X10: case MEDIA_BUS_FMT_YUYV10_2X10: case MEDIA_BUS_FMT_YVYU10_2X10: case MEDIA_BUS_FMT_Y12_1X12: case MEDIA_BUS_FMT_UYVY12_2X12: case MEDIA_BUS_FMT_VYUY12_2X12: case MEDIA_BUS_FMT_YUYV12_2X12: case MEDIA_BUS_FMT_YVYU12_2X12: case MEDIA_BUS_FMT_UYVY8_1X16: case MEDIA_BUS_FMT_VYUY8_1X16: case MEDIA_BUS_FMT_YUYV8_1X16: case MEDIA_BUS_FMT_YVYU8_1X16: case MEDIA_BUS_FMT_YDYUYDYV8_1X16: case MEDIA_BUS_FMT_UYVY10_1X20: case MEDIA_BUS_FMT_VYUY10_1X20: case MEDIA_BUS_FMT_YUYV10_1X20: case MEDIA_BUS_FMT_YVYU10_1X20: case MEDIA_BUS_FMT_VUY8_1X24: case MEDIA_BUS_FMT_YUV8_1X24: case MEDIA_BUS_FMT_UYYVYY8_0_5X24: case MEDIA_BUS_FMT_UYVY12_1X24: case MEDIA_BUS_FMT_VYUY12_1X24: case MEDIA_BUS_FMT_YUYV12_1X24: case MEDIA_BUS_FMT_YVYU12_1X24: case MEDIA_BUS_FMT_YUV10_1X30: case MEDIA_BUS_FMT_UYYVYY10_0_5X30: case MEDIA_BUS_FMT_AYUV8_1X32: case MEDIA_BUS_FMT_UYYVYY12_0_5X36: case MEDIA_BUS_FMT_YUV12_1X36: case MEDIA_BUS_FMT_YUV16_1X48: case MEDIA_BUS_FMT_UYYVYY16_0_5X48: case MEDIA_BUS_FMT_JPEG_1X8: case MEDIA_BUS_FMT_AHSV8888_1X32: case MEDIA_BUS_FMT_SBGGR8_1X8: case MEDIA_BUS_FMT_SGBRG8_1X8: case MEDIA_BUS_FMT_SGRBG8_1X8: case MEDIA_BUS_FMT_SRGGB8_1X8: case MEDIA_BUS_FMT_SBGGR10_1X10: case MEDIA_BUS_FMT_SGBRG10_1X10: case MEDIA_BUS_FMT_SGRBG10_1X10: case MEDIA_BUS_FMT_SRGGB10_1X10: case MEDIA_BUS_FMT_SBGGR12_1X12: case MEDIA_BUS_FMT_SGBRG12_1X12: case MEDIA_BUS_FMT_SGRBG12_1X12: case MEDIA_BUS_FMT_SRGGB12_1X12: case MEDIA_BUS_FMT_SBGGR14_1X14: case MEDIA_BUS_FMT_SGBRG14_1X14: case MEDIA_BUS_FMT_SGRBG14_1X14: case MEDIA_BUS_FMT_SRGGB14_1X14: case MEDIA_BUS_FMT_SBGGR16_1X16: case MEDIA_BUS_FMT_SGBRG16_1X16: case MEDIA_BUS_FMT_SGRBG16_1X16: case MEDIA_BUS_FMT_SRGGB16_1X16: break; default:
sdformat->format.code = MEDIA_BUS_FMT_Y8_1X8; break;
} if (sdformat->format.field == V4L2_FIELD_ANY)
sdformat->format.field = V4L2_FIELD_NONE;
mutex_lock(&vmux->lock);
/* Source pad mirrors active sink pad, no limitations on sink pads */ if ((pad->flags & MEDIA_PAD_FL_SOURCE) && vmux->active >= 0)
sdformat->format = *v4l2_subdev_state_get_format(sd_state,
vmux->active);
*mbusformat = sdformat->format;
/* Propagate the format from an active sink to source */ if ((pad->flags & MEDIA_PAD_FL_SINK) && (pad->index == vmux->active))
*source_mbusformat = sdformat->format;
/* * The largest numbered port is the output port. It determines * total number of pads.
*/
for_each_endpoint_of_node(np, ep) { struct of_endpoint endpoint;
vmux->mux = devm_mux_control_get(dev, NULL); if (IS_ERR(vmux->mux)) {
ret = PTR_ERR(vmux->mux); return dev_err_probe(dev, ret, "Failed to get mux\n");
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.