LCOV - code coverage report
Current view: top level - drivers/rtc - interface.c (source / functions) Hit Total Coverage
Test: coverage.info Lines: 50 321 15.6 %
Date: 2014-02-18 Functions: 8 31 25.8 %
Branches: 17 222 7.7 %

           Branch data     Line data    Source code
       1                 :            : /*
       2                 :            :  * RTC subsystem, interface functions
       3                 :            :  *
       4                 :            :  * Copyright (C) 2005 Tower Technologies
       5                 :            :  * Author: Alessandro Zummo <a.zummo@towertech.it>
       6                 :            :  *
       7                 :            :  * based on arch/arm/common/rtctime.c
       8                 :            :  *
       9                 :            :  * This program is free software; you can redistribute it and/or modify
      10                 :            :  * it under the terms of the GNU General Public License version 2 as
      11                 :            :  * published by the Free Software Foundation.
      12                 :            : */
      13                 :            : 
      14                 :            : #include <linux/rtc.h>
      15                 :            : #include <linux/sched.h>
      16                 :            : #include <linux/module.h>
      17                 :            : #include <linux/log2.h>
      18                 :            : #include <linux/workqueue.h>
      19                 :            : 
      20                 :            : static int rtc_timer_enqueue(struct rtc_device *rtc, struct rtc_timer *timer);
      21                 :            : static void rtc_timer_remove(struct rtc_device *rtc, struct rtc_timer *timer);
      22                 :            : 
      23                 :          2 : static int __rtc_read_time(struct rtc_device *rtc, struct rtc_time *tm)
      24                 :            : {
      25                 :            :         int err;
      26         [ +  - ]:          2 :         if (!rtc->ops)
      27                 :            :                 err = -ENODEV;
      28         [ +  - ]:          2 :         else if (!rtc->ops->read_time)
      29                 :            :                 err = -EINVAL;
      30                 :            :         else {
      31                 :          2 :                 memset(tm, 0, sizeof(struct rtc_time));
      32                 :          2 :                 err = rtc->ops->read_time(rtc->dev.parent, tm);
      33                 :            :         }
      34                 :          0 :         return err;
      35                 :            : }
      36                 :            : 
      37                 :          0 : int rtc_read_time(struct rtc_device *rtc, struct rtc_time *tm)
      38                 :            : {
      39                 :            :         int err;
      40                 :            : 
      41                 :          1 :         err = mutex_lock_interruptible(&rtc->ops_lock);
      42         [ +  - ]:          1 :         if (err)
      43                 :            :                 return err;
      44                 :            : 
      45                 :          1 :         err = __rtc_read_time(rtc, tm);
      46                 :          1 :         mutex_unlock(&rtc->ops_lock);
      47                 :          1 :         return err;
      48                 :            : }
      49                 :            : EXPORT_SYMBOL_GPL(rtc_read_time);
      50                 :            : 
      51                 :          0 : int rtc_set_time(struct rtc_device *rtc, struct rtc_time *tm)
      52                 :            : {
      53                 :            :         int err;
      54                 :            : 
      55                 :          1 :         err = rtc_valid_tm(tm);
      56         [ +  - ]:          1 :         if (err != 0)
      57                 :            :                 return err;
      58                 :            : 
      59                 :          1 :         err = mutex_lock_interruptible(&rtc->ops_lock);
      60         [ +  - ]:          1 :         if (err)
      61                 :            :                 return err;
      62                 :            : 
      63         [ +  - ]:          1 :         if (!rtc->ops)
      64                 :            :                 err = -ENODEV;
      65         [ +  - ]:          1 :         else if (rtc->ops->set_time)
      66                 :          1 :                 err = rtc->ops->set_time(rtc->dev.parent, tm);
      67         [ #  # ]:          0 :         else if (rtc->ops->set_mmss) {
      68                 :            :                 unsigned long secs;
      69                 :          0 :                 err = rtc_tm_to_time(tm, &secs);
      70         [ #  # ]:          0 :                 if (err == 0)
      71                 :          0 :                         err = rtc->ops->set_mmss(rtc->dev.parent, secs);
      72                 :            :         } else
      73                 :            :                 err = -EINVAL;
      74                 :            : 
      75                 :          1 :         pm_stay_awake(rtc->dev.parent);
      76                 :          1 :         mutex_unlock(&rtc->ops_lock);
      77                 :            :         /* A timer might have just expired */
      78                 :          1 :         schedule_work(&rtc->irqwork);
      79                 :          1 :         return err;
      80                 :            : }
      81                 :            : EXPORT_SYMBOL_GPL(rtc_set_time);
      82                 :            : 
      83                 :          0 : int rtc_set_mmss(struct rtc_device *rtc, unsigned long secs)
      84                 :            : {
      85                 :            :         int err;
      86                 :            : 
      87                 :          0 :         err = mutex_lock_interruptible(&rtc->ops_lock);
      88         [ #  # ]:          0 :         if (err)
      89                 :            :                 return err;
      90                 :            : 
      91         [ #  # ]:          0 :         if (!rtc->ops)
      92                 :            :                 err = -ENODEV;
      93         [ #  # ]:          0 :         else if (rtc->ops->set_mmss)
      94                 :          0 :                 err = rtc->ops->set_mmss(rtc->dev.parent, secs);
      95 [ #  # ][ #  # ]:          0 :         else if (rtc->ops->read_time && rtc->ops->set_time) {
      96                 :            :                 struct rtc_time new, old;
      97                 :            : 
      98                 :          0 :                 err = rtc->ops->read_time(rtc->dev.parent, &old);
      99         [ #  # ]:          0 :                 if (err == 0) {
     100                 :          0 :                         rtc_time_to_tm(secs, &new);
     101                 :            : 
     102                 :            :                         /*
     103                 :            :                          * avoid writing when we're going to change the day of
     104                 :            :                          * the month. We will retry in the next minute. This
     105                 :            :                          * basically means that if the RTC must not drift
     106                 :            :                          * by more than 1 minute in 11 minutes.
     107                 :            :                          */
     108 [ #  # ][ #  # ]:          0 :                         if (!((old.tm_hour == 23 && old.tm_min == 59) ||
                 [ #  # ]
     109         [ #  # ]:          0 :                                 (new.tm_hour == 23 && new.tm_min == 59)))
     110                 :          0 :                                 err = rtc->ops->set_time(rtc->dev.parent,
     111                 :            :                                                 &new);
     112                 :            :                 }
     113                 :            :         } else {
     114                 :            :                 err = -EINVAL;
     115                 :            :         }
     116                 :            : 
     117                 :          0 :         pm_stay_awake(rtc->dev.parent);
     118                 :          0 :         mutex_unlock(&rtc->ops_lock);
     119                 :            :         /* A timer might have just expired */
     120                 :          0 :         schedule_work(&rtc->irqwork);
     121                 :            : 
     122                 :          0 :         return err;
     123                 :            : }
     124                 :            : EXPORT_SYMBOL_GPL(rtc_set_mmss);
     125                 :            : 
     126                 :          0 : static int rtc_read_alarm_internal(struct rtc_device *rtc, struct rtc_wkalrm *alarm)
     127                 :            : {
     128                 :            :         int err;
     129                 :            : 
     130                 :          0 :         err = mutex_lock_interruptible(&rtc->ops_lock);
     131         [ #  # ]:          0 :         if (err)
     132                 :            :                 return err;
     133                 :            : 
     134         [ #  # ]:          0 :         if (rtc->ops == NULL)
     135                 :            :                 err = -ENODEV;
     136         [ #  # ]:          0 :         else if (!rtc->ops->read_alarm)
     137                 :            :                 err = -EINVAL;
     138                 :            :         else {
     139                 :          0 :                 memset(alarm, 0, sizeof(struct rtc_wkalrm));
     140                 :          0 :                 err = rtc->ops->read_alarm(rtc->dev.parent, alarm);
     141                 :            :         }
     142                 :            : 
     143                 :          0 :         mutex_unlock(&rtc->ops_lock);
     144                 :          0 :         return err;
     145                 :            : }
     146                 :            : 
     147                 :          0 : int __rtc_read_alarm(struct rtc_device *rtc, struct rtc_wkalrm *alarm)
     148                 :            : {
     149                 :            :         int err;
     150                 :            :         struct rtc_time before, now;
     151                 :            :         int first_time = 1;
     152                 :            :         unsigned long t_now, t_alm;
     153                 :            :         enum { none, day, month, year } missing = none;
     154                 :            :         unsigned days;
     155                 :            : 
     156                 :            :         /* The lower level RTC driver may return -1 in some fields,
     157                 :            :          * creating invalid alarm->time values, for reasons like:
     158                 :            :          *
     159                 :            :          *   - The hardware may not be capable of filling them in;
     160                 :            :          *     many alarms match only on time-of-day fields, not
     161                 :            :          *     day/month/year calendar data.
     162                 :            :          *
     163                 :            :          *   - Some hardware uses illegal values as "wildcard" match
     164                 :            :          *     values, which non-Linux firmware (like a BIOS) may try
     165                 :            :          *     to set up as e.g. "alarm 15 minutes after each hour".
     166                 :            :          *     Linux uses only oneshot alarms.
     167                 :            :          *
     168                 :            :          * When we see that here, we deal with it by using values from
     169                 :            :          * a current RTC timestamp for any missing (-1) values.  The
     170                 :            :          * RTC driver prevents "periodic alarm" modes.
     171                 :            :          *
     172                 :            :          * But this can be racey, because some fields of the RTC timestamp
     173                 :            :          * may have wrapped in the interval since we read the RTC alarm,
     174                 :            :          * which would lead to us inserting inconsistent values in place
     175                 :            :          * of the -1 fields.
     176                 :            :          *
     177                 :            :          * Reading the alarm and timestamp in the reverse sequence
     178                 :            :          * would have the same race condition, and not solve the issue.
     179                 :            :          *
     180                 :            :          * So, we must first read the RTC timestamp,
     181                 :            :          * then read the RTC alarm value,
     182                 :            :          * and then read a second RTC timestamp.
     183                 :            :          *
     184                 :            :          * If any fields of the second timestamp have changed
     185                 :            :          * when compared with the first timestamp, then we know
     186                 :            :          * our timestamp may be inconsistent with that used by
     187                 :            :          * the low-level rtc_read_alarm_internal() function.
     188                 :            :          *
     189                 :            :          * So, when the two timestamps disagree, we just loop and do
     190                 :            :          * the process again to get a fully consistent set of values.
     191                 :            :          *
     192                 :            :          * This could all instead be done in the lower level driver,
     193                 :            :          * but since more than one lower level RTC implementation needs it,
     194                 :            :          * then it's probably best best to do it here instead of there..
     195                 :            :          */
     196                 :            : 
     197                 :            :         /* Get the "before" timestamp */
     198                 :          0 :         err = rtc_read_time(rtc, &before);
     199         [ #  # ]:          0 :         if (err < 0)
     200                 :            :                 return err;
     201                 :            :         do {
     202         [ #  # ]:          0 :                 if (!first_time)
     203                 :          0 :                         memcpy(&before, &now, sizeof(struct rtc_time));
     204                 :            :                 first_time = 0;
     205                 :            : 
     206                 :            :                 /* get the RTC alarm values, which may be incomplete */
     207                 :          0 :                 err = rtc_read_alarm_internal(rtc, alarm);
     208         [ #  # ]:          0 :                 if (err)
     209                 :            :                         return err;
     210                 :            : 
     211                 :            :                 /* full-function RTCs won't have such missing fields */
     212         [ #  # ]:          0 :                 if (rtc_valid_tm(&alarm->time) == 0)
     213                 :            :                         return 0;
     214                 :            : 
     215                 :            :                 /* get the "after" timestamp, to detect wrapped fields */
     216                 :          0 :                 err = rtc_read_time(rtc, &now);
     217         [ #  # ]:          0 :                 if (err < 0)
     218                 :            :                         return err;
     219                 :            : 
     220                 :            :                 /* note that tm_sec is a "don't care" value here: */
     221                 :          0 :         } while (   before.tm_min   != now.tm_min
     222         [ #  # ]:          0 :                  || before.tm_hour  != now.tm_hour
     223         [ #  # ]:          0 :                  || before.tm_mon   != now.tm_mon
     224 [ #  # ][ #  # ]:          0 :                  || before.tm_year  != now.tm_year);
     225                 :            : 
     226                 :            :         /* Fill in the missing alarm fields using the timestamp; we
     227                 :            :          * know there's at least one since alarm->time is invalid.
     228                 :            :          */
     229         [ #  # ]:          0 :         if (alarm->time.tm_sec == -1)
     230                 :          0 :                 alarm->time.tm_sec = now.tm_sec;
     231         [ #  # ]:          0 :         if (alarm->time.tm_min == -1)
     232                 :          0 :                 alarm->time.tm_min = now.tm_min;
     233         [ #  # ]:          0 :         if (alarm->time.tm_hour == -1)
     234                 :          0 :                 alarm->time.tm_hour = now.tm_hour;
     235                 :            : 
     236                 :            :         /* For simplicity, only support date rollover for now */
     237         [ #  # ]:          0 :         if (alarm->time.tm_mday < 1 || alarm->time.tm_mday > 31) {
     238                 :          0 :                 alarm->time.tm_mday = now.tm_mday;
     239                 :            :                 missing = day;
     240                 :            :         }
     241         [ #  # ]:          0 :         if ((unsigned)alarm->time.tm_mon >= 12) {
     242                 :          0 :                 alarm->time.tm_mon = now.tm_mon;
     243         [ #  # ]:          0 :                 if (missing == none)
     244                 :            :                         missing = month;
     245                 :            :         }
     246         [ #  # ]:          0 :         if (alarm->time.tm_year == -1) {
     247                 :          0 :                 alarm->time.tm_year = now.tm_year;
     248         [ #  # ]:          0 :                 if (missing == none)
     249                 :            :                         missing = year;
     250                 :            :         }
     251                 :            : 
     252                 :            :         /* with luck, no rollover is needed */
     253                 :          0 :         rtc_tm_to_time(&now, &t_now);
     254                 :          0 :         rtc_tm_to_time(&alarm->time, &t_alm);
     255         [ #  # ]:          0 :         if (t_now < t_alm)
     256                 :            :                 goto done;
     257                 :            : 
     258   [ #  #  #  # ]:          0 :         switch (missing) {
     259                 :            : 
     260                 :            :         /* 24 hour rollover ... if it's now 10am Monday, an alarm that
     261                 :            :          * that will trigger at 5am will do so at 5am Tuesday, which
     262                 :            :          * could also be in the next month or year.  This is a common
     263                 :            :          * case, especially for PCs.
     264                 :            :          */
     265                 :            :         case day:
     266                 :            :                 dev_dbg(&rtc->dev, "alarm rollover: %s\n", "day");
     267                 :          0 :                 t_alm += 24 * 60 * 60;
     268                 :          0 :                 rtc_time_to_tm(t_alm, &alarm->time);
     269                 :          0 :                 break;
     270                 :            : 
     271                 :            :         /* Month rollover ... if it's the 31th, an alarm on the 3rd will
     272                 :            :          * be next month.  An alarm matching on the 30th, 29th, or 28th
     273                 :            :          * may end up in the month after that!  Many newer PCs support
     274                 :            :          * this type of alarm.
     275                 :            :          */
     276                 :            :         case month:
     277                 :            :                 dev_dbg(&rtc->dev, "alarm rollover: %s\n", "month");
     278                 :            :                 do {
     279         [ #  # ]:          0 :                         if (alarm->time.tm_mon < 11)
     280                 :          0 :                                 alarm->time.tm_mon++;
     281                 :            :                         else {
     282                 :          0 :                                 alarm->time.tm_mon = 0;
     283                 :          0 :                                 alarm->time.tm_year++;
     284                 :            :                         }
     285                 :          0 :                         days = rtc_month_days(alarm->time.tm_mon,
     286                 :          0 :                                         alarm->time.tm_year);
     287         [ #  # ]:          0 :                 } while (days < alarm->time.tm_mday);
     288                 :            :                 break;
     289                 :            : 
     290                 :            :         /* Year rollover ... easy except for leap years! */
     291                 :            :         case year:
     292                 :            :                 dev_dbg(&rtc->dev, "alarm rollover: %s\n", "year");
     293                 :            :                 do {
     294                 :          0 :                         alarm->time.tm_year++;
     295         [ #  # ]:          0 :                 } while (rtc_valid_tm(&alarm->time) != 0);
     296                 :            :                 break;
     297                 :            : 
     298                 :            :         default:
     299                 :          0 :                 dev_warn(&rtc->dev, "alarm rollover not handled\n");
     300                 :            :         }
     301                 :            : 
     302                 :            : done:
     303                 :            :         return 0;
     304                 :            : }
     305                 :            : 
     306                 :          0 : int rtc_read_alarm(struct rtc_device *rtc, struct rtc_wkalrm *alarm)
     307                 :            : {
     308                 :            :         int err;
     309                 :            : 
     310                 :          1 :         err = mutex_lock_interruptible(&rtc->ops_lock);
     311         [ +  - ]:          1 :         if (err)
     312                 :            :                 return err;
     313         [ +  - ]:          1 :         if (rtc->ops == NULL)
     314                 :            :                 err = -ENODEV;
     315         [ +  - ]:          1 :         else if (!rtc->ops->read_alarm)
     316                 :            :                 err = -EINVAL;
     317                 :            :         else {
     318                 :          1 :                 memset(alarm, 0, sizeof(struct rtc_wkalrm));
     319                 :          1 :                 alarm->enabled = rtc->aie_timer.enabled;
     320                 :          1 :                 alarm->time = rtc_ktime_to_tm(rtc->aie_timer.node.expires);
     321                 :            :         }
     322                 :          1 :         mutex_unlock(&rtc->ops_lock);
     323                 :            : 
     324                 :          1 :         return err;
     325                 :            : }
     326                 :            : EXPORT_SYMBOL_GPL(rtc_read_alarm);
     327                 :            : 
     328                 :          0 : static int __rtc_set_alarm(struct rtc_device *rtc, struct rtc_wkalrm *alarm)
     329                 :            : {
     330                 :            :         struct rtc_time tm;
     331                 :            :         long now, scheduled;
     332                 :            :         int err;
     333                 :            : 
     334                 :          0 :         err = rtc_valid_tm(&alarm->time);
     335         [ #  # ]:          0 :         if (err)
     336                 :            :                 return err;
     337                 :          0 :         rtc_tm_to_time(&alarm->time, &scheduled);
     338                 :            : 
     339                 :            :         /* Make sure we're not setting alarms in the past */
     340                 :          0 :         err = __rtc_read_time(rtc, &tm);
     341                 :          0 :         rtc_tm_to_time(&tm, &now);
     342         [ #  # ]:          0 :         if (scheduled <= now)
     343                 :            :                 return -ETIME;
     344                 :            :         /*
     345                 :            :          * XXX - We just checked to make sure the alarm time is not
     346                 :            :          * in the past, but there is still a race window where if
     347                 :            :          * the is alarm set for the next second and the second ticks
     348                 :            :          * over right here, before we set the alarm.
     349                 :            :          */
     350                 :            : 
     351         [ #  # ]:          0 :         if (!rtc->ops)
     352                 :            :                 err = -ENODEV;
     353         [ #  # ]:          0 :         else if (!rtc->ops->set_alarm)
     354                 :            :                 err = -EINVAL;
     355                 :            :         else
     356                 :          0 :                 err = rtc->ops->set_alarm(rtc->dev.parent, alarm);
     357                 :            : 
     358                 :          0 :         return err;
     359                 :            : }
     360                 :            : 
     361                 :          0 : int rtc_set_alarm(struct rtc_device *rtc, struct rtc_wkalrm *alarm)
     362                 :            : {
     363                 :            :         int err;
     364                 :            : 
     365                 :          0 :         err = rtc_valid_tm(&alarm->time);
     366         [ #  # ]:          0 :         if (err != 0)
     367                 :            :                 return err;
     368                 :            : 
     369                 :          0 :         err = mutex_lock_interruptible(&rtc->ops_lock);
     370         [ #  # ]:          0 :         if (err)
     371                 :            :                 return err;
     372         [ #  # ]:          0 :         if (rtc->aie_timer.enabled)
     373                 :          0 :                 rtc_timer_remove(rtc, &rtc->aie_timer);
     374                 :            : 
     375                 :          0 :         rtc->aie_timer.node.expires = rtc_tm_to_ktime(alarm->time);
     376                 :          0 :         rtc->aie_timer.period = ktime_set(0, 0);
     377         [ #  # ]:          0 :         if (alarm->enabled)
     378                 :          0 :                 err = rtc_timer_enqueue(rtc, &rtc->aie_timer);
     379                 :            : 
     380                 :          0 :         mutex_unlock(&rtc->ops_lock);
     381                 :          0 :         return err;
     382                 :            : }
     383                 :            : EXPORT_SYMBOL_GPL(rtc_set_alarm);
     384                 :            : 
     385                 :            : /* Called once per device from rtc_device_register */
     386                 :          0 : int rtc_initialize_alarm(struct rtc_device *rtc, struct rtc_wkalrm *alarm)
     387                 :            : {
     388                 :            :         int err;
     389                 :            :         struct rtc_time now;
     390                 :            : 
     391                 :          0 :         err = rtc_valid_tm(&alarm->time);
     392         [ #  # ]:          0 :         if (err != 0)
     393                 :            :                 return err;
     394                 :            : 
     395                 :          0 :         err = rtc_read_time(rtc, &now);
     396         [ #  # ]:          0 :         if (err)
     397                 :            :                 return err;
     398                 :            : 
     399                 :          0 :         err = mutex_lock_interruptible(&rtc->ops_lock);
     400         [ #  # ]:          0 :         if (err)
     401                 :            :                 return err;
     402                 :            : 
     403                 :          0 :         rtc->aie_timer.node.expires = rtc_tm_to_ktime(alarm->time);
     404                 :          0 :         rtc->aie_timer.period = ktime_set(0, 0);
     405                 :            : 
     406                 :            :         /* Alarm has to be enabled & in the futrure for us to enqueue it */
     407 [ #  # ][ #  # ]:          0 :         if (alarm->enabled && (rtc_tm_to_ktime(now).tv64 <
     408                 :          0 :                          rtc->aie_timer.node.expires.tv64)) {
     409                 :            : 
     410                 :          0 :                 rtc->aie_timer.enabled = 1;
     411                 :          0 :                 timerqueue_add(&rtc->timerqueue, &rtc->aie_timer.node);
     412                 :            :         }
     413                 :          0 :         mutex_unlock(&rtc->ops_lock);
     414                 :          0 :         return err;
     415                 :            : }
     416                 :            : EXPORT_SYMBOL_GPL(rtc_initialize_alarm);
     417                 :            : 
     418                 :            : 
     419                 :            : 
     420                 :          0 : int rtc_alarm_irq_enable(struct rtc_device *rtc, unsigned int enabled)
     421                 :            : {
     422                 :          0 :         int err = mutex_lock_interruptible(&rtc->ops_lock);
     423         [ #  # ]:          0 :         if (err)
     424                 :            :                 return err;
     425                 :            : 
     426         [ #  # ]:          0 :         if (rtc->aie_timer.enabled != enabled) {
     427         [ #  # ]:          0 :                 if (enabled)
     428                 :          0 :                         err = rtc_timer_enqueue(rtc, &rtc->aie_timer);
     429                 :            :                 else
     430                 :          0 :                         rtc_timer_remove(rtc, &rtc->aie_timer);
     431                 :            :         }
     432                 :            : 
     433         [ #  # ]:          0 :         if (err)
     434                 :            :                 /* nothing */;
     435         [ #  # ]:          0 :         else if (!rtc->ops)
     436                 :            :                 err = -ENODEV;
     437         [ #  # ]:          0 :         else if (!rtc->ops->alarm_irq_enable)
     438                 :            :                 err = -EINVAL;
     439                 :            :         else
     440                 :          0 :                 err = rtc->ops->alarm_irq_enable(rtc->dev.parent, enabled);
     441                 :            : 
     442                 :          0 :         mutex_unlock(&rtc->ops_lock);
     443                 :          0 :         return err;
     444                 :            : }
     445                 :            : EXPORT_SYMBOL_GPL(rtc_alarm_irq_enable);
     446                 :            : 
     447                 :          0 : int rtc_update_irq_enable(struct rtc_device *rtc, unsigned int enabled)
     448                 :            : {
     449                 :          0 :         int err = mutex_lock_interruptible(&rtc->ops_lock);
     450         [ #  # ]:          0 :         if (err)
     451                 :            :                 return err;
     452                 :            : 
     453                 :            : #ifdef CONFIG_RTC_INTF_DEV_UIE_EMUL
     454                 :            :         if (enabled == 0 && rtc->uie_irq_active) {
     455                 :            :                 mutex_unlock(&rtc->ops_lock);
     456                 :            :                 return rtc_dev_update_irq_enable_emul(rtc, 0);
     457                 :            :         }
     458                 :            : #endif
     459                 :            :         /* make sure we're changing state */
     460         [ #  # ]:          0 :         if (rtc->uie_rtctimer.enabled == enabled)
     461                 :            :                 goto out;
     462                 :            : 
     463         [ #  # ]:          0 :         if (rtc->uie_unsupported) {
     464                 :            :                 err = -EINVAL;
     465                 :            :                 goto out;
     466                 :            :         }
     467                 :            : 
     468         [ #  # ]:          0 :         if (enabled) {
     469                 :            :                 struct rtc_time tm;
     470                 :            :                 ktime_t now, onesec;
     471                 :            : 
     472                 :          0 :                 __rtc_read_time(rtc, &tm);
     473                 :            :                 onesec = ktime_set(1, 0);
     474                 :          0 :                 now = rtc_tm_to_ktime(tm);
     475                 :          0 :                 rtc->uie_rtctimer.node.expires = ktime_add(now, onesec);
     476                 :          0 :                 rtc->uie_rtctimer.period = ktime_set(1, 0);
     477                 :          0 :                 err = rtc_timer_enqueue(rtc, &rtc->uie_rtctimer);
     478                 :            :         } else
     479                 :          0 :                 rtc_timer_remove(rtc, &rtc->uie_rtctimer);
     480                 :            : 
     481                 :            : out:
     482                 :          0 :         mutex_unlock(&rtc->ops_lock);
     483                 :            : #ifdef CONFIG_RTC_INTF_DEV_UIE_EMUL
     484                 :            :         /*
     485                 :            :          * Enable emulation if the driver did not provide
     486                 :            :          * the update_irq_enable function pointer or if returned
     487                 :            :          * -EINVAL to signal that it has been configured without
     488                 :            :          * interrupts or that are not available at the moment.
     489                 :            :          */
     490                 :            :         if (err == -EINVAL)
     491                 :            :                 err = rtc_dev_update_irq_enable_emul(rtc, enabled);
     492                 :            : #endif
     493                 :          0 :         return err;
     494                 :            : 
     495                 :            : }
     496                 :            : EXPORT_SYMBOL_GPL(rtc_update_irq_enable);
     497                 :            : 
     498                 :            : 
     499                 :            : /**
     500                 :            :  * rtc_handle_legacy_irq - AIE, UIE and PIE event hook
     501                 :            :  * @rtc: pointer to the rtc device
     502                 :            :  *
     503                 :            :  * This function is called when an AIE, UIE or PIE mode interrupt
     504                 :            :  * has occurred (or been emulated).
     505                 :            :  *
     506                 :            :  * Triggers the registered irq_task function callback.
     507                 :            :  */
     508                 :          0 : void rtc_handle_legacy_irq(struct rtc_device *rtc, int num, int mode)
     509                 :            : {
     510                 :            :         unsigned long flags;
     511                 :            : 
     512                 :            :         /* mark one irq of the appropriate mode */
     513                 :          0 :         spin_lock_irqsave(&rtc->irq_lock, flags);
     514                 :          0 :         rtc->irq_data = (rtc->irq_data + (num << 8)) | (RTC_IRQF|mode);
     515                 :            :         spin_unlock_irqrestore(&rtc->irq_lock, flags);
     516                 :            : 
     517                 :            :         /* call the task func */
     518                 :          0 :         spin_lock_irqsave(&rtc->irq_task_lock, flags);
     519         [ #  # ]:          0 :         if (rtc->irq_task)
     520                 :          0 :                 rtc->irq_task->func(rtc->irq_task->private_data);
     521                 :            :         spin_unlock_irqrestore(&rtc->irq_task_lock, flags);
     522                 :            : 
     523                 :          0 :         wake_up_interruptible(&rtc->irq_queue);
     524                 :          0 :         kill_fasync(&rtc->async_queue, SIGIO, POLL_IN);
     525                 :          0 : }
     526                 :            : 
     527                 :            : 
     528                 :            : /**
     529                 :            :  * rtc_aie_update_irq - AIE mode rtctimer hook
     530                 :            :  * @private: pointer to the rtc_device
     531                 :            :  *
     532                 :            :  * This functions is called when the aie_timer expires.
     533                 :            :  */
     534                 :          0 : void rtc_aie_update_irq(void *private)
     535                 :            : {
     536                 :            :         struct rtc_device *rtc = (struct rtc_device *)private;
     537                 :          0 :         rtc_handle_legacy_irq(rtc, 1, RTC_AF);
     538                 :          0 : }
     539                 :            : 
     540                 :            : 
     541                 :            : /**
     542                 :            :  * rtc_uie_update_irq - UIE mode rtctimer hook
     543                 :            :  * @private: pointer to the rtc_device
     544                 :            :  *
     545                 :            :  * This functions is called when the uie_timer expires.
     546                 :            :  */
     547                 :          0 : void rtc_uie_update_irq(void *private)
     548                 :            : {
     549                 :            :         struct rtc_device *rtc = (struct rtc_device *)private;
     550                 :          0 :         rtc_handle_legacy_irq(rtc, 1,  RTC_UF);
     551                 :          0 : }
     552                 :            : 
     553                 :            : 
     554                 :            : /**
     555                 :            :  * rtc_pie_update_irq - PIE mode hrtimer hook
     556                 :            :  * @timer: pointer to the pie mode hrtimer
     557                 :            :  *
     558                 :            :  * This function is used to emulate PIE mode interrupts
     559                 :            :  * using an hrtimer. This function is called when the periodic
     560                 :            :  * hrtimer expires.
     561                 :            :  */
     562                 :          0 : enum hrtimer_restart rtc_pie_update_irq(struct hrtimer *timer)
     563                 :            : {
     564                 :            :         struct rtc_device *rtc;
     565                 :            :         ktime_t period;
     566                 :            :         int count;
     567                 :          0 :         rtc = container_of(timer, struct rtc_device, pie_timer);
     568                 :            : 
     569                 :          0 :         period = ktime_set(0, NSEC_PER_SEC/rtc->irq_freq);
     570                 :          0 :         count = hrtimer_forward_now(timer, period);
     571                 :            : 
     572                 :          0 :         rtc_handle_legacy_irq(rtc, count, RTC_PF);
     573                 :            : 
     574                 :          0 :         return HRTIMER_RESTART;
     575                 :            : }
     576                 :            : 
     577                 :            : /**
     578                 :            :  * rtc_update_irq - Triggered when a RTC interrupt occurs.
     579                 :            :  * @rtc: the rtc device
     580                 :            :  * @num: how many irqs are being reported (usually one)
     581                 :            :  * @events: mask of RTC_IRQF with one or more of RTC_PF, RTC_AF, RTC_UF
     582                 :            :  * Context: any
     583                 :            :  */
     584                 :          0 : void rtc_update_irq(struct rtc_device *rtc,
     585                 :            :                 unsigned long num, unsigned long events)
     586                 :            : {
     587                 :          0 :         pm_stay_awake(rtc->dev.parent);
     588                 :          0 :         schedule_work(&rtc->irqwork);
     589                 :          0 : }
     590                 :            : EXPORT_SYMBOL_GPL(rtc_update_irq);
     591                 :            : 
     592                 :          0 : static int __rtc_match(struct device *dev, const void *data)
     593                 :            : {
     594                 :            :         const char *name = data;
     595                 :            : 
     596         [ -  - ]:          1 :         if (strcmp(dev_name(dev), name) == 0)
     597                 :            :                 return 1;
     598                 :          0 :         return 0;
     599                 :            : }
     600                 :            : 
     601                 :          0 : struct rtc_device *rtc_class_open(const char *name)
     602                 :            : {
     603                 :            :         struct device *dev;
     604                 :            :         struct rtc_device *rtc = NULL;
     605                 :            : 
     606                 :          1 :         dev = class_find_device(rtc_class, NULL, name, __rtc_match);
     607         [ +  - ]:          1 :         if (dev)
     608                 :            :                 rtc = to_rtc_device(dev);
     609                 :            : 
     610         [ +  - ]:          1 :         if (rtc) {
     611         [ -  + ]:          1 :                 if (!try_module_get(rtc->owner)) {
     612                 :          0 :                         put_device(dev);
     613                 :            :                         rtc = NULL;
     614                 :            :                 }
     615                 :            :         }
     616                 :            : 
     617                 :          0 :         return rtc;
     618                 :            : }
     619                 :            : EXPORT_SYMBOL_GPL(rtc_class_open);
     620                 :            : 
     621                 :          0 : void rtc_class_close(struct rtc_device *rtc)
     622                 :            : {
     623                 :          1 :         module_put(rtc->owner);
     624                 :          1 :         put_device(&rtc->dev);
     625                 :          1 : }
     626                 :            : EXPORT_SYMBOL_GPL(rtc_class_close);
     627                 :            : 
     628                 :          0 : int rtc_irq_register(struct rtc_device *rtc, struct rtc_task *task)
     629                 :            : {
     630                 :            :         int retval = -EBUSY;
     631                 :            : 
     632 [ #  # ][ #  # ]:          0 :         if (task == NULL || task->func == NULL)
     633                 :            :                 return -EINVAL;
     634                 :            : 
     635                 :            :         /* Cannot register while the char dev is in use */
     636         [ #  # ]:          0 :         if (test_and_set_bit_lock(RTC_DEV_BUSY, &rtc->flags))
     637                 :            :                 return -EBUSY;
     638                 :            : 
     639                 :            :         spin_lock_irq(&rtc->irq_task_lock);
     640         [ #  # ]:          0 :         if (rtc->irq_task == NULL) {
     641                 :          0 :                 rtc->irq_task = task;
     642                 :            :                 retval = 0;
     643                 :            :         }
     644                 :            :         spin_unlock_irq(&rtc->irq_task_lock);
     645                 :            : 
     646                 :          0 :         clear_bit_unlock(RTC_DEV_BUSY, &rtc->flags);
     647                 :            : 
     648                 :          0 :         return retval;
     649                 :            : }
     650                 :            : EXPORT_SYMBOL_GPL(rtc_irq_register);
     651                 :            : 
     652                 :          0 : void rtc_irq_unregister(struct rtc_device *rtc, struct rtc_task *task)
     653                 :            : {
     654                 :            :         spin_lock_irq(&rtc->irq_task_lock);
     655         [ #  # ]:          0 :         if (rtc->irq_task == task)
     656                 :          0 :                 rtc->irq_task = NULL;
     657                 :            :         spin_unlock_irq(&rtc->irq_task_lock);
     658                 :          0 : }
     659                 :            : EXPORT_SYMBOL_GPL(rtc_irq_unregister);
     660                 :            : 
     661                 :          0 : static int rtc_update_hrtimer(struct rtc_device *rtc, int enabled)
     662                 :            : {
     663                 :            :         /*
     664                 :            :          * We always cancel the timer here first, because otherwise
     665                 :            :          * we could run into BUG_ON(timer->state != HRTIMER_STATE_CALLBACK);
     666                 :            :          * when we manage to start the timer before the callback
     667                 :            :          * returns HRTIMER_RESTART.
     668                 :            :          *
     669                 :            :          * We cannot use hrtimer_cancel() here as a running callback
     670                 :            :          * could be blocked on rtc->irq_task_lock and hrtimer_cancel()
     671                 :            :          * would spin forever.
     672                 :            :          */
     673         [ #  # ]:          0 :         if (hrtimer_try_to_cancel(&rtc->pie_timer) < 0)
     674                 :            :                 return -1;
     675                 :            : 
     676         [ #  # ]:          0 :         if (enabled) {
     677                 :          0 :                 ktime_t period = ktime_set(0, NSEC_PER_SEC / rtc->irq_freq);
     678                 :            : 
     679                 :          0 :                 hrtimer_start(&rtc->pie_timer, period, HRTIMER_MODE_REL);
     680                 :            :         }
     681                 :            :         return 0;
     682                 :            : }
     683                 :            : 
     684                 :            : /**
     685                 :            :  * rtc_irq_set_state - enable/disable 2^N Hz periodic IRQs
     686                 :            :  * @rtc: the rtc device
     687                 :            :  * @task: currently registered with rtc_irq_register()
     688                 :            :  * @enabled: true to enable periodic IRQs
     689                 :            :  * Context: any
     690                 :            :  *
     691                 :            :  * Note that rtc_irq_set_freq() should previously have been used to
     692                 :            :  * specify the desired frequency of periodic IRQ task->func() callbacks.
     693                 :            :  */
     694                 :          0 : int rtc_irq_set_state(struct rtc_device *rtc, struct rtc_task *task, int enabled)
     695                 :            : {
     696                 :            :         int err = 0;
     697                 :            :         unsigned long flags;
     698                 :            : 
     699                 :            : retry:
     700                 :          0 :         spin_lock_irqsave(&rtc->irq_task_lock, flags);
     701 [ #  # ][ #  # ]:          0 :         if (rtc->irq_task != NULL && task == NULL)
     702                 :            :                 err = -EBUSY;
     703         [ #  # ]:          0 :         else if (rtc->irq_task != task)
     704                 :            :                 err = -EACCES;
     705                 :            :         else {
     706         [ #  # ]:          0 :                 if (rtc_update_hrtimer(rtc, enabled) < 0) {
     707                 :            :                         spin_unlock_irqrestore(&rtc->irq_task_lock, flags);
     708                 :          0 :                         cpu_relax();
     709                 :          0 :                         goto retry;
     710                 :            :                 }
     711                 :          0 :                 rtc->pie_enabled = enabled;
     712                 :            :         }
     713                 :            :         spin_unlock_irqrestore(&rtc->irq_task_lock, flags);
     714                 :          0 :         return err;
     715                 :            : }
     716                 :            : EXPORT_SYMBOL_GPL(rtc_irq_set_state);
     717                 :            : 
     718                 :            : /**
     719                 :            :  * rtc_irq_set_freq - set 2^N Hz periodic IRQ frequency for IRQ
     720                 :            :  * @rtc: the rtc device
     721                 :            :  * @task: currently registered with rtc_irq_register()
     722                 :            :  * @freq: positive frequency with which task->func() will be called
     723                 :            :  * Context: any
     724                 :            :  *
     725                 :            :  * Note that rtc_irq_set_state() is used to enable or disable the
     726                 :            :  * periodic IRQs.
     727                 :            :  */
     728                 :          0 : int rtc_irq_set_freq(struct rtc_device *rtc, struct rtc_task *task, int freq)
     729                 :            : {
     730                 :            :         int err = 0;
     731                 :            :         unsigned long flags;
     732                 :            : 
     733         [ #  # ]:          0 :         if (freq <= 0 || freq > RTC_MAX_FREQ)
     734                 :            :                 return -EINVAL;
     735                 :            : retry:
     736                 :          0 :         spin_lock_irqsave(&rtc->irq_task_lock, flags);
     737 [ #  # ][ #  # ]:          0 :         if (rtc->irq_task != NULL && task == NULL)
     738                 :            :                 err = -EBUSY;
     739         [ #  # ]:          0 :         else if (rtc->irq_task != task)
     740                 :            :                 err = -EACCES;
     741                 :            :         else {
     742                 :          0 :                 rtc->irq_freq = freq;
     743 [ #  # ][ #  # ]:          0 :                 if (rtc->pie_enabled && rtc_update_hrtimer(rtc, 1) < 0) {
     744                 :            :                         spin_unlock_irqrestore(&rtc->irq_task_lock, flags);
     745                 :          0 :                         cpu_relax();
     746                 :          0 :                         goto retry;
     747                 :            :                 }
     748                 :            :         }
     749                 :            :         spin_unlock_irqrestore(&rtc->irq_task_lock, flags);
     750                 :          0 :         return err;
     751                 :            : }
     752                 :            : EXPORT_SYMBOL_GPL(rtc_irq_set_freq);
     753                 :            : 
     754                 :            : /**
     755                 :            :  * rtc_timer_enqueue - Adds a rtc_timer to the rtc_device timerqueue
     756                 :            :  * @rtc rtc device
     757                 :            :  * @timer timer being added.
     758                 :            :  *
     759                 :            :  * Enqueues a timer onto the rtc devices timerqueue and sets
     760                 :            :  * the next alarm event appropriately.
     761                 :            :  *
     762                 :            :  * Sets the enabled bit on the added timer.
     763                 :            :  *
     764                 :            :  * Must hold ops_lock for proper serialization of timerqueue
     765                 :            :  */
     766                 :          0 : static int rtc_timer_enqueue(struct rtc_device *rtc, struct rtc_timer *timer)
     767                 :            : {
     768                 :          0 :         timer->enabled = 1;
     769                 :          0 :         timerqueue_add(&rtc->timerqueue, &timer->node);
     770         [ #  # ]:          0 :         if (&timer->node == timerqueue_getnext(&rtc->timerqueue)) {
     771                 :            :                 struct rtc_wkalrm alarm;
     772                 :            :                 int err;
     773                 :          0 :                 alarm.time = rtc_ktime_to_tm(timer->node.expires);
     774                 :          0 :                 alarm.enabled = 1;
     775                 :          0 :                 err = __rtc_set_alarm(rtc, &alarm);
     776         [ #  # ]:          0 :                 if (err == -ETIME) {
     777                 :          0 :                         pm_stay_awake(rtc->dev.parent);
     778                 :          0 :                         schedule_work(&rtc->irqwork);
     779         [ #  # ]:          0 :                 } else if (err) {
     780                 :          0 :                         timerqueue_del(&rtc->timerqueue, &timer->node);
     781                 :          0 :                         timer->enabled = 0;
     782                 :          0 :                         return err;
     783                 :            :                 }
     784                 :            :         }
     785                 :            :         return 0;
     786                 :            : }
     787                 :            : 
     788                 :            : static void rtc_alarm_disable(struct rtc_device *rtc)
     789                 :            : {
     790 [ +  - ][ +  - ]:          1 :         if (!rtc->ops || !rtc->ops->alarm_irq_enable)
         [ #  # ][ #  # ]
     791                 :            :                 return;
     792                 :            : 
     793                 :          1 :         rtc->ops->alarm_irq_enable(rtc->dev.parent, false);
     794                 :            : }
     795                 :            : 
     796                 :            : /**
     797                 :            :  * rtc_timer_remove - Removes a rtc_timer from the rtc_device timerqueue
     798                 :            :  * @rtc rtc device
     799                 :            :  * @timer timer being removed.
     800                 :            :  *
     801                 :            :  * Removes a timer onto the rtc devices timerqueue and sets
     802                 :            :  * the next alarm event appropriately.
     803                 :            :  *
     804                 :            :  * Clears the enabled bit on the removed timer.
     805                 :            :  *
     806                 :            :  * Must hold ops_lock for proper serialization of timerqueue
     807                 :            :  */
     808                 :          0 : static void rtc_timer_remove(struct rtc_device *rtc, struct rtc_timer *timer)
     809                 :            : {
     810                 :          0 :         struct timerqueue_node *next = timerqueue_getnext(&rtc->timerqueue);
     811                 :          0 :         timerqueue_del(&rtc->timerqueue, &timer->node);
     812                 :          0 :         timer->enabled = 0;
     813         [ #  # ]:          0 :         if (next == &timer->node) {
     814                 :            :                 struct rtc_wkalrm alarm;
     815                 :            :                 int err;
     816                 :            :                 next = timerqueue_getnext(&rtc->timerqueue);
     817         [ #  # ]:          0 :                 if (!next) {
     818                 :            :                         rtc_alarm_disable(rtc);
     819                 :          0 :                         return;
     820                 :            :                 }
     821                 :          0 :                 alarm.time = rtc_ktime_to_tm(next->expires);
     822                 :          0 :                 alarm.enabled = 1;
     823                 :          0 :                 err = __rtc_set_alarm(rtc, &alarm);
     824         [ #  # ]:          0 :                 if (err == -ETIME) {
     825                 :          0 :                         pm_stay_awake(rtc->dev.parent);
     826                 :          0 :                         schedule_work(&rtc->irqwork);
     827                 :            :                 }
     828                 :            :         }
     829                 :            : }
     830                 :            : 
     831                 :            : /**
     832                 :            :  * rtc_timer_do_work - Expires rtc timers
     833                 :            :  * @rtc rtc device
     834                 :            :  * @timer timer being removed.
     835                 :            :  *
     836                 :            :  * Expires rtc timers. Reprograms next alarm event if needed.
     837                 :            :  * Called via worktask.
     838                 :            :  *
     839                 :            :  * Serializes access to timerqueue via ops_lock mutex
     840                 :            :  */
     841                 :          0 : void rtc_timer_do_work(struct work_struct *work)
     842                 :            : {
     843                 :            :         struct rtc_timer *timer;
     844                 :            :         struct timerqueue_node *next;
     845                 :            :         ktime_t now;
     846                 :            :         struct rtc_time tm;
     847                 :            : 
     848                 :          2 :         struct rtc_device *rtc =
     849                 :            :                 container_of(work, struct rtc_device, irqwork);
     850                 :            : 
     851                 :          1 :         mutex_lock(&rtc->ops_lock);
     852                 :            : again:
     853                 :          1 :         __rtc_read_time(rtc, &tm);
     854                 :          1 :         now = rtc_tm_to_ktime(tm);
     855         [ -  + ]:          2 :         while ((next = timerqueue_getnext(&rtc->timerqueue))) {
     856         [ #  # ]:          0 :                 if (next->expires.tv64 > now.tv64)
     857                 :            :                         break;
     858                 :            : 
     859                 :            :                 /* expire timer */
     860                 :            :                 timer = container_of(next, struct rtc_timer, node);
     861                 :          0 :                 timerqueue_del(&rtc->timerqueue, &timer->node);
     862                 :          0 :                 timer->enabled = 0;
     863         [ #  # ]:          0 :                 if (timer->task.func)
     864                 :          0 :                         timer->task.func(timer->task.private_data);
     865                 :            : 
     866                 :            :                 /* Re-add/fwd periodic timers */
     867         [ #  # ]:          0 :                 if (ktime_to_ns(timer->period)) {
     868                 :          0 :                         timer->node.expires = ktime_add(timer->node.expires,
     869                 :            :                                                         timer->period);
     870                 :          0 :                         timer->enabled = 1;
     871                 :          1 :                         timerqueue_add(&rtc->timerqueue, &timer->node);
     872                 :            :                 }
     873                 :            :         }
     874                 :            : 
     875                 :            :         /* Set next alarm */
     876         [ -  + ]:          1 :         if (next) {
     877                 :            :                 struct rtc_wkalrm alarm;
     878                 :            :                 int err;
     879                 :          0 :                 alarm.time = rtc_ktime_to_tm(next->expires);
     880                 :          0 :                 alarm.enabled = 1;
     881                 :          0 :                 err = __rtc_set_alarm(rtc, &alarm);
     882         [ #  # ]:          0 :                 if (err == -ETIME)
     883                 :            :                         goto again;
     884                 :            :         } else
     885                 :            :                 rtc_alarm_disable(rtc);
     886                 :            : 
     887                 :          1 :         pm_relax(rtc->dev.parent);
     888                 :          1 :         mutex_unlock(&rtc->ops_lock);
     889                 :          1 : }
     890                 :            : 
     891                 :            : 
     892                 :            : /* rtc_timer_init - Initializes an rtc_timer
     893                 :            :  * @timer: timer to be intiialized
     894                 :            :  * @f: function pointer to be called when timer fires
     895                 :            :  * @data: private data passed to function pointer
     896                 :            :  *
     897                 :            :  * Kernel interface to initializing an rtc_timer.
     898                 :            :  */
     899                 :          0 : void rtc_timer_init(struct rtc_timer *timer, void (*f)(void *p), void *data)
     900                 :            : {
     901                 :            :         timerqueue_init(&timer->node);
     902                 :          0 :         timer->enabled = 0;
     903                 :          0 :         timer->task.func = f;
     904                 :          0 :         timer->task.private_data = data;
     905                 :          0 : }
     906                 :            : 
     907                 :            : /* rtc_timer_start - Sets an rtc_timer to fire in the future
     908                 :            :  * @ rtc: rtc device to be used
     909                 :            :  * @ timer: timer being set
     910                 :            :  * @ expires: time at which to expire the timer
     911                 :            :  * @ period: period that the timer will recur
     912                 :            :  *
     913                 :            :  * Kernel interface to set an rtc_timer
     914                 :            :  */
     915                 :          0 : int rtc_timer_start(struct rtc_device *rtc, struct rtc_timer *timer,
     916                 :            :                         ktime_t expires, ktime_t period)
     917                 :            : {
     918                 :            :         int ret = 0;
     919                 :          0 :         mutex_lock(&rtc->ops_lock);
     920         [ #  # ]:          0 :         if (timer->enabled)
     921                 :          0 :                 rtc_timer_remove(rtc, timer);
     922                 :            : 
     923                 :          0 :         timer->node.expires = expires;
     924                 :          0 :         timer->period = period;
     925                 :            : 
     926                 :          0 :         ret = rtc_timer_enqueue(rtc, timer);
     927                 :            : 
     928                 :          0 :         mutex_unlock(&rtc->ops_lock);
     929                 :          0 :         return ret;
     930                 :            : }
     931                 :            : 
     932                 :            : /* rtc_timer_cancel - Stops an rtc_timer
     933                 :            :  * @ rtc: rtc device to be used
     934                 :            :  * @ timer: timer being set
     935                 :            :  *
     936                 :            :  * Kernel interface to cancel an rtc_timer
     937                 :            :  */
     938                 :          0 : int rtc_timer_cancel(struct rtc_device *rtc, struct rtc_timer *timer)
     939                 :            : {
     940                 :            :         int ret = 0;
     941                 :          0 :         mutex_lock(&rtc->ops_lock);
     942         [ #  # ]:          0 :         if (timer->enabled)
     943                 :          0 :                 rtc_timer_remove(rtc, timer);
     944                 :          0 :         mutex_unlock(&rtc->ops_lock);
     945                 :          0 :         return ret;
     946                 :            : }
     947                 :            : 
     948                 :            : 

Generated by: LCOV version 1.9