Re: DMA support for MPC5xxx?

7 messages, 3 authors, 2004-06-19 · open the first message on its own page

Re: DMA support for MPC5xxx?

From: Matt Porter <mporter@KERNEL.CRASHING.ORG>
Date: 2004-06-03 20:48:04

On Thu, Jun 03, 2004 at 10:19:07PM +0200, Sylvain Munaut wrote:
 >>> See the thread starting at
 >>> http://lists.linuxppc.org/linuxppc-dev/200311/msg00000.html
 >>>
 >>> David even posted on this list to get feedback  from  the
 >>> community. But I haven't seen a single reply on the mailing
 >>> lists.
 >>
 >> So? Repost. I miss stuff the first time around a lot of times
 >> myself [this is not to indicate that I would necessarily comment
 >> on 5200 stuff, just an example].
 >
 >
 > And this time do it against 2.6.  Even if 2.4 wasn't necessarily
 > frozen at the time we first tried, it is now.

Actually I got some patch to support MPC5200 ( and only this one, no
mgt5100 stuff ) for 2.6
It only supports booting, serial console and i2c. Not much but could
that be put in official tree if I submit it ? Or does it need to
support  more than that to worth inclusion.
So that at least if someone tries to implement more ( I'll resume my
work on it in a few weeks ), it has a base already in official tree.
Why not? You're the only one showing interest in supporting 5200 in
2.6. Post the patch and if it's clean it can go in. The "i2c", I
assume, is an i2c host adapter driver so that needs to be separated
so it can go to gregkh. Don't lump it in with the include/asm-ppc
and arch/ppc core support. :)

-Matt

** Sent via the linuxppc-dev mail list. See http://lists.linuxppc.org/

[PATCH][RFC] MPC52xx basic support on linux 2.6 (was DMA support for MPC5xxx?)

From: Sylvain Munaut <hidden>
Date: 2004-06-10 19:50:04

Hi
Why not? You're the only one showing interest in supporting 5200 in
 2.6.
Well, I'm getting used to it. I'm also working on ARM IXP1200 on 2.6,
and I'm also the only one AFAIK ;)
Post the patch and if it's clean it can go in. The "i2c", I assume,
is an i2c host adapter driver so that needs to be separated so it
can go to gregkh. Don't lump it in with the include/asm-ppc and
arch/ppc core support. :)
Here it is, slightly delayed because of hardrive crash and need to
rename all 'Motorola' to 'Freescale' ;)

It's there :

http://www.246tNt.com/linux-2.5-mpc52xx-pending-20040610.diff
bk://bkbits.246tNt.com/linux-2.5-mpc52xx-pending

I haven't inlined or attached it because it's quite large ( ~80k ).
But still, here the summary of the changes, so you at least know what
you're pulling ;)

# This is a BitKeeper generated diff -Nru style patch.
#
# ChangeSet
#   2004/06/10 21:08:41+02:00 tnt@246tnt-laptop.(none)
#   Added support for Freescale MPC52xx, both the processor and the
LITE5200 devboard
#
# include/asm-ppc/mpc52xx_psc.h
#   2004/06/10 21:04:05+02:00 tnt@246tnt-laptop.(none) +202 -0
#
# include/asm-ppc/mpc52xx_psc.h
#   2004/06/10 21:04:05+02:00 tnt@246tnt-laptop.(none) +0 -0
#   BitKeeper file
/home/tnt/musicbox/kernel/linux-2.5-mpc52xx-pending/include/asm-ppc/mpc52xx_psc.h
#
# include/asm-ppc/mpc52xx.h
#   2004/06/10 21:04:04+02:00 tnt@246tnt-laptop.(none) +427 -0
#
# drivers/serial/mpc52xx_uart.c
#   2004/06/10 21:04:04+02:00 tnt@246tnt-laptop.(none) +872 -0
#
# include/asm-ppc/mpc52xx.h
#   2004/06/10 21:04:04+02:00 tnt@246tnt-laptop.(none) +0 -0
#   BitKeeper file
/home/tnt/musicbox/kernel/linux-2.5-mpc52xx-pending/include/asm-ppc/mpc52xx.h
#
# drivers/serial/mpc52xx_uart.c
#   2004/06/10 21:04:04+02:00 tnt@246tnt-laptop.(none) +0 -0
#   BitKeeper file
/home/tnt/musicbox/kernel/linux-2.5-mpc52xx-pending/drivers/serial/mpc52xx_uart.c
#
# arch/ppc/syslib/mpc52xx_setup.c
#   2004/06/10 21:04:03+02:00 tnt@246tnt-laptop.(none) +136 -0
#
# arch/ppc/syslib/mpc52xx_setup.c
#   2004/06/10 21:04:03+02:00 tnt@246tnt-laptop.(none) +0 -0
#   BitKeeper file
/home/tnt/musicbox/kernel/linux-2.5-mpc52xx-pending/arch/ppc/syslib/mpc52xx_setup.c
#
# arch/ppc/syslib/mpc52xx_pic.c
#   2004/06/10 21:04:02+02:00 tnt@246tnt-laptop.(none) +259 -0
#
# arch/ppc/platforms/lite5200.h
#   2004/06/10 21:04:02+02:00 tnt@246tnt-laptop.(none) +34 -0
#
# arch/ppc/syslib/mpc52xx_pic.c
#   2004/06/10 21:04:02+02:00 tnt@246tnt-laptop.(none) +0 -0
#   BitKeeper file
/home/tnt/musicbox/kernel/linux-2.5-mpc52xx-pending/arch/ppc/syslib/mpc52xx_pic.c
#
# arch/ppc/platforms/lite5200.h
#   2004/06/10 21:04:02+02:00 tnt@246tnt-laptop.(none) +0 -0
#   BitKeeper file
/home/tnt/musicbox/kernel/linux-2.5-mpc52xx-pending/arch/ppc/platforms/lite5200.h
#
# arch/ppc/platforms/lite5200.c
#   2004/06/10 21:04:01+02:00 tnt@246tnt-laptop.(none) +155 -0
#
# arch/ppc/platforms/lite5200.c
#   2004/06/10 21:04:01+02:00 tnt@246tnt-laptop.(none) +0 -0
#   BitKeeper file
/home/tnt/musicbox/kernel/linux-2.5-mpc52xx-pending/arch/ppc/platforms/lite5200.c
#
# arch/ppc/configs/lite5200_defconfig
#   2004/06/10 21:04:00+02:00 tnt@246tnt-laptop.(none) +477 -0
#
# arch/ppc/configs/lite5200_defconfig
#   2004/06/10 21:04:00+02:00 tnt@246tnt-laptop.(none) +0 -0
#   BitKeeper file
/home/tnt/musicbox/kernel/linux-2.5-mpc52xx-pending/arch/ppc/configs/lite5200_defconfig
#
# Documentation/powerpc/mpc52xx.txt
#   2004/06/10 21:03:59+02:00 tnt@246tnt-laptop.(none) +70 -0
#
# include/linux/serial_core.h
#   2004/06/10 21:03:59+02:00 tnt@246tnt-laptop.(none) +3 -0
#   Added port type for the Freescale MPC52xx PSC
#
# include/asm-ppc/ppcboot.h
#   2004/06/10 21:03:59+02:00 tnt@246tnt-laptop.(none) +7 -0
#   Added specific fields for the Freescale MPC52xx
#
# drivers/serial/Makefile
#   2004/06/10 21:03:59+02:00 tnt@246tnt-laptop.(none) +1 -0
#   Added options for the Freescale MPC52xx PSC
#
# drivers/serial/Kconfig
#   2004/06/10 21:03:59+02:00 tnt@246tnt-laptop.(none) +18 -0
#   Added options for the Freescale MPC52xx PSC
#
# arch/ppc/syslib/Makefile
#   2004/06/10 21:03:59+02:00 tnt@246tnt-laptop.(none) +1 -0
#   Added options for the Freescale MPC52xx and the standard LITE5200
devboard
#
# arch/ppc/platforms/Makefile
#   2004/06/10 21:03:59+02:00 tnt@246tnt-laptop.(none) +1 -0
#   Added options for the Freescale MPC52xx and the standard LITE5200
devboard
#
# arch/ppc/kernel/cputable.c
#   2004/06/10 21:03:59+02:00 tnt@246tnt-laptop.(none) +8 -0
#   Added entry for the Freescale MPC52xx
#
# arch/ppc/Kconfig
#   2004/06/10 21:03:59+02:00 tnt@246tnt-laptop.(none) +20 -8
#   Added options for the Freescale MPC52xx and the standard LITE5200
devboard
#
# Documentation/powerpc/mpc52xx.txt
#   2004/06/10 21:03:59+02:00 tnt@246tnt-laptop.(none) +0 -0
#   BitKeeper file
/home/tnt/musicbox/kernel/linux-2.5-mpc52xx-pending/Documentation/powerpc/mpc52xx.txt
#



Sylvain Munaut


** Sent via the linuxppc-dev mail list. See http://lists.linuxppc.org/

Re: [PATCH][RFC] MPC52xx basic support on linux 2.6 (was DMA support for MPC5xxx?)

From: Dale Farnsworth <hidden>
Date: 2004-06-18 19:20:46

On Thu, Jun 10, 2004 at 07:50:04PM +0000, Sylvain Munaut wrote:
Here it is, slightly delayed because of hardrive crash and need to
rename all 'Motorola' to 'Freescale' ;)

It's there :

http://www.246tNt.com/linux-2.5-mpc52xx-pending-20040610.diff
bk://bkbits.246tNt.com/linux-2.5-mpc52xx-pending
FWIW, I'd like to see the above go into linux-2.5.

I found a few issues.
  - need to call uart_update_timeout
  - Maximum delay for console_write (printk) was too short
  - one missed icecube to lite5200 name change.

This patch applies on top Sylvain's patch above.

-Dale

===== drivers/serial/mpc52xx_uart.c 1.1 vs edited =====
--- 1.1/drivers/serial/mpc52xx_uart.c	2004-06-11 14:50:26 -07:00
+++ edited/drivers/serial/mpc52xx_uart.c	2004-06-17 15:28:36 -07:00
@@ -289,15 +289,18 @@
 	/* Get the lock */
 	spin_lock_irqsave(&port->lock, flags);

+	/* Update the per-port timeout */
+	uart_update_timeout(port, new->c_cflag, baud);
+
 	/* Do our best to flush TX & RX, so we don't loose anything */
 	/* But we don't wait indefinitly ! */
-	j = 1000;	/* Maximum wait */
+	j = 1000000;	/* Maximum wait */
 	/* FIXME Can't receive chars since set_termios might be called at early
 	 * boot for the console, all stuff is not yet ready to receive at that
 	 * time and that just makes the kernel oops */
 	/* while (j-- && mpc52xx_uart_int_rx_chars(port)); */
 	while (!(in_be16(&psc->mpc52xx_psc_status) & MPC52xx_PSC_SR_TXEMP) &&
-	       j--)
+	       --j)
 		udelay(1);

 	if (!j)
@@ -588,40 +591,28 @@

 	/* Disable interrupts */
 	out_be16(&psc->mpc52xx_psc_imr, 0);
+
+	/* Wait the TX buffer to be empty */
+	j = 1000000;	/* Maximum wait */
+	while (!(in_be16(&psc->mpc52xx_psc_status) & MPC52xx_PSC_SR_TXEMP) &&
+			j--)
+		udelay(1);

 	/* Write all the chars */
 	for ( i=0 ; i<count ; i++ ) {
-
-		/* Wait the TX buffer to be ready */
-		j = 10000;	/* Maximum wait */
-		while (!(in_be16(&psc->mpc52xx_psc_status) &
-		         MPC52xx_PSC_SR_TXRDY) &&
-		       j--)
-			udelay(1);
-
 		/* Send the char */
 		out_8(&psc->mpc52xx_psc_buffer_8, *s);

 		/* Line return handling */
-		if ( *s++ == '\n' ) {
-			/* Wait the TX buffer to be ready */
-			j = 10000;	/* Maximum wait */
-			while (!(in_be16(&psc->mpc52xx_psc_status) &
-			         MPC52xx_PSC_SR_TXRDY) &&
-			       j--)
-				udelay(1);
-
-			/* Send the char */
+		if ( *s++ == '\n' )
 			out_8(&psc->mpc52xx_psc_buffer_8, '\r');
-		}
-	}

-	/* Wait the TX buffer to be empty */
-	/* I'm not sure we really need to ... */
-	j = 10000;	/* Maximum wait */
-	while (!(in_be16(&psc->mpc52xx_psc_status) & MPC52xx_PSC_SR_TXEMP) &&
-	       j--)
-		udelay(1);
+		/* Wait the TX buffer to be empty */
+		j = 100000;	/* Maximum wait */
+		while (!(in_be16(&psc->mpc52xx_psc_status) &
+				MPC52xx_PSC_SR_TXEMP) && j--)
+			udelay(1);
+	}

 	/* Restore interrupt state */
 	out_be16(&psc->mpc52xx_psc_imr, port->read_status_mask);
===== include/asm-ppc/mpc52xx.h 1.1 vs edited =====
--- 1.1/include/asm-ppc/mpc52xx.h	2004-06-11 14:50:27 -07:00
+++ edited/include/asm-ppc/mpc52xx.h	2004-06-17 15:09:58 -07:00
@@ -339,7 +339,7 @@

 	volatile u8  mem_clk_sel;	/* MBAR_CDM + 0x0c  reg3 byte0 */
 	volatile u8  xlb_clk_sel;	/* MBAR_CDM + 0x0d  reg3 byte1 read only */
-	volatile u8  ipg_clk_sel;	/* MBAR_CDM + 0x0e  reg3 byte2 */
+	volatile u8  ipb_clk_sel;	/* MBAR_CDM + 0x0e  reg3 byte2 */
 	volatile u8  pci_clk_sel;	/* MBAR_CDM + 0x0f  reg3 byte3 */

 	volatile u8  ext_48mhz_en;	/* MBAR_CDM + 0x10  reg4 byte0 */
@@ -419,8 +419,8 @@
 extern bd_t __res;

 /* Platform options */
-#if defined(CONFIG_ICECUBE)
-#include <platforms/icecube.h>
+#if defined(CONFIG_LITE5200)
+#include <platforms/lite5200.h>
 #endif

** Sent via the linuxppc-dev mail list. See http://lists.linuxppc.org/

MPC52xx lite5200 support for booting from dBUG

From: Dale Farnsworth <hidden>
Date: 2004-06-18 20:04:14

This patch allows Sylvain's 2.6 support for the lite5200 to boot
from dBUG as well as U-Boot.

When the arch/ppc/boot/simple bootwrapper is used, it computes the
values that U-boot would have supplied and stores them in __res.
That works for all needed fields except __res.bi_baudrate, which
can't be determined from the environment.  So, I added
CONFIG_SERIAL_MPC52xx_CONSOLE_BAUD to supply the default baud rate.
The value of CONFIG_SERIAL_MPC52xx_CONSOLE_BAUD is ignored if the
bootloader (U-boot) supplies the baudrate.

-Dale Farnsworth


===== arch/ppc/boot/common/misc-common.c 1.11 vs edited =====
--- 1.11/arch/ppc/boot/common/misc-common.c	2003-09-12 09:26:51 -07:00
+++ edited/arch/ppc/boot/common/misc-common.c	2004-06-11 17:29:30 -07:00
@@ -59,7 +59,7 @@
 void _vprintk(void(*putc)(const char), const char *fmt0, va_list ap);
 unsigned char *ISA_io = NULL;

-#if defined(CONFIG_SERIAL_CONSOLE) || defined(CONFIG_SERIAL_8250_CONSOLE)
+#if defined(CONFIG_SERIAL_CONSOLE) || defined(CONFIG_SERIAL_8250_CONSOLE) || defined(CONFIG_SERIAL_CORE_CONSOLE)
 extern unsigned long com_port;

 extern int serial_tstc(unsigned long com_port);
@@ -80,7 +80,7 @@

 int tstc(void)
 {
-#if defined(CONFIG_SERIAL_CONSOLE) || defined(CONFIG_SERIAL_8250_CONSOLE)
+#if defined(CONFIG_SERIAL_CONSOLE) || defined(CONFIG_SERIAL_8250_CONSOLE) || defined(CONFIG_SERIAL_CORE_CONSOLE)
 	if(keyb_present)
 		return (CRT_tstc() || serial_tstc(com_port));
 	else
@@ -93,7 +93,7 @@
 int getc(void)
 {
 	while (1) {
-#if defined(CONFIG_SERIAL_CONSOLE) || defined(CONFIG_SERIAL_8250_CONSOLE)
+#if defined(CONFIG_SERIAL_CONSOLE) || defined(CONFIG_SERIAL_8250_CONSOLE) || defined(CONFIG_SERIAL_CORE_CONSOLE)
 		if (serial_tstc(com_port))
 			return (serial_getc(com_port));
 #endif /* serial console */
@@ -108,7 +108,7 @@
 {
 	int x,y;

-#if defined(CONFIG_SERIAL_CONSOLE) || defined(CONFIG_SERIAL_8250_CONSOLE)
+#if defined(CONFIG_SERIAL_CONSOLE) || defined(CONFIG_SERIAL_8250_CONSOLE) || defined(CONFIG_SERIAL_CORE_CONSOLE)
 	serial_putc(com_port, c);
 	if ( c == '\n' )
 		serial_putc(com_port, '\r');
@@ -155,7 +155,7 @@
 	y = orig_y;

 	while ( ( c = *s++ ) != '\0' ) {
-#if defined(CONFIG_SERIAL_CONSOLE) || defined(CONFIG_SERIAL_8250_CONSOLE)
+#if defined(CONFIG_SERIAL_CONSOLE) || defined(CONFIG_SERIAL_8250_CONSOLE) || defined(CONFIG_SERIAL_CORE_CONSOLE)
 	        serial_putc(com_port, c);
 	        if ( c == '\n' ) serial_putc(com_port, '\r');
 #endif /* serial console */
===== arch/ppc/boot/simple/Makefile 1.30 vs edited =====
--- 1.30/arch/ppc/boot/simple/Makefile	2004-05-27 01:26:54 -07:00
+++ edited/arch/ppc/boot/simple/Makefile	2004-06-11 16:25:53 -07:00
@@ -113,6 +113,12 @@
   entrypoint-$(CONFIG_SPRUCE)		:= 0x00800000
         misc-$(CONFIG_SPRUCE)		+= misc-spruce.o

+      zimage-$(CONFIG_LITE5200)		:= zImage-STRIPELF
+zimageinitrd-$(CONFIG_LITE5200)		:= zImage.initrd-STRIPELF
+         end-$(CONFIG_LITE5200)		:= lite5200
+   cacheflag-$(CONFIG_LITE5200)		:= -include $(clear_L2_L3)
+
+
 # SMP images should have a '.smp' suffix.
          end-$(CONFIG_SMP)             := $(end-y).smp
@@ -143,6 +149,9 @@
 boot-$(CONFIG_8xx)		+= m8xx_tty.o
 boot-$(CONFIG_8260)		+= m8260_tty.o
 boot-$(CONFIG_GT64260_CONSOLE)	+= gt64260_tty.o
+endif
+ifeq ($(CONFIG_SERIAL_CORE_CONSOLE),y)
+boot-$(CONFIG_SERIAL_MPC52xx_CONSOLE) += mpc52xx_tty.o
 endif

 LIBS				:= $(common)/lib.a $(bootlib)/lib.a
===== arch/ppc/platforms/lite5200.c 1.1 vs edited =====
--- 1.1/arch/ppc/platforms/lite5200.c	2004-06-11 14:50:24 -07:00
+++ edited/arch/ppc/platforms/lite5200.c	2004-06-17 14:38:17 -07:00
@@ -72,28 +72,34 @@
 platform_init(unsigned long r3, unsigned long r4, unsigned long r5,
               unsigned long r6, unsigned long r7)
 {
-	parse_bootinfo(find_bootinfo());

 	/* Generic MPC52xx platform initialization */
 	/* TODO Create one and move a max of stuff in it.
 	   Put this init in the syslib */

-	/* Load the bd_t board info structure */
-	if (r3)
-		memcpy((void*)&__res,(void*)(r3+KERNELBASE), sizeof(bd_t));
+	struct bi_record *bootinfo = find_bootinfo();
+
+	if (bootinfo)
+		parse_bootinfo(bootinfo);
+	else {
+		/* Load the bd_t board info structure */
+		if (r3)
+			memcpy((void*)&__res,(void*)(r3+KERNELBASE),
+					sizeof(bd_t));

 #ifdef CONFIG_BLK_DEV_INITRD
-	/* Load the initrd */
-	if (r4) {
-		initrd_start = r4 + KERNELBASE;
-		initrd_end = r5 + KERNELBASE;
-	}
+		/* Load the initrd */
+		if (r4) {
+			initrd_start = r4 + KERNELBASE;
+			initrd_end = r5 + KERNELBASE;
+		}
 #endif

-	/* Load the command line */
-	if (r6) {
-		*(char *)(r7+KERNELBASE) = 0;
-		strcpy(cmd_line, (char *)(r6+KERNELBASE));
+		/* Load the command line */
+		if (r6) {
+			*(char *)(r7+KERNELBASE) = 0;
+			strcpy(cmd_line, (char *)(r6+KERNELBASE));
+		}
 	}

 	/* BAT setup */
===== arch/ppc/syslib/mpc52xx_setup.c 1.1 vs edited =====
--- 1.1/arch/ppc/syslib/mpc52xx_setup.c	2004-06-11 14:50:26 -07:00
+++ edited/arch/ppc/syslib/mpc52xx_setup.c	2004-06-17 15:14:53 -07:00
@@ -32,6 +32,14 @@
 #include <asm/mpc52xx_psc.h>
 #include <asm/ppcboot.h>

+extern bd_t __res;
+
+static int cpu_52xx[] = {
+	0,  0,  0,  10, 20, 20, 25, 45,
+	30, 55, 40, 50, 0,  60, 35, 0,
+	30, 25, 65, 10, 70, 20, 75, 45,
+	0,  55, 40, 50, 80, 60, 35, 0
+};

 void
 mpc52xx_restart(char *cmd)
@@ -110,8 +118,25 @@
 unsigned long __init
 mpc52xx_find_end_of_memory(void)
 {
-	/* We just read uBoot. We don't support anything else right now */
-	return __res.bi_memsize;
+	u32 ramsize = __res.bi_memsize;
+
+	/*
+	 * if bootloader passed a memsize, just use it
+	 * else get size from sdram config registers
+	 */
+	if (ramsize == 0) {
+		u32 sdram_config_0 = in_be32((u32 *)MPC52xx_SDRAM_CONFIG_0);
+		u32 sdram_config_1 = in_be32((u32 *)MPC52xx_SDRAM_CONFIG_1);
+
+		if ((sdram_config_0 & 0x1f) >= 0x13)
+			ramsize = 1 << ((sdram_config_0 & 0xf) + 17);
+
+		if (((sdram_config_1 & 0x1f) >= 0x13) &&
+				((sdram_config_1 & 0xfff00000) == ramsize))
+			ramsize += 1 << ((sdram_config_1 & 0xf) + 17);
+	}
+
+	return ramsize;
 }

 void __init
@@ -125,12 +150,46 @@
 mpc52xx_calibrate_decr(void)
 {
 	int freq, divisor;
-
+	struct mpc52xx_rtc *rtc = (struct mpc52xx_rtc*)MPC52xx_RTC;
+	struct mpc52xx_cdm *cdm = (struct mpc52xx_cdm*)MPC52xx_CDM;
+	int current_time, previous_time;
+	int tbl_start, tbl_end;
+	int cpufreq, ipbfreq, pcifreq;
+
 	freq = __res.bi_busfreq;
+	/* if bootloader didn't pass bus frequencies, calculate them */
+	if (freq == 0) {
+		previous_time = in_be32(&rtc->time);
+		while ((current_time = in_be32(&rtc->time)) == previous_time) ;
+		tbl_start = get_tbl();
+		previous_time = current_time;
+		while ((current_time = in_be32(&rtc->time)) == previous_time) ;
+		tbl_end = get_tbl();
+
+		freq = (tbl_end - tbl_start) * 4;
+
+		cpufreq = freq / 10 * cpu_52xx[in_be32(&cdm->rstcfg) & 0x1f];
+		ipbfreq = (in_8(&cdm->ipb_clk_sel) & 1) ?
+					freq / 2 : freq;
+		switch (in_8(&cdm->pci_clk_sel) & 3) {
+		case 0:
+			pcifreq = ipbfreq;
+			break;
+		case 1:
+			pcifreq = ipbfreq / 2;
+			break;
+		default:
+			pcifreq = ipbfreq / 4;
+			break;
+		}
+		__res.bi_busfreq = freq;
+		__res.bi_intfreq = cpufreq;
+		__res.bi_ipbfreq = ipbfreq;
+		__res.bi_pcifreq = pcifreq;
+	}

 	divisor = 4;

 	tb_ticks_per_jiffy = freq / HZ / divisor;
 	tb_to_us = mulhwu_scale_factor(freq / divisor, 1000000);
 }
-
===== drivers/serial/Kconfig 1.32 vs edited =====
--- 1.32/drivers/serial/Kconfig	2004-06-11 14:50:23 -07:00
+++ edited/drivers/serial/Kconfig	2004-06-17 15:02:12 -07:00
@@ -633,6 +633,15 @@
 	help
 	  Select this options if you'd like to use one of the PSC serial port
 	  of the Freescale MPC52xx family as a console.
+
+config SERIAL_MPC52xx_CONSOLE_BAUD
+	int "Freescale MPC52xx family PSC serial port baud"
+	depends on SERIAL_MPC52xx_CONSOLE=y
+	default "9600"
+	help
+	  Select the MPC52xx console baud rate.
+	  This value is only used if the bootloader doesn't pass in the
+	  console baudrate

 endmenu
===== drivers/serial/mpc52xx_uart.c 1.1 vs edited =====
--- 1.1/drivers/serial/mpc52xx_uart.c	2004-06-11 14:50:26 -07:00
+++ edited/drivers/serial/mpc52xx_uart.c	2004-06-17 15:28:36 -07:00
@@ -562,9 +565,11 @@
 	out_8(&psc->command,MPC52xx_PSC_SEL_MODE_REG_1);
 	mr1 = in_8(&psc->mode);

-	/* Parse them */
-	*baud = __res.bi_baudrate;	/* CT{U,L}R are write-only ! */
+	/* CT{U,L}R are write-only ! */
+	*baud = __res.bi_baudrate ?
+		__res.bi_baudrate : CONFIG_SERIAL_MPC52xx_CONSOLE_BAUD;

+	/* Parse them */
 	switch (mr1 & MPC52xx_PSC_MODE_BITS_MASK) {
 		case MPC52xx_PSC_MODE_5_BITS:	*bits = 5; break;
 		case MPC52xx_PSC_MODE_6_BITS:	*bits = 6; break;
===== include/asm-ppc/mpc52xx.h 1.1 vs edited =====
--- 1.1/include/asm-ppc/mpc52xx.h	2004-06-11 14:50:27 -07:00
+++ edited/include/asm-ppc/mpc52xx.h	2004-06-17 15:09:58 -07:00
@@ -68,6 +68,7 @@
 #define MPC52xx_SFTRST_BIT	0x01000000
 #define MPC52xx_INTR		(MPC52xx_MBAR + 0x0500)
 #define MPC52xx_GPT		(MPC52xx_MBAR + 0x0600)
+#define MPC52xx_RTC		(MPC52xx_MBAR + 0x0800)
 #define MPC52xx_MSCAN1		(MPC52xx_MBAR + 0x0900)
 #define MPC52xx_MSCAN2		(MPC52xx_MBAR + 0x0980)
 #define MPC52xx_GPIO		(MPC52xx_MBAR + 0x0b00)
@@ -280,6 +281,18 @@
 	volatile u32		EU37;		/* SDMA + 0xfc */
 };

+struct mpc52xx_rtc {
+	volatile u32 time_set;          /* RTC + 0x00 */
+	volatile u32 date_set;          /* RTC + 0x04 */
+	volatile u32 stopwatch;         /* RTC + 0x08 */
+	volatile u32 int_enable;        /* RTC + 0x0c */
+	volatile u32 time;              /* RTC + 0x10 */
+	volatile u32 date;              /* RTC + 0x14 */
+	volatile u32 stopwatch_intr;    /* RTC + 0x18 */
+	volatile u32 bus_error;         /* RTC + 0x1c */
+	volatile u32 dividers;          /* RTC + 0x20 */
+};
+
 /* GPIO */
 struct mpc52xx_gpio {
 	volatile u32		port_config;	/* GPIO + 0x00 */
@@ -312,6 +325,10 @@
 	volatile u8		reserved10;	/* GPIO + 0x3f */
 };

+#define MPC52xx_GPIO_PSC_CONFIG_UART_WITHOUT_CD	4
+#define MPC52xx_GPIO_PSC_CONFIG_UART_WITH_CD	5
+#define MPC52xx_GPIO_PCI_DIS			(1<<15)
+
 /* XLB Bus control */
 struct mpc52xx_xlb {
 	volatile u8  reserved[0x40];
** Sent via the linuxppc-dev mail list. See http://lists.linuxppc.org/

Re: MPC52xx lite5200 support for booting from dBUG

From: Sylvain Munaut <hidden>
Date: 2004-06-19 10:42:05

Thanks,

I think a file ( arch/ppc/boot/simple/mpc52xx_tty.c ) is missing from
the patch.


   Sylvain Munaut


Dale Farnsworth wrote:
This patch allows Sylvain's 2.6 support for the lite5200 to boot
from dBUG as well as U-Boot.

When the arch/ppc/boot/simple bootwrapper is used, it computes the
values that U-boot would have supplied and stores them in __res.
That works for all needed fields except __res.bi_baudrate, which
can't be determined from the environment.  So, I added
CONFIG_SERIAL_MPC52xx_CONSOLE_BAUD to supply the default baud rate.
 The value of CONFIG_SERIAL_MPC52xx_CONSOLE_BAUD is ignored if the
bootloader (U-boot) supplies the baudrate.

-Dale Farnsworth

** Sent via the linuxppc-dev mail list. See http://lists.linuxppc.org/

Re: [PATCH][RFC] MPC52xx basic support on linux 2.6 (was DMA support for MPC5xxx?)

From: Sylvain Munaut <hidden>
Date: 2004-06-19 10:55:25

Dale Farnsworth wrote:
On Thu, Jun 10, 2004 at 07:50:04PM +0000, Sylvain Munaut wrote:

quoted
Here it is, slightly delayed because of hardrive crash and need to
rename all 'Motorola' to 'Freescale' ;)

It's there :

http://www.246tNt.com/linux-2.5-mpc52xx-pending-20040610.diff
bk://bkbits.246tNt.com/linux-2.5-mpc52xx-pending
FWIW, I'd like to see the above go into linux-2.5.

I found a few issues.
 - need to call uart_update_timeout
 - Maximum delay for console_write (printk) was too short
 - one missed icecube to lite5200 name change.

This patch applies on top Sylvain's patch above.
Thanks,

Merged with others bits I fixed.
Already in the -devel tree. I'll push it to the others as soon as I
figure how to do it with bitkeeper ;) ...


Sylvain Munaut

** Sent via the linuxppc-dev mail list. See http://lists.linuxppc.org/

Re: MPC52xx lite5200 support for booting from dBUG

From: Dale Farnsworth <hidden>
Date: 2004-06-19 22:07:52

On Sat, Jun 19, 2004 at 10:42:05AM +0000, Sylvain Munaut wrote:
I think a file ( arch/ppc/boot/simple/mpc52xx_tty.c ) is missing from
the patch.
Your right.  Here it is.
-Dale

# This is a BitKeeper generated diff -Nru style patch.
#
# ChangeSet
#   2004/06/17 16:35:56-07:00 dfarnsworth@mvista.com
#   Oops, need arch/ppc/boot/simple/mpc52xx_tty.c too.
#
# arch/ppc/boot/simple/mpc52xx_tty.c
#   2004/06/17 16:35:49-07:00 dfarnsworth@mvista.com +141 -0
#
# arch/ppc/boot/simple/mpc52xx_tty.c
#   2004/06/17 16:35:49-07:00 dfarnsworth@mvista.com +0 -0
#   BitKeeper file /x/bk/linux-2.5-lite5200/arch/ppc/boot/simple/mpc52xx_tty.c
#
diff -Nru a/arch/ppc/boot/simple/mpc52xx_tty.c b/arch/ppc/boot/simple/mpc52xx_tty.c
--- /dev/null	Wed Dec 31 16:00:00 196900
+++ b/arch/ppc/boot/simple/mpc52xx_tty.c	2004-06-19 15:06:17 -07:00
@@ -0,0 +1,141 @@
+/*
+ * arch/ppc/boot/simple/mpc52xx_tty.c
+ *
+ * Minimal serial functions needed to send messages out a MPC52xx
+ * Programmable Serial Controller (PSC).
+ *
+ * Author: Dale Farnsworth <dfarnsworth@mvista.com>
+ *
+ * 2003-2004 (c) MontaVista, Software, Inc.  This file is licensed under the
+ * terms of the GNU General Public License version 2.  This program is licensed
+ * "as is" without any warranty of any kind, whether express or implied.
+ */
+
+#include <linux/config.h>
+#include <linux/types.h>
+#include <asm/uaccess.h>
+#include <asm/mpc52xx.h>
+#include <asm/mpc52xx_psc.h>
+#include <asm/serial.h>
+#include <asm/time.h>
+
+#if MPC52xx_PF_CONSOLE_PORT == 0
+#define MPC52xx_CONSOLE		MPC52xx_PSC1
+#define MPC52xx_PSC_CONFIG_SHIFT	0
+#elif MPC52xx_PF_CONSOLE_PORT == 1
+#define MPC52xx_CONSOLE		MPC52xx_PSC2
+#define MPC52xx_PSC_CONFIG_SHIFT	4
+#elif MPC52xx_PF_CONSOLE_PORT == 2
+#define MPC52xx_CONSOLE		MPC52xx_PSC3
+#define MPC52xx_PSC_CONFIG_SHIFT	8
+#else
+#error "MPC52xx_PF_CONSOLE_PORT not defined"
+#endif
+
+static struct mpc52xx_psc *psc = (struct mpc52xx_psc *)MPC52xx_CONSOLE;
+
+/* The decrementer counts at the system bus clock frequency
+ * divided by four.  The most accurate time base is connected to the
+ * rtc.  We read the decrementer change during one rtc tick (one second)
+ * and multiply by 4 to get the system bus clock frequency.
+ */
+int
+mpc52xx_ipbfreq(void)
+{
+	int busfreq, ipbfreq;
+	struct mpc52xx_rtc *rtc = (struct mpc52xx_rtc*)MPC52xx_RTC;
+	struct mpc52xx_cdm *cdm = (struct mpc52xx_cdm*)MPC52xx_CDM;
+	int current_time, previous_time;
+	int tbl_start, tbl_end;
+
+	/* force ipb to 66MHz and PCI to 33MHz */
+	out_8(&cdm->ipb_clk_sel, 1);
+	out_8(&cdm->pci_clk_sel, 1);
+
+	previous_time = in_be32(&rtc->time);
+	while ((current_time = in_be32(&rtc->time)) == previous_time) ;
+	tbl_start = get_tbl();
+	previous_time = current_time;
+	while ((current_time = in_be32(&rtc->time)) == previous_time) ;
+	tbl_end = get_tbl();
+
+	busfreq = (tbl_end - tbl_start) * 4;
+
+	ipbfreq = (in_8(&cdm->ipb_clk_sel) & 1) ? busfreq / 2 : busfreq;
+
+	return ipbfreq;
+}
+
+unsigned long
+serial_init(int ignored, void *ignored2)
+{
+	struct mpc52xx_gpio *gpio = (struct mpc52xx_gpio *)MPC52xx_GPIO;
+	int divisor;
+	int mode1;
+	int mode2;
+	u32 val32;
+
+	static int been_here = 0;
+
+	if (been_here)
+		return 0;
+
+	been_here = 1;
+
+	val32 = in_be32(&gpio->port_config);
+	val32 &= ~(0x7 << MPC52xx_PSC_CONFIG_SHIFT);
+	val32 |= MPC52xx_GPIO_PSC_CONFIG_UART_WITHOUT_CD
+				<< MPC52xx_PSC_CONFIG_SHIFT;
+	out_be32(&gpio->port_config, val32);
+
+	out_8(&psc->command, MPC52xx_PSC_RST_TX
+			| MPC52xx_PSC_RX_DISABLE | MPC52xx_PSC_TX_ENABLE);
+	out_8(&psc->command, MPC52xx_PSC_RST_RX);
+
+	out_be32(&psc->sicr, 0x0);
+	out_be16(&psc->mpc52xx_psc_clock_select, 0xdd00);
+	out_be16(&psc->tfalarm, 0xf8);
+
+	out_8(&psc->command, MPC52xx_PSC_SEL_MODE_REG_1
+			| MPC52xx_PSC_RX_ENABLE
+			| MPC52xx_PSC_TX_ENABLE);
+
+	divisor = ((mpc52xx_ipbfreq()
+			/ (CONFIG_SERIAL_MPC52xx_CONSOLE_BAUD * 16)) + 1) >> 1;
+
+	mode1 = MPC52xx_PSC_MODE_8_BITS | MPC52xx_PSC_MODE_PARNONE
+			| MPC52xx_PSC_MODE_ERR;
+	mode2 = MPC52xx_PSC_MODE_ONE_STOP;
+
+	out_8(&psc->ctur, divisor>>8);
+	out_8(&psc->ctlr, divisor);
+	out_8(&psc->command, MPC52xx_PSC_SEL_MODE_REG_1);
+	out_8(&psc->mode, mode1);
+	out_8(&psc->mode, mode2);
+
+	return 0;	/* ignored */
+}
+
+void
+serial_putc(void *ignored, const char c)
+{
+	serial_init(0, 0);
+
+	while (!(in_be16(&psc->mpc52xx_psc_status) & MPC52xx_PSC_SR_TXEMP)) ;
+	out_8(&psc->mpc52xx_psc_buffer_8, c);
+	while (!(in_be16(&psc->mpc52xx_psc_status) & MPC52xx_PSC_SR_TXEMP)) ;
+}
+
+char
+serial_getc(void *ignored)
+{
+	while (!(in_be16(&psc->mpc52xx_psc_status) & MPC52xx_PSC_SR_RXRDY)) ;
+
+	return in_8(&psc->mpc52xx_psc_buffer_8);
+}
+
+int
+serial_tstc(void *ignored)
+{
+	return (in_be16(&psc->mpc52xx_psc_status) & MPC52xx_PSC_SR_RXRDY) != 0;
+}
** Sent via the linuxppc-dev mail list. See http://lists.linuxppc.org/
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help