static __s32 camera_mclk_open(__camera_detector_t *camera_detector) { __u32 i, csi_cnt = 0; detect_print("camera_mclk_open !!\n"); if (camera_sub_name_exist("csi0_para", "csi_used")) { csi_cnt++; } if (camera_sub_name_exist("csi1_para", "csi_used")) { csi_cnt++; } for (i = 0; i < csi_cnt; i++) { camera_request_clk(i, &camera_detector->camera[i].module_clk, &camera_detector->camera[i].clk_src, &camera_detector->camera[i].clk_pin_hdle); } if ((csi_cnt == 1) && (camera_detector->num == 2)) { camera_detector->camera[1].module_clk = camera_detector->camera[0].module_clk; } return 0; }
static __s32 camera_get_board_info(__camera_detector_t *camera_detector) { char *csi[2] = {"csi0_para", "csi1_para"}; __s32 value; __s32 ret; //get camera number if (camera_sub_name_exist(csi[0], "csi_used") && camera_sub_name_exist(csi[1], "csi_used")) { camera_detector->num = 2; } else if (camera_sub_name_exist(csi[0], "csi_used")) { ret = camera_get_sysconfig(csi[0], "csi_dev_qty", &value, 1); if (ret < 0) { return -ECFGNOEX; } else { camera_detector->num = value; if ((camera_detector->num > 2) || (camera_detector->num <= 0)) { return -ECAMNUMERR; } } } else { return -ECFGERR; } camera_get_para(camera_detector, 0, csi[0], FALSE); if (camera_detector->num == 2) { if (camera_sub_name_exist(csi[1], "csi_used")) { camera_get_para(camera_detector, 1, csi[1], FALSE); } else { camera_get_para(camera_detector, 1, csi[0], TRUE); } } //get I2C adapter camera_detector->camera[0].i2c_adap = i2c_get_adapter(camera_detector->camera[0].i2c_id); if (camera_detector->camera[0].i2c_adap == NULL) { camera_err("get I2C adapter fail, I2C id: %d \n", camera_detector->camera[0].i2c_id); return -EI2CADAPTER; } if (camera_detector->num == 2) { if (camera_detector->camera[0].i2c_id != camera_detector->camera[1].i2c_id) { camera_detector->camera[1].i2c_adap = i2c_get_adapter(camera_detector->camera[1].i2c_id); if (camera_detector->camera[1].i2c_adap == NULL) { camera_err("get I2C adapter fail, I2C id: %d \n", camera_detector->camera[1].i2c_id); return -EI2CADAPTER; } } else { camera_detector->camera[1].i2c_adap = camera_detector->camera[0].i2c_adap; } } return 0; }
static __s32 camera_mclk_open(__camera_detector_t *camera_detector) { // __u32 i, csi_cnt = 0; detect_print("camera_mclk_open !!\n"); if (camera_sub_name_exist("csi0", "vip_used")) { camera_request_clk(0, &camera_detector->camera[0].module_clk, &camera_detector->camera[0].clk_src, &camera_detector->camera[0].clk_pin_hdle); } if (camera_sub_name_exist("csi1", "vip_used")) { camera_request_clk(1, &camera_detector->camera[1].module_clk, &camera_detector->camera[1].clk_src, &camera_detector->camera[1].clk_pin_hdle); } return 0; }
static __s32 camera_init_module_list(__u32 camera_list_size) { __u32 i; detect_print("camera_list_size: %d \n", camera_list_size); for (i = 0; i < camera_list_size; i++) { if (camera_sub_name_exist("camera_list_para", camera_list[i].name)) { camera_list[i].need_detect = TRUE; detect_print("modules: %s need detect!!\n", camera_list[i].name); } } return 0; }
static int __init camera_detector_init(void) { int err = 0; __u32 camera_list_size; char *camera_list_para = "camera_list_para"; char *camera_list_para_used = "camera_list_para_used"; detect_print("camera detect driver init\n"); if (!camera_sub_name_exist(camera_list_para, camera_list_para_used)) { __s32 value, ret; ret = camera_get_sysconfig(camera_list_para, camera_list_para_used, &value, 1); if (ret < 0) { detect_print("[camera_list_para] not exist in sys_config1.fex !! \n"); } else if (value == 0) { detect_print("[camera_list_para]->camera_list_para_used = 0," "maybe somebody does not want to use camera detector ...... \n"); } detect_print("camera detector exit, it will do nothing ...... \n"); goto exit; } camera_detector_device.groups = dev_attr_groups; err = device_register(&camera_detector_device); if (err) { camera_err("%s register camera detect driver as misc device error\n", __FUNCTION__); goto exit; } memset(camera_detector, 0, sizeof(__camera_detector_t)); err = camera_get_board_info(camera_detector); if (err) { camera_err("camera_get_board_info fail !!\n"); goto exit; } camera_list_size = sizeof(camera_list) / sizeof(__camera_list_t); camera_init_module_list(camera_list_size); camera_mclk_open(camera_detector); if ((camera_detector->camera[0].i2c_id == camera_detector->camera[1].i2c_id) && (camera_detector->num == 2)) { camera_same_i2c_id_detect(camera_detector, camera_list, camera_list_size); } else if ((camera_detector->camera[0].i2c_id != camera_detector->camera[1].i2c_id) || (camera_detector->num == 1)) { camera_diff_i2c_id_detect(camera_detector, camera_list, camera_list_size); } camera_mclk_close(camera_detector); return 0; exit: return err; }