linux/drivers/rtc/rtc-ab8500.c
<<
>>
Prefs
   1/*
   2 * Copyright (C) ST-Ericsson SA 2010
   3 *
   4 * License terms: GNU General Public License (GPL) version 2
   5 * Author: Virupax Sadashivpetimath <virupax.sadashivpetimath@stericsson.com>
 *
 * RTC clock driver for the RTC part of the AB8500 Power management chip.
 * Based on RTC clock driver for the AB3100 Analog Baseband Chip by
 * Linus Walleij <linus.walleij@stericsson.com>
 */
  11
  12#include <linux/module.h>
  13#include <linux/kernel.h>
  14#include <linux/init.h>
  15#include <linux/platform_device.h>
linux/rtc.h>
linux/mfd/abx500.h>
linux/mfd/abx500/ab8500.h>
linux/delay.h>
linux/of.h>
  21
  22#define AB8500_RTC_SOFF_STAT_REG        0x00
  23#define AB8500_RTC_CC_CONF_REG          0x01
  24#define AB8500_RTC_READ_REQ_REG         0x02
  25#define AB8500_RTC_WATCH_TSECMID_REG    0x03
AB8500_RTC_WATCH_TSECHI_REG     0x04
AB8500_RTC_WATCH_TMIN_LOW_REG   0x05
AB8500_RTC_WATCH_TMIN_MID_REG   0x06
AB8500_RTC_WATCH_TMIN_HI_REG    0x07
AB8500_RTC_ALRM_MIN_LOW_REG     0x08
  31#define AB8500_RTC_ALRM_MIN_MID_REG     0x09
  32#define AB8500_RTC_ALRM_MIN_HI_REG      0x0A
  33#define AB8500_RTC_STAT_REG             0x0B
  34#define AB8500_RTC_BKUP_CHG_REG         0x0C
  35#define AB8500_RTC_FORCE_BKUP_REG       0x0D
AB8500_RTC_CALIB_REG            0x0E
AB8500_RTC_SWITCH_STAT_REG      0x0F
/* RtcReadRequest bits */
RTC_READ_REQUEST                0x01
  41#define RTC_WRITE_REQUEST               0x02
  42
  43/* RtcCtrl bits */
  44#define RTC_ALARM_ENA                   0x04
  45#define RTC_STATUS_DATA                 0x01
COUNTS_PER_SEC                  (0xF000 / 60)
AB8500_RTC_EPOCH                2000
u8 ab8500_rtc_time_regs[] = {
  51        AB8500_RTC_WATCH_TMIN_HI_REG, AB8500_RTC_WATCH_TMIN_MID_REG,
  52        AB8500_RTC_WATCH_TMIN_LOW_REG, AB8500_RTC_WATCH_TSECHI_REG,
  53        AB8500_RTC_WATCH_TSECMID_REG
  54};
  55
u8 ab8500_rtc_alarm_regs[] = {
AB8500_RTC_ALRM_MIN_HI_REG, AB8500_RTC_ALRM_MIN_MID_REG,
AB8500_RTC_ALRM_MIN_LOW_REG
  61/* Calculate the seconds from 1970 to 01-01-2000 00:00:00 */
  62static unsigned long get_elapsed_seconds(int year)
  63{
  64        unsigned long secs;
  65        struct rtc_time tm = {
tm_year = year - 1900,
tm_mday = 1,
/*
  71         * This function calculates secs from 1970 and not from
  72         * 1900, even if we supply the offset from year 1900.
  73         */
  74        rtc_tm_to_time(&tm, &secs);
  75        return secs;
ab8500_rtc_read_time(struct device *dev, struct rtc_time *tm)
timeout = jiffies + HZ;
  81        int retval, i;
  82        unsigned long mins, secs;
  83        unsigned char buf[ARRAY_SIZE(ab8500_rtc_time_regs)];
  84        u8 value;
  85
/* Request a data read */
retval = abx500_set_register_interruptible(dev,
AB8500_RTC, AB8500_RTC_READ_REQ_REG, RTC_READ_REQUEST);
retval < 0)
retval;
  91
  92        /* Wait for some cycles after enabling the rtc read in ab8500 */
  93        while (time_before(jiffies, timeout)) {
  94                retval = abx500_get_register_interruptible(dev,
  95                        AB8500_RTC, AB8500_RTC_READ_REQ_REG, &value);
retval < 0)
retval;
value & RTC_READ_REQUEST))
usleep_range(1000, 5000);
/* Read the Watchtime registers */
i = 0; i < ARRAY_SIZE(ab8500_rtc_time_regs); i++) {
retval = abx500_get_register_interruptible(dev,
AB8500_RTC, ab8500_rtc_time_regs[i], &value);
retval < 0)
retval;
buf[i] = value;
 112        }
 113
 114        mins = (buf[0] << 16) | (buf[1] << 8) | buf[2];
 115
secs =  (buf[3] << 8) | buf[4];
secs =  secs / COUNTS_PER_SEC;
secs =  secs + (mins * 60);
/* Add back the initially subtracted number of seconds */
 121        secs += get_elapsed_seconds(AB8500_RTC_EPOCH);
 122
 123        rtc_time_to_tm(secs, tm);
 124        return rtc_valid_tm(tm);
 125}
ab8500_rtc_set_time(struct device *dev, struct rtc_time *tm)
retval, i;
buf[ARRAY_SIZE(ab8500_rtc_time_regs)];
 131        unsigned long no_secs, no_mins, secs = 0;
 132
 133        if (tm->tm_year < (AB8500_RTC_EPOCH - 1900)) {
 134                dev_dbg(dev, "year should be equal to or greater than %d\n",
 135                                AB8500_RTC_EPOCH);
EINVAL;
/* Get the number of seconds since 1970 */
rtc_tm_to_time(tm, &secs);
 141
 142        /*
 143         * Convert it to the number of seconds since 01-01-2000 00:00:00, since
 144         * we only have a small counter in the RTC.
 145         */
secs -= get_elapsed_seconds(AB8500_RTC_EPOCH);
no_mins = secs / 60;
no_secs = secs % 60;
 151        /* Make the seconds count as per the RTC resolution */
 152        no_secs = no_secs * COUNTS_PER_SEC;
 153
 154        buf[4] = no_secs & 0xFF;
 155        buf[3] = (no_secs >> 8) & 0xFF;
buf[2] = no_mins & 0xFF;
buf[1] = (no_mins >> 8) & 0xFF;
buf[0] = (no_mins >> 16) & 0xFF;
 161        for (i = 0; i < ARRAY_SIZE(ab8500_rtc_time_regs); i++) {
 162                retval = abx500_set_register_interruptible(dev, AB8500_RTC,
 163                        ab8500_rtc_time_regs[i], buf[i]);
 164                if (retval < 0)
 165                        return retval;
/* Request a data write */
abx500_set_register_interruptible(dev, AB8500_RTC,
AB8500_RTC_READ_REQ_REG, RTC_WRITE_REQUEST);
 171}
 172
 173static int ab8500_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alarm)
 174{
 175        int retval, i;
u8 rtc_ctrl, value;
buf[ARRAY_SIZE(ab8500_rtc_alarm_regs)];
secs, mins;
/* Check if the alarm is enabled or not */
 181        retval = abx500_get_register_interruptible(dev, AB8500_RTC,
 182                AB8500_RTC_STAT_REG, &rtc_ctrl);
 183        if (retval < 0)
 184                return retval;
 185
rtc_ctrl & RTC_ALARM_ENA)
alarm->enabled = 1;
alarm->enabled = 0;
 191        alarm->pending = 0;
 192
 193        for (i = 0; i < ARRAY_SIZE(ab8500_rtc_alarm_regs); i++) {
 194                retval = abx500_get_register_interruptible(dev, AB8500_RTC,
 195                        ab8500_rtc_alarm_regs[i], &value);
retval < 0)
retval;
buf[i] = value;
mins = (buf[0] << 16) | (buf[1] << 8) | (buf[2]);
secs = mins * 60;
/* Add back the initially subtracted number of seconds */
secs += get_elapsed_seconds(AB8500_RTC_EPOCH);
rtc_time_to_tm(secs, &alarm->time);
rtc_valid_tm(&alarm->time);
 212static int ab8500_rtc_irq_enable(struct device *dev, unsigned int enabled)
 213{
 214        return abx500_mask_and_set_register_interruptible(dev, AB8500_RTC,
 215                AB8500_RTC_STAT_REG, RTC_ALARM_ENA,
enabled ? RTC_ALARM_ENA : 0);
ab8500_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alarm)
 221        int retval, i;
 222        unsigned char buf[ARRAY_SIZE(ab8500_rtc_alarm_regs)];
 223        unsigned long mins, secs = 0, cursec = 0;
 224        struct rtc_time curtm;
 225
alarm->time.tm_year < (AB8500_RTC_EPOCH - 1900)) {
dev_dbg(dev, "year should be equal to or greater than %d\n",
AB8500_RTC_EPOCH);
EINVAL;
 231
 232        /* Get the number of seconds since 1970 */
 233        rtc_tm_to_time(&alarm->time, &secs);
 234
 235        /*
         * Check whether alarm is set less than 1min.
         * Since our RTC doesn't support alarm resolution less than 1min,
         * return -EINVAL, so UIE EMUL can take it up, incase of UIE_ON
         */
ab8500_rtc_read_time(dev, &curtm); /* Read current time */
 241        rtc_tm_to_time(&curtm, &cursec);
 242        if ((secs - cursec) < 59) {
 243                dev_dbg(dev, "Alarm less than 1 minute not supported\r\n");
 244                return -EINVAL;
 245        }
/*
         * Convert it to the number of seconds since 01-01-2000 00:00:00, since
         * we only have a small counter in the RTC.
         */
 251        secs -= get_elapsed_seconds(AB8500_RTC_EPOCH);
 252
 253        mins = secs / 60;
 254
 255        buf[2] = mins & 0xFF;
buf[1] = (mins >> 8) & 0xFF;
buf[0] = (mins >> 16) & 0xFF;
/* Set the alarm time */
i = 0; i < ARRAY_SIZE(ab8500_rtc_alarm_regs); i++) {
 261                retval = abx500_set_register_interruptible(dev, AB8500_RTC,
 262                        ab8500_rtc_alarm_regs[i], buf[i]);
 263                if (retval < 0)
 264                        return retval;
 265        }
ab8500_rtc_irq_enable(dev, alarm->enabled);
 271static int ab8500_rtc_set_calibration(struct device *dev, int calibration)
 272{
 273        int retval;
 274        u8  rtccal = 0;
 275
/*
         * Check that the calibration value (which is in units of 0.5
         * parts-per-million) is in the AB8500's range for RtcCalibration
         * register. -128 (0x80) is not permitted because the AB8500 uses
, "year href="+code0t/rt"driv hreftworivers/rinpleg">&pan>
pan>retva0x80) is not permitted because the presittref="d278zeroid="L250" class="line" name="L250 5<250 251        if 2retval &lf="+code=alarm" f="drivers/rtc/rtc-ab8500.c#L272" id="L27id="L2ses7) | 261           2    return retvaldev,ev"Alarm less than 1 minute not supported\r\n"<8500.c#L279/rtdriversoutside="drivers/rrtc/r.c#L244" id="L244" class="line" name="L244"> 244  a href="d2ivers/rtc/rtc-ab8500.c#L286" i28AT_REG" class="sref">L;
 245        if 2rtc_ctr9" class="line" name="L269 5<269
<         2    
 251   an class=     251  a href="d2ivers/rtc/rtc-ab8500.c#L291" i29>, "year hren>
nes/rto/ri0 00:00, sic/rtef="278e presittref="dbec-aec#L1692" i"L251" class="line" name="L251"> 251  atic int ;
ob8500.c#L279/rthe AB8500 .id="L250" class="line" name="L250 5<250 251        for2(retval &lhref="drivers/rf="drivers/rtc/rtc-ab8500.c#L272" id="L27id00.=264" class="line" name="L264"> 264           2    retval =  245           2            retval 245           2            return [1] = (abx500_set_register_interruptible(dev, AB8500_RTC,
 2 an class= href="drivers/rtc/rtc-a28500.29L" class="sref">EINVA1] = ( 244 3a href="d3ivers/rtc/rtc-ab8500.c#L301" i3="L201" class="line" name="L201 5<201 3      3ins = (;
 265 3      3ecs/* Add3back 3he iniion" class="sref">ab8500_rtc_set_caligration(struct device *dev, int calibrat href="+code=calf="drivers/rtc/rtc-ab8500.c#L272" id="L272" class="line" name="L272"> 272{3      3ecs 261 3a href="d3ivers/rtc/rtc-ab8500.c#L309/rt30f">alarm-&;
 274 3      rtc_time_to_tm(rtccal = 0;
 275
3a href="d3ivers/rtc/rtc-ab8500.c#L309/rt3-ab209" class="line" name="L209 5<209 3      ret3rn  href="+code=noabx500_set_register_interruptible"" class="sref">abx500_get_register_interruptible(dev, AB8500_RTC,
 195 3 244 3a href="d3ivers/rtc/rtc-ab8500.c#L312" i31ef">retval < 0)
 261 3atic int 3a href="+code=ab8500_rtc3irq_e31AT_REG" class="sref">Aspan>
 251 3 251 3      ret3rn  251 3      & s, river .id="L250" class="line" name="L250 5<250<3         3     251 3dev_dbg(l &  264 3a href="d3ivers/rtc/rtc-ab8500.c#L319/rt31de=AB8500_RTC_EPOCH" class="s href="+code=calf="drivers/rtc/rtc-ab8500.c#L272" id="L27"L27i- a> &  244 3a     ret3a href="+code=ab8500_rtc3set_a31L" class="sref">EINVAb189" class="line" name="L189 5<189 3RTC_ALARM_ENA)
 244 3      int3retval 253 3      uns3gned long m;
 265 3      str3ct alion" cla href="driversssize_ttc-ab8500.c#L26ssize_tass=""sref">ab8500_rtc_set_sysfs_storevice"ion(struct (strevice *dev, int cal" class="line" name="L226 5<226 3 a href="3    dev_dbg((((((((((((((((( *dev, i_attributlnt cal" class="line" name="L226 5<226 3  href="d3                    AB8ri0st href= href="+code=cal="sref">i]);
ab8500_rtc-abrtc/rtc-ab8500.cc-ab"L272" class="line" name="L272"> 272{3         3    return - 261 3      }
<3 href="drivers/rtc/rtc-a38500.3#L231" id="L23&;
 274 3a href="d3ivers/rtc/rtc-ab8500.c#L332" i33ef">retval,  274 3a     uns3n class="comment">/* Get3the n33"L253" class="line" name="L253"> 253 3      retval &lhref="drivers/rsscansref">i]);
i]);
);
 261 3      str3ivers/rtc/rtc-ab8500.c#L335" i33" class="sref">retvaldev,ev"Alarm less than 1 minute not supported\r\n"
 244 3      /*
L;
 245 3pan class3"comment">         * Che3k whe33sref">rtc_ctr9" class="line" name="L269 5<269
3pan class3"comment">         * Sin3e our33ab168" class="line" name="L168 5<168 3pan class3"comment">         * ret3rn -E33[1] = (abx_set_calibration(struct device="+code=AB8500_RTC" class="sref">AB8500_RTC,
 245 3p        3"comment">         */
<33"L270" class="line" name="L270 5<270
3      ;
ab8500_rtc-abrtc/rtc-ab8500.cc-ab"L275" class="line" name="L245"> 245 3       172
3      if 3( 253 3         3    ab8500_rtc_set_sysfs_showvice"ion(struct (strevice *dev, int cal" class="line" name="L226 5<226 3         3    return -EINVA(((((((((((((((( *dev, i_attributlnt cal href= href="+code=cal="sref">i]);
 272{3      }
<3 href="drivers/rtc/rtc-a38500.34cs 261 3a href="d3ivers/rtc/rtc-ab8500.c#L349/rt34f">alarm-&;
 274 3      /*
 274 3pan class3"comment">         * Con3ert i34ab209" class="line" name="L209 5<209 3pan class3"comment">         * we 3nly h34class="sref"> href="+code=noabx500_set_register_interruptible""sref">ab8500_rtc_set_caligration(struct device="+code=AB8500_RTC" class="sref">AB8500_RTa>);
 274 3pan class3"comment">         */
<35L231" id="L23& < 0)
 261 3      35="sref">retval = dev,ev"Alarm less than 1 minute not supported\r\n"
 244 3a href="d3ivers/rtc/rtc-ab8500.c#L353" i35AT_REG" class="sref">AB8500_RTC_STATspd\rtsref">i]);
i]);
 244 3a        3ref="+code=mins" class="3ref">35lass="sref">retval;
 265 3a href="d3ivers/rtc/rtc-ab8500.c#L355" i35L" class="sre2" class="line" name="L172"> 172
3      b35"L226" class="line" name="L226 5<226 3      b3f[1] = (;
i]);
i]);
,
 245 3      b35-ab218" class="line" name="L218 5<218
3a href="d3ivers/rtc/rtc-ab8500.c#L359/rt3-ab259" class="line" name="L259 5<259 3      /* Set3the a35rm" class="sC,
(struct (strevic8TC,
cal" class="line" name="L226 5<226 3      for3(ab8500_rtc_set_sysfs_showvice"ion(struct (strevicl" class="line" name="L226 5<226 3      retval = 1] "sref">ab8500_rtc_set_sysfs_storevice"ion(struct (strevic25" class="line" name="L245"> 245 3         3             253 3         3    if (ab8500_rtc_set_sysfs_r>devdev, int ca2" class="line" name="L272"> 272{3         3            return  261 3      }
<3 href="drivers/rtc/rtc-a38500.3#L266" id="L26;
, i_crs/rt_fieAB8500_RTa>);
(struct (strevic25" class="line" name="L245"> 245 3      ab8500_rtc_set_sysfs_r>deunvdev, int ca2" class="line" name="L272"> 272{3       261 3a href="d3ivers/rtc/rtc-ab8500.c#L371" i37 class="sref">ab8500_rtc_rea/a>, i_removt_fie(AB8500_RTa>);
(struct (strevic25" class="line" name="L245"> 245 3atic int 3a href="+code=ab8500_rtc3set_c37="L172" class="line" name="L172"> 172
3 253 3      int3;
_ttc-ab8500.c#L26irq;
_tass=""sref">ab8500_rri], ab8500_rirqtc-ab8500.c#L26irq500_RTvoid= href="+code=caliatauct ca2" class="line" name="L272"> 272{3      u837e=ret1" class="line" name="L261"> 261 3a href="d3ivers/rtc/rtc-ab8500.c#L376" i37L266" id="L26time devdevab8500_riatauct ca5" class="line" name="L245"> 245 3a     /*
, ab8500_rlassIRQF"+code=i" classlassIRQF/a>[1|TC,
ca5" class="line" name="L245"> 245 3a     ret3"comment">         * Che3k tha37ab168" class="line" name="L168 5<168 3pan class3"comment">         * par3s-per37[1] = (dev, );
dev);
 245 3a              * reg3ster.37class="sref"> href="+code=noa>deupd/rt_irqtc-ab8500.c#L26a>deupd/rt_irq href="+code=AB8500_iceass="sref">dev,
 245 3="L280 5<3#L186"6e="L280 5 = (;
ca5" class="line" name="L245"> 245 3         3     ab8500_rtc_set_e=cuop="+code=i" classtc_set_e=cuop=ptible"1" class="line" name="L261"> 261 3a href="d3ivers/rtc/rtc-ab8500.c#L386" i38AT_REG" class < (, & = 1] e""sref">ab8500_rtc_set_calidev, &rtc_ctr < (retval =e" class="sref">abx_set_calibratef="+code=dev" class="sref">de claef=""srel" class="line" name="L226 5<226 3      ret3    retvale""sref">ab8500_rtc_set_calidevic">retval =e" class="sref">abx_set_calibratct devicl" class="line" name="L226 5<226 3      ], <>(], <>(abx_set_cali>(dev, ,  245 3atic int 3ref="+code=alarm" class=3sref"39"L232" class="line" name="L232"> 232 3a href="d3ivers/rtc/rtc-ab8500.c#L393" i39ble" class="sref">ab8500_rtc_irq_enabledprob=evice *devca2" class="line" name="L272"> 272{3      for3( 214 3         3    retva/a>)
dev 245 3a href="d3            devdev 245 3a     if 3    if (rhref="+code=callass="sref">rtccal =>  245 3a     ret3            return ab8500_rirqtc-ab8500.c#L26irq500_5" class="line" name="L245"> 245 3aan class3     href="+code=noirqtc-ab8500.c#L26irq500_/e" class="sref">aplatfo, devcanute not supported\r\n" 244 4a href="d4ivers/rtc/rtc-ab8500.c#L401" i40L231" id="L23& < 0)
 264 4      40="sref">retval = ;
 245 4      40"L253" class="line" name="L253"> 253 4a href="d4ivers/rtc/rtc-ab8500.c#L404" i40ns = 
 251 4      /* Add4back 40a>  devabx500_smask_andset_register_interruptible(ca);
 195 4      40AT_REG" class="sref">t
 244 4a6    alarm-& < 0)
dev 264 4 7    dev_dbg(;
dev 245 4a href="d4ivers/rtc/rtc-ab8500.c#L409/rt4-ab209" class="line" name="L209 5<209 4      ret4rn  251 4ab8500_rtc_reausleep_rtc/rss="sref">rtccalsleep_rtc/rpan c10c#L251<044" class="line" name="L244"> 244 4a href="d4ivers/rtc/rtc-ab8500.c#L412" i41"L232" class="line" name="L232"> 232 4atic int 4a href="+code=ab8500_rtc4irq_e41AT_REG" class+code=rtccal" crvdevabx500_set_register_interruptible(dev, );
ca);
 195 4dev_dbg( 244 4a     alarm-& < 0)
dev 264 4      L;
a href="driversrvdev 245 4         4     251 4< href="d4ivers/rtc/rtc-ab8500.c#L419/rt41de=AB8500_RTC& &l!f="+code=AB8500_ice"itrrtc/rtc-ab8500.c#L2urtrrptib>RTC_ALARM_ENA)
 261 4a     ret4a href="+code=ab8500_rtc4set_a41L" class="sref">EINVA href="+code=nodev"evdev,ev);
ca);
 244 4 245 4      int4retval 253 4      uns4gned long m>ab8500_rtc_rea/a>, i_init_wakeup/a>(ca);
( 244 4      str4ct  255 4      [2] = devae=cuev" clev 255<-e=cL228/rtc-ab228/a>);
ca);
 195 4      if 4retval 244 4 a href="4    dev_& < 0)
dev 261 4  href="d4                    dev,ev);
ca);
 244 4<     ret4    return -EINVA href="+code=norvdevaPTR_ERRrtc/rtc-ab8500.PTR_ERR href="+code=AB8500_iceass="sref">dev 244 4      }
<4 href="drivers/rtc/rtc-a48500.43AD_REQ_REG" class="srL;
a href="driversrvdev 245 4a href="d4ivers/rtc/rtc-ab8500.c#L432" i43ef">retval/* Get4the n43"L253" class="line" name="L253"> 253 4      m>ab8500_rtc_rearvdevarequest_th],  195 4      str4ivers/rtc/rtc-ab8500.c#L435" i43" class="sref">retval,
 255<-e=cL228/rtc-ab228/="+code=AB8500_iceass="sref">dev 244 4      /*
dev 261 4pan class4"comment">         * Che4k whe43lass="sref">retvalae=cuev" cleunvdev 244 4 a href="4"comment">         * Sin4e our43s="sref">dev_dbg(;
dev 245 4pan class4"comment">         * ret4rn -E43[1] = (         */
<43"L270" class="line" name="L270 5<270
4      ab8500_rtc_reaplatfo, canut"+code=AB8500_iceass="sref">dev 244 4       232 4      if 4(devabx_set_sysfs_r>devca);
 244 4      retval &lhref="drivers/rrvdev 261 4         4    return -EINVA href="+code=nodev"evdev,ev);
ca);
 244 4      }
<4 href="drivers/rtc/rtc-a48500.44AT_REG" class="sref">L;
a href="driversrvdev 245 4a href="d4ivers/rtc/rtc-ab8500.c#L449/rt44f">alarm-9" class="line" name="L269 5<269
4      /*
         * Con4ert i44[1] = (;
74" class="line" name="L274"> 274 4pan class4"comment">         * we 4nly h44class9" class="line" name="L269 5<269
4pan class4"comment">         */
<45"L201" class="line" name="L201 5<201 4      45ibration" class="sref">ab8500_rtc_set_caliremovt"+code=i" classtc_set_e=curemovtpan c *devca2" class="line" name="L272"> 272{4a href="d4ivers/rtc/rtc-ab8500.c#L453" i45="L273" class="line" name="L273"> 273 4a        4ref="+code=mins" class="4ref">45lass="sref">rtime devdevab8500_rplatfo, ca44" class="line" name="L244"> 244 4a href="d4ivers/rtc/rtc-ab8500.c#L455" i45="sref">retva/a>)
aplatfo, devcanute not supported\r\n" 244 4      b45"L226" class="line" name="L226 5<226 4      b45lass="sref">rhref="+code=caltc_set_sysfs_r>deunvca);
 244 4      b45ab168" class="line" name="L168 5<168 4a href="d4ivers/rtc/rtc-ab8500.c#L459/rt45[1] = (dev 244 4      /* Set4the a45class="sref"> href="+code=noa>deev" cleunvdev 244 4      for4(ab8500_rtc_reaplatfo, canut"+code=AB8500_NULrtc-ab8500.c#L24NULr500_44" class="line" name="L244"> 244 4       232 4         4            ;
74" class="line" name="L274"> 274 4         4    if ( 255 4      }
<4 href="drivers/rtc/rtc-a48500.4#L266"ion" cl *devab8500_rtc_set_caliene" nass="sref">dev 273 4      rtc_ctr < (dev 273 4      dev_dbg( < (dev 255<-e=cL228/rtc-ab228" class="line" name="L273"> 273 4  href="d4rivers/rtc/rtc-ab8500.c#4269/r46de=AB8500_RTC_EPOCH"  < (devaTHIS_MODULE"+code=i" classTHIS_MODULEptib8" class="line" name="L273"> 273 4      }8" class="line" name="L273"> 273 4a href="d4ivers/rtc/rtc-ab8500.c#L471" i47 class="sref" < (abx_set_caliprob="+code=dev" class="sref">dprob=evic8" class="line" name="L273"> 273 4a     e""sref">ab8500_rtc_set_cali 273 4a        4rivers/rtc/rtc-ab8500.c#4273" 47"L253}5" class="line" name="L245"> 245 4      int4u847e=ret"sref">ab8500_rmodule_platfo, devdev 244 4a href="d4ivers/rtc/rtc-ab8500.c#L476" i47"L226" class="line" name="L226 5<226 4a     /*
 244 4a     ret4"comment">         * Che4k tha47ab168="+code=AB8500_MODULE_DESCRIPTIONrtc/rtc-ab8500.MODULE_DESCRIPTION href=e not supported\r\n"<0.c#L280"  Dne" n#L244" id="L244" class="line" name="L244"> 244 4a href="d4"comment">         * par4s-per47[="+code=AB8500_MODULE_LICENSE"+code=i" classMODULE_LICENSE href=e not supported\r\n" 244 4a              * reg4ster.47class


foo500u> T850original LXR software byab850 class="lhttp://sourcefo,ge.net/projects/lx0u>LXR 0.c#unity">canuthis exp00i#L24al " naf="dbya class="lmailto:lx0@ ux.no">lx0@ ux.no">ca.
subfoo500u> lx0. ux.no kindly ho850ddbya class="lhttp://www.redpill- pro.no">Redpill L pro AS">canuprovider of L uxlri0sult\r\ and op00ref="s ser" cli="+nce 1995.