1*471e528bStsutsui /* $NetBSD: pl030_rtc.c,v 1.10 2009/12/12 14:44:09 tsutsui Exp $ */
200a19affSrearnsha
300a19affSrearnsha /*
400a19affSrearnsha * Copyright (c) 2001 ARM Ltd
500a19affSrearnsha * All rights reserved.
600a19affSrearnsha *
700a19affSrearnsha * Redistribution and use in source and binary forms, with or without
800a19affSrearnsha * modification, are permitted provided that the following conditions
900a19affSrearnsha * are met:
1000a19affSrearnsha * 1. Redistributions of source code must retain the above copyright
1100a19affSrearnsha * notice, this list of conditions and the following disclaimer.
1200a19affSrearnsha * 2. Redistributions in binary form must reproduce the above copyright
1300a19affSrearnsha * notice, this list of conditions and the following disclaimer in the
1400a19affSrearnsha * documentation and/or other materials provided with the distribution.
1500a19affSrearnsha * 3. The name of the company may not be used to endorse or promote
1600a19affSrearnsha * products derived from this software without specific prior written
1700a19affSrearnsha * permission.
1800a19affSrearnsha *
1900a19affSrearnsha * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
2000a19affSrearnsha * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
2100a19affSrearnsha * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
2200a19affSrearnsha * IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
2300a19affSrearnsha * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
2400a19affSrearnsha * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
2500a19affSrearnsha * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2600a19affSrearnsha * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2700a19affSrearnsha * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
2800a19affSrearnsha * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
2900a19affSrearnsha * SUCH DAMAGE.
3000a19affSrearnsha */
3100a19affSrearnsha
3200a19affSrearnsha /* Include header files */
3300a19affSrearnsha
3408716eaeSlukem #include <sys/cdefs.h>
35*471e528bStsutsui __KERNEL_RCSID(0, "$NetBSD: pl030_rtc.c,v 1.10 2009/12/12 14:44:09 tsutsui Exp $");
3608716eaeSlukem
3700a19affSrearnsha #include <sys/types.h>
3800a19affSrearnsha #include <sys/param.h>
3900a19affSrearnsha #include <sys/systm.h>
4000a19affSrearnsha #include <sys/kernel.h>
4100a19affSrearnsha #include <sys/time.h>
4200a19affSrearnsha #include <sys/device.h>
4300a19affSrearnsha
44370a7a67Sbriggs #include <dev/clock_subr.h>
45370a7a67Sbriggs
4696959902Sthorpej #include <arm/cpufunc.h>
4700a19affSrearnsha #include <machine/intr.h>
4800a19affSrearnsha #include <evbarm/ifpga/ifpgavar.h>
4900a19affSrearnsha #include <evbarm/ifpga/ifpgamem.h>
5000a19affSrearnsha #include <evbarm/ifpga/ifpgareg.h>
5100a19affSrearnsha
5200a19affSrearnsha #define PL030_RTC_SIZE 0x14
5300a19affSrearnsha
5400a19affSrearnsha struct plrtc_softc {
5500a19affSrearnsha bus_space_tag_t sc_iot;
5600a19affSrearnsha bus_space_handle_t sc_ioh;
57370a7a67Sbriggs struct todr_chip_handle sc_todr;
5800a19affSrearnsha };
5900a19affSrearnsha
6057ba504bSdyoung static int plrtc_probe (device_t, cfdata_t, void *);
6157ba504bSdyoung static void plrtc_attach (device_t, device_t, void *);
6200a19affSrearnsha
6357ba504bSdyoung CFATTACH_DECL_NEW(plrtc, sizeof(struct plrtc_softc),
64c5e91d44Sthorpej plrtc_probe, plrtc_attach, NULL, NULL);
6500a19affSrearnsha
66370a7a67Sbriggs static int
plrtc_gettime(todr_chip_handle_t todr,struct timeval * tv)67*471e528bStsutsui plrtc_gettime(todr_chip_handle_t todr, struct timeval *tv)
68370a7a67Sbriggs {
69370a7a67Sbriggs struct plrtc_softc *sc;
7000a19affSrearnsha
71370a7a67Sbriggs sc = (struct plrtc_softc *)todr->cookie;
72370a7a67Sbriggs tv->tv_sec = bus_space_read_4(sc->sc_iot, sc->sc_ioh, IFPGA_RTC_DR);
73370a7a67Sbriggs /* initialize tv_usec? */
74370a7a67Sbriggs return 0;
75370a7a67Sbriggs }
76370a7a67Sbriggs
77370a7a67Sbriggs static int
plrtc_settime(todr_chip_handle_t todr,struct timeval * tv)78*471e528bStsutsui plrtc_settime(todr_chip_handle_t todr, struct timeval *tv)
79370a7a67Sbriggs {
80370a7a67Sbriggs struct plrtc_softc *sc;
81370a7a67Sbriggs
82370a7a67Sbriggs sc = (struct plrtc_softc *)todr->cookie;
83370a7a67Sbriggs bus_space_write_4(sc->sc_iot, sc->sc_ioh, IFPGA_RTC_LR, tv->tv_sec);
84370a7a67Sbriggs return 0;
85370a7a67Sbriggs }
8600a19affSrearnsha
8700a19affSrearnsha static int
plrtc_probe(device_t parent,cfdata_t cf,void * aux)8857ba504bSdyoung plrtc_probe(device_t parent, cfdata_t cf, void *aux)
8900a19affSrearnsha {
9000a19affSrearnsha return 1;
9100a19affSrearnsha }
9200a19affSrearnsha
9300a19affSrearnsha static void
plrtc_attach(device_t parent,device_t self,void * aux)9457ba504bSdyoung plrtc_attach(device_t parent, device_t self, void *aux)
9500a19affSrearnsha {
9600a19affSrearnsha struct ifpga_attach_args *ifa = aux;
9757ba504bSdyoung struct plrtc_softc *sc = device_private(self);
9800a19affSrearnsha
9900a19affSrearnsha sc->sc_iot = ifa->ifa_iot;
10000a19affSrearnsha if (bus_space_map(ifa->ifa_iot, ifa->ifa_addr, PL030_RTC_SIZE, 0,
10100a19affSrearnsha &sc->sc_ioh)) {
10257ba504bSdyoung printf("%s: unable to map device\n", device_xname(self));
10300a19affSrearnsha return;
10400a19affSrearnsha }
10500a19affSrearnsha
106370a7a67Sbriggs memset(&sc->sc_todr, 0, sizeof(struct todr_chip_handle));
107370a7a67Sbriggs sc->sc_todr.cookie = sc;
108370a7a67Sbriggs sc->sc_todr.todr_gettime = plrtc_gettime;
109370a7a67Sbriggs sc->sc_todr.todr_settime = plrtc_settime;
110370a7a67Sbriggs
111370a7a67Sbriggs todr_attach( &sc->sc_todr );
11200a19affSrearnsha
11300a19affSrearnsha printf("\n");
11400a19affSrearnsha }
115