From owner-p4-projects@FreeBSD.ORG Sat Apr 18 16:00:37 2009 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id ACAA31065794; Sat, 18 Apr 2009 16:00:36 +0000 (UTC) Delivered-To: perforce@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 2B9B6106578F for ; Sat, 18 Apr 2009 16:00:36 +0000 (UTC) (envelope-from lulf@FreeBSD.org) Received: from repoman.freebsd.org (repoman.freebsd.org [IPv6:2001:4f8:fff6::29]) by mx1.freebsd.org (Postfix) with ESMTP id 1527D8FC14 for ; Sat, 18 Apr 2009 16:00:36 +0000 (UTC) (envelope-from lulf@FreeBSD.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.14.3/8.14.3) with ESMTP id n3IG0aZc044663 for ; Sat, 18 Apr 2009 16:00:36 GMT (envelope-from lulf@FreeBSD.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.3/8.14.3/Submit) id n3IG0aG6044661 for perforce@freebsd.org; Sat, 18 Apr 2009 16:00:36 GMT (envelope-from lulf@FreeBSD.org) Date: Sat, 18 Apr 2009 16:00:36 GMT Message-Id: <200904181600.n3IG0aG6044661@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to lulf@FreeBSD.org using -f From: Ulf Lilleengen To: Perforce Change Reviews Cc: Subject: PERFORCE change 160785 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 18 Apr 2009 16:00:40 -0000 http://perforce.freebsd.org/chv.cgi?CH=160785 Change 160785 by lulf@lulf_carrot on 2009/04/18 16:00:07 - Drop using a clk_index, and create the device clocks in the power manager itself instead. We might use a softc per clock to distinguish between clocks that are on the same height such as pba,pbb,cpu,hsb or mci,uart,spi etc. - Remove lookup_index and rename lookup_name to lookup_clock. - Add function to set a clock parent. - PBB/PBA are not clocks more than just a mask, so drop them and let the clock tree "leafs" like mci handle it. Affected files ... .. //depot/projects/avr32/src/sys/avr32/avr32/at32.c#11 edit .. //depot/projects/avr32/src/sys/avr32/avr32/at32_pm.c#7 edit .. //depot/projects/avr32/src/sys/avr32/avr32/at32_tc.c#3 edit .. //depot/projects/avr32/src/sys/avr32/avr32/at32_tc_channel.c#3 edit .. //depot/projects/avr32/src/sys/avr32/conf/cpu/at32ap700x.hints#5 edit .. //depot/projects/avr32/src/sys/kern/devclk_if.m#6 edit .. //depot/projects/avr32/src/sys/kern/subr_devclk.c#6 edit .. //depot/projects/avr32/src/sys/sys/devclk.h#6 edit Differences ... ==== //depot/projects/avr32/src/sys/avr32/avr32/at32.c#11 (text+ko) ==== @@ -67,13 +67,8 @@ struct resource *); static struct resource *at32_alloc_resource(device_t, device_t, int, int *, u_long, u_long, u_long, u_int); -static uint64_t at32_clk_get_rate(device_t, device_t); -static int at32_clk_set_rate(device_t, device_t, uint64_t); -static void at32_clk_enable(device_t, device_t); -static void at32_clk_disable(device_t, device_t); +static const char *at32_lookup_clock(device_t, device_t); -static const char *at32_clk_lookup_name(device_t, device_t); -static int at32_clk_lookup_index(device_t, device_t); /* Driver variables and private data */ struct at32_softc { struct rman sc_irq_rman; @@ -82,7 +77,6 @@ }; struct at32_ivar { char *clk_name; - int clk_index; struct resource_list resources; }; @@ -103,13 +97,7 @@ DEVMETHOD(bus_get_resource, bus_generic_rl_get_resource), DEVMETHOD(bus_release_resource, at32_release_resource), - DEVMETHOD(devclk_lookup_name, at32_clk_lookup_name), - DEVMETHOD(devclk_lookup_index, at32_clk_lookup_index), -/* - DEVMETHOD(devclk_get_rate, at32_clk_get_rate), - DEVMETHOD(devclk_set_rate, at32_clk_set_rate), - DEVMETHOD(devclk_enable, at32_clk_enable), - DEVMETHOD(devclk_disable, at32_clk_disable),*/ + DEVMETHOD(devclk_lookup_clock, at32_lookup_clock), {0, 0}, }; @@ -226,9 +214,6 @@ ivar = device_get_ivars(child); ivar->clk_name = NULL; if (resource_string_value(dname, dunit, "clk", &resval) == 0) { - if (resource_int_value(dname, dunit, "clk_index", - &ivar->clk_index) != 0) - ivar->clk_index = 0; /* Default */ ivar->clk_name = malloc(strlen(resval) + 1, M_DEVBUF, M_WAITOK | M_ZERO); strlcpy(ivar->clk_name, resval, strlen(resval) + 1); @@ -368,55 +353,10 @@ } static const char * -at32_clk_lookup_name(device_t dev, device_t child) +at32_lookup_clock(device_t dev, device_t child) { struct at32_ivar *ivar; ivar = device_get_ivars(child); return (ivar->clk_name); } - -static int -at32_clk_lookup_index(device_t dev, device_t child) -{ - struct at32_ivar *ivar; - - ivar = device_get_ivars(child); - return (ivar->clk_index); -} - -#if 0 -static uint64_t -at32_clk_get_rate(device_t dev, device_t child) -{ - avr32_impl(); - return (0); -} - -static int -at32_clk_set_rate(device_t dev, device_t child, uint64_t rate) -{ - avr32_impl(); - return (0); -} - -static void -at32_clk_enable(device_t dev, device_t child) -{ - struct at32_ivar *ivar = device_get_ivars(child); - - /* Only activate if it actually has a clock. */ - if (strcmp(ivar->clk_name, "") != 0) - devclk_activate(ivar->clk_name, ivar->clk_index); -} - -static void -at32_clk_disable(device_t dev, device_t child) -{ - struct at32_ivar *ivar = device_get_ivars(child); - - /* Only deactivate if it actually has a clock. */ - if (strcmp(ivar->clk_name, "") != 0) - devclk_deactivate(ivar->clk_name, ivar->clk_index); -} -#endif ==== //depot/projects/avr32/src/sys/avr32/avr32/at32_pm.c#7 (text+ko) ==== @@ -65,26 +65,21 @@ static int at32_pm_activate(device_t); static void at32_pm_deactivate(device_t); -static void at32_pba_enable(devclk_t, int); -static void at32_pba_disable(devclk_t, int); -static uint64_t at32_pba_get_rate(devclk_t, int); -static int at32_pba_set_rate(devclk_t, int, uint64_t); +static void at32_mci_enable(devclk_t); +static void at32_mci_disable(devclk_t); +static uint64_t at32_mci_get_rate(devclk_t); +static int at32_mci_set_rate(devclk_t, uint64_t); -static void at32_pbb_enable(devclk_t, int); -static void at32_pbb_disable(devclk_t, int); -static uint64_t at32_pbb_get_rate(devclk_t, int); -static int at32_pbb_set_rate(devclk_t, int, uint64_t); +static void at32_pll_enable(devclk_t); +static void at32_pll_disable(devclk_t); +static uint64_t at32_pll_get_rate(devclk_t); +static int at32_pll_set_rate(devclk_t, uint64_t); -static void at32_pll_enable(devclk_t, int); -static void at32_pll_disable(devclk_t, int); -static uint64_t at32_pll_get_rate(devclk_t, int); -static int at32_pll_set_rate(devclk_t, int, uint64_t); +static void at32_osc_enable(devclk_t); +static void at32_osc_disable(devclk_t); +static uint64_t at32_osc_get_rate(devclk_t); +static int at32_osc_set_rate(devclk_t, uint64_t); -static void at32_osc_enable(devclk_t, int); -static void at32_osc_disable(devclk_t, int); -static uint64_t at32_osc_get_rate(devclk_t, int); -static int at32_osc_set_rate(devclk_t, int, uint64_t); - /* Driver variables and private data */ struct at32_pm_softc { struct resource *regs_res; @@ -93,6 +88,14 @@ bus_space_handle_t bsh; }; +#if 0 +struct at32_clk_softc { + const char *name; + int index; + devclk_t clk; +}; +#endif + static device_method_t at32_pm_methods[] = { /* Device interface */ DEVMETHOD(device_probe, at32_pm_probe), @@ -130,27 +133,16 @@ }; DEFINE_CLASS(at32_pll, at32_pll_methods, sizeof(struct devclk)); -/* Class defining the PBB clock mask. */ -static kobj_method_t at32_pbb_methods[] = { - KOBJMETHOD(devclk_enable, at32_pbb_enable), - KOBJMETHOD(devclk_disable, at32_pbb_disable), - KOBJMETHOD(devclk_set_rate, at32_pbb_set_rate), - KOBJMETHOD(devclk_get_rate, at32_pbb_get_rate), +/* Class defining the mci device clock. */ +static kobj_method_t at32_mci_methods[] = { + KOBJMETHOD(devclk_enable, at32_mci_enable), + KOBJMETHOD(devclk_disable, at32_mci_disable), + KOBJMETHOD(devclk_set_rate, at32_mci_set_rate), + KOBJMETHOD(devclk_get_rate, at32_mci_get_rate), {0, 0}, }; -DEFINE_CLASS(at32_pbb, at32_pbb_methods, sizeof(struct devclk)); +DEFINE_CLASS(at32_mci, at32_mci_methods, sizeof(struct devclk)); -/* Class defining the pba clock mask. */ -static kobj_method_t at32_pba_methods[] = { - KOBJMETHOD(devclk_enable, at32_pba_enable), - KOBJMETHOD(devclk_disable, at32_pba_disable), - KOBJMETHOD(devclk_set_rate, at32_pba_set_rate), - KOBJMETHOD(devclk_get_rate, at32_pba_get_rate), - {0, 0}, -}; -DEFINE_CLASS(at32_pba, at32_pba_methods, sizeof(struct devclk)); - - /* Code */ static int at32_pm_probe(device_t dev) @@ -183,11 +175,9 @@ at32_pm_activate(device_t dev) { struct at32_pm_softc *sc = device_get_softc(dev); + devclk_t clk; int err = ENOMEM; - /* Make sure device clock is enabled before writing */ - devclk_enable(dev); - /* Set private data and map register space */ sc->regs_res = bus_alloc_resource(dev, SYS_RES_MEMORY, &sc->regs_rid, 0, ~0, 0, RF_ACTIVE); @@ -201,20 +191,18 @@ /* Register main clocks. */ //devclk_register_clock(dev, "osc32", NULL); - devclk_register_clock(dev, &at32_osc_class, "osc0", NULL); + devclk_register_clock(dev, &at32_osc_class, "osc0"); //devclk_register_clock(dev, &sc->osc1, "osc1", NULL); /* Register prescalers. */ - devclk_register_clock(dev, &at32_pll_class, "pll0", "osc0"); + clk = devclk_register_clock(dev, &at32_pll_class, "pll0"); + devclk_set_parent(clk, "osc0"); //devclk_register_clock(dev, &sc->pll1, "pll1", &sc->osc0); /* Register master device clocks. */ - devclk_register_clock(dev, &at32_pbb_class, "pbb", "pll0"); - devclk_register_clock(dev, &at32_pba_class, "pba", "pll0"); -// devclk_register_clock(dev, &sc->cpu, "cpu", &sc->pll0); -// devclk_register_clock(dev, &sc->hsb, "hsb", &sc->cpu); -// devclk_register_clock(dev, &sc->pba, "pba", &sc->hsb); -// devclk_register_clock(dev, &sc->pbb, "pbb", &sc->hsb); + clk = devclk_register_clock(dev, &at32_mci_class, "mci"); + devclk_set_parent(clk, "pll0"); + /* XXX: Implement rest of device clocks. */ return (0); err: @@ -237,186 +225,81 @@ } static void -at32_pbb_enable(devclk_t clk, int index) +at32_mci_enable(devclk_t clk) { struct at32_pm_softc *sc; uint32_t reg; KASSERT(clk != NULL, ("NULL clk")); - KASSERT(index < 31, ("index > register width")); sc = device_get_softc(clk->dev); reg = RD4(AT32_PM_PBBMASK); - WR4(AT32_PM_PBBMASK, reg | (1 << index)); + WR4(AT32_PM_PBBMASK, reg | (1 << 9)); } static void -at32_pbb_disable(devclk_t clk, int index) +at32_mci_disable(devclk_t clk) { struct at32_pm_softc *sc; uint32_t reg; KASSERT(clk != NULL, ("NULL clk")); - KASSERT(index < 31, ("index > register width")); sc = device_get_softc(clk->dev); reg = RD4(AT32_PM_PBBMASK); - WR4(AT32_PM_PBBMASK, reg & ~(1 << index)); + WR4(AT32_PM_PBBMASK, reg & ~(1 << 9)); } -extern uint64_t clock_cpu_frequency; - static uint64_t -at32_pbb_get_rate(devclk_t clk, int index) +at32_mci_get_rate(devclk_t clk) { - /* XXX: Temporary. */ - return (clock_cpu_frequency); -} - -static int -at32_pbb_set_rate(devclk_t clk, int index, uint64_t rate) -{ return (0); -} - -static void -at32_pba_enable(devclk_t clk, int index) -{ - struct at32_pm_softc *sc; - uint32_t reg; +} - KASSERT(clk != NULL, ("NULL clk")); - KASSERT(index < 31, ("index > register width")); - sc = device_get_softc(clk->dev); - reg = RD4(AT32_PM_PBAMASK); - WR4(AT32_PM_PBAMASK, reg | (1 << index)); -} - -static void -at32_pba_disable(devclk_t clk, int index) -{ - struct at32_pm_softc *sc; - uint32_t reg; - - KASSERT(clk != NULL, ("NULL clk")); - KASSERT(index < 31, ("index > register width")); - sc = device_get_softc(clk->dev); - reg = RD4(AT32_PM_PBAMASK); - WR4(AT32_PM_PBAMASK, reg & ~(1 << index)); -} - -static uint64_t -at32_pba_get_rate(devclk_t clk, int index) -{ - /* XXX: Temporary. */ - return (clock_cpu_frequency); -} - static int -at32_pba_set_rate(devclk_t clk, int index, uint64_t rate) +at32_mci_set_rate(devclk_t clk, uint64_t rate) { return (0); } static void -at32_osc_enable(devclk_t clk, int index) +at32_osc_enable(devclk_t clk) { - /* In this case, index means which oscilliator. */ - switch (index) { - case 0: /* OSC0 */ - break; - case 1: /* OSC1 */ - break; - case 2: /* OSC32 */ - break; - } } static void -at32_osc_disable(devclk_t clk, int index) +at32_osc_disable(devclk_t clk) { - /* In this case, index means which oscilliator. */ - switch (index) { - case 0: /* OSC0 */ - break; - case 1: /* OSC1 */ - break; - case 2: /* OSC32 */ - break; - } } static uint64_t -at32_osc_get_rate(devclk_t clk, int index) +at32_osc_get_rate(devclk_t clk) { - /* In this case, index means which oscilliator. */ - switch (index) { - case 0: /* OSC0 */ - break; - case 1: /* OSC1 */ - break; - case 2: /* OSC32 */ - break; - } + return (0); } static int -at32_osc_set_rate(devclk_t clk, int index, uint64_t rate) +at32_osc_set_rate(devclk_t clk, uint64_t rate) { - /* In this case, index means which oscilliator. */ - switch (index) { - case 0: /* OSC0 */ - break; - case 1: /* OSC1 */ - break; - case 2: /* OSC32 */ - break; - } return (0); } static void -at32_pll_enable(devclk_t clk, int index) +at32_pll_enable(devclk_t clk) { - /* Here, index means which pll. */ - switch (index) { - case 0: /* PLL0. */ - break; - case 1: /* PLL1. */ - break; - } } static void -at32_pll_disable(devclk_t clk, int index) +at32_pll_disable(devclk_t clk) { - /* Here, index means which pll. */ - switch (index) { - case 0: /* PLL0. */ - break; - case 1: /* PLL1. */ - break; - } } static uint64_t -at32_pll_get_rate(devclk_t clk, int index) +at32_pll_get_rate(devclk_t clk) { - switch (index) { - case 0: /* PLL0 */ - break; - case 1: /* PLL1 */ - break; - } return (0); } static int -at32_pll_set_rate(devclk_t clk, int index, uint64_t rate) +at32_pll_set_rate(devclk_t clk, uint64_t rate) { - switch (index) { - case 0: /* PLL0 */ - break; - case 1: /* PLL1 */ - break; - } return (0); } ==== //depot/projects/avr32/src/sys/avr32/avr32/at32_tc.c#3 (text+ko) ==== @@ -67,8 +67,7 @@ u_long, u_long, u_long, u_int); static int at32_tc_release_resource(device_t, device_t, int, int, struct resource *); -static const char *at32_tc_clk_lookup_name(device_t, device_t); -static int at32_tc_clk_lookup_index(device_t, device_t); +static const char *at32_tc_lookup_clock(device_t, device_t); /*** Driver variables and private data */ struct at32_tc_softc { @@ -99,8 +98,7 @@ DEVMETHOD(bus_setup_intr, bus_generic_setup_intr), DEVMETHOD(bus_teardown_intr, bus_generic_teardown_intr), - DEVMETHOD(devclk_lookup_name, at32_tc_clk_lookup_name), - DEVMETHOD(devclk_lookup_index, at32_tc_clk_lookup_index), + DEVMETHOD(devclk_lookup_clock, at32_tc_lookup_clock), {0, 0}, }; @@ -127,7 +125,7 @@ int rid, err = ENOMEM; /* Make sure device clock is enabled before writing */ - devclk_enable(dev); + //devclk_enable(dev); /* Setup register space */ rid = 0; @@ -193,7 +191,7 @@ } /* Turn off device clock */ - devclk_disable(dev); + //devclk_disable(dev); return (0); } @@ -354,23 +352,12 @@ } static const char * -at32_tc_clk_lookup_name(device_t dev, device_t child) +at32_tc_lookup_clock(device_t dev, device_t child) { device_t parent; parent = device_get_parent(dev); if (parent != NULL) - return (DEVCLK_LOOKUP_NAME(parent, dev)); - return (NULL); -} - -static int -at32_tc_clk_lookup_index(device_t dev, device_t child) -{ - device_t parent; - - parent = device_get_parent(dev); - if (parent != NULL) - return (DEVCLK_LOOKUP_INDEX(parent, dev)); + return (DEVCLK_LOOKUP_CLOCK(parent, dev)); return (NULL); } ==== //depot/projects/avr32/src/sys/avr32/avr32/at32_tc_channel.c#3 (text+ko) ==== @@ -104,7 +104,7 @@ int rid, err = ENOMEM; /* Make sure device clock is enabled before writing */ - devclk_enable(dev); + //devclk_enable(dev); /* Setup register space */ rid = 0; @@ -157,7 +157,7 @@ } /* Turn off device clock */ - devclk_disable(dev); + //devclk_disable(dev); return (0); } ==== //depot/projects/avr32/src/sys/avr32/conf/cpu/at32ap700x.hints#5 (text+ko) ==== @@ -34,29 +34,21 @@ hint.uart.0.maddr="0xFFE00C00" hint.uart.0.msize="0x400" hint.uart.0.irq="6" -hint.uart.0.clk="pba" -hint.uart.0.clk_index="3" hint.uart.1.at="at32bus0" hint.uart.1.maddr="0xFFE01000" hint.uart.1.msize="0x400" hint.uart.1.irq="7" -#hint.uart.1.clk="pba" -#hint.uart.1.clk_index="4" hint.uart.2.at="at32bus0" hint.uart.2.maddr="0xFFE01400" hint.uart.2.msize="0x400" hint.uart.2.irq="8" -#hint.uart.2.clk="pba" -#hint.uart.2.clk_index="5" hint.uart.3.at="at32bus0" hint.uart.3.maddr="0xFFE01800" hint.uart.3.msize="0x400" hint.uart.3.irq="9" -#hint.uart.3.clk="pba" -#hint.uart.3.clk_index="6" hint.atmel_ssc.0.at="at32bus0" hint.atmel_ssc.0.maddr="0xFFE01C00" @@ -168,8 +160,7 @@ hint.atmel_mci.0.maddr="0xFFF02400" hint.atmel_mci.0.msize="0x400" hint.atmel_mci.0.irq="28" -hint.atmel_mci.0.clk="pbb" -hint.atmel_mci.0.clk_index="9" +hint.atmel_mci.0.clk="mci" hint.at32_ac97c.0.at="at32bus0" hint.at32_ac97c.0.maddr="0xFFF02800" ==== //depot/projects/avr32/src/sys/kern/devclk_if.m#6 (text+ko) ==== @@ -33,36 +33,26 @@ # Get device clock rate METHOD uint64_t get_rate { devclk_t _clk; - int _index; }; # Set device clock rate METHOD int set_rate { devclk_t _clk; - int _index; uint64_t _rate; }; # Enable a device clock METHOD void enable { devclk_t _clk; - int _index; }; # Disable a device clock METHOD void disable { devclk_t _clk; - int _index; }; -# Look for clock name -METHOD const char* lookup_name { - device_t _dev; - device_t _child; -}; - -# Look for clock index -METHOD int lookup_index { +# Look for clock name mapped to child +METHOD const char* lookup_clock { device_t _dev; device_t _child; }; ==== //depot/projects/avr32/src/sys/kern/subr_devclk.c#6 (text+ko) ==== @@ -55,19 +55,20 @@ device_t parent; devclk_t clk; const char *name; - int index; - /* The device parent should know which clock to use. */ + /* Get the device knowing how the mapping is. */ parent = device_get_parent(dev); if (parent != NULL) { - name = DEVCLK_LOOKUP_NAME(parent, dev); - if (name == NULL) + name = DEVCLK_LOOKUP_CLOCK(parent, dev); + if (name == NULL) { + device_printf(dev, "warning: devclk_get_rate() without " + "clock\n"); goto bad; - index = DEVCLK_LOOKUP_INDEX(parent, dev); + } clk = devclk_find_clock(name); if (clk == NULL) goto bad; - return (DEVCLK_GET_RATE(clk, index)); + return (DEVCLK_GET_RATE(clk)); } bad: return (EINVAL); @@ -79,19 +80,20 @@ device_t parent; devclk_t clk; const char *name; - int index; /* The device parent should know which clock to use. */ parent = device_get_parent(dev); if (parent != NULL) { - name = DEVCLK_LOOKUP_NAME(parent, dev); - if (name == NULL) + name = DEVCLK_LOOKUP_CLOCK(parent, dev); + if (name == NULL) { + device_printf(dev, "warning: devclk_set_rate() without " + "clock\n"); goto bad; - index = DEVCLK_LOOKUP_INDEX(parent, dev); + } clk = devclk_find_clock(name); if (clk == NULL) goto bad; - DEVCLK_SET_RATE(clk, index, rate); + DEVCLK_SET_RATE(clk, rate); return (0); } bad: @@ -104,18 +106,19 @@ device_t parent; devclk_t clk; const char *name; - int index; /* The device parent should know which clock to use. */ parent = device_get_parent(dev); if (parent != NULL) { - name = DEVCLK_LOOKUP_NAME(parent, dev); - if (name == NULL) + name = DEVCLK_LOOKUP_CLOCK(parent, dev); + if (name == NULL) { + device_printf(dev, "warning: devclk_enable() without " + "clock\n"); return; - index = DEVCLK_LOOKUP_INDEX(parent, dev); + } clk = devclk_find_clock(name); if (clk != NULL) - DEVCLK_ENABLE(clk, index); + DEVCLK_ENABLE(clk); } } @@ -125,37 +128,45 @@ device_t parent; devclk_t clk; const char *name; - int index; /* The device parent should know which clock to use. */ parent = device_get_parent(dev); if (parent != NULL) { - name = DEVCLK_LOOKUP_NAME(parent, dev); - if (name == NULL) + name = DEVCLK_LOOKUP_CLOCK(parent, dev); + if (name == NULL) { + device_printf(dev, "warning: devclk_disable() without " + "clock\n"); return; - index = DEVCLK_LOOKUP_INDEX(parent, dev); + } clk = devclk_find_clock(name); if (clk != NULL) - DEVCLK_DISABLE(clk, index); + DEVCLK_DISABLE(clk); } } /** * Register clock to be associated with dev */ -void -devclk_register_clock(device_t dev, kobj_class_t cls, const char *name, - const char *parent) +devclk_t +devclk_register_clock(device_t dev, kobj_class_t cls, const char *name) { devclk_t clk; clk = kobj_create(cls, M_DEVBUF, M_WAITOK | M_ZERO); clk->dev = dev; - strlcpy(clk->name, name, sizeof(clk->name)); - clk->parent = ((parent == NULL) ? NULL : devclk_find_clock(parent)); + clk->name = strdup(name, M_DEVBUF); /* Insert clock into list. */ STAILQ_INSERT_HEAD(&devclks, clk, link); + return (clk); +} + +void +devclk_set_parent(devclk_t clk, const char *parent) +{ + + KASSERT(parent != NULL, ("NULL parent")); + clk->parent = devclk_find_clock(parent); } static devclk_t ==== //depot/projects/avr32/src/sys/sys/devclk.h#6 (text+ko) ==== @@ -7,16 +7,20 @@ struct devclk { KOBJ_FIELDS; device_t dev; /* Device responsible for clock. */ - char name[32]; /* Clock name. */ struct devclk *parent; /* Clock we originate from. */ + char *name; /* Clock name. */ int index; /* Our index in our parent. */ STAILQ_ENTRY(devclk) link; + void *data; /* Arch dependant data. */ }; typedef struct devclk* devclk_t; typedef STAILQ_HEAD(, devclk) devclk_list_t; #include "devclk_if.h" +/** + * Initialize clock manager. + */ void devclk_init(void); /** @@ -42,12 +46,11 @@ /** * Add a clock to the devclk manager. */ -void devclk_register_clock(device_t, kobj_class_t, const char *, const char *); +devclk_t devclk_register_clock(device_t, kobj_class_t, const char *); /** - * Register a mapping from device to clock + * Set the parent of a device clock. */ -void devclk_register_map(device_t, const char *, int); - +void devclk_set_parent(devclk_t, const char *); #endif /* _KERNEL */ #endif /* !_SYS_DEVCLK_H_ */