Commit 827e3648 authored by Jean-Christophe DUBOIS's avatar Jean-Christophe DUBOIS Committed by Arnd Bergmann

[CELL] fix cbe_thermal for legacy SLOF tree.

Previous patch changed based on Christian Krafft's comment.

On some legacy SLOF tree the generic code is unable to ioremap some Cell BE
registers. Therefore the "generic" functions are returning a NULL pointer,
triggering a crash on such platforms.

Let's handle this more gracefully.
Signed-off-by: default avatarJean-Christophe DUBOIS <jcd@tribudubois.net>
Acked-by: default avatarChristian Kraff <krafft@de.ibm.com>
Signed-off-by: default avatarArnd Bergmann <arnd.bergmann@de.ibm.com>
parent 64bafa9d
...@@ -292,7 +292,7 @@ static struct attribute_group ppe_attribute_group = { ...@@ -292,7 +292,7 @@ static struct attribute_group ppe_attribute_group = {
/* /*
* initialize throttling with default values * initialize throttling with default values
*/ */
static void __init init_default_values(void) static int __init init_default_values(void)
{ {
int cpu; int cpu;
struct cbe_pmd_regs __iomem *pmd_regs; struct cbe_pmd_regs __iomem *pmd_regs;
...@@ -339,25 +339,40 @@ static void __init init_default_values(void) ...@@ -339,25 +339,40 @@ static void __init init_default_values(void)
for_each_possible_cpu (cpu) { for_each_possible_cpu (cpu) {
pr_debug("processing cpu %d\n", cpu); pr_debug("processing cpu %d\n", cpu);
sysdev = get_cpu_sysdev(cpu); sysdev = get_cpu_sysdev(cpu);
if (!sysdev) {
pr_info("invalid sysdev pointer for cbe_thermal\n");
return -EINVAL;
}
pmd_regs = cbe_get_cpu_pmd_regs(sysdev->id); pmd_regs = cbe_get_cpu_pmd_regs(sysdev->id);
if (!pmd_regs) {
pr_info("invalid CBE regs pointer for cbe_thermal\n");
return -EINVAL;
}
out_be64(&pmd_regs->tm_str2, str2); out_be64(&pmd_regs->tm_str2, str2);
out_be64(&pmd_regs->tm_str1.val, str1.val); out_be64(&pmd_regs->tm_str1.val, str1.val);
out_be64(&pmd_regs->tm_tpr.val, tpr.val); out_be64(&pmd_regs->tm_tpr.val, tpr.val);
out_be64(&pmd_regs->tm_cr1.val, cr1.val); out_be64(&pmd_regs->tm_cr1.val, cr1.val);
out_be64(&pmd_regs->tm_cr2, cr2); out_be64(&pmd_regs->tm_cr2, cr2);
} }
return 0;
} }
static int __init thermal_init(void) static int __init thermal_init(void)
{ {
init_default_values(); int rc = init_default_values();
if (rc == 0) {
spu_add_sysdev_attr_group(&spu_attribute_group); spu_add_sysdev_attr_group(&spu_attribute_group);
cpu_add_sysdev_attr_group(&ppe_attribute_group); cpu_add_sysdev_attr_group(&ppe_attribute_group);
}
return 0; return rc;
} }
module_init(thermal_init); module_init(thermal_init);
......
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