162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Intel BXT WhiskeyCove PMIC operation region driver
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * Copyright (C) 2015 Intel Corporation. All rights reserved.
662306a36Sopenharmony_ci */
762306a36Sopenharmony_ci
862306a36Sopenharmony_ci#include <linux/init.h>
962306a36Sopenharmony_ci#include <linux/acpi.h>
1062306a36Sopenharmony_ci#include <linux/mfd/intel_soc_pmic.h>
1162306a36Sopenharmony_ci#include <linux/regmap.h>
1262306a36Sopenharmony_ci#include <linux/platform_device.h>
1362306a36Sopenharmony_ci#include "intel_pmic.h"
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_ci#define WHISKEY_COVE_ALRT_HIGH_BIT_MASK 0x0F
1662306a36Sopenharmony_ci#define WHISKEY_COVE_ADC_HIGH_BIT(x)	(((x & 0x0F) << 8))
1762306a36Sopenharmony_ci#define WHISKEY_COVE_ADC_CURSRC(x)	(((x & 0xF0) >> 4))
1862306a36Sopenharmony_ci#define VR_MODE_DISABLED        0
1962306a36Sopenharmony_ci#define VR_MODE_AUTO            BIT(0)
2062306a36Sopenharmony_ci#define VR_MODE_NORMAL          BIT(1)
2162306a36Sopenharmony_ci#define VR_MODE_SWITCH          BIT(2)
2262306a36Sopenharmony_ci#define VR_MODE_ECO             (BIT(0)|BIT(1))
2362306a36Sopenharmony_ci#define VSWITCH2_OUTPUT         BIT(5)
2462306a36Sopenharmony_ci#define VSWITCH1_OUTPUT         BIT(4)
2562306a36Sopenharmony_ci#define VUSBPHY_CHARGE          BIT(1)
2662306a36Sopenharmony_ci
2762306a36Sopenharmony_cistatic struct pmic_table power_table[] = {
2862306a36Sopenharmony_ci	{
2962306a36Sopenharmony_ci		.address = 0x0,
3062306a36Sopenharmony_ci		.reg = 0x63,
3162306a36Sopenharmony_ci		.bit = VR_MODE_AUTO,
3262306a36Sopenharmony_ci	}, /* VDD1 -> VDD1CNT */
3362306a36Sopenharmony_ci	{
3462306a36Sopenharmony_ci		.address = 0x04,
3562306a36Sopenharmony_ci		.reg = 0x65,
3662306a36Sopenharmony_ci		.bit = VR_MODE_AUTO,
3762306a36Sopenharmony_ci	}, /* VDD2 -> VDD2CNT */
3862306a36Sopenharmony_ci	{
3962306a36Sopenharmony_ci		.address = 0x08,
4062306a36Sopenharmony_ci		.reg = 0x67,
4162306a36Sopenharmony_ci		.bit = VR_MODE_AUTO,
4262306a36Sopenharmony_ci	}, /* VDD3 -> VDD3CNT */
4362306a36Sopenharmony_ci	{
4462306a36Sopenharmony_ci		.address = 0x0c,
4562306a36Sopenharmony_ci		.reg = 0x6d,
4662306a36Sopenharmony_ci		.bit = VR_MODE_AUTO,
4762306a36Sopenharmony_ci	}, /* VLFX -> VFLEXCNT */
4862306a36Sopenharmony_ci	{
4962306a36Sopenharmony_ci		.address = 0x10,
5062306a36Sopenharmony_ci		.reg = 0x6f,
5162306a36Sopenharmony_ci		.bit = VR_MODE_NORMAL,
5262306a36Sopenharmony_ci	}, /* VP1A -> VPROG1ACNT */
5362306a36Sopenharmony_ci	{
5462306a36Sopenharmony_ci		.address = 0x14,
5562306a36Sopenharmony_ci		.reg = 0x70,
5662306a36Sopenharmony_ci		.bit = VR_MODE_NORMAL,
5762306a36Sopenharmony_ci	}, /* VP1B -> VPROG1BCNT */
5862306a36Sopenharmony_ci	{
5962306a36Sopenharmony_ci		.address = 0x18,
6062306a36Sopenharmony_ci		.reg = 0x71,
6162306a36Sopenharmony_ci		.bit = VR_MODE_NORMAL,
6262306a36Sopenharmony_ci	}, /* VP1C -> VPROG1CCNT */
6362306a36Sopenharmony_ci	{
6462306a36Sopenharmony_ci		.address = 0x1c,
6562306a36Sopenharmony_ci		.reg = 0x72,
6662306a36Sopenharmony_ci		.bit = VR_MODE_NORMAL,
6762306a36Sopenharmony_ci	}, /* VP1D -> VPROG1DCNT */
6862306a36Sopenharmony_ci	{
6962306a36Sopenharmony_ci		.address = 0x20,
7062306a36Sopenharmony_ci		.reg = 0x73,
7162306a36Sopenharmony_ci		.bit = VR_MODE_NORMAL,
7262306a36Sopenharmony_ci	}, /* VP2A -> VPROG2ACNT */
7362306a36Sopenharmony_ci	{
7462306a36Sopenharmony_ci		.address = 0x24,
7562306a36Sopenharmony_ci		.reg = 0x74,
7662306a36Sopenharmony_ci		.bit = VR_MODE_NORMAL,
7762306a36Sopenharmony_ci	}, /* VP2B -> VPROG2BCNT */
7862306a36Sopenharmony_ci	{
7962306a36Sopenharmony_ci		.address = 0x28,
8062306a36Sopenharmony_ci		.reg = 0x75,
8162306a36Sopenharmony_ci		.bit = VR_MODE_NORMAL,
8262306a36Sopenharmony_ci	}, /* VP2C -> VPROG2CCNT */
8362306a36Sopenharmony_ci	{
8462306a36Sopenharmony_ci		.address = 0x2c,
8562306a36Sopenharmony_ci		.reg = 0x76,
8662306a36Sopenharmony_ci		.bit = VR_MODE_NORMAL,
8762306a36Sopenharmony_ci	}, /* VP3A -> VPROG3ACNT */
8862306a36Sopenharmony_ci	{
8962306a36Sopenharmony_ci		.address = 0x30,
9062306a36Sopenharmony_ci		.reg = 0x77,
9162306a36Sopenharmony_ci		.bit = VR_MODE_NORMAL,
9262306a36Sopenharmony_ci	}, /* VP3B -> VPROG3BCNT */
9362306a36Sopenharmony_ci	{
9462306a36Sopenharmony_ci		.address = 0x34,
9562306a36Sopenharmony_ci		.reg = 0x78,
9662306a36Sopenharmony_ci		.bit = VSWITCH2_OUTPUT,
9762306a36Sopenharmony_ci	}, /* VSW2 -> VLD0CNT Bit 5*/
9862306a36Sopenharmony_ci	{
9962306a36Sopenharmony_ci		.address = 0x38,
10062306a36Sopenharmony_ci		.reg = 0x78,
10162306a36Sopenharmony_ci		.bit = VSWITCH1_OUTPUT,
10262306a36Sopenharmony_ci	}, /* VSW1 -> VLD0CNT Bit 4 */
10362306a36Sopenharmony_ci	{
10462306a36Sopenharmony_ci		.address = 0x3c,
10562306a36Sopenharmony_ci		.reg = 0x78,
10662306a36Sopenharmony_ci		.bit = VUSBPHY_CHARGE,
10762306a36Sopenharmony_ci	}, /* VUPY -> VLDOCNT Bit 1 */
10862306a36Sopenharmony_ci	{
10962306a36Sopenharmony_ci		.address = 0x40,
11062306a36Sopenharmony_ci		.reg = 0x7b,
11162306a36Sopenharmony_ci		.bit = VR_MODE_NORMAL,
11262306a36Sopenharmony_ci	}, /* VRSO -> VREFSOCCNT*/
11362306a36Sopenharmony_ci	{
11462306a36Sopenharmony_ci		.address = 0x44,
11562306a36Sopenharmony_ci		.reg = 0xA0,
11662306a36Sopenharmony_ci		.bit = VR_MODE_NORMAL,
11762306a36Sopenharmony_ci	}, /* VP1E -> VPROG1ECNT */
11862306a36Sopenharmony_ci	{
11962306a36Sopenharmony_ci		.address = 0x48,
12062306a36Sopenharmony_ci		.reg = 0xA1,
12162306a36Sopenharmony_ci		.bit = VR_MODE_NORMAL,
12262306a36Sopenharmony_ci	}, /* VP1F -> VPROG1FCNT */
12362306a36Sopenharmony_ci	{
12462306a36Sopenharmony_ci		.address = 0x4c,
12562306a36Sopenharmony_ci		.reg = 0xA2,
12662306a36Sopenharmony_ci		.bit = VR_MODE_NORMAL,
12762306a36Sopenharmony_ci	}, /* VP2D -> VPROG2DCNT */
12862306a36Sopenharmony_ci	{
12962306a36Sopenharmony_ci		.address = 0x50,
13062306a36Sopenharmony_ci		.reg = 0xA3,
13162306a36Sopenharmony_ci		.bit = VR_MODE_NORMAL,
13262306a36Sopenharmony_ci	}, /* VP4A -> VPROG4ACNT */
13362306a36Sopenharmony_ci	{
13462306a36Sopenharmony_ci		.address = 0x54,
13562306a36Sopenharmony_ci		.reg = 0xA4,
13662306a36Sopenharmony_ci		.bit = VR_MODE_NORMAL,
13762306a36Sopenharmony_ci	}, /* VP4B -> VPROG4BCNT */
13862306a36Sopenharmony_ci	{
13962306a36Sopenharmony_ci		.address = 0x58,
14062306a36Sopenharmony_ci		.reg = 0xA5,
14162306a36Sopenharmony_ci		.bit = VR_MODE_NORMAL,
14262306a36Sopenharmony_ci	}, /* VP4C -> VPROG4CCNT */
14362306a36Sopenharmony_ci	{
14462306a36Sopenharmony_ci		.address = 0x5c,
14562306a36Sopenharmony_ci		.reg = 0xA6,
14662306a36Sopenharmony_ci		.bit = VR_MODE_NORMAL,
14762306a36Sopenharmony_ci	}, /* VP4D -> VPROG4DCNT */
14862306a36Sopenharmony_ci	{
14962306a36Sopenharmony_ci		.address = 0x60,
15062306a36Sopenharmony_ci		.reg = 0xA7,
15162306a36Sopenharmony_ci		.bit = VR_MODE_NORMAL,
15262306a36Sopenharmony_ci	}, /* VP5A -> VPROG5ACNT */
15362306a36Sopenharmony_ci	{
15462306a36Sopenharmony_ci		.address = 0x64,
15562306a36Sopenharmony_ci		.reg = 0xA8,
15662306a36Sopenharmony_ci		.bit = VR_MODE_NORMAL,
15762306a36Sopenharmony_ci	}, /* VP5B -> VPROG5BCNT */
15862306a36Sopenharmony_ci	{
15962306a36Sopenharmony_ci		.address = 0x68,
16062306a36Sopenharmony_ci		.reg = 0xA9,
16162306a36Sopenharmony_ci		.bit = VR_MODE_NORMAL,
16262306a36Sopenharmony_ci	}, /* VP6A -> VPROG6ACNT */
16362306a36Sopenharmony_ci	{
16462306a36Sopenharmony_ci		.address = 0x6c,
16562306a36Sopenharmony_ci		.reg = 0xAA,
16662306a36Sopenharmony_ci		.bit = VR_MODE_NORMAL,
16762306a36Sopenharmony_ci	}, /* VP6B -> VPROG6BCNT */
16862306a36Sopenharmony_ci	{
16962306a36Sopenharmony_ci		.address = 0x70,
17062306a36Sopenharmony_ci		.reg = 0x36,
17162306a36Sopenharmony_ci		.bit = BIT(2),
17262306a36Sopenharmony_ci	}, /* SDWN_N -> MODEMCTRL Bit 2 */
17362306a36Sopenharmony_ci	{
17462306a36Sopenharmony_ci		.address = 0x74,
17562306a36Sopenharmony_ci		.reg = 0x36,
17662306a36Sopenharmony_ci		.bit = BIT(0),
17762306a36Sopenharmony_ci	} /* MOFF -> MODEMCTRL Bit 0 */
17862306a36Sopenharmony_ci};
17962306a36Sopenharmony_ci
18062306a36Sopenharmony_cistatic struct pmic_table thermal_table[] = {
18162306a36Sopenharmony_ci	{
18262306a36Sopenharmony_ci		.address = 0x00,
18362306a36Sopenharmony_ci		.reg = 0x4F39
18462306a36Sopenharmony_ci	},
18562306a36Sopenharmony_ci	{
18662306a36Sopenharmony_ci		.address = 0x04,
18762306a36Sopenharmony_ci		.reg = 0x4F24
18862306a36Sopenharmony_ci	},
18962306a36Sopenharmony_ci	{
19062306a36Sopenharmony_ci		.address = 0x08,
19162306a36Sopenharmony_ci		.reg = 0x4F26
19262306a36Sopenharmony_ci	},
19362306a36Sopenharmony_ci	{
19462306a36Sopenharmony_ci		.address = 0x0c,
19562306a36Sopenharmony_ci		.reg = 0x4F3B
19662306a36Sopenharmony_ci	},
19762306a36Sopenharmony_ci	{
19862306a36Sopenharmony_ci		.address = 0x10,
19962306a36Sopenharmony_ci		.reg = 0x4F28
20062306a36Sopenharmony_ci	},
20162306a36Sopenharmony_ci	{
20262306a36Sopenharmony_ci		.address = 0x14,
20362306a36Sopenharmony_ci		.reg = 0x4F2A
20462306a36Sopenharmony_ci	},
20562306a36Sopenharmony_ci	{
20662306a36Sopenharmony_ci		.address = 0x18,
20762306a36Sopenharmony_ci		.reg = 0x4F3D
20862306a36Sopenharmony_ci	},
20962306a36Sopenharmony_ci	{
21062306a36Sopenharmony_ci		.address = 0x1c,
21162306a36Sopenharmony_ci		.reg = 0x4F2C
21262306a36Sopenharmony_ci	},
21362306a36Sopenharmony_ci	{
21462306a36Sopenharmony_ci		.address = 0x20,
21562306a36Sopenharmony_ci		.reg = 0x4F2E
21662306a36Sopenharmony_ci	},
21762306a36Sopenharmony_ci	{
21862306a36Sopenharmony_ci		.address = 0x24,
21962306a36Sopenharmony_ci		.reg = 0x4F3F
22062306a36Sopenharmony_ci	},
22162306a36Sopenharmony_ci	{
22262306a36Sopenharmony_ci		.address = 0x28,
22362306a36Sopenharmony_ci		.reg = 0x4F30
22462306a36Sopenharmony_ci	},
22562306a36Sopenharmony_ci	{
22662306a36Sopenharmony_ci		.address = 0x30,
22762306a36Sopenharmony_ci		.reg = 0x4F41
22862306a36Sopenharmony_ci	},
22962306a36Sopenharmony_ci	{
23062306a36Sopenharmony_ci		.address = 0x34,
23162306a36Sopenharmony_ci		.reg = 0x4F32
23262306a36Sopenharmony_ci	},
23362306a36Sopenharmony_ci	{
23462306a36Sopenharmony_ci		.address = 0x3c,
23562306a36Sopenharmony_ci		.reg = 0x4F43
23662306a36Sopenharmony_ci	},
23762306a36Sopenharmony_ci	{
23862306a36Sopenharmony_ci		.address = 0x40,
23962306a36Sopenharmony_ci		.reg = 0x4F34
24062306a36Sopenharmony_ci	},
24162306a36Sopenharmony_ci	{
24262306a36Sopenharmony_ci		.address = 0x48,
24362306a36Sopenharmony_ci		.reg = 0x4F6A,
24462306a36Sopenharmony_ci		.bit = 0,
24562306a36Sopenharmony_ci	},
24662306a36Sopenharmony_ci	{
24762306a36Sopenharmony_ci		.address = 0x4C,
24862306a36Sopenharmony_ci		.reg = 0x4F6A,
24962306a36Sopenharmony_ci		.bit = 1
25062306a36Sopenharmony_ci	},
25162306a36Sopenharmony_ci	{
25262306a36Sopenharmony_ci		.address = 0x50,
25362306a36Sopenharmony_ci		.reg = 0x4F6A,
25462306a36Sopenharmony_ci		.bit = 2
25562306a36Sopenharmony_ci	},
25662306a36Sopenharmony_ci	{
25762306a36Sopenharmony_ci		.address = 0x54,
25862306a36Sopenharmony_ci		.reg = 0x4F6A,
25962306a36Sopenharmony_ci		.bit = 4
26062306a36Sopenharmony_ci	},
26162306a36Sopenharmony_ci	{
26262306a36Sopenharmony_ci		.address = 0x58,
26362306a36Sopenharmony_ci		.reg = 0x4F6A,
26462306a36Sopenharmony_ci		.bit = 5
26562306a36Sopenharmony_ci	},
26662306a36Sopenharmony_ci	{
26762306a36Sopenharmony_ci		.address = 0x5C,
26862306a36Sopenharmony_ci		.reg = 0x4F6A,
26962306a36Sopenharmony_ci		.bit = 3
27062306a36Sopenharmony_ci	},
27162306a36Sopenharmony_ci};
27262306a36Sopenharmony_ci
27362306a36Sopenharmony_cistatic int intel_bxtwc_pmic_get_power(struct regmap *regmap, int reg,
27462306a36Sopenharmony_ci		int bit, u64 *value)
27562306a36Sopenharmony_ci{
27662306a36Sopenharmony_ci	int data;
27762306a36Sopenharmony_ci
27862306a36Sopenharmony_ci	if (regmap_read(regmap, reg, &data))
27962306a36Sopenharmony_ci		return -EIO;
28062306a36Sopenharmony_ci
28162306a36Sopenharmony_ci	*value = (data & bit) ? 1 : 0;
28262306a36Sopenharmony_ci	return 0;
28362306a36Sopenharmony_ci}
28462306a36Sopenharmony_ci
28562306a36Sopenharmony_cistatic int intel_bxtwc_pmic_update_power(struct regmap *regmap, int reg,
28662306a36Sopenharmony_ci		int bit, bool on)
28762306a36Sopenharmony_ci{
28862306a36Sopenharmony_ci	u8 val, mask = bit;
28962306a36Sopenharmony_ci
29062306a36Sopenharmony_ci	if (on)
29162306a36Sopenharmony_ci		val = 0xFF;
29262306a36Sopenharmony_ci	else
29362306a36Sopenharmony_ci		val = 0x0;
29462306a36Sopenharmony_ci
29562306a36Sopenharmony_ci	return regmap_update_bits(regmap, reg, mask, val);
29662306a36Sopenharmony_ci}
29762306a36Sopenharmony_ci
29862306a36Sopenharmony_cistatic int intel_bxtwc_pmic_get_raw_temp(struct regmap *regmap, int reg)
29962306a36Sopenharmony_ci{
30062306a36Sopenharmony_ci	unsigned int val, adc_val, reg_val;
30162306a36Sopenharmony_ci	u8 temp_l, temp_h, cursrc;
30262306a36Sopenharmony_ci	unsigned long rlsb;
30362306a36Sopenharmony_ci	static const unsigned long rlsb_array[] = {
30462306a36Sopenharmony_ci		0, 260420, 130210, 65100, 32550, 16280,
30562306a36Sopenharmony_ci		8140, 4070, 2030, 0, 260420, 130210 };
30662306a36Sopenharmony_ci
30762306a36Sopenharmony_ci	if (regmap_read(regmap, reg, &val))
30862306a36Sopenharmony_ci		return -EIO;
30962306a36Sopenharmony_ci	temp_l = (u8) val;
31062306a36Sopenharmony_ci
31162306a36Sopenharmony_ci	if (regmap_read(regmap, (reg - 1), &val))
31262306a36Sopenharmony_ci		return -EIO;
31362306a36Sopenharmony_ci	temp_h = (u8) val;
31462306a36Sopenharmony_ci
31562306a36Sopenharmony_ci	reg_val = temp_l | WHISKEY_COVE_ADC_HIGH_BIT(temp_h);
31662306a36Sopenharmony_ci	cursrc = WHISKEY_COVE_ADC_CURSRC(temp_h);
31762306a36Sopenharmony_ci	rlsb = rlsb_array[cursrc];
31862306a36Sopenharmony_ci	adc_val = reg_val * rlsb / 1000;
31962306a36Sopenharmony_ci
32062306a36Sopenharmony_ci	return adc_val;
32162306a36Sopenharmony_ci}
32262306a36Sopenharmony_ci
32362306a36Sopenharmony_cistatic int
32462306a36Sopenharmony_ciintel_bxtwc_pmic_update_aux(struct regmap *regmap, int reg, int raw)
32562306a36Sopenharmony_ci{
32662306a36Sopenharmony_ci	u32 bsr_num;
32762306a36Sopenharmony_ci	u16 resi_val, count = 0, thrsh = 0;
32862306a36Sopenharmony_ci	u8 alrt_h, alrt_l, cursel = 0;
32962306a36Sopenharmony_ci
33062306a36Sopenharmony_ci	bsr_num = raw;
33162306a36Sopenharmony_ci	bsr_num /= (1 << 5);
33262306a36Sopenharmony_ci
33362306a36Sopenharmony_ci	count = fls(bsr_num) - 1;
33462306a36Sopenharmony_ci
33562306a36Sopenharmony_ci	cursel = clamp_t(s8, (count - 7), 0, 7);
33662306a36Sopenharmony_ci	thrsh = raw / (1 << (4 + cursel));
33762306a36Sopenharmony_ci
33862306a36Sopenharmony_ci	resi_val = (cursel << 9) | thrsh;
33962306a36Sopenharmony_ci	alrt_h = (resi_val >> 8) & WHISKEY_COVE_ALRT_HIGH_BIT_MASK;
34062306a36Sopenharmony_ci	if (regmap_update_bits(regmap,
34162306a36Sopenharmony_ci				reg - 1,
34262306a36Sopenharmony_ci				WHISKEY_COVE_ALRT_HIGH_BIT_MASK,
34362306a36Sopenharmony_ci				alrt_h))
34462306a36Sopenharmony_ci		return -EIO;
34562306a36Sopenharmony_ci
34662306a36Sopenharmony_ci	alrt_l = (u8)resi_val;
34762306a36Sopenharmony_ci	return regmap_write(regmap, reg, alrt_l);
34862306a36Sopenharmony_ci}
34962306a36Sopenharmony_ci
35062306a36Sopenharmony_cistatic int
35162306a36Sopenharmony_ciintel_bxtwc_pmic_get_policy(struct regmap *regmap, int reg, int bit, u64 *value)
35262306a36Sopenharmony_ci{
35362306a36Sopenharmony_ci	u8 mask = BIT(bit);
35462306a36Sopenharmony_ci	unsigned int val;
35562306a36Sopenharmony_ci
35662306a36Sopenharmony_ci	if (regmap_read(regmap, reg, &val))
35762306a36Sopenharmony_ci		return -EIO;
35862306a36Sopenharmony_ci
35962306a36Sopenharmony_ci	*value = (val & mask) >> bit;
36062306a36Sopenharmony_ci	return 0;
36162306a36Sopenharmony_ci}
36262306a36Sopenharmony_ci
36362306a36Sopenharmony_cistatic int
36462306a36Sopenharmony_ciintel_bxtwc_pmic_update_policy(struct regmap *regmap,
36562306a36Sopenharmony_ci				int reg, int bit, int enable)
36662306a36Sopenharmony_ci{
36762306a36Sopenharmony_ci	u8 mask = BIT(bit), val = enable << bit;
36862306a36Sopenharmony_ci
36962306a36Sopenharmony_ci	return regmap_update_bits(regmap, reg, mask, val);
37062306a36Sopenharmony_ci}
37162306a36Sopenharmony_ci
37262306a36Sopenharmony_cistatic const struct intel_pmic_opregion_data intel_bxtwc_pmic_opregion_data = {
37362306a36Sopenharmony_ci	.get_power      = intel_bxtwc_pmic_get_power,
37462306a36Sopenharmony_ci	.update_power   = intel_bxtwc_pmic_update_power,
37562306a36Sopenharmony_ci	.get_raw_temp   = intel_bxtwc_pmic_get_raw_temp,
37662306a36Sopenharmony_ci	.update_aux     = intel_bxtwc_pmic_update_aux,
37762306a36Sopenharmony_ci	.get_policy     = intel_bxtwc_pmic_get_policy,
37862306a36Sopenharmony_ci	.update_policy  = intel_bxtwc_pmic_update_policy,
37962306a36Sopenharmony_ci	.lpat_raw_to_temp = acpi_lpat_raw_to_temp,
38062306a36Sopenharmony_ci	.power_table      = power_table,
38162306a36Sopenharmony_ci	.power_table_count = ARRAY_SIZE(power_table),
38262306a36Sopenharmony_ci	.thermal_table     = thermal_table,
38362306a36Sopenharmony_ci	.thermal_table_count = ARRAY_SIZE(thermal_table),
38462306a36Sopenharmony_ci};
38562306a36Sopenharmony_ci
38662306a36Sopenharmony_cistatic int intel_bxtwc_pmic_opregion_probe(struct platform_device *pdev)
38762306a36Sopenharmony_ci{
38862306a36Sopenharmony_ci	struct intel_soc_pmic *pmic = dev_get_drvdata(pdev->dev.parent);
38962306a36Sopenharmony_ci
39062306a36Sopenharmony_ci	return intel_pmic_install_opregion_handler(&pdev->dev,
39162306a36Sopenharmony_ci			ACPI_HANDLE(pdev->dev.parent),
39262306a36Sopenharmony_ci			pmic->regmap,
39362306a36Sopenharmony_ci			&intel_bxtwc_pmic_opregion_data);
39462306a36Sopenharmony_ci}
39562306a36Sopenharmony_ci
39662306a36Sopenharmony_cistatic const struct platform_device_id bxt_wc_opregion_id_table[] = {
39762306a36Sopenharmony_ci	{ .name = "bxt_wcove_region" },
39862306a36Sopenharmony_ci	{},
39962306a36Sopenharmony_ci};
40062306a36Sopenharmony_ci
40162306a36Sopenharmony_cistatic struct platform_driver intel_bxtwc_pmic_opregion_driver = {
40262306a36Sopenharmony_ci	.probe = intel_bxtwc_pmic_opregion_probe,
40362306a36Sopenharmony_ci	.driver = {
40462306a36Sopenharmony_ci		.name = "bxt_whiskey_cove_pmic",
40562306a36Sopenharmony_ci	},
40662306a36Sopenharmony_ci	.id_table = bxt_wc_opregion_id_table,
40762306a36Sopenharmony_ci};
40862306a36Sopenharmony_cibuiltin_platform_driver(intel_bxtwc_pmic_opregion_driver);
409