3 * Copyright (c) 2013 Intel Corporation. All Rights Reserved.
5 * This program is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU General Public License version
7 * 2 as published by the Free Software Foundation.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
21 #include <linux/atomisp.h>
22 #include <linux/delay.h>
23 #include <linux/firmware.h>
24 #include <linux/i2c.h>
25 #include <linux/module.h>
26 #include <linux/module.h>
27 #include <linux/moduleparam.h>
28 #include <linux/string.h>
29 #include <linux/types.h>
30 #include <media/v4l2-ctrls.h>
31 #include <media/v4l2-device.h>
34 #define to_ap1302_device(sub_dev) \
35 container_of(sub_dev, struct ap1302_device, sd)
37 /* Static definitions */
38 static struct regmap_config ap1302_reg16_config = {
41 .reg_format_endian = REGMAP_ENDIAN_BIG,
42 .val_format_endian = REGMAP_ENDIAN_BIG,
45 static struct regmap_config ap1302_reg32_config = {
48 .reg_format_endian = REGMAP_ENDIAN_BIG,
49 .val_format_endian = REGMAP_ENDIAN_BIG,
52 static enum ap1302_contexts ap1302_cntx_mapping[] = {
53 CONTEXT_PREVIEW, /* Invalid atomisp run mode */
54 CONTEXT_VIDEO, /* ATOMISP_RUN_MODE_VIDEO */
55 CONTEXT_SNAPSHOT, /* ATOMISP_RUN_MODE_STILL_CAPTURE */
56 CONTEXT_SNAPSHOT, /* ATOMISP_RUN_MODE_CONTINUOUS_CAPTURE */
57 CONTEXT_PREVIEW, /* ATOMISP_RUN_MODE_PREVIEW */
60 static struct ap1302_res_struct ap1302_preview_res[] = {
83 static struct ap1302_res_struct ap1302_snapshot_res[] = {
106 static struct ap1302_res_struct ap1302_video_res[] = {
129 static enum ap1302_contexts stream_to_context[] = {
136 static u16 aux_stream_config[CONTEXT_NUM][CONTEXT_NUM] = {
137 {0, 0, 0}, /* Preview: No aux streams. */
138 {1, 0, 2}, /* Snapshot: 1 for postview. 2 for video */
139 {1, 0, 0}, /* Video: 1 for preview. */
142 static struct ap1302_context_info context_info[] = {
143 {CNTX_WIDTH, AP1302_REG16, "width"},
144 {CNTX_HEIGHT, AP1302_REG16, "height"},
145 {CNTX_ROI_X0, AP1302_REG16, "roi_x0"},
146 {CNTX_ROI_X1, AP1302_REG16, "roi_x1"},
147 {CNTX_ROI_Y0, AP1302_REG16, "roi_y0"},
148 {CNTX_ROI_Y1, AP1302_REG16, "roi_y1"},
149 {CNTX_ASPECT, AP1302_REG16, "aspect"},
150 {CNTX_LOCK, AP1302_REG16, "lock"},
151 {CNTX_ENABLE, AP1302_REG16, "enable"},
152 {CNTX_OUT_FMT, AP1302_REG16, "out_fmt"},
153 {CNTX_SENSOR_MODE, AP1302_REG16, "sensor_mode"},
154 {CNTX_MIPI_CTRL, AP1302_REG16, "mipi_ctrl"},
155 {CNTX_MIPI_II_CTRL, AP1302_REG16, "mipi_ii_ctrl"},
156 {CNTX_LINE_TIME, AP1302_REG32, "line_time"},
157 {CNTX_MAX_FPS, AP1302_REG16, "max_fps"},
158 {CNTX_AE_USG, AP1302_REG16, "ae_usg"},
159 {CNTX_AE_UPPER_ET, AP1302_REG32, "ae_upper_et"},
160 {CNTX_AE_MAX_ET, AP1302_REG32, "ae_max_et"},
161 {CNTX_SS, AP1302_REG16, "ss"},
162 {CNTX_S1_SENSOR_MODE, AP1302_REG16, "s1_sensor_mode"},
163 {CNTX_HINF_CTRL, AP1302_REG16, "hinf_ctrl"},
166 /* This array stores the description list for metadata.
167 The metadata contains exposure settings and face
168 detection results. */
169 static u16 ap1302_ss_list[] = {
170 0xb01c, /* From 0x0186 with size 0x1C are exposure settings. */
172 0xb002, /* 0x71c0 is for F-number */
174 0xb010, /* From 0x03dc with size 0x10 are face general infos. */
176 0xb0a0, /* From 0x03e4 with size 0xa0 are face detail infos. */
178 0xb020, /* From 0x0604 with size 0x20 are smile rate infos. */
183 /* End of static definitions */
185 static int ap1302_i2c_read_reg(struct v4l2_subdev *sd,
186 u16 reg, u16 len, void *val)
188 struct ap1302_device *dev = to_ap1302_device(sd);
189 struct i2c_client *client = v4l2_get_subdevdata(sd);
192 if (len == AP1302_REG16)
193 ret = regmap_read(dev->regmap16, reg, val);
194 else if (len == AP1302_REG32)
195 ret = regmap_read(dev->regmap32, reg, val);
199 dev_dbg(&client->dev, "Read reg failed. reg=0x%04X\n", reg);
202 if (len == AP1302_REG16)
203 dev_dbg(&client->dev, "read_reg[0x%04X] = 0x%04X\n",
206 dev_dbg(&client->dev, "read_reg[0x%04X] = 0x%08X\n",
211 static int ap1302_i2c_write_reg(struct v4l2_subdev *sd,
212 u16 reg, u16 len, u32 val)
214 struct ap1302_device *dev = to_ap1302_device(sd);
215 struct i2c_client *client = v4l2_get_subdevdata(sd);
217 if (len == AP1302_REG16)
218 ret = regmap_write(dev->regmap16, reg, val);
219 else if (len == AP1302_REG32)
220 ret = regmap_write(dev->regmap32, reg, val);
224 dev_dbg(&client->dev, "Write reg failed. reg=0x%04X\n", reg);
227 if (len == AP1302_REG16)
228 dev_dbg(&client->dev, "write_reg[0x%04X] = 0x%04X\n",
231 dev_dbg(&client->dev, "write_reg[0x%04X] = 0x%08X\n",
237 ap1302_calculate_context_reg_addr(enum ap1302_contexts context, u16 offset)
240 /* The register offset is defined according to preview/video registers.
241 Preview and video context have the same register definition.
242 But snapshot context does not have register S1_SENSOR_MODE.
243 When setting snapshot registers, if the offset exceeds
244 S1_SENSOR_MODE, the actual offset needs to minus 2. */
245 if (context == CONTEXT_SNAPSHOT) {
246 if (offset == CNTX_S1_SENSOR_MODE)
248 if (offset > CNTX_S1_SENSOR_MODE)
251 if (context == CONTEXT_PREVIEW)
252 reg_addr = REG_PREVIEW_BASE + offset;
253 else if (context == CONTEXT_VIDEO)
254 reg_addr = REG_VIDEO_BASE + offset;
256 reg_addr = REG_SNAPSHOT_BASE + offset;
260 static int ap1302_read_context_reg(struct v4l2_subdev *sd,
261 enum ap1302_contexts context, u16 offset, u16 len)
263 struct ap1302_device *dev = to_ap1302_device(sd);
264 u16 reg_addr = ap1302_calculate_context_reg_addr(context, offset);
267 return ap1302_i2c_read_reg(sd, reg_addr, len,
268 ((u8 *)&dev->cntx_config[context]) + offset);
271 static int ap1302_write_context_reg(struct v4l2_subdev *sd,
272 enum ap1302_contexts context, u16 offset, u16 len)
274 struct ap1302_device *dev = to_ap1302_device(sd);
275 u16 reg_addr = ap1302_calculate_context_reg_addr(context, offset);
278 return ap1302_i2c_write_reg(sd, reg_addr, len,
279 *(u32 *)(((u8 *)&dev->cntx_config[context]) + offset));
282 static int ap1302_dump_context_reg(struct v4l2_subdev *sd,
283 enum ap1302_contexts context)
285 struct i2c_client *client = v4l2_get_subdevdata(sd);
286 struct ap1302_device *dev = to_ap1302_device(sd);
288 dev_dbg(&client->dev, "Dump registers for context[%d]:\n", context);
289 for (i = 0; i < ARRAY_SIZE(context_info); i++) {
290 struct ap1302_context_info *info = &context_info[i];
291 u8 *var = (u8 *)&dev->cntx_config[context] + info->offset;
292 /* Snapshot context does not have s1_sensor_mode register. */
293 if (context == CONTEXT_SNAPSHOT &&
294 info->offset == CNTX_S1_SENSOR_MODE)
296 ap1302_read_context_reg(sd, context, info->offset, info->len);
297 if (info->len == AP1302_REG16)
298 dev_dbg(&client->dev, "context.%s = 0x%04X (%d)\n",
299 info->name, *(u16 *)var, *(u16 *)var);
301 dev_dbg(&client->dev, "context.%s = 0x%08X (%d)\n",
302 info->name, *(u32 *)var, *(u32 *)var);
307 static int ap1302_request_firmware(struct v4l2_subdev *sd)
309 struct i2c_client *client = v4l2_get_subdevdata(sd);
310 struct ap1302_device *dev = to_ap1302_device(sd);
312 ret = request_firmware(&dev->fw, "ap1302_fw.bin", &client->dev);
314 dev_err(&client->dev,
315 "ap1302_request_firmware failed. ret=%d\n", ret);
319 /* When loading firmware, host writes firmware data from address 0x8000.
320 When the address reaches 0x9FFF, the next address should return to 0x8000.
321 This function handles this address window and load firmware data to AP1302.
322 win_pos indicates the offset within this window. Firmware loading procedure
323 may call this function several times. win_pos records the current position
324 that has been written to.*/
325 static int ap1302_write_fw_window(struct v4l2_subdev *sd,
326 u16 *win_pos, const u8 *buf, u32 len)
328 struct ap1302_device *dev = to_ap1302_device(sd);
332 for (pos = 0; pos < len; pos += sub_len) {
333 if (len - pos < AP1302_FW_WINDOW_SIZE - *win_pos)
336 sub_len = AP1302_FW_WINDOW_SIZE - *win_pos;
337 ret = regmap_raw_write(dev->regmap16,
338 *win_pos + AP1302_FW_WINDOW_OFFSET,
343 if (*win_pos >= AP1302_FW_WINDOW_SIZE)
349 static int ap1302_load_firmware(struct v4l2_subdev *sd)
351 struct i2c_client *client = v4l2_get_subdevdata(sd);
352 struct ap1302_device *dev = to_ap1302_device(sd);
353 const struct ap1302_firmware *fw;
359 dev_info(&client->dev, "Start to load firmware.\n");
361 dev_err(&client->dev, "firmware not requested.\n");
364 fw = (const struct ap1302_firmware *) dev->fw->data;
365 if (dev->fw->size != (sizeof(*fw) + fw->total_size)) {
366 dev_err(&client->dev, "firmware size does not match.\n");
369 /* The fw binary contains a header of struct ap1302_firmware.
370 Following the header is the bootdata of AP1302.
371 The bootdata pointer can be referenced as &fw[1]. */
372 fw_data = (u8 *)&fw[1];
374 /* Clear crc register. */
375 ret = ap1302_i2c_write_reg(sd, REG_SIP_CRC, AP1302_REG16, 0xFFFF);
379 /* Load FW data for PLL init stage. */
380 ret = ap1302_write_fw_window(sd, &win_pos, fw_data, fw->pll_init_size);
384 /* Write 2 to bootdata_stage register to apply basic_init_hp
385 settings and enable PLL. */
386 ret = ap1302_i2c_write_reg(sd, REG_BOOTDATA_STAGE,
387 AP1302_REG16, 0x0002);
391 /* Wait 1ms for PLL to lock. */
394 /* Load the rest of bootdata content. */
395 ret = ap1302_write_fw_window(sd, &win_pos, fw_data + fw->pll_init_size,
396 fw->total_size - fw->pll_init_size);
401 ret = ap1302_i2c_read_reg(sd, REG_SIP_CRC, AP1302_REG16, ®_val);
404 if (reg_val != fw->crc) {
405 dev_err(&client->dev,
406 "crc does not match. T:0x%04X F:0x%04X\n",
411 /* Write 0xFFFF to bootdata_stage register to indicate AP1302 that
412 the whole bootdata content has been loaded. */
413 ret = ap1302_i2c_write_reg(sd, REG_BOOTDATA_STAGE,
414 AP1302_REG16, 0xFFFF);
417 dev_info(&client->dev, "Load firmware successfully.\n");
422 static int __ap1302_s_power(struct v4l2_subdev *sd, int on, int load_fw)
424 struct ap1302_device *dev = to_ap1302_device(sd);
425 struct i2c_client *client = v4l2_get_subdevdata(sd);
429 dev_info(&client->dev, "ap1302_s_power is called.\n");
430 ret = dev->platform_data->power_ctrl(sd, on);
432 dev_err(&client->dev,
433 "ap1302_s_power error. on=%d ret=%d\n", on, ret);
439 /* Load firmware after power on. */
440 ret = ap1302_load_firmware(sd);
442 dev_err(&client->dev,
443 "ap1302_load_firmware failed. ret=%d\n", ret);
446 ret = ap1302_i2c_read_reg(sd, REG_SS_HEAD_PT0, AP1302_REG16, &ss_ptr);
449 for (i = 0; i < ARRAY_SIZE(ap1302_ss_list); i++) {
450 ret = ap1302_i2c_write_reg(sd, ss_ptr + i * 2,
451 AP1302_REG16, ap1302_ss_list[i]);
458 static int ap1302_s_power(struct v4l2_subdev *sd, int on)
460 struct ap1302_device *dev = to_ap1302_device(sd);
463 mutex_lock(&dev->input_lock);
464 ret = __ap1302_s_power(sd, on, 1);
465 dev->sys_activated = 0;
466 mutex_unlock(&dev->input_lock);
471 static int ap1302_s_config(struct v4l2_subdev *sd, void *pdata)
473 struct ap1302_device *dev = to_ap1302_device(sd);
474 struct i2c_client *client = v4l2_get_subdevdata(sd);
475 struct camera_mipi_info *mipi_info;
479 dev_info(&client->dev, "ap1302_s_config is called.\n");
483 dev->platform_data = pdata;
485 mutex_lock(&dev->input_lock);
487 if (dev->platform_data->platform_init) {
488 ret = dev->platform_data->platform_init(client);
493 ret = __ap1302_s_power(sd, 1, 0);
497 /* Detect for AP1302 */
498 ret = ap1302_i2c_read_reg(sd, REG_CHIP_VERSION, AP1302_REG16, ®_val);
499 if (ret || (reg_val != AP1302_CHIP_ID)) {
500 dev_err(&client->dev,
501 "Chip version does no match. ret=%d ver=0x%04x\n",
505 dev_info(&client->dev, "AP1302 Chip ID is 0x%X\n", reg_val);
507 /* Detect revision for AP1302 */
508 ret = ap1302_i2c_read_reg(sd, REG_CHIP_REV, AP1302_REG16, ®_val);
511 dev_info(&client->dev, "AP1302 Chip Rev is 0x%X\n", reg_val);
512 ret = dev->platform_data->csi_cfg(sd, 1);
516 mipi_info = v4l2_get_subdev_hostdata(sd);
519 dev->num_lanes = mipi_info->num_lanes;
521 ret = __ap1302_s_power(sd, 0, 0);
525 mutex_unlock(&dev->input_lock);
530 __ap1302_s_power(sd, 0, 0);
532 mutex_unlock(&dev->input_lock);
533 dev_err(&client->dev, "ap1302_s_config failed\n");
537 static enum ap1302_contexts ap1302_get_context(struct v4l2_subdev *sd)
539 struct ap1302_device *dev = to_ap1302_device(sd);
540 return dev->cur_context;
543 static int ap1302_enum_mbus_code(struct v4l2_subdev *sd,
544 struct v4l2_subdev_pad_config *cfg,
545 struct v4l2_subdev_mbus_code_enum *code)
550 code->code = MEDIA_BUS_FMT_UYVY8_1X16;
555 static int ap1302_match_resolution(struct ap1302_context_res *res,
556 struct v4l2_mbus_framefmt *fmt)
558 s32 w0, h0, mismatch, distance;
560 s32 h1 = fmt->height;
561 s32 min_distance = INT_MAX;
564 if (w1 == 0 || h1 == 0)
567 for (i = 0; i < res->res_num; i++) {
568 w0 = res->res_table[i].width;
569 h0 = res->res_table[i].height;
570 if (w0 < w1 || h0 < h1)
572 mismatch = abs(w0 * h1 - w1 * h0) * 8192 / w1 / h0;
573 if (mismatch > 8192 * AP1302_MAX_RATIO_MISMATCH / 100)
575 distance = (w0 * h1 + w1 * h0) * 8192 / w1 / h1;
576 if (distance < min_distance) {
577 min_distance = distance;
585 static s32 ap1302_try_mbus_fmt_locked(struct v4l2_subdev *sd,
586 enum ap1302_contexts context,
587 struct v4l2_mbus_framefmt *fmt)
589 struct ap1302_device *dev = to_ap1302_device(sd);
590 struct ap1302_res_struct *res_table;
591 s32 res_num, idx = -1;
593 res_table = dev->cntx_res[context].res_table;
594 res_num = dev->cntx_res[context].res_num;
596 if ((fmt->width <= res_table[res_num - 1].width) &&
597 (fmt->height <= res_table[res_num - 1].height))
598 idx = ap1302_match_resolution(&dev->cntx_res[context], fmt);
602 fmt->width = res_table[idx].width;
603 fmt->height = res_table[idx].height;
604 fmt->code = MEDIA_BUS_FMT_UYVY8_1X16;
609 static int ap1302_get_fmt(struct v4l2_subdev *sd,
610 struct v4l2_subdev_pad_config *cfg,
611 struct v4l2_subdev_format *format)
614 struct v4l2_mbus_framefmt *fmt = &format->format;
615 struct ap1302_device *dev = to_ap1302_device(sd);
616 enum ap1302_contexts context;
617 struct ap1302_res_struct *res_table;
621 mutex_lock(&dev->input_lock);
622 context = ap1302_get_context(sd);
623 res_table = dev->cntx_res[context].res_table;
624 cur_res = dev->cntx_res[context].cur_res;
625 fmt->code = MEDIA_BUS_FMT_UYVY8_1X16;
626 fmt->width = res_table[cur_res].width;
627 fmt->height = res_table[cur_res].height;
628 mutex_unlock(&dev->input_lock);
632 static int ap1302_set_fmt(struct v4l2_subdev *sd,
633 struct v4l2_subdev_pad_config *cfg,
634 struct v4l2_subdev_format *format)
636 struct v4l2_mbus_framefmt *fmt = &format->format;
637 struct ap1302_device *dev = to_ap1302_device(sd);
638 struct i2c_client *client = v4l2_get_subdevdata(sd);
639 struct atomisp_input_stream_info *stream_info =
640 (struct atomisp_input_stream_info *)fmt->reserved;
641 enum ap1302_contexts context, main_context;
646 mutex_lock(&dev->input_lock);
647 if (format->which == V4L2_SUBDEV_FORMAT_TRY) {
648 context = ap1302_get_context(sd);
649 ap1302_try_mbus_fmt_locked(sd, context, fmt);
651 mutex_unlock(&dev->input_lock);
654 context = stream_to_context[stream_info->stream];
655 dev_dbg(&client->dev, "ap1302_set_mbus_fmt. stream=%d context=%d\n",
656 stream_info->stream, context);
657 dev->cntx_res[context].cur_res =
658 ap1302_try_mbus_fmt_locked(sd, context, fmt);
659 dev->cntx_config[context].width = fmt->width;
660 dev->cntx_config[context].height = fmt->height;
661 ap1302_write_context_reg(sd, context, CNTX_WIDTH, AP1302_REG16);
662 ap1302_write_context_reg(sd, context, CNTX_HEIGHT, AP1302_REG16);
663 ap1302_read_context_reg(sd, context, CNTX_OUT_FMT, AP1302_REG16);
664 dev->cntx_config[context].out_fmt &= ~OUT_FMT_TYPE_MASK;
665 dev->cntx_config[context].out_fmt |= AP1302_FMT_UYVY422;
666 ap1302_write_context_reg(sd, context, CNTX_OUT_FMT, AP1302_REG16);
668 main_context = ap1302_get_context(sd);
669 if (context == main_context) {
670 ap1302_read_context_reg(sd, context,
671 CNTX_MIPI_CTRL, AP1302_REG16);
672 dev->cntx_config[context].mipi_ctrl &= ~MIPI_CTRL_IMGVC_MASK;
673 dev->cntx_config[context].mipi_ctrl |=
674 (context << MIPI_CTRL_IMGVC_OFFSET);
675 dev->cntx_config[context].mipi_ctrl &= ~MIPI_CTRL_SSVC_MASK;
676 dev->cntx_config[context].mipi_ctrl |=
677 (context << MIPI_CTRL_SSVC_OFFSET);
678 dev->cntx_config[context].mipi_ctrl &= ~MIPI_CTRL_SSTYPE_MASK;
679 dev->cntx_config[context].mipi_ctrl |=
680 (0x12 << MIPI_CTRL_SSTYPE_OFFSET);
681 ap1302_write_context_reg(sd, context,
682 CNTX_MIPI_CTRL, AP1302_REG16);
683 ap1302_read_context_reg(sd, context,
684 CNTX_SS, AP1302_REG16);
685 dev->cntx_config[context].ss = AP1302_SS_CTRL;
686 ap1302_write_context_reg(sd, context,
687 CNTX_SS, AP1302_REG16);
689 /* Configure aux stream */
690 ap1302_read_context_reg(sd, context,
691 CNTX_MIPI_II_CTRL, AP1302_REG16);
692 dev->cntx_config[context].mipi_ii_ctrl &= ~MIPI_CTRL_IMGVC_MASK;
693 dev->cntx_config[context].mipi_ii_ctrl |=
694 (context << MIPI_CTRL_IMGVC_OFFSET);
695 ap1302_write_context_reg(sd, context,
696 CNTX_MIPI_II_CTRL, AP1302_REG16);
697 if (stream_info->enable) {
698 ap1302_read_context_reg(sd, main_context,
699 CNTX_OUT_FMT, AP1302_REG16);
700 dev->cntx_config[context].out_fmt |=
701 (aux_stream_config[main_context][context]
702 << OUT_FMT_IIS_OFFSET);
703 ap1302_write_context_reg(sd, main_context,
704 CNTX_OUT_FMT, AP1302_REG16);
707 stream_info->ch_id = context;
708 mutex_unlock(&dev->input_lock);
714 static int ap1302_g_frame_interval(struct v4l2_subdev *sd,
715 struct v4l2_subdev_frame_interval *interval)
717 struct ap1302_device *dev = to_ap1302_device(sd);
718 enum ap1302_contexts context;
719 struct ap1302_res_struct *res_table;
722 mutex_lock(&dev->input_lock);
723 context = ap1302_get_context(sd);
724 res_table = dev->cntx_res[context].res_table;
725 cur_res = dev->cntx_res[context].cur_res;
726 interval->interval.denominator = res_table[cur_res].fps;
727 interval->interval.numerator = 1;
728 mutex_unlock(&dev->input_lock);
732 static int ap1302_enum_frame_size(struct v4l2_subdev *sd,
733 struct v4l2_subdev_pad_config *cfg,
734 struct v4l2_subdev_frame_size_enum *fse)
736 struct ap1302_device *dev = to_ap1302_device(sd);
737 enum ap1302_contexts context;
738 struct ap1302_res_struct *res_table;
739 int index = fse->index;
741 mutex_lock(&dev->input_lock);
742 context = ap1302_get_context(sd);
743 if (index >= dev->cntx_res[context].res_num) {
744 mutex_unlock(&dev->input_lock);
748 res_table = dev->cntx_res[context].res_table;
749 fse->min_width = res_table[index].width;
750 fse->min_height = res_table[index].height;
751 fse->max_width = res_table[index].width;
752 fse->max_height = res_table[index].height;
753 mutex_unlock(&dev->input_lock);
759 static int ap1302_g_skip_frames(struct v4l2_subdev *sd, u32 *frames)
765 static int ap1302_s_stream(struct v4l2_subdev *sd, int enable)
767 struct ap1302_device *dev = to_ap1302_device(sd);
768 struct i2c_client *client = v4l2_get_subdevdata(sd);
769 enum ap1302_contexts context;
773 mutex_lock(&dev->input_lock);
774 context = ap1302_get_context(sd);
775 dev_dbg(&client->dev, "ap1302_s_stream. context=%d enable=%d\n",
778 ap1302_i2c_read_reg(sd, REG_CTRL,
779 AP1302_REG16, ®_val);
780 reg_val &= ~CTRL_CNTX_MASK;
781 reg_val |= (context<<CTRL_CNTX_OFFSET);
782 ap1302_i2c_write_reg(sd, REG_CTRL,
783 AP1302_REG16, reg_val);
785 ap1302_i2c_read_reg(sd, REG_SENSOR_SELECT,
786 AP1302_REG16, ®_val);
787 reg_val &= ~SENSOR_SELECT_MASK;
788 reg_val |= (AP1302_SENSOR_PRI<<SENSOR_SELECT_OFFSET);
789 ap1302_i2c_write_reg(sd, REG_SENSOR_SELECT,
790 AP1302_REG16, reg_val);
792 dev_info(&client->dev, "Start stream. context=%d\n", context);
793 ap1302_dump_context_reg(sd, context);
794 if (!dev->sys_activated) {
795 reg_val = AP1302_SYS_ACTIVATE;
796 dev->sys_activated = 1;
798 reg_val = AP1302_SYS_SWITCH;
801 dev_info(&client->dev, "Stop stream. context=%d\n", context);
802 reg_val = AP1302_SYS_SWITCH;
804 ret = ap1302_i2c_write_reg(sd, REG_SYS_START, AP1302_REG16, reg_val);
806 dev_err(&client->dev,
807 "AP1302 set stream failed. enable=%d\n", enable);
808 mutex_unlock(&dev->input_lock);
812 static u16 ap1302_ev_values[] = {0xfd00, 0xfe80, 0x0, 0x180, 0x300};
814 static int ap1302_set_exposure_off(struct v4l2_subdev *sd, s32 val)
816 val -= AP1302_MIN_EV;
817 return ap1302_i2c_write_reg(sd, REG_AE_BV_OFF, AP1302_REG16,
818 ap1302_ev_values[val]);
821 static u16 ap1302_wb_values[] = {
822 0, /* V4L2_WHITE_BALANCE_MANUAL */
823 0xf, /* V4L2_WHITE_BALANCE_AUTO */
824 0x2, /* V4L2_WHITE_BALANCE_INCANDESCENT */
825 0x4, /* V4L2_WHITE_BALANCE_FLUORESCENT */
826 0x5, /* V4L2_WHITE_BALANCE_FLUORESCENT_H */
827 0x1, /* V4L2_WHITE_BALANCE_HORIZON */
828 0x5, /* V4L2_WHITE_BALANCE_DAYLIGHT */
829 0xf, /* V4L2_WHITE_BALANCE_FLASH */
830 0x6, /* V4L2_WHITE_BALANCE_CLOUDY */
831 0x6, /* V4L2_WHITE_BALANCE_SHADE */
834 static int ap1302_set_wb_mode(struct v4l2_subdev *sd, s32 val)
839 ret = ap1302_i2c_read_reg(sd, REG_AWB_CTRL, AP1302_REG16, ®_val);
842 reg_val &= ~AWB_CTRL_MODE_MASK;
843 reg_val |= ap1302_wb_values[val] << AWB_CTRL_MODE_OFFSET;
844 if (val == V4L2_WHITE_BALANCE_FLASH)
845 reg_val |= AWB_CTRL_FLASH_MASK;
847 reg_val &= ~AWB_CTRL_FLASH_MASK;
848 ret = ap1302_i2c_write_reg(sd, REG_AWB_CTRL, AP1302_REG16, reg_val);
852 static int ap1302_set_zoom(struct v4l2_subdev *sd, s32 val)
854 ap1302_i2c_write_reg(sd, REG_DZ_TGT_FCT, AP1302_REG16,
859 static u16 ap1302_sfx_values[] = {
860 0x00, /* V4L2_COLORFX_NONE */
861 0x03, /* V4L2_COLORFX_BW */
862 0x0d, /* V4L2_COLORFX_SEPIA */
863 0x07, /* V4L2_COLORFX_NEGATIVE */
864 0x04, /* V4L2_COLORFX_EMBOSS */
865 0x0f, /* V4L2_COLORFX_SKETCH */
866 0x08, /* V4L2_COLORFX_SKY_BLUE */
867 0x09, /* V4L2_COLORFX_GRASS_GREEN */
868 0x0a, /* V4L2_COLORFX_SKIN_WHITEN */
869 0x00, /* V4L2_COLORFX_VIVID */
870 0x00, /* V4L2_COLORFX_AQUA */
871 0x00, /* V4L2_COLORFX_ART_FREEZE */
872 0x00, /* V4L2_COLORFX_SILHOUETTE */
873 0x10, /* V4L2_COLORFX_SOLARIZATION */
874 0x02, /* V4L2_COLORFX_ANTIQUE */
875 0x00, /* V4L2_COLORFX_SET_CBCR */
878 static int ap1302_set_special_effect(struct v4l2_subdev *sd, s32 val)
880 ap1302_i2c_write_reg(sd, REG_SFX_MODE, AP1302_REG16,
881 ap1302_sfx_values[val]);
885 static u16 ap1302_scene_mode_values[] = {
886 0x00, /* V4L2_SCENE_MODE_NONE */
887 0x07, /* V4L2_SCENE_MODE_BACKLIGHT */
888 0x0a, /* V4L2_SCENE_MODE_BEACH_SNOW */
889 0x06, /* V4L2_SCENE_MODE_CANDLE_LIGHT */
890 0x00, /* V4L2_SCENE_MODE_DAWN_DUSK */
891 0x00, /* V4L2_SCENE_MODE_FALL_COLORS */
892 0x0d, /* V4L2_SCENE_MODE_FIREWORKS */
893 0x02, /* V4L2_SCENE_MODE_LANDSCAPE */
894 0x05, /* V4L2_SCENE_MODE_NIGHT */
895 0x0c, /* V4L2_SCENE_MODE_PARTY_INDOOR */
896 0x01, /* V4L2_SCENE_MODE_PORTRAIT */
897 0x03, /* V4L2_SCENE_MODE_SPORTS */
898 0x0e, /* V4L2_SCENE_MODE_SUNSET */
899 0x0b, /* V4L2_SCENE_MODE_TEXT */
902 static int ap1302_set_scene_mode(struct v4l2_subdev *sd, s32 val)
904 ap1302_i2c_write_reg(sd, REG_SCENE_CTRL, AP1302_REG16,
905 ap1302_scene_mode_values[val]);
909 static u16 ap1302_flicker_values[] = {
916 static int ap1302_set_flicker_freq(struct v4l2_subdev *sd, s32 val)
918 ap1302_i2c_write_reg(sd, REG_FLICK_CTRL, AP1302_REG16,
919 ap1302_flicker_values[val]);
923 static int ap1302_s_ctrl(struct v4l2_ctrl *ctrl)
925 struct ap1302_device *dev = container_of(
926 ctrl->handler, struct ap1302_device, ctrl_handler);
929 case V4L2_CID_RUN_MODE:
930 dev->cur_context = ap1302_cntx_mapping[ctrl->val];
932 case V4L2_CID_EXPOSURE:
933 ap1302_set_exposure_off(&dev->sd, ctrl->val);
935 case V4L2_CID_AUTO_N_PRESET_WHITE_BALANCE:
936 ap1302_set_wb_mode(&dev->sd, ctrl->val);
938 case V4L2_CID_ZOOM_ABSOLUTE:
939 ap1302_set_zoom(&dev->sd, ctrl->val);
941 case V4L2_CID_COLORFX:
942 ap1302_set_special_effect(&dev->sd, ctrl->val);
944 case V4L2_CID_SCENE_MODE:
945 ap1302_set_scene_mode(&dev->sd, ctrl->val);
947 case V4L2_CID_POWER_LINE_FREQUENCY:
948 ap1302_set_flicker_freq(&dev->sd, ctrl->val);
957 static int ap1302_g_register(struct v4l2_subdev *sd,
958 struct v4l2_dbg_register *reg)
960 struct ap1302_device *dev = to_ap1302_device(sd);
964 if (reg->size != AP1302_REG16 &&
965 reg->size != AP1302_REG32)
968 mutex_lock(&dev->input_lock);
970 ret = ap1302_i2c_read_reg(sd, reg->reg, reg->size, ®_val);
973 mutex_unlock(&dev->input_lock);
982 static int ap1302_s_register(struct v4l2_subdev *sd,
983 const struct v4l2_dbg_register *reg)
985 struct ap1302_device *dev = to_ap1302_device(sd);
988 if (reg->size != AP1302_REG16 &&
989 reg->size != AP1302_REG32)
992 mutex_lock(&dev->input_lock);
994 ret = ap1302_i2c_write_reg(sd, reg->reg, reg->size, reg->val);
997 mutex_unlock(&dev->input_lock);
1001 static long ap1302_ioctl(struct v4l2_subdev *sd, unsigned int cmd, void *arg)
1005 case VIDIOC_DBG_G_REGISTER:
1006 ret = ap1302_g_register(sd, arg);
1008 case VIDIOC_DBG_S_REGISTER:
1009 ret = ap1302_s_register(sd, arg);
1017 static const struct v4l2_ctrl_ops ctrl_ops = {
1018 .s_ctrl = ap1302_s_ctrl,
1021 static const char * const ctrl_run_mode_menu[] = {
1025 "Continuous capture",
1029 static const struct v4l2_ctrl_config ctrls[] = {
1032 .id = V4L2_CID_RUN_MODE,
1034 .type = V4L2_CTRL_TYPE_MENU,
1038 .qmenu = ctrl_run_mode_menu,
1042 .id = V4L2_CID_EXPOSURE,
1044 .type = V4L2_CTRL_TYPE_INTEGER,
1045 .min = AP1302_MIN_EV,
1047 .max = AP1302_MAX_EV,
1052 .id = V4L2_CID_AUTO_N_PRESET_WHITE_BALANCE,
1053 .name = "White Balance",
1054 .type = V4L2_CTRL_TYPE_INTEGER,
1062 .id = V4L2_CID_ZOOM_ABSOLUTE,
1063 .name = "Zoom Absolute",
1064 .type = V4L2_CTRL_TYPE_INTEGER,
1072 .id = V4L2_CID_COLORFX,
1073 .name = "Color Special Effect",
1074 .type = V4L2_CTRL_TYPE_INTEGER,
1082 .id = V4L2_CID_SCENE_MODE,
1083 .name = "Scene Mode",
1084 .type = V4L2_CTRL_TYPE_INTEGER,
1092 .id = V4L2_CID_POWER_LINE_FREQUENCY,
1093 .name = "Light frequency filter",
1094 .type = V4L2_CTRL_TYPE_INTEGER,
1102 static struct v4l2_subdev_sensor_ops ap1302_sensor_ops = {
1103 .g_skip_frames = ap1302_g_skip_frames,
1106 static const struct v4l2_subdev_video_ops ap1302_video_ops = {
1107 .s_stream = ap1302_s_stream,
1108 .g_frame_interval = ap1302_g_frame_interval,
1111 static const struct v4l2_subdev_core_ops ap1302_core_ops = {
1112 .s_power = ap1302_s_power,
1113 .ioctl = ap1302_ioctl,
1114 #ifdef CONFIG_VIDEO_ADV_DEBUG
1115 .g_register = ap1302_g_register,
1116 .s_register = ap1302_s_register,
1120 static const struct v4l2_subdev_pad_ops ap1302_pad_ops = {
1121 .enum_mbus_code = ap1302_enum_mbus_code,
1122 .enum_frame_size = ap1302_enum_frame_size,
1123 .get_fmt = ap1302_get_fmt,
1124 .set_fmt = ap1302_set_fmt,
1127 static const struct v4l2_subdev_ops ap1302_ops = {
1128 .core = &ap1302_core_ops,
1129 .pad = &ap1302_pad_ops,
1130 .video = &ap1302_video_ops,
1131 .sensor = &ap1302_sensor_ops
1134 static int ap1302_remove(struct i2c_client *client)
1136 struct v4l2_subdev *sd = i2c_get_clientdata(client);
1137 struct ap1302_device *dev = to_ap1302_device(sd);
1139 if (dev->platform_data->platform_deinit)
1140 dev->platform_data->platform_deinit();
1142 release_firmware(dev->fw);
1144 media_entity_cleanup(&dev->sd.entity);
1145 dev->platform_data->csi_cfg(sd, 0);
1146 v4l2_device_unregister_subdev(sd);
1151 static int ap1302_probe(struct i2c_client *client,
1152 const struct i2c_device_id *id)
1154 struct ap1302_device *dev;
1158 dev_info(&client->dev, "ap1302 probe called.\n");
1160 /* allocate device & init sub device */
1161 dev = devm_kzalloc(&client->dev, sizeof(*dev), GFP_KERNEL);
1163 dev_err(&client->dev, "%s: out of memory\n", __func__);
1167 mutex_init(&dev->input_lock);
1169 v4l2_i2c_subdev_init(&(dev->sd), client, &ap1302_ops);
1171 ret = ap1302_request_firmware(&(dev->sd));
1173 dev_err(&client->dev, "Cannot request ap1302 firmware.\n");
1177 dev->regmap16 = devm_regmap_init_i2c(client, &ap1302_reg16_config);
1178 if (IS_ERR(dev->regmap16)) {
1179 ret = PTR_ERR(dev->regmap16);
1180 dev_err(&client->dev,
1181 "Failed to allocate 16bit register map: %d\n", ret);
1185 dev->regmap32 = devm_regmap_init_i2c(client, &ap1302_reg32_config);
1186 if (IS_ERR(dev->regmap32)) {
1187 ret = PTR_ERR(dev->regmap32);
1188 dev_err(&client->dev,
1189 "Failed to allocate 32bit register map: %d\n", ret);
1193 if (client->dev.platform_data) {
1194 ret = ap1302_s_config(&dev->sd, client->dev.platform_data);
1199 dev->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
1200 dev->pad.flags = MEDIA_PAD_FL_SOURCE;
1201 dev->sd.entity.function = MEDIA_ENT_F_CAM_SENSOR;
1203 dev->cntx_res[CONTEXT_PREVIEW].res_num = ARRAY_SIZE(ap1302_preview_res);
1204 dev->cntx_res[CONTEXT_PREVIEW].res_table = ap1302_preview_res;
1205 dev->cntx_res[CONTEXT_SNAPSHOT].res_num =
1206 ARRAY_SIZE(ap1302_snapshot_res);
1207 dev->cntx_res[CONTEXT_SNAPSHOT].res_table = ap1302_snapshot_res;
1208 dev->cntx_res[CONTEXT_VIDEO].res_num = ARRAY_SIZE(ap1302_video_res);
1209 dev->cntx_res[CONTEXT_VIDEO].res_table = ap1302_video_res;
1211 ret = v4l2_ctrl_handler_init(&dev->ctrl_handler, ARRAY_SIZE(ctrls));
1213 ap1302_remove(client);
1217 for (i = 0; i < ARRAY_SIZE(ctrls); i++)
1218 v4l2_ctrl_new_custom(&dev->ctrl_handler, &ctrls[i], NULL);
1220 if (dev->ctrl_handler.error) {
1221 ap1302_remove(client);
1222 return dev->ctrl_handler.error;
1225 /* Use same lock for controls as for everything else. */
1226 dev->ctrl_handler.lock = &dev->input_lock;
1227 dev->sd.ctrl_handler = &dev->ctrl_handler;
1228 v4l2_ctrl_handler_setup(&dev->ctrl_handler);
1230 dev->run_mode = v4l2_ctrl_find(&dev->ctrl_handler, V4L2_CID_RUN_MODE);
1231 v4l2_ctrl_s_ctrl(dev->run_mode, ATOMISP_RUN_MODE_PREVIEW);
1233 ret = media_entity_pads_init(&dev->sd.entity, 1, &dev->pad);
1235 ap1302_remove(client);
1238 v4l2_device_unregister_subdev(&dev->sd);
1242 static const struct i2c_device_id ap1302_id[] = {
1246 MODULE_DEVICE_TABLE(i2c, ap1302_id);
1248 static struct i2c_driver ap1302_driver = {
1250 .name = AP1302_NAME,
1252 .probe = ap1302_probe,
1253 .remove = ap1302_remove,
1254 .id_table = ap1302_id,
1257 module_i2c_driver(ap1302_driver);
1259 MODULE_AUTHOR("Tianshu Qiu <tian.shu.qiu@intel.com>");
1260 MODULE_DESCRIPTION("AP1302 Driver");
1261 MODULE_LICENSE("GPL");