/* * csi2_init_entities - Initialize subdev and media entity. * @csi2: Pointer to csi2 structure. * return -ENOMEM or zero on success */ static int csi2_init_entities(struct iss_csi2_device *csi2, const char *subname) { struct v4l2_subdev *sd = &csi2->subdev; struct media_pad *pads = csi2->pads; struct media_entity *me = &sd->entity; int ret; char name[V4L2_SUBDEV_NAME_SIZE]; v4l2_subdev_init(sd, &csi2_ops); sd->internal_ops = &csi2_internal_ops; sprintf(name, "CSI2%s", subname); snprintf(sd->name, sizeof(sd->name), "OMAP4 ISS %s", name); sd->grp_id = 1 << 16; /* group ID for iss subdevs */ v4l2_set_subdevdata(sd, csi2); sd->flags |= V4L2_SUBDEV_FL_HAS_DEVNODE; pads[CSI2_PAD_SOURCE].flags = MEDIA_PAD_FL_SOURCE; pads[CSI2_PAD_SINK].flags = MEDIA_PAD_FL_SINK; me->ops = &csi2_media_ops; ret = media_entity_init(me, CSI2_PADS_NUM, pads, 0); if (ret < 0) return ret; csi2_init_formats(sd, NULL); /* Video device node */ csi2->video_out.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; csi2->video_out.ops = &csi2_issvideo_ops; csi2->video_out.bpl_alignment = 32; csi2->video_out.bpl_zero_padding = 1; csi2->video_out.bpl_max = 0x1ffe0; csi2->video_out.iss = csi2->iss; csi2->video_out.capture_mem = PAGE_ALIGN(4096 * 4096) * 3; ret = omap4iss_video_init(&csi2->video_out, name); if (ret < 0) goto error_video; /* Connect the CSI2 subdev to the video node. */ ret = media_entity_create_link(&csi2->subdev.entity, CSI2_PAD_SOURCE, &csi2->video_out.video.entity, 0, 0); if (ret < 0) goto error_link; return 0; error_link: omap4iss_video_cleanup(&csi2->video_out); error_video: media_entity_cleanup(&csi2->subdev.entity); return ret; }
/* * ipipeif_init_entities - Initialize V4L2 subdev and media entity * @ipipeif: ISS ISP IPIPEIF module * * Return 0 on success and a negative error code on failure. */ static int ipipeif_init_entities(struct iss_ipipeif_device *ipipeif) { struct v4l2_subdev *sd = &ipipeif->subdev; struct media_pad *pads = ipipeif->pads; struct media_entity *me = &sd->entity; int ret; ipipeif->input = IPIPEIF_INPUT_NONE; v4l2_subdev_init(sd, &ipipeif_v4l2_ops); sd->internal_ops = &ipipeif_v4l2_internal_ops; strlcpy(sd->name, "OMAP4 ISS ISP IPIPEIF", sizeof(sd->name)); sd->grp_id = 1 << 16; /* group ID for iss subdevs */ v4l2_set_subdevdata(sd, ipipeif); sd->flags |= V4L2_SUBDEV_FL_HAS_DEVNODE; pads[IPIPEIF_PAD_SINK].flags = MEDIA_PAD_FL_SINK; pads[IPIPEIF_PAD_SOURCE_ISIF_SF].flags = MEDIA_PAD_FL_SOURCE; pads[IPIPEIF_PAD_SOURCE_VP].flags = MEDIA_PAD_FL_SOURCE; me->ops = &ipipeif_media_ops; ret = media_entity_init(me, IPIPEIF_PADS_NUM, pads, 0); if (ret < 0) return ret; ipipeif_init_formats(sd, NULL); ipipeif->video_out.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; ipipeif->video_out.ops = &ipipeif_video_ops; ipipeif->video_out.iss = to_iss_device(ipipeif); ipipeif->video_out.capture_mem = PAGE_ALIGN(4096 * 4096) * 3; ipipeif->video_out.bpl_alignment = 32; ipipeif->video_out.bpl_zero_padding = 1; ipipeif->video_out.bpl_max = 0x1ffe0; ret = omap4iss_video_init(&ipipeif->video_out, "ISP IPIPEIF"); if (ret < 0) return ret; /* Connect the IPIPEIF subdev to the video node. */ ret = media_entity_create_link(&ipipeif->subdev.entity, IPIPEIF_PAD_SOURCE_ISIF_SF, &ipipeif->video_out.video.entity, 0, 0); if (ret < 0) return ret; return 0; }