void lnw_gpio_set_alt(int gpio, int alt) { struct lnw_gpio *lnw; u32 __iomem *mem; int reg; int bit; u32 offset; u32 value; unsigned long flags; /* use this trick to get memio */ lnw = irq_get_chip_data(gpio_to_irq(gpio)); if (!lnw) { pr_err("langwell_gpio: can not find pin %d\n", gpio); return; } if (gpio < lnw->chip.base || gpio >= lnw->chip.base + lnw->chip.ngpio) { dev_err(lnw->chip.dev, "langwell_gpio: wrong pin %d to config alt\n", gpio); return; } #if 0 if (lnw->irq_base + gpio - lnw->chip.base != gpio_to_irq(gpio)) { dev_err(lnw->chip.dev, "langwell_gpio: wrong chip data for pin %d\n", gpio); return; } #endif gpio -= lnw->chip.base; if (lnw->type != TANGIER_GPIO) { reg = gpio / 16; bit = gpio % 16; mem = gpio_reg(&lnw->chip, 0, GAFR); spin_lock_irqsave(&lnw->lock, flags); value = readl(mem + reg); value &= ~(3 << (bit * 2)); value |= (alt & 3) << (bit * 2); writel(value, mem + reg); spin_unlock_irqrestore(&lnw->lock, flags); dev_dbg(lnw->chip.dev, "ALT: writing 0x%x to %p\n", value, mem + reg); } else { offset = lnw->get_flis_offset(gpio); if (WARN(offset == -EINVAL, "invalid pin %d\n", gpio)) return; if (!is_merr_i2c_flis(offset)) spin_lock_irqsave(&lnw->lock, flags); value = get_flis_value(offset); value &= ~7; value |= (alt & 7); set_flis_value(value, offset); if (!is_merr_i2c_flis(offset)) spin_unlock_irqrestore(&lnw->lock, flags); } }
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; }