From: James S. <jsi...@us...> - 2001-11-10 03:56:08
|
Update of /cvsroot/linux-mips/linux/arch/mips/jmr3927/common In directory usw-pr-cvs1:/tmp/cvs-serv22117/jmr3927/common Added Files: Makefile prom.c puts.c rtc_ds1742.c Log Message: Imported support for JMR-TX3927 by Alice Hennessy. Thank you. --- NEW FILE: Makefile --- # # Makefile for the common code of TOSHIBA JMR-TX3927 board # # Note! Dependencies are done automagically by 'make dep', which also # removes any old dependencies. DON'T put your own dependencies here # unless it's something special (ie not a .c file). # .S.s: $(CPP) $(CFLAGS) $< -o $*.s .S.o: $(CC) $(CFLAGS) -c $< -o $*.o O_TARGET:= tx3927.o obj-y += prom.o puts.o rtc_ds1742.o include $(TOPDIR)/Rules.make --- NEW FILE: prom.c --- /* * * BRIEF MODULE DESCRIPTION * PROM library initialisation code, assuming a version of * pmon is the boot code. * * Copyright 2001 MontaVista Software Inc. * Author: MontaVista Software, Inc. * ahe...@mv... * * Based on arch/mips/au1000/common/prom.c * * This file was derived from Carsten Langgaard's * arch/mips/mips-boards/xx files. * * Carsten Langgaard, car...@mi... * Copyright (C) 1999,2000 MIPS Technologies, Inc. All rights reserved. * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the * Free Software Foundation; either version 2 of the License, or (at your * option) any later version. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 675 Mass Ave, Cambridge, MA 02139, USA. */ #include <linux/config.h> #include <linux/kernel.h> #include <linux/init.h> #include <linux/string.h> #include <asm/bootinfo.h> /* #define DEBUG_CMDLINE */ char arcs_cmdline[COMMAND_LINE_SIZE]; extern int prom_argc; extern char **prom_argv, **prom_envp; typedef struct { char *name; /* char *val; */ }t_env_var; char * __init prom_getcmdline(void) { return &(arcs_cmdline[0]); } void __init prom_init_cmdline(void) { char *cp; int actr; actr = 1; /* Always ignore argv[0] */ cp = &(arcs_cmdline[0]); while(actr < prom_argc) { strcpy(cp, prom_argv[actr]); cp += strlen(prom_argv[actr]); *cp++ = ' '; actr++; } if (cp != &(arcs_cmdline[0])) /* get rid of trailing space */ --cp; *cp = '\0'; } int __init page_is_ram(unsigned long pagenr) { return 1; } void prom_free_prom_memory (void) { } --- NEW FILE: puts.c --- /* * * BRIEF MODULE DESCRIPTION * Low level uart routines to directly access a TX[34]927 SIO. * * Copyright 2001 MontaVista Software Inc. * Author: MontaVista Software, Inc. * ahe...@mv... or so...@mv... * * Copyright (C) 2000-2001 Toshiba Corporation * * Based on arch/mips/au1000/common/puts.c * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the * Free Software Foundation; either version 2 of the License, or (at your * option) any later version. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 675 Mass Ave, Cambridge, MA 02139, USA. */ #include <linux/types.h> #include <asm/jmr3927/txx927.h> #include <asm/jmr3927/tx3927.h> #include <asm/jmr3927/jmr3927.h> #define TIMEOUT 0xffffff #define SLOW_DOWN static const char digits[16] = "0123456789abcdef"; #ifdef SLOW_DOWN #define slow_down() { int k; for (k=0; k<10000; k++); } #else #define slow_down() #endif void putch(const unsigned char c) { int i = 0; do { slow_down(); i++; if (i>TIMEOUT) { break; } } while (!(tx3927_sioptr(1)->cisr & TXx927_SICISR_TXALS)); tx3927_sioptr(1)->tfifo = c; return; } unsigned char getch(void) { int i = 0; int dicr; char c; /* diable RX int. */ dicr = tx3927_sioptr(1)->dicr; tx3927_sioptr(1)->dicr = 0; do { slow_down(); i++; if (i>TIMEOUT) { break; } } while (tx3927_sioptr(1)->disr & TXx927_SIDISR_UVALID) ; c = tx3927_sioptr(1)->rfifo; /* clear RX int. status */ tx3927_sioptr(1)->disr &= ~TXx927_SIDISR_RDIS; /* enable RX int. */ tx3927_sioptr(1)->dicr = dicr; return c; } void do_jmr3927_led_set(char n) { /* and with current leds */ jmr3927_led_and_set(n); } void puts(unsigned char *cp) { int i = 0; while (*cp) { do { slow_down(); i++; if (i>TIMEOUT) { break; } } while (!(tx3927_sioptr(1)->cisr & TXx927_SICISR_TXALS)); tx3927_sioptr(1)->tfifo = *cp++; } putch('\r'); putch('\n'); } void fputs(unsigned char *cp) { int i = 0; while (*cp) { do { slow_down(); i++; if (i>TIMEOUT) { break; } } while (!(tx3927_sioptr(1)->cisr & TXx927_SICISR_TXALS)); tx3927_sioptr(1)->tfifo = *cp++; } } void put64(uint64_t ul) { int cnt; unsigned ch; cnt = 16; /* 16 nibbles in a 64 bit long */ putch('0'); putch('x'); do { cnt--; ch = (unsigned char)(ul >> cnt * 4) & 0x0F; putch(digits[ch]); } while (cnt > 0); } void put32(unsigned u) { int cnt; unsigned ch; cnt = 8; /* 8 nibbles in a 32 bit long */ putch('0'); putch('x'); do { cnt--; ch = (unsigned char)(u >> cnt * 4) & 0x0F; putch(digits[ch]); } while (cnt > 0); } --- NEW FILE: rtc_ds1742.c --- /*********************************************************************** * * Copyright 2001 MontaVista Software Inc. * Author: MontaVista Software, Inc. * ahe...@mv... * * arch/mips/jmr3927/common/rtc_ds1742.c * Based on arch/mips/ddb5xxx/common/rtc_ds1386.c * low-level RTC hookups for s for Dallas 1742 chip. * * Copyright (C) 2000-2001 Toshiba Corporation * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the * Free Software Foundation; either version 2 of the License, or (at your * option) any later version. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 675 Mass Ave, Cambridge, MA 02139, USA. * *********************************************************************** */ /* * This file exports a function, rtc_ds1386_init(), which expects an * uncached base address as the argument. It will set the two function * pointers expected by the MIPS generic timer code. */ #include <linux/types.h> #include <linux/time.h> #include <linux/rtc.h> #include <asm/time.h> #include <asm/addrspace.h> #include <asm/jmr3927/ds1742rtc.h> #include <asm/debug.h> #define EPOCH 2000 #undef BCD_TO_BIN #define BCD_TO_BIN(val) (((val)&15) + ((val)>>4)*10) #undef BIN_TO_BCD #define BIN_TO_BCD(val) ((((val)/10)<<4) + (val)%10) static unsigned long rtc_base; static unsigned long rtc_ds1742_get_time(void) { unsigned int year, month, day, hour, minute, second; unsigned int century; CMOS_WRITE(RTC_READ, RTC_CONTROL); second = BCD_TO_BIN(CMOS_READ(RTC_SECONDS) & RTC_SECONDS_MASK); minute = BCD_TO_BIN(CMOS_READ(RTC_MINUTES)); hour = BCD_TO_BIN(CMOS_READ(RTC_HOURS)); day = BCD_TO_BIN(CMOS_READ(RTC_DATE)); month = BCD_TO_BIN(CMOS_READ(RTC_MONTH)); year = BCD_TO_BIN(CMOS_READ(RTC_YEAR)); century = BCD_TO_BIN(CMOS_READ(RTC_CENTURY) & RTC_CENTURY_MASK); CMOS_WRITE(0, RTC_CONTROL); year += century * 100; return mktime(year, month, day, hour, minute, second); } extern void to_tm(unsigned long tim, struct rtc_time * tm); static int rtc_ds1742_set_time(unsigned long t) { struct rtc_time tm; u8 year, month, day, hour, minute, second; u8 cmos_year, cmos_month, cmos_day, cmos_hour, cmos_minute, cmos_second; int cmos_century; CMOS_WRITE(RTC_READ, RTC_CONTROL); cmos_second = (u8)(CMOS_READ(RTC_SECONDS) & RTC_SECONDS_MASK); cmos_minute = (u8)CMOS_READ(RTC_MINUTES); cmos_hour = (u8)CMOS_READ(RTC_HOURS); cmos_day = (u8)CMOS_READ(RTC_DATE); cmos_month = (u8)CMOS_READ(RTC_MONTH); cmos_year = (u8)CMOS_READ(RTC_YEAR); cmos_century = CMOS_READ(RTC_CENTURY) & RTC_CENTURY_MASK; CMOS_WRITE(RTC_WRITE, RTC_CONTROL); /* convert */ to_tm(t, &tm); /* check each field one by one */ year = BIN_TO_BCD(tm.tm_year - EPOCH); if (year != cmos_year) { CMOS_WRITE(year,RTC_YEAR); } month = BIN_TO_BCD(tm.tm_mon); if (month != (cmos_month & 0x1f)) { CMOS_WRITE((month & 0x1f) | (cmos_month & ~0x1f),RTC_MONTH); } day = BIN_TO_BCD(tm.tm_mday); if (day != cmos_day) { CMOS_WRITE(day, RTC_DATE); } if (cmos_hour & 0x40) { /* 12 hour format */ hour = 0x40; if (tm.tm_hour > 12) { hour |= 0x20 | (BIN_TO_BCD(hour-12) & 0x1f); } else { hour |= BIN_TO_BCD(tm.tm_hour); } } else { /* 24 hour format */ hour = BIN_TO_BCD(tm.tm_hour) & 0x3f; } if (hour != cmos_hour) CMOS_WRITE(hour, RTC_HOURS); minute = BIN_TO_BCD(tm.tm_min); if (minute != cmos_minute) { CMOS_WRITE(minute, RTC_MINUTES); } second = BIN_TO_BCD(tm.tm_sec); if (second != cmos_second) { CMOS_WRITE(second & RTC_SECONDS_MASK,RTC_SECONDS); } /* RTC_CENTURY and RTC_CONTROL share same address... */ CMOS_WRITE(cmos_century, RTC_CONTROL); return 0; } void rtc_ds1742_init(unsigned long base) { u8 cmos_second; /* remember the base */ rtc_base = base; db_assert((rtc_base & 0xe0000000) == KSEG1); /* set the function pointers */ rtc_get_time = rtc_ds1742_get_time; rtc_set_time = rtc_ds1742_set_time; /* clear oscillator stop bit */ CMOS_WRITE(RTC_READ, RTC_CONTROL); cmos_second = (u8)(CMOS_READ(RTC_SECONDS) & RTC_SECONDS_MASK); CMOS_WRITE(RTC_WRITE, RTC_CONTROL); CMOS_WRITE(cmos_second, RTC_SECONDS); /* clear msb */ CMOS_WRITE(0, RTC_CONTROL); } |