smdk2800_io_init.c revision 1.1
11.1Sbsh/*	$NetBSD: smdk2800_io_init.c,v 1.1 2003/07/30 18:54:22 bsh Exp $	*/
21.1Sbsh
31.1Sbsh/*
41.1Sbsh * Copyright (c) 2002, 2003 Fujitsu Component Limited
51.1Sbsh * Copyright (c) 2002, 2003 Genetec Corporation
61.1Sbsh * All rights reserved.
71.1Sbsh *
81.1Sbsh * Redistribution and use in source and binary forms, with or without
91.1Sbsh * modification, are permitted provided that the following conditions
101.1Sbsh * are met:
111.1Sbsh * 1. Redistributions of source code must retain the above copyright
121.1Sbsh *    notice, this list of conditions and the following disclaimer.
131.1Sbsh * 2. Redistributions in binary form must reproduce the above copyright
141.1Sbsh *    notice, this list of conditions and the following disclaimer in the
151.1Sbsh *    documentation and/or other materials provided with the distribution.
161.1Sbsh * 3. Neither the name of The Fujitsu Component Limited nor the name of
171.1Sbsh *    Genetec corporation may not be used to endorse or promote products
181.1Sbsh *    derived from this software without specific prior written permission.
191.1Sbsh *
201.1Sbsh * THIS SOFTWARE IS PROVIDED BY FUJITSU COMPONENT LIMITED AND GENETEC
211.1Sbsh * CORPORATION ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
221.1Sbsh * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
231.1Sbsh * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
241.1Sbsh * DISCLAIMED.  IN NO EVENT SHALL FUJITSU COMPONENT LIMITED OR GENETEC
251.1Sbsh * CORPORATION BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
261.1Sbsh * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
271.1Sbsh * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
281.1Sbsh * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
291.1Sbsh * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
301.1Sbsh * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
311.1Sbsh * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
321.1Sbsh * SUCH DAMAGE.
331.1Sbsh */
341.1Sbsh
351.1Sbsh#include <arm/s3c2xx0/s3c2800reg.h>
361.1Sbsh
371.1Sbsh#define EXTINTR_INIT	((EXTINTR_HIGH|EXTINTR_FALLING)<<28) | \
381.1Sbsh			((EXTINTR_HIGH|EXTINTR_FALLING)<<24) | \
391.1Sbsh			((EXTINTR_HIGH|EXTINTR_FALLING)<<20) | \
401.1Sbsh			((EXTINTR_HIGH|EXTINTR_FALLING)<<16) | \
411.1Sbsh			((EXTINTR_HIGH|EXTINTR_FALLING)<<12) | \
421.1Sbsh			((EXTINTR_HIGH|EXTINTR_FALLING)<<8) | \
431.1Sbsh			((EXTINTR_HIGH|EXTINTR_FALLING)<<4) | \
441.1Sbsh			((EXTINTR_HIGH|EXTINTR_FALLING))
451.1Sbsh#define FCLK		200000000
461.1Sbsh#define F_1MHZ		1000000
471.1Sbsh
481.1Sbsh#define IOW(a, d)	(*(volatile unsigned int *)(a) = (d))
491.1Sbsh#define IOR(a)		(*(volatile unsigned int *)(a))
501.1Sbsh#define SETLED(d)	IOW(S3C2800_GPIO_BASE+GPIO_PDATC,(d))
511.1Sbsh
521.1Sbshvoid smdk2800_io_init(void);
531.1Sbsh
541.1Sbshvoid
551.1Sbshsmdk2800_io_init(void)
561.1Sbsh{
571.1Sbsh	unsigned int hclk;
581.1Sbsh	unsigned int pclk;
591.1Sbsh	unsigned int tmdat;
601.1Sbsh
611.1Sbsh#define	O	PCON_OUTPUT
621.1Sbsh#define	I	PCON_INPUT
631.1Sbsh#define	A	PCON_ALTFUN
641.1Sbsh#define	_	0
651.1Sbsh#define	_C(b7,b6,b5,b4,b3,b2,b1,b0) \
661.1Sbsh	((b7<<14)|(b6<<12)|(b5<<10)|(b4<<8)|(b3<<6)|(b2<<4)|(b1<<2)|(b0<<0))
671.1Sbsh
681.1Sbsh	/* GPIO port */
691.1Sbsh	IOW(S3C2800_GPIO_BASE+GPIO_PCONA, _C(O,O,A,A,A,A,A,A));
701.1Sbsh	IOW(S3C2800_GPIO_BASE+GPIO_PUPA,  0xff);
711.1Sbsh	IOW(S3C2800_GPIO_BASE+GPIO_PCONB, _C(I,O,A,A,A,A,A,A));
721.1Sbsh	IOW(S3C2800_GPIO_BASE+GPIO_PCONC, _C(_,_,_,_,O,A,A,A));
731.1Sbsh	IOW(S3C2800_GPIO_BASE+GPIO_PUPC,  0xff);
741.1Sbsh	IOW(S3C2800_GPIO_BASE+GPIO_PCOND, _C(A,A,A,A,A,A,A,A));
751.1Sbsh	IOW(S3C2800_GPIO_BASE+GPIO_PUPD,  0xff);
761.1Sbsh	IOW(S3C2800_GPIO_BASE+GPIO_PCONE, _C(O,O,O,O,A,A,A,A));
771.1Sbsh	IOW(S3C2800_GPIO_BASE+GPIO_PUPE,  0xff);
781.1Sbsh	IOW(S3C2800_GPIO_BASE+GPIO_PCONF, _C(A,A,A,A,A,A,A,A));
791.1Sbsh	IOW(S3C2800_GPIO_BASE+GPIO_PUPF,  0xff);
801.1Sbsh	IOW(S3C2800_GPIO_BASE+GPIO_EXTINTR, EXTINTR_INIT);
811.1Sbsh
821.1Sbsh#undef	O
831.1Sbsh#undef	I
841.1Sbsh#undef	A
851.1Sbsh#undef	_
861.1Sbsh#undef 	_C
871.1Sbsh
881.1Sbsh	/* Get clock value */
891.1Sbsh	if(IOR(S3C2800_CLKMAN_BASE+CLKMAN_CLKCON) & CLKCON_HCLK)
901.1Sbsh		hclk = FCLK / 2;
911.1Sbsh	else
921.1Sbsh		hclk = FCLK;
931.1Sbsh
941.1Sbsh	if(IOR(S3C2800_CLKMAN_BASE+CLKMAN_CLKCON) & CLKCON_PCLK)
951.1Sbsh		pclk = hclk / 2;
961.1Sbsh	else
971.1Sbsh		pclk = hclk;
981.1Sbsh
991.1Sbsh	/* Timer */
1001.1Sbsh	if((pclk/F_1MHZ) < 1)
1011.1Sbsh		tmdat = 1<<16;
1021.1Sbsh	else
1031.1Sbsh		tmdat = (pclk/F_1MHZ)<<16;
1041.1Sbsh
1051.1Sbsh#define TMDAT_INIT		0xf424
1061.1Sbsh
1071.1Sbsh	IOW(S3C2800_TIMER0_BASE+TIMER_TMDAT, (tmdat | TMDAT_INIT));
1081.1Sbsh	IOW(S3C2800_TIMER1_BASE+TIMER_TMDAT, (tmdat | TMDAT_INIT));
1091.1Sbsh	IOW(S3C2800_TIMER2_BASE+TIMER_TMDAT, (tmdat | TMDAT_INIT));
1101.1Sbsh
1111.1Sbsh	IOW(S3C2800_TIMER0_BASE+TIMER_TMCON, TMCON_MUX_DIV32 | TMCON_INTENA | TMCON_ENABLE);
1121.1Sbsh	IOW(S3C2800_TIMER1_BASE+TIMER_TMCON, TMCON_MUX_DIV16 | TMCON_INTENA | TMCON_ENABLE);
1131.1Sbsh	IOW(S3C2800_TIMER2_BASE+TIMER_TMCON, TMCON_MUX_DIV8 | TMCON_INTENA | TMCON_ENABLE);
1141.1Sbsh
1151.1Sbsh	/* Interrupt controller */
1161.1Sbsh	IOW(S3C2800_INTCTL_BASE+INTCTL_INTMOD, 0);
1171.1Sbsh	IOW(S3C2800_INTCTL_BASE+INTCTL_INTMSK, 0);
1181.1Sbsh
1191.1Sbsh	/* Initial complete */
1201.1Sbsh	SETLED(0x0);	/* All LEDs on (o o o) */
1211.1Sbsh}
122