]> Git Repo - J-linux.git/blob - drivers/media/i2c/og01a1b.c
Merge tag 'vfs-6.13-rc7.fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/vfs/vfs
[J-linux.git] / drivers / media / i2c / og01a1b.c
1 // SPDX-License-Identifier: GPL-2.0
2 // Copyright (c) 2022 Intel Corporation.
3
4 #include <linux/unaligned.h>
5 #include <linux/acpi.h>
6 #include <linux/clk.h>
7 #include <linux/delay.h>
8 #include <linux/gpio/consumer.h>
9 #include <linux/i2c.h>
10 #include <linux/module.h>
11 #include <linux/pm_runtime.h>
12 #include <linux/regulator/consumer.h>
13 #include <media/v4l2-ctrls.h>
14 #include <media/v4l2-device.h>
15 #include <media/v4l2-fwnode.h>
16
17 #define OG01A1B_REG_VALUE_08BIT         1
18 #define OG01A1B_REG_VALUE_16BIT         2
19 #define OG01A1B_REG_VALUE_24BIT         3
20
21 #define OG01A1B_LINK_FREQ_500MHZ        500000000ULL
22 #define OG01A1B_SCLK                    120000000LL
23 #define OG01A1B_MCLK                    19200000
24 #define OG01A1B_DATA_LANES              2
25 #define OG01A1B_RGB_DEPTH               10
26
27 #define OG01A1B_REG_CHIP_ID             0x300a
28 #define OG01A1B_CHIP_ID                 0x470141
29
30 #define OG01A1B_REG_MODE_SELECT         0x0100
31 #define OG01A1B_MODE_STANDBY            0x00
32 #define OG01A1B_MODE_STREAMING          0x01
33
34 /* vertical-timings from sensor */
35 #define OG01A1B_REG_VTS                 0x380e
36 #define OG01A1B_VTS_120FPS              0x0498
37 #define OG01A1B_VTS_120FPS_MIN          0x0498
38 #define OG01A1B_VTS_MAX                 0x7fff
39
40 /* horizontal-timings from sensor */
41 #define OG01A1B_REG_HTS                 0x380c
42
43 /* Exposure controls from sensor */
44 #define OG01A1B_REG_EXPOSURE            0x3501
45 #define OG01A1B_EXPOSURE_MIN            1
46 #define OG01A1B_EXPOSURE_MAX_MARGIN     14
47 #define OG01A1B_EXPOSURE_STEP           1
48
49 /* Analog gain controls from sensor */
50 #define OG01A1B_REG_ANALOG_GAIN         0x3508
51 #define OG01A1B_ANAL_GAIN_MIN           16
52 #define OG01A1B_ANAL_GAIN_MAX           248 /* Max = 15.5x */
53 #define OG01A1B_ANAL_GAIN_STEP          1
54
55 /* Digital gain controls from sensor */
56 #define OG01A1B_REG_DIG_GAIN            0x350a
57 #define OG01A1B_DGTL_GAIN_MIN           1024
58 #define OG01A1B_DGTL_GAIN_MAX           16384 /* Max = 16x */
59 #define OG01A1B_DGTL_GAIN_STEP          1
60 #define OG01A1B_DGTL_GAIN_DEFAULT       1024
61
62 /* Group Access */
63 #define OG01A1B_REG_GROUP_ACCESS        0x3208
64 #define OG01A1B_GROUP_HOLD_START        0x0
65 #define OG01A1B_GROUP_HOLD_END          0x10
66 #define OG01A1B_GROUP_HOLD_LAUNCH       0xa0
67
68 /* Test Pattern Control */
69 #define OG01A1B_REG_TEST_PATTERN        0x5100
70 #define OG01A1B_TEST_PATTERN_ENABLE     BIT(7)
71 #define OG01A1B_TEST_PATTERN_BAR_SHIFT  2
72
73 #define to_og01a1b(_sd)                 container_of(_sd, struct og01a1b, sd)
74
75 enum {
76         OG01A1B_LINK_FREQ_1000MBPS,
77 };
78
79 struct og01a1b_reg {
80         u16 address;
81         u8 val;
82 };
83
84 struct og01a1b_reg_list {
85         u32 num_of_regs;
86         const struct og01a1b_reg *regs;
87 };
88
89 struct og01a1b_link_freq_config {
90         const struct og01a1b_reg_list reg_list;
91 };
92
93 struct og01a1b_mode {
94         /* Frame width in pixels */
95         u32 width;
96
97         /* Frame height in pixels */
98         u32 height;
99
100         /* Horizontal timining size */
101         u32 hts;
102
103         /* Default vertical timining size */
104         u32 vts_def;
105
106         /* Min vertical timining size */
107         u32 vts_min;
108
109         /* Link frequency needed for this resolution */
110         u32 link_freq_index;
111
112         /* Sensor register settings for this resolution */
113         const struct og01a1b_reg_list reg_list;
114 };
115
116 static const struct og01a1b_reg mipi_data_rate_1000mbps[] = {
117         {0x0103, 0x01},
118         {0x0303, 0x02},
119         {0x0304, 0x00},
120         {0x0305, 0xd2},
121         {0x0323, 0x02},
122         {0x0324, 0x01},
123         {0x0325, 0x77},
124 };
125
126 static const struct og01a1b_reg mode_1280x1024_regs[] = {
127         {0x0300, 0x0a},
128         {0x0301, 0x29},
129         {0x0302, 0x31},
130         {0x0303, 0x02},
131         {0x0304, 0x00},
132         {0x0305, 0xd2},
133         {0x0306, 0x00},
134         {0x0307, 0x01},
135         {0x0308, 0x02},
136         {0x0309, 0x00},
137         {0x0310, 0x00},
138         {0x0311, 0x00},
139         {0x0312, 0x07},
140         {0x0313, 0x00},
141         {0x0314, 0x00},
142         {0x0315, 0x00},
143         {0x0320, 0x02},
144         {0x0321, 0x01},
145         {0x0322, 0x01},
146         {0x0323, 0x02},
147         {0x0324, 0x01},
148         {0x0325, 0x77},
149         {0x0326, 0xce},
150         {0x0327, 0x04},
151         {0x0329, 0x02},
152         {0x032a, 0x04},
153         {0x032b, 0x04},
154         {0x032c, 0x02},
155         {0x032d, 0x01},
156         {0x032e, 0x00},
157         {0x300d, 0x02},
158         {0x300e, 0x04},
159         {0x3021, 0x08},
160         {0x301e, 0x03},
161         {0x3103, 0x00},
162         {0x3106, 0x08},
163         {0x3107, 0x40},
164         {0x3216, 0x01},
165         {0x3217, 0x00},
166         {0x3218, 0xc0},
167         {0x3219, 0x55},
168         {0x3500, 0x00},
169         {0x3501, 0x04},
170         {0x3502, 0x8a},
171         {0x3506, 0x01},
172         {0x3507, 0x72},
173         {0x3508, 0x01},
174         {0x3509, 0x00},
175         {0x350a, 0x01},
176         {0x350b, 0x00},
177         {0x350c, 0x00},
178         {0x3541, 0x00},
179         {0x3542, 0x40},
180         {0x3605, 0xe0},
181         {0x3606, 0x41},
182         {0x3614, 0x20},
183         {0x3620, 0x0b},
184         {0x3630, 0x07},
185         {0x3636, 0xa0},
186         {0x3637, 0xf9},
187         {0x3638, 0x09},
188         {0x3639, 0x38},
189         {0x363f, 0x09},
190         {0x3640, 0x17},
191         {0x3662, 0x04},
192         {0x3665, 0x80},
193         {0x3670, 0x68},
194         {0x3674, 0x00},
195         {0x3677, 0x3f},
196         {0x3679, 0x00},
197         {0x369f, 0x19},
198         {0x36a0, 0x03},
199         {0x36a2, 0x19},
200         {0x36a3, 0x03},
201         {0x370d, 0x66},
202         {0x370f, 0x00},
203         {0x3710, 0x03},
204         {0x3715, 0x03},
205         {0x3716, 0x03},
206         {0x3717, 0x06},
207         {0x3733, 0x00},
208         {0x3778, 0x00},
209         {0x37a8, 0x0f},
210         {0x37a9, 0x01},
211         {0x37aa, 0x07},
212         {0x37bd, 0x1c},
213         {0x37c1, 0x2f},
214         {0x37c3, 0x09},
215         {0x37c8, 0x1d},
216         {0x37ca, 0x30},
217         {0x37df, 0x00},
218         {0x3800, 0x00},
219         {0x3801, 0x00},
220         {0x3802, 0x00},
221         {0x3803, 0x00},
222         {0x3804, 0x05},
223         {0x3805, 0x0f},
224         {0x3806, 0x04},
225         {0x3807, 0x0f},
226         {0x3808, 0x05},
227         {0x3809, 0x00},
228         {0x380a, 0x04},
229         {0x380b, 0x00},
230         {0x380c, 0x03},
231         {0x380d, 0x50},
232         {0x380e, 0x04},
233         {0x380f, 0x98},
234         {0x3810, 0x00},
235         {0x3811, 0x08},
236         {0x3812, 0x00},
237         {0x3813, 0x08},
238         {0x3814, 0x11},
239         {0x3815, 0x11},
240         {0x3820, 0x40},
241         {0x3821, 0x04},
242         {0x3826, 0x00},
243         {0x3827, 0x00},
244         {0x382a, 0x08},
245         {0x382b, 0x52},
246         {0x382d, 0xba},
247         {0x383d, 0x14},
248         {0x384a, 0xa2},
249         {0x3866, 0x0e},
250         {0x3867, 0x07},
251         {0x3884, 0x00},
252         {0x3885, 0x08},
253         {0x3893, 0x68},
254         {0x3894, 0x2a},
255         {0x3898, 0x00},
256         {0x3899, 0x31},
257         {0x389a, 0x04},
258         {0x389b, 0x00},
259         {0x389c, 0x0b},
260         {0x389d, 0xad},
261         {0x389f, 0x08},
262         {0x38a0, 0x00},
263         {0x38a1, 0x00},
264         {0x38a8, 0x70},
265         {0x38ac, 0xea},
266         {0x38b2, 0x00},
267         {0x38b3, 0x08},
268         {0x38bc, 0x20},
269         {0x38c4, 0x0c},
270         {0x38c5, 0x3a},
271         {0x38c7, 0x3a},
272         {0x38e1, 0xc0},
273         {0x38ec, 0x3c},
274         {0x38f0, 0x09},
275         {0x38f1, 0x6f},
276         {0x38fe, 0x3c},
277         {0x391e, 0x00},
278         {0x391f, 0x00},
279         {0x3920, 0xa5},
280         {0x3921, 0x00},
281         {0x3922, 0x00},
282         {0x3923, 0x00},
283         {0x3924, 0x05},
284         {0x3925, 0x00},
285         {0x3926, 0x00},
286         {0x3927, 0x00},
287         {0x3928, 0x1a},
288         {0x3929, 0x01},
289         {0x392a, 0xb4},
290         {0x392b, 0x00},
291         {0x392c, 0x10},
292         {0x392f, 0x40},
293         {0x4000, 0xcf},
294         {0x4003, 0x40},
295         {0x4008, 0x00},
296         {0x4009, 0x07},
297         {0x400a, 0x02},
298         {0x400b, 0x54},
299         {0x400c, 0x00},
300         {0x400d, 0x07},
301         {0x4010, 0xc0},
302         {0x4012, 0x02},
303         {0x4014, 0x04},
304         {0x4015, 0x04},
305         {0x4017, 0x02},
306         {0x4042, 0x01},
307         {0x4306, 0x04},
308         {0x4307, 0x12},
309         {0x4509, 0x00},
310         {0x450b, 0x83},
311         {0x4604, 0x68},
312         {0x4608, 0x0a},
313         {0x4700, 0x06},
314         {0x4800, 0x64},
315         {0x481b, 0x3c},
316         {0x4825, 0x32},
317         {0x4833, 0x18},
318         {0x4837, 0x0f},
319         {0x4850, 0x40},
320         {0x4860, 0x00},
321         {0x4861, 0xec},
322         {0x4864, 0x00},
323         {0x4883, 0x00},
324         {0x4888, 0x90},
325         {0x4889, 0x05},
326         {0x488b, 0x04},
327         {0x4f00, 0x04},
328         {0x4f10, 0x04},
329         {0x4f21, 0x01},
330         {0x4f22, 0x40},
331         {0x4f23, 0x44},
332         {0x4f24, 0x51},
333         {0x4f25, 0x41},
334         {0x5000, 0x1f},
335         {0x500a, 0x00},
336         {0x5100, 0x00},
337         {0x5111, 0x20},
338         {0x3020, 0x20},
339         {0x3613, 0x03},
340         {0x38c9, 0x02},
341         {0x5304, 0x01},
342         {0x3620, 0x08},
343         {0x3639, 0x58},
344         {0x363a, 0x10},
345         {0x3674, 0x04},
346         {0x3780, 0xff},
347         {0x3781, 0xff},
348         {0x3782, 0x00},
349         {0x3783, 0x01},
350         {0x3798, 0xa3},
351         {0x37aa, 0x10},
352         {0x38a8, 0xf0},
353         {0x38c4, 0x09},
354         {0x38c5, 0xb0},
355         {0x38df, 0x80},
356         {0x38ff, 0x05},
357         {0x4010, 0xf1},
358         {0x4011, 0x70},
359         {0x3667, 0x80},
360         {0x4d00, 0x4a},
361         {0x4d01, 0x18},
362         {0x4d02, 0xbb},
363         {0x4d03, 0xde},
364         {0x4d04, 0x93},
365         {0x4d05, 0xff},
366         {0x4d09, 0x0a},
367         {0x37aa, 0x16},
368         {0x3606, 0x42},
369         {0x3605, 0x00},
370         {0x36a2, 0x17},
371         {0x300d, 0x0a},
372         {0x4d00, 0x4d},
373         {0x4d01, 0x95},
374         {0x3d8C, 0x70},
375         {0x3d8d, 0xE9},
376         {0x5300, 0x00},
377         {0x5301, 0x10},
378         {0x5302, 0x00},
379         {0x5303, 0xE3},
380         {0x3d88, 0x00},
381         {0x3d89, 0x10},
382         {0x3d8a, 0x00},
383         {0x3d8b, 0xE3},
384         {0x4f22, 0x00},
385 };
386
387 static const char * const og01a1b_test_pattern_menu[] = {
388         "Disabled",
389         "Standard Color Bar",
390         "Top-Bottom Darker Color Bar",
391         "Right-Left Darker Color Bar",
392         "Bottom-Top Darker Color Bar"
393 };
394
395 static const s64 link_freq_menu_items[] = {
396         OG01A1B_LINK_FREQ_500MHZ,
397 };
398
399 static const struct og01a1b_link_freq_config link_freq_configs[] = {
400         [OG01A1B_LINK_FREQ_1000MBPS] = {
401                 .reg_list = {
402                         .num_of_regs = ARRAY_SIZE(mipi_data_rate_1000mbps),
403                         .regs = mipi_data_rate_1000mbps,
404                 }
405         }
406 };
407
408 static const struct og01a1b_mode supported_modes[] = {
409         {
410                 .width = 1280,
411                 .height = 1024,
412                 .hts = 848,
413                 .vts_def = OG01A1B_VTS_120FPS,
414                 .vts_min = OG01A1B_VTS_120FPS_MIN,
415                 .reg_list = {
416                         .num_of_regs = ARRAY_SIZE(mode_1280x1024_regs),
417                         .regs = mode_1280x1024_regs,
418                 },
419                 .link_freq_index = OG01A1B_LINK_FREQ_1000MBPS,
420         },
421 };
422
423 struct og01a1b {
424         struct clk *xvclk;
425         struct gpio_desc *reset_gpio;
426         struct regulator *avdd;
427         struct regulator *dovdd;
428         struct regulator *dvdd;
429
430         struct v4l2_subdev sd;
431         struct media_pad pad;
432         struct v4l2_ctrl_handler ctrl_handler;
433
434         /* V4L2 Controls */
435         struct v4l2_ctrl *link_freq;
436         struct v4l2_ctrl *pixel_rate;
437         struct v4l2_ctrl *vblank;
438         struct v4l2_ctrl *hblank;
439         struct v4l2_ctrl *exposure;
440
441         /* Current mode */
442         const struct og01a1b_mode *cur_mode;
443
444         /* To serialize asynchronus callbacks */
445         struct mutex mutex;
446 };
447
448 static u64 to_pixel_rate(u32 f_index)
449 {
450         u64 pixel_rate = link_freq_menu_items[f_index] * 2 * OG01A1B_DATA_LANES;
451
452         do_div(pixel_rate, OG01A1B_RGB_DEPTH);
453
454         return pixel_rate;
455 }
456
457 static u64 to_pixels_per_line(u32 hts, u32 f_index)
458 {
459         u64 ppl = hts * to_pixel_rate(f_index);
460
461         do_div(ppl, OG01A1B_SCLK);
462
463         return ppl;
464 }
465
466 static int og01a1b_read_reg(struct og01a1b *og01a1b, u16 reg, u16 len, u32 *val)
467 {
468         struct i2c_client *client = v4l2_get_subdevdata(&og01a1b->sd);
469         struct i2c_msg msgs[2];
470         u8 addr_buf[2];
471         u8 data_buf[4] = {0};
472         int ret;
473
474         if (len > 4)
475                 return -EINVAL;
476
477         put_unaligned_be16(reg, addr_buf);
478         msgs[0].addr = client->addr;
479         msgs[0].flags = 0;
480         msgs[0].len = sizeof(addr_buf);
481         msgs[0].buf = addr_buf;
482         msgs[1].addr = client->addr;
483         msgs[1].flags = I2C_M_RD;
484         msgs[1].len = len;
485         msgs[1].buf = &data_buf[4 - len];
486
487         ret = i2c_transfer(client->adapter, msgs, ARRAY_SIZE(msgs));
488         if (ret != ARRAY_SIZE(msgs))
489                 return -EIO;
490
491         *val = get_unaligned_be32(data_buf);
492
493         return 0;
494 }
495
496 static int og01a1b_write_reg(struct og01a1b *og01a1b, u16 reg, u16 len, u32 val)
497 {
498         struct i2c_client *client = v4l2_get_subdevdata(&og01a1b->sd);
499         u8 buf[6];
500
501         if (len > 4)
502                 return -EINVAL;
503
504         put_unaligned_be16(reg, buf);
505         put_unaligned_be32(val << 8 * (4 - len), buf + 2);
506         if (i2c_master_send(client, buf, len + 2) != len + 2)
507                 return -EIO;
508
509         return 0;
510 }
511
512 static int og01a1b_write_reg_list(struct og01a1b *og01a1b,
513                                   const struct og01a1b_reg_list *r_list)
514 {
515         struct i2c_client *client = v4l2_get_subdevdata(&og01a1b->sd);
516         unsigned int i;
517         int ret;
518
519         for (i = 0; i < r_list->num_of_regs; i++) {
520                 ret = og01a1b_write_reg(og01a1b, r_list->regs[i].address, 1,
521                                         r_list->regs[i].val);
522                 if (ret) {
523                         dev_err_ratelimited(&client->dev,
524                                             "failed to write reg 0x%4.4x. error = %d",
525                                             r_list->regs[i].address, ret);
526                         return ret;
527                 }
528         }
529
530         return 0;
531 }
532
533 static int og01a1b_test_pattern(struct og01a1b *og01a1b, u32 pattern)
534 {
535         if (pattern)
536                 pattern = (pattern - 1) << OG01A1B_TEST_PATTERN_BAR_SHIFT |
537                           OG01A1B_TEST_PATTERN_ENABLE;
538
539         return og01a1b_write_reg(og01a1b, OG01A1B_REG_TEST_PATTERN,
540                                  OG01A1B_REG_VALUE_08BIT, pattern);
541 }
542
543 static int og01a1b_set_ctrl(struct v4l2_ctrl *ctrl)
544 {
545         struct og01a1b *og01a1b = container_of(ctrl->handler,
546                                                struct og01a1b, ctrl_handler);
547         struct i2c_client *client = v4l2_get_subdevdata(&og01a1b->sd);
548         s64 exposure_max;
549         int ret = 0;
550
551         /* Propagate change of current control to all related controls */
552         if (ctrl->id == V4L2_CID_VBLANK) {
553                 /* Update max exposure while meeting expected vblanking */
554                 exposure_max = og01a1b->cur_mode->height + ctrl->val -
555                                OG01A1B_EXPOSURE_MAX_MARGIN;
556                 __v4l2_ctrl_modify_range(og01a1b->exposure,
557                                          og01a1b->exposure->minimum,
558                                          exposure_max, og01a1b->exposure->step,
559                                          exposure_max);
560         }
561
562         /* V4L2 controls values will be applied only when power is already up */
563         if (!pm_runtime_get_if_in_use(&client->dev))
564                 return 0;
565
566         switch (ctrl->id) {
567         case V4L2_CID_ANALOGUE_GAIN:
568                 ret = og01a1b_write_reg(og01a1b, OG01A1B_REG_ANALOG_GAIN,
569                                         OG01A1B_REG_VALUE_16BIT,
570                                         ctrl->val << 4);
571                 break;
572
573         case V4L2_CID_DIGITAL_GAIN:
574                 ret = og01a1b_write_reg(og01a1b, OG01A1B_REG_DIG_GAIN,
575                                         OG01A1B_REG_VALUE_24BIT,
576                                         ctrl->val << 6);
577                 break;
578
579         case V4L2_CID_EXPOSURE:
580                 ret = og01a1b_write_reg(og01a1b, OG01A1B_REG_EXPOSURE,
581                                         OG01A1B_REG_VALUE_16BIT, ctrl->val);
582                 break;
583
584         case V4L2_CID_VBLANK:
585                 ret = og01a1b_write_reg(og01a1b, OG01A1B_REG_VTS,
586                                         OG01A1B_REG_VALUE_16BIT,
587                                         og01a1b->cur_mode->height + ctrl->val);
588                 break;
589
590         case V4L2_CID_TEST_PATTERN:
591                 ret = og01a1b_test_pattern(og01a1b, ctrl->val);
592                 break;
593
594         default:
595                 ret = -EINVAL;
596                 break;
597         }
598
599         pm_runtime_put(&client->dev);
600
601         return ret;
602 }
603
604 static const struct v4l2_ctrl_ops og01a1b_ctrl_ops = {
605         .s_ctrl = og01a1b_set_ctrl,
606 };
607
608 static int og01a1b_init_controls(struct og01a1b *og01a1b)
609 {
610         struct v4l2_ctrl_handler *ctrl_hdlr;
611         s64 exposure_max, h_blank;
612         int ret;
613
614         ctrl_hdlr = &og01a1b->ctrl_handler;
615         ret = v4l2_ctrl_handler_init(ctrl_hdlr, 8);
616         if (ret)
617                 return ret;
618
619         ctrl_hdlr->lock = &og01a1b->mutex;
620         og01a1b->link_freq = v4l2_ctrl_new_int_menu(ctrl_hdlr,
621                                                     &og01a1b_ctrl_ops,
622                                                     V4L2_CID_LINK_FREQ,
623                                                     ARRAY_SIZE
624                                                     (link_freq_menu_items) - 1,
625                                                     0, link_freq_menu_items);
626         if (og01a1b->link_freq)
627                 og01a1b->link_freq->flags |= V4L2_CTRL_FLAG_READ_ONLY;
628
629         og01a1b->pixel_rate = v4l2_ctrl_new_std(ctrl_hdlr, &og01a1b_ctrl_ops,
630                                                 V4L2_CID_PIXEL_RATE, 0,
631                                                 to_pixel_rate
632                                                 (OG01A1B_LINK_FREQ_1000MBPS),
633                                                 1,
634                                                 to_pixel_rate
635                                                 (OG01A1B_LINK_FREQ_1000MBPS));
636         og01a1b->vblank = v4l2_ctrl_new_std(ctrl_hdlr, &og01a1b_ctrl_ops,
637                                             V4L2_CID_VBLANK,
638                                             og01a1b->cur_mode->vts_min -
639                                             og01a1b->cur_mode->height,
640                                             OG01A1B_VTS_MAX -
641                                             og01a1b->cur_mode->height, 1,
642                                             og01a1b->cur_mode->vts_def -
643                                             og01a1b->cur_mode->height);
644         h_blank = to_pixels_per_line(og01a1b->cur_mode->hts,
645                                      og01a1b->cur_mode->link_freq_index) -
646                                      og01a1b->cur_mode->width;
647         og01a1b->hblank = v4l2_ctrl_new_std(ctrl_hdlr, &og01a1b_ctrl_ops,
648                                             V4L2_CID_HBLANK, h_blank, h_blank,
649                                             1, h_blank);
650         if (og01a1b->hblank)
651                 og01a1b->hblank->flags |= V4L2_CTRL_FLAG_READ_ONLY;
652
653         v4l2_ctrl_new_std(ctrl_hdlr, &og01a1b_ctrl_ops, V4L2_CID_ANALOGUE_GAIN,
654                           OG01A1B_ANAL_GAIN_MIN, OG01A1B_ANAL_GAIN_MAX,
655                           OG01A1B_ANAL_GAIN_STEP, OG01A1B_ANAL_GAIN_MIN);
656         v4l2_ctrl_new_std(ctrl_hdlr, &og01a1b_ctrl_ops, V4L2_CID_DIGITAL_GAIN,
657                           OG01A1B_DGTL_GAIN_MIN, OG01A1B_DGTL_GAIN_MAX,
658                           OG01A1B_DGTL_GAIN_STEP, OG01A1B_DGTL_GAIN_DEFAULT);
659         exposure_max = (og01a1b->cur_mode->vts_def -
660                         OG01A1B_EXPOSURE_MAX_MARGIN);
661         og01a1b->exposure = v4l2_ctrl_new_std(ctrl_hdlr, &og01a1b_ctrl_ops,
662                                               V4L2_CID_EXPOSURE,
663                                               OG01A1B_EXPOSURE_MIN,
664                                               exposure_max,
665                                               OG01A1B_EXPOSURE_STEP,
666                                               exposure_max);
667         v4l2_ctrl_new_std_menu_items(ctrl_hdlr, &og01a1b_ctrl_ops,
668                                      V4L2_CID_TEST_PATTERN,
669                                      ARRAY_SIZE(og01a1b_test_pattern_menu) - 1,
670                                      0, 0, og01a1b_test_pattern_menu);
671
672         if (ctrl_hdlr->error)
673                 return ctrl_hdlr->error;
674
675         og01a1b->sd.ctrl_handler = ctrl_hdlr;
676
677         return 0;
678 }
679
680 static void og01a1b_update_pad_format(const struct og01a1b_mode *mode,
681                                       struct v4l2_mbus_framefmt *fmt)
682 {
683         fmt->width = mode->width;
684         fmt->height = mode->height;
685         fmt->code = MEDIA_BUS_FMT_SGRBG10_1X10;
686         fmt->field = V4L2_FIELD_NONE;
687 }
688
689 static int og01a1b_start_streaming(struct og01a1b *og01a1b)
690 {
691         struct i2c_client *client = v4l2_get_subdevdata(&og01a1b->sd);
692         const struct og01a1b_reg_list *reg_list;
693         int link_freq_index, ret;
694
695         link_freq_index = og01a1b->cur_mode->link_freq_index;
696         reg_list = &link_freq_configs[link_freq_index].reg_list;
697
698         ret = og01a1b_write_reg_list(og01a1b, reg_list);
699         if (ret) {
700                 dev_err(&client->dev, "failed to set plls");
701                 return ret;
702         }
703
704         reg_list = &og01a1b->cur_mode->reg_list;
705         ret = og01a1b_write_reg_list(og01a1b, reg_list);
706         if (ret) {
707                 dev_err(&client->dev, "failed to set mode");
708                 return ret;
709         }
710
711         ret = __v4l2_ctrl_handler_setup(og01a1b->sd.ctrl_handler);
712         if (ret)
713                 return ret;
714
715         ret = og01a1b_write_reg(og01a1b, OG01A1B_REG_MODE_SELECT,
716                                 OG01A1B_REG_VALUE_08BIT,
717                                 OG01A1B_MODE_STREAMING);
718         if (ret) {
719                 dev_err(&client->dev, "failed to set stream");
720                 return ret;
721         }
722
723         return 0;
724 }
725
726 static void og01a1b_stop_streaming(struct og01a1b *og01a1b)
727 {
728         struct i2c_client *client = v4l2_get_subdevdata(&og01a1b->sd);
729
730         if (og01a1b_write_reg(og01a1b, OG01A1B_REG_MODE_SELECT,
731                               OG01A1B_REG_VALUE_08BIT, OG01A1B_MODE_STANDBY))
732                 dev_err(&client->dev, "failed to set stream");
733 }
734
735 static int og01a1b_set_stream(struct v4l2_subdev *sd, int enable)
736 {
737         struct og01a1b *og01a1b = to_og01a1b(sd);
738         struct i2c_client *client = v4l2_get_subdevdata(sd);
739         int ret = 0;
740
741         mutex_lock(&og01a1b->mutex);
742         if (enable) {
743                 ret = pm_runtime_resume_and_get(&client->dev);
744                 if (ret) {
745                         mutex_unlock(&og01a1b->mutex);
746                         return ret;
747                 }
748
749                 ret = og01a1b_start_streaming(og01a1b);
750                 if (ret) {
751                         enable = 0;
752                         og01a1b_stop_streaming(og01a1b);
753                         pm_runtime_put(&client->dev);
754                 }
755         } else {
756                 og01a1b_stop_streaming(og01a1b);
757                 pm_runtime_put(&client->dev);
758         }
759
760         mutex_unlock(&og01a1b->mutex);
761
762         return ret;
763 }
764
765 static int og01a1b_set_format(struct v4l2_subdev *sd,
766                               struct v4l2_subdev_state *sd_state,
767                               struct v4l2_subdev_format *fmt)
768 {
769         struct og01a1b *og01a1b = to_og01a1b(sd);
770         const struct og01a1b_mode *mode;
771         s32 vblank_def, h_blank;
772
773         mode = v4l2_find_nearest_size(supported_modes,
774                                       ARRAY_SIZE(supported_modes), width,
775                                       height, fmt->format.width,
776                                       fmt->format.height);
777
778         mutex_lock(&og01a1b->mutex);
779         og01a1b_update_pad_format(mode, &fmt->format);
780         if (fmt->which == V4L2_SUBDEV_FORMAT_TRY) {
781                 *v4l2_subdev_state_get_format(sd_state, fmt->pad) = fmt->format;
782         } else {
783                 og01a1b->cur_mode = mode;
784                 __v4l2_ctrl_s_ctrl(og01a1b->link_freq, mode->link_freq_index);
785                 __v4l2_ctrl_s_ctrl_int64(og01a1b->pixel_rate,
786                                          to_pixel_rate(mode->link_freq_index));
787
788                 /* Update limits and set FPS to default */
789                 vblank_def = mode->vts_def - mode->height;
790                 __v4l2_ctrl_modify_range(og01a1b->vblank,
791                                          mode->vts_min - mode->height,
792                                          OG01A1B_VTS_MAX - mode->height, 1,
793                                          vblank_def);
794                 __v4l2_ctrl_s_ctrl(og01a1b->vblank, vblank_def);
795                 h_blank = to_pixels_per_line(mode->hts, mode->link_freq_index) -
796                           mode->width;
797                 __v4l2_ctrl_modify_range(og01a1b->hblank, h_blank, h_blank, 1,
798                                          h_blank);
799         }
800
801         mutex_unlock(&og01a1b->mutex);
802
803         return 0;
804 }
805
806 static int og01a1b_get_format(struct v4l2_subdev *sd,
807                               struct v4l2_subdev_state *sd_state,
808                               struct v4l2_subdev_format *fmt)
809 {
810         struct og01a1b *og01a1b = to_og01a1b(sd);
811
812         mutex_lock(&og01a1b->mutex);
813         if (fmt->which == V4L2_SUBDEV_FORMAT_TRY)
814                 fmt->format = *v4l2_subdev_state_get_format(sd_state,
815                                                             fmt->pad);
816         else
817                 og01a1b_update_pad_format(og01a1b->cur_mode, &fmt->format);
818
819         mutex_unlock(&og01a1b->mutex);
820
821         return 0;
822 }
823
824 static int og01a1b_enum_mbus_code(struct v4l2_subdev *sd,
825                                   struct v4l2_subdev_state *sd_state,
826                                   struct v4l2_subdev_mbus_code_enum *code)
827 {
828         if (code->index > 0)
829                 return -EINVAL;
830
831         code->code = MEDIA_BUS_FMT_SGRBG10_1X10;
832
833         return 0;
834 }
835
836 static int og01a1b_enum_frame_size(struct v4l2_subdev *sd,
837                                    struct v4l2_subdev_state *sd_state,
838                                    struct v4l2_subdev_frame_size_enum *fse)
839 {
840         if (fse->index >= ARRAY_SIZE(supported_modes))
841                 return -EINVAL;
842
843         if (fse->code != MEDIA_BUS_FMT_SGRBG10_1X10)
844                 return -EINVAL;
845
846         fse->min_width = supported_modes[fse->index].width;
847         fse->max_width = fse->min_width;
848         fse->min_height = supported_modes[fse->index].height;
849         fse->max_height = fse->min_height;
850
851         return 0;
852 }
853
854 static int og01a1b_open(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh)
855 {
856         struct og01a1b *og01a1b = to_og01a1b(sd);
857
858         mutex_lock(&og01a1b->mutex);
859         og01a1b_update_pad_format(&supported_modes[0],
860                                   v4l2_subdev_state_get_format(fh->state, 0));
861         mutex_unlock(&og01a1b->mutex);
862
863         return 0;
864 }
865
866 static const struct v4l2_subdev_video_ops og01a1b_video_ops = {
867         .s_stream = og01a1b_set_stream,
868 };
869
870 static const struct v4l2_subdev_pad_ops og01a1b_pad_ops = {
871         .set_fmt = og01a1b_set_format,
872         .get_fmt = og01a1b_get_format,
873         .enum_mbus_code = og01a1b_enum_mbus_code,
874         .enum_frame_size = og01a1b_enum_frame_size,
875 };
876
877 static const struct v4l2_subdev_ops og01a1b_subdev_ops = {
878         .video = &og01a1b_video_ops,
879         .pad = &og01a1b_pad_ops,
880 };
881
882 static const struct media_entity_operations og01a1b_subdev_entity_ops = {
883         .link_validate = v4l2_subdev_link_validate,
884 };
885
886 static const struct v4l2_subdev_internal_ops og01a1b_internal_ops = {
887         .open = og01a1b_open,
888 };
889
890 static int og01a1b_identify_module(struct og01a1b *og01a1b)
891 {
892         struct i2c_client *client = v4l2_get_subdevdata(&og01a1b->sd);
893         int ret;
894         u32 val;
895
896         ret = og01a1b_read_reg(og01a1b, OG01A1B_REG_CHIP_ID,
897                                OG01A1B_REG_VALUE_24BIT, &val);
898         if (ret)
899                 return ret;
900
901         if (val != OG01A1B_CHIP_ID) {
902                 dev_err(&client->dev, "chip id mismatch: %x!=%x",
903                         OG01A1B_CHIP_ID, val);
904                 return -ENXIO;
905         }
906
907         return 0;
908 }
909
910 static int og01a1b_check_hwcfg(struct og01a1b *og01a1b)
911 {
912         struct i2c_client *client = v4l2_get_subdevdata(&og01a1b->sd);
913         struct device *dev = &client->dev;
914         struct fwnode_handle *ep;
915         struct fwnode_handle *fwnode = dev_fwnode(dev);
916         struct v4l2_fwnode_endpoint bus_cfg = {
917                 .bus_type = V4L2_MBUS_CSI2_DPHY
918         };
919         u32 mclk;
920         int ret;
921         unsigned int i, j;
922
923         if (!fwnode)
924                 return -ENXIO;
925
926         ret = fwnode_property_read_u32(fwnode, "clock-frequency", &mclk);
927         if (ret) {
928                 if (!og01a1b->xvclk) {
929                         dev_err(dev, "can't get clock frequency");
930                         return ret;
931                 }
932
933                 mclk = clk_get_rate(og01a1b->xvclk);
934         }
935
936         if (mclk != OG01A1B_MCLK) {
937                 dev_err(dev, "external clock %d is not supported", mclk);
938                 return -EINVAL;
939         }
940
941         ep = fwnode_graph_get_next_endpoint(fwnode, NULL);
942         if (!ep)
943                 return -ENXIO;
944
945         ret = v4l2_fwnode_endpoint_alloc_parse(ep, &bus_cfg);
946         fwnode_handle_put(ep);
947         if (ret)
948                 return ret;
949
950         if (bus_cfg.bus.mipi_csi2.num_data_lanes != OG01A1B_DATA_LANES) {
951                 dev_err(dev, "number of CSI2 data lanes %d is not supported",
952                         bus_cfg.bus.mipi_csi2.num_data_lanes);
953                 ret = -EINVAL;
954                 goto check_hwcfg_error;
955         }
956
957         if (!bus_cfg.nr_of_link_frequencies) {
958                 dev_err(dev, "no link frequencies defined");
959                 ret = -EINVAL;
960                 goto check_hwcfg_error;
961         }
962
963         for (i = 0; i < ARRAY_SIZE(link_freq_menu_items); i++) {
964                 for (j = 0; j < bus_cfg.nr_of_link_frequencies; j++) {
965                         if (link_freq_menu_items[i] ==
966                                 bus_cfg.link_frequencies[j])
967                                 break;
968                 }
969
970                 if (j == bus_cfg.nr_of_link_frequencies) {
971                         dev_err(dev, "no link frequency %lld supported",
972                                 link_freq_menu_items[i]);
973                         ret = -EINVAL;
974                         goto check_hwcfg_error;
975                 }
976         }
977
978 check_hwcfg_error:
979         v4l2_fwnode_endpoint_free(&bus_cfg);
980
981         return ret;
982 }
983
984 /* Power/clock management functions */
985 static int og01a1b_power_on(struct device *dev)
986 {
987         unsigned long delay = DIV_ROUND_UP(8192UL * USEC_PER_SEC, OG01A1B_MCLK);
988         struct v4l2_subdev *sd = dev_get_drvdata(dev);
989         struct og01a1b *og01a1b = to_og01a1b(sd);
990         int ret;
991
992         if (og01a1b->avdd) {
993                 ret = regulator_enable(og01a1b->avdd);
994                 if (ret)
995                         return ret;
996         }
997
998         if (og01a1b->dovdd) {
999                 ret = regulator_enable(og01a1b->dovdd);
1000                 if (ret)
1001                         goto avdd_disable;
1002         }
1003
1004         if (og01a1b->dvdd) {
1005                 ret = regulator_enable(og01a1b->dvdd);
1006                 if (ret)
1007                         goto dovdd_disable;
1008         }
1009
1010         ret = clk_prepare_enable(og01a1b->xvclk);
1011         if (ret)
1012                 goto dvdd_disable;
1013
1014         gpiod_set_value_cansleep(og01a1b->reset_gpio, 0);
1015
1016         if (og01a1b->reset_gpio)
1017                 usleep_range(5 * USEC_PER_MSEC, 6 * USEC_PER_MSEC);
1018         else if (og01a1b->xvclk)
1019                 usleep_range(delay, 2 * delay);
1020
1021         return 0;
1022
1023 dvdd_disable:
1024         if (og01a1b->dvdd)
1025                 regulator_disable(og01a1b->dvdd);
1026 dovdd_disable:
1027         if (og01a1b->dovdd)
1028                 regulator_disable(og01a1b->dovdd);
1029 avdd_disable:
1030         if (og01a1b->avdd)
1031                 regulator_disable(og01a1b->avdd);
1032
1033         return ret;
1034 }
1035
1036 static int og01a1b_power_off(struct device *dev)
1037 {
1038         unsigned long delay = DIV_ROUND_UP(512 * USEC_PER_SEC, OG01A1B_MCLK);
1039         struct v4l2_subdev *sd = dev_get_drvdata(dev);
1040         struct og01a1b *og01a1b = to_og01a1b(sd);
1041
1042         if (og01a1b->xvclk)
1043                 usleep_range(delay, 2 * delay);
1044
1045         clk_disable_unprepare(og01a1b->xvclk);
1046
1047         gpiod_set_value_cansleep(og01a1b->reset_gpio, 1);
1048
1049         if (og01a1b->dvdd)
1050                 regulator_disable(og01a1b->dvdd);
1051
1052         if (og01a1b->dovdd)
1053                 regulator_disable(og01a1b->dovdd);
1054
1055         if (og01a1b->avdd)
1056                 regulator_disable(og01a1b->avdd);
1057
1058         return 0;
1059 }
1060
1061 static void og01a1b_remove(struct i2c_client *client)
1062 {
1063         struct v4l2_subdev *sd = i2c_get_clientdata(client);
1064         struct og01a1b *og01a1b = to_og01a1b(sd);
1065
1066         v4l2_async_unregister_subdev(sd);
1067         media_entity_cleanup(&sd->entity);
1068         v4l2_ctrl_handler_free(sd->ctrl_handler);
1069         pm_runtime_disable(&client->dev);
1070         mutex_destroy(&og01a1b->mutex);
1071 }
1072
1073 static int og01a1b_probe(struct i2c_client *client)
1074 {
1075         struct og01a1b *og01a1b;
1076         int ret;
1077
1078         og01a1b = devm_kzalloc(&client->dev, sizeof(*og01a1b), GFP_KERNEL);
1079         if (!og01a1b)
1080                 return -ENOMEM;
1081
1082         v4l2_i2c_subdev_init(&og01a1b->sd, client, &og01a1b_subdev_ops);
1083
1084         og01a1b->xvclk = devm_clk_get_optional(&client->dev, NULL);
1085         if (IS_ERR(og01a1b->xvclk)) {
1086                 ret = PTR_ERR(og01a1b->xvclk);
1087                 dev_err(&client->dev, "failed to get xvclk clock: %d\n", ret);
1088                 return ret;
1089         }
1090
1091         ret = og01a1b_check_hwcfg(og01a1b);
1092         if (ret) {
1093                 dev_err(&client->dev, "failed to check HW configuration: %d",
1094                         ret);
1095                 return ret;
1096         }
1097
1098         og01a1b->reset_gpio = devm_gpiod_get_optional(&client->dev, "reset",
1099                                                       GPIOD_OUT_LOW);
1100         if (IS_ERR(og01a1b->reset_gpio)) {
1101                 dev_err(&client->dev, "cannot get reset GPIO\n");
1102                 return PTR_ERR(og01a1b->reset_gpio);
1103         }
1104
1105         og01a1b->avdd = devm_regulator_get_optional(&client->dev, "avdd");
1106         if (IS_ERR(og01a1b->avdd)) {
1107                 ret = PTR_ERR(og01a1b->avdd);
1108                 if (ret != -ENODEV) {
1109                         dev_err_probe(&client->dev, ret,
1110                                       "Failed to get 'avdd' regulator\n");
1111                         return ret;
1112                 }
1113
1114                 og01a1b->avdd = NULL;
1115         }
1116
1117         og01a1b->dovdd = devm_regulator_get_optional(&client->dev, "dovdd");
1118         if (IS_ERR(og01a1b->dovdd)) {
1119                 ret = PTR_ERR(og01a1b->dovdd);
1120                 if (ret != -ENODEV) {
1121                         dev_err_probe(&client->dev, ret,
1122                                       "Failed to get 'dovdd' regulator\n");
1123                         return ret;
1124                 }
1125
1126                 og01a1b->dovdd = NULL;
1127         }
1128
1129         og01a1b->dvdd = devm_regulator_get_optional(&client->dev, "dvdd");
1130         if (IS_ERR(og01a1b->dvdd)) {
1131                 ret = PTR_ERR(og01a1b->dvdd);
1132                 if (ret != -ENODEV) {
1133                         dev_err_probe(&client->dev, ret,
1134                                       "Failed to get 'dvdd' regulator\n");
1135                         return ret;
1136                 }
1137
1138                 og01a1b->dvdd = NULL;
1139         }
1140
1141         /* The sensor must be powered on to read the CHIP_ID register */
1142         ret = og01a1b_power_on(&client->dev);
1143         if (ret)
1144                 return ret;
1145
1146         ret = og01a1b_identify_module(og01a1b);
1147         if (ret) {
1148                 dev_err(&client->dev, "failed to find sensor: %d", ret);
1149                 goto power_off;
1150         }
1151
1152         mutex_init(&og01a1b->mutex);
1153         og01a1b->cur_mode = &supported_modes[0];
1154         ret = og01a1b_init_controls(og01a1b);
1155         if (ret) {
1156                 dev_err(&client->dev, "failed to init controls: %d", ret);
1157                 goto probe_error_v4l2_ctrl_handler_free;
1158         }
1159
1160         og01a1b->sd.internal_ops = &og01a1b_internal_ops;
1161         og01a1b->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
1162         og01a1b->sd.entity.ops = &og01a1b_subdev_entity_ops;
1163         og01a1b->sd.entity.function = MEDIA_ENT_F_CAM_SENSOR;
1164         og01a1b->pad.flags = MEDIA_PAD_FL_SOURCE;
1165         ret = media_entity_pads_init(&og01a1b->sd.entity, 1, &og01a1b->pad);
1166         if (ret) {
1167                 dev_err(&client->dev, "failed to init entity pads: %d", ret);
1168                 goto probe_error_v4l2_ctrl_handler_free;
1169         }
1170
1171         ret = v4l2_async_register_subdev_sensor(&og01a1b->sd);
1172         if (ret < 0) {
1173                 dev_err(&client->dev, "failed to register V4L2 subdev: %d",
1174                         ret);
1175                 goto probe_error_media_entity_cleanup;
1176         }
1177
1178         /* Enable runtime PM and turn off the device */
1179         pm_runtime_set_active(&client->dev);
1180         pm_runtime_enable(&client->dev);
1181         pm_runtime_idle(&client->dev);
1182
1183         return 0;
1184
1185 probe_error_media_entity_cleanup:
1186         media_entity_cleanup(&og01a1b->sd.entity);
1187
1188 probe_error_v4l2_ctrl_handler_free:
1189         v4l2_ctrl_handler_free(og01a1b->sd.ctrl_handler);
1190         mutex_destroy(&og01a1b->mutex);
1191
1192 power_off:
1193         og01a1b_power_off(&client->dev);
1194
1195         return ret;
1196 }
1197
1198 static const struct dev_pm_ops og01a1b_pm_ops = {
1199         SET_RUNTIME_PM_OPS(og01a1b_power_off, og01a1b_power_on, NULL)
1200 };
1201
1202 #ifdef CONFIG_ACPI
1203 static const struct acpi_device_id og01a1b_acpi_ids[] = {
1204         {"OVTI01AC"},
1205         {}
1206 };
1207
1208 MODULE_DEVICE_TABLE(acpi, og01a1b_acpi_ids);
1209 #endif
1210
1211 static const struct of_device_id og01a1b_of_match[] = {
1212         { .compatible = "ovti,og01a1b" },
1213         { /* sentinel */ }
1214 };
1215 MODULE_DEVICE_TABLE(of, og01a1b_of_match);
1216
1217 static struct i2c_driver og01a1b_i2c_driver = {
1218         .driver = {
1219                 .name = "og01a1b",
1220                 .pm = &og01a1b_pm_ops,
1221                 .acpi_match_table = ACPI_PTR(og01a1b_acpi_ids),
1222                 .of_match_table = og01a1b_of_match,
1223         },
1224         .probe = og01a1b_probe,
1225         .remove = og01a1b_remove,
1226 };
1227
1228 module_i2c_driver(og01a1b_i2c_driver);
1229
1230 MODULE_AUTHOR("Shawn Tu");
1231 MODULE_DESCRIPTION("OmniVision OG01A1B sensor driver");
1232 MODULE_LICENSE("GPL v2");
This page took 0.097538 seconds and 4 git commands to generate.