/* * Copyright (C) 2019 Allwinner. * weidonghui * * SUNXI AXP Driver * * SPDX-License-Identifier: GPL-2.0+ */ #include #include #include #include static int bmu_axp152_probe(void) { u8 pmu_chip_id; if (pmic_bus_init(AXP152_DEVICE_ADDR, AXP152_RUNTIME_ADDR)) { tick_printf("%s pmic_bus_init fail\n", __func__); return -1; } if (pmic_bus_read(AXP152_RUNTIME_ADDR, AXP152_VERSION, &pmu_chip_id)) { tick_printf("%s pmic_bus_read fail\n", __func__); return -1; } pmu_chip_id &= 0X0F; if (pmu_chip_id == AXP152_CHIP_ID) { /*pmu type AXP152*/ tick_printf("PMU: AXP152\n"); return 0; } return -1; } int bmu_axp152_get_poweron_source(void) { uchar reg_value; uchar reg_value2; if (pmic_bus_read(AXP152_RUNTIME_ADDR, AXP152_MODE_CHGSTATUS, ®_value2)) { return -1; } if (reg_value2 & (1 << 3)) { return AXP_BOOT_SOURCE_IRQ_LOW; } reg_value = 3; if (pmic_bus_write(AXP152_RUNTIME_ADDR, AXP152_GPIO1_CTL, reg_value)) { return -1; } if (pmic_bus_read(AXP152_RUNTIME_ADDR, AXP152_GPIO0123_SIGNAL, ®_value)) { return -1; } if (!(reg_value & (1 << 1))) { return AXP_BOOT_SOURCE_VBUS_USB; } if (reg_value2 & (1 << 2)) { return AXP_BOOT_SOURCE_BUTTON; } return -1; } int sunxi_gpadc_init(void); int sunxi_gpadc_read(int channel); int bmu_axp152_get_battery_vol(void) { #ifdef CONFIG_SUNXI_GPADC static int gpadc_flag; u32 adc_val, gpadc_val = 0x948; u32 bat_vol = 3500; if (!gpadc_flag) { sunxi_gpadc_init(); gpadc_flag = 1; } adc_val = sunxi_gpadc_read(1); for (bat_vol = 3500; bat_vol <= 4200; bat_vol += 20, gpadc_val += 0xE) { if (adc_val <= gpadc_val) return bat_vol; } #endif return -1; } unsigned char bmu_axp152_get_reg_value(unsigned char reg_addr) { u8 reg_value; if (pmic_bus_read(AXP152_RUNTIME_ADDR, reg_addr, ®_value)) { return -1; } return reg_value; } unsigned char bmu_axp152_set_reg_value(unsigned char reg_addr, unsigned char reg_value) { unsigned char reg; if (pmic_bus_write(AXP152_RUNTIME_ADDR, reg_addr, reg_value)) { return -1; } if (pmic_bus_read(AXP152_RUNTIME_ADDR, reg_addr, ®)) { return -1; } return reg; } U_BOOT_AXP_BMU_INIT(bmu_axp152) = { .bmu_name = "bmu_axp152", .probe = bmu_axp152_probe, .get_poweron_source = bmu_axp152_get_poweron_source, .get_battery_vol = bmu_axp152_get_battery_vol, .get_reg_value = bmu_axp152_get_reg_value, .set_reg_value = bmu_axp152_set_reg_value, };