Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f2f6da0d authored by Javier Martinez Canillas's avatar Javier Martinez Canillas Committed by Mauro Carvalho Chehab
Browse files

[media] omap3isp: separate links creation from entities init



The omap3isp driver initializes the entities and creates the pads links
before the entities are registered with the media device. This does not
work now that object IDs are used to create links so the media_device
has to be set.

Split out the pads links creation from the entity initialization so the links
are created after the entities have been registered with the media device.

Suggested-by: default avatarMauro Carvalho Chehab <mchehab@osg.samsung.com>
Signed-off-by: default avatarJavier Martinez Canillas <javier@osg.samsung.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@osg.samsung.com>
parent 27e543fa
Loading
Loading
Loading
Loading
+98 −54
Original line number Diff line number Diff line
@@ -1933,6 +1933,100 @@ static int isp_register_entities(struct isp_device *isp)
	return ret;
}

/*
 * isp_create_pads_links - Pads links creation for the subdevices
 * @isp : Pointer to ISP device
 * return negative error code or zero on success
 */
static int isp_create_pads_links(struct isp_device *isp)
{
	int ret;

	ret = omap3isp_csi2_create_pads_links(isp);
	if (ret < 0) {
		dev_err(isp->dev, "CSI2 pads links creation failed\n");
		return ret;
	}

	ret = omap3isp_ccp2_create_pads_links(isp);
	if (ret < 0) {
		dev_err(isp->dev, "CCP2 pads links creation failed\n");
		return ret;
	}

	ret = omap3isp_ccdc_create_pads_links(isp);
	if (ret < 0) {
		dev_err(isp->dev, "CCDC pads links creation failed\n");
		return ret;
	}

	ret = omap3isp_preview_create_pads_links(isp);
	if (ret < 0) {
		dev_err(isp->dev, "Preview pads links creation failed\n");
		return ret;
	}

	ret = omap3isp_resizer_create_pads_links(isp);
	if (ret < 0) {
		dev_err(isp->dev, "Resizer pads links creation failed\n");
		return ret;
	}

	/* Connect the submodules. */
	ret = media_create_pad_link(
			&isp->isp_csi2a.subdev.entity, CSI2_PAD_SOURCE,
			&isp->isp_ccdc.subdev.entity, CCDC_PAD_SINK, 0);
	if (ret < 0)
		return ret;

	ret = media_create_pad_link(
			&isp->isp_ccp2.subdev.entity, CCP2_PAD_SOURCE,
			&isp->isp_ccdc.subdev.entity, CCDC_PAD_SINK, 0);
	if (ret < 0)
		return ret;

	ret = media_create_pad_link(
			&isp->isp_ccdc.subdev.entity, CCDC_PAD_SOURCE_VP,
			&isp->isp_prev.subdev.entity, PREV_PAD_SINK, 0);
	if (ret < 0)
		return ret;

	ret = media_create_pad_link(
			&isp->isp_ccdc.subdev.entity, CCDC_PAD_SOURCE_OF,
			&isp->isp_res.subdev.entity, RESZ_PAD_SINK, 0);
	if (ret < 0)
		return ret;

	ret = media_create_pad_link(
			&isp->isp_prev.subdev.entity, PREV_PAD_SOURCE,
			&isp->isp_res.subdev.entity, RESZ_PAD_SINK, 0);
	if (ret < 0)
		return ret;

	ret = media_create_pad_link(
			&isp->isp_ccdc.subdev.entity, CCDC_PAD_SOURCE_VP,
			&isp->isp_aewb.subdev.entity, 0,
			MEDIA_LNK_FL_ENABLED | MEDIA_LNK_FL_IMMUTABLE);
	if (ret < 0)
		return ret;

	ret = media_create_pad_link(
			&isp->isp_ccdc.subdev.entity, CCDC_PAD_SOURCE_VP,
			&isp->isp_af.subdev.entity, 0,
			MEDIA_LNK_FL_ENABLED | MEDIA_LNK_FL_IMMUTABLE);
	if (ret < 0)
		return ret;

	ret = media_create_pad_link(
			&isp->isp_ccdc.subdev.entity, CCDC_PAD_SOURCE_VP,
			&isp->isp_hist.subdev.entity, 0,
			MEDIA_LNK_FL_ENABLED | MEDIA_LNK_FL_IMMUTABLE);
	if (ret < 0)
		return ret;

	return 0;
}

static void isp_cleanup_modules(struct isp_device *isp)
{
	omap3isp_h3a_aewb_cleanup(isp);
@@ -2003,62 +2097,8 @@ static int isp_initialize_modules(struct isp_device *isp)
		goto error_h3a_af;
	}

	/* Connect the submodules. */
	ret = media_create_pad_link(
			&isp->isp_csi2a.subdev.entity, CSI2_PAD_SOURCE,
			&isp->isp_ccdc.subdev.entity, CCDC_PAD_SINK, 0);
	if (ret < 0)
		goto error_link;

	ret = media_create_pad_link(
			&isp->isp_ccp2.subdev.entity, CCP2_PAD_SOURCE,
			&isp->isp_ccdc.subdev.entity, CCDC_PAD_SINK, 0);
	if (ret < 0)
		goto error_link;

	ret = media_create_pad_link(
			&isp->isp_ccdc.subdev.entity, CCDC_PAD_SOURCE_VP,
			&isp->isp_prev.subdev.entity, PREV_PAD_SINK, 0);
	if (ret < 0)
		goto error_link;

	ret = media_create_pad_link(
			&isp->isp_ccdc.subdev.entity, CCDC_PAD_SOURCE_OF,
			&isp->isp_res.subdev.entity, RESZ_PAD_SINK, 0);
	if (ret < 0)
		goto error_link;

	ret = media_create_pad_link(
			&isp->isp_prev.subdev.entity, PREV_PAD_SOURCE,
			&isp->isp_res.subdev.entity, RESZ_PAD_SINK, 0);
	if (ret < 0)
		goto error_link;

	ret = media_create_pad_link(
			&isp->isp_ccdc.subdev.entity, CCDC_PAD_SOURCE_VP,
			&isp->isp_aewb.subdev.entity, 0,
			MEDIA_LNK_FL_ENABLED | MEDIA_LNK_FL_IMMUTABLE);
	if (ret < 0)
		goto error_link;

	ret = media_create_pad_link(
			&isp->isp_ccdc.subdev.entity, CCDC_PAD_SOURCE_VP,
			&isp->isp_af.subdev.entity, 0,
			MEDIA_LNK_FL_ENABLED | MEDIA_LNK_FL_IMMUTABLE);
	if (ret < 0)
		goto error_link;

	ret = media_create_pad_link(
			&isp->isp_ccdc.subdev.entity, CCDC_PAD_SOURCE_VP,
			&isp->isp_hist.subdev.entity, 0,
			MEDIA_LNK_FL_ENABLED | MEDIA_LNK_FL_IMMUTABLE);
	if (ret < 0)
		goto error_link;

	return 0;

error_link:
	omap3isp_h3a_af_cleanup(isp);
error_h3a_af:
	omap3isp_h3a_aewb_cleanup(isp);
error_h3a_aewb:
@@ -2468,6 +2508,10 @@ static int isp_probe(struct platform_device *pdev)
	if (ret < 0)
		goto error_modules;

	ret = isp_create_pads_links(isp);
	if (ret < 0)
		goto error_register_entities;

	isp->notifier.bound = isp_subdev_notifier_bound;
	isp->notifier.complete = isp_subdev_notifier_complete;

+14 −8
Original line number Diff line number Diff line
@@ -2666,16 +2666,8 @@ static int ccdc_init_entities(struct isp_ccdc_device *ccdc)
	if (ret < 0)
		goto error_video;

	/* Connect the CCDC subdev to the video node. */
	ret = media_create_pad_link(&ccdc->subdev.entity, CCDC_PAD_SOURCE_OF,
			&ccdc->video_out.video.entity, 0, 0);
	if (ret < 0)
		goto error_link;

	return 0;

error_link:
	omap3isp_video_cleanup(&ccdc->video_out);
error_video:
	media_entity_cleanup(me);
	return ret;
@@ -2720,6 +2712,20 @@ int omap3isp_ccdc_init(struct isp_device *isp)
	return 0;
}

/*
 * omap3isp_ccdc_create_pads_links - CCDC pads links creation
 * @isp : Pointer to ISP device
 * return negative error code or zero on success
 */
int omap3isp_ccdc_create_pads_links(struct isp_device *isp)
{
	struct isp_ccdc_device *ccdc = &isp->isp_ccdc;

	/* Connect the CCDC subdev to the video node. */
	return media_create_pad_link(&ccdc->subdev.entity, CCDC_PAD_SOURCE_OF,
				     &ccdc->video_out.video.entity, 0, 0);
}

/*
 * omap3isp_ccdc_cleanup - CCDC module cleanup.
 * @isp: Device pointer specific to the OMAP3 ISP.
+1 −0
Original line number Diff line number Diff line
@@ -163,6 +163,7 @@ struct isp_ccdc_device {
struct isp_device;

int omap3isp_ccdc_init(struct isp_device *isp);
int omap3isp_ccdc_create_pads_links(struct isp_device *isp);
void omap3isp_ccdc_cleanup(struct isp_device *isp);
int omap3isp_ccdc_register_entities(struct isp_ccdc_device *ccdc,
	struct v4l2_device *vdev);
+14 −8
Original line number Diff line number Diff line
@@ -1099,16 +1099,8 @@ static int ccp2_init_entities(struct isp_ccp2_device *ccp2)
	if (ret < 0)
		goto error_video;

	/* Connect the video node to the ccp2 subdev. */
	ret = media_create_pad_link(&ccp2->video_in.video.entity, 0,
				       &ccp2->subdev.entity, CCP2_PAD_SINK, 0);
	if (ret < 0)
		goto error_link;

	return 0;

error_link:
	omap3isp_video_cleanup(&ccp2->video_in);
error_video:
	media_entity_cleanup(&ccp2->subdev.entity);
	return ret;
@@ -1156,6 +1148,20 @@ int omap3isp_ccp2_init(struct isp_device *isp)
	return 0;
}

/*
 * omap3isp_ccp2_create_pads_links - CCP2 pads links creation
 * @isp : Pointer to ISP device
 * return negative error code or zero on success
 */
int omap3isp_ccp2_create_pads_links(struct isp_device *isp)
{
	struct isp_ccp2_device *ccp2 = &isp->isp_ccp2;

	/* Connect the video node to the ccp2 subdev. */
	return media_create_pad_link(&ccp2->video_in.video.entity, 0,
				     &ccp2->subdev.entity, CCP2_PAD_SINK, 0);
}

/*
 * omap3isp_ccp2_cleanup - CCP2 un-initialization
 * @isp : Pointer to ISP device
+1 −0
Original line number Diff line number Diff line
@@ -79,6 +79,7 @@ struct isp_ccp2_device {

/* Function declarations */
int omap3isp_ccp2_init(struct isp_device *isp);
int omap3isp_ccp2_create_pads_links(struct isp_device *isp);
void omap3isp_ccp2_cleanup(struct isp_device *isp);
int omap3isp_ccp2_register_entities(struct isp_ccp2_device *ccp2,
			struct v4l2_device *vdev);
Loading