root/drivers/platform/x86/x86-android-tablets/shared-psy-info.c
// SPDX-License-Identifier: GPL-2.0-or-later
/*
 * Shared psy info for X86 tablets which ship with Android as the factory image
 * and which have broken DSDT tables. The factory kernels shipped on these
 * devices typically have a bunch of things hardcoded, rather than specified
 * in their DSDT.
 *
 * Copyright (C) 2021-2023 Hans de Goede <hansg@kernel.org>
 */

#include <linux/gpio/machine.h>
#include <linux/gpio/property.h>
#include <linux/platform_device.h>
#include <linux/power/bq24190_charger.h>
#include <linux/property.h>
#include <linux/regulator/machine.h>

#include "shared-psy-info.h"
#include "x86-android-tablets.h"

/* Generic / shared charger / battery settings */
const char * const tusb1211_chg_det_psy[] = { "tusb1211-charger-detect" };
const char * const bq24190_psy[] = { "bq24190-charger" };
const char * const bq25890_psy[] = { "bq25890-charger-0" };

static const struct property_entry fg_bq24190_supply_props[] = {
        PROPERTY_ENTRY_STRING_ARRAY("supplied-from", bq24190_psy),
        { }
};

const struct software_node fg_bq24190_supply_node = {
        .properties = fg_bq24190_supply_props,
};

static const struct property_entry fg_bq25890_supply_props[] = {
        PROPERTY_ENTRY_STRING_ARRAY("supplied-from", bq25890_psy),
        { }
};

const struct software_node fg_bq25890_supply_node = {
        .properties = fg_bq25890_supply_props,
};

static const u32 generic_lipo_battery_ovc_cap_celcius[] = { 25 };

static const u32 generic_lipo_4v2_battery_ovc_cap_table0[] = {
        4200000, 100,
        4150000, 95,
        4110000, 90,
        4075000, 85,
        4020000, 80,
        3982500, 75,
        3945000, 70,
        3907500, 65,
        3870000, 60,
        3853333, 55,
        3836667, 50,
        3820000, 45,
        3803333, 40,
        3786667, 35,
        3770000, 30,
        3750000, 25,
        3730000, 20,
        3710000, 15,
        3690000, 10,
        3610000, 5,
        3350000, 0
};

static const u32 generic_lipo_hv_4v35_battery_ovc_cap_table0[] = {
        4300000, 100,
        4250000, 96,
        4200000, 91,
        4150000, 86,
        4110000, 82,
        4075000, 77,
        4020000, 73,
        3982500, 68,
        3945000, 64,
        3907500, 59,
        3870000, 55,
        3853333, 50,
        3836667, 45,
        3820000, 41,
        3803333, 36,
        3786667, 32,
        3770000, 27,
        3750000, 23,
        3730000, 18,
        3710000, 14,
        3690000, 9,
        3610000, 5,
        3350000, 0
};

/* Standard LiPo (max 4.2V) settings used by most devs with a LiPo battery */
static const struct property_entry generic_lipo_4v2_battery_props[] = {
        PROPERTY_ENTRY_STRING("compatible", "simple-battery"),
        PROPERTY_ENTRY_STRING("device-chemistry", "lithium-ion-polymer"),
        PROPERTY_ENTRY_U32("precharge-current-microamp", 256000),
        PROPERTY_ENTRY_U32("charge-term-current-microamp", 128000),
        PROPERTY_ENTRY_U32("constant-charge-current-max-microamp", 2048000),
        PROPERTY_ENTRY_U32("constant-charge-voltage-max-microvolt", 4208000),
        PROPERTY_ENTRY_U32("factory-internal-resistance-micro-ohms", 150000),
        PROPERTY_ENTRY_U32_ARRAY("ocv-capacity-celsius",
                                 generic_lipo_battery_ovc_cap_celcius),
        PROPERTY_ENTRY_U32_ARRAY("ocv-capacity-table-0",
                                 generic_lipo_4v2_battery_ovc_cap_table0),
        { }
};

const struct software_node generic_lipo_4v2_battery_node = {
        .properties = generic_lipo_4v2_battery_props,
};

const struct software_node *generic_lipo_4v2_battery_swnodes[] = {
        &generic_lipo_4v2_battery_node,
        NULL
};

/* LiPo HighVoltage (max 4.35V) settings used by most devs with a HV battery */
static const struct property_entry generic_lipo_hv_4v35_battery_props[] = {
        PROPERTY_ENTRY_STRING("compatible", "simple-battery"),
        PROPERTY_ENTRY_STRING("device-chemistry", "lithium-ion"),
        PROPERTY_ENTRY_U32("precharge-current-microamp", 256000),
        PROPERTY_ENTRY_U32("charge-term-current-microamp", 128000),
        PROPERTY_ENTRY_U32("constant-charge-current-max-microamp", 1856000),
        PROPERTY_ENTRY_U32("constant-charge-voltage-max-microvolt", 4352000),
        PROPERTY_ENTRY_U32("factory-internal-resistance-micro-ohms", 150000),
        PROPERTY_ENTRY_U32_ARRAY("ocv-capacity-celsius",
                                 generic_lipo_battery_ovc_cap_celcius),
        PROPERTY_ENTRY_U32_ARRAY("ocv-capacity-table-0",
                                 generic_lipo_hv_4v35_battery_ovc_cap_table0),
        { }
};

const struct software_node generic_lipo_hv_4v35_battery_node = {
        .properties = generic_lipo_hv_4v35_battery_props,
};

const struct software_node *generic_lipo_hv_4v35_battery_swnodes[] = {
        &generic_lipo_hv_4v35_battery_node,
        NULL
};

/* For enabling the bq24190 5V boost based on id-pin */
static struct regulator_consumer_supply intel_int3496_consumer = {
        .supply = "vbus",
        .dev_name = "intel-int3496",
};

static const struct regulator_init_data bq24190_vbus_init_data = {
        .constraints = {
                .name = "bq24190_vbus",
                .valid_ops_mask = REGULATOR_CHANGE_STATUS,
        },
        .consumer_supplies = &intel_int3496_consumer,
        .num_consumer_supplies = 1,
};

struct bq24190_platform_data bq24190_pdata = {
        .regulator_init_data = &bq24190_vbus_init_data,
};

const char * const bq24190_modules[] __initconst = {
        "intel_crystal_cove_charger", /* For the bq24190 IRQ */
        "bq24190_charger",            /* For the Vbus regulator for intel-int3496 */
        NULL
};

static const struct property_entry int3496_reference_props[] __initconst = {
        PROPERTY_ENTRY_GPIO("vbus-gpios", &baytrail_gpiochip_nodes[1], 15, GPIO_ACTIVE_HIGH),
        PROPERTY_ENTRY_GPIO("mux-gpios", &baytrail_gpiochip_nodes[2], 1, GPIO_ACTIVE_HIGH),
        PROPERTY_ENTRY_GPIO("id-gpios", &baytrail_gpiochip_nodes[2], 18, GPIO_ACTIVE_HIGH),
        { }
};

/* Generic pdevs array and gpio-lookups for micro USB ID pin handling */
const struct platform_device_info int3496_pdevs[] __initconst = {
        {
                /* For micro USB ID pin handling */
                .name = "intel-int3496",
                .id = PLATFORM_DEVID_NONE,
                .properties = int3496_reference_props,
        },
};