1*0b2f6228SArnaud Ebalard /* 2*0b2f6228SArnaud Ebalard * rtc-ab-b5ze-s3 - Driver for Abracon AB-RTCMC-32.768Khz-B5ZE-S3 3*0b2f6228SArnaud Ebalard * I2C RTC / Alarm chip 4*0b2f6228SArnaud Ebalard * 5*0b2f6228SArnaud Ebalard * Copyright (C) 2014, Arnaud EBALARD <arno@natisbad.org> 6*0b2f6228SArnaud Ebalard * 7*0b2f6228SArnaud Ebalard * Detailed datasheet of the chip is available here: 8*0b2f6228SArnaud Ebalard * 9*0b2f6228SArnaud Ebalard * http://www.abracon.com/realtimeclock/AB-RTCMC-32.768kHz-B5ZE-S3-Application-Manual.pdf 10*0b2f6228SArnaud Ebalard * 11*0b2f6228SArnaud Ebalard * This work is based on ISL12057 driver (drivers/rtc/rtc-isl12057.c). 12*0b2f6228SArnaud Ebalard * 13*0b2f6228SArnaud Ebalard * This program is free software; you can redistribute it and/or modify 14*0b2f6228SArnaud Ebalard * it under the terms of the GNU General Public License as published by 15*0b2f6228SArnaud Ebalard * the Free Software Foundation; either version 2 of the License, or 16*0b2f6228SArnaud Ebalard * (at your option) any later version. 17*0b2f6228SArnaud Ebalard * 18*0b2f6228SArnaud Ebalard * This program is distributed in the hope that it will be useful, 19*0b2f6228SArnaud Ebalard * but WITHOUT ANY WARRANTY; without even the implied warranty of 20*0b2f6228SArnaud Ebalard * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 21*0b2f6228SArnaud Ebalard * GNU General Public License for more details. 22*0b2f6228SArnaud Ebalard */ 23*0b2f6228SArnaud Ebalard 24*0b2f6228SArnaud Ebalard #include <linux/module.h> 25*0b2f6228SArnaud Ebalard #include <linux/mutex.h> 26*0b2f6228SArnaud Ebalard #include <linux/rtc.h> 27*0b2f6228SArnaud Ebalard #include <linux/i2c.h> 28*0b2f6228SArnaud Ebalard #include <linux/bcd.h> 29*0b2f6228SArnaud Ebalard #include <linux/of.h> 30*0b2f6228SArnaud Ebalard #include <linux/regmap.h> 31*0b2f6228SArnaud Ebalard #include <linux/interrupt.h> 32*0b2f6228SArnaud Ebalard 33*0b2f6228SArnaud Ebalard #define DRV_NAME "rtc-ab-b5ze-s3" 34*0b2f6228SArnaud Ebalard 35*0b2f6228SArnaud Ebalard /* Control section */ 36*0b2f6228SArnaud Ebalard #define ABB5ZES3_REG_CTRL1 0x00 /* Control 1 register */ 37*0b2f6228SArnaud Ebalard #define ABB5ZES3_REG_CTRL1_CIE BIT(0) /* Pulse interrupt enable */ 38*0b2f6228SArnaud Ebalard #define ABB5ZES3_REG_CTRL1_AIE BIT(1) /* Alarm interrupt enable */ 39*0b2f6228SArnaud Ebalard #define ABB5ZES3_REG_CTRL1_SIE BIT(2) /* Second interrupt enable */ 40*0b2f6228SArnaud Ebalard #define ABB5ZES3_REG_CTRL1_PM BIT(3) /* 24h/12h mode */ 41*0b2f6228SArnaud Ebalard #define ABB5ZES3_REG_CTRL1_SR BIT(4) /* Software reset */ 42*0b2f6228SArnaud Ebalard #define ABB5ZES3_REG_CTRL1_STOP BIT(5) /* RTC circuit enable */ 43*0b2f6228SArnaud Ebalard #define ABB5ZES3_REG_CTRL1_CAP BIT(7) 44*0b2f6228SArnaud Ebalard 45*0b2f6228SArnaud Ebalard #define ABB5ZES3_REG_CTRL2 0x01 /* Control 2 register */ 46*0b2f6228SArnaud Ebalard #define ABB5ZES3_REG_CTRL2_CTBIE BIT(0) /* Countdown timer B int. enable */ 47*0b2f6228SArnaud Ebalard #define ABB5ZES3_REG_CTRL2_CTAIE BIT(1) /* Countdown timer A int. enable */ 48*0b2f6228SArnaud Ebalard #define ABB5ZES3_REG_CTRL2_WTAIE BIT(2) /* Watchdog timer A int. enable */ 49*0b2f6228SArnaud Ebalard #define ABB5ZES3_REG_CTRL2_AF BIT(3) /* Alarm interrupt status */ 50*0b2f6228SArnaud Ebalard #define ABB5ZES3_REG_CTRL2_SF BIT(4) /* Second interrupt status */ 51*0b2f6228SArnaud Ebalard #define ABB5ZES3_REG_CTRL2_CTBF BIT(5) /* Countdown timer B int. status */ 52*0b2f6228SArnaud Ebalard #define ABB5ZES3_REG_CTRL2_CTAF BIT(6) /* Countdown timer A int. status */ 53*0b2f6228SArnaud Ebalard #define ABB5ZES3_REG_CTRL2_WTAF BIT(7) /* Watchdog timer A int. status */ 54*0b2f6228SArnaud Ebalard 55*0b2f6228SArnaud Ebalard #define ABB5ZES3_REG_CTRL3 0x02 /* Control 3 register */ 56*0b2f6228SArnaud Ebalard #define ABB5ZES3_REG_CTRL3_PM2 BIT(7) /* Power Management bit 2 */ 57*0b2f6228SArnaud Ebalard #define ABB5ZES3_REG_CTRL3_PM1 BIT(6) /* Power Management bit 1 */ 58*0b2f6228SArnaud Ebalard #define ABB5ZES3_REG_CTRL3_PM0 BIT(5) /* Power Management bit 0 */ 59*0b2f6228SArnaud Ebalard #define ABB5ZES3_REG_CTRL3_BSF BIT(3) /* Battery switchover int. status */ 60*0b2f6228SArnaud Ebalard #define ABB5ZES3_REG_CTRL3_BLF BIT(2) /* Battery low int. status */ 61*0b2f6228SArnaud Ebalard #define ABB5ZES3_REG_CTRL3_BSIE BIT(1) /* Battery switchover int. enable */ 62*0b2f6228SArnaud Ebalard #define ABB5ZES3_REG_CTRL3_BLIE BIT(0) /* Battery low int. enable */ 63*0b2f6228SArnaud Ebalard 64*0b2f6228SArnaud Ebalard #define ABB5ZES3_CTRL_SEC_LEN 3 65*0b2f6228SArnaud Ebalard 66*0b2f6228SArnaud Ebalard /* RTC section */ 67*0b2f6228SArnaud Ebalard #define ABB5ZES3_REG_RTC_SC 0x03 /* RTC Seconds register */ 68*0b2f6228SArnaud Ebalard #define ABB5ZES3_REG_RTC_SC_OSC BIT(7) /* Clock integrity status */ 69*0b2f6228SArnaud Ebalard #define ABB5ZES3_REG_RTC_MN 0x04 /* RTC Minutes register */ 70*0b2f6228SArnaud Ebalard #define ABB5ZES3_REG_RTC_HR 0x05 /* RTC Hours register */ 71*0b2f6228SArnaud Ebalard #define ABB5ZES3_REG_RTC_HR_PM BIT(5) /* RTC Hours PM bit */ 72*0b2f6228SArnaud Ebalard #define ABB5ZES3_REG_RTC_DT 0x06 /* RTC Date register */ 73*0b2f6228SArnaud Ebalard #define ABB5ZES3_REG_RTC_DW 0x07 /* RTC Day of the week register */ 74*0b2f6228SArnaud Ebalard #define ABB5ZES3_REG_RTC_MO 0x08 /* RTC Month register */ 75*0b2f6228SArnaud Ebalard #define ABB5ZES3_REG_RTC_YR 0x09 /* RTC Year register */ 76*0b2f6228SArnaud Ebalard 77*0b2f6228SArnaud Ebalard #define ABB5ZES3_RTC_SEC_LEN 7 78*0b2f6228SArnaud Ebalard 79*0b2f6228SArnaud Ebalard /* Alarm section (enable bits are all active low) */ 80*0b2f6228SArnaud Ebalard #define ABB5ZES3_REG_ALRM_MN 0x0A /* Alarm - minute register */ 81*0b2f6228SArnaud Ebalard #define ABB5ZES3_REG_ALRM_MN_AE BIT(7) /* Minute enable */ 82*0b2f6228SArnaud Ebalard #define ABB5ZES3_REG_ALRM_HR 0x0B /* Alarm - hours register */ 83*0b2f6228SArnaud Ebalard #define ABB5ZES3_REG_ALRM_HR_AE BIT(7) /* Hour enable */ 84*0b2f6228SArnaud Ebalard #define ABB5ZES3_REG_ALRM_DT 0x0C /* Alarm - date register */ 85*0b2f6228SArnaud Ebalard #define ABB5ZES3_REG_ALRM_DT_AE BIT(7) /* Date (day of the month) enable */ 86*0b2f6228SArnaud Ebalard #define ABB5ZES3_REG_ALRM_DW 0x0D /* Alarm - day of the week reg. */ 87*0b2f6228SArnaud Ebalard #define ABB5ZES3_REG_ALRM_DW_AE BIT(7) /* Day of the week enable */ 88*0b2f6228SArnaud Ebalard 89*0b2f6228SArnaud Ebalard #define ABB5ZES3_ALRM_SEC_LEN 4 90*0b2f6228SArnaud Ebalard 91*0b2f6228SArnaud Ebalard /* Frequency offset section */ 92*0b2f6228SArnaud Ebalard #define ABB5ZES3_REG_FREQ_OF 0x0E /* Frequency offset register */ 93*0b2f6228SArnaud Ebalard #define ABB5ZES3_REG_FREQ_OF_MODE 0x0E /* Offset mode: 2 hours / minute */ 94*0b2f6228SArnaud Ebalard 95*0b2f6228SArnaud Ebalard /* CLOCKOUT section */ 96*0b2f6228SArnaud Ebalard #define ABB5ZES3_REG_TIM_CLK 0x0F /* Timer & Clockout register */ 97*0b2f6228SArnaud Ebalard #define ABB5ZES3_REG_TIM_CLK_TAM BIT(7) /* Permanent/pulsed timer A/int. 2 */ 98*0b2f6228SArnaud Ebalard #define ABB5ZES3_REG_TIM_CLK_TBM BIT(6) /* Permanent/pulsed timer B */ 99*0b2f6228SArnaud Ebalard #define ABB5ZES3_REG_TIM_CLK_COF2 BIT(5) /* Clkout Freq bit 2 */ 100*0b2f6228SArnaud Ebalard #define ABB5ZES3_REG_TIM_CLK_COF1 BIT(4) /* Clkout Freq bit 1 */ 101*0b2f6228SArnaud Ebalard #define ABB5ZES3_REG_TIM_CLK_COF0 BIT(3) /* Clkout Freq bit 0 */ 102*0b2f6228SArnaud Ebalard #define ABB5ZES3_REG_TIM_CLK_TAC1 BIT(2) /* Timer A: - 01 : countdown */ 103*0b2f6228SArnaud Ebalard #define ABB5ZES3_REG_TIM_CLK_TAC0 BIT(1) /* - 10 : timer */ 104*0b2f6228SArnaud Ebalard #define ABB5ZES3_REG_TIM_CLK_TBC BIT(0) /* Timer B enable */ 105*0b2f6228SArnaud Ebalard 106*0b2f6228SArnaud Ebalard /* Timer A Section */ 107*0b2f6228SArnaud Ebalard #define ABB5ZES3_REG_TIMA_CLK 0x10 /* Timer A clock register */ 108*0b2f6228SArnaud Ebalard #define ABB5ZES3_REG_TIMA_CLK_TAQ2 BIT(2) /* Freq bit 2 */ 109*0b2f6228SArnaud Ebalard #define ABB5ZES3_REG_TIMA_CLK_TAQ1 BIT(1) /* Freq bit 1 */ 110*0b2f6228SArnaud Ebalard #define ABB5ZES3_REG_TIMA_CLK_TAQ0 BIT(0) /* Freq bit 0 */ 111*0b2f6228SArnaud Ebalard #define ABB5ZES3_REG_TIMA 0x11 /* Timer A register */ 112*0b2f6228SArnaud Ebalard 113*0b2f6228SArnaud Ebalard #define ABB5ZES3_TIMA_SEC_LEN 2 114*0b2f6228SArnaud Ebalard 115*0b2f6228SArnaud Ebalard /* Timer B Section */ 116*0b2f6228SArnaud Ebalard #define ABB5ZES3_REG_TIMB_CLK 0x12 /* Timer B clock register */ 117*0b2f6228SArnaud Ebalard #define ABB5ZES3_REG_TIMB_CLK_TBW2 BIT(6) 118*0b2f6228SArnaud Ebalard #define ABB5ZES3_REG_TIMB_CLK_TBW1 BIT(5) 119*0b2f6228SArnaud Ebalard #define ABB5ZES3_REG_TIMB_CLK_TBW0 BIT(4) 120*0b2f6228SArnaud Ebalard #define ABB5ZES3_REG_TIMB_CLK_TAQ2 BIT(2) 121*0b2f6228SArnaud Ebalard #define ABB5ZES3_REG_TIMB_CLK_TAQ1 BIT(1) 122*0b2f6228SArnaud Ebalard #define ABB5ZES3_REG_TIMB_CLK_TAQ0 BIT(0) 123*0b2f6228SArnaud Ebalard #define ABB5ZES3_REG_TIMB 0x13 /* Timer B register */ 124*0b2f6228SArnaud Ebalard #define ABB5ZES3_TIMB_SEC_LEN 2 125*0b2f6228SArnaud Ebalard 126*0b2f6228SArnaud Ebalard #define ABB5ZES3_MEM_MAP_LEN 0x14 127*0b2f6228SArnaud Ebalard 128*0b2f6228SArnaud Ebalard struct abb5zes3_rtc_data { 129*0b2f6228SArnaud Ebalard struct rtc_device *rtc; 130*0b2f6228SArnaud Ebalard struct regmap *regmap; 131*0b2f6228SArnaud Ebalard struct mutex lock; 132*0b2f6228SArnaud Ebalard 133*0b2f6228SArnaud Ebalard int irq; 134*0b2f6228SArnaud Ebalard 135*0b2f6228SArnaud Ebalard bool battery_low; 136*0b2f6228SArnaud Ebalard }; 137*0b2f6228SArnaud Ebalard 138*0b2f6228SArnaud Ebalard /* 139*0b2f6228SArnaud Ebalard * Try and match register bits w/ fixed null values to see whether we 140*0b2f6228SArnaud Ebalard * are dealing with an ABB5ZES3. Note: this function is called early 141*0b2f6228SArnaud Ebalard * during init and hence does need mutex protection. 142*0b2f6228SArnaud Ebalard */ 143*0b2f6228SArnaud Ebalard static int abb5zes3_i2c_validate_chip(struct regmap *regmap) 144*0b2f6228SArnaud Ebalard { 145*0b2f6228SArnaud Ebalard u8 regs[ABB5ZES3_MEM_MAP_LEN]; 146*0b2f6228SArnaud Ebalard static const u8 mask[ABB5ZES3_MEM_MAP_LEN] = { 0x00, 0x00, 0x10, 0x00, 147*0b2f6228SArnaud Ebalard 0x80, 0xc0, 0xc0, 0xf8, 148*0b2f6228SArnaud Ebalard 0xe0, 0x00, 0x00, 0x40, 149*0b2f6228SArnaud Ebalard 0x40, 0x78, 0x00, 0x00, 150*0b2f6228SArnaud Ebalard 0xf8, 0x00, 0x88, 0x00 }; 151*0b2f6228SArnaud Ebalard int ret, i; 152*0b2f6228SArnaud Ebalard 153*0b2f6228SArnaud Ebalard ret = regmap_bulk_read(regmap, 0, regs, ABB5ZES3_MEM_MAP_LEN); 154*0b2f6228SArnaud Ebalard if (ret) 155*0b2f6228SArnaud Ebalard return ret; 156*0b2f6228SArnaud Ebalard 157*0b2f6228SArnaud Ebalard for (i = 0; i < ABB5ZES3_MEM_MAP_LEN; ++i) { 158*0b2f6228SArnaud Ebalard if (regs[i] & mask[i]) /* check if bits are cleared */ 159*0b2f6228SArnaud Ebalard return -ENODEV; 160*0b2f6228SArnaud Ebalard } 161*0b2f6228SArnaud Ebalard 162*0b2f6228SArnaud Ebalard return 0; 163*0b2f6228SArnaud Ebalard } 164*0b2f6228SArnaud Ebalard 165*0b2f6228SArnaud Ebalard /* Clear alarm status bit. */ 166*0b2f6228SArnaud Ebalard static int _abb5zes3_rtc_clear_alarm(struct device *dev) 167*0b2f6228SArnaud Ebalard { 168*0b2f6228SArnaud Ebalard struct abb5zes3_rtc_data *data = dev_get_drvdata(dev); 169*0b2f6228SArnaud Ebalard int ret; 170*0b2f6228SArnaud Ebalard 171*0b2f6228SArnaud Ebalard ret = regmap_update_bits(data->regmap, ABB5ZES3_REG_CTRL2, 172*0b2f6228SArnaud Ebalard ABB5ZES3_REG_CTRL2_AF, 0); 173*0b2f6228SArnaud Ebalard if (ret) 174*0b2f6228SArnaud Ebalard dev_err(dev, "%s: clearing alarm failed (%d)\n", __func__, ret); 175*0b2f6228SArnaud Ebalard 176*0b2f6228SArnaud Ebalard return ret; 177*0b2f6228SArnaud Ebalard } 178*0b2f6228SArnaud Ebalard 179*0b2f6228SArnaud Ebalard /* Enable or disable alarm (i.e. alarm interrupt generation) */ 180*0b2f6228SArnaud Ebalard static int _abb5zes3_rtc_update_alarm(struct device *dev, bool enable) 181*0b2f6228SArnaud Ebalard { 182*0b2f6228SArnaud Ebalard struct abb5zes3_rtc_data *data = dev_get_drvdata(dev); 183*0b2f6228SArnaud Ebalard int ret; 184*0b2f6228SArnaud Ebalard 185*0b2f6228SArnaud Ebalard ret = regmap_update_bits(data->regmap, ABB5ZES3_REG_CTRL1, 186*0b2f6228SArnaud Ebalard ABB5ZES3_REG_CTRL1_AIE, 187*0b2f6228SArnaud Ebalard enable ? ABB5ZES3_REG_CTRL1_AIE : 0); 188*0b2f6228SArnaud Ebalard if (ret) 189*0b2f6228SArnaud Ebalard dev_err(dev, "%s: writing alarm INT failed (%d)\n", 190*0b2f6228SArnaud Ebalard __func__, ret); 191*0b2f6228SArnaud Ebalard 192*0b2f6228SArnaud Ebalard return ret; 193*0b2f6228SArnaud Ebalard } 194*0b2f6228SArnaud Ebalard 195*0b2f6228SArnaud Ebalard /* 196*0b2f6228SArnaud Ebalard * Note: we only read, so regmap inner lock protection is sufficient, i.e. 197*0b2f6228SArnaud Ebalard * we do not need driver's main lock protection. 198*0b2f6228SArnaud Ebalard */ 199*0b2f6228SArnaud Ebalard static int _abb5zes3_rtc_read_time(struct device *dev, struct rtc_time *tm) 200*0b2f6228SArnaud Ebalard { 201*0b2f6228SArnaud Ebalard struct abb5zes3_rtc_data *data = dev_get_drvdata(dev); 202*0b2f6228SArnaud Ebalard u8 regs[ABB5ZES3_REG_RTC_SC + ABB5ZES3_RTC_SEC_LEN]; 203*0b2f6228SArnaud Ebalard int ret; 204*0b2f6228SArnaud Ebalard 205*0b2f6228SArnaud Ebalard /* 206*0b2f6228SArnaud Ebalard * As we need to read CTRL1 register anyway to access 24/12h 207*0b2f6228SArnaud Ebalard * mode bit, we do a single bulk read of both control and RTC 208*0b2f6228SArnaud Ebalard * sections (they are consecutive). This also ease indexing 209*0b2f6228SArnaud Ebalard * of register values after bulk read. 210*0b2f6228SArnaud Ebalard */ 211*0b2f6228SArnaud Ebalard ret = regmap_bulk_read(data->regmap, ABB5ZES3_REG_CTRL1, regs, 212*0b2f6228SArnaud Ebalard sizeof(regs)); 213*0b2f6228SArnaud Ebalard if (ret) { 214*0b2f6228SArnaud Ebalard dev_err(dev, "%s: reading RTC time failed (%d)\n", 215*0b2f6228SArnaud Ebalard __func__, ret); 216*0b2f6228SArnaud Ebalard goto err; 217*0b2f6228SArnaud Ebalard } 218*0b2f6228SArnaud Ebalard 219*0b2f6228SArnaud Ebalard /* If clock integrity is not guaranteed, do not return a time value */ 220*0b2f6228SArnaud Ebalard if (regs[ABB5ZES3_REG_RTC_SC] & ABB5ZES3_REG_RTC_SC_OSC) { 221*0b2f6228SArnaud Ebalard ret = -ENODATA; 222*0b2f6228SArnaud Ebalard goto err; 223*0b2f6228SArnaud Ebalard } 224*0b2f6228SArnaud Ebalard 225*0b2f6228SArnaud Ebalard tm->tm_sec = bcd2bin(regs[ABB5ZES3_REG_RTC_SC] & 0x7F); 226*0b2f6228SArnaud Ebalard tm->tm_min = bcd2bin(regs[ABB5ZES3_REG_RTC_MN]); 227*0b2f6228SArnaud Ebalard 228*0b2f6228SArnaud Ebalard if (regs[ABB5ZES3_REG_CTRL1] & ABB5ZES3_REG_CTRL1_PM) { /* 12hr mode */ 229*0b2f6228SArnaud Ebalard tm->tm_hour = bcd2bin(regs[ABB5ZES3_REG_RTC_HR] & 0x1f); 230*0b2f6228SArnaud Ebalard if (regs[ABB5ZES3_REG_RTC_HR] & ABB5ZES3_REG_RTC_HR_PM) /* PM */ 231*0b2f6228SArnaud Ebalard tm->tm_hour += 12; 232*0b2f6228SArnaud Ebalard } else { /* 24hr mode */ 233*0b2f6228SArnaud Ebalard tm->tm_hour = bcd2bin(regs[ABB5ZES3_REG_RTC_HR]); 234*0b2f6228SArnaud Ebalard } 235*0b2f6228SArnaud Ebalard 236*0b2f6228SArnaud Ebalard tm->tm_mday = bcd2bin(regs[ABB5ZES3_REG_RTC_DT]); 237*0b2f6228SArnaud Ebalard tm->tm_wday = bcd2bin(regs[ABB5ZES3_REG_RTC_DW]); 238*0b2f6228SArnaud Ebalard tm->tm_mon = bcd2bin(regs[ABB5ZES3_REG_RTC_MO]) - 1; /* starts at 1 */ 239*0b2f6228SArnaud Ebalard tm->tm_year = bcd2bin(regs[ABB5ZES3_REG_RTC_YR]) + 100; 240*0b2f6228SArnaud Ebalard 241*0b2f6228SArnaud Ebalard ret = rtc_valid_tm(tm); 242*0b2f6228SArnaud Ebalard 243*0b2f6228SArnaud Ebalard err: 244*0b2f6228SArnaud Ebalard return ret; 245*0b2f6228SArnaud Ebalard } 246*0b2f6228SArnaud Ebalard 247*0b2f6228SArnaud Ebalard static int abb5zes3_rtc_set_time(struct device *dev, struct rtc_time *tm) 248*0b2f6228SArnaud Ebalard { 249*0b2f6228SArnaud Ebalard struct abb5zes3_rtc_data *data = dev_get_drvdata(dev); 250*0b2f6228SArnaud Ebalard u8 regs[ABB5ZES3_REG_RTC_SC + ABB5ZES3_RTC_SEC_LEN]; 251*0b2f6228SArnaud Ebalard int ret; 252*0b2f6228SArnaud Ebalard 253*0b2f6228SArnaud Ebalard /* 254*0b2f6228SArnaud Ebalard * Year register is 8-bit wide and bcd-coded, i.e records values 255*0b2f6228SArnaud Ebalard * between 0 and 99. tm_year is an offset from 1900 and we are 256*0b2f6228SArnaud Ebalard * interested in the 2000-2099 range, so any value less than 100 257*0b2f6228SArnaud Ebalard * is invalid. 258*0b2f6228SArnaud Ebalard */ 259*0b2f6228SArnaud Ebalard if (tm->tm_year < 100) 260*0b2f6228SArnaud Ebalard return -EINVAL; 261*0b2f6228SArnaud Ebalard 262*0b2f6228SArnaud Ebalard regs[ABB5ZES3_REG_RTC_SC] = bin2bcd(tm->tm_sec); /* MSB=0 clears OSC */ 263*0b2f6228SArnaud Ebalard regs[ABB5ZES3_REG_RTC_MN] = bin2bcd(tm->tm_min); 264*0b2f6228SArnaud Ebalard regs[ABB5ZES3_REG_RTC_HR] = bin2bcd(tm->tm_hour); /* 24-hour format */ 265*0b2f6228SArnaud Ebalard regs[ABB5ZES3_REG_RTC_DT] = bin2bcd(tm->tm_mday); 266*0b2f6228SArnaud Ebalard regs[ABB5ZES3_REG_RTC_DW] = bin2bcd(tm->tm_wday); 267*0b2f6228SArnaud Ebalard regs[ABB5ZES3_REG_RTC_MO] = bin2bcd(tm->tm_mon + 1); 268*0b2f6228SArnaud Ebalard regs[ABB5ZES3_REG_RTC_YR] = bin2bcd(tm->tm_year - 100); 269*0b2f6228SArnaud Ebalard 270*0b2f6228SArnaud Ebalard mutex_lock(&data->lock); 271*0b2f6228SArnaud Ebalard ret = regmap_bulk_write(data->regmap, ABB5ZES3_REG_RTC_SC, 272*0b2f6228SArnaud Ebalard regs + ABB5ZES3_REG_RTC_SC, 273*0b2f6228SArnaud Ebalard ABB5ZES3_RTC_SEC_LEN); 274*0b2f6228SArnaud Ebalard mutex_unlock(&data->lock); 275*0b2f6228SArnaud Ebalard 276*0b2f6228SArnaud Ebalard 277*0b2f6228SArnaud Ebalard return ret; 278*0b2f6228SArnaud Ebalard } 279*0b2f6228SArnaud Ebalard 280*0b2f6228SArnaud Ebalard static int abb5zes3_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alarm) 281*0b2f6228SArnaud Ebalard { 282*0b2f6228SArnaud Ebalard struct abb5zes3_rtc_data *data = dev_get_drvdata(dev); 283*0b2f6228SArnaud Ebalard struct rtc_time rtc_tm, *alarm_tm = &alarm->time; 284*0b2f6228SArnaud Ebalard unsigned long rtc_secs, alarm_secs; 285*0b2f6228SArnaud Ebalard u8 regs[ABB5ZES3_ALRM_SEC_LEN]; 286*0b2f6228SArnaud Ebalard unsigned int reg; 287*0b2f6228SArnaud Ebalard int ret; 288*0b2f6228SArnaud Ebalard 289*0b2f6228SArnaud Ebalard mutex_lock(&data->lock); 290*0b2f6228SArnaud Ebalard ret = regmap_bulk_read(data->regmap, ABB5ZES3_REG_ALRM_MN, regs, 291*0b2f6228SArnaud Ebalard ABB5ZES3_ALRM_SEC_LEN); 292*0b2f6228SArnaud Ebalard if (ret) { 293*0b2f6228SArnaud Ebalard dev_err(dev, "%s: reading alarm section failed (%d)\n", 294*0b2f6228SArnaud Ebalard __func__, ret); 295*0b2f6228SArnaud Ebalard goto err; 296*0b2f6228SArnaud Ebalard } 297*0b2f6228SArnaud Ebalard 298*0b2f6228SArnaud Ebalard alarm_tm->tm_sec = 0; 299*0b2f6228SArnaud Ebalard alarm_tm->tm_min = bcd2bin(regs[0] & 0x7f); 300*0b2f6228SArnaud Ebalard alarm_tm->tm_hour = bcd2bin(regs[1] & 0x3f); 301*0b2f6228SArnaud Ebalard alarm_tm->tm_mday = bcd2bin(regs[2] & 0x3f); 302*0b2f6228SArnaud Ebalard alarm_tm->tm_wday = -1; 303*0b2f6228SArnaud Ebalard 304*0b2f6228SArnaud Ebalard /* 305*0b2f6228SArnaud Ebalard * The alarm section does not store year/month. We use the ones in rtc 306*0b2f6228SArnaud Ebalard * section as a basis and increment month and then year if needed to get 307*0b2f6228SArnaud Ebalard * alarm after current time. 308*0b2f6228SArnaud Ebalard */ 309*0b2f6228SArnaud Ebalard ret = _abb5zes3_rtc_read_time(dev, &rtc_tm); 310*0b2f6228SArnaud Ebalard if (ret) 311*0b2f6228SArnaud Ebalard goto err; 312*0b2f6228SArnaud Ebalard 313*0b2f6228SArnaud Ebalard alarm_tm->tm_year = rtc_tm.tm_year; 314*0b2f6228SArnaud Ebalard alarm_tm->tm_mon = rtc_tm.tm_mon; 315*0b2f6228SArnaud Ebalard 316*0b2f6228SArnaud Ebalard ret = rtc_tm_to_time(&rtc_tm, &rtc_secs); 317*0b2f6228SArnaud Ebalard if (ret) 318*0b2f6228SArnaud Ebalard goto err; 319*0b2f6228SArnaud Ebalard 320*0b2f6228SArnaud Ebalard ret = rtc_tm_to_time(alarm_tm, &alarm_secs); 321*0b2f6228SArnaud Ebalard if (ret) 322*0b2f6228SArnaud Ebalard goto err; 323*0b2f6228SArnaud Ebalard 324*0b2f6228SArnaud Ebalard if (alarm_secs < rtc_secs) { 325*0b2f6228SArnaud Ebalard if (alarm_tm->tm_mon == 11) { 326*0b2f6228SArnaud Ebalard alarm_tm->tm_mon = 0; 327*0b2f6228SArnaud Ebalard alarm_tm->tm_year += 1; 328*0b2f6228SArnaud Ebalard } else { 329*0b2f6228SArnaud Ebalard alarm_tm->tm_mon += 1; 330*0b2f6228SArnaud Ebalard } 331*0b2f6228SArnaud Ebalard } 332*0b2f6228SArnaud Ebalard 333*0b2f6228SArnaud Ebalard ret = regmap_read(data->regmap, ABB5ZES3_REG_CTRL1, ®); 334*0b2f6228SArnaud Ebalard if (ret) { 335*0b2f6228SArnaud Ebalard dev_err(dev, "%s: reading ctrl reg failed (%d)\n", 336*0b2f6228SArnaud Ebalard __func__, ret); 337*0b2f6228SArnaud Ebalard goto err; 338*0b2f6228SArnaud Ebalard } 339*0b2f6228SArnaud Ebalard 340*0b2f6228SArnaud Ebalard alarm->enabled = !!(reg & ABB5ZES3_REG_CTRL1_AIE); 341*0b2f6228SArnaud Ebalard 342*0b2f6228SArnaud Ebalard err: 343*0b2f6228SArnaud Ebalard mutex_unlock(&data->lock); 344*0b2f6228SArnaud Ebalard 345*0b2f6228SArnaud Ebalard return ret; 346*0b2f6228SArnaud Ebalard } 347*0b2f6228SArnaud Ebalard 348*0b2f6228SArnaud Ebalard /* ALARM is only accurate to the minute (not the second) */ 349*0b2f6228SArnaud Ebalard static int abb5zes3_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alarm) 350*0b2f6228SArnaud Ebalard { 351*0b2f6228SArnaud Ebalard struct abb5zes3_rtc_data *data = dev_get_drvdata(dev); 352*0b2f6228SArnaud Ebalard struct rtc_time *alarm_tm = &alarm->time; 353*0b2f6228SArnaud Ebalard unsigned long rtc_secs, alarm_secs; 354*0b2f6228SArnaud Ebalard u8 regs[ABB5ZES3_ALRM_SEC_LEN]; 355*0b2f6228SArnaud Ebalard struct rtc_time rtc_tm; 356*0b2f6228SArnaud Ebalard int ret, enable = 1; 357*0b2f6228SArnaud Ebalard 358*0b2f6228SArnaud Ebalard mutex_lock(&data->lock); 359*0b2f6228SArnaud Ebalard ret = _abb5zes3_rtc_read_time(dev, &rtc_tm); 360*0b2f6228SArnaud Ebalard if (ret) 361*0b2f6228SArnaud Ebalard goto err; 362*0b2f6228SArnaud Ebalard 363*0b2f6228SArnaud Ebalard ret = rtc_tm_to_time(&rtc_tm, &rtc_secs); 364*0b2f6228SArnaud Ebalard if (ret) 365*0b2f6228SArnaud Ebalard goto err; 366*0b2f6228SArnaud Ebalard 367*0b2f6228SArnaud Ebalard ret = rtc_tm_to_time(alarm_tm, &alarm_secs); 368*0b2f6228SArnaud Ebalard if (ret) 369*0b2f6228SArnaud Ebalard goto err; 370*0b2f6228SArnaud Ebalard 371*0b2f6228SArnaud Ebalard /* If alarm time is before current time, disable the alarm */ 372*0b2f6228SArnaud Ebalard if (!alarm->enabled || alarm_secs <= rtc_secs) { 373*0b2f6228SArnaud Ebalard enable = 0; 374*0b2f6228SArnaud Ebalard } else { 375*0b2f6228SArnaud Ebalard /* 376*0b2f6228SArnaud Ebalard * Chip only support alarms up to one month in the future. Let's 377*0b2f6228SArnaud Ebalard * return an error if we get something after that limit. 378*0b2f6228SArnaud Ebalard * Comparison is done by incrementing rtc_tm month field by one 379*0b2f6228SArnaud Ebalard * and checking alarm value is still below. 380*0b2f6228SArnaud Ebalard */ 381*0b2f6228SArnaud Ebalard if (rtc_tm.tm_mon == 11) { /* handle year wrapping */ 382*0b2f6228SArnaud Ebalard rtc_tm.tm_mon = 0; 383*0b2f6228SArnaud Ebalard rtc_tm.tm_year += 1; 384*0b2f6228SArnaud Ebalard } else { 385*0b2f6228SArnaud Ebalard rtc_tm.tm_mon += 1; 386*0b2f6228SArnaud Ebalard } 387*0b2f6228SArnaud Ebalard 388*0b2f6228SArnaud Ebalard ret = rtc_tm_to_time(&rtc_tm, &rtc_secs); 389*0b2f6228SArnaud Ebalard if (ret) 390*0b2f6228SArnaud Ebalard goto err; 391*0b2f6228SArnaud Ebalard 392*0b2f6228SArnaud Ebalard if (alarm_secs > rtc_secs) { 393*0b2f6228SArnaud Ebalard dev_err(dev, "%s: alarm maximum is one month in the " 394*0b2f6228SArnaud Ebalard "future (%d)\n", __func__, ret); 395*0b2f6228SArnaud Ebalard ret = -EINVAL; 396*0b2f6228SArnaud Ebalard goto err; 397*0b2f6228SArnaud Ebalard } 398*0b2f6228SArnaud Ebalard } 399*0b2f6228SArnaud Ebalard 400*0b2f6228SArnaud Ebalard /* Disable the alarm before modifying it */ 401*0b2f6228SArnaud Ebalard ret = _abb5zes3_rtc_update_alarm(dev, 0); 402*0b2f6228SArnaud Ebalard if (ret < 0) { 403*0b2f6228SArnaud Ebalard dev_err(dev, "%s: unable to disable the alarm (%d)\n", 404*0b2f6228SArnaud Ebalard __func__, ret); 405*0b2f6228SArnaud Ebalard goto err; 406*0b2f6228SArnaud Ebalard } 407*0b2f6228SArnaud Ebalard 408*0b2f6228SArnaud Ebalard /* Program alarm registers */ 409*0b2f6228SArnaud Ebalard regs[0] = bin2bcd(alarm_tm->tm_min) & 0x7f; /* minute */ 410*0b2f6228SArnaud Ebalard regs[1] = bin2bcd(alarm_tm->tm_hour) & 0x3f; /* hour */ 411*0b2f6228SArnaud Ebalard regs[2] = bin2bcd(alarm_tm->tm_mday) & 0x3f; /* day of the month */ 412*0b2f6228SArnaud Ebalard regs[3] = ABB5ZES3_REG_ALRM_DW_AE; /* do not match day of the week */ 413*0b2f6228SArnaud Ebalard 414*0b2f6228SArnaud Ebalard ret = regmap_bulk_write(data->regmap, ABB5ZES3_REG_ALRM_MN, regs, 415*0b2f6228SArnaud Ebalard ABB5ZES3_ALRM_SEC_LEN); 416*0b2f6228SArnaud Ebalard if (ret < 0) { 417*0b2f6228SArnaud Ebalard dev_err(dev, "%s: writing ALARM section failed (%d)\n", 418*0b2f6228SArnaud Ebalard __func__, ret); 419*0b2f6228SArnaud Ebalard goto err; 420*0b2f6228SArnaud Ebalard } 421*0b2f6228SArnaud Ebalard 422*0b2f6228SArnaud Ebalard /* Enable or disable alarm */ 423*0b2f6228SArnaud Ebalard ret = _abb5zes3_rtc_update_alarm(dev, enable); 424*0b2f6228SArnaud Ebalard 425*0b2f6228SArnaud Ebalard err: 426*0b2f6228SArnaud Ebalard mutex_unlock(&data->lock); 427*0b2f6228SArnaud Ebalard 428*0b2f6228SArnaud Ebalard return ret; 429*0b2f6228SArnaud Ebalard } 430*0b2f6228SArnaud Ebalard 431*0b2f6228SArnaud Ebalard 432*0b2f6228SArnaud Ebalard /* Enable or disable battery low irq generation */ 433*0b2f6228SArnaud Ebalard static inline int _abb5zes3_rtc_battery_low_irq_enable(struct regmap *regmap, 434*0b2f6228SArnaud Ebalard bool enable) 435*0b2f6228SArnaud Ebalard { 436*0b2f6228SArnaud Ebalard return regmap_update_bits(regmap, ABB5ZES3_REG_CTRL3, 437*0b2f6228SArnaud Ebalard ABB5ZES3_REG_CTRL3_BLIE, 438*0b2f6228SArnaud Ebalard enable ? ABB5ZES3_REG_CTRL3_BLIE : 0); 439*0b2f6228SArnaud Ebalard } 440*0b2f6228SArnaud Ebalard 441*0b2f6228SArnaud Ebalard /* 442*0b2f6228SArnaud Ebalard * Check current RTC status and enable/disable what needs to be. Return 0 if 443*0b2f6228SArnaud Ebalard * everything went ok and a negative value upon error. Note: this function 444*0b2f6228SArnaud Ebalard * is called early during init and hence does need mutex protection. 445*0b2f6228SArnaud Ebalard */ 446*0b2f6228SArnaud Ebalard static int abb5zes3_rtc_check_setup(struct device *dev) 447*0b2f6228SArnaud Ebalard { 448*0b2f6228SArnaud Ebalard struct abb5zes3_rtc_data *data = dev_get_drvdata(dev); 449*0b2f6228SArnaud Ebalard struct regmap *regmap = data->regmap; 450*0b2f6228SArnaud Ebalard unsigned int reg; 451*0b2f6228SArnaud Ebalard int ret; 452*0b2f6228SArnaud Ebalard u8 mask; 453*0b2f6228SArnaud Ebalard 454*0b2f6228SArnaud Ebalard /* 455*0b2f6228SArnaud Ebalard * By default, the devices generates a 32.768KHz signal on IRQ#1 pin. It 456*0b2f6228SArnaud Ebalard * is disabled here to prevent polluting the interrupt line and 457*0b2f6228SArnaud Ebalard * uselessly triggering the IRQ handler we install for alarm and battery 458*0b2f6228SArnaud Ebalard * low events. Note: this is done before clearing int. status below 459*0b2f6228SArnaud Ebalard * in this function. 460*0b2f6228SArnaud Ebalard * We also disable all timers and set timer interrupt to permanent (not 461*0b2f6228SArnaud Ebalard * pulsed). 462*0b2f6228SArnaud Ebalard */ 463*0b2f6228SArnaud Ebalard mask = (ABB5ZES3_REG_TIM_CLK_TBC | ABB5ZES3_REG_TIM_CLK_TAC0 | 464*0b2f6228SArnaud Ebalard ABB5ZES3_REG_TIM_CLK_TAC1 | ABB5ZES3_REG_TIM_CLK_COF0 | 465*0b2f6228SArnaud Ebalard ABB5ZES3_REG_TIM_CLK_COF1 | ABB5ZES3_REG_TIM_CLK_COF2 | 466*0b2f6228SArnaud Ebalard ABB5ZES3_REG_TIM_CLK_TBM | ABB5ZES3_REG_TIM_CLK_TAM); 467*0b2f6228SArnaud Ebalard ret = regmap_update_bits(regmap, ABB5ZES3_REG_TIM_CLK, mask, 468*0b2f6228SArnaud Ebalard ABB5ZES3_REG_TIM_CLK_COF0 | ABB5ZES3_REG_TIM_CLK_COF1 | 469*0b2f6228SArnaud Ebalard ABB5ZES3_REG_TIM_CLK_COF2); 470*0b2f6228SArnaud Ebalard if (ret < 0) { 471*0b2f6228SArnaud Ebalard dev_err(dev, "%s: unable to initialize clkout register (%d)\n", 472*0b2f6228SArnaud Ebalard __func__, ret); 473*0b2f6228SArnaud Ebalard return ret; 474*0b2f6228SArnaud Ebalard } 475*0b2f6228SArnaud Ebalard 476*0b2f6228SArnaud Ebalard /* 477*0b2f6228SArnaud Ebalard * Each component of the alarm (MN, HR, DT, DW) can be enabled/disabled 478*0b2f6228SArnaud Ebalard * individually by clearing/setting MSB of each associated register. So, 479*0b2f6228SArnaud Ebalard * we set all alarm enable bits to disable current alarm setting. 480*0b2f6228SArnaud Ebalard */ 481*0b2f6228SArnaud Ebalard mask = (ABB5ZES3_REG_ALRM_MN_AE | ABB5ZES3_REG_ALRM_HR_AE | 482*0b2f6228SArnaud Ebalard ABB5ZES3_REG_ALRM_DT_AE | ABB5ZES3_REG_ALRM_DW_AE); 483*0b2f6228SArnaud Ebalard ret = regmap_update_bits(regmap, ABB5ZES3_REG_CTRL2, mask, mask); 484*0b2f6228SArnaud Ebalard if (ret < 0) { 485*0b2f6228SArnaud Ebalard dev_err(dev, "%s: unable to disable alarm setting (%d)\n", 486*0b2f6228SArnaud Ebalard __func__, ret); 487*0b2f6228SArnaud Ebalard return ret; 488*0b2f6228SArnaud Ebalard } 489*0b2f6228SArnaud Ebalard 490*0b2f6228SArnaud Ebalard /* Set Control 1 register (RTC enabled, 24hr mode, all int. disabled) */ 491*0b2f6228SArnaud Ebalard mask = (ABB5ZES3_REG_CTRL1_CIE | ABB5ZES3_REG_CTRL1_AIE | 492*0b2f6228SArnaud Ebalard ABB5ZES3_REG_CTRL1_SIE | ABB5ZES3_REG_CTRL1_PM | 493*0b2f6228SArnaud Ebalard ABB5ZES3_REG_CTRL1_CAP | ABB5ZES3_REG_CTRL1_STOP); 494*0b2f6228SArnaud Ebalard ret = regmap_update_bits(regmap, ABB5ZES3_REG_CTRL1, mask, 0); 495*0b2f6228SArnaud Ebalard if (ret < 0) { 496*0b2f6228SArnaud Ebalard dev_err(dev, "%s: unable to initialize CTRL1 register (%d)\n", 497*0b2f6228SArnaud Ebalard __func__, ret); 498*0b2f6228SArnaud Ebalard return ret; 499*0b2f6228SArnaud Ebalard } 500*0b2f6228SArnaud Ebalard 501*0b2f6228SArnaud Ebalard /* 502*0b2f6228SArnaud Ebalard * Set Control 2 register (timer int. disabled, alarm status cleared). 503*0b2f6228SArnaud Ebalard * WTAF is read-only and cleared automatically by reading the register. 504*0b2f6228SArnaud Ebalard */ 505*0b2f6228SArnaud Ebalard mask = (ABB5ZES3_REG_CTRL2_CTBIE | ABB5ZES3_REG_CTRL2_CTAIE | 506*0b2f6228SArnaud Ebalard ABB5ZES3_REG_CTRL2_WTAIE | ABB5ZES3_REG_CTRL2_AF | 507*0b2f6228SArnaud Ebalard ABB5ZES3_REG_CTRL2_SF | ABB5ZES3_REG_CTRL2_CTBF | 508*0b2f6228SArnaud Ebalard ABB5ZES3_REG_CTRL2_CTAF); 509*0b2f6228SArnaud Ebalard ret = regmap_update_bits(regmap, ABB5ZES3_REG_CTRL2, mask, 0); 510*0b2f6228SArnaud Ebalard if (ret < 0) { 511*0b2f6228SArnaud Ebalard dev_err(dev, "%s: unable to initialize CTRL2 register (%d)\n", 512*0b2f6228SArnaud Ebalard __func__, ret); 513*0b2f6228SArnaud Ebalard return ret; 514*0b2f6228SArnaud Ebalard } 515*0b2f6228SArnaud Ebalard 516*0b2f6228SArnaud Ebalard /* 517*0b2f6228SArnaud Ebalard * Enable battery low detection function and battery switchover function 518*0b2f6228SArnaud Ebalard * (standard mode). Disable associated interrupts. Clear battery 519*0b2f6228SArnaud Ebalard * switchover flag but not battery low flag. The latter is checked 520*0b2f6228SArnaud Ebalard * later below. 521*0b2f6228SArnaud Ebalard */ 522*0b2f6228SArnaud Ebalard mask = (ABB5ZES3_REG_CTRL3_PM0 | ABB5ZES3_REG_CTRL3_PM1 | 523*0b2f6228SArnaud Ebalard ABB5ZES3_REG_CTRL3_PM2 | ABB5ZES3_REG_CTRL3_BLIE | 524*0b2f6228SArnaud Ebalard ABB5ZES3_REG_CTRL3_BSIE| ABB5ZES3_REG_CTRL3_BSF); 525*0b2f6228SArnaud Ebalard ret = regmap_update_bits(regmap, ABB5ZES3_REG_CTRL3, mask, 0); 526*0b2f6228SArnaud Ebalard if (ret < 0) { 527*0b2f6228SArnaud Ebalard dev_err(dev, "%s: unable to initialize CTRL3 register (%d)\n", 528*0b2f6228SArnaud Ebalard __func__, ret); 529*0b2f6228SArnaud Ebalard return ret; 530*0b2f6228SArnaud Ebalard } 531*0b2f6228SArnaud Ebalard 532*0b2f6228SArnaud Ebalard /* Check oscillator integrity flag */ 533*0b2f6228SArnaud Ebalard ret = regmap_read(regmap, ABB5ZES3_REG_RTC_SC, ®); 534*0b2f6228SArnaud Ebalard if (ret < 0) { 535*0b2f6228SArnaud Ebalard dev_err(dev, "%s: unable to read osc. integrity flag (%d)\n", 536*0b2f6228SArnaud Ebalard __func__, ret); 537*0b2f6228SArnaud Ebalard return ret; 538*0b2f6228SArnaud Ebalard } 539*0b2f6228SArnaud Ebalard 540*0b2f6228SArnaud Ebalard if (reg & ABB5ZES3_REG_RTC_SC_OSC) { 541*0b2f6228SArnaud Ebalard dev_err(dev, "clock integrity not guaranteed. Osc. has stopped " 542*0b2f6228SArnaud Ebalard "or has been interrupted.\n"); 543*0b2f6228SArnaud Ebalard dev_err(dev, "change battery (if not already done) and " 544*0b2f6228SArnaud Ebalard "then set time to reset osc. failure flag.\n"); 545*0b2f6228SArnaud Ebalard } 546*0b2f6228SArnaud Ebalard 547*0b2f6228SArnaud Ebalard /* 548*0b2f6228SArnaud Ebalard * Check battery low flag at startup: this allows reporting battery 549*0b2f6228SArnaud Ebalard * is low at startup when IRQ line is not connected. Note: we record 550*0b2f6228SArnaud Ebalard * current status to avoid reenabling this interrupt later in probe 551*0b2f6228SArnaud Ebalard * function if battery is low. 552*0b2f6228SArnaud Ebalard */ 553*0b2f6228SArnaud Ebalard ret = regmap_read(regmap, ABB5ZES3_REG_CTRL3, ®); 554*0b2f6228SArnaud Ebalard if (ret < 0) { 555*0b2f6228SArnaud Ebalard dev_err(dev, "%s: unable to read battery low flag (%d)\n", 556*0b2f6228SArnaud Ebalard __func__, ret); 557*0b2f6228SArnaud Ebalard return ret; 558*0b2f6228SArnaud Ebalard } 559*0b2f6228SArnaud Ebalard 560*0b2f6228SArnaud Ebalard data->battery_low = reg & ABB5ZES3_REG_CTRL3_BLF; 561*0b2f6228SArnaud Ebalard if (data->battery_low) { 562*0b2f6228SArnaud Ebalard dev_err(dev, "RTC battery is low; please, consider " 563*0b2f6228SArnaud Ebalard "changing it!\n"); 564*0b2f6228SArnaud Ebalard 565*0b2f6228SArnaud Ebalard ret = _abb5zes3_rtc_battery_low_irq_enable(regmap, false); 566*0b2f6228SArnaud Ebalard if (ret) 567*0b2f6228SArnaud Ebalard dev_err(dev, "%s: disabling battery low interrupt " 568*0b2f6228SArnaud Ebalard "generation failed (%d)\n", __func__, ret); 569*0b2f6228SArnaud Ebalard } 570*0b2f6228SArnaud Ebalard 571*0b2f6228SArnaud Ebalard return ret; 572*0b2f6228SArnaud Ebalard } 573*0b2f6228SArnaud Ebalard 574*0b2f6228SArnaud Ebalard static int abb5zes3_rtc_alarm_irq_enable(struct device *dev, 575*0b2f6228SArnaud Ebalard unsigned int enable) 576*0b2f6228SArnaud Ebalard { 577*0b2f6228SArnaud Ebalard struct abb5zes3_rtc_data *rtc_data = dev_get_drvdata(dev); 578*0b2f6228SArnaud Ebalard int ret = 0; 579*0b2f6228SArnaud Ebalard 580*0b2f6228SArnaud Ebalard if (rtc_data->irq) { 581*0b2f6228SArnaud Ebalard mutex_lock(&rtc_data->lock); 582*0b2f6228SArnaud Ebalard ret = _abb5zes3_rtc_update_alarm(dev, enable); 583*0b2f6228SArnaud Ebalard mutex_unlock(&rtc_data->lock); 584*0b2f6228SArnaud Ebalard } 585*0b2f6228SArnaud Ebalard 586*0b2f6228SArnaud Ebalard return ret; 587*0b2f6228SArnaud Ebalard } 588*0b2f6228SArnaud Ebalard 589*0b2f6228SArnaud Ebalard static irqreturn_t _abb5zes3_rtc_interrupt(int irq, void *data) 590*0b2f6228SArnaud Ebalard { 591*0b2f6228SArnaud Ebalard struct i2c_client *client = data; 592*0b2f6228SArnaud Ebalard struct device *dev = &client->dev; 593*0b2f6228SArnaud Ebalard struct abb5zes3_rtc_data *rtc_data = dev_get_drvdata(dev); 594*0b2f6228SArnaud Ebalard struct rtc_device *rtc = rtc_data->rtc; 595*0b2f6228SArnaud Ebalard u8 regs[ABB5ZES3_CTRL_SEC_LEN]; 596*0b2f6228SArnaud Ebalard int ret, handled = IRQ_NONE; 597*0b2f6228SArnaud Ebalard 598*0b2f6228SArnaud Ebalard ret = regmap_bulk_read(rtc_data->regmap, 0, regs, 599*0b2f6228SArnaud Ebalard ABB5ZES3_CTRL_SEC_LEN); 600*0b2f6228SArnaud Ebalard if (ret) { 601*0b2f6228SArnaud Ebalard dev_err(dev, "%s: unable to read control section (%d)!\n", 602*0b2f6228SArnaud Ebalard __func__, ret); 603*0b2f6228SArnaud Ebalard return handled; 604*0b2f6228SArnaud Ebalard } 605*0b2f6228SArnaud Ebalard 606*0b2f6228SArnaud Ebalard /* 607*0b2f6228SArnaud Ebalard * Check battery low detection flag and disable battery low interrupt 608*0b2f6228SArnaud Ebalard * generation if flag is set (interrupt can only be cleared when 609*0b2f6228SArnaud Ebalard * battery is replaced). 610*0b2f6228SArnaud Ebalard */ 611*0b2f6228SArnaud Ebalard if (regs[ABB5ZES3_REG_CTRL3] & ABB5ZES3_REG_CTRL3_BLF) { 612*0b2f6228SArnaud Ebalard dev_err(dev, "RTC battery is low; please change it!\n"); 613*0b2f6228SArnaud Ebalard 614*0b2f6228SArnaud Ebalard _abb5zes3_rtc_battery_low_irq_enable(rtc_data->regmap, false); 615*0b2f6228SArnaud Ebalard 616*0b2f6228SArnaud Ebalard handled = IRQ_HANDLED; 617*0b2f6228SArnaud Ebalard } 618*0b2f6228SArnaud Ebalard 619*0b2f6228SArnaud Ebalard /* Check alarm flag */ 620*0b2f6228SArnaud Ebalard if (regs[ABB5ZES3_REG_CTRL2] & ABB5ZES3_REG_CTRL2_AF) { 621*0b2f6228SArnaud Ebalard dev_dbg(dev, "RTC alarm!\n"); 622*0b2f6228SArnaud Ebalard 623*0b2f6228SArnaud Ebalard rtc_update_irq(rtc, 1, RTC_IRQF | RTC_AF); 624*0b2f6228SArnaud Ebalard 625*0b2f6228SArnaud Ebalard /* Acknowledge and disable the alarm */ 626*0b2f6228SArnaud Ebalard _abb5zes3_rtc_clear_alarm(dev); 627*0b2f6228SArnaud Ebalard _abb5zes3_rtc_update_alarm(dev, 0); 628*0b2f6228SArnaud Ebalard 629*0b2f6228SArnaud Ebalard handled = IRQ_HANDLED; 630*0b2f6228SArnaud Ebalard } 631*0b2f6228SArnaud Ebalard 632*0b2f6228SArnaud Ebalard return handled; 633*0b2f6228SArnaud Ebalard } 634*0b2f6228SArnaud Ebalard 635*0b2f6228SArnaud Ebalard static const struct rtc_class_ops rtc_ops = { 636*0b2f6228SArnaud Ebalard .read_time = _abb5zes3_rtc_read_time, 637*0b2f6228SArnaud Ebalard .set_time = abb5zes3_rtc_set_time, 638*0b2f6228SArnaud Ebalard .read_alarm = abb5zes3_rtc_read_alarm, 639*0b2f6228SArnaud Ebalard .set_alarm = abb5zes3_rtc_set_alarm, 640*0b2f6228SArnaud Ebalard .alarm_irq_enable = abb5zes3_rtc_alarm_irq_enable, 641*0b2f6228SArnaud Ebalard }; 642*0b2f6228SArnaud Ebalard 643*0b2f6228SArnaud Ebalard static struct regmap_config abb5zes3_rtc_regmap_config = { 644*0b2f6228SArnaud Ebalard .reg_bits = 8, 645*0b2f6228SArnaud Ebalard .val_bits = 8, 646*0b2f6228SArnaud Ebalard }; 647*0b2f6228SArnaud Ebalard 648*0b2f6228SArnaud Ebalard static int abb5zes3_probe(struct i2c_client *client, 649*0b2f6228SArnaud Ebalard const struct i2c_device_id *id) 650*0b2f6228SArnaud Ebalard { 651*0b2f6228SArnaud Ebalard struct abb5zes3_rtc_data *data = NULL; 652*0b2f6228SArnaud Ebalard struct device *dev = &client->dev; 653*0b2f6228SArnaud Ebalard struct regmap *regmap; 654*0b2f6228SArnaud Ebalard int ret; 655*0b2f6228SArnaud Ebalard 656*0b2f6228SArnaud Ebalard if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C | 657*0b2f6228SArnaud Ebalard I2C_FUNC_SMBUS_BYTE_DATA | 658*0b2f6228SArnaud Ebalard I2C_FUNC_SMBUS_I2C_BLOCK)) { 659*0b2f6228SArnaud Ebalard ret = -ENODEV; 660*0b2f6228SArnaud Ebalard goto err; 661*0b2f6228SArnaud Ebalard } 662*0b2f6228SArnaud Ebalard 663*0b2f6228SArnaud Ebalard regmap = devm_regmap_init_i2c(client, &abb5zes3_rtc_regmap_config); 664*0b2f6228SArnaud Ebalard if (IS_ERR(regmap)) { 665*0b2f6228SArnaud Ebalard ret = PTR_ERR(regmap); 666*0b2f6228SArnaud Ebalard dev_err(dev, "%s: regmap allocation failed: %d\n", 667*0b2f6228SArnaud Ebalard __func__, ret); 668*0b2f6228SArnaud Ebalard goto err; 669*0b2f6228SArnaud Ebalard } 670*0b2f6228SArnaud Ebalard 671*0b2f6228SArnaud Ebalard ret = abb5zes3_i2c_validate_chip(regmap); 672*0b2f6228SArnaud Ebalard if (ret) 673*0b2f6228SArnaud Ebalard goto err; 674*0b2f6228SArnaud Ebalard 675*0b2f6228SArnaud Ebalard data = devm_kzalloc(dev, sizeof(*data), GFP_KERNEL); 676*0b2f6228SArnaud Ebalard if (!data) { 677*0b2f6228SArnaud Ebalard ret = -ENOMEM; 678*0b2f6228SArnaud Ebalard goto err; 679*0b2f6228SArnaud Ebalard } 680*0b2f6228SArnaud Ebalard 681*0b2f6228SArnaud Ebalard mutex_init(&data->lock); 682*0b2f6228SArnaud Ebalard data->regmap = regmap; 683*0b2f6228SArnaud Ebalard dev_set_drvdata(dev, data); 684*0b2f6228SArnaud Ebalard 685*0b2f6228SArnaud Ebalard ret = abb5zes3_rtc_check_setup(dev); 686*0b2f6228SArnaud Ebalard if (ret) 687*0b2f6228SArnaud Ebalard goto err; 688*0b2f6228SArnaud Ebalard 689*0b2f6228SArnaud Ebalard if (client->irq > 0) { 690*0b2f6228SArnaud Ebalard ret = devm_request_threaded_irq(dev, client->irq, NULL, 691*0b2f6228SArnaud Ebalard _abb5zes3_rtc_interrupt, 692*0b2f6228SArnaud Ebalard IRQF_SHARED|IRQF_ONESHOT, 693*0b2f6228SArnaud Ebalard DRV_NAME, client); 694*0b2f6228SArnaud Ebalard if (!ret) { 695*0b2f6228SArnaud Ebalard device_init_wakeup(dev, true); 696*0b2f6228SArnaud Ebalard data->irq = client->irq; 697*0b2f6228SArnaud Ebalard dev_dbg(dev, "%s: irq %d used by RTC\n", __func__, 698*0b2f6228SArnaud Ebalard client->irq); 699*0b2f6228SArnaud Ebalard } else { 700*0b2f6228SArnaud Ebalard dev_err(dev, "%s: irq %d unavailable (%d)\n", 701*0b2f6228SArnaud Ebalard __func__, client->irq, ret); 702*0b2f6228SArnaud Ebalard goto err; 703*0b2f6228SArnaud Ebalard } 704*0b2f6228SArnaud Ebalard } 705*0b2f6228SArnaud Ebalard 706*0b2f6228SArnaud Ebalard data->rtc = devm_rtc_device_register(dev, DRV_NAME, &rtc_ops, 707*0b2f6228SArnaud Ebalard THIS_MODULE); 708*0b2f6228SArnaud Ebalard ret = PTR_ERR_OR_ZERO(data->rtc); 709*0b2f6228SArnaud Ebalard if (ret) { 710*0b2f6228SArnaud Ebalard dev_err(dev, "%s: unable to register RTC device (%d)\n", 711*0b2f6228SArnaud Ebalard __func__, ret); 712*0b2f6228SArnaud Ebalard goto err; 713*0b2f6228SArnaud Ebalard } 714*0b2f6228SArnaud Ebalard 715*0b2f6228SArnaud Ebalard /* 716*0b2f6228SArnaud Ebalard * AB-B5Z5E only supports a coarse granularity alarm (one minute 717*0b2f6228SArnaud Ebalard * resolution up to one month) so we cannot support UIE mode 718*0b2f6228SArnaud Ebalard * using the device's alarm. Note it should be feasible to support 719*0b2f6228SArnaud Ebalard * such a feature using one of the two timers the device provides. 720*0b2f6228SArnaud Ebalard */ 721*0b2f6228SArnaud Ebalard data->rtc->uie_unsupported = 1; 722*0b2f6228SArnaud Ebalard 723*0b2f6228SArnaud Ebalard /* Enable battery low detection interrupt if battery not already low */ 724*0b2f6228SArnaud Ebalard if (!data->battery_low && data->irq) { 725*0b2f6228SArnaud Ebalard ret = _abb5zes3_rtc_battery_low_irq_enable(regmap, true); 726*0b2f6228SArnaud Ebalard if (ret) { 727*0b2f6228SArnaud Ebalard dev_err(dev, "%s: enabling battery low interrupt " 728*0b2f6228SArnaud Ebalard "generation failed (%d)\n", __func__, ret); 729*0b2f6228SArnaud Ebalard goto err; 730*0b2f6228SArnaud Ebalard } 731*0b2f6228SArnaud Ebalard } 732*0b2f6228SArnaud Ebalard 733*0b2f6228SArnaud Ebalard err: 734*0b2f6228SArnaud Ebalard if (ret && data && data->irq) 735*0b2f6228SArnaud Ebalard device_init_wakeup(dev, false); 736*0b2f6228SArnaud Ebalard return ret; 737*0b2f6228SArnaud Ebalard } 738*0b2f6228SArnaud Ebalard 739*0b2f6228SArnaud Ebalard static int abb5zes3_remove(struct i2c_client *client) 740*0b2f6228SArnaud Ebalard { 741*0b2f6228SArnaud Ebalard struct abb5zes3_rtc_data *rtc_data = dev_get_drvdata(&client->dev); 742*0b2f6228SArnaud Ebalard 743*0b2f6228SArnaud Ebalard if (rtc_data->irq > 0) 744*0b2f6228SArnaud Ebalard device_init_wakeup(&client->dev, false); 745*0b2f6228SArnaud Ebalard 746*0b2f6228SArnaud Ebalard return 0; 747*0b2f6228SArnaud Ebalard } 748*0b2f6228SArnaud Ebalard 749*0b2f6228SArnaud Ebalard #ifdef CONFIG_PM_SLEEP 750*0b2f6228SArnaud Ebalard static int abb5zes3_rtc_suspend(struct device *dev) 751*0b2f6228SArnaud Ebalard { 752*0b2f6228SArnaud Ebalard struct abb5zes3_rtc_data *rtc_data = dev_get_drvdata(dev); 753*0b2f6228SArnaud Ebalard 754*0b2f6228SArnaud Ebalard if (device_may_wakeup(dev)) 755*0b2f6228SArnaud Ebalard return enable_irq_wake(rtc_data->irq); 756*0b2f6228SArnaud Ebalard 757*0b2f6228SArnaud Ebalard return 0; 758*0b2f6228SArnaud Ebalard } 759*0b2f6228SArnaud Ebalard 760*0b2f6228SArnaud Ebalard static int abb5zes3_rtc_resume(struct device *dev) 761*0b2f6228SArnaud Ebalard { 762*0b2f6228SArnaud Ebalard struct abb5zes3_rtc_data *rtc_data = dev_get_drvdata(dev); 763*0b2f6228SArnaud Ebalard 764*0b2f6228SArnaud Ebalard if (device_may_wakeup(dev)) 765*0b2f6228SArnaud Ebalard return disable_irq_wake(rtc_data->irq); 766*0b2f6228SArnaud Ebalard 767*0b2f6228SArnaud Ebalard return 0; 768*0b2f6228SArnaud Ebalard } 769*0b2f6228SArnaud Ebalard #endif 770*0b2f6228SArnaud Ebalard 771*0b2f6228SArnaud Ebalard static SIMPLE_DEV_PM_OPS(abb5zes3_rtc_pm_ops, abb5zes3_rtc_suspend, 772*0b2f6228SArnaud Ebalard abb5zes3_rtc_resume); 773*0b2f6228SArnaud Ebalard 774*0b2f6228SArnaud Ebalard #ifdef CONFIG_OF 775*0b2f6228SArnaud Ebalard static const struct of_device_id abb5zes3_dt_match[] = { 776*0b2f6228SArnaud Ebalard { .compatible = "abracon,abb5zes3" }, 777*0b2f6228SArnaud Ebalard { }, 778*0b2f6228SArnaud Ebalard }; 779*0b2f6228SArnaud Ebalard #endif 780*0b2f6228SArnaud Ebalard 781*0b2f6228SArnaud Ebalard static const struct i2c_device_id abb5zes3_id[] = { 782*0b2f6228SArnaud Ebalard { "abb5zes3", 0 }, 783*0b2f6228SArnaud Ebalard { } 784*0b2f6228SArnaud Ebalard }; 785*0b2f6228SArnaud Ebalard MODULE_DEVICE_TABLE(i2c, abb5zes3_id); 786*0b2f6228SArnaud Ebalard 787*0b2f6228SArnaud Ebalard static struct i2c_driver abb5zes3_driver = { 788*0b2f6228SArnaud Ebalard .driver = { 789*0b2f6228SArnaud Ebalard .name = DRV_NAME, 790*0b2f6228SArnaud Ebalard .owner = THIS_MODULE, 791*0b2f6228SArnaud Ebalard .pm = &abb5zes3_rtc_pm_ops, 792*0b2f6228SArnaud Ebalard .of_match_table = of_match_ptr(abb5zes3_dt_match), 793*0b2f6228SArnaud Ebalard }, 794*0b2f6228SArnaud Ebalard .probe = abb5zes3_probe, 795*0b2f6228SArnaud Ebalard .remove = abb5zes3_remove, 796*0b2f6228SArnaud Ebalard .id_table = abb5zes3_id, 797*0b2f6228SArnaud Ebalard }; 798*0b2f6228SArnaud Ebalard module_i2c_driver(abb5zes3_driver); 799*0b2f6228SArnaud Ebalard 800*0b2f6228SArnaud Ebalard MODULE_AUTHOR("Arnaud EBALARD <arno@natisbad.org>"); 801*0b2f6228SArnaud Ebalard MODULE_DESCRIPTION("Abracon AB-RTCMC-32.768kHz-B5ZE-S3 RTC/Alarm driver"); 802*0b2f6228SArnaud Ebalard MODULE_LICENSE("GPL"); 803