Lines Matching refs:sc500ai

146 struct sc500ai {  struct
181 #define to_sc500ai(sd) container_of(sd, struct sc500ai, subdev) argument
560 struct sc500ai *sc500ai = to_sc500ai(sd); in sc500ai_set_fmt() local
565 mutex_lock(&sc500ai->mutex); in sc500ai_set_fmt()
576 mutex_unlock(&sc500ai->mutex); in sc500ai_set_fmt()
580 sc500ai->cur_mode = mode; in sc500ai_set_fmt()
583 __v4l2_ctrl_modify_range(sc500ai->hblank, h_blank, in sc500ai_set_fmt()
586 __v4l2_ctrl_modify_range(sc500ai->vblank, vblank_def, in sc500ai_set_fmt()
590 __v4l2_ctrl_s_ctrl(sc500ai->link_freq, mode->mipi_freq_idx); in sc500ai_set_fmt()
592 __v4l2_ctrl_s_ctrl_int64(sc500ai->pixel_rate, pixel_rate); in sc500ai_set_fmt()
593 sc500ai->cur_fps = mode->max_fps; in sc500ai_set_fmt()
594 sc500ai->cur_vts = mode->vts_def; in sc500ai_set_fmt()
597 mutex_unlock(&sc500ai->mutex); in sc500ai_set_fmt()
606 struct sc500ai *sc500ai = to_sc500ai(sd); in sc500ai_get_fmt() local
607 const struct sc500ai_mode *mode = sc500ai->cur_mode; in sc500ai_get_fmt()
609 mutex_lock(&sc500ai->mutex); in sc500ai_get_fmt()
614 mutex_unlock(&sc500ai->mutex); in sc500ai_get_fmt()
628 mutex_unlock(&sc500ai->mutex); in sc500ai_get_fmt()
637 struct sc500ai *sc500ai = to_sc500ai(sd); in sc500ai_enum_mbus_code() local
641 code->code = sc500ai->cur_mode->bus_fmt; in sc500ai_enum_mbus_code()
667 struct sc500ai *sc500ai = to_sc500ai(sd); in sc500ai_g_frame_interval() local
668 const struct sc500ai_mode *mode = sc500ai->cur_mode; in sc500ai_g_frame_interval()
670 if (sc500ai->streaming) in sc500ai_g_frame_interval()
671 fi->interval = sc500ai->cur_fps; in sc500ai_g_frame_interval()
681 struct sc500ai *sc500ai = to_sc500ai(sd); in sc500ai_g_mbus_config() local
682 const struct sc500ai_mode *mode = sc500ai->cur_mode; in sc500ai_g_mbus_config()
698 static void sc500ai_get_module_inf(struct sc500ai *sc500ai, in sc500ai_get_module_inf() argument
703 strlcpy(inf->base.module, sc500ai->module_name, in sc500ai_get_module_inf()
705 strlcpy(inf->base.lens, sc500ai->len_name, sizeof(inf->base.lens)); in sc500ai_get_module_inf()
708 static int sc500ai_set_hightemp_dpc(struct sc500ai *sc500ai, u32 total_gain) in sc500ai_set_hightemp_dpc() argument
712 ret = sc500ai_write_reg(sc500ai->client, 0x5799, SC500AI_REG_VALUE_08BIT, 0x00); in sc500ai_set_hightemp_dpc()
714 ret = sc500ai_write_reg(sc500ai->client, 0x5799, SC500AI_REG_VALUE_08BIT, 0x07); in sc500ai_set_hightemp_dpc()
798 static int sc500ai_set_hdrae(struct sc500ai *sc500ai, in sc500ai_set_hdrae() argument
807 if (!sc500ai->has_init_exp && !sc500ai->streaming) { in sc500ai_set_hdrae()
808 sc500ai->init_hdrae_exp = *ae; in sc500ai_set_hdrae()
809 sc500ai->has_init_exp = true; in sc500ai_set_hdrae()
810 dev_dbg(&sc500ai->client->dev, "sc500ai don't stream, record exp for hdr!\n"); in sc500ai_set_hdrae()
820 dev_dbg(&sc500ai->client->dev, in sc500ai_set_hdrae()
825 if (sc500ai->cur_mode->hdr_mode == HDR_X2) { in sc500ai_set_hdrae()
835 dev_err(&sc500ai->client->dev, in sc500ai_set_hdrae()
840 dev_err(&sc500ai->client->dev, in sc500ai_set_hdrae()
845 ret |= sc500ai_write_reg(sc500ai->client, in sc500ai_set_hdrae()
849 ret |= sc500ai_write_reg(sc500ai->client, in sc500ai_set_hdrae()
853 ret |= sc500ai_write_reg(sc500ai->client, in sc500ai_set_hdrae()
857 ret |= sc500ai_write_reg(sc500ai->client, in sc500ai_set_hdrae()
861 ret |= sc500ai_write_reg(sc500ai->client, in sc500ai_set_hdrae()
865 ret |= sc500ai_write_reg(sc500ai->client, in sc500ai_set_hdrae()
874 ret |= sc500ai_write_reg(sc500ai->client, in sc500ai_set_hdrae()
878 ret |= sc500ai_write_reg(sc500ai->client, in sc500ai_set_hdrae()
882 ret |= sc500ai_write_reg(sc500ai->client, in sc500ai_set_hdrae()
886 ret |= sc500ai_write_reg(sc500ai->client, in sc500ai_set_hdrae()
891 ret |= sc500ai_write_reg(sc500ai->client, in sc500ai_set_hdrae()
895 ret |= sc500ai_write_reg(sc500ai->client, in sc500ai_set_hdrae()
899 ret |= sc500ai_write_reg(sc500ai->client, in sc500ai_set_hdrae()
903 ret |= sc500ai_write_reg(sc500ai->client, in sc500ai_set_hdrae()
907 sc500ai_set_hightemp_dpc(sc500ai, s_t_gain); in sc500ai_set_hdrae()
911 static int sc500ai_get_channel_info(struct sc500ai *sc500ai, struct rkmodule_channel_info *ch_info) in sc500ai_get_channel_info() argument
915 ch_info->vc = sc500ai->cur_mode->vc[ch_info->index]; in sc500ai_get_channel_info()
916 ch_info->width = sc500ai->cur_mode->width; in sc500ai_get_channel_info()
917 ch_info->height = sc500ai->cur_mode->height; in sc500ai_get_channel_info()
918 ch_info->bus_fmt = sc500ai->cur_mode->bus_fmt; in sc500ai_get_channel_info()
924 struct sc500ai *sc500ai = to_sc500ai(sd); in sc500ai_ioctl() local
936 sc500ai_get_module_inf(sc500ai, (struct rkmodule_inf *)arg); in sc500ai_ioctl()
941 hdr->hdr_mode = sc500ai->cur_mode->hdr_mode; in sc500ai_ioctl()
945 w = sc500ai->cur_mode->width; in sc500ai_ioctl()
946 h = sc500ai->cur_mode->height; in sc500ai_ioctl()
951 sc500ai->cur_mode = &supported_modes[i]; in sc500ai_ioctl()
956 dev_err(&sc500ai->client->dev, in sc500ai_ioctl()
961 mode = sc500ai->cur_mode; in sc500ai_ioctl()
962 w = sc500ai->cur_mode->hts_def - sc500ai->cur_mode->width; in sc500ai_ioctl()
963 h = sc500ai->cur_mode->vts_def - sc500ai->cur_mode->height; in sc500ai_ioctl()
964 __v4l2_ctrl_modify_range(sc500ai->hblank, w, w, 1, w); in sc500ai_ioctl()
965 __v4l2_ctrl_modify_range(sc500ai->vblank, h, in sc500ai_ioctl()
966 SC500AI_VTS_MAX - sc500ai->cur_mode->height, 1, h); in sc500ai_ioctl()
968 __v4l2_ctrl_s_ctrl(sc500ai->link_freq, mode->mipi_freq_idx); in sc500ai_ioctl()
970 __v4l2_ctrl_s_ctrl_int64(sc500ai->pixel_rate, pixel_rate); in sc500ai_ioctl()
971 sc500ai->cur_fps = mode->max_fps; in sc500ai_ioctl()
972 sc500ai->cur_vts = mode->vts_def; in sc500ai_ioctl()
973 dev_info(&sc500ai->client->dev, "sensor mode: %d\n", sc500ai->cur_mode->hdr_mode); in sc500ai_ioctl()
977 if (sc500ai->cur_mode->hdr_mode == HDR_X2) in sc500ai_ioctl()
978 ret = sc500ai_set_hdrae(sc500ai, arg); in sc500ai_ioctl()
983 ret = sc500ai_write_reg(sc500ai->client, SC500AI_REG_CTRL_MODE, in sc500ai_ioctl()
986 ret = sc500ai_write_reg(sc500ai->client, SC500AI_REG_CTRL_MODE, in sc500ai_ioctl()
991 ret = sc500ai_get_channel_info(sc500ai, ch_info); in sc500ai_ioctl()
1100 static int __sc500ai_start_stream(struct sc500ai *sc500ai) in __sc500ai_start_stream() argument
1104 ret = sc500ai_write_array(sc500ai->client, sc500ai->cur_mode->reg_list); in __sc500ai_start_stream()
1109 ret = __v4l2_ctrl_handler_setup(&sc500ai->ctrl_handler); in __sc500ai_start_stream()
1112 if (sc500ai->has_init_exp && sc500ai->cur_mode->hdr_mode != NO_HDR) { in __sc500ai_start_stream()
1113 ret = sc500ai_ioctl(&sc500ai->subdev, PREISP_CMD_SET_HDRAE_EXP, in __sc500ai_start_stream()
1114 &sc500ai->init_hdrae_exp); in __sc500ai_start_stream()
1116 dev_err(&sc500ai->client->dev, in __sc500ai_start_stream()
1122 return sc500ai_write_reg(sc500ai->client, SC500AI_REG_CTRL_MODE, in __sc500ai_start_stream()
1126 static int __sc500ai_stop_stream(struct sc500ai *sc500ai) in __sc500ai_stop_stream() argument
1128 sc500ai->has_init_exp = false; in __sc500ai_stop_stream()
1129 return sc500ai_write_reg(sc500ai->client, SC500AI_REG_CTRL_MODE, in __sc500ai_stop_stream()
1135 struct sc500ai *sc500ai = to_sc500ai(sd); in sc500ai_s_stream() local
1136 struct i2c_client *client = sc500ai->client; in sc500ai_s_stream()
1139 mutex_lock(&sc500ai->mutex); in sc500ai_s_stream()
1141 if (on == sc500ai->streaming) in sc500ai_s_stream()
1151 ret = __sc500ai_start_stream(sc500ai); in sc500ai_s_stream()
1158 __sc500ai_stop_stream(sc500ai); in sc500ai_s_stream()
1162 sc500ai->streaming = on; in sc500ai_s_stream()
1165 mutex_unlock(&sc500ai->mutex); in sc500ai_s_stream()
1172 struct sc500ai *sc500ai = to_sc500ai(sd); in sc500ai_s_power() local
1173 struct i2c_client *client = sc500ai->client; in sc500ai_s_power()
1176 mutex_lock(&sc500ai->mutex); in sc500ai_s_power()
1179 if (sc500ai->power_on == !!on) in sc500ai_s_power()
1189 ret |= sc500ai_write_reg(sc500ai->client, in sc500ai_s_power()
1195 sc500ai->power_on = true; in sc500ai_s_power()
1198 sc500ai->power_on = false; in sc500ai_s_power()
1202 mutex_unlock(&sc500ai->mutex); in sc500ai_s_power()
1207 static int __sc500ai_power_on(struct sc500ai *sc500ai) in __sc500ai_power_on() argument
1210 struct device *dev = &sc500ai->client->dev; in __sc500ai_power_on()
1212 if (!IS_ERR_OR_NULL(sc500ai->pins_default)) { in __sc500ai_power_on()
1213 ret = pinctrl_select_state(sc500ai->pinctrl, in __sc500ai_power_on()
1214 sc500ai->pins_default); in __sc500ai_power_on()
1218 ret = clk_set_rate(sc500ai->xvclk, SC500AI_XVCLK_FREQ); in __sc500ai_power_on()
1221 if (clk_get_rate(sc500ai->xvclk) != SC500AI_XVCLK_FREQ) in __sc500ai_power_on()
1223 ret = clk_prepare_enable(sc500ai->xvclk); in __sc500ai_power_on()
1228 if (!IS_ERR(sc500ai->reset_gpio)) in __sc500ai_power_on()
1229 gpiod_set_value_cansleep(sc500ai->reset_gpio, 0); in __sc500ai_power_on()
1231 ret = regulator_bulk_enable(sc500ai_NUM_SUPPLIES, sc500ai->supplies); in __sc500ai_power_on()
1237 if (!IS_ERR(sc500ai->reset_gpio)) in __sc500ai_power_on()
1238 gpiod_set_value_cansleep(sc500ai->reset_gpio, 1); in __sc500ai_power_on()
1241 if (!IS_ERR(sc500ai->pwdn_gpio)) in __sc500ai_power_on()
1242 gpiod_set_value_cansleep(sc500ai->pwdn_gpio, 1); in __sc500ai_power_on()
1248 clk_disable_unprepare(sc500ai->xvclk); in __sc500ai_power_on()
1253 static void __sc500ai_power_off(struct sc500ai *sc500ai) in __sc500ai_power_off() argument
1256 struct device *dev = &sc500ai->client->dev; in __sc500ai_power_off()
1258 if (!IS_ERR(sc500ai->pwdn_gpio)) in __sc500ai_power_off()
1259 gpiod_set_value_cansleep(sc500ai->pwdn_gpio, 0); in __sc500ai_power_off()
1260 clk_disable_unprepare(sc500ai->xvclk); in __sc500ai_power_off()
1261 if (!IS_ERR(sc500ai->reset_gpio)) in __sc500ai_power_off()
1262 gpiod_set_value_cansleep(sc500ai->reset_gpio, 0); in __sc500ai_power_off()
1263 if (!IS_ERR_OR_NULL(sc500ai->pins_sleep)) { in __sc500ai_power_off()
1264 ret = pinctrl_select_state(sc500ai->pinctrl, in __sc500ai_power_off()
1265 sc500ai->pins_sleep); in __sc500ai_power_off()
1269 regulator_bulk_disable(sc500ai_NUM_SUPPLIES, sc500ai->supplies); in __sc500ai_power_off()
1276 struct sc500ai *sc500ai = to_sc500ai(sd); in sc500ai_runtime_resume() local
1278 return __sc500ai_power_on(sc500ai); in sc500ai_runtime_resume()
1285 struct sc500ai *sc500ai = to_sc500ai(sd); in sc500ai_runtime_suspend() local
1287 __sc500ai_power_off(sc500ai); in sc500ai_runtime_suspend()
1295 struct sc500ai *sc500ai = to_sc500ai(sd); in sc500ai_open() local
1300 mutex_lock(&sc500ai->mutex); in sc500ai_open()
1307 mutex_unlock(&sc500ai->mutex); in sc500ai_open()
1395 static void sc500ai_modify_fps_info(struct sc500ai *sc500ai) in sc500ai_modify_fps_info() argument
1397 const struct sc500ai_mode *mode = sc500ai->cur_mode; in sc500ai_modify_fps_info()
1399 sc500ai->cur_fps.denominator = mode->max_fps.denominator * mode->vts_def / in sc500ai_modify_fps_info()
1400 sc500ai->cur_vts; in sc500ai_modify_fps_info()
1405 struct sc500ai *sc500ai = container_of(ctrl->handler, in sc500ai_set_ctrl() local
1406 struct sc500ai, ctrl_handler); in sc500ai_set_ctrl()
1407 struct i2c_client *client = sc500ai->client; in sc500ai_set_ctrl()
1422 max = sc500ai->cur_mode->height + ctrl->val - 5; in sc500ai_set_ctrl()
1423 __v4l2_ctrl_modify_range(sc500ai->exposure, in sc500ai_set_ctrl()
1424 sc500ai->exposure->minimum, max, in sc500ai_set_ctrl()
1425 sc500ai->exposure->step, in sc500ai_set_ctrl()
1426 sc500ai->exposure->default_value); in sc500ai_set_ctrl()
1435 if (sc500ai->cur_mode->hdr_mode != NO_HDR) in sc500ai_set_ctrl()
1438 ret = sc500ai_write_reg(sc500ai->client, in sc500ai_set_ctrl()
1442 ret |= sc500ai_write_reg(sc500ai->client, in sc500ai_set_ctrl()
1446 ret |= sc500ai_write_reg(sc500ai->client, in sc500ai_set_ctrl()
1454 if (sc500ai->cur_mode->hdr_mode != NO_HDR) in sc500ai_set_ctrl()
1458 ret = sc500ai_write_reg(sc500ai->client, in sc500ai_set_ctrl()
1462 ret |= sc500ai_write_reg(sc500ai->client, in sc500ai_set_ctrl()
1466 ret |= sc500ai_write_reg(sc500ai->client, in sc500ai_set_ctrl()
1470 ret |= sc500ai_write_reg(sc500ai->client, in sc500ai_set_ctrl()
1474 sc500ai_set_hightemp_dpc(sc500ai, ctrl->val); in sc500ai_set_ctrl()
1476 dev_dbg(&sc500ai->client->dev, in sc500ai_set_ctrl()
1481 vts = ctrl->val + sc500ai->cur_mode->height; in sc500ai_set_ctrl()
1482 ret = sc500ai_write_reg(sc500ai->client, in sc500ai_set_ctrl()
1486 ret |= sc500ai_write_reg(sc500ai->client, in sc500ai_set_ctrl()
1491 sc500ai->cur_vts = vts; in sc500ai_set_ctrl()
1492 sc500ai_modify_fps_info(sc500ai); in sc500ai_set_ctrl()
1495 ret = sc500ai_read_reg(sc500ai->client, SC500AI_FLIP_MIRROR_REG, in sc500ai_set_ctrl()
1503 ret |= sc500ai_write_reg(sc500ai->client, SC500AI_FLIP_MIRROR_REG, in sc500ai_set_ctrl()
1507 ret = sc500ai_read_reg(sc500ai->client, in sc500ai_set_ctrl()
1512 denominator = sc500ai->cur_mode->max_fps.denominator; in sc500ai_set_ctrl()
1513 numerator = sc500ai->cur_mode->max_fps.numerator; in sc500ai_set_ctrl()
1515 cur_fps = def_fps * sc500ai->cur_mode->vts_def / sc500ai->cur_vts; in sc500ai_set_ctrl()
1517 vts = def_fps * sc500ai->cur_mode->vts_def / 25; in sc500ai_set_ctrl()
1518 ret = sc500ai_write_reg(sc500ai->client, in sc500ai_set_ctrl()
1522 ret |= sc500ai_write_reg(sc500ai->client, in sc500ai_set_ctrl()
1536 ret |= sc500ai_write_reg(sc500ai->client, in sc500ai_set_ctrl()
1542 vts = sc500ai->cur_vts; in sc500ai_set_ctrl()
1543 ret = sc500ai_write_reg(sc500ai->client, in sc500ai_set_ctrl()
1547 ret |= sc500ai_write_reg(sc500ai->client, in sc500ai_set_ctrl()
1569 static int sc500ai_initialize_controls(struct sc500ai *sc500ai) in sc500ai_initialize_controls() argument
1578 handler = &sc500ai->ctrl_handler; in sc500ai_initialize_controls()
1579 mode = sc500ai->cur_mode; in sc500ai_initialize_controls()
1583 handler->lock = &sc500ai->mutex; in sc500ai_initialize_controls()
1585 sc500ai->link_freq = v4l2_ctrl_new_int_menu(handler, NULL, in sc500ai_initialize_controls()
1589 __v4l2_ctrl_s_ctrl(sc500ai->link_freq, mode->mipi_freq_idx); in sc500ai_initialize_controls()
1593 sc500ai->pixel_rate = v4l2_ctrl_new_std(handler, NULL, in sc500ai_initialize_controls()
1598 sc500ai->hblank = v4l2_ctrl_new_std(handler, NULL, V4L2_CID_HBLANK, in sc500ai_initialize_controls()
1600 if (sc500ai->hblank) in sc500ai_initialize_controls()
1601 sc500ai->hblank->flags |= V4L2_CTRL_FLAG_READ_ONLY; in sc500ai_initialize_controls()
1604 sc500ai->cur_vts = mode->vts_def; in sc500ai_initialize_controls()
1605 sc500ai->cur_fps = mode->max_fps; in sc500ai_initialize_controls()
1606 sc500ai->vblank = v4l2_ctrl_new_std(handler, &sc500ai_ctrl_ops, in sc500ai_initialize_controls()
1611 sc500ai->exposure = v4l2_ctrl_new_std(handler, &sc500ai_ctrl_ops, in sc500ai_initialize_controls()
1616 sc500ai->anal_gain = v4l2_ctrl_new_std(handler, &sc500ai_ctrl_ops, in sc500ai_initialize_controls()
1629 dev_err(&sc500ai->client->dev, in sc500ai_initialize_controls()
1633 sc500ai->subdev.ctrl_handler = handler; in sc500ai_initialize_controls()
1634 sc500ai->has_init_exp = false; in sc500ai_initialize_controls()
1643 static int sc500ai_check_sensor_id(struct sc500ai *sc500ai, in sc500ai_check_sensor_id() argument
1646 struct device *dev = &sc500ai->client->dev; in sc500ai_check_sensor_id()
1662 static int sc500ai_configure_regulators(struct sc500ai *sc500ai) in sc500ai_configure_regulators() argument
1667 sc500ai->supplies[i].supply = sc500ai_supply_names[i]; in sc500ai_configure_regulators()
1669 return devm_regulator_bulk_get(&sc500ai->client->dev, in sc500ai_configure_regulators()
1671 sc500ai->supplies); in sc500ai_configure_regulators()
1679 struct sc500ai *sc500ai; in sc500ai_probe() local
1690 sc500ai = devm_kzalloc(dev, sizeof(*sc500ai), GFP_KERNEL); in sc500ai_probe()
1691 if (!sc500ai) in sc500ai_probe()
1696 &sc500ai->module_index); in sc500ai_probe()
1698 &sc500ai->module_facing); in sc500ai_probe()
1700 &sc500ai->module_name); in sc500ai_probe()
1702 &sc500ai->len_name); in sc500ai_probe()
1708 sc500ai->client = client; in sc500ai_probe()
1711 sc500ai->cur_mode = &supported_modes[i]; in sc500ai_probe()
1716 sc500ai->cur_mode = &supported_modes[0]; in sc500ai_probe()
1718 sc500ai->xvclk = devm_clk_get(dev, "xvclk"); in sc500ai_probe()
1719 if (IS_ERR(sc500ai->xvclk)) { in sc500ai_probe()
1724 sc500ai->reset_gpio = devm_gpiod_get(dev, "reset", GPIOD_OUT_LOW); in sc500ai_probe()
1725 if (IS_ERR(sc500ai->reset_gpio)) in sc500ai_probe()
1728 sc500ai->pwdn_gpio = devm_gpiod_get(dev, "pwdn", GPIOD_OUT_LOW); in sc500ai_probe()
1729 if (IS_ERR(sc500ai->pwdn_gpio)) in sc500ai_probe()
1732 sc500ai->pinctrl = devm_pinctrl_get(dev); in sc500ai_probe()
1733 if (!IS_ERR(sc500ai->pinctrl)) { in sc500ai_probe()
1734 sc500ai->pins_default = in sc500ai_probe()
1735 pinctrl_lookup_state(sc500ai->pinctrl, in sc500ai_probe()
1737 if (IS_ERR(sc500ai->pins_default)) in sc500ai_probe()
1740 sc500ai->pins_sleep = in sc500ai_probe()
1741 pinctrl_lookup_state(sc500ai->pinctrl, in sc500ai_probe()
1743 if (IS_ERR(sc500ai->pins_sleep)) in sc500ai_probe()
1749 ret = sc500ai_configure_regulators(sc500ai); in sc500ai_probe()
1755 mutex_init(&sc500ai->mutex); in sc500ai_probe()
1757 sd = &sc500ai->subdev; in sc500ai_probe()
1759 ret = sc500ai_initialize_controls(sc500ai); in sc500ai_probe()
1763 ret = __sc500ai_power_on(sc500ai); in sc500ai_probe()
1767 ret = sc500ai_check_sensor_id(sc500ai, client); in sc500ai_probe()
1777 sc500ai->pad.flags = MEDIA_PAD_FL_SOURCE; in sc500ai_probe()
1779 ret = media_entity_pads_init(&sd->entity, 1, &sc500ai->pad); in sc500ai_probe()
1785 if (strcmp(sc500ai->module_facing, "back") == 0) in sc500ai_probe()
1791 sc500ai->module_index, facing, in sc500ai_probe()
1810 __sc500ai_power_off(sc500ai); in sc500ai_probe()
1812 v4l2_ctrl_handler_free(&sc500ai->ctrl_handler); in sc500ai_probe()
1814 mutex_destroy(&sc500ai->mutex); in sc500ai_probe()
1822 struct sc500ai *sc500ai = to_sc500ai(sd); in sc500ai_remove() local
1828 v4l2_ctrl_handler_free(&sc500ai->ctrl_handler); in sc500ai_remove()
1829 mutex_destroy(&sc500ai->mutex); in sc500ai_remove()
1833 __sc500ai_power_off(sc500ai); in sc500ai_remove()