diff mbox series

[1/2] power: supply: axp288_fuel_gauge: Fix battery reporting on the One Mix 1

Message ID 20220502111235.331877-1-hdegoede@redhat.com
State Accepted
Commit 34f243e9fb5ace1ca760c72e366247eaeff430c0
Headers show
Series [1/2] power: supply: axp288_fuel_gauge: Fix battery reporting on the One Mix 1 | expand

Commit Message

Hans de Goede May 2, 2022, 11:12 a.m. UTC
Commit 3a06b912a5ce ("power: supply: axp288_fuel_gauge: Make "T3 MRD"
no_battery_list DMI entry more generic") added a generic no-battery DMI
match for many mini-PCs / HDMI-sticks which use "T3 MRD" as their DMI
board-name.

It turns out that the One Mix 1 mini laptop also uses "T3 MRD" for its
DMI boardname and it also has its chassis-type wrongly set to a value
of "3" (desktop). This was causing the axp288_fuel_gauge driver to
disable battery reporting because this matches the no-battery DMI
list entry for generic "T3 MRD" mini-PCs.

Change the no-battery DMI list into a quirks DMI list and add a
specific match for the One Mix 1 mini laptop before the generic
"T3 MRD" no-battery quirk entry to fix this.

Fixes: 3a06b912a5ce ("power: supply: axp288_fuel_gauge: Make "T3 MRD" no_battery_list DMI entry more generic")
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
---
 drivers/power/supply/axp288_fuel_gauge.c | 40 +++++++++++++++++++++---
 1 file changed, 36 insertions(+), 4 deletions(-)

Comments

Sebastian Reichel May 3, 2022, 3:35 p.m. UTC | #1
Hi,

On Mon, May 02, 2022 at 01:12:34PM +0200, Hans de Goede wrote:
> Commit 3a06b912a5ce ("power: supply: axp288_fuel_gauge: Make "T3 MRD"
> no_battery_list DMI entry more generic") added a generic no-battery DMI
> match for many mini-PCs / HDMI-sticks which use "T3 MRD" as their DMI
> board-name.
> 
> It turns out that the One Mix 1 mini laptop also uses "T3 MRD" for its
> DMI boardname and it also has its chassis-type wrongly set to a value
> of "3" (desktop). This was causing the axp288_fuel_gauge driver to
> disable battery reporting because this matches the no-battery DMI
> list entry for generic "T3 MRD" mini-PCs.
> 
> Change the no-battery DMI list into a quirks DMI list and add a
> specific match for the One Mix 1 mini laptop before the generic
> "T3 MRD" no-battery quirk entry to fix this.
> 
> Fixes: 3a06b912a5ce ("power: supply: axp288_fuel_gauge: Make "T3 MRD" no_battery_list DMI entry more generic")
> Signed-off-by: Hans de Goede <hdegoede@redhat.com>
> ---

Thanks, queued to my fixes branch.

-- Sebastian

>  drivers/power/supply/axp288_fuel_gauge.c | 40 +++++++++++++++++++++---
>  1 file changed, 36 insertions(+), 4 deletions(-)
> 
> diff --git a/drivers/power/supply/axp288_fuel_gauge.c b/drivers/power/supply/axp288_fuel_gauge.c
> index e9f285dae489..5b8aa4a980cd 100644
> --- a/drivers/power/supply/axp288_fuel_gauge.c
> +++ b/drivers/power/supply/axp288_fuel_gauge.c
> @@ -90,6 +90,8 @@
>  #define AXP288_REG_UPDATE_INTERVAL		(60 * HZ)
>  #define AXP288_FG_INTR_NUM			6
>  
> +#define AXP288_QUIRK_NO_BATTERY			BIT(0)
> +
>  static bool no_current_sense_res;
>  module_param(no_current_sense_res, bool, 0444);
>  MODULE_PARM_DESC(no_current_sense_res, "No (or broken) current sense resistor");
> @@ -524,7 +526,7 @@ static struct power_supply_desc fuel_gauge_desc = {
>   * detection reports one despite it not being there.
>   * Please keep this listed sorted alphabetically.
>   */
> -static const struct dmi_system_id axp288_no_battery_list[] = {
> +static const struct dmi_system_id axp288_quirks[] = {
>  	{
>  		/* ACEPC T8 Cherry Trail Z8350 mini PC */
>  		.matches = {
> @@ -534,6 +536,7 @@ static const struct dmi_system_id axp288_no_battery_list[] = {
>  			/* also match on somewhat unique bios-version */
>  			DMI_EXACT_MATCH(DMI_BIOS_VERSION, "1.000"),
>  		},
> +		.driver_data = (void *)AXP288_QUIRK_NO_BATTERY,
>  	},
>  	{
>  		/* ACEPC T11 Cherry Trail Z8350 mini PC */
> @@ -544,6 +547,7 @@ static const struct dmi_system_id axp288_no_battery_list[] = {
>  			/* also match on somewhat unique bios-version */
>  			DMI_EXACT_MATCH(DMI_BIOS_VERSION, "1.000"),
>  		},
> +		.driver_data = (void *)AXP288_QUIRK_NO_BATTERY,
>  	},
>  	{
>  		/* Intel Cherry Trail Compute Stick, Windows version */
> @@ -551,6 +555,7 @@ static const struct dmi_system_id axp288_no_battery_list[] = {
>  			DMI_MATCH(DMI_SYS_VENDOR, "Intel"),
>  			DMI_MATCH(DMI_PRODUCT_NAME, "STK1AW32SC"),
>  		},
> +		.driver_data = (void *)AXP288_QUIRK_NO_BATTERY,
>  	},
>  	{
>  		/* Intel Cherry Trail Compute Stick, version without an OS */
> @@ -558,34 +563,55 @@ static const struct dmi_system_id axp288_no_battery_list[] = {
>  			DMI_MATCH(DMI_SYS_VENDOR, "Intel"),
>  			DMI_MATCH(DMI_PRODUCT_NAME, "STK1A32SC"),
>  		},
> +		.driver_data = (void *)AXP288_QUIRK_NO_BATTERY,
>  	},
>  	{
>  		/* Meegopad T02 */
>  		.matches = {
>  			DMI_MATCH(DMI_PRODUCT_NAME, "MEEGOPAD T02"),
>  		},
> +		.driver_data = (void *)AXP288_QUIRK_NO_BATTERY,
>  	},
>  	{	/* Mele PCG03 Mini PC */
>  		.matches = {
>  			DMI_EXACT_MATCH(DMI_BOARD_VENDOR, "Mini PC"),
>  			DMI_EXACT_MATCH(DMI_BOARD_NAME, "Mini PC"),
>  		},
> +		.driver_data = (void *)AXP288_QUIRK_NO_BATTERY,
>  	},
>  	{
>  		/* Minix Neo Z83-4 mini PC */
>  		.matches = {
>  			DMI_MATCH(DMI_SYS_VENDOR, "MINIX"),
>  			DMI_MATCH(DMI_PRODUCT_NAME, "Z83-4"),
> -		}
> +		},
> +		.driver_data = (void *)AXP288_QUIRK_NO_BATTERY,
>  	},
>  	{
> -		/* Various Ace PC/Meegopad/MinisForum/Wintel Mini-PCs/HDMI-sticks */
> +		/*
> +		 * One Mix 1, this uses the "T3 MRD" boardname used by
> +		 * generic mini PCs, but it is a mini laptop so it does
> +		 * actually have a battery!
> +		 */
> +		.matches = {
> +			DMI_MATCH(DMI_BOARD_NAME, "T3 MRD"),
> +			DMI_MATCH(DMI_BIOS_DATE, "06/14/2018"),
> +		},
> +		.driver_data = NULL,
> +	},
> +	{
> +		/*
> +		 * Various Ace PC/Meegopad/MinisForum/Wintel Mini-PCs/HDMI-sticks
> +		 * This entry must be last because it is generic, this allows
> +		 * adding more specifuc quirks overriding this generic entry.
> +		 */
>  		.matches = {
>  			DMI_MATCH(DMI_BOARD_NAME, "T3 MRD"),
>  			DMI_MATCH(DMI_CHASSIS_TYPE, "3"),
>  			DMI_MATCH(DMI_BIOS_VENDOR, "American Megatrends Inc."),
>  			DMI_MATCH(DMI_BIOS_VERSION, "5.11"),
>  		},
> +		.driver_data = (void *)AXP288_QUIRK_NO_BATTERY,
>  	},
>  	{}
>  };
> @@ -665,7 +691,9 @@ static int axp288_fuel_gauge_probe(struct platform_device *pdev)
>  		[BAT_D_CURR] = "axp288-chrg-d-curr",
>  		[BAT_VOLT] = "axp288-batt-volt",
>  	};
> +	const struct dmi_system_id *dmi_id;
>  	struct device *dev = &pdev->dev;
> +	unsigned long quirks = 0;
>  	int i, pirq, ret;
>  
>  	/*
> @@ -675,7 +703,11 @@ static int axp288_fuel_gauge_probe(struct platform_device *pdev)
>  	if (!acpi_quirk_skip_acpi_ac_and_battery())
>  		return -ENODEV;
>  
> -	if (dmi_check_system(axp288_no_battery_list))
> +	dmi_id = dmi_first_match(axp288_quirks);
> +	if (dmi_id)
> +		quirks = (unsigned long)dmi_id->driver_data;
> +
> +	if (quirks & AXP288_QUIRK_NO_BATTERY)
>  		return -ENODEV;
>  
>  	info = devm_kzalloc(dev, sizeof(*info), GFP_KERNEL);
> -- 
> 2.36.0
>
Sebastian Reichel May 3, 2022, 3:35 p.m. UTC | #2
Hi,

On Mon, May 02, 2022 at 01:12:35PM +0200, Hans de Goede wrote:
> Some "T3 MRD" mini-PCs / HDMI-sticks without a battery use a different
> value then "5.11" for their DMI BIOS version field.
> 
> Drop the BIOS version check so that the no-battery "T3 MRD" DMI quirk
> applies to these too.
> 
> Fixes: 3a06b912a5ce ("power: supply: axp288_fuel_gauge: Make "T3 MRD" no_battery_list DMI entry more generic")
> Signed-off-by: Hans de Goede <hdegoede@redhat.com>
> ---

Thanks, queued to my fixes branch.

-- Sebastian

>  drivers/power/supply/axp288_fuel_gauge.c | 1 -
>  1 file changed, 1 deletion(-)
> 
> diff --git a/drivers/power/supply/axp288_fuel_gauge.c b/drivers/power/supply/axp288_fuel_gauge.c
> index 5b8aa4a980cd..8e6f8a655079 100644
> --- a/drivers/power/supply/axp288_fuel_gauge.c
> +++ b/drivers/power/supply/axp288_fuel_gauge.c
> @@ -609,7 +609,6 @@ static const struct dmi_system_id axp288_quirks[] = {
>  			DMI_MATCH(DMI_BOARD_NAME, "T3 MRD"),
>  			DMI_MATCH(DMI_CHASSIS_TYPE, "3"),
>  			DMI_MATCH(DMI_BIOS_VENDOR, "American Megatrends Inc."),
> -			DMI_MATCH(DMI_BIOS_VERSION, "5.11"),
>  		},
>  		.driver_data = (void *)AXP288_QUIRK_NO_BATTERY,
>  	},
> -- 
> 2.36.0
>
diff mbox series

Patch

diff --git a/drivers/power/supply/axp288_fuel_gauge.c b/drivers/power/supply/axp288_fuel_gauge.c
index e9f285dae489..5b8aa4a980cd 100644
--- a/drivers/power/supply/axp288_fuel_gauge.c
+++ b/drivers/power/supply/axp288_fuel_gauge.c
@@ -90,6 +90,8 @@ 
 #define AXP288_REG_UPDATE_INTERVAL		(60 * HZ)
 #define AXP288_FG_INTR_NUM			6
 
+#define AXP288_QUIRK_NO_BATTERY			BIT(0)
+
 static bool no_current_sense_res;
 module_param(no_current_sense_res, bool, 0444);
 MODULE_PARM_DESC(no_current_sense_res, "No (or broken) current sense resistor");
@@ -524,7 +526,7 @@  static struct power_supply_desc fuel_gauge_desc = {
  * detection reports one despite it not being there.
  * Please keep this listed sorted alphabetically.
  */
-static const struct dmi_system_id axp288_no_battery_list[] = {
+static const struct dmi_system_id axp288_quirks[] = {
 	{
 		/* ACEPC T8 Cherry Trail Z8350 mini PC */
 		.matches = {
@@ -534,6 +536,7 @@  static const struct dmi_system_id axp288_no_battery_list[] = {
 			/* also match on somewhat unique bios-version */
 			DMI_EXACT_MATCH(DMI_BIOS_VERSION, "1.000"),
 		},
+		.driver_data = (void *)AXP288_QUIRK_NO_BATTERY,
 	},
 	{
 		/* ACEPC T11 Cherry Trail Z8350 mini PC */
@@ -544,6 +547,7 @@  static const struct dmi_system_id axp288_no_battery_list[] = {
 			/* also match on somewhat unique bios-version */
 			DMI_EXACT_MATCH(DMI_BIOS_VERSION, "1.000"),
 		},
+		.driver_data = (void *)AXP288_QUIRK_NO_BATTERY,
 	},
 	{
 		/* Intel Cherry Trail Compute Stick, Windows version */
@@ -551,6 +555,7 @@  static const struct dmi_system_id axp288_no_battery_list[] = {
 			DMI_MATCH(DMI_SYS_VENDOR, "Intel"),
 			DMI_MATCH(DMI_PRODUCT_NAME, "STK1AW32SC"),
 		},
+		.driver_data = (void *)AXP288_QUIRK_NO_BATTERY,
 	},
 	{
 		/* Intel Cherry Trail Compute Stick, version without an OS */
@@ -558,34 +563,55 @@  static const struct dmi_system_id axp288_no_battery_list[] = {
 			DMI_MATCH(DMI_SYS_VENDOR, "Intel"),
 			DMI_MATCH(DMI_PRODUCT_NAME, "STK1A32SC"),
 		},
+		.driver_data = (void *)AXP288_QUIRK_NO_BATTERY,
 	},
 	{
 		/* Meegopad T02 */
 		.matches = {
 			DMI_MATCH(DMI_PRODUCT_NAME, "MEEGOPAD T02"),
 		},
+		.driver_data = (void *)AXP288_QUIRK_NO_BATTERY,
 	},
 	{	/* Mele PCG03 Mini PC */
 		.matches = {
 			DMI_EXACT_MATCH(DMI_BOARD_VENDOR, "Mini PC"),
 			DMI_EXACT_MATCH(DMI_BOARD_NAME, "Mini PC"),
 		},
+		.driver_data = (void *)AXP288_QUIRK_NO_BATTERY,
 	},
 	{
 		/* Minix Neo Z83-4 mini PC */
 		.matches = {
 			DMI_MATCH(DMI_SYS_VENDOR, "MINIX"),
 			DMI_MATCH(DMI_PRODUCT_NAME, "Z83-4"),
-		}
+		},
+		.driver_data = (void *)AXP288_QUIRK_NO_BATTERY,
 	},
 	{
-		/* Various Ace PC/Meegopad/MinisForum/Wintel Mini-PCs/HDMI-sticks */
+		/*
+		 * One Mix 1, this uses the "T3 MRD" boardname used by
+		 * generic mini PCs, but it is a mini laptop so it does
+		 * actually have a battery!
+		 */
+		.matches = {
+			DMI_MATCH(DMI_BOARD_NAME, "T3 MRD"),
+			DMI_MATCH(DMI_BIOS_DATE, "06/14/2018"),
+		},
+		.driver_data = NULL,
+	},
+	{
+		/*
+		 * Various Ace PC/Meegopad/MinisForum/Wintel Mini-PCs/HDMI-sticks
+		 * This entry must be last because it is generic, this allows
+		 * adding more specifuc quirks overriding this generic entry.
+		 */
 		.matches = {
 			DMI_MATCH(DMI_BOARD_NAME, "T3 MRD"),
 			DMI_MATCH(DMI_CHASSIS_TYPE, "3"),
 			DMI_MATCH(DMI_BIOS_VENDOR, "American Megatrends Inc."),
 			DMI_MATCH(DMI_BIOS_VERSION, "5.11"),
 		},
+		.driver_data = (void *)AXP288_QUIRK_NO_BATTERY,
 	},
 	{}
 };
@@ -665,7 +691,9 @@  static int axp288_fuel_gauge_probe(struct platform_device *pdev)
 		[BAT_D_CURR] = "axp288-chrg-d-curr",
 		[BAT_VOLT] = "axp288-batt-volt",
 	};
+	const struct dmi_system_id *dmi_id;
 	struct device *dev = &pdev->dev;
+	unsigned long quirks = 0;
 	int i, pirq, ret;
 
 	/*
@@ -675,7 +703,11 @@  static int axp288_fuel_gauge_probe(struct platform_device *pdev)
 	if (!acpi_quirk_skip_acpi_ac_and_battery())
 		return -ENODEV;
 
-	if (dmi_check_system(axp288_no_battery_list))
+	dmi_id = dmi_first_match(axp288_quirks);
+	if (dmi_id)
+		quirks = (unsigned long)dmi_id->driver_data;
+
+	if (quirks & AXP288_QUIRK_NO_BATTERY)
 		return -ENODEV;
 
 	info = devm_kzalloc(dev, sizeof(*info), GFP_KERNEL);