LinuxPPC-Dev Archive on lore.kernel.org
 help / color / mirror / Atom feed
* Re: [RFC PATCH v0.2] net driver: mpc52xx fec
From: Domen Puncer @ 2007-09-15 12:14 UTC (permalink / raw)
  To: Grant Likely; +Cc: netdev, linuxppc-embedded
In-Reply-To: <fa686aa40709030857j6c36c87ek60215f812864ee0f@mail.gmail.com>

On 03/09/07 09:57 -0600, Grant Likely wrote:
> On 9/2/07, Domen Puncer <domen@coderock.org> wrote:
> > Hi!
> >
> > new in this version:
> > - fixed stuff that was commented on.
> > - added 7-wire support (compile at least, if someone has the hardware,
> >         please test!)
> > - ethtool support
> 
> Thanks for this work Domen, comments below...

Thanks for reviewing and sorry for not replying sooner, I lost the
mail.

> 
> This is a large patch, and it should be broken up into logical
> changes.  ie. split into dts changes, bestcomm changes, fec driver and
> mdio driver.  Easier to review that way.  The bestcomm and dts changes
> don't need to go to the netdev list.

OK.

> > +config FEC_MPC52xx
> > +       tristate "FEC Ethernet"
> > +       depends on NET_ETHERNET
> > +       select PPC_BESTCOMM
> > +       select PPC_BESTCOMM_FEC
> > +       select CRC32
> > +       ---help---
> > +         This option enables support for the MPC5200's on-chip
> > +         Fast Ethernet Controller
> > +
> > +config FEC_MPC52xx_MDIO
> > +       bool "Use external Ethernet MII PHY"
> > +       depends on FEC_MPC52xx
> > +       select PHYLIB
> > +       default y
> > +       ---help---
> > +         The MPC5200's FEC can connect to the Ethernet either with
> > +         an external MII PHY chip or 10 Mbps 7-wire interface
> > +         (Motorola? industry standard).
> > +         If your board uses an external PHY, say y, else n.
> 
> This option should change.  Either build the MDIO driver into the FEC
> driver unconditionally and drop this option, or make the MDIO driver
> independent from the FEC driver (it does use the MDIO bus
> infrastructure after all).  Either way the FEC driver should detect
> the phy type at runtime (possibly based on the presence/absence of a
> phy-handle property) instead of being hard compiled.  5200 support is
> now multiplatform after all.
> 
> If you drop the MDIO config option, then I'd also consider eliminating
> driver/net/fec_mpc52xx/Kconfig entirely and rolling the single
> MPC52xx_FEC option into drivers/net/Kconfig.

Right. I separated it.

> > +static irqreturn_t fec_interrupt(int, void *);
> > +static irqreturn_t fec_rx_interrupt(int, void *);
> > +static irqreturn_t fec_tx_interrupt(int, void *);
> > +static struct net_device_stats *fec_get_stats(struct net_device *);
> > +static void fec_set_multicast_list(struct net_device *dev);
> > +static void fec_hw_init(struct net_device *dev);
> > +static void fec_stop(struct net_device *dev);
> > +static void fec_start(struct net_device *dev);
> > +static void fec_reset(struct net_device *dev);
> 
> Nit: Are all these forward decls needed?

Some aren't - cleaned.

> 
> > +
> > +static u8 mpc52xx_fec_mac_addr[6];
> 
> Why isn't this part of struct fec_priv?

Because at __setup time, there's no fec_priv instance.
OTOH, does anyone even use mpc52xx-mac=?

> 
> > +static const u8 null_mac[6];
> 
> null_mac?!?  Just for comparing a mac addr against 0?

right, is_zero_ether_addr is the right thing.

> 
> <snip>
> 
> > +#ifdef CONFIG_FEC_MPC52xx_MDIO
> 
> Once again; don't make this a conditional compile; detect at runtime.
> 
> <snip>
> 
> > +static void __init fec_str2mac(char *str, unsigned char *mac)
> > +{
> > +       int i;
> > +       u64 val64;
> > +
> > +       val64 = simple_strtoull(str, NULL, 16);
> > +
> > +       for (i = 0; i < 6; i++)
> > +               mac[5-i] = val64 >> (i*8);
> > +}
> > +
> > +static int __init mpc52xx_fec_mac_setup(char *mac_address)
> > +{
> > +       fec_str2mac(mac_address, mpc52xx_fec_mac_addr);
> > +       return 0;
> > +}
> 
> fec_str2mac is called in *1* place.  I'd roll it into mpc52xx_fec_mac_setup.
> 
> > +
> > +__setup("mpc52xx-mac=", mpc52xx_fec_mac_setup);
> > +
> 

OK.

Updated and split version at:
http://coderock.org/tmp/fec-v3rc1/

I'll repost to lists once I run-test them.


	Domen

> 
> 
> -- 
> Grant Likely, B.Sc., P.Eng.
> Secret Lab Technologies Ltd.
> grant.likely@secretlab.ca
> (403) 399-0195
> _______________________________________________
> Linuxppc-embedded mailing list
> Linuxppc-embedded@ozlabs.org
> https://ozlabs.org/mailman/listinfo/linuxppc-embedded

^ permalink raw reply

* Re: [PATCH] i2c: devtree-aware iic support for PPC4xx
From: Stephen Rothwell @ 2007-09-15 11:36 UTC (permalink / raw)
  To: Stefan Roese; +Cc: Jean Delvare, linuxppc-dev, i2c
In-Reply-To: <200709151108.01849.sr@denx.de>

[-- Attachment #1: Type: text/plain, Size: 1821 bytes --]

[Just some trivial things]

On Sat, 15 Sep 2007 11:08:01 +0200 Stefan Roese <sr@denx.de> wrote:
>
> +++ b/drivers/i2c/busses/i2c-ibm_iic.h
> @@ -22,7 +22,8 @@
>  #ifndef __I2C_IBM_IIC_H_
>  #define __I2C_IBM_IIC_H_
>  
> -#include <linux/i2c.h> 
> +#include <linux/i2c.h>
> +#include <asm/prom.h>

Please include linux/of.h, of_device.h or of_platform.h (as appropriate)
instead of asm/prom.h.  In this case, since you want struct device_node,
include linux/of.h.

> +static irqreturn_t iic_handler(int irq, void *dev_id)
> +{
> +	struct ibm_iic_private* dev = (struct ibm_iic_private*)dev_id;

You shouldn't cast from (void *).

> +static int iic_xfer(struct i2c_adapter *adap, struct i2c_msg *msgs, int num)
> +{
> +    	struct ibm_iic_private* dev = (struct ibm_iic_private*)(i2c_get_adapdata(adap))i

Again the return value of i2c_get_adapdata() is (void *) so shouldn't be
cast.

> +	prop = of_get_property(np, "iic-mode", &len);
> +	/* use 400kHz only if stated in dts, 100kHz otherwise */
> +	if (prop != NULL) {
> +		if (*prop == 400)
> +			dev->fast_mode = 1;
> +	} else
> +		dev->fast_mode = 0;

	dev->fast_mode = (prop && (*prop == 400));

> +static int __devexit iic_remove(struct of_device *ofdev)
> +{
> +	struct ibm_iic_private *dev =
> +		(struct ibm_iic_private *)dev_get_drvdata(&ofdev->dev);

dev_get_drvdata() also returns (void *).

> +static struct of_platform_driver ibm_iic_driver = {
> +	.name = "ibm-iic",
> +	.match_table = ibm_iic_match,
> +	.probe = iic_probe,
> +	.remove = iic_remove,
> +#if defined(CONFIG_PM)
> +	.suspend = NULL,
> +	.resume = NULL,
> +#endif

These last two will be NULL anyway, so just leave them out.

-- 
Cheers,
Stephen Rothwell                    sfr@canb.auug.org.au
http://www.canb.auug.org.au/~sfr/

[-- Attachment #2: Type: application/pgp-signature, Size: 189 bytes --]

^ permalink raw reply

* Re: [PATCH] i2c: devtree-aware iic support for PPC4xx
From: Vitaly Bordug @ 2007-09-15 11:29 UTC (permalink / raw)
  To: Eugene Surovegin; +Cc: Jean Delvare, linuxppc-dev, Stefan Roese, i2c
In-Reply-To: <20070915100434.GA4978@gate.ebshome.net>

Hello Eugene,

On Sat, 15 Sep 2007 03:04:34 -0700
Eugene Surovegin wrote:

> On Sat, Sep 15, 2007 at 11:08:01AM +0200, Stefan Roese wrote:
> > This patch reworks existing ibm-iic driver to an of_platform_device
> > and enables it to talk to device tree directly. The ocp quirks are
> > completely removed by this patch.
> > 
> > This is done to enable I2C support for the PPC4xx platforms now
> > being moved from arch/ppc (ocp) to arch/powerpc (of). The first board
> > using this driver will be the AMCC Sequoia (PPC440EPx).
> > 
> > Signed-off-by: Stefan Roese <sr@denx.de>
> > 
> > +	/* clckdiv is the same for *all* IIC interfaces,
> > +	 * but I'd rather make a copy than introduce another global. --ebs
> > +	 */
> > +	/* Parent bus should have frequency filled */
> > +	prop = of_get_property(of_get_parent(np), "clock-frequency", &len);
> > +	if (prop == NULL) {
> > +		printk(KERN_ERR
> > +			"ibm-iic(%s):no clock-frequency prop on parent bus!\n",
> > +			dev->np->full_name);
> > +		goto fail;
> > +	}
> > +
> > +	DBG("%s: clckdiv = %d\n", dev->np->full_name, dev->clckdiv);
> > +
> 
> Where is dev->clkdiv initialized? 
> 
> My original version used iic_clkdiv() to calculate correct devider 
> based on OPB frequency. Did you even test this code?
> 
heh, just my $0.02: the upper clearly shows one like missing, maybe during cleanup (since there is opb freq pulled in quote):

        dev->clckdiv = iic_clckdiv(*prop); or smth like that

-- 
Sincerely, Vitaly

^ permalink raw reply

* Re: [PATCH] i2c: devtree-aware iic support for PPC4xx
From: Eugene Surovegin @ 2007-09-15 10:04 UTC (permalink / raw)
  To: Stefan Roese; +Cc: Jean Delvare, linuxppc-dev, i2c
In-Reply-To: <200709151108.01849.sr@denx.de>

On Sat, Sep 15, 2007 at 11:08:01AM +0200, Stefan Roese wrote:
> This patch reworks existing ibm-iic driver to an of_platform_device
> and enables it to talk to device tree directly. The ocp quirks are
> completely removed by this patch.
> 
> This is done to enable I2C support for the PPC4xx platforms now
> being moved from arch/ppc (ocp) to arch/powerpc (of). The first board
> using this driver will be the AMCC Sequoia (PPC440EPx).
> 
> Signed-off-by: Stefan Roese <sr@denx.de>
> 
> +	/* clckdiv is the same for *all* IIC interfaces,
> +	 * but I'd rather make a copy than introduce another global. --ebs
> +	 */
> +	/* Parent bus should have frequency filled */
> +	prop = of_get_property(of_get_parent(np), "clock-frequency", &len);
> +	if (prop == NULL) {
> +		printk(KERN_ERR
> +			"ibm-iic(%s):no clock-frequency prop on parent bus!\n",
> +			dev->np->full_name);
> +		goto fail;
> +	}
> +
> +	DBG("%s: clckdiv = %d\n", dev->np->full_name, dev->clckdiv);
> +

Where is dev->clkdiv initialized? 

My original version used iic_clkdiv() to calculate correct devider 
based on OPB frequency. Did you even test this code?

-- 
Eugene

^ permalink raw reply

* [PATCH] i2c: devtree-aware iic support for PPC4xx
From: Stefan Roese @ 2007-09-15  9:08 UTC (permalink / raw)
  To: i2c, linuxppc-dev; +Cc: Jean Delvare

This patch reworks existing ibm-iic driver to an of_platform_device
and enables it to talk to device tree directly. The ocp quirks are
completely removed by this patch.

This is done to enable I2C support for the PPC4xx platforms now
being moved from arch/ppc (ocp) to arch/powerpc (of). The first board
using this driver will be the AMCC Sequoia (PPC440EPx).

Signed-off-by: Stefan Roese <sr@denx.de>

=2D--
commit c90bbffd8b653b8b7bb5f2152b61f878ad235fd1
tree 4f0d977121ad8efd171dab0dafc827cb8abf62fa
parent 53a3f3087be361dacfc02e7a85b6d6142a41ce8a
author Stefan Roese <sr@denx.de> Sat, 15 Sep 2007 11:02:28 +0200
committer Stefan Roese <sr@denx.de> Sat, 15 Sep 2007 11:02:28 +0200

 drivers/i2c/busses/Kconfig       |   12 -
 drivers/i2c/busses/Makefile      |    1=20
 drivers/i2c/busses/i2c-ibm_iic.h |    5=20
 drivers/i2c/busses/i2c-ibm_of.c  |  867 ++++++++++++++++++++++++++++++++++=
++++
 4 files changed, 883 insertions(+), 2 deletions(-)

diff --git a/drivers/i2c/busses/Kconfig b/drivers/i2c/busses/Kconfig
index 9f3a4cd..12453e2 100644
=2D-- a/drivers/i2c/busses/Kconfig
+++ b/drivers/i2c/busses/Kconfig
@@ -220,7 +220,17 @@ config I2C_PIIX4
=20
 config I2C_IBM_IIC
 	tristate "IBM PPC 4xx on-chip I2C interface"
=2D	depends on IBM_OCP
+	depends on !PPC_MERGE
+	help
+	  Say Y here if you want to use IIC peripheral found on=20
+	  embedded IBM PPC 4xx based systems.=20
+
+	  This driver can also be built as a module.  If so, the module
+	  will be called i2c-ibm_iic.
+
+config I2C_IBM_OF
+	tristate "IBM PPC 4xx on-chip I2C interface"
+	depends on PPC_MERGE
 	help
 	  Say Y here if you want to use IIC peripheral found on=20
 	  embedded IBM PPC 4xx based systems.=20
diff --git a/drivers/i2c/busses/Makefile b/drivers/i2c/busses/Makefile
index 5b752e4..0cd0bac 100644
=2D-- a/drivers/i2c/busses/Makefile
+++ b/drivers/i2c/busses/Makefile
@@ -17,6 +17,7 @@ obj-$(CONFIG_I2C_HYDRA)		+=3D i2c-hydra.o
 obj-$(CONFIG_I2C_I801)		+=3D i2c-i801.o
 obj-$(CONFIG_I2C_I810)		+=3D i2c-i810.o
 obj-$(CONFIG_I2C_IBM_IIC)	+=3D i2c-ibm_iic.o
+obj-$(CONFIG_I2C_IBM_OF)	+=3D i2c-ibm_of.o
 obj-$(CONFIG_I2C_IOP3XX)	+=3D i2c-iop3xx.o
 obj-$(CONFIG_I2C_IXP2000)	+=3D i2c-ixp2000.o
 obj-$(CONFIG_I2C_IXP4XX)	+=3D i2c-ixp4xx.o
diff --git a/drivers/i2c/busses/i2c-ibm_iic.h b/drivers/i2c/busses/i2c-ibm_=
iic.h
index 59d7b43..aac2bb7 100644
=2D-- a/drivers/i2c/busses/i2c-ibm_iic.h
+++ b/drivers/i2c/busses/i2c-ibm_iic.h
@@ -22,7 +22,8 @@
 #ifndef __I2C_IBM_IIC_H_
 #define __I2C_IBM_IIC_H_
=20
=2D#include <linux/i2c.h>=20
+#include <linux/i2c.h>
+#include <asm/prom.h>
=20
 struct iic_regs {
 	u16 mdbuf;
@@ -50,6 +51,8 @@ struct ibm_iic_private {
 	int irq;
 	int fast_mode;
 	u8  clckdiv;
+	struct device_node *np;
+	phys_addr_t paddr;
 };
=20
 /* IICx_CNTL register */
diff --git a/drivers/i2c/busses/i2c-ibm_of.c b/drivers/i2c/busses/i2c-ibm_o=
f.c
new file mode 100644
index 0000000..0caea80
=2D-- /dev/null
+++ b/drivers/i2c/busses/i2c-ibm_of.c
@@ -0,0 +1,867 @@
+/*
+ * drivers/i2c/busses/i2c-ibm_of.c
+ *
+ * Support for the IIC peripheral on IBM PPC 4xx
+ *
+ * Copyright (c) 2003, 2004 Zultys Technologies.
+ * Eugene Surovegin <eugene.surovegin@zultys.com> or <ebs@ebshome.net>
+ *
+ * Based on original work by
+ * 	Ian DaSilva  <idasilva@mvista.com>
+ *      Armin Kuster <akuster@mvista.com>
+ * 	Matt Porter  <mporter@mvista.com>
+ *
+ *      Copyright 2000-2003 MontaVista Software Inc.
+ *
+ * Original driver version was highly leveraged from i2c-elektor.c
+ *
+ *   	Copyright 1995-97 Simon G. Vogl
+ *                1998-99 Hans Berglund
+ *
+ *   	With some changes from Ky=F6sti M=E4lkki <kmalkki@cc.hut.fi>
+ *	and even Frodo Looijaard <frodol@dds.nl>
+ *
+ * This program is free software; you can redistribute  it and/or modify it
+ * under  the terms of  the GNU General  Public License as published by the
+ * Free Software Foundation;  either version 2 of the  License, or (at your
+ * option) any later version.
+ *
+ */
+
+#include <linux/module.h>
+#include <linux/kernel.h>
+#include <linux/ioport.h>
+#include <linux/delay.h>
+#include <linux/slab.h>
+#include <linux/init.h>
+#include <linux/interrupt.h>
+#include <asm/irq.h>
+#include <asm/io.h>
+#include <linux/i2c.h>
+#include <linux/i2c-id.h>
+
+#include <linux/of_platform.h>
+
+#include "i2c-ibm_iic.h"
+
+#define DRIVER_VERSION "2.1"
+
+MODULE_DESCRIPTION("IBM IIC driver v" DRIVER_VERSION);
+MODULE_LICENSE("GPL");
+
+static int device_idx =3D -1;
+
+static int iic_force_poll;
+module_param(iic_force_poll, bool, 0);
+MODULE_PARM_DESC(iic_force_poll, "Force polling mode");
+
+static int iic_force_fast;
+module_param(iic_force_fast, bool, 0);
+MODULE_PARM_DESC(iic_fast_poll, "Force fast mode (400 kHz)");
+
+#define DBG_LEVEL 5
+
+#ifdef DBG
+#undef DBG
+#endif
+
+#ifdef DBG2
+#undef DBG2
+#endif
+
+#if DBG_LEVEL > 0
+#  define DBG(f,x...)	printk(KERN_DEBUG "ibm-iic" f, ##x)
+#else
+#  define DBG(f,x...)	((void)0)
+#endif
+#if DBG_LEVEL > 1
+#  define DBG2(f,x...) 	DBG(f, ##x)
+#else
+#  define DBG2(f,x...) 	((void)0)
+#endif
+#if DBG_LEVEL > 2
+static void dump_iic_regs(const char* header, struct ibm_iic_private* dev)
+{
+	volatile struct iic_regs __iomem *iic =3D dev->vaddr;
+	printk(KERN_DEBUG "ibm-iic(%s): %s\n", dev->np->full_name, header);
+	printk(KERN_DEBUG "  cntl     =3D 0x%02x, mdcntl =3D 0x%02x\n"
+	       KERN_DEBUG "  sts      =3D 0x%02x, extsts =3D 0x%02x\n"
+	       KERN_DEBUG "  clkdiv   =3D 0x%02x, xfrcnt =3D 0x%02x\n"
+	       KERN_DEBUG "  xtcntlss =3D 0x%02x, directcntl =3D 0x%02x\n",
+		in_8(&iic->cntl), in_8(&iic->mdcntl), in_8(&iic->sts),
+		in_8(&iic->extsts), in_8(&iic->clkdiv), in_8(&iic->xfrcnt),
+		in_8(&iic->xtcntlss), in_8(&iic->directcntl));
+}
+#  define DUMP_REGS(h,dev)	dump_iic_regs((h),(dev))
+#else
+#  define DUMP_REGS(h,dev)	((void)0)
+#endif
+
+/* Bus timings (in ns) for bit-banging */
+static struct i2c_timings {
+	unsigned int hd_sta;
+	unsigned int su_sto;
+	unsigned int low;
+	unsigned int high;
+	unsigned int buf;
+} timings [] =3D {
+/* Standard mode (100 KHz) */
+{
+	.hd_sta	=3D 4000,
+	.su_sto	=3D 4000,
+	.low	=3D 4700,
+	.high	=3D 4000,
+	.buf	=3D 4700,
+},
+/* Fast mode (400 KHz) */
+{
+	.hd_sta =3D 600,
+	.su_sto	=3D 600,
+	.low 	=3D 1300,
+	.high 	=3D 600,
+	.buf	=3D 1300,
+}};
+
+/* Enable/disable interrupt generation */
+static inline void iic_interrupt_mode(struct ibm_iic_private* dev, int ena=
ble)
+{
+	out_8(&dev->vaddr->intmsk, enable ? INTRMSK_EIMTC : 0);
+}
+
+/*
+ * Initialize IIC interface.
+ */
+static void iic_dev_init(struct ibm_iic_private* dev)
+{
+	volatile struct iic_regs __iomem *iic =3D dev->vaddr;
+
+	DBG("%s: init\n", dev->np->full_name);
+
+	/* Clear master address */
+	out_8(&iic->lmadr, 0);
+	out_8(&iic->hmadr, 0);
+
+	/* Clear slave address */
+	out_8(&iic->lsadr, 0);
+	out_8(&iic->hsadr, 0);
+
+	/* Clear status & extended status */
+	out_8(&iic->sts, STS_SCMP | STS_IRQA);
+	out_8(&iic->extsts, EXTSTS_IRQP | EXTSTS_IRQD | EXTSTS_LA
+			    | EXTSTS_ICT | EXTSTS_XFRA);
+
+	/* Set clock divider */
+	out_8(&iic->clkdiv, dev->clckdiv);
+
+	/* Clear transfer count */
+	out_8(&iic->xfrcnt, 0);
+
+	/* Clear extended control and status */
+	out_8(&iic->xtcntlss, XTCNTLSS_SRC | XTCNTLSS_SRS | XTCNTLSS_SWC
+			    | XTCNTLSS_SWS);
+
+	/* Clear control register */
+	out_8(&iic->cntl, 0);
+
+	/* Enable interrupts if possible */
+	iic_interrupt_mode(dev, dev->irq >=3D 0);
+
+	/* Set mode control */
+	out_8(&iic->mdcntl, MDCNTL_FMDB | MDCNTL_EINT | MDCNTL_EUBS
+			    | (dev->fast_mode ? MDCNTL_FSM : 0));
+
+	DUMP_REGS("iic_init", dev);
+}
+
+/*
+ * Reset IIC interface
+ */
+static void iic_dev_reset(struct ibm_iic_private* dev)
+{
+	volatile struct iic_regs __iomem *iic =3D dev->vaddr;
+	int i;
+	u8 dc;
+
+	DBG("%s: soft reset\n", dev->np->full_name);
+	DUMP_REGS("reset", dev);
+
+    	/* Place chip in the reset state */
+	out_8(&iic->xtcntlss, XTCNTLSS_SRST);
+
+	/* Check if bus is free */
+	dc =3D in_8(&iic->directcntl);
+	if (!DIRCTNL_FREE(dc)) {
+		DBG("%s: trying to regain bus control\n", dev->np->full_name);
+
+		/* Try to set bus free state */
+		out_8(&iic->directcntl, DIRCNTL_SDAC | DIRCNTL_SCC);
+
+		/* Wait until we regain bus control */
+		for (i =3D 0; i < 100; ++i) {
+			dc =3D in_8(&iic->directcntl);
+			if (DIRCTNL_FREE(dc))
+				break;
+
+			/* Toggle SCL line */
+			dc ^=3D DIRCNTL_SCC;
+			out_8(&iic->directcntl, dc);
+			udelay(10);
+			dc ^=3D DIRCNTL_SCC;
+			out_8(&iic->directcntl, dc);
+
+			/* be nice */
+			cond_resched();
+		}
+	}
+
+	/* Remove reset */
+	out_8(&iic->xtcntlss, 0);
+
+	/* Reinitialize interface */
+	iic_dev_init(dev);
+}
+
+/*
+ * Do 0-length transaction using bit-banging through IIC_DIRECTCNTL regist=
er.
+ */
+
+/* Wait for SCL and/or SDA to be high */
+static int iic_dc_wait(volatile struct iic_regs __iomem *iic, u8 mask)
+{
+	unsigned long x =3D jiffies + HZ / 28 + 2;
+	while ((in_8(&iic->directcntl) & mask) !=3D mask) {
+		if (unlikely(time_after(jiffies, x)))
+			return -1;
+		cond_resched();
+	}
+	return 0;
+}
+
+static int iic_smbus_quick(struct ibm_iic_private* dev, const struct i2c_m=
sg* p)
+{
+	volatile struct iic_regs __iomem *iic =3D dev->vaddr;
+	const struct i2c_timings* t =3D &timings[dev->fast_mode ? 1 : 0];
+	u8 mask, v, sda;
+	int i, res;
+
+	/* Only 7-bit addresses are supported */
+	if (unlikely(p->flags & I2C_M_TEN)) {
+		DBG("%s: smbus_quick - 10 bit addresses are not supported\n",
+			dev->np->full_name);
+		return -EINVAL;
+	}
+
+	DBG("%s: smbus_quick(0x%02x)\n", dev->np->full_name, p->addr);
+
+	/* Reset IIC interface */
+	out_8(&iic->xtcntlss, XTCNTLSS_SRST);
+
+	/* Wait for bus to become free */
+	out_8(&iic->directcntl, DIRCNTL_SDAC | DIRCNTL_SCC);
+	if (unlikely(iic_dc_wait(iic, DIRCNTL_MSDA | DIRCNTL_MSC)))
+		goto err;
+	ndelay(t->buf);
+
+	/* START */
+	out_8(&iic->directcntl, DIRCNTL_SCC);
+	sda =3D 0;
+	ndelay(t->hd_sta);
+
+	/* Send address */
+	v =3D (u8)((p->addr << 1) | ((p->flags & I2C_M_RD) ? 1 : 0));
+	for (i =3D 0, mask =3D 0x80; i < 8; ++i, mask >>=3D 1) {
+		out_8(&iic->directcntl, sda);
+		ndelay(t->low / 2);
+		sda =3D (v & mask) ? DIRCNTL_SDAC : 0;
+		out_8(&iic->directcntl, sda);
+		ndelay(t->low / 2);
+
+		out_8(&iic->directcntl, DIRCNTL_SCC | sda);
+		if (unlikely(iic_dc_wait(iic, DIRCNTL_MSC)))
+			goto err;
+		ndelay(t->high);
+	}
+
+	/* ACK */
+	out_8(&iic->directcntl, sda);
+	ndelay(t->low / 2);
+	out_8(&iic->directcntl, DIRCNTL_SDAC);
+	ndelay(t->low / 2);
+	out_8(&iic->directcntl, DIRCNTL_SDAC | DIRCNTL_SCC);
+	if (unlikely(iic_dc_wait(iic, DIRCNTL_MSC)))
+		goto err;
+	res =3D (in_8(&iic->directcntl) & DIRCNTL_MSDA) ? -EREMOTEIO : 1;
+	ndelay(t->high);
+
+	/* STOP */
+	out_8(&iic->directcntl, 0);
+	ndelay(t->low);
+	out_8(&iic->directcntl, DIRCNTL_SCC);
+	if (unlikely(iic_dc_wait(iic, DIRCNTL_MSC)))
+		goto err;
+	ndelay(t->su_sto);
+	out_8(&iic->directcntl, DIRCNTL_SDAC | DIRCNTL_SCC);
+
+	ndelay(t->buf);
+
+	DBG("%s: smbus_quick -> %s\n",
+			dev->np->full_name, res ? "NACK" : "ACK");
+out:
+	/* Remove reset */
+	out_8(&iic->xtcntlss, 0);
+
+	/* Reinitialize interface */
+	iic_dev_init(dev);
+
+	return res;
+err:
+	DBG("%s: smbus_quick - bus is stuck\n", dev->np->full_name);
+	res =3D -EREMOTEIO;
+	goto out;
+}
+
+/*
+ * IIC interrupt handler
+ */
+static irqreturn_t iic_handler(int irq, void *dev_id)
+{
+	struct ibm_iic_private* dev =3D (struct ibm_iic_private*)dev_id;
+	volatile struct iic_regs __iomem *iic =3D dev->vaddr;
+
+	DBG2("%s: irq handler, STS =3D 0x%02x, EXTSTS =3D 0x%02x\n",
+	     dev->np->full_name, in_8(&iic->sts), in_8(&iic->extsts));
+
+	/* Acknowledge IRQ and wakeup iic_wait_for_tc */
+	out_8(&iic->sts, STS_IRQA | STS_SCMP);
+	wake_up_interruptible(&dev->wq);
+
+	return IRQ_HANDLED;
+}
+
+/*
+ * Get master transfer result and clear errors if any.
+ * Returns the number of actually transferred bytes or error (<0)
+ */
+static int iic_xfer_result(struct ibm_iic_private* dev)
+{
+	volatile struct iic_regs __iomem *iic =3D dev->vaddr;
+
+	if (unlikely(in_8(&iic->sts) & STS_ERR)) {
+		DBG("%s: xfer error, EXTSTS =3D 0x%02x\n", dev->np->full_name,
+			in_8(&iic->extsts));
+
+		/* Clear errors and possible pending IRQs */
+		out_8(&iic->extsts, EXTSTS_IRQP | EXTSTS_IRQD |
+			EXTSTS_LA | EXTSTS_ICT | EXTSTS_XFRA);
+
+		/* Flush master data buffer */
+		out_8(&iic->mdcntl, in_8(&iic->mdcntl) | MDCNTL_FMDB);
+
+		/* Is bus free?
+		 * If error happened during combined xfer
+		 * IIC interface is usually stuck in some strange
+		 * state, the only way out - soft reset.
+		 */
+		if ((in_8(&iic->extsts) & EXTSTS_BCS_MASK) !=3D EXTSTS_BCS_FREE) {
+			DBG("%s: bus is stuck, resetting\n",
+					dev->np->full_name);
+			iic_dev_reset(dev);
+		}
+		return -EREMOTEIO;
+	} else
+		return in_8(&iic->xfrcnt) & XFRCNT_MTC_MASK;
+}
+
+/*
+ * Try to abort active transfer.
+ */
+static void iic_abort_xfer(struct ibm_iic_private* dev)
+{
+	volatile struct iic_regs __iomem *iic =3D dev->vaddr;
+	unsigned long x;
+
+	DBG("%s: iic_abost_xfer\n", dev->np->full_name);
+
+	out_8(&iic->cntl, CNTL_HMT);
+
+	/*
+	 * Wait for the abort command to complete.
+	 * It's not worth to be optimized, just poll (timeout >=3D 1 tick)
+	 */
+	x =3D jiffies + 2;
+	while ((in_8(&iic->extsts) & EXTSTS_BCS_MASK) !=3D EXTSTS_BCS_FREE) {
+		if (time_after(jiffies, x)) {
+			DBG("%s: abort timeout, resetting...\n",
+					dev->np->full_name);
+			iic_dev_reset(dev);
+			return;
+		}
+		schedule();
+	}
+
+	/* Just to clear errors */
+	iic_xfer_result(dev);
+}
+
+/*
+ * Wait for master transfer to complete.
+ * It puts current process to sleep until we get interrupt or timeout expi=
res.
+ * Returns the number of transferred bytes or error (<0)
+ */
+static int iic_wait_for_tc(struct ibm_iic_private* dev) {
+
+	volatile struct iic_regs __iomem *iic =3D dev->vaddr;
+	int ret =3D 0;
+
+	if (dev->irq >=3D 0) {
+		/* Interrupt mode */
+		ret =3D wait_event_interruptible_timeout(dev->wq,
+			!(in_8(&iic->sts) & STS_PT), dev->adap.timeout * HZ);
+
+		if (unlikely(ret < 0))
+			DBG("%s: wait interrupted\n", dev->np->full_name);
+		else if (unlikely(in_8(&iic->sts) & STS_PT)) {
+			DBG("%s: wait timeout\n", dev->np->full_name);
+			ret =3D -ETIMEDOUT;
+		}
+	} else {
+		/* Polling mode */
+		unsigned long x =3D jiffies + dev->adap.timeout * HZ;
+
+		while (in_8(&iic->sts) & STS_PT) {
+			if (unlikely(time_after(jiffies, x))) {
+				DBG("%s: poll timeout\n", dev->np->full_name);
+				ret =3D -ETIMEDOUT;
+				break;
+			}
+
+			if (unlikely(signal_pending(current))) {
+				DBG("%s: poll interrupted\n",
+						dev->np->full_name);
+				ret =3D -ERESTARTSYS;
+				break;
+			}
+			schedule();
+		}
+	}
+
+	if (unlikely(ret < 0))
+		iic_abort_xfer(dev);
+	else
+		ret =3D iic_xfer_result(dev);
+
+	DBG2("%s: iic_wait_for_tc -> %d\n", dev->np->full_name, ret);
+
+	return ret;
+}
+
+/*
+ * Low level master transfer routine
+ */
+static int iic_xfer_bytes(struct ibm_iic_private* dev, struct i2c_msg* pm,
+			  int combined_xfer)
+{
+	volatile struct iic_regs __iomem *iic =3D dev->vaddr;
+	char* buf =3D pm->buf;
+	int i, j, loops, ret =3D 0;
+	int len =3D pm->len;
+
+	u8 cntl =3D (in_8(&iic->cntl) & CNTL_AMD) | CNTL_PT;
+	if (pm->flags & I2C_M_RD)
+		cntl |=3D CNTL_RW;
+
+	loops =3D (len + 3) / 4;
+	for (i =3D 0; i < loops; ++i, len -=3D 4) {
+		int count =3D len > 4 ? 4 : len;
+		u8 cmd =3D cntl | ((count - 1) << CNTL_TCT_SHIFT);
+
+		if (!(cntl & CNTL_RW))
+			for (j =3D 0; j < count; ++j)
+				out_8((void __iomem *)&iic->mdbuf, *buf++);
+
+		if (i < loops - 1)
+			cmd |=3D CNTL_CHT;
+		else if (combined_xfer)
+			cmd |=3D CNTL_RPST;
+
+		DBG2("%s: xfer_bytes, %d, CNTL =3D 0x%02x\n",
+				dev->np->full_name, count, cmd);
+
+		/* Start transfer */
+		out_8(&iic->cntl, cmd);
+
+		/* Wait for completion */
+		ret =3D iic_wait_for_tc(dev);
+
+		if (unlikely(ret < 0))
+			break;
+		else if (unlikely(ret !=3D count)) {
+			DBG("%s: xfer_bytes, requested %d, transfered %d\n",
+				dev->np->full_name, count, ret);
+
+			/* If it's not a last part of xfer, abort it */
+			if (combined_xfer || (i < loops - 1))
+    				iic_abort_xfer(dev);
+
+			ret =3D -EREMOTEIO;
+			break;
+		}
+
+		if (cntl & CNTL_RW)
+			for (j =3D 0; j < count; ++j)
+				*buf++ =3D in_8((void __iomem *)&iic->mdbuf);
+	}
+
+	return ret > 0 ? 0 : ret;
+}
+
+/*
+ * Set target slave address for master transfer
+ */
+static inline void iic_address(struct ibm_iic_private* dev, struct i2c_msg=
* msg)
+{
+	volatile struct iic_regs __iomem *iic =3D dev->vaddr;
+	u16 addr =3D msg->addr;
+
+	DBG2("%s: iic_address, 0x%03x (%d-bit)\n", dev->np->full_name,
+		addr, msg->flags & I2C_M_TEN ? 10 : 7);
+
+	if (msg->flags & I2C_M_TEN) {
+	    out_8(&iic->cntl, CNTL_AMD);
+	    out_8(&iic->lmadr, addr);
+	    out_8(&iic->hmadr, 0xf0 | ((addr >> 7) & 0x06));
+	} else {
+	    out_8(&iic->cntl, 0);
+	    out_8(&iic->lmadr, addr << 1);
+	}
+}
+
+static inline int iic_invalid_address(const struct i2c_msg* p)
+{
+	return (p->addr > 0x3ff) || (!(p->flags & I2C_M_TEN) && (p->addr > 0x7f));
+}
+
+static inline int iic_address_neq(const struct i2c_msg* p1,
+				  const struct i2c_msg* p2)
+{
+	return (p1->addr !=3D p2->addr)
+		|| ((p1->flags & I2C_M_TEN) !=3D (p2->flags & I2C_M_TEN));
+}
+
+/*
+ * Generic master transfer entrypoint.
+ * Returns the number of processed messages or error (<0)
+ */
+static int iic_xfer(struct i2c_adapter *adap, struct i2c_msg *msgs, int nu=
m)
+{
+    	struct ibm_iic_private* dev =3D (struct ibm_iic_private*)(i2c_get_ada=
pdata(adap));
+	volatile struct iic_regs __iomem *iic =3D dev->vaddr;
+	int i, ret =3D 0;
+
+	DBG2("%s: iic_xfer, %d msg(s)\n", dev->np->full_name, num);
+
+	if (!num)
+		return 0;
+
+	/* Check the sanity of the passed messages.
+	 * Uhh, generic i2c layer is more suitable place for such code...
+	 */
+	if (unlikely(iic_invalid_address(&msgs[0]))) {
+		DBG("%s: invalid address 0x%03x (%d-bit)\n", dev->np->full_name,
+			msgs[0].addr, msgs[0].flags & I2C_M_TEN ? 10 : 7);
+		return -EINVAL;
+	}
+	for (i =3D 0; i < num; ++i) {
+		if (unlikely(msgs[i].len <=3D 0)) {
+			if (num =3D=3D 1 && !msgs[0].len) {
+				/* Special case for I2C_SMBUS_QUICK emulation.
+				 * IBM IIC doesn't support 0-length transactions
+				 * so we have to emulate them using bit-banging.
+				 */
+				return iic_smbus_quick(dev, &msgs[0]);
+			}
+			DBG("%s: invalid len %d in msg[%d]\n",
+					dev->np->full_name,
+				msgs[i].len, i);
+			return -EINVAL;
+		}
+		if (unlikely(iic_address_neq(&msgs[0], &msgs[i]))) {
+			DBG("%s: invalid addr in msg[%d]\n",
+					dev->np->full_name, i);
+			return -EINVAL;
+		}
+	}
+
+	/* Check bus state */
+	if (unlikely((in_8(&iic->extsts) & EXTSTS_BCS_MASK)
+				!=3D EXTSTS_BCS_FREE)) {
+		DBG("%s: iic_xfer, bus is not free\n", dev->np->full_name);
+
+		/* Usually it means something serious has happend.
+		 * We *cannot* have unfinished previous transfer
+		 * so it doesn't make any sense to try to stop it.
+		 * Probably we were not able to recover from the
+		 * previous error.
+		 * The only *reasonable* thing I can think of here
+		 * is soft reset.  --ebs
+		 */
+		iic_dev_reset(dev);
+
+		if ((in_8(&iic->extsts) & EXTSTS_BCS_MASK) !=3D EXTSTS_BCS_FREE) {
+			DBG("%s: iic_xfer, bus is still not free\n",
+					dev->np->full_name);
+			return -EREMOTEIO;
+		}
+	} else {
+		/* Flush master data buffer (just in case) */
+		out_8(&iic->mdcntl, in_8(&iic->mdcntl) | MDCNTL_FMDB);
+	}
+
+	/* Load slave address */
+	iic_address(dev, &msgs[0]);
+
+	/* Do real transfer */
+    	for (i =3D 0; i < num && !ret; ++i)
+		ret =3D iic_xfer_bytes(dev, &msgs[i], i < num - 1);
+
+	return ret < 0 ? ret : num;
+}
+
+static u32 iic_func(struct i2c_adapter *adap)
+{
+	return I2C_FUNC_I2C | I2C_FUNC_SMBUS_EMUL | I2C_FUNC_10BIT_ADDR;
+}
+
+static const struct i2c_algorithm iic_algo =3D {
+	.master_xfer 	=3D iic_xfer,
+	.functionality	=3D iic_func
+};
+
+/*
+ * Calculates IICx_CLCKDIV value for a specific OPB clock frequency
+ */
+static inline u8 iic_clckdiv(unsigned int opb)
+{
+	/* Compatibility kludge, should go away after all cards
+	 * are fixed to fill correct value for opbfreq.
+	 * Previous driver version used hardcoded divider value 4,
+	 * it corresponds to OPB frequency from the range (40, 50] MHz
+	 */
+	if (!opb) {
+		printk(KERN_WARNING
+			"ibm-iic: using compatibility value for OPB freq,"
+			" fix your board specific setup\n");
+		opb =3D 50000000;
+	}
+
+	/* Convert to MHz */
+	opb /=3D 1000000;
+
+	if (opb < 20 || opb > 150) {
+		printk(KERN_CRIT "ibm-iic: invalid OPB clock frequency %u MHz\n",
+			opb);
+		opb =3D opb < 20 ? 20 : 150;
+	}
+	return (u8)((opb + 9) / 10 - 1);
+}
+
+/*
+ * Register single IIC interface
+ */
+static int __devinit iic_probe (struct of_device *ofdev,
+				const struct of_device_id *match)
+{
+	struct ibm_iic_private* dev;
+	struct i2c_adapter* adap;
+	struct device_node *np;
+	int ret =3D -ENODEV;
+	int  irq, len;
+	const u32 *prop;
+	struct resource res;
+
+	np =3D ofdev->node;
+	if (!(dev =3D kzalloc(sizeof(*dev), GFP_KERNEL))) {
+		printk(KERN_CRIT "ibm-iic(%s): failed to allocate device data\n",
+				np->full_name);
+		return -ENOMEM;
+	}
+
+	dev_set_drvdata(&ofdev->dev, dev);
+
+	dev->np =3D np;
+	irq =3D irq_of_parse_and_map(np, 0);
+
+	if (of_address_to_resource(np, 0, &res)) {
+		printk(KERN_ERR "ibd-iic(%s): Can't get registers address\n",
+				np->full_name);
+		goto fail1;
+	}
+	dev->paddr =3D res.start;
+
+	if (!request_mem_region(dev->paddr, sizeof(struct iic_regs),
+				"ibm_iic")) {
+		ret =3D -EBUSY;
+		goto fail1;
+	}
+	dev->vaddr =3D ioremap(dev->paddr, sizeof(struct iic_regs));
+
+	if (dev->vaddr =3D=3D NULL) {
+		printk(KERN_CRIT "ibm-iic(%s): failed to ioremap device regs\n",
+				dev->np->full_name);
+		ret =3D -ENXIO;
+		goto fail2;
+	}
+
+	init_waitqueue_head(&dev->wq);
+
+	dev->irq =3D iic_force_poll ? -1 : (irq =3D=3D NO_IRQ) ? -1 : irq;
+	if (dev->irq >=3D 0) {
+		/* Disable interrupts until we finish initialization,
+		   assumes level-sensitive IRQ setup...
+		 */
+		iic_interrupt_mode(dev, 0);
+		if (request_irq(dev->irq, iic_handler, 0, "IBM IIC", dev)) {
+			printk(KERN_ERR "ibm-iic(%s): request_irq %d failed\n",
+					dev->np->full_name, dev->irq);
+			/* Fallback to the polling mode */
+			dev->irq =3D -1;
+		}
+	}
+
+	if (dev->irq < 0)
+		printk(KERN_WARNING "ibm-iic(%s): using polling mode\n",
+				dev->np->full_name);
+
+	/* Board specific settings */
+	prop =3D of_get_property(np, "iic-mode", &len);
+	/* use 400kHz only if stated in dts, 100kHz otherwise */
+	if (prop !=3D NULL) {
+		if (*prop =3D=3D 400)
+			dev->fast_mode =3D 1;
+	} else
+		dev->fast_mode =3D 0;
+
+	/* clckdiv is the same for *all* IIC interfaces,
+	 * but I'd rather make a copy than introduce another global. --ebs
+	 */
+	/* Parent bus should have frequency filled */
+	prop =3D of_get_property(of_get_parent(np), "clock-frequency", &len);
+	if (prop =3D=3D NULL) {
+		printk(KERN_ERR
+			"ibm-iic(%s):no clock-frequency prop on parent bus!\n",
+			dev->np->full_name);
+		goto fail;
+	}
+
+	DBG("%s: clckdiv =3D %d\n", dev->np->full_name, dev->clckdiv);
+
+	/* Initialize IIC interface */
+	iic_dev_init(dev);
+
+	/* Register it with i2c layer */
+	adap =3D &dev->adap;
+	adap->dev.parent =3D &ofdev->dev;
+	strcpy(adap->name, "IBM IIC");
+	i2c_set_adapdata(adap, dev);
+	adap->id =3D I2C_HW_OCP;
+	adap->class =3D I2C_CLASS_HWMON;
+	adap->algo =3D &iic_algo;
+	adap->client_register =3D NULL;
+	adap->client_unregister =3D NULL;
+	adap->timeout =3D 1;
+	adap->retries =3D 1;
+
+	adap->nr =3D ++device_idx;
+	if ((ret =3D i2c_add_numbered_adapter(adap)) < 0) {
+		printk(KERN_CRIT "ibm-iic(%s): failed to register i2c adapter\n",
+				dev->np->full_name);
+		goto fail;
+	}
+
+	printk(KERN_INFO "ibm-iic(%s): using %s mode\n", dev->np->full_name,
+			dev->fast_mode ?
+			"fast (400 kHz)" : "standard (100 kHz)");
+
+	return 0;
+
+fail:
+	if (dev->irq >=3D 0) {
+		iic_interrupt_mode(dev, 0);
+		free_irq(dev->irq, dev);
+	}
+
+	iounmap(dev->vaddr);
+fail2:
+	release_mem_region(dev->paddr, sizeof(struct iic_regs));
+fail1:
+	dev_set_drvdata(&ofdev->dev, NULL);
+	kfree(dev);
+
+	return ret;
+}
+
+/*
+ * Cleanup initialized IIC interface
+ */
+static int __devexit iic_remove(struct of_device *ofdev)
+{
+	struct ibm_iic_private *dev =3D
+		(struct ibm_iic_private *)dev_get_drvdata(&ofdev->dev);
+
+	BUG_ON(dev =3D=3D NULL);
+	if (i2c_del_adapter(&dev->adap)) {
+		printk(KERN_CRIT "ibm-iic(%s): failed to delete i2c adapter\n",
+		       dev->np->full_name);
+		/* That's *very* bad, just shutdown IRQ ... */
+		if (dev->irq >=3D 0) {
+			iic_interrupt_mode(dev, 0);
+			free_irq(dev->irq, dev);
+			dev->irq =3D -1;
+		}
+	} else {
+		if (dev->irq >=3D 0) {
+			iic_interrupt_mode(dev, 0);
+			free_irq(dev->irq, dev);
+		}
+		iounmap(dev->vaddr);
+		release_mem_region(dev->paddr, sizeof(struct iic_regs));
+		kfree(dev);
+	}
+
+	return 0;
+}
+
+static struct of_device_id ibm_iic_match[] =3D {
+	{
+		.type =3D "i2c",
+		.compatible =3D "ibm,iic",
+	},
+	{},
+};
+
+MODULE_DEVICE_TABLE(of, ibm_iic_match);
+
+static struct of_platform_driver ibm_iic_driver =3D {
+	.name =3D "ibm-iic",
+	.match_table =3D ibm_iic_match,
+	.probe =3D iic_probe,
+	.remove =3D iic_remove,
+#if defined(CONFIG_PM)
+	.suspend =3D NULL,
+	.resume =3D NULL,
+#endif
+};
+
+static int __init iic_init(void)
+{
+	printk(KERN_INFO "IBM IIC driver v" DRIVER_VERSION "\n");
+	return of_register_platform_driver(&ibm_iic_driver);
+}
+
+static void __exit iic_exit(void)
+{
+	of_unregister_platform_driver(&ibm_iic_driver);
+}
+
+module_init(iic_init);
+module_exit(iic_exit);

^ permalink raw reply

* Re: PPC4xx maintainer?
From: Paul Mackerras @ 2007-09-15  4:31 UTC (permalink / raw)
  To: Stefan Roese; +Cc: linuxppc-dev
In-Reply-To: <200709142208.43342.ml@stefan-roese.de>

Stefan Roese writes:

> I really think that now, as the PPC4xx Linux development is picking up in 
> speed in the ongoing move to arch/powerpc, we need an "active" maintainer for 
> the 4xx Linux kernel platform. Since I haven't heard anything from Matt in a 
> long time, perhaps it would be better if somebody else takes care of this 
> matter. I propose that Josh Boyer takes over this maintainership, and I know 
> that he is competent enough and willing to dedicate the needed time for this 
> task.

Glad you think so. :)  I asked Josh to be the 4xx maintainer a couple of
weeks ago but didn't make an announcement about it, which I should
have done - sorry about that.

Josh, please send me a patch for MAINTAINERS.

Paul.

^ permalink raw reply

* Re: Domen's MPC5200 FEC cleanup patch.
From: Jon Smirl @ 2007-09-15  4:28 UTC (permalink / raw)
  To: Domen Puncer, linuxppc-embedded
In-Reply-To: <9e4733910709142038y1bd88cd5s7c9bb21a668db9f6@mail.gmail.com>

On 9/14/07, Jon Smirl <jonsmirl@gmail.com> wrote:
> This patch doesn't seem to working quite right on my hardware (Phytec
> pcm030). At boot I get a long pause.

It also doesn't compile if  CONFIG_FEC_MPC52xx_MDIO is undefined.

-- 
Jon Smirl
jonsmirl@gmail.com

^ permalink raw reply

* Domen's MPC5200 FEC cleanup patch.
From: Jon Smirl @ 2007-09-15  3:38 UTC (permalink / raw)
  To: Domen Puncer, linuxppc-embedded

This patch doesn't seem to working quite right on my hardware (Phytec
pcm030). At boot I get a long pause.

I have a long pause when Ethernet is initializing

[    0.798529] NET: Registered protocol family 1
[    0.802988] NET: Registered protocol family 17
[    1.313708] net eth0: attached phy 0 to driver Generic PHY
[    2.320013] Sending DHCP requests ...... timed out!
[   81.968863] IP-Config: Retrying forever (NFS root)...
[   82.477527] net eth0: attached phy 0 to driver Generic PHY
[   83.487809] Sending DHCP requests .<6>PHY: f0003000:00 - Link is Up
- 100/Full
[   86.323795] ., OK
[   88.579802] IP-Config: Got DHCP answer from 192.168.1.200, my
address is 192.168.1.5
[   88.587923] IP-Config: Complete:

Reverting back to
0008-drivers-net-Add-support-for-Freescale-MPC5200-SoC-i.patch the
pause goes away.

[    0.793916] TCP cubic registered
[    0.797309] NET: Registered protocol family 1
[    0.801808] NET: Registered protocol family 17
[    1.309611] eth0: config: auto-negotiation on, 100HDX, 10HDX.
[    2.316014] Sending DHCP requests .., OK
[    7.124005] IP-Config: Got DHCP answer from 192.168.1.200, my
address is 192.168.1.5
[    7.132121] IP-Config: Complete:
[    7.135212]       device=eth0, addr=192.168.1.5,
mask=255.255.255.0, gw=192.168.1.200,
[    7.143192]      host=MPC, domain=home, nis-domain=(none),
[    7.148778]      bootserver=192.168.1.200, rootserver=192.168.1.4, rootpath=

Something not quite right with interrupts maybe? I'm trying to debug it.

-- 
Jon Smirl
jonsmirl@gmail.com

^ permalink raw reply

* Re: [patch 4/4] 4xx: Convert Seqouia flash mappings to new binding
From: Stefan Roese @ 2007-09-15  3:32 UTC (permalink / raw)
  To: linuxppc-dev; +Cc: David Gibson
In-Reply-To: <20070915022318.GG25414@localhost.localdomain>

On Saturday 15 September 2007, David Gibson wrote:
> On Fri, Sep 14, 2007 at 01:54:14PM -0500, Josh Boyer wrote:
> > A new binding for flash devices was recently introduced.  This updates
> > the Sequoia DTS to use the new binding and enabled MTD in the defconfig.
> >
> > Signed-off-by: Josh Boyer <jwboyer@linux.vnet.ibm.com>
>
> Acked-by: David Gibson <david@gibson.dropbear.id.au>

Acked-by: Stefan Roese <sr@denx.de>

Best regards,
Stefan

^ permalink raw reply

* Re: [patch 3/4] 4xx: Convert Walnut flash mappings to new binding
From: Stefan Roese @ 2007-09-15  3:23 UTC (permalink / raw)
  To: linuxppc-dev; +Cc: david
In-Reply-To: <20070914185649.272138000@linux.vnet.ibm.com>

On Friday 14 September 2007, Josh Boyer wrote:
> A new binding for flash devices was recently introduced.  This updates the
> Walnut DTS to use the new binding.
>
> Signed-off-by: Josh Boyer <jwboyer@linux.vnet.ibm.com>
> ---
>  arch/powerpc/boot/dts/walnut.dts |   17 ++++++++++++-----
>  1 file changed, 12 insertions(+), 5 deletions(-)
>
> --- linux-2.6.orig/arch/powerpc/boot/dts/walnut.dts
> +++ linux-2.6/arch/powerpc/boot/dts/walnut.dts
> @@ -137,6 +137,10 @@
>  			dcr-reg = <012 2>;
>  			#address-cells = <2>;
>  			#size-cells = <1>;
> +			/* The ranges property is supplied by the bootwrapper
> +			 * and is based on the firmware's configuration of the
> +			 * EBC bridge
> +			 */
>  			clock-frequency = <0>; /* Filled in by zImage */
>
>  			sram@0,0 {
> @@ -144,13 +148,16 @@
>  			};
>
>  			flash@0,80000 {
> -				device_type = "rom";
> -				compatible = "direct-mapped";
> -				probe-type = "JEDEC";
> +				compatible = "jedec-flash";
>  				bank-width = <1>;
> -				partitions = <0 80000>;
> -				partition-names = "OpenBIOS";
>  				reg = <0 80000 80000>;
> +				#address-cells = <1>;
> +				#size-cells = <1>;
> +				partition@0 {
> +					label = "OpenBIOS";
> +					reg = <0 80000>;
> +					read-only;
> +				};

There are not only Bamboo board running PIBS, but running U-Boot too. How 
should we handle this different FLASH partitioning? Same goes for Ebony too 
btw.

Best regards,
Stefan

^ permalink raw reply

* Re: PPC4xx maintainer?
From: Stefan Roese @ 2007-09-15  3:04 UTC (permalink / raw)
  To: David Gibson; +Cc: linuxppc-dev, Paul Mackerras
In-Reply-To: <20070915014519.GB25414@localhost.localdomain>

On Saturday 15 September 2007, David Gibson wrote:
> > I second that nomination... Go JOSH!
>
> You're behind the times.  Paulus has already annointed Josh as 4xx
> maintainer.

Excellent. That's good news.

Good luck Josh. :)

Best regards,
Stefan

^ permalink raw reply

* Re: [patch 2/4] Make partitions optional in physmap_of
From: David Gibson @ 2007-09-15  2:21 UTC (permalink / raw)
  To: Josh Boyer; +Cc: linuxppc-dev
In-Reply-To: <20070914185648.970788000@linux.vnet.ibm.com>

On Fri, Sep 14, 2007 at 01:54:12PM -0500, Josh Boyer wrote:
> The latest physmap_of driver has a small error where it will fail the probe
> with:
> 
> physmap-flash: probe of fff00000.small-flas failed with error -2
> 
> if there are no partition subnodes in the device tree and the old style binding
> is not used.  Since partition definitions are optional, the probe should still
> succeed.
> 
> Signed-off-by: Josh Boyer <jwboyer@linux.vnet.ibm.com>
Acked-by: David Gibson <david@gibson.dropbear.id.au>

-- 
David Gibson			| I'll have my music baroque, and my code
david AT gibson.dropbear.id.au	| minimalist, thank you.  NOT _the_ _other_
				| _way_ _around_!
http://www.ozlabs.org/~dgibson

^ permalink raw reply

* Re: rtc-ds1742.c should use resource_size_t for base address
From: David Gibson @ 2007-09-15  1:30 UTC (permalink / raw)
  To: Josh Boyer
  Cc: Andrew Morton, linuxppc-dev, Atsushi Nemoto, linux-kernel,
	rtc-linux
In-Reply-To: <20070914122037.65a08f48@weaponx.rchland.ibm.com>

On Fri, Sep 14, 2007 at 12:20:37PM -0500, Josh Boyer wrote:
> On Fri, 14 Sep 2007 15:54:27 +1000
> David Gibson <david@gibson.dropbear.id.au> wrote:
> 
> > Currently the rtc driver, rtc-ds1742.c uses an unsigned long to store
> > the base mmio address of the NVRAM/RTC.  This breaks on systems like
> > PowerPC 440, which is a 32-bit core with 36-bit physical addresses: IO
> > on the system, including the RTC, is typically above the 4GB point,
> > and cannot fit into an unsigned long.
> > 
> > This patch fixes the problem by replacing the unsigned long with a
> > resource_size_t.  Tested on Ebony (PPC440) (with additional patches to
> > instantiate the ds1742 platform device appropriately).
> 
> Where would those additional patches be? :)

Coming, they still need polish...

-- 
David Gibson			| I'll have my music baroque, and my code
david AT gibson.dropbear.id.au	| minimalist, thank you.  NOT _the_ _other_
				| _way_ _around_!
http://www.ozlabs.org/~dgibson

^ permalink raw reply

* Re: [patch 1/4] cuimage for Bamboo board
From: David Gibson @ 2007-09-15  2:19 UTC (permalink / raw)
  To: Josh Boyer; +Cc: linuxppc-dev
In-Reply-To: <20070914185648.698807000@linux.vnet.ibm.com>

On Fri, Sep 14, 2007 at 01:54:11PM -0500, Josh Boyer wrote:
> Add a cuboot wrapper for the Bamboo board.  This also removes some obsoleted
> linker declarations that have been moved into ops.h
> 
> Signed-off-by: Josh Boyer <jwboyer@linux.vnet.ibm.com>
> Acked-by: David Gibson <david@gibson.dropbear.id.au>

Heh, well, I know I acked this already, but...

[snip]
> --- /dev/null
> +++ linux-2.6/arch/powerpc/boot/cuboot-bamboo.c
> @@ -0,0 +1,30 @@
> +/*
> + * Old U-boot compatibility for Ebony

Error in the comment here.

[snip]
> --- linux-2.6.orig/arch/powerpc/boot/bamboo.c
> +++ linux-2.6/arch/powerpc/boot/bamboo.c
> @@ -24,8 +24,7 @@
>  #include "4xx.h"
>  #include "44x.h"
>  
> -extern char _dtb_start[];
> -extern char _dtb_end[];
> +static u8 *bamboo_mac0, *bamboo_mac1;

This additional handling of the MAC addresses should really also be
mentioned in the commit comment.

>  
>  static void bamboo_fixups(void)
>  {
> @@ -34,12 +33,15 @@ static void bamboo_fixups(void)
>  	ibm440ep_fixup_clocks(sysclk, 11059200);
>  	ibm4xx_fixup_memsize();
>  	ibm4xx_quiesce_eth((u32 *)0xef600e00, (u32 *)0xef600f00);
> +	dt_fixup_mac_addresses(bamboo_mac0, bamboo_mac1);
>  }
>  
> -void bamboo_init(void)
> +void bamboo_init(void *mac0, void *mac1)
>  {
>  	platform_ops.fixups = bamboo_fixups;
>  	platform_ops.exit = ibm44x_dbcr_reset;
> +	bamboo_mac0 = mac0;
> +	bamboo_mac1 = mac1;
>  	ft_init(_dtb_start, 0, 32);
>  	serial_console_init();
>  }
> --- linux-2.6.orig/arch/powerpc/boot/treeboot-bamboo.c
> +++ linux-2.6/arch/powerpc/boot/treeboot-bamboo.c
> @@ -12,16 +12,32 @@
>  #include "ops.h"
>  #include "stdio.h"
>  #include "44x.h"
> -
> -extern char _end[];
> +#include "stdlib.h"
>  
>  BSS_STACK(4096);
>  
> +#define PIBS_MAC0 0xfffc0400
> +#define PIBS_MAC1 0xfffc0500
> +char pibs_mac0[6];
> +char pibs_mac1[6];
> +
> +static void read_pibs_mac(void)
> +{
> +	unsigned long long mac64;
> +
> +	mac64 = strtoull((char *)PIBS_MAC0, 0, 16);
> +	memcpy(&pibs_mac0, (char *)&mac64+2, 6);
> +
> +	mac64 = strtoull((char *)PIBS_MAC1, 0, 16);
> +	memcpy(&pibs_mac1, (char *)&mac64+2, 6);
> +}
> +
>  void platform_init(void)
>  {
>  	unsigned long end_of_ram = 0x8000000;
>  	unsigned long avail_ram = end_of_ram - (unsigned long)_end;
>  
>  	simple_alloc_init(_end, avail_ram, 32, 64);
> -	bamboo_init();
> +	read_pibs_mac();
> +	bamboo_init((u8 *)&pibs_mac0, (u8 *)&pibs_mac1);
>  }
> 

-- 
David Gibson			| I'll have my music baroque, and my code
david AT gibson.dropbear.id.au	| minimalist, thank you.  NOT _the_ _other_
				| _way_ _around_!
http://www.ozlabs.org/~dgibson

^ permalink raw reply

* Re: [patch 3/4] 4xx: Convert Walnut flash mappings to new binding
From: David Gibson @ 2007-09-15  2:22 UTC (permalink / raw)
  To: Josh Boyer; +Cc: linuxppc-dev
In-Reply-To: <20070914185649.272138000@linux.vnet.ibm.com>

On Fri, Sep 14, 2007 at 01:54:13PM -0500, Josh Boyer wrote:
> A new binding for flash devices was recently introduced.  This updates the
> Walnut DTS to use the new binding.
> 
> Signed-off-by: Josh Boyer <jwboyer@linux.vnet.ibm.com>
Acked-by: David Gibson <david@gibson.dropbear.id.au>

We should both really figure out the vendor/device ids of the JEDEC
flash chips in use here and on Ebony, and add the appropriate
properties as per the binding.

-- 
David Gibson			| I'll have my music baroque, and my code
david AT gibson.dropbear.id.au	| minimalist, thank you.  NOT _the_ _other_
				| _way_ _around_!
http://www.ozlabs.org/~dgibson

^ permalink raw reply

* Re: [patch 4/4] 4xx: Convert Seqouia flash mappings to new binding
From: David Gibson @ 2007-09-15  2:23 UTC (permalink / raw)
  To: Josh Boyer; +Cc: linuxppc-dev
In-Reply-To: <20070914185649.551007000@linux.vnet.ibm.com>

On Fri, Sep 14, 2007 at 01:54:14PM -0500, Josh Boyer wrote:
> A new binding for flash devices was recently introduced.  This updates the
> Sequoia DTS to use the new binding and enabled MTD in the defconfig.
> 
> Signed-off-by: Josh Boyer <jwboyer@linux.vnet.ibm.com>

Acked-by: David Gibson <david@gibson.dropbear.id.au>

-- 
David Gibson			| I'll have my music baroque, and my code
david AT gibson.dropbear.id.au	| minimalist, thank you.  NOT _the_ _other_
				| _way_ _around_!
http://www.ozlabs.org/~dgibson

^ permalink raw reply

* Re: [PATCH 2/9] 8xx: Infrastructure code cleanup.
From: David Gibson @ 2007-09-15  2:25 UTC (permalink / raw)
  To: Vitaly Bordug; +Cc: linuxppc-dev
In-Reply-To: <20070914122114.30327773@localhost.localdomain>

On Fri, Sep 14, 2007 at 12:21:14PM +0400, Vitaly Bordug wrote:
> Hello David,
> 
> On Fri, 14 Sep 2007 14:09:34 +1000
> David Gibson wrote:
> 
> > On Thu, Sep 13, 2007 at 12:16:40PM +0400, Vitaly Bordug wrote:
> > [snip]
> > > > This looks bogus.  You're replacing the old crap immr_map() functions,
> > > > which ioremap()ed the registers every time, with a much simpler
> > > > version which uses an established-once mapping of the register
> > > > region.  AFAICT, anywah.
> > > > 
> > > > So far, so good - but your immr_unmap() still does an iounmap() which
> > > > is surely wrong - it should now be a no-op, leaving the mpc8xx_immr
> > > > mapping intact.  You probably get away with it by accident, because I
> > > > imagine attempting to unmap an unaligned chunk of the region will just
> > > > fail.
> > > >
> > > 
> > > yes, it should do nop instead of iounmap. 
> > > > In fact, with this patch in place, I'd like to see another patch which
> > > > removes all calls to immr_map() and immr_unmap(), simply accessing the
> > > > common mapping directly.
> > > > 
> > > Sorry, but originally, that stuff was created to get rid of BSP
> > > ifdefs in drivers. For PQ family, it is a common practice to have
> > > single driver handling all 3 CPU families, which use the same logic,
> > > but immr structure differs a little bit.
> > > 
> > > At this point it's clear case-by-case ioremapping does not have firm
> > > benefit, but getting back to the way it was is useless either.  In
> > > ideal world, we'd have all those stuff put into dts and have
> > > specific drivers be a shim layer between core hw and IO drivers.
> > 
> > Err.. I don't understand what you're getting at.  As the code stands
> > after Scott's cleanup, the map() and unmap() calls can certainly be
> > trivially removed, regardless of the history for them.
> > 
> I don't argue if they can be removed, but if we aught to do
> that. Direct immr dereference adds plenty of mess into driver

Um... better one line of mess than the 3 lines it is now
(map/access/unmap).

> code. I would like to keep the situation when immr accesses factored
> out as a starting point, rather then turn them back to &immap-> or
> cpm2_immr-> refs.

I can see no advantage to the current "factoring".

> > And, yes, the drivers should certainly uses addresses from the device
> > tree, rather than that revolting structure covering all the inbuilt
> > device retgisters.
> hehe, then you prolly know, that this structure does not fin well
> into device/driver model, either platform_ or of_device. And I am
> going to sort it out at some point...

Well, that's good to know.

-- 
David Gibson			| I'll have my music baroque, and my code
david AT gibson.dropbear.id.au	| minimalist, thank you.  NOT _the_ _other_
				| _way_ _around_!
http://www.ozlabs.org/~dgibson

^ permalink raw reply

* Re: PPC4xx maintainer?
From: David Gibson @ 2007-09-15  1:45 UTC (permalink / raw)
  To: Grant Likely; +Cc: linuxppc-dev, Paul Mackerras
In-Reply-To: <fa686aa40709141311u4edb4778s6b2313887732bd04@mail.gmail.com>

On Fri, Sep 14, 2007 at 02:11:55PM -0600, Grant Likely wrote:
> On 9/14/07, Stefan Roese <ml@stefan-roese.de> wrote:
> > Hi,
> >
> > I really think that now, as the PPC4xx Linux development is picking up in
> > speed in the ongoing move to arch/powerpc, we need an "active" maintainer for
> > the 4xx Linux kernel platform. Since I haven't heard anything from Matt in a
> > long time, perhaps it would be better if somebody else takes care of this
> > matter. I propose that Josh Boyer takes over this maintainership, and I know
> > that he is competent enough and willing to dedicate the needed time for this
> > task.
> >
> > What do you think? Any other ideas on this?
> 
> I second that nomination... Go JOSH!

You're behind the times.  Paulus has already annointed Josh as 4xx
maintainer.

-- 
David Gibson			| I'll have my music baroque, and my code
david AT gibson.dropbear.id.au	| minimalist, thank you.  NOT _the_ _other_
				| _way_ _around_!
http://www.ozlabs.org/~dgibson

^ permalink raw reply

* Re: [PATCH] add Kconfig option for optimizing for cell
From: Josh Boyer @ 2007-09-14 23:36 UTC (permalink / raw)
  To: Arnd Bergmann; +Cc: linuxppc-dev
In-Reply-To: <200709150302.23743.arnd@arndb.de>

On Sat, 2007-09-15 at 03:02 +0200, Arnd Bergmann wrote:
> On Saturday 15 September 2007, Josh Boyer wrote:
> > On Sat, 2007-09-15 at 02:21 +0200, Arnd Bergmann wrote:
> > > Since the PPE on cell is an in-order core, it suffers significantly
> > > from wrong instruction scheduling. This adds an Kconfig option that
> > > enables passing -mtune=cell to gcc in order to generate object
> > > code that runs well on cell.
> > 
> > Which version of gcc supports that?
> > 
> 
> gcc-4.3 will be the first official release that has everything in it,
> and I think 4.1 has some parts. However, there are many patched gcc
> versions in various distributions, so I tried to avoid being too
> specific about the version here.
> 
> Of course, on gcc versions that don't support -mtune=cell, the 
> Kconfig option does not make a difference.

Sure.  I was just wondering if mentioning the first official GCC version
in the Kconfig description would help prevent users from selecting the
option for GCCs that don't support it and then being confused later when
nothing happens.  Your call though.

josh

^ permalink raw reply

* Re: [PATCH] add Kconfig option for optimizing for cell
From: Arnd Bergmann @ 2007-09-15  1:02 UTC (permalink / raw)
  To: linuxppc-dev
In-Reply-To: <7268aef0e0f5d31dc4d07d583406a6af@kernel.crashing.org>

On Saturday 15 September 2007, Segher Boessenkool wrote:
>=20
> > +config TUNE_CELL
> > +=A0=A0=A0=A0=A0bool "Optimize for Cell Broadband Engine"
> > +=A0=A0=A0=A0=A0depends on PPC64
> > +=A0=A0=A0=A0=A0help
> > +=A0=A0=A0=A0=A0 =A0Cause the compiler to optimize for the PPE of the C=
ell Broadband
> > +=A0=A0=A0=A0=A0 =A0Engine. This will make the code run considerably fa=
ster on Cell
> > +=A0=A0=A0=A0=A0 =A0but somewhat slower on other machines. This option =
only changes
> > +=A0=A0=A0=A0=A0 =A0the scheduling of instructions, not the selection o=
f instructions
> > +=A0=A0=A0=A0=A0 =A0itself,
>=20
> It _does_ change instruction selection, which is the main factor
> in the slowdown on other machines (and a big part of the speedup
> on Cell, too). =A0It doesn't change which insns the compiler is
> allowed to use though, which is probably what you wanted to say?

Right, thanks for the correction.

	Arnd <><

^ permalink raw reply

* Re: [PATCH] add Kconfig option for optimizing for cell
From: Arnd Bergmann @ 2007-09-15  1:02 UTC (permalink / raw)
  To: Josh Boyer; +Cc: linuxppc-dev
In-Reply-To: <1189811264.24878.3.camel@localhost.localdomain>

On Saturday 15 September 2007, Josh Boyer wrote:
> On Sat, 2007-09-15 at 02:21 +0200, Arnd Bergmann wrote:
> > Since the PPE on cell is an in-order core, it suffers significantly
> > from wrong instruction scheduling. This adds an Kconfig option that
> > enables passing -mtune=cell to gcc in order to generate object
> > code that runs well on cell.
> 
> Which version of gcc supports that?
> 

gcc-4.3 will be the first official release that has everything in it,
and I think 4.1 has some parts. However, there are many patched gcc
versions in various distributions, so I tried to avoid being too
specific about the version here.

Of course, on gcc versions that don't support -mtune=cell, the 
Kconfig option does not make a difference.

	Arnd <><

^ permalink raw reply

* Re: [PATCH] add Kconfig option for optimizing for cell
From: Segher Boessenkool @ 2007-09-15  0:50 UTC (permalink / raw)
  To: Arnd Bergmann; +Cc: linuxppc-dev
In-Reply-To: <200709150221.57825.arnd@arndb.de>

> +config TUNE_CELL
> +	bool "Optimize for Cell Broadband Engine"
> +	depends on PPC64
> +	help
> +	  Cause the compiler to optimize for the PPE of the Cell Broadband
> +	  Engine. This will make the code run considerably faster on Cell
> +	  but somewhat slower on other machines. This option only changes
> +	  the scheduling of instructions, not the selection of instructions
> +	  itself,

It _does_ change instruction selection, which is the main factor
in the slowdown on other machines (and a big part of the speedup
on Cell, too).  It doesn't change which insns the compiler is
allowed to use though, which is probably what you wanted to say?


Segher

^ permalink raw reply

* Re: [PATCH] add Kconfig option for optimizing for cell
From: Josh Boyer @ 2007-09-14 23:07 UTC (permalink / raw)
  To: Arnd Bergmann; +Cc: linuxppc-dev
In-Reply-To: <200709150221.57825.arnd@arndb.de>

On Sat, 2007-09-15 at 02:21 +0200, Arnd Bergmann wrote:
> Since the PPE on cell is an in-order core, it suffers significantly
> from wrong instruction scheduling. This adds an Kconfig option that
> enables passing -mtune=cell to gcc in order to generate object
> code that runs well on cell.

Which version of gcc supports that?

josh

^ permalink raw reply

* [PATCH] add Kconfig option for optimizing for cell
From: Arnd Bergmann @ 2007-09-15  0:21 UTC (permalink / raw)
  To: linuxppc-dev

Since the PPE on cell is an in-order core, it suffers significantly
from wrong instruction scheduling. This adds an Kconfig option that
enables passing -mtune=cell to gcc in order to generate object
code that runs well on cell.

Signed-off-by: Arnd Bergmann <arnd@arndb.de>
---
diff --git a/arch/powerpc/Makefile b/arch/powerpc/Makefile
index 6015a92..87aff53 100644
--- a/arch/powerpc/Makefile
+++ b/arch/powerpc/Makefile
@@ -92,6 +92,10 @@ else
 endif
 endif
 
+ifeq ($(CONFIG_TUNE_CELL),y)
+	CFLAGS += $(call cc-option,-mtune=cell)
+endif
+
 # No AltiVec instruction when building kernel
 CFLAGS += $(call cc-option,-mno-altivec)
 
diff --git a/arch/powerpc/platforms/Kconfig.cputype b/arch/powerpc/platforms/Kconfig.cputype
index 86eb4cf..4c315be 100644
--- a/arch/powerpc/platforms/Kconfig.cputype
+++ b/arch/powerpc/platforms/Kconfig.cputype
@@ -71,6 +71,18 @@ config POWER4
 	depends on PPC64
 	def_bool y
 
+config TUNE_CELL
+	bool "Optimize for Cell Broadband Engine"
+	depends on PPC64
+	help
+	  Cause the compiler to optimize for the PPE of the Cell Broadband
+	  Engine. This will make the code run considerably faster on Cell
+	  but somewhat slower on other machines. This option only changes
+	  the scheduling of instructions, not the selection of instructions
+	  itself, so the resulting kernel will keep running on all other
+	  machines. When building a kernel that is supposed to run only
+	  on Cell, you should also select the POWER4_ONLY option.
+
 config 6xx
 	bool
 

^ permalink raw reply related

* Re: Device tree aware EMAC driver
From: Josh Boyer @ 2007-09-14 22:37 UTC (permalink / raw)
  To: Benjamin Herrenschmidt
  Cc: linuxppc-dev, netdev, Jeff Garzik, Paul Mackerras, David Gibson
In-Reply-To: <1187854236.5972.6.camel@localhost.localdomain>

On Thu, 2007-08-23 at 09:30 +0200, Benjamin Herrenschmidt wrote:
> On Thu, 2007-08-23 at 13:56 +1000, David Gibson wrote:
> > 
> > 
> > Jeff, I've discussed this with BenH, and although there are some
> > problems with the driver still, we think it's good enough to merge in
> > 2.6.24, the warts can be fixed up later.  Please apply...
> 
> Or to be more precise:
> 
> This driver will work well for 4xx platforms and will allow us to move a
> big step toward getting rid of arch/ppc. The issues with DMA mapping
> really only concern the case where this is used within the cell "Axon"
> southbridge, which doesn't happen on any released product at this stage.

Since we have 4 boards that could use this now, and at least one more on
the way, I've put this in the 'emac' branch of my git tree.  That branch
is based off of the current 'upstream' branch of the netdev-2.6 tree.

This is just intended to make it easier for those that want to use
ibm_newemac on their boards while we work the driver into the netdev
tree.

josh

^ permalink raw reply


This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox