From patchwork Wed Jul 15 00:34:01 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Shuah Khan X-Patchwork-Id: 6794151 Return-Path: X-Original-To: patchwork-alsa-devel@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork2.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork2.web.kernel.org (Postfix) with ESMTP id 3D010C05AC for ; Wed, 15 Jul 2015 07:43:49 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 3450F205E6 for ; Wed, 15 Jul 2015 07:43:48 +0000 (UTC) Received: from alsa0.perex.cz (alsa0.perex.cz [77.48.224.243]) by mail.kernel.org (Postfix) with ESMTP id C901120585 for ; Wed, 15 Jul 2015 07:43:46 +0000 (UTC) Received: by alsa0.perex.cz (Postfix, from userid 1000) id D119626649A; Wed, 15 Jul 2015 09:43:45 +0200 (CEST) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,DKIM_SIGNED, T_DKIM_INVALID,UNPARSEABLE_RELAY autolearn=no version=3.3.1 Received: from alsa0.perex.cz (localhost [IPv6:::1]) by alsa0.perex.cz (Postfix) with ESMTP id E8354265846; Wed, 15 Jul 2015 09:35:37 +0200 (CEST) X-Original-To: alsa-devel@alsa-project.org Delivered-To: alsa-devel@alsa-project.org Received: by alsa0.perex.cz (Postfix, from userid 1000) id 6C68026571B; Wed, 15 Jul 2015 02:34:37 +0200 (CEST) Received: from resqmta-po-08v.sys.comcast.net (resqmta-po-08v.sys.comcast.net [96.114.154.167]) by alsa0.perex.cz (Postfix) with ESMTP id CA3432656F5 for ; Wed, 15 Jul 2015 02:34:26 +0200 (CEST) Received: from resomta-po-19v.sys.comcast.net ([96.114.154.243]) by resqmta-po-08v.sys.comcast.net with comcast id sQaR1q0015FMDhs01QaRk9; Wed, 15 Jul 2015 00:34:25 +0000 Received: from mail.gonehiking.org ([73.181.52.62]) by resomta-po-19v.sys.comcast.net with comcast id sQaQ1q0041LXgTt01QaQXT; Wed, 15 Jul 2015 00:34:25 +0000 Received: from lorien.internal (lorien-wl.internal [192.168.1.40]) by mail.gonehiking.org (Postfix) with ESMTP id CE4B412041B; Tue, 14 Jul 2015 18:34:23 -0600 (MDT) From: Shuah Khan To: mchehab@osg.samsung.com, hans.verkuil@cisco.com, laurent.pinchart@ideasonboard.com, tiwai@suse.de, perex@perex.cz, crope@iki.fi, sakari.ailus@linux.intel.com, arnd@arndb.de, stefanr@s5r6.in-berlin.de, ruchandani.tina@gmail.com, chehabrafael@gmail.com, dan.carpenter@oracle.com, prabhakar.csengg@gmail.com, chris.j.arges@canonical.com, agoode@google.com, pierre-louis.bossart@linux.intel.com, gtmkramer@xs4all.nl, clemens@ladisch.de, daniel@zonque.org, vladcatoi@gmail.com, misterpib@gmail.com, damien@zamaudio.com, pmatilai@laiskiainen.org, takamichiho@gmail.com, normalperson@yhbt.net, bugzilla.frnkcg@spamgourmet.com, joe@oampo.co.uk, calcprogrammer1@gmail.com, jussi@sonarnerd.net Date: Tue, 14 Jul 2015 18:34:01 -0600 Message-Id: <21da4006a0f95ec7aad81539e58df5ef04a173cb.1436917513.git.shuahkh@osg.samsung.com> X-Mailer: git-send-email 2.1.4 In-Reply-To: References: In-Reply-To: References: DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=comcast.net; s=q20140121; t=1436920465; bh=4xJ2GWZE1fYoHwQ15aEU71+zOi8wfbi1XzO4+Kf4fA0=; h=Received:Received:Received:From:To:Subject:Date:Message-Id; b=iyoPLHa9BnF5xGI93spTCttawzPFg99D7g/CmZ5iba4ijG0chIBONB0zvE+KbRHwY c9WGtpxp2Eor5+UQo6Uz6kPdDHeUwr0tAXskMpGs2ZH80mJkZW+j7ED+rEjJx7blQB HA1bIxChtxDqPE972D1p4dhAlpGAFcdYrBTEECg/scAscl1209n2gzpXUyyfEklJjr dn+JKZPGKvt/81Y7uzQLsJqLJXv8pBxWQFpAQwWA5z+9azGOvX5sEm89sWhiw4AKHx S20AMCR1rRLLNbOiFlErhEbvaMyVgYLWwzbrPF0Sx5ZpVyMD5AsJawZ4tZRXOA+DYh cGUylBc2zFG6A== X-Mailman-Approved-At: Wed, 15 Jul 2015 09:35:32 +0200 Cc: alsa-devel@alsa-project.org, Shuah Khan , linux-media@vger.kernel.org Subject: [alsa-devel] [PATCH 2/7] media: Media Controller register/unregister entity_notify API X-BeenThere: alsa-devel@alsa-project.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "Alsa-devel mailing list for ALSA developers - http://www.alsa-project.org" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: alsa-devel-bounces@alsa-project.org Sender: alsa-devel-bounces@alsa-project.org X-Virus-Scanned: ClamAV using ClamSMTP Add new interfaces to register and unregister entity_notify hook to media device to allow drivers to take appropriate actions when as new entities get added to the shared media device.When a new entity is registered, all registered entity_notify hooks are invoked to allow drivers or modules that registered hook to take appropriate action. For example, ALSA driver registers an entity_notify hook to parse the list of registered entities to determine if decoder has been linked to ALSA entity. au0828 bridge driver registers an entity_notify hook to create media graph for the device. Signed-off-by: Shuah Khan --- drivers/media/media-device.c | 45 ++++++++++++++++++++++++++++++++++++++++++++ include/media/media-device.h | 23 ++++++++++++++++++++++ 2 files changed, 68 insertions(+) diff --git a/drivers/media/media-device.c b/drivers/media/media-device.c index c55ab50..22565a8 100644 --- a/drivers/media/media-device.c +++ b/drivers/media/media-device.c @@ -381,6 +381,7 @@ int __must_check __media_device_register(struct media_device *mdev, mdev->entity_id = 1; INIT_LIST_HEAD(&mdev->entities); + INIT_LIST_HEAD(&mdev->entity_notify); spin_lock_init(&mdev->lock); mutex_init(&mdev->graph_mutex); @@ -411,9 +412,12 @@ void media_device_unregister(struct media_device *mdev) { struct media_entity *entity; struct media_entity *next; + struct media_entity_notify *notify, *nextp; list_for_each_entry_safe(entity, next, &mdev->entities, list) media_device_unregister_entity(entity); + list_for_each_entry_safe(notify, nextp, &mdev->entity_notify, list) + media_device_unregister_entity_notify(mdev, notify); device_remove_file(&mdev->devnode.dev, &dev_attr_model); media_devnode_unregister(&mdev->devnode); @@ -421,6 +425,39 @@ void media_device_unregister(struct media_device *mdev) EXPORT_SYMBOL_GPL(media_device_unregister); /** + * media_device_register_entity_notify - Register a media entity notify + * callback with a media device. When a new entity is registered, all + * the registered media_entity_notify callbacks are invoked. + * @mdev: The media device + * @nptr: The media_entity_notify + */ +int __must_check media_device_register_entity_notify(struct media_device *mdev, + struct media_entity_notify *nptr) +{ + spin_lock(&mdev->lock); + list_add_tail(&nptr->list, &mdev->entity_notify); + spin_unlock(&mdev->lock); + return 0; +} +EXPORT_SYMBOL_GPL(media_device_register_entity_notify); + +/** + * media_device_unregister_entity_notify - Unregister a media entity notify + * callback with a media device. When a new entity is registered, all + * the registered media_entity_notify callbacks are invoked. + * @mdev: The media device + * @nptr: The media_entity_notify + */ +void media_device_unregister_entity_notify(struct media_device *mdev, + struct media_entity_notify *nptr) +{ + spin_lock(&mdev->lock); + list_del(&nptr->list); + spin_unlock(&mdev->lock); +} +EXPORT_SYMBOL_GPL(media_device_unregister_entity_notify); + +/** * media_device_register_entity - Register an entity with a media device * @mdev: The media device * @entity: The entity @@ -428,6 +465,8 @@ EXPORT_SYMBOL_GPL(media_device_unregister); int __must_check media_device_register_entity(struct media_device *mdev, struct media_entity *entity) { + struct media_entity_notify *notify, *next; + /* Warn if we apparently re-register an entity */ WARN_ON(entity->parent != NULL); entity->parent = mdev; @@ -440,6 +479,11 @@ int __must_check media_device_register_entity(struct media_device *mdev, list_add_tail(&entity->list, &mdev->entities); spin_unlock(&mdev->lock); + /* invoke entity_notify callbacks */ + list_for_each_entry_safe(notify, next, &mdev->entity_notify, list) { + (notify)->notify(entity, notify->notify_data); + } + return 0; } EXPORT_SYMBOL_GPL(media_device_register_entity); @@ -462,6 +506,7 @@ void media_device_unregister_entity(struct media_entity *entity) list_del(&entity->list); spin_unlock(&mdev->lock); entity->parent = NULL; + /* invoke entity_notify callbacks to handle entity removal?? */ } EXPORT_SYMBOL_GPL(media_device_unregister_entity); diff --git a/include/media/media-device.h b/include/media/media-device.h index a44f18f..a3854f6 100644 --- a/include/media/media-device.h +++ b/include/media/media-device.h @@ -32,6 +32,12 @@ struct device; +struct media_entity_notify { + struct list_head list; + void *notify_data; + void (*notify)(struct media_entity *entity, void *notify_data); +}; + /** * struct media_device - Media device * @dev: Parent device @@ -70,6 +76,8 @@ struct media_device { u32 entity_id; struct list_head entities; + /* notify callback list invoked when a new entity is registered */ + struct list_head entity_notify; /* Protects the entities list */ spinlock_t lock; @@ -94,6 +102,10 @@ int __must_check __media_device_register(struct media_device *mdev, #define media_device_register(mdev) __media_device_register(mdev, THIS_MODULE) void media_device_unregister(struct media_device *mdev); +int __must_check media_device_register_entity_notify(struct media_device *mdev, + struct media_entity_notify *nptr); +void media_device_unregister_entity_notify(struct media_device *mdev, + struct media_entity_notify *nptr); int __must_check media_device_register_entity(struct media_device *mdev, struct media_entity *entity); void media_device_unregister_entity(struct media_entity *entity); @@ -112,6 +124,17 @@ static inline int media_device_register(struct media_device *mdev) static inline void media_device_unregister(struct media_device *mdev) { } +static inline int media_device_register_entity_notify( + struct media_device *mdev, + struct media_entity_notify *nptr) +{ + return 0; +} +static inline void media_device_unregister_entity_notify( + struct media_device *mdev, + struct media_entity_notify *nptr) +{ +} static inline int media_device_register_entity(struct media_device *mdev, struct media_entity *entity) {