media: atomisp: get rid of most checks for ISP2401 version
[linux-2.6-microblaze.git] / drivers / staging / media / atomisp / pci / camera / util / src / util.c
1 /*
2  * Support for Intel Camera Imaging ISP subsystem.
3  * Copyright (c) 2015, Intel Corporation.
4  *
5  * This program is free software; you can redistribute it and/or modify it
6  * under the terms and conditions of the GNU General Public License,
7  * version 2, as published by the Free Software Foundation.
8  *
9  * This program is distributed in the hope it will be useful, but WITHOUT
10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
12  * more details.
13  */
14
15 #include "ia_css_util.h"
16 #include <ia_css_frame.h>
17 #include <assert_support.h>
18 #include <math_support.h>
19
20 /* for ia_css_binary_max_vf_width() */
21 #include "ia_css_binary.h"
22
23 enum ia_css_err ia_css_convert_errno(
24     int in_err)
25 {
26         enum ia_css_err out_err;
27
28         switch (in_err) {
29         case 0:
30                 out_err = IA_CSS_SUCCESS;
31                 break;
32         case EINVAL:
33                 out_err = IA_CSS_ERR_INVALID_ARGUMENTS;
34                 break;
35         case ENODATA:
36                 out_err = IA_CSS_ERR_QUEUE_IS_EMPTY;
37                 break;
38         case ENOSYS:
39         case ENOTSUP:
40                 out_err = IA_CSS_ERR_INTERNAL_ERROR;
41                 break;
42         case ENOBUFS:
43                 out_err = IA_CSS_ERR_QUEUE_IS_FULL;
44                 break;
45         default:
46                 out_err = IA_CSS_ERR_INTERNAL_ERROR;
47                 break;
48         }
49         return out_err;
50 }
51
52 /* MW: Table look-up ??? */
53 unsigned int ia_css_util_input_format_bpp(
54     enum atomisp_input_format format,
55     bool two_ppc)
56 {
57         unsigned int rval = 0;
58
59         switch (format) {
60         case ATOMISP_INPUT_FORMAT_YUV420_8_LEGACY:
61         case ATOMISP_INPUT_FORMAT_YUV420_8:
62         case ATOMISP_INPUT_FORMAT_YUV422_8:
63         case ATOMISP_INPUT_FORMAT_RGB_888:
64         case ATOMISP_INPUT_FORMAT_RAW_8:
65         case ATOMISP_INPUT_FORMAT_BINARY_8:
66         case ATOMISP_INPUT_FORMAT_EMBEDDED:
67                 rval = 8;
68                 break;
69         case ATOMISP_INPUT_FORMAT_YUV420_10:
70         case ATOMISP_INPUT_FORMAT_YUV422_10:
71         case ATOMISP_INPUT_FORMAT_RAW_10:
72                 rval = 10;
73                 break;
74         case ATOMISP_INPUT_FORMAT_YUV420_16:
75         case ATOMISP_INPUT_FORMAT_YUV422_16:
76                 rval = 16;
77                 break;
78         case ATOMISP_INPUT_FORMAT_RGB_444:
79                 rval = 4;
80                 break;
81         case ATOMISP_INPUT_FORMAT_RGB_555:
82                 rval = 5;
83                 break;
84         case ATOMISP_INPUT_FORMAT_RGB_565:
85                 rval = 65;
86                 break;
87         case ATOMISP_INPUT_FORMAT_RGB_666:
88         case ATOMISP_INPUT_FORMAT_RAW_6:
89                 rval = 6;
90                 break;
91         case ATOMISP_INPUT_FORMAT_RAW_7:
92                 rval = 7;
93                 break;
94         case ATOMISP_INPUT_FORMAT_RAW_12:
95                 rval = 12;
96                 break;
97         case ATOMISP_INPUT_FORMAT_RAW_14:
98                 if (two_ppc)
99                         rval = 14;
100                 else
101                         rval = 12;
102                 break;
103         case ATOMISP_INPUT_FORMAT_RAW_16:
104                 if (two_ppc)
105                         rval = 16;
106                 else
107                         rval = 12;
108                 break;
109         default:
110                 rval = 0;
111                 break;
112         }
113         return rval;
114 }
115
116 enum ia_css_err ia_css_util_check_vf_info(
117     const struct ia_css_frame_info *const info)
118 {
119         enum ia_css_err err;
120         unsigned int max_vf_width;
121
122         assert(info);
123         err = ia_css_frame_check_info(info);
124         if (err != IA_CSS_SUCCESS)
125                 return err;
126         max_vf_width = ia_css_binary_max_vf_width();
127         if (max_vf_width != 0 && info->res.width > max_vf_width * 2)
128                 return IA_CSS_ERR_INVALID_ARGUMENTS;
129         return IA_CSS_SUCCESS;
130 }
131
132 enum ia_css_err ia_css_util_check_vf_out_info(
133     const struct ia_css_frame_info *const out_info,
134     const struct ia_css_frame_info *const vf_info)
135 {
136         enum ia_css_err err;
137
138         assert(out_info);
139         assert(vf_info);
140
141         err = ia_css_frame_check_info(out_info);
142         if (err != IA_CSS_SUCCESS)
143                 return err;
144         err = ia_css_util_check_vf_info(vf_info);
145         if (err != IA_CSS_SUCCESS)
146                 return err;
147         return IA_CSS_SUCCESS;
148 }
149
150 enum ia_css_err ia_css_util_check_res(unsigned int width, unsigned int height)
151 {
152         /* height can be odd number for jpeg/embedded data from ISYS2401 */
153         if (((width  == 0)   ||
154              (height == 0)   ||
155              IS_ODD(width))) {
156                 return IA_CSS_ERR_INVALID_ARGUMENTS;
157         }
158         return IA_CSS_SUCCESS;
159 }
160
161 /* ISP2401 */
162 bool ia_css_util_res_leq(struct ia_css_resolution a, struct ia_css_resolution b)
163 {
164         return a.width <= b.width && a.height <= b.height;
165 }
166
167 /* ISP2401 */
168 bool ia_css_util_resolution_is_zero(const struct ia_css_resolution resolution)
169 {
170         return (resolution.width == 0) || (resolution.height == 0);
171 }
172
173 /* ISP2401 */
174 bool ia_css_util_resolution_is_even(const struct ia_css_resolution resolution)
175 {
176         return IS_EVEN(resolution.height) && IS_EVEN(resolution.width);
177 }
178
179 bool ia_css_util_is_input_format_raw(enum atomisp_input_format format)
180 {
181         return ((format == ATOMISP_INPUT_FORMAT_RAW_6) ||
182                 (format == ATOMISP_INPUT_FORMAT_RAW_7) ||
183                 (format == ATOMISP_INPUT_FORMAT_RAW_8) ||
184                 (format == ATOMISP_INPUT_FORMAT_RAW_10) ||
185                 (format == ATOMISP_INPUT_FORMAT_RAW_12));
186         /* raw_14 and raw_16 are not supported as input formats to the ISP.
187          * They can only be copied to a frame in memory using the
188          * copy binary.
189          */
190 }
191
192 bool ia_css_util_is_input_format_yuv(enum atomisp_input_format format)
193 {
194         return format == ATOMISP_INPUT_FORMAT_YUV420_8_LEGACY ||
195                format == ATOMISP_INPUT_FORMAT_YUV420_8  ||
196                format == ATOMISP_INPUT_FORMAT_YUV420_10 ||
197                format == ATOMISP_INPUT_FORMAT_YUV420_16 ||
198                format == ATOMISP_INPUT_FORMAT_YUV422_8  ||
199                format == ATOMISP_INPUT_FORMAT_YUV422_10 ||
200                format == ATOMISP_INPUT_FORMAT_YUV422_16;
201 }
202
203 enum ia_css_err ia_css_util_check_input(
204     const struct ia_css_stream_config *const stream_config,
205     bool must_be_raw,
206     bool must_be_yuv)
207 {
208         assert(stream_config);
209
210         if (!stream_config)
211                 return IA_CSS_ERR_INVALID_ARGUMENTS;
212
213         if (stream_config->input_config.effective_res.width == 0 ||
214             stream_config->input_config.effective_res.height == 0)
215                 return IA_CSS_ERR_INVALID_ARGUMENTS;
216         if (must_be_raw &&
217             !ia_css_util_is_input_format_raw(stream_config->input_config.format))
218                 return IA_CSS_ERR_INVALID_ARGUMENTS;
219
220         if (must_be_yuv &&
221             !ia_css_util_is_input_format_yuv(stream_config->input_config.format))
222                 return IA_CSS_ERR_INVALID_ARGUMENTS;
223
224         return IA_CSS_SUCCESS;
225 }