Date: Tue, 3 Feb 2015 02:24:09 +0000 (UTC) From: Justin Hibbits <jhibbits@FreeBSD.org> To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r278124 - projects/pmac_pmu/sys/powerpc/powermac Message-ID: <201502030224.t132O9WT040425@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: jhibbits Date: Tue Feb 3 02:24:09 2015 New Revision: 278124 URL: https://svnweb.freebsd.org/changeset/base/278124 Log: Refactor macio to make suspend clearer. Modified: projects/pmac_pmu/sys/powerpc/powermac/macio.c projects/pmac_pmu/sys/powerpc/powermac/maciovar.h Modified: projects/pmac_pmu/sys/powerpc/powermac/macio.c ============================================================================== --- projects/pmac_pmu/sys/powerpc/powermac/macio.c Tue Feb 3 02:23:29 2015 (r278123) +++ projects/pmac_pmu/sys/powerpc/powermac/macio.c Tue Feb 3 02:24:09 2015 (r278124) @@ -71,8 +71,8 @@ struct macio_softc { struct resource *sc_memr; int sc_rev; int sc_devid; - uint32_t saved_fcrs[11]; - uint32_t saved_mbcr; + uint32_t sc_saved_fcrs[11]; + uint32_t sc_saved_mbcr; }; static MALLOC_DEFINE(M_MACIO, "macio", "macio device information"); @@ -717,7 +717,8 @@ macio_enable_wireless(device_t dev, bool return (0); } -int macio_reset_ata(device_t atadev) +int +macio_reset_ata(device_t atadev) { device_t dev; struct macio_softc *sc; @@ -761,68 +762,13 @@ int macio_reset_ata(device_t atadev) return (0); } -static int macio_suspend(device_t dev) +static int +macio_suspend_keylargo(device_t dev) { struct macio_softc *sc = device_get_softc(dev); uint32_t temp; - uint32_t fcr_bits[3][2]; - - powerpc_sync(); - - if (sc->sc_devid == 0x22) { - fcr_bits[0][0] = KEYLARGO_FCR0_SLEEP_SET; - fcr_bits[0][1] = KEYLARGO_FCR0_SLEEP_CLR; - fcr_bits[1][0] = KEYLARGO_FCR1_SLEEP_SET; - fcr_bits[1][1] = KEYLARGO_FCR1_SLEEP_CLR; - fcr_bits[2][0] = KEYLARGO_FCR2_SLEEP_SET; - fcr_bits[2][0] = KEYLARGO_FCR2_SLEEP_SET; - fcr_bits[3][1] = KEYLARGO_FCR3_SLEEP_CLR; - fcr_bits[3][1] = KEYLARGO_FCR3_SLEEP_CLR; - } else if (sc->sc_devid == 0x25) { - fcr_bits[0][0] = PANGEA_FCR0_SLEEP_SET; - fcr_bits[0][1] = PANGEA_FCR0_SLEEP_CLR; - fcr_bits[1][0] = PANGEA_FCR1_SLEEP_SET; - fcr_bits[1][1] = PANGEA_FCR1_SLEEP_CLR; - fcr_bits[2][0] = PANGEA_FCR2_SLEEP_SET; - fcr_bits[2][0] = PANGEA_FCR2_SLEEP_SET; - fcr_bits[3][1] = PANGEA_FCR3_SLEEP_CLR; - fcr_bits[3][1] = PANGEA_FCR3_SLEEP_CLR; - } else if (sc->sc_devid == 0x3e) { - fcr_bits[0][0] = INTREPID_FCR0_SLEEP_SET; - fcr_bits[0][1] = INTREPID_FCR0_SLEEP_CLR; - fcr_bits[1][0] = INTREPID_FCR1_SLEEP_SET; - fcr_bits[1][1] = INTREPID_FCR1_SLEEP_CLR; - fcr_bits[2][0] = INTREPID_FCR2_SLEEP_SET; - fcr_bits[2][0] = INTREPID_FCR2_SLEEP_SET; - fcr_bits[3][1] = INTREPID_FCR3_SLEEP_CLR; - fcr_bits[3][1] = INTREPID_FCR3_SLEEP_CLR; - } else if (sc->sc_devid == 0x4f) { - fcr_bits[0][0] = K2_FCR0_SLEEP_SET; - fcr_bits[0][1] = K2_FCR0_SLEEP_CLR; - fcr_bits[1][0] = K2_FCR1_SLEEP_SET; - fcr_bits[1][1] = K2_FCR1_SLEEP_CLR; - fcr_bits[2][0] = K2_FCR2_SLEEP_SET; - fcr_bits[2][0] = K2_FCR2_SLEEP_SET; - fcr_bits[3][1] = K2_FCR3_SLEEP_CLR; - fcr_bits[3][1] = K2_FCR3_SLEEP_CLR; - } - - sc->saved_fcrs[0] = bus_read_4(sc->sc_memr, KEYLARGO_FCR0); - sc->saved_fcrs[1] = bus_read_4(sc->sc_memr, KEYLARGO_FCR1); - sc->saved_fcrs[2] = bus_read_4(sc->sc_memr, KEYLARGO_FCR2); - sc->saved_fcrs[3] = bus_read_4(sc->sc_memr, KEYLARGO_FCR3); - sc->saved_fcrs[4] = bus_read_4(sc->sc_memr, KEYLARGO_FCR4); - sc->saved_fcrs[5] = bus_read_4(sc->sc_memr, KEYLARGO_FCR5); - - if (sc->sc_devid == 0x4f) { - sc->saved_fcrs[6] = bus_read_4(sc->sc_memr, K2_FCR6); - sc->saved_fcrs[7] = bus_read_4(sc->sc_memr, K2_FCR7); - sc->saved_fcrs[8] = bus_read_4(sc->sc_memr, K2_FCR8); - sc->saved_fcrs[9] = bus_read_4(sc->sc_memr, K2_FCR9); - sc->saved_fcrs[10] = bus_read_4(sc->sc_memr, K2_FCR10); - } - temp = sc->saved_fcrs[0]; + temp = sc->sc_saved_fcrs[0]; if (sc->sc_devid == 0x22) { temp |= FCR0_USB_REF_SUSPEND; bus_write_4(sc->sc_memr, KEYLARGO_FCR0, temp); @@ -830,63 +776,185 @@ static int macio_suspend(device_t dev) DELAY(1000); } - temp |= fcr_bits[0][0]; - temp &= ~fcr_bits[0][1]; + temp = sc->sc_saved_fcrs[0]; + temp |= KEYLARGO_FCR0_SLEEP_SET; + temp &= KEYLARGO_FCR0_SLEEP_CLR; bus_write_4(sc->sc_memr, KEYLARGO_FCR0, temp); eieio(); powerpc_sync(); if (sc->sc_devid == 0x22) { temp = bus_read_4(sc->sc_memr, KEYLARGO_MEDIABAY); - sc->saved_mbcr = temp; + sc->sc_saved_mbcr = temp; temp |= KEYLARGO_MB0_DEV_ENABLE; bus_write_4(sc->sc_memr, KEYLARGO_MEDIABAY, temp); eieio(); powerpc_sync(); } - temp = sc->saved_fcrs[1]; - temp |= fcr_bits[1][0]; - temp &= ~fcr_bits[1][1]; + temp = sc->sc_saved_fcrs[1]; + temp |= KEYLARGO_FCR1_SLEEP_SET; + temp &= KEYLARGO_FCR1_SLEEP_CLR; + bus_write_4(sc->sc_memr, KEYLARGO_FCR1, temp); + eieio(); powerpc_sync(); + temp = sc->sc_saved_fcrs[2]; + temp |= KEYLARGO_FCR2_SLEEP_SET; + temp &= KEYLARGO_FCR2_SLEEP_CLR; + bus_write_4(sc->sc_memr, KEYLARGO_FCR2, temp); + eieio(); powerpc_sync(); + temp = sc->sc_saved_fcrs[3]; + temp |= KEYLARGO_FCR3_SLEEP_SET; + temp &= KEYLARGO_FCR3_SLEEP_CLR; + if (sc->sc_rev >= 2) + temp |= (FCR3_SHUTDOWN_PLL_2X | FCR3_SHUTDOWN_PLL_TOTAL); + bus_write_4(sc->sc_memr, KEYLARGO_FCR3, temp); + eieio(); powerpc_sync(); + return (0); +} + +static int +macio_suspend_pangea(device_t dev) +{ + struct macio_softc *sc = device_get_softc(dev); + uint32_t temp; + + temp = sc->sc_saved_fcrs[0]; + temp |= PANGEA_FCR0_SLEEP_SET; + temp &= PANGEA_FCR0_SLEEP_CLR; + bus_write_4(sc->sc_memr, KEYLARGO_FCR0, temp); + eieio(); powerpc_sync(); + temp = sc->sc_saved_fcrs[1]; + temp |= PANGEA_FCR1_SLEEP_SET; + temp &= PANGEA_FCR1_SLEEP_CLR; bus_write_4(sc->sc_memr, KEYLARGO_FCR1, temp); eieio(); powerpc_sync(); + temp = sc->sc_saved_fcrs[2]; + temp |= PANGEA_FCR2_SLEEP_SET; + temp &= PANGEA_FCR2_SLEEP_CLR; + bus_write_4(sc->sc_memr, KEYLARGO_FCR2, temp); + eieio(); powerpc_sync(); + temp = sc->sc_saved_fcrs[3]; + temp |= PANGEA_FCR3_SLEEP_SET; + temp &= PANGEA_FCR3_SLEEP_CLR; + bus_write_4(sc->sc_memr, KEYLARGO_FCR3, temp); + eieio(); powerpc_sync(); + + return (0); +} + +static int +macio_suspend_intrepid(device_t dev) +{ + struct macio_softc *sc = device_get_softc(dev); + uint32_t temp; - temp = sc->saved_fcrs[2]; - temp |= fcr_bits[2][0]; - temp &= ~fcr_bits[2][1]; + temp = sc->sc_saved_fcrs[0]; + temp |= INTREPID_FCR0_SLEEP_SET; + temp &= INTREPID_FCR0_SLEEP_CLR; + bus_write_4(sc->sc_memr, KEYLARGO_FCR0, temp); + eieio(); powerpc_sync(); + temp = sc->sc_saved_fcrs[1]; + temp |= INTREPID_FCR1_SLEEP_SET; + temp &= INTREPID_FCR1_SLEEP_CLR; + bus_write_4(sc->sc_memr, KEYLARGO_FCR1, temp); + eieio(); powerpc_sync(); + temp = sc->sc_saved_fcrs[2]; + temp |= INTREPID_FCR2_SLEEP_SET; + temp &= INTREPID_FCR2_SLEEP_CLR; bus_write_4(sc->sc_memr, KEYLARGO_FCR2, temp); eieio(); powerpc_sync(); + temp = sc->sc_saved_fcrs[3]; + temp |= INTREPID_FCR3_SLEEP_SET; + temp &= INTREPID_FCR3_SLEEP_CLR; + bus_write_4(sc->sc_memr, KEYLARGO_FCR3, temp); + eieio(); powerpc_sync(); - temp = sc->saved_fcrs[3]; - temp |= fcr_bits[3][0]; - temp &= ~fcr_bits[3][1]; - if (sc->sc_rev >= 2) - temp |= (FCR3_SHUTDOWN_PLL_2X | FCR3_SHUTDOWN_PLL_TOTAL); + return (0); +} + +static int +macio_suspend_k2(device_t dev) +{ + struct macio_softc *sc = device_get_softc(dev); + uint32_t temp; + + temp = sc->sc_saved_fcrs[0]; + temp |= K2_FCR0_SLEEP_SET; + temp &= K2_FCR0_SLEEP_CLR; + bus_write_4(sc->sc_memr, KEYLARGO_FCR0, temp); + eieio(); powerpc_sync(); + temp = sc->sc_saved_fcrs[1]; + temp |= K2_FCR1_SLEEP_SET; + temp &= K2_FCR1_SLEEP_CLR; + bus_write_4(sc->sc_memr, KEYLARGO_FCR1, temp); + eieio(); powerpc_sync(); + temp = sc->sc_saved_fcrs[2]; + temp |= K2_FCR2_SLEEP_SET; + temp &= K2_FCR2_SLEEP_CLR; + bus_write_4(sc->sc_memr, KEYLARGO_FCR2, temp); + eieio(); powerpc_sync(); + temp = sc->sc_saved_fcrs[3]; + temp |= K2_FCR3_SLEEP_SET; + temp &= K2_FCR3_SLEEP_CLR; bus_write_4(sc->sc_memr, KEYLARGO_FCR3, temp); eieio(); powerpc_sync(); - powerpc_sync(); + + return (0); +} + +static int +macio_suspend(device_t dev) +{ + struct macio_softc *sc = device_get_softc(dev); + + sc->sc_saved_fcrs[0] = bus_read_4(sc->sc_memr, KEYLARGO_FCR0); + sc->sc_saved_fcrs[1] = bus_read_4(sc->sc_memr, KEYLARGO_FCR1); + sc->sc_saved_fcrs[2] = bus_read_4(sc->sc_memr, KEYLARGO_FCR2); + sc->sc_saved_fcrs[3] = bus_read_4(sc->sc_memr, KEYLARGO_FCR3); + sc->sc_saved_fcrs[4] = bus_read_4(sc->sc_memr, KEYLARGO_FCR4); + sc->sc_saved_fcrs[5] = bus_read_4(sc->sc_memr, KEYLARGO_FCR5); + + if (sc->sc_devid == 0x4f) { + sc->sc_saved_fcrs[6] = bus_read_4(sc->sc_memr, K2_FCR6); + sc->sc_saved_fcrs[7] = bus_read_4(sc->sc_memr, K2_FCR7); + sc->sc_saved_fcrs[8] = bus_read_4(sc->sc_memr, K2_FCR8); + sc->sc_saved_fcrs[9] = bus_read_4(sc->sc_memr, K2_FCR9); + sc->sc_saved_fcrs[10] = bus_read_4(sc->sc_memr, K2_FCR10); + } + + if (sc->sc_devid == 0x22) { + return macio_suspend_keylargo(dev); + } else if (sc->sc_devid == 0x25) { + return macio_suspend_pangea(dev); + } else if (sc->sc_devid == 0x3e) { + return macio_suspend_intrepid(dev); + } else if (sc->sc_devid == 0x4f) { + return macio_suspend_k2(dev); + } + return (0); } -static int macio_resume(device_t dev) +static int +macio_resume(device_t dev) { struct macio_softc *sc = device_get_softc(dev); if (sc->sc_devid == 0x22) - bus_write_4(sc->sc_memr, KEYLARGO_MEDIABAY, sc->saved_mbcr); + bus_write_4(sc->sc_memr, KEYLARGO_MEDIABAY, sc->sc_saved_mbcr); - bus_write_4(sc->sc_memr, KEYLARGO_FCR0, sc->saved_fcrs[0]); - bus_write_4(sc->sc_memr, KEYLARGO_FCR1, sc->saved_fcrs[1]); - bus_write_4(sc->sc_memr, KEYLARGO_FCR2, sc->saved_fcrs[2]); - bus_write_4(sc->sc_memr, KEYLARGO_FCR3, sc->saved_fcrs[3]); - bus_write_4(sc->sc_memr, KEYLARGO_FCR4, sc->saved_fcrs[4]); - bus_write_4(sc->sc_memr, KEYLARGO_FCR5, sc->saved_fcrs[5]); + bus_write_4(sc->sc_memr, KEYLARGO_FCR0, sc->sc_saved_fcrs[0]); + bus_write_4(sc->sc_memr, KEYLARGO_FCR1, sc->sc_saved_fcrs[1]); + bus_write_4(sc->sc_memr, KEYLARGO_FCR2, sc->sc_saved_fcrs[2]); + bus_write_4(sc->sc_memr, KEYLARGO_FCR3, sc->sc_saved_fcrs[3]); + bus_write_4(sc->sc_memr, KEYLARGO_FCR4, sc->sc_saved_fcrs[4]); + bus_write_4(sc->sc_memr, KEYLARGO_FCR5, sc->sc_saved_fcrs[5]); if (sc->sc_devid == 0x4f) { - bus_write_4(sc->sc_memr, K2_FCR6, sc->saved_fcrs[6]); - bus_write_4(sc->sc_memr, K2_FCR7, sc->saved_fcrs[7]); - bus_write_4(sc->sc_memr, K2_FCR8, sc->saved_fcrs[8]); - bus_write_4(sc->sc_memr, K2_FCR9, sc->saved_fcrs[9]); - bus_write_4(sc->sc_memr, K2_FCR10, sc->saved_fcrs[10]); + bus_write_4(sc->sc_memr, K2_FCR6, sc->sc_saved_fcrs[6]); + bus_write_4(sc->sc_memr, K2_FCR7, sc->sc_saved_fcrs[7]); + bus_write_4(sc->sc_memr, K2_FCR8, sc->sc_saved_fcrs[8]); + bus_write_4(sc->sc_memr, K2_FCR9, sc->sc_saved_fcrs[9]); + bus_write_4(sc->sc_memr, K2_FCR10, sc->sc_saved_fcrs[10]); } /* Let things settle. */ Modified: projects/pmac_pmu/sys/powerpc/powermac/maciovar.h ============================================================================== --- projects/pmac_pmu/sys/powerpc/powermac/maciovar.h Tue Feb 3 02:23:29 2015 (r278123) +++ projects/pmac_pmu/sys/powerpc/powermac/maciovar.h Tue Feb 3 02:24:09 2015 (r278124) @@ -249,7 +249,7 @@ #define PANGEA_FCR2_SLEEP_SET FCR2_ALT_DATA_OUT #define PANGEA_FCR2_SLEEP_CLR 0 -#define PANGEEA_FCR3_SLEEP_SET (FCR3_SHUTDOWN_PLL_KW35 | \ +#define PANGEA_FCR3_SLEEP_SET (FCR3_SHUTDOWN_PLL_KW35 | \ FCR3_SHUTDOWN_PLL_KW4 | FCR3_SHUTDOWN_PLL_KW6) #define PANGEA_FCR3_SLEEP_CLR (FCR3_CLK_49_ENABLE | FCR3_CLK_45_ENABLE | \ FCR3_CLK_31_ENABLE | FCR3_TMR_CLK18_ENABLE | \
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201502030224.t132O9WT040425>