From owner-svn-src-head@FreeBSD.ORG Mon Jul 2 23:49:29 2012 Return-Path: Delivered-To: svn-src-head@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id 96848106566B; Mon, 2 Jul 2012 23:49:29 +0000 (UTC) (envelope-from marcel@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 82FB58FC14; Mon, 2 Jul 2012 23:49:29 +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 q62NnTTO007082; Mon, 2 Jul 2012 23:49:29 GMT (envelope-from marcel@svn.freebsd.org) Received: (from marcel@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id q62NnTAH007080; Mon, 2 Jul 2012 23:49:29 GMT (envelope-from marcel@svn.freebsd.org) Message-Id: <201207022349.q62NnTAH007080@svn.freebsd.org> From: Marcel Moolenaar Date: Mon, 2 Jul 2012 23:49:29 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org X-SVN-Group: head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r238043 - head/sys/dev/fdt X-BeenThere: svn-src-head@freebsd.org X-Mailman-Version: 2.1.5 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: Mon, 02 Jul 2012 23:49:29 -0000 Author: marcel Date: Mon Jul 2 23:49:29 2012 New Revision: 238043 URL: http://svn.freebsd.org/changeset/base/238043 Log: Properly implement bus_setup_intr so that it handles the configuration of interrupts of direct children. Have the bus_config_intr and bus_teardown_intr methods implemented by bus_generic_config_intr and bus_generic_teardown_intr (resp) as we don't need to do anything special outselves. This removes all the ``#ifdef $arch'' code that was there because powerpc didn't have a proper nexus and people tend to copy and paste stuff. Modified: head/sys/dev/fdt/fdtbus.c Modified: head/sys/dev/fdt/fdtbus.c ============================================================================== --- head/sys/dev/fdt/fdtbus.c Mon Jul 2 23:41:56 2012 (r238042) +++ head/sys/dev/fdt/fdtbus.c Mon Jul 2 23:49:29 2012 (r238043) @@ -89,8 +89,6 @@ static int fdtbus_deactivate_resource(de struct resource *); static int fdtbus_setup_intr(device_t, device_t, struct resource *, int, driver_filter_t *, driver_intr_t *, void *, void **); -static int fdtbus_teardown_intr(device_t, device_t, struct resource *, - void *); static const char *fdtbus_ofw_get_name(device_t, device_t); static phandle_t fdtbus_ofw_get_node(device_t, device_t); @@ -121,8 +119,9 @@ static device_method_t fdtbus_methods[] DEVMETHOD(bus_release_resource, fdtbus_release_resource), DEVMETHOD(bus_activate_resource, fdtbus_activate_resource), DEVMETHOD(bus_deactivate_resource, fdtbus_deactivate_resource), + DEVMETHOD(bus_config_intr, bus_generic_config_intr), DEVMETHOD(bus_setup_intr, fdtbus_setup_intr), - DEVMETHOD(bus_teardown_intr, fdtbus_teardown_intr), + DEVMETHOD(bus_teardown_intr, bus_generic_teardown_intr), /* OFW bus interface */ DEVMETHOD(ofw_bus_get_node, fdtbus_ofw_get_node), @@ -575,30 +574,41 @@ fdtbus_setup_intr(device_t bus, device_t int flags, driver_filter_t *filter, driver_intr_t *ihand, void *arg, void **cookiep) { - int err; + struct fdtbus_devinfo *di; + enum intr_trigger trig; + enum intr_polarity pol; + int error, rid; + + if (res == NULL) + return (EINVAL); - *cookiep = 0; - if ((rman_get_flags(res) & RF_SHAREABLE) == 0) - flags |= INTR_EXCL; - - err = rman_activate_resource(res); - if (err) - return (err); - -#if defined(__powerpc__) - err = powerpc_setup_intr(device_get_nameunit(child), - rman_get_start(res), filter, ihand, arg, flags, cookiep); -#elif defined(__mips__) - cpu_establish_hardintr(device_get_nameunit(child), - filter, ihand, arg, rman_get_start(res), flags, cookiep); -#elif defined(__arm__) - arm_setup_irqhandler(device_get_nameunit(child), - filter, ihand, arg, rman_get_start(res), flags, cookiep); - arm_unmask_irq(rman_get_start(res)); - err = 0; -#endif + /* + * We are responsible for configuring the interrupts of our direct + * children. + */ + if (device_get_parent(child) == bus) { + di = device_get_ivars(child); + if (di == NULL) + return (ENXIO); + + rid = rman_get_rid(res); + if (rid >= DI_MAX_INTR_NUM) + return (ENOENT); + + trig = di->di_intr_sl[rid].trig; + pol = di->di_intr_sl[rid].pol; + if (trig != INTR_TRIGGER_CONFORM || + pol != INTR_POLARITY_CONFORM) { + error = bus_generic_config_intr(bus, + rman_get_start(res), trig, pol); + if (error) + return (error); + } + } - return (err); + error = bus_generic_setup_intr(bus, child, res, flags, filter, ihand, + arg, cookiep); + return (error); } static int @@ -617,21 +627,6 @@ fdtbus_deactivate_resource(device_t bus, return (rman_deactivate_resource(res)); } -static int -fdtbus_teardown_intr(device_t bus, device_t child, struct resource *res, - void *cookie) -{ - -#if defined(__powerpc__) - return (powerpc_teardown_intr(cookie)); -#elif defined(__mips__) - /* mips does not have a teardown yet */ - return (0); -#elif defined(__arm__) - return (arm_remove_irqhandler(rman_get_start(res), cookie)); -#endif -} - static const char * fdtbus_ofw_get_name(device_t bus, device_t dev) {