Exemple #1
0
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;
}
Exemple #3
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;
}
Exemple #10
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;
		}
	}