xref: /netbsd-src/sys/arch/evbarm/ifpga/pl030_rtc.c (revision 471e528b58841f80a6977ea6d561b7723eef3428)
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