| From fc304e5d4f900acaaa83bf405e204938d6e39f25 Mon Sep 17 00:00:00 2001 |
| From: Tony Lindgren <tony@atomide.com> |
| Date: Sat, 14 Sep 2019 14:02:55 -0700 |
| Subject: [PATCH] hwrng: omap3-rom - Fix missing clock by probing with device |
| tree |
| MIME-Version: 1.0 |
| Content-Type: text/plain; charset=UTF-8 |
| Content-Transfer-Encoding: 8bit |
| |
| commit 0c0ef9ea6f3f0d5979dc7b094b0a184c1a94716b upstream. |
| |
| Commit 0ed266d7ae5e ("clk: ti: omap3: cleanup unnecessary clock aliases") |
| removed old omap3 clock framework aliases but caused omap3-rom-rng to |
| stop working with clock not found error. |
| |
| Based on discussions on the mailing list it was requested by Tero Kristo |
| that it would be best to fix this issue by probing omap3-rom-rng using |
| device tree to provide a proper clk property. The other option would be |
| to add back the missing clock alias, but that does not help moving things |
| forward with removing old legacy platform_data. |
| |
| Let's also add a proper device tree binding and keep it together with |
| the fix. |
| |
| Cc: devicetree@vger.kernel.org |
| Cc: Aaro Koskinen <aaro.koskinen@iki.fi> |
| Cc: Adam Ford <aford173@gmail.com> |
| Cc: Pali Rohár <pali.rohar@gmail.com> |
| Cc: Rob Herring <robh+dt@kernel.org> |
| Cc: Sebastian Reichel <sre@kernel.org> |
| Cc: Tero Kristo <t-kristo@ti.com> |
| Fixes: 0ed266d7ae5e ("clk: ti: omap3: cleanup unnecessary clock aliases") |
| Reported-by: Aaro Koskinen <aaro.koskinen@iki.fi> |
| Signed-off-by: Tony Lindgren <tony@atomide.com> |
| Acked-by: Rob Herring <robh@kernel.org> |
| Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/Documentation/devicetree/bindings/rng/omap3_rom_rng.txt b/Documentation/devicetree/bindings/rng/omap3_rom_rng.txt |
| new file mode 100644 |
| index 000000000000..f315c9723bd2 |
| --- /dev/null |
| +++ b/Documentation/devicetree/bindings/rng/omap3_rom_rng.txt |
| @@ -0,0 +1,27 @@ |
| +OMAP ROM RNG driver binding |
| + |
| +Secure SoCs may provide RNG via secure ROM calls like Nokia N900 does. The |
| +implementation can depend on the SoC secure ROM used. |
| + |
| +- compatible: |
| + Usage: required |
| + Value type: <string> |
| + Definition: must be "nokia,n900-rom-rng" |
| + |
| +- clocks: |
| + Usage: required |
| + Value type: <prop-encoded-array> |
| + Definition: reference to the the RNG interface clock |
| + |
| +- clock-names: |
| + Usage: required |
| + Value type: <stringlist> |
| + Definition: must be "ick" |
| + |
| +Example: |
| + |
| + rom_rng: rng { |
| + compatible = "nokia,n900-rom-rng"; |
| + clocks = <&rng_ick>; |
| + clock-names = "ick"; |
| + }; |
| diff --git a/arch/arm/boot/dts/omap3-n900.dts b/arch/arm/boot/dts/omap3-n900.dts |
| index 84a5ade1e865..63659880eeb3 100644 |
| --- a/arch/arm/boot/dts/omap3-n900.dts |
| +++ b/arch/arm/boot/dts/omap3-n900.dts |
| @@ -155,6 +155,12 @@ |
| pwms = <&pwm9 0 26316 0>; /* 38000 Hz */ |
| }; |
| |
| + rom_rng: rng { |
| + compatible = "nokia,n900-rom-rng"; |
| + clocks = <&rng_ick>; |
| + clock-names = "ick"; |
| + }; |
| + |
| /* controlled (enabled/disabled) directly by bcm2048 and wl1251 */ |
| vctcxo: vctcxo { |
| compatible = "fixed-clock"; |
| diff --git a/arch/arm/mach-omap2/pdata-quirks.c b/arch/arm/mach-omap2/pdata-quirks.c |
| index 7e018f674fb0..f53c4a331856 100644 |
| --- a/arch/arm/mach-omap2/pdata-quirks.c |
| +++ b/arch/arm/mach-omap2/pdata-quirks.c |
| @@ -260,14 +260,6 @@ static void __init am3517_evm_legacy_init(void) |
| am35xx_emac_reset(); |
| } |
| |
| -static struct platform_device omap3_rom_rng_device = { |
| - .name = "omap3-rom-rng", |
| - .id = -1, |
| - .dev = { |
| - .platform_data = rx51_secure_rng_call, |
| - }, |
| -}; |
| - |
| static void __init nokia_n900_legacy_init(void) |
| { |
| hsmmc2_internal_input_clk(); |
| @@ -283,9 +275,6 @@ static void __init nokia_n900_legacy_init(void) |
| pr_warn("RX-51: Not enabling ARM errata 430973 workaround\n"); |
| pr_warn("Thumb binaries may crash randomly without this workaround\n"); |
| } |
| - |
| - pr_info("RX-51: Registering OMAP3 HWRNG device\n"); |
| - platform_device_register(&omap3_rom_rng_device); |
| } |
| } |
| |
| @@ -463,6 +452,7 @@ static struct of_dev_auxdata omap_auxdata_lookup[] = { |
| OF_DEV_AUXDATA("ti,davinci_mdio", 0x5c030000, "davinci_mdio.0", NULL), |
| OF_DEV_AUXDATA("ti,am3517-emac", 0x5c000000, "davinci_emac.0", |
| &am35xx_emac_pdata), |
| + OF_DEV_AUXDATA("nokia,n900-rom-rng", 0, NULL, rx51_secure_rng_call), |
| /* McBSP modules with sidetone core */ |
| #if IS_ENABLED(CONFIG_SND_SOC_OMAP_MCBSP) |
| OF_DEV_AUXDATA("ti,omap3-mcbsp", 0x49022000, "49022000.mcbsp", &mcbsp_pdata), |
| diff --git a/drivers/char/hw_random/omap3-rom-rng.c b/drivers/char/hw_random/omap3-rom-rng.c |
| index 648e39ce6bd9..8df3cad7c97a 100644 |
| --- a/drivers/char/hw_random/omap3-rom-rng.c |
| +++ b/drivers/char/hw_random/omap3-rom-rng.c |
| @@ -20,6 +20,8 @@ |
| #include <linux/workqueue.h> |
| #include <linux/clk.h> |
| #include <linux/err.h> |
| +#include <linux/of.h> |
| +#include <linux/of_device.h> |
| #include <linux/platform_device.h> |
| |
| #define RNG_RESET 0x01 |
| @@ -86,14 +88,18 @@ static int omap3_rom_rng_read(struct hwrng *rng, void *data, size_t max, bool w) |
| |
| static struct hwrng omap3_rom_rng_ops = { |
| .name = "omap3-rom", |
| - .read = omap3_rom_rng_read, |
| }; |
| |
| static int omap3_rom_rng_probe(struct platform_device *pdev) |
| { |
| int ret = 0; |
| |
| - pr_info("initializing\n"); |
| + omap3_rom_rng_ops.read = of_device_get_match_data(&pdev->dev); |
| + if (!omap3_rom_rng_ops.read) { |
| + dev_err(&pdev->dev, "missing rom code handler\n"); |
| + |
| + return -ENODEV; |
| + } |
| |
| omap3_rom_rng_call = pdev->dev.platform_data; |
| if (!omap3_rom_rng_call) { |
| @@ -126,9 +132,16 @@ static int omap3_rom_rng_remove(struct platform_device *pdev) |
| return 0; |
| } |
| |
| +static const struct of_device_id omap_rom_rng_match[] = { |
| + { .compatible = "nokia,n900-rom-rng", .data = omap3_rom_rng_read, }, |
| + { /* sentinel */ }, |
| +}; |
| +MODULE_DEVICE_TABLE(of, omap_rom_rng_match); |
| + |
| static struct platform_driver omap3_rom_rng_driver = { |
| .driver = { |
| .name = "omap3-rom-rng", |
| + .of_match_table = omap_rom_rng_match, |
| }, |
| .probe = omap3_rom_rng_probe, |
| .remove = omap3_rom_rng_remove, |
| -- |
| 2.7.4 |
| |