ARM: OMAP: SmartReflex: pass device dependent data via platform data
authorJean Pihet <j-pihet@ti.com>
Thu, 4 Oct 2012 16:47:11 +0000 (18:47 +0200)
committerKevin Hilman <khilman@ti.com>
Mon, 15 Oct 2012 22:22:24 +0000 (15:22 -0700)
Remove the device dependent code (ex. cpu_is_xxx()) and settings
from the driver code and instead pass them via the platform
data. This allows a clean separation of the driver code and the platform
code, as required by the move of the platform header files to
include/linux/platform_data.

Note about the smartreflex functional clocks: the smartreflex fclks
are derived from sys_clk and have the same name as the main_clk from
the hwmod entry, in order for the SmartReflex driver to request the
fclk (using clk_get(dev, "fck")).

Signed-off-by: Jean Pihet <j-pihet@ti.com>
Signed-off-by: Kevin Hilman <khilman@ti.com>
arch/arm/mach-omap2/sr_device.c
drivers/power/avs/smartreflex.c
include/linux/power/smartreflex.h

index f8217a5a4a26db510350dbeb9daf9f140fd2204d..a04bc25a1d268a74d96bf1e507c0a503373a5ec2 100644 (file)
@@ -121,6 +121,19 @@ static int __init sr_dev_init(struct omap_hwmod *oh, void *user)
        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"))) {
+                       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 (!sr_data->voltdm) {
                pr_err("%s: Unable to get voltage domain pointer for VDD %s\n",
index 24768a27e1d8b2593bb97fd382a3fdf1b2a40252..4c4519e59be40541408346b2b3c41e603be22da8 100644 (file)
@@ -130,24 +130,21 @@ static irqreturn_t sr_interrupt(int irq, void *data)
 
 static void sr_set_clk_length(struct omap_sr *sr)
 {
-       struct clk *sys_ck;
-       u32 sys_clk_speed;
+       struct clk *fck;
+       u32 fclk_speed;
 
-       if (cpu_is_omap34xx())
-               sys_ck = clk_get(NULL, "sys_ck");
-       else
-               sys_ck = clk_get(NULL, "sys_clkin_ck");
+       fck = clk_get(&sr->pdev->dev, "fck");
 
-       if (IS_ERR(sys_ck)) {
-               dev_err(&sr->pdev->dev, "%s: unable to get sys clk\n",
-                       __func__);
+       if (IS_ERR(fck)) {
+               dev_err(&sr->pdev->dev, "%s: unable to get fck for device %s\n",
+                               __func__, dev_name(&sr->pdev->dev));
                return;
        }
 
-       sys_clk_speed = clk_get_rate(sys_ck);
-       clk_put(sys_ck);
+       fclk_speed = clk_get_rate(fck);
+       clk_put(fck);
 
-       switch (sys_clk_speed) {
+       switch (fclk_speed) {
        case 12000000:
                sr->clk_length = SRCLKLENGTH_12MHZ_SYSCLK;
                break;
@@ -164,34 +161,12 @@ static void sr_set_clk_length(struct omap_sr *sr)
                sr->clk_length = SRCLKLENGTH_38MHZ_SYSCLK;
                break;
        default:
-               dev_err(&sr->pdev->dev, "%s: Invalid sysclk value: %d\n",
-                       __func__, sys_clk_speed);
+               dev_err(&sr->pdev->dev, "%s: Invalid fclk rate: %d\n",
+                       __func__, fclk_speed);
                break;
        }
 }
 
-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)) {
@@ -924,8 +899,14 @@ 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__);
@@ -937,7 +918,6 @@ static int __init omap_sr_probe(struct platform_device *pdev)
                sr_info->irq = irq->start;
 
        sr_set_clk_length(sr_info);
-       sr_set_regfields(sr_info);
 
        list_add(&sr_info->node, &sr_list);
 
index 4a496ebc7d733c69432896ec08cdce5a0ba89964..c0f44c2b006da4ae05e4c55e7ed322fb50c581fd 100644 (file)
@@ -260,8 +260,13 @@ struct omap_sr_nvalue_table {
  *
  * @name:              instance 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.
@@ -274,6 +279,11 @@ struct omap_sr_data {
        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;