Path: blob/master/arch/powerpc/platforms/powernv/opal-sensor.c
26481 views
// SPDX-License-Identifier: GPL-2.0-or-later1/*2* PowerNV sensor code3*4* Copyright (C) 2013 IBM5*/67#include <linux/delay.h>8#include <linux/of.h>9#include <linux/of_platform.h>10#include <linux/platform_device.h>11#include <asm/opal.h>12#include <asm/machdep.h>1314/*15* This will return sensor information to driver based on the requested sensor16* handle. A handle is an opaque id for the powernv, read by the driver from the17* device tree..18*/19int opal_get_sensor_data(u32 sensor_hndl, u32 *sensor_data)20{21int ret, token;22struct opal_msg msg;23__be32 data;2425token = opal_async_get_token_interruptible();26if (token < 0)27return token;2829ret = opal_sensor_read(sensor_hndl, token, &data);30switch (ret) {31case OPAL_ASYNC_COMPLETION:32ret = opal_async_wait_response(token, &msg);33if (ret) {34pr_err("%s: Failed to wait for the async response, %d\n",35__func__, ret);36goto out;37}3839ret = opal_error_code(opal_get_async_rc(msg));40*sensor_data = be32_to_cpu(data);41break;4243case OPAL_SUCCESS:44ret = 0;45*sensor_data = be32_to_cpu(data);46break;4748case OPAL_WRONG_STATE:49ret = -EIO;50break;5152default:53ret = opal_error_code(ret);54break;55}5657out:58opal_async_release_token(token);59return ret;60}61EXPORT_SYMBOL_GPL(opal_get_sensor_data);6263int opal_get_sensor_data_u64(u32 sensor_hndl, u64 *sensor_data)64{65int ret, token;66struct opal_msg msg;67__be64 data;6869if (!opal_check_token(OPAL_SENSOR_READ_U64)) {70u32 sdata;7172ret = opal_get_sensor_data(sensor_hndl, &sdata);73if (!ret)74*sensor_data = sdata;75return ret;76}7778token = opal_async_get_token_interruptible();79if (token < 0)80return token;8182ret = opal_sensor_read_u64(sensor_hndl, token, &data);83switch (ret) {84case OPAL_ASYNC_COMPLETION:85ret = opal_async_wait_response(token, &msg);86if (ret) {87pr_err("%s: Failed to wait for the async response, %d\n",88__func__, ret);89goto out_token;90}9192ret = opal_error_code(opal_get_async_rc(msg));93*sensor_data = be64_to_cpu(data);94break;9596case OPAL_SUCCESS:97ret = 0;98*sensor_data = be64_to_cpu(data);99break;100101case OPAL_WRONG_STATE:102ret = -EIO;103break;104105default:106ret = opal_error_code(ret);107break;108}109110out_token:111opal_async_release_token(token);112return ret;113}114EXPORT_SYMBOL_GPL(opal_get_sensor_data_u64);115116int __init opal_sensor_init(void)117{118struct platform_device *pdev;119struct device_node *sensor;120121sensor = of_find_node_by_path("/ibm,opal/sensors");122if (!sensor) {123pr_err("Opal node 'sensors' not found\n");124return -ENODEV;125}126127pdev = of_platform_device_create(sensor, "opal-sensor", NULL);128of_node_put(sensor);129130return PTR_ERR_OR_ZERO(pdev);131}132133134