/* Copyright 2013-2015 IBM Corp.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *	http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
 * implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef __SENSOR_H
#define __SENSOR_H

/*
 * A sensor handler is a four bytes value which identifies a sensor by
 * its resource class (temperature, fans ...), a resource identifier
 * and an attribute number (data, status, ...) :
 *
 *                    Res.
 *     | Attr.  |Fam Class|   Resource Id  |
 *     |--------|---|-----|----------------|
 *
 * The last 3bits of the resource class are used to hold the family
 * number. That leaves 32 differents resource classes. This is enough
 * for the FSP as it uses 15.
 */

/*
 * Helper routines to build or use the sensor handler.
 */
#define sensor_make_handler(family, class, rid, attr)			\
	(((attr) << 24) | ((family) & 0x7) << 21 | ((class) & 0x1f) << 16 | \
	 ((rid) & 0xffff))

#define sensor_get_family(handler)	(((handler) >> 21) & 0x7)
#define sensor_get_frc(handler)		(((handler) >> 16) & 0x1f)
#define sensor_get_rid(handler)		((handler) & 0xffff)
#define sensor_get_attr(handler)	((handler) >> 24)

/*
 * Sensor families
 *
 * This identifier is used to dispatch calls to OPAL_SENSOR_READ to
 * the appropriate component. FSP is the initial family and you can
 * have up to eight, as we are hijacking the last 3bits of the
 * resource class.
 */
enum {
	SENSOR_FSP = 0,
	SENSOR_DTS = 7,
};

/*
 * root node of all sensors : /ibm,opal/sensors
 */
extern struct dt_node *sensor_node;

extern void sensor_init(void);

#endif /* __SENSOR_H */
