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; }
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; }