Commit 9514a228 authored by Alexandru Tachici's avatar Alexandru Tachici Committed by Guenter Roeck
Browse files

hwmon: (pmbus) Add support for ADM1266



Add pmbus probing driver for the adm1266 Cascadable
Super Sequencer with Margin Control and Fault Recording.
Driver is using the pmbus_core, creating sysfs files
under hwmon for inputs: vh1->vh4 and vp1->vp13.

Signed-off-by: default avatarAlexandru Tachici <alexandru.tachici@analog.com>
Link: https://lore.kernel.org/r/20200812142055.9213-2-alexandru.tachici@analog.com


[groeck: Use .probe_new function, adjust for changed pmbus_do_probe API]
Signed-off-by: default avatarGuenter Roeck <linux@roeck-us.net>
parent d2e08eba
Loading
Loading
Loading
Loading
+37 −0
Original line number Diff line number Diff line
.. SPDX-License-Identifier: GPL-2.0

Kernel driver adm1266
=====================

Supported chips:
  * Analog Devices ADM1266
    Prefix: 'adm1266'
    Datasheet: https://www.analog.com/media/en/technical-documentation/data-sheets/ADM1266.pdf

Author: Alexandru Tachici <alexandru.tachici@analog.com>


Description
-----------

This driver supports hardware monitoring for Analog Devices ADM1266 sequencer.

ADM1266 is a sequencer that features voltage readback from 17 channels via an
integrated 12 bit SAR ADC, accessed using a PMBus interface.

The driver is a client driver to the core PMBus driver. Please see
Documentation/hwmon/pmbus for details on PMBus client drivers.


Sysfs entries
-------------

The following attributes are supported. Limits are read-write, history reset
attributes are write-only, all other attributes are read-only.

inX_label		"voutx"
inX_input		Measured voltage.
inX_min			Minimum Voltage.
inX_max			Maximum voltage.
inX_min_alarm		Voltage low alarm.
inX_max_alarm		Voltage high alarm.
+1 −0
Original line number Diff line number Diff line
@@ -30,6 +30,7 @@ Hardware Monitoring Kernel Drivers
   adm1026
   adm1031
   adm1177
   adm1266
   adm1275
   adm9240
   ads7828
+9 −0
Original line number Diff line number Diff line
@@ -26,6 +26,15 @@ config SENSORS_PMBUS
	  This driver can also be built as a module. If so, the module will
	  be called pmbus.

config SENSORS_ADM1266
	tristate "Analog Devices ADM1266 Sequencer"
	help
	  If you say yes here you get hardware monitoring support for Analog
	  Devices ADM1266 Cascadable Super Sequencer.

	  This driver can also be built as a module. If so, the module will
	  be called adm1266.

config SENSORS_ADM1275
	tristate "Analog Devices ADM1275 and compatibles"
	help
+1 −0
Original line number Diff line number Diff line
@@ -5,6 +5,7 @@

obj-$(CONFIG_PMBUS)		+= pmbus_core.o
obj-$(CONFIG_SENSORS_PMBUS)	+= pmbus.o
obj-$(CONFIG_SENSORS_ADM1266)	+= adm1266.o
obj-$(CONFIG_SENSORS_ADM1275)	+= adm1275.o
obj-$(CONFIG_SENSORS_BEL_PFE)	+= bel-pfe.o
obj-$(CONFIG_SENSORS_IBM_CFFPS)	+= ibm-cffps.o
+65 −0
Original line number Diff line number Diff line
// SPDX-License-Identifier: GPL-2.0
/*
 * ADM1266 - Cascadable Super Sequencer with Margin
 * Control and Fault Recording
 *
 * Copyright 2020 Analog Devices Inc.
 */

#include <linux/i2c.h>
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include "pmbus.h"
#include <linux/slab.h>

struct adm1266_data {
	struct pmbus_driver_info info;
	struct i2c_client *client;
};

static int adm1266_probe(struct i2c_client *client)
{
	struct adm1266_data *data;
	int i;

	data = devm_kzalloc(&client->dev, sizeof(struct adm1266_data), GFP_KERNEL);
	if (!data)
		return -ENOMEM;

	data->client = client;
	data->info.pages = 17;
	data->info.format[PSC_VOLTAGE_OUT] = linear;
	for (i = 0; i < data->info.pages; i++)
		data->info.func[i] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT;

	return pmbus_do_probe(client, &data->info);
}

static const struct of_device_id adm1266_of_match[] = {
	{ .compatible = "adi,adm1266" },
	{ }
};
MODULE_DEVICE_TABLE(of, adm1266_of_match);

static const struct i2c_device_id adm1266_id[] = {
	{ "adm1266", 0 },
	{ }
};
MODULE_DEVICE_TABLE(i2c, adm1266_id);

static struct i2c_driver adm1266_driver = {
	.driver = {
		   .name = "adm1266",
		   .of_match_table = adm1266_of_match,
		  },
	.probe_new = adm1266_probe,
	.remove = pmbus_do_remove,
	.id_table = adm1266_id,
};

module_i2c_driver(adm1266_driver);

MODULE_AUTHOR("Alexandru Tachici <alexandru.tachici@analog.com>");
MODULE_DESCRIPTION("PMBus driver for Analog Devices ADM1266");
MODULE_LICENSE("GPL v2");