From patchwork Wed Mar 10 00:09:12 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: y@google.com X-Patchwork-Id: 84437 X-Patchwork-Delegate: khilman@deeprootsystems.com Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by demeter.kernel.org (8.14.3/8.14.3) with ESMTP id o2A0Aij8006151 for ; Wed, 10 Mar 2010 00:10:44 GMT Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755881Ab0CJAKX (ORCPT ); Tue, 9 Mar 2010 19:10:23 -0500 Received: from smtp-out.google.com ([216.239.33.17]:43550 "EHLO smtp-out.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754989Ab0CJAKV (ORCPT ); Tue, 9 Mar 2010 19:10:21 -0500 Received: from kpbe14.cbf.corp.google.com (kpbe14.cbf.corp.google.com [172.25.105.78]) by smtp-out.google.com with ESMTP id o2A09j1Z030069; Wed, 10 Mar 2010 00:09:45 GMT DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; d=google.com; s=beta; t=1268179788; bh=jwFPlSQEEWVISZmaEluqUoUqa4U=; h=From:To:Cc:Subject:Date:Message-Id; b=WYPH2/mMgb6Mc2VOzVAS1dbzdbkQFpwO/GZ5t2BM+eXvmWYjxfDTh0kXOIeGTVGff rU1ikew+waF/0oqjrY0tg== DomainKey-Signature: a=rsa-sha1; s=beta; d=google.com; c=nofws; q=dns; h=from:to:cc:subject:date:message-id:x-mailer:x-system-of-record; b=RRdT3XrKGLUDRGftxV3HpJV855gYM7XS1NojPWy2wtcqSVJ4I67+l9fr4KNBcwFBB E1UqNFdKETHr8qrzcJPDw== Received: from mikechan.mtv.corp.google.com (mikechan.mtv.corp.google.com [172.18.102.252]) by kpbe14.cbf.corp.google.com with ESMTP id o2A09fG9015078; Tue, 9 Mar 2010 16:09:42 -0800 Received: by mikechan.mtv.corp.google.com (Postfix, from userid 18922) id 6AE0022017; Tue, 9 Mar 2010 16:09:41 -0800 (PST) From: y@google.com Cc: android-kernel@googlegroups.com, Chunqiu Wang , Mike Chan , Tony Lindgren , Russell King , Rajendra Nayak , Tero Kristo , Kalle Jokiniemi , Jouni Hogander , Kevin Hilman , linux-omap@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org Subject: [PATCH] omap: resource: Add per-resource mutex for OMAP resource framework Date: Tue, 9 Mar 2010 16:09:12 -0800 Message-Id: <1268179753-4063-1-git-send-email-y> X-Mailer: git-send-email 1.6.6.2 X-System-Of-Record: true To: unlisted-recipients:; (no To-header on input) Sender: linux-omap-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-omap@vger.kernel.org X-Greylist: IP, sender and recipient auto-whitelisted, not delayed by milter-greylist-4.2.3 (demeter.kernel.org [140.211.167.41]); Wed, 10 Mar 2010 00:10:44 +0000 (UTC) diff --git a/arch/arm/plat-omap/include/plat/resource.h b/arch/arm/plat-omap/include/plat/resource.h index 9acebcc..b5aff1f 100644 --- a/arch/arm/plat-omap/include/plat/resource.h +++ b/arch/arm/plat-omap/include/plat/resource.h @@ -54,6 +54,8 @@ struct shared_resource { /* Shared resource operations */ struct shared_resource_ops *ops; struct list_head node; + /* Protect each resource */ + struct mutex resource_mutex; }; struct shared_resource_ops { diff --git a/arch/arm/plat-omap/resource.c b/arch/arm/plat-omap/resource.c index f1cdecf..0a7b79b 100644 --- a/arch/arm/plat-omap/resource.c +++ b/arch/arm/plat-omap/resource.c @@ -277,6 +277,7 @@ int resource_register(struct shared_resource *resp) } INIT_LIST_HEAD(&resp->users_list); + mutex_init(&resp->resource_mutex); /* Add the resource to the resource list */ list_add(&resp->node, &res_list); @@ -339,14 +340,13 @@ int resource_request(const char *name, struct device *dev, struct users_list *user; int found = 0, ret = 0; - down(&res_mutex); - resp = _resource_lookup(name); + resp = resource_lookup(name); if (!resp) { printk(KERN_ERR "resource_request: Invalid resource name\n"); - ret = -EINVAL; - goto res_unlock; + return -EINVAL; } + mutex_lock(&resp->resource_mutex); /* Call the resource specific validate function */ if (resp->ops->validate_level) { ret = resp->ops->validate_level(resp, level); @@ -375,7 +375,7 @@ int resource_request(const char *name, struct device *dev, user->level = level; res_unlock: - up(&res_mutex); + mutex_unlock(&resp->resource_mutex); /* * Recompute and set the current level for the resource. * NOTE: update_resource level moved out of spin_lock, as it may call @@ -406,14 +406,13 @@ int resource_release(const char *name, struct device *dev) struct users_list *user; int found = 0, ret = 0; - down(&res_mutex); - resp = _resource_lookup(name); + resp = resource_lookup(name); if (!resp) { printk(KERN_ERR "resource_release: Invalid resource name\n"); - ret = -EINVAL; - goto res_unlock; + return -EINVAL; } + mutex_lock(&resp->resource_mutex); list_for_each_entry(user, &resp->users_list, node) { if (user->dev == dev) { found = 1; @@ -434,7 +433,7 @@ int resource_release(const char *name, struct device *dev) /* Recompute and set the current level for the resource */ ret = update_resource_level(resp); res_unlock: - up(&res_mutex); + mutex_unlock(&resp->resource_mutex); return ret; } EXPORT_SYMBOL(resource_release); @@ -458,7 +457,7 @@ int resource_get_level(const char *name) up(&res_mutex); return -EINVAL; } - ret = resp->curr_level; + ret = resp->curr_level; up(&res_mutex); return ret; }