From patchwork Thu Sep 20 14:47:33 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jean Pihet X-Patchwork-Id: 1486241 Return-Path: X-Original-To: patchwork-linux-arm@patchwork.kernel.org Delivered-To: patchwork-process-083081@patchwork1.kernel.org Received: from merlin.infradead.org (merlin.infradead.org [205.233.59.134]) by patchwork1.kernel.org (Postfix) with ESMTP id DF0BB3FD40 for ; Thu, 20 Sep 2012 14:51:36 +0000 (UTC) Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.76 #1 (Red Hat Linux)) id 1TEi3z-0001JJ-J0; Thu, 20 Sep 2012 14:49:11 +0000 Received: from mail-we0-f177.google.com ([74.125.82.177]) by merlin.infradead.org with esmtps (Exim 4.76 #1 (Red Hat Linux)) id 1TEi2d-0000Mt-Te for linux-arm-kernel@lists.infradead.org; Thu, 20 Sep 2012 14:47:51 +0000 Received: by weyr3 with SMTP id r3so1334957wey.36 for ; Thu, 20 Sep 2012 07:47:46 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=from:to:cc:subject:date:message-id:x-mailer:in-reply-to:references :x-gm-message-state; bh=NNwRoywb0cxYDjFe5Gws+2v6q2ORgpIHPe4KfZeNzVc=; b=pGcUtFrX9MXcSrGQ//fNUemgXxWr5GGwFEpt9HpW018z/j6lrU8/QZX9MhrGfBqjih wHXhmn7wEoXm9YPzZBeH/Rg8+gk3wwPXRvd587EcSEzp6Uf8rdoRNKAVe8AIVynZ5EyF vpNbo+GjI8Z9mhvj7oiQk0FRCTHpTqF59xEJkFsIfEMWtV3bXC/axAaOvk2YUBMo3nn9 voHNZAgr7Mqj3PgYbiUECw+SbhpEeXuN9p5+lupCadB8YoSHM+SNZKXFtT1WaqeevxrL eXeDNupXXkk0RCjmEv/Rp9LeUKhi5SO+Dp11ukWFCJWlYCPmq1HC01H+mLRh+nYD8n/j r9cQ== Received: by 10.180.100.37 with SMTP id ev5mr5039790wib.5.1348152466598; Thu, 20 Sep 2012 07:47:46 -0700 (PDT) Received: from localhost.localdomain (179.59-66-87.adsl-dyn.isp.belgacom.be. [87.66.59.179]) by mx.google.com with ESMTPS id l6sm32938018wiz.4.2012.09.20.07.47.45 (version=TLSv1/SSLv3 cipher=OTHER); Thu, 20 Sep 2012 07:47:46 -0700 (PDT) From: Jean Pihet To: linux-omap@vger.kernel.org, linux-arm-kernel@lists.infradead.org, tony@atomide.com, Anton Vorontsov , Kevin Hilman , J Keerthy Subject: [PATCH 2/2] ARM: OMAP: SmartReflex: pass device dependent data via platform data Date: Thu, 20 Sep 2012 16:47:33 +0200 Message-Id: <1348152453-30532-3-git-send-email-j-pihet@ti.com> X-Mailer: git-send-email 1.7.7.6 In-Reply-To: <1348152453-30532-1-git-send-email-j-pihet@ti.com> References: <1348152453-30532-1-git-send-email-j-pihet@ti.com> X-Gm-Message-State: ALoCoQk0wz0rjHFTHocqnClvE4Ao6HekjG79xEKdrJS+H4SYslhzeLbjvf8eifST8ye9scaSEvrR X-Spam-Note: CRM114 invocation failed X-Spam-Score: -2.6 (--) X-Spam-Report: SpamAssassin version 3.3.2 on merlin.infradead.org summary: Content analysis details: (-2.6 points) pts rule name description ---- ---------------------- -------------------------------------------------- -0.7 RCVD_IN_DNSWL_LOW RBL: Sender listed at http://www.dnswl.org/, low trust [74.125.82.177 listed in list.dnswl.org] -1.9 BAYES_00 BODY: Bayes spam probability is 0 to 1% [score: 0.0000] Cc: Jean Pihet X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Sender: linux-arm-kernel-bounces@lists.infradead.org Errors-To: linux-arm-kernel-bounces+patchwork-linux-arm=patchwork.kernel.org@lists.infradead.org Remove the device dependent settings (cpu_is_xxx(), IP fck etc.) from the driver code and pass them instead via the platform data. This allows a clean separation of the driver code and the platform code. Signed-off-by: Jean Pihet --- arch/arm/mach-omap2/sr_device.c | 14 ++++++++++ drivers/power/avs/smartreflex.c | 51 +++++++++++++++--------------------- include/linux/power/smartreflex.h | 17 +++++++++++- 3 files changed, 50 insertions(+), 32 deletions(-) diff --git a/arch/arm/mach-omap2/sr_device.c b/arch/arm/mach-omap2/sr_device.c index d033a65..12d95c8 100644 --- a/arch/arm/mach-omap2/sr_device.c +++ b/arch/arm/mach-omap2/sr_device.c @@ -118,10 +118,24 @@ static int __init sr_dev_init(struct omap_hwmod *oh, void *user) } sr_data->name = oh->name; + sr_data->fck_name = oh->main_clk; sr_data->ip_type = oh->class->rev; sr_data->senn_mod = 0x1; sr_data->senp_mod = 0x1; + if (cpu_is_omap34xx() || cpu_is_omap44xx()) { + sr_data->err_weight = OMAP3430_SR_ERRWEIGHT; + sr_data->err_maxlimit = OMAP3430_SR_ERRMAXLIMIT; + sr_data->accum_data = OMAP3430_SR_ACCUMDATA; + if (!(strcmp(sr_data->name, "smartreflex_mpu_iva"))) { + sr_data->senn_avgweight = OMAP3430_SR1_SENNAVGWEIGHT; + sr_data->senp_avgweight = OMAP3430_SR1_SENPAVGWEIGHT; + } else { + sr_data->senn_avgweight = OMAP3430_SR2_SENNAVGWEIGHT; + sr_data->senp_avgweight = OMAP3430_SR2_SENPAVGWEIGHT; + } + } + sr_data->voltdm = voltdm_lookup(sr_dev_attr->sensor_voltdm_name); if (IS_ERR(sr_data->voltdm)) { pr_err("%s: Unable to get voltage domain pointer for VDD %s\n", diff --git a/drivers/power/avs/smartreflex.c b/drivers/power/avs/smartreflex.c index 92f6728..f09e8df 100644 --- a/drivers/power/avs/smartreflex.c +++ b/drivers/power/avs/smartreflex.c @@ -131,14 +131,11 @@ static void sr_set_clk_length(struct omap_sr *sr) struct clk *sys_ck; u32 sys_clk_speed; - if (cpu_is_omap34xx()) - sys_ck = clk_get(NULL, "sys_ck"); - else - sys_ck = clk_get(NULL, "sys_clkin_ck"); + sys_ck = clk_get(NULL, sr->fck_name); if (IS_ERR(sys_ck)) { - dev_err(&sr->pdev->dev, "%s: unable to get sys clk\n", - __func__); + dev_err(&sr->pdev->dev, "%s: unable to get smartreflex fck %s\n", + __func__, sr->fck_name); return; } @@ -168,28 +165,6 @@ static void sr_set_clk_length(struct omap_sr *sr) } } -static void sr_set_regfields(struct omap_sr *sr) -{ - /* - * For time being these values are defined in smartreflex.h - * and populated during init. May be they can be moved to board - * file or pmic specific data structure. In that case these structure - * fields will have to be populated using the pdata or pmic structure. - */ - if (cpu_is_omap34xx() || cpu_is_omap44xx()) { - sr->err_weight = OMAP3430_SR_ERRWEIGHT; - sr->err_maxlimit = OMAP3430_SR_ERRMAXLIMIT; - sr->accum_data = OMAP3430_SR_ACCUMDATA; - if (!(strcmp(sr->name, "smartreflex_mpu_iva"))) { - sr->senn_avgweight = OMAP3430_SR1_SENNAVGWEIGHT; - sr->senp_avgweight = OMAP3430_SR1_SENPAVGWEIGHT; - } else { - sr->senn_avgweight = OMAP3430_SR2_SENNAVGWEIGHT; - sr->senp_avgweight = OMAP3430_SR2_SENPAVGWEIGHT; - } - } -} - static void sr_start_vddautocomp(struct omap_sr *sr) { if (!sr_class || !(sr_class->enable) || !(sr_class->configure)) { @@ -915,6 +890,14 @@ static int __init omap_sr_probe(struct platform_device *pdev) goto err_release_region; } + sr_info->fck_name = kasprintf(GFP_KERNEL, "%s", pdata->fck_name); + if (!sr_info->fck_name) { + dev_err(&pdev->dev, "%s: Unable to alloc SR instance fck name\n", + __func__); + ret = -ENOMEM; + goto err_free_name; + } + sr_info->pdev = pdev; sr_info->srid = pdev->id; sr_info->voltdm = pdata->voltdm; @@ -922,20 +905,25 @@ static int __init omap_sr_probe(struct platform_device *pdev) sr_info->nvalue_count = pdata->nvalue_count; sr_info->senn_mod = pdata->senn_mod; sr_info->senp_mod = pdata->senp_mod; + sr_info->err_weight = pdata->err_weight; + sr_info->err_maxlimit = pdata->err_maxlimit; + sr_info->accum_data = pdata->accum_data; + sr_info->senn_avgweight = pdata->senn_avgweight; + sr_info->senp_avgweight = pdata->senp_avgweight; sr_info->autocomp_active = false; sr_info->ip_type = pdata->ip_type; + sr_info->base = ioremap(mem->start, resource_size(mem)); if (!sr_info->base) { dev_err(&pdev->dev, "%s: ioremap fail\n", __func__); ret = -ENOMEM; - goto err_free_name; + goto err_free_fck_name; } if (irq) sr_info->irq = irq->start; sr_set_clk_length(sr_info); - sr_set_regfields(sr_info); list_add(&sr_info->node, &sr_list); @@ -1014,6 +1002,8 @@ err_debugfs: err_iounmap: list_del(&sr_info->node); iounmap(sr_info->base); +err_free_fck_name: + kfree(sr_info->fck_name); err_free_name: kfree(sr_info->name); err_release_region: @@ -1049,6 +1039,7 @@ static int __devexit omap_sr_remove(struct platform_device *pdev) list_del(&sr_info->node); iounmap(sr_info->base); + kfree(sr_info->fck_name); kfree(sr_info->name); kfree(sr_info); mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); diff --git a/include/linux/power/smartreflex.h b/include/linux/power/smartreflex.h index 3101e62..7b16c3c 100644 --- a/include/linux/power/smartreflex.h +++ b/include/linux/power/smartreflex.h @@ -145,6 +145,7 @@ struct omap_sr { char *name; + char *fck_name; struct list_head node; struct platform_device *pdev; struct omap_sr_nvalue_table *nvalue_table; @@ -259,9 +260,15 @@ struct omap_sr_nvalue_table { * struct omap_sr_data - Smartreflex platform data. * * @name: instance name + * @fck_name: IP block fck name * @ip_type: Smartreflex IP type. - * @senp_mod: SENPENABLE value for the sr - * @senn_mod: SENNENABLE value for sr + * @senp_mod: SENPENABLE value of the sr CONFIG register + * @senn_mod: SENNENABLE value for sr CONFIG register + * @err_weight ERRWEIGHT value of the sr ERRCONFIG register + * @err_maxlimit ERRMAXLIMIT value of the sr ERRCONFIG register + * @accum_data ACCUMDATA value of the sr CONFIG register + * @senn_avgweight SENNAVGWEIGHT value of the sr AVGWEIGHT register + * @senp_avgweight SENPAVGWEIGHT value of the sr AVGWEIGHT register * @nvalue_count: Number of distinct nvalues in the nvalue table * @enable_on_init: whether this sr module needs to enabled at * boot up or not. @@ -271,9 +278,15 @@ struct omap_sr_nvalue_table { */ struct omap_sr_data { const char *name; + const char *fck_name; int ip_type; u32 senp_mod; u32 senn_mod; + u32 err_weight; + u32 err_maxlimit; + u32 accum_data; + u32 senn_avgweight; + u32 senp_avgweight; int nvalue_count; bool enable_on_init; struct omap_sr_nvalue_table *nvalue_table;