static int crystalcove_chgr_enable_charging(struct chgr_info *info, bool enable)
{
	int ret;

	dev_info(&info->pdev->dev, "crystalcove enable chargering\n");

	ret = crystalcove_chgr_enable_charger(info, true);
	if (ret < 0)
		dev_warn(&info->pdev->dev, "vbus disable failed\n");

	if (enable) {
		ret = intel_mid_pmic_writeb(CRYSTALCOVE_MCHGRIRQS0_REG, 0x00);
		if (ret < 0)
			dev_warn(&info->pdev->dev, "chgr mask disable failed\n");
		else
			ret = intel_mid_pmic_writeb(CRYSTALCOVE_MCHGRIRQSX_REG, 0x00);
	} else {
		ret = intel_mid_pmic_writeb(CRYSTALCOVE_MCHGRIRQS0_REG, 0x01);
		if (ret < 0)
			dev_warn(&info->pdev->dev, "chgr mask enable failed\n");
		else
			ret = intel_mid_pmic_writeb(CRYSTALCOVE_MCHGRIRQSX_REG, 0x01);
	}
	return ret;
}
static void pmic_fg_init_hw_regs(struct pmic_fg_info *info)
{
	/* program temperature thresholds */
	intel_mid_pmic_writeb(DC_FG_VLTFW_REG, FG_VLTFW_N5C);
	intel_mid_pmic_writeb(DC_FG_VHTFW_REG, FG_VHTFW_60C);

	/* enable interrupts */
	intel_mid_pmic_setb(DC_TEMP_IRQ_CFG_REG, TEMP_IRQ_CFG_MASK);
	intel_mid_pmic_setb(DC_FG_IRQ_CFG_REG, FG_IRQ_CFG_LOWBATT_MASK);
}
static int __devinit crystalcove_gpadc_probe(struct platform_device *pdev)
{
	int err;
	struct gpadc_info *info;
	struct iio_dev *indio_dev;

	intel_mid_pmic_writeb(MADCIRQ0, 0x00);
	intel_mid_pmic_writeb(MADCIRQ1, 0x00);
	indio_dev = iio_allocate_device(sizeof(struct gpadc_info));
	if (indio_dev == NULL) {
		dev_err(&pdev->dev, "allocating iio device failed\n");
		return -ENOMEM;
	}

	info = iio_priv(indio_dev);
	mutex_init(&info->lock);
	init_waitqueue_head(&info->wait);
	info->dev = &pdev->dev;
	info->irq = platform_get_irq(pdev, 0);
	err = request_threaded_irq(info->irq, NULL, gpadc_isr,
			IRQF_ONESHOT, "adc", indio_dev);
	if (err) {
		dev_err(&pdev->dev, "unable to register irq %d\n", info->irq);
		goto err_free_device;
	}

	platform_set_drvdata(pdev, indio_dev);
	indio_dev->dev.parent = &pdev->dev;
	indio_dev->name = pdev->name;
	indio_dev->channels = crystalcove_adc_channels;
	indio_dev->num_channels = ARRAY_SIZE(crystalcove_adc_channels);
	indio_dev->info = &crystalcove_adc_info;
	indio_dev->modes = INDIO_DIRECT_MODE;

	err = iio_map_array_register(indio_dev, iio_maps);
	if (err)
		goto err_release_irq;

	err = iio_device_register(indio_dev);
	if (err < 0)
		goto err_array_unregister;

	dev_info(&pdev->dev, "crystalcove adc probed\n");

	return 0;

err_array_unregister:
	iio_map_array_unregister(indio_dev, iio_maps);
err_release_irq:
	free_irq(info->irq, info);
err_free_device:
	iio_free_device(indio_dev);

	return err;
}
static irqreturn_t gpadc_isr(int irq, void *data)
{
	struct gpadc_info *info = iio_priv(data);
	u8 pending0, pending1;

	pending0 = intel_mid_pmic_readb(ADCIRQ0);
	pending1 = intel_mid_pmic_readb(ADCIRQ1);
	intel_mid_pmic_writeb(ADCIRQ0, pending0);
	intel_mid_pmic_writeb(ADCIRQ0, pending1);
	info->irq_pending |= pending0 + (pending1 << 8);
	wake_up(&info->wait);
	return IRQ_HANDLED;
}
/*
 * WA for BTY as simple VRF management
 */
int camera_set_pmic_power(enum camera_pmic_pin pin, bool flag)
{
	u8 reg_addr[CAMERA_POWER_NUM] = {VPROG_1P8V, VPROG_2P8V};
	u8 reg_value[2] = {VPROG_DISABLE, VPROG_ENABLE};
	static struct vprog_status status[CAMERA_POWER_NUM];
	static DEFINE_MUTEX(mutex_power);
	int ret = 0;

	mutex_lock(&mutex_power);
	/*
	 * only set power at:
	 * first to power on
	 * last to power off
	 */
	if ((flag && status[pin].user == 0)
	    || (!flag && status[pin].user == 1))
		ret = intel_mid_pmic_writeb(reg_addr[pin], reg_value[flag]);

	/* no update counter if config failed */
	if (ret)
		goto done;

	if (flag)
		status[pin].user++;
	else
		if (status[pin].user)
			status[pin].user--;
done:
	mutex_unlock(&mutex_power);
	return ret;
}
/**
* intel_pmic_reg_setvoltage - Set voltage to the regulator
* @rdev:    regulator_dev structure
* @min_uV: Minimum required voltage in uV
* @max_uV: Maximum acceptable voltage in uV
* @selector: Voltage value passed back to core layer
* Sets a voltage regulator to the desired output voltage
* @return value : Returns 0 if success
*			: Return error value on failure
*/
static int intel_pmic_reg_setvoltage(struct regulator_dev *rdev, int min_uV,
					int max_uV, unsigned *selector)
{
	struct intel_pmic_info *pmic_info = rdev_get_drvdata(rdev);
	int reg_value;
	u8 vsel;

	for (vsel = 0; vsel < pmic_info->table_len; vsel++) {
		int mV = pmic_info->table[vsel];
		int uV = mV * 1000;
		if (min_uV > uV || uV > max_uV)
			continue;

		*selector = vsel;
		reg_value = intel_mid_pmic_readb(pmic_info->pmic_reg);
		if (reg_value < 0) {
			dev_err(&rdev->dev,
			"intel_mid_pmic_readb returns error %08x\n", reg_value);
			return reg_value;
		}
		reg_value &= ~REG_VSEL_MASK;
		reg_value |= vsel << VSEL_SHIFT;
		dev_dbg(&rdev->dev,
			"intel_pmic_reg_setvoltage voltage: %u uV\n", uV);
		return intel_mid_pmic_writeb(pmic_info->pmic_reg, reg_value);
	}
	return -EINVAL;
}
static void p088pw_disable(struct intel_dsi_device *dsi)
{
    int val = 0;
	struct intel_dsi *intel_dsi = container_of(dsi, struct intel_dsi, dev);
	struct drm_device *dev = intel_dsi->base.base.dev;
	struct drm_i915_private *dev_priv = dev->dev_private;
	DRM_DEBUG_KMS("\n");
	printk("p088pw_disable\n");
	msleep(200);
	dsi_vc_dcs_write_0(intel_dsi, 0, 0x28);
	msleep(80);

	dsi_vc_dcs_write_0(intel_dsi, 0, 0x10);
	msleep(34);
	val = intel_mid_pmic_readb(0x12);    	
	val &= ~(1<<5);		
	intel_mid_pmic_writeb(0x12, val);		
	usleep_range(100000, 120000);	
	vlv_gpio_nc_write(dev_priv, GPIO_NC_9_PCONF0, 0x2000CC00);	
	vlv_gpio_nc_write(dev_priv, GPIO_NC_9_PAD, 0x00000004);	
	usleep_range(100000, 120000);	
	vlv_gpio_nc_write(dev_priv, GPIO_NC_10_PCONF0, 0x2000CC00);	
	vlv_gpio_nc_write(dev_priv, GPIO_NC_10_PAD, 0x00000004);	
	usleep_range(100000, 120000);	
	vlv_gpio_nc_write(dev_priv, GPIO_NC_11_PCONF0, 0x2000CC00);	
	vlv_gpio_nc_write(dev_priv, GPIO_NC_11_PAD, 0x00000004);
}
void p088pw_reset(struct intel_dsi_device *dsi)
{
    int val;
	struct intel_dsi *intel_dsi = container_of(dsi, struct intel_dsi, dev);
	struct drm_device *dev = intel_dsi->base.base.dev;
	struct drm_i915_private *dev_priv = dev->dev_private;

	DRM_DEBUG_KMS("\n");
	//printk("p088pw_reset\n");
	val = intel_mid_pmic_readb(0x12);
    val |= 1<<5;
	intel_mid_pmic_writeb(0x12, val);
    usleep_range(100000, 120000);
	vlv_gpio_nc_write(dev_priv, GPIO_NC_9_PCONF0, 0x2000CC00);//reset
	vlv_gpio_nc_write(dev_priv, GPIO_NC_9_PAD, 0x00000004);
	usleep_range(100000, 120000);
	vlv_gpio_nc_write(dev_priv, GPIO_NC_10_PCONF0, 0x2000CC00);
	vlv_gpio_nc_write(dev_priv, GPIO_NC_10_PAD, 0x00000005);
	usleep_range(100000, 120000);
	vlv_gpio_nc_write(dev_priv, GPIO_NC_11_PCONF0, 0x2000CC00);
	vlv_gpio_nc_write(dev_priv, GPIO_NC_11_PAD, 0x00000005);
	msleep(10);
	vlv_gpio_nc_write(dev_priv, GPIO_NC_9_PCONF0, 0x2000CC00);
	vlv_gpio_nc_write(dev_priv, GPIO_NC_9_PAD, 0x00000005);
}
static int crystalcove_gpio_direction_input(struct gpio_chip *chip,
		unsigned gpio)
{
	u8 ctlo = gpio < 8 ? GPIO0P0CTLO + gpio : GPIO1P0CTLO + (gpio - 8);

	intel_mid_pmic_writeb(ctlo, CTLO_INPUT_DEF);
	return 0;
}
static int crystalcove_gpio_direction_output(struct gpio_chip *chip,
		unsigned gpio, int value)
{
	u8 ctlo = gpio < 8 ? GPIO0P0CTLO + gpio : GPIO1P0CTLO + (gpio - 8);

	intel_mid_pmic_writeb(ctlo, CTLO_OUTPUT_DEF | value);
	return 0;
}
void auo_reset(struct intel_dsi_device *dsi)
{
    int val;
	DRM_DEBUG_KMS("\n");
	val = intel_mid_pmic_readb(0x12);
    val |= 1<<5;
	intel_mid_pmic_writeb(0x12, val);
    msleep(40);
}
void intel_dsi_clear_device_ready(struct intel_encoder *encoder)
{
	struct drm_i915_private *dev_priv = encoder->base.dev->dev_private;
	struct intel_crtc *intel_crtc = to_intel_crtc(encoder->base.crtc);
	struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base);
	int pipe = intel_crtc->pipe;
	u32 val;

	DRM_DEBUG_KMS("\n");

	I915_WRITE_BITS(MIPI_DEVICE_READY(pipe), ULPS_STATE_ENTER | DEVICE_READY,
							ULPS_STATE_MASK | DEVICE_READY);
	usleep_range(2000, 2500);

	I915_WRITE_BITS(MIPI_DEVICE_READY(pipe), ULPS_STATE_EXIT | DEVICE_READY,
							ULPS_STATE_MASK | DEVICE_READY);
	usleep_range(2000, 2500);

	I915_WRITE_BITS(MIPI_DEVICE_READY(pipe), ULPS_STATE_ENTER | DEVICE_READY,
							ULPS_STATE_MASK | DEVICE_READY);
	usleep_range(2000, 2500);

	if (wait_for(((I915_READ(MIPI_PORT_CTRL(pipe)) & 0x20000)
					== 0x00000), 30))
		DRM_ERROR("DSI LP not going Low\n");

	I915_WRITE_BITS(MIPI_PORT_CTRL(pipe), 0, LP_OUTPUT_HOLD);
	usleep_range(1000, 1500);

	I915_WRITE_BITS(MIPI_DEVICE_READY(pipe), 0x00, DEVICE_READY);
	usleep_range(2000, 2500);

	intel_disable_dsi_pll(intel_dsi);

	val = I915_READ(DSPCLK_GATE_D);
	val &= ~VSUNIT_CLOCK_GATE_DISABLE;
	I915_WRITE(DSPCLK_GATE_D, val);

	if (intel_dsi->dev.dev_ops->disable_panel_power)
		intel_dsi->dev.dev_ops->disable_panel_power(&intel_dsi->dev);

#ifdef CONFIG_CRYSTAL_COVE
	if (BYT_CR_CONFIG) {
		/* Disable Panel */
		vlv_gpio_nc_write(dev_priv, GPIO_NC_11_PCONF0, 0x2000CC00);
		vlv_gpio_nc_write(dev_priv, GPIO_NC_11_PAD, 0x00000004);
		udelay(500);
	} else
		intel_mid_pmic_writeb(PMIC_PANEL_EN, 0x00);
#else
	/* need to code for BYT-CR for example where things have changed */
	DRM_ERROR("PANEL Disable to supported yet\n");
#endif
	msleep(intel_dsi->panel_off_delay);
	msleep(intel_dsi->panel_pwr_cycle_delay);
}
static int imx134_power_ctrl(struct v4l2_subdev *sd, int flag)
{
	int ret = 0;

	if (flag) {
		if (!camera_vprog1_on) {
#ifdef CONFIG_CRYSTAL_COVE
			ret = intel_mid_pmic_writeb(VPROG_2P8V, VPROG_ENABLE);
			if (ret)
				return ret;
			ret = intel_mid_pmic_writeb(VPROG_1P8V, VPROG_ENABLE);
#elif defined(CONFIG_INTEL_SCU_IPC_UTIL)
			ret = intel_scu_ipc_msic_vprog1(1);
#else
			pr_err("imx134 power is not set.\n");
#endif
			if (!ret) {
				/* imx1x5 VDIG rise to XCLR release */
				usleep_range(1000, 1200);
				camera_vprog1_on = 1;
			}
			return ret;
		}
	} else {
		if (camera_vprog1_on) {
#ifdef CONFIG_CRYSTAL_COVE
			ret = intel_mid_pmic_writeb(VPROG_2P8V, VPROG_DISABLE);
			if (ret)
				return ret;
			ret = intel_mid_pmic_writeb(VPROG_1P8V, VPROG_DISABLE);
#elif defined(CONFIG_INTEL_SCU_IPC_UTIL)
			ret = intel_scu_ipc_msic_vprog1(0);
#else
			pr_err("imx134 power is not set.\n");
#endif
			if (!ret)
				camera_vprog1_on = 0;
			return ret;
		}
	}
	return ret;
}
Exemplo n.º 14
0
static irqreturn_t pmic_irq_thread(int irq, void *data)
{
	int i;
	int pending;

	mutex_lock(&pmic->irq_lock);
	intel_mid_pmic_writeb(MIRQLVL1, (u8)pmic->irq_mask);
	pending = intel_mid_pmic_readb(IRQLVL1) & (~pmic->irq_mask);
	for (i = 0; i < PMIC_IRQ_NUM; i++)
		if (pending & (1 << i))
			handle_nested_irq(pmic->irq_base + i);
	mutex_unlock(&pmic->irq_lock);
	return IRQ_HANDLED;
}
static void auo_disable(struct intel_dsi_device *dsi)
{   
    struct intel_dsi *intel_dsi = container_of(dsi, struct intel_dsi, dev);
    int val = 0;
	DRM_DEBUG_KMS("\n");
	dsi_vc_dcs_write_0(intel_dsi, 0, 0x28);
	msleep(80);

	dsi_vc_dcs_write_0(intel_dsi, 0, 0x10);
	msleep(34);
	val = intel_mid_pmic_readb(0x12);
    val &= ~(1<<5);
	intel_mid_pmic_writeb(0x12, val);	

}
/**
* intel_pmic_reg_disable - To disable the regulator
* @rdev:    regulator_dev structure
* @return value :0 - Regulator disabling success
*		:nonzero - Regulator disabling failed
*/
static int intel_pmic_reg_disable(struct regulator_dev *rdev)
{
	struct intel_pmic_info *pmic_info = rdev_get_drvdata(rdev);
	int reg_value;

	reg_value = intel_mid_pmic_readb(pmic_info->pmic_reg);
	if (reg_value < 0) {
		dev_err(&rdev->dev,
			"intel_mid_pmic_readb returns error %08x\n", reg_value);
		return reg_value;
	}

	return intel_mid_pmic_writeb(pmic_info->pmic_reg,
				((reg_value | REG_CNT_ENBL) & REG_OFF));
}
/**
* intel_pmic_reg_get_cntrl - To get the control of the regulator
* @rdev:    regulator_dev structure
* @return value :0  - success
*		:nonzero - Error
*/
static int intel_pmic_reg_initialize(u16 pmic_reg, u8 state)
{
	int reg_value;
	u8 val;

	reg_value = intel_mid_pmic_readb(pmic_reg);
	if (reg_value < 0)
		return reg_value;

	if (state)
		val = reg_value | REG_CNT_ENBL | REG_ON;
	else
		val = (reg_value & REG_OFF) | REG_CNT_ENBL;

	return intel_mid_pmic_writeb(pmic_reg, val);
}
static int pmic_chrg_reg_writeb(struct pmic_chrg_info *info, int reg, u8 val)
{
    int ret, i;

    for (i = 0; i < RETRY_RW; i++) {
        ret = intel_mid_pmic_writeb(reg, val);
        if (ret < 0) {
            dev_warn(&info->pdev->dev,
                     "failed to write reg 0x%x: %d\n", reg, ret);
            usleep_range(1000, 2000);
        } else
            break;
    }

    return ret;
}
static int pmic_fg_reg_writeb(struct pmic_fg_info *info, int reg, u8 val)
{
	int ret, i;

	for (i = 0; i < NR_RETRY_CNT; i++) {
		ret = intel_mid_pmic_writeb(reg, val);
		if (ret == -EAGAIN || ret == -ETIMEDOUT)
			continue;
		else
			break;
	}
	if (ret < 0)
		dev_err(&info->pdev->dev, "pmic reg write err:%d\n", ret);

	return ret;
}
Exemplo n.º 20
0
static int pmic_irq_init(void)
{
	int cur_irq;
	int ret;

	pmic->irq_mask = 0xff;
	intel_mid_pmic_writeb(MIRQLVL1, pmic->irq_mask);
	pmic->irq_mask = intel_mid_pmic_readb(MIRQLVL1);
	pmic->irq_base = irq_alloc_descs(VV_PMIC_IRQBASE, 0, PMIC_IRQ_NUM, 0);
	if (pmic->irq_base < 0) {
		dev_warn(pmic->dev, "Failed to allocate IRQs: %d\n",
			 pmic->irq_base);
		pmic->irq_base = 0;
		return -EINVAL;
	}

	/* Register them with genirq */
	for (cur_irq = pmic->irq_base;
	     cur_irq < PMIC_IRQ_NUM + pmic->irq_base;
	     cur_irq++) {
		irq_set_chip_data(cur_irq, pmic);
		irq_set_chip_and_handler(cur_irq, &pmic_irq_chip,
					 handle_edge_irq);
		irq_set_nested_thread(cur_irq, 1);
		irq_set_noprobe(cur_irq);
	}

	ret = request_threaded_irq(pmic->irq, pmic_irq_isr, pmic_irq_thread,
			IRQF_TRIGGER_RISING | IRQF_ONESHOT,
			"intel_mid_pmic", pmic);
	if (ret != 0) {
		dev_err(pmic->dev, "Failed to request IRQ %d: %d\n",
				pmic->irq, ret);
		return ret;
	}
	ret = enable_irq_wake(pmic->irq);
	if (ret != 0) {
		dev_warn(pmic->dev, "Can't enable PMIC IRQ as wake source: %d\n",
			 ret);
	}

	return 0;
}
static irqreturn_t crystalcove_gpio_irq_handler(int irq, void *data)
{
	struct crystalcove_gpio *cg = data;
	int pending;
	int gpio;

	pending = intel_mid_pmic_readb(GPIO0IRQ) & 0xff;
	pending |= (intel_mid_pmic_readb(GPIO1IRQ) & 0xff) << 8;
	intel_mid_pmic_writeb(GPIO0IRQ, pending & 0xff);
	intel_mid_pmic_writeb(GPIO1IRQ, (pending >> 8) & 0xff);
	local_irq_disable();
	for (gpio = 0; gpio < cg->chip.ngpio; gpio++) {
		if (pending & (1 << gpio)) {
			pr_err("crystalcove pin %d triggered\n", gpio);
			generic_handle_irq(cg->irq_base + gpio);
		}
	}
	local_irq_enable();
	return IRQ_HANDLED;
}
/*
 * WA for BTY as simple VRF management
 */
int camera_set_pmic_power(enum camera_pmic_pin pin, bool flag)
{
	u8 reg_addr[CAMERA_POWER_NUM] = {VPROG_1P8V, VPROG_2P8V};
	u8 reg_value[2] = {VPROG_DISABLE, VPROG_ENABLE};
	int val;
	static DEFINE_MUTEX(mutex_power);
	int ret = 0;

	if (pin >= CAMERA_POWER_NUM)
		return -EINVAL;

	mutex_lock(&mutex_power);
	val = intel_mid_pmic_readb(reg_addr[pin]) & 0x3;

	if ((flag && (val == VPROG_DISABLE)) ||
		(!flag && (val == VPROG_ENABLE)))
		ret = intel_mid_pmic_writeb(reg_addr[pin], reg_value[flag]);

	mutex_unlock(&mutex_power);
	return ret;
}
static irqreturn_t crystalcove_chgr_isr(int irq, void *data)
{
	struct chgr_info *info = data;
	int chgrirq;

	chgrirq = intel_mid_pmic_readb(CRYSTALCOVE_CHGRIRQ_REG);

	if (chgrirq < 0) {
		dev_err(&info->pdev->dev, "CHGRIRQ read failed\n");
		goto pmic_irq_fail;
	}

	dev_dbg(&info->pdev->dev, "crystalcove charger irq happens, chgrirq=%x\n", chgrirq);

/*--------------CHGRIRQ HANDLER--------------*/
	power_supply_changed(&info->psy_usb);


pmic_irq_fail:
	intel_mid_pmic_writeb(CRYSTALCOVE_CHGRIRQ_REG, chgrirq);

	return IRQ_HANDLED;
}
static int ov8865_power_ctrl(struct v4l2_subdev *sd, int flag)
{
	int ret = 0;
	int value = 0;

	ov8865_power_pins();
	if (flag) {
		if (!camera_vprog1_on) {
#ifdef CONFIG_CRYSTAL_COVE
			/* AVDD on First */
			value = intel_mid_pmic_readb(VPROG_3P3V);
			value = value | VPROG_ENABLE;
			OV8865_PLAT_LOG(1,"try to enable VPROG_3P3V: value=0x%x\n", value);
			ret = intel_mid_pmic_writeb(VPROG_3P3V, value);

			usleep_range(2000, 2100);
			/* power up sequence control via GPIO*/
			gpio_set_value(camera_avdd_en, 1);
			usleep_range(1000, 1500);
			/* DOVDD and DVDD On*/
			OV8865_PLAT_LOG(1,"try to enable VPROG_1P8V\n");
			ret = intel_mid_pmic_writeb(VPROG_1P8V, VPROG_ENABLE);
			if (ret)
				return ret;
			gpio_set_value(camera_reset, 1); /* reset is active low */
		      /* ov8865 reset pulse should be more than 2ms
		      */
		      usleep_range(3500, 4000);
			/* VCM 2P8 power on*/
			OV8865_PLAT_LOG(1,"try to enable VPROG_2P8V\n");
			ret = intel_mid_pmic_writeb(VPROG_2P8V, VPROG_ENABLE);
			if (ret)
				return ret;

		#if 0
			gpio_set_value(camera_power_down, 1);
			//gpio_set_value(camera_dovdd_en, 1);
			usleep_range(2500, 3500);
		#endif

			gpio_set_value(camera_dvdd_en, 1);
			gpio_set_value(camera_vcm_en, 1);
			usleep_range(1000, 1500);

			#elif defined(CONFIG_INTEL_SCU_IPC_UTIL)
			ret = intel_scu_ipc_msic_vprog1(1);
#else
			pr_err("ov8865 power is not set.\n");
#endif
			if (!ret) {
				/* ov8865 VDIG rise to XCLR release */
				usleep_range(1000, 1200);
				camera_vprog1_on = 1;
			}
			return ret;
		}
	} else {
		if (camera_vprog1_on) {
#ifdef CONFIG_CRYSTAL_COVE
			/* power down sequence control via GPIO*/
			gpio_set_value(camera_dvdd_en, 0);
			gpio_set_value(camera_vcm_en, 0);
			usleep_range(2500, 3500);
			//gpio_set_value(camera_power_down, 0);
			//gpio_set_value(camera_dovdd_en, 0);

			/* power down power rail*/
			ret = intel_mid_pmic_writeb(VPROG_2P8V, VPROG_DISABLE);
			if (ret)
				return ret;
			ret = intel_mid_pmic_writeb(VPROG_1P8V, VPROG_DISABLE);
			gpio_set_value(camera_reset, 0);
			gpio_set_value(camera_avdd_en, 0);

			
			/* WA: We don't know previous status of VPROG_3P3V
			 * So keep it ON here
			 */

#elif defined(CONFIG_INTEL_SCU_IPC_UTIL)
			ret = intel_scu_ipc_msic_vprog1(0);
#else
			pr_err("ov8865 power is not set.\n");
#endif
			if (!ret)
				camera_vprog1_on = 0;
			return ret;
		}
	}
	return ret;
}
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 camera_pmic_set(bool flag)
{
	int val;
	int ret = 0;
	if (pmic_id == PMIC_MAX) {
		pmic_id = camera_pmic_probe();
		if (pmic_id == PMIC_MAX)
			return -EINVAL;
	}

	if (flag) {
		switch (pmic_id) {
		case PMIC_ROHM:
			ret = regulator_enable(v2p8_reg);
			if (ret)
				return ret;

			ret = regulator_enable(v1p8_reg);
			if (ret)
				regulator_disable(v2p8_reg);
			break;
		case PMIC_XPOWER:
			/* ALDO1 */
			ret = intel_mid_pmic_writeb(ALDO1_SEL_REG, ALDO1_2P8V);
			if (ret)
				return ret;

			/* PMIC Output CTRL 3 for ALDO1 */
			val = intel_mid_pmic_readb(ALDO1_CTRL3_REG);
			val |= (1 << ALDO1_CTRL3_SHIFT);
			ret = intel_mid_pmic_writeb(ALDO1_CTRL3_REG, val);
			if (ret)
				return ret;

			/* ELDO2 */
			ret = intel_mid_pmic_writeb(ELDO2_SEL_REG, ELDO2_1P8V);
			if (ret)
				return ret;

			/* PMIC Output CTRL 2 for ELDO2 */
			val = intel_mid_pmic_readb(ELDO2_CTRL2_REG);
			val |= (1 << ELDO2_CTRL2_SHIFT);
			ret = intel_mid_pmic_writeb(ELDO2_CTRL2_REG, val);
			break;
		case PMIC_TI:
			/* LDO9 */
			ret = intel_mid_pmic_writeb(LDO9_REG, LDO9_2P8V_ON);
			if (ret)
				return ret;

			/* LDO10 */
			ret = intel_mid_pmic_writeb(LDO10_REG, LDO10_1P8V_ON);
			if (ret)
				return ret;
			break;
		default:
			return -EINVAL;
		}

	} else {
		switch (pmic_id) {
		case PMIC_ROHM:
			ret = regulator_disable(v2p8_reg);
			ret += regulator_disable(v1p8_reg);
			break;
		case PMIC_XPOWER:
			val = intel_mid_pmic_readb(ALDO1_CTRL3_REG);
			val &= ~(1 << ALDO1_CTRL3_SHIFT);
			ret = intel_mid_pmic_writeb(ALDO1_CTRL3_REG, val);
			if (ret)
				return ret;

			val = intel_mid_pmic_readb(ELDO2_CTRL2_REG);
			val &= ~(1 << ELDO2_CTRL2_SHIFT);
			ret = intel_mid_pmic_writeb(ELDO2_CTRL2_REG, val);
			break;
		case PMIC_TI:
			/* LDO9 */
			ret = intel_mid_pmic_writeb(LDO9_REG, LDO9_2P8V_OFF);
			if (ret)
				return ret;

			/* LDO10 */
			ret = intel_mid_pmic_writeb(LDO10_REG, LDO10_1P8V_OFF);
			if (ret)
				return ret;
			break;
		default:
			return -EINVAL;
		}
	}
	return ret;
}
Exemplo n.º 27
0
static void pmic_work(struct work_struct *work)
{
	mutex_lock(&pmic->irq_lock);
	intel_mid_pmic_writeb(MIRQLVL1, (u8)pmic->irq_mask);
	mutex_unlock(&pmic->irq_lock);
}
static int camera_pmic_set(bool flag)
{
	int val;
	int ret = 0;
	if (pmic_id == PMIC_MAX) {
		pmic_id = camera_pmic_probe();
		if (pmic_id == PMIC_MAX)
			return -EINVAL;
	}

	if (flag) {
		switch (pmic_id) {
		case PMIC_ROHM:
			ret = regulator_enable(v2p8_reg);
			if (ret)
				return ret;

			ret = regulator_enable(v1p8_reg);
			if (ret)
				regulator_disable(v2p8_reg);
			break;
		case PMIC_XPOWER:
			/* ALDO1 */
			ret = intel_mid_pmic_writeb(0x28, 0x16);
			if (ret)
				return ret;

			/* PMIC Output CTRL 3 for ALDO1 */
			val = intel_mid_pmic_readb(0x13);
			val |= (1 << 5);
			ret = intel_mid_pmic_writeb(0x13, val);
			if (ret)
				return ret;

			/* ELDO2 */
			ret = intel_mid_pmic_writeb(0x1A, 0x16);
			if (ret)
				return ret;

			/* PMIC Output CTRL 2 for ELDO2 */
			val = intel_mid_pmic_readb(0x12);
			val |= (1 << 1);
			ret = intel_mid_pmic_writeb(0x12, val);
			break;
		case PMIC_TI:
			/* LDO9 */
			ret = intel_mid_pmic_writeb(0x49, 0x2F);
			if (ret)
				return ret;

			/* LDO10 */
			ret = intel_mid_pmic_writeb(0x4A, 0x59);
			if (ret)
				return ret;

			/* LDO11 */
			ret = intel_mid_pmic_writeb(0x4B, 0x59);
			if (ret)
				return ret;
			break;
		default:
			return -EINVAL;
		}

	} else {
		switch (pmic_id) {
		case PMIC_ROHM:
			ret = regulator_disable(v2p8_reg);
			ret += regulator_disable(v1p8_reg);
			break;
		case PMIC_XPOWER:
			val = intel_mid_pmic_readb(0x13);
			val &= ~(1 << 5);
			ret = intel_mid_pmic_writeb(0x13, val);
			if (ret)
				return ret;

			val = intel_mid_pmic_readb(0x12);
			val &= ~(1 << 1);
			ret = intel_mid_pmic_writeb(0x12, val);
			break;

		case PMIC_TI:
			/* LDO9 */
			ret = intel_mid_pmic_writeb(0x49, 0x2E);
			if (ret)
				return ret;

			/* LDO10 */
			ret = intel_mid_pmic_writeb(0x4A, 0x58);
			if (ret)
				return ret;

			/* LDO11 */
			ret = intel_mid_pmic_writeb(0x4B, 0x58);
			if (ret)
				return ret;
			break;
		default:
			return -EINVAL;
		}
	}
	return ret;
}
void intel_dsi_device_ready(struct intel_encoder *encoder)
{
	struct drm_i915_private *dev_priv = encoder->base.dev->dev_private;
	struct intel_crtc *intel_crtc = to_intel_crtc(encoder->base.crtc);
	struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base);
	int pipe = intel_crtc->pipe;
	u32 tmp;

	DRM_DEBUG_KMS("\n");

	/* program rcomp for compliance
	 * reduce form 50 ohms to 45 ohms */
	intel_flisdsi_write32(dev_priv, 0x04, 0x00f0);

	band_gap_reset(dev_priv);

#ifdef CONFIG_CRYSTAL_COVE
	/* Panel Enable */
	if (BYT_CR_CONFIG) {
		/*  cabc disable */
		vlv_gpio_nc_write(dev_priv, GPIO_NC_9_PCONF0, 0x2000CC00);
		vlv_gpio_nc_write(dev_priv, GPIO_NC_9_PAD, 0x00000004);

		/* panel enable */
		vlv_gpio_nc_write(dev_priv, GPIO_NC_11_PCONF0, 0x2000CC00);
		vlv_gpio_nc_write(dev_priv, GPIO_NC_11_PAD, 0x00000005);
		udelay(500);
	} else
		intel_mid_pmic_writeb(PMIC_PANEL_EN, 0x01);

#else
	/* need to code for BYT-CR for example where things have changed */
	DRM_ERROR("PANEL Enable to supported yet\n");
#endif
	msleep(intel_dsi->panel_on_delay);

	if (intel_dsi->dev.dev_ops->panel_reset)
		intel_dsi->dev.dev_ops->panel_reset(&intel_dsi->dev);

	/* Disable DPOunit clock gating, can stall pipe */
	tmp = I915_READ(DPLL(pipe));
	tmp |= DPLL_RESERVED_BIT;
	I915_WRITE(DPLL(pipe), tmp);

	tmp = I915_READ(DSPCLK_GATE_D);
	tmp |= VSUNIT_CLOCK_GATE_DISABLE;
	I915_WRITE(DSPCLK_GATE_D, tmp);

	intel_enable_dsi_pll(intel_dsi);

    //in dual display config, dsi 0 is not init. so this function may not
    //be called with pipe0. set this flag for pipe0 so that pipe b can work
    #ifdef BYT_DUAL_MIPI_DSI  
    if(pipe != 0)
    {

        I915_WRITE_BITS(MIPI_PORT_CTRL(0), LP_OUTPUT_HOLD,
                LP_OUTPUT_HOLD);

        usleep_range(1000, 1500);
    }
    #endif


	I915_WRITE_BITS(MIPI_PORT_CTRL(pipe), LP_OUTPUT_HOLD,
						LP_OUTPUT_HOLD);

	usleep_range(1000, 1500);
	I915_WRITE_BITS(MIPI_DEVICE_READY(pipe), DEVICE_READY |
			ULPS_STATE_EXIT, DEVICE_READY |
			ULPS_STATE_MASK);

	usleep_range(2000, 2500);
	I915_WRITE_BITS(MIPI_DEVICE_READY(pipe), DEVICE_READY,
			DEVICE_READY | ULPS_STATE_MASK);
	usleep_range(2000, 2500);
	I915_WRITE_BITS(MIPI_DEVICE_READY(pipe), 0x00,
			DEVICE_READY | ULPS_STATE_MASK);
	usleep_range(2000, 2500);
	I915_WRITE_BITS(MIPI_DEVICE_READY(pipe), DEVICE_READY,
			DEVICE_READY | ULPS_STATE_MASK);
	usleep_range(2000, 2500);
}
void intel_dsi_device_ready(struct intel_encoder *encoder)
{
	struct drm_i915_private *dev_priv = encoder->base.dev->dev_private;
	struct intel_crtc *intel_crtc = to_intel_crtc(encoder->base.crtc);
	struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base);
	int pipe = intel_crtc->pipe;
	u32 tmp;
	int count = 1;

	DRM_DEBUG_KMS("\n");

	/* program rcomp for compliance
	 * reduce form 50 ohms to 45 ohms */
	intel_flisdsi_write32(dev_priv, 0x04, 0x0004);

	band_gap_reset(dev_priv);

#ifdef CONFIG_CRYSTAL_COVE
	if (BYT_CR_CONFIG) {
		/*  cabc disable */
		vlv_gpio_nc_write(dev_priv, GPIO_NC_9_PCONF0, 0x2000CC00);
		vlv_gpio_nc_write(dev_priv, GPIO_NC_9_PAD, 0x00000004);

		/* panel enable */
		vlv_gpio_nc_write(dev_priv, GPIO_NC_11_PCONF0, 0x2000CC00);
		vlv_gpio_nc_write(dev_priv, GPIO_NC_11_PAD, 0x00000005);
		udelay(500);
	} else
		intel_mid_pmic_writeb(PMIC_PANEL_EN, 0x01);
#else
	/* need to code for BYT-CR for example where things have changed */
	DRM_ERROR("PANEL Enable to supported yet\n");
#endif
	msleep(intel_dsi->panel_on_delay);

	if (intel_dsi->dev.dev_ops->panel_reset)
		intel_dsi->dev.dev_ops->panel_reset(&intel_dsi->dev);

	/* Disable DPOunit clock gating, can stall pipe */
	tmp = I915_READ(DPLL(pipe));
	tmp |= DPLL_RESERVED_BIT;
	I915_WRITE(DPLL(pipe), tmp);

	tmp = I915_READ(DSPCLK_GATE_D);
	tmp |= VSUNIT_CLOCK_GATE_DISABLE;
	I915_WRITE(DSPCLK_GATE_D, tmp);

	intel_enable_dsi_pll(intel_dsi);
	if (intel_dsi->operation_mode == DSI_VIDEO_MODE) {

		I915_WRITE_BITS(MIPI_PORT_CTRL(pipe), LP_OUTPUT_HOLD,
							LP_OUTPUT_HOLD);

		usleep_range(1000, 1500);

		if (intel_dsi->dual_link)
			count = 2;
		do {

			I915_WRITE_BITS(MIPI_DEVICE_READY(pipe), DEVICE_READY |
					ULPS_STATE_EXIT, DEVICE_READY |
					ULPS_STATE_MASK);

			usleep_range(2000, 2500);
			I915_WRITE_BITS(MIPI_DEVICE_READY(pipe), DEVICE_READY,
					DEVICE_READY | ULPS_STATE_MASK);
			usleep_range(2000, 2500);
			I915_WRITE_BITS(MIPI_DEVICE_READY(pipe), 0x00,
					DEVICE_READY | ULPS_STATE_MASK);
			usleep_range(2000, 2500);
			I915_WRITE_BITS(MIPI_DEVICE_READY(pipe), DEVICE_READY,
					DEVICE_READY | ULPS_STATE_MASK);
			usleep_range(2000, 2500);
			/* For Port C for dual link */
			pipe = PIPE_B;
		} while (--count > 0);
	}
}