MIPS: Loongson: Add Loongson-3A R4 basic support
[sfrench/cifs-2.6.git] / drivers / platform / mips / cpu_hwmon.c
index a7f184bb47e05bec63cf6fe3a46fa50182154662..1833b51690e54c4af9a440710aac1cd6cd7c118e 100644 (file)
@@ -9,6 +9,9 @@
 #include <loongson.h>
 #include <boot_param.h>
 #include <loongson_hwmon.h>
+#include <loongson_regs.h>
+
+static int csr_temp_enable = 0;
 
 /*
  * Loongson-3 series cpu has two sensors inside,
@@ -20,8 +23,14 @@ int loongson3_cpu_temp(int cpu)
 {
        u32 reg, prid_rev;
 
+       if (csr_temp_enable) {
+               reg = (csr_readl(LOONGSON_CSR_CPUTEMP) & 0xff);
+               goto out;
+       }
+
        reg = LOONGSON_CHIPTEMP(cpu);
        prid_rev = read_c0_prid() & PRID_REV_MASK;
+
        switch (prid_rev) {
        case PRID_REV_LOONGSON3A_R1:
                reg = (reg >> 8) & 0xff;
@@ -34,9 +43,12 @@ int loongson3_cpu_temp(int cpu)
                break;
        case PRID_REV_LOONGSON3A_R3_0:
        case PRID_REV_LOONGSON3A_R3_1:
+       default:
                reg = (reg & 0xffff)*731/0x4000 - 273;
                break;
        }
+
+out:
        return (int)reg * 1000;
 }
 
@@ -159,6 +171,9 @@ static int __init loongson_hwmon_init(void)
 
        pr_info("Loongson Hwmon Enter...\n");
 
+       if (cpu_has_csr())
+               csr_temp_enable = csr_readl(LOONGSON_CSR_FEATURES) & LOONGSON_CSRF_TEMP;
+
        cpu_hwmon_dev = hwmon_device_register(NULL);
        if (IS_ERR(cpu_hwmon_dev)) {
                ret = -ENOMEM;