18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci * wm831x-core.c  --  Device access for Wolfson WM831x PMICs
48c2ecf20Sopenharmony_ci *
58c2ecf20Sopenharmony_ci * Copyright 2009 Wolfson Microelectronics PLC.
68c2ecf20Sopenharmony_ci *
78c2ecf20Sopenharmony_ci * Author: Mark Brown <broonie@opensource.wolfsonmicro.com>
88c2ecf20Sopenharmony_ci */
98c2ecf20Sopenharmony_ci
108c2ecf20Sopenharmony_ci#include <linux/kernel.h>
118c2ecf20Sopenharmony_ci#include <linux/init.h>
128c2ecf20Sopenharmony_ci#include <linux/export.h>
138c2ecf20Sopenharmony_ci#include <linux/bcd.h>
148c2ecf20Sopenharmony_ci#include <linux/delay.h>
158c2ecf20Sopenharmony_ci#include <linux/mfd/core.h>
168c2ecf20Sopenharmony_ci#include <linux/slab.h>
178c2ecf20Sopenharmony_ci#include <linux/err.h>
188c2ecf20Sopenharmony_ci#include <linux/of.h>
198c2ecf20Sopenharmony_ci#include <linux/of_device.h>
208c2ecf20Sopenharmony_ci
218c2ecf20Sopenharmony_ci#include <linux/mfd/wm831x/core.h>
228c2ecf20Sopenharmony_ci#include <linux/mfd/wm831x/pdata.h>
238c2ecf20Sopenharmony_ci#include <linux/mfd/wm831x/irq.h>
248c2ecf20Sopenharmony_ci#include <linux/mfd/wm831x/auxadc.h>
258c2ecf20Sopenharmony_ci#include <linux/mfd/wm831x/otp.h>
268c2ecf20Sopenharmony_ci#include <linux/mfd/wm831x/pmu.h>
278c2ecf20Sopenharmony_ci#include <linux/mfd/wm831x/regulator.h>
288c2ecf20Sopenharmony_ci
298c2ecf20Sopenharmony_ci/* Current settings - values are 2*2^(reg_val/4) microamps.  These are
308c2ecf20Sopenharmony_ci * exported since they are used by multiple drivers.
318c2ecf20Sopenharmony_ci */
328c2ecf20Sopenharmony_ciconst unsigned int wm831x_isinkv_values[WM831X_ISINK_MAX_ISEL + 1] = {
338c2ecf20Sopenharmony_ci	2,
348c2ecf20Sopenharmony_ci	2,
358c2ecf20Sopenharmony_ci	3,
368c2ecf20Sopenharmony_ci	3,
378c2ecf20Sopenharmony_ci	4,
388c2ecf20Sopenharmony_ci	5,
398c2ecf20Sopenharmony_ci	6,
408c2ecf20Sopenharmony_ci	7,
418c2ecf20Sopenharmony_ci	8,
428c2ecf20Sopenharmony_ci	10,
438c2ecf20Sopenharmony_ci	11,
448c2ecf20Sopenharmony_ci	13,
458c2ecf20Sopenharmony_ci	16,
468c2ecf20Sopenharmony_ci	19,
478c2ecf20Sopenharmony_ci	23,
488c2ecf20Sopenharmony_ci	27,
498c2ecf20Sopenharmony_ci	32,
508c2ecf20Sopenharmony_ci	38,
518c2ecf20Sopenharmony_ci	45,
528c2ecf20Sopenharmony_ci	54,
538c2ecf20Sopenharmony_ci	64,
548c2ecf20Sopenharmony_ci	76,
558c2ecf20Sopenharmony_ci	91,
568c2ecf20Sopenharmony_ci	108,
578c2ecf20Sopenharmony_ci	128,
588c2ecf20Sopenharmony_ci	152,
598c2ecf20Sopenharmony_ci	181,
608c2ecf20Sopenharmony_ci	215,
618c2ecf20Sopenharmony_ci	256,
628c2ecf20Sopenharmony_ci	304,
638c2ecf20Sopenharmony_ci	362,
648c2ecf20Sopenharmony_ci	431,
658c2ecf20Sopenharmony_ci	512,
668c2ecf20Sopenharmony_ci	609,
678c2ecf20Sopenharmony_ci	724,
688c2ecf20Sopenharmony_ci	861,
698c2ecf20Sopenharmony_ci	1024,
708c2ecf20Sopenharmony_ci	1218,
718c2ecf20Sopenharmony_ci	1448,
728c2ecf20Sopenharmony_ci	1722,
738c2ecf20Sopenharmony_ci	2048,
748c2ecf20Sopenharmony_ci	2435,
758c2ecf20Sopenharmony_ci	2896,
768c2ecf20Sopenharmony_ci	3444,
778c2ecf20Sopenharmony_ci	4096,
788c2ecf20Sopenharmony_ci	4871,
798c2ecf20Sopenharmony_ci	5793,
808c2ecf20Sopenharmony_ci	6889,
818c2ecf20Sopenharmony_ci	8192,
828c2ecf20Sopenharmony_ci	9742,
838c2ecf20Sopenharmony_ci	11585,
848c2ecf20Sopenharmony_ci	13777,
858c2ecf20Sopenharmony_ci	16384,
868c2ecf20Sopenharmony_ci	19484,
878c2ecf20Sopenharmony_ci	23170,
888c2ecf20Sopenharmony_ci	27554,
898c2ecf20Sopenharmony_ci};
908c2ecf20Sopenharmony_ciEXPORT_SYMBOL_GPL(wm831x_isinkv_values);
918c2ecf20Sopenharmony_ci
928c2ecf20Sopenharmony_cistatic int wm831x_reg_locked(struct wm831x *wm831x, unsigned short reg)
938c2ecf20Sopenharmony_ci{
948c2ecf20Sopenharmony_ci	if (!wm831x->locked)
958c2ecf20Sopenharmony_ci		return 0;
968c2ecf20Sopenharmony_ci
978c2ecf20Sopenharmony_ci	switch (reg) {
988c2ecf20Sopenharmony_ci	case WM831X_WATCHDOG:
998c2ecf20Sopenharmony_ci	case WM831X_DC4_CONTROL:
1008c2ecf20Sopenharmony_ci	case WM831X_ON_PIN_CONTROL:
1018c2ecf20Sopenharmony_ci	case WM831X_BACKUP_CHARGER_CONTROL:
1028c2ecf20Sopenharmony_ci	case WM831X_CHARGER_CONTROL_1:
1038c2ecf20Sopenharmony_ci	case WM831X_CHARGER_CONTROL_2:
1048c2ecf20Sopenharmony_ci		return 1;
1058c2ecf20Sopenharmony_ci
1068c2ecf20Sopenharmony_ci	default:
1078c2ecf20Sopenharmony_ci		return 0;
1088c2ecf20Sopenharmony_ci	}
1098c2ecf20Sopenharmony_ci}
1108c2ecf20Sopenharmony_ci
1118c2ecf20Sopenharmony_ci/**
1128c2ecf20Sopenharmony_ci * wm831x_reg_unlock: Unlock user keyed registers
1138c2ecf20Sopenharmony_ci *
1148c2ecf20Sopenharmony_ci * The WM831x has a user key preventing writes to particularly
1158c2ecf20Sopenharmony_ci * critical registers.  This function locks those registers,
1168c2ecf20Sopenharmony_ci * allowing writes to them.
1178c2ecf20Sopenharmony_ci *
1188c2ecf20Sopenharmony_ci * @wm831x: pointer to local driver data structure
1198c2ecf20Sopenharmony_ci */
1208c2ecf20Sopenharmony_civoid wm831x_reg_lock(struct wm831x *wm831x)
1218c2ecf20Sopenharmony_ci{
1228c2ecf20Sopenharmony_ci	int ret;
1238c2ecf20Sopenharmony_ci
1248c2ecf20Sopenharmony_ci	ret = wm831x_reg_write(wm831x, WM831X_SECURITY_KEY, 0);
1258c2ecf20Sopenharmony_ci	if (ret == 0) {
1268c2ecf20Sopenharmony_ci		dev_vdbg(wm831x->dev, "Registers locked\n");
1278c2ecf20Sopenharmony_ci
1288c2ecf20Sopenharmony_ci		mutex_lock(&wm831x->io_lock);
1298c2ecf20Sopenharmony_ci		WARN_ON(wm831x->locked);
1308c2ecf20Sopenharmony_ci		wm831x->locked = 1;
1318c2ecf20Sopenharmony_ci		mutex_unlock(&wm831x->io_lock);
1328c2ecf20Sopenharmony_ci	} else {
1338c2ecf20Sopenharmony_ci		dev_err(wm831x->dev, "Failed to lock registers: %d\n", ret);
1348c2ecf20Sopenharmony_ci	}
1358c2ecf20Sopenharmony_ci
1368c2ecf20Sopenharmony_ci}
1378c2ecf20Sopenharmony_ciEXPORT_SYMBOL_GPL(wm831x_reg_lock);
1388c2ecf20Sopenharmony_ci
1398c2ecf20Sopenharmony_ci/**
1408c2ecf20Sopenharmony_ci * wm831x_reg_unlock: Unlock user keyed registers
1418c2ecf20Sopenharmony_ci *
1428c2ecf20Sopenharmony_ci * The WM831x has a user key preventing writes to particularly
1438c2ecf20Sopenharmony_ci * critical registers.  This function locks those registers,
1448c2ecf20Sopenharmony_ci * preventing spurious writes.
1458c2ecf20Sopenharmony_ci *
1468c2ecf20Sopenharmony_ci * @wm831x: pointer to local driver data structure
1478c2ecf20Sopenharmony_ci */
1488c2ecf20Sopenharmony_ciint wm831x_reg_unlock(struct wm831x *wm831x)
1498c2ecf20Sopenharmony_ci{
1508c2ecf20Sopenharmony_ci	int ret;
1518c2ecf20Sopenharmony_ci
1528c2ecf20Sopenharmony_ci	/* 0x9716 is the value required to unlock the registers */
1538c2ecf20Sopenharmony_ci	ret = wm831x_reg_write(wm831x, WM831X_SECURITY_KEY, 0x9716);
1548c2ecf20Sopenharmony_ci	if (ret == 0) {
1558c2ecf20Sopenharmony_ci		dev_vdbg(wm831x->dev, "Registers unlocked\n");
1568c2ecf20Sopenharmony_ci
1578c2ecf20Sopenharmony_ci		mutex_lock(&wm831x->io_lock);
1588c2ecf20Sopenharmony_ci		WARN_ON(!wm831x->locked);
1598c2ecf20Sopenharmony_ci		wm831x->locked = 0;
1608c2ecf20Sopenharmony_ci		mutex_unlock(&wm831x->io_lock);
1618c2ecf20Sopenharmony_ci	}
1628c2ecf20Sopenharmony_ci
1638c2ecf20Sopenharmony_ci	return ret;
1648c2ecf20Sopenharmony_ci}
1658c2ecf20Sopenharmony_ciEXPORT_SYMBOL_GPL(wm831x_reg_unlock);
1668c2ecf20Sopenharmony_ci
1678c2ecf20Sopenharmony_cistatic bool wm831x_reg_readable(struct device *dev, unsigned int reg)
1688c2ecf20Sopenharmony_ci{
1698c2ecf20Sopenharmony_ci	switch (reg) {
1708c2ecf20Sopenharmony_ci	case WM831X_RESET_ID:
1718c2ecf20Sopenharmony_ci	case WM831X_REVISION:
1728c2ecf20Sopenharmony_ci	case WM831X_PARENT_ID:
1738c2ecf20Sopenharmony_ci	case WM831X_SYSVDD_CONTROL:
1748c2ecf20Sopenharmony_ci	case WM831X_THERMAL_MONITORING:
1758c2ecf20Sopenharmony_ci	case WM831X_POWER_STATE:
1768c2ecf20Sopenharmony_ci	case WM831X_WATCHDOG:
1778c2ecf20Sopenharmony_ci	case WM831X_ON_PIN_CONTROL:
1788c2ecf20Sopenharmony_ci	case WM831X_RESET_CONTROL:
1798c2ecf20Sopenharmony_ci	case WM831X_CONTROL_INTERFACE:
1808c2ecf20Sopenharmony_ci	case WM831X_SECURITY_KEY:
1818c2ecf20Sopenharmony_ci	case WM831X_SOFTWARE_SCRATCH:
1828c2ecf20Sopenharmony_ci	case WM831X_OTP_CONTROL:
1838c2ecf20Sopenharmony_ci	case WM831X_GPIO_LEVEL:
1848c2ecf20Sopenharmony_ci	case WM831X_SYSTEM_STATUS:
1858c2ecf20Sopenharmony_ci	case WM831X_ON_SOURCE:
1868c2ecf20Sopenharmony_ci	case WM831X_OFF_SOURCE:
1878c2ecf20Sopenharmony_ci	case WM831X_SYSTEM_INTERRUPTS:
1888c2ecf20Sopenharmony_ci	case WM831X_INTERRUPT_STATUS_1:
1898c2ecf20Sopenharmony_ci	case WM831X_INTERRUPT_STATUS_2:
1908c2ecf20Sopenharmony_ci	case WM831X_INTERRUPT_STATUS_3:
1918c2ecf20Sopenharmony_ci	case WM831X_INTERRUPT_STATUS_4:
1928c2ecf20Sopenharmony_ci	case WM831X_INTERRUPT_STATUS_5:
1938c2ecf20Sopenharmony_ci	case WM831X_IRQ_CONFIG:
1948c2ecf20Sopenharmony_ci	case WM831X_SYSTEM_INTERRUPTS_MASK:
1958c2ecf20Sopenharmony_ci	case WM831X_INTERRUPT_STATUS_1_MASK:
1968c2ecf20Sopenharmony_ci	case WM831X_INTERRUPT_STATUS_2_MASK:
1978c2ecf20Sopenharmony_ci	case WM831X_INTERRUPT_STATUS_3_MASK:
1988c2ecf20Sopenharmony_ci	case WM831X_INTERRUPT_STATUS_4_MASK:
1998c2ecf20Sopenharmony_ci	case WM831X_INTERRUPT_STATUS_5_MASK:
2008c2ecf20Sopenharmony_ci	case WM831X_RTC_WRITE_COUNTER:
2018c2ecf20Sopenharmony_ci	case WM831X_RTC_TIME_1:
2028c2ecf20Sopenharmony_ci	case WM831X_RTC_TIME_2:
2038c2ecf20Sopenharmony_ci	case WM831X_RTC_ALARM_1:
2048c2ecf20Sopenharmony_ci	case WM831X_RTC_ALARM_2:
2058c2ecf20Sopenharmony_ci	case WM831X_RTC_CONTROL:
2068c2ecf20Sopenharmony_ci	case WM831X_RTC_TRIM:
2078c2ecf20Sopenharmony_ci	case WM831X_TOUCH_CONTROL_1:
2088c2ecf20Sopenharmony_ci	case WM831X_TOUCH_CONTROL_2:
2098c2ecf20Sopenharmony_ci	case WM831X_TOUCH_DATA_X:
2108c2ecf20Sopenharmony_ci	case WM831X_TOUCH_DATA_Y:
2118c2ecf20Sopenharmony_ci	case WM831X_TOUCH_DATA_Z:
2128c2ecf20Sopenharmony_ci	case WM831X_AUXADC_DATA:
2138c2ecf20Sopenharmony_ci	case WM831X_AUXADC_CONTROL:
2148c2ecf20Sopenharmony_ci	case WM831X_AUXADC_SOURCE:
2158c2ecf20Sopenharmony_ci	case WM831X_COMPARATOR_CONTROL:
2168c2ecf20Sopenharmony_ci	case WM831X_COMPARATOR_1:
2178c2ecf20Sopenharmony_ci	case WM831X_COMPARATOR_2:
2188c2ecf20Sopenharmony_ci	case WM831X_COMPARATOR_3:
2198c2ecf20Sopenharmony_ci	case WM831X_COMPARATOR_4:
2208c2ecf20Sopenharmony_ci	case WM831X_GPIO1_CONTROL:
2218c2ecf20Sopenharmony_ci	case WM831X_GPIO2_CONTROL:
2228c2ecf20Sopenharmony_ci	case WM831X_GPIO3_CONTROL:
2238c2ecf20Sopenharmony_ci	case WM831X_GPIO4_CONTROL:
2248c2ecf20Sopenharmony_ci	case WM831X_GPIO5_CONTROL:
2258c2ecf20Sopenharmony_ci	case WM831X_GPIO6_CONTROL:
2268c2ecf20Sopenharmony_ci	case WM831X_GPIO7_CONTROL:
2278c2ecf20Sopenharmony_ci	case WM831X_GPIO8_CONTROL:
2288c2ecf20Sopenharmony_ci	case WM831X_GPIO9_CONTROL:
2298c2ecf20Sopenharmony_ci	case WM831X_GPIO10_CONTROL:
2308c2ecf20Sopenharmony_ci	case WM831X_GPIO11_CONTROL:
2318c2ecf20Sopenharmony_ci	case WM831X_GPIO12_CONTROL:
2328c2ecf20Sopenharmony_ci	case WM831X_GPIO13_CONTROL:
2338c2ecf20Sopenharmony_ci	case WM831X_GPIO14_CONTROL:
2348c2ecf20Sopenharmony_ci	case WM831X_GPIO15_CONTROL:
2358c2ecf20Sopenharmony_ci	case WM831X_GPIO16_CONTROL:
2368c2ecf20Sopenharmony_ci	case WM831X_CHARGER_CONTROL_1:
2378c2ecf20Sopenharmony_ci	case WM831X_CHARGER_CONTROL_2:
2388c2ecf20Sopenharmony_ci	case WM831X_CHARGER_STATUS:
2398c2ecf20Sopenharmony_ci	case WM831X_BACKUP_CHARGER_CONTROL:
2408c2ecf20Sopenharmony_ci	case WM831X_STATUS_LED_1:
2418c2ecf20Sopenharmony_ci	case WM831X_STATUS_LED_2:
2428c2ecf20Sopenharmony_ci	case WM831X_CURRENT_SINK_1:
2438c2ecf20Sopenharmony_ci	case WM831X_CURRENT_SINK_2:
2448c2ecf20Sopenharmony_ci	case WM831X_DCDC_ENABLE:
2458c2ecf20Sopenharmony_ci	case WM831X_LDO_ENABLE:
2468c2ecf20Sopenharmony_ci	case WM831X_DCDC_STATUS:
2478c2ecf20Sopenharmony_ci	case WM831X_LDO_STATUS:
2488c2ecf20Sopenharmony_ci	case WM831X_DCDC_UV_STATUS:
2498c2ecf20Sopenharmony_ci	case WM831X_LDO_UV_STATUS:
2508c2ecf20Sopenharmony_ci	case WM831X_DC1_CONTROL_1:
2518c2ecf20Sopenharmony_ci	case WM831X_DC1_CONTROL_2:
2528c2ecf20Sopenharmony_ci	case WM831X_DC1_ON_CONFIG:
2538c2ecf20Sopenharmony_ci	case WM831X_DC1_SLEEP_CONTROL:
2548c2ecf20Sopenharmony_ci	case WM831X_DC1_DVS_CONTROL:
2558c2ecf20Sopenharmony_ci	case WM831X_DC2_CONTROL_1:
2568c2ecf20Sopenharmony_ci	case WM831X_DC2_CONTROL_2:
2578c2ecf20Sopenharmony_ci	case WM831X_DC2_ON_CONFIG:
2588c2ecf20Sopenharmony_ci	case WM831X_DC2_SLEEP_CONTROL:
2598c2ecf20Sopenharmony_ci	case WM831X_DC2_DVS_CONTROL:
2608c2ecf20Sopenharmony_ci	case WM831X_DC3_CONTROL_1:
2618c2ecf20Sopenharmony_ci	case WM831X_DC3_CONTROL_2:
2628c2ecf20Sopenharmony_ci	case WM831X_DC3_ON_CONFIG:
2638c2ecf20Sopenharmony_ci	case WM831X_DC3_SLEEP_CONTROL:
2648c2ecf20Sopenharmony_ci	case WM831X_DC4_CONTROL:
2658c2ecf20Sopenharmony_ci	case WM831X_DC4_SLEEP_CONTROL:
2668c2ecf20Sopenharmony_ci	case WM831X_EPE1_CONTROL:
2678c2ecf20Sopenharmony_ci	case WM831X_EPE2_CONTROL:
2688c2ecf20Sopenharmony_ci	case WM831X_LDO1_CONTROL:
2698c2ecf20Sopenharmony_ci	case WM831X_LDO1_ON_CONTROL:
2708c2ecf20Sopenharmony_ci	case WM831X_LDO1_SLEEP_CONTROL:
2718c2ecf20Sopenharmony_ci	case WM831X_LDO2_CONTROL:
2728c2ecf20Sopenharmony_ci	case WM831X_LDO2_ON_CONTROL:
2738c2ecf20Sopenharmony_ci	case WM831X_LDO2_SLEEP_CONTROL:
2748c2ecf20Sopenharmony_ci	case WM831X_LDO3_CONTROL:
2758c2ecf20Sopenharmony_ci	case WM831X_LDO3_ON_CONTROL:
2768c2ecf20Sopenharmony_ci	case WM831X_LDO3_SLEEP_CONTROL:
2778c2ecf20Sopenharmony_ci	case WM831X_LDO4_CONTROL:
2788c2ecf20Sopenharmony_ci	case WM831X_LDO4_ON_CONTROL:
2798c2ecf20Sopenharmony_ci	case WM831X_LDO4_SLEEP_CONTROL:
2808c2ecf20Sopenharmony_ci	case WM831X_LDO5_CONTROL:
2818c2ecf20Sopenharmony_ci	case WM831X_LDO5_ON_CONTROL:
2828c2ecf20Sopenharmony_ci	case WM831X_LDO5_SLEEP_CONTROL:
2838c2ecf20Sopenharmony_ci	case WM831X_LDO6_CONTROL:
2848c2ecf20Sopenharmony_ci	case WM831X_LDO6_ON_CONTROL:
2858c2ecf20Sopenharmony_ci	case WM831X_LDO6_SLEEP_CONTROL:
2868c2ecf20Sopenharmony_ci	case WM831X_LDO7_CONTROL:
2878c2ecf20Sopenharmony_ci	case WM831X_LDO7_ON_CONTROL:
2888c2ecf20Sopenharmony_ci	case WM831X_LDO7_SLEEP_CONTROL:
2898c2ecf20Sopenharmony_ci	case WM831X_LDO8_CONTROL:
2908c2ecf20Sopenharmony_ci	case WM831X_LDO8_ON_CONTROL:
2918c2ecf20Sopenharmony_ci	case WM831X_LDO8_SLEEP_CONTROL:
2928c2ecf20Sopenharmony_ci	case WM831X_LDO9_CONTROL:
2938c2ecf20Sopenharmony_ci	case WM831X_LDO9_ON_CONTROL:
2948c2ecf20Sopenharmony_ci	case WM831X_LDO9_SLEEP_CONTROL:
2958c2ecf20Sopenharmony_ci	case WM831X_LDO10_CONTROL:
2968c2ecf20Sopenharmony_ci	case WM831X_LDO10_ON_CONTROL:
2978c2ecf20Sopenharmony_ci	case WM831X_LDO10_SLEEP_CONTROL:
2988c2ecf20Sopenharmony_ci	case WM831X_LDO11_ON_CONTROL:
2998c2ecf20Sopenharmony_ci	case WM831X_LDO11_SLEEP_CONTROL:
3008c2ecf20Sopenharmony_ci	case WM831X_POWER_GOOD_SOURCE_1:
3018c2ecf20Sopenharmony_ci	case WM831X_POWER_GOOD_SOURCE_2:
3028c2ecf20Sopenharmony_ci	case WM831X_CLOCK_CONTROL_1:
3038c2ecf20Sopenharmony_ci	case WM831X_CLOCK_CONTROL_2:
3048c2ecf20Sopenharmony_ci	case WM831X_FLL_CONTROL_1:
3058c2ecf20Sopenharmony_ci	case WM831X_FLL_CONTROL_2:
3068c2ecf20Sopenharmony_ci	case WM831X_FLL_CONTROL_3:
3078c2ecf20Sopenharmony_ci	case WM831X_FLL_CONTROL_4:
3088c2ecf20Sopenharmony_ci	case WM831X_FLL_CONTROL_5:
3098c2ecf20Sopenharmony_ci	case WM831X_UNIQUE_ID_1:
3108c2ecf20Sopenharmony_ci	case WM831X_UNIQUE_ID_2:
3118c2ecf20Sopenharmony_ci	case WM831X_UNIQUE_ID_3:
3128c2ecf20Sopenharmony_ci	case WM831X_UNIQUE_ID_4:
3138c2ecf20Sopenharmony_ci	case WM831X_UNIQUE_ID_5:
3148c2ecf20Sopenharmony_ci	case WM831X_UNIQUE_ID_6:
3158c2ecf20Sopenharmony_ci	case WM831X_UNIQUE_ID_7:
3168c2ecf20Sopenharmony_ci	case WM831X_UNIQUE_ID_8:
3178c2ecf20Sopenharmony_ci	case WM831X_FACTORY_OTP_ID:
3188c2ecf20Sopenharmony_ci	case WM831X_FACTORY_OTP_1:
3198c2ecf20Sopenharmony_ci	case WM831X_FACTORY_OTP_2:
3208c2ecf20Sopenharmony_ci	case WM831X_FACTORY_OTP_3:
3218c2ecf20Sopenharmony_ci	case WM831X_FACTORY_OTP_4:
3228c2ecf20Sopenharmony_ci	case WM831X_FACTORY_OTP_5:
3238c2ecf20Sopenharmony_ci	case WM831X_CUSTOMER_OTP_ID:
3248c2ecf20Sopenharmony_ci	case WM831X_DC1_OTP_CONTROL:
3258c2ecf20Sopenharmony_ci	case WM831X_DC2_OTP_CONTROL:
3268c2ecf20Sopenharmony_ci	case WM831X_DC3_OTP_CONTROL:
3278c2ecf20Sopenharmony_ci	case WM831X_LDO1_2_OTP_CONTROL:
3288c2ecf20Sopenharmony_ci	case WM831X_LDO3_4_OTP_CONTROL:
3298c2ecf20Sopenharmony_ci	case WM831X_LDO5_6_OTP_CONTROL:
3308c2ecf20Sopenharmony_ci	case WM831X_LDO7_8_OTP_CONTROL:
3318c2ecf20Sopenharmony_ci	case WM831X_LDO9_10_OTP_CONTROL:
3328c2ecf20Sopenharmony_ci	case WM831X_LDO11_EPE_CONTROL:
3338c2ecf20Sopenharmony_ci	case WM831X_GPIO1_OTP_CONTROL:
3348c2ecf20Sopenharmony_ci	case WM831X_GPIO2_OTP_CONTROL:
3358c2ecf20Sopenharmony_ci	case WM831X_GPIO3_OTP_CONTROL:
3368c2ecf20Sopenharmony_ci	case WM831X_GPIO4_OTP_CONTROL:
3378c2ecf20Sopenharmony_ci	case WM831X_GPIO5_OTP_CONTROL:
3388c2ecf20Sopenharmony_ci	case WM831X_GPIO6_OTP_CONTROL:
3398c2ecf20Sopenharmony_ci	case WM831X_DBE_CHECK_DATA:
3408c2ecf20Sopenharmony_ci		return true;
3418c2ecf20Sopenharmony_ci	default:
3428c2ecf20Sopenharmony_ci		return false;
3438c2ecf20Sopenharmony_ci	}
3448c2ecf20Sopenharmony_ci}
3458c2ecf20Sopenharmony_ci
3468c2ecf20Sopenharmony_cistatic bool wm831x_reg_writeable(struct device *dev, unsigned int reg)
3478c2ecf20Sopenharmony_ci{
3488c2ecf20Sopenharmony_ci	struct wm831x *wm831x = dev_get_drvdata(dev);
3498c2ecf20Sopenharmony_ci
3508c2ecf20Sopenharmony_ci	if (wm831x_reg_locked(wm831x, reg))
3518c2ecf20Sopenharmony_ci		return false;
3528c2ecf20Sopenharmony_ci
3538c2ecf20Sopenharmony_ci	switch (reg) {
3548c2ecf20Sopenharmony_ci	case WM831X_SYSVDD_CONTROL:
3558c2ecf20Sopenharmony_ci	case WM831X_THERMAL_MONITORING:
3568c2ecf20Sopenharmony_ci	case WM831X_POWER_STATE:
3578c2ecf20Sopenharmony_ci	case WM831X_WATCHDOG:
3588c2ecf20Sopenharmony_ci	case WM831X_ON_PIN_CONTROL:
3598c2ecf20Sopenharmony_ci	case WM831X_RESET_CONTROL:
3608c2ecf20Sopenharmony_ci	case WM831X_CONTROL_INTERFACE:
3618c2ecf20Sopenharmony_ci	case WM831X_SECURITY_KEY:
3628c2ecf20Sopenharmony_ci	case WM831X_SOFTWARE_SCRATCH:
3638c2ecf20Sopenharmony_ci	case WM831X_OTP_CONTROL:
3648c2ecf20Sopenharmony_ci	case WM831X_GPIO_LEVEL:
3658c2ecf20Sopenharmony_ci	case WM831X_INTERRUPT_STATUS_1:
3668c2ecf20Sopenharmony_ci	case WM831X_INTERRUPT_STATUS_2:
3678c2ecf20Sopenharmony_ci	case WM831X_INTERRUPT_STATUS_3:
3688c2ecf20Sopenharmony_ci	case WM831X_INTERRUPT_STATUS_4:
3698c2ecf20Sopenharmony_ci	case WM831X_INTERRUPT_STATUS_5:
3708c2ecf20Sopenharmony_ci	case WM831X_IRQ_CONFIG:
3718c2ecf20Sopenharmony_ci	case WM831X_SYSTEM_INTERRUPTS_MASK:
3728c2ecf20Sopenharmony_ci	case WM831X_INTERRUPT_STATUS_1_MASK:
3738c2ecf20Sopenharmony_ci	case WM831X_INTERRUPT_STATUS_2_MASK:
3748c2ecf20Sopenharmony_ci	case WM831X_INTERRUPT_STATUS_3_MASK:
3758c2ecf20Sopenharmony_ci	case WM831X_INTERRUPT_STATUS_4_MASK:
3768c2ecf20Sopenharmony_ci	case WM831X_INTERRUPT_STATUS_5_MASK:
3778c2ecf20Sopenharmony_ci	case WM831X_RTC_TIME_1:
3788c2ecf20Sopenharmony_ci	case WM831X_RTC_TIME_2:
3798c2ecf20Sopenharmony_ci	case WM831X_RTC_ALARM_1:
3808c2ecf20Sopenharmony_ci	case WM831X_RTC_ALARM_2:
3818c2ecf20Sopenharmony_ci	case WM831X_RTC_CONTROL:
3828c2ecf20Sopenharmony_ci	case WM831X_RTC_TRIM:
3838c2ecf20Sopenharmony_ci	case WM831X_TOUCH_CONTROL_1:
3848c2ecf20Sopenharmony_ci	case WM831X_TOUCH_CONTROL_2:
3858c2ecf20Sopenharmony_ci	case WM831X_AUXADC_CONTROL:
3868c2ecf20Sopenharmony_ci	case WM831X_AUXADC_SOURCE:
3878c2ecf20Sopenharmony_ci	case WM831X_COMPARATOR_CONTROL:
3888c2ecf20Sopenharmony_ci	case WM831X_COMPARATOR_1:
3898c2ecf20Sopenharmony_ci	case WM831X_COMPARATOR_2:
3908c2ecf20Sopenharmony_ci	case WM831X_COMPARATOR_3:
3918c2ecf20Sopenharmony_ci	case WM831X_COMPARATOR_4:
3928c2ecf20Sopenharmony_ci	case WM831X_GPIO1_CONTROL:
3938c2ecf20Sopenharmony_ci	case WM831X_GPIO2_CONTROL:
3948c2ecf20Sopenharmony_ci	case WM831X_GPIO3_CONTROL:
3958c2ecf20Sopenharmony_ci	case WM831X_GPIO4_CONTROL:
3968c2ecf20Sopenharmony_ci	case WM831X_GPIO5_CONTROL:
3978c2ecf20Sopenharmony_ci	case WM831X_GPIO6_CONTROL:
3988c2ecf20Sopenharmony_ci	case WM831X_GPIO7_CONTROL:
3998c2ecf20Sopenharmony_ci	case WM831X_GPIO8_CONTROL:
4008c2ecf20Sopenharmony_ci	case WM831X_GPIO9_CONTROL:
4018c2ecf20Sopenharmony_ci	case WM831X_GPIO10_CONTROL:
4028c2ecf20Sopenharmony_ci	case WM831X_GPIO11_CONTROL:
4038c2ecf20Sopenharmony_ci	case WM831X_GPIO12_CONTROL:
4048c2ecf20Sopenharmony_ci	case WM831X_GPIO13_CONTROL:
4058c2ecf20Sopenharmony_ci	case WM831X_GPIO14_CONTROL:
4068c2ecf20Sopenharmony_ci	case WM831X_GPIO15_CONTROL:
4078c2ecf20Sopenharmony_ci	case WM831X_GPIO16_CONTROL:
4088c2ecf20Sopenharmony_ci	case WM831X_CHARGER_CONTROL_1:
4098c2ecf20Sopenharmony_ci	case WM831X_CHARGER_CONTROL_2:
4108c2ecf20Sopenharmony_ci	case WM831X_CHARGER_STATUS:
4118c2ecf20Sopenharmony_ci	case WM831X_BACKUP_CHARGER_CONTROL:
4128c2ecf20Sopenharmony_ci	case WM831X_STATUS_LED_1:
4138c2ecf20Sopenharmony_ci	case WM831X_STATUS_LED_2:
4148c2ecf20Sopenharmony_ci	case WM831X_CURRENT_SINK_1:
4158c2ecf20Sopenharmony_ci	case WM831X_CURRENT_SINK_2:
4168c2ecf20Sopenharmony_ci	case WM831X_DCDC_ENABLE:
4178c2ecf20Sopenharmony_ci	case WM831X_LDO_ENABLE:
4188c2ecf20Sopenharmony_ci	case WM831X_DC1_CONTROL_1:
4198c2ecf20Sopenharmony_ci	case WM831X_DC1_CONTROL_2:
4208c2ecf20Sopenharmony_ci	case WM831X_DC1_ON_CONFIG:
4218c2ecf20Sopenharmony_ci	case WM831X_DC1_SLEEP_CONTROL:
4228c2ecf20Sopenharmony_ci	case WM831X_DC1_DVS_CONTROL:
4238c2ecf20Sopenharmony_ci	case WM831X_DC2_CONTROL_1:
4248c2ecf20Sopenharmony_ci	case WM831X_DC2_CONTROL_2:
4258c2ecf20Sopenharmony_ci	case WM831X_DC2_ON_CONFIG:
4268c2ecf20Sopenharmony_ci	case WM831X_DC2_SLEEP_CONTROL:
4278c2ecf20Sopenharmony_ci	case WM831X_DC2_DVS_CONTROL:
4288c2ecf20Sopenharmony_ci	case WM831X_DC3_CONTROL_1:
4298c2ecf20Sopenharmony_ci	case WM831X_DC3_CONTROL_2:
4308c2ecf20Sopenharmony_ci	case WM831X_DC3_ON_CONFIG:
4318c2ecf20Sopenharmony_ci	case WM831X_DC3_SLEEP_CONTROL:
4328c2ecf20Sopenharmony_ci	case WM831X_DC4_CONTROL:
4338c2ecf20Sopenharmony_ci	case WM831X_DC4_SLEEP_CONTROL:
4348c2ecf20Sopenharmony_ci	case WM831X_EPE1_CONTROL:
4358c2ecf20Sopenharmony_ci	case WM831X_EPE2_CONTROL:
4368c2ecf20Sopenharmony_ci	case WM831X_LDO1_CONTROL:
4378c2ecf20Sopenharmony_ci	case WM831X_LDO1_ON_CONTROL:
4388c2ecf20Sopenharmony_ci	case WM831X_LDO1_SLEEP_CONTROL:
4398c2ecf20Sopenharmony_ci	case WM831X_LDO2_CONTROL:
4408c2ecf20Sopenharmony_ci	case WM831X_LDO2_ON_CONTROL:
4418c2ecf20Sopenharmony_ci	case WM831X_LDO2_SLEEP_CONTROL:
4428c2ecf20Sopenharmony_ci	case WM831X_LDO3_CONTROL:
4438c2ecf20Sopenharmony_ci	case WM831X_LDO3_ON_CONTROL:
4448c2ecf20Sopenharmony_ci	case WM831X_LDO3_SLEEP_CONTROL:
4458c2ecf20Sopenharmony_ci	case WM831X_LDO4_CONTROL:
4468c2ecf20Sopenharmony_ci	case WM831X_LDO4_ON_CONTROL:
4478c2ecf20Sopenharmony_ci	case WM831X_LDO4_SLEEP_CONTROL:
4488c2ecf20Sopenharmony_ci	case WM831X_LDO5_CONTROL:
4498c2ecf20Sopenharmony_ci	case WM831X_LDO5_ON_CONTROL:
4508c2ecf20Sopenharmony_ci	case WM831X_LDO5_SLEEP_CONTROL:
4518c2ecf20Sopenharmony_ci	case WM831X_LDO6_CONTROL:
4528c2ecf20Sopenharmony_ci	case WM831X_LDO6_ON_CONTROL:
4538c2ecf20Sopenharmony_ci	case WM831X_LDO6_SLEEP_CONTROL:
4548c2ecf20Sopenharmony_ci	case WM831X_LDO7_CONTROL:
4558c2ecf20Sopenharmony_ci	case WM831X_LDO7_ON_CONTROL:
4568c2ecf20Sopenharmony_ci	case WM831X_LDO7_SLEEP_CONTROL:
4578c2ecf20Sopenharmony_ci	case WM831X_LDO8_CONTROL:
4588c2ecf20Sopenharmony_ci	case WM831X_LDO8_ON_CONTROL:
4598c2ecf20Sopenharmony_ci	case WM831X_LDO8_SLEEP_CONTROL:
4608c2ecf20Sopenharmony_ci	case WM831X_LDO9_CONTROL:
4618c2ecf20Sopenharmony_ci	case WM831X_LDO9_ON_CONTROL:
4628c2ecf20Sopenharmony_ci	case WM831X_LDO9_SLEEP_CONTROL:
4638c2ecf20Sopenharmony_ci	case WM831X_LDO10_CONTROL:
4648c2ecf20Sopenharmony_ci	case WM831X_LDO10_ON_CONTROL:
4658c2ecf20Sopenharmony_ci	case WM831X_LDO10_SLEEP_CONTROL:
4668c2ecf20Sopenharmony_ci	case WM831X_LDO11_ON_CONTROL:
4678c2ecf20Sopenharmony_ci	case WM831X_LDO11_SLEEP_CONTROL:
4688c2ecf20Sopenharmony_ci	case WM831X_POWER_GOOD_SOURCE_1:
4698c2ecf20Sopenharmony_ci	case WM831X_POWER_GOOD_SOURCE_2:
4708c2ecf20Sopenharmony_ci	case WM831X_CLOCK_CONTROL_1:
4718c2ecf20Sopenharmony_ci	case WM831X_CLOCK_CONTROL_2:
4728c2ecf20Sopenharmony_ci	case WM831X_FLL_CONTROL_1:
4738c2ecf20Sopenharmony_ci	case WM831X_FLL_CONTROL_2:
4748c2ecf20Sopenharmony_ci	case WM831X_FLL_CONTROL_3:
4758c2ecf20Sopenharmony_ci	case WM831X_FLL_CONTROL_4:
4768c2ecf20Sopenharmony_ci	case WM831X_FLL_CONTROL_5:
4778c2ecf20Sopenharmony_ci		return true;
4788c2ecf20Sopenharmony_ci	default:
4798c2ecf20Sopenharmony_ci		return false;
4808c2ecf20Sopenharmony_ci	}
4818c2ecf20Sopenharmony_ci}
4828c2ecf20Sopenharmony_ci
4838c2ecf20Sopenharmony_cistatic bool wm831x_reg_volatile(struct device *dev, unsigned int reg)
4848c2ecf20Sopenharmony_ci{
4858c2ecf20Sopenharmony_ci	switch (reg) {
4868c2ecf20Sopenharmony_ci	case WM831X_SYSTEM_STATUS:
4878c2ecf20Sopenharmony_ci	case WM831X_ON_SOURCE:
4888c2ecf20Sopenharmony_ci	case WM831X_OFF_SOURCE:
4898c2ecf20Sopenharmony_ci	case WM831X_GPIO_LEVEL:
4908c2ecf20Sopenharmony_ci	case WM831X_SYSTEM_INTERRUPTS:
4918c2ecf20Sopenharmony_ci	case WM831X_INTERRUPT_STATUS_1:
4928c2ecf20Sopenharmony_ci	case WM831X_INTERRUPT_STATUS_2:
4938c2ecf20Sopenharmony_ci	case WM831X_INTERRUPT_STATUS_3:
4948c2ecf20Sopenharmony_ci	case WM831X_INTERRUPT_STATUS_4:
4958c2ecf20Sopenharmony_ci	case WM831X_INTERRUPT_STATUS_5:
4968c2ecf20Sopenharmony_ci	case WM831X_RTC_TIME_1:
4978c2ecf20Sopenharmony_ci	case WM831X_RTC_TIME_2:
4988c2ecf20Sopenharmony_ci	case WM831X_TOUCH_DATA_X:
4998c2ecf20Sopenharmony_ci	case WM831X_TOUCH_DATA_Y:
5008c2ecf20Sopenharmony_ci	case WM831X_TOUCH_DATA_Z:
5018c2ecf20Sopenharmony_ci	case WM831X_AUXADC_DATA:
5028c2ecf20Sopenharmony_ci	case WM831X_CHARGER_STATUS:
5038c2ecf20Sopenharmony_ci	case WM831X_DCDC_STATUS:
5048c2ecf20Sopenharmony_ci	case WM831X_LDO_STATUS:
5058c2ecf20Sopenharmony_ci	case WM831X_DCDC_UV_STATUS:
5068c2ecf20Sopenharmony_ci	case WM831X_LDO_UV_STATUS:
5078c2ecf20Sopenharmony_ci		return true;
5088c2ecf20Sopenharmony_ci	default:
5098c2ecf20Sopenharmony_ci		return false;
5108c2ecf20Sopenharmony_ci	}
5118c2ecf20Sopenharmony_ci}
5128c2ecf20Sopenharmony_ci
5138c2ecf20Sopenharmony_ci/**
5148c2ecf20Sopenharmony_ci * wm831x_reg_read: Read a single WM831x register.
5158c2ecf20Sopenharmony_ci *
5168c2ecf20Sopenharmony_ci * @wm831x: Device to read from.
5178c2ecf20Sopenharmony_ci * @reg: Register to read.
5188c2ecf20Sopenharmony_ci */
5198c2ecf20Sopenharmony_ciint wm831x_reg_read(struct wm831x *wm831x, unsigned short reg)
5208c2ecf20Sopenharmony_ci{
5218c2ecf20Sopenharmony_ci	unsigned int val;
5228c2ecf20Sopenharmony_ci	int ret;
5238c2ecf20Sopenharmony_ci
5248c2ecf20Sopenharmony_ci	ret = regmap_read(wm831x->regmap, reg, &val);
5258c2ecf20Sopenharmony_ci
5268c2ecf20Sopenharmony_ci	if (ret < 0)
5278c2ecf20Sopenharmony_ci		return ret;
5288c2ecf20Sopenharmony_ci	else
5298c2ecf20Sopenharmony_ci		return val;
5308c2ecf20Sopenharmony_ci}
5318c2ecf20Sopenharmony_ciEXPORT_SYMBOL_GPL(wm831x_reg_read);
5328c2ecf20Sopenharmony_ci
5338c2ecf20Sopenharmony_ci/**
5348c2ecf20Sopenharmony_ci * wm831x_bulk_read: Read multiple WM831x registers
5358c2ecf20Sopenharmony_ci *
5368c2ecf20Sopenharmony_ci * @wm831x: Device to read from
5378c2ecf20Sopenharmony_ci * @reg: First register
5388c2ecf20Sopenharmony_ci * @count: Number of registers
5398c2ecf20Sopenharmony_ci * @buf: Buffer to fill.
5408c2ecf20Sopenharmony_ci */
5418c2ecf20Sopenharmony_ciint wm831x_bulk_read(struct wm831x *wm831x, unsigned short reg,
5428c2ecf20Sopenharmony_ci		     int count, u16 *buf)
5438c2ecf20Sopenharmony_ci{
5448c2ecf20Sopenharmony_ci	return regmap_bulk_read(wm831x->regmap, reg, buf, count);
5458c2ecf20Sopenharmony_ci}
5468c2ecf20Sopenharmony_ciEXPORT_SYMBOL_GPL(wm831x_bulk_read);
5478c2ecf20Sopenharmony_ci
5488c2ecf20Sopenharmony_cistatic int wm831x_write(struct wm831x *wm831x, unsigned short reg,
5498c2ecf20Sopenharmony_ci			int bytes, void *src)
5508c2ecf20Sopenharmony_ci{
5518c2ecf20Sopenharmony_ci	u16 *buf = src;
5528c2ecf20Sopenharmony_ci	int i, ret;
5538c2ecf20Sopenharmony_ci
5548c2ecf20Sopenharmony_ci	BUG_ON(bytes % 2);
5558c2ecf20Sopenharmony_ci	BUG_ON(bytes <= 0);
5568c2ecf20Sopenharmony_ci
5578c2ecf20Sopenharmony_ci	for (i = 0; i < bytes / 2; i++) {
5588c2ecf20Sopenharmony_ci		if (wm831x_reg_locked(wm831x, reg))
5598c2ecf20Sopenharmony_ci			return -EPERM;
5608c2ecf20Sopenharmony_ci
5618c2ecf20Sopenharmony_ci		dev_vdbg(wm831x->dev, "Write %04x to R%d(0x%x)\n",
5628c2ecf20Sopenharmony_ci			 buf[i], reg + i, reg + i);
5638c2ecf20Sopenharmony_ci		ret = regmap_write(wm831x->regmap, reg + i, buf[i]);
5648c2ecf20Sopenharmony_ci		if (ret != 0)
5658c2ecf20Sopenharmony_ci			return ret;
5668c2ecf20Sopenharmony_ci	}
5678c2ecf20Sopenharmony_ci
5688c2ecf20Sopenharmony_ci	return 0;
5698c2ecf20Sopenharmony_ci}
5708c2ecf20Sopenharmony_ci
5718c2ecf20Sopenharmony_ci/**
5728c2ecf20Sopenharmony_ci * wm831x_reg_write: Write a single WM831x register.
5738c2ecf20Sopenharmony_ci *
5748c2ecf20Sopenharmony_ci * @wm831x: Device to write to.
5758c2ecf20Sopenharmony_ci * @reg: Register to write to.
5768c2ecf20Sopenharmony_ci * @val: Value to write.
5778c2ecf20Sopenharmony_ci */
5788c2ecf20Sopenharmony_ciint wm831x_reg_write(struct wm831x *wm831x, unsigned short reg,
5798c2ecf20Sopenharmony_ci		     unsigned short val)
5808c2ecf20Sopenharmony_ci{
5818c2ecf20Sopenharmony_ci	int ret;
5828c2ecf20Sopenharmony_ci
5838c2ecf20Sopenharmony_ci	mutex_lock(&wm831x->io_lock);
5848c2ecf20Sopenharmony_ci
5858c2ecf20Sopenharmony_ci	ret = wm831x_write(wm831x, reg, 2, &val);
5868c2ecf20Sopenharmony_ci
5878c2ecf20Sopenharmony_ci	mutex_unlock(&wm831x->io_lock);
5888c2ecf20Sopenharmony_ci
5898c2ecf20Sopenharmony_ci	return ret;
5908c2ecf20Sopenharmony_ci}
5918c2ecf20Sopenharmony_ciEXPORT_SYMBOL_GPL(wm831x_reg_write);
5928c2ecf20Sopenharmony_ci
5938c2ecf20Sopenharmony_ci/**
5948c2ecf20Sopenharmony_ci * wm831x_set_bits: Set the value of a bitfield in a WM831x register
5958c2ecf20Sopenharmony_ci *
5968c2ecf20Sopenharmony_ci * @wm831x: Device to write to.
5978c2ecf20Sopenharmony_ci * @reg: Register to write to.
5988c2ecf20Sopenharmony_ci * @mask: Mask of bits to set.
5998c2ecf20Sopenharmony_ci * @val: Value to set (unshifted)
6008c2ecf20Sopenharmony_ci */
6018c2ecf20Sopenharmony_ciint wm831x_set_bits(struct wm831x *wm831x, unsigned short reg,
6028c2ecf20Sopenharmony_ci		    unsigned short mask, unsigned short val)
6038c2ecf20Sopenharmony_ci{
6048c2ecf20Sopenharmony_ci	int ret;
6058c2ecf20Sopenharmony_ci
6068c2ecf20Sopenharmony_ci	mutex_lock(&wm831x->io_lock);
6078c2ecf20Sopenharmony_ci
6088c2ecf20Sopenharmony_ci	if (!wm831x_reg_locked(wm831x, reg))
6098c2ecf20Sopenharmony_ci		ret = regmap_update_bits(wm831x->regmap, reg, mask, val);
6108c2ecf20Sopenharmony_ci	else
6118c2ecf20Sopenharmony_ci		ret = -EPERM;
6128c2ecf20Sopenharmony_ci
6138c2ecf20Sopenharmony_ci	mutex_unlock(&wm831x->io_lock);
6148c2ecf20Sopenharmony_ci
6158c2ecf20Sopenharmony_ci	return ret;
6168c2ecf20Sopenharmony_ci}
6178c2ecf20Sopenharmony_ciEXPORT_SYMBOL_GPL(wm831x_set_bits);
6188c2ecf20Sopenharmony_ci
6198c2ecf20Sopenharmony_cistatic struct resource wm831x_dcdc1_resources[] = {
6208c2ecf20Sopenharmony_ci	{
6218c2ecf20Sopenharmony_ci		.start = WM831X_DC1_CONTROL_1,
6228c2ecf20Sopenharmony_ci		.end   = WM831X_DC1_DVS_CONTROL,
6238c2ecf20Sopenharmony_ci		.flags = IORESOURCE_REG,
6248c2ecf20Sopenharmony_ci	},
6258c2ecf20Sopenharmony_ci	{
6268c2ecf20Sopenharmony_ci		.name  = "UV",
6278c2ecf20Sopenharmony_ci		.start = WM831X_IRQ_UV_DC1,
6288c2ecf20Sopenharmony_ci		.end   = WM831X_IRQ_UV_DC1,
6298c2ecf20Sopenharmony_ci		.flags = IORESOURCE_IRQ,
6308c2ecf20Sopenharmony_ci	},
6318c2ecf20Sopenharmony_ci	{
6328c2ecf20Sopenharmony_ci		.name  = "HC",
6338c2ecf20Sopenharmony_ci		.start = WM831X_IRQ_HC_DC1,
6348c2ecf20Sopenharmony_ci		.end   = WM831X_IRQ_HC_DC1,
6358c2ecf20Sopenharmony_ci		.flags = IORESOURCE_IRQ,
6368c2ecf20Sopenharmony_ci	},
6378c2ecf20Sopenharmony_ci};
6388c2ecf20Sopenharmony_ci
6398c2ecf20Sopenharmony_ci
6408c2ecf20Sopenharmony_cistatic struct resource wm831x_dcdc2_resources[] = {
6418c2ecf20Sopenharmony_ci	{
6428c2ecf20Sopenharmony_ci		.start = WM831X_DC2_CONTROL_1,
6438c2ecf20Sopenharmony_ci		.end   = WM831X_DC2_DVS_CONTROL,
6448c2ecf20Sopenharmony_ci		.flags = IORESOURCE_REG,
6458c2ecf20Sopenharmony_ci	},
6468c2ecf20Sopenharmony_ci	{
6478c2ecf20Sopenharmony_ci		.name  = "UV",
6488c2ecf20Sopenharmony_ci		.start = WM831X_IRQ_UV_DC2,
6498c2ecf20Sopenharmony_ci		.end   = WM831X_IRQ_UV_DC2,
6508c2ecf20Sopenharmony_ci		.flags = IORESOURCE_IRQ,
6518c2ecf20Sopenharmony_ci	},
6528c2ecf20Sopenharmony_ci	{
6538c2ecf20Sopenharmony_ci		.name  = "HC",
6548c2ecf20Sopenharmony_ci		.start = WM831X_IRQ_HC_DC2,
6558c2ecf20Sopenharmony_ci		.end   = WM831X_IRQ_HC_DC2,
6568c2ecf20Sopenharmony_ci		.flags = IORESOURCE_IRQ,
6578c2ecf20Sopenharmony_ci	},
6588c2ecf20Sopenharmony_ci};
6598c2ecf20Sopenharmony_ci
6608c2ecf20Sopenharmony_cistatic struct resource wm831x_dcdc3_resources[] = {
6618c2ecf20Sopenharmony_ci	{
6628c2ecf20Sopenharmony_ci		.start = WM831X_DC3_CONTROL_1,
6638c2ecf20Sopenharmony_ci		.end   = WM831X_DC3_SLEEP_CONTROL,
6648c2ecf20Sopenharmony_ci		.flags = IORESOURCE_REG,
6658c2ecf20Sopenharmony_ci	},
6668c2ecf20Sopenharmony_ci	{
6678c2ecf20Sopenharmony_ci		.name  = "UV",
6688c2ecf20Sopenharmony_ci		.start = WM831X_IRQ_UV_DC3,
6698c2ecf20Sopenharmony_ci		.end   = WM831X_IRQ_UV_DC3,
6708c2ecf20Sopenharmony_ci		.flags = IORESOURCE_IRQ,
6718c2ecf20Sopenharmony_ci	},
6728c2ecf20Sopenharmony_ci};
6738c2ecf20Sopenharmony_ci
6748c2ecf20Sopenharmony_cistatic struct resource wm831x_dcdc4_resources[] = {
6758c2ecf20Sopenharmony_ci	{
6768c2ecf20Sopenharmony_ci		.start = WM831X_DC4_CONTROL,
6778c2ecf20Sopenharmony_ci		.end   = WM831X_DC4_SLEEP_CONTROL,
6788c2ecf20Sopenharmony_ci		.flags = IORESOURCE_REG,
6798c2ecf20Sopenharmony_ci	},
6808c2ecf20Sopenharmony_ci	{
6818c2ecf20Sopenharmony_ci		.name  = "UV",
6828c2ecf20Sopenharmony_ci		.start = WM831X_IRQ_UV_DC4,
6838c2ecf20Sopenharmony_ci		.end   = WM831X_IRQ_UV_DC4,
6848c2ecf20Sopenharmony_ci		.flags = IORESOURCE_IRQ,
6858c2ecf20Sopenharmony_ci	},
6868c2ecf20Sopenharmony_ci};
6878c2ecf20Sopenharmony_ci
6888c2ecf20Sopenharmony_cistatic struct resource wm8320_dcdc4_buck_resources[] = {
6898c2ecf20Sopenharmony_ci	{
6908c2ecf20Sopenharmony_ci		.start = WM831X_DC4_CONTROL,
6918c2ecf20Sopenharmony_ci		.end   = WM832X_DC4_SLEEP_CONTROL,
6928c2ecf20Sopenharmony_ci		.flags = IORESOURCE_REG,
6938c2ecf20Sopenharmony_ci	},
6948c2ecf20Sopenharmony_ci	{
6958c2ecf20Sopenharmony_ci		.name  = "UV",
6968c2ecf20Sopenharmony_ci		.start = WM831X_IRQ_UV_DC4,
6978c2ecf20Sopenharmony_ci		.end   = WM831X_IRQ_UV_DC4,
6988c2ecf20Sopenharmony_ci		.flags = IORESOURCE_IRQ,
6998c2ecf20Sopenharmony_ci	},
7008c2ecf20Sopenharmony_ci};
7018c2ecf20Sopenharmony_ci
7028c2ecf20Sopenharmony_cistatic struct resource wm831x_gpio_resources[] = {
7038c2ecf20Sopenharmony_ci	{
7048c2ecf20Sopenharmony_ci		.start = WM831X_IRQ_GPIO_1,
7058c2ecf20Sopenharmony_ci		.end   = WM831X_IRQ_GPIO_16,
7068c2ecf20Sopenharmony_ci		.flags = IORESOURCE_IRQ,
7078c2ecf20Sopenharmony_ci	},
7088c2ecf20Sopenharmony_ci};
7098c2ecf20Sopenharmony_ci
7108c2ecf20Sopenharmony_cistatic struct resource wm831x_isink1_resources[] = {
7118c2ecf20Sopenharmony_ci	{
7128c2ecf20Sopenharmony_ci		.start = WM831X_CURRENT_SINK_1,
7138c2ecf20Sopenharmony_ci		.end   = WM831X_CURRENT_SINK_1,
7148c2ecf20Sopenharmony_ci		.flags = IORESOURCE_REG,
7158c2ecf20Sopenharmony_ci	},
7168c2ecf20Sopenharmony_ci	{
7178c2ecf20Sopenharmony_ci		.start = WM831X_IRQ_CS1,
7188c2ecf20Sopenharmony_ci		.end   = WM831X_IRQ_CS1,
7198c2ecf20Sopenharmony_ci		.flags = IORESOURCE_IRQ,
7208c2ecf20Sopenharmony_ci	},
7218c2ecf20Sopenharmony_ci};
7228c2ecf20Sopenharmony_ci
7238c2ecf20Sopenharmony_cistatic struct resource wm831x_isink2_resources[] = {
7248c2ecf20Sopenharmony_ci	{
7258c2ecf20Sopenharmony_ci		.start = WM831X_CURRENT_SINK_2,
7268c2ecf20Sopenharmony_ci		.end   = WM831X_CURRENT_SINK_2,
7278c2ecf20Sopenharmony_ci		.flags = IORESOURCE_REG,
7288c2ecf20Sopenharmony_ci	},
7298c2ecf20Sopenharmony_ci	{
7308c2ecf20Sopenharmony_ci		.start = WM831X_IRQ_CS2,
7318c2ecf20Sopenharmony_ci		.end   = WM831X_IRQ_CS2,
7328c2ecf20Sopenharmony_ci		.flags = IORESOURCE_IRQ,
7338c2ecf20Sopenharmony_ci	},
7348c2ecf20Sopenharmony_ci};
7358c2ecf20Sopenharmony_ci
7368c2ecf20Sopenharmony_cistatic struct resource wm831x_ldo1_resources[] = {
7378c2ecf20Sopenharmony_ci	{
7388c2ecf20Sopenharmony_ci		.start = WM831X_LDO1_CONTROL,
7398c2ecf20Sopenharmony_ci		.end   = WM831X_LDO1_SLEEP_CONTROL,
7408c2ecf20Sopenharmony_ci		.flags = IORESOURCE_REG,
7418c2ecf20Sopenharmony_ci	},
7428c2ecf20Sopenharmony_ci	{
7438c2ecf20Sopenharmony_ci		.name  = "UV",
7448c2ecf20Sopenharmony_ci		.start = WM831X_IRQ_UV_LDO1,
7458c2ecf20Sopenharmony_ci		.end   = WM831X_IRQ_UV_LDO1,
7468c2ecf20Sopenharmony_ci		.flags = IORESOURCE_IRQ,
7478c2ecf20Sopenharmony_ci	},
7488c2ecf20Sopenharmony_ci};
7498c2ecf20Sopenharmony_ci
7508c2ecf20Sopenharmony_cistatic struct resource wm831x_ldo2_resources[] = {
7518c2ecf20Sopenharmony_ci	{
7528c2ecf20Sopenharmony_ci		.start = WM831X_LDO2_CONTROL,
7538c2ecf20Sopenharmony_ci		.end   = WM831X_LDO2_SLEEP_CONTROL,
7548c2ecf20Sopenharmony_ci		.flags = IORESOURCE_REG,
7558c2ecf20Sopenharmony_ci	},
7568c2ecf20Sopenharmony_ci	{
7578c2ecf20Sopenharmony_ci		.name  = "UV",
7588c2ecf20Sopenharmony_ci		.start = WM831X_IRQ_UV_LDO2,
7598c2ecf20Sopenharmony_ci		.end   = WM831X_IRQ_UV_LDO2,
7608c2ecf20Sopenharmony_ci		.flags = IORESOURCE_IRQ,
7618c2ecf20Sopenharmony_ci	},
7628c2ecf20Sopenharmony_ci};
7638c2ecf20Sopenharmony_ci
7648c2ecf20Sopenharmony_cistatic struct resource wm831x_ldo3_resources[] = {
7658c2ecf20Sopenharmony_ci	{
7668c2ecf20Sopenharmony_ci		.start = WM831X_LDO3_CONTROL,
7678c2ecf20Sopenharmony_ci		.end   = WM831X_LDO3_SLEEP_CONTROL,
7688c2ecf20Sopenharmony_ci		.flags = IORESOURCE_REG,
7698c2ecf20Sopenharmony_ci	},
7708c2ecf20Sopenharmony_ci	{
7718c2ecf20Sopenharmony_ci		.name  = "UV",
7728c2ecf20Sopenharmony_ci		.start = WM831X_IRQ_UV_LDO3,
7738c2ecf20Sopenharmony_ci		.end   = WM831X_IRQ_UV_LDO3,
7748c2ecf20Sopenharmony_ci		.flags = IORESOURCE_IRQ,
7758c2ecf20Sopenharmony_ci	},
7768c2ecf20Sopenharmony_ci};
7778c2ecf20Sopenharmony_ci
7788c2ecf20Sopenharmony_cistatic struct resource wm831x_ldo4_resources[] = {
7798c2ecf20Sopenharmony_ci	{
7808c2ecf20Sopenharmony_ci		.start = WM831X_LDO4_CONTROL,
7818c2ecf20Sopenharmony_ci		.end   = WM831X_LDO4_SLEEP_CONTROL,
7828c2ecf20Sopenharmony_ci		.flags = IORESOURCE_REG,
7838c2ecf20Sopenharmony_ci	},
7848c2ecf20Sopenharmony_ci	{
7858c2ecf20Sopenharmony_ci		.name  = "UV",
7868c2ecf20Sopenharmony_ci		.start = WM831X_IRQ_UV_LDO4,
7878c2ecf20Sopenharmony_ci		.end   = WM831X_IRQ_UV_LDO4,
7888c2ecf20Sopenharmony_ci		.flags = IORESOURCE_IRQ,
7898c2ecf20Sopenharmony_ci	},
7908c2ecf20Sopenharmony_ci};
7918c2ecf20Sopenharmony_ci
7928c2ecf20Sopenharmony_cistatic struct resource wm831x_ldo5_resources[] = {
7938c2ecf20Sopenharmony_ci	{
7948c2ecf20Sopenharmony_ci		.start = WM831X_LDO5_CONTROL,
7958c2ecf20Sopenharmony_ci		.end   = WM831X_LDO5_SLEEP_CONTROL,
7968c2ecf20Sopenharmony_ci		.flags = IORESOURCE_REG,
7978c2ecf20Sopenharmony_ci	},
7988c2ecf20Sopenharmony_ci	{
7998c2ecf20Sopenharmony_ci		.name  = "UV",
8008c2ecf20Sopenharmony_ci		.start = WM831X_IRQ_UV_LDO5,
8018c2ecf20Sopenharmony_ci		.end   = WM831X_IRQ_UV_LDO5,
8028c2ecf20Sopenharmony_ci		.flags = IORESOURCE_IRQ,
8038c2ecf20Sopenharmony_ci	},
8048c2ecf20Sopenharmony_ci};
8058c2ecf20Sopenharmony_ci
8068c2ecf20Sopenharmony_cistatic struct resource wm831x_ldo6_resources[] = {
8078c2ecf20Sopenharmony_ci	{
8088c2ecf20Sopenharmony_ci		.start = WM831X_LDO6_CONTROL,
8098c2ecf20Sopenharmony_ci		.end   = WM831X_LDO6_SLEEP_CONTROL,
8108c2ecf20Sopenharmony_ci		.flags = IORESOURCE_REG,
8118c2ecf20Sopenharmony_ci	},
8128c2ecf20Sopenharmony_ci	{
8138c2ecf20Sopenharmony_ci		.name  = "UV",
8148c2ecf20Sopenharmony_ci		.start = WM831X_IRQ_UV_LDO6,
8158c2ecf20Sopenharmony_ci		.end   = WM831X_IRQ_UV_LDO6,
8168c2ecf20Sopenharmony_ci		.flags = IORESOURCE_IRQ,
8178c2ecf20Sopenharmony_ci	},
8188c2ecf20Sopenharmony_ci};
8198c2ecf20Sopenharmony_ci
8208c2ecf20Sopenharmony_cistatic struct resource wm831x_ldo7_resources[] = {
8218c2ecf20Sopenharmony_ci	{
8228c2ecf20Sopenharmony_ci		.start = WM831X_LDO7_CONTROL,
8238c2ecf20Sopenharmony_ci		.end   = WM831X_LDO7_SLEEP_CONTROL,
8248c2ecf20Sopenharmony_ci		.flags = IORESOURCE_REG,
8258c2ecf20Sopenharmony_ci	},
8268c2ecf20Sopenharmony_ci	{
8278c2ecf20Sopenharmony_ci		.name  = "UV",
8288c2ecf20Sopenharmony_ci		.start = WM831X_IRQ_UV_LDO7,
8298c2ecf20Sopenharmony_ci		.end   = WM831X_IRQ_UV_LDO7,
8308c2ecf20Sopenharmony_ci		.flags = IORESOURCE_IRQ,
8318c2ecf20Sopenharmony_ci	},
8328c2ecf20Sopenharmony_ci};
8338c2ecf20Sopenharmony_ci
8348c2ecf20Sopenharmony_cistatic struct resource wm831x_ldo8_resources[] = {
8358c2ecf20Sopenharmony_ci	{
8368c2ecf20Sopenharmony_ci		.start = WM831X_LDO8_CONTROL,
8378c2ecf20Sopenharmony_ci		.end   = WM831X_LDO8_SLEEP_CONTROL,
8388c2ecf20Sopenharmony_ci		.flags = IORESOURCE_REG,
8398c2ecf20Sopenharmony_ci	},
8408c2ecf20Sopenharmony_ci	{
8418c2ecf20Sopenharmony_ci		.name  = "UV",
8428c2ecf20Sopenharmony_ci		.start = WM831X_IRQ_UV_LDO8,
8438c2ecf20Sopenharmony_ci		.end   = WM831X_IRQ_UV_LDO8,
8448c2ecf20Sopenharmony_ci		.flags = IORESOURCE_IRQ,
8458c2ecf20Sopenharmony_ci	},
8468c2ecf20Sopenharmony_ci};
8478c2ecf20Sopenharmony_ci
8488c2ecf20Sopenharmony_cistatic struct resource wm831x_ldo9_resources[] = {
8498c2ecf20Sopenharmony_ci	{
8508c2ecf20Sopenharmony_ci		.start = WM831X_LDO9_CONTROL,
8518c2ecf20Sopenharmony_ci		.end   = WM831X_LDO9_SLEEP_CONTROL,
8528c2ecf20Sopenharmony_ci		.flags = IORESOURCE_REG,
8538c2ecf20Sopenharmony_ci	},
8548c2ecf20Sopenharmony_ci	{
8558c2ecf20Sopenharmony_ci		.name  = "UV",
8568c2ecf20Sopenharmony_ci		.start = WM831X_IRQ_UV_LDO9,
8578c2ecf20Sopenharmony_ci		.end   = WM831X_IRQ_UV_LDO9,
8588c2ecf20Sopenharmony_ci		.flags = IORESOURCE_IRQ,
8598c2ecf20Sopenharmony_ci	},
8608c2ecf20Sopenharmony_ci};
8618c2ecf20Sopenharmony_ci
8628c2ecf20Sopenharmony_cistatic struct resource wm831x_ldo10_resources[] = {
8638c2ecf20Sopenharmony_ci	{
8648c2ecf20Sopenharmony_ci		.start = WM831X_LDO10_CONTROL,
8658c2ecf20Sopenharmony_ci		.end   = WM831X_LDO10_SLEEP_CONTROL,
8668c2ecf20Sopenharmony_ci		.flags = IORESOURCE_REG,
8678c2ecf20Sopenharmony_ci	},
8688c2ecf20Sopenharmony_ci	{
8698c2ecf20Sopenharmony_ci		.name  = "UV",
8708c2ecf20Sopenharmony_ci		.start = WM831X_IRQ_UV_LDO10,
8718c2ecf20Sopenharmony_ci		.end   = WM831X_IRQ_UV_LDO10,
8728c2ecf20Sopenharmony_ci		.flags = IORESOURCE_IRQ,
8738c2ecf20Sopenharmony_ci	},
8748c2ecf20Sopenharmony_ci};
8758c2ecf20Sopenharmony_ci
8768c2ecf20Sopenharmony_cistatic struct resource wm831x_ldo11_resources[] = {
8778c2ecf20Sopenharmony_ci	{
8788c2ecf20Sopenharmony_ci		.start = WM831X_LDO11_ON_CONTROL,
8798c2ecf20Sopenharmony_ci		.end   = WM831X_LDO11_SLEEP_CONTROL,
8808c2ecf20Sopenharmony_ci		.flags = IORESOURCE_REG,
8818c2ecf20Sopenharmony_ci	},
8828c2ecf20Sopenharmony_ci};
8838c2ecf20Sopenharmony_ci
8848c2ecf20Sopenharmony_cistatic struct resource wm831x_on_resources[] = {
8858c2ecf20Sopenharmony_ci	{
8868c2ecf20Sopenharmony_ci		.start = WM831X_IRQ_ON,
8878c2ecf20Sopenharmony_ci		.end   = WM831X_IRQ_ON,
8888c2ecf20Sopenharmony_ci		.flags = IORESOURCE_IRQ,
8898c2ecf20Sopenharmony_ci	},
8908c2ecf20Sopenharmony_ci};
8918c2ecf20Sopenharmony_ci
8928c2ecf20Sopenharmony_ci
8938c2ecf20Sopenharmony_cistatic struct resource wm831x_power_resources[] = {
8948c2ecf20Sopenharmony_ci	{
8958c2ecf20Sopenharmony_ci		.name = "SYSLO",
8968c2ecf20Sopenharmony_ci		.start = WM831X_IRQ_PPM_SYSLO,
8978c2ecf20Sopenharmony_ci		.end   = WM831X_IRQ_PPM_SYSLO,
8988c2ecf20Sopenharmony_ci		.flags = IORESOURCE_IRQ,
8998c2ecf20Sopenharmony_ci	},
9008c2ecf20Sopenharmony_ci	{
9018c2ecf20Sopenharmony_ci		.name = "PWR SRC",
9028c2ecf20Sopenharmony_ci		.start = WM831X_IRQ_PPM_PWR_SRC,
9038c2ecf20Sopenharmony_ci		.end   = WM831X_IRQ_PPM_PWR_SRC,
9048c2ecf20Sopenharmony_ci		.flags = IORESOURCE_IRQ,
9058c2ecf20Sopenharmony_ci	},
9068c2ecf20Sopenharmony_ci	{
9078c2ecf20Sopenharmony_ci		.name = "USB CURR",
9088c2ecf20Sopenharmony_ci		.start = WM831X_IRQ_PPM_USB_CURR,
9098c2ecf20Sopenharmony_ci		.end   = WM831X_IRQ_PPM_USB_CURR,
9108c2ecf20Sopenharmony_ci		.flags = IORESOURCE_IRQ,
9118c2ecf20Sopenharmony_ci	},
9128c2ecf20Sopenharmony_ci	{
9138c2ecf20Sopenharmony_ci		.name = "BATT HOT",
9148c2ecf20Sopenharmony_ci		.start = WM831X_IRQ_CHG_BATT_HOT,
9158c2ecf20Sopenharmony_ci		.end   = WM831X_IRQ_CHG_BATT_HOT,
9168c2ecf20Sopenharmony_ci		.flags = IORESOURCE_IRQ,
9178c2ecf20Sopenharmony_ci	},
9188c2ecf20Sopenharmony_ci	{
9198c2ecf20Sopenharmony_ci		.name = "BATT COLD",
9208c2ecf20Sopenharmony_ci		.start = WM831X_IRQ_CHG_BATT_COLD,
9218c2ecf20Sopenharmony_ci		.end   = WM831X_IRQ_CHG_BATT_COLD,
9228c2ecf20Sopenharmony_ci		.flags = IORESOURCE_IRQ,
9238c2ecf20Sopenharmony_ci	},
9248c2ecf20Sopenharmony_ci	{
9258c2ecf20Sopenharmony_ci		.name = "BATT FAIL",
9268c2ecf20Sopenharmony_ci		.start = WM831X_IRQ_CHG_BATT_FAIL,
9278c2ecf20Sopenharmony_ci		.end   = WM831X_IRQ_CHG_BATT_FAIL,
9288c2ecf20Sopenharmony_ci		.flags = IORESOURCE_IRQ,
9298c2ecf20Sopenharmony_ci	},
9308c2ecf20Sopenharmony_ci	{
9318c2ecf20Sopenharmony_ci		.name = "OV",
9328c2ecf20Sopenharmony_ci		.start = WM831X_IRQ_CHG_OV,
9338c2ecf20Sopenharmony_ci		.end   = WM831X_IRQ_CHG_OV,
9348c2ecf20Sopenharmony_ci		.flags = IORESOURCE_IRQ,
9358c2ecf20Sopenharmony_ci	},
9368c2ecf20Sopenharmony_ci	{
9378c2ecf20Sopenharmony_ci		.name = "END",
9388c2ecf20Sopenharmony_ci		.start = WM831X_IRQ_CHG_END,
9398c2ecf20Sopenharmony_ci		.end   = WM831X_IRQ_CHG_END,
9408c2ecf20Sopenharmony_ci		.flags = IORESOURCE_IRQ,
9418c2ecf20Sopenharmony_ci	},
9428c2ecf20Sopenharmony_ci	{
9438c2ecf20Sopenharmony_ci		.name = "TO",
9448c2ecf20Sopenharmony_ci		.start = WM831X_IRQ_CHG_TO,
9458c2ecf20Sopenharmony_ci		.end   = WM831X_IRQ_CHG_TO,
9468c2ecf20Sopenharmony_ci		.flags = IORESOURCE_IRQ,
9478c2ecf20Sopenharmony_ci	},
9488c2ecf20Sopenharmony_ci	{
9498c2ecf20Sopenharmony_ci		.name = "MODE",
9508c2ecf20Sopenharmony_ci		.start = WM831X_IRQ_CHG_MODE,
9518c2ecf20Sopenharmony_ci		.end   = WM831X_IRQ_CHG_MODE,
9528c2ecf20Sopenharmony_ci		.flags = IORESOURCE_IRQ,
9538c2ecf20Sopenharmony_ci	},
9548c2ecf20Sopenharmony_ci	{
9558c2ecf20Sopenharmony_ci		.name = "START",
9568c2ecf20Sopenharmony_ci		.start = WM831X_IRQ_CHG_START,
9578c2ecf20Sopenharmony_ci		.end   = WM831X_IRQ_CHG_START,
9588c2ecf20Sopenharmony_ci		.flags = IORESOURCE_IRQ,
9598c2ecf20Sopenharmony_ci	},
9608c2ecf20Sopenharmony_ci};
9618c2ecf20Sopenharmony_ci
9628c2ecf20Sopenharmony_cistatic struct resource wm831x_rtc_resources[] = {
9638c2ecf20Sopenharmony_ci	{
9648c2ecf20Sopenharmony_ci		.name = "PER",
9658c2ecf20Sopenharmony_ci		.start = WM831X_IRQ_RTC_PER,
9668c2ecf20Sopenharmony_ci		.end   = WM831X_IRQ_RTC_PER,
9678c2ecf20Sopenharmony_ci		.flags = IORESOURCE_IRQ,
9688c2ecf20Sopenharmony_ci	},
9698c2ecf20Sopenharmony_ci	{
9708c2ecf20Sopenharmony_ci		.name = "ALM",
9718c2ecf20Sopenharmony_ci		.start = WM831X_IRQ_RTC_ALM,
9728c2ecf20Sopenharmony_ci		.end   = WM831X_IRQ_RTC_ALM,
9738c2ecf20Sopenharmony_ci		.flags = IORESOURCE_IRQ,
9748c2ecf20Sopenharmony_ci	},
9758c2ecf20Sopenharmony_ci};
9768c2ecf20Sopenharmony_ci
9778c2ecf20Sopenharmony_cistatic struct resource wm831x_status1_resources[] = {
9788c2ecf20Sopenharmony_ci	{
9798c2ecf20Sopenharmony_ci		.start = WM831X_STATUS_LED_1,
9808c2ecf20Sopenharmony_ci		.end   = WM831X_STATUS_LED_1,
9818c2ecf20Sopenharmony_ci		.flags = IORESOURCE_REG,
9828c2ecf20Sopenharmony_ci	},
9838c2ecf20Sopenharmony_ci};
9848c2ecf20Sopenharmony_ci
9858c2ecf20Sopenharmony_cistatic struct resource wm831x_status2_resources[] = {
9868c2ecf20Sopenharmony_ci	{
9878c2ecf20Sopenharmony_ci		.start = WM831X_STATUS_LED_2,
9888c2ecf20Sopenharmony_ci		.end   = WM831X_STATUS_LED_2,
9898c2ecf20Sopenharmony_ci		.flags = IORESOURCE_REG,
9908c2ecf20Sopenharmony_ci	},
9918c2ecf20Sopenharmony_ci};
9928c2ecf20Sopenharmony_ci
9938c2ecf20Sopenharmony_cistatic struct resource wm831x_touch_resources[] = {
9948c2ecf20Sopenharmony_ci	{
9958c2ecf20Sopenharmony_ci		.name = "TCHPD",
9968c2ecf20Sopenharmony_ci		.start = WM831X_IRQ_TCHPD,
9978c2ecf20Sopenharmony_ci		.end   = WM831X_IRQ_TCHPD,
9988c2ecf20Sopenharmony_ci		.flags = IORESOURCE_IRQ,
9998c2ecf20Sopenharmony_ci	},
10008c2ecf20Sopenharmony_ci	{
10018c2ecf20Sopenharmony_ci		.name = "TCHDATA",
10028c2ecf20Sopenharmony_ci		.start = WM831X_IRQ_TCHDATA,
10038c2ecf20Sopenharmony_ci		.end   = WM831X_IRQ_TCHDATA,
10048c2ecf20Sopenharmony_ci		.flags = IORESOURCE_IRQ,
10058c2ecf20Sopenharmony_ci	},
10068c2ecf20Sopenharmony_ci};
10078c2ecf20Sopenharmony_ci
10088c2ecf20Sopenharmony_cistatic struct resource wm831x_wdt_resources[] = {
10098c2ecf20Sopenharmony_ci	{
10108c2ecf20Sopenharmony_ci		.start = WM831X_IRQ_WDOG_TO,
10118c2ecf20Sopenharmony_ci		.end   = WM831X_IRQ_WDOG_TO,
10128c2ecf20Sopenharmony_ci		.flags = IORESOURCE_IRQ,
10138c2ecf20Sopenharmony_ci	},
10148c2ecf20Sopenharmony_ci};
10158c2ecf20Sopenharmony_ci
10168c2ecf20Sopenharmony_cistatic const struct mfd_cell wm8310_devs[] = {
10178c2ecf20Sopenharmony_ci	{
10188c2ecf20Sopenharmony_ci		.name = "wm831x-backup",
10198c2ecf20Sopenharmony_ci	},
10208c2ecf20Sopenharmony_ci	{
10218c2ecf20Sopenharmony_ci		.name = "wm831x-buckv",
10228c2ecf20Sopenharmony_ci		.id = 1,
10238c2ecf20Sopenharmony_ci		.num_resources = ARRAY_SIZE(wm831x_dcdc1_resources),
10248c2ecf20Sopenharmony_ci		.resources = wm831x_dcdc1_resources,
10258c2ecf20Sopenharmony_ci	},
10268c2ecf20Sopenharmony_ci	{
10278c2ecf20Sopenharmony_ci		.name = "wm831x-buckv",
10288c2ecf20Sopenharmony_ci		.id = 2,
10298c2ecf20Sopenharmony_ci		.num_resources = ARRAY_SIZE(wm831x_dcdc2_resources),
10308c2ecf20Sopenharmony_ci		.resources = wm831x_dcdc2_resources,
10318c2ecf20Sopenharmony_ci	},
10328c2ecf20Sopenharmony_ci	{
10338c2ecf20Sopenharmony_ci		.name = "wm831x-buckp",
10348c2ecf20Sopenharmony_ci		.id = 3,
10358c2ecf20Sopenharmony_ci		.num_resources = ARRAY_SIZE(wm831x_dcdc3_resources),
10368c2ecf20Sopenharmony_ci		.resources = wm831x_dcdc3_resources,
10378c2ecf20Sopenharmony_ci	},
10388c2ecf20Sopenharmony_ci	{
10398c2ecf20Sopenharmony_ci		.name = "wm831x-boostp",
10408c2ecf20Sopenharmony_ci		.id = 4,
10418c2ecf20Sopenharmony_ci		.num_resources = ARRAY_SIZE(wm831x_dcdc4_resources),
10428c2ecf20Sopenharmony_ci		.resources = wm831x_dcdc4_resources,
10438c2ecf20Sopenharmony_ci	},
10448c2ecf20Sopenharmony_ci	{
10458c2ecf20Sopenharmony_ci		.name = "wm831x-clk",
10468c2ecf20Sopenharmony_ci	},
10478c2ecf20Sopenharmony_ci	{
10488c2ecf20Sopenharmony_ci		.name = "wm831x-epe",
10498c2ecf20Sopenharmony_ci		.id = 1,
10508c2ecf20Sopenharmony_ci	},
10518c2ecf20Sopenharmony_ci	{
10528c2ecf20Sopenharmony_ci		.name = "wm831x-epe",
10538c2ecf20Sopenharmony_ci		.id = 2,
10548c2ecf20Sopenharmony_ci	},
10558c2ecf20Sopenharmony_ci	{
10568c2ecf20Sopenharmony_ci		.name = "wm831x-gpio",
10578c2ecf20Sopenharmony_ci		.num_resources = ARRAY_SIZE(wm831x_gpio_resources),
10588c2ecf20Sopenharmony_ci		.resources = wm831x_gpio_resources,
10598c2ecf20Sopenharmony_ci	},
10608c2ecf20Sopenharmony_ci	{
10618c2ecf20Sopenharmony_ci		.name = "wm831x-hwmon",
10628c2ecf20Sopenharmony_ci	},
10638c2ecf20Sopenharmony_ci	{
10648c2ecf20Sopenharmony_ci		.name = "wm831x-isink",
10658c2ecf20Sopenharmony_ci		.id = 1,
10668c2ecf20Sopenharmony_ci		.num_resources = ARRAY_SIZE(wm831x_isink1_resources),
10678c2ecf20Sopenharmony_ci		.resources = wm831x_isink1_resources,
10688c2ecf20Sopenharmony_ci	},
10698c2ecf20Sopenharmony_ci	{
10708c2ecf20Sopenharmony_ci		.name = "wm831x-isink",
10718c2ecf20Sopenharmony_ci		.id = 2,
10728c2ecf20Sopenharmony_ci		.num_resources = ARRAY_SIZE(wm831x_isink2_resources),
10738c2ecf20Sopenharmony_ci		.resources = wm831x_isink2_resources,
10748c2ecf20Sopenharmony_ci	},
10758c2ecf20Sopenharmony_ci	{
10768c2ecf20Sopenharmony_ci		.name = "wm831x-ldo",
10778c2ecf20Sopenharmony_ci		.id = 1,
10788c2ecf20Sopenharmony_ci		.num_resources = ARRAY_SIZE(wm831x_ldo1_resources),
10798c2ecf20Sopenharmony_ci		.resources = wm831x_ldo1_resources,
10808c2ecf20Sopenharmony_ci	},
10818c2ecf20Sopenharmony_ci	{
10828c2ecf20Sopenharmony_ci		.name = "wm831x-ldo",
10838c2ecf20Sopenharmony_ci		.id = 2,
10848c2ecf20Sopenharmony_ci		.num_resources = ARRAY_SIZE(wm831x_ldo2_resources),
10858c2ecf20Sopenharmony_ci		.resources = wm831x_ldo2_resources,
10868c2ecf20Sopenharmony_ci	},
10878c2ecf20Sopenharmony_ci	{
10888c2ecf20Sopenharmony_ci		.name = "wm831x-ldo",
10898c2ecf20Sopenharmony_ci		.id = 3,
10908c2ecf20Sopenharmony_ci		.num_resources = ARRAY_SIZE(wm831x_ldo3_resources),
10918c2ecf20Sopenharmony_ci		.resources = wm831x_ldo3_resources,
10928c2ecf20Sopenharmony_ci	},
10938c2ecf20Sopenharmony_ci	{
10948c2ecf20Sopenharmony_ci		.name = "wm831x-ldo",
10958c2ecf20Sopenharmony_ci		.id = 4,
10968c2ecf20Sopenharmony_ci		.num_resources = ARRAY_SIZE(wm831x_ldo4_resources),
10978c2ecf20Sopenharmony_ci		.resources = wm831x_ldo4_resources,
10988c2ecf20Sopenharmony_ci	},
10998c2ecf20Sopenharmony_ci	{
11008c2ecf20Sopenharmony_ci		.name = "wm831x-ldo",
11018c2ecf20Sopenharmony_ci		.id = 5,
11028c2ecf20Sopenharmony_ci		.num_resources = ARRAY_SIZE(wm831x_ldo5_resources),
11038c2ecf20Sopenharmony_ci		.resources = wm831x_ldo5_resources,
11048c2ecf20Sopenharmony_ci	},
11058c2ecf20Sopenharmony_ci	{
11068c2ecf20Sopenharmony_ci		.name = "wm831x-ldo",
11078c2ecf20Sopenharmony_ci		.id = 6,
11088c2ecf20Sopenharmony_ci		.num_resources = ARRAY_SIZE(wm831x_ldo6_resources),
11098c2ecf20Sopenharmony_ci		.resources = wm831x_ldo6_resources,
11108c2ecf20Sopenharmony_ci	},
11118c2ecf20Sopenharmony_ci	{
11128c2ecf20Sopenharmony_ci		.name = "wm831x-aldo",
11138c2ecf20Sopenharmony_ci		.id = 7,
11148c2ecf20Sopenharmony_ci		.num_resources = ARRAY_SIZE(wm831x_ldo7_resources),
11158c2ecf20Sopenharmony_ci		.resources = wm831x_ldo7_resources,
11168c2ecf20Sopenharmony_ci	},
11178c2ecf20Sopenharmony_ci	{
11188c2ecf20Sopenharmony_ci		.name = "wm831x-aldo",
11198c2ecf20Sopenharmony_ci		.id = 8,
11208c2ecf20Sopenharmony_ci		.num_resources = ARRAY_SIZE(wm831x_ldo8_resources),
11218c2ecf20Sopenharmony_ci		.resources = wm831x_ldo8_resources,
11228c2ecf20Sopenharmony_ci	},
11238c2ecf20Sopenharmony_ci	{
11248c2ecf20Sopenharmony_ci		.name = "wm831x-aldo",
11258c2ecf20Sopenharmony_ci		.id = 9,
11268c2ecf20Sopenharmony_ci		.num_resources = ARRAY_SIZE(wm831x_ldo9_resources),
11278c2ecf20Sopenharmony_ci		.resources = wm831x_ldo9_resources,
11288c2ecf20Sopenharmony_ci	},
11298c2ecf20Sopenharmony_ci	{
11308c2ecf20Sopenharmony_ci		.name = "wm831x-aldo",
11318c2ecf20Sopenharmony_ci		.id = 10,
11328c2ecf20Sopenharmony_ci		.num_resources = ARRAY_SIZE(wm831x_ldo10_resources),
11338c2ecf20Sopenharmony_ci		.resources = wm831x_ldo10_resources,
11348c2ecf20Sopenharmony_ci	},
11358c2ecf20Sopenharmony_ci	{
11368c2ecf20Sopenharmony_ci		.name = "wm831x-alive-ldo",
11378c2ecf20Sopenharmony_ci		.id = 11,
11388c2ecf20Sopenharmony_ci		.num_resources = ARRAY_SIZE(wm831x_ldo11_resources),
11398c2ecf20Sopenharmony_ci		.resources = wm831x_ldo11_resources,
11408c2ecf20Sopenharmony_ci	},
11418c2ecf20Sopenharmony_ci	{
11428c2ecf20Sopenharmony_ci		.name = "wm831x-on",
11438c2ecf20Sopenharmony_ci		.num_resources = ARRAY_SIZE(wm831x_on_resources),
11448c2ecf20Sopenharmony_ci		.resources = wm831x_on_resources,
11458c2ecf20Sopenharmony_ci	},
11468c2ecf20Sopenharmony_ci	{
11478c2ecf20Sopenharmony_ci		.name = "wm831x-power",
11488c2ecf20Sopenharmony_ci		.num_resources = ARRAY_SIZE(wm831x_power_resources),
11498c2ecf20Sopenharmony_ci		.resources = wm831x_power_resources,
11508c2ecf20Sopenharmony_ci	},
11518c2ecf20Sopenharmony_ci	{
11528c2ecf20Sopenharmony_ci		.name = "wm831x-status",
11538c2ecf20Sopenharmony_ci		.id = 1,
11548c2ecf20Sopenharmony_ci		.num_resources = ARRAY_SIZE(wm831x_status1_resources),
11558c2ecf20Sopenharmony_ci		.resources = wm831x_status1_resources,
11568c2ecf20Sopenharmony_ci	},
11578c2ecf20Sopenharmony_ci	{
11588c2ecf20Sopenharmony_ci		.name = "wm831x-status",
11598c2ecf20Sopenharmony_ci		.id = 2,
11608c2ecf20Sopenharmony_ci		.num_resources = ARRAY_SIZE(wm831x_status2_resources),
11618c2ecf20Sopenharmony_ci		.resources = wm831x_status2_resources,
11628c2ecf20Sopenharmony_ci	},
11638c2ecf20Sopenharmony_ci	{
11648c2ecf20Sopenharmony_ci		.name = "wm831x-watchdog",
11658c2ecf20Sopenharmony_ci		.num_resources = ARRAY_SIZE(wm831x_wdt_resources),
11668c2ecf20Sopenharmony_ci		.resources = wm831x_wdt_resources,
11678c2ecf20Sopenharmony_ci	},
11688c2ecf20Sopenharmony_ci};
11698c2ecf20Sopenharmony_ci
11708c2ecf20Sopenharmony_cistatic const struct mfd_cell wm8311_devs[] = {
11718c2ecf20Sopenharmony_ci	{
11728c2ecf20Sopenharmony_ci		.name = "wm831x-backup",
11738c2ecf20Sopenharmony_ci	},
11748c2ecf20Sopenharmony_ci	{
11758c2ecf20Sopenharmony_ci		.name = "wm831x-buckv",
11768c2ecf20Sopenharmony_ci		.id = 1,
11778c2ecf20Sopenharmony_ci		.num_resources = ARRAY_SIZE(wm831x_dcdc1_resources),
11788c2ecf20Sopenharmony_ci		.resources = wm831x_dcdc1_resources,
11798c2ecf20Sopenharmony_ci	},
11808c2ecf20Sopenharmony_ci	{
11818c2ecf20Sopenharmony_ci		.name = "wm831x-buckv",
11828c2ecf20Sopenharmony_ci		.id = 2,
11838c2ecf20Sopenharmony_ci		.num_resources = ARRAY_SIZE(wm831x_dcdc2_resources),
11848c2ecf20Sopenharmony_ci		.resources = wm831x_dcdc2_resources,
11858c2ecf20Sopenharmony_ci	},
11868c2ecf20Sopenharmony_ci	{
11878c2ecf20Sopenharmony_ci		.name = "wm831x-buckp",
11888c2ecf20Sopenharmony_ci		.id = 3,
11898c2ecf20Sopenharmony_ci		.num_resources = ARRAY_SIZE(wm831x_dcdc3_resources),
11908c2ecf20Sopenharmony_ci		.resources = wm831x_dcdc3_resources,
11918c2ecf20Sopenharmony_ci	},
11928c2ecf20Sopenharmony_ci	{
11938c2ecf20Sopenharmony_ci		.name = "wm831x-boostp",
11948c2ecf20Sopenharmony_ci		.id = 4,
11958c2ecf20Sopenharmony_ci		.num_resources = ARRAY_SIZE(wm831x_dcdc4_resources),
11968c2ecf20Sopenharmony_ci		.resources = wm831x_dcdc4_resources,
11978c2ecf20Sopenharmony_ci	},
11988c2ecf20Sopenharmony_ci	{
11998c2ecf20Sopenharmony_ci		.name = "wm831x-clk",
12008c2ecf20Sopenharmony_ci	},
12018c2ecf20Sopenharmony_ci	{
12028c2ecf20Sopenharmony_ci		.name = "wm831x-epe",
12038c2ecf20Sopenharmony_ci		.id = 1,
12048c2ecf20Sopenharmony_ci	},
12058c2ecf20Sopenharmony_ci	{
12068c2ecf20Sopenharmony_ci		.name = "wm831x-epe",
12078c2ecf20Sopenharmony_ci		.id = 2,
12088c2ecf20Sopenharmony_ci	},
12098c2ecf20Sopenharmony_ci	{
12108c2ecf20Sopenharmony_ci		.name = "wm831x-gpio",
12118c2ecf20Sopenharmony_ci		.num_resources = ARRAY_SIZE(wm831x_gpio_resources),
12128c2ecf20Sopenharmony_ci		.resources = wm831x_gpio_resources,
12138c2ecf20Sopenharmony_ci	},
12148c2ecf20Sopenharmony_ci	{
12158c2ecf20Sopenharmony_ci		.name = "wm831x-hwmon",
12168c2ecf20Sopenharmony_ci	},
12178c2ecf20Sopenharmony_ci	{
12188c2ecf20Sopenharmony_ci		.name = "wm831x-isink",
12198c2ecf20Sopenharmony_ci		.id = 1,
12208c2ecf20Sopenharmony_ci		.num_resources = ARRAY_SIZE(wm831x_isink1_resources),
12218c2ecf20Sopenharmony_ci		.resources = wm831x_isink1_resources,
12228c2ecf20Sopenharmony_ci	},
12238c2ecf20Sopenharmony_ci	{
12248c2ecf20Sopenharmony_ci		.name = "wm831x-isink",
12258c2ecf20Sopenharmony_ci		.id = 2,
12268c2ecf20Sopenharmony_ci		.num_resources = ARRAY_SIZE(wm831x_isink2_resources),
12278c2ecf20Sopenharmony_ci		.resources = wm831x_isink2_resources,
12288c2ecf20Sopenharmony_ci	},
12298c2ecf20Sopenharmony_ci	{
12308c2ecf20Sopenharmony_ci		.name = "wm831x-ldo",
12318c2ecf20Sopenharmony_ci		.id = 1,
12328c2ecf20Sopenharmony_ci		.num_resources = ARRAY_SIZE(wm831x_ldo1_resources),
12338c2ecf20Sopenharmony_ci		.resources = wm831x_ldo1_resources,
12348c2ecf20Sopenharmony_ci	},
12358c2ecf20Sopenharmony_ci	{
12368c2ecf20Sopenharmony_ci		.name = "wm831x-ldo",
12378c2ecf20Sopenharmony_ci		.id = 2,
12388c2ecf20Sopenharmony_ci		.num_resources = ARRAY_SIZE(wm831x_ldo2_resources),
12398c2ecf20Sopenharmony_ci		.resources = wm831x_ldo2_resources,
12408c2ecf20Sopenharmony_ci	},
12418c2ecf20Sopenharmony_ci	{
12428c2ecf20Sopenharmony_ci		.name = "wm831x-ldo",
12438c2ecf20Sopenharmony_ci		.id = 3,
12448c2ecf20Sopenharmony_ci		.num_resources = ARRAY_SIZE(wm831x_ldo3_resources),
12458c2ecf20Sopenharmony_ci		.resources = wm831x_ldo3_resources,
12468c2ecf20Sopenharmony_ci	},
12478c2ecf20Sopenharmony_ci	{
12488c2ecf20Sopenharmony_ci		.name = "wm831x-ldo",
12498c2ecf20Sopenharmony_ci		.id = 4,
12508c2ecf20Sopenharmony_ci		.num_resources = ARRAY_SIZE(wm831x_ldo4_resources),
12518c2ecf20Sopenharmony_ci		.resources = wm831x_ldo4_resources,
12528c2ecf20Sopenharmony_ci	},
12538c2ecf20Sopenharmony_ci	{
12548c2ecf20Sopenharmony_ci		.name = "wm831x-ldo",
12558c2ecf20Sopenharmony_ci		.id = 5,
12568c2ecf20Sopenharmony_ci		.num_resources = ARRAY_SIZE(wm831x_ldo5_resources),
12578c2ecf20Sopenharmony_ci		.resources = wm831x_ldo5_resources,
12588c2ecf20Sopenharmony_ci	},
12598c2ecf20Sopenharmony_ci	{
12608c2ecf20Sopenharmony_ci		.name = "wm831x-aldo",
12618c2ecf20Sopenharmony_ci		.id = 7,
12628c2ecf20Sopenharmony_ci		.num_resources = ARRAY_SIZE(wm831x_ldo7_resources),
12638c2ecf20Sopenharmony_ci		.resources = wm831x_ldo7_resources,
12648c2ecf20Sopenharmony_ci	},
12658c2ecf20Sopenharmony_ci	{
12668c2ecf20Sopenharmony_ci		.name = "wm831x-alive-ldo",
12678c2ecf20Sopenharmony_ci		.id = 11,
12688c2ecf20Sopenharmony_ci		.num_resources = ARRAY_SIZE(wm831x_ldo11_resources),
12698c2ecf20Sopenharmony_ci		.resources = wm831x_ldo11_resources,
12708c2ecf20Sopenharmony_ci	},
12718c2ecf20Sopenharmony_ci	{
12728c2ecf20Sopenharmony_ci		.name = "wm831x-on",
12738c2ecf20Sopenharmony_ci		.num_resources = ARRAY_SIZE(wm831x_on_resources),
12748c2ecf20Sopenharmony_ci		.resources = wm831x_on_resources,
12758c2ecf20Sopenharmony_ci	},
12768c2ecf20Sopenharmony_ci	{
12778c2ecf20Sopenharmony_ci		.name = "wm831x-power",
12788c2ecf20Sopenharmony_ci		.num_resources = ARRAY_SIZE(wm831x_power_resources),
12798c2ecf20Sopenharmony_ci		.resources = wm831x_power_resources,
12808c2ecf20Sopenharmony_ci	},
12818c2ecf20Sopenharmony_ci	{
12828c2ecf20Sopenharmony_ci		.name = "wm831x-status",
12838c2ecf20Sopenharmony_ci		.id = 1,
12848c2ecf20Sopenharmony_ci		.num_resources = ARRAY_SIZE(wm831x_status1_resources),
12858c2ecf20Sopenharmony_ci		.resources = wm831x_status1_resources,
12868c2ecf20Sopenharmony_ci	},
12878c2ecf20Sopenharmony_ci	{
12888c2ecf20Sopenharmony_ci		.name = "wm831x-status",
12898c2ecf20Sopenharmony_ci		.id = 2,
12908c2ecf20Sopenharmony_ci		.num_resources = ARRAY_SIZE(wm831x_status2_resources),
12918c2ecf20Sopenharmony_ci		.resources = wm831x_status2_resources,
12928c2ecf20Sopenharmony_ci	},
12938c2ecf20Sopenharmony_ci	{
12948c2ecf20Sopenharmony_ci		.name = "wm831x-watchdog",
12958c2ecf20Sopenharmony_ci		.num_resources = ARRAY_SIZE(wm831x_wdt_resources),
12968c2ecf20Sopenharmony_ci		.resources = wm831x_wdt_resources,
12978c2ecf20Sopenharmony_ci	},
12988c2ecf20Sopenharmony_ci};
12998c2ecf20Sopenharmony_ci
13008c2ecf20Sopenharmony_cistatic const struct mfd_cell wm8312_devs[] = {
13018c2ecf20Sopenharmony_ci	{
13028c2ecf20Sopenharmony_ci		.name = "wm831x-backup",
13038c2ecf20Sopenharmony_ci	},
13048c2ecf20Sopenharmony_ci	{
13058c2ecf20Sopenharmony_ci		.name = "wm831x-buckv",
13068c2ecf20Sopenharmony_ci		.id = 1,
13078c2ecf20Sopenharmony_ci		.num_resources = ARRAY_SIZE(wm831x_dcdc1_resources),
13088c2ecf20Sopenharmony_ci		.resources = wm831x_dcdc1_resources,
13098c2ecf20Sopenharmony_ci	},
13108c2ecf20Sopenharmony_ci	{
13118c2ecf20Sopenharmony_ci		.name = "wm831x-buckv",
13128c2ecf20Sopenharmony_ci		.id = 2,
13138c2ecf20Sopenharmony_ci		.num_resources = ARRAY_SIZE(wm831x_dcdc2_resources),
13148c2ecf20Sopenharmony_ci		.resources = wm831x_dcdc2_resources,
13158c2ecf20Sopenharmony_ci	},
13168c2ecf20Sopenharmony_ci	{
13178c2ecf20Sopenharmony_ci		.name = "wm831x-buckp",
13188c2ecf20Sopenharmony_ci		.id = 3,
13198c2ecf20Sopenharmony_ci		.num_resources = ARRAY_SIZE(wm831x_dcdc3_resources),
13208c2ecf20Sopenharmony_ci		.resources = wm831x_dcdc3_resources,
13218c2ecf20Sopenharmony_ci	},
13228c2ecf20Sopenharmony_ci	{
13238c2ecf20Sopenharmony_ci		.name = "wm831x-boostp",
13248c2ecf20Sopenharmony_ci		.id = 4,
13258c2ecf20Sopenharmony_ci		.num_resources = ARRAY_SIZE(wm831x_dcdc4_resources),
13268c2ecf20Sopenharmony_ci		.resources = wm831x_dcdc4_resources,
13278c2ecf20Sopenharmony_ci	},
13288c2ecf20Sopenharmony_ci	{
13298c2ecf20Sopenharmony_ci		.name = "wm831x-clk",
13308c2ecf20Sopenharmony_ci	},
13318c2ecf20Sopenharmony_ci	{
13328c2ecf20Sopenharmony_ci		.name = "wm831x-epe",
13338c2ecf20Sopenharmony_ci		.id = 1,
13348c2ecf20Sopenharmony_ci	},
13358c2ecf20Sopenharmony_ci	{
13368c2ecf20Sopenharmony_ci		.name = "wm831x-epe",
13378c2ecf20Sopenharmony_ci		.id = 2,
13388c2ecf20Sopenharmony_ci	},
13398c2ecf20Sopenharmony_ci	{
13408c2ecf20Sopenharmony_ci		.name = "wm831x-gpio",
13418c2ecf20Sopenharmony_ci		.num_resources = ARRAY_SIZE(wm831x_gpio_resources),
13428c2ecf20Sopenharmony_ci		.resources = wm831x_gpio_resources,
13438c2ecf20Sopenharmony_ci	},
13448c2ecf20Sopenharmony_ci	{
13458c2ecf20Sopenharmony_ci		.name = "wm831x-hwmon",
13468c2ecf20Sopenharmony_ci	},
13478c2ecf20Sopenharmony_ci	{
13488c2ecf20Sopenharmony_ci		.name = "wm831x-isink",
13498c2ecf20Sopenharmony_ci		.id = 1,
13508c2ecf20Sopenharmony_ci		.num_resources = ARRAY_SIZE(wm831x_isink1_resources),
13518c2ecf20Sopenharmony_ci		.resources = wm831x_isink1_resources,
13528c2ecf20Sopenharmony_ci	},
13538c2ecf20Sopenharmony_ci	{
13548c2ecf20Sopenharmony_ci		.name = "wm831x-isink",
13558c2ecf20Sopenharmony_ci		.id = 2,
13568c2ecf20Sopenharmony_ci		.num_resources = ARRAY_SIZE(wm831x_isink2_resources),
13578c2ecf20Sopenharmony_ci		.resources = wm831x_isink2_resources,
13588c2ecf20Sopenharmony_ci	},
13598c2ecf20Sopenharmony_ci	{
13608c2ecf20Sopenharmony_ci		.name = "wm831x-ldo",
13618c2ecf20Sopenharmony_ci		.id = 1,
13628c2ecf20Sopenharmony_ci		.num_resources = ARRAY_SIZE(wm831x_ldo1_resources),
13638c2ecf20Sopenharmony_ci		.resources = wm831x_ldo1_resources,
13648c2ecf20Sopenharmony_ci	},
13658c2ecf20Sopenharmony_ci	{
13668c2ecf20Sopenharmony_ci		.name = "wm831x-ldo",
13678c2ecf20Sopenharmony_ci		.id = 2,
13688c2ecf20Sopenharmony_ci		.num_resources = ARRAY_SIZE(wm831x_ldo2_resources),
13698c2ecf20Sopenharmony_ci		.resources = wm831x_ldo2_resources,
13708c2ecf20Sopenharmony_ci	},
13718c2ecf20Sopenharmony_ci	{
13728c2ecf20Sopenharmony_ci		.name = "wm831x-ldo",
13738c2ecf20Sopenharmony_ci		.id = 3,
13748c2ecf20Sopenharmony_ci		.num_resources = ARRAY_SIZE(wm831x_ldo3_resources),
13758c2ecf20Sopenharmony_ci		.resources = wm831x_ldo3_resources,
13768c2ecf20Sopenharmony_ci	},
13778c2ecf20Sopenharmony_ci	{
13788c2ecf20Sopenharmony_ci		.name = "wm831x-ldo",
13798c2ecf20Sopenharmony_ci		.id = 4,
13808c2ecf20Sopenharmony_ci		.num_resources = ARRAY_SIZE(wm831x_ldo4_resources),
13818c2ecf20Sopenharmony_ci		.resources = wm831x_ldo4_resources,
13828c2ecf20Sopenharmony_ci	},
13838c2ecf20Sopenharmony_ci	{
13848c2ecf20Sopenharmony_ci		.name = "wm831x-ldo",
13858c2ecf20Sopenharmony_ci		.id = 5,
13868c2ecf20Sopenharmony_ci		.num_resources = ARRAY_SIZE(wm831x_ldo5_resources),
13878c2ecf20Sopenharmony_ci		.resources = wm831x_ldo5_resources,
13888c2ecf20Sopenharmony_ci	},
13898c2ecf20Sopenharmony_ci	{
13908c2ecf20Sopenharmony_ci		.name = "wm831x-ldo",
13918c2ecf20Sopenharmony_ci		.id = 6,
13928c2ecf20Sopenharmony_ci		.num_resources = ARRAY_SIZE(wm831x_ldo6_resources),
13938c2ecf20Sopenharmony_ci		.resources = wm831x_ldo6_resources,
13948c2ecf20Sopenharmony_ci	},
13958c2ecf20Sopenharmony_ci	{
13968c2ecf20Sopenharmony_ci		.name = "wm831x-aldo",
13978c2ecf20Sopenharmony_ci		.id = 7,
13988c2ecf20Sopenharmony_ci		.num_resources = ARRAY_SIZE(wm831x_ldo7_resources),
13998c2ecf20Sopenharmony_ci		.resources = wm831x_ldo7_resources,
14008c2ecf20Sopenharmony_ci	},
14018c2ecf20Sopenharmony_ci	{
14028c2ecf20Sopenharmony_ci		.name = "wm831x-aldo",
14038c2ecf20Sopenharmony_ci		.id = 8,
14048c2ecf20Sopenharmony_ci		.num_resources = ARRAY_SIZE(wm831x_ldo8_resources),
14058c2ecf20Sopenharmony_ci		.resources = wm831x_ldo8_resources,
14068c2ecf20Sopenharmony_ci	},
14078c2ecf20Sopenharmony_ci	{
14088c2ecf20Sopenharmony_ci		.name = "wm831x-aldo",
14098c2ecf20Sopenharmony_ci		.id = 9,
14108c2ecf20Sopenharmony_ci		.num_resources = ARRAY_SIZE(wm831x_ldo9_resources),
14118c2ecf20Sopenharmony_ci		.resources = wm831x_ldo9_resources,
14128c2ecf20Sopenharmony_ci	},
14138c2ecf20Sopenharmony_ci	{
14148c2ecf20Sopenharmony_ci		.name = "wm831x-aldo",
14158c2ecf20Sopenharmony_ci		.id = 10,
14168c2ecf20Sopenharmony_ci		.num_resources = ARRAY_SIZE(wm831x_ldo10_resources),
14178c2ecf20Sopenharmony_ci		.resources = wm831x_ldo10_resources,
14188c2ecf20Sopenharmony_ci	},
14198c2ecf20Sopenharmony_ci	{
14208c2ecf20Sopenharmony_ci		.name = "wm831x-alive-ldo",
14218c2ecf20Sopenharmony_ci		.id = 11,
14228c2ecf20Sopenharmony_ci		.num_resources = ARRAY_SIZE(wm831x_ldo11_resources),
14238c2ecf20Sopenharmony_ci		.resources = wm831x_ldo11_resources,
14248c2ecf20Sopenharmony_ci	},
14258c2ecf20Sopenharmony_ci	{
14268c2ecf20Sopenharmony_ci		.name = "wm831x-on",
14278c2ecf20Sopenharmony_ci		.num_resources = ARRAY_SIZE(wm831x_on_resources),
14288c2ecf20Sopenharmony_ci		.resources = wm831x_on_resources,
14298c2ecf20Sopenharmony_ci	},
14308c2ecf20Sopenharmony_ci	{
14318c2ecf20Sopenharmony_ci		.name = "wm831x-power",
14328c2ecf20Sopenharmony_ci		.num_resources = ARRAY_SIZE(wm831x_power_resources),
14338c2ecf20Sopenharmony_ci		.resources = wm831x_power_resources,
14348c2ecf20Sopenharmony_ci	},
14358c2ecf20Sopenharmony_ci	{
14368c2ecf20Sopenharmony_ci		.name = "wm831x-status",
14378c2ecf20Sopenharmony_ci		.id = 1,
14388c2ecf20Sopenharmony_ci		.num_resources = ARRAY_SIZE(wm831x_status1_resources),
14398c2ecf20Sopenharmony_ci		.resources = wm831x_status1_resources,
14408c2ecf20Sopenharmony_ci	},
14418c2ecf20Sopenharmony_ci	{
14428c2ecf20Sopenharmony_ci		.name = "wm831x-status",
14438c2ecf20Sopenharmony_ci		.id = 2,
14448c2ecf20Sopenharmony_ci		.num_resources = ARRAY_SIZE(wm831x_status2_resources),
14458c2ecf20Sopenharmony_ci		.resources = wm831x_status2_resources,
14468c2ecf20Sopenharmony_ci	},
14478c2ecf20Sopenharmony_ci	{
14488c2ecf20Sopenharmony_ci		.name = "wm831x-watchdog",
14498c2ecf20Sopenharmony_ci		.num_resources = ARRAY_SIZE(wm831x_wdt_resources),
14508c2ecf20Sopenharmony_ci		.resources = wm831x_wdt_resources,
14518c2ecf20Sopenharmony_ci	},
14528c2ecf20Sopenharmony_ci};
14538c2ecf20Sopenharmony_ci
14548c2ecf20Sopenharmony_cistatic const struct mfd_cell wm8320_devs[] = {
14558c2ecf20Sopenharmony_ci	{
14568c2ecf20Sopenharmony_ci		.name = "wm831x-backup",
14578c2ecf20Sopenharmony_ci	},
14588c2ecf20Sopenharmony_ci	{
14598c2ecf20Sopenharmony_ci		.name = "wm831x-buckv",
14608c2ecf20Sopenharmony_ci		.id = 1,
14618c2ecf20Sopenharmony_ci		.num_resources = ARRAY_SIZE(wm831x_dcdc1_resources),
14628c2ecf20Sopenharmony_ci		.resources = wm831x_dcdc1_resources,
14638c2ecf20Sopenharmony_ci	},
14648c2ecf20Sopenharmony_ci	{
14658c2ecf20Sopenharmony_ci		.name = "wm831x-buckv",
14668c2ecf20Sopenharmony_ci		.id = 2,
14678c2ecf20Sopenharmony_ci		.num_resources = ARRAY_SIZE(wm831x_dcdc2_resources),
14688c2ecf20Sopenharmony_ci		.resources = wm831x_dcdc2_resources,
14698c2ecf20Sopenharmony_ci	},
14708c2ecf20Sopenharmony_ci	{
14718c2ecf20Sopenharmony_ci		.name = "wm831x-buckp",
14728c2ecf20Sopenharmony_ci		.id = 3,
14738c2ecf20Sopenharmony_ci		.num_resources = ARRAY_SIZE(wm831x_dcdc3_resources),
14748c2ecf20Sopenharmony_ci		.resources = wm831x_dcdc3_resources,
14758c2ecf20Sopenharmony_ci	},
14768c2ecf20Sopenharmony_ci	{
14778c2ecf20Sopenharmony_ci		.name = "wm831x-buckp",
14788c2ecf20Sopenharmony_ci		.id = 4,
14798c2ecf20Sopenharmony_ci		.num_resources = ARRAY_SIZE(wm8320_dcdc4_buck_resources),
14808c2ecf20Sopenharmony_ci		.resources = wm8320_dcdc4_buck_resources,
14818c2ecf20Sopenharmony_ci	},
14828c2ecf20Sopenharmony_ci	{
14838c2ecf20Sopenharmony_ci		.name = "wm831x-clk",
14848c2ecf20Sopenharmony_ci	},
14858c2ecf20Sopenharmony_ci	{
14868c2ecf20Sopenharmony_ci		.name = "wm831x-gpio",
14878c2ecf20Sopenharmony_ci		.num_resources = ARRAY_SIZE(wm831x_gpio_resources),
14888c2ecf20Sopenharmony_ci		.resources = wm831x_gpio_resources,
14898c2ecf20Sopenharmony_ci	},
14908c2ecf20Sopenharmony_ci	{
14918c2ecf20Sopenharmony_ci		.name = "wm831x-hwmon",
14928c2ecf20Sopenharmony_ci	},
14938c2ecf20Sopenharmony_ci	{
14948c2ecf20Sopenharmony_ci		.name = "wm831x-ldo",
14958c2ecf20Sopenharmony_ci		.id = 1,
14968c2ecf20Sopenharmony_ci		.num_resources = ARRAY_SIZE(wm831x_ldo1_resources),
14978c2ecf20Sopenharmony_ci		.resources = wm831x_ldo1_resources,
14988c2ecf20Sopenharmony_ci	},
14998c2ecf20Sopenharmony_ci	{
15008c2ecf20Sopenharmony_ci		.name = "wm831x-ldo",
15018c2ecf20Sopenharmony_ci		.id = 2,
15028c2ecf20Sopenharmony_ci		.num_resources = ARRAY_SIZE(wm831x_ldo2_resources),
15038c2ecf20Sopenharmony_ci		.resources = wm831x_ldo2_resources,
15048c2ecf20Sopenharmony_ci	},
15058c2ecf20Sopenharmony_ci	{
15068c2ecf20Sopenharmony_ci		.name = "wm831x-ldo",
15078c2ecf20Sopenharmony_ci		.id = 3,
15088c2ecf20Sopenharmony_ci		.num_resources = ARRAY_SIZE(wm831x_ldo3_resources),
15098c2ecf20Sopenharmony_ci		.resources = wm831x_ldo3_resources,
15108c2ecf20Sopenharmony_ci	},
15118c2ecf20Sopenharmony_ci	{
15128c2ecf20Sopenharmony_ci		.name = "wm831x-ldo",
15138c2ecf20Sopenharmony_ci		.id = 4,
15148c2ecf20Sopenharmony_ci		.num_resources = ARRAY_SIZE(wm831x_ldo4_resources),
15158c2ecf20Sopenharmony_ci		.resources = wm831x_ldo4_resources,
15168c2ecf20Sopenharmony_ci	},
15178c2ecf20Sopenharmony_ci	{
15188c2ecf20Sopenharmony_ci		.name = "wm831x-ldo",
15198c2ecf20Sopenharmony_ci		.id = 5,
15208c2ecf20Sopenharmony_ci		.num_resources = ARRAY_SIZE(wm831x_ldo5_resources),
15218c2ecf20Sopenharmony_ci		.resources = wm831x_ldo5_resources,
15228c2ecf20Sopenharmony_ci	},
15238c2ecf20Sopenharmony_ci	{
15248c2ecf20Sopenharmony_ci		.name = "wm831x-ldo",
15258c2ecf20Sopenharmony_ci		.id = 6,
15268c2ecf20Sopenharmony_ci		.num_resources = ARRAY_SIZE(wm831x_ldo6_resources),
15278c2ecf20Sopenharmony_ci		.resources = wm831x_ldo6_resources,
15288c2ecf20Sopenharmony_ci	},
15298c2ecf20Sopenharmony_ci	{
15308c2ecf20Sopenharmony_ci		.name = "wm831x-aldo",
15318c2ecf20Sopenharmony_ci		.id = 7,
15328c2ecf20Sopenharmony_ci		.num_resources = ARRAY_SIZE(wm831x_ldo7_resources),
15338c2ecf20Sopenharmony_ci		.resources = wm831x_ldo7_resources,
15348c2ecf20Sopenharmony_ci	},
15358c2ecf20Sopenharmony_ci	{
15368c2ecf20Sopenharmony_ci		.name = "wm831x-aldo",
15378c2ecf20Sopenharmony_ci		.id = 8,
15388c2ecf20Sopenharmony_ci		.num_resources = ARRAY_SIZE(wm831x_ldo8_resources),
15398c2ecf20Sopenharmony_ci		.resources = wm831x_ldo8_resources,
15408c2ecf20Sopenharmony_ci	},
15418c2ecf20Sopenharmony_ci	{
15428c2ecf20Sopenharmony_ci		.name = "wm831x-aldo",
15438c2ecf20Sopenharmony_ci		.id = 9,
15448c2ecf20Sopenharmony_ci		.num_resources = ARRAY_SIZE(wm831x_ldo9_resources),
15458c2ecf20Sopenharmony_ci		.resources = wm831x_ldo9_resources,
15468c2ecf20Sopenharmony_ci	},
15478c2ecf20Sopenharmony_ci	{
15488c2ecf20Sopenharmony_ci		.name = "wm831x-aldo",
15498c2ecf20Sopenharmony_ci		.id = 10,
15508c2ecf20Sopenharmony_ci		.num_resources = ARRAY_SIZE(wm831x_ldo10_resources),
15518c2ecf20Sopenharmony_ci		.resources = wm831x_ldo10_resources,
15528c2ecf20Sopenharmony_ci	},
15538c2ecf20Sopenharmony_ci	{
15548c2ecf20Sopenharmony_ci		.name = "wm831x-alive-ldo",
15558c2ecf20Sopenharmony_ci		.id = 11,
15568c2ecf20Sopenharmony_ci		.num_resources = ARRAY_SIZE(wm831x_ldo11_resources),
15578c2ecf20Sopenharmony_ci		.resources = wm831x_ldo11_resources,
15588c2ecf20Sopenharmony_ci	},
15598c2ecf20Sopenharmony_ci	{
15608c2ecf20Sopenharmony_ci		.name = "wm831x-on",
15618c2ecf20Sopenharmony_ci		.num_resources = ARRAY_SIZE(wm831x_on_resources),
15628c2ecf20Sopenharmony_ci		.resources = wm831x_on_resources,
15638c2ecf20Sopenharmony_ci	},
15648c2ecf20Sopenharmony_ci	{
15658c2ecf20Sopenharmony_ci		.name = "wm831x-status",
15668c2ecf20Sopenharmony_ci		.id = 1,
15678c2ecf20Sopenharmony_ci		.num_resources = ARRAY_SIZE(wm831x_status1_resources),
15688c2ecf20Sopenharmony_ci		.resources = wm831x_status1_resources,
15698c2ecf20Sopenharmony_ci	},
15708c2ecf20Sopenharmony_ci	{
15718c2ecf20Sopenharmony_ci		.name = "wm831x-status",
15728c2ecf20Sopenharmony_ci		.id = 2,
15738c2ecf20Sopenharmony_ci		.num_resources = ARRAY_SIZE(wm831x_status2_resources),
15748c2ecf20Sopenharmony_ci		.resources = wm831x_status2_resources,
15758c2ecf20Sopenharmony_ci	},
15768c2ecf20Sopenharmony_ci	{
15778c2ecf20Sopenharmony_ci		.name = "wm831x-watchdog",
15788c2ecf20Sopenharmony_ci		.num_resources = ARRAY_SIZE(wm831x_wdt_resources),
15798c2ecf20Sopenharmony_ci		.resources = wm831x_wdt_resources,
15808c2ecf20Sopenharmony_ci	},
15818c2ecf20Sopenharmony_ci};
15828c2ecf20Sopenharmony_ci
15838c2ecf20Sopenharmony_cistatic const struct mfd_cell touch_devs[] = {
15848c2ecf20Sopenharmony_ci	{
15858c2ecf20Sopenharmony_ci		.name = "wm831x-touch",
15868c2ecf20Sopenharmony_ci		.num_resources = ARRAY_SIZE(wm831x_touch_resources),
15878c2ecf20Sopenharmony_ci		.resources = wm831x_touch_resources,
15888c2ecf20Sopenharmony_ci	},
15898c2ecf20Sopenharmony_ci};
15908c2ecf20Sopenharmony_ci
15918c2ecf20Sopenharmony_cistatic const struct mfd_cell rtc_devs[] = {
15928c2ecf20Sopenharmony_ci	{
15938c2ecf20Sopenharmony_ci		.name = "wm831x-rtc",
15948c2ecf20Sopenharmony_ci		.num_resources = ARRAY_SIZE(wm831x_rtc_resources),
15958c2ecf20Sopenharmony_ci		.resources = wm831x_rtc_resources,
15968c2ecf20Sopenharmony_ci	},
15978c2ecf20Sopenharmony_ci};
15988c2ecf20Sopenharmony_ci
15998c2ecf20Sopenharmony_cistatic const struct mfd_cell backlight_devs[] = {
16008c2ecf20Sopenharmony_ci	{
16018c2ecf20Sopenharmony_ci		.name = "wm831x-backlight",
16028c2ecf20Sopenharmony_ci	},
16038c2ecf20Sopenharmony_ci};
16048c2ecf20Sopenharmony_ci
16058c2ecf20Sopenharmony_cistruct regmap_config wm831x_regmap_config = {
16068c2ecf20Sopenharmony_ci	.reg_bits = 16,
16078c2ecf20Sopenharmony_ci	.val_bits = 16,
16088c2ecf20Sopenharmony_ci
16098c2ecf20Sopenharmony_ci	.cache_type = REGCACHE_RBTREE,
16108c2ecf20Sopenharmony_ci
16118c2ecf20Sopenharmony_ci	.max_register = WM831X_DBE_CHECK_DATA,
16128c2ecf20Sopenharmony_ci	.readable_reg = wm831x_reg_readable,
16138c2ecf20Sopenharmony_ci	.writeable_reg = wm831x_reg_writeable,
16148c2ecf20Sopenharmony_ci	.volatile_reg = wm831x_reg_volatile,
16158c2ecf20Sopenharmony_ci};
16168c2ecf20Sopenharmony_ciEXPORT_SYMBOL_GPL(wm831x_regmap_config);
16178c2ecf20Sopenharmony_ci
16188c2ecf20Sopenharmony_ciconst struct of_device_id wm831x_of_match[] = {
16198c2ecf20Sopenharmony_ci	{ .compatible = "wlf,wm8310", .data = (void *)WM8310 },
16208c2ecf20Sopenharmony_ci	{ .compatible = "wlf,wm8311", .data = (void *)WM8311 },
16218c2ecf20Sopenharmony_ci	{ .compatible = "wlf,wm8312", .data = (void *)WM8312 },
16228c2ecf20Sopenharmony_ci	{ .compatible = "wlf,wm8320", .data = (void *)WM8320 },
16238c2ecf20Sopenharmony_ci	{ .compatible = "wlf,wm8321", .data = (void *)WM8321 },
16248c2ecf20Sopenharmony_ci	{ .compatible = "wlf,wm8325", .data = (void *)WM8325 },
16258c2ecf20Sopenharmony_ci	{ .compatible = "wlf,wm8326", .data = (void *)WM8326 },
16268c2ecf20Sopenharmony_ci	{ },
16278c2ecf20Sopenharmony_ci};
16288c2ecf20Sopenharmony_ciEXPORT_SYMBOL_GPL(wm831x_of_match);
16298c2ecf20Sopenharmony_ci
16308c2ecf20Sopenharmony_ci/*
16318c2ecf20Sopenharmony_ci * Instantiate the generic non-control parts of the device.
16328c2ecf20Sopenharmony_ci */
16338c2ecf20Sopenharmony_ciint wm831x_device_init(struct wm831x *wm831x, int irq)
16348c2ecf20Sopenharmony_ci{
16358c2ecf20Sopenharmony_ci	struct wm831x_pdata *pdata = &wm831x->pdata;
16368c2ecf20Sopenharmony_ci	int rev, wm831x_num;
16378c2ecf20Sopenharmony_ci	enum wm831x_parent parent;
16388c2ecf20Sopenharmony_ci	int ret, i;
16398c2ecf20Sopenharmony_ci
16408c2ecf20Sopenharmony_ci	mutex_init(&wm831x->io_lock);
16418c2ecf20Sopenharmony_ci	mutex_init(&wm831x->key_lock);
16428c2ecf20Sopenharmony_ci	dev_set_drvdata(wm831x->dev, wm831x);
16438c2ecf20Sopenharmony_ci
16448c2ecf20Sopenharmony_ci	wm831x->soft_shutdown = pdata->soft_shutdown;
16458c2ecf20Sopenharmony_ci
16468c2ecf20Sopenharmony_ci	ret = wm831x_reg_read(wm831x, WM831X_PARENT_ID);
16478c2ecf20Sopenharmony_ci	if (ret < 0) {
16488c2ecf20Sopenharmony_ci		dev_err(wm831x->dev, "Failed to read parent ID: %d\n", ret);
16498c2ecf20Sopenharmony_ci		goto err;
16508c2ecf20Sopenharmony_ci	}
16518c2ecf20Sopenharmony_ci	switch (ret) {
16528c2ecf20Sopenharmony_ci	case 0x6204:
16538c2ecf20Sopenharmony_ci	case 0x6246:
16548c2ecf20Sopenharmony_ci		break;
16558c2ecf20Sopenharmony_ci	default:
16568c2ecf20Sopenharmony_ci		dev_err(wm831x->dev, "Device is not a WM831x: ID %x\n", ret);
16578c2ecf20Sopenharmony_ci		ret = -EINVAL;
16588c2ecf20Sopenharmony_ci		goto err;
16598c2ecf20Sopenharmony_ci	}
16608c2ecf20Sopenharmony_ci
16618c2ecf20Sopenharmony_ci	ret = wm831x_reg_read(wm831x, WM831X_REVISION);
16628c2ecf20Sopenharmony_ci	if (ret < 0) {
16638c2ecf20Sopenharmony_ci		dev_err(wm831x->dev, "Failed to read revision: %d\n", ret);
16648c2ecf20Sopenharmony_ci		goto err;
16658c2ecf20Sopenharmony_ci	}
16668c2ecf20Sopenharmony_ci	rev = (ret & WM831X_PARENT_REV_MASK) >> WM831X_PARENT_REV_SHIFT;
16678c2ecf20Sopenharmony_ci
16688c2ecf20Sopenharmony_ci	ret = wm831x_reg_read(wm831x, WM831X_RESET_ID);
16698c2ecf20Sopenharmony_ci	if (ret < 0) {
16708c2ecf20Sopenharmony_ci		dev_err(wm831x->dev, "Failed to read device ID: %d\n", ret);
16718c2ecf20Sopenharmony_ci		goto err;
16728c2ecf20Sopenharmony_ci	}
16738c2ecf20Sopenharmony_ci
16748c2ecf20Sopenharmony_ci	/* Some engineering samples do not have the ID set, rely on
16758c2ecf20Sopenharmony_ci	 * the device being registered correctly.
16768c2ecf20Sopenharmony_ci	 */
16778c2ecf20Sopenharmony_ci	if (ret == 0) {
16788c2ecf20Sopenharmony_ci		dev_info(wm831x->dev, "Device is an engineering sample\n");
16798c2ecf20Sopenharmony_ci		ret = wm831x->type;
16808c2ecf20Sopenharmony_ci	}
16818c2ecf20Sopenharmony_ci
16828c2ecf20Sopenharmony_ci	switch (ret) {
16838c2ecf20Sopenharmony_ci	case WM8310:
16848c2ecf20Sopenharmony_ci		parent = WM8310;
16858c2ecf20Sopenharmony_ci		wm831x->num_gpio = 16;
16868c2ecf20Sopenharmony_ci		wm831x->charger_irq_wake = 1;
16878c2ecf20Sopenharmony_ci		if (rev > 0) {
16888c2ecf20Sopenharmony_ci			wm831x->has_gpio_ena = 1;
16898c2ecf20Sopenharmony_ci			wm831x->has_cs_sts = 1;
16908c2ecf20Sopenharmony_ci		}
16918c2ecf20Sopenharmony_ci
16928c2ecf20Sopenharmony_ci		dev_info(wm831x->dev, "WM8310 revision %c\n", 'A' + rev);
16938c2ecf20Sopenharmony_ci		break;
16948c2ecf20Sopenharmony_ci
16958c2ecf20Sopenharmony_ci	case WM8311:
16968c2ecf20Sopenharmony_ci		parent = WM8311;
16978c2ecf20Sopenharmony_ci		wm831x->num_gpio = 16;
16988c2ecf20Sopenharmony_ci		wm831x->charger_irq_wake = 1;
16998c2ecf20Sopenharmony_ci		if (rev > 0) {
17008c2ecf20Sopenharmony_ci			wm831x->has_gpio_ena = 1;
17018c2ecf20Sopenharmony_ci			wm831x->has_cs_sts = 1;
17028c2ecf20Sopenharmony_ci		}
17038c2ecf20Sopenharmony_ci
17048c2ecf20Sopenharmony_ci		dev_info(wm831x->dev, "WM8311 revision %c\n", 'A' + rev);
17058c2ecf20Sopenharmony_ci		break;
17068c2ecf20Sopenharmony_ci
17078c2ecf20Sopenharmony_ci	case WM8312:
17088c2ecf20Sopenharmony_ci		parent = WM8312;
17098c2ecf20Sopenharmony_ci		wm831x->num_gpio = 16;
17108c2ecf20Sopenharmony_ci		wm831x->charger_irq_wake = 1;
17118c2ecf20Sopenharmony_ci		if (rev > 0) {
17128c2ecf20Sopenharmony_ci			wm831x->has_gpio_ena = 1;
17138c2ecf20Sopenharmony_ci			wm831x->has_cs_sts = 1;
17148c2ecf20Sopenharmony_ci		}
17158c2ecf20Sopenharmony_ci
17168c2ecf20Sopenharmony_ci		dev_info(wm831x->dev, "WM8312 revision %c\n", 'A' + rev);
17178c2ecf20Sopenharmony_ci		break;
17188c2ecf20Sopenharmony_ci
17198c2ecf20Sopenharmony_ci	case WM8320:
17208c2ecf20Sopenharmony_ci		parent = WM8320;
17218c2ecf20Sopenharmony_ci		wm831x->num_gpio = 12;
17228c2ecf20Sopenharmony_ci		dev_info(wm831x->dev, "WM8320 revision %c\n", 'A' + rev);
17238c2ecf20Sopenharmony_ci		break;
17248c2ecf20Sopenharmony_ci
17258c2ecf20Sopenharmony_ci	case WM8321:
17268c2ecf20Sopenharmony_ci		parent = WM8321;
17278c2ecf20Sopenharmony_ci		wm831x->num_gpio = 12;
17288c2ecf20Sopenharmony_ci		dev_info(wm831x->dev, "WM8321 revision %c\n", 'A' + rev);
17298c2ecf20Sopenharmony_ci		break;
17308c2ecf20Sopenharmony_ci
17318c2ecf20Sopenharmony_ci	case WM8325:
17328c2ecf20Sopenharmony_ci		parent = WM8325;
17338c2ecf20Sopenharmony_ci		wm831x->num_gpio = 12;
17348c2ecf20Sopenharmony_ci		dev_info(wm831x->dev, "WM8325 revision %c\n", 'A' + rev);
17358c2ecf20Sopenharmony_ci		break;
17368c2ecf20Sopenharmony_ci
17378c2ecf20Sopenharmony_ci	case WM8326:
17388c2ecf20Sopenharmony_ci		parent = WM8326;
17398c2ecf20Sopenharmony_ci		wm831x->num_gpio = 12;
17408c2ecf20Sopenharmony_ci		dev_info(wm831x->dev, "WM8326 revision %c\n", 'A' + rev);
17418c2ecf20Sopenharmony_ci		break;
17428c2ecf20Sopenharmony_ci
17438c2ecf20Sopenharmony_ci	default:
17448c2ecf20Sopenharmony_ci		dev_err(wm831x->dev, "Unknown WM831x device %04x\n", ret);
17458c2ecf20Sopenharmony_ci		ret = -EINVAL;
17468c2ecf20Sopenharmony_ci		goto err;
17478c2ecf20Sopenharmony_ci	}
17488c2ecf20Sopenharmony_ci
17498c2ecf20Sopenharmony_ci	/* This will need revisiting in future but is OK for all
17508c2ecf20Sopenharmony_ci	 * current parts.
17518c2ecf20Sopenharmony_ci	 */
17528c2ecf20Sopenharmony_ci	if (parent != wm831x->type)
17538c2ecf20Sopenharmony_ci		dev_warn(wm831x->dev, "Device was registered as a WM%x\n",
17548c2ecf20Sopenharmony_ci			 wm831x->type);
17558c2ecf20Sopenharmony_ci
17568c2ecf20Sopenharmony_ci	/* Bootstrap the user key */
17578c2ecf20Sopenharmony_ci	ret = wm831x_reg_read(wm831x, WM831X_SECURITY_KEY);
17588c2ecf20Sopenharmony_ci	if (ret < 0) {
17598c2ecf20Sopenharmony_ci		dev_err(wm831x->dev, "Failed to read security key: %d\n", ret);
17608c2ecf20Sopenharmony_ci		goto err;
17618c2ecf20Sopenharmony_ci	}
17628c2ecf20Sopenharmony_ci	if (ret != 0) {
17638c2ecf20Sopenharmony_ci		dev_warn(wm831x->dev, "Security key had non-zero value %x\n",
17648c2ecf20Sopenharmony_ci			 ret);
17658c2ecf20Sopenharmony_ci		wm831x_reg_write(wm831x, WM831X_SECURITY_KEY, 0);
17668c2ecf20Sopenharmony_ci	}
17678c2ecf20Sopenharmony_ci	wm831x->locked = 1;
17688c2ecf20Sopenharmony_ci
17698c2ecf20Sopenharmony_ci	if (pdata->pre_init) {
17708c2ecf20Sopenharmony_ci		ret = pdata->pre_init(wm831x);
17718c2ecf20Sopenharmony_ci		if (ret != 0) {
17728c2ecf20Sopenharmony_ci			dev_err(wm831x->dev, "pre_init() failed: %d\n", ret);
17738c2ecf20Sopenharmony_ci			goto err;
17748c2ecf20Sopenharmony_ci		}
17758c2ecf20Sopenharmony_ci	}
17768c2ecf20Sopenharmony_ci
17778c2ecf20Sopenharmony_ci	for (i = 0; i < ARRAY_SIZE(pdata->gpio_defaults); i++) {
17788c2ecf20Sopenharmony_ci		if (!pdata->gpio_defaults[i])
17798c2ecf20Sopenharmony_ci			continue;
17808c2ecf20Sopenharmony_ci
17818c2ecf20Sopenharmony_ci		wm831x_reg_write(wm831x,
17828c2ecf20Sopenharmony_ci				 WM831X_GPIO1_CONTROL + i,
17838c2ecf20Sopenharmony_ci				 pdata->gpio_defaults[i] & 0xffff);
17848c2ecf20Sopenharmony_ci	}
17858c2ecf20Sopenharmony_ci
17868c2ecf20Sopenharmony_ci	/* Multiply by 10 as we have many subdevices of the same type */
17878c2ecf20Sopenharmony_ci	if (pdata->wm831x_num)
17888c2ecf20Sopenharmony_ci		wm831x_num = pdata->wm831x_num * 10;
17898c2ecf20Sopenharmony_ci	else
17908c2ecf20Sopenharmony_ci		wm831x_num = -1;
17918c2ecf20Sopenharmony_ci
17928c2ecf20Sopenharmony_ci	ret = wm831x_irq_init(wm831x, irq);
17938c2ecf20Sopenharmony_ci	if (ret != 0)
17948c2ecf20Sopenharmony_ci		goto err;
17958c2ecf20Sopenharmony_ci
17968c2ecf20Sopenharmony_ci	wm831x_auxadc_init(wm831x);
17978c2ecf20Sopenharmony_ci
17988c2ecf20Sopenharmony_ci	/* The core device is up, instantiate the subdevices. */
17998c2ecf20Sopenharmony_ci	switch (parent) {
18008c2ecf20Sopenharmony_ci	case WM8310:
18018c2ecf20Sopenharmony_ci		ret = mfd_add_devices(wm831x->dev, wm831x_num,
18028c2ecf20Sopenharmony_ci				      wm8310_devs, ARRAY_SIZE(wm8310_devs),
18038c2ecf20Sopenharmony_ci				      NULL, 0, NULL);
18048c2ecf20Sopenharmony_ci		break;
18058c2ecf20Sopenharmony_ci
18068c2ecf20Sopenharmony_ci	case WM8311:
18078c2ecf20Sopenharmony_ci		ret = mfd_add_devices(wm831x->dev, wm831x_num,
18088c2ecf20Sopenharmony_ci				      wm8311_devs, ARRAY_SIZE(wm8311_devs),
18098c2ecf20Sopenharmony_ci				      NULL, 0, NULL);
18108c2ecf20Sopenharmony_ci		if (!pdata->disable_touch)
18118c2ecf20Sopenharmony_ci			mfd_add_devices(wm831x->dev, wm831x_num,
18128c2ecf20Sopenharmony_ci					touch_devs, ARRAY_SIZE(touch_devs),
18138c2ecf20Sopenharmony_ci					NULL, 0, NULL);
18148c2ecf20Sopenharmony_ci		break;
18158c2ecf20Sopenharmony_ci
18168c2ecf20Sopenharmony_ci	case WM8312:
18178c2ecf20Sopenharmony_ci		ret = mfd_add_devices(wm831x->dev, wm831x_num,
18188c2ecf20Sopenharmony_ci				      wm8312_devs, ARRAY_SIZE(wm8312_devs),
18198c2ecf20Sopenharmony_ci				      NULL, 0, NULL);
18208c2ecf20Sopenharmony_ci		if (!pdata->disable_touch)
18218c2ecf20Sopenharmony_ci			mfd_add_devices(wm831x->dev, wm831x_num,
18228c2ecf20Sopenharmony_ci					touch_devs, ARRAY_SIZE(touch_devs),
18238c2ecf20Sopenharmony_ci					NULL, 0, NULL);
18248c2ecf20Sopenharmony_ci		break;
18258c2ecf20Sopenharmony_ci
18268c2ecf20Sopenharmony_ci	case WM8320:
18278c2ecf20Sopenharmony_ci	case WM8321:
18288c2ecf20Sopenharmony_ci	case WM8325:
18298c2ecf20Sopenharmony_ci	case WM8326:
18308c2ecf20Sopenharmony_ci		ret = mfd_add_devices(wm831x->dev, wm831x_num,
18318c2ecf20Sopenharmony_ci				      wm8320_devs, ARRAY_SIZE(wm8320_devs),
18328c2ecf20Sopenharmony_ci				      NULL, 0, NULL);
18338c2ecf20Sopenharmony_ci		break;
18348c2ecf20Sopenharmony_ci
18358c2ecf20Sopenharmony_ci	default:
18368c2ecf20Sopenharmony_ci		/* If this happens the bus probe function is buggy */
18378c2ecf20Sopenharmony_ci		BUG();
18388c2ecf20Sopenharmony_ci	}
18398c2ecf20Sopenharmony_ci
18408c2ecf20Sopenharmony_ci	if (ret != 0) {
18418c2ecf20Sopenharmony_ci		dev_err(wm831x->dev, "Failed to add children\n");
18428c2ecf20Sopenharmony_ci		goto err_irq;
18438c2ecf20Sopenharmony_ci	}
18448c2ecf20Sopenharmony_ci
18458c2ecf20Sopenharmony_ci	/* The RTC can only be used if the 32.768kHz crystal is
18468c2ecf20Sopenharmony_ci	 * enabled; this can't be controlled by software at runtime.
18478c2ecf20Sopenharmony_ci	 */
18488c2ecf20Sopenharmony_ci	ret = wm831x_reg_read(wm831x, WM831X_CLOCK_CONTROL_2);
18498c2ecf20Sopenharmony_ci	if (ret < 0) {
18508c2ecf20Sopenharmony_ci		dev_err(wm831x->dev, "Failed to read clock status: %d\n", ret);
18518c2ecf20Sopenharmony_ci		goto err_irq;
18528c2ecf20Sopenharmony_ci	}
18538c2ecf20Sopenharmony_ci
18548c2ecf20Sopenharmony_ci	if (ret & WM831X_XTAL_ENA) {
18558c2ecf20Sopenharmony_ci		ret = mfd_add_devices(wm831x->dev, wm831x_num,
18568c2ecf20Sopenharmony_ci				      rtc_devs, ARRAY_SIZE(rtc_devs),
18578c2ecf20Sopenharmony_ci				      NULL, 0, NULL);
18588c2ecf20Sopenharmony_ci		if (ret != 0) {
18598c2ecf20Sopenharmony_ci			dev_err(wm831x->dev, "Failed to add RTC: %d\n", ret);
18608c2ecf20Sopenharmony_ci			goto err_irq;
18618c2ecf20Sopenharmony_ci		}
18628c2ecf20Sopenharmony_ci	} else {
18638c2ecf20Sopenharmony_ci		dev_info(wm831x->dev, "32.768kHz clock disabled, no RTC\n");
18648c2ecf20Sopenharmony_ci	}
18658c2ecf20Sopenharmony_ci
18668c2ecf20Sopenharmony_ci	if (pdata->backlight) {
18678c2ecf20Sopenharmony_ci		/* Treat errors as non-critical */
18688c2ecf20Sopenharmony_ci		ret = mfd_add_devices(wm831x->dev, wm831x_num, backlight_devs,
18698c2ecf20Sopenharmony_ci				      ARRAY_SIZE(backlight_devs), NULL,
18708c2ecf20Sopenharmony_ci				      0, NULL);
18718c2ecf20Sopenharmony_ci		if (ret < 0)
18728c2ecf20Sopenharmony_ci			dev_err(wm831x->dev, "Failed to add backlight: %d\n",
18738c2ecf20Sopenharmony_ci				ret);
18748c2ecf20Sopenharmony_ci	}
18758c2ecf20Sopenharmony_ci
18768c2ecf20Sopenharmony_ci	wm831x_otp_init(wm831x);
18778c2ecf20Sopenharmony_ci
18788c2ecf20Sopenharmony_ci	if (pdata->post_init) {
18798c2ecf20Sopenharmony_ci		ret = pdata->post_init(wm831x);
18808c2ecf20Sopenharmony_ci		if (ret != 0) {
18818c2ecf20Sopenharmony_ci			dev_err(wm831x->dev, "post_init() failed: %d\n", ret);
18828c2ecf20Sopenharmony_ci			goto err_irq;
18838c2ecf20Sopenharmony_ci		}
18848c2ecf20Sopenharmony_ci	}
18858c2ecf20Sopenharmony_ci
18868c2ecf20Sopenharmony_ci	return 0;
18878c2ecf20Sopenharmony_ci
18888c2ecf20Sopenharmony_cierr_irq:
18898c2ecf20Sopenharmony_ci	wm831x_irq_exit(wm831x);
18908c2ecf20Sopenharmony_cierr:
18918c2ecf20Sopenharmony_ci	mfd_remove_devices(wm831x->dev);
18928c2ecf20Sopenharmony_ci	return ret;
18938c2ecf20Sopenharmony_ci}
18948c2ecf20Sopenharmony_ci
18958c2ecf20Sopenharmony_ciint wm831x_device_suspend(struct wm831x *wm831x)
18968c2ecf20Sopenharmony_ci{
18978c2ecf20Sopenharmony_ci	int reg, mask;
18988c2ecf20Sopenharmony_ci
18998c2ecf20Sopenharmony_ci	/* If the charger IRQs are a wake source then make sure we ack
19008c2ecf20Sopenharmony_ci	 * them even if they're not actively being used (eg, no power
19018c2ecf20Sopenharmony_ci	 * driver or no IRQ line wired up) then acknowledge the
19028c2ecf20Sopenharmony_ci	 * interrupts otherwise suspend won't last very long.
19038c2ecf20Sopenharmony_ci	 */
19048c2ecf20Sopenharmony_ci	if (wm831x->charger_irq_wake) {
19058c2ecf20Sopenharmony_ci		reg = wm831x_reg_read(wm831x, WM831X_INTERRUPT_STATUS_2_MASK);
19068c2ecf20Sopenharmony_ci
19078c2ecf20Sopenharmony_ci		mask = WM831X_CHG_BATT_HOT_EINT |
19088c2ecf20Sopenharmony_ci			WM831X_CHG_BATT_COLD_EINT |
19098c2ecf20Sopenharmony_ci			WM831X_CHG_BATT_FAIL_EINT |
19108c2ecf20Sopenharmony_ci			WM831X_CHG_OV_EINT | WM831X_CHG_END_EINT |
19118c2ecf20Sopenharmony_ci			WM831X_CHG_TO_EINT | WM831X_CHG_MODE_EINT |
19128c2ecf20Sopenharmony_ci			WM831X_CHG_START_EINT;
19138c2ecf20Sopenharmony_ci
19148c2ecf20Sopenharmony_ci		/* If any of the interrupts are masked read the statuses */
19158c2ecf20Sopenharmony_ci		if (reg & mask)
19168c2ecf20Sopenharmony_ci			reg = wm831x_reg_read(wm831x,
19178c2ecf20Sopenharmony_ci					      WM831X_INTERRUPT_STATUS_2);
19188c2ecf20Sopenharmony_ci
19198c2ecf20Sopenharmony_ci		if (reg & mask) {
19208c2ecf20Sopenharmony_ci			dev_info(wm831x->dev,
19218c2ecf20Sopenharmony_ci				 "Acknowledging masked charger IRQs: %x\n",
19228c2ecf20Sopenharmony_ci				 reg & mask);
19238c2ecf20Sopenharmony_ci			wm831x_reg_write(wm831x, WM831X_INTERRUPT_STATUS_2,
19248c2ecf20Sopenharmony_ci					 reg & mask);
19258c2ecf20Sopenharmony_ci		}
19268c2ecf20Sopenharmony_ci	}
19278c2ecf20Sopenharmony_ci
19288c2ecf20Sopenharmony_ci	return 0;
19298c2ecf20Sopenharmony_ci}
19308c2ecf20Sopenharmony_ci
19318c2ecf20Sopenharmony_civoid wm831x_device_shutdown(struct wm831x *wm831x)
19328c2ecf20Sopenharmony_ci{
19338c2ecf20Sopenharmony_ci	if (wm831x->soft_shutdown) {
19348c2ecf20Sopenharmony_ci		dev_info(wm831x->dev, "Initiating shutdown...\n");
19358c2ecf20Sopenharmony_ci		wm831x_set_bits(wm831x, WM831X_POWER_STATE, WM831X_CHIP_ON, 0);
19368c2ecf20Sopenharmony_ci	}
19378c2ecf20Sopenharmony_ci}
19388c2ecf20Sopenharmony_ciEXPORT_SYMBOL_GPL(wm831x_device_shutdown);
1939