Home | History | Annotate | Line # | Download | only in ap_ms104_sh4
rs5c316_mainbus.c revision 1.1.14.1
      1  1.1.14.1    yamt /*	$NetBSD: rs5c316_mainbus.c,v 1.1.14.1 2012/04/17 00:06:19 yamt Exp $	*/
      2       1.1  nonaka 
      3       1.1  nonaka /*-
      4  1.1.14.1    yamt  * Copyright (C) 2009 NONAKA Kimihiro <nonaka (at) netbsd.org>
      5       1.1  nonaka  * All rights reserved.
      6       1.1  nonaka  *
      7       1.1  nonaka  * Redistribution and use in source and binary forms, with or without
      8       1.1  nonaka  * modification, are permitted provided that the following conditions
      9       1.1  nonaka  * are met:
     10       1.1  nonaka  * 1. Redistributions of source code must retain the above copyright
     11       1.1  nonaka  *    notice, this list of conditions and the following disclaimer.
     12       1.1  nonaka  * 2. Redistributions in binary form must reproduce the above copyright
     13       1.1  nonaka  *    notice, this list of conditions and the following disclaimer in the
     14       1.1  nonaka  *    documentation and/or other materials provided with the distribution.
     15       1.1  nonaka  *
     16  1.1.14.1    yamt  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
     17  1.1.14.1    yamt  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
     18  1.1.14.1    yamt  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
     19  1.1.14.1    yamt  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
     20  1.1.14.1    yamt  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
     21  1.1.14.1    yamt  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     22  1.1.14.1    yamt  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     23  1.1.14.1    yamt  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     24  1.1.14.1    yamt  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
     25  1.1.14.1    yamt  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     26       1.1  nonaka  */
     27       1.1  nonaka 
     28       1.1  nonaka #include <sys/cdefs.h>
     29  1.1.14.1    yamt __KERNEL_RCSID(0, "$NetBSD: rs5c316_mainbus.c,v 1.1.14.1 2012/04/17 00:06:19 yamt Exp $");
     30       1.1  nonaka 
     31       1.1  nonaka #include <sys/param.h>
     32       1.1  nonaka #include <sys/systm.h>
     33       1.1  nonaka #include <sys/device.h>
     34       1.1  nonaka #include <sys/kernel.h>
     35       1.1  nonaka 
     36       1.1  nonaka #include <dev/clock_subr.h>
     37       1.1  nonaka #include <dev/ic/rs5c313var.h>
     38       1.1  nonaka 
     39       1.1  nonaka #include <machine/autoconf.h>
     40       1.1  nonaka 
     41       1.1  nonaka #include <sh3/devreg.h>
     42       1.1  nonaka #include <sh3/pfcreg.h>
     43       1.1  nonaka 
     44       1.1  nonaka #include <evbsh3/ap_ms104_sh4/ap_ms104_sh4reg.h>
     45       1.1  nonaka #include <evbsh3/ap_ms104_sh4/ap_ms104_sh4var.h>
     46       1.1  nonaka 
     47       1.1  nonaka /* chip access methods */
     48       1.1  nonaka static void rtc_begin(struct rs5c313_softc *);
     49       1.1  nonaka static void rtc_ce(struct rs5c313_softc *, int);
     50       1.1  nonaka static void rtc_dir(struct rs5c313_softc *, int);
     51       1.1  nonaka static void rtc_clk(struct rs5c313_softc *, int);
     52       1.1  nonaka static int  rtc_read(struct rs5c313_softc *);
     53       1.1  nonaka static void rtc_write(struct rs5c313_softc *, int);
     54       1.1  nonaka 
     55       1.1  nonaka static struct rs5c313_ops rs5c316_mainbus_ops = {
     56       1.1  nonaka 	.rs5c313_op_begin = rtc_begin,
     57       1.1  nonaka 	.rs5c313_op_ce    = rtc_ce,
     58       1.1  nonaka 	.rs5c313_op_clk   = rtc_clk,
     59       1.1  nonaka 	.rs5c313_op_dir   = rtc_dir,
     60       1.1  nonaka 	.rs5c313_op_read  = rtc_read,
     61       1.1  nonaka 	.rs5c313_op_write = rtc_write,
     62       1.1  nonaka };
     63       1.1  nonaka 
     64       1.1  nonaka /* autoconf glue */
     65       1.1  nonaka static int rs5c316_mainbus_match(device_t, cfdata_t, void *);
     66       1.1  nonaka static void rs5c316_mainbus_attach(device_t, device_t, void *);
     67       1.1  nonaka 
     68       1.1  nonaka CFATTACH_DECL_NEW(rs5c313_mainbus, sizeof(struct rs5c313_softc),
     69       1.1  nonaka     rs5c316_mainbus_match, rs5c316_mainbus_attach, NULL, NULL);
     70       1.1  nonaka 
     71       1.1  nonaka #define ndelay(x) delay(((x) + 999) / 1000)
     72       1.1  nonaka 
     73       1.1  nonaka static int
     74       1.1  nonaka rs5c316_mainbus_match(device_t parent, cfdata_t cf, void *aux)
     75       1.1  nonaka {
     76       1.1  nonaka 	struct mainbus_attach_args *maa = (struct mainbus_attach_args *)aux;
     77       1.1  nonaka 
     78       1.1  nonaka 	if (strcmp(maa->ma_name, "rs5c313rtc") != 0)
     79       1.1  nonaka 		return 0;
     80       1.1  nonaka 	return 1;
     81       1.1  nonaka }
     82       1.1  nonaka 
     83       1.1  nonaka 
     84       1.1  nonaka static void
     85       1.1  nonaka rs5c316_mainbus_attach(device_t parent, device_t self, void *aux)
     86       1.1  nonaka {
     87       1.1  nonaka 	struct rs5c313_softc *sc = device_private(self);
     88       1.1  nonaka 	uint32_t reg;
     89       1.1  nonaka 
     90       1.1  nonaka 	sc->sc_dev = self;
     91       1.1  nonaka 	sc->sc_model = MODEL_5C316;
     92       1.1  nonaka 	sc->sc_ops = &rs5c316_mainbus_ops;
     93       1.1  nonaka 
     94       1.1  nonaka 	/* setup gpio pin */
     95       1.1  nonaka 	reg = _reg_read_4(SH4_PCTRA);
     96       1.1  nonaka 	reg &= ~(3 << (GPIO_PIN_RTC_CE * 2));
     97       1.1  nonaka 	reg |=  (1 << (GPIO_PIN_RTC_CE * 2));	/* output */
     98       1.1  nonaka 	reg &= ~(3 << (GPIO_PIN_RTC_SCLK * 2));
     99       1.1  nonaka 	reg |=  (1 << (GPIO_PIN_RTC_SCLK * 2));	/* output */
    100       1.1  nonaka 	reg &= ~(3 << (GPIO_PIN_RTC_SIO * 2));
    101       1.1  nonaka 	reg |=  (1 << (GPIO_PIN_RTC_SIO * 2));	/* output */
    102       1.1  nonaka 	_reg_write_4(SH4_PCTRA, reg);
    103       1.1  nonaka 
    104       1.1  nonaka 	rs5c313_attach(sc);
    105       1.1  nonaka }
    106       1.1  nonaka 
    107       1.1  nonaka static void
    108       1.1  nonaka rtc_begin(struct rs5c313_softc *sc)
    109       1.1  nonaka {
    110       1.1  nonaka 
    111       1.1  nonaka 	/* nothing to do */
    112       1.1  nonaka }
    113       1.1  nonaka 
    114       1.1  nonaka static void
    115       1.1  nonaka rtc_ce(struct rs5c313_softc *sc, int onoff)
    116       1.1  nonaka {
    117       1.1  nonaka 	uint16_t
    118       1.1  nonaka 
    119       1.1  nonaka 	reg = _reg_read_2(SH4_PDTRA);
    120       1.1  nonaka 	if (onoff) {
    121       1.1  nonaka 		reg |= (1 << GPIO_PIN_RTC_CE);
    122       1.1  nonaka 	} else {
    123       1.1  nonaka 		reg &= ~(1 << GPIO_PIN_RTC_CE);
    124       1.1  nonaka 	}
    125       1.1  nonaka 	_reg_write_2(SH4_PDTRA, reg);
    126       1.1  nonaka 	ndelay(600);
    127       1.1  nonaka }
    128       1.1  nonaka 
    129       1.1  nonaka static void
    130       1.1  nonaka rtc_clk(struct rs5c313_softc *sc, int onoff)
    131       1.1  nonaka {
    132       1.1  nonaka 	uint16_t reg;
    133       1.1  nonaka 
    134       1.1  nonaka 	reg = _reg_read_2(SH4_PDTRA);
    135       1.1  nonaka 	if (onoff) {
    136       1.1  nonaka 		reg |= (1 << GPIO_PIN_RTC_SCLK);
    137       1.1  nonaka 	} else {
    138       1.1  nonaka 		reg &= ~(1 << GPIO_PIN_RTC_SCLK);
    139       1.1  nonaka 	}
    140       1.1  nonaka 	_reg_write_2(SH4_PDTRA, reg);
    141       1.1  nonaka }
    142       1.1  nonaka 
    143       1.1  nonaka static void
    144       1.1  nonaka rtc_dir(struct rs5c313_softc *sc, int output)
    145       1.1  nonaka {
    146       1.1  nonaka 	uint32_t reg;
    147       1.1  nonaka 
    148       1.1  nonaka 	reg = _reg_read_4(SH4_PCTRA);
    149       1.1  nonaka 	reg &= ~(3 << (GPIO_PIN_RTC_SIO * 2));		/* input */
    150       1.1  nonaka 	if (output) {
    151       1.1  nonaka 		reg |=  (1 << (GPIO_PIN_RTC_SIO * 2));	/* output */
    152       1.1  nonaka 	}
    153       1.1  nonaka 	_reg_write_4(SH4_PCTRA, reg);
    154       1.1  nonaka }
    155       1.1  nonaka 
    156       1.1  nonaka static int
    157       1.1  nonaka rtc_read(struct rs5c313_softc *sc)
    158       1.1  nonaka {
    159       1.1  nonaka 	int bit;
    160       1.1  nonaka 
    161       1.1  nonaka 	ndelay(300);
    162       1.1  nonaka 
    163       1.1  nonaka 	bit = (_reg_read_2(SH4_PDTRA) & (1 << GPIO_PIN_RTC_SIO)) ? 1 : 0;
    164       1.1  nonaka 
    165       1.1  nonaka 	rtc_clk(sc, 0);
    166       1.1  nonaka 	ndelay(300);
    167       1.1  nonaka 	rtc_clk(sc, 1);
    168       1.1  nonaka 
    169       1.1  nonaka 	return bit;
    170       1.1  nonaka }
    171       1.1  nonaka 
    172       1.1  nonaka static void
    173       1.1  nonaka rtc_write(struct rs5c313_softc *sc, int bit)
    174       1.1  nonaka {
    175       1.1  nonaka 	uint16_t reg;
    176       1.1  nonaka 
    177       1.1  nonaka 	reg = _reg_read_2(SH4_PDTRA);
    178       1.1  nonaka 	if (bit)
    179       1.1  nonaka 		reg |= (1 << GPIO_PIN_RTC_SIO);
    180       1.1  nonaka 	else
    181       1.1  nonaka 		reg &= ~(1 << GPIO_PIN_RTC_SIO);
    182       1.1  nonaka 	_reg_write_2(SH4_PDTRA, reg);
    183       1.1  nonaka 
    184       1.1  nonaka 	ndelay(300);
    185       1.1  nonaka 
    186       1.1  nonaka 	rtc_clk(sc, 0);
    187       1.1  nonaka 	ndelay(300);
    188       1.1  nonaka 	rtc_clk(sc, 1);
    189       1.1  nonaka }
    190