static int d2083_regulator_set_voltage(struct regulator_dev *rdev, int min_uV, int max_uV,unsigned *selector)
{
	struct d2083 *d2083 = rdev_get_drvdata(rdev);
	int mV_val;
	int min_mV = uV_to_mV(min_uV);
	int max_mV = uV_to_mV(max_uV);
	unsigned int reg_num, regulator_id = rdev_get_id(rdev);
	u8 val;	
	int ret = 0;
	*selector = -1;

	// Neet to implement parameter *selector : reference v_table / num_voltages

	/* before we do anything check the lock bit */
	ret = d2083_reg_read(d2083, D2083_SUPPLY_REG, &val);
	if(val & D2083_SUPPLY_VLOCK)
		d2083_clear_bits(d2083, D2083_SUPPLY_REG, D2083_SUPPLY_VLOCK);

	mV_val =  d2083_regulator_mvolts_to_val(min_mV, regulator_id, rdev);

	/* Sanity check for maximum value */
	if (d2083_regulator_val_to_mvolts(mV_val, regulator_id, rdev) > max_mV)
		return -EINVAL;

	reg_num = get_regulator_reg(regulator_id);

	ret = d2083_reg_read(d2083, reg_num, &val);
	val &= ~D2083_MAX_VSEL;
	
	d2083_reg_write(d2083, reg_num, (val | mV_val));

	/* For BUCKs enable the ramp */
	if (regulator_id <= D2083_BUCK_4)
		d2083_set_bits(d2083, D2083_SUPPLY_REG, (D2083_SUPPLY_VBUCK1GO << regulator_id));

	*selector = regulator_id;
	
	return ret;
}
Example #2
0
static inline u8 audio_set_bits(int reg, u8 mask)
{
	return d2083_set_bits(d2083, reg, mask);
}
int d2083_device_init(struct d2083 *d2083, int irq,
		       struct d2083_platform_data *pdata)
{
	int ret = 0;//, tmp;
	//struct regulator *regulator;
#ifdef D2083_REG_DEBUG 
	int i;
	u8 data;
#endif

	if(d2083 != NULL)
		d2083_regl_info = d2083;
	else
		goto err;

	dlg_info("D2083 Driver version : %s\n", D2083_VERSION);

	d2083->pmic.max_dcdc = 25; //
	d2083->pdata = pdata;

#if defined(CONFIG_KONA_PMU_BSC_HS_MODE) || defined(CONFIG_KONA_PMU_BSC_HS_1625KHZ)
    d2083_set_bits(d2083, D2083_CONTROLB_REG, D2083_CONTROLB_I2C_SPEED);

	/* Page write for I2C we donot support repeated write and I2C speed set to 1.7MHz */
	d2083_clear_bits(d2083, D2083_CONTROLB_REG, D2083_CONTROLB_WRITEMODE);
#else
	/* Page write for I2C we donot support repeated write and I2C speed set to 400KHz */
	d2083_clear_bits(d2083, D2083_CONTROLB_REG, D2083_CONTROLB_WRITEMODE | D2083_CONTROLB_I2C_SPEED);
#endif

#if 0	// TEST ONLY
	{	// register dump
		int i=0;
		u8 reg_val;
		
		for(i=0; i<=D2083_BIAS_CTRL_REG; i++)
		{
			d2083_reg_read(d2083, i, &reg_val);
			printk(KERN_ERR "addr[0x%x] = [0x%x]\n", i, reg_val);
		}
	}
#endif

	d2083_reg_write(d2083, D2083_BUCKA_REG,0x9A);

#if 1	// 20120221 LDO13 issue
    d2083_reg_write(d2083, D2083_PDDIS_REG,0x0);
    d2083_reg_write(d2083, D2083_PULLDOWN_REG_D,0x0);
    // audio
    d2083_reg_write(d2083, D2083_PREAMP_A_CTRL1_REG,0x34);
    d2083_reg_write(d2083, D2083_PREAMP_A_CTRL2_REG,0x0);
    d2083_reg_write(d2083, D2083_SP_CTRL_REG,0xCC);
    
    // LDO 
    d2083_reg_write(d2083, D2083_LDO1_REG, 0x00); //LDO 1 1.2V    // spare
    d2083_reg_write(d2083, D2083_LDO3_REG, 0x24); //LDO 3 3.0V    // VDD_SENSOR_3.0V
    d2083_reg_write(d2083, D2083_LDO6_REG, 0x20); //LDO 6 2.8V    // VCAM_A_2.8V
    d2083_reg_write(d2083, D2083_LDO7_REG, 0x2A); //LDO 7 3.3V    // VDD_VIB_3.3V
    d2083_reg_write(d2083, D2083_LDO8_REG, 0x64); //LDO 8 3.0V    // VLCD_3.0V
    d2083_reg_write(d2083, D2083_LDO9_REG, 0x24); //LDO 9 3.0V    // VDD_SDXC

    d2083_reg_write(d2083, D2083_LDO11_REG, 0x24); //LDO 11 3.0V    // VSIM1_3.0V
    d2083_reg_write(d2083, D2083_LDO13_REG, 0x24); //LDO 13 3.0V    // VDD_SDIO_3.0V
    d2083_reg_write(d2083, D2083_LDO14_REG, 0xC ); //LDO 14 1.8V    // VTOUCH_1.8V
    d2083_reg_write(d2083, D2083_LDO15_REG, 0x2A); //LDO 15 3.3V    // VTOUCH_3.3V
    d2083_reg_write(d2083, D2083_LDO16_REG, 0xC ); //LDO 16 1.8V    // VCAMC_IO_1.8V
    d2083_reg_write(d2083, D2083_LDO17_REG, 0x20); //LDO 17 2.8V    // VCAM_AF_2.8V
    d2083_reg_write(d2083, D2083_BUCK4_REG, 0x54); //BUCK 4 3.3V	// VDD_3G_PAM_3.3V
#endif

    d2083_reg_write(d2083,D2083_BBATCONT_REG,0x1F);
    d2083_set_bits(d2083,D2083_SUPPLY_REG,D2083_SUPPLY_BBCHGEN);

	/* DLG todo */
	if (pdata && pdata->irq_init) {
		dlg_crit("\nD2083-core.c: IRQ PIN Configuration \n");
		ret = pdata->irq_init(d2083);
		if (ret != 0) {
			dev_err(d2083->dev, "Platform init() failed: %d\n", ret);
			goto err_irq;
		}
	}

	d2083_dev_info = d2083;
	pm_power_off = d2083_system_poweroff;

	ret = d2083_irq_init(d2083, irq, pdata);
	if (ret < 0)
		goto err;
    
	//DLG todo d2083_worker_init(irq); //new for Samsung
    
	if (pdata && pdata->init) {
		ret = pdata->init(d2083);
		if (ret != 0) {
			dev_err(d2083->dev, "Platform init() failed: %d\n", ret);
			goto err_irq;
		}
	}
	
	// Regulator Specific Init
	ret = d2083_platform_regulator_init(d2083);
	if (ret != 0) {
		dev_err(d2083->dev, "Platform Regulator init() failed: %d\n", ret);
		goto err_irq;
	}

	d2083_client_dev_register(d2083, "d2083-battery", &(d2083->batt.pdev));
	d2083_client_dev_register(d2083, "d2083-rtc", &(d2083->rtc.pdev));
	d2083_client_dev_register(d2083, "d2083-onkey", &(d2083->onkey.pdev));
	d2083_client_dev_register(d2083, "d2083-audio", &(d2083->audio.pdev));

	d2083_system_event_init(d2083);
#if defined(CONFIG_MACH_RHEA_SS_IVORY) || defined(CONFIG_MACH_RHEA_SS_NEVIS) || defined(CONFIG_MACH_RHEA_SS_NEVISP)
	d2083_debug_proc_init(d2083);
#endif /* CONFIG_MACH_RHEA_SS_IVORY */

#ifdef D2083_REG_DEBUG    
	  for(i=0; i<D2083_MAX_REGISTER_CNT; i++)
	  {
	  	d2083_reg_read(d2083, i, &data);
		d2083_write_reg_cache(i,data);
	  }
#endif   

    // temporary code
	if (pdata->pmu_event_cb)
		pdata->pmu_event_cb(0, 0);		//PMU_EVENT_INIT_PLATFORM

	// set MCTRL_EN enabled
	set_MCTL_enabled();

	return 0;

err_irq:
	d2083_irq_exit(d2083);
	d2083_dev_info = NULL;
	pm_power_off = NULL;
err:
	dlg_crit("\n\nD2083-core.c: device init failed ! \n\n");
	return ret;
}