linux/include/media/soc_camera_platform.h
<<
>>
Prefs
   1/*
   2 * Generic Platform Camera Driver Header
   3 *
   4 * Copyright (C) 2008 Magnus Damm
   5 *
   6 * This program is free software; you can redistribute it and/or modify
   7 * it under the terms of the GNU General Public License version 2 as
   8 * published by the Free Software Foundation.
   9 */
  10
  11#ifndef __SOC_CAMERA_H__
  12#define __SOC_CAMERA_H__
  13
  14#include <linux/videodev2.h>
  15#include <media/soc_camera.h>
  16#include <media/v4l2-mediabus.h>
  17
  18struct device;
  19
  20struct soc_camera_platform_info {
  21        const char *format_name;
  22        unsigned long format_depth;
  23        struct v4l2_mbus_framefmt format;
  24        unsigned long mbus_param;
  25        enum v4l2_mbus_type mbus_type;
  26        struct soc_camera_device *icd;
  27        int (*set_capture)(struct soc_camera_platform_info *info, int enable);
  28};
  29
  30static inline void soc_camera_platform_release(struct platform_device **pdev)
  31{
  32        *pdev = NULL;
  33}
  34
  35static inline int soc_camera_platform_add(struct soc_camera_device *icd,
  36                                          struct platform_device **pdev,
  37                                          struct soc_camera_link *plink,
  38                                          void (*release)(struct device *dev),
  39                                          int id)
  40{
  41        struct soc_camera_subdev_desc *ssdd =
  42                (struct soc_camera_subdev_desc *)plink;
  43        struct soc_camera_platform_info *info = ssdd->drv_priv;
  44        int ret;
  45
  46        if (&icd->sdesc->subdev_desc != ssdd)
  47                return -ENODEV;
  48
  49        if (*pdev)
  50                return -EBUSY;
  51
  52        *pdev = platform_device_alloc("soc_camera_platform", id);
  53        if (!*pdev)
  54                return -ENOMEM;
  55
  56        info->icd = icd;
  57
  58        (*pdev)->dev.platform_data = info;
  59        (*pdev)->dev.release = release;
  60
  61        ret = platform_device_add(*pdev);
  62        if (ret < 0) {
  63                platform_device_put(*pdev);
  64                *pdev = NULL;
  65                info->icd = NULL;
  66        }
  67
  68        return ret;
  69}
  70
  71static inline void soc_camera_platform_del(const struct soc_camera_device *icd,
  72                                           struct platform_device *pdev,
  73                                           const struct soc_camera_link *plink)
  74{
  75        const struct soc_camera_subdev_desc *ssdd =
  76                (const struct soc_camera_subdev_desc *)plink;
  77        if (&icd->sdesc->subdev_desc != ssdd || !pdev)
  78                return;
  79
  80        platform_device_unregister(pdev);
  81}
  82
  83#endif /* __SOC_CAMERA_H__ */
  84