static int da9055_set_alarm(struct da9055 *da9055, struct rtc_time *rtc_tm) { int ret; uint8_t v[2]; rtc_tm->tm_year -= 100; rtc_tm->tm_mon += 1; ret = da9055_reg_update(da9055, DA9055_REG_ALARM_MI, DA9055_RTC_ALM_MIN, rtc_tm->tm_min); if (ret != 0) { dev_err(da9055->dev, "Failed to write ALRM MIN: %d\n", ret); return ret; } v[0] = rtc_tm->tm_hour; v[1] = rtc_tm->tm_mday; ret = da9055_group_write(da9055, DA9055_REG_ALARM_H, 2, v); if (ret < 0) return ret; ret = da9055_reg_update(da9055, DA9055_REG_ALARM_MO, DA9055_RTC_ALM_MONTH, rtc_tm->tm_mon); if (ret < 0) dev_err(da9055->dev, "Failed to write ALM Month:%d\n", ret); ret = da9055_reg_update(da9055, DA9055_REG_ALARM_Y, DA9055_RTC_ALM_YEAR, rtc_tm->tm_year); if (ret < 0) dev_err(da9055->dev, "Failed to write ALM Year:%d\n", ret); return ret; }
static int da9055_rtc_set_time(struct device *dev, struct rtc_time *tm) { struct da9055_rtc *rtc; uint8_t v[6]; rtc = dev_get_drvdata(dev); v[0] = tm->tm_sec; v[1] = tm->tm_min; v[2] = tm->tm_hour; v[3] = tm->tm_mday; v[4] = tm->tm_mon + 1; v[5] = tm->tm_year - 100; return da9055_group_write(rtc->da9055, DA9055_REG_COUNT_S, 6, v); }
int da9055_device_init(struct da9055 *da9055) { struct da9055_pdata *pdata = dev_get_platdata(da9055->dev); int ret; uint8_t clear_events[3] = {0xFF, 0xFF, 0xFF}; if (pdata && pdata->init != NULL) pdata->init(da9055); if (!pdata || !pdata->irq_base) da9055->irq_base = -1; else da9055->irq_base = pdata->irq_base; ret = da9055_group_write(da9055, DA9055_REG_EVENT_A, 3, clear_events); if (ret < 0) return ret; ret = regmap_add_irq_chip(da9055->regmap, da9055->chip_irq, IRQF_TRIGGER_LOW | IRQF_ONESHOT, da9055->irq_base, &da9055_regmap_irq_chip, &da9055->irq_data); if (ret < 0) return ret; da9055->irq_base = regmap_irq_chip_get_base(da9055->irq_data); ret = mfd_add_devices(da9055->dev, -1, da9055_devs, ARRAY_SIZE(da9055_devs), NULL, da9055->irq_base, NULL); if (ret) goto err; return 0; err: mfd_remove_devices(da9055->dev); return ret; }