• Home
  • Raw
  • Download

Lines Matching +full:stby +full:- +full:gpios

29 #include <media/media-entity.h>
31 #include <media/v4l2-ctrls.h>
32 #include <media/v4l2-device.h>
33 #include <media/v4l2-mediabus.h>
34 #include <media/v4l2-subdev.h>
110 * H/W register Interface (0xd0000000 - 0xd0000fff)
160 /* By default value, output from sensor will be YUV422 0-255 */
179 STBY, enumerator
212 msg[0].addr = client->addr; in s5k4ecgx_i2c_read()
217 msg[1].addr = client->addr; in s5k4ecgx_i2c_read()
222 ret = i2c_transfer(client->adapter, msg, 2); in s5k4ecgx_i2c_read()
267 dev_err(&client->dev, "Failed to execute read command\n"); in s5k4ecgx_read()
281 return -ENODEV; in s5k4ecgx_read_fw_ver()
324 * < record 0 >, ..., < record N - 1 >, < CRC32-CCITT (4-bytes) >,
325 * where "record" is a 4-byte register address followed by 2-byte
328 * git://git.linaro.org/people/sangwook/fimc-v4l2-app.git
339 err = request_firmware(&fw, S5K4ECGX_FIRMWARE, sd->v4l2_dev->dev); in s5k4ecgx_load_firmware()
344 regs_num = get_unaligned_le32(fw->data); in s5k4ecgx_load_firmware()
347 S5K4ECGX_FIRMWARE, fw->size, regs_num); in s5k4ecgx_load_firmware()
350 if (fw->size != regs_num * FW_RECORD_SIZE + FW_CRC_SIZE) { in s5k4ecgx_load_firmware()
351 err = -EINVAL; in s5k4ecgx_load_firmware()
354 crc_file = get_unaligned_le32(fw->data + regs_num * FW_RECORD_SIZE); in s5k4ecgx_load_firmware()
355 crc = crc32_le(~0, fw->data, regs_num * FW_RECORD_SIZE); in s5k4ecgx_load_firmware()
358 err = -EINVAL; in s5k4ecgx_load_firmware()
361 ptr = fw->data + FW_RECORD_SIZE; in s5k4ecgx_load_firmware()
367 if (addr - addr_inc != 2) in s5k4ecgx_load_firmware()
386 ret = s5k4ecgx_write(c, REG_G_PREV_IN_WIDTH, r->width); in s5k4ecgx_set_input_window()
388 ret = s5k4ecgx_write(c, REG_G_PREV_IN_HEIGHT, r->height); in s5k4ecgx_set_input_window()
390 ret = s5k4ecgx_write(c, REG_G_PREV_IN_XOFFS, r->left); in s5k4ecgx_set_input_window()
392 ret = s5k4ecgx_write(c, REG_G_PREV_IN_YOFFS, r->top); in s5k4ecgx_set_input_window()
394 ret = s5k4ecgx_write(c, REG_G_CAP_IN_WIDTH, r->width); in s5k4ecgx_set_input_window()
396 ret = s5k4ecgx_write(c, REG_G_CAP_IN_HEIGHT, r->height); in s5k4ecgx_set_input_window()
398 ret = s5k4ecgx_write(c, REG_G_CAP_IN_XOFFS, r->left); in s5k4ecgx_set_input_window()
400 ret = s5k4ecgx_write(c, REG_G_CAP_IN_YOFFS, r->top); in s5k4ecgx_set_input_window()
411 ret = s5k4ecgx_write(c, REG_G_PREVZOOM_IN_WIDTH, r->width); in s5k4ecgx_set_zoom_window()
413 ret = s5k4ecgx_write(c, REG_G_PREVZOOM_IN_HEIGHT, r->height); in s5k4ecgx_set_zoom_window()
415 ret = s5k4ecgx_write(c, REG_G_PREVZOOM_IN_XOFFS, r->left); in s5k4ecgx_set_zoom_window()
417 ret = s5k4ecgx_write(c, REG_G_PREVZOOM_IN_YOFFS, r->top); in s5k4ecgx_set_zoom_window()
419 ret = s5k4ecgx_write(c, REG_G_CAPZOOM_IN_WIDTH, r->width); in s5k4ecgx_set_zoom_window()
421 ret = s5k4ecgx_write(c, REG_G_CAPZOOM_IN_HEIGHT, r->height); in s5k4ecgx_set_zoom_window()
423 ret = s5k4ecgx_write(c, REG_G_CAPZOOM_IN_XOFFS, r->left); in s5k4ecgx_set_zoom_window()
425 ret = s5k4ecgx_write(c, REG_G_CAPZOOM_IN_YOFFS, r->top); in s5k4ecgx_set_zoom_window()
432 struct i2c_client *client = v4l2_get_subdevdata(&priv->sd); in s5k4ecgx_set_output_framefmt()
436 priv->curr_frmsize->size.width); in s5k4ecgx_set_output_framefmt()
439 priv->curr_frmsize->size.height); in s5k4ecgx_set_output_framefmt()
442 priv->curr_pixfmt->reg_p_format); in s5k4ecgx_set_output_framefmt()
465 if (!gpio_is_valid(priv->gpio[id].gpio)) in s5k4ecgx_gpio_set_value()
467 gpio_set_value(priv->gpio[id].gpio, val); in s5k4ecgx_gpio_set_value()
476 ret = regulator_bulk_enable(S5K4ECGX_NUM_SUPPLIES, priv->supplies); in __s5k4ecgx_power_on()
481 /* The polarity of STBY is controlled by TSP */ in __s5k4ecgx_power_on()
482 if (s5k4ecgx_gpio_set_value(priv, STBY, priv->gpio[STBY].level)) in __s5k4ecgx_power_on()
485 if (s5k4ecgx_gpio_set_value(priv, RST, priv->gpio[RST].level)) in __s5k4ecgx_power_on()
493 if (s5k4ecgx_gpio_set_value(priv, RST, !priv->gpio[RST].level)) in __s5k4ecgx_power_off()
496 if (s5k4ecgx_gpio_set_value(priv, STBY, !priv->gpio[STBY].level)) in __s5k4ecgx_power_off()
499 priv->streaming = 0; in __s5k4ecgx_power_off()
501 return regulator_bulk_disable(S5K4ECGX_NUM_SUPPLIES, priv->supplies); in __s5k4ecgx_power_off()
513 while (i--) { in s5k4ecgx_try_frame_size()
514 int err = abs(fsize->size.width - mf->width) in s5k4ecgx_try_frame_size()
515 + abs(fsize->size.height - mf->height); in s5k4ecgx_try_frame_size()
523 mf->width = match->size.width; in s5k4ecgx_try_frame_size()
524 mf->height = match->size.height; in s5k4ecgx_try_frame_size()
530 return -EINVAL; in s5k4ecgx_try_frame_size()
537 if (code->index >= ARRAY_SIZE(s5k4ecgx_formats)) in s5k4ecgx_enum_mbus_code()
538 return -EINVAL; in s5k4ecgx_enum_mbus_code()
539 code->code = s5k4ecgx_formats[code->index].code; in s5k4ecgx_enum_mbus_code()
550 if (fmt->which == V4L2_SUBDEV_FORMAT_TRY) { in s5k4ecgx_get_fmt()
553 fmt->format = *mf; in s5k4ecgx_get_fmt()
558 mf = &fmt->format; in s5k4ecgx_get_fmt()
560 mutex_lock(&priv->lock); in s5k4ecgx_get_fmt()
561 mf->width = priv->curr_frmsize->size.width; in s5k4ecgx_get_fmt()
562 mf->height = priv->curr_frmsize->size.height; in s5k4ecgx_get_fmt()
563 mf->code = priv->curr_pixfmt->code; in s5k4ecgx_get_fmt()
564 mf->colorspace = priv->curr_pixfmt->colorspace; in s5k4ecgx_get_fmt()
565 mf->field = V4L2_FIELD_NONE; in s5k4ecgx_get_fmt()
566 mutex_unlock(&priv->lock); in s5k4ecgx_get_fmt()
576 while (--i) in s5k4ecgx_try_fmt()
577 if (mf->code == s5k4ecgx_formats[i].code) in s5k4ecgx_try_fmt()
579 mf->code = s5k4ecgx_formats[i].code; in s5k4ecgx_try_fmt()
593 pf = s5k4ecgx_try_fmt(sd, &fmt->format); in s5k4ecgx_set_fmt()
594 s5k4ecgx_try_frame_size(&fmt->format, &fsize); in s5k4ecgx_set_fmt()
595 fmt->format.colorspace = V4L2_COLORSPACE_JPEG; in s5k4ecgx_set_fmt()
596 fmt->format.field = V4L2_FIELD_NONE; in s5k4ecgx_set_fmt()
598 if (fmt->which == V4L2_SUBDEV_FORMAT_TRY) { in s5k4ecgx_set_fmt()
601 *mf = fmt->format; in s5k4ecgx_set_fmt()
606 mutex_lock(&priv->lock); in s5k4ecgx_set_fmt()
607 if (!priv->streaming) { in s5k4ecgx_set_fmt()
608 priv->curr_frmsize = fsize; in s5k4ecgx_set_fmt()
609 priv->curr_pixfmt = pf; in s5k4ecgx_set_fmt()
610 priv->set_params = 1; in s5k4ecgx_set_fmt()
612 ret = -EBUSY; in s5k4ecgx_set_fmt()
614 mutex_unlock(&priv->lock); in s5k4ecgx_set_fmt()
630 struct v4l2_subdev *sd = &container_of(ctrl->handler, struct s5k4ecgx, in s5k4ecgx_s_ctrl()
631 handler)->sd; in s5k4ecgx_s_ctrl()
637 v4l2_dbg(1, debug, sd, "ctrl: 0x%x, value: %d\n", ctrl->id, ctrl->val); in s5k4ecgx_s_ctrl()
639 mutex_lock(&priv->lock); in s5k4ecgx_s_ctrl()
640 switch (ctrl->id) { in s5k4ecgx_s_ctrl()
642 err = s5k4ecgx_write(client, REG_USER_CONTRAST, ctrl->val); in s5k4ecgx_s_ctrl()
646 err = s5k4ecgx_write(client, REG_USER_SATURATION, ctrl->val); in s5k4ecgx_s_ctrl()
653 ctrl->val * SHARPNESS_DIV); in s5k4ecgx_s_ctrl()
657 err = s5k4ecgx_write(client, REG_USER_BRIGHTNESS, ctrl->val); in s5k4ecgx_s_ctrl()
660 mutex_unlock(&priv->lock); in s5k4ecgx_s_ctrl()
679 mutex_lock(&priv->lock); in s5k4ecgx_registered()
685 mutex_unlock(&priv->lock); in s5k4ecgx_registered()
695 struct v4l2_mbus_framefmt *mf = v4l2_subdev_get_try_format(sd, fh->pad, 0); in s5k4ecgx_open()
697 mf->width = s5k4ecgx_prev_sizes[0].size.width; in s5k4ecgx_open()
698 mf->height = s5k4ecgx_prev_sizes[0].size.height; in s5k4ecgx_open()
699 mf->code = s5k4ecgx_formats[0].code; in s5k4ecgx_open()
700 mf->colorspace = V4L2_COLORSPACE_JPEG; in s5k4ecgx_open()
701 mf->field = V4L2_FIELD_NONE; in s5k4ecgx_open()
728 priv->set_params = 1; in s5k4ecgx_s_power()
738 v4l2_ctrl_handler_log_status(sd->ctrl_handler, sd->name); in s5k4ecgx_log_status()
750 struct i2c_client *client = v4l2_get_subdevdata(&priv->sd); in __s5k4ecgx_s_params()
751 const struct v4l2_rect *crop_rect = &priv->curr_frmsize->input_window; in __s5k4ecgx_s_params()
797 struct i2c_client *client = v4l2_get_subdevdata(&priv->sd); in __s5k4ecgx_s_stream()
800 if (on && priv->set_params) { in __s5k4ecgx_s_stream()
804 priv->set_params = 0; in __s5k4ecgx_s_stream()
823 mutex_lock(&priv->lock); in s5k4ecgx_s_stream()
825 if (priv->streaming == !on) { in s5k4ecgx_s_stream()
828 priv->streaming = on & 1; in s5k4ecgx_s_stream()
831 mutex_unlock(&priv->lock); in s5k4ecgx_s_stream()
866 for (i = 0; i < ARRAY_SIZE(priv->gpio); i++) { in s5k4ecgx_free_gpios()
867 if (!gpio_is_valid(priv->gpio[i].gpio)) in s5k4ecgx_free_gpios()
869 gpio_free(priv->gpio[i].gpio); in s5k4ecgx_free_gpios()
870 priv->gpio[i].gpio = -EINVAL; in s5k4ecgx_free_gpios()
877 const struct s5k4ecgx_gpio *gpio = &pdata->gpio_stby; in s5k4ecgx_config_gpios()
880 priv->gpio[STBY].gpio = -EINVAL; in s5k4ecgx_config_gpios()
881 priv->gpio[RST].gpio = -EINVAL; in s5k4ecgx_config_gpios()
883 ret = s5k4ecgx_config_gpio(gpio->gpio, gpio->level, "S5K4ECGX_STBY"); in s5k4ecgx_config_gpios()
889 priv->gpio[STBY] = *gpio; in s5k4ecgx_config_gpios()
890 if (gpio_is_valid(gpio->gpio)) in s5k4ecgx_config_gpios()
891 gpio_set_value(gpio->gpio, 0); in s5k4ecgx_config_gpios()
893 gpio = &pdata->gpio_reset; in s5k4ecgx_config_gpios()
895 ret = s5k4ecgx_config_gpio(gpio->gpio, gpio->level, "S5K4ECGX_RST"); in s5k4ecgx_config_gpios()
900 priv->gpio[RST] = *gpio; in s5k4ecgx_config_gpios()
901 if (gpio_is_valid(gpio->gpio)) in s5k4ecgx_config_gpios()
902 gpio_set_value(gpio->gpio, 0); in s5k4ecgx_config_gpios()
910 struct v4l2_ctrl_handler *hdl = &priv->handler; in s5k4ecgx_init_v4l2_ctrls()
917 v4l2_ctrl_new_std(hdl, ops, V4L2_CID_BRIGHTNESS, -208, 127, 1, 0); in s5k4ecgx_init_v4l2_ctrls()
918 v4l2_ctrl_new_std(hdl, ops, V4L2_CID_CONTRAST, -127, 127, 1, 0); in s5k4ecgx_init_v4l2_ctrls()
919 v4l2_ctrl_new_std(hdl, ops, V4L2_CID_SATURATION, -127, 127, 1, 0); in s5k4ecgx_init_v4l2_ctrls()
922 v4l2_ctrl_new_std(hdl, ops, V4L2_CID_SHARPNESS, -32704/SHARPNESS_DIV, in s5k4ecgx_init_v4l2_ctrls()
924 if (hdl->error) { in s5k4ecgx_init_v4l2_ctrls()
925 ret = hdl->error; in s5k4ecgx_init_v4l2_ctrls()
929 priv->sd.ctrl_handler = hdl; in s5k4ecgx_init_v4l2_ctrls()
937 struct s5k4ecgx_platform_data *pdata = client->dev.platform_data; in s5k4ecgx_probe()
943 dev_err(&client->dev, "platform data is missing!\n"); in s5k4ecgx_probe()
944 return -EINVAL; in s5k4ecgx_probe()
947 priv = devm_kzalloc(&client->dev, sizeof(struct s5k4ecgx), GFP_KERNEL); in s5k4ecgx_probe()
949 return -ENOMEM; in s5k4ecgx_probe()
951 mutex_init(&priv->lock); in s5k4ecgx_probe()
952 priv->streaming = 0; in s5k4ecgx_probe()
954 sd = &priv->sd; in s5k4ecgx_probe()
957 strlcpy(sd->name, S5K4ECGX_DRIVER_NAME, sizeof(sd->name)); in s5k4ecgx_probe()
959 sd->internal_ops = &s5k4ecgx_subdev_internal_ops; in s5k4ecgx_probe()
960 /* Support v4l2 sub-device user space API */ in s5k4ecgx_probe()
961 sd->flags |= V4L2_SUBDEV_FL_HAS_DEVNODE; in s5k4ecgx_probe()
963 priv->pad.flags = MEDIA_PAD_FL_SOURCE; in s5k4ecgx_probe()
964 sd->entity.function = MEDIA_ENT_F_CAM_SENSOR; in s5k4ecgx_probe()
965 ret = media_entity_pads_init(&sd->entity, 1, &priv->pad); in s5k4ecgx_probe()
971 dev_err(&client->dev, "Failed to set gpios\n"); in s5k4ecgx_probe()
975 priv->supplies[i].supply = s5k4ecgx_supply_names[i]; in s5k4ecgx_probe()
977 ret = devm_regulator_bulk_get(&client->dev, S5K4ECGX_NUM_SUPPLIES, in s5k4ecgx_probe()
978 priv->supplies); in s5k4ecgx_probe()
980 dev_err(&client->dev, "Failed to get regulators\n"); in s5k4ecgx_probe()
987 priv->curr_pixfmt = &s5k4ecgx_formats[0]; in s5k4ecgx_probe()
988 priv->curr_frmsize = &s5k4ecgx_prev_sizes[0]; in s5k4ecgx_probe()
995 media_entity_cleanup(&priv->sd.entity); in s5k4ecgx_probe()
1005 mutex_destroy(&priv->lock); in s5k4ecgx_remove()
1008 v4l2_ctrl_handler_free(&priv->handler); in s5k4ecgx_remove()
1009 media_entity_cleanup(&sd->entity); in s5k4ecgx_remove()
1033 MODULE_AUTHOR("Seok-Young Jang <quartz.jang@samsung.com>");