* [PATCH 1/2] pmac-zilog: add platform driver
@ 2009-11-17 9:04 Finn Thain
2009-12-23 20:16 ` Geert Uytterhoeven
` (2 more replies)
0 siblings, 3 replies; 13+ messages in thread
From: Finn Thain @ 2009-11-17 9:04 UTC (permalink / raw)
To: Geert Uytterhoeven; +Cc: linux-m68k, linuxppc-dev
Add platform driver to the pmac-zilog driver for mac 68k, putting the
powermac-specific bits inside #ifdef CONFIG_PPC_PMAC.
This patch should be applied after "[PATCH 3/13] pmac-zilog: cleanup". It
renders obsolete the version in "[PATCH 4/13] pmac-zilog, mac68k: replace
mac68k SCC code with platform".
Signed-off-by: Finn Thain <fthain@telegraphics.com.au>
---
arch/m68k/configs/mac_defconfig | 5 +
arch/m68k/configs/multi_defconfig | 5 +
drivers/serial/Kconfig | 12 +-
drivers/serial/pmac_zilog.c | 159 +++++++++++++++++++++++++++++++++-----
drivers/serial/pmac_zilog.h | 14 +++
5 files changed, 169 insertions(+), 26 deletions(-)
Index: linux-2.6.31/drivers/serial/Kconfig
===================================================================
--- linux-2.6.31.orig/drivers/serial/Kconfig 2009-11-17 17:05:27.000000000 +1100
+++ linux-2.6.31/drivers/serial/Kconfig 2009-11-17 17:07:38.000000000 +1100
@@ -1079,12 +1079,12 @@ config SERIAL_68360
default y
config SERIAL_PMACZILOG
- tristate "PowerMac z85c30 ESCC support"
- depends on PPC_OF && PPC_PMAC
+ tristate "Mac or PowerMac z85c30 ESCC support"
+ depends on (M68K && MAC) || (PPC_OF && PPC_PMAC)
select SERIAL_CORE
help
This driver supports the Zilog z85C30 serial ports found on
- PowerMac machines.
+ (Power)Mac machines.
Say Y or M if you want to be able to these serial ports.
config SERIAL_PMACZILOG_TTYS
@@ -1109,16 +1109,16 @@ config SERIAL_PMACZILOG_TTYS
unable to use the 8250 module for PCMCIA or other 16C550-style
UARTs.
- Say N unless you need the z85c30 ports on your powermac
+ Say N unless you need the z85c30 ports on your (Power)Mac
to appear as /dev/ttySn.
config SERIAL_PMACZILOG_CONSOLE
- bool "Console on PowerMac z85c30 serial port"
+ bool "Console on Mac or PowerMac z85c30 serial port"
depends on SERIAL_PMACZILOG=y
select SERIAL_CORE_CONSOLE
help
If you would like to be able to use the z85c30 serial port
- on your PowerMac as the console, you can do so by answering
+ on your (Power)Mac as the console, you can do so by answering
Y to this option.
config SERIAL_LH7A40X
Index: linux-2.6.31/arch/m68k/configs/mac_defconfig
===================================================================
--- linux-2.6.31.orig/arch/m68k/configs/mac_defconfig 2009-11-17 17:07:29.000000000 +1100
+++ linux-2.6.31/arch/m68k/configs/mac_defconfig 2009-11-17 17:07:38.000000000 +1100
@@ -701,6 +701,11 @@ CONFIG_VT_HW_CONSOLE_BINDING=y
#
# Non-8250 serial port support
#
+CONFIG_SERIAL_CORE=y
+CONFIG_SERIAL_CORE_CONSOLE=y
+CONFIG_SERIAL_PMACZILOG=y
+CONFIG_SERIAL_PMACZILOG_TTYS=y
+CONFIG_SERIAL_PMACZILOG_CONSOLE=y
CONFIG_UNIX98_PTYS=y
# CONFIG_DEVPTS_MULTIPLE_INSTANCES is not set
CONFIG_LEGACY_PTYS=y
Index: linux-2.6.31/arch/m68k/configs/multi_defconfig
===================================================================
--- linux-2.6.31.orig/arch/m68k/configs/multi_defconfig 2009-11-17 17:07:29.000000000 +1100
+++ linux-2.6.31/arch/m68k/configs/multi_defconfig 2009-11-17 17:07:38.000000000 +1100
@@ -822,6 +822,11 @@ CONFIG_A2232=y
#
# Non-8250 serial port support
#
+CONFIG_SERIAL_CORE=y
+CONFIG_SERIAL_CORE_CONSOLE=y
+CONFIG_SERIAL_PMACZILOG=y
+CONFIG_SERIAL_PMACZILOG_TTYS=y
+CONFIG_SERIAL_PMACZILOG_CONSOLE=y
CONFIG_UNIX98_PTYS=y
# CONFIG_DEVPTS_MULTIPLE_INSTANCES is not set
CONFIG_LEGACY_PTYS=y
Index: linux-2.6.31/drivers/serial/pmac_zilog.c
===================================================================
--- linux-2.6.31.orig/drivers/serial/pmac_zilog.c 2009-11-17 17:07:28.000000000 +1100
+++ linux-2.6.31/drivers/serial/pmac_zilog.c 2009-11-17 17:07:38.000000000 +1100
@@ -63,11 +63,18 @@
#include <asm/sections.h>
#include <asm/io.h>
#include <asm/irq.h>
+
+#ifdef CONFIG_PPC_PMAC
#include <asm/prom.h>
#include <asm/machdep.h>
#include <asm/pmac_feature.h>
#include <asm/dbdma.h>
#include <asm/macio.h>
+#else
+#include <linux/platform_device.h>
+#include <asm/macints.h>
+#define machine_is_compatible(x) (0)
+#endif
#if defined (CONFIG_SERIAL_PMACZILOG_CONSOLE) && defined(CONFIG_MAGIC_SYSRQ)
#define SUPPORT_SYSRQ
@@ -83,11 +90,9 @@
static char version[] __initdata = "pmac_zilog: 0.6 (Benjamin Herrenschmidt <benh@kernel.crashing.org>)";
MODULE_AUTHOR("Benjamin Herrenschmidt <benh@kernel.crashing.org>");
-MODULE_DESCRIPTION("Driver for the PowerMac serial ports.");
+MODULE_DESCRIPTION("Driver for the Mac and PowerMac serial ports.");
MODULE_LICENSE("GPL");
-#define PWRDBG(fmt, arg...) printk(KERN_DEBUG fmt , ## arg)
-
#ifdef CONFIG_SERIAL_PMACZILOG_TTYS
#define PMACZILOG_MAJOR TTY_MAJOR
#define PMACZILOG_MINOR 64
@@ -341,7 +346,7 @@ static struct tty_struct *pmz_receive_ch
uap->curregs[R1] &= ~(EXT_INT_ENAB | TxINT_ENAB | RxINT_MASK);
write_zsreg(uap, R1, uap->curregs[R1]);
zssync(uap);
- dev_err(&uap->dev->ofdev.dev, "pmz: rx irq flood !\n");
+ pmz_error("pmz: rx irq flood !\n");
return tty;
}
@@ -746,6 +751,8 @@ static void pmz_break_ctl(struct uart_po
spin_unlock_irqrestore(&port->lock, flags);
}
+#ifdef CONFIG_PPC_PMAC
+
/*
* Turn power on or off to the SCC and associated stuff
* (port drivers, modem, IR port, etc.)
@@ -781,6 +788,15 @@ static int pmz_set_scc_power(struct uart
return delay;
}
+#else
+
+static int pmz_set_scc_power(struct uart_pmac_port *uap, int state)
+{
+ return 0;
+}
+
+#endif /* !CONFIG_PPC_PMAC */
+
/*
* FixZeroBug....Works around a bug in the SCC receving channel.
* Inspired from Darwin code, 15 Sept. 2000 -DanM
@@ -943,9 +959,9 @@ static int pmz_startup(struct uart_port
}
pmz_get_port_A(uap)->flags |= PMACZILOG_FLAG_IS_IRQ_ON;
- if (request_irq(uap->port.irq, pmz_interrupt, IRQF_SHARED, "PowerMac Zilog", uap)) {
- dev_err(&uap->dev->ofdev.dev,
- "Unable to register zs interrupt handler.\n");
+ if (request_irq(uap->port.irq, pmz_interrupt, IRQF_SHARED,
+ "SCC", uap)) {
+ pmz_error("Unable to register zs interrupt handler.\n");
pmz_set_scc_power(uap, 0);
mutex_unlock(&pmz_irq_mutex);
return -ENXIO;
@@ -1185,7 +1201,7 @@ static void pmz_irda_setup(struct uart_p
while ((read_zsreg(uap, R0) & Tx_BUF_EMP) == 0
|| (read_zsreg(uap, R1) & ALL_SNT) == 0) {
if (--t <= 0) {
- dev_err(&uap->dev->ofdev.dev, "transmitter didn't drain\n");
+ pmz_error("transmitter didn't drain\n");
return;
}
udelay(10);
@@ -1201,7 +1217,7 @@ static void pmz_irda_setup(struct uart_p
read_zsdata(uap);
mdelay(10);
if (--t <= 0) {
- dev_err(&uap->dev->ofdev.dev, "receiver didn't drain\n");
+ pmz_error("receiver didn't drain\n");
return;
}
}
@@ -1222,8 +1238,7 @@ static void pmz_irda_setup(struct uart_p
t = 5000;
while ((read_zsreg(uap, R0) & Rx_CH_AV) == 0) {
if (--t <= 0) {
- dev_err(&uap->dev->ofdev.dev,
- "irda_setup timed out on get_version byte\n");
+ pmz_error("irda_setup timed out on get_version byte\n");
goto out;
}
udelay(10);
@@ -1231,8 +1246,7 @@ static void pmz_irda_setup(struct uart_p
version = read_zsdata(uap);
if (version < 4) {
- dev_info(&uap->dev->ofdev.dev, "IrDA: dongle version %d not supported\n",
- version);
+ pmz_info("IrDA: dongle version %d not supported\n", version);
goto out;
}
@@ -1241,19 +1255,17 @@ static void pmz_irda_setup(struct uart_p
t = 5000;
while ((read_zsreg(uap, R0) & Rx_CH_AV) == 0) {
if (--t <= 0) {
- dev_err(&uap->dev->ofdev.dev,
- "irda_setup timed out on speed mode byte\n");
+ pmz_error("irda_setup timed out on speed mode byte\n");
goto out;
}
udelay(10);
}
t = read_zsdata(uap);
if (t != cmdbyte)
- dev_err(&uap->dev->ofdev.dev,
- "irda_setup speed mode byte = %x (%x)\n", t, cmdbyte);
+ pmz_error("irda_setup speed mode byte = %x (%x)\n", t, cmdbyte);
- dev_info(&uap->dev->ofdev.dev, "IrDA setup for %ld bps, dongle version: %d\n",
- *baud, version);
+ pmz_info("IrDA setup for %ld bps, dongle version: %d\n",
+ *baud, version);
(void)read_zsdata(uap);
(void)read_zsdata(uap);
@@ -1402,7 +1414,7 @@ static void pmz_poll_put_char(struct uar
write_zsdata(uap, c);
}
-#endif
+#endif /* CONFIG_CONSOLE_POLL */
static struct uart_ops pmz_pops = {
.tx_empty = pmz_tx_empty,
@@ -1427,6 +1439,8 @@ static struct uart_ops pmz_pops = {
#endif
};
+#ifdef CONFIG_PPC_PMAC
+
/*
* Setup one port structure after probing, HW is down at this point,
* Unlike sunzilog, we don't need to pre-init the spinlock as we don't
@@ -1823,6 +1837,88 @@ next:
return 0;
}
+#else
+
+extern struct platform_device scc_a_pdev, scc_b_pdev;
+
+static int __init pmz_init_port(struct uart_pmac_port *uap)
+{
+ struct resource *r_ports;
+ int irq;
+
+ r_ports = platform_get_resource(uap->node, IORESOURCE_MEM, 0);
+ irq = platform_get_irq(uap->node, 0);
+ if (!r_ports || !irq)
+ return -ENODEV;
+
+ uap->port.mapbase = r_ports->start;
+ uap->port.membase = (unsigned char __iomem *) r_ports->start;
+ uap->port.iotype = UPIO_MEM;
+ uap->port.irq = irq;
+ uap->port.uartclk = ZS_CLOCK;
+ uap->port.fifosize = 1;
+ uap->port.ops = &pmz_pops;
+ uap->port.type = PORT_PMAC_ZILOG;
+ uap->port.flags = 0;
+
+ uap->control_reg = uap->port.membase;
+ uap->data_reg = uap->control_reg + 4;
+ uap->port_type = 0;
+
+ pmz_convert_to_zs(uap, CS8, 0, 9600);
+
+ return 0;
+}
+
+static int __init pmz_probe(void)
+{
+ int err;
+
+ pmz_ports_count = 0;
+
+ pmz_ports[0].mate = &pmz_ports[1];
+ pmz_ports[0].port.line = 0;
+ pmz_ports[0].flags = PMACZILOG_FLAG_IS_CHANNEL_A;
+ pmz_ports[0].node = &scc_a_pdev;
+ err = pmz_init_port(&pmz_ports[0]);
+ if (err)
+ return err;
+ pmz_ports_count++;
+
+ pmz_ports[1].mate = &pmz_ports[0];
+ pmz_ports[1].port.line = 1;
+ pmz_ports[1].flags = 0;
+ pmz_ports[1].node = &scc_b_pdev;
+ err = pmz_init_port(&pmz_ports[1]);
+ if (err)
+ return err;
+ pmz_ports_count++;
+
+ return 0;
+}
+
+static void pmz_dispose_port(struct uart_pmac_port *uap)
+{
+ memset(uap, 0, sizeof(struct uart_pmac_port));
+}
+
+static int pmz_attach(struct platform_device *pdev)
+{
+ int i;
+
+ for (i = 0; i < pmz_ports_count; i++)
+ if (pmz_ports[i].node == pdev)
+ return 0;
+ return -ENODEV;
+}
+
+static int pmz_detach(struct platform_device *pdev)
+{
+ return 0;
+}
+
+#endif /* !CONFIG_PPC_PMAC */
+
#ifdef CONFIG_SERIAL_PMACZILOG_CONSOLE
static void pmz_console_write(struct console *con, const char *s, unsigned int count);
@@ -1883,6 +1979,8 @@ err_out:
return rc;
}
+#ifdef CONFIG_PPC_PMAC
+
static struct of_device_id pmz_match[] =
{
{
@@ -1904,6 +2002,19 @@ static struct macio_driver pmz_driver =
.resume = pmz_resume,
};
+#else
+
+static struct platform_driver pmz_driver = {
+ .probe = pmz_attach,
+ .remove = __devexit_p(pmz_detach),
+ .driver = {
+ .name = "scc",
+ .owner = THIS_MODULE,
+ },
+};
+
+#endif /* !CONFIG_PPC_PMAC */
+
static int __init init_pmz(void)
{
int rc, i;
@@ -1942,15 +2053,23 @@ static int __init init_pmz(void)
/*
* Then we register the macio driver itself
*/
+#ifdef CONFIG_PPC_PMAC
return macio_register_driver(&pmz_driver);
+#else
+ return platform_driver_register(&pmz_driver);
+#endif
}
static void __exit exit_pmz(void)
{
int i;
+#ifdef CONFIG_PPC_PMAC
/* Get rid of macio-driver (detach from macio) */
macio_unregister_driver(&pmz_driver);
+#else
+ platform_driver_unregister(&pmz_driver);
+#endif
for (i = 0; i < pmz_ports_count; i++) {
struct uart_pmac_port *uport = &pmz_ports[i];
Index: linux-2.6.31/drivers/serial/pmac_zilog.h
===================================================================
--- linux-2.6.31.orig/drivers/serial/pmac_zilog.h 2009-11-17 17:07:28.000000000 +1100
+++ linux-2.6.31/drivers/serial/pmac_zilog.h 2009-11-17 17:07:38.000000000 +1100
@@ -1,7 +1,15 @@
#ifndef __PMAC_ZILOG_H__
#define __PMAC_ZILOG_H__
+#ifdef CONFIG_PPC_PMAC
#define pmz_debug(fmt, arg...) dev_dbg(&uap->dev->ofdev.dev, fmt, ## arg)
+#define pmz_error(fmt, arg...) dev_err(&uap->dev->ofdev.dev, fmt, ## arg)
+#define pmz_info(fmt, arg...) dev_info(&uap->dev->ofdev.dev, fmt, ## arg)
+#else
+#define pmz_debug(fmt, arg...) do { } while (0)
+#define pmz_error(fmt, arg...) printk(KERN_ERR fmt, ## arg)
+#define pmz_info(fmt, arg...) printk(KERN_INFO fmt, ## arg)
+#endif
/*
* At most 2 ESCCs with 2 ports each
@@ -17,6 +25,7 @@ struct uart_pmac_port {
struct uart_port port;
struct uart_pmac_port *mate;
+#ifdef CONFIG_PPC_PMAC
/* macio_dev for the escc holding this port (maybe be null on
* early inited port)
*/
@@ -25,6 +34,9 @@ struct uart_pmac_port {
* of "escc" node (ie. ch-a or ch-b)
*/
struct device_node *node;
+#else
+ struct platform_device *node;
+#endif
/* Port type as obtained from device tree (IRDA, modem, ...) */
int port_type;
@@ -55,10 +67,12 @@ struct uart_pmac_port {
volatile u8 __iomem *control_reg;
volatile u8 __iomem *data_reg;
+#ifdef CONFIG_PPC_PMAC
unsigned int tx_dma_irq;
unsigned int rx_dma_irq;
volatile struct dbdma_regs __iomem *tx_dma_regs;
volatile struct dbdma_regs __iomem *rx_dma_regs;
+#endif
struct ktermios termios_cache;
};
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH 1/2] pmac-zilog: add platform driver
2009-11-17 9:04 [PATCH 1/2] pmac-zilog: add platform driver Finn Thain
@ 2009-12-23 20:16 ` Geert Uytterhoeven
2010-01-02 12:43 ` Geert Uytterhoeven
2010-01-07 21:12 ` Geert Uytterhoeven
2 siblings, 0 replies; 13+ messages in thread
From: Geert Uytterhoeven @ 2009-12-23 20:16 UTC (permalink / raw)
To: Finn Thain; +Cc: linux-m68k, linuxppc-dev
On Tue, Nov 17, 2009 at 10:04, Finn Thain <fthain@telegraphics.com.au> wrot=
e:
> Add platform driver to the pmac-zilog driver for mac 68k, putting the
> powermac-specific bits inside #ifdef CONFIG_PPC_PMAC.
Ben, OK for you?
> This patch should be applied after "[PATCH 3/13] pmac-zilog: cleanup". It
> renders obsolete the version in "[PATCH 4/13] pmac-zilog, mac68k: replace
> mac68k SCC code with platform".
>
> Signed-off-by: Finn Thain <fthain@telegraphics.com.au>
>
> ---
> =C2=A0arch/m68k/configs/mac_defconfig =C2=A0 | =C2=A0 =C2=A05 +
> =C2=A0arch/m68k/configs/multi_defconfig | =C2=A0 =C2=A05 +
> =C2=A0drivers/serial/Kconfig =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0| =
=C2=A0 12 +-
> =C2=A0drivers/serial/pmac_zilog.c =C2=A0 =C2=A0 =C2=A0 | =C2=A0159 ++++++=
+++++++++++++++++++++++++++-----
> =C2=A0drivers/serial/pmac_zilog.h =C2=A0 =C2=A0 =C2=A0 | =C2=A0 14 +++
> =C2=A05 files changed, 169 insertions(+), 26 deletions(-)
>
> Index: linux-2.6.31/drivers/serial/Kconfig
> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
> --- linux-2.6.31.orig/drivers/serial/Kconfig =C2=A0 =C2=A02009-11-17 17:0=
5:27.000000000 +1100
> +++ linux-2.6.31/drivers/serial/Kconfig 2009-11-17 17:07:38.000000000 +11=
00
> @@ -1079,12 +1079,12 @@ config SERIAL_68360
> =C2=A0 =C2=A0 =C2=A0 =C2=A0default y
>
> =C2=A0config SERIAL_PMACZILOG
> - =C2=A0 =C2=A0 =C2=A0 tristate "PowerMac z85c30 ESCC support"
> - =C2=A0 =C2=A0 =C2=A0 depends on PPC_OF && PPC_PMAC
> + =C2=A0 =C2=A0 =C2=A0 tristate "Mac or PowerMac z85c30 ESCC support"
> + =C2=A0 =C2=A0 =C2=A0 depends on (M68K && MAC) || (PPC_OF && PPC_PMAC)
> =C2=A0 =C2=A0 =C2=A0 =C2=A0select SERIAL_CORE
> =C2=A0 =C2=A0 =C2=A0 =C2=A0help
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0This driver supports the Zilog z85C30 s=
erial ports found on
> - =C2=A0 =C2=A0 =C2=A0 =C2=A0 PowerMac machines.
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 (Power)Mac machines.
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0Say Y or M if you want to be able to th=
ese serial ports.
>
> =C2=A0config SERIAL_PMACZILOG_TTYS
> @@ -1109,16 +1109,16 @@ config SERIAL_PMACZILOG_TTYS
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0unable to use the 8250 module for PCMCI=
A or other 16C550-style
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0UARTs.
>
> - =C2=A0 =C2=A0 =C2=A0 =C2=A0 Say N unless you need the z85c30 ports on y=
our powermac
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 Say N unless you need the z85c30 ports on y=
our (Power)Mac
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0to appear as /dev/ttySn.
>
> =C2=A0config SERIAL_PMACZILOG_CONSOLE
> - =C2=A0 =C2=A0 =C2=A0 bool "Console on PowerMac z85c30 serial port"
> + =C2=A0 =C2=A0 =C2=A0 bool "Console on Mac or PowerMac z85c30 serial por=
t"
> =C2=A0 =C2=A0 =C2=A0 =C2=A0depends on SERIAL_PMACZILOG=3Dy
> =C2=A0 =C2=A0 =C2=A0 =C2=A0select SERIAL_CORE_CONSOLE
> =C2=A0 =C2=A0 =C2=A0 =C2=A0help
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0If you would like to be able to use the=
z85c30 serial port
> - =C2=A0 =C2=A0 =C2=A0 =C2=A0 on your PowerMac as the console, you can do=
so by answering
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 on your (Power)Mac as the console, you can =
do so by answering
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0Y to this option.
>
> =C2=A0config SERIAL_LH7A40X
> Index: linux-2.6.31/arch/m68k/configs/mac_defconfig
> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
> --- linux-2.6.31.orig/arch/m68k/configs/mac_defconfig =C2=A0 2009-11-17 1=
7:07:29.000000000 +1100
> +++ linux-2.6.31/arch/m68k/configs/mac_defconfig =C2=A0 =C2=A0 =C2=A0 =C2=
=A02009-11-17 17:07:38.000000000 +1100
> @@ -701,6 +701,11 @@ CONFIG_VT_HW_CONSOLE_BINDING=3Dy
> =C2=A0#
> =C2=A0# Non-8250 serial port support
> =C2=A0#
> +CONFIG_SERIAL_CORE=3Dy
> +CONFIG_SERIAL_CORE_CONSOLE=3Dy
> +CONFIG_SERIAL_PMACZILOG=3Dy
> +CONFIG_SERIAL_PMACZILOG_TTYS=3Dy
> +CONFIG_SERIAL_PMACZILOG_CONSOLE=3Dy
> =C2=A0CONFIG_UNIX98_PTYS=3Dy
> =C2=A0# CONFIG_DEVPTS_MULTIPLE_INSTANCES is not set
> =C2=A0CONFIG_LEGACY_PTYS=3Dy
> Index: linux-2.6.31/arch/m68k/configs/multi_defconfig
> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
> --- linux-2.6.31.orig/arch/m68k/configs/multi_defconfig 2009-11-17 17:07:=
29.000000000 +1100
> +++ linux-2.6.31/arch/m68k/configs/multi_defconfig =C2=A0 =C2=A0 =C2=A020=
09-11-17 17:07:38.000000000 +1100
> @@ -822,6 +822,11 @@ CONFIG_A2232=3Dy
> =C2=A0#
> =C2=A0# Non-8250 serial port support
> =C2=A0#
> +CONFIG_SERIAL_CORE=3Dy
> +CONFIG_SERIAL_CORE_CONSOLE=3Dy
> +CONFIG_SERIAL_PMACZILOG=3Dy
> +CONFIG_SERIAL_PMACZILOG_TTYS=3Dy
> +CONFIG_SERIAL_PMACZILOG_CONSOLE=3Dy
> =C2=A0CONFIG_UNIX98_PTYS=3Dy
> =C2=A0# CONFIG_DEVPTS_MULTIPLE_INSTANCES is not set
> =C2=A0CONFIG_LEGACY_PTYS=3Dy
> Index: linux-2.6.31/drivers/serial/pmac_zilog.c
> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
> --- linux-2.6.31.orig/drivers/serial/pmac_zilog.c =C2=A0 =C2=A0 =C2=A0 20=
09-11-17 17:07:28.000000000 +1100
> +++ linux-2.6.31/drivers/serial/pmac_zilog.c =C2=A0 =C2=A02009-11-17 17:0=
7:38.000000000 +1100
> @@ -63,11 +63,18 @@
> =C2=A0#include <asm/sections.h>
> =C2=A0#include <asm/io.h>
> =C2=A0#include <asm/irq.h>
> +
> +#ifdef CONFIG_PPC_PMAC
> =C2=A0#include <asm/prom.h>
> =C2=A0#include <asm/machdep.h>
> =C2=A0#include <asm/pmac_feature.h>
> =C2=A0#include <asm/dbdma.h>
> =C2=A0#include <asm/macio.h>
> +#else
> +#include <linux/platform_device.h>
> +#include <asm/macints.h>
> +#define machine_is_compatible(x) (0)
> +#endif
>
> =C2=A0#if defined (CONFIG_SERIAL_PMACZILOG_CONSOLE) && defined(CONFIG_MAG=
IC_SYSRQ)
> =C2=A0#define SUPPORT_SYSRQ
> @@ -83,11 +90,9 @@
>
> =C2=A0static char version[] __initdata =3D "pmac_zilog: 0.6 (Benjamin Her=
renschmidt <benh@kernel.crashing.org>)";
> =C2=A0MODULE_AUTHOR("Benjamin Herrenschmidt <benh@kernel.crashing.org>");
> -MODULE_DESCRIPTION("Driver for the PowerMac serial ports.");
> +MODULE_DESCRIPTION("Driver for the Mac and PowerMac serial ports.");
> =C2=A0MODULE_LICENSE("GPL");
>
> -#define PWRDBG(fmt, arg...) =C2=A0 =C2=A0printk(KERN_DEBUG fmt , ## arg)
> -
> =C2=A0#ifdef CONFIG_SERIAL_PMACZILOG_TTYS
> =C2=A0#define PMACZILOG_MAJOR =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0TTY_MAJOR
> =C2=A0#define PMACZILOG_MINOR =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A064
> @@ -341,7 +346,7 @@ static struct tty_struct *pmz_receive_ch
> =C2=A0 =C2=A0 =C2=A0 =C2=A0uap->curregs[R1] &=3D ~(EXT_INT_ENAB | TxINT_E=
NAB | RxINT_MASK);
> =C2=A0 =C2=A0 =C2=A0 =C2=A0write_zsreg(uap, R1, uap->curregs[R1]);
> =C2=A0 =C2=A0 =C2=A0 =C2=A0zssync(uap);
> - =C2=A0 =C2=A0 =C2=A0 dev_err(&uap->dev->ofdev.dev, "pmz: rx irq flood !=
\n");
> + =C2=A0 =C2=A0 =C2=A0 pmz_error("pmz: rx irq flood !\n");
> =C2=A0 =C2=A0 =C2=A0 =C2=A0return tty;
> =C2=A0}
>
> @@ -746,6 +751,8 @@ static void pmz_break_ctl(struct uart_po
> =C2=A0 =C2=A0 =C2=A0 =C2=A0spin_unlock_irqrestore(&port->lock, flags);
> =C2=A0}
>
> +#ifdef CONFIG_PPC_PMAC
> +
> =C2=A0/*
> =C2=A0* Turn power on or off to the SCC and associated stuff
> =C2=A0* (port drivers, modem, IR port, etc.)
> @@ -781,6 +788,15 @@ static int pmz_set_scc_power(struct uart
> =C2=A0 =C2=A0 =C2=A0 =C2=A0return delay;
> =C2=A0}
>
> +#else
> +
> +static int pmz_set_scc_power(struct uart_pmac_port *uap, int state)
> +{
> + =C2=A0 =C2=A0 =C2=A0 return 0;
> +}
> +
> +#endif /* !CONFIG_PPC_PMAC */
> +
> =C2=A0/*
> =C2=A0* FixZeroBug....Works around a bug in the SCC receving channel.
> =C2=A0* Inspired from Darwin code, 15 Sept. 2000 =C2=A0-DanM
> @@ -943,9 +959,9 @@ static int pmz_startup(struct uart_port
> =C2=A0 =C2=A0 =C2=A0 =C2=A0}
>
> =C2=A0 =C2=A0 =C2=A0 =C2=A0pmz_get_port_A(uap)->flags |=3D PMACZILOG_FLAG=
_IS_IRQ_ON;
> - =C2=A0 =C2=A0 =C2=A0 if (request_irq(uap->port.irq, pmz_interrupt, IRQF=
_SHARED, "PowerMac Zilog", uap)) {
> - =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 dev_err(&uap->dev->ofd=
ev.dev,
> - =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 "Unable to register zs interrupt handler.\n");
> + =C2=A0 =C2=A0 =C2=A0 if (request_irq(uap->port.irq, pmz_interrupt, IRQF=
_SHARED,
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 "SCC", uap)) {
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 pmz_error("Unable to r=
egister zs interrupt handler.\n");
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0pmz_set_scc_power(=
uap, 0);
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0mutex_unlock(&pmz_=
irq_mutex);
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0return -ENXIO;
> @@ -1185,7 +1201,7 @@ static void pmz_irda_setup(struct uart_p
> =C2=A0 =C2=A0 =C2=A0 =C2=A0while ((read_zsreg(uap, R0) & Tx_BUF_EMP) =3D=
=3D 0
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 || (read_zsreg(uap, R1) =
& ALL_SNT) =3D=3D 0) {
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0if (--t <=3D 0) {
> - =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 dev_err(&uap->dev->ofdev.dev, "transmitter didn't drain\n");
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 pmz_error("transmitter didn't drain\n");
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0return;
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0}
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0udelay(10);
> @@ -1201,7 +1217,7 @@ static void pmz_irda_setup(struct uart_p
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0read_zsdata(uap);
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0mdelay(10);
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0if (--t <=3D 0) {
> - =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 dev_err(&uap->dev->ofdev.dev, "receiver didn't drain\n");
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 pmz_error("receiver didn't drain\n");
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0return;
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0}
> =C2=A0 =C2=A0 =C2=A0 =C2=A0}
> @@ -1222,8 +1238,7 @@ static void pmz_irda_setup(struct uart_p
> =C2=A0 =C2=A0 =C2=A0 =C2=A0t =3D 5000;
> =C2=A0 =C2=A0 =C2=A0 =C2=A0while ((read_zsreg(uap, R0) & Rx_CH_AV) =3D=3D=
0) {
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0if (--t <=3D 0) {
> - =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 dev_err(&uap->dev->ofdev.dev,
> - =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 "irda_setup timed out on get_version byt=
e\n");
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 pmz_error("irda_setup timed out on get_version byte\n");
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0goto out;
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0}
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0udelay(10);
> @@ -1231,8 +1246,7 @@ static void pmz_irda_setup(struct uart_p
> =C2=A0 =C2=A0 =C2=A0 =C2=A0version =3D read_zsdata(uap);
>
> =C2=A0 =C2=A0 =C2=A0 =C2=A0if (version < 4) {
> - =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 dev_info(&uap->dev->of=
dev.dev, "IrDA: dongle version %d not supported\n",
> - =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0version);
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 pmz_info("IrDA: dongle=
version %d not supported\n", version);
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0goto out;
> =C2=A0 =C2=A0 =C2=A0 =C2=A0}
>
> @@ -1241,19 +1255,17 @@ static void pmz_irda_setup(struct uart_p
> =C2=A0 =C2=A0 =C2=A0 =C2=A0t =3D 5000;
> =C2=A0 =C2=A0 =C2=A0 =C2=A0while ((read_zsreg(uap, R0) & Rx_CH_AV) =3D=3D=
0) {
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0if (--t <=3D 0) {
> - =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 dev_err(&uap->dev->ofdev.dev,
> - =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 "irda_setup timed out on speed mode byte=
\n");
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 pmz_error("irda_setup timed out on speed mode byte\n");
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0goto out;
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0}
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0udelay(10);
> =C2=A0 =C2=A0 =C2=A0 =C2=A0}
> =C2=A0 =C2=A0 =C2=A0 =C2=A0t =3D read_zsdata(uap);
> =C2=A0 =C2=A0 =C2=A0 =C2=A0if (t !=3D cmdbyte)
> - =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 dev_err(&uap->dev->ofd=
ev.dev,
> - =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 "irda_setup speed mode byte =3D %x (%x)\n", t, cmdbyte);
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 pmz_error("irda_setup =
speed mode byte =3D %x (%x)\n", t, cmdbyte);
>
> - =C2=A0 =C2=A0 =C2=A0 dev_info(&uap->dev->ofdev.dev, "IrDA setup for %ld=
bps, dongle version: %d\n",
> - =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0*baud, version);
> + =C2=A0 =C2=A0 =C2=A0 pmz_info("IrDA setup for %ld bps, dongle version: =
%d\n",
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0*baud, version);
>
> =C2=A0 =C2=A0 =C2=A0 =C2=A0(void)read_zsdata(uap);
> =C2=A0 =C2=A0 =C2=A0 =C2=A0(void)read_zsdata(uap);
> @@ -1402,7 +1414,7 @@ static void pmz_poll_put_char(struct uar
> =C2=A0 =C2=A0 =C2=A0 =C2=A0write_zsdata(uap, c);
> =C2=A0}
>
> -#endif
> +#endif /* CONFIG_CONSOLE_POLL */
>
> =C2=A0static struct uart_ops pmz_pops =3D {
> =C2=A0 =C2=A0 =C2=A0 =C2=A0.tx_empty =C2=A0 =C2=A0 =C2=A0 =3D =C2=A0 =C2=
=A0 =C2=A0 pmz_tx_empty,
> @@ -1427,6 +1439,8 @@ static struct uart_ops pmz_pops =3D {
> =C2=A0#endif
> =C2=A0};
>
> +#ifdef CONFIG_PPC_PMAC
> +
> =C2=A0/*
> =C2=A0* Setup one port structure after probing, HW is down at this point,
> =C2=A0* Unlike sunzilog, we don't need to pre-init the spinlock as we don=
't
> @@ -1823,6 +1837,88 @@ next:
> =C2=A0 =C2=A0 =C2=A0 =C2=A0return 0;
> =C2=A0}
>
> +#else
> +
> +extern struct platform_device scc_a_pdev, scc_b_pdev;
> +
> +static int __init pmz_init_port(struct uart_pmac_port *uap)
> +{
> + =C2=A0 =C2=A0 =C2=A0 struct resource *r_ports;
> + =C2=A0 =C2=A0 =C2=A0 int irq;
> +
> + =C2=A0 =C2=A0 =C2=A0 r_ports =3D platform_get_resource(uap->node, IORES=
OURCE_MEM, 0);
> + =C2=A0 =C2=A0 =C2=A0 irq =3D platform_get_irq(uap->node, 0);
> + =C2=A0 =C2=A0 =C2=A0 if (!r_ports || !irq)
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 return -ENODEV;
> +
> + =C2=A0 =C2=A0 =C2=A0 uap->port.mapbase =C2=A0=3D r_ports->start;
> + =C2=A0 =C2=A0 =C2=A0 uap->port.membase =C2=A0=3D (unsigned char __iomem=
*) r_ports->start;
> + =C2=A0 =C2=A0 =C2=A0 uap->port.iotype =C2=A0 =3D UPIO_MEM;
> + =C2=A0 =C2=A0 =C2=A0 uap->port.irq =C2=A0 =C2=A0 =C2=A0=3D irq;
> + =C2=A0 =C2=A0 =C2=A0 uap->port.uartclk =C2=A0=3D ZS_CLOCK;
> + =C2=A0 =C2=A0 =C2=A0 uap->port.fifosize =3D 1;
> + =C2=A0 =C2=A0 =C2=A0 uap->port.ops =C2=A0 =C2=A0 =C2=A0=3D &pmz_pops;
> + =C2=A0 =C2=A0 =C2=A0 uap->port.type =C2=A0 =C2=A0 =3D PORT_PMAC_ZILOG;
> + =C2=A0 =C2=A0 =C2=A0 uap->port.flags =C2=A0 =C2=A0=3D 0;
> +
> + =C2=A0 =C2=A0 =C2=A0 uap->control_reg =C2=A0 =3D uap->port.membase;
> + =C2=A0 =C2=A0 =C2=A0 uap->data_reg =C2=A0 =C2=A0 =C2=A0=3D uap->control=
_reg + 4;
> + =C2=A0 =C2=A0 =C2=A0 uap->port_type =C2=A0 =C2=A0 =3D 0;
> +
> + =C2=A0 =C2=A0 =C2=A0 pmz_convert_to_zs(uap, CS8, 0, 9600);
> +
> + =C2=A0 =C2=A0 =C2=A0 return 0;
> +}
> +
> +static int __init pmz_probe(void)
> +{
> + =C2=A0 =C2=A0 =C2=A0 int err;
> +
> + =C2=A0 =C2=A0 =C2=A0 pmz_ports_count =3D 0;
> +
> + =C2=A0 =C2=A0 =C2=A0 pmz_ports[0].mate =C2=A0 =C2=A0 =C2=A0=3D &pmz_por=
ts[1];
> + =C2=A0 =C2=A0 =C2=A0 pmz_ports[0].port.line =3D 0;
> + =C2=A0 =C2=A0 =C2=A0 pmz_ports[0].flags =C2=A0 =C2=A0 =3D PMACZILOG_FLA=
G_IS_CHANNEL_A;
> + =C2=A0 =C2=A0 =C2=A0 pmz_ports[0].node =C2=A0 =C2=A0 =C2=A0=3D &scc_a_p=
dev;
> + =C2=A0 =C2=A0 =C2=A0 err =3D pmz_init_port(&pmz_ports[0]);
> + =C2=A0 =C2=A0 =C2=A0 if (err)
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 return err;
> + =C2=A0 =C2=A0 =C2=A0 pmz_ports_count++;
> +
> + =C2=A0 =C2=A0 =C2=A0 pmz_ports[1].mate =C2=A0 =C2=A0 =C2=A0=3D &pmz_por=
ts[0];
> + =C2=A0 =C2=A0 =C2=A0 pmz_ports[1].port.line =3D 1;
> + =C2=A0 =C2=A0 =C2=A0 pmz_ports[1].flags =C2=A0 =C2=A0 =3D 0;
> + =C2=A0 =C2=A0 =C2=A0 pmz_ports[1].node =C2=A0 =C2=A0 =C2=A0=3D &scc_b_p=
dev;
> + =C2=A0 =C2=A0 =C2=A0 err =3D pmz_init_port(&pmz_ports[1]);
> + =C2=A0 =C2=A0 =C2=A0 if (err)
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 return err;
> + =C2=A0 =C2=A0 =C2=A0 pmz_ports_count++;
> +
> + =C2=A0 =C2=A0 =C2=A0 return 0;
> +}
> +
> +static void pmz_dispose_port(struct uart_pmac_port *uap)
> +{
> + =C2=A0 =C2=A0 =C2=A0 memset(uap, 0, sizeof(struct uart_pmac_port));
> +}
> +
> +static int pmz_attach(struct platform_device *pdev)
> +{
> + =C2=A0 =C2=A0 =C2=A0 int i;
> +
> + =C2=A0 =C2=A0 =C2=A0 for (i =3D 0; i < pmz_ports_count; i++)
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 if (pmz_ports[i].node =
=3D=3D pdev)
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 return 0;
> + =C2=A0 =C2=A0 =C2=A0 return -ENODEV;
> +}
> +
> +static int pmz_detach(struct platform_device *pdev)
> +{
> + =C2=A0 =C2=A0 =C2=A0 return 0;
> +}
> +
> +#endif /* !CONFIG_PPC_PMAC */
> +
> =C2=A0#ifdef CONFIG_SERIAL_PMACZILOG_CONSOLE
>
> =C2=A0static void pmz_console_write(struct console *con, const char *s, u=
nsigned int count);
> @@ -1883,6 +1979,8 @@ err_out:
> =C2=A0 =C2=A0 =C2=A0 =C2=A0return rc;
> =C2=A0}
>
> +#ifdef CONFIG_PPC_PMAC
> +
> =C2=A0static struct of_device_id pmz_match[] =3D
> =C2=A0{
> =C2=A0 =C2=A0 =C2=A0 =C2=A0{
> @@ -1904,6 +2002,19 @@ static struct macio_driver pmz_driver =3D
> =C2=A0 =C2=A0 =C2=A0 =C2=A0.resume =C2=A0 =C2=A0 =C2=A0 =C2=A0 =3D pmz_re=
sume,
> =C2=A0};
>
> +#else
> +
> +static struct platform_driver pmz_driver =3D {
> + =C2=A0 =C2=A0 =C2=A0 .probe =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=3D pmz_a=
ttach,
> + =C2=A0 =C2=A0 =C2=A0 .remove =C2=A0 =C2=A0 =C2=A0 =C2=A0 =3D __devexit_=
p(pmz_detach),
> + =C2=A0 =C2=A0 =C2=A0 .driver =C2=A0 =C2=A0 =C2=A0 =C2=A0 =3D {
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 .name =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =3D "scc",
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 .owner =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0=3D THIS_MODULE,
> + =C2=A0 =C2=A0 =C2=A0 },
> +};
> +
> +#endif /* !CONFIG_PPC_PMAC */
> +
> =C2=A0static int __init init_pmz(void)
> =C2=A0{
> =C2=A0 =C2=A0 =C2=A0 =C2=A0int rc, i;
> @@ -1942,15 +2053,23 @@ static int __init init_pmz(void)
> =C2=A0 =C2=A0 =C2=A0 =C2=A0/*
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 * Then we register the macio driver itself
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 */
> +#ifdef CONFIG_PPC_PMAC
> =C2=A0 =C2=A0 =C2=A0 =C2=A0return macio_register_driver(&pmz_driver);
> +#else
> + =C2=A0 =C2=A0 =C2=A0 return platform_driver_register(&pmz_driver);
> +#endif
> =C2=A0}
>
> =C2=A0static void __exit exit_pmz(void)
> =C2=A0{
> =C2=A0 =C2=A0 =C2=A0 =C2=A0int i;
>
> +#ifdef CONFIG_PPC_PMAC
> =C2=A0 =C2=A0 =C2=A0 =C2=A0/* Get rid of macio-driver (detach from macio)=
*/
> =C2=A0 =C2=A0 =C2=A0 =C2=A0macio_unregister_driver(&pmz_driver);
> +#else
> + =C2=A0 =C2=A0 =C2=A0 platform_driver_unregister(&pmz_driver);
> +#endif
>
> =C2=A0 =C2=A0 =C2=A0 =C2=A0for (i =3D 0; i < pmz_ports_count; i++) {
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0struct uart_pmac_p=
ort *uport =3D &pmz_ports[i];
> Index: linux-2.6.31/drivers/serial/pmac_zilog.h
> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
> --- linux-2.6.31.orig/drivers/serial/pmac_zilog.h =C2=A0 =C2=A0 =C2=A0 20=
09-11-17 17:07:28.000000000 +1100
> +++ linux-2.6.31/drivers/serial/pmac_zilog.h =C2=A0 =C2=A02009-11-17 17:0=
7:38.000000000 +1100
> @@ -1,7 +1,15 @@
> =C2=A0#ifndef __PMAC_ZILOG_H__
> =C2=A0#define __PMAC_ZILOG_H__
>
> +#ifdef CONFIG_PPC_PMAC
> =C2=A0#define pmz_debug(fmt, arg...) dev_dbg(&uap->dev->ofdev.dev, fmt, #=
# arg)
> +#define pmz_error(fmt, arg...) dev_err(&uap->dev->ofdev.dev, fmt, ## arg=
)
> +#define pmz_info(fmt, arg...) =C2=A0dev_info(&uap->dev->ofdev.dev, fmt, =
## arg)
> +#else
> +#define pmz_debug(fmt, arg...) do { } while (0)
> +#define pmz_error(fmt, arg...) printk(KERN_ERR fmt, ## arg)
> +#define pmz_info(fmt, arg...) =C2=A0printk(KERN_INFO fmt, ## arg)
> +#endif
>
> =C2=A0/*
> =C2=A0* At most 2 ESCCs with 2 ports each
> @@ -17,6 +25,7 @@ struct uart_pmac_port {
> =C2=A0 =C2=A0 =C2=A0 =C2=A0struct uart_port =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0port;
> =C2=A0 =C2=A0 =C2=A0 =C2=A0struct uart_pmac_port =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 *mate;
>
> +#ifdef CONFIG_PPC_PMAC
> =C2=A0 =C2=A0 =C2=A0 =C2=A0/* macio_dev for the escc holding this port (m=
aybe be null on
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 * early inited port)
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 */
> @@ -25,6 +34,9 @@ struct uart_pmac_port {
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 * of "escc" node (ie. ch-a or ch-b)
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 */
> =C2=A0 =C2=A0 =C2=A0 =C2=A0struct device_node =C2=A0 =C2=A0 =C2=A0 =C2=A0=
=C2=A0 =C2=A0 =C2=A0*node;
> +#else
> + =C2=A0 =C2=A0 =C2=A0 struct platform_device =C2=A0 =C2=A0 =C2=A0 =C2=A0=
=C2=A0*node;
> +#endif
>
> =C2=A0 =C2=A0 =C2=A0 =C2=A0/* Port type as obtained from device tree (IRD=
A, modem, ...) */
> =C2=A0 =C2=A0 =C2=A0 =C2=A0int =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 port_type;
> @@ -55,10 +67,12 @@ struct uart_pmac_port {
> =C2=A0 =C2=A0 =C2=A0 =C2=A0volatile u8 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 __iomem *control_reg;
> =C2=A0 =C2=A0 =C2=A0 =C2=A0volatile u8 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 __iomem *data_reg;
>
> +#ifdef CONFIG_PPC_PMAC
> =C2=A0 =C2=A0 =C2=A0 =C2=A0unsigned int =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0tx_dma_irq;
> =C2=A0 =C2=A0 =C2=A0 =C2=A0unsigned int =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0rx_dma_irq;
> =C2=A0 =C2=A0 =C2=A0 =C2=A0volatile struct dbdma_regs =C2=A0 =C2=A0 =C2=
=A0__iomem *tx_dma_regs;
> =C2=A0 =C2=A0 =C2=A0 =C2=A0volatile struct dbdma_regs =C2=A0 =C2=A0 =C2=
=A0__iomem *rx_dma_regs;
> +#endif
>
> =C2=A0 =C2=A0 =C2=A0 =C2=A0struct ktermios =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 termios_cache;
> =C2=A0};
> --
> To unsubscribe from this list: send the line "unsubscribe linux-m68k" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at =C2=A0http://vger.kernel.org/majordomo-info.html
>
--=20
Gr{oetje,eeting}s,
Geert
--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k=
.org
In personal conversations with technical people, I call myself a hacker. Bu=
t
when I'm talking to journalists I just say "programmer" or something like t=
hat.
-- Linus Torvalds
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH 1/2] pmac-zilog: add platform driver
2009-11-17 9:04 [PATCH 1/2] pmac-zilog: add platform driver Finn Thain
2009-12-23 20:16 ` Geert Uytterhoeven
@ 2010-01-02 12:43 ` Geert Uytterhoeven
2010-01-02 16:39 ` Finn Thain
2010-01-07 21:12 ` Geert Uytterhoeven
2 siblings, 1 reply; 13+ messages in thread
From: Geert Uytterhoeven @ 2010-01-02 12:43 UTC (permalink / raw)
To: Finn Thain; +Cc: linux-m68k, linuxppc-dev
On Tue, Nov 17, 2009 at 10:04, Finn Thain <fthain@telegraphics.com.au> wrot=
e:
> Add platform driver to the pmac-zilog driver for mac 68k, putting the
> powermac-specific bits inside #ifdef CONFIG_PPC_PMAC.
> --- linux-2.6.31.orig/drivers/serial/pmac_zilog.c =C2=A0 =C2=A0 =C2=A0 20=
09-11-17 17:07:28.000000000 +1100
> +++ linux-2.6.31/drivers/serial/pmac_zilog.c =C2=A0 =C2=A02009-11-17 17:0=
7:38.000000000 +1100
> @@ -1427,6 +1439,8 @@ static struct uart_ops pmz_pops =3D {
> =C2=A0#endif
> =C2=A0};
>
> +#ifdef CONFIG_PPC_PMAC
> +
> =C2=A0/*
> =C2=A0* Setup one port structure after probing, HW is down at this point,
> =C2=A0* Unlike sunzilog, we don't need to pre-init the spinlock as we don=
't
> @@ -1823,6 +1837,88 @@ next:
> =C2=A0 =C2=A0 =C2=A0 =C2=A0return 0;
> =C2=A0}
>
> +#else
> +
> +extern struct platform_device scc_a_pdev, scc_b_pdev;
scripts/checkpatch.pl doesn't like this extern, and it's right.
Can't this be found using standard platform device/driver matching?
BTW, there are a few other minor checkpatch issues with some of the
other patches in the series,
too.
Gr{oetje,eeting}s,
Geert
--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k=
.org
In personal conversations with technical people, I call myself a hacker. Bu=
t
when I'm talking to journalists I just say "programmer" or something like t=
hat.
-- Linus Torvalds
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH 1/2] pmac-zilog: add platform driver
2010-01-02 12:43 ` Geert Uytterhoeven
@ 2010-01-02 16:39 ` Finn Thain
2010-01-07 21:05 ` Geert Uytterhoeven
2010-01-08 19:17 ` Geert Uytterhoeven
0 siblings, 2 replies; 13+ messages in thread
From: Finn Thain @ 2010-01-02 16:39 UTC (permalink / raw)
To: Geert Uytterhoeven; +Cc: linux-m68k, linuxppc-dev
[-- Attachment #1: Type: TEXT/PLAIN, Size: 2338 bytes --]
On Sat, 2 Jan 2010, Geert Uytterhoeven wrote:
> On Tue, Nov 17, 2009 at 10:04, Finn Thain <fthain@telegraphics.com.au>
> wrote:
> > Add platform driver to the pmac-zilog driver for mac 68k, putting the
> > powermac-specific bits inside #ifdef CONFIG_PPC_PMAC.
>
> > --- linux-2.6.31.orig/drivers/serial/pmac_zilog.c 2009-11-17 17:07:28.000000000 +1100
> > +++ linux-2.6.31/drivers/serial/pmac_zilog.c 2009-11-17 17:07:38.000000000 +1100
>
> > @@ -1427,6 +1439,8 @@ static struct uart_ops pmz_pops = {
> > #endif
> > };
> >
> > +#ifdef CONFIG_PPC_PMAC
> > +
> > /*
> > * Setup one port structure after probing, HW is down at this point,
> > * Unlike sunzilog, we don't need to pre-init the spinlock as we don't
> > @@ -1823,6 +1837,88 @@ next:
> > return 0;
> > }
> >
> > +#else
> > +
> > +extern struct platform_device scc_a_pdev, scc_b_pdev;
>
> scripts/checkpatch.pl doesn't like this extern, and it's right.
> Can't this be found using standard platform device/driver matching?
The console initcall and arch initcall order didn't permit me to easily
gather the bootinfo data and populate the platform device resources early
enough. (On powermacs there is the open firmware device tree, but of
course, we don't have one.)
I would like to further adopt the driver model in order to ditch the
macintosh_config global, and I'd also like to have proper nubus device
matching. But I think that the serial console device is a bit exceptional
so I'm not too fussed about these two globals.
Anyway, I don't know of a better way to do the serial console but I'm open
to suggestions.
> BTW, there are a few other minor checkpatch issues with some of the
> other patches in the series, too.
I ran checkpatch on all those patches before I submitted them. I ignored
some of the complaints about whitespace where I felt that checkpatch got
it wrong (space character following tab character, IIRC).
checkpatch found lots of mistakes that I did fix, but it can't determine
the most human readable style in all cases, especially where consistency
with the surrounding code is actually more conducive to readability than
strict but sporadic conformance to simple rules would be.
Finn
>
> Gr{oetje,eeting}s,
>
> Geert
>
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH 1/2] pmac-zilog: add platform driver
2010-01-02 16:39 ` Finn Thain
@ 2010-01-07 21:05 ` Geert Uytterhoeven
2010-01-08 19:17 ` Geert Uytterhoeven
1 sibling, 0 replies; 13+ messages in thread
From: Geert Uytterhoeven @ 2010-01-07 21:05 UTC (permalink / raw)
To: Finn Thain; +Cc: linux-m68k, linuxppc-dev
On Sat, Jan 2, 2010 at 17:39, Finn Thain <fthain@telegraphics.com.au> wrote=
:
> On Sat, 2 Jan 2010, Geert Uytterhoeven wrote:
>> On Tue, Nov 17, 2009 at 10:04, Finn Thain <fthain@telegraphics.com.au>
>> wrote:
>> > Add platform driver to the pmac-zilog driver for mac 68k, putting the
>> > powermac-specific bits inside #ifdef CONFIG_PPC_PMAC.
>>
>> > --- linux-2.6.31.orig/drivers/serial/pmac_zilog.c =C2=A0 =C2=A0 =C2=A0=
2009-11-17 17:07:28.000000000 +1100
>> > +++ linux-2.6.31/drivers/serial/pmac_zilog.c =C2=A0 =C2=A02009-11-17 1=
7:07:38.000000000 +1100
>>
>> > @@ -1427,6 +1439,8 @@ static struct uart_ops pmz_pops =3D {
>> > =C2=A0#endif
>> > =C2=A0};
>> >
>> > +#ifdef CONFIG_PPC_PMAC
>> > +
>> > =C2=A0/*
>> > =C2=A0* Setup one port structure after probing, HW is down at this poi=
nt,
>> > =C2=A0* Unlike sunzilog, we don't need to pre-init the spinlock as we =
don't
>> > @@ -1823,6 +1837,88 @@ next:
>> > =C2=A0 =C2=A0 =C2=A0 =C2=A0return 0;
>> > =C2=A0}
>> >
>> > +#else
>> > +
>> > +extern struct platform_device scc_a_pdev, scc_b_pdev;
>>
>> scripts/checkpatch.pl doesn't like this extern, and it's right.
>> Can't this be found using standard platform device/driver matching?
>
> The console initcall and arch initcall order didn't permit me to easily
> gather the bootinfo data and populate the platform device resources early
> enough. (On powermacs there is the open firmware device tree, but of
> course, we don't have one.)
>
> I would like to further adopt the driver model in order to ditch the
> macintosh_config global, and I'd also like to have proper nubus device
> matching. But I think that the serial console device is a bit exceptional
> so I'm not too fussed about these two globals.
OK
> Anyway, I don't know of a better way to do the serial console but I'm ope=
n
> to suggestions.
>
>> BTW, there are a few other minor checkpatch issues with some of the
>> other patches in the series, too.
>
> I ran checkpatch on all those patches before I submitted them. I ignored
> some of the complaints about whitespace where I felt that checkpatch got
> it wrong (space character following tab character, IIRC).
>
> checkpatch found lots of mistakes that I did fix, but it can't determine
> the most human readable style in all cases, especially where consistency
> with the surrounding code is actually more conducive to readability than
> strict but sporadic conformance to simple rules would be.
Sure. I thought I saw a few other, but I'll fix them up myself.
Gr{oetje,eeting}s,
Geert
--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k=
.org
In personal conversations with technical people, I call myself a hacker. Bu=
t
when I'm talking to journalists I just say "programmer" or something like t=
hat.
-- Linus Torvalds
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH 1/2] pmac-zilog: add platform driver
2010-01-02 16:39 ` Finn Thain
2010-01-07 21:05 ` Geert Uytterhoeven
@ 2010-01-08 19:17 ` Geert Uytterhoeven
2010-01-09 3:14 ` fthain
1 sibling, 1 reply; 13+ messages in thread
From: Geert Uytterhoeven @ 2010-01-08 19:17 UTC (permalink / raw)
To: Finn Thain; +Cc: linux-m68k, linuxppc-dev
On Sat, Jan 2, 2010 at 17:39, Finn Thain <fthain@telegraphics.com.au> wrote:
> On Sat, 2 Jan 2010, Geert Uytterhoeven wrote:
>> On Tue, Nov 17, 2009 at 10:04, Finn Thain <fthain@telegraphics.com.au> wrote:
>> BTW, there are a few other minor checkpatch issues with some of the
>> other patches in the series, too.
>
> I ran checkpatch on all those patches before I submitted them. I ignored
> some of the complaints about whitespace where I felt that checkpatch got
> it wrong (space character following tab character, IIRC).
>
> checkpatch found lots of mistakes that I did fix, but it can't determine
> the most human readable style in all cases, especially where consistency
> with the surrounding code is actually more conducive to readability than
> strict but sporadic conformance to simple rules would be.
It seems your editor adds spaces to lines that are continuations of
the previous statement.
I fixes them up and applied all your patches to linux-m68k.git.
The other warnings were indeed false positives or complains about
keeping consistency
with the surrounding code.
Gr{oetje,eeting}s,
Geert
--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org
In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
-- Linus Torvalds
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH 1/2] pmac-zilog: add platform driver
2010-01-08 19:17 ` Geert Uytterhoeven
@ 2010-01-09 3:14 ` fthain
0 siblings, 0 replies; 13+ messages in thread
From: fthain @ 2010-01-09 3:14 UTC (permalink / raw)
To: Geert Uytterhoeven; +Cc: linux-m68k, linuxppc-dev
On Fri, 8 Jan 2010, Geert Uytterhoeven wrote:
> On Sat, Jan 2, 2010 at 17:39, Finn Thain <fthain@telegraphics.com.au>
> wrote:
> > On Sat, 2 Jan 2010, Geert Uytterhoeven wrote:
> >> On Tue, Nov 17, 2009 at 10:04, Finn Thain
> >> <fthain@telegraphics.com.au> wrote: BTW, there are a few other minor
> >> checkpatch issues with some of the other patches in the series, too.
> >
> > I ran checkpatch on all those patches before I submitted them. I
> > ignored some of the complaints about whitespace where I felt that
> > checkpatch got it wrong (space character following tab character,
> > IIRC).
> >
> > checkpatch found lots of mistakes that I did fix, but it can't
> > determine the most human readable style in all cases, especially where
> > consistency with the surrounding code is actually more conducive to
> > readability than strict but sporadic conformance to simple rules would
> > be.
>
> It seems your editor adds spaces to lines that are continuations of the
> previous statement.
I put in spaces after tabs for hard wrapped lines so that code always
renders properly regardless of the tab settings that might to be applied
by any editor, browser, word processor, mailer, tty discipline, publisher,
etc. that might stand between the human reader and the code.
Documentation/CodingStyle says that those indented lines should be
"substantially to the right", but checkpatch doesn't conform and nor does
most kernel code. Some code does follow my preference, which is more
readable, and also happens to follow the example of the lisp code found in
the same style guide.
But if you prefer no spaces after tabs, I can do that instead. I'm not
fussed.
> I fixes them up and applied all your patches to linux-m68k.git.
Thanks. I'll resend the patch to address your comments earlier in the
thread.
Finn
> The other warnings were indeed false positives or complains about
> keeping consistency
> with the surrounding code.
>
> Gr{oetje,eeting}s,
>
> Geert
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH 1/2] pmac-zilog: add platform driver
2009-11-17 9:04 [PATCH 1/2] pmac-zilog: add platform driver Finn Thain
2009-12-23 20:16 ` Geert Uytterhoeven
2010-01-02 12:43 ` Geert Uytterhoeven
@ 2010-01-07 21:12 ` Geert Uytterhoeven
2010-01-10 12:48 ` [PATCH 1/2] pmac-zilog: add platform driver, version 2 fthain
2 siblings, 1 reply; 13+ messages in thread
From: Geert Uytterhoeven @ 2010-01-07 21:12 UTC (permalink / raw)
To: Finn Thain; +Cc: linux-m68k, linuxppc-dev
On Tue, Nov 17, 2009 at 10:04, Finn Thain <fthain@telegraphics.com.au> wrot=
e:
> Add platform driver to the pmac-zilog driver for mac 68k, putting the
> powermac-specific bits inside #ifdef CONFIG_PPC_PMAC.
> --- linux-2.6.31.orig/drivers/serial/pmac_zilog.c =C2=A0 =C2=A0 =C2=A0 20=
09-11-17 17:07:28.000000000 +1100
> +++ linux-2.6.31/drivers/serial/pmac_zilog.c =C2=A0 =C2=A02009-11-17 17:0=
7:38.000000000 +1100
> +static int pmz_attach(struct platform_device *pdev)
__devinit (or __init, see platform_driver_probe() below)
BTW, the same is true for the PowerMac version.
> +{
> + =C2=A0 =C2=A0 =C2=A0 int i;
> +
> + =C2=A0 =C2=A0 =C2=A0 for (i =3D 0; i < pmz_ports_count; i++)
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 if (pmz_ports[i].node =
=3D=3D pdev)
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 return 0;
> + =C2=A0 =C2=A0 =C2=A0 return -ENODEV;
> +}
> +
> +static int pmz_detach(struct platform_device *pdev)
__devexit (or __exit, see platform_driver_probe() below)
Idem ditto for PowerMac.
> +{
> + =C2=A0 =C2=A0 =C2=A0 return 0;
> +}
> +
> +#endif /* !CONFIG_PPC_PMAC */
> +static struct platform_driver pmz_driver =3D {
> + =C2=A0 =C2=A0 =C2=A0 .probe =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=3D pmz_a=
ttach,
> + =C2=A0 =C2=A0 =C2=A0 .remove =C2=A0 =C2=A0 =C2=A0 =C2=A0 =3D __devexit_=
p(pmz_detach),
> + =C2=A0 =C2=A0 =C2=A0 .driver =C2=A0 =C2=A0 =C2=A0 =C2=A0 =3D {
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 .name =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =3D "scc",
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 .owner =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0=3D THIS_MODULE,
> + =C2=A0 =C2=A0 =C2=A0 },
> +};
> +
> +#endif /* !CONFIG_PPC_PMAC */
> +
> =C2=A0static int __init init_pmz(void)
> =C2=A0{
> =C2=A0 =C2=A0 =C2=A0 =C2=A0int rc, i;
> @@ -1942,15 +2053,23 @@ static int __init init_pmz(void)
> =C2=A0 =C2=A0 =C2=A0 =C2=A0/*
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 * Then we register the macio driver itself
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 */
> +#ifdef CONFIG_PPC_PMAC
> =C2=A0 =C2=A0 =C2=A0 =C2=A0return macio_register_driver(&pmz_driver);
> +#else
> + =C2=A0 =C2=A0 =C2=A0 return platform_driver_register(&pmz_driver);
Since this device is not hot-pluggable, you could use
platform_driver_probe() instead (and leave pmz_driver.probe() empty).
> --- linux-2.6.31.orig/drivers/serial/pmac_zilog.h =C2=A0 =C2=A0 =C2=A0 20=
09-11-17 17:07:28.000000000 +1100
> +++ linux-2.6.31/drivers/serial/pmac_zilog.h =C2=A0 =C2=A02009-11-17 17:0=
7:38.000000000 +1100
> @@ -1,7 +1,15 @@
> =C2=A0#ifndef __PMAC_ZILOG_H__
> =C2=A0#define __PMAC_ZILOG_H__
>
> +#ifdef CONFIG_PPC_PMAC
> =C2=A0#define pmz_debug(fmt, arg...) dev_dbg(&uap->dev->ofdev.dev, fmt, #=
# arg)
> +#define pmz_error(fmt, arg...) dev_err(&uap->dev->ofdev.dev, fmt, ## arg=
)
> +#define pmz_info(fmt, arg...) =C2=A0dev_info(&uap->dev->ofdev.dev, fmt, =
## arg)
> +#else
> +#define pmz_debug(fmt, arg...) do { } while (0)
> +#define pmz_error(fmt, arg...) printk(KERN_ERR fmt, ## arg)
> +#define pmz_info(fmt, arg...) =C2=A0printk(KERN_INFO fmt, ## arg)
Any chance you can sneak the platform device in and use dev_*()?
Anyway, I'm gonna take it, and feed it upstream if BenH adds his ack. Ben?
Gr{oetje,eeting}s,
Geert
--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k=
.org
In personal conversations with technical people, I call myself a hacker. Bu=
t
when I'm talking to journalists I just say "programmer" or something like t=
hat.
-- Linus Torvalds
^ permalink raw reply [flat|nested] 13+ messages in thread
* [PATCH 1/2] pmac-zilog: add platform driver, version 2
2010-01-07 21:12 ` Geert Uytterhoeven
@ 2010-01-10 12:48 ` fthain
2010-01-10 16:29 ` [PATCH 1/2] pmac-zilog: add platform driver, version 3 Finn Thain
0 siblings, 1 reply; 13+ messages in thread
From: fthain @ 2010-01-10 12:48 UTC (permalink / raw)
To: Geert Uytterhoeven; +Cc: linux-m68k, linuxppc-dev
Add platform driver support to the pmac-zilog driver, for m68k macs.
Place the powermac-specific code inside #ifdef CONFIG_PPC_PMAC.
This patch should be applied after "[PATCH 3/13] pmac-zilog: cleanup".
Signed-off-by: Finn Thain <fthain@telegraphics.com.au>
---
Version 2 of this patch adopts Geert's suggestions: make better use of
dev_{dbg,err,info} macros, change platform_driver_register() to
platform_driver_probe(), and use __init and __exit attributes.
arch/m68k/configs/mac_defconfig | 5 +
arch/m68k/configs/multi_defconfig | 5 +
drivers/serial/Kconfig | 12 +-
drivers/serial/pmac_zilog.c | 158 +++++++++++++++++++++++++++++++++-----
drivers/serial/pmac_zilog.h | 14 +++
5 files changed, 168 insertions(+), 26 deletions(-)
Index: linux-2.6.31/drivers/serial/Kconfig
===================================================================
--- linux-2.6.31.orig/drivers/serial/Kconfig 2010-01-10 13:13:55.000000000 +1100
+++ linux-2.6.31/drivers/serial/Kconfig 2010-01-10 13:14:18.000000000 +1100
@@ -1079,12 +1079,12 @@ config SERIAL_68360
default y
config SERIAL_PMACZILOG
- tristate "PowerMac z85c30 ESCC support"
- depends on PPC_OF && PPC_PMAC
+ tristate "Mac or PowerMac z85c30 ESCC support"
+ depends on (M68K && MAC) || (PPC_OF && PPC_PMAC)
select SERIAL_CORE
help
This driver supports the Zilog z85C30 serial ports found on
- PowerMac machines.
+ (Power)Mac machines.
Say Y or M if you want to be able to these serial ports.
config SERIAL_PMACZILOG_TTYS
@@ -1109,16 +1109,16 @@ config SERIAL_PMACZILOG_TTYS
unable to use the 8250 module for PCMCIA or other 16C550-style
UARTs.
- Say N unless you need the z85c30 ports on your powermac
+ Say N unless you need the z85c30 ports on your (Power)Mac
to appear as /dev/ttySn.
config SERIAL_PMACZILOG_CONSOLE
- bool "Console on PowerMac z85c30 serial port"
+ bool "Console on Mac or PowerMac z85c30 serial port"
depends on SERIAL_PMACZILOG=y
select SERIAL_CORE_CONSOLE
help
If you would like to be able to use the z85c30 serial port
- on your PowerMac as the console, you can do so by answering
+ on your (Power)Mac as the console, you can do so by answering
Y to this option.
config SERIAL_LH7A40X
Index: linux-2.6.31/arch/m68k/configs/mac_defconfig
===================================================================
--- linux-2.6.31.orig/arch/m68k/configs/mac_defconfig 2010-01-10 13:13:55.000000000 +1100
+++ linux-2.6.31/arch/m68k/configs/mac_defconfig 2010-01-10 13:13:57.000000000 +1100
@@ -701,6 +701,11 @@ CONFIG_VT_HW_CONSOLE_BINDING=y
#
# Non-8250 serial port support
#
+CONFIG_SERIAL_CORE=y
+CONFIG_SERIAL_CORE_CONSOLE=y
+CONFIG_SERIAL_PMACZILOG=y
+CONFIG_SERIAL_PMACZILOG_TTYS=y
+CONFIG_SERIAL_PMACZILOG_CONSOLE=y
CONFIG_UNIX98_PTYS=y
# CONFIG_DEVPTS_MULTIPLE_INSTANCES is not set
CONFIG_LEGACY_PTYS=y
Index: linux-2.6.31/arch/m68k/configs/multi_defconfig
===================================================================
--- linux-2.6.31.orig/arch/m68k/configs/multi_defconfig 2010-01-10 13:13:55.000000000 +1100
+++ linux-2.6.31/arch/m68k/configs/multi_defconfig 2010-01-10 13:13:57.000000000 +1100
@@ -822,6 +822,11 @@ CONFIG_A2232=y
#
# Non-8250 serial port support
#
+CONFIG_SERIAL_CORE=y
+CONFIG_SERIAL_CORE_CONSOLE=y
+CONFIG_SERIAL_PMACZILOG=y
+CONFIG_SERIAL_PMACZILOG_TTYS=y
+CONFIG_SERIAL_PMACZILOG_CONSOLE=y
CONFIG_UNIX98_PTYS=y
# CONFIG_DEVPTS_MULTIPLE_INSTANCES is not set
CONFIG_LEGACY_PTYS=y
Index: linux-2.6.31/drivers/serial/pmac_zilog.c
===================================================================
--- linux-2.6.31.orig/drivers/serial/pmac_zilog.c 2010-01-10 13:13:55.000000000 +1100
+++ linux-2.6.31/drivers/serial/pmac_zilog.c 2010-01-10 13:13:57.000000000 +1100
@@ -63,11 +63,18 @@
#include <asm/sections.h>
#include <asm/io.h>
#include <asm/irq.h>
+
+#ifdef CONFIG_PPC_PMAC
#include <asm/prom.h>
#include <asm/machdep.h>
#include <asm/pmac_feature.h>
#include <asm/dbdma.h>
#include <asm/macio.h>
+#else
+#include <linux/platform_device.h>
+#include <asm/macints.h>
+#define machine_is_compatible(x) (0)
+#endif
#if defined (CONFIG_SERIAL_PMACZILOG_CONSOLE) && defined(CONFIG_MAGIC_SYSRQ)
#define SUPPORT_SYSRQ
@@ -83,11 +90,9 @@
static char version[] __initdata = "pmac_zilog: 0.6 (Benjamin Herrenschmidt <benh@kernel.crashing.org>)";
MODULE_AUTHOR("Benjamin Herrenschmidt <benh@kernel.crashing.org>");
-MODULE_DESCRIPTION("Driver for the PowerMac serial ports.");
+MODULE_DESCRIPTION("Driver for the Mac and PowerMac serial ports.");
MODULE_LICENSE("GPL");
-#define PWRDBG(fmt, arg...) printk(KERN_DEBUG fmt , ## arg)
-
#ifdef CONFIG_SERIAL_PMACZILOG_TTYS
#define PMACZILOG_MAJOR TTY_MAJOR
#define PMACZILOG_MINOR 64
@@ -341,7 +346,7 @@ static struct tty_struct *pmz_receive_ch
uap->curregs[R1] &= ~(EXT_INT_ENAB | TxINT_ENAB | RxINT_MASK);
write_zsreg(uap, R1, uap->curregs[R1]);
zssync(uap);
- dev_err(&uap->dev->ofdev.dev, "pmz: rx irq flood !\n");
+ pmz_error("pmz: rx irq flood !\n");
return tty;
}
@@ -746,6 +751,8 @@ static void pmz_break_ctl(struct uart_po
spin_unlock_irqrestore(&port->lock, flags);
}
+#ifdef CONFIG_PPC_PMAC
+
/*
* Turn power on or off to the SCC and associated stuff
* (port drivers, modem, IR port, etc.)
@@ -781,6 +788,15 @@ static int pmz_set_scc_power(struct uart
return delay;
}
+#else
+
+static int pmz_set_scc_power(struct uart_pmac_port *uap, int state)
+{
+ return 0;
+}
+
+#endif /* !CONFIG_PPC_PMAC */
+
/*
* FixZeroBug....Works around a bug in the SCC receving channel.
* Inspired from Darwin code, 15 Sept. 2000 -DanM
@@ -943,9 +959,9 @@ static int pmz_startup(struct uart_port
}
pmz_get_port_A(uap)->flags |= PMACZILOG_FLAG_IS_IRQ_ON;
- if (request_irq(uap->port.irq, pmz_interrupt, IRQF_SHARED, "PowerMac Zilog", uap)) {
- dev_err(&uap->dev->ofdev.dev,
- "Unable to register zs interrupt handler.\n");
+ if (request_irq(uap->port.irq, pmz_interrupt, IRQF_SHARED,
+ "SCC", uap)) {
+ pmz_error("Unable to register zs interrupt handler.\n");
pmz_set_scc_power(uap, 0);
mutex_unlock(&pmz_irq_mutex);
return -ENXIO;
@@ -1185,7 +1201,7 @@ static void pmz_irda_setup(struct uart_p
while ((read_zsreg(uap, R0) & Tx_BUF_EMP) == 0
|| (read_zsreg(uap, R1) & ALL_SNT) == 0) {
if (--t <= 0) {
- dev_err(&uap->dev->ofdev.dev, "transmitter didn't drain\n");
+ pmz_error("transmitter didn't drain\n");
return;
}
udelay(10);
@@ -1201,7 +1217,7 @@ static void pmz_irda_setup(struct uart_p
read_zsdata(uap);
mdelay(10);
if (--t <= 0) {
- dev_err(&uap->dev->ofdev.dev, "receiver didn't drain\n");
+ pmz_error("receiver didn't drain\n");
return;
}
}
@@ -1222,8 +1238,7 @@ static void pmz_irda_setup(struct uart_p
t = 5000;
while ((read_zsreg(uap, R0) & Rx_CH_AV) == 0) {
if (--t <= 0) {
- dev_err(&uap->dev->ofdev.dev,
- "irda_setup timed out on get_version byte\n");
+ pmz_error("irda_setup timed out on get_version byte\n");
goto out;
}
udelay(10);
@@ -1231,8 +1246,7 @@ static void pmz_irda_setup(struct uart_p
version = read_zsdata(uap);
if (version < 4) {
- dev_info(&uap->dev->ofdev.dev, "IrDA: dongle version %d not supported\n",
- version);
+ pmz_info("IrDA: dongle version %d not supported\n", version);
goto out;
}
@@ -1241,19 +1255,17 @@ static void pmz_irda_setup(struct uart_p
t = 5000;
while ((read_zsreg(uap, R0) & Rx_CH_AV) == 0) {
if (--t <= 0) {
- dev_err(&uap->dev->ofdev.dev,
- "irda_setup timed out on speed mode byte\n");
+ pmz_error("irda_setup timed out on speed mode byte\n");
goto out;
}
udelay(10);
}
t = read_zsdata(uap);
if (t != cmdbyte)
- dev_err(&uap->dev->ofdev.dev,
- "irda_setup speed mode byte = %x (%x)\n", t, cmdbyte);
+ pmz_error("irda_setup speed mode byte = %x (%x)\n", t, cmdbyte);
- dev_info(&uap->dev->ofdev.dev, "IrDA setup for %ld bps, dongle version: %d\n",
- *baud, version);
+ pmz_info("IrDA setup for %ld bps, dongle version: %d\n",
+ *baud, version);
(void)read_zsdata(uap);
(void)read_zsdata(uap);
@@ -1402,7 +1414,7 @@ static void pmz_poll_put_char(struct uar
write_zsdata(uap, c);
}
-#endif
+#endif /* CONFIG_CONSOLE_POLL */
static struct uart_ops pmz_pops = {
.tx_empty = pmz_tx_empty,
@@ -1427,6 +1439,8 @@ static struct uart_ops pmz_pops = {
#endif
};
+#ifdef CONFIG_PPC_PMAC
+
/*
* Setup one port structure after probing, HW is down at this point,
* Unlike sunzilog, we don't need to pre-init the spinlock as we don't
@@ -1823,6 +1837,88 @@ next:
return 0;
}
+#else
+
+extern struct platform_device scc_a_pdev, scc_b_pdev;
+
+static int __init pmz_init_port(struct uart_pmac_port *uap)
+{
+ struct resource *r_ports;
+ int irq;
+
+ r_ports = platform_get_resource(uap->node, IORESOURCE_MEM, 0);
+ irq = platform_get_irq(uap->node, 0);
+ if (!r_ports || !irq)
+ return -ENODEV;
+
+ uap->port.mapbase = r_ports->start;
+ uap->port.membase = (unsigned char __iomem *) r_ports->start;
+ uap->port.iotype = UPIO_MEM;
+ uap->port.irq = irq;
+ uap->port.uartclk = ZS_CLOCK;
+ uap->port.fifosize = 1;
+ uap->port.ops = &pmz_pops;
+ uap->port.type = PORT_PMAC_ZILOG;
+ uap->port.flags = 0;
+
+ uap->control_reg = uap->port.membase;
+ uap->data_reg = uap->control_reg + 4;
+ uap->port_type = 0;
+
+ pmz_convert_to_zs(uap, CS8, 0, 9600);
+
+ return 0;
+}
+
+static int __init pmz_probe(void)
+{
+ int err;
+
+ pmz_ports_count = 0;
+
+ pmz_ports[0].mate = &pmz_ports[1];
+ pmz_ports[0].port.line = 0;
+ pmz_ports[0].flags = PMACZILOG_FLAG_IS_CHANNEL_A;
+ pmz_ports[0].node = &scc_a_pdev;
+ err = pmz_init_port(&pmz_ports[0]);
+ if (err)
+ return err;
+ pmz_ports_count++;
+
+ pmz_ports[1].mate = &pmz_ports[0];
+ pmz_ports[1].port.line = 1;
+ pmz_ports[1].flags = 0;
+ pmz_ports[1].node = &scc_b_pdev;
+ err = pmz_init_port(&pmz_ports[1]);
+ if (err)
+ return err;
+ pmz_ports_count++;
+
+ return 0;
+}
+
+static void pmz_dispose_port(struct uart_pmac_port *uap)
+{
+ memset(uap, 0, sizeof(struct uart_pmac_port));
+}
+
+static int __init pmz_attach(struct platform_device *pdev)
+{
+ int i;
+
+ for (i = 0; i < pmz_ports_count; i++)
+ if (pmz_ports[i].node == pdev)
+ return 0;
+ return -ENODEV;
+}
+
+static int __exit pmz_detach(struct platform_device *pdev)
+{
+ return 0;
+}
+
+#endif /* !CONFIG_PPC_PMAC */
+
#ifdef CONFIG_SERIAL_PMACZILOG_CONSOLE
static void pmz_console_write(struct console *con, const char *s, unsigned int count);
@@ -1883,6 +1979,8 @@ err_out:
return rc;
}
+#ifdef CONFIG_PPC_PMAC
+
static struct of_device_id pmz_match[] =
{
{
@@ -1904,6 +2002,18 @@ static struct macio_driver pmz_driver =
.resume = pmz_resume,
};
+#else
+
+static struct platform_driver pmz_driver = {
+ .remove = __exit_p(pmz_detach),
+ .driver = {
+ .name = "scc",
+ .owner = THIS_MODULE,
+ },
+};
+
+#endif /* !CONFIG_PPC_PMAC */
+
static int __init init_pmz(void)
{
int rc, i;
@@ -1942,15 +2052,23 @@ static int __init init_pmz(void)
/*
* Then we register the macio driver itself
*/
+#ifdef CONFIG_PPC_PMAC
return macio_register_driver(&pmz_driver);
+#else
+ return platform_driver_probe(&pmz_driver, pmz_attach);
+#endif
}
static void __exit exit_pmz(void)
{
int i;
+#ifdef CONFIG_PPC_PMAC
/* Get rid of macio-driver (detach from macio) */
macio_unregister_driver(&pmz_driver);
+#else
+ platform_driver_unregister(&pmz_driver);
+#endif
for (i = 0; i < pmz_ports_count; i++) {
struct uart_pmac_port *uport = &pmz_ports[i];
Index: linux-2.6.31/drivers/serial/pmac_zilog.h
===================================================================
--- linux-2.6.31.orig/drivers/serial/pmac_zilog.h 2010-01-10 13:13:55.000000000 +1100
+++ linux-2.6.31/drivers/serial/pmac_zilog.h 2010-01-10 13:13:57.000000000 +1100
@@ -1,7 +1,15 @@
#ifndef __PMAC_ZILOG_H__
#define __PMAC_ZILOG_H__
+#ifdef CONFIG_PPC_PMAC
#define pmz_debug(fmt, arg...) dev_dbg(&uap->dev->ofdev.dev, fmt, ## arg)
+#define pmz_error(fmt, arg...) dev_err(&uap->dev->ofdev.dev, fmt, ## arg)
+#define pmz_info(fmt, arg...) dev_info(&uap->dev->ofdev.dev, fmt, ## arg)
+#else
+#define pmz_debug(fmt, arg...) dev_dbg(&uap->node->dev, fmt, ## arg)
+#define pmz_error(fmt, arg...) dev_err(&uap->node->dev, fmt, ## arg)
+#define pmz_info(fmt, arg...) dev_info(&uap->node->dev, fmt, ## arg)
+#endif
/*
* At most 2 ESCCs with 2 ports each
@@ -17,6 +25,7 @@ struct uart_pmac_port {
struct uart_port port;
struct uart_pmac_port *mate;
+#ifdef CONFIG_PPC_PMAC
/* macio_dev for the escc holding this port (maybe be null on
* early inited port)
*/
@@ -25,6 +34,9 @@ struct uart_pmac_port {
* of "escc" node (ie. ch-a or ch-b)
*/
struct device_node *node;
+#else
+ struct platform_device *node;
+#endif
/* Port type as obtained from device tree (IRDA, modem, ...) */
int port_type;
@@ -55,10 +67,12 @@ struct uart_pmac_port {
volatile u8 __iomem *control_reg;
volatile u8 __iomem *data_reg;
+#ifdef CONFIG_PPC_PMAC
unsigned int tx_dma_irq;
unsigned int rx_dma_irq;
volatile struct dbdma_regs __iomem *tx_dma_regs;
volatile struct dbdma_regs __iomem *rx_dma_regs;
+#endif
struct ktermios termios_cache;
};
^ permalink raw reply [flat|nested] 13+ messages in thread
* [PATCH 1/2] pmac-zilog: add platform driver, version 3
2010-01-10 12:48 ` [PATCH 1/2] pmac-zilog: add platform driver, version 2 fthain
@ 2010-01-10 16:29 ` Finn Thain
2010-01-14 13:38 ` Geert Uytterhoeven
0 siblings, 1 reply; 13+ messages in thread
From: Finn Thain @ 2010-01-10 16:29 UTC (permalink / raw)
To: Geert Uytterhoeven; +Cc: linux-m68k, linuxppc-dev
Add platform driver support to the pmac-zilog driver, for m68k macs.
Place the powermac-specific code inside #ifdef CONFIG_PPC_PMAC.
Signed-off-by: Finn Thain <fthain@telegraphics.com.au>
---
This patch should be applied after "[PATCH 3/13] pmac-zilog: cleanup".
It obsoletes "[PATCH 4/13] pmac-zilog, mac68k: replace mac68k SCC code
with platform device" listed in the linux-ppc patchwork.
Version 2 of this patch adopts Geert's suggestions: make better use of
dev_{dbg,err,info} macros, change platform_driver_register() to
platform_driver_probe(), and use __init and __exit attributes.
Version 3 does not #include <macints.h>.
arch/m68k/configs/mac_defconfig | 5 +
arch/m68k/configs/multi_defconfig | 5 +
drivers/serial/Kconfig | 12 +-
drivers/serial/pmac_zilog.c | 157 +++++++++++++++++++++++++++++++++-----
drivers/serial/pmac_zilog.h | 14 +++
5 files changed, 167 insertions(+), 26 deletions(-)
Index: linux-2.6.31/drivers/serial/Kconfig
===================================================================
--- linux-2.6.31.orig/drivers/serial/Kconfig 2010-01-10 23:38:58.000000000 +1100
+++ linux-2.6.31/drivers/serial/Kconfig 2010-01-10 23:39:02.000000000 +1100
@@ -1079,12 +1079,12 @@ config SERIAL_68360
default y
config SERIAL_PMACZILOG
- tristate "PowerMac z85c30 ESCC support"
- depends on PPC_OF && PPC_PMAC
+ tristate "Mac or PowerMac z85c30 ESCC support"
+ depends on (M68K && MAC) || (PPC_OF && PPC_PMAC)
select SERIAL_CORE
help
This driver supports the Zilog z85C30 serial ports found on
- PowerMac machines.
+ (Power)Mac machines.
Say Y or M if you want to be able to these serial ports.
config SERIAL_PMACZILOG_TTYS
@@ -1109,16 +1109,16 @@ config SERIAL_PMACZILOG_TTYS
unable to use the 8250 module for PCMCIA or other 16C550-style
UARTs.
- Say N unless you need the z85c30 ports on your powermac
+ Say N unless you need the z85c30 ports on your (Power)Mac
to appear as /dev/ttySn.
config SERIAL_PMACZILOG_CONSOLE
- bool "Console on PowerMac z85c30 serial port"
+ bool "Console on Mac or PowerMac z85c30 serial port"
depends on SERIAL_PMACZILOG=y
select SERIAL_CORE_CONSOLE
help
If you would like to be able to use the z85c30 serial port
- on your PowerMac as the console, you can do so by answering
+ on your (Power)Mac as the console, you can do so by answering
Y to this option.
config SERIAL_LH7A40X
Index: linux-2.6.31/arch/m68k/configs/mac_defconfig
===================================================================
--- linux-2.6.31.orig/arch/m68k/configs/mac_defconfig 2010-01-10 23:39:02.000000000 +1100
+++ linux-2.6.31/arch/m68k/configs/mac_defconfig 2010-01-10 23:39:02.000000000 +1100
@@ -701,6 +701,11 @@ CONFIG_VT_HW_CONSOLE_BINDING=y
#
# Non-8250 serial port support
#
+CONFIG_SERIAL_CORE=y
+CONFIG_SERIAL_CORE_CONSOLE=y
+CONFIG_SERIAL_PMACZILOG=y
+CONFIG_SERIAL_PMACZILOG_TTYS=y
+CONFIG_SERIAL_PMACZILOG_CONSOLE=y
CONFIG_UNIX98_PTYS=y
# CONFIG_DEVPTS_MULTIPLE_INSTANCES is not set
CONFIG_LEGACY_PTYS=y
Index: linux-2.6.31/arch/m68k/configs/multi_defconfig
===================================================================
--- linux-2.6.31.orig/arch/m68k/configs/multi_defconfig 2010-01-10 23:39:02.000000000 +1100
+++ linux-2.6.31/arch/m68k/configs/multi_defconfig 2010-01-10 23:39:02.000000000 +1100
@@ -822,6 +822,11 @@ CONFIG_A2232=y
#
# Non-8250 serial port support
#
+CONFIG_SERIAL_CORE=y
+CONFIG_SERIAL_CORE_CONSOLE=y
+CONFIG_SERIAL_PMACZILOG=y
+CONFIG_SERIAL_PMACZILOG_TTYS=y
+CONFIG_SERIAL_PMACZILOG_CONSOLE=y
CONFIG_UNIX98_PTYS=y
# CONFIG_DEVPTS_MULTIPLE_INSTANCES is not set
CONFIG_LEGACY_PTYS=y
Index: linux-2.6.31/drivers/serial/pmac_zilog.c
===================================================================
--- linux-2.6.31.orig/drivers/serial/pmac_zilog.c 2010-01-10 23:39:02.000000000 +1100
+++ linux-2.6.31/drivers/serial/pmac_zilog.c 2010-01-11 03:11:55.000000000 +1100
@@ -63,11 +63,17 @@
#include <asm/sections.h>
#include <asm/io.h>
#include <asm/irq.h>
+
+#ifdef CONFIG_PPC_PMAC
#include <asm/prom.h>
#include <asm/machdep.h>
#include <asm/pmac_feature.h>
#include <asm/dbdma.h>
#include <asm/macio.h>
+#else
+#include <linux/platform_device.h>
+#define machine_is_compatible(x) (0)
+#endif
#if defined (CONFIG_SERIAL_PMACZILOG_CONSOLE) && defined(CONFIG_MAGIC_SYSRQ)
#define SUPPORT_SYSRQ
@@ -83,11 +89,9 @@
static char version[] __initdata = "pmac_zilog: 0.6 (Benjamin Herrenschmidt <benh@kernel.crashing.org>)";
MODULE_AUTHOR("Benjamin Herrenschmidt <benh@kernel.crashing.org>");
-MODULE_DESCRIPTION("Driver for the PowerMac serial ports.");
+MODULE_DESCRIPTION("Driver for the Mac and PowerMac serial ports.");
MODULE_LICENSE("GPL");
-#define PWRDBG(fmt, arg...) printk(KERN_DEBUG fmt , ## arg)
-
#ifdef CONFIG_SERIAL_PMACZILOG_TTYS
#define PMACZILOG_MAJOR TTY_MAJOR
#define PMACZILOG_MINOR 64
@@ -341,7 +345,7 @@ static struct tty_struct *pmz_receive_ch
uap->curregs[R1] &= ~(EXT_INT_ENAB | TxINT_ENAB | RxINT_MASK);
write_zsreg(uap, R1, uap->curregs[R1]);
zssync(uap);
- dev_err(&uap->dev->ofdev.dev, "pmz: rx irq flood !\n");
+ pmz_error("pmz: rx irq flood !\n");
return tty;
}
@@ -746,6 +750,8 @@ static void pmz_break_ctl(struct uart_po
spin_unlock_irqrestore(&port->lock, flags);
}
+#ifdef CONFIG_PPC_PMAC
+
/*
* Turn power on or off to the SCC and associated stuff
* (port drivers, modem, IR port, etc.)
@@ -781,6 +787,15 @@ static int pmz_set_scc_power(struct uart
return delay;
}
+#else
+
+static int pmz_set_scc_power(struct uart_pmac_port *uap, int state)
+{
+ return 0;
+}
+
+#endif /* !CONFIG_PPC_PMAC */
+
/*
* FixZeroBug....Works around a bug in the SCC receving channel.
* Inspired from Darwin code, 15 Sept. 2000 -DanM
@@ -943,9 +958,9 @@ static int pmz_startup(struct uart_port
}
pmz_get_port_A(uap)->flags |= PMACZILOG_FLAG_IS_IRQ_ON;
- if (request_irq(uap->port.irq, pmz_interrupt, IRQF_SHARED, "PowerMac Zilog", uap)) {
- dev_err(&uap->dev->ofdev.dev,
- "Unable to register zs interrupt handler.\n");
+ if (request_irq(uap->port.irq, pmz_interrupt, IRQF_SHARED,
+ "SCC", uap)) {
+ pmz_error("Unable to register zs interrupt handler.\n");
pmz_set_scc_power(uap, 0);
mutex_unlock(&pmz_irq_mutex);
return -ENXIO;
@@ -1185,7 +1200,7 @@ static void pmz_irda_setup(struct uart_p
while ((read_zsreg(uap, R0) & Tx_BUF_EMP) == 0
|| (read_zsreg(uap, R1) & ALL_SNT) == 0) {
if (--t <= 0) {
- dev_err(&uap->dev->ofdev.dev, "transmitter didn't drain\n");
+ pmz_error("transmitter didn't drain\n");
return;
}
udelay(10);
@@ -1201,7 +1216,7 @@ static void pmz_irda_setup(struct uart_p
read_zsdata(uap);
mdelay(10);
if (--t <= 0) {
- dev_err(&uap->dev->ofdev.dev, "receiver didn't drain\n");
+ pmz_error("receiver didn't drain\n");
return;
}
}
@@ -1222,8 +1237,7 @@ static void pmz_irda_setup(struct uart_p
t = 5000;
while ((read_zsreg(uap, R0) & Rx_CH_AV) == 0) {
if (--t <= 0) {
- dev_err(&uap->dev->ofdev.dev,
- "irda_setup timed out on get_version byte\n");
+ pmz_error("irda_setup timed out on get_version byte\n");
goto out;
}
udelay(10);
@@ -1231,8 +1245,7 @@ static void pmz_irda_setup(struct uart_p
version = read_zsdata(uap);
if (version < 4) {
- dev_info(&uap->dev->ofdev.dev, "IrDA: dongle version %d not supported\n",
- version);
+ pmz_info("IrDA: dongle version %d not supported\n", version);
goto out;
}
@@ -1241,19 +1254,17 @@ static void pmz_irda_setup(struct uart_p
t = 5000;
while ((read_zsreg(uap, R0) & Rx_CH_AV) == 0) {
if (--t <= 0) {
- dev_err(&uap->dev->ofdev.dev,
- "irda_setup timed out on speed mode byte\n");
+ pmz_error("irda_setup timed out on speed mode byte\n");
goto out;
}
udelay(10);
}
t = read_zsdata(uap);
if (t != cmdbyte)
- dev_err(&uap->dev->ofdev.dev,
- "irda_setup speed mode byte = %x (%x)\n", t, cmdbyte);
+ pmz_error("irda_setup speed mode byte = %x (%x)\n", t, cmdbyte);
- dev_info(&uap->dev->ofdev.dev, "IrDA setup for %ld bps, dongle version: %d\n",
- *baud, version);
+ pmz_info("IrDA setup for %ld bps, dongle version: %d\n",
+ *baud, version);
(void)read_zsdata(uap);
(void)read_zsdata(uap);
@@ -1402,7 +1413,7 @@ static void pmz_poll_put_char(struct uar
write_zsdata(uap, c);
}
-#endif
+#endif /* CONFIG_CONSOLE_POLL */
static struct uart_ops pmz_pops = {
.tx_empty = pmz_tx_empty,
@@ -1427,6 +1438,8 @@ static struct uart_ops pmz_pops = {
#endif
};
+#ifdef CONFIG_PPC_PMAC
+
/*
* Setup one port structure after probing, HW is down at this point,
* Unlike sunzilog, we don't need to pre-init the spinlock as we don't
@@ -1823,6 +1836,88 @@ next:
return 0;
}
+#else
+
+extern struct platform_device scc_a_pdev, scc_b_pdev;
+
+static int __init pmz_init_port(struct uart_pmac_port *uap)
+{
+ struct resource *r_ports;
+ int irq;
+
+ r_ports = platform_get_resource(uap->node, IORESOURCE_MEM, 0);
+ irq = platform_get_irq(uap->node, 0);
+ if (!r_ports || !irq)
+ return -ENODEV;
+
+ uap->port.mapbase = r_ports->start;
+ uap->port.membase = (unsigned char __iomem *) r_ports->start;
+ uap->port.iotype = UPIO_MEM;
+ uap->port.irq = irq;
+ uap->port.uartclk = ZS_CLOCK;
+ uap->port.fifosize = 1;
+ uap->port.ops = &pmz_pops;
+ uap->port.type = PORT_PMAC_ZILOG;
+ uap->port.flags = 0;
+
+ uap->control_reg = uap->port.membase;
+ uap->data_reg = uap->control_reg + 4;
+ uap->port_type = 0;
+
+ pmz_convert_to_zs(uap, CS8, 0, 9600);
+
+ return 0;
+}
+
+static int __init pmz_probe(void)
+{
+ int err;
+
+ pmz_ports_count = 0;
+
+ pmz_ports[0].mate = &pmz_ports[1];
+ pmz_ports[0].port.line = 0;
+ pmz_ports[0].flags = PMACZILOG_FLAG_IS_CHANNEL_A;
+ pmz_ports[0].node = &scc_a_pdev;
+ err = pmz_init_port(&pmz_ports[0]);
+ if (err)
+ return err;
+ pmz_ports_count++;
+
+ pmz_ports[1].mate = &pmz_ports[0];
+ pmz_ports[1].port.line = 1;
+ pmz_ports[1].flags = 0;
+ pmz_ports[1].node = &scc_b_pdev;
+ err = pmz_init_port(&pmz_ports[1]);
+ if (err)
+ return err;
+ pmz_ports_count++;
+
+ return 0;
+}
+
+static void pmz_dispose_port(struct uart_pmac_port *uap)
+{
+ memset(uap, 0, sizeof(struct uart_pmac_port));
+}
+
+static int __init pmz_attach(struct platform_device *pdev)
+{
+ int i;
+
+ for (i = 0; i < pmz_ports_count; i++)
+ if (pmz_ports[i].node == pdev)
+ return 0;
+ return -ENODEV;
+}
+
+static int __exit pmz_detach(struct platform_device *pdev)
+{
+ return 0;
+}
+
+#endif /* !CONFIG_PPC_PMAC */
+
#ifdef CONFIG_SERIAL_PMACZILOG_CONSOLE
static void pmz_console_write(struct console *con, const char *s, unsigned int count);
@@ -1883,6 +1978,8 @@ err_out:
return rc;
}
+#ifdef CONFIG_PPC_PMAC
+
static struct of_device_id pmz_match[] =
{
{
@@ -1904,6 +2001,18 @@ static struct macio_driver pmz_driver =
.resume = pmz_resume,
};
+#else
+
+static struct platform_driver pmz_driver = {
+ .remove = __exit_p(pmz_detach),
+ .driver = {
+ .name = "scc",
+ .owner = THIS_MODULE,
+ },
+};
+
+#endif /* !CONFIG_PPC_PMAC */
+
static int __init init_pmz(void)
{
int rc, i;
@@ -1942,15 +2051,23 @@ static int __init init_pmz(void)
/*
* Then we register the macio driver itself
*/
+#ifdef CONFIG_PPC_PMAC
return macio_register_driver(&pmz_driver);
+#else
+ return platform_driver_probe(&pmz_driver, pmz_attach);
+#endif
}
static void __exit exit_pmz(void)
{
int i;
+#ifdef CONFIG_PPC_PMAC
/* Get rid of macio-driver (detach from macio) */
macio_unregister_driver(&pmz_driver);
+#else
+ platform_driver_unregister(&pmz_driver);
+#endif
for (i = 0; i < pmz_ports_count; i++) {
struct uart_pmac_port *uport = &pmz_ports[i];
Index: linux-2.6.31/drivers/serial/pmac_zilog.h
===================================================================
--- linux-2.6.31.orig/drivers/serial/pmac_zilog.h 2010-01-10 23:39:02.000000000 +1100
+++ linux-2.6.31/drivers/serial/pmac_zilog.h 2010-01-10 23:39:02.000000000 +1100
@@ -1,7 +1,15 @@
#ifndef __PMAC_ZILOG_H__
#define __PMAC_ZILOG_H__
+#ifdef CONFIG_PPC_PMAC
#define pmz_debug(fmt, arg...) dev_dbg(&uap->dev->ofdev.dev, fmt, ## arg)
+#define pmz_error(fmt, arg...) dev_err(&uap->dev->ofdev.dev, fmt, ## arg)
+#define pmz_info(fmt, arg...) dev_info(&uap->dev->ofdev.dev, fmt, ## arg)
+#else
+#define pmz_debug(fmt, arg...) dev_dbg(&uap->node->dev, fmt, ## arg)
+#define pmz_error(fmt, arg...) dev_err(&uap->node->dev, fmt, ## arg)
+#define pmz_info(fmt, arg...) dev_info(&uap->node->dev, fmt, ## arg)
+#endif
/*
* At most 2 ESCCs with 2 ports each
@@ -17,6 +25,7 @@ struct uart_pmac_port {
struct uart_port port;
struct uart_pmac_port *mate;
+#ifdef CONFIG_PPC_PMAC
/* macio_dev for the escc holding this port (maybe be null on
* early inited port)
*/
@@ -25,6 +34,9 @@ struct uart_pmac_port {
* of "escc" node (ie. ch-a or ch-b)
*/
struct device_node *node;
+#else
+ struct platform_device *node;
+#endif
/* Port type as obtained from device tree (IRDA, modem, ...) */
int port_type;
@@ -55,10 +67,12 @@ struct uart_pmac_port {
volatile u8 __iomem *control_reg;
volatile u8 __iomem *data_reg;
+#ifdef CONFIG_PPC_PMAC
unsigned int tx_dma_irq;
unsigned int rx_dma_irq;
volatile struct dbdma_regs __iomem *tx_dma_regs;
volatile struct dbdma_regs __iomem *rx_dma_regs;
+#endif
struct ktermios termios_cache;
};
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH 1/2] pmac-zilog: add platform driver, version 3
2010-01-10 16:29 ` [PATCH 1/2] pmac-zilog: add platform driver, version 3 Finn Thain
@ 2010-01-14 13:38 ` Geert Uytterhoeven
2010-01-31 7:25 ` ping, was " fthain
0 siblings, 1 reply; 13+ messages in thread
From: Geert Uytterhoeven @ 2010-01-14 13:38 UTC (permalink / raw)
To: Finn Thain; +Cc: linux-m68k, linuxppc-dev
On Sun, Jan 10, 2010 at 17:29, Finn Thain <fthain@telegraphics.com.au> wrote:
> Add platform driver support to the pmac-zilog driver, for m68k macs.
> Place the powermac-specific code inside #ifdef CONFIG_PPC_PMAC.
>
> Signed-off-by: Finn Thain <fthain@telegraphics.com.au>
>
> ---
>
> This patch should be applied after "[PATCH 3/13] pmac-zilog: cleanup".
> It obsoletes "[PATCH 4/13] pmac-zilog, mac68k: replace mac68k SCC code
> with platform device" listed in the linux-ppc patchwork.
>
> Version 2 of this patch adopts Geert's suggestions: make better use of
> dev_{dbg,err,info} macros, change platform_driver_register() to
> platform_driver_probe(), and use __init and __exit attributes.
> Version 3 does not #include <macints.h>.
Thanks, applied.
Gr{oetje,eeting}s,
Geert
--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org
In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
-- Linus Torvalds
^ permalink raw reply [flat|nested] 13+ messages in thread
* ping, was Re: [PATCH 1/2] pmac-zilog: add platform driver, version 3
2010-01-14 13:38 ` Geert Uytterhoeven
@ 2010-01-31 7:25 ` fthain
2010-01-31 9:03 ` Geert Uytterhoeven
0 siblings, 1 reply; 13+ messages in thread
From: fthain @ 2010-01-31 7:25 UTC (permalink / raw)
To: Geert Uytterhoeven; +Cc: linux-m68k, linuxppc-dev
Hi Geert,
As I understand it, this patch needs Ben's ack before it (and the others)
can be merged into linux-next (?)
Finn
On Thu, 14 Jan 2010, Geert Uytterhoeven wrote:
> Thanks, applied.
>
> Gr{oetje,eeting}s,
>
> Geert
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: ping, was Re: [PATCH 1/2] pmac-zilog: add platform driver, version 3
2010-01-31 7:25 ` ping, was " fthain
@ 2010-01-31 9:03 ` Geert Uytterhoeven
0 siblings, 0 replies; 13+ messages in thread
From: Geert Uytterhoeven @ 2010-01-31 9:03 UTC (permalink / raw)
To: fthain; +Cc: linux-m68k, linuxppc-dev
On Sun, Jan 31, 2010 at 08:25, <fthain@telegraphics.com.au> wrote:
> As I understand it, this patch needs Ben's ack before it (and the others)
> can be merged into linux-next (?)
He gave his ack on IRC. Still have to add them to m68k-queue and
for-next, though.
Gr{oetje,eeting}s,
Geert
--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org
In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
-- Linus Torvalds
^ permalink raw reply [flat|nested] 13+ messages in thread
end of thread, other threads:[~2010-01-31 9:03 UTC | newest]
Thread overview: 13+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-11-17 9:04 [PATCH 1/2] pmac-zilog: add platform driver Finn Thain
2009-12-23 20:16 ` Geert Uytterhoeven
2010-01-02 12:43 ` Geert Uytterhoeven
2010-01-02 16:39 ` Finn Thain
2010-01-07 21:05 ` Geert Uytterhoeven
2010-01-08 19:17 ` Geert Uytterhoeven
2010-01-09 3:14 ` fthain
2010-01-07 21:12 ` Geert Uytterhoeven
2010-01-10 12:48 ` [PATCH 1/2] pmac-zilog: add platform driver, version 2 fthain
2010-01-10 16:29 ` [PATCH 1/2] pmac-zilog: add platform driver, version 3 Finn Thain
2010-01-14 13:38 ` Geert Uytterhoeven
2010-01-31 7:25 ` ping, was " fthain
2010-01-31 9:03 ` Geert Uytterhoeven
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).