isp10: rockchip: v0.1.6
[firefly-linux-kernel-4.4.55.git] / drivers / media / platform / rk-isp10 / cif_isp10_img_src.c
1 /*
2  *************************************************************************
3  * Rockchip driver for CIF ISP 1.0
4  * (Based on Intel driver for sofiaxxx)
5  *
6  * Copyright (C) 2015 Intel Mobile Communications GmbH
7  * Copyright (C) 2016 Fuzhou Rockchip Electronics Co., Ltd.
8  *
9  *
10  * This program is free software; you can redistribute it and/or modify
11  * it under the terms of the GNU General Public License as published by
12  * the Free Software Foundation; either version 2 of the License, or
13  * (at your option) any later version.
14  *************************************************************************
15  */
16
17 #include <linux/kernel.h>
18 #include <linux/platform_data/rk_isp10_platform.h>
19 #include "cif_isp10.h"
20 #include "cif_isp10_img_src_ops.h"
21
22 struct cif_isp10_img_src {
23         void *img_src;
24         const struct cif_isp10_img_src_ops *ops;
25 };
26
27 struct cif_isp10_img_src *cif_isp10_img_src_to_img_src(
28         CIF_ISP10_PLTFRM_DEVICE dev,
29         struct pltfrm_soc_cfg *soc_cfg)
30 {
31         int ret = 0;
32         int i;
33         const char *device_type;
34         struct cif_isp10_img_src *img_src;
35
36         img_src = devm_kzalloc(dev, sizeof(*img_src), GFP_KERNEL);
37         if (!img_src) {
38                 ret = -ENOMEM;
39                 goto err;
40         }
41
42         device_type = cif_isp10_pltfrm_get_device_type(dev);
43
44         img_src->ops = NULL;
45         for (i = 0; i < ARRAY_SIZE(cif_isp10_img_src_ops); i++) {
46                 if (!strcmp(device_type, cif_isp10_img_src_ops->device_type)) {
47                         img_src->ops = &cif_isp10_img_src_ops[i].ops;
48                         break;
49                 }
50         }
51         if (!img_src->ops) {
52                 cif_isp10_pltfrm_pr_err(NULL,
53                         "unsupported device type %s\n",
54                         device_type);
55                 ret = -EINVAL;
56                 goto err;
57         }
58
59         WARN_ON(!img_src->ops->to_img_src);
60         WARN_ON(!img_src->ops->s_streaming);
61         WARN_ON(!img_src->ops->s_power);
62         WARN_ON(!img_src->ops->enum_strm_fmts);
63         WARN_ON(!img_src->ops->s_strm_fmt);
64         WARN_ON(!img_src->ops->g_ctrl);
65         WARN_ON(!img_src->ops->s_ctrl);
66
67         img_src->img_src = img_src->ops->to_img_src(dev, soc_cfg);
68         if (IS_ERR_OR_NULL(img_src->img_src)) {
69                 cif_isp10_pltfrm_pr_err(NULL,
70                         "to_img_src failed!\n");
71                 ret = -EFAULT;
72                 goto err;
73         }
74
75         return img_src;
76 err:
77         cif_isp10_pltfrm_pr_err(NULL, "failed with error %d\n",
78                 ret);
79         if (!IS_ERR_OR_NULL(img_src))
80                 devm_kfree(dev, img_src);
81
82         return ERR_PTR(ret);
83 }
84
85 int cif_isp10_img_src_s_streaming(
86         struct cif_isp10_img_src *img_src,
87         bool enable)
88 {
89         return img_src->ops->s_streaming(img_src->img_src, enable);
90 }
91
92 int cif_isp10_img_src_s_power(
93         struct cif_isp10_img_src *img_src,
94         bool on)
95 {
96         return img_src->ops->s_power(img_src->img_src, on);
97 }
98
99 int cif_isp10_img_src_enum_strm_fmts(
100         struct cif_isp10_img_src *img_src,
101         u32 index,
102         struct cif_isp10_strm_fmt_desc *strm_fmt_desc)
103 {
104         return img_src->ops->enum_strm_fmts(img_src->img_src,
105                 index, strm_fmt_desc);
106 }
107
108 int cif_isp10_img_src_s_strm_fmt(
109         struct cif_isp10_img_src *img_src,
110         struct cif_isp10_strm_fmt *strm_fmt)
111 {
112         if (!img_src) {
113                 cif_isp10_pltfrm_pr_err(NULL, "img_src is NULL\n");
114                 return -EINVAL;
115         }
116         return img_src->ops->s_strm_fmt(img_src->img_src, strm_fmt);
117 }
118
119 int cif_isp10_img_src_g_ctrl(
120         struct cif_isp10_img_src *img_src,
121         int id,
122         int *val)
123 {
124         if (!img_src) {
125                 cif_isp10_pltfrm_pr_err(NULL, "img_src is NULL\n");
126                 return -EINVAL;
127         }
128         return img_src->ops->g_ctrl(img_src->img_src, id, val);
129 }
130
131 int cif_isp10_img_src_s_ctrl(
132         struct cif_isp10_img_src *img_src,
133         int id,
134         int val)
135 {
136         if (!img_src) {
137                 cif_isp10_pltfrm_pr_err(NULL, "img_src is NULL\n");
138                 return -EINVAL;
139         }
140         return img_src->ops->s_ctrl(img_src->img_src, id, val);
141 }
142
143 int cif_isp10_img_src_s_ext_ctrls(
144         struct cif_isp10_img_src *img_src,
145         struct cif_isp10_img_src_ext_ctrl *ctrl)
146 {
147         if (!img_src) {
148                 cif_isp10_pltfrm_pr_err(NULL, "img_src is NULL\n");
149                 return -EINVAL;
150         }
151         return img_src->ops->s_ext_ctrls(img_src->img_src, ctrl);
152 }
153
154 long cif_isp10_img_src_ioctl(
155         struct cif_isp10_img_src *img_src,
156         unsigned int cmd,
157         void *arg)
158 {
159         if (!img_src) {
160                 cif_isp10_pltfrm_pr_err(NULL, "img_src is NULL\n");
161                 return -EINVAL;
162         }
163         return img_src->ops->ioctl(img_src->img_src, cmd, arg);
164 }
165
166 const char *cif_isp10_img_src_g_name(
167         struct cif_isp10_img_src *img_src)
168 {
169         if (!img_src) {
170                 cif_isp10_pltfrm_pr_err(NULL, "img_src is NULL\n");
171                 return ERR_PTR(-EINVAL);
172         }
173         return img_src->ops->g_name(img_src->img_src);
174 }
175