From owner-svn-src-head@freebsd.org Tue May 10 20:02:05 2016 Return-Path: Delivered-To: svn-src-head@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 6046AB36CBA; Tue, 10 May 2016 20:02:05 +0000 (UTC) (envelope-from gonzo@FreeBSD.org) Received: from repo.freebsd.org (repo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id 221E21F49; Tue, 10 May 2016 20:02:05 +0000 (UTC) (envelope-from gonzo@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id u4AK241o053842; Tue, 10 May 2016 20:02:04 GMT (envelope-from gonzo@FreeBSD.org) Received: (from gonzo@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id u4AK24uL053839; Tue, 10 May 2016 20:02:04 GMT (envelope-from gonzo@FreeBSD.org) Message-Id: <201605102002.u4AK24uL053839@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: gonzo set sender to gonzo@FreeBSD.org using -f From: Oleksandr Tymoshenko Date: Tue, 10 May 2016 20:02:04 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r299384 - in head/sys: arm/nvidia dev/gpio X-SVN-Group: head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-head@freebsd.org X-Mailman-Version: 2.1.22 Precedence: list List-Id: SVN commit messages for the src tree for head/-current List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 10 May 2016 20:02:05 -0000 Author: gonzo Date: Tue May 10 20:02:03 2016 New Revision: 299384 URL: https://svnweb.freebsd.org/changeset/base/299384 Log: Pass device tree node as a part of gpio_pin_get_by_ofw_XXX API Current API assumes that "gpios" property belongs to the device's node but for some binding it's not true: gpiokeys has set of child nodes with this property. Patch adds new argument instead of replacing device_t because device_t will be used to track ownership for allocated pins Reviewed by: mmel Differential Revision: https://reviews.freebsd.org/D6277 Modified: head/sys/arm/nvidia/tegra_sdhci.c head/sys/dev/gpio/gpiobusvar.h head/sys/dev/gpio/ofw_gpiobus.c Modified: head/sys/arm/nvidia/tegra_sdhci.c ============================================================================== --- head/sys/arm/nvidia/tegra_sdhci.c Tue May 10 19:11:25 2016 (r299383) +++ head/sys/arm/nvidia/tegra_sdhci.c Tue May 10 20:02:03 2016 (r299384) @@ -300,9 +300,9 @@ tegra_sdhci_attach(device_t dev) goto fail; } - gpio_pin_get_by_ofw_property(sc->dev, "cd-gpios", &sc->gpio_cd); - gpio_pin_get_by_ofw_property(sc->dev, "power-gpios", &sc->gpio_power); - gpio_pin_get_by_ofw_property(sc->dev, "wp-gpios", &sc->gpio_wp); + gpio_pin_get_by_ofw_property(sc->dev, node, "cd-gpios", &sc->gpio_cd); + gpio_pin_get_by_ofw_property(sc->dev, node, "power-gpios", &sc->gpio_power); + gpio_pin_get_by_ofw_property(sc->dev, node, "wp-gpios", &sc->gpio_wp); rv = clk_get_by_ofw_index(dev, 0, &sc->clk); if (rv != 0) { Modified: head/sys/dev/gpio/gpiobusvar.h ============================================================================== --- head/sys/dev/gpio/gpiobusvar.h Tue May 10 19:11:25 2016 (r299383) +++ head/sys/dev/gpio/gpiobusvar.h Tue May 10 20:02:03 2016 (r299384) @@ -116,10 +116,12 @@ void ofw_gpiobus_register_provider(devic void ofw_gpiobus_unregister_provider(device_t); /* Consumers interface. */ -int gpio_pin_get_by_ofw_name(device_t consumer, char *name, gpio_pin_t *gpio); -int gpio_pin_get_by_ofw_idx(device_t consumer, int idx, gpio_pin_t *gpio); -int gpio_pin_get_by_ofw_property(device_t consumer, char *name, - gpio_pin_t *gpio); +int gpio_pin_get_by_ofw_name(device_t consumer, phandle_t node, + char *name, gpio_pin_t *gpio); +int gpio_pin_get_by_ofw_idx(device_t consumer, phandle_t node, + int idx, gpio_pin_t *gpio); +int gpio_pin_get_by_ofw_property(device_t consumer, phandle_t node, + char *name, gpio_pin_t *gpio); void gpio_pin_release(gpio_pin_t gpio); int gpio_pin_is_active(gpio_pin_t pin, bool *active); int gpio_pin_set_active(gpio_pin_t pin, bool active); Modified: head/sys/dev/gpio/ofw_gpiobus.c ============================================================================== --- head/sys/dev/gpio/ofw_gpiobus.c Tue May 10 19:11:25 2016 (r299383) +++ head/sys/dev/gpio/ofw_gpiobus.c Tue May 10 20:02:03 2016 (r299384) @@ -56,21 +56,17 @@ static int ofw_gpiobus_parse_gpios_impl( * */ static int -gpio_pin_get_by_ofw_impl(device_t consumer_dev, char *prop_name, int idx, - gpio_pin_t *out_pin) +gpio_pin_get_by_ofw_impl(device_t consumer, phandle_t cnode, + char *prop_name, int idx, gpio_pin_t *out_pin) { - phandle_t cnode, xref; + phandle_t xref; pcell_t *cells; device_t busdev; struct gpiobus_pin pin; int ncells, rv; - cnode = ofw_bus_get_node(consumer_dev); - if (cnode <= 0) { - device_printf(consumer_dev, - "%s called on not ofw based device\n", __func__); - return (ENXIO); - } + KASSERT(consumer != NULL && cnode > 0, + ("both consumer and cnode required")); rv = ofw_bus_parse_xref_list_alloc(cnode, prop_name, "#gpio-cells", idx, &xref, &ncells, &cells); @@ -95,17 +91,13 @@ gpio_pin_get_by_ofw_impl(device_t consum rv = gpio_map_gpios(pin.dev, cnode, OF_node_from_xref(xref), ncells, cells, &pin.pin, &pin.flags); free(cells, M_OFWPROP); - if (rv != 0) { - device_printf(consumer_dev, "Cannot map the gpio property.\n"); + if (rv != 0) return (ENXIO); - } /* Reserve GPIO pin. */ rv = gpiobus_map_pin(busdev, pin.pin); - if (rv != 0) { - device_printf(consumer_dev, "Cannot reserve gpio pin.\n"); + if (rv != 0) return (EBUSY); - } *out_pin = malloc(sizeof(struct gpiobus_pin), M_DEVBUF, M_WAITOK | M_ZERO); @@ -114,35 +106,34 @@ gpio_pin_get_by_ofw_impl(device_t consum } int -gpio_pin_get_by_ofw_idx(device_t consumer_dev, int idx, gpio_pin_t *pin) +gpio_pin_get_by_ofw_idx(device_t consumer, phandle_t node, + int idx, gpio_pin_t *pin) { - return (gpio_pin_get_by_ofw_impl(consumer_dev, "gpios", idx, pin)); + return (gpio_pin_get_by_ofw_impl(consumer, node, "gpios", idx, pin)); } int -gpio_pin_get_by_ofw_property(device_t consumer_dev, char *name, gpio_pin_t *pin) +gpio_pin_get_by_ofw_property(device_t consumer, phandle_t node, + char *name, gpio_pin_t *pin) { - return (gpio_pin_get_by_ofw_impl(consumer_dev, name, 0, pin)); + return (gpio_pin_get_by_ofw_impl(consumer, node, name, 0, pin)); } int -gpio_pin_get_by_ofw_name(device_t consumer_dev, char *name, gpio_pin_t *pin) +gpio_pin_get_by_ofw_name(device_t consumer, phandle_t node, + char *name, gpio_pin_t *pin) { int rv, idx; - phandle_t cnode; - cnode = ofw_bus_get_node(consumer_dev); - if (cnode <= 0) { - device_printf(consumer_dev, - "%s called on not ofw based device\n", __func__); - return (ENXIO); - } - rv = ofw_bus_find_string_index(cnode, "gpio-names", name, &idx); + KASSERT(consumer != NULL && node > 0, + ("both consumer and node required")); + + rv = ofw_bus_find_string_index(node, "gpio-names", name, &idx); if (rv != 0) return (rv); - return (gpio_pin_get_by_ofw_idx(consumer_dev, idx, pin)); + return (gpio_pin_get_by_ofw_idx(consumer, node, idx, pin)); } void