diff options
Diffstat (limited to 'drivers/media/platform/vimc/vimc-sensor.c')
| -rw-r--r-- | drivers/media/platform/vimc/vimc-sensor.c | 109 | 
1 files changed, 27 insertions, 82 deletions
diff --git a/drivers/media/platform/vimc/vimc-sensor.c b/drivers/media/platform/vimc/vimc-sensor.c index 6c53b9fc1617..32380f504591 100644 --- a/drivers/media/platform/vimc/vimc-sensor.c +++ b/drivers/media/platform/vimc/vimc-sensor.c @@ -5,10 +5,6 @@   * Copyright (C) 2015-2017 Helen Koike <[email protected]>   */ -#include <linux/component.h> -#include <linux/module.h> -#include <linux/mod_devicetable.h> -#include <linux/platform_device.h>  #include <linux/v4l2-mediabus.h>  #include <linux/vmalloc.h>  #include <media/v4l2-ctrls.h> @@ -18,18 +14,15 @@  #include "vimc-common.h" -#define VIMC_SEN_DRV_NAME "vimc-sensor" -  struct vimc_sen_device {  	struct vimc_ent_device ved;  	struct v4l2_subdev sd; -	struct device *dev;  	struct tpg_data tpg; -	struct task_struct *kthread_sen;  	u8 *frame;  	/* The active format */  	struct v4l2_mbus_framefmt mbus_format;  	struct v4l2_ctrl_handler hdl; +	struct media_pad pad;  };  static const struct v4l2_mbus_framefmt fmt_default = { @@ -164,7 +157,7 @@ static int vimc_sen_set_fmt(struct v4l2_subdev *sd,  	/* Set the new format */  	vimc_sen_adjust_fmt(&fmt->format); -	dev_dbg(vsen->dev, "%s: format update: " +	dev_dbg(vsen->ved.dev, "%s: format update: "  		"old:%dx%d (0x%x, %d, %d, %d, %d) "  		"new:%dx%d (0x%x, %d, %d, %d, %d)\n", vsen->sd.name,  		/* old */ @@ -208,10 +201,6 @@ static int vimc_sen_s_stream(struct v4l2_subdev *sd, int enable)  		const struct vimc_pix_map *vpix;  		unsigned int frame_size; -		if (vsen->kthread_sen) -			/* tpg is already executing */ -			return 0; -  		/* Calculate the frame size */  		vpix = vimc_pix_map_by_code(vsen->mbus_format.code);  		frame_size = vsen->mbus_format.width * vpix->bpp * @@ -297,6 +286,7 @@ static void vimc_sen_release(struct v4l2_subdev *sd)  	v4l2_ctrl_handler_free(&vsen->hdl);  	tpg_free(&vsen->tpg); +	media_entity_cleanup(vsen->ved.ent);  	kfree(vsen);  } @@ -304,14 +294,12 @@ static const struct v4l2_subdev_internal_ops vimc_sen_int_ops = {  	.release = vimc_sen_release,  }; -static void vimc_sen_comp_unbind(struct device *comp, struct device *master, -				 void *master_data) +void vimc_sen_rm(struct vimc_device *vimc, struct vimc_ent_device *ved)  { -	struct vimc_ent_device *ved = dev_get_drvdata(comp); -	struct vimc_sen_device *vsen = -				container_of(ved, struct vimc_sen_device, ved); +	struct vimc_sen_device *vsen; -	vimc_ent_sd_unregister(ved, &vsen->sd); +	vsen = container_of(ved, struct vimc_sen_device, ved); +	v4l2_device_unregister_subdev(&vsen->sd);  }  /* Image Processing Controls */ @@ -331,18 +319,17 @@ static const struct v4l2_ctrl_config vimc_sen_ctrl_test_pattern = {  	.qmenu = tpg_pattern_strings,  }; -static int vimc_sen_comp_bind(struct device *comp, struct device *master, -			      void *master_data) +struct vimc_ent_device *vimc_sen_add(struct vimc_device *vimc, +				     const char *vcfg_name)  { -	struct v4l2_device *v4l2_dev = master_data; -	struct vimc_platform_data *pdata = comp->platform_data; +	struct v4l2_device *v4l2_dev = &vimc->v4l2_dev;  	struct vimc_sen_device *vsen;  	int ret;  	/* Allocate the vsen struct */  	vsen = kzalloc(sizeof(*vsen), GFP_KERNEL);  	if (!vsen) -		return -ENOMEM; +		return NULL;  	v4l2_ctrl_handler_init(&vsen->hdl, 4); @@ -366,78 +353,36 @@ static int vimc_sen_comp_bind(struct device *comp, struct device *master,  		goto err_free_vsen;  	} +	/* Initialize the test pattern generator */ +	tpg_init(&vsen->tpg, vsen->mbus_format.width, +		 vsen->mbus_format.height); +	ret = tpg_alloc(&vsen->tpg, VIMC_FRAME_MAX_WIDTH); +	if (ret) +		goto err_free_hdl; +  	/* Initialize ved and sd */ +	vsen->pad.flags = MEDIA_PAD_FL_SOURCE;  	ret = vimc_ent_sd_register(&vsen->ved, &vsen->sd, v4l2_dev, -				   pdata->entity_name, -				   MEDIA_ENT_F_CAM_SENSOR, 1, -				   (const unsigned long[1]) {MEDIA_PAD_FL_SOURCE}, +				   vcfg_name, +				   MEDIA_ENT_F_CAM_SENSOR, 1, &vsen->pad,  				   &vimc_sen_int_ops, &vimc_sen_ops);  	if (ret) -		goto err_free_hdl; +		goto err_free_tpg;  	vsen->ved.process_frame = vimc_sen_process_frame; -	dev_set_drvdata(comp, &vsen->ved); -	vsen->dev = comp; +	vsen->ved.dev = &vimc->pdev.dev;  	/* Initialize the frame format */  	vsen->mbus_format = fmt_default; -	/* Initialize the test pattern generator */ -	tpg_init(&vsen->tpg, vsen->mbus_format.width, -		 vsen->mbus_format.height); -	ret = tpg_alloc(&vsen->tpg, VIMC_FRAME_MAX_WIDTH); -	if (ret) -		goto err_unregister_ent_sd; - -	return 0; +	return &vsen->ved; -err_unregister_ent_sd: -	vimc_ent_sd_unregister(&vsen->ved,  &vsen->sd); +err_free_tpg: +	tpg_free(&vsen->tpg);  err_free_hdl:  	v4l2_ctrl_handler_free(&vsen->hdl);  err_free_vsen:  	kfree(vsen); -	return ret; -} - -static const struct component_ops vimc_sen_comp_ops = { -	.bind = vimc_sen_comp_bind, -	.unbind = vimc_sen_comp_unbind, -}; - -static int vimc_sen_probe(struct platform_device *pdev) -{ -	return component_add(&pdev->dev, &vimc_sen_comp_ops); -} - -static int vimc_sen_remove(struct platform_device *pdev) -{ -	component_del(&pdev->dev, &vimc_sen_comp_ops); - -	return 0; +	return NULL;  } - -static const struct platform_device_id vimc_sen_driver_ids[] = { -	{ -		.name           = VIMC_SEN_DRV_NAME, -	}, -	{ } -}; - -static struct platform_driver vimc_sen_pdrv = { -	.probe		= vimc_sen_probe, -	.remove		= vimc_sen_remove, -	.id_table	= vimc_sen_driver_ids, -	.driver		= { -		.name	= VIMC_SEN_DRV_NAME, -	}, -}; - -module_platform_driver(vimc_sen_pdrv); - -MODULE_DEVICE_TABLE(platform, vimc_sen_driver_ids); - -MODULE_DESCRIPTION("Virtual Media Controller Driver (VIMC) Sensor"); -MODULE_AUTHOR("Helen Mae Koike Fornazier <[email protected]>"); -MODULE_LICENSE("GPL");  |