Exemple #1
0
static int palmas_rtc_read_time(struct device *dev, struct rtc_time *tm)
{
    unsigned char rtc_data[PALMAS_NUM_TIME_REGS];
    struct palmas *palmas = dev_get_drvdata(dev->parent);
    int ret;

    /* Copy RTC counting registers to static registers or latches */
    ret = palmas_update_bits(palmas, PALMAS_RTC_BASE, PALMAS_RTC_CTRL_REG,
                             PALMAS_RTC_CTRL_REG_GET_TIME, PALMAS_RTC_CTRL_REG_GET_TIME);
    if (ret < 0) {
        dev_err(dev, "RTC CTRL reg update failed, err: %d\n", ret);
        return ret;
    }

    ret = palmas_bulk_read(palmas, PALMAS_RTC_BASE, PALMAS_SECONDS_REG,
                           rtc_data, PALMAS_NUM_TIME_REGS);
    if (ret < 0) {
        dev_err(dev, "RTC_SECONDS reg read failed, err = %d\n", ret);
        return ret;
    }

    tm->tm_sec = bcd2bin(rtc_data[0]);
    tm->tm_min = bcd2bin(rtc_data[1]);
    tm->tm_hour = bcd2bin(rtc_data[2]);
    tm->tm_mday = bcd2bin(rtc_data[3]);
    tm->tm_mon = bcd2bin(rtc_data[4]) - 1;
    tm->tm_year = bcd2bin(rtc_data[5]) + 100;

    return ret;
}
static int palmas_gpadc_start_convertion(struct palmas_gpadc *adc, int adc_chan)
{
	unsigned int val;
	int ret;

	INIT_COMPLETION(adc->conv_completion);
	ret = palmas_update_bits(adc->palmas, PALMAS_GPADC_BASE,
				PALMAS_GPADC_SW_SELECT,
				PALMAS_GPADC_SW_SELECT_SW_START_CONV0,
				PALMAS_GPADC_SW_SELECT_SW_START_CONV0);
	if (ret < 0) {
		dev_err(adc->dev, "ADC_SW_START write failed: %d\n", ret);
		return ret;
	}

	ret = wait_for_completion_timeout(&adc->conv_completion,
				ADC_CONVERTION_TIMEOUT);
	if (ret == 0) {
		dev_err(adc->dev, "ADC conversion not completed\n");
		ret = -ETIMEDOUT;
		return ret;
	}

	ret = palmas_bulk_read(adc->palmas, PALMAS_GPADC_BASE,
				PALMAS_GPADC_SW_CONV0_LSB, &val, 2);
	if (ret < 0) {
		dev_err(adc->dev, "ADCDATA read failed: %d\n", ret);
		return ret;
	}

	ret = (val & 0xFFF);
	return ret;
}
Exemple #3
0
static int palmas_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alm)
{
    unsigned char alarm_data[PALMAS_NUM_TIME_REGS];
    u32 int_val;
    struct palmas *palmas = dev_get_drvdata(dev->parent);
    int ret;

    ret = palmas_bulk_read(palmas, PALMAS_RTC_BASE,
                           PALMAS_ALARM_SECONDS_REG,
                           alarm_data, PALMAS_NUM_TIME_REGS);
    if (ret < 0) {
        dev_err(dev, "RTC_ALARM_SECONDS read failed, err = %d\n", ret);
        return ret;
    }

    alm->time.tm_sec = bcd2bin(alarm_data[0]);
    alm->time.tm_min = bcd2bin(alarm_data[1]);
    alm->time.tm_hour = bcd2bin(alarm_data[2]);
    alm->time.tm_mday = bcd2bin(alarm_data[3]);
    alm->time.tm_mon = bcd2bin(alarm_data[4]) - 1;
    alm->time.tm_year = bcd2bin(alarm_data[5]) + 100;

    ret = palmas_read(palmas, PALMAS_RTC_BASE, PALMAS_RTC_INTERRUPTS_REG,
                      &int_val);
    if (ret < 0) {
        dev_err(dev, "RTC_INTERRUPTS reg read failed, err = %d\n", ret);
        return ret;
    }

    if (int_val & PALMAS_RTC_INTERRUPTS_REG_IT_ALARM)
        alm->enabled = 1;
    return ret;
}