The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/arm/nvidia/as3722_rtc.c

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 /*-
    2  * Copyright (c) 2016 Michal Meloun <mmel@FreeBSD.org>
    3  * All rights reserved.
    4  *
    5  * Redistribution and use in source and binary forms, with or without
    6  * modification, are permitted provided that the following conditions
    7  * are met:
    8  * 1. Redistributions of source code must retain the above copyright
    9  *    notice, this list of conditions and the following disclaimer.
   10  * 2. Redistributions in binary form must reproduce the above copyright
   11  *    notice, this list of conditions and the following disclaimer in the
   12  *    documentation and/or other materials provided with the distribution.
   13  *
   14  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
   15  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   16  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
   17  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
   18  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
   19  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
   20  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   21  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
   22  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
   23  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   24  * SUCH DAMAGE.
   25  */
   26 
   27 #include <sys/cdefs.h>
   28 __FBSDID("$FreeBSD$");
   29 
   30 #include <sys/param.h>
   31 #include <sys/systm.h>
   32 #include <sys/bus.h>
   33 #include <sys/clock.h>
   34 #include <sys/kernel.h>
   35 
   36 #include <dev/ofw/ofw_bus.h>
   37 
   38 #include "clock_if.h"
   39 #include "as3722.h"
   40 
   41 #define AS3722_RTC_START_YEAR   2000
   42 
   43 int
   44 as3722_rtc_gettime(device_t dev, struct timespec *ts)
   45 {
   46         struct as3722_softc *sc;
   47         struct clocktime ct;
   48         uint8_t buf[6];
   49         int rv;
   50 
   51         sc = device_get_softc(dev);
   52 
   53         rv = as3722_read_buf(sc, AS3722_RTC_SECOND, buf, 6);
   54         if (rv != 0) {
   55                 device_printf(sc->dev, "Failed to read RTC data\n");
   56                 return (rv);
   57         }
   58         ct.nsec = 0;
   59         ct.sec = bcd2bin(buf[0] & 0x7F);
   60         ct.min = bcd2bin(buf[1] & 0x7F);
   61         ct.hour = bcd2bin(buf[2] & 0x3F);
   62         ct.day = bcd2bin(buf[3] & 0x3F);
   63         ct.mon = bcd2bin(buf[4] & 0x1F);
   64         ct.year = bcd2bin(buf[5] & 0x7F) + AS3722_RTC_START_YEAR;
   65         ct.dow = -1;
   66 
   67         return clock_ct_to_ts(&ct, ts);
   68 }
   69 
   70 int
   71 as3722_rtc_settime(device_t dev, struct timespec *ts)
   72 {
   73         struct as3722_softc *sc;
   74         struct clocktime ct;
   75         uint8_t buf[6];
   76         int rv;
   77 
   78         sc = device_get_softc(dev);
   79         clock_ts_to_ct(ts, &ct);
   80 
   81         if (ct.year < AS3722_RTC_START_YEAR)
   82                 return (EINVAL);
   83 
   84         buf[0] = bin2bcd(ct.sec);
   85         buf[1] = bin2bcd(ct.min);
   86         buf[2] = bin2bcd(ct.hour);
   87         buf[3] = bin2bcd(ct.day);
   88         buf[4] = bin2bcd(ct.mon);
   89         buf[5] = bin2bcd(ct.year - AS3722_RTC_START_YEAR);
   90 
   91         rv = as3722_write_buf(sc, AS3722_RTC_SECOND, buf, 6);
   92         if (rv != 0) {
   93                 device_printf(sc->dev, "Failed to write RTC data\n");
   94                 return (rv);
   95         }
   96         return (0);
   97 }
   98 
   99 int
  100 as3722_rtc_attach(struct as3722_softc *sc, phandle_t node)
  101 {
  102         int rv;
  103 
  104         /* Enable RTC, set 24 hours mode  and alarms */
  105         rv = RM1(sc, AS3722_RTC_CONTROL,
  106             AS3722_RTC_ON | AS3722_RTC_ALARM_WAKEUP_EN | AS3722_RTC_AM_PM_MODE,
  107             AS3722_RTC_ON | AS3722_RTC_ALARM_WAKEUP_EN);
  108         if (rv < 0) {
  109                 device_printf(sc->dev, "Failed to initialize RTC controller\n");
  110                 return (ENXIO);
  111         }
  112         clock_register(sc->dev, 1000000);
  113 
  114         return (0);
  115 }

Cache object: 741fa44083ff46a85f8395f83d1d91b1


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.