int da9052_adc_manual_read(struct da9052 *da9052, unsigned char channel) { int ret; unsigned short calc_data; unsigned short data; unsigned char mux_sel; if (channel > DA9052_ADC_VBBAT) return -EINVAL; mutex_lock(&da9052->auxadc_lock); /* Channel gets activated on enabling the Conversion bit */ mux_sel = chan_mux[channel] | DA9052_ADC_MAN_MAN_CONV; ret = da9052_reg_write(da9052, DA9052_ADC_MAN_REG, mux_sel); if (ret < 0) goto err; /* Wait for an interrupt */ if (!wait_for_completion_timeout(&da9052->done, msecs_to_jiffies(500))) { dev_err(da9052->dev, "timeout waiting for ADC conversion interrupt\n"); ret = -ETIMEDOUT; goto err; } ret = da9052_reg_read(da9052, DA9052_ADC_RES_H_REG); if (ret < 0) goto err; calc_data = (unsigned short)ret; data = calc_data << 2; ret = da9052_reg_read(da9052, DA9052_ADC_RES_L_REG); if (ret < 0) goto err; calc_data = (unsigned short)(ret & DA9052_ADC_RES_LSB); data |= calc_data; ret = data; err: mutex_unlock(&da9052->auxadc_lock); return ret; }
static int da9052_USB_current_notifier(struct notifier_block *nb, unsigned long events, void *data) { u8 row; u8 col; int *current_mA = data; int ret; struct da9052_battery *bat = container_of(nb, struct da9052_battery, nb); if (bat->status == POWER_SUPPLY_STATUS_DISCHARGING) return -EPERM; ret = da9052_reg_read(bat->da9052, DA9052_CHGBUCK_REG); if (ret & DA9052_CHG_USB_ILIM_MASK) return -EPERM; if (bat->da9052->chip_id == DA9052) row = 0; else row = 1; if (*current_mA < da9052_chg_current_lim[row][0] || *current_mA > da9052_chg_current_lim[row][DA9052_CHG_LIM_COLS - 1]) return -EINVAL; for (col = 0; col <= DA9052_CHG_LIM_COLS - 1 ; col++) { if (*current_mA <= da9052_chg_current_lim[row][col]) break; } return da9052_reg_update(bat->da9052, DA9052_ISET_REG, DA9052_ISET_USB_MASK, col); }
int da9052_adc_read_temp(struct da9052 *da9052) { int tbat; tbat = da9052_reg_read(da9052, DA9052_TBAT_RES_REG); if (tbat <= 0) return tbat; /* ARRAY_SIZE check is not needed since TBAT is a 8-bit register */ return tbat_lookup[tbat - 1]; }
static int da9052_rtc_get_alarm_status(struct da9052 *da9052) { int ret; ret = da9052_reg_read(da9052, DA9052_ALARM_Y_REG); if (ret < 0) { rtc_err(da9052, "Failed to read ALM: %d\n", ret); return ret; } ret &= DA9052_ALARM_Y_ALARM_ON; return (ret > 0) ? 1 : 0; }
static int da9052_rtc_get_alarm_status(struct da9052_rtc *rtc) { int ret; ret = da9052_reg_read(rtc->da9052, DA9052_ALARM_Y_REG); if (ret < 0) { rtc_err(rtc, "Failed to read ALM: %d\n", ret); return ret; } return !!(ret&DA9052_ALARM_Y_ALARM_ON); }
static int da9052_read_chg_current(struct da9052_battery *bat, int *current_mA) { int ret; if (bat->status == POWER_SUPPLY_STATUS_DISCHARGING) return -EINVAL; ret = da9052_reg_read(bat->da9052, DA9052_ICHG_AV_REG); if (ret < 0) return ret; *current_mA = ichg_reg_to_mA(ret & DA9052_ICHGAV_ICHGAV); return 0; }
static int da9052_dcdc_get_current_limit(struct regulator_dev *rdev) { struct da9052_regulator *regulator = rdev_get_drvdata(rdev); int offset = rdev_get_id(rdev); int ret, row = 2; ret = da9052_reg_read(regulator->da9052, DA9052_BUCKA_REG + offset/2); if (ret < 0) return ret; /* Determine the even or odd position of the buck current limit * register field */ if (offset % 2 == 0) ret = (ret & DA9052_BUCK_ILIM_MASK_EVEN) >> 2; else
static irqreturn_t da9052_rtc_irq(int irq, void *data) { struct da9052_rtc *rtc = data; int ret; ret = da9052_reg_read(rtc->da9052, DA9052_ALARM_MI_REG); if (ret < 0) { rtc_err(rtc->da9052, "Read error: %d\n", ret); return IRQ_NONE; } if (ret & DA9052_ALARMMI_ALARMTYPE) { da9052_rtc_enable_alarm(rtc->da9052, 0); rtc_update_irq(rtc->rtc, 1, RTC_IRQF | RTC_AF); } else rtc_update_irq(rtc->rtc, 1, RTC_IRQF | RTC_PF); return IRQ_HANDLED; }