11802d0beSThomas Gleixner // SPDX-License-Identifier: GPL-2.0-only
2b1eea857SAaron Lu /*
3b1eea857SAaron Lu * intel_pmic.c - Intel PMIC operation region driver
4b1eea857SAaron Lu *
5b1eea857SAaron Lu * Copyright (C) 2014 Intel Corporation. All rights reserved.
6b1eea857SAaron Lu */
7b1eea857SAaron Lu
86d3ef8d8SPaul Gortmaker #include <linux/export.h>
9b1eea857SAaron Lu #include <linux/acpi.h>
107b5618f4SHans de Goede #include <linux/mfd/intel_soc_pmic.h>
11b1eea857SAaron Lu #include <linux/regmap.h>
12ac586e2dSSrinivas Pandruvada #include <acpi/acpi_lpat.h>
13b1eea857SAaron Lu #include "intel_pmic.h"
14b1eea857SAaron Lu
15b1eea857SAaron Lu #define PMIC_POWER_OPREGION_ID 0x8d
16b1eea857SAaron Lu #define PMIC_THERMAL_OPREGION_ID 0x8c
170afa877aSFelipe Balbi #define PMIC_REGS_OPREGION_ID 0x8f
180afa877aSFelipe Balbi
190afa877aSFelipe Balbi struct intel_pmic_regs_handler_ctx {
200afa877aSFelipe Balbi unsigned int val;
210afa877aSFelipe Balbi u16 addr;
220afa877aSFelipe Balbi };
23b1eea857SAaron Lu
24b1eea857SAaron Lu struct intel_pmic_opregion {
25b1eea857SAaron Lu struct mutex lock;
26ac586e2dSSrinivas Pandruvada struct acpi_lpat_conversion_table *lpat_table;
27b1eea857SAaron Lu struct regmap *regmap;
28e172e650SHans de Goede const struct intel_pmic_opregion_data *data;
290afa877aSFelipe Balbi struct intel_pmic_regs_handler_ctx ctx;
30b1eea857SAaron Lu };
31b1eea857SAaron Lu
327b5618f4SHans de Goede static struct intel_pmic_opregion *intel_pmic_opregion;
337b5618f4SHans de Goede
pmic_get_reg_bit(int address,struct pmic_table * table,int count,int * reg,int * bit)34b1eea857SAaron Lu static int pmic_get_reg_bit(int address, struct pmic_table *table,
35b1eea857SAaron Lu int count, int *reg, int *bit)
36b1eea857SAaron Lu {
37b1eea857SAaron Lu int i;
38b1eea857SAaron Lu
39b1eea857SAaron Lu for (i = 0; i < count; i++) {
40b1eea857SAaron Lu if (table[i].address == address) {
41b1eea857SAaron Lu *reg = table[i].reg;
42b1eea857SAaron Lu if (bit)
43b1eea857SAaron Lu *bit = table[i].bit;
44b1eea857SAaron Lu return 0;
45b1eea857SAaron Lu }
46b1eea857SAaron Lu }
47b1eea857SAaron Lu return -ENOENT;
48b1eea857SAaron Lu }
49b1eea857SAaron Lu
intel_pmic_power_handler(u32 function,acpi_physical_address address,u32 bits,u64 * value64,void * handler_context,void * region_context)50b1eea857SAaron Lu static acpi_status intel_pmic_power_handler(u32 function,
51b1eea857SAaron Lu acpi_physical_address address, u32 bits, u64 *value64,
52b1eea857SAaron Lu void *handler_context, void *region_context)
53b1eea857SAaron Lu {
54b1eea857SAaron Lu struct intel_pmic_opregion *opregion = region_context;
55b1eea857SAaron Lu struct regmap *regmap = opregion->regmap;
56e172e650SHans de Goede const struct intel_pmic_opregion_data *d = opregion->data;
57b1eea857SAaron Lu int reg, bit, result;
58b1eea857SAaron Lu
59b1eea857SAaron Lu if (bits != 32 || !value64)
60b1eea857SAaron Lu return AE_BAD_PARAMETER;
61b1eea857SAaron Lu
62b1eea857SAaron Lu if (function == ACPI_WRITE && !(*value64 == 0 || *value64 == 1))
63b1eea857SAaron Lu return AE_BAD_PARAMETER;
64b1eea857SAaron Lu
65b1eea857SAaron Lu result = pmic_get_reg_bit(address, d->power_table,
66b1eea857SAaron Lu d->power_table_count, ®, &bit);
67b1eea857SAaron Lu if (result == -ENOENT)
68b1eea857SAaron Lu return AE_BAD_PARAMETER;
69b1eea857SAaron Lu
70b1eea857SAaron Lu mutex_lock(&opregion->lock);
71b1eea857SAaron Lu
72b1eea857SAaron Lu result = function == ACPI_READ ?
73b1eea857SAaron Lu d->get_power(regmap, reg, bit, value64) :
74b1eea857SAaron Lu d->update_power(regmap, reg, bit, *value64 == 1);
75b1eea857SAaron Lu
76b1eea857SAaron Lu mutex_unlock(&opregion->lock);
77b1eea857SAaron Lu
78b1eea857SAaron Lu return result ? AE_ERROR : AE_OK;
79b1eea857SAaron Lu }
80b1eea857SAaron Lu
pmic_read_temp(struct intel_pmic_opregion * opregion,int reg,u64 * value)81b1eea857SAaron Lu static int pmic_read_temp(struct intel_pmic_opregion *opregion,
82b1eea857SAaron Lu int reg, u64 *value)
83b1eea857SAaron Lu {
84b1eea857SAaron Lu int raw_temp, temp;
85b1eea857SAaron Lu
86b1eea857SAaron Lu if (!opregion->data->get_raw_temp)
87b1eea857SAaron Lu return -ENXIO;
88b1eea857SAaron Lu
89b1eea857SAaron Lu raw_temp = opregion->data->get_raw_temp(opregion->regmap, reg);
90b1eea857SAaron Lu if (raw_temp < 0)
91b1eea857SAaron Lu return raw_temp;
92b1eea857SAaron Lu
93ac586e2dSSrinivas Pandruvada if (!opregion->lpat_table) {
94b1eea857SAaron Lu *value = raw_temp;
95b1eea857SAaron Lu return 0;
96b1eea857SAaron Lu }
97b1eea857SAaron Lu
98*c5200609SHans de Goede temp = opregion->data->lpat_raw_to_temp(opregion->lpat_table, raw_temp);
99b1eea857SAaron Lu if (temp < 0)
100b1eea857SAaron Lu return temp;
101b1eea857SAaron Lu
102b1eea857SAaron Lu *value = temp;
103b1eea857SAaron Lu return 0;
104b1eea857SAaron Lu }
105b1eea857SAaron Lu
pmic_thermal_temp(struct intel_pmic_opregion * opregion,int reg,u32 function,u64 * value)106b1eea857SAaron Lu static int pmic_thermal_temp(struct intel_pmic_opregion *opregion, int reg,
107b1eea857SAaron Lu u32 function, u64 *value)
108b1eea857SAaron Lu {
109b1eea857SAaron Lu return function == ACPI_READ ?
110b1eea857SAaron Lu pmic_read_temp(opregion, reg, value) : -EINVAL;
111b1eea857SAaron Lu }
112b1eea857SAaron Lu
pmic_thermal_aux(struct intel_pmic_opregion * opregion,int reg,u32 function,u64 * value)113b1eea857SAaron Lu static int pmic_thermal_aux(struct intel_pmic_opregion *opregion, int reg,
114b1eea857SAaron Lu u32 function, u64 *value)
115b1eea857SAaron Lu {
116b1eea857SAaron Lu int raw_temp;
117b1eea857SAaron Lu
118b1eea857SAaron Lu if (function == ACPI_READ)
119b1eea857SAaron Lu return pmic_read_temp(opregion, reg, value);
120b1eea857SAaron Lu
121b1eea857SAaron Lu if (!opregion->data->update_aux)
122b1eea857SAaron Lu return -ENXIO;
123b1eea857SAaron Lu
124ac586e2dSSrinivas Pandruvada if (opregion->lpat_table) {
125ac586e2dSSrinivas Pandruvada raw_temp = acpi_lpat_temp_to_raw(opregion->lpat_table, *value);
126b1eea857SAaron Lu if (raw_temp < 0)
127b1eea857SAaron Lu return raw_temp;
128b1eea857SAaron Lu } else {
129b1eea857SAaron Lu raw_temp = *value;
130b1eea857SAaron Lu }
131b1eea857SAaron Lu
132b1eea857SAaron Lu return opregion->data->update_aux(opregion->regmap, reg, raw_temp);
133b1eea857SAaron Lu }
134b1eea857SAaron Lu
pmic_thermal_pen(struct intel_pmic_opregion * opregion,int reg,int bit,u32 function,u64 * value)135b1eea857SAaron Lu static int pmic_thermal_pen(struct intel_pmic_opregion *opregion, int reg,
136d8ba8191SBin Gao int bit, u32 function, u64 *value)
137b1eea857SAaron Lu {
138e172e650SHans de Goede const struct intel_pmic_opregion_data *d = opregion->data;
139b1eea857SAaron Lu struct regmap *regmap = opregion->regmap;
140b1eea857SAaron Lu
141b1eea857SAaron Lu if (!d->get_policy || !d->update_policy)
142b1eea857SAaron Lu return -ENXIO;
143b1eea857SAaron Lu
144b1eea857SAaron Lu if (function == ACPI_READ)
145d8ba8191SBin Gao return d->get_policy(regmap, reg, bit, value);
146b1eea857SAaron Lu
147b1eea857SAaron Lu if (*value != 0 && *value != 1)
148b1eea857SAaron Lu return -EINVAL;
149b1eea857SAaron Lu
150d8ba8191SBin Gao return d->update_policy(regmap, reg, bit, *value);
151b1eea857SAaron Lu }
152b1eea857SAaron Lu
pmic_thermal_is_temp(int address)153b1eea857SAaron Lu static bool pmic_thermal_is_temp(int address)
154b1eea857SAaron Lu {
155b1eea857SAaron Lu return (address <= 0x3c) && !(address % 12);
156b1eea857SAaron Lu }
157b1eea857SAaron Lu
pmic_thermal_is_aux(int address)158b1eea857SAaron Lu static bool pmic_thermal_is_aux(int address)
159b1eea857SAaron Lu {
160b1eea857SAaron Lu return (address >= 4 && address <= 0x40 && !((address - 4) % 12)) ||
161b1eea857SAaron Lu (address >= 8 && address <= 0x44 && !((address - 8) % 12));
162b1eea857SAaron Lu }
163b1eea857SAaron Lu
pmic_thermal_is_pen(int address)164b1eea857SAaron Lu static bool pmic_thermal_is_pen(int address)
165b1eea857SAaron Lu {
166b1eea857SAaron Lu return address >= 0x48 && address <= 0x5c;
167b1eea857SAaron Lu }
168b1eea857SAaron Lu
intel_pmic_thermal_handler(u32 function,acpi_physical_address address,u32 bits,u64 * value64,void * handler_context,void * region_context)169b1eea857SAaron Lu static acpi_status intel_pmic_thermal_handler(u32 function,
170b1eea857SAaron Lu acpi_physical_address address, u32 bits, u64 *value64,
171b1eea857SAaron Lu void *handler_context, void *region_context)
172b1eea857SAaron Lu {
173b1eea857SAaron Lu struct intel_pmic_opregion *opregion = region_context;
174e172e650SHans de Goede const struct intel_pmic_opregion_data *d = opregion->data;
175d8ba8191SBin Gao int reg, bit, result;
176b1eea857SAaron Lu
177b1eea857SAaron Lu if (bits != 32 || !value64)
178b1eea857SAaron Lu return AE_BAD_PARAMETER;
179b1eea857SAaron Lu
180b1eea857SAaron Lu result = pmic_get_reg_bit(address, d->thermal_table,
181d8ba8191SBin Gao d->thermal_table_count, ®, &bit);
182b1eea857SAaron Lu if (result == -ENOENT)
183b1eea857SAaron Lu return AE_BAD_PARAMETER;
184b1eea857SAaron Lu
185b1eea857SAaron Lu mutex_lock(&opregion->lock);
186b1eea857SAaron Lu
187b1eea857SAaron Lu if (pmic_thermal_is_temp(address))
188b1eea857SAaron Lu result = pmic_thermal_temp(opregion, reg, function, value64);
189b1eea857SAaron Lu else if (pmic_thermal_is_aux(address))
190b1eea857SAaron Lu result = pmic_thermal_aux(opregion, reg, function, value64);
191b1eea857SAaron Lu else if (pmic_thermal_is_pen(address))
192d8ba8191SBin Gao result = pmic_thermal_pen(opregion, reg, bit,
193d8ba8191SBin Gao function, value64);
194b1eea857SAaron Lu else
195b1eea857SAaron Lu result = -EINVAL;
196b1eea857SAaron Lu
197b1eea857SAaron Lu mutex_unlock(&opregion->lock);
198b1eea857SAaron Lu
199b1eea857SAaron Lu if (result < 0) {
200b1eea857SAaron Lu if (result == -EINVAL)
201b1eea857SAaron Lu return AE_BAD_PARAMETER;
202b1eea857SAaron Lu else
203b1eea857SAaron Lu return AE_ERROR;
204b1eea857SAaron Lu }
205b1eea857SAaron Lu
206b1eea857SAaron Lu return AE_OK;
207b1eea857SAaron Lu }
208b1eea857SAaron Lu
intel_pmic_regs_handler(u32 function,acpi_physical_address address,u32 bits,u64 * value64,void * handler_context,void * region_context)2090afa877aSFelipe Balbi static acpi_status intel_pmic_regs_handler(u32 function,
2100afa877aSFelipe Balbi acpi_physical_address address, u32 bits, u64 *value64,
2110afa877aSFelipe Balbi void *handler_context, void *region_context)
2120afa877aSFelipe Balbi {
2130afa877aSFelipe Balbi struct intel_pmic_opregion *opregion = region_context;
214009a7894SHans de Goede int result = -EINVAL;
2150afa877aSFelipe Balbi
216009a7894SHans de Goede if (function == ACPI_WRITE) {
2170afa877aSFelipe Balbi switch (address) {
2180afa877aSFelipe Balbi case 0:
2190afa877aSFelipe Balbi return AE_OK;
2200afa877aSFelipe Balbi case 1:
2210afa877aSFelipe Balbi opregion->ctx.addr |= (*value64 & 0xff) << 8;
2220afa877aSFelipe Balbi return AE_OK;
2230afa877aSFelipe Balbi case 2:
2240afa877aSFelipe Balbi opregion->ctx.addr |= *value64 & 0xff;
2250afa877aSFelipe Balbi return AE_OK;
2260afa877aSFelipe Balbi case 3:
2270afa877aSFelipe Balbi opregion->ctx.val = *value64 & 0xff;
2280afa877aSFelipe Balbi return AE_OK;
2290afa877aSFelipe Balbi case 4:
2300afa877aSFelipe Balbi if (*value64) {
2310afa877aSFelipe Balbi result = regmap_write(opregion->regmap, opregion->ctx.addr,
2320afa877aSFelipe Balbi opregion->ctx.val);
2330afa877aSFelipe Balbi } else {
2340afa877aSFelipe Balbi result = regmap_read(opregion->regmap, opregion->ctx.addr,
2350afa877aSFelipe Balbi &opregion->ctx.val);
2360afa877aSFelipe Balbi }
237009a7894SHans de Goede opregion->ctx.addr = 0;
238009a7894SHans de Goede }
239009a7894SHans de Goede }
240009a7894SHans de Goede
241009a7894SHans de Goede if (function == ACPI_READ && address == 3) {
242009a7894SHans de Goede *value64 = opregion->ctx.val;
243009a7894SHans de Goede return AE_OK;
2440afa877aSFelipe Balbi }
2450afa877aSFelipe Balbi
2460afa877aSFelipe Balbi if (result < 0) {
2470afa877aSFelipe Balbi if (result == -EINVAL)
2480afa877aSFelipe Balbi return AE_BAD_PARAMETER;
2490afa877aSFelipe Balbi else
2500afa877aSFelipe Balbi return AE_ERROR;
2510afa877aSFelipe Balbi }
2520afa877aSFelipe Balbi
2530afa877aSFelipe Balbi return AE_OK;
2540afa877aSFelipe Balbi }
2550afa877aSFelipe Balbi
intel_pmic_install_opregion_handler(struct device * dev,acpi_handle handle,struct regmap * regmap,const struct intel_pmic_opregion_data * d)256b1eea857SAaron Lu int intel_pmic_install_opregion_handler(struct device *dev, acpi_handle handle,
257b1eea857SAaron Lu struct regmap *regmap,
258e172e650SHans de Goede const struct intel_pmic_opregion_data *d)
259b1eea857SAaron Lu {
260a0fcfed1SHans de Goede acpi_status status = AE_OK;
261b1eea857SAaron Lu struct intel_pmic_opregion *opregion;
262ac586e2dSSrinivas Pandruvada int ret;
263b1eea857SAaron Lu
264b1eea857SAaron Lu if (!dev || !regmap || !d)
265b1eea857SAaron Lu return -EINVAL;
266b1eea857SAaron Lu
267b1eea857SAaron Lu if (!handle)
268b1eea857SAaron Lu return -ENODEV;
269b1eea857SAaron Lu
270b1eea857SAaron Lu opregion = devm_kzalloc(dev, sizeof(*opregion), GFP_KERNEL);
271b1eea857SAaron Lu if (!opregion)
272b1eea857SAaron Lu return -ENOMEM;
273b1eea857SAaron Lu
274b1eea857SAaron Lu mutex_init(&opregion->lock);
275b1eea857SAaron Lu opregion->regmap = regmap;
276ac586e2dSSrinivas Pandruvada opregion->lpat_table = acpi_lpat_get_conversion_table(handle);
277b1eea857SAaron Lu
278a0fcfed1SHans de Goede if (d->power_table_count)
279b1eea857SAaron Lu status = acpi_install_address_space_handler(handle,
280b1eea857SAaron Lu PMIC_POWER_OPREGION_ID,
281b1eea857SAaron Lu intel_pmic_power_handler,
282b1eea857SAaron Lu NULL, opregion);
283ac586e2dSSrinivas Pandruvada if (ACPI_FAILURE(status)) {
284ac586e2dSSrinivas Pandruvada ret = -ENODEV;
285ac586e2dSSrinivas Pandruvada goto out_error;
286ac586e2dSSrinivas Pandruvada }
287b1eea857SAaron Lu
288a0fcfed1SHans de Goede if (d->thermal_table_count)
289b1eea857SAaron Lu status = acpi_install_address_space_handler(handle,
290b1eea857SAaron Lu PMIC_THERMAL_OPREGION_ID,
291b1eea857SAaron Lu intel_pmic_thermal_handler,
292b1eea857SAaron Lu NULL, opregion);
293b1eea857SAaron Lu if (ACPI_FAILURE(status)) {
294ac586e2dSSrinivas Pandruvada ret = -ENODEV;
2950afa877aSFelipe Balbi goto out_remove_power_handler;
2960afa877aSFelipe Balbi }
2970afa877aSFelipe Balbi
2980afa877aSFelipe Balbi status = acpi_install_address_space_handler(handle,
2990afa877aSFelipe Balbi PMIC_REGS_OPREGION_ID, intel_pmic_regs_handler, NULL,
3000afa877aSFelipe Balbi opregion);
3010afa877aSFelipe Balbi if (ACPI_FAILURE(status)) {
3020afa877aSFelipe Balbi ret = -ENODEV;
3030afa877aSFelipe Balbi goto out_remove_thermal_handler;
304b1eea857SAaron Lu }
305b1eea857SAaron Lu
306b1eea857SAaron Lu opregion->data = d;
3077b5618f4SHans de Goede intel_pmic_opregion = opregion;
308b1eea857SAaron Lu return 0;
309ac586e2dSSrinivas Pandruvada
3100afa877aSFelipe Balbi out_remove_thermal_handler:
311a0fcfed1SHans de Goede if (d->thermal_table_count)
312a0fcfed1SHans de Goede acpi_remove_address_space_handler(handle,
313a0fcfed1SHans de Goede PMIC_THERMAL_OPREGION_ID,
3140afa877aSFelipe Balbi intel_pmic_thermal_handler);
3150afa877aSFelipe Balbi
3160afa877aSFelipe Balbi out_remove_power_handler:
317a0fcfed1SHans de Goede if (d->power_table_count)
318a0fcfed1SHans de Goede acpi_remove_address_space_handler(handle,
319a0fcfed1SHans de Goede PMIC_POWER_OPREGION_ID,
3200afa877aSFelipe Balbi intel_pmic_power_handler);
3210afa877aSFelipe Balbi
322ac586e2dSSrinivas Pandruvada out_error:
323ac586e2dSSrinivas Pandruvada acpi_lpat_free_conversion_table(opregion->lpat_table);
324ac586e2dSSrinivas Pandruvada return ret;
325b1eea857SAaron Lu }
326b1eea857SAaron Lu EXPORT_SYMBOL_GPL(intel_pmic_install_opregion_handler);
3277b5618f4SHans de Goede
3287b5618f4SHans de Goede /**
3297b5618f4SHans de Goede * intel_soc_pmic_exec_mipi_pmic_seq_element - Execute PMIC MIPI sequence
3307b5618f4SHans de Goede * @i2c_address: I2C client address for the PMIC
3317b5618f4SHans de Goede * @reg_address: PMIC register address
3327b5618f4SHans de Goede * @value: New value for the register bits to change
3337b5618f4SHans de Goede * @mask: Mask indicating which register bits to change
3347b5618f4SHans de Goede *
3357b5618f4SHans de Goede * DSI LCD panels describe an initialization sequence in the i915 VBT (Video
3367b5618f4SHans de Goede * BIOS Tables) using so called MIPI sequences. One possible element in these
3377b5618f4SHans de Goede * sequences is a PMIC specific element of 15 bytes.
3387b5618f4SHans de Goede *
3397b5618f4SHans de Goede * This function executes these PMIC specific elements sending the embedded
3407b5618f4SHans de Goede * commands to the PMIC.
3417b5618f4SHans de Goede *
3427b5618f4SHans de Goede * Return 0 on success, < 0 on failure.
3437b5618f4SHans de Goede */
intel_soc_pmic_exec_mipi_pmic_seq_element(u16 i2c_address,u32 reg_address,u32 value,u32 mask)3447b5618f4SHans de Goede int intel_soc_pmic_exec_mipi_pmic_seq_element(u16 i2c_address, u32 reg_address,
3457b5618f4SHans de Goede u32 value, u32 mask)
3467b5618f4SHans de Goede {
347e172e650SHans de Goede const struct intel_pmic_opregion_data *d;
3487b5618f4SHans de Goede int ret;
3497b5618f4SHans de Goede
3507b5618f4SHans de Goede if (!intel_pmic_opregion) {
3517b5618f4SHans de Goede pr_warn("%s: No PMIC registered\n", __func__);
3527b5618f4SHans de Goede return -ENXIO;
3537b5618f4SHans de Goede }
3547b5618f4SHans de Goede
3557b5618f4SHans de Goede d = intel_pmic_opregion->data;
3567b5618f4SHans de Goede
3577b5618f4SHans de Goede mutex_lock(&intel_pmic_opregion->lock);
3587b5618f4SHans de Goede
3597b5618f4SHans de Goede if (d->exec_mipi_pmic_seq_element) {
3607b5618f4SHans de Goede ret = d->exec_mipi_pmic_seq_element(intel_pmic_opregion->regmap,
3617b5618f4SHans de Goede i2c_address, reg_address,
3627b5618f4SHans de Goede value, mask);
363429188f0SHans de Goede } else if (d->pmic_i2c_address) {
364429188f0SHans de Goede if (i2c_address == d->pmic_i2c_address) {
365429188f0SHans de Goede ret = regmap_update_bits(intel_pmic_opregion->regmap,
366429188f0SHans de Goede reg_address, mask, value);
367429188f0SHans de Goede } else {
368429188f0SHans de Goede pr_err("%s: Unexpected i2c-addr: 0x%02x (reg-addr 0x%x value 0x%x mask 0x%x)\n",
369429188f0SHans de Goede __func__, i2c_address, reg_address, value, mask);
370429188f0SHans de Goede ret = -ENXIO;
371429188f0SHans de Goede }
3727b5618f4SHans de Goede } else {
3737b5618f4SHans de Goede pr_warn("%s: Not implemented\n", __func__);
3747b5618f4SHans de Goede pr_warn("%s: i2c-addr: 0x%x reg-addr 0x%x value 0x%x mask 0x%x\n",
3757b5618f4SHans de Goede __func__, i2c_address, reg_address, value, mask);
3767b5618f4SHans de Goede ret = -EOPNOTSUPP;
3777b5618f4SHans de Goede }
3787b5618f4SHans de Goede
3797b5618f4SHans de Goede mutex_unlock(&intel_pmic_opregion->lock);
3807b5618f4SHans de Goede
3817b5618f4SHans de Goede return ret;
3827b5618f4SHans de Goede }
3837b5618f4SHans de Goede EXPORT_SYMBOL_GPL(intel_soc_pmic_exec_mipi_pmic_seq_element);
384