1// SPDX-License-Identifier: GPL-2.0+ 2/* 3 * PMIC Error Signal Monitor driver 4 * 5 * Copyright (C) 2019 Texas Instruments Incorporated - https://www.ti.com/ 6 * Tero Kristo <t-kristo@ti.com> 7 * 8 */ 9 10#include <dm.h> 11#include <errno.h> 12#include <power/pmic.h> 13#include <dm/device_compat.h> 14#include <linux/bitops.h> 15 16#define INT_ESM_REG 0x6c 17#define INT_ESM_MASK 0x3f 18 19#define ESM_MCU_START_REG 0x8f 20 21#define ESM_MCU_START BIT(0) 22 23#define ESM_MCU_MODE_CFG_REG 0x92 24 25#define ESM_MCU_EN BIT(6) 26#define ESM_MCU_ENDRV BIT(5) 27 28#define ESM_MCU_MASK_REG 0x59 29#define ESM_MCU_MASK 0x7 30 31/** 32 * pmic_esm_probe: configures and enables PMIC ESM functionality 33 * 34 * Configures ESM PMIC support and enables it. 35 */ 36static int pmic_esm_probe(struct udevice *dev) 37{ 38 int ret; 39 40 ret = pmic_reg_write(dev->parent, INT_ESM_REG, INT_ESM_MASK); 41 if (ret) { 42 dev_err(dev, "clearing ESM irqs failed: %d\n", ret); 43 return ret; 44 } 45 46 ret = pmic_reg_write(dev->parent, ESM_MCU_MODE_CFG_REG, 47 ESM_MCU_EN | ESM_MCU_ENDRV); 48 if (ret) { 49 dev_err(dev, "setting ESM mode failed: %d\n", ret); 50 return ret; 51 } 52 53 ret = pmic_reg_write(dev->parent, ESM_MCU_MASK_REG, ESM_MCU_MASK); 54 if (ret) { 55 dev_err(dev, "clearing ESM masks failed: %d\n", ret); 56 return ret; 57 } 58 59 ret = pmic_reg_write(dev->parent, ESM_MCU_START_REG, ESM_MCU_START); 60 if (ret) { 61 dev_err(dev, "starting ESM failed: %d\n", ret); 62 return ret; 63 } 64 65 return 0; 66} 67 68static const struct udevice_id pmic_esm_ids[] = { 69 { .compatible = "ti,tps659413-esm" }, 70 {} 71}; 72 73U_BOOT_DRIVER(pmic_esm) = { 74 .name = "esm_pmic", 75 .of_match = pmic_esm_ids, 76 .id = UCLASS_MISC, 77 .probe = pmic_esm_probe, 78}; 79