hwmon: occ: Add hwmon implementation for the P8 OCC
RFC PATCH v6 6/9 hwmon: occ: Add hwmon implementation for the P8 OCC
From: "Edward A. James" <[email protected]>
--- drivers/hwmon/occ/Kconfig | 14 +++++ drivers/hwmon/occ/Makefile | 1 + drivers/hwmon/occ/occ_p8_i2c.c | 133 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 148 insertions(+) create mode 100644 drivers/hwmon/occ/occ_p8_i2c.c
drivers/hwmon/occ/Kconfig +14 -0
@@ -13,3 +13,17 @@ menuconfig SENSORS_PPC_OCC This driver can also be built as a module. If so, the module will be called occ. + +if SENSORS_PPC_OCC + +config SENSORS_PPC_OCC_P8_I2C + tristate "POWER8 OCC hwmon support" + depends on I2C + help + Provide a hwmon sysfs interface for the POWER8 On-Chip Controller, + exposing temperature, frequency and power measurements. + + This driver can also be built as a module. If so, the module will be + called occ-p8-i2c. + +endif
drivers/hwmon/occ/Makefile +1 -0
@@ -1 +1,2 @@ obj-$(CONFIG_SENSORS_PPC_OCC) += occ.o occ_sysfs.o +obj-$(CONFIG_SENSORS_PPC_OCC_P8_I2C) += occ_scom_i2c.o occ_p8.o occ_p8_i2c.o
drivers/hwmon/occ/occ_p8_i2c.c new file +133 -0
133 lines not on this page · raw message
Signature · 1 line
1.9.1
Quoted 2 lines · On Tue, 2016-11-29 at 17:04 -0600, [email protected] wrote:
Quoted 1 line
From: "Edward A. James" <[email protected]>
As on the previous patches, I'd like to see some more words here.
Also like the previous patch I think we need to give some consideration to consistent naming, but otherwise this looks good.
Andrew
Quoted 176 lines
Signed-off-by Edward A. James <[email protected]>---
drivers/hwmon/occ/Kconfig | 14 +++++ drivers/hwmon/occ/Makefile | 1 +drivers/hwmon/occ/occ_p8_i2c.c| 133 +++++++++++++++++++++++++++++++++++++++++3 files changed, 148 insertions(+)create mode 100644
drivers/hwmon/occ/occ_p8_i2c.cdrivers/hwmon/occ/Kconfig +0
-0@@ -13,3 +13,17 @@ menuconfig SENSORS_PPC_OCCQuoted 2 lines
This driver can also be built as a module. If so, the module will be called occ.
drivers/hwmon/occ/Kconfig +4
-0+ +if SENSORS_PPC_OCC + +config SENSORS_PPC_OCC_P8_I2Cdrivers/hwmon/occ/Kconfig menuconfig SENSORS_PPC_OCC · line 24
Quoted 5 lines
drivers/hwmon/occ/Kconfig +5
-0+ tristate "POWER8 OCC hwmon support" + depends on I2C + help + Provide a hwmon sysfs interface for the POWER8 On-Chip Controller, + exposing temperature, frequency and power measurements.+
Quoted 2 lines
drivers/hwmon/occ/Kconfig +2
-0+ This driver can also be built as a module. If so, the module will be + called occ-p8-i2c.drivers/hwmon/occ/Kconfig +2
-0+ +endifdrivers/hwmon/occ/Makefile +0
-0@@ -1 +1,2 @@obj-$(CONFIG_SENSORS_PPC_OCC) += occ.o occ_sysfs.o
drivers/hwmon/occ/Makefile +1
-0+obj-$(CONFIG_SENSORS_PPC_OCC_P8_I2C) += occ_scom_i2c.o occ_p8.o occ_p8_i2c.odrivers/hwmon/occ/occ_p8_i2c.c new file +130
-0@@ -0,0 +1,133 @@ +/* +* occ_p8_i2c.c - hwmon OCC driver +* +* This file contains the i2c layer for accessing the OCC over i2c bus. +* +* Copyright 2016 IBM Corp. +* +* This program is free software; you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation; either version 2 of the License, or +* (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +*/ + +#include <linux/err.h> +#include <linux/module.h> +#include <linux/init.h> +#include <linux/slab.h> +#include <linux/i2c.h> +#include <linux/err.h> +#include <linux/of.h> +#include <linux/kernel.h> +#include <linux/device.h> + +#include "scom.h" +#include "occ_scom_i2c.h" +#include "occ_p8.h" +#include "occ_sysfs.h" + +#define OCC_I2C_NAME "occ-p8-i2c" + +static char *caps_sensor_names[] = { + "curr_powercap", + "curr_powerreading", + "norm_powercap", + "max_powercap", + "min_powercap", + "user_powerlimit" +}; + +int p8_i2c_getscom (void *bus,u32 address,u8 *data,size_t offset) +{ + /* P8 i2c slave requires address to be shifted by 1 */ + address = address << 1; + + return occ_i2c_getscom(bus, address, data, offset); +} + +int p8_i2c_putscom (void *bus,u32 address,u32 data0,u32 data1) +{ + /* P8 i2c slave requires address to be shifted by 1 */ + address = address << 1; + + return occ_i2c_putscom(bus, address, data0, data1); +} + +static struct occ_bus_ops p8_bus_ops = { + .getscom = p8_i2c_getscom, + .putscom = p8_i2c_putscom, +}; + +static struct occ_sysfs_config p8_sysfs_config = { + .num_caps_fields = ARRAY_SIZE(caps_sensor_names), + .caps_names = caps_sensor_names, +}; + +static int occ_p8_probe (struct i2c_client *client, + const struct i2c_device_id *id) +{ + struct occ *occ; + struct occ_sysfs *hwmon; + + occ = occ_p8_start(&client->dev, client, p8_bus_ops); + if (IS_ERR(occ)) + return PTR_ERR(occ); + + hwmon = occ_sysfs_start(&client->dev, occ, &p8_sysfs_config); + if (IS_ERR(hwmon)) + return PTR_ERR(hwmon); + + i2c_set_clientdata(client, hwmon); + + return 0; +} + +static int occ_p8_remove (struct i2c_client *client) +{ + return occ_p8_stop(i2c_get_clientdata(client)); +} + +/* used by old-style board info. */ +static const struct i2c_device_id occ_ids[] = { + { OCC_I2C_NAME, 0 }, + {} +}; +MODULE_DEVICE_TABLE (i2c, occ_ids); + +/* used by device table */ +static const struct of_device_id occ_of_match[] = { + { .compatible = "ibm,occ-p8-i2c" }, + {} +}; +MODULE_DEVICE_TABLE (of, occ_of_match); + +/* +* i2c-core uses i2c-detect() to detect device in below address list. +* If exists, address will be assigned to client. +* It is also possible to read address from device table. +*/ +static const unsigned short normal_i2c[] = {0x50 ,0x51 ,I2C_CLIENT_END }; + +static struct i2c_driver occ_p8_driver = { + .class = I2C_CLASS_HWMON, + .driver = { + .name = OCC_I2C_NAME, + .pm = NULL, + .of_match_table = occ_of_match, + }, + .probe = occ_p8_probe, + .remove = occ_p8_remove, + .id_table = occ_ids, + .address_list = normal_i2c, +}; + +module_i2c_driver (occ_p8_driver); +Quoted 1 line
+MODULE_AUTHOR("Eddie James <[email protected]>");
drivers/hwmon/occ/occ_p8_i2c.c new file +2
-0+MODULE_DESCRIPTION ("BMC P8 OCC hwmon driver" ); +MODULE_LICENSE ("GPL" );