crypto: atmel-ecc - add support for ACPI probing on non-AT91 platforms
authorArd Biesheuvel <ard.biesheuvel@linaro.org>
Fri, 24 May 2019 16:26:47 +0000 (18:26 +0200)
committerHerbert Xu <herbert@gondor.apana.org.au>
Thu, 30 May 2019 07:35:45 +0000 (15:35 +0800)
The Atmel/Microchip EC508A is a I2C device that could be wired into
any platform, and is being used on the Linaro/96boards Secure96
mezzanine adapter. This means it could be found on any platform, even
on ones that use ACPI enumeration (via PRP0001 devices). So update the
code to enable this use case.

This involves tweaking the bus rate discovery code to take ACPI probing
into account, which records the maximum bus rate as a property of the
slave device. For the atmel-ecc code, this means that the effective bus
rate should never exceed the maximum rate, unless we are dealing with
buggy firmware. Nonetheless, let's just use the existing plumbing to
discover the bus rate and keep the existing logic intact.

Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
drivers/crypto/Kconfig
drivers/crypto/atmel-ecc.c

index 177b7713bd2d4cb124c200cdcc8849583f227cd9..119ba073f424431472a73ac89a7a38c8393ba235 100644 (file)
@@ -521,7 +521,6 @@ config CRYPTO_DEV_ATMEL_SHA
 
 config CRYPTO_DEV_ATMEL_ECC
        tristate "Support for Microchip / Atmel ECC hw accelerator"
-       depends on ARCH_AT91 || COMPILE_TEST
        depends on I2C
        select CRYPTO_ECDH
        select CRC16
index ba00e4563ca0e0dfc51ddc587b5f957b0aa7d45e..5705348f540fc8e47ff3c1b9081849ad7c710506 100644 (file)
@@ -657,11 +657,14 @@ static int atmel_ecc_probe(struct i2c_client *client,
                return -ENODEV;
        }
 
-       ret = of_property_read_u32(client->adapter->dev.of_node,
-                                  "clock-frequency", &bus_clk_rate);
-       if (ret) {
-               dev_err(dev, "of: failed to read clock-frequency property\n");
-               return ret;
+       clk_rate = i2c_acpi_find_bus_speed(&client->adapter->dev);
+       if (!clk_rate) {
+               ret = device_property_read_u32(&client->adapter->dev,
+                                              "clock-frequency", &bus_clk_rate);
+               if (ret) {
+                       dev_err(dev, "failed to read clock-frequency property\n");
+                       return ret;
+               }
        }
 
        if (bus_clk_rate > 1000000L) {