PERFORCE change 158109 for review
Andrew Turner
andrew at FreeBSD.org
Mon Feb 23 01:41:18 PST 2009
http://perforce.freebsd.org/chv.cgi?CH=158109
Change 158109 by andrew at 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 <arm/s3c2xx0/s3c2xx0reg.h>
#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,
};
More information about the p4-projects
mailing list