1 // SPDX-License-Identifier: GPL-2.0
2 // Copyright (c) 2020 MediaTek Inc.
5 #include <linux/delay.h>
6 #include <linux/device.h>
7 #include <linux/gpio/consumer.h>
9 #include <linux/module.h>
10 #include <linux/pm_runtime.h>
11 #include <linux/regulator/consumer.h>
12 #include <linux/units.h>
13 #include <media/media-entity.h>
14 #include <media/v4l2-async.h>
15 #include <media/v4l2-ctrls.h>
16 #include <media/v4l2-fwnode.h>
17 #include <media/v4l2-subdev.h>
19 #define OV02A10_ID 0x2509
20 #define OV02A10_ID_MASK GENMASK(15, 0)
22 #define OV02A10_REG_CHIP_ID 0x02
24 /* Bit[1] vertical upside down */
25 /* Bit[0] horizontal mirror */
26 #define REG_MIRROR_FLIP_CONTROL 0x3f
29 #define REG_MIRROR_FLIP_ENABLE 0x03
31 /* Bit[2:0] MIPI transmission speed select */
32 #define TX_SPEED_AREA_SEL 0xa1
33 #define OV02A10_MIPI_TX_SPEED_DEFAULT 0x04
35 #define REG_PAGE_SWITCH 0xfd
36 #define REG_GLOBAL_EFFECTIVE 0x01
37 #define REG_ENABLE BIT(0)
39 #define REG_SC_CTRL_MODE 0xac
40 #define SC_CTRL_MODE_STANDBY 0x00
41 #define SC_CTRL_MODE_STREAMING 0x01
43 /* Exposure control */
44 #define OV02A10_EXP_SHIFT 8
45 #define OV02A10_REG_EXPOSURE_H 0x03
46 #define OV02A10_REG_EXPOSURE_L 0x04
47 #define OV02A10_EXPOSURE_MIN 4
48 #define OV02A10_EXPOSURE_MAX_MARGIN 4
49 #define OV02A10_EXPOSURE_STEP 1
51 /* Vblanking control */
52 #define OV02A10_VTS_SHIFT 8
53 #define OV02A10_REG_VTS_H 0x05
54 #define OV02A10_REG_VTS_L 0x06
55 #define OV02A10_VTS_MAX 0x209f
56 #define OV02A10_BASE_LINES 1224
58 /* Analog gain control */
59 #define OV02A10_REG_GAIN 0x24
60 #define OV02A10_GAIN_MIN 0x10
61 #define OV02A10_GAIN_MAX 0xf8
62 #define OV02A10_GAIN_STEP 0x01
63 #define OV02A10_GAIN_DEFAULT 0x40
65 /* Test pattern control */
66 #define OV02A10_REG_TEST_PATTERN 0xb6
68 #define OV02A10_LINK_FREQ_390MHZ (390 * HZ_PER_MHZ)
69 #define OV02A10_ECLK_FREQ (24 * HZ_PER_MHZ)
71 /* Number of lanes supported by this driver */
72 #define OV02A10_DATA_LANES 1
74 /* Bits per sample of sensor output */
75 #define OV02A10_BITS_PER_SAMPLE 10
77 static const char * const ov02a10_supply_names
[] = {
78 "dovdd", /* Digital I/O power */
79 "avdd", /* Analog power */
80 "dvdd", /* Digital core power */
88 struct ov02a10_reg_list
{
90 const struct ov02a10_reg
*regs
;
99 const struct ov02a10_reg_list reg_list
;
104 /* Indication of MIPI transmission speed select */
105 u32 mipi_clock_voltage
;
108 struct gpio_desc
*pd_gpio
;
109 struct gpio_desc
*rst_gpio
;
110 struct regulator_bulk_data supplies
[ARRAY_SIZE(ov02a10_supply_names
)];
116 * Serialize control access, get/set format, get selection
117 * and start streaming.
120 struct v4l2_subdev subdev
;
121 struct media_pad pad
;
122 struct v4l2_mbus_framefmt fmt
;
123 struct v4l2_ctrl_handler ctrl_handler
;
124 struct v4l2_ctrl
*exposure
;
126 const struct ov02a10_mode
*cur_mode
;
129 static inline struct ov02a10
*to_ov02a10(struct v4l2_subdev
*sd
)
131 return container_of(sd
, struct ov02a10
, subdev
);
137 * linelength 934(0x3a6)
138 * framelength 1390(0x56E)
139 * grabwindow_width 1600
140 * grabwindow_height 1200
141 * max_framerate 30fps
142 * mipi_datarate per lane 780Mbps
144 static const struct ov02a10_reg ov02a10_1600x1200_regs
[] = {
240 static const char * const ov02a10_test_pattern_menu
[] = {
242 "Eight Vertical Colour Bars",
245 static const s64 link_freq_menu_items
[] = {
246 OV02A10_LINK_FREQ_390MHZ
,
249 static u64
to_pixel_rate(u32 f_index
)
251 u64 pixel_rate
= link_freq_menu_items
[f_index
] * 2 * OV02A10_DATA_LANES
;
253 do_div(pixel_rate
, OV02A10_BITS_PER_SAMPLE
);
258 static const struct ov02a10_mode supported_modes
[] = {
266 .num_of_regs
= ARRAY_SIZE(ov02a10_1600x1200_regs
),
267 .regs
= ov02a10_1600x1200_regs
,
272 static int ov02a10_write_array(struct ov02a10
*ov02a10
,
273 const struct ov02a10_reg_list
*r_list
)
275 struct i2c_client
*client
= v4l2_get_subdevdata(&ov02a10
->subdev
);
279 for (i
= 0; i
< r_list
->num_of_regs
; i
++) {
280 ret
= i2c_smbus_write_byte_data(client
, r_list
->regs
[i
].addr
,
281 r_list
->regs
[i
].val
);
289 static void ov02a10_fill_fmt(const struct ov02a10_mode
*mode
,
290 struct v4l2_mbus_framefmt
*fmt
)
292 fmt
->width
= mode
->width
;
293 fmt
->height
= mode
->height
;
294 fmt
->field
= V4L2_FIELD_NONE
;
297 static int ov02a10_set_fmt(struct v4l2_subdev
*sd
,
298 struct v4l2_subdev_state
*sd_state
,
299 struct v4l2_subdev_format
*fmt
)
301 struct ov02a10
*ov02a10
= to_ov02a10(sd
);
302 struct v4l2_mbus_framefmt
*mbus_fmt
= &fmt
->format
;
303 struct v4l2_mbus_framefmt
*frame_fmt
;
306 mutex_lock(&ov02a10
->mutex
);
308 if (ov02a10
->streaming
&& fmt
->which
== V4L2_SUBDEV_FORMAT_ACTIVE
) {
313 /* Only one sensor mode supported */
314 mbus_fmt
->code
= ov02a10
->fmt
.code
;
315 ov02a10_fill_fmt(ov02a10
->cur_mode
, mbus_fmt
);
317 if (fmt
->which
== V4L2_SUBDEV_FORMAT_TRY
)
318 frame_fmt
= v4l2_subdev_state_get_format(sd_state
, 0);
320 frame_fmt
= &ov02a10
->fmt
;
322 *frame_fmt
= *mbus_fmt
;
325 mutex_unlock(&ov02a10
->mutex
);
329 static int ov02a10_get_fmt(struct v4l2_subdev
*sd
,
330 struct v4l2_subdev_state
*sd_state
,
331 struct v4l2_subdev_format
*fmt
)
333 struct ov02a10
*ov02a10
= to_ov02a10(sd
);
334 struct v4l2_mbus_framefmt
*mbus_fmt
= &fmt
->format
;
336 mutex_lock(&ov02a10
->mutex
);
338 if (fmt
->which
== V4L2_SUBDEV_FORMAT_TRY
) {
339 fmt
->format
= *v4l2_subdev_state_get_format(sd_state
,
342 fmt
->format
= ov02a10
->fmt
;
343 mbus_fmt
->code
= ov02a10
->fmt
.code
;
344 ov02a10_fill_fmt(ov02a10
->cur_mode
, mbus_fmt
);
347 mutex_unlock(&ov02a10
->mutex
);
352 static int ov02a10_enum_mbus_code(struct v4l2_subdev
*sd
,
353 struct v4l2_subdev_state
*sd_state
,
354 struct v4l2_subdev_mbus_code_enum
*code
)
356 struct ov02a10
*ov02a10
= to_ov02a10(sd
);
358 if (code
->index
!= 0)
361 code
->code
= ov02a10
->fmt
.code
;
366 static int ov02a10_enum_frame_sizes(struct v4l2_subdev
*sd
,
367 struct v4l2_subdev_state
*sd_state
,
368 struct v4l2_subdev_frame_size_enum
*fse
)
370 if (fse
->index
>= ARRAY_SIZE(supported_modes
))
373 fse
->min_width
= supported_modes
[fse
->index
].width
;
374 fse
->max_width
= supported_modes
[fse
->index
].width
;
375 fse
->max_height
= supported_modes
[fse
->index
].height
;
376 fse
->min_height
= supported_modes
[fse
->index
].height
;
381 static int ov02a10_check_sensor_id(struct ov02a10
*ov02a10
)
383 struct i2c_client
*client
= v4l2_get_subdevdata(&ov02a10
->subdev
);
387 /* Validate the chip ID */
388 ret
= i2c_smbus_read_word_swapped(client
, OV02A10_REG_CHIP_ID
);
392 chip_id
= le16_to_cpu((__force __le16
)ret
);
394 if ((chip_id
& OV02A10_ID_MASK
) != OV02A10_ID
) {
395 dev_err(&client
->dev
, "unexpected sensor id(0x%04x)\n", chip_id
);
402 static int ov02a10_power_on(struct device
*dev
)
404 struct i2c_client
*client
= to_i2c_client(dev
);
405 struct v4l2_subdev
*sd
= i2c_get_clientdata(client
);
406 struct ov02a10
*ov02a10
= to_ov02a10(sd
);
409 gpiod_set_value_cansleep(ov02a10
->rst_gpio
, 1);
410 gpiod_set_value_cansleep(ov02a10
->pd_gpio
, 1);
412 ret
= clk_prepare_enable(ov02a10
->eclk
);
414 dev_err(dev
, "failed to enable eclk\n");
418 ret
= regulator_bulk_enable(ARRAY_SIZE(ov02a10_supply_names
),
421 dev_err(dev
, "failed to enable regulators\n");
424 usleep_range(5000, 6000);
426 gpiod_set_value_cansleep(ov02a10
->pd_gpio
, 0);
427 usleep_range(5000, 6000);
429 gpiod_set_value_cansleep(ov02a10
->rst_gpio
, 0);
430 usleep_range(5000, 6000);
432 ret
= ov02a10_check_sensor_id(ov02a10
);
434 goto disable_regulator
;
439 regulator_bulk_disable(ARRAY_SIZE(ov02a10_supply_names
),
442 clk_disable_unprepare(ov02a10
->eclk
);
447 static int ov02a10_power_off(struct device
*dev
)
449 struct i2c_client
*client
= to_i2c_client(dev
);
450 struct v4l2_subdev
*sd
= i2c_get_clientdata(client
);
451 struct ov02a10
*ov02a10
= to_ov02a10(sd
);
453 gpiod_set_value_cansleep(ov02a10
->rst_gpio
, 1);
454 clk_disable_unprepare(ov02a10
->eclk
);
455 gpiod_set_value_cansleep(ov02a10
->pd_gpio
, 1);
456 regulator_bulk_disable(ARRAY_SIZE(ov02a10_supply_names
),
462 static int __ov02a10_start_stream(struct ov02a10
*ov02a10
)
464 struct i2c_client
*client
= v4l2_get_subdevdata(&ov02a10
->subdev
);
465 const struct ov02a10_reg_list
*reg_list
;
468 /* Apply default values of current mode */
469 reg_list
= &ov02a10
->cur_mode
->reg_list
;
470 ret
= ov02a10_write_array(ov02a10
, reg_list
);
474 /* Apply customized values from user */
475 ret
= __v4l2_ctrl_handler_setup(ov02a10
->subdev
.ctrl_handler
);
479 /* Set orientation to 180 degree */
480 if (ov02a10
->upside_down
) {
481 ret
= i2c_smbus_write_byte_data(client
, REG_MIRROR_FLIP_CONTROL
,
482 REG_MIRROR_FLIP_ENABLE
);
484 dev_err(&client
->dev
, "failed to set orientation\n");
487 ret
= i2c_smbus_write_byte_data(client
, REG_GLOBAL_EFFECTIVE
,
493 /* Set MIPI TX speed according to DT property */
494 if (ov02a10
->mipi_clock_voltage
!= OV02A10_MIPI_TX_SPEED_DEFAULT
) {
495 ret
= i2c_smbus_write_byte_data(client
, TX_SPEED_AREA_SEL
,
496 ov02a10
->mipi_clock_voltage
);
501 /* Set stream on register */
502 return i2c_smbus_write_byte_data(client
, REG_SC_CTRL_MODE
,
503 SC_CTRL_MODE_STREAMING
);
506 static int __ov02a10_stop_stream(struct ov02a10
*ov02a10
)
508 struct i2c_client
*client
= v4l2_get_subdevdata(&ov02a10
->subdev
);
510 return i2c_smbus_write_byte_data(client
, REG_SC_CTRL_MODE
,
511 SC_CTRL_MODE_STANDBY
);
514 static int ov02a10_init_state(struct v4l2_subdev
*sd
,
515 struct v4l2_subdev_state
*sd_state
)
517 struct v4l2_subdev_format fmt
= {
518 .which
= V4L2_SUBDEV_FORMAT_TRY
,
525 ov02a10_set_fmt(sd
, sd_state
, &fmt
);
530 static int ov02a10_s_stream(struct v4l2_subdev
*sd
, int on
)
532 struct ov02a10
*ov02a10
= to_ov02a10(sd
);
533 struct i2c_client
*client
= v4l2_get_subdevdata(&ov02a10
->subdev
);
536 mutex_lock(&ov02a10
->mutex
);
538 if (ov02a10
->streaming
== on
) {
540 goto unlock_and_return
;
544 ret
= pm_runtime_resume_and_get(&client
->dev
);
546 goto unlock_and_return
;
548 ret
= __ov02a10_start_stream(ov02a10
);
550 __ov02a10_stop_stream(ov02a10
);
551 ov02a10
->streaming
= !on
;
555 __ov02a10_stop_stream(ov02a10
);
556 pm_runtime_put(&client
->dev
);
559 ov02a10
->streaming
= on
;
560 mutex_unlock(&ov02a10
->mutex
);
565 pm_runtime_put(&client
->dev
);
567 mutex_unlock(&ov02a10
->mutex
);
572 static const struct dev_pm_ops ov02a10_pm_ops
= {
573 SET_RUNTIME_PM_OPS(ov02a10_power_off
, ov02a10_power_on
, NULL
)
576 static int ov02a10_set_exposure(struct ov02a10
*ov02a10
, int val
)
578 struct i2c_client
*client
= v4l2_get_subdevdata(&ov02a10
->subdev
);
581 ret
= i2c_smbus_write_byte_data(client
, REG_PAGE_SWITCH
, REG_ENABLE
);
585 ret
= i2c_smbus_write_byte_data(client
, OV02A10_REG_EXPOSURE_H
,
586 val
>> OV02A10_EXP_SHIFT
);
590 ret
= i2c_smbus_write_byte_data(client
, OV02A10_REG_EXPOSURE_L
, val
);
594 return i2c_smbus_write_byte_data(client
, REG_GLOBAL_EFFECTIVE
,
598 static int ov02a10_set_gain(struct ov02a10
*ov02a10
, int val
)
600 struct i2c_client
*client
= v4l2_get_subdevdata(&ov02a10
->subdev
);
603 ret
= i2c_smbus_write_byte_data(client
, REG_PAGE_SWITCH
, REG_ENABLE
);
607 ret
= i2c_smbus_write_byte_data(client
, OV02A10_REG_GAIN
, val
);
611 return i2c_smbus_write_byte_data(client
, REG_GLOBAL_EFFECTIVE
,
615 static int ov02a10_set_vblank(struct ov02a10
*ov02a10
, int val
)
617 struct i2c_client
*client
= v4l2_get_subdevdata(&ov02a10
->subdev
);
618 u32 vts
= val
+ ov02a10
->cur_mode
->height
- OV02A10_BASE_LINES
;
621 ret
= i2c_smbus_write_byte_data(client
, REG_PAGE_SWITCH
, REG_ENABLE
);
625 ret
= i2c_smbus_write_byte_data(client
, OV02A10_REG_VTS_H
,
626 vts
>> OV02A10_VTS_SHIFT
);
630 ret
= i2c_smbus_write_byte_data(client
, OV02A10_REG_VTS_L
, vts
);
634 return i2c_smbus_write_byte_data(client
, REG_GLOBAL_EFFECTIVE
,
638 static int ov02a10_set_test_pattern(struct ov02a10
*ov02a10
, int pattern
)
640 struct i2c_client
*client
= v4l2_get_subdevdata(&ov02a10
->subdev
);
643 ret
= i2c_smbus_write_byte_data(client
, REG_PAGE_SWITCH
, REG_ENABLE
);
647 ret
= i2c_smbus_write_byte_data(client
, OV02A10_REG_TEST_PATTERN
,
652 ret
= i2c_smbus_write_byte_data(client
, REG_GLOBAL_EFFECTIVE
,
657 return i2c_smbus_write_byte_data(client
, REG_SC_CTRL_MODE
,
658 SC_CTRL_MODE_STREAMING
);
661 static int ov02a10_set_ctrl(struct v4l2_ctrl
*ctrl
)
663 struct ov02a10
*ov02a10
= container_of(ctrl
->handler
,
664 struct ov02a10
, ctrl_handler
);
665 struct i2c_client
*client
= v4l2_get_subdevdata(&ov02a10
->subdev
);
669 /* Propagate change of current control to all related controls */
670 if (ctrl
->id
== V4L2_CID_VBLANK
) {
671 /* Update max exposure while meeting expected vblanking */
672 max_expo
= ov02a10
->cur_mode
->height
+ ctrl
->val
-
673 OV02A10_EXPOSURE_MAX_MARGIN
;
674 __v4l2_ctrl_modify_range(ov02a10
->exposure
,
675 ov02a10
->exposure
->minimum
, max_expo
,
676 ov02a10
->exposure
->step
,
677 ov02a10
->exposure
->default_value
);
680 /* V4L2 controls values will be applied only when power is already up */
681 if (!pm_runtime_get_if_in_use(&client
->dev
))
685 case V4L2_CID_EXPOSURE
:
686 ret
= ov02a10_set_exposure(ov02a10
, ctrl
->val
);
688 case V4L2_CID_ANALOGUE_GAIN
:
689 ret
= ov02a10_set_gain(ov02a10
, ctrl
->val
);
691 case V4L2_CID_VBLANK
:
692 ret
= ov02a10_set_vblank(ov02a10
, ctrl
->val
);
694 case V4L2_CID_TEST_PATTERN
:
695 ret
= ov02a10_set_test_pattern(ov02a10
, ctrl
->val
);
702 pm_runtime_put(&client
->dev
);
707 static const struct v4l2_subdev_video_ops ov02a10_video_ops
= {
708 .s_stream
= ov02a10_s_stream
,
711 static const struct v4l2_subdev_pad_ops ov02a10_pad_ops
= {
712 .enum_mbus_code
= ov02a10_enum_mbus_code
,
713 .enum_frame_size
= ov02a10_enum_frame_sizes
,
714 .get_fmt
= ov02a10_get_fmt
,
715 .set_fmt
= ov02a10_set_fmt
,
718 static const struct v4l2_subdev_ops ov02a10_subdev_ops
= {
719 .video
= &ov02a10_video_ops
,
720 .pad
= &ov02a10_pad_ops
,
723 static const struct v4l2_subdev_internal_ops ov02a10_internal_ops
= {
724 .init_state
= ov02a10_init_state
,
727 static const struct media_entity_operations ov02a10_subdev_entity_ops
= {
728 .link_validate
= v4l2_subdev_link_validate
,
731 static const struct v4l2_ctrl_ops ov02a10_ctrl_ops
= {
732 .s_ctrl
= ov02a10_set_ctrl
,
735 static int ov02a10_initialize_controls(struct ov02a10
*ov02a10
)
737 struct i2c_client
*client
= v4l2_get_subdevdata(&ov02a10
->subdev
);
738 const struct ov02a10_mode
*mode
;
739 struct v4l2_ctrl_handler
*handler
;
740 struct v4l2_ctrl
*ctrl
;
747 handler
= &ov02a10
->ctrl_handler
;
748 mode
= ov02a10
->cur_mode
;
749 ret
= v4l2_ctrl_handler_init(handler
, 7);
753 handler
->lock
= &ov02a10
->mutex
;
755 ctrl
= v4l2_ctrl_new_int_menu(handler
, NULL
, V4L2_CID_LINK_FREQ
, 0, 0,
756 link_freq_menu_items
);
758 ctrl
->flags
|= V4L2_CTRL_FLAG_READ_ONLY
;
760 pixel_rate
= to_pixel_rate(0);
761 v4l2_ctrl_new_std(handler
, NULL
, V4L2_CID_PIXEL_RATE
, 0, pixel_rate
, 1,
764 h_blank
= mode
->hts_def
- mode
->width
;
765 v4l2_ctrl_new_std(handler
, NULL
, V4L2_CID_HBLANK
, h_blank
, h_blank
, 1,
768 vblank_def
= mode
->vts_def
- mode
->height
;
769 v4l2_ctrl_new_std(handler
, &ov02a10_ctrl_ops
, V4L2_CID_VBLANK
,
770 vblank_def
, OV02A10_VTS_MAX
- mode
->height
, 1,
773 exposure_max
= mode
->vts_def
- 4;
774 ov02a10
->exposure
= v4l2_ctrl_new_std(handler
, &ov02a10_ctrl_ops
,
776 OV02A10_EXPOSURE_MIN
,
778 OV02A10_EXPOSURE_STEP
,
781 v4l2_ctrl_new_std(handler
, &ov02a10_ctrl_ops
,
782 V4L2_CID_ANALOGUE_GAIN
, OV02A10_GAIN_MIN
,
783 OV02A10_GAIN_MAX
, OV02A10_GAIN_STEP
,
784 OV02A10_GAIN_DEFAULT
);
786 v4l2_ctrl_new_std_menu_items(handler
, &ov02a10_ctrl_ops
,
787 V4L2_CID_TEST_PATTERN
,
788 ARRAY_SIZE(ov02a10_test_pattern_menu
) - 1,
789 0, 0, ov02a10_test_pattern_menu
);
791 if (handler
->error
) {
792 ret
= handler
->error
;
793 dev_err(&client
->dev
, "failed to init controls(%d)\n", ret
);
794 goto err_free_handler
;
797 ov02a10
->subdev
.ctrl_handler
= handler
;
802 v4l2_ctrl_handler_free(handler
);
807 static int ov02a10_check_hwcfg(struct device
*dev
, struct ov02a10
*ov02a10
)
809 struct fwnode_handle
*ep
;
810 struct fwnode_handle
*fwnode
= dev_fwnode(dev
);
811 struct v4l2_fwnode_endpoint bus_cfg
= {
812 .bus_type
= V4L2_MBUS_CSI2_DPHY
,
821 ep
= fwnode_graph_get_next_endpoint(fwnode
, NULL
);
825 ret
= v4l2_fwnode_endpoint_alloc_parse(ep
, &bus_cfg
);
826 fwnode_handle_put(ep
);
830 /* Optional indication of MIPI clock voltage unit */
831 ret
= fwnode_property_read_u32(ep
, "ovti,mipi-clock-voltage",
835 ov02a10
->mipi_clock_voltage
= clk_volt
;
837 for (i
= 0; i
< ARRAY_SIZE(link_freq_menu_items
); i
++) {
838 for (j
= 0; j
< bus_cfg
.nr_of_link_frequencies
; j
++) {
839 if (link_freq_menu_items
[i
] ==
840 bus_cfg
.link_frequencies
[j
])
844 if (j
== bus_cfg
.nr_of_link_frequencies
) {
845 dev_err(dev
, "no link frequency %lld supported\n",
846 link_freq_menu_items
[i
]);
852 v4l2_fwnode_endpoint_free(&bus_cfg
);
857 static int ov02a10_probe(struct i2c_client
*client
)
859 struct device
*dev
= &client
->dev
;
860 struct ov02a10
*ov02a10
;
862 unsigned int rotation
;
865 ov02a10
= devm_kzalloc(dev
, sizeof(*ov02a10
), GFP_KERNEL
);
869 ret
= ov02a10_check_hwcfg(dev
, ov02a10
);
871 return dev_err_probe(dev
, ret
,
872 "failed to check HW configuration\n");
874 v4l2_i2c_subdev_init(&ov02a10
->subdev
, client
, &ov02a10_subdev_ops
);
875 ov02a10
->subdev
.internal_ops
= &ov02a10_internal_ops
;
877 ov02a10
->mipi_clock_voltage
= OV02A10_MIPI_TX_SPEED_DEFAULT
;
878 ov02a10
->fmt
.code
= MEDIA_BUS_FMT_SBGGR10_1X10
;
880 /* Optional indication of physical rotation of sensor */
882 device_property_read_u32(dev
, "rotation", &rotation
);
883 if (rotation
== 180) {
884 ov02a10
->upside_down
= true;
885 ov02a10
->fmt
.code
= MEDIA_BUS_FMT_SRGGB10_1X10
;
888 ov02a10
->eclk
= devm_clk_get(dev
, "eclk");
889 if (IS_ERR(ov02a10
->eclk
))
890 return dev_err_probe(dev
, PTR_ERR(ov02a10
->eclk
),
891 "failed to get eclk\n");
893 ret
= device_property_read_u32(dev
, "clock-frequency",
894 &ov02a10
->eclk_freq
);
896 return dev_err_probe(dev
, ret
,
897 "failed to get eclk frequency\n");
899 ret
= clk_set_rate(ov02a10
->eclk
, ov02a10
->eclk_freq
);
901 return dev_err_probe(dev
, ret
,
902 "failed to set eclk frequency (24MHz)\n");
904 if (clk_get_rate(ov02a10
->eclk
) != OV02A10_ECLK_FREQ
)
905 dev_warn(dev
, "eclk mismatched, mode is based on 24MHz\n");
907 ov02a10
->pd_gpio
= devm_gpiod_get(dev
, "powerdown", GPIOD_OUT_HIGH
);
908 if (IS_ERR(ov02a10
->pd_gpio
))
909 return dev_err_probe(dev
, PTR_ERR(ov02a10
->pd_gpio
),
910 "failed to get powerdown-gpios\n");
912 ov02a10
->rst_gpio
= devm_gpiod_get(dev
, "reset", GPIOD_OUT_HIGH
);
913 if (IS_ERR(ov02a10
->rst_gpio
))
914 return dev_err_probe(dev
, PTR_ERR(ov02a10
->rst_gpio
),
915 "failed to get reset-gpios\n");
917 for (i
= 0; i
< ARRAY_SIZE(ov02a10_supply_names
); i
++)
918 ov02a10
->supplies
[i
].supply
= ov02a10_supply_names
[i
];
920 ret
= devm_regulator_bulk_get(dev
, ARRAY_SIZE(ov02a10_supply_names
),
923 return dev_err_probe(dev
, ret
, "failed to get regulators\n");
925 mutex_init(&ov02a10
->mutex
);
927 /* Set default mode */
928 ov02a10
->cur_mode
= &supported_modes
[0];
930 ret
= ov02a10_initialize_controls(ov02a10
);
932 dev_err_probe(dev
, ret
, "failed to initialize controls\n");
933 goto err_destroy_mutex
;
936 /* Initialize subdev */
937 ov02a10
->subdev
.flags
|= V4L2_SUBDEV_FL_HAS_DEVNODE
;
938 ov02a10
->subdev
.entity
.ops
= &ov02a10_subdev_entity_ops
;
939 ov02a10
->subdev
.entity
.function
= MEDIA_ENT_F_CAM_SENSOR
;
940 ov02a10
->pad
.flags
= MEDIA_PAD_FL_SOURCE
;
942 ret
= media_entity_pads_init(&ov02a10
->subdev
.entity
, 1, &ov02a10
->pad
);
944 dev_err_probe(dev
, ret
, "failed to initialize entity pads\n");
945 goto err_free_handler
;
948 pm_runtime_enable(dev
);
949 if (!pm_runtime_enabled(dev
)) {
950 ret
= ov02a10_power_on(dev
);
952 dev_err_probe(dev
, ret
, "failed to power on\n");
953 goto err_clean_entity
;
957 ret
= v4l2_async_register_subdev(&ov02a10
->subdev
);
959 dev_err_probe(dev
, ret
, "failed to register V4L2 subdev\n");
966 if (pm_runtime_enabled(dev
))
967 pm_runtime_disable(dev
);
969 ov02a10_power_off(dev
);
971 media_entity_cleanup(&ov02a10
->subdev
.entity
);
973 v4l2_ctrl_handler_free(ov02a10
->subdev
.ctrl_handler
);
975 mutex_destroy(&ov02a10
->mutex
);
980 static void ov02a10_remove(struct i2c_client
*client
)
982 struct v4l2_subdev
*sd
= i2c_get_clientdata(client
);
983 struct ov02a10
*ov02a10
= to_ov02a10(sd
);
985 v4l2_async_unregister_subdev(sd
);
986 media_entity_cleanup(&sd
->entity
);
987 v4l2_ctrl_handler_free(sd
->ctrl_handler
);
988 pm_runtime_disable(&client
->dev
);
989 if (!pm_runtime_status_suspended(&client
->dev
))
990 ov02a10_power_off(&client
->dev
);
991 pm_runtime_set_suspended(&client
->dev
);
992 mutex_destroy(&ov02a10
->mutex
);
995 static const struct of_device_id ov02a10_of_match
[] = {
996 { .compatible
= "ovti,ov02a10" },
999 MODULE_DEVICE_TABLE(of
, ov02a10_of_match
);
1001 static struct i2c_driver ov02a10_i2c_driver
= {
1004 .pm
= &ov02a10_pm_ops
,
1005 .of_match_table
= ov02a10_of_match
,
1007 .probe
= ov02a10_probe
,
1008 .remove
= ov02a10_remove
,
1010 module_i2c_driver(ov02a10_i2c_driver
);
1012 MODULE_AUTHOR("Dongchun Zhu <dongchun.zhu@mediatek.com>");
1013 MODULE_DESCRIPTION("OmniVision OV02A10 sensor driver");
1014 MODULE_LICENSE("GPL v2");