cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

ir38064.c (2466B)


      1// SPDX-License-Identifier: GPL-2.0+
      2/*
      3 * Hardware monitoring driver for Infineon IR38064
      4 *
      5 * Copyright (c) 2017 Google Inc
      6 *
      7 * VOUT_MODE is not supported by the device. The driver fakes VOUT linear16
      8 * mode with exponent value -8 as direct mode with m=256/b=0/R=0.
      9 *          
     10 * The device supports VOUT_PEAK, IOUT_PEAK, and TEMPERATURE_PEAK, however
     11 * this driver does not currently support them.
     12 */
     13
     14#include <linux/err.h>
     15#include <linux/i2c.h>
     16#include <linux/init.h>
     17#include <linux/kernel.h>
     18#include <linux/module.h>
     19#include <linux/of_device.h>
     20#include <linux/regulator/driver.h>
     21#include "pmbus.h"
     22
     23#if IS_ENABLED(CONFIG_SENSORS_IR38064_REGULATOR)
     24static const struct regulator_desc ir38064_reg_desc[] = {
     25	PMBUS_REGULATOR("vout", 0),
     26};
     27#endif /* CONFIG_SENSORS_IR38064_REGULATOR */
     28
     29static struct pmbus_driver_info ir38064_info = {
     30	.pages = 1,
     31	.format[PSC_VOLTAGE_IN] = linear,
     32	.format[PSC_VOLTAGE_OUT] = direct,
     33	.format[PSC_CURRENT_OUT] = linear,
     34	.format[PSC_POWER] = linear,
     35	.format[PSC_TEMPERATURE] = linear,
     36	.m[PSC_VOLTAGE_OUT] = 256,
     37	.b[PSC_VOLTAGE_OUT] = 0,
     38	.R[PSC_VOLTAGE_OUT] = 0,
     39	.func[0] = PMBUS_HAVE_VIN | PMBUS_HAVE_STATUS_INPUT
     40	    | PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP
     41	    | PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
     42	    | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT
     43	    | PMBUS_HAVE_POUT,
     44#if IS_ENABLED(CONFIG_SENSORS_IR38064_REGULATOR)
     45	.num_regulators = 1,
     46	.reg_desc = ir38064_reg_desc,
     47#endif
     48};
     49
     50static int ir38064_probe(struct i2c_client *client)
     51{
     52	return pmbus_do_probe(client, &ir38064_info);
     53}
     54
     55static const struct i2c_device_id ir38064_id[] = {
     56	{"ir38060", 0},
     57	{"ir38064", 0},
     58	{"ir38164", 0},
     59	{"ir38263", 0},
     60	{}
     61};
     62
     63MODULE_DEVICE_TABLE(i2c, ir38064_id);
     64
     65static const struct of_device_id __maybe_unused ir38064_of_match[] = {
     66	{ .compatible = "infineon,ir38060" },
     67	{ .compatible = "infineon,ir38064" },
     68	{ .compatible = "infineon,ir38164" },
     69	{ .compatible = "infineon,ir38263" },
     70	{}
     71};
     72
     73MODULE_DEVICE_TABLE(of, ir38064_of_match);
     74
     75/* This is the driver that will be inserted */
     76static struct i2c_driver ir38064_driver = {
     77	.driver = {
     78		   .name = "ir38064",
     79		   .of_match_table = of_match_ptr(ir38064_of_match),
     80		   },
     81	.probe_new = ir38064_probe,
     82	.id_table = ir38064_id,
     83};
     84
     85module_i2c_driver(ir38064_driver);
     86
     87MODULE_AUTHOR("Maxim Sloyko <maxims@google.com>");
     88MODULE_DESCRIPTION("PMBus driver for Infineon IR38064 and compatible chips");
     89MODULE_LICENSE("GPL");
     90MODULE_IMPORT_NS(PMBUS);