From owner-p4-projects@FreeBSD.ORG Mon Feb 23 09:41:18 2009 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id A32E61065676; Mon, 23 Feb 2009 09:41:17 +0000 (UTC) Delivered-To: perforce@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 608C81065674 for ; Mon, 23 Feb 2009 09:41:17 +0000 (UTC) (envelope-from andrew@freebsd.org) Received: from repoman.freebsd.org (repoman.freebsd.org [IPv6:2001:4f8:fff6::29]) by mx1.freebsd.org (Postfix) with ESMTP id 4E5CD8FC08 for ; Mon, 23 Feb 2009 09:41:17 +0000 (UTC) (envelope-from andrew@freebsd.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.14.3/8.14.3) with ESMTP id n1N9fHv6010026 for ; Mon, 23 Feb 2009 09:41:17 GMT (envelope-from andrew@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.3/8.14.3/Submit) id n1N9fHM0010024 for perforce@freebsd.org; Mon, 23 Feb 2009 09:41:17 GMT (envelope-from andrew@freebsd.org) Date: Mon, 23 Feb 2009 09:41:17 GMT Message-Id: <200902230941.n1N9fHM0010024@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to andrew@freebsd.org using -f From: Andrew Turner To: Perforce Change Reviews Cc: Subject: PERFORCE change 158109 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 23 Feb 2009 09:41:18 -0000 http://perforce.freebsd.org/chv.cgi?CH=158109 Change 158109 by andrew@andrew_bender on 2009/02/23 09:41:04 Calculate the value of pclk before cninit to use in uart In uart_cpu_getdev return an error when we are looking for anything other than a console Increase the uart baud rate to 115200 Fix sscomspeed to return the correct value Remove the error calculation from sscomspeed as it wasn't used Replace DEFAULT_RCLK with s3c2410_pclk Affected files ... .. //depot/projects/arm/src/sys/arm/s3c2xx0/s3c24x0_machdep.c#4 edit .. //depot/projects/arm/src/sys/arm/s3c2xx0/uart_cpu_s3c2410.c#4 edit .. //depot/projects/arm/src/sys/arm/s3c2xx0/uart_dev_s3c2410.c#10 edit Differences ... ==== //depot/projects/arm/src/sys/arm/s3c2xx0/s3c24x0_machdep.c#4 (text+ko) ==== @@ -109,6 +109,8 @@ #define ABT_STACK_SIZE 1 #define UND_STACK_SIZE 1 +extern int s3c2410_pclk; + extern u_int data_abort_handler_address; extern u_int prefetch_abort_handler_address; extern u_int undefined_handler_address; @@ -386,10 +388,11 @@ /* Disable all peripheral interrupts */ ioreg_write32(S3C24X0_INTCTL_BASE + INTCTL_INTMSK, ~0); memsize = board_init(); + /* Find pclk for uart */ + s3c24x0_clock_freq2(S3C24X0_CLKMAN_BASE, NULL, NULL, &s3c2410_pclk); cninit(); /* Set stack for exception handlers */ - data_abort_handler_address = (u_int)data_abort_handler; prefetch_abort_handler_address = (u_int)prefetch_abort_handler; undefined_handler_address = (u_int)undefinedinstruction_bounce; ==== //depot/projects/arm/src/sys/arm/s3c2xx0/uart_cpu_s3c2410.c#4 (text+ko) ==== @@ -42,6 +42,11 @@ bus_space_tag_t uart_bus_space_io; bus_space_tag_t uart_bus_space_mem; +extern struct uart_ops uart_s3c2410_ops; + +vm_offset_t s3c2410_uart_vaddr; +unsigned int s3c2410_pclk; + extern struct uart_class uart_s3c2410_class; int @@ -50,20 +55,19 @@ return ((b1->bsh == b2->bsh && b1->bst == b2->bst) ? 1 : 0); } -extern struct uart_ops uart_s3c2410_ops; - -vm_offset_t s3c2410_uart_vaddr; - int uart_cpu_getdev(int devtype, struct uart_devinfo *di) { + if (devtype != UART_DEV_CONSOLE) + return (ENXIO); + di->ops = uart_getops(&uart_s3c2410_class); di->bas.chan = 0; di->bas.bst = &s3c2xx0_bs_tag; di->bas.bsh = s3c2410_uart_vaddr; di->bas.regshft = 0; - di->bas.rclk = 0; - di->baudrate = 9600; + di->bas.rclk = s3c2410_pclk; + di->baudrate = 115200; di->databits = 8; di->stopbits = 1; di->parity = UART_PARITY_NONE; ==== //depot/projects/arm/src/sys/arm/s3c2xx0/uart_dev_s3c2410.c#10 (text+ko) ==== @@ -46,8 +46,6 @@ #include #include "uart_if.h" -#define DEFAULT_RCLK 3686400 - /* Finds the subirq from the parent */ #define get_sub_irq(parent, offset) \ ((parent == S3C24X0_INT_UART0) ? S3C24X0_SUBIRQ_MIN + offset : \ @@ -57,6 +55,8 @@ #define TX_OFF 1 #define ERR_OFF 2 +extern unsigned int s3c2410_pclk; + static int sscomspeed(long, long); static int s3c24x0_uart_param(struct uart_bas *, int, int, int, int); @@ -75,21 +75,12 @@ static int sscomspeed(long speed, long frequency) { -#define divrnd(n, q) (((n)*2/(q)+1)/2) /* divide and round off */ + int x; - int x, err; - - if (speed <= 0) + if (speed <= 0 || frequency <= 0) return -1; - x = divrnd(frequency / 16, speed); - if (x <= 0) - return -1; - err = divrnd(((quad_t)frequency) * 1000 / 16, speed * x) - 1000; - if (err < 0) - err = -err; + x = (frequency / 16) / speed; return x-1; - -#undef divrnd } static int @@ -164,7 +155,8 @@ int parity) { if (bas->rclk == 0) - bas->rclk = DEFAULT_RCLK; + bas->rclk = s3c2410_pclk; + KASSERT(bas->rclk != 0, ("s3c2410_init: Invalid rclk")); uart_setreg(bas, SSCOM_UCON, 0); uart_setreg(bas, SSCOM_UFCON, @@ -309,6 +301,10 @@ { int error; + if (sc->sc_bas.rclk == 0) + sc->sc_bas.rclk = s3c2410_pclk; + KASSERT(sc->sc_bas.rclk != 0, ("s3c2410_init: Invalid rclk")); + uart_lock(sc->sc_hwmtx); error = s3c24x0_uart_param(&sc->sc_bas, baudrate, databits, stopbits, parity); @@ -366,5 +362,5 @@ 1, .uc_ops = &uart_s3c2410_ops, .uc_range = 8, - .uc_rclk = DEFAULT_RCLK + .uc_rclk = 0, };