Lines Matching +full:multi +full:- +full:phase
1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * Hardware monitoring driver for MPS Multi-phase Digital VR Controllers
46 return -ENODATA; in mp2888_read_byte_data()
57 * , bits 0-2. The value is selected as below: in mp2888_current_sense_gain_and_resolution_get()
58 * 00b - 5µA/A, 01b - 8.5µA/A, 10b - 9.7µA/A, 11b - 10µA/A. Other in mp2888_current_sense_gain_and_resolution_get()
67 data->curr_sense_gain = 85; in mp2888_current_sense_gain_and_resolution_get()
70 data->curr_sense_gain = 97; in mp2888_current_sense_gain_and_resolution_get()
73 data->curr_sense_gain = 100; in mp2888_current_sense_gain_and_resolution_get()
76 data->curr_sense_gain = 50; in mp2888_current_sense_gain_and_resolution_get()
79 return -EINVAL; in mp2888_current_sense_gain_and_resolution_get()
83 * Obtain resolution selector for total and phase current report and protection. in mp2888_current_sense_gain_and_resolution_get()
84 * 0: original resolution; 1: half resolution (in such case phase current value should in mp2888_current_sense_gain_and_resolution_get()
87 data->total_curr_resolution = (ret & MP2888_TOTAL_CURRENT_RESOLUTION) >> 3; in mp2888_current_sense_gain_and_resolution_get()
88 data->phase_curr_resolution = (ret & MP2888_PHASE_CURRENT_RESOLUTION) >> 4; in mp2888_current_sense_gain_and_resolution_get()
94 mp2888_read_phase(struct i2c_client *client, struct mp2888_data *data, int page, int phase, u8 reg) in mp2888_read_phase() argument
98 ret = pmbus_read_word_data(client, page, phase, reg); in mp2888_read_phase()
102 if (!((phase + 1) % 2)) in mp2888_read_phase()
109 * - Kcs is the DrMOS current sense gain of power stage, which is obtained from the in mp2888_read_phase()
110 * register MP2888_MFR_VR_CONFIG1, bits 13-12 with the following selection of DrMOS in mp2888_read_phase()
111 * (data->curr_sense_gain): in mp2888_read_phase()
112 * 00b - 5µA/A, 01b - 8.5µA/A, 10b - 9.7µA/A, 11b - 10µA/A. in mp2888_read_phase()
113 * - Rcs is the internal phase current sense resistor. This parameter depends on hardware in mp2888_read_phase()
116 * If phase current resolution bit is set to 1, READ_CSx value should be doubled. in mp2888_read_phase()
117 * Note, that current phase sensing, providing by the device is not accurate. This is in mp2888_read_phase()
121 ret = DIV_ROUND_CLOSEST(ret * 100 - 9800, data->curr_sense_gain); in mp2888_read_phase()
122 ret = (data->phase_curr_resolution) ? ret * 2 : ret; in mp2888_read_phase()
124 ret = (data->total_curr_resolution) ? ret * 8 : ret * 4; in mp2888_read_phase()
129 mp2888_read_phases(struct i2c_client *client, struct mp2888_data *data, int page, int phase) in mp2888_read_phases() argument
133 switch (phase) { in mp2888_read_phases()
135 ret = mp2888_read_phase(client, data, page, phase, MP2888_MFR_READ_CS1_2); in mp2888_read_phases()
138 ret = mp2888_read_phase(client, data, page, phase, MP2888_MFR_READ_CS3_4); in mp2888_read_phases()
141 ret = mp2888_read_phase(client, data, page, phase, MP2888_MFR_READ_CS5_6); in mp2888_read_phases()
144 ret = mp2888_read_phase(client, data, page, phase, MP2888_MFR_READ_CS7_8); in mp2888_read_phases()
147 ret = mp2888_read_phase(client, data, page, phase, MP2888_MFR_READ_CS9_10); in mp2888_read_phases()
150 return -ENODATA; in mp2888_read_phases()
155 static int mp2888_read_word_data(struct i2c_client *client, int page, int phase, int reg) in mp2888_read_word_data() argument
163 ret = pmbus_read_word_data(client, page, phase, reg); in mp2888_read_word_data()
175 ret = pmbus_read_word_data(client, page, phase, reg); in mp2888_read_word_data()
180 * degrees C - scaling is needed to match both. in mp2888_read_word_data()
185 if (phase != 0xff) in mp2888_read_word_data()
186 return mp2888_read_phases(client, data, page, phase); in mp2888_read_word_data()
188 ret = pmbus_read_word_data(client, page, phase, reg); in mp2888_read_word_data()
196 ret = data->total_curr_resolution ? ret * 2 : ret; in mp2888_read_word_data()
199 ret = pmbus_read_word_data(client, page, phase, reg); in mp2888_read_word_data()
208 ret = data->total_curr_resolution ? ret * 8 : ret * 4; in mp2888_read_word_data()
212 ret = pmbus_read_word_data(client, page, phase, reg); in mp2888_read_word_data()
215 ret = data->total_curr_resolution ? ret * 2 : ret; in mp2888_read_word_data()
218 ret = pmbus_read_word_data(client, page, phase, reg); in mp2888_read_word_data()
226 ret = data->total_curr_resolution ? ret * 4 : ret * 2; in mp2888_read_word_data()
230 * spec. Skip all of them to avoid exposing non-relevant inputs to sysfs. in mp2888_read_word_data()
256 return -ENXIO; in mp2888_read_word_data()
258 return -ENODATA; in mp2888_read_word_data()
277 word = data->total_curr_resolution ? DIV_ROUND_CLOSEST(word, 8) : in mp2888_write_word_data()
284 word = data->total_curr_resolution ? DIV_ROUND_CLOSEST(word, 4) : in mp2888_write_word_data()
290 return -ENODATA; in mp2888_write_word_data()
305 /* Identify multiphase number - could be from 1 to 10. */ in mp2888_identify_multiphase()
310 info->phases[0] = ret & GENMASK(3, 0); in mp2888_identify_multiphase()
313 * The device provides a total of 10 PWM pins, and can be configured to different phase in mp2888_identify_multiphase()
316 if (info->phases[0] > MP2888_MAX_PHASE) in mp2888_identify_multiphase()
317 return -EINVAL; in mp2888_identify_multiphase()
361 data = devm_kzalloc(&client->dev, sizeof(struct mp2888_data), GFP_KERNEL); in mp2888_probe()
363 return -ENOMEM; in mp2888_probe()
365 memcpy(&data->info, &mp2888_info, sizeof(*info)); in mp2888_probe()
366 info = &data->info; in mp2888_probe()