Lines Matching refs:imx577

182 struct imx577 {  struct
223 #define to_imx577(sd) container_of(sd, struct imx577, subdev) argument
1146 struct imx577 *imx577 = to_imx577(sd); in imx577_set_fmt() local
1150 u32 lane_num = imx577->bus_cfg.bus.mipi_csi2.num_data_lanes; in imx577_set_fmt()
1152 mutex_lock(&imx577->mutex); in imx577_set_fmt()
1163 mutex_unlock(&imx577->mutex); in imx577_set_fmt()
1167 imx577->cur_mode = mode; in imx577_set_fmt()
1168 imx577->cur_vts = imx577->cur_mode->vts_def; in imx577_set_fmt()
1170 __v4l2_ctrl_modify_range(imx577->hblank, h_blank, in imx577_set_fmt()
1173 __v4l2_ctrl_modify_range(imx577->vblank, vblank_def, in imx577_set_fmt()
1178 __v4l2_ctrl_s_ctrl_int64(imx577->pixel_rate, in imx577_set_fmt()
1180 __v4l2_ctrl_s_ctrl(imx577->link_freq, in imx577_set_fmt()
1184 mutex_unlock(&imx577->mutex); in imx577_set_fmt()
1193 struct imx577 *imx577 = to_imx577(sd); in imx577_get_fmt() local
1194 const struct imx577_mode *mode = imx577->cur_mode; in imx577_get_fmt()
1196 mutex_lock(&imx577->mutex); in imx577_get_fmt()
1201 mutex_unlock(&imx577->mutex); in imx577_get_fmt()
1214 mutex_unlock(&imx577->mutex); in imx577_get_fmt()
1223 struct imx577 *imx577 = to_imx577(sd); in imx577_enum_mbus_code() local
1227 code->code = imx577->cur_mode->bus_fmt; in imx577_enum_mbus_code()
1250 static int imx577_enable_test_pattern(struct imx577 *imx577, u32 pattern) in imx577_enable_test_pattern() argument
1259 return imx577_write_reg(imx577->client, in imx577_enable_test_pattern()
1268 struct imx577 *imx577 = to_imx577(sd); in imx577_g_frame_interval() local
1269 const struct imx577_mode *mode = imx577->cur_mode; in imx577_g_frame_interval()
1276 static void imx577_get_module_inf(struct imx577 *imx577, in imx577_get_module_inf() argument
1281 strscpy(inf->base.module, imx577->module_name, in imx577_get_module_inf()
1283 strscpy(inf->base.lens, imx577->len_name, sizeof(inf->base.lens)); in imx577_get_module_inf()
1286 static void imx577_set_awb_cfg(struct imx577 *imx577, in imx577_set_awb_cfg() argument
1289 mutex_lock(&imx577->mutex); in imx577_set_awb_cfg()
1290 memcpy(&imx577->awb_cfg, cfg, sizeof(*cfg)); in imx577_set_awb_cfg()
1291 mutex_unlock(&imx577->mutex); in imx577_set_awb_cfg()
1294 static void imx577_set_lsc_cfg(struct imx577 *imx577, in imx577_set_lsc_cfg() argument
1297 mutex_lock(&imx577->mutex); in imx577_set_lsc_cfg()
1298 memcpy(&imx577->lsc_cfg, cfg, sizeof(*cfg)); in imx577_set_lsc_cfg()
1299 mutex_unlock(&imx577->mutex); in imx577_set_lsc_cfg()
1302 static int imx577_set_hdrae(struct imx577 *imx577, in imx577_set_hdrae() argument
1305 struct i2c_client *client = imx577->client; in imx577_set_hdrae()
1312 if (!imx577->has_init_exp && !imx577->streaming) { in imx577_set_hdrae()
1313 imx577->init_hdrae_exp = *ae; in imx577_set_hdrae()
1314 imx577->has_init_exp = true; in imx577_set_hdrae()
1315 dev_dbg(&imx577->client->dev, "imx577 is not streaming, save hdr ae!\n"); in imx577_set_hdrae()
1329 if (imx577->cur_mode->hdr_mode == HDR_X2) { in imx577_set_hdrae()
1372 fll = imx577->cur_vts; in imx577_set_hdrae()
1431 static int imx577_get_channel_info(struct imx577 *imx577, struct rkmodule_channel_info *ch_info) in imx577_get_channel_info() argument
1435 ch_info->vc = imx577->cur_mode->vc[ch_info->index]; in imx577_get_channel_info()
1436 ch_info->width = imx577->cur_mode->width; in imx577_get_channel_info()
1437 ch_info->height = imx577->cur_mode->height; in imx577_get_channel_info()
1438 ch_info->bus_fmt = imx577->cur_mode->bus_fmt; in imx577_get_channel_info()
1445 struct imx577 *imx577 = to_imx577(sd); in imx577_ioctl() local
1453 u32 lane_num = imx577->bus_cfg.bus.mipi_csi2.num_data_lanes; in imx577_ioctl()
1457 if (imx577->cur_mode->hdr_mode == HDR_X2) in imx577_ioctl()
1458 ret = imx577_set_hdrae(imx577, arg); in imx577_ioctl()
1461 imx577_get_module_inf(imx577, (struct rkmodule_inf *)arg); in imx577_ioctl()
1466 hdr->hdr_mode = imx577->cur_mode->hdr_mode; in imx577_ioctl()
1470 w = imx577->cur_mode->width; in imx577_ioctl()
1471 h = imx577->cur_mode->height; in imx577_ioctl()
1476 imx577->cur_mode = &supported_modes[i]; in imx577_ioctl()
1481 dev_err(&imx577->client->dev, in imx577_ioctl()
1486 mode = imx577->cur_mode; in imx577_ioctl()
1487 imx577->cur_vts = mode->vts_def; in imx577_ioctl()
1490 mutex_lock(&imx577->mutex); in imx577_ioctl()
1491 __v4l2_ctrl_modify_range(imx577->hblank, w, w, 1, w); in imx577_ioctl()
1492 __v4l2_ctrl_modify_range(imx577->vblank, h, in imx577_ioctl()
1495 __v4l2_ctrl_s_ctrl(imx577->link_freq, mode->link_freq_idx); in imx577_ioctl()
1498 __v4l2_ctrl_s_ctrl_int64(imx577->pixel_rate, in imx577_ioctl()
1500 mutex_unlock(&imx577->mutex); in imx577_ioctl()
1504 imx577_set_awb_cfg(imx577, (struct rkmodule_awb_cfg *)arg); in imx577_ioctl()
1507 imx577_set_lsc_cfg(imx577, (struct rkmodule_lsc_cfg *)arg); in imx577_ioctl()
1514 ret = imx577_write_reg(imx577->client, in imx577_ioctl()
1519 ret = imx577_write_reg(imx577->client, in imx577_ioctl()
1526 ret = imx577_get_channel_info(imx577, ch_info); in imx577_ioctl()
1669 static int __imx577_start_stream(struct imx577 *imx577) in __imx577_start_stream() argument
1673 ret = imx577_write_array(imx577->client, imx577->cur_mode->reg_list); in __imx577_start_stream()
1678 ret = __v4l2_ctrl_handler_setup(&imx577->ctrl_handler); in __imx577_start_stream()
1682 if (imx577->has_init_exp && imx577->cur_mode->hdr_mode != NO_HDR) { in __imx577_start_stream()
1683 ret = imx577_ioctl(&imx577->subdev, PREISP_CMD_SET_HDRAE_EXP, in __imx577_start_stream()
1684 &imx577->init_hdrae_exp); in __imx577_start_stream()
1686 dev_err(&imx577->client->dev, in __imx577_start_stream()
1691 return imx577_write_reg(imx577->client, in __imx577_start_stream()
1697 static int __imx577_stop_stream(struct imx577 *imx577) in __imx577_stop_stream() argument
1699 imx577->has_init_exp = false; in __imx577_stop_stream()
1700 return imx577_write_reg(imx577->client, in __imx577_stop_stream()
1708 struct imx577 *imx577 = to_imx577(sd); in imx577_s_stream() local
1709 struct i2c_client *client = imx577->client; in imx577_s_stream()
1713 __func__, on, imx577->cur_mode->width, in imx577_s_stream()
1714 imx577->cur_mode->height, in imx577_s_stream()
1715 DIV_ROUND_CLOSEST(imx577->cur_mode->max_fps.denominator, in imx577_s_stream()
1716 imx577->cur_mode->max_fps.numerator), in imx577_s_stream()
1717 imx577->cur_mode->hdr_mode, imx577->cur_mode->bpp); in imx577_s_stream()
1719 mutex_lock(&imx577->mutex); in imx577_s_stream()
1721 if (on == imx577->streaming) in imx577_s_stream()
1731 ret = __imx577_start_stream(imx577); in imx577_s_stream()
1738 __imx577_stop_stream(imx577); in imx577_s_stream()
1742 imx577->streaming = on; in imx577_s_stream()
1745 mutex_unlock(&imx577->mutex); in imx577_s_stream()
1752 struct imx577 *imx577 = to_imx577(sd); in imx577_s_power() local
1753 struct i2c_client *client = imx577->client; in imx577_s_power()
1756 mutex_lock(&imx577->mutex); in imx577_s_power()
1759 if (imx577->power_on == !!on) in imx577_s_power()
1769 ret = imx577_write_array(imx577->client, imx577_global_regs); in imx577_s_power()
1776 imx577->power_on = true; in imx577_s_power()
1779 imx577->power_on = false; in imx577_s_power()
1783 mutex_unlock(&imx577->mutex); in imx577_s_power()
1794 static int __imx577_power_on(struct imx577 *imx577) in __imx577_power_on() argument
1798 struct device *dev = &imx577->client->dev; in __imx577_power_on()
1800 if (!IS_ERR(imx577->power_gpio)) in __imx577_power_on()
1801 gpiod_set_value_cansleep(imx577->power_gpio, 1); in __imx577_power_on()
1805 if (!IS_ERR_OR_NULL(imx577->pins_default)) { in __imx577_power_on()
1806 ret = pinctrl_select_state(imx577->pinctrl, in __imx577_power_on()
1807 imx577->pins_default); in __imx577_power_on()
1811 ret = clk_set_rate(imx577->xvclk, IMX577_XVCLK_FREQ); in __imx577_power_on()
1814 if (clk_get_rate(imx577->xvclk) != IMX577_XVCLK_FREQ) in __imx577_power_on()
1816 ret = clk_prepare_enable(imx577->xvclk); in __imx577_power_on()
1821 if (!IS_ERR(imx577->reset_gpio)) in __imx577_power_on()
1822 gpiod_set_value_cansleep(imx577->reset_gpio, 0); in __imx577_power_on()
1824 ret = regulator_bulk_enable(IMX577_NUM_SUPPLIES, imx577->supplies); in __imx577_power_on()
1830 if (!IS_ERR(imx577->reset_gpio)) in __imx577_power_on()
1831 gpiod_set_value_cansleep(imx577->reset_gpio, 1); in __imx577_power_on()
1834 if (!IS_ERR(imx577->pwdn_gpio)) in __imx577_power_on()
1835 gpiod_set_value_cansleep(imx577->pwdn_gpio, 1); in __imx577_power_on()
1844 clk_disable_unprepare(imx577->xvclk); in __imx577_power_on()
1849 static void __imx577_power_off(struct imx577 *imx577) in __imx577_power_off() argument
1852 struct device *dev = &imx577->client->dev; in __imx577_power_off()
1854 if (!IS_ERR(imx577->pwdn_gpio)) in __imx577_power_off()
1855 gpiod_set_value_cansleep(imx577->pwdn_gpio, 0); in __imx577_power_off()
1856 clk_disable_unprepare(imx577->xvclk); in __imx577_power_off()
1857 if (!IS_ERR(imx577->reset_gpio)) in __imx577_power_off()
1858 gpiod_set_value_cansleep(imx577->reset_gpio, 0); in __imx577_power_off()
1860 if (!IS_ERR_OR_NULL(imx577->pins_sleep)) { in __imx577_power_off()
1861 ret = pinctrl_select_state(imx577->pinctrl, in __imx577_power_off()
1862 imx577->pins_sleep); in __imx577_power_off()
1866 if (!IS_ERR(imx577->power_gpio)) in __imx577_power_off()
1867 gpiod_set_value_cansleep(imx577->power_gpio, 0); in __imx577_power_off()
1869 regulator_bulk_disable(IMX577_NUM_SUPPLIES, imx577->supplies); in __imx577_power_off()
1876 struct imx577 *imx577 = to_imx577(sd); in imx577_runtime_resume() local
1878 return __imx577_power_on(imx577); in imx577_runtime_resume()
1885 struct imx577 *imx577 = to_imx577(sd); in imx577_runtime_suspend() local
1887 __imx577_power_off(imx577); in imx577_runtime_suspend()
1895 struct imx577 *imx577 = to_imx577(sd); in imx577_open() local
1900 mutex_lock(&imx577->mutex); in imx577_open()
1907 mutex_unlock(&imx577->mutex); in imx577_open()
1933 struct imx577 *imx577 = to_imx577(sd); in imx577_g_mbus_config() local
1934 const struct imx577_mode *mode = imx577->cur_mode; in imx577_g_mbus_config()
1935 u32 lane_num = imx577->bus_cfg.bus.mipi_csi2.num_data_lanes; in imx577_g_mbus_config()
1957 struct imx577 *imx577 = to_imx577(sd); in imx577_get_selection() local
1960 if (imx577->cur_mode->width == 4056) { in imx577_get_selection()
1961 sel->r.left = CROP_START(imx577->cur_mode->width, DST_WIDTH_4048); in imx577_get_selection()
1963 sel->r.top = CROP_START(imx577->cur_mode->height, imx577->cur_mode->height); in imx577_get_selection()
1964 sel->r.height = imx577->cur_mode->height; in imx577_get_selection()
1966 sel->r.left = CROP_START(imx577->cur_mode->width, in imx577_get_selection()
1967 imx577->cur_mode->width); in imx577_get_selection()
1968 sel->r.width = imx577->cur_mode->width; in imx577_get_selection()
1969 sel->r.top = CROP_START(imx577->cur_mode->height, in imx577_get_selection()
1970 imx577->cur_mode->height); in imx577_get_selection()
1971 sel->r.height = imx577->cur_mode->height; in imx577_get_selection()
2021 struct imx577 *imx577 = container_of(ctrl->handler, in imx577_set_ctrl() local
2022 struct imx577, ctrl_handler); in imx577_set_ctrl()
2023 struct i2c_client *client = imx577->client; in imx577_set_ctrl()
2032 if (imx577->cur_mode->hdr_mode == NO_HDR) { in imx577_set_ctrl()
2034 max = imx577->cur_mode->height + ctrl->val - 4; in imx577_set_ctrl()
2035 __v4l2_ctrl_modify_range(imx577->exposure, in imx577_set_ctrl()
2036 imx577->exposure->minimum, max, in imx577_set_ctrl()
2037 imx577->exposure->step, in imx577_set_ctrl()
2038 imx577->exposure->default_value); in imx577_set_ctrl()
2049 if (imx577->cur_mode->hdr_mode != NO_HDR) in imx577_set_ctrl()
2051 ret = imx577_write_reg(imx577->client, in imx577_set_ctrl()
2055 ret |= imx577_write_reg(imx577->client, in imx577_set_ctrl()
2068 if (imx577->cur_mode->hdr_mode != NO_HDR) in imx577_set_ctrl()
2078 ret = imx577_write_reg(imx577->client, IMX577_REG_GAIN_H, in imx577_set_ctrl()
2081 ret |= imx577_write_reg(imx577->client, IMX577_REG_GAIN_L, in imx577_set_ctrl()
2084 ret |= imx577_write_reg(imx577->client, IMX577_REG_DGAIN, in imx577_set_ctrl()
2088 ret |= imx577_write_reg(imx577->client, in imx577_set_ctrl()
2092 ret |= imx577_write_reg(imx577->client, in imx577_set_ctrl()
2097 ret |= imx577_write_reg(imx577->client, in imx577_set_ctrl()
2101 ret |= imx577_write_reg(imx577->client, in imx577_set_ctrl()
2105 ret |= imx577_write_reg(imx577->client, in imx577_set_ctrl()
2109 ret |= imx577_write_reg(imx577->client, in imx577_set_ctrl()
2113 ret |= imx577_write_reg(imx577->client, in imx577_set_ctrl()
2117 ret |= imx577_write_reg(imx577->client, in imx577_set_ctrl()
2126 ret = imx577_write_reg(imx577->client, in imx577_set_ctrl()
2129 ctrl->val + imx577->cur_mode->height); in imx577_set_ctrl()
2132 ret = imx577_enable_test_pattern(imx577, ctrl->val); in imx577_set_ctrl()
2150 static int imx577_initialize_controls(struct imx577 *imx577) in imx577_initialize_controls() argument
2158 handler = &imx577->ctrl_handler; in imx577_initialize_controls()
2159 mode = imx577->cur_mode; in imx577_initialize_controls()
2163 handler->lock = &imx577->mutex; in imx577_initialize_controls()
2165 imx577->link_freq = v4l2_ctrl_new_int_menu(handler, NULL, in imx577_initialize_controls()
2170 if (imx577->cur_mode->bus_fmt == MEDIA_BUS_FMT_SRGGB10_1X10) { in imx577_initialize_controls()
2171 imx577->cur_link_freq = 0; in imx577_initialize_controls()
2172 imx577->cur_pixel_rate = IMX577_PIXEL_RATE_1050M_10BIT; in imx577_initialize_controls()
2173 } else if (imx577->cur_mode->bus_fmt == MEDIA_BUS_FMT_SRGGB12_1X12) { in imx577_initialize_controls()
2174 imx577->cur_link_freq = 0; in imx577_initialize_controls()
2175 imx577->cur_pixel_rate = IMX577_PIXEL_RATE_1050M_12BIT; in imx577_initialize_controls()
2178 imx577->pixel_rate = v4l2_ctrl_new_std(handler, NULL, in imx577_initialize_controls()
2181 1, imx577->cur_pixel_rate); in imx577_initialize_controls()
2183 __v4l2_ctrl_s_ctrl(imx577->link_freq, in imx577_initialize_controls()
2187 imx577->hblank = v4l2_ctrl_new_std(handler, NULL, V4L2_CID_HBLANK, in imx577_initialize_controls()
2189 if (imx577->hblank) in imx577_initialize_controls()
2190 imx577->hblank->flags |= V4L2_CTRL_FLAG_READ_ONLY; in imx577_initialize_controls()
2193 imx577->vblank = v4l2_ctrl_new_std(handler, &imx577_ctrl_ops, in imx577_initialize_controls()
2197 imx577->cur_vts = mode->vts_def; in imx577_initialize_controls()
2199 imx577->exposure = v4l2_ctrl_new_std(handler, &imx577_ctrl_ops, in imx577_initialize_controls()
2204 imx577->anal_gain = v4l2_ctrl_new_std(handler, &imx577_ctrl_ops, in imx577_initialize_controls()
2209 imx577->test_pattern = v4l2_ctrl_new_std_menu_items(handler, in imx577_initialize_controls()
2216 dev_err(&imx577->client->dev, in imx577_initialize_controls()
2221 imx577->subdev.ctrl_handler = handler; in imx577_initialize_controls()
2222 imx577->has_init_exp = false; in imx577_initialize_controls()
2232 static int imx577_check_sensor_id(struct imx577 *imx577, in imx577_check_sensor_id() argument
2235 struct device *dev = &imx577->client->dev; in imx577_check_sensor_id()
2251 static int imx577_configure_regulators(struct imx577 *imx577) in imx577_configure_regulators() argument
2256 imx577->supplies[i].supply = imx577_supply_names[i]; in imx577_configure_regulators()
2258 return devm_regulator_bulk_get(&imx577->client->dev, in imx577_configure_regulators()
2260 imx577->supplies); in imx577_configure_regulators()
2268 struct imx577 *imx577; in imx577_probe() local
2280 imx577 = devm_kzalloc(dev, sizeof(*imx577), GFP_KERNEL); in imx577_probe()
2281 if (!imx577) in imx577_probe()
2285 &imx577->module_index); in imx577_probe()
2287 &imx577->module_facing); in imx577_probe()
2289 &imx577->module_name); in imx577_probe()
2291 &imx577->len_name); in imx577_probe()
2303 imx577->client = client; in imx577_probe()
2306 imx577->cur_mode = &supported_modes[i]; in imx577_probe()
2317 &imx577->bus_cfg); in imx577_probe()
2323 imx577->xvclk = devm_clk_get(dev, "xvclk"); in imx577_probe()
2324 if (IS_ERR(imx577->xvclk)) { in imx577_probe()
2329 imx577->power_gpio = devm_gpiod_get(dev, "power", GPIOD_OUT_LOW); in imx577_probe()
2330 if (IS_ERR(imx577->power_gpio)) in imx577_probe()
2333 imx577->reset_gpio = devm_gpiod_get(dev, "reset", GPIOD_OUT_LOW); in imx577_probe()
2334 if (IS_ERR(imx577->reset_gpio)) in imx577_probe()
2337 imx577->pwdn_gpio = devm_gpiod_get(dev, "pwdn", GPIOD_OUT_LOW); in imx577_probe()
2338 if (IS_ERR(imx577->pwdn_gpio)) in imx577_probe()
2341 ret = imx577_configure_regulators(imx577); in imx577_probe()
2347 imx577->pinctrl = devm_pinctrl_get(dev); in imx577_probe()
2348 if (!IS_ERR(imx577->pinctrl)) { in imx577_probe()
2349 imx577->pins_default = in imx577_probe()
2350 pinctrl_lookup_state(imx577->pinctrl, in imx577_probe()
2352 if (IS_ERR(imx577->pins_default)) in imx577_probe()
2355 imx577->pins_sleep = in imx577_probe()
2356 pinctrl_lookup_state(imx577->pinctrl, in imx577_probe()
2358 if (IS_ERR(imx577->pins_sleep)) in imx577_probe()
2362 mutex_init(&imx577->mutex); in imx577_probe()
2364 sd = &imx577->subdev; in imx577_probe()
2366 ret = imx577_initialize_controls(imx577); in imx577_probe()
2370 ret = __imx577_power_on(imx577); in imx577_probe()
2374 ret = imx577_check_sensor_id(imx577, client); in imx577_probe()
2384 imx577->pad.flags = MEDIA_PAD_FL_SOURCE; in imx577_probe()
2386 ret = media_entity_pads_init(&sd->entity, 1, &imx577->pad); in imx577_probe()
2392 if (strcmp(imx577->module_facing, "back") == 0) in imx577_probe()
2398 imx577->module_index, facing, in imx577_probe()
2417 __imx577_power_off(imx577); in imx577_probe()
2419 v4l2_ctrl_handler_free(&imx577->ctrl_handler); in imx577_probe()
2421 mutex_destroy(&imx577->mutex); in imx577_probe()
2429 struct imx577 *imx577 = to_imx577(sd); in imx577_remove() local
2435 v4l2_ctrl_handler_free(&imx577->ctrl_handler); in imx577_remove()
2436 mutex_destroy(&imx577->mutex); in imx577_remove()
2440 __imx577_power_off(imx577); in imx577_remove()