]>
Commit | Line | Data |
---|---|---|
073afdd7 MD |
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 | ||
326c9862 MD |
11 | #ifndef __SOC_CAMERA_H__ |
12 | #define __SOC_CAMERA_H__ | |
13 | ||
14 | #include <linux/videodev2.h> | |
c41debaf | 15 | #include <media/soc_camera.h> |
84c760a5 | 16 | #include <media/v4l2-mediabus.h> |
326c9862 | 17 | |
bc1937b4 GL |
18 | struct device; |
19 | ||
326c9862 | 20 | struct soc_camera_platform_info { |
40e2e092 | 21 | const char *format_name; |
326c9862 | 22 | unsigned long format_depth; |
760697be | 23 | struct v4l2_mbus_framefmt format; |
84c760a5 GL |
24 | unsigned long mbus_param; |
25 | enum v4l2_mbus_type mbus_type; | |
7dfff953 | 26 | struct soc_camera_device *icd; |
326c9862 MD |
27 | int (*set_capture)(struct soc_camera_platform_info *info, int enable); |
28 | }; | |
29 | ||
ec0c8d55 GL |
30 | static inline void soc_camera_platform_release(struct platform_device **pdev) |
31 | { | |
32 | *pdev = NULL; | |
33 | } | |
34 | ||
7dfff953 | 35 | static inline int soc_camera_platform_add(struct soc_camera_device *icd, |
ec0c8d55 GL |
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_platform_info *info = plink->priv; | |
42 | int ret; | |
43 | ||
7dfff953 | 44 | if (icd->link != plink) |
ec0c8d55 GL |
45 | return -ENODEV; |
46 | ||
47 | if (*pdev) | |
48 | return -EBUSY; | |
49 | ||
50 | *pdev = platform_device_alloc("soc_camera_platform", id); | |
51 | if (!*pdev) | |
52 | return -ENOMEM; | |
53 | ||
7dfff953 | 54 | info->icd = icd; |
ec0c8d55 GL |
55 | |
56 | (*pdev)->dev.platform_data = info; | |
57 | (*pdev)->dev.release = release; | |
58 | ||
59 | ret = platform_device_add(*pdev); | |
60 | if (ret < 0) { | |
61 | platform_device_put(*pdev); | |
62 | *pdev = NULL; | |
7dfff953 | 63 | info->icd = NULL; |
ec0c8d55 GL |
64 | } |
65 | ||
66 | return ret; | |
67 | } | |
68 | ||
7dfff953 | 69 | static inline void soc_camera_platform_del(const struct soc_camera_device *icd, |
ec0c8d55 GL |
70 | struct platform_device *pdev, |
71 | const struct soc_camera_link *plink) | |
72 | { | |
7dfff953 | 73 | if (icd->link != plink || !pdev) |
ec0c8d55 GL |
74 | return; |
75 | ||
76 | platform_device_unregister(pdev); | |
77 | } | |
78 | ||
326c9862 | 79 | #endif /* __SOC_CAMERA_H__ */ |