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