1 // SPDX-License-Identifier: GPL-2.0-only
3 * Copyright (c) 2023 Intel Corporation.
6 #include <linux/unaligned.h>
8 #include <linux/acpi.h>
9 #include <linux/bitfield.h>
10 #include <linux/i2c.h>
11 #include <linux/module.h>
12 #include <linux/pm_runtime.h>
14 #include <media/v4l2-ctrls.h>
15 #include <media/v4l2-device.h>
16 #include <media/v4l2-fwnode.h>
18 #define OV01A10_LINK_FREQ_400MHZ 400000000ULL
19 #define OV01A10_SCLK 40000000LL
20 #define OV01A10_DATA_LANES 1
22 #define OV01A10_REG_CHIP_ID 0x300a
23 #define OV01A10_CHIP_ID 0x560141
25 #define OV01A10_REG_MODE_SELECT 0x0100
26 #define OV01A10_MODE_STANDBY 0x00
27 #define OV01A10_MODE_STREAMING 0x01
30 #define OV01A10_PIXEL_ARRAY_WIDTH 1296
31 #define OV01A10_PIXEL_ARRAY_HEIGHT 816
32 #define OV01A10_ACITVE_WIDTH 1280
33 #define OV01A10_ACITVE_HEIGHT 800
35 /* vertical and horizontal timings */
36 #define OV01A10_REG_VTS 0x380e
37 #define OV01A10_VTS_DEF 0x0380
38 #define OV01A10_VTS_MIN 0x0380
39 #define OV01A10_VTS_MAX 0xffff
40 #define OV01A10_HTS_DEF 1488
42 /* exposure controls */
43 #define OV01A10_REG_EXPOSURE 0x3501
44 #define OV01A10_EXPOSURE_MIN 4
45 #define OV01A10_EXPOSURE_MAX_MARGIN 8
46 #define OV01A10_EXPOSURE_STEP 1
48 /* analog gain controls */
49 #define OV01A10_REG_ANALOG_GAIN 0x3508
50 #define OV01A10_ANAL_GAIN_MIN 0x100
51 #define OV01A10_ANAL_GAIN_MAX 0xffff
52 #define OV01A10_ANAL_GAIN_STEP 1
54 /* digital gain controls */
55 #define OV01A10_REG_DIGITAL_GAIN_B 0x350a
56 #define OV01A10_REG_DIGITAL_GAIN_GB 0x3510
57 #define OV01A10_REG_DIGITAL_GAIN_GR 0x3513
58 #define OV01A10_REG_DIGITAL_GAIN_R 0x3516
59 #define OV01A10_DGTL_GAIN_MIN 0
60 #define OV01A10_DGTL_GAIN_MAX 0x3ffff
61 #define OV01A10_DGTL_GAIN_STEP 1
62 #define OV01A10_DGTL_GAIN_DEFAULT 1024
64 /* test pattern control */
65 #define OV01A10_REG_TEST_PATTERN 0x4503
66 #define OV01A10_TEST_PATTERN_ENABLE BIT(7)
67 #define OV01A10_LINK_FREQ_400MHZ_INDEX 0
69 /* flip and mirror control */
70 #define OV01A10_REG_FORMAT1 0x3820
71 #define OV01A10_VFLIP_MASK BIT(4)
72 #define OV01A10_HFLIP_MASK BIT(3)
75 #define OV01A10_REG_X_WIN 0x3811
76 #define OV01A10_REG_Y_WIN 0x3813
83 struct ov01a10_reg_list
{
85 const struct ov01a10_reg
*regs
;
88 struct ov01a10_link_freq_config
{
89 const struct ov01a10_reg_list reg_list
;
100 const struct ov01a10_reg_list reg_list
;
103 static const struct ov01a10_reg mipi_data_rate_720mbps
[] = {
119 static const struct ov01a10_reg sensor_1280x800_setting
[] = {
240 static const char * const ov01a10_test_pattern_menu
[] = {
243 "Top-Bottom Darker Color Bar",
244 "Right-Left Darker Color Bar",
248 static const s64 link_freq_menu_items
[] = {
249 OV01A10_LINK_FREQ_400MHZ
,
252 static const struct ov01a10_link_freq_config link_freq_configs
[] = {
253 [OV01A10_LINK_FREQ_400MHZ_INDEX
] = {
255 .num_of_regs
= ARRAY_SIZE(mipi_data_rate_720mbps
),
256 .regs
= mipi_data_rate_720mbps
,
261 static const struct ov01a10_mode supported_modes
[] = {
263 .width
= OV01A10_ACITVE_WIDTH
,
264 .height
= OV01A10_ACITVE_HEIGHT
,
265 .hts
= OV01A10_HTS_DEF
,
266 .vts_def
= OV01A10_VTS_DEF
,
267 .vts_min
= OV01A10_VTS_MIN
,
269 .num_of_regs
= ARRAY_SIZE(sensor_1280x800_setting
),
270 .regs
= sensor_1280x800_setting
,
272 .link_freq_index
= OV01A10_LINK_FREQ_400MHZ_INDEX
,
277 struct v4l2_subdev sd
;
278 struct media_pad pad
;
279 struct v4l2_ctrl_handler ctrl_handler
;
282 struct v4l2_ctrl
*link_freq
;
283 struct v4l2_ctrl
*pixel_rate
;
284 struct v4l2_ctrl
*vblank
;
285 struct v4l2_ctrl
*hblank
;
286 struct v4l2_ctrl
*exposure
;
288 const struct ov01a10_mode
*cur_mode
;
291 static inline struct ov01a10
*to_ov01a10(struct v4l2_subdev
*subdev
)
293 return container_of(subdev
, struct ov01a10
, sd
);
296 static int ov01a10_read_reg(struct ov01a10
*ov01a10
, u16 reg
, u16 len
, u32
*val
)
298 struct i2c_client
*client
= v4l2_get_subdevdata(&ov01a10
->sd
);
299 struct i2c_msg msgs
[2];
301 u8 data_buf
[4] = {0};
304 if (len
> sizeof(data_buf
))
307 put_unaligned_be16(reg
, addr_buf
);
308 msgs
[0].addr
= client
->addr
;
310 msgs
[0].len
= sizeof(addr_buf
);
311 msgs
[0].buf
= addr_buf
;
312 msgs
[1].addr
= client
->addr
;
313 msgs
[1].flags
= I2C_M_RD
;
315 msgs
[1].buf
= &data_buf
[sizeof(data_buf
) - len
];
317 ret
= i2c_transfer(client
->adapter
, msgs
, ARRAY_SIZE(msgs
));
319 if (ret
!= ARRAY_SIZE(msgs
))
320 return ret
< 0 ? ret
: -EIO
;
322 *val
= get_unaligned_be32(data_buf
);
327 static int ov01a10_write_reg(struct ov01a10
*ov01a10
, u16 reg
, u16 len
, u32 val
)
329 struct i2c_client
*client
= v4l2_get_subdevdata(&ov01a10
->sd
);
336 put_unaligned_be16(reg
, buf
);
337 put_unaligned_be32(val
<< 8 * (4 - len
), buf
+ 2);
339 ret
= i2c_master_send(client
, buf
, len
+ 2);
341 return ret
< 0 ? ret
: -EIO
;
346 static int ov01a10_write_reg_list(struct ov01a10
*ov01a10
,
347 const struct ov01a10_reg_list
*r_list
)
349 struct i2c_client
*client
= v4l2_get_subdevdata(&ov01a10
->sd
);
353 for (i
= 0; i
< r_list
->num_of_regs
; i
++) {
354 ret
= ov01a10_write_reg(ov01a10
, r_list
->regs
[i
].address
, 1,
355 r_list
->regs
[i
].val
);
357 dev_err_ratelimited(&client
->dev
,
358 "write reg 0x%4.4x err = %d\n",
359 r_list
->regs
[i
].address
, ret
);
367 static int ov01a10_update_digital_gain(struct ov01a10
*ov01a10
, u32 d_gain
)
369 struct i2c_client
*client
= v4l2_get_subdevdata(&ov01a10
->sd
);
370 u32 real
= d_gain
<< 6;
373 ret
= ov01a10_write_reg(ov01a10
, OV01A10_REG_DIGITAL_GAIN_B
, 3, real
);
375 dev_err(&client
->dev
, "failed to set DIGITAL_GAIN_B\n");
379 ret
= ov01a10_write_reg(ov01a10
, OV01A10_REG_DIGITAL_GAIN_GB
, 3, real
);
381 dev_err(&client
->dev
, "failed to set DIGITAL_GAIN_GB\n");
385 ret
= ov01a10_write_reg(ov01a10
, OV01A10_REG_DIGITAL_GAIN_GR
, 3, real
);
387 dev_err(&client
->dev
, "failed to set DIGITAL_GAIN_GR\n");
391 ret
= ov01a10_write_reg(ov01a10
, OV01A10_REG_DIGITAL_GAIN_R
, 3, real
);
393 dev_err(&client
->dev
, "failed to set DIGITAL_GAIN_R\n");
398 static int ov01a10_test_pattern(struct ov01a10
*ov01a10
, u32 pattern
)
403 pattern
= (pattern
- 1) | OV01A10_TEST_PATTERN_ENABLE
;
405 return ov01a10_write_reg(ov01a10
, OV01A10_REG_TEST_PATTERN
, 1, pattern
);
408 /* for vflip and hflip, use 0x9 as window offset to keep the bayer */
409 static int ov01a10_set_hflip(struct ov01a10
*ov01a10
, u32 hflip
)
414 offset
= hflip
? 0x9 : 0x8;
415 ret
= ov01a10_write_reg(ov01a10
, OV01A10_REG_X_WIN
, 1, offset
);
419 ret
= ov01a10_read_reg(ov01a10
, OV01A10_REG_FORMAT1
, 1, &val
);
423 val
= hflip
? val
| FIELD_PREP(OV01A10_HFLIP_MASK
, 0x1) :
424 val
& ~OV01A10_HFLIP_MASK
;
426 return ov01a10_write_reg(ov01a10
, OV01A10_REG_FORMAT1
, 1, val
);
429 static int ov01a10_set_vflip(struct ov01a10
*ov01a10
, u32 vflip
)
434 offset
= vflip
? 0x9 : 0x8;
435 ret
= ov01a10_write_reg(ov01a10
, OV01A10_REG_Y_WIN
, 1, offset
);
439 ret
= ov01a10_read_reg(ov01a10
, OV01A10_REG_FORMAT1
, 1, &val
);
443 val
= vflip
? val
| FIELD_PREP(OV01A10_VFLIP_MASK
, 0x1) :
444 val
& ~OV01A10_VFLIP_MASK
;
446 return ov01a10_write_reg(ov01a10
, OV01A10_REG_FORMAT1
, 1, val
);
449 static int ov01a10_set_ctrl(struct v4l2_ctrl
*ctrl
)
451 struct ov01a10
*ov01a10
= container_of(ctrl
->handler
,
452 struct ov01a10
, ctrl_handler
);
453 struct i2c_client
*client
= v4l2_get_subdevdata(&ov01a10
->sd
);
457 if (ctrl
->id
== V4L2_CID_VBLANK
) {
458 exposure_max
= ov01a10
->cur_mode
->height
+ ctrl
->val
-
459 OV01A10_EXPOSURE_MAX_MARGIN
;
460 __v4l2_ctrl_modify_range(ov01a10
->exposure
,
461 ov01a10
->exposure
->minimum
,
462 exposure_max
, ov01a10
->exposure
->step
,
466 if (!pm_runtime_get_if_in_use(&client
->dev
))
470 case V4L2_CID_ANALOGUE_GAIN
:
471 ret
= ov01a10_write_reg(ov01a10
, OV01A10_REG_ANALOG_GAIN
, 2,
475 case V4L2_CID_DIGITAL_GAIN
:
476 ret
= ov01a10_update_digital_gain(ov01a10
, ctrl
->val
);
479 case V4L2_CID_EXPOSURE
:
480 ret
= ov01a10_write_reg(ov01a10
, OV01A10_REG_EXPOSURE
, 2,
484 case V4L2_CID_VBLANK
:
485 ret
= ov01a10_write_reg(ov01a10
, OV01A10_REG_VTS
, 2,
486 ov01a10
->cur_mode
->height
+ ctrl
->val
);
489 case V4L2_CID_TEST_PATTERN
:
490 ret
= ov01a10_test_pattern(ov01a10
, ctrl
->val
);
494 ov01a10_set_hflip(ov01a10
, ctrl
->val
);
498 ov01a10_set_vflip(ov01a10
, ctrl
->val
);
506 pm_runtime_put(&client
->dev
);
511 static const struct v4l2_ctrl_ops ov01a10_ctrl_ops
= {
512 .s_ctrl
= ov01a10_set_ctrl
,
515 static int ov01a10_init_controls(struct ov01a10
*ov01a10
)
517 struct i2c_client
*client
= v4l2_get_subdevdata(&ov01a10
->sd
);
518 struct v4l2_fwnode_device_properties props
;
519 u32 vblank_min
, vblank_max
, vblank_default
;
520 struct v4l2_ctrl_handler
*ctrl_hdlr
;
521 const struct ov01a10_mode
*cur_mode
;
522 s64 exposure_max
, h_blank
;
526 ret
= v4l2_fwnode_device_parse(&client
->dev
, &props
);
530 ctrl_hdlr
= &ov01a10
->ctrl_handler
;
531 ret
= v4l2_ctrl_handler_init(ctrl_hdlr
, 12);
535 cur_mode
= ov01a10
->cur_mode
;
536 size
= ARRAY_SIZE(link_freq_menu_items
);
538 ov01a10
->link_freq
= v4l2_ctrl_new_int_menu(ctrl_hdlr
,
542 link_freq_menu_items
);
543 if (ov01a10
->link_freq
)
544 ov01a10
->link_freq
->flags
|= V4L2_CTRL_FLAG_READ_ONLY
;
546 ov01a10
->pixel_rate
= v4l2_ctrl_new_std(ctrl_hdlr
, &ov01a10_ctrl_ops
,
547 V4L2_CID_PIXEL_RATE
, 0,
548 OV01A10_SCLK
, 1, OV01A10_SCLK
);
550 vblank_min
= cur_mode
->vts_min
- cur_mode
->height
;
551 vblank_max
= OV01A10_VTS_MAX
- cur_mode
->height
;
552 vblank_default
= cur_mode
->vts_def
- cur_mode
->height
;
553 ov01a10
->vblank
= v4l2_ctrl_new_std(ctrl_hdlr
, &ov01a10_ctrl_ops
,
554 V4L2_CID_VBLANK
, vblank_min
,
555 vblank_max
, 1, vblank_default
);
557 h_blank
= cur_mode
->hts
- cur_mode
->width
;
558 ov01a10
->hblank
= v4l2_ctrl_new_std(ctrl_hdlr
, &ov01a10_ctrl_ops
,
559 V4L2_CID_HBLANK
, h_blank
, h_blank
,
562 ov01a10
->hblank
->flags
|= V4L2_CTRL_FLAG_READ_ONLY
;
564 v4l2_ctrl_new_std(ctrl_hdlr
, &ov01a10_ctrl_ops
, V4L2_CID_ANALOGUE_GAIN
,
565 OV01A10_ANAL_GAIN_MIN
, OV01A10_ANAL_GAIN_MAX
,
566 OV01A10_ANAL_GAIN_STEP
, OV01A10_ANAL_GAIN_MIN
);
567 v4l2_ctrl_new_std(ctrl_hdlr
, &ov01a10_ctrl_ops
, V4L2_CID_DIGITAL_GAIN
,
568 OV01A10_DGTL_GAIN_MIN
, OV01A10_DGTL_GAIN_MAX
,
569 OV01A10_DGTL_GAIN_STEP
, OV01A10_DGTL_GAIN_DEFAULT
);
571 exposure_max
= cur_mode
->vts_def
- OV01A10_EXPOSURE_MAX_MARGIN
;
572 ov01a10
->exposure
= v4l2_ctrl_new_std(ctrl_hdlr
, &ov01a10_ctrl_ops
,
574 OV01A10_EXPOSURE_MIN
,
576 OV01A10_EXPOSURE_STEP
,
579 v4l2_ctrl_new_std_menu_items(ctrl_hdlr
, &ov01a10_ctrl_ops
,
580 V4L2_CID_TEST_PATTERN
,
581 ARRAY_SIZE(ov01a10_test_pattern_menu
) - 1,
582 0, 0, ov01a10_test_pattern_menu
);
584 v4l2_ctrl_new_std(ctrl_hdlr
, &ov01a10_ctrl_ops
, V4L2_CID_HFLIP
,
586 v4l2_ctrl_new_std(ctrl_hdlr
, &ov01a10_ctrl_ops
, V4L2_CID_VFLIP
,
589 ret
= v4l2_ctrl_new_fwnode_properties(ctrl_hdlr
, &ov01a10_ctrl_ops
,
594 if (ctrl_hdlr
->error
) {
595 ret
= ctrl_hdlr
->error
;
599 ov01a10
->sd
.ctrl_handler
= ctrl_hdlr
;
603 v4l2_ctrl_handler_free(ctrl_hdlr
);
608 static void ov01a10_update_pad_format(const struct ov01a10_mode
*mode
,
609 struct v4l2_mbus_framefmt
*fmt
)
611 fmt
->width
= mode
->width
;
612 fmt
->height
= mode
->height
;
613 fmt
->code
= MEDIA_BUS_FMT_SBGGR10_1X10
;
614 fmt
->field
= V4L2_FIELD_NONE
;
615 fmt
->colorspace
= V4L2_COLORSPACE_RAW
;
618 static int ov01a10_start_streaming(struct ov01a10
*ov01a10
)
620 struct i2c_client
*client
= v4l2_get_subdevdata(&ov01a10
->sd
);
621 const struct ov01a10_reg_list
*reg_list
;
625 link_freq_index
= ov01a10
->cur_mode
->link_freq_index
;
626 reg_list
= &link_freq_configs
[link_freq_index
].reg_list
;
627 ret
= ov01a10_write_reg_list(ov01a10
, reg_list
);
629 dev_err(&client
->dev
, "failed to set plls\n");
633 reg_list
= &ov01a10
->cur_mode
->reg_list
;
634 ret
= ov01a10_write_reg_list(ov01a10
, reg_list
);
636 dev_err(&client
->dev
, "failed to set mode\n");
640 ret
= __v4l2_ctrl_handler_setup(ov01a10
->sd
.ctrl_handler
);
644 ret
= ov01a10_write_reg(ov01a10
, OV01A10_REG_MODE_SELECT
, 1,
645 OV01A10_MODE_STREAMING
);
647 dev_err(&client
->dev
, "failed to start streaming\n");
652 static void ov01a10_stop_streaming(struct ov01a10
*ov01a10
)
654 struct i2c_client
*client
= v4l2_get_subdevdata(&ov01a10
->sd
);
657 ret
= ov01a10_write_reg(ov01a10
, OV01A10_REG_MODE_SELECT
, 1,
658 OV01A10_MODE_STANDBY
);
660 dev_err(&client
->dev
, "failed to stop streaming\n");
663 static int ov01a10_set_stream(struct v4l2_subdev
*sd
, int enable
)
665 struct ov01a10
*ov01a10
= to_ov01a10(sd
);
666 struct i2c_client
*client
= v4l2_get_subdevdata(sd
);
667 struct v4l2_subdev_state
*state
;
670 state
= v4l2_subdev_lock_and_get_active_state(sd
);
673 ret
= pm_runtime_resume_and_get(&client
->dev
);
677 ret
= ov01a10_start_streaming(ov01a10
);
679 pm_runtime_put(&client
->dev
);
683 ov01a10_stop_streaming(ov01a10
);
684 pm_runtime_put(&client
->dev
);
688 v4l2_subdev_unlock_state(state
);
693 static int ov01a10_set_format(struct v4l2_subdev
*sd
,
694 struct v4l2_subdev_state
*sd_state
,
695 struct v4l2_subdev_format
*fmt
)
697 struct ov01a10
*ov01a10
= to_ov01a10(sd
);
698 const struct ov01a10_mode
*mode
;
699 struct v4l2_mbus_framefmt
*format
;
700 s32 vblank_def
, h_blank
;
702 mode
= v4l2_find_nearest_size(supported_modes
,
703 ARRAY_SIZE(supported_modes
), width
,
704 height
, fmt
->format
.width
,
707 ov01a10_update_pad_format(mode
, &fmt
->format
);
709 if (fmt
->which
== V4L2_SUBDEV_FORMAT_ACTIVE
) {
710 ov01a10
->cur_mode
= mode
;
711 __v4l2_ctrl_s_ctrl(ov01a10
->link_freq
, mode
->link_freq_index
);
712 __v4l2_ctrl_s_ctrl_int64(ov01a10
->pixel_rate
, OV01A10_SCLK
);
714 vblank_def
= mode
->vts_def
- mode
->height
;
715 __v4l2_ctrl_modify_range(ov01a10
->vblank
,
716 mode
->vts_min
- mode
->height
,
717 OV01A10_VTS_MAX
- mode
->height
, 1,
719 __v4l2_ctrl_s_ctrl(ov01a10
->vblank
, vblank_def
);
720 h_blank
= mode
->hts
- mode
->width
;
721 __v4l2_ctrl_modify_range(ov01a10
->hblank
, h_blank
, h_blank
, 1,
725 format
= v4l2_subdev_state_get_format(sd_state
, fmt
->stream
);
726 *format
= fmt
->format
;
731 static int ov01a10_init_state(struct v4l2_subdev
*sd
,
732 struct v4l2_subdev_state
*state
)
734 struct v4l2_subdev_format fmt
= {
735 .which
= V4L2_SUBDEV_FORMAT_TRY
,
737 .width
= OV01A10_ACITVE_WIDTH
,
738 .height
= OV01A10_ACITVE_HEIGHT
,
742 ov01a10_set_format(sd
, state
, &fmt
);
747 static int ov01a10_enum_mbus_code(struct v4l2_subdev
*sd
,
748 struct v4l2_subdev_state
*sd_state
,
749 struct v4l2_subdev_mbus_code_enum
*code
)
754 code
->code
= MEDIA_BUS_FMT_SBGGR10_1X10
;
759 static int ov01a10_enum_frame_size(struct v4l2_subdev
*sd
,
760 struct v4l2_subdev_state
*sd_state
,
761 struct v4l2_subdev_frame_size_enum
*fse
)
763 if (fse
->index
>= ARRAY_SIZE(supported_modes
) ||
764 fse
->code
!= MEDIA_BUS_FMT_SBGGR10_1X10
)
767 fse
->min_width
= supported_modes
[fse
->index
].width
;
768 fse
->max_width
= fse
->min_width
;
769 fse
->min_height
= supported_modes
[fse
->index
].height
;
770 fse
->max_height
= fse
->min_height
;
775 static int ov01a10_get_selection(struct v4l2_subdev
*sd
,
776 struct v4l2_subdev_state
*state
,
777 struct v4l2_subdev_selection
*sel
)
779 if (sel
->which
!= V4L2_SUBDEV_FORMAT_ACTIVE
)
782 switch (sel
->target
) {
783 case V4L2_SEL_TGT_NATIVE_SIZE
:
784 case V4L2_SEL_TGT_CROP_BOUNDS
:
787 sel
->r
.width
= OV01A10_PIXEL_ARRAY_WIDTH
;
788 sel
->r
.height
= OV01A10_PIXEL_ARRAY_HEIGHT
;
790 case V4L2_SEL_TGT_CROP
:
791 case V4L2_SEL_TGT_CROP_DEFAULT
:
792 sel
->r
.top
= (OV01A10_PIXEL_ARRAY_HEIGHT
-
793 OV01A10_ACITVE_HEIGHT
) / 2;
794 sel
->r
.left
= (OV01A10_PIXEL_ARRAY_WIDTH
-
795 OV01A10_ACITVE_WIDTH
) / 2;
796 sel
->r
.width
= OV01A10_ACITVE_WIDTH
;
797 sel
->r
.height
= OV01A10_ACITVE_HEIGHT
;
804 static const struct v4l2_subdev_core_ops ov01a10_core_ops
= {
805 .log_status
= v4l2_ctrl_subdev_log_status
,
808 static const struct v4l2_subdev_video_ops ov01a10_video_ops
= {
809 .s_stream
= ov01a10_set_stream
,
812 static const struct v4l2_subdev_pad_ops ov01a10_pad_ops
= {
813 .set_fmt
= ov01a10_set_format
,
814 .get_fmt
= v4l2_subdev_get_fmt
,
815 .get_selection
= ov01a10_get_selection
,
816 .enum_mbus_code
= ov01a10_enum_mbus_code
,
817 .enum_frame_size
= ov01a10_enum_frame_size
,
820 static const struct v4l2_subdev_ops ov01a10_subdev_ops
= {
821 .core
= &ov01a10_core_ops
,
822 .video
= &ov01a10_video_ops
,
823 .pad
= &ov01a10_pad_ops
,
826 static const struct v4l2_subdev_internal_ops ov01a10_internal_ops
= {
827 .init_state
= ov01a10_init_state
,
830 static const struct media_entity_operations ov01a10_subdev_entity_ops
= {
831 .link_validate
= v4l2_subdev_link_validate
,
834 static int ov01a10_identify_module(struct ov01a10
*ov01a10
)
836 struct i2c_client
*client
= v4l2_get_subdevdata(&ov01a10
->sd
);
840 ret
= ov01a10_read_reg(ov01a10
, OV01A10_REG_CHIP_ID
, 3, &val
);
844 if (val
!= OV01A10_CHIP_ID
) {
845 dev_err(&client
->dev
, "chip id mismatch: %x!=%x\n",
846 OV01A10_CHIP_ID
, val
);
853 static void ov01a10_remove(struct i2c_client
*client
)
855 struct v4l2_subdev
*sd
= i2c_get_clientdata(client
);
857 v4l2_async_unregister_subdev(sd
);
858 media_entity_cleanup(&sd
->entity
);
859 v4l2_ctrl_handler_free(sd
->ctrl_handler
);
861 pm_runtime_disable(&client
->dev
);
862 pm_runtime_set_suspended(&client
->dev
);
865 static int ov01a10_probe(struct i2c_client
*client
)
867 struct device
*dev
= &client
->dev
;
868 struct ov01a10
*ov01a10
;
871 ov01a10
= devm_kzalloc(dev
, sizeof(*ov01a10
), GFP_KERNEL
);
875 v4l2_i2c_subdev_init(&ov01a10
->sd
, client
, &ov01a10_subdev_ops
);
876 ov01a10
->sd
.internal_ops
= &ov01a10_internal_ops
;
878 ret
= ov01a10_identify_module(ov01a10
);
880 return dev_err_probe(dev
, ret
,
881 "failed to find sensor\n");
883 ov01a10
->cur_mode
= &supported_modes
[0];
885 ret
= ov01a10_init_controls(ov01a10
);
887 dev_err(dev
, "failed to init controls: %d\n", ret
);
891 ov01a10
->sd
.state_lock
= ov01a10
->ctrl_handler
.lock
;
892 ov01a10
->sd
.flags
|= V4L2_SUBDEV_FL_HAS_DEVNODE
;
893 ov01a10
->sd
.entity
.ops
= &ov01a10_subdev_entity_ops
;
894 ov01a10
->sd
.entity
.function
= MEDIA_ENT_F_CAM_SENSOR
;
895 ov01a10
->pad
.flags
= MEDIA_PAD_FL_SOURCE
;
897 ret
= media_entity_pads_init(&ov01a10
->sd
.entity
, 1, &ov01a10
->pad
);
899 dev_err(dev
, "Failed to init entity pads: %d\n", ret
);
900 goto err_handler_free
;
903 ret
= v4l2_subdev_init_finalize(&ov01a10
->sd
);
905 dev_err(dev
, "Failed to allocate subdev state: %d\n", ret
);
906 goto err_media_entity_cleanup
;
910 * Device is already turned on by i2c-core with ACPI domain PM.
911 * Enable runtime PM and turn off the device.
913 pm_runtime_set_active(&client
->dev
);
914 pm_runtime_enable(dev
);
915 pm_runtime_idle(dev
);
917 ret
= v4l2_async_register_subdev_sensor(&ov01a10
->sd
);
919 dev_err(dev
, "Failed to register subdev: %d\n", ret
);
926 pm_runtime_disable(dev
);
927 pm_runtime_set_suspended(&client
->dev
);
929 err_media_entity_cleanup
:
930 media_entity_cleanup(&ov01a10
->sd
.entity
);
933 v4l2_ctrl_handler_free(ov01a10
->sd
.ctrl_handler
);
939 static const struct acpi_device_id ov01a10_acpi_ids
[] = {
944 MODULE_DEVICE_TABLE(acpi
, ov01a10_acpi_ids
);
947 static struct i2c_driver ov01a10_i2c_driver
= {
950 .acpi_match_table
= ACPI_PTR(ov01a10_acpi_ids
),
952 .probe
= ov01a10_probe
,
953 .remove
= ov01a10_remove
,
956 module_i2c_driver(ov01a10_i2c_driver
);
958 MODULE_AUTHOR("Bingbu Cao <bingbu.cao@intel.com>");
959 MODULE_AUTHOR("Wang Yating <yating.wang@intel.com>");
960 MODULE_DESCRIPTION("OmniVision OV01A10 sensor driver");
961 MODULE_LICENSE("GPL");