| /* |
| * 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__ */ |