Loading drivers/media/platform/msm/camera_v2/sensor/Makefile +1 −0 Original line number Diff line number Diff line Loading @@ -6,3 +6,4 @@ ccflags-y += -Idrivers/media/platform/msm/camera_v2/sensor/cci obj-$(CONFIG_MSMB_CAMERA) += cci/ io/ csiphy/ csid/ actuator/ flash/ eeprom/ ois/ obj-$(CONFIG_MSM_CAMERA_SENSOR) += msm_sensor_init.o msm_sensor_driver.o msm_sensor.o obj-$(CONFIG_MT9M114) += mt9m114.o obj-$(CONFIG_OV5645) += ov5645.o drivers/media/platform/msm/camera_v2/sensor/msm_sensor.c +1 −1 Original line number Diff line number Diff line Loading @@ -44,7 +44,7 @@ static void msm_sensor_adjust_mclk(struct msm_camera_power_ctrl_t *ctrl) static int32_t msm_camera_get_power_settimgs_from_sensor_lib( struct msm_camera_power_ctrl_t *power_info, struct msm_sensor_power_setting_info *power_setting_array) struct msm_sensor_power_setting_array *power_setting_array) { int32_t rc = 0; uint32_t size; Loading drivers/media/platform/msm/camera_v2/sensor/msm_sensor.h +1 −8 Original line number Diff line number Diff line Loading @@ -55,20 +55,13 @@ struct msm_sensor_fn_t { int (*sensor_match_id) (struct msm_sensor_ctrl_t *); }; struct msm_sensor_power_setting_info { struct msm_sensor_power_setting *power_setting; uint16_t size; struct msm_sensor_power_setting *power_down_setting; uint16_t size_down; }; struct msm_sensor_ctrl_t { struct platform_device *pdev; struct mutex *msm_sensor_mutex; enum msm_camera_device_type_t sensor_device_type; struct msm_camera_sensor_board_info *sensordata; struct msm_sensor_power_setting_info power_setting_array; struct msm_sensor_power_setting_array power_setting_array; struct msm_sensor_packed_cfg_t *cfg_override; struct msm_sd_subdev msm_sd; enum cci_i2c_master_t cci_i2c_master; Loading drivers/media/platform/msm/camera_v2/sensor/mt9m114.c +198 −0 Original line number Diff line number Diff line Loading @@ -1384,8 +1384,206 @@ int32_t mt9m114_sensor_config(struct msm_sensor_ctrl_t *s_ctrl, return rc; } #ifdef CONFIG_COMPAT int32_t mt9m114_sensor_config32(struct msm_sensor_ctrl_t *s_ctrl, void __user *argp) { struct sensorb_cfg_data32 *cdata = (struct sensorb_cfg_data32 *)argp; int32_t rc = 0; int32_t i = 0; mutex_lock(s_ctrl->msm_sensor_mutex); CDBG("%s:%d %s cfgtype = %d\n", __func__, __LINE__, s_ctrl->sensordata->sensor_name, cdata->cfgtype); switch (cdata->cfgtype) { case CFG_GET_SENSOR_INFO: memcpy(cdata->cfg.sensor_info.sensor_name, s_ctrl->sensordata->sensor_name, sizeof(cdata->cfg.sensor_info.sensor_name)); cdata->cfg.sensor_info.session_id = s_ctrl->sensordata->sensor_info->session_id; for (i = 0; i < SUB_MODULE_MAX; i++) cdata->cfg.sensor_info.subdev_id[i] = s_ctrl->sensordata->sensor_info->subdev_id[i]; cdata->cfg.sensor_info.is_mount_angle_valid = s_ctrl->sensordata->sensor_info->is_mount_angle_valid; cdata->cfg.sensor_info.sensor_mount_angle = s_ctrl->sensordata->sensor_info->sensor_mount_angle; CDBG("%s:%d sensor name %s\n", __func__, __LINE__, cdata->cfg.sensor_info.sensor_name); CDBG("%s:%d session id %d\n", __func__, __LINE__, cdata->cfg.sensor_info.session_id); for (i = 0; i < SUB_MODULE_MAX; i++) CDBG("%s:%d subdev_id[%d] %d\n", __func__, __LINE__, i, cdata->cfg.sensor_info.subdev_id[i]); CDBG("%s:%d mount angle valid %d value %d\n", __func__, __LINE__, cdata->cfg.sensor_info.is_mount_angle_valid, cdata->cfg.sensor_info.sensor_mount_angle); break; case CFG_SET_INIT_SETTING: /* 1. Write Recommend settings */ /* 2. Write change settings */ rc = s_ctrl->sensor_i2c_client->i2c_func_tbl-> i2c_write_conf_tbl( s_ctrl->sensor_i2c_client, mt9m114_recommend_settings, ARRAY_SIZE(mt9m114_recommend_settings), MSM_CAMERA_I2C_WORD_DATA); rc = s_ctrl->sensor_i2c_client->i2c_func_tbl-> i2c_write_conf_tbl( s_ctrl->sensor_i2c_client, mt9m114_config_change_settings, ARRAY_SIZE(mt9m114_config_change_settings), MSM_CAMERA_I2C_WORD_DATA); break; case CFG_SET_RESOLUTION: rc = s_ctrl->sensor_i2c_client->i2c_func_tbl-> i2c_write_conf_tbl( s_ctrl->sensor_i2c_client, mt9m114_720p_settings, ARRAY_SIZE(mt9m114_720p_settings), MSM_CAMERA_I2C_WORD_DATA); break; case CFG_SET_STOP_STREAM: break; case CFG_SET_START_STREAM: rc = s_ctrl->sensor_i2c_client->i2c_func_tbl-> i2c_write_conf_tbl( s_ctrl->sensor_i2c_client, mt9m114_config_change_settings, ARRAY_SIZE(mt9m114_config_change_settings), MSM_CAMERA_I2C_WORD_DATA); break; case CFG_GET_SENSOR_INIT_PARAMS: cdata->cfg.sensor_init_params.modes_supported = s_ctrl->sensordata->sensor_info->modes_supported; cdata->cfg.sensor_init_params.position = s_ctrl->sensordata->sensor_info->position; cdata->cfg.sensor_init_params.sensor_mount_angle = s_ctrl->sensordata->sensor_info->sensor_mount_angle; CDBG("%s:%d init params mode %d pos %d mount %d\n", __func__, __LINE__, cdata->cfg.sensor_init_params.modes_supported, cdata->cfg.sensor_init_params.position, cdata->cfg.sensor_init_params.sensor_mount_angle); break; case CFG_WRITE_I2C_ARRAY: { struct msm_camera_i2c_reg_setting32 conf_array32; struct msm_camera_i2c_reg_setting conf_array; struct msm_camera_i2c_reg_array *reg_setting = NULL; if (copy_from_user(&conf_array32, (void *)compat_ptr(cdata->cfg.setting), sizeof(struct msm_camera_i2c_reg_setting32))) { pr_err("%s:%d failed\n", __func__, __LINE__); rc = -EFAULT; break; } conf_array.addr_type = conf_array32.addr_type; conf_array.data_type = conf_array32.data_type; conf_array.delay = conf_array32.delay; conf_array.size = conf_array32.size; conf_array.reg_setting = compat_ptr(conf_array32.reg_setting); reg_setting = kzalloc(conf_array.size * (sizeof(struct msm_camera_i2c_reg_array)), GFP_KERNEL); if (!reg_setting) { pr_err("%s:%d failed\n", __func__, __LINE__); rc = -ENOMEM; break; } if (copy_from_user(reg_setting, (void *)conf_array.reg_setting, conf_array.size * sizeof(struct msm_camera_i2c_reg_array))) { pr_err("%s:%d failed\n", __func__, __LINE__); kfree(reg_setting); rc = -EFAULT; break; } conf_array.reg_setting = reg_setting; rc = s_ctrl->sensor_i2c_client->i2c_func_tbl->i2c_write_table( s_ctrl->sensor_i2c_client, &conf_array); kfree(reg_setting); break; } case CFG_POWER_UP: if (s_ctrl->func_tbl->sensor_power_up) rc = s_ctrl->func_tbl->sensor_power_up(s_ctrl); else rc = -EFAULT; break; case CFG_POWER_DOWN: if (s_ctrl->func_tbl->sensor_power_down) rc = s_ctrl->func_tbl->sensor_power_down(s_ctrl); else rc = -EFAULT; break; case CFG_SET_SATURATION: { int32_t sat_lev; if (copy_from_user(&sat_lev, (void *)compat_ptr(cdata->cfg.setting), sizeof(int32_t))) { pr_err("%s:%d failed\n", __func__, __LINE__); rc = -EFAULT; break; } pr_debug("%s: Saturation Value is %d", __func__, sat_lev); break; } case CFG_SET_CONTRAST: { int32_t con_lev; if (copy_from_user(&con_lev, (void *)compat_ptr(cdata->cfg.setting), sizeof(int32_t))) { pr_err("%s:%d failed\n", __func__, __LINE__); rc = -EFAULT; break; } pr_debug("%s: Contrast Value is %d", __func__, con_lev); break; } case CFG_SET_SHARPNESS: { int32_t shp_lev; if (copy_from_user(&shp_lev, (void *)compat_ptr(cdata->cfg.setting), sizeof(int32_t))) { pr_err("%s:%d failed\n", __func__, __LINE__); rc = -EFAULT; break; } pr_debug("%s: Sharpness Value is %d", __func__, shp_lev); break; } case CFG_SET_AUTOFOCUS: { /* TO-DO: set the Auto Focus */ pr_debug("%s: Setting Auto Focus", __func__); break; } case CFG_CANCEL_AUTOFOCUS: { /* TO-DO: Cancel the Auto Focus */ pr_debug("%s: Cancelling Auto Focus", __func__); break; } default: pr_err("Invalid cfgtype func %s line %d cfgtype = %d\n", __func__, __LINE__, (int32_t)cdata->cfgtype); rc = -EFAULT; break; } mutex_unlock(s_ctrl->msm_sensor_mutex); return rc; } #endif static struct msm_sensor_fn_t mt9m114_sensor_func_tbl = { .sensor_config = mt9m114_sensor_config, #ifdef CONFIG_COMPAT .sensor_config32 = mt9m114_sensor_config32, #endif .sensor_power_up = msm_sensor_power_up, .sensor_power_down = msm_sensor_power_down, .sensor_match_id = msm_sensor_match_id, Loading drivers/media/platform/msm/camera_v2/sensor/ov5645.c +252 −100 Original line number Diff line number Diff line Loading @@ -711,69 +711,6 @@ int32_t ov5645_sensor_config(struct msm_sensor_ctrl_t *s_ctrl, cdata->cfg.sensor_init_params.position, cdata->cfg.sensor_init_params.sensor_mount_angle); break; case CFG_SET_SLAVE_INFO: { struct msm_camera_sensor_slave_info sensor_slave_info; struct msm_camera_power_ctrl_t *p_ctrl; uint16_t size; int slave_index = 0; if (copy_from_user(&sensor_slave_info, (void *)cdata->cfg.setting, sizeof(struct msm_camera_sensor_slave_info))) { pr_err("%s:%d failed\n", __func__, __LINE__); rc = -EFAULT; break; } /* Update sensor slave address */ if (sensor_slave_info.slave_addr) s_ctrl->sensor_i2c_client->cci_client->sid = sensor_slave_info.slave_addr >> 1; /* Update sensor address type */ s_ctrl->sensor_i2c_client->addr_type = sensor_slave_info.addr_type; /* Update power up / down sequence */ p_ctrl = &s_ctrl->sensordata->power_info; size = sensor_slave_info.power_setting_array.size; if (p_ctrl->power_setting_size < size) { struct msm_sensor_power_setting *tmp; tmp = kmalloc(sizeof(struct msm_sensor_power_setting) * size, GFP_KERNEL); if (!tmp) { pr_err("%s: failed to alloc mem\n", __func__); rc = -ENOMEM; break; } kfree(p_ctrl->power_setting); p_ctrl->power_setting = tmp; } p_ctrl->power_setting_size = size; rc = copy_from_user(p_ctrl->power_setting, (void *) sensor_slave_info.power_setting_array.power_setting, size * sizeof(struct msm_sensor_power_setting)); if (rc) { pr_err("%s:%d failed\n", __func__, __LINE__); rc = -EFAULT; break; } CDBG("%s sensor id %x sensor addr type %d sensor reg %x\n" "sensor id %x\n", __func__, sensor_slave_info.slave_addr, sensor_slave_info.addr_type, sensor_slave_info.sensor_id_info.sensor_id_reg_addr, sensor_slave_info.sensor_id_info.sensor_id); for (slave_index = 0; slave_index < p_ctrl->power_setting_size; slave_index++) { CDBG("%s i %d power setting %d %d %ld %d\n", __func__, slave_index, p_ctrl->power_setting[slave_index].seq_type, p_ctrl->power_setting[slave_index].seq_val, p_ctrl->power_setting[slave_index].config_val, p_ctrl->power_setting[slave_index].delay); } break; } case CFG_WRITE_I2C_ARRAY: { struct msm_camera_i2c_reg_setting conf_array; struct msm_camera_i2c_reg_array *reg_setting = NULL; Loading Loading @@ -808,43 +745,6 @@ int32_t ov5645_sensor_config(struct msm_sensor_ctrl_t *s_ctrl, kfree(reg_setting); break; } case CFG_WRITE_I2C_SEQ_ARRAY: { struct msm_camera_i2c_seq_reg_setting conf_array; struct msm_camera_i2c_seq_reg_array *reg_setting = NULL; if (copy_from_user(&conf_array, (void *)cdata->cfg.setting, sizeof(struct msm_camera_i2c_seq_reg_setting))) { pr_err("%s:%d failed\n", __func__, __LINE__); rc = -EFAULT; break; } reg_setting = kzalloc(conf_array.size * (sizeof(struct msm_camera_i2c_seq_reg_array)), GFP_KERNEL); if (!reg_setting) { pr_err("%s:%d failed\n", __func__, __LINE__); rc = -ENOMEM; break; } if (copy_from_user(reg_setting, (void *)conf_array.reg_setting, conf_array.size * sizeof(struct msm_camera_i2c_seq_reg_array))) { pr_err("%s:%d failed\n", __func__, __LINE__); kfree(reg_setting); rc = -EFAULT; break; } conf_array.reg_setting = reg_setting; rc = s_ctrl->sensor_i2c_client->i2c_func_tbl-> i2c_write_seq_table(s_ctrl->sensor_i2c_client, &conf_array); kfree(reg_setting); break; } case CFG_POWER_UP: if (s_ctrl->func_tbl->sensor_power_up) rc = s_ctrl->func_tbl->sensor_power_up(s_ctrl); Loading Loading @@ -938,8 +838,260 @@ int32_t ov5645_sensor_config(struct msm_sensor_ctrl_t *s_ctrl, return rc; } #ifdef CONFIG_COMPAT int32_t ov5645_sensor_config32(struct msm_sensor_ctrl_t *s_ctrl, void __user *argp) { struct sensorb_cfg_data32 *cdata = (struct sensorb_cfg_data32 *)argp; long rc = 0; int32_t i = 0; mutex_lock(s_ctrl->msm_sensor_mutex); CDBG("%s:%d %s cfgtype = %d\n", __func__, __LINE__, s_ctrl->sensordata->sensor_name, cdata->cfgtype); switch (cdata->cfgtype) { case CFG_GET_SENSOR_INFO: memcpy(cdata->cfg.sensor_info.sensor_name, s_ctrl->sensordata->sensor_name, sizeof(cdata->cfg.sensor_info.sensor_name)); cdata->cfg.sensor_info.session_id = s_ctrl->sensordata->sensor_info->session_id; for (i = 0; i < SUB_MODULE_MAX; i++) cdata->cfg.sensor_info.subdev_id[i] = s_ctrl->sensordata->sensor_info->subdev_id[i]; cdata->cfg.sensor_info.is_mount_angle_valid = s_ctrl->sensordata->sensor_info->is_mount_angle_valid; cdata->cfg.sensor_info.sensor_mount_angle = s_ctrl->sensordata->sensor_info->sensor_mount_angle; cdata->cfg.sensor_info.position = s_ctrl->sensordata->sensor_info->position; cdata->cfg.sensor_info.modes_supported = s_ctrl->sensordata->sensor_info->modes_supported; CDBG("%s:%d sensor name %s\n", __func__, __LINE__, cdata->cfg.sensor_info.sensor_name); CDBG("%s:%d session id %d\n", __func__, __LINE__, cdata->cfg.sensor_info.session_id); for (i = 0; i < SUB_MODULE_MAX; i++) CDBG("%s:%d subdev_id[%d] %d\n", __func__, __LINE__, i, cdata->cfg.sensor_info.subdev_id[i]); CDBG("%s:%d mount angle valid %d value %d\n", __func__, __LINE__, cdata->cfg.sensor_info.is_mount_angle_valid, cdata->cfg.sensor_info.sensor_mount_angle); break; case CFG_SET_INIT_SETTING: /* 1. Write Recommend settings */ /* 2. Write change settings */ rc = s_ctrl->sensor_i2c_client->i2c_func_tbl-> i2c_write_conf_tbl( s_ctrl->sensor_i2c_client, ov5645_recommend_settings, ARRAY_SIZE(ov5645_recommend_settings), MSM_CAMERA_I2C_BYTE_DATA); break; case CFG_SET_RESOLUTION: { /*copy from user the desired resoltuion*/ enum msm_sensor_resolution_t res = MSM_SENSOR_INVALID_RES; if (copy_from_user(&res, (void *)compat_ptr(cdata->cfg.setting), sizeof(enum msm_sensor_resolution_t))) { pr_err("%s:%d failed\n", __func__, __LINE__); rc = -EFAULT; break; } pr_err("%s:%d res =%d\n", __func__, __LINE__, res); if (res == MSM_SENSOR_RES_FULL) { rc = s_ctrl->sensor_i2c_client->i2c_func_tbl-> i2c_write_conf_tbl( s_ctrl->sensor_i2c_client, ov5645_full_settings, ARRAY_SIZE(ov5645_full_settings), MSM_CAMERA_I2C_BYTE_DATA); pr_err("%s:%d res =%d\n ov5645_full_settings ", __func__, __LINE__, res); } else if (res == MSM_SENSOR_RES_QTR) { rc = s_ctrl->sensor_i2c_client->i2c_func_tbl-> i2c_write_conf_tbl( s_ctrl->sensor_i2c_client, ov5645_sxga_settings, ARRAY_SIZE(ov5645_sxga_settings), MSM_CAMERA_I2C_BYTE_DATA); pr_err("%s:%d res =%d ov5645_sxga_settings\n", __func__, __LINE__, res); } else if (res == MSM_SENSOR_RES_2) { rc = s_ctrl->sensor_i2c_client->i2c_func_tbl-> i2c_write_conf_tbl( s_ctrl->sensor_i2c_client, ov5645_1080P_settings, ARRAY_SIZE(ov5645_1080P_settings), MSM_CAMERA_I2C_BYTE_DATA); pr_err("%s:%d res =%d ov5645_1080P_settings\n", __func__, __LINE__, res); } else { pr_err("%s:%d failed resoultion set\n", __func__, __LINE__); rc = -EFAULT; } } break; case CFG_SET_STOP_STREAM: rc = s_ctrl->sensor_i2c_client->i2c_func_tbl-> i2c_write_conf_tbl( s_ctrl->sensor_i2c_client, ov5645_stop_settings, ARRAY_SIZE(ov5645_stop_settings), MSM_CAMERA_I2C_BYTE_DATA); break; case CFG_SET_START_STREAM: if (s_ctrl->camera_stream_type != MSM_CAMERA_STREAM_SNAPSHOT) { rc = s_ctrl->sensor_i2c_client->i2c_func_tbl-> i2c_write_conf_tbl( s_ctrl->sensor_i2c_client, ov5645_enable_aec_settings, ARRAY_SIZE(ov5645_enable_aec_settings), MSM_CAMERA_I2C_BYTE_DATA); } else { rc = s_ctrl->sensor_i2c_client->i2c_func_tbl-> i2c_write_conf_tbl( s_ctrl->sensor_i2c_client, ov5645_disable_aec_settings, ARRAY_SIZE(ov5645_disable_aec_settings), MSM_CAMERA_I2C_BYTE_DATA); } if (rc) { pr_err("%s:%d failed rc = %ld\n", __func__, __LINE__, rc); rc = -EFAULT; break; } rc = s_ctrl->sensor_i2c_client->i2c_func_tbl-> i2c_write_conf_tbl( s_ctrl->sensor_i2c_client, ov5645_start_settings, ARRAY_SIZE(ov5645_start_settings), MSM_CAMERA_I2C_BYTE_DATA); break; case CFG_GET_SENSOR_INIT_PARAMS: cdata->cfg.sensor_init_params.modes_supported = s_ctrl->sensordata->sensor_info->modes_supported; cdata->cfg.sensor_init_params.position = s_ctrl->sensordata->sensor_info->position; cdata->cfg.sensor_init_params.sensor_mount_angle = s_ctrl->sensordata->sensor_info->sensor_mount_angle; CDBG("%s:%d init params mode %d pos %d mount %d\n", __func__, __LINE__, cdata->cfg.sensor_init_params.modes_supported, cdata->cfg.sensor_init_params.position, cdata->cfg.sensor_init_params.sensor_mount_angle); break; case CFG_WRITE_I2C_ARRAY: { struct msm_camera_i2c_reg_setting32 conf_array32; struct msm_camera_i2c_reg_setting conf_array; struct msm_camera_i2c_reg_array *reg_setting = NULL; if (copy_from_user(&conf_array32, (void *)compat_ptr(cdata->cfg.setting), sizeof(struct msm_camera_i2c_reg_setting32))) { pr_err("%s:%d failed\n", __func__, __LINE__); rc = -EFAULT; break; } conf_array.addr_type = conf_array32.addr_type; conf_array.data_type = conf_array32.data_type; conf_array.delay = conf_array32.delay; conf_array.size = conf_array32.size; conf_array.reg_setting = compat_ptr(conf_array32.reg_setting); reg_setting = kzalloc(conf_array.size * (sizeof(struct msm_camera_i2c_reg_array)), GFP_KERNEL); if (!reg_setting) { pr_err("%s:%d failed\n", __func__, __LINE__); rc = -ENOMEM; break; } if (copy_from_user(reg_setting, (void *)conf_array.reg_setting, conf_array.size * sizeof(struct msm_camera_i2c_reg_array))) { pr_err("%s:%d failed\n", __func__, __LINE__); kfree(reg_setting); rc = -EFAULT; break; } conf_array.reg_setting = reg_setting; rc = s_ctrl->sensor_i2c_client->i2c_func_tbl->i2c_write_table( s_ctrl->sensor_i2c_client, &conf_array); kfree(reg_setting); break; } case CFG_POWER_UP: if (s_ctrl->func_tbl->sensor_power_up) rc = s_ctrl->func_tbl->sensor_power_up(s_ctrl); else rc = -EFAULT; break; case CFG_POWER_DOWN: if (s_ctrl->func_tbl->sensor_power_down) rc = s_ctrl->func_tbl->sensor_power_down(s_ctrl); else rc = -EFAULT; break; case CFG_SET_STREAM_TYPE: { enum msm_camera_stream_type_t stream_type = MSM_CAMERA_STREAM_INVALID; if (copy_from_user(&stream_type, (void *)compat_ptr(cdata->cfg.setting), sizeof(enum msm_camera_stream_type_t))) { pr_err("%s:%d failed\n", __func__, __LINE__); rc = -EFAULT; break; } s_ctrl->camera_stream_type = stream_type; break; } case CFG_SET_SATURATION: break; case CFG_SET_CONTRAST: break; case CFG_SET_SHARPNESS: break; case CFG_SET_AUTOFOCUS: /* TO-DO: set the Auto Focus */ pr_debug("%s: Setting Auto Focus", __func__); break; case CFG_CANCEL_AUTOFOCUS: /* TO-DO: Cancel the Auto Focus */ pr_debug("%s: Cancelling Auto Focus", __func__); break; case CFG_SET_ISO: break; case CFG_SET_EXPOSURE_COMPENSATION: break; case CFG_SET_EFFECT: break; case CFG_SET_ANTIBANDING: break; case CFG_SET_BESTSHOT_MODE: break; case CFG_SET_WHITE_BALANCE: break; default: pr_err("Invalid cfgtype func %s line %d cfgtype = %d\n", __func__, __LINE__, (int32_t)cdata->cfgtype); rc = -EFAULT; break; } mutex_unlock(s_ctrl->msm_sensor_mutex); return rc; } #endif static struct msm_sensor_fn_t ov5645_sensor_func_tbl = { .sensor_config = ov5645_sensor_config, #ifdef CONFIG_COMPAT .sensor_config32 = ov5645_sensor_config32, #endif .sensor_power_up = msm_sensor_power_up, .sensor_power_down = msm_sensor_power_down, .sensor_match_id = msm_sensor_match_id, Loading Loading
drivers/media/platform/msm/camera_v2/sensor/Makefile +1 −0 Original line number Diff line number Diff line Loading @@ -6,3 +6,4 @@ ccflags-y += -Idrivers/media/platform/msm/camera_v2/sensor/cci obj-$(CONFIG_MSMB_CAMERA) += cci/ io/ csiphy/ csid/ actuator/ flash/ eeprom/ ois/ obj-$(CONFIG_MSM_CAMERA_SENSOR) += msm_sensor_init.o msm_sensor_driver.o msm_sensor.o obj-$(CONFIG_MT9M114) += mt9m114.o obj-$(CONFIG_OV5645) += ov5645.o
drivers/media/platform/msm/camera_v2/sensor/msm_sensor.c +1 −1 Original line number Diff line number Diff line Loading @@ -44,7 +44,7 @@ static void msm_sensor_adjust_mclk(struct msm_camera_power_ctrl_t *ctrl) static int32_t msm_camera_get_power_settimgs_from_sensor_lib( struct msm_camera_power_ctrl_t *power_info, struct msm_sensor_power_setting_info *power_setting_array) struct msm_sensor_power_setting_array *power_setting_array) { int32_t rc = 0; uint32_t size; Loading
drivers/media/platform/msm/camera_v2/sensor/msm_sensor.h +1 −8 Original line number Diff line number Diff line Loading @@ -55,20 +55,13 @@ struct msm_sensor_fn_t { int (*sensor_match_id) (struct msm_sensor_ctrl_t *); }; struct msm_sensor_power_setting_info { struct msm_sensor_power_setting *power_setting; uint16_t size; struct msm_sensor_power_setting *power_down_setting; uint16_t size_down; }; struct msm_sensor_ctrl_t { struct platform_device *pdev; struct mutex *msm_sensor_mutex; enum msm_camera_device_type_t sensor_device_type; struct msm_camera_sensor_board_info *sensordata; struct msm_sensor_power_setting_info power_setting_array; struct msm_sensor_power_setting_array power_setting_array; struct msm_sensor_packed_cfg_t *cfg_override; struct msm_sd_subdev msm_sd; enum cci_i2c_master_t cci_i2c_master; Loading
drivers/media/platform/msm/camera_v2/sensor/mt9m114.c +198 −0 Original line number Diff line number Diff line Loading @@ -1384,8 +1384,206 @@ int32_t mt9m114_sensor_config(struct msm_sensor_ctrl_t *s_ctrl, return rc; } #ifdef CONFIG_COMPAT int32_t mt9m114_sensor_config32(struct msm_sensor_ctrl_t *s_ctrl, void __user *argp) { struct sensorb_cfg_data32 *cdata = (struct sensorb_cfg_data32 *)argp; int32_t rc = 0; int32_t i = 0; mutex_lock(s_ctrl->msm_sensor_mutex); CDBG("%s:%d %s cfgtype = %d\n", __func__, __LINE__, s_ctrl->sensordata->sensor_name, cdata->cfgtype); switch (cdata->cfgtype) { case CFG_GET_SENSOR_INFO: memcpy(cdata->cfg.sensor_info.sensor_name, s_ctrl->sensordata->sensor_name, sizeof(cdata->cfg.sensor_info.sensor_name)); cdata->cfg.sensor_info.session_id = s_ctrl->sensordata->sensor_info->session_id; for (i = 0; i < SUB_MODULE_MAX; i++) cdata->cfg.sensor_info.subdev_id[i] = s_ctrl->sensordata->sensor_info->subdev_id[i]; cdata->cfg.sensor_info.is_mount_angle_valid = s_ctrl->sensordata->sensor_info->is_mount_angle_valid; cdata->cfg.sensor_info.sensor_mount_angle = s_ctrl->sensordata->sensor_info->sensor_mount_angle; CDBG("%s:%d sensor name %s\n", __func__, __LINE__, cdata->cfg.sensor_info.sensor_name); CDBG("%s:%d session id %d\n", __func__, __LINE__, cdata->cfg.sensor_info.session_id); for (i = 0; i < SUB_MODULE_MAX; i++) CDBG("%s:%d subdev_id[%d] %d\n", __func__, __LINE__, i, cdata->cfg.sensor_info.subdev_id[i]); CDBG("%s:%d mount angle valid %d value %d\n", __func__, __LINE__, cdata->cfg.sensor_info.is_mount_angle_valid, cdata->cfg.sensor_info.sensor_mount_angle); break; case CFG_SET_INIT_SETTING: /* 1. Write Recommend settings */ /* 2. Write change settings */ rc = s_ctrl->sensor_i2c_client->i2c_func_tbl-> i2c_write_conf_tbl( s_ctrl->sensor_i2c_client, mt9m114_recommend_settings, ARRAY_SIZE(mt9m114_recommend_settings), MSM_CAMERA_I2C_WORD_DATA); rc = s_ctrl->sensor_i2c_client->i2c_func_tbl-> i2c_write_conf_tbl( s_ctrl->sensor_i2c_client, mt9m114_config_change_settings, ARRAY_SIZE(mt9m114_config_change_settings), MSM_CAMERA_I2C_WORD_DATA); break; case CFG_SET_RESOLUTION: rc = s_ctrl->sensor_i2c_client->i2c_func_tbl-> i2c_write_conf_tbl( s_ctrl->sensor_i2c_client, mt9m114_720p_settings, ARRAY_SIZE(mt9m114_720p_settings), MSM_CAMERA_I2C_WORD_DATA); break; case CFG_SET_STOP_STREAM: break; case CFG_SET_START_STREAM: rc = s_ctrl->sensor_i2c_client->i2c_func_tbl-> i2c_write_conf_tbl( s_ctrl->sensor_i2c_client, mt9m114_config_change_settings, ARRAY_SIZE(mt9m114_config_change_settings), MSM_CAMERA_I2C_WORD_DATA); break; case CFG_GET_SENSOR_INIT_PARAMS: cdata->cfg.sensor_init_params.modes_supported = s_ctrl->sensordata->sensor_info->modes_supported; cdata->cfg.sensor_init_params.position = s_ctrl->sensordata->sensor_info->position; cdata->cfg.sensor_init_params.sensor_mount_angle = s_ctrl->sensordata->sensor_info->sensor_mount_angle; CDBG("%s:%d init params mode %d pos %d mount %d\n", __func__, __LINE__, cdata->cfg.sensor_init_params.modes_supported, cdata->cfg.sensor_init_params.position, cdata->cfg.sensor_init_params.sensor_mount_angle); break; case CFG_WRITE_I2C_ARRAY: { struct msm_camera_i2c_reg_setting32 conf_array32; struct msm_camera_i2c_reg_setting conf_array; struct msm_camera_i2c_reg_array *reg_setting = NULL; if (copy_from_user(&conf_array32, (void *)compat_ptr(cdata->cfg.setting), sizeof(struct msm_camera_i2c_reg_setting32))) { pr_err("%s:%d failed\n", __func__, __LINE__); rc = -EFAULT; break; } conf_array.addr_type = conf_array32.addr_type; conf_array.data_type = conf_array32.data_type; conf_array.delay = conf_array32.delay; conf_array.size = conf_array32.size; conf_array.reg_setting = compat_ptr(conf_array32.reg_setting); reg_setting = kzalloc(conf_array.size * (sizeof(struct msm_camera_i2c_reg_array)), GFP_KERNEL); if (!reg_setting) { pr_err("%s:%d failed\n", __func__, __LINE__); rc = -ENOMEM; break; } if (copy_from_user(reg_setting, (void *)conf_array.reg_setting, conf_array.size * sizeof(struct msm_camera_i2c_reg_array))) { pr_err("%s:%d failed\n", __func__, __LINE__); kfree(reg_setting); rc = -EFAULT; break; } conf_array.reg_setting = reg_setting; rc = s_ctrl->sensor_i2c_client->i2c_func_tbl->i2c_write_table( s_ctrl->sensor_i2c_client, &conf_array); kfree(reg_setting); break; } case CFG_POWER_UP: if (s_ctrl->func_tbl->sensor_power_up) rc = s_ctrl->func_tbl->sensor_power_up(s_ctrl); else rc = -EFAULT; break; case CFG_POWER_DOWN: if (s_ctrl->func_tbl->sensor_power_down) rc = s_ctrl->func_tbl->sensor_power_down(s_ctrl); else rc = -EFAULT; break; case CFG_SET_SATURATION: { int32_t sat_lev; if (copy_from_user(&sat_lev, (void *)compat_ptr(cdata->cfg.setting), sizeof(int32_t))) { pr_err("%s:%d failed\n", __func__, __LINE__); rc = -EFAULT; break; } pr_debug("%s: Saturation Value is %d", __func__, sat_lev); break; } case CFG_SET_CONTRAST: { int32_t con_lev; if (copy_from_user(&con_lev, (void *)compat_ptr(cdata->cfg.setting), sizeof(int32_t))) { pr_err("%s:%d failed\n", __func__, __LINE__); rc = -EFAULT; break; } pr_debug("%s: Contrast Value is %d", __func__, con_lev); break; } case CFG_SET_SHARPNESS: { int32_t shp_lev; if (copy_from_user(&shp_lev, (void *)compat_ptr(cdata->cfg.setting), sizeof(int32_t))) { pr_err("%s:%d failed\n", __func__, __LINE__); rc = -EFAULT; break; } pr_debug("%s: Sharpness Value is %d", __func__, shp_lev); break; } case CFG_SET_AUTOFOCUS: { /* TO-DO: set the Auto Focus */ pr_debug("%s: Setting Auto Focus", __func__); break; } case CFG_CANCEL_AUTOFOCUS: { /* TO-DO: Cancel the Auto Focus */ pr_debug("%s: Cancelling Auto Focus", __func__); break; } default: pr_err("Invalid cfgtype func %s line %d cfgtype = %d\n", __func__, __LINE__, (int32_t)cdata->cfgtype); rc = -EFAULT; break; } mutex_unlock(s_ctrl->msm_sensor_mutex); return rc; } #endif static struct msm_sensor_fn_t mt9m114_sensor_func_tbl = { .sensor_config = mt9m114_sensor_config, #ifdef CONFIG_COMPAT .sensor_config32 = mt9m114_sensor_config32, #endif .sensor_power_up = msm_sensor_power_up, .sensor_power_down = msm_sensor_power_down, .sensor_match_id = msm_sensor_match_id, Loading
drivers/media/platform/msm/camera_v2/sensor/ov5645.c +252 −100 Original line number Diff line number Diff line Loading @@ -711,69 +711,6 @@ int32_t ov5645_sensor_config(struct msm_sensor_ctrl_t *s_ctrl, cdata->cfg.sensor_init_params.position, cdata->cfg.sensor_init_params.sensor_mount_angle); break; case CFG_SET_SLAVE_INFO: { struct msm_camera_sensor_slave_info sensor_slave_info; struct msm_camera_power_ctrl_t *p_ctrl; uint16_t size; int slave_index = 0; if (copy_from_user(&sensor_slave_info, (void *)cdata->cfg.setting, sizeof(struct msm_camera_sensor_slave_info))) { pr_err("%s:%d failed\n", __func__, __LINE__); rc = -EFAULT; break; } /* Update sensor slave address */ if (sensor_slave_info.slave_addr) s_ctrl->sensor_i2c_client->cci_client->sid = sensor_slave_info.slave_addr >> 1; /* Update sensor address type */ s_ctrl->sensor_i2c_client->addr_type = sensor_slave_info.addr_type; /* Update power up / down sequence */ p_ctrl = &s_ctrl->sensordata->power_info; size = sensor_slave_info.power_setting_array.size; if (p_ctrl->power_setting_size < size) { struct msm_sensor_power_setting *tmp; tmp = kmalloc(sizeof(struct msm_sensor_power_setting) * size, GFP_KERNEL); if (!tmp) { pr_err("%s: failed to alloc mem\n", __func__); rc = -ENOMEM; break; } kfree(p_ctrl->power_setting); p_ctrl->power_setting = tmp; } p_ctrl->power_setting_size = size; rc = copy_from_user(p_ctrl->power_setting, (void *) sensor_slave_info.power_setting_array.power_setting, size * sizeof(struct msm_sensor_power_setting)); if (rc) { pr_err("%s:%d failed\n", __func__, __LINE__); rc = -EFAULT; break; } CDBG("%s sensor id %x sensor addr type %d sensor reg %x\n" "sensor id %x\n", __func__, sensor_slave_info.slave_addr, sensor_slave_info.addr_type, sensor_slave_info.sensor_id_info.sensor_id_reg_addr, sensor_slave_info.sensor_id_info.sensor_id); for (slave_index = 0; slave_index < p_ctrl->power_setting_size; slave_index++) { CDBG("%s i %d power setting %d %d %ld %d\n", __func__, slave_index, p_ctrl->power_setting[slave_index].seq_type, p_ctrl->power_setting[slave_index].seq_val, p_ctrl->power_setting[slave_index].config_val, p_ctrl->power_setting[slave_index].delay); } break; } case CFG_WRITE_I2C_ARRAY: { struct msm_camera_i2c_reg_setting conf_array; struct msm_camera_i2c_reg_array *reg_setting = NULL; Loading Loading @@ -808,43 +745,6 @@ int32_t ov5645_sensor_config(struct msm_sensor_ctrl_t *s_ctrl, kfree(reg_setting); break; } case CFG_WRITE_I2C_SEQ_ARRAY: { struct msm_camera_i2c_seq_reg_setting conf_array; struct msm_camera_i2c_seq_reg_array *reg_setting = NULL; if (copy_from_user(&conf_array, (void *)cdata->cfg.setting, sizeof(struct msm_camera_i2c_seq_reg_setting))) { pr_err("%s:%d failed\n", __func__, __LINE__); rc = -EFAULT; break; } reg_setting = kzalloc(conf_array.size * (sizeof(struct msm_camera_i2c_seq_reg_array)), GFP_KERNEL); if (!reg_setting) { pr_err("%s:%d failed\n", __func__, __LINE__); rc = -ENOMEM; break; } if (copy_from_user(reg_setting, (void *)conf_array.reg_setting, conf_array.size * sizeof(struct msm_camera_i2c_seq_reg_array))) { pr_err("%s:%d failed\n", __func__, __LINE__); kfree(reg_setting); rc = -EFAULT; break; } conf_array.reg_setting = reg_setting; rc = s_ctrl->sensor_i2c_client->i2c_func_tbl-> i2c_write_seq_table(s_ctrl->sensor_i2c_client, &conf_array); kfree(reg_setting); break; } case CFG_POWER_UP: if (s_ctrl->func_tbl->sensor_power_up) rc = s_ctrl->func_tbl->sensor_power_up(s_ctrl); Loading Loading @@ -938,8 +838,260 @@ int32_t ov5645_sensor_config(struct msm_sensor_ctrl_t *s_ctrl, return rc; } #ifdef CONFIG_COMPAT int32_t ov5645_sensor_config32(struct msm_sensor_ctrl_t *s_ctrl, void __user *argp) { struct sensorb_cfg_data32 *cdata = (struct sensorb_cfg_data32 *)argp; long rc = 0; int32_t i = 0; mutex_lock(s_ctrl->msm_sensor_mutex); CDBG("%s:%d %s cfgtype = %d\n", __func__, __LINE__, s_ctrl->sensordata->sensor_name, cdata->cfgtype); switch (cdata->cfgtype) { case CFG_GET_SENSOR_INFO: memcpy(cdata->cfg.sensor_info.sensor_name, s_ctrl->sensordata->sensor_name, sizeof(cdata->cfg.sensor_info.sensor_name)); cdata->cfg.sensor_info.session_id = s_ctrl->sensordata->sensor_info->session_id; for (i = 0; i < SUB_MODULE_MAX; i++) cdata->cfg.sensor_info.subdev_id[i] = s_ctrl->sensordata->sensor_info->subdev_id[i]; cdata->cfg.sensor_info.is_mount_angle_valid = s_ctrl->sensordata->sensor_info->is_mount_angle_valid; cdata->cfg.sensor_info.sensor_mount_angle = s_ctrl->sensordata->sensor_info->sensor_mount_angle; cdata->cfg.sensor_info.position = s_ctrl->sensordata->sensor_info->position; cdata->cfg.sensor_info.modes_supported = s_ctrl->sensordata->sensor_info->modes_supported; CDBG("%s:%d sensor name %s\n", __func__, __LINE__, cdata->cfg.sensor_info.sensor_name); CDBG("%s:%d session id %d\n", __func__, __LINE__, cdata->cfg.sensor_info.session_id); for (i = 0; i < SUB_MODULE_MAX; i++) CDBG("%s:%d subdev_id[%d] %d\n", __func__, __LINE__, i, cdata->cfg.sensor_info.subdev_id[i]); CDBG("%s:%d mount angle valid %d value %d\n", __func__, __LINE__, cdata->cfg.sensor_info.is_mount_angle_valid, cdata->cfg.sensor_info.sensor_mount_angle); break; case CFG_SET_INIT_SETTING: /* 1. Write Recommend settings */ /* 2. Write change settings */ rc = s_ctrl->sensor_i2c_client->i2c_func_tbl-> i2c_write_conf_tbl( s_ctrl->sensor_i2c_client, ov5645_recommend_settings, ARRAY_SIZE(ov5645_recommend_settings), MSM_CAMERA_I2C_BYTE_DATA); break; case CFG_SET_RESOLUTION: { /*copy from user the desired resoltuion*/ enum msm_sensor_resolution_t res = MSM_SENSOR_INVALID_RES; if (copy_from_user(&res, (void *)compat_ptr(cdata->cfg.setting), sizeof(enum msm_sensor_resolution_t))) { pr_err("%s:%d failed\n", __func__, __LINE__); rc = -EFAULT; break; } pr_err("%s:%d res =%d\n", __func__, __LINE__, res); if (res == MSM_SENSOR_RES_FULL) { rc = s_ctrl->sensor_i2c_client->i2c_func_tbl-> i2c_write_conf_tbl( s_ctrl->sensor_i2c_client, ov5645_full_settings, ARRAY_SIZE(ov5645_full_settings), MSM_CAMERA_I2C_BYTE_DATA); pr_err("%s:%d res =%d\n ov5645_full_settings ", __func__, __LINE__, res); } else if (res == MSM_SENSOR_RES_QTR) { rc = s_ctrl->sensor_i2c_client->i2c_func_tbl-> i2c_write_conf_tbl( s_ctrl->sensor_i2c_client, ov5645_sxga_settings, ARRAY_SIZE(ov5645_sxga_settings), MSM_CAMERA_I2C_BYTE_DATA); pr_err("%s:%d res =%d ov5645_sxga_settings\n", __func__, __LINE__, res); } else if (res == MSM_SENSOR_RES_2) { rc = s_ctrl->sensor_i2c_client->i2c_func_tbl-> i2c_write_conf_tbl( s_ctrl->sensor_i2c_client, ov5645_1080P_settings, ARRAY_SIZE(ov5645_1080P_settings), MSM_CAMERA_I2C_BYTE_DATA); pr_err("%s:%d res =%d ov5645_1080P_settings\n", __func__, __LINE__, res); } else { pr_err("%s:%d failed resoultion set\n", __func__, __LINE__); rc = -EFAULT; } } break; case CFG_SET_STOP_STREAM: rc = s_ctrl->sensor_i2c_client->i2c_func_tbl-> i2c_write_conf_tbl( s_ctrl->sensor_i2c_client, ov5645_stop_settings, ARRAY_SIZE(ov5645_stop_settings), MSM_CAMERA_I2C_BYTE_DATA); break; case CFG_SET_START_STREAM: if (s_ctrl->camera_stream_type != MSM_CAMERA_STREAM_SNAPSHOT) { rc = s_ctrl->sensor_i2c_client->i2c_func_tbl-> i2c_write_conf_tbl( s_ctrl->sensor_i2c_client, ov5645_enable_aec_settings, ARRAY_SIZE(ov5645_enable_aec_settings), MSM_CAMERA_I2C_BYTE_DATA); } else { rc = s_ctrl->sensor_i2c_client->i2c_func_tbl-> i2c_write_conf_tbl( s_ctrl->sensor_i2c_client, ov5645_disable_aec_settings, ARRAY_SIZE(ov5645_disable_aec_settings), MSM_CAMERA_I2C_BYTE_DATA); } if (rc) { pr_err("%s:%d failed rc = %ld\n", __func__, __LINE__, rc); rc = -EFAULT; break; } rc = s_ctrl->sensor_i2c_client->i2c_func_tbl-> i2c_write_conf_tbl( s_ctrl->sensor_i2c_client, ov5645_start_settings, ARRAY_SIZE(ov5645_start_settings), MSM_CAMERA_I2C_BYTE_DATA); break; case CFG_GET_SENSOR_INIT_PARAMS: cdata->cfg.sensor_init_params.modes_supported = s_ctrl->sensordata->sensor_info->modes_supported; cdata->cfg.sensor_init_params.position = s_ctrl->sensordata->sensor_info->position; cdata->cfg.sensor_init_params.sensor_mount_angle = s_ctrl->sensordata->sensor_info->sensor_mount_angle; CDBG("%s:%d init params mode %d pos %d mount %d\n", __func__, __LINE__, cdata->cfg.sensor_init_params.modes_supported, cdata->cfg.sensor_init_params.position, cdata->cfg.sensor_init_params.sensor_mount_angle); break; case CFG_WRITE_I2C_ARRAY: { struct msm_camera_i2c_reg_setting32 conf_array32; struct msm_camera_i2c_reg_setting conf_array; struct msm_camera_i2c_reg_array *reg_setting = NULL; if (copy_from_user(&conf_array32, (void *)compat_ptr(cdata->cfg.setting), sizeof(struct msm_camera_i2c_reg_setting32))) { pr_err("%s:%d failed\n", __func__, __LINE__); rc = -EFAULT; break; } conf_array.addr_type = conf_array32.addr_type; conf_array.data_type = conf_array32.data_type; conf_array.delay = conf_array32.delay; conf_array.size = conf_array32.size; conf_array.reg_setting = compat_ptr(conf_array32.reg_setting); reg_setting = kzalloc(conf_array.size * (sizeof(struct msm_camera_i2c_reg_array)), GFP_KERNEL); if (!reg_setting) { pr_err("%s:%d failed\n", __func__, __LINE__); rc = -ENOMEM; break; } if (copy_from_user(reg_setting, (void *)conf_array.reg_setting, conf_array.size * sizeof(struct msm_camera_i2c_reg_array))) { pr_err("%s:%d failed\n", __func__, __LINE__); kfree(reg_setting); rc = -EFAULT; break; } conf_array.reg_setting = reg_setting; rc = s_ctrl->sensor_i2c_client->i2c_func_tbl->i2c_write_table( s_ctrl->sensor_i2c_client, &conf_array); kfree(reg_setting); break; } case CFG_POWER_UP: if (s_ctrl->func_tbl->sensor_power_up) rc = s_ctrl->func_tbl->sensor_power_up(s_ctrl); else rc = -EFAULT; break; case CFG_POWER_DOWN: if (s_ctrl->func_tbl->sensor_power_down) rc = s_ctrl->func_tbl->sensor_power_down(s_ctrl); else rc = -EFAULT; break; case CFG_SET_STREAM_TYPE: { enum msm_camera_stream_type_t stream_type = MSM_CAMERA_STREAM_INVALID; if (copy_from_user(&stream_type, (void *)compat_ptr(cdata->cfg.setting), sizeof(enum msm_camera_stream_type_t))) { pr_err("%s:%d failed\n", __func__, __LINE__); rc = -EFAULT; break; } s_ctrl->camera_stream_type = stream_type; break; } case CFG_SET_SATURATION: break; case CFG_SET_CONTRAST: break; case CFG_SET_SHARPNESS: break; case CFG_SET_AUTOFOCUS: /* TO-DO: set the Auto Focus */ pr_debug("%s: Setting Auto Focus", __func__); break; case CFG_CANCEL_AUTOFOCUS: /* TO-DO: Cancel the Auto Focus */ pr_debug("%s: Cancelling Auto Focus", __func__); break; case CFG_SET_ISO: break; case CFG_SET_EXPOSURE_COMPENSATION: break; case CFG_SET_EFFECT: break; case CFG_SET_ANTIBANDING: break; case CFG_SET_BESTSHOT_MODE: break; case CFG_SET_WHITE_BALANCE: break; default: pr_err("Invalid cfgtype func %s line %d cfgtype = %d\n", __func__, __LINE__, (int32_t)cdata->cfgtype); rc = -EFAULT; break; } mutex_unlock(s_ctrl->msm_sensor_mutex); return rc; } #endif static struct msm_sensor_fn_t ov5645_sensor_func_tbl = { .sensor_config = ov5645_sensor_config, #ifdef CONFIG_COMPAT .sensor_config32 = ov5645_sensor_config32, #endif .sensor_power_up = msm_sensor_power_up, .sensor_power_down = msm_sensor_power_down, .sensor_match_id = msm_sensor_match_id, Loading