Commit 98aed08e authored by Jean Pihet's avatar Jean Pihet Committed by Kevin Hilman

ARM: OMAP: SmartReflex: pass device dependent data via platform data

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: default avatarJean Pihet <j-pihet@ti.com>
Signed-off-by: default avatarKevin Hilman <khilman@ti.com>
parent 1bef60cc
...@@ -121,6 +121,19 @@ static int __init sr_dev_init(struct omap_hwmod *oh, void *user) ...@@ -121,6 +121,19 @@ static int __init sr_dev_init(struct omap_hwmod *oh, void *user)
sr_data->senn_mod = 0x1; sr_data->senn_mod = 0x1;
sr_data->senp_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); sr_data->voltdm = voltdm_lookup(sr_dev_attr->sensor_voltdm_name);
if (!sr_data->voltdm) { if (!sr_data->voltdm) {
pr_err("%s: Unable to get voltage domain pointer for VDD %s\n", pr_err("%s: Unable to get voltage domain pointer for VDD %s\n",
......
...@@ -130,24 +130,21 @@ static irqreturn_t sr_interrupt(int irq, void *data) ...@@ -130,24 +130,21 @@ static irqreturn_t sr_interrupt(int irq, void *data)
static void sr_set_clk_length(struct omap_sr *sr) static void sr_set_clk_length(struct omap_sr *sr)
{ {
struct clk *sys_ck; struct clk *fck;
u32 sys_clk_speed; u32 fclk_speed;
if (cpu_is_omap34xx()) fck = clk_get(&sr->pdev->dev, "fck");
sys_ck = clk_get(NULL, "sys_ck");
else
sys_ck = clk_get(NULL, "sys_clkin_ck");
if (IS_ERR(sys_ck)) { if (IS_ERR(fck)) {
dev_err(&sr->pdev->dev, "%s: unable to get sys clk\n", dev_err(&sr->pdev->dev, "%s: unable to get fck for device %s\n",
__func__); __func__, dev_name(&sr->pdev->dev));
return; return;
} }
sys_clk_speed = clk_get_rate(sys_ck); fclk_speed = clk_get_rate(fck);
clk_put(sys_ck); clk_put(fck);
switch (sys_clk_speed) { switch (fclk_speed) {
case 12000000: case 12000000:
sr->clk_length = SRCLKLENGTH_12MHZ_SYSCLK; sr->clk_length = SRCLKLENGTH_12MHZ_SYSCLK;
break; break;
...@@ -164,34 +161,12 @@ static void sr_set_clk_length(struct omap_sr *sr) ...@@ -164,34 +161,12 @@ static void sr_set_clk_length(struct omap_sr *sr)
sr->clk_length = SRCLKLENGTH_38MHZ_SYSCLK; sr->clk_length = SRCLKLENGTH_38MHZ_SYSCLK;
break; break;
default: default:
dev_err(&sr->pdev->dev, "%s: Invalid sysclk value: %d\n", dev_err(&sr->pdev->dev, "%s: Invalid fclk rate: %d\n",
__func__, sys_clk_speed); __func__, fclk_speed);
break; 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) static void sr_start_vddautocomp(struct omap_sr *sr)
{ {
if (!sr_class || !(sr_class->enable) || !(sr_class->configure)) { if (!sr_class || !(sr_class->enable) || !(sr_class->configure)) {
...@@ -924,8 +899,14 @@ static int __init omap_sr_probe(struct platform_device *pdev) ...@@ -924,8 +899,14 @@ static int __init omap_sr_probe(struct platform_device *pdev)
sr_info->nvalue_count = pdata->nvalue_count; sr_info->nvalue_count = pdata->nvalue_count;
sr_info->senn_mod = pdata->senn_mod; sr_info->senn_mod = pdata->senn_mod;
sr_info->senp_mod = pdata->senp_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->autocomp_active = false;
sr_info->ip_type = pdata->ip_type; sr_info->ip_type = pdata->ip_type;
sr_info->base = ioremap(mem->start, resource_size(mem)); sr_info->base = ioremap(mem->start, resource_size(mem));
if (!sr_info->base) { if (!sr_info->base) {
dev_err(&pdev->dev, "%s: ioremap fail\n", __func__); dev_err(&pdev->dev, "%s: ioremap fail\n", __func__);
...@@ -937,7 +918,6 @@ static int __init omap_sr_probe(struct platform_device *pdev) ...@@ -937,7 +918,6 @@ static int __init omap_sr_probe(struct platform_device *pdev)
sr_info->irq = irq->start; sr_info->irq = irq->start;
sr_set_clk_length(sr_info); sr_set_clk_length(sr_info);
sr_set_regfields(sr_info);
list_add(&sr_info->node, &sr_list); list_add(&sr_info->node, &sr_list);
......
...@@ -260,8 +260,13 @@ struct omap_sr_nvalue_table { ...@@ -260,8 +260,13 @@ struct omap_sr_nvalue_table {
* *
* @name: instance name * @name: instance name
* @ip_type: Smartreflex IP type. * @ip_type: Smartreflex IP type.
* @senp_mod: SENPENABLE value for the sr * @senp_mod: SENPENABLE value of the sr CONFIG register
* @senn_mod: SENNENABLE value for sr * @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 * @nvalue_count: Number of distinct nvalues in the nvalue table
* @enable_on_init: whether this sr module needs to enabled at * @enable_on_init: whether this sr module needs to enabled at
* boot up or not. * boot up or not.
...@@ -274,6 +279,11 @@ struct omap_sr_data { ...@@ -274,6 +279,11 @@ struct omap_sr_data {
int ip_type; int ip_type;
u32 senp_mod; u32 senp_mod;
u32 senn_mod; u32 senn_mod;
u32 err_weight;
u32 err_maxlimit;
u32 accum_data;
u32 senn_avgweight;
u32 senp_avgweight;
int nvalue_count; int nvalue_count;
bool enable_on_init; bool enable_on_init;
struct omap_sr_nvalue_table *nvalue_table; struct omap_sr_nvalue_table *nvalue_table;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment