Date: Wed, 8 Feb 2012 06:22:43 +0000 (UTC) From: Oleksandr Tymoshenko <gonzo@FreeBSD.org> To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r231184 - in projects/armv6/sys: arm/ti arm/ti/omap4 boot/fdt/dts Message-ID: <201202080622.q186Mhck025892@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: gonzo Date: Wed Feb 8 06:22:43 2012 New Revision: 231184 URL: http://svn.freebsd.org/changeset/base/231184 Log: Make PRCM driver FDT-compatible Modified: projects/armv6/sys/arm/ti/omap4/files.omap44xx projects/armv6/sys/arm/ti/omap4/omap4_prcm_clks.c projects/armv6/sys/arm/ti/omap_prcm.c projects/armv6/sys/arm/ti/omap_prcm.h projects/armv6/sys/boot/fdt/dts/pandaboard.dts Modified: projects/armv6/sys/arm/ti/omap4/files.omap44xx ============================================================================== --- projects/armv6/sys/arm/ti/omap4/files.omap44xx Wed Feb 8 06:21:42 2012 (r231183) +++ projects/armv6/sys/arm/ti/omap4/files.omap44xx Wed Feb 8 06:22:43 2012 (r231184) @@ -14,7 +14,7 @@ arm/arm/irq_dispatch.S standard arm/ti/ti_machdep.c standard # arm/ti/omap.c standard arm/ti/ti_cpuid.c standard -# arm/ti/omap_prcm.c standard +arm/ti/omap_prcm.c standard arm/ti/omap_scm.c standard # arm/ti/omap_if.m standard arm/ti/mp_timer.c standard @@ -26,7 +26,7 @@ arm/ti/bus_space.c standard # arm/ti/omap4/omap4_if.m standard # arm/ti/omap4/omap44xx.c standard # arm/ti/omap4/omap4_intr.c standard -# arm/ti/omap4/omap4_prcm_clks.c standard +arm/ti/omap4/omap4_prcm_clks.c standard arm/ti/omap4/omap4_scm_padconf.c standard dev/uart/uart_dev_ns8250.c optional uart Modified: projects/armv6/sys/arm/ti/omap4/omap4_prcm_clks.c ============================================================================== --- projects/armv6/sys/arm/ti/omap4/omap4_prcm_clks.c Wed Feb 8 06:21:42 2012 (r231183) +++ projects/armv6/sys/arm/ti/omap4/omap4_prcm_clks.c Wed Feb 8 06:22:43 2012 (r231184) @@ -51,7 +51,10 @@ __FBSDID("$FreeBSD$"); #include <arm/ti/omap_prcm.h> #include <arm/ti/omap4/omap44xx_reg.h> -#include "omap_if.h" +#include <dev/fdt/fdt_common.h> +#include <dev/ofw/openfirm.h> +#include <dev/ofw/ofw_bus.h> +#include <dev/ofw/ofw_bus_subr.h> /* * This file defines the clock configuration for the OMAP4xxx series of @@ -126,13 +129,11 @@ __FBSDID("$FreeBSD$"); #define DEVICE_PRM_OFFSET 0x00001B00UL #define INSTR_PRM_OFFSET 0x00001F00UL - #define CM_ABE_DSS_SYS_CLKSEL_OFFSET (CKGEN_PRM_OFFSET + 0x0000UL) #define CM_L4_WKUP_CLKSELL_OFFSET (CKGEN_PRM_OFFSET + 0x0008UL) #define CM_ABE_PLL_REF_CLKSEL_OFFSET (CKGEN_PRM_OFFSET + 0x000CUL) #define CM_SYS_CLKSEL_OFFSET (CKGEN_PRM_OFFSET + 0x0010UL) - /** * Address offsets from the CM1 memory region to the top level clock control * registers. @@ -146,7 +147,6 @@ __FBSDID("$FreeBSD$"); #define CM_CLKSEL_DPLL_MPU (CKGEN_CM1_OFFSET + 0x006CUL) - /** * Address offsets from the CM2 memory region to the top level clock control * registers. @@ -164,8 +164,6 @@ __FBSDID("$FreeBSD$"); #define RESTORE_CM2_OFFSET 0x00001E00UL #define INSTR_CM2_OFFSET 0x00001F00UL - - #define CLKCTRL_MODULEMODE_MASK 0x00000003UL #define CLKCTRL_MODULEMODE_DISABLE 0x00000000UL #define CLKCTRL_MODULEMODE_AUTO 0x00000001UL @@ -177,29 +175,38 @@ __FBSDID("$FreeBSD$"); #define CLKCTRL_IDLEST_IDLE 0x00020000UL #define CLKCTRL_IDLEST_DISABLED 0x00030000UL +static struct resource_spec omap_scm_res_spec[] = { + { SYS_RES_MEMORY, 0, RF_ACTIVE }, /* Control memory window */ + { SYS_RES_MEMORY, 1, RF_ACTIVE }, /* Control memory window */ + { SYS_RES_MEMORY, 2, RF_ACTIVE }, /* Control memory window */ + { -1, 0 } +}; + struct omap4_prcm_softc { - struct resource *sc_mem_res[4]; + struct resource *sc_res[3]; }; -static int omap4_clk_generic_activate(device_t dev, struct omap_clock_dev *clkdev); -static int omap4_clk_generic_deactivate(device_t dev, struct omap_clock_dev *clkdev); -static int omap4_clk_generic_accessible(device_t dev, struct omap_clock_dev *clkdev); -static int omap4_clk_generic_set_source(device_t dev, struct omap_clock_dev *clkdev, clk_src_t clksrc); -static int omap4_clk_generic_get_source_freq(device_t dev, struct omap_clock_dev *clkdev, unsigned int *freq); - -static int omap4_clk_gptimer_set_source(device_t dev, struct omap_clock_dev *clkdev, clk_src_t clksrc); -static int omap4_clk_gptimer_get_source_freq(device_t dev, struct omap_clock_dev *clkdev, unsigned int *freq); - -static int omap4_clk_hsmmc_set_source(device_t dev, struct omap_clock_dev *clkdev, clk_src_t clksrc); -static int omap4_clk_hsmmc_get_source_freq(device_t dev, struct omap_clock_dev *clkdev, unsigned int *freq); - -static int omap4_clk_hsusbhost_set_source(device_t dev, struct omap_clock_dev *clkdev, clk_src_t clksrc); -static int omap4_clk_hsusbhost_activate(device_t dev, struct omap_clock_dev *clkdev); -static int omap4_clk_hsusbhost_deactivate(device_t dev, struct omap_clock_dev *clkdev); -static int omap4_clk_hsusbhost_accessible(device_t dev, struct omap_clock_dev *clkdev); +static struct omap4_prcm_softc *omap4_prcm_sc; -static int omap4_clk_get_sysclk_freq(device_t dev, struct omap_clock_dev *clkdev, unsigned int *freq); -static int omap4_clk_get_arm_fclk_freq(device_t dev, struct omap_clock_dev *clkdev, unsigned int *freq); +static int omap4_clk_generic_activate(struct omap_clock_dev *clkdev); +static int omap4_clk_generic_deactivate(struct omap_clock_dev *clkdev); +static int omap4_clk_generic_accessible(struct omap_clock_dev *clkdev); +static int omap4_clk_generic_set_source(struct omap_clock_dev *clkdev, clk_src_t clksrc); +static int omap4_clk_generic_get_source_freq(struct omap_clock_dev *clkdev, unsigned int *freq); + +static int omap4_clk_gptimer_set_source(struct omap_clock_dev *clkdev, clk_src_t clksrc); +static int omap4_clk_gptimer_get_source_freq(struct omap_clock_dev *clkdev, unsigned int *freq); + +static int omap4_clk_hsmmc_set_source(struct omap_clock_dev *clkdev, clk_src_t clksrc); +static int omap4_clk_hsmmc_get_source_freq(struct omap_clock_dev *clkdev, unsigned int *freq); + +static int omap4_clk_hsusbhost_set_source(struct omap_clock_dev *clkdev, clk_src_t clksrc); +static int omap4_clk_hsusbhost_activate(struct omap_clock_dev *clkdev); +static int omap4_clk_hsusbhost_deactivate(struct omap_clock_dev *clkdev); +static int omap4_clk_hsusbhost_accessible(struct omap_clock_dev *clkdev); + +static int omap4_clk_get_sysclk_freq(struct omap_clock_dev *clkdev, unsigned int *freq); +static int omap4_clk_get_arm_fclk_freq(struct omap_clock_dev *clkdev, unsigned int *freq); /** * omap_clk_devmap - Array of clock devices available on OMAP4xxx devices @@ -321,20 +328,14 @@ struct omap_clock_dev omap_clk_devmap[] { INVALID_CLK_IDENT, NULL, NULL, NULL, NULL } }; - - - - - /** - * g_omap4_clk_details - Stores details for all the different clocks supported + * omap4_clk_details - Stores details for all the different clocks supported * * Whenever an operation on a clock is being performed (activated, deactivated, * etc) this array is looked up to find the correct register and bit(s) we * should be modifying. * */ - struct omap4_clk_details { clk_ident_t id; @@ -423,18 +424,12 @@ static struct omap4_clk_details g_omap4_ { INVALID_CLK_IDENT, 0, 0, 0, 0 }, }; - - - - - /** * MAX_MODULE_ENABLE_WAIT - the number of loops to wait for the module to come * alive. * */ #define MAX_MODULE_ENABLE_WAIT 1000 - /** * ARRAY_SIZE - Macro to return the number of elements in a static const array. @@ -442,7 +437,6 @@ static struct omap4_clk_details g_omap4_ */ #define ARRAY_SIZE(x) (sizeof(x)/sizeof(x[0])) - /** * omap4_clk_details - writes a 32-bit value to one of the timer registers * @timer: Timer device context @@ -465,9 +459,6 @@ omap4_clk_details(clk_ident_t id) return NULL; } - - - /** * omap4_clk_generic_activate - checks if a module is accessible @@ -484,21 +475,26 @@ omap4_clk_details(clk_ident_t id) * Returns 0 on success or a positive error code on failure. */ static int -omap4_clk_generic_activate(device_t dev, struct omap_clock_dev *clkdev) +omap4_clk_generic_activate(struct omap_clock_dev *clkdev) { - struct omap4_prcm_softc *sc = device_get_softc(dev); - struct omap4_clk_details* clk_details = omap4_clk_details(clkdev->id); - struct resource* clk_mem_res = sc->sc_mem_res[clk_details->mem_region]; + struct omap4_prcm_softc *sc = omap4_prcm_sc; + struct omap4_clk_details* clk_details; + struct resource* clk_mem_res; uint32_t clksel; unsigned int i; + if (sc == NULL) + return ENXIO; + + clk_details = omap4_clk_details(clkdev->id); + clk_mem_res = sc->sc_res[clk_details->mem_region]; + if (clk_details == NULL) return (ENXIO); + if (clk_mem_res == NULL) return (EINVAL); - - /* All the 'generic' clocks have a CLKCTRL register which is more or less * generic - the have at least two fielda called MODULEMODE and IDLEST. */ @@ -507,7 +503,6 @@ omap4_clk_generic_activate(device_t dev, clksel |= clk_details->enable_mode; bus_write_4(clk_mem_res, clk_details->clksel_reg, clksel); - /* Now poll on the IDLEST register to tell us if the module has come up. * TODO: We need to take into account the parent clocks. */ @@ -529,8 +524,6 @@ omap4_clk_generic_activate(device_t dev, return (0); } - - /** * omap4_clk_generic_deactivate - checks if a module is accessible * @module: identifier for the module to check, see omap3_prcm.h for a list @@ -546,19 +539,25 @@ omap4_clk_generic_activate(device_t dev, * Returns 0 on success or a positive error code on failure. */ static int -omap4_clk_generic_deactivate(device_t dev, struct omap_clock_dev *clkdev) +omap4_clk_generic_deactivate(struct omap_clock_dev *clkdev) { - struct omap4_prcm_softc *sc = device_get_softc(dev); - struct omap4_clk_details* clk_details = omap4_clk_details(clkdev->id); - struct resource* clk_mem_res = sc->sc_mem_res[clk_details->mem_region]; + struct omap4_prcm_softc *sc = omap4_prcm_sc; + struct omap4_clk_details* clk_details; + struct resource* clk_mem_res; uint32_t clksel; + if (sc == NULL) + return ENXIO; + + clk_details = omap4_clk_details(clkdev->id); + clk_mem_res = sc->sc_res[clk_details->mem_region]; + if (clk_details == NULL) return (ENXIO); + if (clk_mem_res == NULL) return (EINVAL); - /* All the 'generic' clocks have a CLKCTRL register which is more or less * generic - the have at least two fielda called MODULEMODE and IDLEST. */ @@ -570,7 +569,6 @@ omap4_clk_generic_deactivate(device_t de return (0); } - /** * omap4_clk_generic_set_source - checks if a module is accessible * @module: identifier for the module to check, see omap3_prcm.h for a list @@ -586,11 +584,10 @@ omap4_clk_generic_deactivate(device_t de * Returns 0 on success or a positive error code on failure. */ static int -omap4_clk_generic_set_source(device_t dev, struct omap_clock_dev *clkdev, +omap4_clk_generic_set_source(struct omap_clock_dev *clkdev, clk_src_t clksrc) { - return (0); } @@ -609,13 +606,19 @@ omap4_clk_generic_set_source(device_t de * Returns 0 on success or a negative error code on failure. */ static int -omap4_clk_generic_accessible(device_t dev, struct omap_clock_dev *clkdev) +omap4_clk_generic_accessible(struct omap_clock_dev *clkdev) { - struct omap4_prcm_softc *sc = device_get_softc(dev); - struct omap4_clk_details* clk_details = omap4_clk_details(clkdev->id); - struct resource* clk_mem_res = sc->sc_mem_res[clk_details->mem_region]; + struct omap4_prcm_softc *sc = omap4_prcm_sc; + struct omap4_clk_details* clk_details; + struct resource* clk_mem_res; uint32_t clksel; + if (sc == NULL) + return ENXIO; + + clk_details = omap4_clk_details(clkdev->id); + clk_mem_res = sc->sc_res[clk_details->mem_region]; + if (clk_details == NULL) return (ENXIO); if (clk_mem_res == NULL) @@ -630,7 +633,6 @@ omap4_clk_generic_accessible(device_t de return (1); } - /** * omap4_clk_generic_get_source_freq - checks if a module is accessible * @module: identifier for the module to check, see omap3_prcm.h for a list @@ -646,15 +648,11 @@ omap4_clk_generic_accessible(device_t de * Returns 0 on success or a negative error code on failure. */ static int -omap4_clk_generic_get_source_freq(device_t dev, struct omap_clock_dev *clkdev, +omap4_clk_generic_get_source_freq(struct omap_clock_dev *clkdev, unsigned int *freq ) { struct omap4_clk_details* clk_details = omap4_clk_details(clkdev->id); -#if 0 - uint32_t clksel; - unsigned int src_freq; -#endif if (clk_details == NULL) return (ENXIO); @@ -682,16 +680,18 @@ omap4_clk_generic_get_source_freq(device * Returns 0 on success or a negative error code on failure. */ static int -omap4_clk_gptimer_set_source(device_t dev, struct omap_clock_dev *clkdev, +omap4_clk_gptimer_set_source(struct omap_clock_dev *clkdev, clk_src_t clksrc) { - struct omap4_prcm_softc *sc = device_get_softc(dev); - struct omap4_clk_details* clk_details = omap4_clk_details(clkdev->id); - struct resource* clk_mem_res = sc->sc_mem_res[clk_details->mem_region]; -#if 0 - uint32_t clksel; - unsigned int src_freq; -#endif + struct omap4_prcm_softc *sc = omap4_prcm_sc; + struct omap4_clk_details* clk_details; + struct resource* clk_mem_res; + + if (sc == NULL) + return ENXIO; + + clk_details = omap4_clk_details(clkdev->id); + clk_mem_res = sc->sc_res[clk_details->mem_region]; if (clk_details == NULL) return (ENXIO); @@ -718,16 +718,22 @@ omap4_clk_gptimer_set_source(device_t de * Returns 0 on success or a negative error code on failure. */ static int -omap4_clk_gptimer_get_source_freq(device_t dev, struct omap_clock_dev *clkdev, +omap4_clk_gptimer_get_source_freq(struct omap_clock_dev *clkdev, unsigned int *freq ) { - struct omap4_prcm_softc *sc = device_get_softc(dev); - struct omap4_clk_details* clk_details = omap4_clk_details(clkdev->id); - struct resource* clk_mem_res = sc->sc_mem_res[clk_details->mem_region]; + struct omap4_prcm_softc *sc = omap4_prcm_sc; + struct omap4_clk_details* clk_details; + struct resource* clk_mem_res; uint32_t clksel; unsigned int src_freq; + if (sc == NULL) + return ENXIO; + + clk_details = omap4_clk_details(clkdev->id); + clk_mem_res = sc->sc_res[clk_details->mem_region]; + if (clk_details == NULL) return (ENXIO); if (clk_mem_res == NULL) @@ -738,7 +744,7 @@ omap4_clk_gptimer_get_source_freq(device if (clksel & (0x1UL << 24)) src_freq = FREQ_32KHZ; else - omap4_clk_get_sysclk_freq(dev, NULL, &src_freq); + omap4_clk_get_sysclk_freq(NULL, &src_freq); /* Return the frequency */ if (freq) @@ -747,8 +753,6 @@ omap4_clk_gptimer_get_source_freq(device return (0); } - - /** * omap4_clk_hsmmc_set_source - sets the source clock (freq) * @clkdev: pointer to the clockdev structure (id field will contain clock id) @@ -762,14 +766,20 @@ omap4_clk_gptimer_get_source_freq(device * Returns 0 on success or a negative error code on failure. */ static int -omap4_clk_hsmmc_set_source(device_t dev, struct omap_clock_dev *clkdev, +omap4_clk_hsmmc_set_source(struct omap_clock_dev *clkdev, clk_src_t clksrc) { - struct omap4_prcm_softc *sc = device_get_softc(dev); - struct omap4_clk_details* clk_details = omap4_clk_details(clkdev->id); - struct resource* clk_mem_res = sc->sc_mem_res[clk_details->mem_region]; + struct omap4_prcm_softc *sc = omap4_prcm_sc; + struct omap4_clk_details* clk_details; + struct resource* clk_mem_res; uint32_t clksel; + if (sc == NULL) + return ENXIO; + + clk_details = omap4_clk_details(clkdev->id); + clk_mem_res = sc->sc_res[clk_details->mem_region]; + if (clk_details == NULL) return (ENXIO); if (clk_mem_res == NULL) @@ -812,16 +822,22 @@ omap4_clk_hsmmc_set_source(device_t dev, * Returns 0 on success or a negative error code on failure. */ static int -omap4_clk_hsmmc_get_source_freq(device_t dev, struct omap_clock_dev *clkdev, +omap4_clk_hsmmc_get_source_freq(struct omap_clock_dev *clkdev, unsigned int *freq ) { - struct omap4_prcm_softc *sc = device_get_softc(dev); - struct omap4_clk_details* clk_details = omap4_clk_details(clkdev->id); - struct resource* clk_mem_res = sc->sc_mem_res[clk_details->mem_region]; + struct omap4_prcm_softc *sc = omap4_prcm_sc; + struct omap4_clk_details* clk_details; + struct resource* clk_mem_res; uint32_t clksel; unsigned int src_freq; + if (sc == NULL) + return ENXIO; + + clk_details = omap4_clk_details(clkdev->id); + clk_mem_res = sc->sc_res[clk_details->mem_region]; + if (clk_details == NULL) return (ENXIO); if (clk_mem_res == NULL) @@ -853,8 +869,6 @@ omap4_clk_hsmmc_get_source_freq(device_t return (0); } - - /** * omap4_clk_get_sysclk_freq - gets the sysclk frequency * @sc: pointer to the clk module/device context @@ -866,15 +880,18 @@ omap4_clk_hsmmc_get_source_freq(device_t * nothing, values are saved in global variables */ static int -omap4_clk_get_sysclk_freq(device_t dev, struct omap_clock_dev *clkdev, +omap4_clk_get_sysclk_freq(struct omap_clock_dev *clkdev, unsigned int *freq) { uint32_t clksel; uint32_t sysclk; - struct omap4_prcm_softc *sc = device_get_softc(dev); + struct omap4_prcm_softc *sc = omap4_prcm_sc; + if (sc == NULL) + return ENXIO; + /* Read the input clock freq from the configuration register (CM_SYS_CLKSEL) */ - clksel = bus_read_4(sc->sc_mem_res[PRM_INSTANCE_MEM_REGION], CM_SYS_CLKSEL_OFFSET); + clksel = bus_read_4(sc->sc_res[PRM_INSTANCE_MEM_REGION], CM_SYS_CLKSEL_OFFSET); switch (clksel & 0x7) { case 0x1: /* 12Mhz */ @@ -907,7 +924,6 @@ omap4_clk_get_sysclk_freq(device_t dev, return (0); } - /** * omap4_clk_get_arm_fclk_freq - gets the MPU clock frequency * @clkdev: ignored @@ -921,25 +937,28 @@ omap4_clk_get_sysclk_freq(device_t dev, * returns 0 on success, a positive error code on failure. */ static int -omap4_clk_get_arm_fclk_freq(device_t dev, struct omap_clock_dev *clkdev, +omap4_clk_get_arm_fclk_freq(struct omap_clock_dev *clkdev, unsigned int *freq) { uint32_t clksel; uint32_t pll_mult, pll_div; uint32_t mpuclk, sysclk; - struct omap4_prcm_softc *sc = device_get_softc(dev); + struct omap4_prcm_softc *sc = omap4_prcm_sc; + + if (sc == NULL) + return ENXIO; /* Read the clksel register which contains the DPLL multiple and divide * values. These are applied to the sysclk. */ - clksel = bus_read_4(sc->sc_mem_res[CM1_INSTANCE_MEM_REGION], CM_CLKSEL_DPLL_MPU); + clksel = bus_read_4(sc->sc_res[CM1_INSTANCE_MEM_REGION], CM_CLKSEL_DPLL_MPU); pll_mult = ((clksel >> 8) & 0x7ff); pll_div = (clksel & 0x7f) + 1; /* Get the system clock freq */ - omap4_clk_get_sysclk_freq(dev, NULL, &sysclk); + omap4_clk_get_sysclk_freq(NULL, &sysclk); /* Calculate the MPU freq */ @@ -952,8 +971,6 @@ omap4_clk_get_arm_fclk_freq(device_t dev return (0); } - - /** * omap4_clk_hsusbhost_activate - activates the USB clocks for the given module * @clkdev: pointer to the clock device structure. @@ -1003,82 +1020,17 @@ struct dpll_param usb_dpll_param[7] = { #endif }; static int -omap4_clk_hsusbhost_activate(device_t dev, struct omap_clock_dev *clkdev) +omap4_clk_hsusbhost_activate(struct omap_clock_dev *clkdev) { - struct omap4_prcm_softc *sc = device_get_softc(dev); + struct omap4_prcm_softc *sc = omap4_prcm_sc; struct resource* clk_mem_res; uint32_t clksel_reg_off; uint32_t clksel; unsigned int i; -#if 0 - struct dpll_param *dpll_param; - - - clk_mem_res = sc->sc_mem_res[CM2_INSTANCE_MEM_REGION]; - clksel_reg_off = 0x104; - clksel = bus_read_4(clk_mem_res, clksel_reg_off); - clksel &= ~CLKCTRL_MODULEMODE_MASK; - clksel = 1; - bus_write_4(clk_mem_res, clksel_reg_off, clksel); - clk_mem_res = sc->sc_mem_res[CM2_INSTANCE_MEM_REGION]; - clksel_reg_off = 0x180; - clksel = bus_read_4(clk_mem_res, clksel_reg_off); - clksel &= ~0x7; - clksel |= 4; - bus_write_4(clk_mem_res, clksel_reg_off, clksel); - clksel_reg_off = 0x184; - while (bus_read_4(clk_mem_res, clksel_reg_off) & 1) { - printf("GOT %x\n", bus_read_4(clk_mem_res, clksel_reg_off)); - } - - clksel_reg_off = 0x188; - clksel = bus_read_4(clk_mem_res, clksel_reg_off); - clksel &= ~0x7; - bus_write_4(clk_mem_res, clksel_reg_off, clksel); + if (sc == NULL) + return ENXIO; - i = *(unsigned int *)(OMAP44XX_L4_CORE_VBASE + 0x306110); - printf("got %d\n", i); - dpll_param = &usb_dpll_param[i - 1]; - clksel_reg_off = 0x18c; - clksel = bus_read_4(clk_mem_res, clksel_reg_off); - clksel = (dpll_param->m << 8) | (dpll_param->n); - bus_write_4(clk_mem_res, clksel_reg_off, clksel); - clksel_reg_off = 0x190; - clksel = bus_read_4(clk_mem_res, clksel_reg_off); - clksel = 0x100 | (dpll_param->m2) | (1 << 8); - bus_write_4(clk_mem_res, clksel_reg_off, clksel); - - clk_mem_res = sc->sc_mem_res[CM2_INSTANCE_MEM_REGION]; - clksel_reg_off = 0x1b4; - clksel = bus_read_4(clk_mem_res, clksel_reg_off); - clksel |= (1 << 8); - bus_write_4(clk_mem_res, clksel_reg_off, clksel); - clksel_reg_off = 0x180; - clksel = bus_read_4(clk_mem_res, clksel_reg_off); - clksel &= ~0x7; - clksel |= 7; - bus_write_4(clk_mem_res, clksel_reg_off, clksel); - printf("YEAH YEAH\n"); - clksel_reg_off = 0x184; - while (!(bus_read_4(clk_mem_res, clksel_reg_off) & 1)) { - printf("pouic pouic %x\n", bus_read_4(clk_mem_res, clksel_reg_off) & 1); - } - - clksel_reg_off = 0x1b4; - clksel = 0x100; - bus_write_4(clk_mem_res, clksel_reg_off, clksel); -#if 0 - bus_write_4(clk_mem_res, L3INIT_CM2_OFFSET + 0x38, 1); - bus_write_4(clk_mem_res, L3INIT_CM2_OFFSET + 0x40, 2); - bus_write_4(clk_mem_res, L3INIT_CM2_OFFSET + 0x58, 2); - bus_write_4(clk_mem_res, L3INIT_CM2_OFFSET + 0x60, 1); - bus_write_4(clk_mem_res, L3INIT_CM2_OFFSET + 0x68, 1); - bus_write_4(clk_mem_res, L3INIT_CM2_OFFSET + 0xd0, 2); - bus_write_4(clk_mem_res, L3INIT_CM2_OFFSET + 0xe0, 0x301); -#endif -#endif - switch (clkdev->id) { case USBTLL_CLK: /* For the USBTLL module we need to enable the following clocks: @@ -1088,7 +1040,7 @@ omap4_clk_hsusbhost_activate(device_t de */ /* We need the CM_L3INIT_HSUSBTLL_CLKCTRL register in CM2 register set */ - clk_mem_res = sc->sc_mem_res[CM2_INSTANCE_MEM_REGION]; + clk_mem_res = sc->sc_res[CM2_INSTANCE_MEM_REGION]; clksel_reg_off = L3INIT_CM2_OFFSET + 0x68; /* Enable the module and also enable the optional func clocks for @@ -1123,7 +1075,7 @@ omap4_clk_hsusbhost_activate(device_t de */ /* We need the CM_L3INIT_HSUSBHOST_CLKCTRL register in CM2 register set */ - clk_mem_res = sc->sc_mem_res[CM2_INSTANCE_MEM_REGION]; + clk_mem_res = sc->sc_res[CM2_INSTANCE_MEM_REGION]; clksel_reg_off = L3INIT_CM2_OFFSET + 0x58; clksel = bus_read_4(clk_mem_res, clksel_reg_off); /* Enable the module and also enable the optional func clocks */ @@ -1152,7 +1104,6 @@ omap4_clk_hsusbhost_activate(device_t de bus_write_4(clk_mem_res, clksel_reg_off, clksel); - /* Try MAX_MODULE_ENABLE_WAIT number of times to check if enabled */ for (i = 0; i < MAX_MODULE_ENABLE_WAIT; i++) { clksel = bus_read_4(clk_mem_res, clksel_reg_off); @@ -1166,13 +1117,10 @@ omap4_clk_hsusbhost_activate(device_t de printf("Error: 0x%08x => 0x%08x\n", clksel_reg_off, clksel); return (ETIMEDOUT); } - return (0); } - - /** * omap4_clk_generic_deactivate - checks if a module is accessible * @clkdev: pointer to the clock device structure. @@ -1187,17 +1135,20 @@ omap4_clk_hsusbhost_activate(device_t de * Returns 0 on success or a positive error code on failure. */ static int -omap4_clk_hsusbhost_deactivate(device_t dev, struct omap_clock_dev *clkdev) +omap4_clk_hsusbhost_deactivate(struct omap_clock_dev *clkdev) { - struct omap4_prcm_softc *sc = device_get_softc(dev); + struct omap4_prcm_softc *sc = omap4_prcm_sc; struct resource* clk_mem_res; uint32_t clksel_reg_off; uint32_t clksel; + if (sc == NULL) + return ENXIO; + switch (clkdev->id) { case USBTLL_CLK: /* We need the CM_L3INIT_HSUSBTLL_CLKCTRL register in CM2 register set */ - clk_mem_res = sc->sc_mem_res[CM2_INSTANCE_MEM_REGION]; + clk_mem_res = sc->sc_res[CM2_INSTANCE_MEM_REGION]; clksel_reg_off = L3INIT_CM2_OFFSET + 0x68; clksel = bus_read_4(clk_mem_res, clksel_reg_off); @@ -1226,7 +1177,7 @@ omap4_clk_hsusbhost_deactivate(device_t */ /* We need the CM_L3INIT_HSUSBHOST_CLKCTRL register in CM2 register set */ - clk_mem_res = sc->sc_mem_res[CM2_INSTANCE_MEM_REGION]; + clk_mem_res = sc->sc_res[CM2_INSTANCE_MEM_REGION]; clksel_reg_off = L3INIT_CM2_OFFSET + 0x58; clksel = bus_read_4(clk_mem_res, clksel_reg_off); @@ -1259,7 +1210,6 @@ omap4_clk_hsusbhost_deactivate(device_t return (0); } - /** * omap4_clk_hsusbhost_accessible - checks if a module is accessible * @clkdev: pointer to the clock device structure. @@ -1275,21 +1225,24 @@ omap4_clk_hsusbhost_deactivate(device_t * error code on failure. */ static int -omap4_clk_hsusbhost_accessible(device_t dev, struct omap_clock_dev *clkdev) +omap4_clk_hsusbhost_accessible(struct omap_clock_dev *clkdev) { - struct omap4_prcm_softc *sc = device_get_softc(dev); + struct omap4_prcm_softc *sc = omap4_prcm_sc; struct resource* clk_mem_res; uint32_t clksel_reg_off; uint32_t clksel; + if (sc == NULL) + return ENXIO; + if (clkdev->id == USBTLL_CLK) { /* We need the CM_L3INIT_HSUSBTLL_CLKCTRL register in CM2 register set */ - clk_mem_res = sc->sc_mem_res[CM2_INSTANCE_MEM_REGION]; + clk_mem_res = sc->sc_res[CM2_INSTANCE_MEM_REGION]; clksel_reg_off = L3INIT_CM2_OFFSET + 0x68; } else if (clkdev->id == USBHSHOST_CLK) { /* We need the CM_L3INIT_HSUSBHOST_CLKCTRL register in CM2 register set */ - clk_mem_res = sc->sc_mem_res[CM2_INSTANCE_MEM_REGION]; + clk_mem_res = sc->sc_res[CM2_INSTANCE_MEM_REGION]; clksel_reg_off = L3INIT_CM2_OFFSET + 0x58; } else { @@ -1320,15 +1273,18 @@ omap4_clk_hsusbhost_accessible(device_t * Returns 0 if sucessful otherwise a negative error code on failure. */ static int -omap4_clk_hsusbhost_set_source(device_t dev, struct omap_clock_dev *clkdev, +omap4_clk_hsusbhost_set_source(struct omap_clock_dev *clkdev, clk_src_t clksrc) { - struct omap4_prcm_softc *sc = device_get_softc(dev); + struct omap4_prcm_softc *sc = omap4_prcm_sc; struct resource* clk_mem_res; uint32_t clksel_reg_off; uint32_t clksel; unsigned int bit; + if (sc == NULL) + return ENXIO; + if (clkdev->id == USBP1_PHY_CLK) bit = 24; else if (clkdev->id != USBP2_PHY_CLK) @@ -1337,7 +1293,7 @@ omap4_clk_hsusbhost_set_source(device_t return (-EINVAL); /* We need the CM_L3INIT_HSUSBHOST_CLKCTRL register in CM2 register set */ - clk_mem_res = sc->sc_mem_res[CM2_INSTANCE_MEM_REGION]; + clk_mem_res = sc->sc_res[CM2_INSTANCE_MEM_REGION]; clksel_reg_off = L3INIT_CM2_OFFSET + 0x58; clksel = bus_read_4(clk_mem_res, clksel_reg_off); @@ -1356,19 +1312,12 @@ omap4_clk_hsusbhost_set_source(device_t #define PRM_RSTCTRL_RESET 0x2 static void -omap4_prcm_reset(device_t dev) +omap4_prcm_reset(void) { - struct omap4_prcm_softc *sc = device_get_softc(dev); - bus_write_4(sc->sc_mem_res[0], PRM_RSTCTRL, - bus_read_4(sc->sc_mem_res[0], PRM_RSTCTRL) | PRM_RSTCTRL_RESET); - bus_read_4(sc->sc_mem_res[0], PRM_RSTCTRL); -} - -static void -omap4_prcm_identify(driver_t *driver, device_t parent) -{ - - BUS_ADD_CHILD(parent, 0, "omap4_prcm", 0); + struct omap4_prcm_softc *sc = omap4_prcm_sc; + bus_write_4(sc->sc_res[0], PRM_RSTCTRL, + bus_read_4(sc->sc_res[0], PRM_RSTCTRL) | PRM_RSTCTRL_RESET); + bus_read_4(sc->sc_res[0], PRM_RSTCTRL); } /** @@ -1386,10 +1335,10 @@ omap4_prcm_identify(driver_t *driver, de static int omap4_prcm_probe(device_t dev) { + if (!ofw_bus_is_compatible(dev, "ti,omap4_prcm")) + return (ENXIO); + device_set_desc(dev, "TI OMAP Power, Reset and Clock Management"); - bus_set_resource(dev, SYS_RES_MEMORY, 0, 0x4A306000, 0x2000); - bus_set_resource(dev, SYS_RES_MEMORY, 1, 0x4A004000, 0x1000); - bus_set_resource(dev, SYS_RES_MEMORY, 2, 0x4A008000, 0x2000); return (0); } @@ -1410,57 +1359,21 @@ static int omap4_prcm_attach(device_t dev) { struct omap4_prcm_softc *sc = device_get_softc(dev); - int rid; - rid = 0; - /* Attempt to get the memory resource(s) */ - sc->sc_mem_res[PRM_INSTANCE_MEM_REGION] = - bus_alloc_resource(dev, SYS_RES_MEMORY, &rid, - 0x4A306000, - 0x4A306000 + 0x2000, - 0x2000, RF_ACTIVE); - - if (sc->sc_mem_res[PRM_INSTANCE_MEM_REGION] == NULL) { - device_printf(dev, "failed to allocate resource for PRM region\n"); + if (bus_alloc_resources(dev, omap_scm_res_spec, sc->sc_res)) { + device_printf(dev, "could not allocate resources\n"); return (ENXIO); } - rid = 1; - sc->sc_mem_res[CM1_INSTANCE_MEM_REGION] = - bus_alloc_resource(dev, SYS_RES_MEMORY, &rid, - 0x4A004000, - 0x4A004000 + 0x1000, - 0x1000, RF_ACTIVE); + omap4_prcm_sc = sc; + ti_cpu_reset = omap4_prcm_reset; - if (sc->sc_mem_res[CM1_INSTANCE_MEM_REGION] == NULL) { - device_printf(dev, "failed to allocate resource for CM1 region\n"); - return (ENXIO); - } - - rid = 2; - sc->sc_mem_res[CM2_INSTANCE_MEM_REGION] = - bus_alloc_resource(dev, SYS_RES_MEMORY, &rid, - 0x4A008000, - 0x4A008000 + 0x8000, - 0x8000, RF_ACTIVE); - - if (sc->sc_mem_res[CM2_INSTANCE_MEM_REGION] == NULL) { - device_printf(dev, "failed to allocate resource for CM2 region\n"); - return (ENXIO); - } - - /* Initialize top-level OMAP PRCM API */ - omap_prcm_init(dev); - return (0); } static device_method_t omap4_prcm_methods[] = { - DEVMETHOD(device_identify, omap4_prcm_identify), DEVMETHOD(device_probe, omap4_prcm_probe), DEVMETHOD(device_attach, omap4_prcm_attach), - - DEVMETHOD(omap_prcm_reset, omap4_prcm_reset), {0, 0}, }; @@ -1472,5 +1385,5 @@ static driver_t omap4_prcm_driver = { static devclass_t omap4_prcm_devclass; -DRIVER_MODULE(omap4_prcm, omap, omap4_prcm_driver, omap4_prcm_devclass, 0, 0); +DRIVER_MODULE(omap4_prcm, simplebus, omap4_prcm_driver, omap4_prcm_devclass, 0, 0); MODULE_VERSION(omap4_prcm, 1); Modified: projects/armv6/sys/arm/ti/omap_prcm.c ============================================================================== --- projects/armv6/sys/arm/ti/omap_prcm.c Wed Feb 8 06:21:42 2012 (r231183) +++ projects/armv6/sys/arm/ti/omap_prcm.c Wed Feb 8 06:22:43 2012 (r231184) @@ -60,28 +60,6 @@ __FBSDID("$FreeBSD$"); #include <arm/ti/omap_prcm.h> -#include "omap_if.h" - -static device_t prcm_dev; -static struct mtx prcm_mtx; - -/** - * Structure that stores the driver context. - * - * This structure is allocated during driver attach, it is not designed to be - * deallocated and a pointer to it is stored globally (g_omap3_prcm_softc). - */ -struct omap_prcm_softc { - device_t sc_dev; - - /* - * The memory resource(s) for the PRCM register set, when the device is - * created the caller can assign up to 4 memory regions. - */ - struct resource* sc_mem_res[4]; -}; - - /** * omap_clk_devmap - Array of clock devices, should be defined one per SoC * @@ -91,25 +69,6 @@ struct omap_prcm_softc { */ extern struct omap_clock_dev omap_clk_devmap[]; - - -/** - * Macros for driver mutex locking - */ -#define OMAP_PRCM_LOCK mtx_lock(&prcm_mtx) -#define OMAP_PRCM_UNLOCK mtx_unlock(&prcm_mtx) -#define OMAP_PRCM_LOCK_DESTROY mtx_destroy(&prcm_mtx) -#define OMAP_PRCM_ASSERT_LOCKED mtx_assert(&prcm_mtx, MA_OWNED) -#define OMAP_PRCM_ASSERT_UNLOCKED mtx_assert(&prcm_mtx, MA_NOTOWNED) - -void -omap_prcm_init(device_t dev) -{ - prcm_dev = dev; - - mtx_init(&prcm_mtx, device_get_nameunit(dev), "omap_prcm", MTX_DEF); -} - /** * omap_prcm_clk_dev - returns a pointer to the clock device with given id * @clk: the ID of the clock device to get @@ -141,7 +100,7 @@ omap_prcm_clk_dev(clk_ident_t clk) } /* Sanity check we managed to find the clock */ - device_printf(prcm_dev, "Error: Failed to find clock device (%d)\n", clk); + printf("omap_prcm: Failed to find clock device (%d)\n", clk); return (NULL); } @@ -168,19 +127,9 @@ omap_prcm_clk_valid(clk_ident_t clk) { int ret = 0; - /* Sanity check */ - if (prcm_dev == NULL) { - device_printf(prcm_dev, "Error: PRCM module not setup (%s)\n", __func__); - return (EINVAL); - } - - OMAP_PRCM_LOCK; - if (omap_prcm_clk_dev(clk) == NULL) ret = EINVAL; - OMAP_PRCM_UNLOCK; - return (ret); } @@ -209,14 +158,6 @@ omap_prcm_clk_enable(clk_ident_t clk) struct omap_clock_dev *clk_dev; int ret; - /* Sanity check */ - if (prcm_dev == NULL) { - device_printf(prcm_dev, "Error: PRCM module not setup (%s)\n", __func__); - return (EINVAL); - } - - OMAP_PRCM_LOCK; - /* Find the clock within the devmap - it's a bit inefficent having a for * loop for this, but this function should only called when a driver is * being activated so IMHO not a big issue. @@ -224,20 +165,15 @@ omap_prcm_clk_enable(clk_ident_t clk) clk_dev = omap_prcm_clk_dev(clk); /* Sanity check we managed to find the clock */ - if (clk_dev == NULL) { - OMAP_PRCM_UNLOCK; + if (clk_dev == NULL) return (EINVAL); - } /* Activate the clock */ if (clk_dev->clk_activate) - ret = clk_dev->clk_activate(prcm_dev, clk_dev); + ret = clk_dev->clk_activate(clk_dev); else ret = EINVAL; - - OMAP_PRCM_UNLOCK; - return (ret); } @@ -266,14 +202,6 @@ omap_prcm_clk_disable(clk_ident_t clk) struct omap_clock_dev *clk_dev; int ret; *** DIFF OUTPUT TRUNCATED AT 1000 LINES ***
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201202080622.q186Mhck025892>