* [PATCH v2.6.26] powerpc: Add 8568 PHY workarounds to board code
@ 2008-05-02 18:03 Andy Fleming
2008-05-02 23:49 ` Olof Johansson
0 siblings, 1 reply; 3+ messages in thread
From: Andy Fleming @ 2008-05-02 18:03 UTC (permalink / raw)
To: galak; +Cc: linuxppc-dev
The 8568 MDS needs some configuration changes to the PHY in order to work
properly. These are done in the firmware, normally, but Linux shouldn't
need to rely on the firmware running such things (someone could disable
the PHY support in the firmware to save space, for instance).
Signed-off-by: Andy Fleming <afleming@freescale.com>
---
arch/powerpc/platforms/85xx/mpc85xx_mds.c | 119 +++++++++++++++++++++++++++++
1 files changed, 119 insertions(+), 0 deletions(-)
diff --git a/arch/powerpc/platforms/85xx/mpc85xx_mds.c b/arch/powerpc/platforms/85xx/mpc85xx_mds.c
index 12f68ab..9ae29c5 100644
--- a/arch/powerpc/platforms/85xx/mpc85xx_mds.c
+++ b/arch/powerpc/platforms/85xx/mpc85xx_mds.c
@@ -32,6 +32,7 @@
#include <linux/fsl_devices.h>
#include <linux/of_platform.h>
#include <linux/of_device.h>
+#include <linux/phy.h>
#include <asm/system.h>
#include <asm/atomic.h>
@@ -56,6 +57,95 @@
#define DBG(fmt...)
#endif
+#define MV88E1111_SCR 0x10
+#define MV88E1111_SCR_125CLK 0x0010
+static int mpc8568_fixup_125_clock(struct phy_device *phydev)
+{
+ int scr;
+ int err;
+
+ /* Workaround for the 125 CLK Toggle */
+ scr = phy_read(phydev, MV88E1111_SCR);
+
+ if (scr < 0)
+ return scr;
+
+ err = phy_write(phydev, MV88E1111_SCR, scr & ~(MV88E1111_SCR_125CLK));
+
+ if (err)
+ return err;
+
+ err = phy_write(phydev, MII_BMCR, BMCR_RESET);
+
+ if (err)
+ return err;
+
+ scr = phy_read(phydev, MV88E1111_SCR);
+
+ if (scr < 0)
+ return err;
+
+ err = phy_write(phydev, MV88E1111_SCR, scr | 0x0008);
+
+ return err;
+}
+
+static int mpc8568_mds_phy_fixups(struct phy_device *phydev)
+{
+ int temp;
+ int err;
+
+ /* Errata */
+ err = phy_write(phydev,29, 0x0006);
+
+ if (err)
+ return err;
+
+ temp = phy_read(phydev, 30);
+
+ if (temp < 0)
+ return temp;
+
+ temp = (temp & (~0x8000)) | 0x4000;
+ err = phy_write(phydev,30, temp);
+
+ if (err)
+ return err;
+
+ err = phy_write(phydev,29, 0x000a);
+
+ if (err)
+ return err;
+
+ temp = phy_read(phydev, 30);
+
+ if (temp < 0)
+ return temp;
+
+ temp = phy_read(phydev, 30);
+
+ if (temp < 0)
+ return temp;
+
+ temp &= ~0x0020;
+
+ err = phy_write(phydev,30,temp);
+
+ if (err)
+ return err;
+
+ /* Disable automatic MDI/MDIX selection */
+ temp = phy_read(phydev, 16);
+
+ if (temp < 0)
+ return temp;
+
+ temp &= ~0x0060;
+ err = phy_write(phydev,16,temp);
+
+ return err;
+}
+
/* ************************************************************************
*
* Setup the architecture
@@ -138,6 +228,35 @@ static void __init mpc85xx_mds_setup_arch(void)
#endif /* CONFIG_QUICC_ENGINE */
}
+
+static int __init board_fixups(void)
+{
+ char phy_id[BUS_ID_SIZE];
+ char *compstrs[2] = {"fsl,gianfar-mdio", "fsl,ucc-mdio"};
+ struct device_node *mdio;
+ struct resource res;
+ int i;
+
+ for (i = 0; i < ARRAY_SIZE(compstrs); i++) {
+ mdio = of_find_compatible_node(NULL, NULL, compstrs[i]);
+
+ of_address_to_resource(mdio, 0, &res);
+ snprintf(phy_id, BUS_ID_SIZE, "%x:%02x", res.start, 1);
+
+ phy_register_fixup_for_id(phy_id, mpc8568_fixup_125_clock);
+ phy_register_fixup_for_id(phy_id, mpc8568_mds_phy_fixups);
+
+ /* Register a workaround for errata */
+ snprintf(phy_id, BUS_ID_SIZE, "%x:%02x", res.start, 7);
+ phy_register_fixup_for_id(phy_id, mpc8568_mds_phy_fixups);
+
+ of_node_put(mdio);
+ }
+
+ return 0;
+}
+arch_initcall(board_fixups);
+
static struct of_device_id mpc85xx_ids[] = {
{ .type = "soc", },
{ .compatible = "soc", },
--
1.5.4.GIT
^ permalink raw reply related [flat|nested] 3+ messages in thread
* Re: [PATCH v2.6.26] powerpc: Add 8568 PHY workarounds to board code
2008-05-02 23:49 ` Olof Johansson
@ 2008-05-02 23:43 ` Andy Fleming
0 siblings, 0 replies; 3+ messages in thread
From: Andy Fleming @ 2008-05-02 23:43 UTC (permalink / raw)
To: Olof Johansson; +Cc: linuxppc-dev
On May 2, 2008, at 18:49, Olof Johansson wrote:
> Hi,
>
> On Fri, May 02, 2008 at 01:03:42PM -0500, Andy Fleming wrote:
>> +static int __init board_fixups(void)
>> +{
>> + char phy_id[BUS_ID_SIZE];
>> + char *compstrs[2] = {"fsl,gianfar-mdio", "fsl,ucc-mdio"};
>> + struct device_node *mdio;
>> + struct resource res;
>> + int i;
>> +
>> + for (i = 0; i < ARRAY_SIZE(compstrs); i++) {
>> + mdio = of_find_compatible_node(NULL, NULL, compstrs[i]);
>> +
>> + of_address_to_resource(mdio, 0, &res);
>> + snprintf(phy_id, BUS_ID_SIZE, "%x:%02x", res.start, 1);
>> +
>> + phy_register_fixup_for_id(phy_id, mpc8568_fixup_125_clock);
>> + phy_register_fixup_for_id(phy_id, mpc8568_mds_phy_fixups);
>> +
>> + /* Register a workaround for errata */
>> + snprintf(phy_id, BUS_ID_SIZE, "%x:%02x", res.start, 7);
>> + phy_register_fixup_for_id(phy_id, mpc8568_mds_phy_fixups);
>> +
>> + of_node_put(mdio);
>> + }
>> +
>> + return 0;
>> +}
>> +arch_initcall(board_fixups);
>
> Are you sure you want to run this workaround on all boards that happen
> to be built-in? I.e. shouldn't you be checked for what board you are
> running on, since the compatible strings you match on seem generic?
Shoot. That's a good point. I keep forgetting that just because it's
in mpc85xx_mds.c, doesn't mean it's only being run on that platform.
Alright, I'll resubmit.
>
>
>
> -Olof
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH v2.6.26] powerpc: Add 8568 PHY workarounds to board code
2008-05-02 18:03 [PATCH v2.6.26] powerpc: Add 8568 PHY workarounds to board code Andy Fleming
@ 2008-05-02 23:49 ` Olof Johansson
2008-05-02 23:43 ` Andy Fleming
0 siblings, 1 reply; 3+ messages in thread
From: Olof Johansson @ 2008-05-02 23:49 UTC (permalink / raw)
To: Andy Fleming; +Cc: linuxppc-dev
Hi,
On Fri, May 02, 2008 at 01:03:42PM -0500, Andy Fleming wrote:
> +static int __init board_fixups(void)
> +{
> + char phy_id[BUS_ID_SIZE];
> + char *compstrs[2] = {"fsl,gianfar-mdio", "fsl,ucc-mdio"};
> + struct device_node *mdio;
> + struct resource res;
> + int i;
> +
> + for (i = 0; i < ARRAY_SIZE(compstrs); i++) {
> + mdio = of_find_compatible_node(NULL, NULL, compstrs[i]);
> +
> + of_address_to_resource(mdio, 0, &res);
> + snprintf(phy_id, BUS_ID_SIZE, "%x:%02x", res.start, 1);
> +
> + phy_register_fixup_for_id(phy_id, mpc8568_fixup_125_clock);
> + phy_register_fixup_for_id(phy_id, mpc8568_mds_phy_fixups);
> +
> + /* Register a workaround for errata */
> + snprintf(phy_id, BUS_ID_SIZE, "%x:%02x", res.start, 7);
> + phy_register_fixup_for_id(phy_id, mpc8568_mds_phy_fixups);
> +
> + of_node_put(mdio);
> + }
> +
> + return 0;
> +}
> +arch_initcall(board_fixups);
Are you sure you want to run this workaround on all boards that happen
to be built-in? I.e. shouldn't you be checked for what board you are
running on, since the compatible strings you match on seem generic?
-Olof
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2008-05-02 23:43 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-05-02 18:03 [PATCH v2.6.26] powerpc: Add 8568 PHY workarounds to board code Andy Fleming
2008-05-02 23:49 ` Olof Johansson
2008-05-02 23:43 ` Andy Fleming
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).