From patchwork Fri Jul 2 10:18:23 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Thara Gopinath X-Patchwork-Id: 109848 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by demeter.kernel.org (8.14.4/8.14.3) with ESMTP id o62AIgV5014445 for ; Fri, 2 Jul 2010 10:18:45 GMT Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1750875Ab0GBKSn (ORCPT ); Fri, 2 Jul 2010 06:18:43 -0400 Received: from arroyo.ext.ti.com ([192.94.94.40]:47177 "EHLO arroyo.ext.ti.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751801Ab0GBKSk (ORCPT ); Fri, 2 Jul 2010 06:18:40 -0400 Received: from dbdp31.itg.ti.com ([172.24.170.98]) by arroyo.ext.ti.com (8.13.7/8.13.7) with ESMTP id o62AIZlT021851 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Fri, 2 Jul 2010 05:18:38 -0500 Received: from linfarm488.india.ti.com (localhost [127.0.0.1]) by dbdp31.itg.ti.com (8.13.8/8.13.8) with ESMTP id o62AIUew017714; Fri, 2 Jul 2010 15:48:31 +0530 (IST) Received: from linfarm488.india.ti.com (localhost [127.0.0.1]) by linfarm488.india.ti.com (8.12.11/8.12.11) with ESMTP id o62AIUZS032220; Fri, 2 Jul 2010 15:48:30 +0530 Received: (from a0393109@localhost) by linfarm488.india.ti.com (8.12.11/8.12.11/Submit) id o62AIUhG032218; Fri, 2 Jul 2010 15:48:30 +0530 From: Thara Gopinath To: linux-omap@vger.kernel.org Cc: khilman@deeprootsystems.com, paul@pwsan.com, b-cousson@ti.com, vishwanath.bs@ti.com, sawant@ti.com, p-basak2@ti.com, Thara Gopinath Subject: [RFC 1/7] OMAP: Introduce a user list for each voltage domain instance in the voltage driver. Date: Fri, 2 Jul 2010 15:48:23 +0530 Message-Id: <1278065909-32148-2-git-send-email-thara@ti.com> X-Mailer: git-send-email 1.5.6.6 In-Reply-To: <1278065909-32148-1-git-send-email-thara@ti.com> References: <1278065909-32148-1-git-send-email-thara@ti.com> 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]); Fri, 02 Jul 2010 10:18:46 +0000 (UTC) diff --git a/arch/arm/mach-omap2/voltage.c b/arch/arm/mach-omap2/voltage.c index 30f1770..a2f30a4 100644 --- a/arch/arm/mach-omap2/voltage.c +++ b/arch/arm/mach-omap2/voltage.c @@ -24,6 +24,9 @@ #include #include #include +#include +#include +#include #include #include @@ -93,6 +96,20 @@ struct vp_reg_val { }; /** + * omap_vdd_user_list - The per vdd user list + * + * @dev : The device asking for the vdd to be set at a particular + * voltage + * @node : The list head entry + * @volt : The voltage requested by the device + */ +struct omap_vdd_user_list { + struct device *dev; + struct plist_node node; + u32 volt; +}; + +/** * omap_vdd_info - Per Voltage Domain info * * @volt_data : voltage table having the distinct voltages supported @@ -103,6 +120,9 @@ struct vp_reg_val { * vp registers * @volt_clk : the clock associated with the vdd. * @opp_dev : the 'struct device' associated with this vdd. + * @user_lock : the lock to be used by the plist user_list + * @user_list : the list head maintaining the various users + * of this vdd with the voltage requested by each user. * @volt_data_count : Number of distinct voltages supported by this vdd. * @nominal_volt : Nominal voltaged for this vdd. * cmdval_reg : Voltage controller cmdval register. @@ -115,6 +135,8 @@ struct omap_vdd_info{ struct clk *volt_clk; struct device *opp_dev; struct omap_volt_domain volt_domain; + spinlock_t user_lock; + struct plist_head user_list; int volt_data_count; unsigned long nominal_volt; u8 cmdval_reg; @@ -361,6 +383,10 @@ static void __init omap3_vdd_data_configure(struct omap_vdd_info *vdd) struct clk *sys_ck; u32 sys_clk_speed, timeout_val, waittime; + /* Init the plist */ + spin_lock_init(&vdd->user_lock); + plist_head_init(&vdd->user_list, &vdd->user_lock); + if (!strcmp(vdd->volt_domain.name, "mpu")) { if (cpu_is_omap3630()) { vdd->vp_reg.vlimitto_vddmin = @@ -881,6 +907,63 @@ unsigned long omap_voltageprocessor_get_curr_volt( } /** + * omap_voltage_get_final : API to keep track of various requests to + * scale the VDD and returns the best possible + * voltage the VDD can be put to. + * @volt_domain: pointer to the voltage domain. + * @dev : the device pointer. + * @volt : the voltage which is requested by the device. + * + * This API is to be called before the actual voltage scaling is + * done to determine what is the best possible voltage the VDD can + * be put to. This API adds the device in the user list of the + * vdd with as the requested voltage. The user list + * is a plist with the priority element absolute voltage values. + * The API then finds the maximum of all the requested voltages for + * the VDD and returns it back through pointer itself. + * Returns error value in case of any errors. + */ +int omap_volt_get_final(struct omap_volt_domain *volt_domain, + struct device *dev, unsigned long *volt) +{ + struct omap_vdd_info *vdd; + struct omap_vdd_user_list *user; + struct plist_node *node; + int found = 0; + + if (!volt_domain || IS_ERR(volt_domain)) { + pr_warning("%s: VDD specified does not exist!\n", __func__); + return -EINVAL; + } + + vdd = container_of(volt_domain, struct omap_vdd_info, volt_domain); + + plist_for_each_entry(user, &vdd->user_list, node) { + if (user->dev == dev) { + found = 1; + break; + } + } + + if (!found) { + user = kzalloc(sizeof(struct omap_vdd_user_list), GFP_KERNEL); + if (!user) { + pr_err("%s: Unable to creat a new user for vdd_%s\n", + __func__, volt_domain->name); + return -ENOMEM; + } + user->dev = dev; + plist_node_init(&user->node, *volt); + plist_add(&user->node, &vdd->user_list); + } + + user->node.prio = *volt; + node = plist_first(&vdd->user_list); + *volt = node->prio; + return 0; +} + +/** * omap_voltageprocessor_enable : API to enable a particular VP * @volt_domain: pointer to the VDD whose VP is to be enabled. * diff --git a/arch/arm/plat-omap/include/plat/voltage.h b/arch/arm/plat-omap/include/plat/voltage.h index b7ac318..bc1e4d3 100644 --- a/arch/arm/plat-omap/include/plat/voltage.h +++ b/arch/arm/plat-omap/include/plat/voltage.h @@ -128,6 +128,8 @@ int omap_get_voltage_table(struct omap_volt_domain *volt_domain, struct omap_volt_data *omap_get_volt_data( struct omap_volt_domain *volt_domain, unsigned long volt); unsigned long get_curr_voltage(struct omap_volt_domain *volt_domain); +int omap_volt_get_final(struct omap_volt_domain *volt_domain, + struct device *dev, unsigned long *volt); #ifdef CONFIG_PM void omap_voltage_init_vc(struct omap_volt_vc_data *setup_vc); #else