powerpc/powernv: handle OPAL_SUCCESS return in opal_sensor_read
authorCédric Le Goater <clg@fr.ibm.com>
Mon, 30 Mar 2015 10:06:10 +0000 (12:06 +0200)
committerMichael Ellerman <mpe@ellerman.id.au>
Tue, 31 Mar 2015 03:50:35 +0000 (14:50 +1100)
Currently, when a sensor value is read, the kernel calls OPAL, which in
turn builds a message for the FSP, and waits for a message back.

The new device tree for OPAL sensors [1] adds new sensors that can be
read synchronously (core temperatures for instance) and that don't need
to wait for a response.

This patch modifies the opal call to accept an OPAL_SUCCESS return value
and cover the case above.

[1] https://lists.ozlabs.org/pipermail/skiboot/2015-March/000639.html

Signed-off-by: Cédric Le Goater <clg@fr.ibm.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
arch/powerpc/platforms/powernv/opal-sensor.c

index e9c5d8f33d4c025223e92f6500e3e8280b71f30e..655250499d18cd84e59a8217d5f102ffd15ddab0 100644 (file)
@@ -46,20 +46,28 @@ int opal_get_sensor_data(u32 sensor_hndl, u32 *sensor_data)
 
        mutex_lock(&opal_sensor_mutex);
        ret = opal_sensor_read(sensor_hndl, token, &data);
-       if (ret != OPAL_ASYNC_COMPLETION) {
-               ret = opal_error_code(ret);
-               goto out_token;
-       }
+       switch (ret) {
+       case OPAL_ASYNC_COMPLETION:
+               ret = opal_async_wait_response(token, &msg);
+               if (ret) {
+                       pr_err("%s: Failed to wait for the async response, %d\n",
+                              __func__, ret);
+                       goto out_token;
+               }
 
-       ret = opal_async_wait_response(token, &msg);
-       if (ret) {
-               pr_err("%s: Failed to wait for the async response, %d\n",
-                               __func__, ret);
-               goto out_token;
-       }
+               ret = opal_error_code(be64_to_cpu(msg.params[1]));
+               *sensor_data = be32_to_cpu(data);
+               break;
 
-       *sensor_data = be32_to_cpu(data);
-       ret = opal_error_code(be64_to_cpu(msg.params[1]));
+       case OPAL_SUCCESS:
+               ret = 0;
+               *sensor_data = be32_to_cpu(data);
+               break;
+
+       default:
+               ret = opal_error_code(ret);
+               break;
+       }
 
 out_token:
        mutex_unlock(&opal_sensor_mutex);