2008-10-17 02:51:47 +04:00
/*
* 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 .
*/
2008-07-17 06:02:08 +04:00
# ifndef __SOC_CAMERA_H__
# define __SOC_CAMERA_H__
# include <linux/videodev2.h>
2009-08-25 18:06:21 +04:00
# include <media/soc_camera.h>
2011-07-27 17:06:09 +04:00
# include <media/v4l2-mediabus.h>
2008-07-17 06:02:08 +04:00
2009-08-25 18:06:22 +04:00
struct device ;
2008-07-17 06:02:08 +04:00
struct soc_camera_platform_info {
2009-08-25 18:28:22 +04:00
const char * format_name ;
2008-07-17 06:02:08 +04:00
unsigned long format_depth ;
2009-12-11 17:46:49 +03:00
struct v4l2_mbus_framefmt format ;
2011-07-27 17:06:09 +04:00
unsigned long mbus_param ;
enum v4l2_mbus_type mbus_type ;
2011-07-16 03:03:38 +04:00
struct soc_camera_device * icd ;
2008-07-17 06:02:08 +04:00
int ( * set_capture ) ( struct soc_camera_platform_info * info , int enable ) ;
} ;
2011-03-23 10:14:43 +03:00
static inline void soc_camera_platform_release ( struct platform_device * * pdev )
{
* pdev = NULL ;
}
2011-07-16 03:03:38 +04:00
static inline int soc_camera_platform_add ( struct soc_camera_device * icd ,
2011-03-23 10:14:43 +03:00
struct platform_device * * pdev ,
struct soc_camera_link * plink ,
void ( * release ) ( struct device * dev ) ,
int id )
{
2012-12-21 15:11:48 +04:00
struct soc_camera_subdev_desc * ssdd =
( struct soc_camera_subdev_desc * ) plink ;
struct soc_camera_platform_info * info = ssdd - > drv_priv ;
2011-03-23 10:14:43 +03:00
int ret ;
2012-12-21 15:11:48 +04:00
if ( & icd - > sdesc - > subdev_desc ! = ssdd )
2011-03-23 10:14:43 +03:00
return - ENODEV ;
if ( * pdev )
return - EBUSY ;
* pdev = platform_device_alloc ( " soc_camera_platform " , id ) ;
if ( ! * pdev )
return - ENOMEM ;
2011-07-16 03:03:38 +04:00
info - > icd = icd ;
2011-03-23 10:14:43 +03:00
( * pdev ) - > dev . platform_data = info ;
( * pdev ) - > dev . release = release ;
ret = platform_device_add ( * pdev ) ;
if ( ret < 0 ) {
platform_device_put ( * pdev ) ;
* pdev = NULL ;
2011-07-16 03:03:38 +04:00
info - > icd = NULL ;
2011-03-23 10:14:43 +03:00
}
return ret ;
}
2011-07-16 03:03:38 +04:00
static inline void soc_camera_platform_del ( const struct soc_camera_device * icd ,
2011-03-23 10:14:43 +03:00
struct platform_device * pdev ,
const struct soc_camera_link * plink )
{
2012-12-21 15:11:48 +04:00
const struct soc_camera_subdev_desc * ssdd =
( const struct soc_camera_subdev_desc * ) plink ;
if ( & icd - > sdesc - > subdev_desc ! = ssdd | | ! pdev )
2011-03-23 10:14:43 +03:00
return ;
platform_device_unregister ( pdev ) ;
}
2008-07-17 06:02:08 +04:00
# endif /* __SOC_CAMERA_H__ */