From owner-svn-src-projects@FreeBSD.ORG Wed Feb 8 01:31:02 2012 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id EFE3210656D5; Wed, 8 Feb 2012 01:31:02 +0000 (UTC) (envelope-from gonzo@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id DDE098FC14; Wed, 8 Feb 2012 01:31:02 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id q181V25o016077; Wed, 8 Feb 2012 01:31:02 GMT (envelope-from gonzo@svn.freebsd.org) Received: (from gonzo@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id q181V2Zg016072; Wed, 8 Feb 2012 01:31:02 GMT (envelope-from gonzo@svn.freebsd.org) Message-Id: <201202080131.q181V2Zg016072@svn.freebsd.org> From: Oleksandr Tymoshenko Date: Wed, 8 Feb 2012 01:31:02 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r231173 - in projects/armv6/sys: arm/ti arm/ti/omap4 boot/fdt/dts X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 08 Feb 2012 01:31:03 -0000 Author: gonzo Date: Wed Feb 8 01:31:02 2012 New Revision: 231173 URL: http://svn.freebsd.org/changeset/base/231173 Log: Add FDT-enabled SCM module driver and respective node to dts Modified: projects/armv6/sys/arm/ti/omap4/files.omap44xx projects/armv6/sys/arm/ti/omap_scm.c projects/armv6/sys/arm/ti/omap_scm.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 00:36:36 2012 (r231172) +++ projects/armv6/sys/arm/ti/omap4/files.omap44xx Wed Feb 8 01:31:02 2012 (r231173) @@ -15,7 +15,7 @@ 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_scm.c standard +arm/ti/omap_scm.c standard # arm/ti/omap_if.m standard arm/ti/mp_timer.c standard arm/ti/gic.c standard @@ -27,6 +27,6 @@ arm/ti/bus_space.c 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_scm_padconf.c standard +arm/ti/omap4/omap4_scm_padconf.c standard dev/uart/uart_dev_ns8250.c optional uart Modified: projects/armv6/sys/arm/ti/omap_scm.c ============================================================================== --- projects/armv6/sys/arm/ti/omap_scm.c Wed Feb 8 00:36:36 2012 (r231172) +++ projects/armv6/sys/arm/ti/omap_scm.c Wed Feb 8 01:31:02 2012 (r231173) @@ -64,9 +64,26 @@ __FBSDID("$FreeBSD$"); #include #include +#include +#include +#include +#include + #include "omap_scm.h" #include "omap_if.h" +static struct resource_spec omap_scm_res_spec[] = { + { SYS_RES_MEMORY, 0, RF_ACTIVE }, /* Control memory window */ + { -1, 0 } +}; + +static struct omap_scm_softc *omap_scm_sc; + +#define omap_scm_read_2(sc, reg) \ + bus_space_read_2((sc)->sc_bst, (sc)->sc_bsh, (reg)) +#define omap_scm_write_2(sc, reg, val) \ + bus_space_write_2((sc)->sc_bst, (sc)->sc_bsh, (reg), (val)) + /** * omap_padconf_devmap - Array of pins, should be defined one per SoC * @@ -77,18 +94,6 @@ __FBSDID("$FreeBSD$"); extern const struct omap_scm_padconf omap_padconf_devmap[]; /** - * Macros for driver mutex locking - */ -#define OMAP_SCM_LOCK(_sc) mtx_lock(&(_sc)->sc_mtx) -#define OMAP_SCM_UNLOCK(_sc) mtx_unlock(&(_sc)->sc_mtx) -#define OMAP_SCM_LOCK_INIT(_sc) \ - mtx_init(&_sc->sc_mtx, device_get_nameunit(_sc->sc_dev), \ - "omap_scm", MTX_DEF) -#define OMAP_SCM_LOCK_DESTROY(_sc) mtx_destroy(&_sc->sc_mtx) -#define OMAP_SCM_ASSERT_LOCKED(_sc) mtx_assert(&_sc->sc_mtx, MA_OWNED) -#define OMAP_SCM_ASSERT_UNLOCKED(_sc) mtx_assert(&_sc->sc_mtx, MA_NOTOWNED) - -/** * omap_scm_padconf_from_name - searches the list of pads and returns entry * with matching ball name. * @ballname: the name of the ball @@ -126,7 +131,7 @@ omap_scm_padconf_from_name(const char *b * EINVAL if pin requested is outside valid range or already in use. */ static int -omap_scm_padconf_set_internal(device_t dev, +omap_scm_padconf_set_internal(struct omap_scm_softc *sc, const struct omap_scm_padconf *padconf, const char *muxmode, unsigned int state) { @@ -153,7 +158,7 @@ omap_scm_padconf_set_internal(device_t d printf("setting internal %x for %s\n", reg_val, muxmode); /* write the register value (16-bit writes) */ - OMAP_SCM_WRITES(dev, padconf->reg_off, reg_val); + omap_scm_write_2(sc, padconf->reg_off, reg_val); return (0); } @@ -173,17 +178,19 @@ omap_scm_padconf_set_internal(device_t d * EINVAL if pin requested is outside valid range or already in use. */ int -omap_scm_padconf_set(device_t dev, const char *padname, - const char *muxmode, unsigned int state) +omap_scm_padconf_set(const char *padname, const char *muxmode, unsigned int state) { const struct omap_scm_padconf *padconf; + if (!omap_scm_sc) + return (ENXIO); + /* find the pin in the devmap */ padconf = omap_scm_padconf_from_name(padname); if (padconf == NULL) return (EINVAL); - return (omap_scm_padconf_set_internal(dev, padconf, muxmode, state)); + return (omap_scm_padconf_set_internal(omap_scm_sc, padconf, muxmode, state)); } /** @@ -201,19 +208,22 @@ omap_scm_padconf_set(device_t dev, const * EINVAL if pin requested is outside valid range or already in use. */ int -omap_scm_padconf_get(device_t dev, const char *padname, const char **muxmode, +omap_scm_padconf_get(const char *padname, const char **muxmode, unsigned int *state) { const struct omap_scm_padconf *padconf; uint16_t reg_val; + if (!omap_scm_sc) + return (ENXIO); + /* find the pin in the devmap */ padconf = omap_scm_padconf_from_name(padname); if (padconf == NULL) return (EINVAL); /* read the register value (16-bit reads) */ - reg_val = OMAP_SCM_READS(dev, padconf->reg_off); + reg_val = omap_scm_read_2(omap_scm_sc, padconf->reg_off); /* save the state */ if (state) @@ -241,10 +251,13 @@ omap_scm_padconf_get(device_t dev, const * EINVAL if pin requested is outside valid range or already in use. */ int -omap_scm_padconf_set_gpiomode(device_t dev, uint32_t gpio, unsigned int state) +omap_scm_padconf_set_gpiomode(uint32_t gpio, unsigned int state) { const struct omap_scm_padconf *padconf; uint16_t reg_val; + + if (!omap_scm_sc) + return (ENXIO); /* find the gpio pin in the padconf array */ padconf = omap_padconf_devmap; @@ -263,7 +276,7 @@ omap_scm_padconf_set_gpiomode(device_t d reg_val |= (uint16_t)(padconf->gpio_mode & CONTROL_PADCONF_MUXMODE_MASK); /* write the register value (16-bit writes) */ - OMAP_SCM_WRITES(dev, padconf->reg_off, reg_val); + omap_scm_write_2(omap_scm_sc, padconf->reg_off, reg_val); return (0); } @@ -283,10 +296,13 @@ omap_scm_padconf_set_gpiomode(device_t d * EINVAL if pin requested is outside valid range or not configured as GPIO. */ int -omap_scm_padconf_get_gpiomode(device_t dev, uint32_t gpio, unsigned int *state) +omap_scm_padconf_get_gpiomode(uint32_t gpio, unsigned int *state) { const struct omap_scm_padconf *padconf; uint16_t reg_val; + + if (!omap_scm_sc) + return (ENXIO); /* find the gpio pin in the padconf array */ padconf = omap_padconf_devmap; @@ -299,7 +315,7 @@ omap_scm_padconf_get_gpiomode(device_t d return (EINVAL); /* read the current register settings */ - reg_val = OMAP_SCM_READS(dev, padconf->reg_off); + reg_val = omap_scm_read_2(omap_scm_sc, padconf->reg_off); /* check to make sure the pins is configured as GPIO in the first state */ if ((reg_val & CONTROL_PADCONF_MUXMODE_MASK) != padconf->gpio_mode) @@ -325,73 +341,140 @@ omap_scm_padconf_get_gpiomode(device_t d * 0 on success. * EINVAL if pin requested is outside valid range or already in use. */ -int -omap_scm_padconf_init_from_hints(device_t dev) +static int +omap_scm_padconf_init_from_fdt(struct omap_scm_softc *sc) { const struct omap_scm_padconf *padconf; int err; - char resname[64]; - const char *resval; - char muxname[64]; - char padstate[64]; - - /* Hint names should be of the form "padconf." */ - strcpy(resname, "padconf."); - - /* This is very inefficent ... basically we look up every possible pad name - * in the hints. Unfortunatly there doesn't seem to be any way to iterate - * over all the hints for a given device, so instead we have to manually - * probe for the existance of every possible pad. - */ - padconf = omap_padconf_devmap; - while (padconf->ballname != NULL) { - - strncpy(&resname[8], padconf->ballname, 50); - - err = resource_string_value(device_get_name(dev), - device_get_unit(dev), resname, &resval); - if ((err == 0) && (resval != NULL)) { - - /* Found a matching pad/ball name in the hints section, the hint - * should be of the following format: - * : - * i.e. - * usbb1_ulpiphy_stp:output - */ - - /* Read the mux name */ - if (sscanf(resval, "%64[^:]:%64s", muxname, padstate) != 2) { - device_printf(dev, "err: padconf hint for pin \"%s\"" - "is incorrectly formated, ignoring hint.\n", - padconf->ballname); - } - - /* Convert the padstate to a flag and write the values */ - else { + + phandle_t node; + int len; + char *fdt_pad_config; + int i; + char *padname, *muxname, *padstate; + + node = ofw_bus_get_node(sc->sc_dev); + len = OF_getproplen(node, "omap-pad-config"); + OF_getprop_alloc(node, "omap-pad-config", 1, (void **)&fdt_pad_config); + + i = len; + while (i > 0) { + padname = fdt_pad_config; + fdt_pad_config += strlen(padname) + 1; + i -= strlen(padname) + 1; + if (i <= 0) + break; + + muxname = fdt_pad_config; + fdt_pad_config += strlen(muxname) + 1; + i -= strlen(muxname) + 1; + if (i <= 0) + break; + + padstate = fdt_pad_config; + fdt_pad_config += strlen(padstate) + 1; + i -= strlen(padstate) + 1; + if (i < 0) + break; + + /* This is very inefficent ... basically we look up every possible pad name + * in the hints. Unfortunatly there doesn't seem to be any way to iterate + * over all the hints for a given device, so instead we have to manually + * probe for the existance of every possible pad. + */ + padconf = omap_padconf_devmap; + while (padconf->ballname != NULL) { + if (strcmp(padconf->ballname, padname) == 0) { if (strcmp(padstate, "output") == 0) - err = omap_scm_padconf_set_internal(dev, + err = omap_scm_padconf_set_internal(sc, padconf, muxname, PADCONF_PIN_OUTPUT); else if (strcmp(padstate, "input") == 0) - err = omap_scm_padconf_set_internal(dev, + err = omap_scm_padconf_set_internal(sc, padconf, muxname, PADCONF_PIN_INPUT); else if (strcmp(padstate, "input_pullup") == 0) - err = omap_scm_padconf_set_internal(dev, + err = omap_scm_padconf_set_internal(sc, padconf, muxname, PADCONF_PIN_INPUT_PULLUP); else if (strcmp(padstate, "input_pulldown") == 0) - err = omap_scm_padconf_set_internal(dev, + err = omap_scm_padconf_set_internal(sc, padconf, muxname, PADCONF_PIN_INPUT_PULLDOWN); else - device_printf(dev, "err: padconf hint for pin \"%s\"" - "has incorrectly formated state, ignoring hint.\n", - padconf->ballname); + device_printf(sc->sc_dev, "err: padconf hint for pin \"%s\"" + "has incorrectly formated state, ignoring hint.\n", + padconf->ballname); } + padconf++; } - - padconf++; } return (0); } + +/* + * Device part of OMAP SCM driver + */ + +static int +omap_scm_probe(device_t dev) +{ + if (!ofw_bus_is_compatible(dev, "ti,omap_scm")) + return (ENXIO); + + device_set_desc(dev, "TI OMAP Control Module"); + return (BUS_PROBE_DEFAULT); +} + +/** + * omap_scm_attach - attaches the timer to the simplebus + * @dev: new device + * + * Reserves memory and interrupt resources, stores the softc structure + * globally and registers both the timecount and eventtimer objects. + * + * RETURNS + * Zero on sucess or ENXIO if an error occuried. + */ +static int +omap_scm_attach(device_t dev) +{ + struct omap_scm_softc *sc = device_get_softc(dev); + + if (omap_scm_sc) + return (ENXIO); + + sc->sc_dev = dev; + + if (bus_alloc_resources(dev, omap_scm_res_spec, sc->sc_res)) { + device_printf(dev, "could not allocate resources\n"); + return (ENXIO); + } + + /* Global timer interface */ + sc->sc_bst = rman_get_bustag(sc->sc_res[0]); + sc->sc_bsh = rman_get_bushandle(sc->sc_res[0]); + + omap_scm_sc = sc; + + omap_scm_padconf_init_from_fdt(sc); + + return (0); +} + + +static device_method_t omap_scm_methods[] = { + DEVMETHOD(device_probe, omap_scm_probe), + DEVMETHOD(device_attach, omap_scm_attach), + { 0, 0 } +}; + +static driver_t omap_scm_driver = { + "omap_scm", + omap_scm_methods, + sizeof(struct omap_scm_softc), +}; + +static devclass_t omap_scm_devclass; + +DRIVER_MODULE(omap_scm, simplebus, omap_scm_driver, omap_scm_devclass, 0, 0); Modified: projects/armv6/sys/arm/ti/omap_scm.h ============================================================================== --- projects/armv6/sys/arm/ti/omap_scm.h Wed Feb 8 00:36:36 2012 (r231172) +++ projects/armv6/sys/arm/ti/omap_scm.h Wed Feb 8 01:31:02 2012 (r231173) @@ -95,14 +95,18 @@ struct omap_scm_padconf { const char *muxmodes[8]; }; -int omap_scm_padconf_set(device_t dev, const char *padname, - const char *muxmode, unsigned int state); -int omap_scm_padconf_get(device_t dev, const char *padname, - const char **muxmode, unsigned int *state); -int omap_scm_padconf_set_gpiomode(device_t dev, uint32_t gpio, - unsigned int state); -int omap_scm_padconf_get_gpiomode(device_t dev, uint32_t gpio, - unsigned int *state); -int omap_scm_padconf_init_from_hints(device_t dev); +struct omap_scm_softc { + device_t sc_dev; + struct resource * sc_res[4]; + bus_space_tag_t sc_bst; + bus_space_handle_t sc_bsh; +}; + +int omap_scm_padconf_set(const char *padname, const char *muxmode, + unsigned int state); +int omap_scm_padconf_get(const char *padname, const char **muxmode, + unsigned int *state); +int omap_scm_padconf_set_gpiomode(uint32_t gpio, unsigned int state); +int omap_scm_padconf_get_gpiomode(uint32_t gpio, unsigned int *state); #endif /* _OMAP_SCM_H_ */ Modified: projects/armv6/sys/boot/fdt/dts/pandaboard.dts ============================================================================== --- projects/armv6/sys/boot/fdt/dts/pandaboard.dts Wed Feb 8 00:36:36 2012 (r231172) +++ projects/armv6/sys/boot/fdt/dts/pandaboard.dts Wed Feb 8 01:31:02 2012 (r231173) @@ -73,7 +73,6 @@ interrupt-parent = < &GIC >; }; - uart3: serial@48020000 { compatible = "ns16550"; reg = <0x48020000 0x1000>; @@ -83,6 +82,25 @@ clock-frequency = < 48000000 >; /* 48Mhz clock for all uarts */ /* (techref 17.3.1.1) */ }; + + omap_scp@4a100000 { + compatible = "ti,omap_scm"; + reg = < 0x4a100000 0x1000 >; + /* Set of triplets < padname, muxname, padstate> */ + omap-pad-config = + "ag19", "usbb1_ulpiphy_stp", "output", + "ae18", "usbb1_ulpiphy_clk", "input_pulldown", + "af19", "usbb1_ulpiphy_dir", "input_pulldown", + "ae19", "usbb1_ulpiphy_nxt", "input_pulldown", + "af18", "usbb1_ulpiphy_dat0", "input_pulldown", + "ag18", "usbb1_ulpiphy_dat1", "input_pulldown", + "ae17", "usbb1_ulpiphy_dat2", "input_pulldown", + "af17", "usbb1_ulpiphy_dat3", "input_pulldown", + "ah17", "usbb1_ulpiphy_dat4", "input_pulldown", + "ae16", "usbb1_ulpiphy_dat5", "input_pulldown", + "af16", "usbb1_ulpiphy_dat6", "input_pulldown", + "ag16", "usbb1_ulpiphy_dat7", "input_pulldown"; + }; }; chosen {