Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   1) // SPDX-License-Identifier: GPL-2.0-or-later
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   3)  * Hardware monitoring driver for Analog Devices ADM1275 Hot-Swap Controller
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   4)  * and Digital Power Monitor
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   5)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   6)  * Copyright (c) 2011 Ericsson AB.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   7)  * Copyright (c) 2018 Guenter Roeck
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   8)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   9) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  10) #include <linux/kernel.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  11) #include <linux/module.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  12) #include <linux/init.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  13) #include <linux/err.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  14) #include <linux/slab.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  15) #include <linux/i2c.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  16) #include <linux/bitops.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  17) #include <linux/bitfield.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  18) #include <linux/log2.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  19) #include "pmbus.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  20) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  21) enum chips { adm1075, adm1272, adm1275, adm1276, adm1278, adm1293, adm1294 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  22) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  23) #define ADM1275_MFR_STATUS_IOUT_WARN2	BIT(0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  24) #define ADM1293_MFR_STATUS_VAUX_UV_WARN	BIT(5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  25) #define ADM1293_MFR_STATUS_VAUX_OV_WARN	BIT(6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  26) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  27) #define ADM1275_PEAK_IOUT		0xd0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  28) #define ADM1275_PEAK_VIN		0xd1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  29) #define ADM1275_PEAK_VOUT		0xd2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  30) #define ADM1275_PMON_CONFIG		0xd4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  31) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  32) #define ADM1275_VIN_VOUT_SELECT		BIT(6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  33) #define ADM1275_VRANGE			BIT(5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  34) #define ADM1075_IRANGE_50		BIT(4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  35) #define ADM1075_IRANGE_25		BIT(3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  36) #define ADM1075_IRANGE_MASK		(BIT(3) | BIT(4))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  37) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  38) #define ADM1272_IRANGE			BIT(0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  39) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  40) #define ADM1278_TEMP1_EN		BIT(3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  41) #define ADM1278_VIN_EN			BIT(2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  42) #define ADM1278_VOUT_EN			BIT(1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  43) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  44) #define ADM1293_IRANGE_25		0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  45) #define ADM1293_IRANGE_50		BIT(6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  46) #define ADM1293_IRANGE_100		BIT(7)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  47) #define ADM1293_IRANGE_200		(BIT(6) | BIT(7))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  48) #define ADM1293_IRANGE_MASK		(BIT(6) | BIT(7))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  49) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  50) #define ADM1293_VIN_SEL_012		BIT(2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  51) #define ADM1293_VIN_SEL_074		BIT(3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  52) #define ADM1293_VIN_SEL_210		(BIT(2) | BIT(3))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  53) #define ADM1293_VIN_SEL_MASK		(BIT(2) | BIT(3))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  54) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  55) #define ADM1293_VAUX_EN			BIT(1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  56) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  57) #define ADM1278_PEAK_TEMP		0xd7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  58) #define ADM1275_IOUT_WARN2_LIMIT	0xd7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  59) #define ADM1275_DEVICE_CONFIG		0xd8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  60) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  61) #define ADM1275_IOUT_WARN2_SELECT	BIT(4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  62) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  63) #define ADM1276_PEAK_PIN		0xda
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  64) #define ADM1075_READ_VAUX		0xdd
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  65) #define ADM1075_VAUX_OV_WARN_LIMIT	0xde
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  66) #define ADM1075_VAUX_UV_WARN_LIMIT	0xdf
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  67) #define ADM1293_IOUT_MIN		0xe3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  68) #define ADM1293_PIN_MIN			0xe4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  69) #define ADM1075_VAUX_STATUS		0xf6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  70) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  71) #define ADM1075_VAUX_OV_WARN		BIT(7)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  72) #define ADM1075_VAUX_UV_WARN		BIT(6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  73) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  74) #define ADM1275_VI_AVG_SHIFT		0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  75) #define ADM1275_VI_AVG_MASK		GENMASK(ADM1275_VI_AVG_SHIFT + 2, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  76) 						ADM1275_VI_AVG_SHIFT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  77) #define ADM1275_SAMPLES_AVG_MAX		128
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  78) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  79) #define ADM1278_PWR_AVG_SHIFT		11
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  80) #define ADM1278_PWR_AVG_MASK		GENMASK(ADM1278_PWR_AVG_SHIFT + 2, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  81) 						ADM1278_PWR_AVG_SHIFT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  82) #define ADM1278_VI_AVG_SHIFT		8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  83) #define ADM1278_VI_AVG_MASK		GENMASK(ADM1278_VI_AVG_SHIFT + 2, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  84) 						ADM1278_VI_AVG_SHIFT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  85) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  86) struct adm1275_data {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  87) 	int id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  88) 	bool have_oc_fault;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  89) 	bool have_uc_fault;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  90) 	bool have_vout;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  91) 	bool have_vaux_status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  92) 	bool have_mfr_vaux_status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  93) 	bool have_iout_min;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  94) 	bool have_pin_min;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  95) 	bool have_pin_max;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  96) 	bool have_temp_max;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  97) 	bool have_power_sampling;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  98) 	struct pmbus_driver_info info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  99) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) #define to_adm1275_data(x)  container_of(x, struct adm1275_data, info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) struct coefficients {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) 	s16 m;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) 	s16 b;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) 	s16 R;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) static const struct coefficients adm1075_coefficients[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) 	[0] = { 27169, 0, -1 },		/* voltage */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) 	[1] = { 806, 20475, -1 },	/* current, irange25 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) 	[2] = { 404, 20475, -1 },	/* current, irange50 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) 	[3] = { 8549, 0, -1 },		/* power, irange25 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) 	[4] = { 4279, 0, -1 },		/* power, irange50 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) static const struct coefficients adm1272_coefficients[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) 	[0] = { 6770, 0, -2 },		/* voltage, vrange 60V */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) 	[1] = { 4062, 0, -2 },		/* voltage, vrange 100V */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) 	[2] = { 1326, 20480, -1 },	/* current, vsense range 15mV */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) 	[3] = { 663, 20480, -1 },	/* current, vsense range 30mV */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) 	[4] = { 3512, 0, -2 },		/* power, vrange 60V, irange 15mV */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) 	[5] = { 21071, 0, -3 },		/* power, vrange 100V, irange 15mV */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) 	[6] = { 17561, 0, -3 },		/* power, vrange 60V, irange 30mV */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) 	[7] = { 10535, 0, -3 },		/* power, vrange 100V, irange 30mV */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) 	[8] = { 42, 31871, -1 },	/* temperature */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) static const struct coefficients adm1275_coefficients[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) 	[0] = { 19199, 0, -2 },		/* voltage, vrange set */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) 	[1] = { 6720, 0, -1 },		/* voltage, vrange not set */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) 	[2] = { 807, 20475, -1 },	/* current */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) static const struct coefficients adm1276_coefficients[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) 	[0] = { 19199, 0, -2 },		/* voltage, vrange set */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) 	[1] = { 6720, 0, -1 },		/* voltage, vrange not set */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) 	[2] = { 807, 20475, -1 },	/* current */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) 	[3] = { 6043, 0, -2 },		/* power, vrange set */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) 	[4] = { 2115, 0, -1 },		/* power, vrange not set */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) static const struct coefficients adm1278_coefficients[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) 	[0] = { 19599, 0, -2 },		/* voltage */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) 	[1] = { 800, 20475, -1 },	/* current */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) 	[2] = { 6123, 0, -2 },		/* power */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) 	[3] = { 42, 31880, -1 },	/* temperature */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) static const struct coefficients adm1293_coefficients[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) 	[0] = { 3333, -1, 0 },		/* voltage, vrange 1.2V */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) 	[1] = { 5552, -5, -1 },		/* voltage, vrange 7.4V */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) 	[2] = { 19604, -50, -2 },	/* voltage, vrange 21V */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) 	[3] = { 8000, -100, -2 },	/* current, irange25 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) 	[4] = { 4000, -100, -2 },	/* current, irange50 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) 	[5] = { 20000, -1000, -3 },	/* current, irange100 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) 	[6] = { 10000, -1000, -3 },	/* current, irange200 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) 	[7] = { 10417, 0, -1 },		/* power, 1.2V, irange25 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) 	[8] = { 5208, 0, -1 },		/* power, 1.2V, irange50 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) 	[9] = { 26042, 0, -2 },		/* power, 1.2V, irange100 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) 	[10] = { 13021, 0, -2 },	/* power, 1.2V, irange200 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) 	[11] = { 17351, 0, -2 },	/* power, 7.4V, irange25 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) 	[12] = { 8676, 0, -2 },		/* power, 7.4V, irange50 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) 	[13] = { 4338, 0, -2 },		/* power, 7.4V, irange100 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) 	[14] = { 21689, 0, -3 },	/* power, 7.4V, irange200 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) 	[15] = { 6126, 0, -2 },		/* power, 21V, irange25 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) 	[16] = { 30631, 0, -3 },	/* power, 21V, irange50 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) 	[17] = { 15316, 0, -3 },	/* power, 21V, irange100 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) 	[18] = { 7658, 0, -3 },		/* power, 21V, irange200 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) static int adm1275_read_pmon_config(const struct adm1275_data *data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) 				    struct i2c_client *client, bool is_power)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) 	int shift, ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) 	u16 mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) 	 * The PMON configuration register is a 16-bit register only on chips
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) 	 * supporting power average sampling. On other chips it is an 8-bit
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) 	 * register.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) 	if (data->have_power_sampling) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) 		ret = i2c_smbus_read_word_data(client, ADM1275_PMON_CONFIG);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) 		mask = is_power ? ADM1278_PWR_AVG_MASK : ADM1278_VI_AVG_MASK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) 		shift = is_power ? ADM1278_PWR_AVG_SHIFT : ADM1278_VI_AVG_SHIFT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) 		ret = i2c_smbus_read_byte_data(client, ADM1275_PMON_CONFIG);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) 		mask = ADM1275_VI_AVG_MASK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) 		shift = ADM1275_VI_AVG_SHIFT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) 	if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) 		return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) 	return (ret & mask) >> shift;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) static int adm1275_write_pmon_config(const struct adm1275_data *data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) 				     struct i2c_client *client,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) 				     bool is_power, u16 word)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) 	int shift, ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) 	u16 mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) 	if (data->have_power_sampling) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) 		ret = i2c_smbus_read_word_data(client, ADM1275_PMON_CONFIG);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) 		mask = is_power ? ADM1278_PWR_AVG_MASK : ADM1278_VI_AVG_MASK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) 		shift = is_power ? ADM1278_PWR_AVG_SHIFT : ADM1278_VI_AVG_SHIFT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) 		ret = i2c_smbus_read_byte_data(client, ADM1275_PMON_CONFIG);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) 		mask = ADM1275_VI_AVG_MASK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) 		shift = ADM1275_VI_AVG_SHIFT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) 	if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) 		return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) 	word = (ret & ~mask) | ((word << shift) & mask);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) 	if (data->have_power_sampling)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) 		ret = i2c_smbus_write_word_data(client, ADM1275_PMON_CONFIG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) 						word);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) 		ret = i2c_smbus_write_byte_data(client, ADM1275_PMON_CONFIG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) 						word);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) 	return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) static int adm1275_read_word_data(struct i2c_client *client, int page,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) 				  int phase, int reg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) 	const struct pmbus_driver_info *info = pmbus_get_driver_info(client);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) 	const struct adm1275_data *data = to_adm1275_data(info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) 	int ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) 	if (page > 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) 		return -ENXIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) 	switch (reg) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) 	case PMBUS_IOUT_UC_FAULT_LIMIT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) 		if (!data->have_uc_fault)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) 			return -ENXIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) 		ret = pmbus_read_word_data(client, 0, 0xff,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) 					   ADM1275_IOUT_WARN2_LIMIT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) 	case PMBUS_IOUT_OC_FAULT_LIMIT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) 		if (!data->have_oc_fault)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) 			return -ENXIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) 		ret = pmbus_read_word_data(client, 0, 0xff,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) 					   ADM1275_IOUT_WARN2_LIMIT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) 	case PMBUS_VOUT_OV_WARN_LIMIT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) 		if (data->have_vout)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) 			return -ENODATA;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) 		ret = pmbus_read_word_data(client, 0, 0xff,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) 					   ADM1075_VAUX_OV_WARN_LIMIT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) 	case PMBUS_VOUT_UV_WARN_LIMIT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) 		if (data->have_vout)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) 			return -ENODATA;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) 		ret = pmbus_read_word_data(client, 0, 0xff,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) 					   ADM1075_VAUX_UV_WARN_LIMIT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) 	case PMBUS_READ_VOUT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) 		if (data->have_vout)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) 			return -ENODATA;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) 		ret = pmbus_read_word_data(client, 0, 0xff,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) 					   ADM1075_READ_VAUX);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) 	case PMBUS_VIRT_READ_IOUT_MIN:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) 		if (!data->have_iout_min)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) 			return -ENXIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) 		ret = pmbus_read_word_data(client, 0, 0xff,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) 					   ADM1293_IOUT_MIN);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) 	case PMBUS_VIRT_READ_IOUT_MAX:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) 		ret = pmbus_read_word_data(client, 0, 0xff,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) 					   ADM1275_PEAK_IOUT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) 	case PMBUS_VIRT_READ_VOUT_MAX:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) 		ret = pmbus_read_word_data(client, 0, 0xff,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) 					   ADM1275_PEAK_VOUT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) 	case PMBUS_VIRT_READ_VIN_MAX:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) 		ret = pmbus_read_word_data(client, 0, 0xff,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) 					   ADM1275_PEAK_VIN);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) 	case PMBUS_VIRT_READ_PIN_MIN:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) 		if (!data->have_pin_min)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) 			return -ENXIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) 		ret = pmbus_read_word_data(client, 0, 0xff,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) 					   ADM1293_PIN_MIN);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) 	case PMBUS_VIRT_READ_PIN_MAX:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) 		if (!data->have_pin_max)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) 			return -ENXIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) 		ret = pmbus_read_word_data(client, 0, 0xff,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) 					   ADM1276_PEAK_PIN);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) 	case PMBUS_VIRT_READ_TEMP_MAX:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) 		if (!data->have_temp_max)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) 			return -ENXIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) 		ret = pmbus_read_word_data(client, 0, 0xff,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) 					   ADM1278_PEAK_TEMP);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) 	case PMBUS_VIRT_RESET_IOUT_HISTORY:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) 	case PMBUS_VIRT_RESET_VOUT_HISTORY:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) 	case PMBUS_VIRT_RESET_VIN_HISTORY:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) 	case PMBUS_VIRT_RESET_PIN_HISTORY:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) 		if (!data->have_pin_max)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) 			return -ENXIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) 	case PMBUS_VIRT_RESET_TEMP_HISTORY:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) 		if (!data->have_temp_max)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) 			return -ENXIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) 	case PMBUS_VIRT_POWER_SAMPLES:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) 		if (!data->have_power_sampling)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) 			return -ENXIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) 		ret = adm1275_read_pmon_config(data, client, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) 		if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) 		ret = BIT(ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) 	case PMBUS_VIRT_IN_SAMPLES:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) 	case PMBUS_VIRT_CURR_SAMPLES:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) 		ret = adm1275_read_pmon_config(data, client, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) 		if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331) 		ret = BIT(ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) 	default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) 		ret = -ENODATA;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) 	return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) static int adm1275_write_word_data(struct i2c_client *client, int page, int reg,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) 				   u16 word)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) 	const struct pmbus_driver_info *info = pmbus_get_driver_info(client);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) 	const struct adm1275_data *data = to_adm1275_data(info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) 	int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) 	if (page > 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) 		return -ENXIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) 	switch (reg) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) 	case PMBUS_IOUT_UC_FAULT_LIMIT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) 	case PMBUS_IOUT_OC_FAULT_LIMIT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) 		ret = pmbus_write_word_data(client, 0, ADM1275_IOUT_WARN2_LIMIT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) 					    word);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) 	case PMBUS_VIRT_RESET_IOUT_HISTORY:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) 		ret = pmbus_write_word_data(client, 0, ADM1275_PEAK_IOUT, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) 		if (!ret && data->have_iout_min)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) 			ret = pmbus_write_word_data(client, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) 						    ADM1293_IOUT_MIN, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) 	case PMBUS_VIRT_RESET_VOUT_HISTORY:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) 		ret = pmbus_write_word_data(client, 0, ADM1275_PEAK_VOUT, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) 	case PMBUS_VIRT_RESET_VIN_HISTORY:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) 		ret = pmbus_write_word_data(client, 0, ADM1275_PEAK_VIN, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) 	case PMBUS_VIRT_RESET_PIN_HISTORY:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) 		ret = pmbus_write_word_data(client, 0, ADM1276_PEAK_PIN, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) 		if (!ret && data->have_pin_min)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) 			ret = pmbus_write_word_data(client, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) 						    ADM1293_PIN_MIN, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) 	case PMBUS_VIRT_RESET_TEMP_HISTORY:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) 		ret = pmbus_write_word_data(client, 0, ADM1278_PEAK_TEMP, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) 	case PMBUS_VIRT_POWER_SAMPLES:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) 		if (!data->have_power_sampling)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) 			return -ENXIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) 		word = clamp_val(word, 1, ADM1275_SAMPLES_AVG_MAX);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) 		ret = adm1275_write_pmon_config(data, client, true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) 						ilog2(word));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) 	case PMBUS_VIRT_IN_SAMPLES:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) 	case PMBUS_VIRT_CURR_SAMPLES:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) 		word = clamp_val(word, 1, ADM1275_SAMPLES_AVG_MAX);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) 		ret = adm1275_write_pmon_config(data, client, false,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) 						ilog2(word));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) 	default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) 		ret = -ENODATA;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) 	return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) static int adm1275_read_byte_data(struct i2c_client *client, int page, int reg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) 	const struct pmbus_driver_info *info = pmbus_get_driver_info(client);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) 	const struct adm1275_data *data = to_adm1275_data(info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401) 	int mfr_status, ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) 	if (page > 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) 		return -ENXIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406) 	switch (reg) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407) 	case PMBUS_STATUS_IOUT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) 		ret = pmbus_read_byte_data(client, page, PMBUS_STATUS_IOUT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409) 		if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411) 		if (!data->have_oc_fault && !data->have_uc_fault)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413) 		mfr_status = pmbus_read_byte_data(client, page,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414) 						  PMBUS_STATUS_MFR_SPECIFIC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) 		if (mfr_status < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) 			return mfr_status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417) 		if (mfr_status & ADM1275_MFR_STATUS_IOUT_WARN2) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418) 			ret |= data->have_oc_fault ?
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419) 			  PB_IOUT_OC_FAULT : PB_IOUT_UC_FAULT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422) 	case PMBUS_STATUS_VOUT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423) 		if (data->have_vout)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424) 			return -ENODATA;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425) 		ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426) 		if (data->have_vaux_status) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427) 			mfr_status = pmbus_read_byte_data(client, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428) 							  ADM1075_VAUX_STATUS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429) 			if (mfr_status < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430) 				return mfr_status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431) 			if (mfr_status & ADM1075_VAUX_OV_WARN)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432) 				ret |= PB_VOLTAGE_OV_WARNING;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433) 			if (mfr_status & ADM1075_VAUX_UV_WARN)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434) 				ret |= PB_VOLTAGE_UV_WARNING;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435) 		} else if (data->have_mfr_vaux_status) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436) 			mfr_status = pmbus_read_byte_data(client, page,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437) 						PMBUS_STATUS_MFR_SPECIFIC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438) 			if (mfr_status < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439) 				return mfr_status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440) 			if (mfr_status & ADM1293_MFR_STATUS_VAUX_OV_WARN)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441) 				ret |= PB_VOLTAGE_OV_WARNING;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442) 			if (mfr_status & ADM1293_MFR_STATUS_VAUX_UV_WARN)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443) 				ret |= PB_VOLTAGE_UV_WARNING;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446) 	default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447) 		ret = -ENODATA;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450) 	return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453) static const struct i2c_device_id adm1275_id[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454) 	{ "adm1075", adm1075 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455) 	{ "adm1272", adm1272 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456) 	{ "adm1275", adm1275 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457) 	{ "adm1276", adm1276 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458) 	{ "adm1278", adm1278 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459) 	{ "adm1293", adm1293 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460) 	{ "adm1294", adm1294 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461) 	{ }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463) MODULE_DEVICE_TABLE(i2c, adm1275_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465) static int adm1275_probe(struct i2c_client *client)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467) 	s32 (*config_read_fn)(const struct i2c_client *client, u8 reg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468) 	u8 block_buffer[I2C_SMBUS_BLOCK_MAX + 1];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469) 	int config, device_config;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470) 	int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471) 	struct pmbus_driver_info *info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472) 	struct adm1275_data *data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473) 	const struct i2c_device_id *mid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474) 	const struct coefficients *coefficients;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475) 	int vindex = -1, voindex = -1, cindex = -1, pindex = -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476) 	int tindex = -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477) 	u32 shunt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479) 	if (!i2c_check_functionality(client->adapter,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480) 				     I2C_FUNC_SMBUS_READ_BYTE_DATA
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481) 				     | I2C_FUNC_SMBUS_BLOCK_DATA))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482) 		return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484) 	ret = i2c_smbus_read_block_data(client, PMBUS_MFR_ID, block_buffer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485) 	if (ret < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 486) 		dev_err(&client->dev, "Failed to read Manufacturer ID\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 487) 		return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 488) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 489) 	if (ret != 3 || strncmp(block_buffer, "ADI", 3)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 490) 		dev_err(&client->dev, "Unsupported Manufacturer ID\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 491) 		return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 492) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 493) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 494) 	ret = i2c_smbus_read_block_data(client, PMBUS_MFR_MODEL, block_buffer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 495) 	if (ret < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 496) 		dev_err(&client->dev, "Failed to read Manufacturer Model\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 497) 		return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 498) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 499) 	for (mid = adm1275_id; mid->name[0]; mid++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 500) 		if (!strncasecmp(mid->name, block_buffer, strlen(mid->name)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 501) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 502) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 503) 	if (!mid->name[0]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 504) 		dev_err(&client->dev, "Unsupported device\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 505) 		return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 506) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 507) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 508) 	if (strcmp(client->name, mid->name) != 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 509) 		dev_notice(&client->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 510) 			   "Device mismatch: Configured %s, detected %s\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 511) 			   client->name, mid->name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 512) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 513) 	if (mid->driver_data == adm1272 || mid->driver_data == adm1278 ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 514) 	    mid->driver_data == adm1293 || mid->driver_data == adm1294)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 515) 		config_read_fn = i2c_smbus_read_word_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 516) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 517) 		config_read_fn = i2c_smbus_read_byte_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 518) 	config = config_read_fn(client, ADM1275_PMON_CONFIG);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 519) 	if (config < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 520) 		return config;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 521) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 522) 	device_config = config_read_fn(client, ADM1275_DEVICE_CONFIG);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 523) 	if (device_config < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 524) 		return device_config;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 525) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 526) 	data = devm_kzalloc(&client->dev, sizeof(struct adm1275_data),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 527) 			    GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 528) 	if (!data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 529) 		return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 530) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 531) 	if (of_property_read_u32(client->dev.of_node,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 532) 				 "shunt-resistor-micro-ohms", &shunt))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 533) 		shunt = 1000; /* 1 mOhm if not set via DT */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 534) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 535) 	if (shunt == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 536) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 537) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 538) 	data->id = mid->driver_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 539) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 540) 	info = &data->info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 541) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 542) 	info->pages = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 543) 	info->format[PSC_VOLTAGE_IN] = direct;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 544) 	info->format[PSC_VOLTAGE_OUT] = direct;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 545) 	info->format[PSC_CURRENT_OUT] = direct;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 546) 	info->format[PSC_POWER] = direct;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 547) 	info->format[PSC_TEMPERATURE] = direct;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 548) 	info->func[0] = PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 549) 			PMBUS_HAVE_SAMPLES;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 550) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 551) 	info->read_word_data = adm1275_read_word_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 552) 	info->read_byte_data = adm1275_read_byte_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 553) 	info->write_word_data = adm1275_write_word_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 554) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 555) 	switch (data->id) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 556) 	case adm1075:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 557) 		if (device_config & ADM1275_IOUT_WARN2_SELECT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 558) 			data->have_oc_fault = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 559) 		else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 560) 			data->have_uc_fault = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 561) 		data->have_pin_max = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 562) 		data->have_vaux_status = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 563) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 564) 		coefficients = adm1075_coefficients;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 565) 		vindex = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 566) 		switch (config & ADM1075_IRANGE_MASK) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 567) 		case ADM1075_IRANGE_25:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 568) 			cindex = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 569) 			pindex = 3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 570) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 571) 		case ADM1075_IRANGE_50:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 572) 			cindex = 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 573) 			pindex = 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 574) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 575) 		default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 576) 			dev_err(&client->dev, "Invalid input current range");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 577) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 578) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 579) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 580) 		info->func[0] |= PMBUS_HAVE_VIN | PMBUS_HAVE_PIN
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 581) 		  | PMBUS_HAVE_STATUS_INPUT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 582) 		if (config & ADM1275_VIN_VOUT_SELECT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 583) 			info->func[0] |=
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 584) 			  PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 585) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 586) 	case adm1272:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 587) 		data->have_vout = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 588) 		data->have_pin_max = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 589) 		data->have_temp_max = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 590) 		data->have_power_sampling = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 591) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 592) 		coefficients = adm1272_coefficients;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 593) 		vindex = (config & ADM1275_VRANGE) ? 1 : 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 594) 		cindex = (config & ADM1272_IRANGE) ? 3 : 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 595) 		/* pindex depends on the combination of the above */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 596) 		switch (config & (ADM1275_VRANGE | ADM1272_IRANGE)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 597) 		case 0:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 598) 		default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 599) 			pindex = 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 600) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 601) 		case ADM1275_VRANGE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 602) 			pindex = 5;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 603) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 604) 		case ADM1272_IRANGE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 605) 			pindex = 6;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 606) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 607) 		case ADM1275_VRANGE | ADM1272_IRANGE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 608) 			pindex = 7;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 609) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 610) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 611) 		tindex = 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 612) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 613) 		info->func[0] |= PMBUS_HAVE_PIN | PMBUS_HAVE_STATUS_INPUT |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 614) 			PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 615) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 616) 		/* Enable VOUT if not enabled (it is disabled by default) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 617) 		if (!(config & ADM1278_VOUT_EN)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 618) 			config |= ADM1278_VOUT_EN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 619) 			ret = i2c_smbus_write_byte_data(client,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 620) 							ADM1275_PMON_CONFIG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 621) 							config);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 622) 			if (ret < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 623) 				dev_err(&client->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 624) 					"Failed to enable VOUT monitoring\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 625) 				return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 626) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 627) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 628) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 629) 		if (config & ADM1278_TEMP1_EN)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 630) 			info->func[0] |=
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 631) 				PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 632) 		if (config & ADM1278_VIN_EN)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 633) 			info->func[0] |= PMBUS_HAVE_VIN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 634) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 635) 	case adm1275:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 636) 		if (device_config & ADM1275_IOUT_WARN2_SELECT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 637) 			data->have_oc_fault = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 638) 		else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 639) 			data->have_uc_fault = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 640) 		data->have_vout = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 641) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 642) 		coefficients = adm1275_coefficients;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 643) 		vindex = (config & ADM1275_VRANGE) ? 0 : 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 644) 		cindex = 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 645) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 646) 		if (config & ADM1275_VIN_VOUT_SELECT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 647) 			info->func[0] |=
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 648) 			  PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 649) 		else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 650) 			info->func[0] |=
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 651) 			  PMBUS_HAVE_VIN | PMBUS_HAVE_STATUS_INPUT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 652) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 653) 	case adm1276:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 654) 		if (device_config & ADM1275_IOUT_WARN2_SELECT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 655) 			data->have_oc_fault = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 656) 		else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 657) 			data->have_uc_fault = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 658) 		data->have_vout = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 659) 		data->have_pin_max = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 660) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 661) 		coefficients = adm1276_coefficients;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 662) 		vindex = (config & ADM1275_VRANGE) ? 0 : 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 663) 		cindex = 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 664) 		pindex = (config & ADM1275_VRANGE) ? 3 : 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 665) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 666) 		info->func[0] |= PMBUS_HAVE_VIN | PMBUS_HAVE_PIN
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 667) 		  | PMBUS_HAVE_STATUS_INPUT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 668) 		if (config & ADM1275_VIN_VOUT_SELECT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 669) 			info->func[0] |=
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 670) 			  PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 671) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 672) 	case adm1278:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 673) 		data->have_vout = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 674) 		data->have_pin_max = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 675) 		data->have_temp_max = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 676) 		data->have_power_sampling = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 677) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 678) 		coefficients = adm1278_coefficients;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 679) 		vindex = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 680) 		cindex = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 681) 		pindex = 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 682) 		tindex = 3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 683) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 684) 		info->func[0] |= PMBUS_HAVE_PIN | PMBUS_HAVE_STATUS_INPUT |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 685) 			PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 686) 			PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 687) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 688) 		/* Enable VOUT & TEMP1 if not enabled (disabled by default) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 689) 		if ((config & (ADM1278_VOUT_EN | ADM1278_TEMP1_EN)) !=
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 690) 		    (ADM1278_VOUT_EN | ADM1278_TEMP1_EN)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 691) 			config |= ADM1278_VOUT_EN | ADM1278_TEMP1_EN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 692) 			ret = i2c_smbus_write_byte_data(client,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 693) 							ADM1275_PMON_CONFIG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 694) 							config);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 695) 			if (ret < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 696) 				dev_err(&client->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 697) 					"Failed to enable VOUT monitoring\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 698) 				return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 699) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 700) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 701) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 702) 		if (config & ADM1278_VIN_EN)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 703) 			info->func[0] |= PMBUS_HAVE_VIN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 704) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 705) 	case adm1293:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 706) 	case adm1294:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 707) 		data->have_iout_min = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 708) 		data->have_pin_min = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 709) 		data->have_pin_max = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 710) 		data->have_mfr_vaux_status = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 711) 		data->have_power_sampling = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 712) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 713) 		coefficients = adm1293_coefficients;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 714) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 715) 		voindex = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 716) 		switch (config & ADM1293_VIN_SEL_MASK) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 717) 		case ADM1293_VIN_SEL_012:	/* 1.2V */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 718) 			vindex = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 719) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 720) 		case ADM1293_VIN_SEL_074:	/* 7.4V */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 721) 			vindex = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 722) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 723) 		case ADM1293_VIN_SEL_210:	/* 21V */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 724) 			vindex = 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 725) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 726) 		default:			/* disabled */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 727) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 728) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 729) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 730) 		switch (config & ADM1293_IRANGE_MASK) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 731) 		case ADM1293_IRANGE_25:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 732) 			cindex = 3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 733) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 734) 		case ADM1293_IRANGE_50:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 735) 			cindex = 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 736) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 737) 		case ADM1293_IRANGE_100:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 738) 			cindex = 5;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 739) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 740) 		case ADM1293_IRANGE_200:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 741) 			cindex = 6;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 742) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 743) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 744) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 745) 		if (vindex >= 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 746) 			pindex = 7 + vindex * 4 + (cindex - 3);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 747) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 748) 		if (config & ADM1293_VAUX_EN)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 749) 			info->func[0] |=
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 750) 				PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 751) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 752) 		info->func[0] |= PMBUS_HAVE_PIN |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 753) 			PMBUS_HAVE_VIN | PMBUS_HAVE_STATUS_INPUT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 754) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 755) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 756) 	default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 757) 		dev_err(&client->dev, "Unsupported device\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 758) 		return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 759) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 760) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 761) 	if (voindex < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 762) 		voindex = vindex;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 763) 	if (vindex >= 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 764) 		info->m[PSC_VOLTAGE_IN] = coefficients[vindex].m;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 765) 		info->b[PSC_VOLTAGE_IN] = coefficients[vindex].b;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 766) 		info->R[PSC_VOLTAGE_IN] = coefficients[vindex].R;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 767) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 768) 	if (voindex >= 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 769) 		info->m[PSC_VOLTAGE_OUT] = coefficients[voindex].m;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 770) 		info->b[PSC_VOLTAGE_OUT] = coefficients[voindex].b;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 771) 		info->R[PSC_VOLTAGE_OUT] = coefficients[voindex].R;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 772) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 773) 	if (cindex >= 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 774) 		/* Scale current with sense resistor value */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 775) 		info->m[PSC_CURRENT_OUT] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 776) 			coefficients[cindex].m * shunt / 1000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 777) 		info->b[PSC_CURRENT_OUT] = coefficients[cindex].b;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 778) 		info->R[PSC_CURRENT_OUT] = coefficients[cindex].R;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 779) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 780) 	if (pindex >= 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 781) 		info->m[PSC_POWER] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 782) 			coefficients[pindex].m * shunt / 1000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 783) 		info->b[PSC_POWER] = coefficients[pindex].b;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 784) 		info->R[PSC_POWER] = coefficients[pindex].R;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 785) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 786) 	if (tindex >= 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 787) 		info->m[PSC_TEMPERATURE] = coefficients[tindex].m;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 788) 		info->b[PSC_TEMPERATURE] = coefficients[tindex].b;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 789) 		info->R[PSC_TEMPERATURE] = coefficients[tindex].R;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 790) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 791) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 792) 	return pmbus_do_probe(client, info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 793) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 794) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 795) static struct i2c_driver adm1275_driver = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 796) 	.driver = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 797) 		   .name = "adm1275",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 798) 		   },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 799) 	.probe_new = adm1275_probe,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 800) 	.remove = pmbus_do_remove,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 801) 	.id_table = adm1275_id,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 802) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 803) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 804) module_i2c_driver(adm1275_driver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 805) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 806) MODULE_AUTHOR("Guenter Roeck");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 807) MODULE_DESCRIPTION("PMBus driver for Analog Devices ADM1275 and compatibles");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 808) MODULE_LICENSE("GPL");