Lines Matching +full:function +full:- +full:mask
1 // SPDX-License-Identifier: GPL-2.0-only
3 * intel_pmic.c - Intel PMIC operation region driver
47 return -ENOENT; in pmic_get_reg_bit()
50 static acpi_status intel_pmic_power_handler(u32 function, in intel_pmic_power_handler() argument
55 struct regmap *regmap = opregion->regmap; in intel_pmic_power_handler()
56 const struct intel_pmic_opregion_data *d = opregion->data; in intel_pmic_power_handler()
62 if (function == ACPI_WRITE && !(*value64 == 0 || *value64 == 1)) in intel_pmic_power_handler()
65 result = pmic_get_reg_bit(address, d->power_table, in intel_pmic_power_handler()
66 d->power_table_count, ®, &bit); in intel_pmic_power_handler()
67 if (result == -ENOENT) in intel_pmic_power_handler()
70 mutex_lock(&opregion->lock); in intel_pmic_power_handler()
72 result = function == ACPI_READ ? in intel_pmic_power_handler()
73 d->get_power(regmap, reg, bit, value64) : in intel_pmic_power_handler()
74 d->update_power(regmap, reg, bit, *value64 == 1); in intel_pmic_power_handler()
76 mutex_unlock(&opregion->lock); in intel_pmic_power_handler()
86 if (!opregion->data->get_raw_temp) in pmic_read_temp()
87 return -ENXIO; in pmic_read_temp()
89 raw_temp = opregion->data->get_raw_temp(opregion->regmap, reg); in pmic_read_temp()
93 if (!opregion->lpat_table) { in pmic_read_temp()
98 temp = opregion->data->lpat_raw_to_temp(opregion->lpat_table, raw_temp); in pmic_read_temp()
107 u32 function, u64 *value) in pmic_thermal_temp() argument
109 return function == ACPI_READ ? in pmic_thermal_temp()
110 pmic_read_temp(opregion, reg, value) : -EINVAL; in pmic_thermal_temp()
114 u32 function, u64 *value) in pmic_thermal_aux() argument
118 if (function == ACPI_READ) in pmic_thermal_aux()
121 if (!opregion->data->update_aux) in pmic_thermal_aux()
122 return -ENXIO; in pmic_thermal_aux()
124 if (opregion->lpat_table) { in pmic_thermal_aux()
125 raw_temp = acpi_lpat_temp_to_raw(opregion->lpat_table, *value); in pmic_thermal_aux()
132 return opregion->data->update_aux(opregion->regmap, reg, raw_temp); in pmic_thermal_aux()
136 int bit, u32 function, u64 *value) in pmic_thermal_pen() argument
138 const struct intel_pmic_opregion_data *d = opregion->data; in pmic_thermal_pen()
139 struct regmap *regmap = opregion->regmap; in pmic_thermal_pen()
141 if (!d->get_policy || !d->update_policy) in pmic_thermal_pen()
142 return -ENXIO; in pmic_thermal_pen()
144 if (function == ACPI_READ) in pmic_thermal_pen()
145 return d->get_policy(regmap, reg, bit, value); in pmic_thermal_pen()
148 return -EINVAL; in pmic_thermal_pen()
150 return d->update_policy(regmap, reg, bit, *value); in pmic_thermal_pen()
160 return (address >= 4 && address <= 0x40 && !((address - 4) % 12)) || in pmic_thermal_is_aux()
161 (address >= 8 && address <= 0x44 && !((address - 8) % 12)); in pmic_thermal_is_aux()
169 static acpi_status intel_pmic_thermal_handler(u32 function, in intel_pmic_thermal_handler() argument
174 const struct intel_pmic_opregion_data *d = opregion->data; in intel_pmic_thermal_handler()
180 result = pmic_get_reg_bit(address, d->thermal_table, in intel_pmic_thermal_handler()
181 d->thermal_table_count, ®, &bit); in intel_pmic_thermal_handler()
182 if (result == -ENOENT) in intel_pmic_thermal_handler()
185 mutex_lock(&opregion->lock); in intel_pmic_thermal_handler()
188 result = pmic_thermal_temp(opregion, reg, function, value64); in intel_pmic_thermal_handler()
190 result = pmic_thermal_aux(opregion, reg, function, value64); in intel_pmic_thermal_handler()
193 function, value64); in intel_pmic_thermal_handler()
195 result = -EINVAL; in intel_pmic_thermal_handler()
197 mutex_unlock(&opregion->lock); in intel_pmic_thermal_handler()
200 if (result == -EINVAL) in intel_pmic_thermal_handler()
209 static acpi_status intel_pmic_regs_handler(u32 function, in intel_pmic_regs_handler() argument
214 int result = -EINVAL; in intel_pmic_regs_handler()
216 if (function == ACPI_WRITE) { in intel_pmic_regs_handler()
221 opregion->ctx.addr |= (*value64 & 0xff) << 8; in intel_pmic_regs_handler()
224 opregion->ctx.addr |= *value64 & 0xff; in intel_pmic_regs_handler()
227 opregion->ctx.val = *value64 & 0xff; in intel_pmic_regs_handler()
231 result = regmap_write(opregion->regmap, opregion->ctx.addr, in intel_pmic_regs_handler()
232 opregion->ctx.val); in intel_pmic_regs_handler()
234 result = regmap_read(opregion->regmap, opregion->ctx.addr, in intel_pmic_regs_handler()
235 &opregion->ctx.val); in intel_pmic_regs_handler()
237 opregion->ctx.addr = 0; in intel_pmic_regs_handler()
241 if (function == ACPI_READ && address == 3) { in intel_pmic_regs_handler()
242 *value64 = opregion->ctx.val; in intel_pmic_regs_handler()
247 if (result == -EINVAL) in intel_pmic_regs_handler()
265 return -EINVAL; in intel_pmic_install_opregion_handler()
268 return -ENODEV; in intel_pmic_install_opregion_handler()
272 return -ENOMEM; in intel_pmic_install_opregion_handler()
274 mutex_init(&opregion->lock); in intel_pmic_install_opregion_handler()
275 opregion->regmap = regmap; in intel_pmic_install_opregion_handler()
276 opregion->lpat_table = acpi_lpat_get_conversion_table(handle); in intel_pmic_install_opregion_handler()
278 if (d->power_table_count) in intel_pmic_install_opregion_handler()
284 ret = -ENODEV; in intel_pmic_install_opregion_handler()
288 if (d->thermal_table_count) in intel_pmic_install_opregion_handler()
294 ret = -ENODEV; in intel_pmic_install_opregion_handler()
302 ret = -ENODEV; in intel_pmic_install_opregion_handler()
306 opregion->data = d; in intel_pmic_install_opregion_handler()
311 if (d->thermal_table_count) in intel_pmic_install_opregion_handler()
317 if (d->power_table_count) in intel_pmic_install_opregion_handler()
323 acpi_lpat_free_conversion_table(opregion->lpat_table); in intel_pmic_install_opregion_handler()
329 * intel_soc_pmic_exec_mipi_pmic_seq_element - Execute PMIC MIPI sequence
333 * @mask: Mask indicating which register bits to change
339 * This function executes these PMIC specific elements sending the embedded
345 u32 value, u32 mask) in intel_soc_pmic_exec_mipi_pmic_seq_element() argument
352 return -ENXIO; in intel_soc_pmic_exec_mipi_pmic_seq_element()
355 d = intel_pmic_opregion->data; in intel_soc_pmic_exec_mipi_pmic_seq_element()
357 mutex_lock(&intel_pmic_opregion->lock); in intel_soc_pmic_exec_mipi_pmic_seq_element()
359 if (d->exec_mipi_pmic_seq_element) { in intel_soc_pmic_exec_mipi_pmic_seq_element()
360 ret = d->exec_mipi_pmic_seq_element(intel_pmic_opregion->regmap, in intel_soc_pmic_exec_mipi_pmic_seq_element()
362 value, mask); in intel_soc_pmic_exec_mipi_pmic_seq_element()
363 } else if (d->pmic_i2c_address) { in intel_soc_pmic_exec_mipi_pmic_seq_element()
364 if (i2c_address == d->pmic_i2c_address) { in intel_soc_pmic_exec_mipi_pmic_seq_element()
365 ret = regmap_update_bits(intel_pmic_opregion->regmap, in intel_soc_pmic_exec_mipi_pmic_seq_element()
366 reg_address, mask, value); in intel_soc_pmic_exec_mipi_pmic_seq_element()
368 pr_err("%s: Unexpected i2c-addr: 0x%02x (reg-addr 0x%x value 0x%x mask 0x%x)\n", in intel_soc_pmic_exec_mipi_pmic_seq_element()
369 __func__, i2c_address, reg_address, value, mask); in intel_soc_pmic_exec_mipi_pmic_seq_element()
370 ret = -ENXIO; in intel_soc_pmic_exec_mipi_pmic_seq_element()
374 pr_warn("%s: i2c-addr: 0x%x reg-addr 0x%x value 0x%x mask 0x%x\n", in intel_soc_pmic_exec_mipi_pmic_seq_element()
375 __func__, i2c_address, reg_address, value, mask); in intel_soc_pmic_exec_mipi_pmic_seq_element()
376 ret = -EOPNOTSUPP; in intel_soc_pmic_exec_mipi_pmic_seq_element()
379 mutex_unlock(&intel_pmic_opregion->lock); in intel_soc_pmic_exec_mipi_pmic_seq_element()