Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 231d069f authored by Hans de Goede's avatar Hans de Goede Committed by Wolfram Sang
Browse files

i2c: designware: Round down ACPI provided clk to nearest supported clk



The Lenovo Miix2 8 DSDT contains an i2c clk / bus speed of 1700000 Hz
for one if its devices, which is not supported.

This is the second DSDT to show up with an unsupported clk in a short
time, remove the hardcoded fix for DSDTs with a 1 MiHz clock and simply
always round down the clk to the nearest supported value.

Reported-by: default avatar <russianneuromancer@ya.ru>
Fixes: 682c6c21 ("i2c: designware: Some broken DSTDs use 1MiHz ...")
Signed-off-by: default avatarHans de Goede <hdegoede@redhat.com>
Acked-by: default avatarJarkko Nikula <jarkko.nikula@linux.intel.com>
Signed-off-by: default avatarWolfram Sang <wsa@the-dreams.de>
parent ba201c4f
Loading
Loading
Loading
Loading
+12 −4
Original line number Diff line number Diff line
@@ -256,7 +256,8 @@ static int dw_i2c_plat_probe(struct platform_device *pdev)
	struct dw_i2c_dev *dev;
	u32 acpi_speed, ht = 0;
	struct resource *mem;
	int irq, ret;
	int i, irq, ret;
	const int supported_speeds[] = { 0, 100000, 400000, 1000000, 3400000 };

	irq = platform_get_irq(pdev, 0);
	if (irq < 0)
@@ -297,9 +298,16 @@ static int dw_i2c_plat_probe(struct platform_device *pdev)
	}

	acpi_speed = i2c_acpi_find_bus_speed(&pdev->dev);
	/* Some broken DSTDs use 1MiHz instead of 1MHz */
	if (acpi_speed == 1048576)
		acpi_speed = 1000000;
	/*
	 * Some DSTDs use a non standard speed, round down to the lowest
	 * standard speed.
	 */
	for (i = 1; i < ARRAY_SIZE(supported_speeds); i++) {
		if (acpi_speed < supported_speeds[i])
			break;
	}
	acpi_speed = supported_speeds[i - 1];

	/*
	 * Find bus speed from the "clock-frequency" device property, ACPI
	 * or by using fast mode if neither is set.