diff --git a/arch/arm64/boot/dts/amlogic/mesonaxg.dtsi b/arch/arm64/boot/dts/amlogic/mesonaxg.dtsi index 3a1c674f90d8..e3fb2d96b417 100644 --- a/arch/arm64/boot/dts/amlogic/mesonaxg.dtsi +++ b/arch/arm64/boot/dts/amlogic/mesonaxg.dtsi @@ -184,6 +184,7 @@ #address-cells = <2>; #size-cells = <2>; reg = <0x0 0xff634018 0x0 0x4>; + quality = /bits/ 16 <1000>; }; mailbox: mhu@c883c400 { diff --git a/arch/arm64/boot/dts/amlogic/mesongxl.dtsi b/arch/arm64/boot/dts/amlogic/mesongxl.dtsi index d1962618333e..509953c35fb3 100644 --- a/arch/arm64/boot/dts/amlogic/mesongxl.dtsi +++ b/arch/arm64/boot/dts/amlogic/mesongxl.dtsi @@ -1019,6 +1019,7 @@ rng { compatible = "amlogic,meson-rng"; reg = <0x0 0x0 0x0 0x4>; + quality = /bits/ 16 <1000>; }; }; diff --git a/arch/arm64/boot/dts/amlogic/mesongxm.dtsi b/arch/arm64/boot/dts/amlogic/mesongxm.dtsi index a1ca12bd9eca..31586260b341 100644 --- a/arch/arm64/boot/dts/amlogic/mesongxm.dtsi +++ b/arch/arm64/boot/dts/amlogic/mesongxm.dtsi @@ -1127,6 +1127,7 @@ rng { compatible = "amlogic,meson-rng"; reg = <0x0 0x0 0x0 0x4>; + quality = /bits/ 16 <1000>; }; }; diff --git a/arch/arm64/boot/dts/amlogic/mesontxlx.dtsi b/arch/arm64/boot/dts/amlogic/mesontxlx.dtsi index e212b9b94033..0d6a78c99fb4 100644 --- a/arch/arm64/boot/dts/amlogic/mesontxlx.dtsi +++ b/arch/arm64/boot/dts/amlogic/mesontxlx.dtsi @@ -900,6 +900,7 @@ rng { compatible = "amlogic,meson-rng"; reg = <0x0 0x100 0x0 0x4>; + quality = /bits/ 16 <1000>; }; };/* end of periphs */ diff --git a/drivers/char/hw_random/meson-rng.c b/drivers/char/hw_random/meson-rng.c index 58bef39f7286..22d31d7e2937 100644 --- a/drivers/char/hw_random/meson-rng.c +++ b/drivers/char/hw_random/meson-rng.c @@ -86,7 +86,9 @@ static int meson_rng_probe(struct platform_device *pdev) struct device *dev = &pdev->dev; struct meson_rng_data *data; struct resource *res; - +#ifdef CONFIG_OF + int of_ret = 0; +#endif data = devm_kzalloc(dev, sizeof(*data), GFP_KERNEL); if (!data) return -ENOMEM; @@ -100,7 +102,20 @@ static int meson_rng_probe(struct platform_device *pdev) data->rng.name = pdev->name; data->rng.read = meson_rng_read; - +#ifdef CONFIG_OF + of_ret = + of_property_read_u16(pdev->dev.of_node, "quality", + &data->rng.quality); + if (of_ret) { + pr_info("Unable to get quality(%d)\n", of_ret); + // If there is no quality value specified in dts, + // set default quality to 1000 for the reason that + // HW RNG should be good source of entropy, and it + // also leaves room for others to give better + // entropy source + data->rng.quality = 1000; + } +#endif platform_set_drvdata(pdev, data); return devm_hwrng_register(dev, &data->rng);