From patchwork Fri Apr 1 10:00:29 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tomi Valkeinen X-Patchwork-Id: 680781 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by demeter1.kernel.org (8.14.4/8.14.3) with ESMTP id p31A0sCM021787 for ; Fri, 1 Apr 2011 10:00:54 GMT Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755388Ab1DAKAw (ORCPT ); Fri, 1 Apr 2011 06:00:52 -0400 Received: from na3sys009aog107.obsmtp.com ([74.125.149.197]:40157 "EHLO na3sys009aog107.obsmtp.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755468Ab1DAKAu (ORCPT ); Fri, 1 Apr 2011 06:00:50 -0400 Received: from source ([74.125.82.174]) (using TLSv1) by na3sys009aob107.postini.com ([74.125.148.12]) with SMTP ID DSNKTZWiUb+OeC9ipwqsj9HgFlm9eaA0jbRN@postini.com; Fri, 01 Apr 2011 03:00:50 PDT Received: by mail-wy0-f174.google.com with SMTP id 21so3609812wya.5 for ; Fri, 01 Apr 2011 03:00:49 -0700 (PDT) Received: by 10.227.61.16 with SMTP id r16mr3848554wbh.24.1301652048945; Fri, 01 Apr 2011 03:00:48 -0700 (PDT) Received: from deskari (a62-248-146-119.elisa-laajakaista.fi [62.248.146.119]) by mx.google.com with ESMTPS id e13sm1163582wbi.40.2011.04.01.03.00.47 (version=SSLv3 cipher=OTHER); Fri, 01 Apr 2011 03:00:48 -0700 (PDT) From: Tomi Valkeinen To: linux-omap@vger.kernel.org, linux-fbdev@vger.kernel.org Cc: Tomi Valkeinen Subject: [PATCH 4/5] OMAP: DSS2: Add omap_dss_register_driver_probe() Date: Fri, 1 Apr 2011 13:00:29 +0300 Message-Id: <1301652030-32223-5-git-send-email-tomi.valkeinen@ti.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1301652030-32223-1-git-send-email-tomi.valkeinen@ti.com> References: <1301652030-32223-1-git-send-email-tomi.valkeinen@ti.com> Sender: linux-fbdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-fbdev@vger.kernel.org X-Greylist: IP, sender and recipient auto-whitelisted, not delayed by milter-greylist-4.2.6 (demeter1.kernel.org [140.211.167.41]); Fri, 01 Apr 2011 10:00:54 +0000 (UTC) diff --git a/arch/arm/plat-omap/include/plat/display.h b/arch/arm/plat-omap/include/plat/display.h index e239a0d..226a78f 100644 --- a/arch/arm/plat-omap/include/plat/display.h +++ b/arch/arm/plat-omap/include/plat/display.h @@ -517,6 +517,8 @@ struct omap_dss_driver { }; int omap_dss_register_driver(struct omap_dss_driver *); +int omap_dss_register_driver_probe(struct omap_dss_driver *, + int (*probe)(struct omap_dss_device *)); void omap_dss_unregister_driver(struct omap_dss_driver *); void omap_dss_get_device(struct omap_dss_device *dssdev); diff --git a/drivers/video/omap2/dss/core.c b/drivers/video/omap2/dss/core.c index 3584e3e..b3eba14 100644 --- a/drivers/video/omap2/dss/core.c +++ b/drivers/video/omap2/dss/core.c @@ -447,6 +447,50 @@ void omap_dss_unregister_driver(struct omap_dss_driver *dssdriver) } EXPORT_SYMBOL(omap_dss_unregister_driver); +static int omap_dss_driver_probe_fail(struct device *dev) +{ + return -ENXIO; +} + +static int find_any_dev(struct device *dev, void *data) +{ + struct omap_dss_driver *dssdrv = data; + return dev->driver == &dssdrv->driver; +} + +int omap_dss_register_driver_probe(struct omap_dss_driver *dssdriver, + int (*probe)(struct omap_dss_device *)) +{ + int r; + + /* make sure driver won't have bind/unbind attributes */ + dssdriver->driver.suppress_bind_attrs = true; + + /* temporary section violation during probe() */ + dssdriver->probe = probe; + r = omap_dss_register_driver(dssdriver); + + /* fixup that section violation */ + + dssdriver->probe = NULL; + dssdriver->driver.probe = omap_dss_driver_probe_fail; + + if (r) + return r; + + /* find any device using this driver */ + r = bus_for_each_dev(&dss_bus_type, NULL, dssdriver, find_any_dev); + + if (r == 0) { + /* no devices for this driver */ + omap_dss_unregister_driver(dssdriver); + return -ENODEV; + } + + return 0; +} +EXPORT_SYMBOL(omap_dss_register_driver_probe); + /* DEVICE */ static void reset_device(struct device *dev, int check) {