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