static int t4k35_flisclk_ctrl(struct v4l2_subdev *sd, int flag) { static const unsigned int clock_khz = 19200; //SR use osc clock 2 as rear MCLK, change to default clock 1 as rear MCLK after SR if (HW_ID == 0xFF) { HW_ID = Read_HW_ID(); } pr_info("HW_ID = %d\n", HW_ID); if(HW_ID == 0x3){ //SR pr_info("SR board!!\n"); return intel_scu_ipc_osc_clk(OSC_CLK_CAM1, flag ? clock_khz : 0); } else{//ER pr_info("ER board!!\n"); return intel_scu_ipc_osc_clk(OSC_CLK_CAM0, flag ? clock_khz : 0); } }
static int intel_kpd_led_rpmsg_probe(struct rpmsg_channel *rpdev) { int ret; int ret2; uint8_t data_led; dev_info(&rpdev->dev, "Probed kpd_led rpmsg device\n"); HW_ID = Read_HW_ID(); PROJ_ID = Read_PROJ_ID(); LED_for_old_HW = (PROJ_ID == PROJ_ID_PF400CG && HW_ID == 2) || (PROJ_ID == PROJ_ID_A400CG && (HW_ID == 0 || HW_ID == 4)); LED_for_new_HW = (PROJ_ID == PROJ_ID_PF400CG && (HW_ID == 6 || HW_ID == 1)) || (PROJ_ID == PROJ_ID_A400CG && (HW_ID != 0 && HW_ID != 4 )); ret = led_classdev_register(&rpdev->dev, &intel_led); if (ret) { dev_err(&rpdev->dev, "register led dev failed"); return ret; } ret = led_classdev_register(&rpdev->dev, &red_led); if (ret) { dev_err(&rpdev->dev, "register led dev failed"); return ret; } ret = intel_scu_ipc_iowrite8(PWM1_DUT_CYC_ER, 0x00); ret = intel_scu_ipc_iowrite8(PWM2_DUT_CYC_ER, 0x00); if(LED_for_old_HW || LED_for_new_HW){//PF400CG ER2:2, PR:6, MP:1 printk("[LED]: The HW_ID = %d \n",HW_ID); ret = gpio_request_one(LED_RED_GPIO, GPIOF_OUT_INIT_LOW, "RED_LED"); ret = gpio_request_one(LED_GREEN_GPIO, GPIOF_OUT_INIT_LOW, "GREEN_LED"); } led_update = true; intel_led_set(&intel_led, intel_led.brightness); #ifdef CONFIG_EEPROM_PADSTATION register_microp_notifier(&led_notifier); #endif //register_early_suspend(&intel_kpd_led_suspend_desc); return 0; }
/* * Checking the SOC type is temporary workaround to enable OV5670 * on Bodegabay (tangier) platform. Once standard regulator devices * (e.g. vprog2, vprog1) and control functions (pmic_avp) are added * for the platforms with tangier, then we can revert this change. * ([email protected]) */ static int ov5670_platform_init(struct i2c_client *client) { pr_info("%s()\n", __func__); if (PROJECT_ID == 0xFF) { PROJECT_ID = Read_PROJ_ID(); } pr_info("%s(%d):Project ID = %d\n", __func__, __LINE__, PROJECT_ID); if (HW_ID == 0xFF) { HW_ID = Read_HW_ID(); } pr_info("%s(%d):HW ID = %d\n", __func__, __LINE__, HW_ID); if (PCB_ID == 0xFF) { PCB_ID = Read_PCB_ID(); pr_info("%s(%d):PCB ID = %x\n", __func__, __LINE__, PCB_ID); switch (PROJECT_ID) { case PROJ_ID_Z580C: project_id = PCB_ID & 0x7; hardware_id = (PCB_ID & 0x38) >> 3; offset_0 = (PCB_ID & 0x40) >> 6; offset_1 = (PCB_ID & 0x80) >> 7; offset_2 = (PCB_ID & 0x700) >> 8; offset_3 = (PCB_ID & 0x1800) >> 11; offset_4 = (PCB_ID & 0x2000) >> 13; //offset_0: Panel ID, offset_1: Wifi ID, offset_2: RF ID, offset_3: Main Camera ID, offset_4: Sub Camera ID //PCB_ID = pentry->project_id | pentry->hardware_id << 3 | pentry->offset_0 << 6 | pentry->offset_1 << 7 | pentry->offset_2 << 8 | pentry->offset_3 << 11 | pentry->offset_4 << 13; pr_info("%s: project id = %d, hardware id = %d, offset_0 = %d, offset_1 = %d, offset_2 = %d, offset_3 = %d, offset_4 = %d\n", __func__, project_id, hardware_id, offset_0, offset_1, offset_2, offset_3, offset_4); break; default: break; } }
/* * The camera_v1p8_en gpio pin is to enable 1.8v power. */ static int ov5670_power_ctrl(struct v4l2_subdev *sd, int flag) { int ret = 0; printk("@%s PROJECT_ID = 0x%x, HW_ID = 0x%x\n", __func__, Read_PROJ_ID(), Read_HW_ID()); if (camera_1p2_en < 0) { ret = camera_sensor_gpio(-1,"INT_CAM_1V2_EN", GPIOF_DIR_OUT, 0); if (ret < 0){ printk("camera_1p2_en not available.\n"); return ret; } camera_1p2_en = ret; printk(KERN_INFO "ov5670, gpio number, camera_1p2_en is %d\n", camera_1p2_en); } if (camera_2v8 < 0) { ret = camera_sensor_gpio(-1, "INT_CAM_2V8_EN", GPIOF_DIR_OUT, 0); if (ret < 0){ printk("INT_CAM_2V8_EN not available.\n"); return ret; } camera_2v8 = ret; printk("<< camera_2v8:%d, flag:%d\n", camera_2v8, flag); } if (flag) { switch (Read_PROJ_ID()) { case PROJ_ID_ZE550ML: case PROJ_ID_ZE551ML: case PROJ_ID_ZR550ML: case PROJ_ID_ZX550ML: switch (Read_HW_ID()) { case HW_ID_EVB: pr_info("Hardware VERSION = EVB, ov5670 does not support.\n"); break; case HW_ID_SR1: case HW_ID_SR2: case HW_ID_ER: case HW_ID_ER1_1: case HW_ID_ER1_2: case HW_ID_PR: case HW_ID_pre_PR: case HW_ID_MP: pr_info("ov5670 --> HW_ID = 0x%x\n", Read_HW_ID()); //turn on power 2.8V if (camera_2v8 >= 0){ gpio_set_value(camera_2v8, 1); printk(KERN_ALERT "ov5670 <<< camera_2v8 = 1\n"); } //turn on power 1.8V if (!camera_vprog2_on) { camera_vprog2_on = 1; ret = intel_scu_ipc_iowrite8(MSIC_VPROG2_MRFLD_CTRL, MSIC_VPROG2_ON_1P8); if (ret){ printk(KERN_INFO "set vprog2 fails\n"); return -1; } msleep(1); } break; default: pr_info("ov5670 --> HW_ID 0x%x is not defined\n", Read_HW_ID()); break; } break; case PROJ_ID_ZE500ML: switch (Read_HW_ID()) { case HW_ID_EVB: pr_info("ov5670 --> HW_ID = 0x%x\n", Read_HW_ID()); //turn on power 1.8V if (!camera_vprog2_on) { camera_vprog2_on = 1; ret = intel_scu_ipc_iowrite8(MSIC_VPROG2_MRFLD_CTRL, MSIC_VPROG2_ON_1P8); if (ret){ printk(KERN_INFO "set vprog2 fails\n"); return -1; } msleep(1); } //turn on power 2.8V if (!camera_vprog1_on) { camera_vprog1_on = 1; intel_scu_ipc_iowrite8(MSIC_VPROG1_MRFLD_CTRL ,MSIC_VPROG1_ON_2P8); if (ret){ printk(KERN_INFO "set vprog1 fails\n"); return -1; } msleep(1); } break; case HW_ID_SR1: case HW_ID_SR2: case HW_ID_ER: case HW_ID_pre_PR: case HW_ID_PR: case HW_ID_MP: pr_info("HW_ID 0x%x, ov5670 does not support.\n", Read_HW_ID()); break; default: pr_info("ov5670 --> HW_ID 0x%x is not defined\n", Read_HW_ID()); break; } break; default: pr_info("Project ID is not defined\n"); break; }//end switch //turn on power 1.2V gpio_set_value(camera_1p2_en, 1); printk(KERN_INFO "ov5670---camera_1p2_en is %d\n", camera_1p2_en); usleep_range(10000, 11000); //flag == 0 } else { //turn OFF power 1.2V gpio_set_value(camera_1p2_en, 0); gpio_free(camera_1p2_en); camera_1p2_en = -1; switch (Read_PROJ_ID()) { case PROJ_ID_ZE550ML: case PROJ_ID_ZE551ML: case PROJ_ID_ZR550ML: case PROJ_ID_ZX550ML: switch (Read_HW_ID()) { case HW_ID_EVB: pr_info("Hardware VERSION = EVB, ov5670 does not support.\n"); break; case HW_ID_SR1: case HW_ID_SR2: case HW_ID_ER: case HW_ID_ER1_1: case HW_ID_ER1_2: case HW_ID_PR: case HW_ID_pre_PR: case HW_ID_MP: pr_info("ov5670 --> HW_ID = 0x%x\n", Read_HW_ID()); //turn off power 2.8V if (camera_2v8 >= 0){ gpio_set_value(camera_2v8, 0); gpio_free(camera_2v8); camera_2v8 = -1; printk("<<< camera_2v8 = 0\n"); } break; default: pr_info("ov5670 --> HW_ID is not defined\n"); break; } break; case PROJ_ID_ZE500ML: switch (Read_HW_ID()) { case HW_ID_EVB: pr_info("ov5670 --> HW_ID = 0x%x\n", Read_HW_ID()); //turn off power 2.8V if (camera_vprog1_on) { camera_vprog1_on = 0; ret = intel_scu_ipc_iowrite8(MSIC_VPROG1_MRFLD_CTRL, MSIC_VPROG1_OFF); if (ret) { printk(KERN_ALERT "Failed to disable regulator vprog1\n"); return ret; } printk("<<< 2.8V = 0\n"); } break; case HW_ID_SR1: case HW_ID_SR2: case HW_ID_ER: case HW_ID_PR: case HW_ID_pre_PR: case HW_ID_MP: pr_info("HW_ID 0x%x, ov5670 does not support.\n", Read_HW_ID()); break; default: pr_info("ov5670 --> HW_ID is not defined\n"); break; } break; default: pr_info("Project ID is not defined\n"); break; }//end switch //turn off power 1.8V if (camera_vprog2_on) { camera_vprog2_on = 0; ret = intel_scu_ipc_iowrite8(MSIC_VPROG2_MRFLD_CTRL, MSIC_VPROG2_OFF); if (ret) { printk(KERN_ALERT "Failed to disable regulator vprog2\n"); return ret; } printk("<<< 1.8V= 0\n"); } }//end if return 0; }
static int m10mo_power_ctrl(struct v4l2_subdev *sd, int flag) { int ret = 0; pr_info("M10MO power control. flag=%d\n", flag); if(Read_PROJ_ID() != PROJ_ID_ZX550ML){ pr_err("M10MO, this is not ZX550ML, break! \n"); return -1; } set_flis_value(0x3221, 0x2D18); #ifdef CONFIG_CRYSTAL_COVE if (flag) { ret = intel_mid_pmic_writeb(VPROG_2P8V, VPROG_ENABLE); if (ret) { pr_err("Failed to power on V2P8SX.\n"); return ret; } ret = intel_mid_pmic_writeb(VPROG_1P2V, VPROG_ENABLE); if (ret) { pr_err("Failed to power on V1P2SX.\n"); /* Turn all powers off if one is failed. */ intel_mid_pmic_writeb(VPROG_2P8V, VPROG_DISABLE); return ret; } /* Wait for 8ms to make all the power supplies to be stable. */ usleep_range(8000, 8000); } else { /* Turn all powers off even when some are failed. */ if (intel_mid_pmic_writeb(VPROG_2P8V, VPROG_DISABLE)) pr_err("Failed to power off V2P8SX.\n"); if (intel_mid_pmic_writeb(VPROG_1P2V, VPROG_DISABLE)) pr_err("Failed to power off V1P2SX.\n"); } #else if (camera_1p2_en < 0) { lnw_gpio_set_alt(55, LNW_GPIO); ret = camera_sensor_gpio(55,"INT_CAM_1V2_EN", GPIOF_DIR_OUT, 0); if (ret < 0){ printk("camera_1p2_en is not available.\n"); return ret; } camera_1p2_en = ret; printk(KERN_INFO "M10MO, gpio number, camera_1p2_en is %d\n", camera_1p2_en); } switch (Read_HW_ID()) { case HW_ID_EVB: case HW_ID_SR1: case HW_ID_SR2: case HW_ID_ER: case HW_ID_ER1_1: case HW_ID_ER1_2: case HW_ID_PR: case HW_ID_pre_PR: case HW_ID_MP: if (camera_3p3_en2 < 0) { gpio_free(58);/////// temp WA. lnw_gpio_set_alt(58, LNW_GPIO); ret = camera_sensor_gpio(58, "3X_I2C_LED", GPIOF_DIR_OUT, 0); if (ret < 0){ printk("GPIO58 is not available.\n"); }else{ camera_3p3_en2 = ret; printk(KERN_INFO "M10MO, gpio number, camera_3p3_en2 is %d\n", camera_3p3_en2); } } break; default: if (camera_3p3_en2 < 0) { gpio_free(54);/////// temp WA. lnw_gpio_set_alt(54, LNW_GPIO); ret = camera_sensor_gpio(54, "3X_I2C_LED", GPIOF_DIR_OUT, 0); if (ret < 0){ printk("GPIO54 is not available.\n"); }else{ camera_3p3_en2 = ret; printk(KERN_INFO "M10MO, gpio number, camera_3p3_en2 is %d\n", camera_3p3_en2); } } break; }//switch if (camera_2p8_en < 0) { lnw_gpio_set_alt(56, LNW_GPIO); ret = camera_sensor_gpio(56,"INT_CAM_2V8_EN", GPIOF_DIR_OUT, 0); if (ret < 0){ printk("camera_2p8_en not available.\n"); return ret; } camera_2p8_en = ret; printk(KERN_INFO "M10MO, gpio number, camera_2p8_en is %d\n", camera_2p8_en); } if (flag) { /* static int camera_1p2_en = -1; static int camera_2p8_en = -1; static int camera_isp_1p2_en = -1; */ if(camera_1p2_en > 0){ printk("@%s %d, project zx550ml pull up GPIO%d\n", __func__, __LINE__, camera_1p2_en); gpio_set_value(camera_1p2_en, 1); } #if 0 ret = intel_scu_ipc_iowrite8(MSIC_VPROG2_MRFLD_CTRL, MSIC_VPROG2_ON_1P8); if (ret) { pr_err("Failed to power on M10MO MSIC_VPROG2_ON_1P8.\n"); return ret; } #endif if(camera_3p3_en2 > 0){ mdelay(1); printk("@%s %d, project zx550ml pull up GPIO%d\n", __func__, __LINE__, camera_3p3_en2); gpio_set_value(camera_3p3_en2, 1); } mdelay(1); ret = intel_scu_ipc_iowrite8(MSIC_VPROG1_MRFLD_CTRL, MSIC_VPROG1_ON_1P8); if (ret) { pr_err("Failed to power on M10MO MSIC_VPROG1_ON_1P8.\n"); return ret; }else{ printk("@%s %d, project zx550ml pull up Vprog1, 1.8V \n", __func__, __LINE__); } if(camera_2p8_en > 0){ printk("@%s %d, project zx550ml pull up GPIO%d\n", __func__, __LINE__, camera_2p8_en); gpio_set_value(camera_2p8_en, 1); } /* Wait for 8ms to make all the power supplies to be stable. */ usleep_range(8000, 8000); } else { /* static int camera_1p2_en = -1; static int camera_2p8_en = -1; static int camera_isp_1p2_en = -1; */ ret = intel_scu_ipc_iowrite8(MSIC_VPROG1_MRFLD_CTRL, MSIC_VPROG1_OFF); if (ret) { pr_err("Failed to power off M10MO MSIC_VPROG1_ON_2P8.\n"); return ret; } gpio_set_value(camera_2p8_en, 0); camera_sensor_gpio_free(camera_2p8_en); camera_2p8_en = -1; gpio_set_value(camera_1p2_en, 0); camera_sensor_gpio_free(camera_1p2_en); camera_1p2_en = -1; gpio_set_value(camera_3p3_en2, 0); camera_sensor_gpio_free(camera_3p3_en2); camera_3p3_en2 = -1; camera_sensor_gpio_free(camera_reset); camera_reset = -1; } #endif return ret; }
static int mt9m114_power_ctrl(struct v4l2_subdev *sd, int flag) { int reg_err; int ret, SPI_ret=0; printk("%s: ++\n",__func__); if (HW_ID == 0xFF){ HW_ID = Read_HW_ID(); } if (PROJECT_ID == 0xFF) { PROJECT_ID = Read_PROJ_ID(); } if (PROJECT_ID==PROJ_ID_ME302C) { switch (HW_ID) { case HW_ID_SR1: case HW_ID_SR2: case HW_ID_ER: SPI_ENABLE=0; break; case HW_ID_PR: case HW_ID_MP: SPI_ENABLE=1; break; default: SPI_ENABLE=1; } } if (PROJECT_ID==PROJ_ID_ME372CG) { switch (HW_ID) { case HW_ID_SR1: //for EVB SPI_ENABLE=0; break; case HW_ID_SR2: //for SR1 case HW_ID_ER: case HW_ID_PR: case HW_ID_MP: SPI_ENABLE=1; break; default: SPI_ENABLE=1; } } if (PROJECT_ID==PROJ_ID_ME372C) { switch (HW_ID) { case HW_ID_SR1: //for EVB SPI_ENABLE=0; break; case HW_ID_SR2: //for SR1 case HW_ID_ER: case HW_ID_PR: case HW_ID_MP: SPI_ENABLE=1; break; default: SPI_ENABLE=1; } } if (PROJECT_ID==PROJ_ID_GEMINI) { switch (HW_ID) { case HW_ID_SR1: SPI_ENABLE=0; break; case HW_ID_SR2: case HW_ID_ER: case HW_ID_PR: case HW_ID_MP: SPI_ENABLE=1; break; default: SPI_ENABLE=1; } } SPI_ret=spi_init_extra_parameter(); if (SPI_ret==SPI_magic_number) { SPI_ENABLE=1; } else if (SPI_ret==EEPROM_magic_number) { SPI_ENABLE=0; } //printk("HW ID:%d\n", HW_ID); switch (HW_ID){ case HW_ID_SR1: case HW_ID_SR2: if (camera_power_1p2_en < 0) { ret = camera_sensor_gpio(-1, GP_CAMERA_ISP_POWER_1P2_EN, GPIOF_DIR_OUT, 0); if (ret < 0){ printk("%s not available.\n", GP_CAMERA_ISP_POWER_1P2_EN); return ret; } camera_power_1p2_en = ret; } if (camera_reset < 0) { ret = camera_sensor_gpio(-1, GP_CAMERA_ISP_RESET, GPIOF_DIR_OUT, 0); if (ret < 0){ printk("%s not available.\n", GP_CAMERA_ISP_RESET); return ret; } camera_reset = ret; } if (camera_suspend < 0) { ret = camera_sensor_gpio(-1, GP_CAMERA_ISP_SUSPEND, GPIOF_DIR_OUT, 0); if (ret < 0){ printk("%s not available.\n", GP_CAMERA_ISP_SUSPEND); return ret; } camera_suspend = ret; } break; case HW_ID_ER: case HW_ID_PR: case HW_ID_MP: default: printk("@@@@@HW_ID is unknow:%d, use SR2 setting\n", HW_ID); if (camera_power_1p2_en < 0) { ret = camera_sensor_gpio(111, GP_CAMERA_ISP_POWER_1P2_EN, GPIOF_DIR_OUT, 0); if (ret < 0){ printk("%s not available.\n", GP_CAMERA_ISP_POWER_1P2_EN); return ret; } camera_power_1p2_en = 111; } if (camera_reset < 0) { ret = camera_sensor_gpio(161, GP_CAMERA_ISP_RESET, GPIOF_DIR_OUT, 0); if (ret < 0){ printk("%s not available.\n", GP_CAMERA_ISP_RESET); return ret; } camera_reset = 161; } if (camera_suspend < 0) { ret = camera_sensor_gpio(162, GP_CAMERA_ISP_SUSPEND, GPIOF_DIR_OUT, 0); if (ret < 0){ printk("%s not available.\n", GP_CAMERA_ISP_SUSPEND); return ret; } camera_suspend = 162; } break; } printk("<<1p2_en:%d, reset:%d, suspend:%d, flag:%d\n", camera_power_1p2_en, camera_reset, camera_suspend, flag); if (flag){ //pull low reset first if (camera_reset >= 0){ gpio_set_value(camera_reset, 0); printk("<<< camera_reset = 0\n"); msleep(1); } //turn on DVDD power 1.2V if (camera_power_1p2_en >= 0){ gpio_set_value(camera_power_1p2_en, 1); printk("<<< DVDD 1.2V = 1\n"); msleep(1); } //turn on power VDD_SEN VDD_HOST 1.8V if (!camera_vprog1_on) { camera_vprog1_on = 1; reg_err = regulator_enable(vprog1_reg); if (reg_err) { printk(KERN_ALERT "Failed to enable regulator vprog1\n"); return reg_err; } printk("<<< VDD_SEN VDD_HOST 1.8V = 1\n"); msleep(10); } //turn on power AVDD 2.8V if (!camera_vprog2_on) { camera_vprog2_on = 1; reg_err = regulator_enable(vprog2_reg); if (reg_err) { printk(KERN_ALERT "Failed to enable regulator vprog2\n"); return reg_err; } printk("<<< AVDD 2.8V = 1\n"); msleep(10); } //turn on MCLK mt9m114_flisclk_ctrl(sd, 1); msleep(1); //need wait 16 clk cycle //FW_BSP++ if (SPI_ENABLE==0) { //Pull high suspend to load fw from SPI if (camera_suspend >= 0){ gpio_set_value(camera_suspend, 1); printk("<<< suspend = 1, load fw\n"); } //Reset control if (camera_reset >= 0){ gpio_set_value(camera_reset, 1); printk("<<< reset = 1\n"); msleep(6); //wait 6ms } } else { //Pull low suspend to load fw from host if (camera_suspend >= 0){ gpio_set_value(camera_suspend, 0); printk("<<< suspend = 0, load fw\n"); } lnw_gpio_set_alt(GP_AON_019, LNW_GPIO); lnw_gpio_set_alt(GP_AON_021, LNW_GPIO); lnw_gpio_set_alt(GP_AON_023, LNW_GPIO); if (camera_SPI_1_SS3 < 0) { ret = camera_sensor_gpio(GP_AON_019, GP_CAMERA_SPI_SS3, GPIOF_DIR_OUT, 0); if (ret < 0){ printk("%s not available.\n", GP_CAMERA_SPI_SS3); return ret; } camera_SPI_1_SS3= GP_AON_019; } if (camera_SPI_1_SDO < 0) { ret = camera_sensor_gpio(GP_AON_021, GP_CAMERA_SPI_SDO, GPIOF_DIR_OUT, 0); if (ret < 0){ printk("%s not available.\n", GP_CAMERA_SPI_SDO); return ret; } camera_SPI_1_SDO= GP_AON_021; } if (camera_SPI_1_CLK < 0) { ret = camera_sensor_gpio(GP_AON_023, GP_CAMERA_SPI_CLK, GPIOF_DIR_OUT, 1); if (ret < 0){ printk("%s not available.\n", GP_CAMERA_SPI_CLK); return ret; } camera_SPI_1_CLK = GP_AON_023; } if (camera_SPI_1_SS3 >= 0){ gpio_set_value(camera_SPI_1_SS3, 0); printk("<<< SPI SS3 = 0\n"); } if (camera_SPI_1_SDO >= 0){ gpio_set_value(camera_SPI_1_SDO, 0); printk("<<< SPI SDO = 0\n"); } if (camera_SPI_1_CLK >= 0){ gpio_set_value(camera_SPI_1_CLK, 1); printk("<<< SPI CLK = 1\n"); msleep(6); } //Reset control if (camera_reset >= 0){ gpio_set_value(camera_reset, 1); printk("<<< reset = 1\n"); msleep(6); //wait 6ms } if (camera_SPI_1_SS3 >= 0){ gpio_free(camera_SPI_1_SS3); camera_SPI_1_SS3 = -1; } if (camera_SPI_1_SDO >= 0){ gpio_free(camera_SPI_1_SDO); camera_SPI_1_SDO = -1; } if (camera_SPI_1_CLK >= 0){ gpio_set_value(camera_SPI_1_CLK, 0); printk("<<< SPI CLK = 0\n"); gpio_free(camera_SPI_1_CLK); camera_SPI_1_CLK = -1; } lnw_gpio_set_alt(GP_AON_019, LNW_ALT_1); lnw_gpio_set_alt(GP_AON_021, LNW_ALT_1); lnw_gpio_set_alt(GP_AON_023, LNW_ALT_1); } //FW_BSP-- //Pull low suspend if (camera_suspend >= 0){ gpio_set_value(camera_suspend, 0); printk("<<< suspend = 0\n"); } msleep(10); //delay time for first i2c command }else{ //pull low reset if (camera_reset >= 0){ gpio_set_value(camera_reset, 0); printk("<<< reset = 0\n"); gpio_free(camera_reset); camera_reset = -1; } //turn off MCLK mt9m114_flisclk_ctrl(sd, 0); //turn off power AVDD 2.8V if (camera_vprog2_on) { camera_vprog2_on = 0; reg_err = regulator_disable(vprog2_reg); if (reg_err) { printk(KERN_ALERT "Failed to disable regulator vprog2\n"); return reg_err; } printk("<<< AVDD 2.8V = 0\n"); msleep(10); } lnw_gpio_set_alt(GP_AON_019, LNW_GPIO); lnw_gpio_set_alt(GP_AON_021, LNW_GPIO); if (camera_SPI_1_SS3 < 0) { ret = camera_sensor_gpio(GP_AON_019, GP_CAMERA_SPI_SS3, GPIOF_DIR_OUT, 0); if (ret < 0){ printk("%s not available.\n", GP_CAMERA_SPI_SS3); return ret; } camera_SPI_1_SS3= GP_AON_019; } if (camera_SPI_1_SDO < 0) { ret = camera_sensor_gpio(GP_AON_021, GP_CAMERA_SPI_SDO, GPIOF_DIR_OUT, 0); if (ret < 0){ printk("%s not available.\n", GP_CAMERA_SPI_SDO); return ret; } camera_SPI_1_SDO= GP_AON_021; } if (camera_SPI_1_SS3 >= 0){ gpio_set_value(camera_SPI_1_SS3, 0); printk("<<< SPI SS3 = 0\n"); gpio_free(camera_SPI_1_SS3); camera_SPI_1_SS3 = -1; mdelay(1); } if (camera_SPI_1_SDO >= 0){ gpio_set_value(camera_SPI_1_SDO, 0); printk("<<< SPI SDO = 0\n"); gpio_free(camera_SPI_1_SDO); camera_SPI_1_SDO = -1; mdelay(1); } //turn off power VDD_SEN VDD_HOST 1.8V if (camera_vprog1_on) { camera_vprog1_on = 0; reg_err = regulator_disable(vprog1_reg); if (reg_err) { printk(KERN_ALERT "Failed to disable regulator vprog1\n"); return reg_err; } printk("<<< VDD_SEN VDD_HOST 1.8V = 0\n"); msleep(10); } //turn off DVDD power 1.2V if (camera_power_1p2_en >= 0){ gpio_set_value(camera_power_1p2_en, 0); printk("<<< DVDD 1.2V = 0\n"); gpio_free(camera_power_1p2_en); camera_power_1p2_en = -1; } msleep(1); //release suspend gpio if (camera_suspend >= 0){ printk("<<< Release camera_suspend pin:%d\n", camera_suspend); gpio_free(camera_suspend); camera_suspend = -1; } } return 0; }
void otm1284a_vid_init(struct drm_device *dev, struct panel_funcs *p_funcs) { int ret = 0; printk("[DISP] %s\n", __func__); p_funcs->get_config_mode = otm1284a_vid_get_config_mode; p_funcs->get_panel_info = otm1284a_vid_get_panel_info; p_funcs->dsi_controller_init = otm1284a_vid_dsi_controller_init; p_funcs->detect = otm1284a_vid_detect; p_funcs->power_on = otm1284a_vid_power_on; p_funcs->drv_ic_init = otm1284a_vid_drv_ic_init; p_funcs->power_off = otm1284a_vid_power_off; p_funcs->reset = otm1284a_vid_reset; p_funcs->set_brightness = otm1284a_vid_set_brightness; printk("[DISP] Orise reset workqueue init!\n"); INIT_DELAYED_WORK(&orise1284a_panel_reset_delay_work, orise1284a_vid_panel_reset_delay_work); orise1284a_panel_reset_delay_wq = create_workqueue("orise1284a_panel_reset_delay_timer"); if (unlikely(!orise1284a_panel_reset_delay_wq)) { printk("%s : unable to create Panel reset workqueue\n", __func__); } #ifdef OTM1284A_DEBUG sysfs_create_group(&dev->dev->kobj, &otm1284a_attr_group); #endif if (Read_HW_ID() == HW_ID_EVB) lcd_id = ZE500ML_HSD; else if (Read_PROJ_ID() == PROJ_ID_ZE500ML) { if (Read_LCD_ID() == ZE500ML_LCD_ID_HSD) lcd_id = ZE500ML_HSD; else if (Read_LCD_ID() == ZE500ML_LCD_ID_CTP) lcd_id = ZE500ML_CTP; else if (Read_LCD_ID() == ZE500ML_LCD_ID_TM) lcd_id = ZE500ML_TM; } else if (Read_PROJ_ID() == PROJ_ID_ZE550ML) { if (Read_LCD_ID() == ZE550ML_LCD_ID_OTM_TM) { switch(Read_HW_ID()) { case HW_ID_SR1: case HW_ID_SR2: lcd_id = ZE550ML_TM_SR; break; case HW_ID_ER: case HW_ID_ER1_1: case HW_ID_ER1_2: lcd_id = ZE550ML_TM; break; default: lcd_id = ZE550ML_TM_MP; break; } } else { lcd_id = ZE550ML_CPT; } } printk("[DISP] %s : Panel ID = %d, ", __func__, lcd_id); switch(lcd_id) { case 1: printk("ZE500ML_HSD registered.\n"); break; case 2: printk("ZE500ML_CTP registered.\n"); break; case 3: printk("ZE500ML_TM registered.\n"); break; case 4: printk("ZE550ML_TM registered.\n"); break; case 5: printk("ZE550ML_CPT registered.\n"); break; case 6: printk("ZE550ML_TM SR registered.\n"); break; case 7: printk("ZE550ML_TM MP registered.\n"); break; } }
/** * Set up the display clock * */ void mrfld_setup_pll(struct drm_device *dev, int pipe, int clk) { DRM_DRIVER_PRIVATE_T *dev_priv = dev->dev_private; int refclk = 0; int clk_n = 0, clk_p2 = 0, clk_byte = 1, m_conv = 0, clk_tmp = 0; struct mrst_clock_t clock; bool ok; u32 pll = 0, fp = 0; bool is_mipi = false, is_mipi2 = false, is_hdmi = false; struct mdfld_dsi_config *dsi_config = NULL; struct mdfld_dsi_hw_context *ctx = NULL; PSB_DEBUG_ENTRY("pipe = 0x%x\n", pipe); if (pipe == 0) dsi_config = dev_priv->dsi_configs[0]; else if (pipe == 2) dsi_config = dev_priv->dsi_configs[1]; if ((pipe != 1) && !dsi_config) { DRM_ERROR("Invalid DSI config\n"); return; } if (pipe != 1) { ctx = &dsi_config->dsi_hw_context; mutex_lock(&dsi_config->context_lock); } switch (pipe) { case 0: is_mipi = true; break; case 1: is_hdmi = true; break; case 2: is_mipi2 = true; break; } if ((dev_priv->ksel == KSEL_CRYSTAL_19) || (dev_priv->ksel == KSEL_BYPASS_19)) { refclk = 19200; if (is_mipi || is_mipi2) { clk_n = 1, clk_p2 = 8; } else if (is_hdmi) { clk_n = 1, clk_p2 = 10; } } else if (dev_priv->ksel == KSEL_BYPASS_25) { refclk = 25000; if (is_mipi || is_mipi2) { clk_n = 1, clk_p2 = 8; } else if (is_hdmi) { clk_n = 1, clk_p2 = 10; } } else if ((dev_priv->ksel == KSEL_BYPASS_83_100) && (dev_priv->core_freq == 166)) { refclk = 83000; if (is_mipi || is_mipi2) { clk_n = 4, clk_p2 = 8; } else if (is_hdmi) { clk_n = 4, clk_p2 = 10; } } else if ((dev_priv->ksel == KSEL_BYPASS_83_100) && (dev_priv->core_freq == 100 || dev_priv->core_freq == 200)) { refclk = 100000; if (is_mipi || is_mipi2) { clk_n = 4, clk_p2 = 8; } else if (is_hdmi) { clk_n = 4, clk_p2 = 10; } } if (is_mipi || is_mipi2) clk_byte = 3; clk_tmp = clk * clk_n * clk_p2 * clk_byte; PSB_DEBUG_ENTRY("clk = %d, clk_n = %d, clk_p2 = %d. \n", clk, clk_n, clk_p2); PSB_DEBUG_ENTRY("clk = %d, clk_tmp = %d, clk_byte = %d. \n", clk, clk_tmp, clk_byte); ok = mrfld_find_best_PLL(dev, pipe, clk_tmp, refclk, &clock); dev_priv->tmds_clock_khz = clock.dot / (clk_n * clk_p2 * clk_byte); /* * FIXME: Hard code the divisors' value for JDI panel, and need to * calculate them according to the DSI PLL HAS spec. */ if (pipe != 1) { switch(get_panel_type(dev, pipe)) { case SDC_16x25_CMD: clock.p1 = 3; clock.m = 126; break; case SHARP_10x19_VID: case SHARP_10x19_CMD: clock.p1 = 3; clock.m = 137; break; case SHARP_10x19_DUAL_CMD: clock.p1 = 3; clock.m = 125; break; case CMI_7x12_CMD: clock.p1 = 4; clock.m = 120; break; case SDC_25x16_CMD: case JDI_25x16_CMD: case SHARP_25x16_CMD: clock.p1 = 3; clock.m = 138; break; case SHARP_25x16_VID: case JDI_25x16_VID: clock.p1 = 3; clock.m = 140; break; case JDI_7x12_VID: clock.p1 = 5; clk_n = 1; clock.m = 144; break; case OTM1284A_VID: if (Read_HW_ID() == HW_ID_EVB) { clock.p1 = 3; clock.m = 125; } break; } clk_n = 1; } if (!ok) { DRM_ERROR("mdfldFindBestPLL fail in mrfld_crtc_mode_set.\n"); } else { m_conv = mrfld_m_converts[(clock.m - MRFLD_M_MIN)]; PSB_DEBUG_ENTRY("dot clock = %d," "m = %d, p1 = %d, m_conv = %d. \n", clock.dot, clock.m, clock.p1, m_conv); } /* Write the N1 & M1 parameters into DSI_PLL_DIV_REG */ fp = (clk_n / 2) << 16; fp |= m_conv; if (is_mipi) { /* Enable DSI PLL clocks for DSI0 rather than CCK. */ pll |= _CLK_EN_PLL_DSI0; pll &= ~_CLK_EN_CCK_DSI0; /* Select DSI PLL as the source of the mux input clocks. */ pll &= ~_DSI_MUX_SEL_CCK_DSI0; } if (is_mipi2 || is_dual_dsi(dev)) { /* Enable DSI PLL clocks for DSI1 rather than CCK. */ pll |= _CLK_EN_PLL_DSI1; pll &= ~_CLK_EN_CCK_DSI1; /* Select DSI PLL as the source of the mux input clocks. */ pll &= ~_DSI_MUX_SEL_CCK_DSI1; } if (is_hdmi) pll |= MDFLD_VCO_SEL; /* compute bitmask from p1 value */ pll |= (1 << (clock.p1 - 2)) << 17; if (pipe != 1) { ctx->dpll = pll; ctx->fp = fp; mutex_unlock(&dsi_config->context_lock); } }
static int t4k35_power_ctrl(struct v4l2_subdev *sd, int flag) { struct i2c_client *client = v4l2_get_subdevdata(sd); int ret = 0; int reset_gpio_pin, vcm_pd_gpio_pin; if (first_open) { camera_reset = -1; camera_power = -1; camera_vcm_pd = -1; camera_sensor_2_8v = -1; HW_ID = Read_HW_ID(); first_open = false; } reset_gpio_pin = 177; vcm_pd_gpio_pin = 175; if (camera_reset < 0) { gpio_free(reset_gpio_pin); ret = camera_sensor_gpio(reset_gpio_pin, GP_CAMERA_0_RESET, GPIOF_DIR_OUT, 0); if (ret < 0) { pr_err("%s error\n", GP_CAMERA_0_RESET); return ret; } camera_reset = reset_gpio_pin; } if (camera_vcm_pd < 0) { ret = camera_sensor_gpio(vcm_pd_gpio_pin, GP_CAMERA_0_POWER_DOWN, GPIOF_DIR_OUT, 0); if (ret < 0) { pr_err("%s error\n", GP_CAMERA_0_POWER_DOWN); return ret; } camera_vcm_pd = reset_gpio_pin; } pr_info("[t4k35_platform] HW_ID = %d\n", HW_ID); if (camera_sensor_2_8v < 0 && HW_ID >= 3) { /*for PR HW change 2.8V*/ ret = camera_sensor_gpio(-1, GP_CAMERA_1_2_8v, GPIOF_DIR_OUT, 0); if (ret < 0) { pr_err("%s not available.\n", GP_CAMERA_1_2_8v); return ret; } camera_sensor_2_8v = GP_CORE_012; } #if 0 if (is_moorefield()) { #ifdef CONFIG_INTEL_SCU_IPC_UTIL ret = intel_scu_ipc_msic_vprog1(flag); if (ret) { pr_err("t4k35 power failed\n"); return ret; } ret = intel_scu_ipc_msic_vprog3(flag); #else ret = -ENODEV; #endif if (ret) pr_err("t4k35 power failed\n"); if (flag) usleep_range(1000, 1200); return ret; } #endif if (flag) { gpio_set_value(camera_reset, 0); usleep_range(200, 300); pr_info("%s camera_reset is low\n", __func__); /* turn on VCM power 2.85V */ if (!camera_vemmc1_on) { camera_vemmc1_on = 1; ret = regulator_enable(vemmc1_reg); /* ret = regulator_enable(vemmc1_reg); */ if (!ret) { pr_info("%s enable regulator vemmc1 2.85V\n", __func__); } else { pr_err("%s Failed to enable regulator vemmc1\n", __func__); return ret; } } if (!camera_vprog2_on) { camera_vprog2_on = 1; ret = regulator_enable(vprog2_reg); if (!ret) { pr_info("%s enable regulator vprog2 1.2V\n", __func__); } else { pr_err("%s Failed to enable regulator vprog2\n", __func__); return ret; } } if (!camera_vprog1_on) { camera_vprog1_on = 1; ret = regulator_enable(vprog1_reg); if (!ret) { pr_info("%s enable regulator vprog1 1.8V\n", __func__); } else { pr_err("%s Failed to enable regulator vprog1\n", __func__); return ret; } } if (camera_sensor_2_8v >= 0) { gpio_set_value(camera_sensor_2_8v, 1); pr_err("<<< 2.8v = 1\n"); } } else { if (camera_sensor_2_8v >= 0) { gpio_set_value(camera_sensor_2_8v, 0); pr_err("<<< 2.8v = 0\n"); gpio_free(camera_sensor_2_8v); camera_sensor_2_8v = -1; } if (camera_vprog1_on) { camera_vprog1_on = 0; ret = regulator_disable(vprog1_reg); if (!ret) { pr_info("%s disable regulator vprog1 1.8V\n", __func__); } else { pr_err("%s Failed to disable regulator vprog1\n", __func__); return ret; } } if (camera_vprog2_on) { camera_vprog2_on = 0; ret = regulator_disable(vprog2_reg); if (!ret) { pr_info("%s disable regulator vprog2 1.2V\n", __func__); } else { pr_err("%s Failed to disable regulator vprog2\n", __func__); return ret; } } /* turn off VCM power 2.85V */ if (camera_vemmc1_on) { camera_vemmc1_on = 0; ret = regulator_disable(vemmc1_reg); if (!ret) { pr_info("%s disable regulator vemmc1 2.85V\n", __func__); } else { pr_err("%s Failed to disable regulator vemmc1\n", __func__); return ret; } } } return 0; }
void intel_register_i2c_camera_device(struct sfi_device_table_entry *pentry, struct devs_id *dev) { struct i2c_board_info i2c_info; struct i2c_board_info *idev = &i2c_info; int bus = pentry->host_num; void *pdata = NULL; int n_subdev; const struct intel_v4l2_subdev_id *vdev = get_v4l2_ids(&n_subdev); struct intel_v4l2_subdev_i2c_board_info *info; static struct intel_v4l2_subdev_table *subdev_table; enum intel_v4l2_subdev_type type = 0; enum atomisp_camera_port port; static int i; if (vdev == NULL) { pr_info("ERROR: camera vdev list is NULL\n"); return; } memset(&i2c_info, 0, sizeof(i2c_info)); //ASUS_BSP+++ if (PROJECT_ID == 0xFF) { PROJECT_ID = Read_PROJ_ID(); } pr_info("%s(%d):Project ID = %d\n", __func__, __LINE__, PROJECT_ID); #if 0 switch (PROJECT_ID) { case PROJ_ID_Z580C: if (!strncmp(pentry->name, "t4k35", 16)) { strncpy(pentry->name, "hm2051", SFI_NAME_LEN); pentry->addr = 0x24; pr_info("%s: Change sensor name\n", __func__); } break; default: break; } #endif //ASUS_BSP--- strncpy(i2c_info.type, pentry->name, SFI_NAME_LEN); i2c_info.irq = ((pentry->irq == (u8)0xff) ? 0 : pentry->irq); i2c_info.addr = pentry->addr; pr_info("camera pdata: I2C bus = %d, name = %16.16s, irq = 0x%2x, addr = 0x%x\n", pentry->host_num, i2c_info.type, i2c_info.irq, i2c_info.addr); if (!dev->get_platform_data) return; pdata = dev->get_platform_data(&i2c_info); i2c_info.platform_data = pdata; while (vdev->name[0]) { if (!strncmp(vdev->name, idev->type, 16)) { /* compare name */ type = vdev->type; port = vdev->port; break; } vdev++; } if (!type) /* not found */ return; info = kzalloc(sizeof(struct intel_v4l2_subdev_i2c_board_info), GFP_KERNEL); if (!info) { pr_err("MRST: fail to alloc mem for ignored i2c dev %s\n", idev->type); return; } info->i2c_adapter_id = bus; /* set platform data */ memcpy(&info->board_info, idev, sizeof(*idev)); if (atomisp_platform_data == NULL) { subdev_table = kzalloc(sizeof(struct intel_v4l2_subdev_table) * n_subdev, GFP_KERNEL); if (!subdev_table) { pr_err("MRST: fail to alloc mem for v4l2_subdev_table %s\n", idev->type); kfree(info); return; } atomisp_platform_data = kzalloc( sizeof(struct atomisp_platform_data), GFP_KERNEL); if (!atomisp_platform_data) { pr_err("%s: fail to alloc mem for atomisp_platform_data %s\n", __func__, idev->type); kfree(info); kfree(subdev_table); return; } i = 0; atomisp_platform_data->subdevs = subdev_table; } memcpy(&subdev_table[i].v4l2_subdev, info, sizeof(*info)); //ASUS_BSP+++ if (PROJECT_ID == 0xFF) { PROJECT_ID = Read_PROJ_ID(); } pr_info("%s(%d):Project ID = %d\n", __func__, __LINE__, PROJECT_ID); if (HW_ID == 0xFF) { HW_ID = Read_HW_ID(); } pr_info("%s(%d):HW ID = %d\n", __func__, __LINE__, HW_ID); if (PCB_ID == 0xFF) { PCB_ID = Read_PCB_ID(); pr_info("%s(%d):PCB ID = %x\n", __func__, __LINE__, PCB_ID); switch (PROJECT_ID) { case PROJ_ID_FE380CG: case PROJ_ID_FE380CXG: project_id = PCB_ID & 0x7; hardware_id = (PCB_ID & 0x38) >> 3; offset_0 = (PCB_ID & 0x40) >> 6; offset_1 = (PCB_ID & 0x180) >> 7; offset_2 = (PCB_ID & 0x1E00) >> 9; offset_3 = (PCB_ID & 0x6000) >> 13; offset_4 = (PCB_ID & 0x8000) >> 15; //offset_0: Panel ID, offset_1: TP_ID, offset_2: RF ID(last bit is SIM ID), offset_3: Main Camera ID, offset_4: Sub Camera ID //PCB_ID = pentry->project_id | pentry->hardware_id << 3 | pentry->offset_0 << 6 | pentry->offset_1 << 7 | pentry->offset_2 << 9 | pentry->offset_3 << 13 | pentry->offset_4 << 15; pr_info("%s: project id = %d, hardware id = %d, offset_0 = %d, offset_1 = %d, offset_2 = %d, offset_3 = %d, offset_4 = %d\n", __func__, project_id, hardware_id, offset_0, offset_1, offset_2, offset_3, offset_4); break; case PROJ_ID_Z580C: project_id = PCB_ID & 0x7; hardware_id = (PCB_ID & 0x38) >> 3; offset_0 = (PCB_ID & 0x40) >> 6; offset_1 = (PCB_ID & 0x80) >> 7; offset_2 = (PCB_ID & 0x700) >> 8; offset_3 = (PCB_ID & 0x1800) >> 11; offset_4 = (PCB_ID & 0x2000) >> 13; //offset_0: Panel ID, offset_1: Wifi ID, offset_2: RF ID, offset_3: Main Camera ID, offset_4: Sub Camera ID //PCB_ID = pentry->project_id | pentry->hardware_id << 3 | pentry->offset_0 << 6 | pentry->offset_1 << 7 | pentry->offset_2 << 8 | pentry->offset_3 << 11 | pentry->offset_4 << 13; pr_info("%s: project id = %d, hardware id = %d, offset_0 = %d, offset_1 = %d, offset_2 = %d, offset_3 = %d, offset_4 = %d\n", __func__, project_id, hardware_id, offset_0, offset_1, offset_2, offset_3, offset_4); break; default: break; } }