struct soc_camera_link currently contains fields, used both by sensor and bridge drivers. To make subdevice driver re-use simpler, split it into a host and a subdevice parts. Signed-off-by: Guennadi Liakhovetski <g.liakhovetski@gmx.de> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
		
			
				
	
	
		
			83 lines
		
	
	
	
		
			1.9 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			83 lines
		
	
	
	
		
			1.9 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
/*
 | 
						|
 * Generic Platform Camera Driver Header
 | 
						|
 *
 | 
						|
 * Copyright (C) 2008 Magnus Damm
 | 
						|
 *
 | 
						|
 * This program is free software; you can redistribute it and/or modify
 | 
						|
 * it under the terms of the GNU General Public License version 2 as
 | 
						|
 * published by the Free Software Foundation.
 | 
						|
 */
 | 
						|
 | 
						|
#ifndef __SOC_CAMERA_H__
 | 
						|
#define __SOC_CAMERA_H__
 | 
						|
 | 
						|
#include <linux/videodev2.h>
 | 
						|
#include <media/soc_camera.h>
 | 
						|
#include <media/v4l2-mediabus.h>
 | 
						|
 | 
						|
struct device;
 | 
						|
 | 
						|
struct soc_camera_platform_info {
 | 
						|
	const char *format_name;
 | 
						|
	unsigned long format_depth;
 | 
						|
	struct v4l2_mbus_framefmt format;
 | 
						|
	unsigned long mbus_param;
 | 
						|
	enum v4l2_mbus_type mbus_type;
 | 
						|
	struct soc_camera_device *icd;
 | 
						|
	int (*set_capture)(struct soc_camera_platform_info *info, int enable);
 | 
						|
};
 | 
						|
 | 
						|
static inline void soc_camera_platform_release(struct platform_device **pdev)
 | 
						|
{
 | 
						|
	*pdev = NULL;
 | 
						|
}
 | 
						|
 | 
						|
static inline int soc_camera_platform_add(struct soc_camera_device *icd,
 | 
						|
					  struct platform_device **pdev,
 | 
						|
					  struct soc_camera_link *plink,
 | 
						|
					  void (*release)(struct device *dev),
 | 
						|
					  int id)
 | 
						|
{
 | 
						|
	struct soc_camera_subdev_desc *ssdd =
 | 
						|
		(struct soc_camera_subdev_desc *)plink;
 | 
						|
	struct soc_camera_platform_info *info = ssdd->drv_priv;
 | 
						|
	int ret;
 | 
						|
 | 
						|
	if (&icd->sdesc->subdev_desc != ssdd)
 | 
						|
		return -ENODEV;
 | 
						|
 | 
						|
	if (*pdev)
 | 
						|
		return -EBUSY;
 | 
						|
 | 
						|
	*pdev = platform_device_alloc("soc_camera_platform", id);
 | 
						|
	if (!*pdev)
 | 
						|
		return -ENOMEM;
 | 
						|
 | 
						|
	info->icd = icd;
 | 
						|
 | 
						|
	(*pdev)->dev.platform_data = info;
 | 
						|
	(*pdev)->dev.release = release;
 | 
						|
 | 
						|
	ret = platform_device_add(*pdev);
 | 
						|
	if (ret < 0) {
 | 
						|
		platform_device_put(*pdev);
 | 
						|
		*pdev = NULL;
 | 
						|
		info->icd = NULL;
 | 
						|
	}
 | 
						|
 | 
						|
	return ret;
 | 
						|
}
 | 
						|
 | 
						|
static inline void soc_camera_platform_del(const struct soc_camera_device *icd,
 | 
						|
					   struct platform_device *pdev,
 | 
						|
					   const struct soc_camera_link *plink)
 | 
						|
{
 | 
						|
	const struct soc_camera_subdev_desc *ssdd =
 | 
						|
		(const struct soc_camera_subdev_desc *)plink;
 | 
						|
	if (&icd->sdesc->subdev_desc != ssdd || !pdev)
 | 
						|
		return;
 | 
						|
 | 
						|
	platform_device_unregister(pdev);
 | 
						|
}
 | 
						|
 | 
						|
#endif /* __SOC_CAMERA_H__ */
 |