xref: /linux/arch/powerpc/platforms/powernv/opal-sensor.c (revision 7224adbbb80329d1a3ec5aa98213b50365fcd246)
1*7224adbbSNeelesh Gupta /*
2*7224adbbSNeelesh Gupta  * PowerNV sensor code
3*7224adbbSNeelesh Gupta  *
4*7224adbbSNeelesh Gupta  * Copyright (C) 2013 IBM
5*7224adbbSNeelesh Gupta  *
6*7224adbbSNeelesh Gupta  * This program is free software; you can redistribute it and/or modify
7*7224adbbSNeelesh Gupta  * it under the terms of the GNU General Public License as published by
8*7224adbbSNeelesh Gupta  * the Free Software Foundation; either version 2 of the License, or
9*7224adbbSNeelesh Gupta  * (at your option) any later version.
10*7224adbbSNeelesh Gupta  *
11*7224adbbSNeelesh Gupta  * This program is distributed in the hope that it will be useful,
12*7224adbbSNeelesh Gupta  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13*7224adbbSNeelesh Gupta  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14*7224adbbSNeelesh Gupta  * GNU General Public License for more details.
15*7224adbbSNeelesh Gupta  *
16*7224adbbSNeelesh Gupta  * You should have received a copy of the GNU General Public License
17*7224adbbSNeelesh Gupta  * along with this program; if not, write to the Free Software
18*7224adbbSNeelesh Gupta  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19*7224adbbSNeelesh Gupta  */
20*7224adbbSNeelesh Gupta 
21*7224adbbSNeelesh Gupta #include <linux/delay.h>
22*7224adbbSNeelesh Gupta #include <linux/mutex.h>
23*7224adbbSNeelesh Gupta #include <asm/opal.h>
24*7224adbbSNeelesh Gupta 
25*7224adbbSNeelesh Gupta static DEFINE_MUTEX(opal_sensor_mutex);
26*7224adbbSNeelesh Gupta 
27*7224adbbSNeelesh Gupta /*
28*7224adbbSNeelesh Gupta  * This will return sensor information to driver based on the requested sensor
29*7224adbbSNeelesh Gupta  * handle. A handle is an opaque id for the powernv, read by the driver from the
30*7224adbbSNeelesh Gupta  * device tree..
31*7224adbbSNeelesh Gupta  */
32*7224adbbSNeelesh Gupta int opal_get_sensor_data(u32 sensor_hndl, u32 *sensor_data)
33*7224adbbSNeelesh Gupta {
34*7224adbbSNeelesh Gupta 	int ret, token;
35*7224adbbSNeelesh Gupta 	struct opal_msg msg;
36*7224adbbSNeelesh Gupta 
37*7224adbbSNeelesh Gupta 	token = opal_async_get_token_interruptible();
38*7224adbbSNeelesh Gupta 	if (token < 0) {
39*7224adbbSNeelesh Gupta 		pr_err("%s: Couldn't get the token, returning\n", __func__);
40*7224adbbSNeelesh Gupta 		ret = token;
41*7224adbbSNeelesh Gupta 		goto out;
42*7224adbbSNeelesh Gupta 	}
43*7224adbbSNeelesh Gupta 
44*7224adbbSNeelesh Gupta 	mutex_lock(&opal_sensor_mutex);
45*7224adbbSNeelesh Gupta 	ret = opal_sensor_read(sensor_hndl, token, sensor_data);
46*7224adbbSNeelesh Gupta 	if (ret != OPAL_ASYNC_COMPLETION)
47*7224adbbSNeelesh Gupta 		goto out_token;
48*7224adbbSNeelesh Gupta 
49*7224adbbSNeelesh Gupta 	ret = opal_async_wait_response(token, &msg);
50*7224adbbSNeelesh Gupta 	if (ret) {
51*7224adbbSNeelesh Gupta 		pr_err("%s: Failed to wait for the async response, %d\n",
52*7224adbbSNeelesh Gupta 				__func__, ret);
53*7224adbbSNeelesh Gupta 		goto out_token;
54*7224adbbSNeelesh Gupta 	}
55*7224adbbSNeelesh Gupta 
56*7224adbbSNeelesh Gupta 	ret = msg.params[1];
57*7224adbbSNeelesh Gupta 
58*7224adbbSNeelesh Gupta out_token:
59*7224adbbSNeelesh Gupta 	mutex_unlock(&opal_sensor_mutex);
60*7224adbbSNeelesh Gupta 	opal_async_release_token(token);
61*7224adbbSNeelesh Gupta out:
62*7224adbbSNeelesh Gupta 	return ret;
63*7224adbbSNeelesh Gupta }
64*7224adbbSNeelesh Gupta EXPORT_SYMBOL_GPL(opal_get_sensor_data);
65