static int tcm9001md_sensor_probe(const struct msm_camera_sensor_info *info, struct msm_sensor_ctrl *s) { int rc = i2c_add_driver(&tcm9001md_i2c_driver); printk(KERN_INFO "tcm9001md_sensor_probe: Called.....\n"); if (rc < 0 || tcm9001md_client == NULL) { rc = -ENOTSUPP; goto probe_done; } tcm9001mdinfo= info; rc = fih_cam_output_gpio_control(tcm9001mdinfo->vga_rst_pin, "tcm9001md", 0); if (rc) return rc; rc = fih_cam_output_gpio_control(tcm9001mdinfo->vga_pwdn_pin, "tcm9001md", 0); if (rc) return rc; rc = fih_cam_output_gpio_control(tcm9001mdinfo->vga_power_en_pin, "tcm9001md", 0); if (rc) return rc; s->s_init = tcm9001md_sensor_init; s->s_release = tcm9001md_sensor_release; s->s_config = tcm9001md_sensor_config; probe_done: CDBG("%s %s:%d\n", __FILE__, __func__, __LINE__); return rc; }
int tcm9001md_power_on(void) { int rc = 0; /* Setting MCLK = 24MHz */ msm_camio_clk_rate_set(24000000); msm_camio_camif_pad_reg_reset(); printk(KERN_INFO "%s: Setting MCLK = 24MHz \n", __func__); gpio_tlmm_config(GPIO_CFG(tcm9001mdinfo->vga_rst_pin, 0, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), GPIO_CFG_ENABLE); printk(KERN_INFO "%s: Re-set config for gpio %d .\n", __func__, tcm9001mdinfo->vga_rst_pin); gpio_tlmm_config(GPIO_CFG(tcm9001mdinfo->vga_pwdn_pin, 0, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), GPIO_CFG_ENABLE); printk(KERN_INFO "%s: Re-set config for gpio %d .\n", __func__, tcm9001mdinfo->vga_pwdn_pin); gpio_tlmm_config(GPIO_CFG(tcm9001mdinfo->vga_power_en_pin, 0, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), GPIO_CFG_ENABLE); printk(KERN_INFO "%s: Re-set config for gpio %d .\n", __func__, tcm9001mdinfo->vga_power_en_pin); /* Pull hight power enable = GPIO98 */ rc = fih_cam_output_gpio_control(tcm9001mdinfo->vga_power_en_pin, "tcm9001md", 1); if (rc) return rc; mdelay(1); //t1+t2+t3 = 1ms /* Pull hight PWRDWN = CAM_VGA_STANDBY */ rc = fih_cam_output_gpio_control(tcm9001mdinfo->vga_pwdn_pin, "tcm9001md", 1); if (rc) return rc; mdelay(2); //t4 = 1ms /* Enable MCLK = 24MHz */ gpio_tlmm_config(GPIO_CFG(tcm9001mdinfo->MCLK_PIN, 1, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), GPIO_CFG_ENABLE);//Div2-SW6-MM-MC-Camera-ModifiedPowerSequence-01* printk(KERN_INFO "%s: Output MCLK end. \n", __func__); mdelay(2); /* Pull Low PWRDWN = CAM_VGA_STANDBY */ rc = fih_cam_output_gpio_control(tcm9001mdinfo->vga_pwdn_pin, "tcm9001md", 0); if (rc) return rc; mdelay(2); //t5 = 2ms /* Pull High REDET = CAM_VGA_RST_N */ rc = fih_cam_output_gpio_control(tcm9001mdinfo->vga_rst_pin, "tcm9001md", 1); if (rc) return rc; mdelay(2); //t6 > 2ms //Div2-SW6-MM-MC-FrontCameraInitFail-00+{ #ifdef CONFIG_TCM9001MD_STANDBY tcm9001md_first_init = 0; #endif //Div2-SW6-MM-MC-FrontCameraInitFail-00+} return rc; }
int tcm9001md_power_off(void) { int rc = 0; /* Pull Low REDET = CAM_VGA_RST_N */ rc = fih_cam_output_gpio_control(tcm9001mdinfo->vga_rst_pin, "tcm9001md", 0); if (rc) return rc; mdelay(1); //t1 > 0ms /* Pull hight PWRDWN = CAM_VGA_STANDBY */ rc = fih_cam_output_gpio_control(tcm9001mdinfo->vga_pwdn_pin, "tcm9001md", 1); if (rc) return rc; mdelay(1); //t2 = 1ms /* Disable MCLK = 24MHz */ gpio_tlmm_config(GPIO_CFG(tcm9001mdinfo->MCLK_PIN, 0, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), GPIO_CFG_ENABLE); rc = fih_cam_output_gpio_control(tcm9001mdinfo->MCLK_PIN, "tcm9001md", 0); if (rc) return rc; printk("%s: Disable mclk\n", __func__); mdelay(1); //t3 = 1ms /* Pull Low power enable = GPIO98 */ rc = fih_cam_output_gpio_control(tcm9001mdinfo->vga_power_en_pin, "tcm9001md", 0); if (rc) return rc; //mdelay(1); //t4+t5 > 0ms /* Pull Low PWRDWN = CAM_VGA_STANDBY */ rc = fih_cam_output_gpio_control(tcm9001mdinfo->vga_pwdn_pin, "tcm9001md", 0); if (rc) return rc; #ifdef CONFIG_TCM9001MD_STANDBY tcm9001md_first_init = 1; #endif return rc; }
int tcm9001md_sensor_standby(int on) { int rc = 0; if(on == 1)//Entering stanby mode { //Software standby setting. Set this register with STANDBY. rc = tcm9001md_i2c_write(tcm9001md_client, 0xFF, 0x05);//SLEEP: 0h: ON (Standby), 1h: OFF (Normal) if (rc < 0) return rc; mdelay(1); rc = tcm9001md_i2c_write(tcm9001md_client, 0x18, 0x1C);//STANDBY: 0h: ON (Standby), 1h: OFF (Normal) if (rc < 0) return rc; printk(KERN_INFO "%s: SW standby done . \n", __func__); mdelay(1); // Enter HW standby /* Pull Low REDET = CAM_VGA_RST_N */ rc = fih_cam_output_gpio_control(tcm9001mdinfo->vga_rst_pin, "tcm9001md", 0); if (rc) return rc; mdelay(1); /* Pull hight PWRDWN = CAM_VGA_STANDBY */ rc = fih_cam_output_gpio_control(tcm9001mdinfo->vga_pwdn_pin, "tcm9001md", 1); if (rc) return rc; mdelay(1); /* Disable MCLK = 24MHz */ gpio_tlmm_config(GPIO_CFG(tcm9001mdinfo->MCLK_PIN, 0, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), GPIO_CFG_ENABLE); rc = fih_cam_output_gpio_control(tcm9001mdinfo->MCLK_PIN, "tcm9001md", 0); if (rc) return rc; printk("%s: Disable mclk\n", __func__); printk(KERN_INFO "%s: Enter Hw standby done . \n", __func__); } else//Exiting stanby mode { /* Setting MCLK = 24MHz */ msm_camio_clk_rate_set(24000000); msm_camio_camif_pad_reg_reset(); printk(KERN_INFO "%s: Setting MCLK = 24MHz \n", __func__); gpio_tlmm_config(GPIO_CFG(tcm9001mdinfo->MCLK_PIN, 1, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), GPIO_CFG_ENABLE);//Div2-SW6-MM-MC-Camera-ModifiedPowerSequence-01* printk(KERN_INFO "%s: Output MCLK end. \n", __func__); mdelay(1); /* Pull Low PWRDWN = CAM_VGA_STANDBY */ rc = fih_cam_output_gpio_control(tcm9001mdinfo->vga_pwdn_pin, "tcm9001md", 0); if (rc) return rc; mdelay(1); /* Pull High REDET = CAM_VGA_RST_N */ rc = fih_cam_output_gpio_control(tcm9001mdinfo->vga_rst_pin, "tcm9001md", 1); if (rc) return rc; mdelay(5);//Div2-SW6-MM-MC-AddErrorHandlingWhenCameraI2cReadAndWriteFail-00+ //Exit SW standby rc = tcm9001md_i2c_write(tcm9001md_client, 0x18, 0x9C);//STANDBY: 0h: ON (Standby), 1h: OFF (Normal) if (rc < 0) return rc; mdelay(1); rc = tcm9001md_i2c_write(tcm9001md_client, 0xFF, 0x85);//SLEEP: 0h: ON (Standby), 1h: OFF (Normal) if (rc < 0) return rc; printk(KERN_INFO "%s: Exit HW standby done. \n", __func__); } return rc; }
//Div2-SW6-MM-MC-BringUpHM0357ForSF5PCR-00*{ static int tcm9001md_sensor_probe(const struct msm_camera_sensor_info *info, struct msm_sensor_ctrl *s) { unsigned char v; int rc = i2c_add_driver(&tcm9001md_i2c_driver); printk(KERN_INFO "tcm9001md_sensor_probe: Called.....\n"); if (rc < 0 || tcm9001md_client == NULL) { rc = -ENOTSUPP; goto probe_done; } tcm9001mdinfo= info; v = 0; /* Init VGA pins state */ #if 0 gpio_tlmm_config(GPIO_CFG(tcm9001mdinfo->vga_rst_pin, 0, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), GPIO_CFG_ENABLE); printk(KERN_INFO "%s: Re-set config for gpio %d .\n", __func__, tcm9001mdinfo->vga_rst_pin); gpio_tlmm_config(GPIO_CFG(tcm9001mdinfo->vga_pwdn_pin, 0, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), GPIO_CFG_ENABLE); printk(KERN_INFO "%s: Re-set config for gpio %d .\n", __func__, tcm9001mdinfo->vga_pwdn_pin); gpio_tlmm_config(GPIO_CFG(tcm9001mdinfo->vga_power_en_pin, 0, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), GPIO_CFG_ENABLE); printk(KERN_INFO "%s: Re-set config for gpio %d .\n", __func__, tcm9001mdinfo->vga_power_en_pin); #endif rc = fih_cam_output_gpio_control(tcm9001mdinfo->vga_rst_pin, "tcm9001md", 0); if (rc) return rc; rc = fih_cam_output_gpio_control(tcm9001mdinfo->vga_pwdn_pin, "tcm9001md", 0); if (rc) return rc; rc = fih_cam_output_gpio_control(tcm9001mdinfo->vga_power_en_pin, "tcm9001md", 0); if (rc) return rc; /* Here to check sensor is existence */ msm_camio_clk_enable(CAMIO_CAM_MCLK_CLK); msleep(30); /* Setting MCLK = 24MHz */ msm_camio_clk_rate_set(24000000); //msm_camio_camif_pad_reg_reset(); printk(KERN_INFO "%s: Setting MCLK = 24MHz \n", __func__); /* Pull hight power enable = GPIO98 */ rc = fih_cam_output_gpio_control(tcm9001mdinfo->vga_power_en_pin, "tcm9001md", 1); if (rc) return rc; mdelay(1); //t1+t2+t3 = 1ms /* Pull hight PWRDWN = CAM_VGA_STANDBY */ rc = fih_cam_output_gpio_control(tcm9001mdinfo->vga_pwdn_pin, "tcm9001md", 1); if (rc) return rc; mdelay(2); //t4 = 1ms /* Enable MCLK = 24MHz */ gpio_tlmm_config(GPIO_CFG(tcm9001mdinfo->MCLK_PIN, 1, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), GPIO_CFG_ENABLE); printk(KERN_INFO "%s: Output MCLK end. \n", __func__); mdelay(2); /* Pull Low PWRDWN = CAM_VGA_STANDBY */ rc = fih_cam_output_gpio_control(tcm9001mdinfo->vga_pwdn_pin, "tcm9001md", 0); if (rc) return rc; mdelay(2); //t5 = 2ms /* Pull High REDET = CAM_VGA_RST_N */ rc = fih_cam_output_gpio_control(tcm9001mdinfo->vga_rst_pin, "tcm9001md", 1); if (rc) return rc; mdelay(2); //t6 > 2ms // Here to check chip version identification. rc = tcm9001md_i2c_read(tcm9001md_client, REG_TCM9001MD_MODEL_ID_1, &v); if (rc < 0 || v != TCM9001MD_MODEL_ID_1) { printk("tcm9001md_sensor_probe: ERR: Red MODEL_ID_1 = 0x%x failed !\n", v); goto probe_done; } printk("tcm9001md_sensor_probe: MODEL_ID_1 = 0x%x .\n", v); rc = tcm9001md_i2c_read(tcm9001md_client, REG_TCM9001MD_MODEL_ID_2, &v); if (rc < 0 || v != TCM9001MD_MODEL_ID_2) { printk("tcm9001md_sensor_probe: ERR: Red MODEL_ID_2 = 0x%x failed !\n", v); goto probe_done; } printk("tcm9001md_sensor_probe: MODEL_ID_2 = 0x%x .\n", v); s->s_init = tcm9001md_sensor_init; s->s_release = tcm9001md_sensor_release; s->s_config = tcm9001md_sensor_config; s->s_camera_type = FRONT_CAMERA_2D; s->s_mount_angle = 0; probe_done: tcm9001md_power_off(); msm_camio_clk_disable(CAMIO_CAM_MCLK_CLK); CDBG("%s %s:%d\n", __FILE__, __func__, __LINE__); return rc; }