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; }
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, ®_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; }