linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] OMAP3 ROM Random Number Generator support
@ 2013-02-28 18:05 Pali Rohár
  2013-03-24 14:15 ` Pali Rohár
  2013-03-27 21:09 ` Tony Lindgren
  0 siblings, 2 replies; 33+ messages in thread
From: Pali Rohár @ 2013-02-28 18:05 UTC (permalink / raw)
  To: Tony Lindgren
  Cc: Juha Yrjola, Russell King, Matt Mackall, Herbert Xu, linux-omap,
	linux-kernel

[-- Attachment #1: Type: Text/Plain, Size: 7871 bytes --]

This driver provides kernel-side support for the Random Number
Generator hardware found on OMAP34xx processors.

This driver is included in Maemo 2.6.28 kernel used on Nokia N900.

I fixed driver to work with 3.8 kernel and added platform_driver
code to autoload it on omap3 devices.

diff --git a/arch/arm/mach-omap2/devices.c b/arch/arm/mach-omap2/devices.c
index 626f3ea..48e40f3 100644
--- a/arch/arm/mach-omap2/devices.c
+++ b/arch/arm/mach-omap2/devices.c
@@ -446,6 +446,18 @@ static void omap_init_mcspi(void)
 static inline void omap_init_mcspi(void) {}
 #endif
 
+static struct platform_device omap3_rom_rng_device = {
+	.name		= "omap3-rom-rng",
+	.id		= -1,
+};
+
+static void omap_init_rom_rng(void)
+{
+	if (!cpu_is_omap34xx() || omap_type() == OMAP2_DEVICE_TYPE_GP)
+		return;
+	platform_device_register(&omap3_rom_rng_device);
+}
+
 /**
  * omap_init_rng - bind the RNG hwmod to the RNG omap_device
  *
@@ -727,6 +739,7 @@ static int __init omap2_init_devices(void)
 	}
 	omap_init_sti();
 	omap_init_rng();
+	omap_init_rom_rng();
 	omap_init_sham();
 	omap_init_aes();
 	omap_init_vout();
diff --git a/drivers/char/hw_random/Kconfig b/drivers/char/hw_random/Kconfig
index c5a0262..2d51db6 100644
--- a/drivers/char/hw_random/Kconfig
+++ b/drivers/char/hw_random/Kconfig
@@ -153,6 +153,19 @@ config HW_RANDOM_OMAP
 
  	  If unsure, say Y.
 
+config HW_RANDOM_OMAP3_ROM
+	tristate "OMAP3 ROM Random Number Generator support"
+	depends on HW_RANDOM && ARCH_OMAP3
+	default HW_RANDOM
+	---help---
+	  This driver provides kernel-side support for the Random Number
+	  Generator hardware found on OMAP34xx processors.
+
+	  To compile this driver as a module, choose M here: the
+	  module will be called omap3-rom-rng.
+
+	  If unsure, say Y.
+
 config HW_RANDOM_OCTEON
 	tristate "Octeon Random Number Generator support"
 	depends on HW_RANDOM && CPU_CAVIUM_OCTEON
diff --git a/drivers/char/hw_random/Makefile b/drivers/char/hw_random/Makefile
index 1fd7eec..d227cd6 100644
--- a/drivers/char/hw_random/Makefile
+++ b/drivers/char/hw_random/Makefile
@@ -15,6 +15,8 @@ n2-rng-y := n2-drv.o n2-asm.o
 obj-$(CONFIG_HW_RANDOM_VIA) += via-rng.o
 obj-$(CONFIG_HW_RANDOM_IXP4XX) += ixp4xx-rng.o
 obj-$(CONFIG_HW_RANDOM_OMAP) += omap-rng.o
+obj-$(CONFIG_HW_RANDOM_OMAP3_ROM) += omap3-rom-rng.o
+omap3-rom-rng-y := omap3-rom-drv.o omap3-rom-asm.o
 obj-$(CONFIG_HW_RANDOM_PASEMI) += pasemi-rng.o
 obj-$(CONFIG_HW_RANDOM_VIRTIO) += virtio-rng.o
 obj-$(CONFIG_HW_RANDOM_TX4939) += tx4939-rng.o
diff --git a/drivers/char/hw_random/omap3-rom-asm.S b/drivers/char/hw_random/omap3-rom-asm.S
new file mode 100644
index 0000000..ce82e16
--- /dev/null
+++ b/drivers/char/hw_random/omap3-rom-asm.S
@@ -0,0 +1,27 @@
+/*
+ * Copyright (C) 2009 Nokia Corporation
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ */
+
+#include <linux/linkage.h>
+#include <asm/assembler.h>
+
+ENTRY(omap3_rng_call_rom_asm)
+	.arch_extension sec
+	stmfd	sp!, {r4-r12, lr}
+	stmfd	sp!, {r0-r3}
+	bl	v7_flush_dcache_all
+	ldmfd	sp!, {r0-r3}
+	mov	r6, #0xff
+	mov	r12, r0
+	smc	#1
+	mov	r12, r0
+	bl	v7_flush_dcache_all
+	mov	r0, #0
+	mcr	p15, 0, r0, c7, c5, 0
+	mov	r0, r12
+	ldmfd	sp!, {r4-r12, pc}
diff --git a/drivers/char/hw_random/omap3-rom-drv.c b/drivers/char/hw_random/omap3-rom-drv.c
new file mode 100644
index 0000000..4e2c0ff
--- /dev/null
+++ b/drivers/char/hw_random/omap3-rom-drv.c
@@ -0,0 +1,167 @@
+/*
+ * omap3-rom-drv.c - RNG driver for TI OMAP3 CPU family
+ *
+ * Copyright (C) 2009 Nokia Corporation
+ * Author: Juha Yrjola <juha.yrjola@solidboot.com>
+ *
+ * This file is licensed under  the terms of the GNU General Public
+ * License version 2. This program is licensed "as is" without any
+ * warranty of any kind, whether express or implied.
+ */
+
+#include <linux/module.h>
+#include <linux/init.h>
+#include <linux/random.h>
+#include <linux/hw_random.h>
+#include <linux/timer.h>
+#include <linux/clk.h>
+#include <linux/err.h>
+#include <linux/platform_device.h>
+
+#include "../../../arch/arm/mach-omap2/soc.h"
+
+#define SEC_HAL_RNG_GENERATE		29
+#define RNG_RESET			0x01
+#define RNG_GEN_PRNG_HW_INIT		0x02
+#define RNG_GEN_HW			0x08
+
+static const char *omap3_rom_rng_name = "OMAP3 ROM RNG";
+
+extern u32 omap3_rng_call_rom_asm(u32 id, u32 proc, u32 flags, u32 va_ptr);
+
+static int call_sec_rom(u32 appl_id, u32 proc_id, u32 flag, ...)
+{
+	va_list ap;
+	u32 ret;
+	u32 val;
+
+	va_start(ap, flag);
+	val = *(u32 *) &ap;
+	local_irq_disable();
+	local_fiq_disable();
+	ret = omap3_rng_call_rom_asm(appl_id, proc_id, flag,
+				     (u32) virt_to_phys((void *) val));
+	local_fiq_enable();
+	local_irq_enable();
+	va_end(ap);
+
+	return ret;
+}
+
+static struct timer_list idle_timer;
+static int rng_idle;
+static struct clk *rng_clk;
+
+static void omap3_rom_idle_rng(unsigned long data)
+{
+	int r;
+
+	r = call_sec_rom(SEC_HAL_RNG_GENERATE, 0, 0, 3, NULL, 0,
+			 RNG_RESET);
+	if (r != 0) {
+		printk(KERN_ERR "%s: reset failed: %d\n",
+		       omap3_rom_rng_name, r);
+		return;
+	}
+	clk_disable_unprepare(rng_clk);
+	rng_idle = 1;
+}
+
+static int omap3_rom_get_random(void *buf, unsigned int count)
+{
+	u32 r;
+	u32 ptr;
+
+	del_timer_sync(&idle_timer);
+	if (rng_idle) {
+		clk_prepare_enable(rng_clk);
+		r = call_sec_rom(SEC_HAL_RNG_GENERATE, 0, 0, 3, NULL, 0,
+				 RNG_GEN_PRNG_HW_INIT);
+		if (r != 0) {
+			clk_disable_unprepare(rng_clk);
+			printk(KERN_ERR "%s: HW init failed: %d\n",
+			       omap3_rom_rng_name, r);
+			return -EIO;
+		}
+		rng_idle = 0;
+	}
+
+	ptr = virt_to_phys(buf);
+	r = call_sec_rom(SEC_HAL_RNG_GENERATE, 0, 0, 3, ptr,
+			 count, RNG_GEN_HW);
+	mod_timer(&idle_timer, jiffies + msecs_to_jiffies(500));
+	if (r != 0)
+		return -EINVAL;
+	return 0;
+}
+
+static int omap3_rom_rng_data_present(struct hwrng *rng, int wait)
+{
+	return 1;
+}
+
+static int omap3_rom_rng_data_read(struct hwrng *rng, u32 *data)
+{
+	int r;
+
+	r = omap3_rom_get_random(data, 4);
+	if (r < 0)
+		return r;
+	return 4;
+}
+
+static struct hwrng omap3_rom_rng_ops = {
+	.name		= "omap3-rom",
+	.data_present	= omap3_rom_rng_data_present,
+	.data_read	= omap3_rom_rng_data_read,
+};
+
+static int omap3_rom_rng_probe(struct platform_device *pdev)
+{
+	printk(KERN_INFO "%s: initializing\n", omap3_rom_rng_name);
+	if (!cpu_is_omap34xx()) {
+		printk(KERN_ERR "%s: currently supports only OMAP34xx CPUs\n",
+		       omap3_rom_rng_name);
+		return -ENODEV;
+	}
+	if (omap_type() == OMAP2_DEVICE_TYPE_GP) {
+		printk(KERN_ERR "%s: GP OMAPs not supported\n",
+		       omap3_rom_rng_name);
+		return -ENODEV;
+	}
+
+	setup_timer(&idle_timer, omap3_rom_idle_rng, 0);
+	rng_clk = clk_get_sys("omap_rng", "ick");
+	if (IS_ERR(rng_clk)) {
+		printk(KERN_ERR "%s: unable to get RNG clock\n",
+		       omap3_rom_rng_name);
+		return IS_ERR(rng_clk);
+	}
+
+	/* Leave the RNG in reset state. */
+	clk_prepare_enable(rng_clk);
+	omap3_rom_idle_rng(0);
+
+	return hwrng_register(&omap3_rom_rng_ops);
+}
+
+static int omap3_rom_rng_remove(struct platform_device *pdev)
+{
+	hwrng_unregister(&omap3_rom_rng_ops);
+	return 0;
+}
+
+static struct platform_driver omap3_rom_rng_driver = {
+	.driver = {
+		.name		= "omap3-rom-rng",
+		.owner		= THIS_MODULE,
+	},
+	.probe		= omap3_rom_rng_probe,
+	.remove		= omap3_rom_rng_remove,
+};
+
+module_platform_driver(omap3_rom_rng_driver);
+
+MODULE_ALIAS("platform:omap3-rom-rng");
+MODULE_AUTHOR("Juha Yrjola");
+MODULE_LICENSE("GPL");

-- 
Pali Rohár
pali.rohar@gmail.com

[-- Attachment #2: This is a digitally signed message part. --]
[-- Type: application/pgp-signature, Size: 198 bytes --]

^ permalink raw reply related	[flat|nested] 33+ messages in thread

* Re: [PATCH] OMAP3 ROM Random Number Generator support
  2013-02-28 18:05 [PATCH] OMAP3 ROM Random Number Generator support Pali Rohár
@ 2013-03-24 14:15 ` Pali Rohár
  2013-03-27 21:09 ` Tony Lindgren
  1 sibling, 0 replies; 33+ messages in thread
From: Pali Rohár @ 2013-03-24 14:15 UTC (permalink / raw)
  To: Tony Lindgren
  Cc: Juha Yrjola, Russell King, Matt Mackall, Herbert Xu, linux-omap,
	linux-kernel

[-- Attachment #1: Type: Text/Plain, Size: 456 bytes --]

On Thursday 28 February 2013 19:05:47 Pali Rohár wrote:
> This driver provides kernel-side support for the Random Number
> Generator hardware found on OMAP34xx processors.
> 
> This driver is included in Maemo 2.6.28 kernel used on Nokia
> N900.
> 
> I fixed driver to work with 3.8 kernel and added
> platform_driver code to autoload it on omap3 devices.
> 

Hello, can somebody look at this driver?

-- 
Pali Rohár
pali.rohar@gmail.com

[-- Attachment #2: This is a digitally signed message part. --]
[-- Type: application/pgp-signature, Size: 198 bytes --]

^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: [PATCH] OMAP3 ROM Random Number Generator support
  2013-02-28 18:05 [PATCH] OMAP3 ROM Random Number Generator support Pali Rohár
  2013-03-24 14:15 ` Pali Rohár
@ 2013-03-27 21:09 ` Tony Lindgren
  2013-03-27 22:03   ` Pali Rohár
  2013-03-28  9:52   ` [PATCH] OMAP3 ROM Random Number Generator support Russell King - ARM Linux
  1 sibling, 2 replies; 33+ messages in thread
From: Tony Lindgren @ 2013-03-27 21:09 UTC (permalink / raw)
  To: Pali Rohár
  Cc: Juha Yrjola, Russell King, Matt Mackall, Herbert Xu, linux-omap,
	linux-kernel

* Pali Rohár <pali.rohar@gmail.com> [130228 10:09]:
> --- /dev/null
> +++ b/drivers/char/hw_random/omap3-rom-asm.S
> @@ -0,0 +1,27 @@
> +/*
> + * Copyright (C) 2009 Nokia Corporation
> + *
> + * This program is free software; you can redistribute it and/or modify
> + * it under the terms of the GNU General Public License version 2 as
> + * published by the Free Software Foundation.
> + *
> + */
> +
> +#include <linux/linkage.h>
> +#include <asm/assembler.h>
> +
> +ENTRY(omap3_rng_call_rom_asm)
> +	.arch_extension sec
> +	stmfd	sp!, {r4-r12, lr}
> +	stmfd	sp!, {r0-r3}
> +	bl	v7_flush_dcache_all
> +	ldmfd	sp!, {r0-r3}
> +	mov	r6, #0xff
> +	mov	r12, r0
> +	smc	#1
> +	mov	r12, r0
> +	bl	v7_flush_dcache_all
> +	mov	r0, #0
> +	mcr	p15, 0, r0, c7, c5, 0
> +	mov	r0, r12
> +	ldmfd	sp!, {r4-r12, pc}

This part should be in arch/arm/mach-omap2 because of the
direct calls to v7_flush_dcache_all. Then you can pass a pointer
to this function in platform_data for now, and set it up based
on the compatible flag with device tree from driver later on.

> --- /dev/null
> +++ b/drivers/char/hw_random/omap3-rom-drv.c
> @@ -0,0 +1,167 @@
> +/*
> + * omap3-rom-drv.c - RNG driver for TI OMAP3 CPU family
> + *
> + * Copyright (C) 2009 Nokia Corporation
> + * Author: Juha Yrjola <juha.yrjola@solidboot.com>
> + *
> + * This file is licensed under  the terms of the GNU General Public
> + * License version 2. This program is licensed "as is" without any
> + * warranty of any kind, whether express or implied.
> + */
> +
> +#include <linux/module.h>
> +#include <linux/init.h>
> +#include <linux/random.h>
> +#include <linux/hw_random.h>
> +#include <linux/timer.h>
> +#include <linux/clk.h>
> +#include <linux/err.h>
> +#include <linux/platform_device.h>
> +
> +#include "../../../arch/arm/mach-omap2/soc.h"

NAK for this, this must be private to arch/arm/mach-omap2.

Instead, just create a minimal include/linux/platform_data/omap3-rom.h,
and pass the function pointer in the pdata if passed.

> +static int omap3_rom_rng_probe(struct platform_device *pdev)
> +{
> +	printk(KERN_INFO "%s: initializing\n", omap3_rom_rng_name);
> +	if (!cpu_is_omap34xx()) {
> +		printk(KERN_ERR "%s: currently supports only OMAP34xx CPUs\n",
> +		       omap3_rom_rng_name);
> +		return -ENODEV;
> +	}
> +	if (omap_type() == OMAP2_DEVICE_TYPE_GP) {
> +		printk(KERN_ERR "%s: GP OMAPs not supported\n",
> +		       omap3_rom_rng_name);
> +		return -ENODEV;
> +	}
> +
> +	setup_timer(&idle_timer, omap3_rom_idle_rng, 0);
> +	rng_clk = clk_get_sys("omap_rng", "ick");
> +	if (IS_ERR(rng_clk)) {
> +		printk(KERN_ERR "%s: unable to get RNG clock\n",
> +		       omap3_rom_rng_name);
> +		return IS_ERR(rng_clk);
> +	}
> +
> +	/* Leave the RNG in reset state. */
> +	clk_prepare_enable(rng_clk);
> +	omap3_rom_idle_rng(0);
> +
> +	return hwrng_register(&omap3_rom_rng_ops);
> +}

You should replace the cpu_is_omap34xx() and omap_type() with
some flags that you pass in the pdata. These too can be then
deciphered based on the DT compatible flag later on. And then
you don't need to include soc.h.

Regards,

Tony

^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: [PATCH] OMAP3 ROM Random Number Generator support
  2013-03-27 21:09 ` Tony Lindgren
@ 2013-03-27 22:03   ` Pali Rohár
  2013-03-27 22:25     ` Tony Lindgren
  2013-03-28  9:52   ` [PATCH] OMAP3 ROM Random Number Generator support Russell King - ARM Linux
  1 sibling, 1 reply; 33+ messages in thread
From: Pali Rohár @ 2013-03-27 22:03 UTC (permalink / raw)
  To: Tony Lindgren
  Cc: Juha Yrjola, Russell King, Matt Mackall, Herbert Xu, linux-omap,
	linux-kernel

[-- Attachment #1: Type: Text/Plain, Size: 3815 bytes --]

On Wednesday 27 March 2013 22:09:18 Tony Lindgren wrote:
> * Pali Rohár <pali.rohar@gmail.com> [130228 10:09]:
> > --- /dev/null
> > +++ b/drivers/char/hw_random/omap3-rom-asm.S
> > @@ -0,0 +1,27 @@
> > +/*
> > + * Copyright (C) 2009 Nokia Corporation
> > + *
> > + * This program is free software; you can redistribute it
> > and/or modify + * it under the terms of the GNU General
> > Public License version 2 as + * published by the Free
> > Software Foundation.
> > + *
> > + */
> > +
> > +#include <linux/linkage.h>
> > +#include <asm/assembler.h>
> > +
> > +ENTRY(omap3_rng_call_rom_asm)
> > +	.arch_extension sec
> > +	stmfd	sp!, {r4-r12, lr}
> > +	stmfd	sp!, {r0-r3}
> > +	bl	v7_flush_dcache_all
> > +	ldmfd	sp!, {r0-r3}
> > +	mov	r6, #0xff
> > +	mov	r12, r0
> > +	smc	#1
> > +	mov	r12, r0
> > +	bl	v7_flush_dcache_all
> > +	mov	r0, #0
> > +	mcr	p15, 0, r0, c7, c5, 0
> > +	mov	r0, r12
> > +	ldmfd	sp!, {r4-r12, pc}
> 
> This part should be in arch/arm/mach-omap2 because of the
> direct calls to v7_flush_dcache_all. Then you can pass a
> pointer to this function in platform_data for now, and set it
> up based on the compatible flag with device tree from driver
> later on.
> 

Ok, I will move this file to arch/arm/mach-omap2/omap3-rom-rng.S 
and pass function via platform_data to driver.

> > --- /dev/null
> > +++ b/drivers/char/hw_random/omap3-rom-drv.c
> > @@ -0,0 +1,167 @@
> > +/*
> > + * omap3-rom-drv.c - RNG driver for TI OMAP3 CPU family
> > + *
> > + * Copyright (C) 2009 Nokia Corporation
> > + * Author: Juha Yrjola <juha.yrjola@solidboot.com>
> > + *
> > + * This file is licensed under  the terms of the GNU
> > General Public + * License version 2. This program is
> > licensed "as is" without any + * warranty of any kind,
> > whether express or implied. + */
> > +
> > +#include <linux/module.h>
> > +#include <linux/init.h>
> > +#include <linux/random.h>
> > +#include <linux/hw_random.h>
> > +#include <linux/timer.h>
> > +#include <linux/clk.h>
> > +#include <linux/err.h>
> > +#include <linux/platform_device.h>
> > +
> > +#include "../../../arch/arm/mach-omap2/soc.h"
> 
> NAK for this, this must be private to arch/arm/mach-omap2.
> 
> Instead, just create a minimal
> include/linux/platform_data/omap3-rom.h, and pass the
> function pointer in the pdata if passed.
> 
> > +static int omap3_rom_rng_probe(struct platform_device
> > *pdev) +{
> > +	printk(KERN_INFO "%s: initializing\n",
> > omap3_rom_rng_name); +	if (!cpu_is_omap34xx()) {
> > +		printk(KERN_ERR "%s: currently supports only OMAP34xx
> > CPUs\n", +		       omap3_rom_rng_name);
> > +		return -ENODEV;
> > +	}
> > +	if (omap_type() == OMAP2_DEVICE_TYPE_GP) {
> > +		printk(KERN_ERR "%s: GP OMAPs not supported\n",
> > +		       omap3_rom_rng_name);
> > +		return -ENODEV;
> > +	}
> > +
> > +	setup_timer(&idle_timer, omap3_rom_idle_rng, 0);
> > +	rng_clk = clk_get_sys("omap_rng", "ick");
> > +	if (IS_ERR(rng_clk)) {
> > +		printk(KERN_ERR "%s: unable to get RNG clock\n",
> > +		       omap3_rom_rng_name);
> > +		return IS_ERR(rng_clk);
> > +	}
> > +
> > +	/* Leave the RNG in reset state. */
> > +	clk_prepare_enable(rng_clk);
> > +	omap3_rom_idle_rng(0);
> > +
> > +	return hwrng_register(&omap3_rom_rng_ops);
> > +}
> 
> You should replace the cpu_is_omap34xx() and omap_type() with
> some flags that you pass in the pdata. These too can be then
> deciphered based on the DT compatible flag later on. And then
> you don't need to include soc.h.
> 
> Regards,
> 
> Tony

I will remove above code for checking omap type from hw rand 
driver, because same code is in omap part which creating 
platform_device for this driver. So soc.h is not needed.

-- 
Pali Rohár
pali.rohar@gmail.com

[-- Attachment #2: This is a digitally signed message part. --]
[-- Type: application/pgp-signature, Size: 198 bytes --]

^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: [PATCH] OMAP3 ROM Random Number Generator support
  2013-03-27 22:03   ` Pali Rohár
@ 2013-03-27 22:25     ` Tony Lindgren
  2013-03-28 17:54       ` Pali Rohár
  0 siblings, 1 reply; 33+ messages in thread
From: Tony Lindgren @ 2013-03-27 22:25 UTC (permalink / raw)
  To: Pali Rohár
  Cc: Juha Yrjola, Russell King, Matt Mackall, Herbert Xu, linux-omap,
	linux-kernel

* Pali Rohár <pali.rohar@gmail.com> [130327 15:08]:
> 
> I will remove above code for checking omap type from hw rand 
> driver, because same code is in omap part which creating 
> platform_device for this driver. So soc.h is not needed.

OK thanks,

Tony

^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: [PATCH] OMAP3 ROM Random Number Generator support
  2013-03-27 21:09 ` Tony Lindgren
  2013-03-27 22:03   ` Pali Rohár
@ 2013-03-28  9:52   ` Russell King - ARM Linux
  2013-03-28 17:24     ` Pali Rohár
  1 sibling, 1 reply; 33+ messages in thread
From: Russell King - ARM Linux @ 2013-03-28  9:52 UTC (permalink / raw)
  To: Tony Lindgren
  Cc: Pali Rohár, Juha Yrjola, Matt Mackall, Herbert Xu,
	linux-omap, linux-kernel

On Wed, Mar 27, 2013 at 02:09:18PM -0700, Tony Lindgren wrote:
> > +	setup_timer(&idle_timer, omap3_rom_idle_rng, 0);
> > +	rng_clk = clk_get_sys("omap_rng", "ick");

Why is this using clk_get_sys when it should be using clk_get() with the
platform device?

^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: [PATCH] OMAP3 ROM Random Number Generator support
  2013-03-28  9:52   ` [PATCH] OMAP3 ROM Random Number Generator support Russell King - ARM Linux
@ 2013-03-28 17:24     ` Pali Rohár
  0 siblings, 0 replies; 33+ messages in thread
From: Pali Rohár @ 2013-03-28 17:24 UTC (permalink / raw)
  To: Russell King - ARM Linux
  Cc: Tony Lindgren, Juha Yrjola, Matt Mackall, Herbert Xu, linux-omap,
	linux-kernel

[-- Attachment #1: Type: Text/Plain, Size: 544 bytes --]

On Thursday 28 March 2013 10:52:28 Russell King - ARM Linux 
wrote:
> On Wed, Mar 27, 2013 at 02:09:18PM -0700, Tony Lindgren wrote:
> > > +	setup_timer(&idle_timer, omap3_rom_idle_rng, 0);
> > > +	rng_clk = clk_get_sys("omap_rng", "ick");
> 
> Why is this using clk_get_sys when it should be using
> clk_get() with the platform device?

Funcion clk_get() needs struct device* instead clk device name. 
And I do not know how to get that pointer to device. With 
clk_get_sys driver working.

-- 
Pali Rohár
pali.rohar@gmail.com

[-- Attachment #2: This is a digitally signed message part. --]
[-- Type: application/pgp-signature, Size: 198 bytes --]

^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: [PATCH] OMAP3 ROM Random Number Generator support
  2013-03-27 22:25     ` Tony Lindgren
@ 2013-03-28 17:54       ` Pali Rohár
  2013-03-28 21:44         ` Tony Lindgren
  2013-09-18 20:05         ` [PATCH 0/2] " Pali Rohár
  0 siblings, 2 replies; 33+ messages in thread
From: Pali Rohár @ 2013-03-28 17:54 UTC (permalink / raw)
  To: Tony Lindgren
  Cc: Juha Yrjola, Russell King, Matt Mackall, Herbert Xu, linux-omap,
	linux-kernel

[-- Attachment #1: Type: Text/Plain, Size: 8628 bytes --]

On Wednesday 27 March 2013 23:25:24 Tony Lindgren wrote:
> * Pali Rohár <pali.rohar@gmail.com> [130327 15:08]:
> > I will remove above code for checking omap type from hw rand
> > driver, because same code is in omap part which creating
> > platform_device for this driver. So soc.h is not needed.
> 
> OK thanks,
> 
> Tony

Here is new version of patch:

diff --git a/arch/arm/mach-omap2/Makefile b/arch/arm/mach-omap2/Makefile
index 5423456..37c4e09 100644
--- a/arch/arm/mach-omap2/Makefile
+++ b/arch/arm/mach-omap2/Makefile
@@ -82,7 +82,7 @@ obj-$(CONFIG_OMAP_PM_NOOP)		+= omap-pm-noop.o
 ifeq ($(CONFIG_PM),y)
 obj-$(CONFIG_ARCH_OMAP2)		+= pm24xx.o
 obj-$(CONFIG_ARCH_OMAP2)		+= sleep24xx.o
-obj-$(CONFIG_ARCH_OMAP3)		+= pm34xx.o sleep34xx.o
+obj-$(CONFIG_ARCH_OMAP3)		+= pm34xx.o sleep34xx.o omap3-rom-rng.o
 obj-$(CONFIG_ARCH_OMAP4)		+= pm44xx.o omap-mpuss-lowpower.o
 obj-$(CONFIG_SOC_OMAP5)			+= omap-mpuss-lowpower.o
 obj-$(CONFIG_PM_DEBUG)			+= pm-debug.o
diff --git a/arch/arm/mach-omap2/devices.c b/arch/arm/mach-omap2/devices.c
index 1ec7f05..0b6260a1 100644
--- a/arch/arm/mach-omap2/devices.c
+++ b/arch/arm/mach-omap2/devices.c
@@ -486,6 +486,23 @@ static void omap_init_mcspi(void)
 static inline void omap_init_mcspi(void) {}
 #endif
 
+extern u32 *omap3_rom_rng_call(u32 id, u32 proc, u32 flags, u32 va_ptr);
+
+static struct platform_device omap3_rom_rng_device = {
+	.name		= "omap3-rom-rng",
+	.id		= -1,
+	.dev	= {
+		.platform_data	= omap3_rom_rng_call,
+	},
+};
+
+static void omap_init_rom_rng(void)
+{
+	if (!cpu_is_omap34xx() || omap_type() == OMAP2_DEVICE_TYPE_GP)
+		return;
+	platform_device_register(&omap3_rom_rng_device);
+}
+
 /**
  * omap_init_rng - bind the RNG hwmod to the RNG omap_device
  *
@@ -767,6 +784,7 @@ static int __init omap2_init_devices(void)
 	}
 	omap_init_sti();
 	omap_init_rng();
+	omap_init_rom_rng();
 	omap_init_sham();
 	omap_init_aes();
 	omap_init_vout();
diff --git a/arch/arm/mach-omap2/omap3-rom-rng.S b/arch/arm/mach-omap2/omap3-rom-rng.S
new file mode 100644
index 0000000..5d7d886
--- /dev/null
+++ b/arch/arm/mach-omap2/omap3-rom-rng.S
@@ -0,0 +1,28 @@
+/*
+ * Copyright (C) 2009 Nokia Corporation
+ * Copyright (C) 2013 Pali Rohár <pali.rohar@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ */
+
+#include <linux/linkage.h>
+#include <asm/assembler.h>
+
+ENTRY(omap3_rom_rng_call)
+	.arch_extension sec
+	stmfd	sp!, {r4-r12, lr}
+	stmfd	sp!, {r0-r3}
+	bl	v7_flush_dcache_all
+	ldmfd	sp!, {r0-r3}
+	mov	r6, #0xff
+	mov	r12, r0
+	smc	#1
+	mov	r12, r0
+	bl	v7_flush_dcache_all
+	mov	r0, #0
+	mcr	p15, 0, r0, c7, c5, 0
+	mov	r0, r12
+	ldmfd	sp!, {r4-r12, pc}
diff --git a/drivers/char/hw_random/Kconfig b/drivers/char/hw_random/Kconfig
index c5a0262..2d51db6 100644
--- a/drivers/char/hw_random/Kconfig
+++ b/drivers/char/hw_random/Kconfig
@@ -153,6 +153,19 @@ config HW_RANDOM_OMAP
 
  	  If unsure, say Y.
 
+config HW_RANDOM_OMAP3_ROM
+	tristate "OMAP3 ROM Random Number Generator support"
+	depends on HW_RANDOM && ARCH_OMAP3
+	default HW_RANDOM
+	---help---
+	  This driver provides kernel-side support for the Random Number
+	  Generator hardware found on OMAP34xx processors.
+
+	  To compile this driver as a module, choose M here: the
+	  module will be called omap3-rom-rng.
+
+	  If unsure, say Y.
+
 config HW_RANDOM_OCTEON
 	tristate "Octeon Random Number Generator support"
 	depends on HW_RANDOM && CPU_CAVIUM_OCTEON
diff --git a/drivers/char/hw_random/Makefile b/drivers/char/hw_random/Makefile
index 1fd7eec..c53e018 100644
--- a/drivers/char/hw_random/Makefile
+++ b/drivers/char/hw_random/Makefile
@@ -15,6 +15,7 @@ n2-rng-y := n2-drv.o n2-asm.o
 obj-$(CONFIG_HW_RANDOM_VIA) += via-rng.o
 obj-$(CONFIG_HW_RANDOM_IXP4XX) += ixp4xx-rng.o
 obj-$(CONFIG_HW_RANDOM_OMAP) += omap-rng.o
+obj-$(CONFIG_HW_RANDOM_OMAP3_ROM) += omap3-rom-rng.o
 obj-$(CONFIG_HW_RANDOM_PASEMI) += pasemi-rng.o
 obj-$(CONFIG_HW_RANDOM_VIRTIO) += virtio-rng.o
 obj-$(CONFIG_HW_RANDOM_TX4939) += tx4939-rng.o
diff --git a/drivers/char/hw_random/omap3-rom-rng.c b/drivers/char/hw_random/omap3-rom-rng.c
new file mode 100644
index 0000000..5343415
--- /dev/null
+++ b/drivers/char/hw_random/omap3-rom-rng.c
@@ -0,0 +1,165 @@
+/*
+ * omap3-rom-drv.c - RNG driver for TI OMAP3 CPU family
+ *
+ * Copyright (C) 2009 Nokia Corporation
+ * Author: Juha Yrjola <juha.yrjola@solidboot.com>
+ *
+ * Copyright (C) 2013 Pali Rohár <pali.rohar@gmail.com>
+ *
+ * This file is licensed under  the terms of the GNU General Public
+ * License version 2. This program is licensed "as is" without any
+ * warranty of any kind, whether express or implied.
+ */
+
+#include <linux/module.h>
+#include <linux/init.h>
+#include <linux/random.h>
+#include <linux/hw_random.h>
+#include <linux/timer.h>
+#include <linux/clk.h>
+#include <linux/err.h>
+#include <linux/platform_device.h>
+
+#define SEC_HAL_RNG_GENERATE		29
+#define RNG_RESET			0x01
+#define RNG_GEN_PRNG_HW_INIT		0x02
+#define RNG_GEN_HW			0x08
+
+static const char *omap3_rom_rng_name = "OMAP3 ROM RNG";
+
+static u32 (*omap3_rom_rng_call)(u32, u32, u32, u32);
+
+static int call_sec_rom(u32 appl_id, u32 proc_id, u32 flag, ...)
+{
+	va_list ap;
+	u32 ret;
+	u32 val;
+
+	va_start(ap, flag);
+	val = *(u32 *) &ap;
+	local_irq_disable();
+	local_fiq_disable();
+	ret = omap3_rom_rng_call(appl_id, proc_id, flag,
+				 (u32) virt_to_phys((void *) val));
+	local_fiq_enable();
+	local_irq_enable();
+	va_end(ap);
+
+	return ret;
+}
+
+static struct timer_list idle_timer;
+static int rng_idle;
+static struct clk *rng_clk;
+
+static void omap3_rom_idle_rng(unsigned long data)
+{
+	int r;
+
+	r = call_sec_rom(SEC_HAL_RNG_GENERATE, 0, 0, 3, NULL, 0,
+			 RNG_RESET);
+	if (r != 0) {
+		printk(KERN_ERR "%s: reset failed: %d\n",
+		       omap3_rom_rng_name, r);
+		return;
+	}
+	clk_disable_unprepare(rng_clk);
+	rng_idle = 1;
+}
+
+static int omap3_rom_get_random(void *buf, unsigned int count)
+{
+	u32 r;
+	u32 ptr;
+
+	del_timer_sync(&idle_timer);
+	if (rng_idle) {
+		clk_prepare_enable(rng_clk);
+		r = call_sec_rom(SEC_HAL_RNG_GENERATE, 0, 0, 3, NULL, 0,
+				 RNG_GEN_PRNG_HW_INIT);
+		if (r != 0) {
+			clk_disable_unprepare(rng_clk);
+			printk(KERN_ERR "%s: HW init failed: %d\n",
+			       omap3_rom_rng_name, r);
+			return -EIO;
+		}
+		rng_idle = 0;
+	}
+
+	ptr = virt_to_phys(buf);
+	r = call_sec_rom(SEC_HAL_RNG_GENERATE, 0, 0, 3, ptr,
+			 count, RNG_GEN_HW);
+	mod_timer(&idle_timer, jiffies + msecs_to_jiffies(500));
+	if (r != 0)
+		return -EINVAL;
+	return 0;
+}
+
+static int omap3_rom_rng_data_present(struct hwrng *rng, int wait)
+{
+	return 1;
+}
+
+static int omap3_rom_rng_data_read(struct hwrng *rng, u32 *data)
+{
+	int r;
+
+	r = omap3_rom_get_random(data, 4);
+	if (r < 0)
+		return r;
+	return 4;
+}
+
+static struct hwrng omap3_rom_rng_ops = {
+	.name		= "omap3-rom",
+	.data_present	= omap3_rom_rng_data_present,
+	.data_read	= omap3_rom_rng_data_read,
+};
+
+static int omap3_rom_rng_probe(struct platform_device *pdev)
+{
+	printk(KERN_INFO "%s: initializing\n", omap3_rom_rng_name);
+
+	omap3_rom_rng_call = pdev->dev.platform_data;
+	if (!omap3_rom_rng_call) {
+		printk(KERN_ERR "%s: omap3_rom_rng_call is NULL\n",
+		       omap3_rom_rng_name);
+		return -EINVAL;
+	}
+
+	setup_timer(&idle_timer, omap3_rom_idle_rng, 0);
+	rng_clk = clk_get_sys("omap_rng", "ick");
+	if (IS_ERR(rng_clk)) {
+		printk(KERN_ERR "%s: unable to get RNG clock\n",
+		       omap3_rom_rng_name);
+		return IS_ERR(rng_clk);
+	}
+
+	/* Leave the RNG in reset state. */
+	clk_prepare_enable(rng_clk);
+	omap3_rom_idle_rng(0);
+
+	return hwrng_register(&omap3_rom_rng_ops);
+}
+
+static int omap3_rom_rng_remove(struct platform_device *pdev)
+{
+	hwrng_unregister(&omap3_rom_rng_ops);
+	return 0;
+}
+
+static struct platform_driver omap3_rom_rng_driver = {
+	.driver = {
+		.name		= "omap3-rom-rng",
+		.owner		= THIS_MODULE,
+	},
+	.probe		= omap3_rom_rng_probe,
+	.remove		= omap3_rom_rng_remove,
+};
+
+module_platform_driver(omap3_rom_rng_driver);
+
+MODULE_ALIAS("platform:omap3-rom-rng");
+MODULE_AUTHOR("Juha Yrjola");
+MODULE_AUTHOR("Pali Rohár <pali.rohar@gmail.com>");
+MODULE_LICENSE("GPL");

-- 
Pali Rohár
pali.rohar@gmail.com

[-- Attachment #2: This is a digitally signed message part. --]
[-- Type: application/pgp-signature, Size: 198 bytes --]

^ permalink raw reply related	[flat|nested] 33+ messages in thread

* Re: [PATCH] OMAP3 ROM Random Number Generator support
  2013-03-28 17:54       ` Pali Rohár
@ 2013-03-28 21:44         ` Tony Lindgren
  2013-03-31  9:28           ` Pali Rohár
  2013-09-18 20:05         ` [PATCH 0/2] " Pali Rohár
  1 sibling, 1 reply; 33+ messages in thread
From: Tony Lindgren @ 2013-03-28 21:44 UTC (permalink / raw)
  To: Pali Rohár
  Cc: Juha Yrjola, Russell King, Matt Mackall, Herbert Xu, linux-omap,
	linux-kernel

* Pali Rohár <pali.rohar@gmail.com> [130328 10:58]:
> 
> Here is new version of patch:
> 
> --- a/arch/arm/mach-omap2/devices.c
> +++ b/arch/arm/mach-omap2/devices.c
> @@ -486,6 +486,23 @@ static void omap_init_mcspi(void)
>  static inline void omap_init_mcspi(void) {}
>  #endif
>  
> +extern u32 *omap3_rom_rng_call(u32 id, u32 proc, u32 flags, u32 va_ptr);
> +
> +static struct platform_device omap3_rom_rng_device = {
> +	.name		= "omap3-rom-rng",
> +	.id		= -1,
> +	.dev	= {
> +		.platform_data	= omap3_rom_rng_call,
> +	},
> +};
> +
> +static void omap_init_rom_rng(void)
> +{
> +	if (!cpu_is_omap34xx() || omap_type() == OMAP2_DEVICE_TYPE_GP)
> +		return;
> +	platform_device_register(&omap3_rom_rng_device);
> +}
> +
>  /**
>   * omap_init_rng - bind the RNG hwmod to the RNG omap_device
>   *

This driver probably only works on Nokia boards because of the
different SMC call numbering. Until it's been verified on some
other HS omap34xx, I'd probably register this only from the
Nokia board-*.c file.

> --- /dev/null
> +++ b/drivers/char/hw_random/omap3-rom-rng.c
> +static int omap3_rom_rng_probe(struct platform_device *pdev)
> +{
> +	printk(KERN_INFO "%s: initializing\n", omap3_rom_rng_name);
> +
> +	omap3_rom_rng_call = pdev->dev.platform_data;
> +	if (!omap3_rom_rng_call) {
> +		printk(KERN_ERR "%s: omap3_rom_rng_call is NULL\n",
> +		       omap3_rom_rng_name);
> +		return -EINVAL;
> +	}
> +
> +	setup_timer(&idle_timer, omap3_rom_idle_rng, 0);
> +	rng_clk = clk_get_sys("omap_rng", "ick");
> +	if (IS_ERR(rng_clk)) {
> +		printk(KERN_ERR "%s: unable to get RNG clock\n",
> +		       omap3_rom_rng_name);
> +		return IS_ERR(rng_clk);
> +	}

You can use regular clk_get if you add the alias to
struct omap_clk omap3xxx_clks table.

Regards,

Tony

^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: [PATCH] OMAP3 ROM Random Number Generator support
  2013-03-28 21:44         ` Tony Lindgren
@ 2013-03-31  9:28           ` Pali Rohár
  2013-04-01 16:25             ` Tony Lindgren
  0 siblings, 1 reply; 33+ messages in thread
From: Pali Rohár @ 2013-03-31  9:28 UTC (permalink / raw)
  To: Tony Lindgren
  Cc: Juha Yrjola, Russell King, Matt Mackall, Herbert Xu, linux-omap,
	linux-kernel,
	Ивайло
	Димитров

[-- Attachment #1: Type: Text/Plain, Size: 2302 bytes --]

On Thursday 28 March 2013 22:44:11 Tony Lindgren wrote:
> * Pali Rohár <pali.rohar@gmail.com> [130328 10:58]:
> > Here is new version of patch:
> > 
> > --- a/arch/arm/mach-omap2/devices.c
> > +++ b/arch/arm/mach-omap2/devices.c
> > @@ -486,6 +486,23 @@ static void omap_init_mcspi(void)
> > 
> >  static inline void omap_init_mcspi(void) {}
> >  #endif
> > 
> > +extern u32 *omap3_rom_rng_call(u32 id, u32 proc, u32 flags,
> > u32 va_ptr); +
> > +static struct platform_device omap3_rom_rng_device = {
> > +	.name		= "omap3-rom-rng",
> > +	.id		= -1,
> > +	.dev	= {
> > +		.platform_data	= omap3_rom_rng_call,
> > +	},
> > +};
> > +
> > +static void omap_init_rom_rng(void)
> > +{
> > +	if (!cpu_is_omap34xx() || omap_type() ==
> > OMAP2_DEVICE_TYPE_GP) +		return;
> > +	platform_device_register(&omap3_rom_rng_device);
> > +}
> > +
> > 
> >  /**
> >  
> >   * omap_init_rng - bind the RNG hwmod to the RNG
> >   omap_device *
> 
> This driver probably only works on Nokia boards because of the
> different SMC call numbering. Until it's been verified on some
> other HS omap34xx, I'd probably register this only from the
> Nokia board-*.c file.
> 

Freemangordon, can you look at this smc and errara 430973 code if 
they could be merged? Really omap3_rom_rng_call function looks 
like n900 specific.

Link: https://lkml.org/lkml/2013/3/28/398

> > --- /dev/null
> > +++ b/drivers/char/hw_random/omap3-rom-rng.c
> > +static int omap3_rom_rng_probe(struct platform_device
> > *pdev) +{
> > +	printk(KERN_INFO "%s: initializing\n",
> > omap3_rom_rng_name); +
> > +	omap3_rom_rng_call = pdev->dev.platform_data;
> > +	if (!omap3_rom_rng_call) {
> > +		printk(KERN_ERR "%s: omap3_rom_rng_call is NULL\n",
> > +		       omap3_rom_rng_name);
> > +		return -EINVAL;
> > +	}
> > +
> > +	setup_timer(&idle_timer, omap3_rom_idle_rng, 0);
> > +	rng_clk = clk_get_sys("omap_rng", "ick");
> > +	if (IS_ERR(rng_clk)) {
> > +		printk(KERN_ERR "%s: unable to get RNG clock\n",
> > +		       omap3_rom_rng_name);
> > +		return IS_ERR(rng_clk);
> > +	}
> 
> You can use regular clk_get if you add the alias to
> struct omap_clk omap3xxx_clks table.
> 
> Regards,
> 
> Tony

Tony, can you show me how?

-- 
Pali Rohár
pali.rohar@gmail.com

[-- Attachment #2: This is a digitally signed message part. --]
[-- Type: application/pgp-signature, Size: 198 bytes --]

^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: [PATCH] OMAP3 ROM Random Number Generator support
  2013-03-31  9:28           ` Pali Rohár
@ 2013-04-01 16:25             ` Tony Lindgren
  0 siblings, 0 replies; 33+ messages in thread
From: Tony Lindgren @ 2013-04-01 16:25 UTC (permalink / raw)
  To: Pali Rohár
  Cc: Juha Yrjola, Russell King, Matt Mackall, Herbert Xu, linux-omap,
	linux-kernel,
	Ивайло
	Димитров

* Pali Rohár <pali.rohar@gmail.com> [130331 02:32]:
> On Thursday 28 March 2013 22:44:11 Tony Lindgren wrote:
> > 
> > You can use regular clk_get if you add the alias to
> > struct omap_clk omap3xxx_clks table.
> 
> Tony, can you show me how?

Take a look at the omap3xxx_clks in cclock3xxx_data.c.
Note how some entries have things like "omap_hsmmc.0" and
"ick". By adding those your driver can request the clock
with clk_get(&pdev->dev, "ick").

Regards,

Tony

^ permalink raw reply	[flat|nested] 33+ messages in thread

* [PATCH 0/2] OMAP3 ROM Random Number Generator support
  2013-03-28 17:54       ` Pali Rohár
  2013-03-28 21:44         ` Tony Lindgren
@ 2013-09-18 20:05         ` Pali Rohár
  2013-09-18 20:05           ` [PATCH 1/2] hwrng: " Pali Rohár
                             ` (2 more replies)
  1 sibling, 3 replies; 33+ messages in thread
From: Pali Rohár @ 2013-09-18 20:05 UTC (permalink / raw)
  To: Matt Mackall, Herbert Xu, Tony Lindgren, Russell King
  Cc: linux-omap, linux-kernel, Pali Rohár

This two patches adding support for OMAP3 ROM Random Number Generator on Nokia N900.

Pali Rohár (2):
  hwrng: OMAP3 ROM Random Number Generator support
  RX-51: Add support for OMAP3 ROM Random Number Generator

 arch/arm/mach-omap2/board-rx51.c       |   10 +++
 arch/arm/mach-omap2/omap-secure.c      |   11 +++
 arch/arm/mach-omap2/omap-secure.h      |    1 +
 drivers/char/hw_random/Kconfig         |   13 +++
 drivers/char/hw_random/Makefile        |    1 +
 drivers/char/hw_random/omap3-rom-rng.c |  145 ++++++++++++++++++++++++++++++++
 6 files changed, 181 insertions(+)
 create mode 100644 drivers/char/hw_random/omap3-rom-rng.c

-- 
1.7.10.4


^ permalink raw reply	[flat|nested] 33+ messages in thread

* [PATCH 1/2] hwrng: OMAP3 ROM Random Number Generator support
  2013-09-18 20:05         ` [PATCH 0/2] " Pali Rohár
@ 2013-09-18 20:05           ` Pali Rohár
  2013-09-18 20:22             ` Joe Perches
  2013-09-18 20:50             ` Aaro Koskinen
  2013-09-18 20:05           ` [PATCH 2/2] RX-51: Add support for OMAP3 ROM Random Number Generator Pali Rohár
  2013-09-20 13:25           ` [PATCH v2 0/3] OMAP3 ROM Random Number Generator support Pali Rohár
  2 siblings, 2 replies; 33+ messages in thread
From: Pali Rohár @ 2013-09-18 20:05 UTC (permalink / raw)
  To: Matt Mackall, Herbert Xu, Tony Lindgren, Russell King
  Cc: linux-omap, linux-kernel, Pali Rohár, Juha Yrjola

This driver provides kernel-side support for the Random Number
Generator hardware found on OMAP34xx processors.

Signed-off-by: Pali Rohár <pali.rohar@gmail.com>
Signed-off-by: Juha Yrjola <juha.yrjola@solidboot.com>
---
 drivers/char/hw_random/Kconfig         |   13 +++
 drivers/char/hw_random/Makefile        |    1 +
 drivers/char/hw_random/omap3-rom-rng.c |  145 ++++++++++++++++++++++++++++++++
 3 files changed, 159 insertions(+)
 create mode 100644 drivers/char/hw_random/omap3-rom-rng.c

diff --git a/drivers/char/hw_random/Kconfig b/drivers/char/hw_random/Kconfig
index 0aa9d91..0a331c3 100644
--- a/drivers/char/hw_random/Kconfig
+++ b/drivers/char/hw_random/Kconfig
@@ -165,6 +165,19 @@ config HW_RANDOM_OMAP
 
  	  If unsure, say Y.
 
+config HW_RANDOM_OMAP3_ROM
+	tristate "OMAP3 ROM Random Number Generator support"
+	depends on HW_RANDOM && ARCH_OMAP3
+	default HW_RANDOM
+	---help---
+	  This driver provides kernel-side support for the Random Number
+	  Generator hardware found on OMAP34xx processors.
+
+	  To compile this driver as a module, choose M here: the
+	  module will be called omap3-rom-rng.
+
+	  If unsure, say Y.
+
 config HW_RANDOM_OCTEON
 	tristate "Octeon Random Number Generator support"
 	depends on HW_RANDOM && CAVIUM_OCTEON_SOC
diff --git a/drivers/char/hw_random/Makefile b/drivers/char/hw_random/Makefile
index bed467c..7c8aa80 100644
--- a/drivers/char/hw_random/Makefile
+++ b/drivers/char/hw_random/Makefile
@@ -15,6 +15,7 @@ n2-rng-y := n2-drv.o n2-asm.o
 obj-$(CONFIG_HW_RANDOM_VIA) += via-rng.o
 obj-$(CONFIG_HW_RANDOM_IXP4XX) += ixp4xx-rng.o
 obj-$(CONFIG_HW_RANDOM_OMAP) += omap-rng.o
+obj-$(CONFIG_HW_RANDOM_OMAP3_ROM) += omap3-rom-rng.o
 obj-$(CONFIG_HW_RANDOM_PASEMI) += pasemi-rng.o
 obj-$(CONFIG_HW_RANDOM_VIRTIO) += virtio-rng.o
 obj-$(CONFIG_HW_RANDOM_TX4939) += tx4939-rng.o
diff --git a/drivers/char/hw_random/omap3-rom-rng.c b/drivers/char/hw_random/omap3-rom-rng.c
new file mode 100644
index 0000000..a9dbb2d
--- /dev/null
+++ b/drivers/char/hw_random/omap3-rom-rng.c
@@ -0,0 +1,145 @@
+/*
+ * omap3-rom-rng.c - RNG driver for TI OMAP3 CPU family
+ *
+ * Copyright (C) 2009 Nokia Corporation
+ * Author: Juha Yrjola <juha.yrjola@solidboot.com>
+ *
+ * Copyright (C) 2013 Pali Rohár <pali.rohar@gmail.com>
+ *
+ * This file is licensed under  the terms of the GNU General Public
+ * License version 2. This program is licensed "as is" without any
+ * warranty of any kind, whether express or implied.
+ */
+
+#include <linux/module.h>
+#include <linux/init.h>
+#include <linux/random.h>
+#include <linux/hw_random.h>
+#include <linux/timer.h>
+#include <linux/clk.h>
+#include <linux/err.h>
+#include <linux/platform_device.h>
+
+#define RNG_RESET			0x01
+#define RNG_GEN_PRNG_HW_INIT		0x02
+#define RNG_GEN_HW			0x08
+
+static const char *omap3_rom_rng_name = "OMAP3 ROM RNG";
+
+/* param1: ptr, param2: count, param3: flag */
+static u32 (*omap3_rom_rng_call)(u32, u32, u32);
+
+static struct timer_list idle_timer;
+static int rng_idle;
+static struct clk *rng_clk;
+
+static void omap3_rom_rng_idle(unsigned long data)
+{
+	int r;
+
+	r = omap3_rom_rng_call(0, 0, RNG_RESET);
+	if (r != 0) {
+		printk(KERN_ERR "%s: reset failed: %d\n",
+		       omap3_rom_rng_name, r);
+		return;
+	}
+	clk_disable_unprepare(rng_clk);
+	rng_idle = 1;
+}
+
+static int omap3_rom_rng_get_random(void *buf, unsigned int count)
+{
+	u32 r;
+	u32 ptr;
+
+	del_timer_sync(&idle_timer);
+	if (rng_idle) {
+		clk_prepare_enable(rng_clk);
+		r = omap3_rom_rng_call(0, 0, RNG_GEN_PRNG_HW_INIT);
+		if (r != 0) {
+			clk_disable_unprepare(rng_clk);
+			printk(KERN_ERR "%s: HW init failed: %d\n",
+			       omap3_rom_rng_name, r);
+			return -EIO;
+		}
+		rng_idle = 0;
+	}
+
+	ptr = virt_to_phys(buf);
+	r = omap3_rom_rng_call(ptr, count, RNG_GEN_HW);
+	mod_timer(&idle_timer, jiffies + msecs_to_jiffies(500));
+	if (r != 0)
+		return -EINVAL;
+	return 0;
+}
+
+static int omap3_rom_rng_data_present(struct hwrng *rng, int wait)
+{
+	return 1;
+}
+
+static int omap3_rom_rng_data_read(struct hwrng *rng, u32 *data)
+{
+	int r;
+
+	r = omap3_rom_rng_get_random(data, 4);
+	if (r < 0)
+		return r;
+	return 4;
+}
+
+static struct hwrng omap3_rom_rng_ops = {
+	.name		= "omap3-rom",
+	.data_present	= omap3_rom_rng_data_present,
+	.data_read	= omap3_rom_rng_data_read,
+};
+
+static int omap3_rom_rng_probe(struct platform_device *pdev)
+{
+	printk(KERN_INFO "%s: initializing\n", omap3_rom_rng_name);
+
+	omap3_rom_rng_call = pdev->dev.platform_data;
+	if (!omap3_rom_rng_call) {
+		printk(KERN_ERR "%s: omap3_rom_rng_call is NULL\n",
+		       omap3_rom_rng_name);
+		return -EINVAL;
+	}
+
+	setup_timer(&idle_timer, omap3_rom_rng_idle, 0);
+	rng_clk = clk_get(&pdev->dev, "ick");
+	if (IS_ERR(rng_clk)) {
+		printk(KERN_ERR "%s: unable to get RNG clock\n",
+		       omap3_rom_rng_name);
+		return IS_ERR(rng_clk);
+	}
+
+	/* Leave the RNG in reset state. */
+	clk_prepare_enable(rng_clk);
+	omap3_rom_rng_idle(0);
+
+	return hwrng_register(&omap3_rom_rng_ops);
+}
+
+static int omap3_rom_rng_remove(struct platform_device *pdev)
+{
+	hwrng_unregister(&omap3_rom_rng_ops);
+	clk_disable_unprepare(rng_clk);
+	clk_put(rng_clk);
+	return 0;
+}
+
+static struct platform_driver omap3_rom_rng_driver = {
+	.driver = {
+		.name		= "omap3-rom-rng",
+		.owner		= THIS_MODULE,
+	},
+	.probe		= omap3_rom_rng_probe,
+	.remove		= omap3_rom_rng_remove,
+};
+
+module_platform_driver(omap3_rom_rng_driver);
+
+MODULE_ALIAS("platform:omap3-rom-rng");
+MODULE_AUTHOR("Juha Yrjola");
+MODULE_AUTHOR("Pali Rohár <pali.rohar@gmail.com>");
+MODULE_LICENSE("GPL");
-- 
1.7.10.4


^ permalink raw reply related	[flat|nested] 33+ messages in thread

* [PATCH 2/2] RX-51: Add support for OMAP3 ROM Random Number Generator
  2013-09-18 20:05         ` [PATCH 0/2] " Pali Rohár
  2013-09-18 20:05           ` [PATCH 1/2] hwrng: " Pali Rohár
@ 2013-09-18 20:05           ` Pali Rohár
  2013-09-18 20:39             ` Tony Lindgren
  2013-09-20 13:25           ` [PATCH v2 0/3] OMAP3 ROM Random Number Generator support Pali Rohár
  2 siblings, 1 reply; 33+ messages in thread
From: Pali Rohár @ 2013-09-18 20:05 UTC (permalink / raw)
  To: Matt Mackall, Herbert Xu, Tony Lindgren, Russell King
  Cc: linux-omap, linux-kernel, Pali Rohár

Signed-off-by: Pali Rohár <pali.rohar@gmail.com>
---
 arch/arm/mach-omap2/board-rx51.c  |   10 ++++++++++
 arch/arm/mach-omap2/omap-secure.c |   11 +++++++++++
 arch/arm/mach-omap2/omap-secure.h |    1 +
 3 files changed, 22 insertions(+)

diff --git a/arch/arm/mach-omap2/board-rx51.c b/arch/arm/mach-omap2/board-rx51.c
index db168c9..c2a3e39 100644
--- a/arch/arm/mach-omap2/board-rx51.c
+++ b/arch/arm/mach-omap2/board-rx51.c
@@ -93,6 +93,14 @@ static struct omap_musb_board_data musb_board_data = {
 	.power			= 0,
 };
 
+static struct platform_device omap3_rom_rng_device = {
+	.name		= "omap_rng",
+	.id		= -1,
+	.dev	= {
+		.platform_data	= rx51_secure_rng_call,
+	},
+};
+
 static void __init rx51_init(void)
 {
 	struct omap_sdrc_params *sdrc_params;
@@ -113,6 +121,8 @@ static void __init rx51_init(void)
 		/* set IBE to 1 */
 		rx51_secure_update_aux_cr(BIT(6), 0);
 #endif
+		pr_info("RX-51: Registring OMAP3 HWRNG device\n");
+		platform_device_register(&omap3_rom_rng_device);
 	}
 
 	/* Ensure SDRC pins are mux'd for self-refresh */
diff --git a/arch/arm/mach-omap2/omap-secure.c b/arch/arm/mach-omap2/omap-secure.c
index 146a7c4..5ac122e 100644
--- a/arch/arm/mach-omap2/omap-secure.c
+++ b/arch/arm/mach-omap2/omap-secure.c
@@ -135,3 +135,14 @@ u32 rx51_secure_update_aux_cr(u32 set_bits, u32 clear_bits)
 				      FLAG_START_CRITICAL,
 				      1, acr, 0, 0, 0);
 }
+
+/**
+ * rx51_secure_rng_call: Routine for HW random generator
+ */
+u32 rx51_secure_rng_call(u32 ptr, u32 count, u32 flag)
+{
+	return rx51_secure_dispatcher(RX51_PPA_HWRNG,
+				      0,
+				      NO_FLAG,
+				      3, ptr, count, flag, 0);
+}
diff --git a/arch/arm/mach-omap2/omap-secure.h b/arch/arm/mach-omap2/omap-secure.h
index 51b59c6..f6cabb0 100644
--- a/arch/arm/mach-omap2/omap-secure.h
+++ b/arch/arm/mach-omap2/omap-secure.h
@@ -65,6 +65,7 @@ extern int omap_secure_ram_reserve_memblock(void);
 extern u32 rx51_secure_dispatcher(u32 idx, u32 process, u32 flag, u32 nargs,
 				  u32 arg1, u32 arg2, u32 arg3, u32 arg4);
 extern u32 rx51_secure_update_aux_cr(u32 set_bits, u32 clear_bits);
+extern u32 rx51_secure_rng_call(u32 ptr, u32 count, u32 flag);
 
 #ifdef CONFIG_OMAP4_ERRATA_I688
 extern int omap_barrier_reserve_memblock(void);
-- 
1.7.10.4


^ permalink raw reply related	[flat|nested] 33+ messages in thread

* Re: [PATCH 1/2] hwrng: OMAP3 ROM Random Number Generator support
  2013-09-18 20:05           ` [PATCH 1/2] hwrng: " Pali Rohár
@ 2013-09-18 20:22             ` Joe Perches
  2013-09-18 20:50             ` Aaro Koskinen
  1 sibling, 0 replies; 33+ messages in thread
From: Joe Perches @ 2013-09-18 20:22 UTC (permalink / raw)
  To: Pali Rohár
  Cc: Matt Mackall, Herbert Xu, Tony Lindgren, Russell King,
	linux-omap, linux-kernel, Juha Yrjola

On Wed, 2013-09-18 at 22:05 +0200, Pali Rohár wrote:
> This driver provides kernel-side support for the Random Number
> Generator hardware found on OMAP34xx processors.

[]

> diff --git a/drivers/char/hw_random/omap3-rom-rng.c b/drivers/char/hw_random/omap3-rom-rng.c

trivial note:

It produces smaller overall code to add
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
before any #include and use

> +static void omap3_rom_rng_idle(unsigned long data)
> +{
> +	int r;
> +
> +	r = omap3_rom_rng_call(0, 0, RNG_RESET);
> +	if (r != 0) {
> +		printk(KERN_ERR "%s: reset failed: %d\n",
> +		       omap3_rom_rng_name, r);

		pr_err("reset failed: %d\n", r);

> +static int omap3_rom_rng_get_random(void *buf, unsigned int count)
> +{
[]
> +		if (r != 0) {
> +			clk_disable_unprepare(rng_clk);
> +			printk(KERN_ERR "%s: HW init failed: %d\n",
> +			       omap3_rom_rng_name, r);

			pr_err("HW init failed: %d\n", r);

etc...



^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: [PATCH 2/2] RX-51: Add support for OMAP3 ROM Random Number Generator
  2013-09-18 20:05           ` [PATCH 2/2] RX-51: Add support for OMAP3 ROM Random Number Generator Pali Rohár
@ 2013-09-18 20:39             ` Tony Lindgren
  0 siblings, 0 replies; 33+ messages in thread
From: Tony Lindgren @ 2013-09-18 20:39 UTC (permalink / raw)
  To: Pali Rohár
  Cc: Matt Mackall, Herbert Xu, Russell King, linux-omap, linux-kernel

* Pali Rohár <pali.rohar@gmail.com> [130918 13:15]:
> Signed-off-by: Pali Rohár <pali.rohar@gmail.com>

Description please, then also add a note that this makes
sense to do as a platform device at least until we have
some ARM generic way to deal with SMC calls.

>  arch/arm/mach-omap2/board-rx51.c  |   10 ++++++++++
>  arch/arm/mach-omap2/omap-secure.c |   11 +++++++++++
>  arch/arm/mach-omap2/omap-secure.h |    1 +
>  3 files changed, 22 insertions(+)
> 
> diff --git a/arch/arm/mach-omap2/board-rx51.c b/arch/arm/mach-omap2/board-rx51.c
> index db168c9..c2a3e39 100644
> --- a/arch/arm/mach-omap2/board-rx51.c
> +++ b/arch/arm/mach-omap2/board-rx51.c
> @@ -93,6 +93,14 @@ static struct omap_musb_board_data musb_board_data = {
>  	.power			= 0,
>  };
>  
> +static struct platform_device omap3_rom_rng_device = {
> +	.name		= "omap_rng",
> +	.id		= -1,
> +	.dev	= {
> +		.platform_data	= rx51_secure_rng_call,
> +	},
> +};
> +
>  static void __init rx51_init(void)
>  {
>  	struct omap_sdrc_params *sdrc_params;
> @@ -113,6 +121,8 @@ static void __init rx51_init(void)
>  		/* set IBE to 1 */
>  		rx51_secure_update_aux_cr(BIT(6), 0);
>  #endif
> +		pr_info("RX-51: Registring OMAP3 HWRNG device\n");
> +		platform_device_register(&omap3_rom_rng_device);
>  	}
>  
>  	/* Ensure SDRC pins are mux'd for self-refresh */

Maybe this should be in board-rx51-peripherals.c instead?

That way we can initialize the legacy platform devices
from there for DT based booting too and don't have to
move code around when moving to DT based booting.

Regards,

Tony

^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: [PATCH 1/2] hwrng: OMAP3 ROM Random Number Generator support
  2013-09-18 20:05           ` [PATCH 1/2] hwrng: " Pali Rohár
  2013-09-18 20:22             ` Joe Perches
@ 2013-09-18 20:50             ` Aaro Koskinen
  1 sibling, 0 replies; 33+ messages in thread
From: Aaro Koskinen @ 2013-09-18 20:50 UTC (permalink / raw)
  To: Pali Rohár
  Cc: Matt Mackall, Herbert Xu, Tony Lindgren, Russell King,
	linux-omap, linux-kernel, Juha Yrjola

Hi,

On Wed, Sep 18, 2013 at 10:05:56PM +0200, Pali Rohár wrote:
> +	if (IS_ERR(rng_clk)) {
> +		printk(KERN_ERR "%s: unable to get RNG clock\n",
> +		       omap3_rom_rng_name);
> +		return IS_ERR(rng_clk);

This should be PTR_ERR().

A.

^ permalink raw reply	[flat|nested] 33+ messages in thread

* [PATCH v2 0/3] OMAP3 ROM Random Number Generator support
  2013-09-18 20:05         ` [PATCH 0/2] " Pali Rohár
  2013-09-18 20:05           ` [PATCH 1/2] hwrng: " Pali Rohár
  2013-09-18 20:05           ` [PATCH 2/2] RX-51: Add support for OMAP3 ROM Random Number Generator Pali Rohár
@ 2013-09-20 13:25           ` Pali Rohár
  2013-09-20 13:25             ` [PATCH v2 1/3] omap2: Change clk dev id for rng to omap3-rom-rng Pali Rohár
                               ` (2 more replies)
  2 siblings, 3 replies; 33+ messages in thread
From: Pali Rohár @ 2013-09-20 13:25 UTC (permalink / raw)
  To: Matt Mackall, Herbert Xu, Tony Lindgren, Russell King,
	Joe Perches, Aaro Koskinen
  Cc: linux-omap, linux-kernel, Pali Rohár

This patch series adding support for OMAP3 ROM Random Number Generator on Nokia N900.
In previous version I forgot to send patch which changing clk dev id to new driver name.

Pali Rohár (3):
  omap2: Change clk dev id for rng to omap3-rom-rng
  hwrng: OMAP3 ROM Random Number Generator support
  RX-51: Add support for OMAP3 ROM Random Number Generator

 arch/arm/mach-omap2/board-rx51-peripherals.c |   19 ++++
 arch/arm/mach-omap2/cclock3xxx_data.c        |    2 +-
 arch/arm/mach-omap2/omap-secure.c            |   11 ++
 arch/arm/mach-omap2/omap-secure.h            |    1 +
 drivers/char/hw_random/Kconfig               |   13 +++
 drivers/char/hw_random/Makefile              |    1 +
 drivers/char/hw_random/omap3-rom-rng.c       |  141 ++++++++++++++++++++++++++
 7 files changed, 187 insertions(+), 1 deletion(-)
 create mode 100644 drivers/char/hw_random/omap3-rom-rng.c

-- 
1.7.10.4


^ permalink raw reply	[flat|nested] 33+ messages in thread

* [PATCH v2 1/3] omap2: Change clk dev id for rng to omap3-rom-rng
  2013-09-20 13:25           ` [PATCH v2 0/3] OMAP3 ROM Random Number Generator support Pali Rohár
@ 2013-09-20 13:25             ` Pali Rohár
  2013-09-20 16:23               ` Tony Lindgren
  2013-09-20 13:25             ` [PATCH v2 2/3] hwrng: OMAP3 ROM Random Number Generator support Pali Rohár
  2013-09-20 13:25             ` [PATCH v2 3/3] RX-51: Add support for OMAP3 ROM Random Number Generator Pali Rohár
  2 siblings, 1 reply; 33+ messages in thread
From: Pali Rohár @ 2013-09-20 13:25 UTC (permalink / raw)
  To: Matt Mackall, Herbert Xu, Tony Lindgren, Russell King,
	Joe Perches, Aaro Koskinen
  Cc: linux-omap, linux-kernel, Pali Rohár

Name omap_rng is already used by omap_rng driver which is for omap2 and omap4.
For omap3 HS devices there is new driver omap3-rom-rng which needs that clk.
And because there cannot be two drivers with same name, rename omap3 clk dev id.

Signed-off-by: Pali Rohár <pali.rohar@gmail.com>
---
 arch/arm/mach-omap2/cclock3xxx_data.c |    2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/arch/arm/mach-omap2/cclock3xxx_data.c b/arch/arm/mach-omap2/cclock3xxx_data.c
index 334b767..5059338 100644
--- a/arch/arm/mach-omap2/cclock3xxx_data.c
+++ b/arch/arm/mach-omap2/cclock3xxx_data.c
@@ -3274,7 +3274,7 @@ static struct omap_clk omap36xx_clks[] = {
  */
 static struct omap_clk omap34xx_omap36xx_clks[] = {
 	CLK(NULL,	"aes1_ick",	&aes1_ick),
-	CLK("omap_rng",	"ick",		&rng_ick),
+	CLK("omap3-rom-rng",	"ick",		&rng_ick),
 	CLK(NULL,	"sha11_ick",	&sha11_ick),
 	CLK(NULL,	"des1_ick",	&des1_ick),
 	CLK(NULL,	"cam_mclk",	&cam_mclk),
-- 
1.7.10.4


^ permalink raw reply related	[flat|nested] 33+ messages in thread

* [PATCH v2 2/3] hwrng: OMAP3 ROM Random Number Generator support
  2013-09-20 13:25           ` [PATCH v2 0/3] OMAP3 ROM Random Number Generator support Pali Rohár
  2013-09-20 13:25             ` [PATCH v2 1/3] omap2: Change clk dev id for rng to omap3-rom-rng Pali Rohár
@ 2013-09-20 13:25             ` Pali Rohár
  2013-10-08 19:04               ` Tony Lindgren
  2013-09-20 13:25             ` [PATCH v2 3/3] RX-51: Add support for OMAP3 ROM Random Number Generator Pali Rohár
  2 siblings, 1 reply; 33+ messages in thread
From: Pali Rohár @ 2013-09-20 13:25 UTC (permalink / raw)
  To: Matt Mackall, Herbert Xu, Tony Lindgren, Russell King,
	Joe Perches, Aaro Koskinen
  Cc: linux-omap, linux-kernel, Pali Rohár, Juha Yrjola

This driver provides kernel-side support for the Random Number
Generator hardware found on OMAP34xx processors.

This driver comes from Maemo 2.6.28 kernel and was tested on Nokia RX-51.
It is platform device because it needs board specific function for smc calls.

Signed-off-by: Pali Rohár <pali.rohar@gmail.com>
Signed-off-by: Juha Yrjola <juha.yrjola@solidboot.com>
---
 drivers/char/hw_random/Kconfig         |   13 +++
 drivers/char/hw_random/Makefile        |    1 +
 drivers/char/hw_random/omap3-rom-rng.c |  141 ++++++++++++++++++++++++++++++++
 3 files changed, 155 insertions(+)
 create mode 100644 drivers/char/hw_random/omap3-rom-rng.c

diff --git a/drivers/char/hw_random/Kconfig b/drivers/char/hw_random/Kconfig
index 0aa9d91..0a331c3 100644
--- a/drivers/char/hw_random/Kconfig
+++ b/drivers/char/hw_random/Kconfig
@@ -165,6 +165,19 @@ config HW_RANDOM_OMAP
 
  	  If unsure, say Y.
 
+config HW_RANDOM_OMAP3_ROM
+	tristate "OMAP3 ROM Random Number Generator support"
+	depends on HW_RANDOM && ARCH_OMAP3
+	default HW_RANDOM
+	---help---
+	  This driver provides kernel-side support for the Random Number
+	  Generator hardware found on OMAP34xx processors.
+
+	  To compile this driver as a module, choose M here: the
+	  module will be called omap3-rom-rng.
+
+	  If unsure, say Y.
+
 config HW_RANDOM_OCTEON
 	tristate "Octeon Random Number Generator support"
 	depends on HW_RANDOM && CAVIUM_OCTEON_SOC
diff --git a/drivers/char/hw_random/Makefile b/drivers/char/hw_random/Makefile
index bed467c..7c8aa80 100644
--- a/drivers/char/hw_random/Makefile
+++ b/drivers/char/hw_random/Makefile
@@ -15,6 +15,7 @@ n2-rng-y := n2-drv.o n2-asm.o
 obj-$(CONFIG_HW_RANDOM_VIA) += via-rng.o
 obj-$(CONFIG_HW_RANDOM_IXP4XX) += ixp4xx-rng.o
 obj-$(CONFIG_HW_RANDOM_OMAP) += omap-rng.o
+obj-$(CONFIG_HW_RANDOM_OMAP3_ROM) += omap3-rom-rng.o
 obj-$(CONFIG_HW_RANDOM_PASEMI) += pasemi-rng.o
 obj-$(CONFIG_HW_RANDOM_VIRTIO) += virtio-rng.o
 obj-$(CONFIG_HW_RANDOM_TX4939) += tx4939-rng.o
diff --git a/drivers/char/hw_random/omap3-rom-rng.c b/drivers/char/hw_random/omap3-rom-rng.c
new file mode 100644
index 0000000..c853e9e
--- /dev/null
+++ b/drivers/char/hw_random/omap3-rom-rng.c
@@ -0,0 +1,141 @@
+/*
+ * omap3-rom-rng.c - RNG driver for TI OMAP3 CPU family
+ *
+ * Copyright (C) 2009 Nokia Corporation
+ * Author: Juha Yrjola <juha.yrjola@solidboot.com>
+ *
+ * Copyright (C) 2013 Pali Rohár <pali.rohar@gmail.com>
+ *
+ * This file is licensed under  the terms of the GNU General Public
+ * License version 2. This program is licensed "as is" without any
+ * warranty of any kind, whether express or implied.
+ */
+
+#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
+
+#include <linux/module.h>
+#include <linux/init.h>
+#include <linux/random.h>
+#include <linux/hw_random.h>
+#include <linux/timer.h>
+#include <linux/clk.h>
+#include <linux/err.h>
+#include <linux/platform_device.h>
+
+#define RNG_RESET			0x01
+#define RNG_GEN_PRNG_HW_INIT		0x02
+#define RNG_GEN_HW			0x08
+
+/* param1: ptr, param2: count, param3: flag */
+static u32 (*omap3_rom_rng_call)(u32, u32, u32);
+
+static struct timer_list idle_timer;
+static int rng_idle;
+static struct clk *rng_clk;
+
+static void omap3_rom_rng_idle(unsigned long data)
+{
+	int r;
+
+	r = omap3_rom_rng_call(0, 0, RNG_RESET);
+	if (r != 0) {
+		pr_err("reset failed: %d\n", r);
+		return;
+	}
+	clk_disable_unprepare(rng_clk);
+	rng_idle = 1;
+}
+
+static int omap3_rom_rng_get_random(void *buf, unsigned int count)
+{
+	u32 r;
+	u32 ptr;
+
+	del_timer_sync(&idle_timer);
+	if (rng_idle) {
+		clk_prepare_enable(rng_clk);
+		r = omap3_rom_rng_call(0, 0, RNG_GEN_PRNG_HW_INIT);
+		if (r != 0) {
+			clk_disable_unprepare(rng_clk);
+			pr_err("HW init failed: %d\n", r);
+			return -EIO;
+		}
+		rng_idle = 0;
+	}
+
+	ptr = virt_to_phys(buf);
+	r = omap3_rom_rng_call(ptr, count, RNG_GEN_HW);
+	mod_timer(&idle_timer, jiffies + msecs_to_jiffies(500));
+	if (r != 0)
+		return -EINVAL;
+	return 0;
+}
+
+static int omap3_rom_rng_data_present(struct hwrng *rng, int wait)
+{
+	return 1;
+}
+
+static int omap3_rom_rng_data_read(struct hwrng *rng, u32 *data)
+{
+	int r;
+
+	r = omap3_rom_rng_get_random(data, 4);
+	if (r < 0)
+		return r;
+	return 4;
+}
+
+static struct hwrng omap3_rom_rng_ops = {
+	.name		= "omap3-rom",
+	.data_present	= omap3_rom_rng_data_present,
+	.data_read	= omap3_rom_rng_data_read,
+};
+
+static int omap3_rom_rng_probe(struct platform_device *pdev)
+{
+	pr_info("initializing\n");
+
+	omap3_rom_rng_call = pdev->dev.platform_data;
+	if (!omap3_rom_rng_call) {
+		pr_err("omap3_rom_rng_call is NULL\n");
+		return -EINVAL;
+	}
+
+	setup_timer(&idle_timer, omap3_rom_rng_idle, 0);
+	rng_clk = clk_get(&pdev->dev, "ick");
+	if (IS_ERR(rng_clk)) {
+		pr_err("unable to get RNG clock\n");
+		return PTR_ERR(rng_clk);
+	}
+
+	/* Leave the RNG in reset state. */
+	clk_prepare_enable(rng_clk);
+	omap3_rom_rng_idle(0);
+
+	return hwrng_register(&omap3_rom_rng_ops);
+}
+
+static int omap3_rom_rng_remove(struct platform_device *pdev)
+{
+	hwrng_unregister(&omap3_rom_rng_ops);
+	clk_disable_unprepare(rng_clk);
+	clk_put(rng_clk);
+	return 0;
+}
+
+static struct platform_driver omap3_rom_rng_driver = {
+	.driver = {
+		.name		= "omap3-rom-rng",
+		.owner		= THIS_MODULE,
+	},
+	.probe		= omap3_rom_rng_probe,
+	.remove		= omap3_rom_rng_remove,
+};
+
+module_platform_driver(omap3_rom_rng_driver);
+
+MODULE_ALIAS("platform:omap3-rom-rng");
+MODULE_AUTHOR("Juha Yrjola");
+MODULE_AUTHOR("Pali Rohár <pali.rohar@gmail.com>");
+MODULE_LICENSE("GPL");
-- 
1.7.10.4


^ permalink raw reply related	[flat|nested] 33+ messages in thread

* [PATCH v2 3/3] RX-51: Add support for OMAP3 ROM Random Number Generator
  2013-09-20 13:25           ` [PATCH v2 0/3] OMAP3 ROM Random Number Generator support Pali Rohár
  2013-09-20 13:25             ` [PATCH v2 1/3] omap2: Change clk dev id for rng to omap3-rom-rng Pali Rohár
  2013-09-20 13:25             ` [PATCH v2 2/3] hwrng: OMAP3 ROM Random Number Generator support Pali Rohár
@ 2013-09-20 13:25             ` Pali Rohár
  2013-10-08 19:06               ` Tony Lindgren
  2 siblings, 1 reply; 33+ messages in thread
From: Pali Rohár @ 2013-09-20 13:25 UTC (permalink / raw)
  To: Matt Mackall, Herbert Xu, Tony Lindgren, Russell King,
	Joe Perches, Aaro Koskinen
  Cc: linux-omap, linux-kernel, Pali Rohár

Adding this driver as platform device and only for RX-51 until somebody test if
it working also on other OMAP3 HS devices and until there will be generic ARM
way to deal with SMC calls.

Signed-off-by: Pali Rohár <pali.rohar@gmail.com>
---
 arch/arm/mach-omap2/board-rx51-peripherals.c |   19 +++++++++++++++++++
 arch/arm/mach-omap2/omap-secure.c            |   11 +++++++++++
 arch/arm/mach-omap2/omap-secure.h            |    1 +
 3 files changed, 31 insertions(+)

diff --git a/arch/arm/mach-omap2/board-rx51-peripherals.c b/arch/arm/mach-omap2/board-rx51-peripherals.c
index c3270c0..497d260 100644
--- a/arch/arm/mach-omap2/board-rx51-peripherals.c
+++ b/arch/arm/mach-omap2/board-rx51-peripherals.c
@@ -57,6 +57,8 @@
 #include "common-board-devices.h"
 #include "gpmc.h"
 #include "gpmc-onenand.h"
+#include "soc.h"
+#include "omap-secure.h"
 
 #define SYSTEM_REV_B_USES_VAUX3	0x1699
 #define SYSTEM_REV_S_USES_VAUX3 0x8
@@ -1289,6 +1291,22 @@ static void __init rx51_init_twl4030_hwmon(void)
 	platform_device_register(&madc_hwmon);
 }
 
+static struct platform_device omap3_rom_rng_device = {
+	.name		= "omap3-rom-rng",
+	.id		= -1,
+	.dev	= {
+		.platform_data	= rx51_secure_rng_call,
+	},
+};
+
+static void __init rx51_init_omap3_rom_rng(void)
+{
+	if (omap_type() == OMAP2_DEVICE_TYPE_SEC) {
+		pr_info("RX-51: Registring OMAP3 HWRNG device\n");
+		platform_device_register(&omap3_rom_rng_device);
+	}
+}
+
 void __init rx51_peripherals_init(void)
 {
 	rx51_i2c_init();
@@ -1309,5 +1327,6 @@ void __init rx51_peripherals_init(void)
 
 	rx51_charger_init();
 	rx51_init_twl4030_hwmon();
+	rx51_init_omap3_rom_rng();
 }
 
diff --git a/arch/arm/mach-omap2/omap-secure.c b/arch/arm/mach-omap2/omap-secure.c
index 146a7c4..5ac122e 100644
--- a/arch/arm/mach-omap2/omap-secure.c
+++ b/arch/arm/mach-omap2/omap-secure.c
@@ -135,3 +135,14 @@ u32 rx51_secure_update_aux_cr(u32 set_bits, u32 clear_bits)
 				      FLAG_START_CRITICAL,
 				      1, acr, 0, 0, 0);
 }
+
+/**
+ * rx51_secure_rng_call: Routine for HW random generator
+ */
+u32 rx51_secure_rng_call(u32 ptr, u32 count, u32 flag)
+{
+	return rx51_secure_dispatcher(RX51_PPA_HWRNG,
+				      0,
+				      NO_FLAG,
+				      3, ptr, count, flag, 0);
+}
diff --git a/arch/arm/mach-omap2/omap-secure.h b/arch/arm/mach-omap2/omap-secure.h
index 51b59c6..f6cabb0 100644
--- a/arch/arm/mach-omap2/omap-secure.h
+++ b/arch/arm/mach-omap2/omap-secure.h
@@ -65,6 +65,7 @@ extern int omap_secure_ram_reserve_memblock(void);
 extern u32 rx51_secure_dispatcher(u32 idx, u32 process, u32 flag, u32 nargs,
 				  u32 arg1, u32 arg2, u32 arg3, u32 arg4);
 extern u32 rx51_secure_update_aux_cr(u32 set_bits, u32 clear_bits);
+extern u32 rx51_secure_rng_call(u32 ptr, u32 count, u32 flag);
 
 #ifdef CONFIG_OMAP4_ERRATA_I688
 extern int omap_barrier_reserve_memblock(void);
-- 
1.7.10.4


^ permalink raw reply related	[flat|nested] 33+ messages in thread

* Re: [PATCH v2 1/3] omap2: Change clk dev id for rng to omap3-rom-rng
  2013-09-20 13:25             ` [PATCH v2 1/3] omap2: Change clk dev id for rng to omap3-rom-rng Pali Rohár
@ 2013-09-20 16:23               ` Tony Lindgren
  2013-09-20 16:41                 ` Pali Rohár
  0 siblings, 1 reply; 33+ messages in thread
From: Tony Lindgren @ 2013-09-20 16:23 UTC (permalink / raw)
  To: Pali Rohár
  Cc: Matt Mackall, Herbert Xu, Russell King, Joe Perches,
	Aaro Koskinen, linux-omap, linux-kernel

* Pali Rohár <pali.rohar@gmail.com> [130920 06:33]:
> Name omap_rng is already used by omap_rng driver which is for omap2 and omap4.
> For omap3 HS devices there is new driver omap3-rom-rng which needs that clk.
> And because there cannot be two drivers with same name, rename omap3 clk dev id.
> 
> Signed-off-by: Pali Rohár <pali.rohar@gmail.com>
> ---
>  arch/arm/mach-omap2/cclock3xxx_data.c |    2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/arch/arm/mach-omap2/cclock3xxx_data.c b/arch/arm/mach-omap2/cclock3xxx_data.c
> index 334b767..5059338 100644
> --- a/arch/arm/mach-omap2/cclock3xxx_data.c
> +++ b/arch/arm/mach-omap2/cclock3xxx_data.c
> @@ -3274,7 +3274,7 @@ static struct omap_clk omap36xx_clks[] = {
>   */
>  static struct omap_clk omap34xx_omap36xx_clks[] = {
>  	CLK(NULL,	"aes1_ick",	&aes1_ick),
> -	CLK("omap_rng",	"ick",		&rng_ick),
> +	CLK("omap3-rom-rng",	"ick",		&rng_ick),
>  	CLK(NULL,	"sha11_ick",	&sha11_ick),
>  	CLK(NULL,	"des1_ick",	&des1_ick),
>  	CLK(NULL,	"cam_mclk",	&cam_mclk),

Hmm are you sure the omap_rng is not available on
any of the omap3 GP versions? If so, the omap_rng
alias should be kept as well.

Regards,

Tony

^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: [PATCH v2 1/3] omap2: Change clk dev id for rng to omap3-rom-rng
  2013-09-20 16:23               ` Tony Lindgren
@ 2013-09-20 16:41                 ` Pali Rohár
  2013-09-20 17:46                   ` Tony Lindgren
  0 siblings, 1 reply; 33+ messages in thread
From: Pali Rohár @ 2013-09-20 16:41 UTC (permalink / raw)
  To: Tony Lindgren
  Cc: Matt Mackall, Herbert Xu, Russell King, Joe Perches,
	Aaro Koskinen, linux-omap, linux-kernel

[-- Attachment #1: Type: Text/Plain, Size: 2079 bytes --]

On Friday 20 September 2013 18:23:43 Tony Lindgren wrote:
> * Pali Rohár <pali.rohar@gmail.com> [130920 06:33]:
> > Name omap_rng is already used by omap_rng driver which is
> > for omap2 and omap4. For omap3 HS devices there is new
> > driver omap3-rom-rng which needs that clk. And because
> > there cannot be two drivers with same name, rename omap3
> > clk dev id.
> > 
> > Signed-off-by: Pali Rohár <pali.rohar@gmail.com>
> > ---
> > 
> >  arch/arm/mach-omap2/cclock3xxx_data.c |    2 +-
> >  1 file changed, 1 insertion(+), 1 deletion(-)
> > 
> > diff --git a/arch/arm/mach-omap2/cclock3xxx_data.c
> > b/arch/arm/mach-omap2/cclock3xxx_data.c index
> > 334b767..5059338 100644
> > --- a/arch/arm/mach-omap2/cclock3xxx_data.c
> > +++ b/arch/arm/mach-omap2/cclock3xxx_data.c
> > @@ -3274,7 +3274,7 @@ static struct omap_clk omap36xx_clks[]
> > = {
> > 
> >   */
> >  
> >  static struct omap_clk omap34xx_omap36xx_clks[] = {
> >  
> >  	CLK(NULL,	"aes1_ick",	&aes1_ick),
> > 
> > -	CLK("omap_rng",	"ick",		&rng_ick),
> > +	CLK("omap3-rom-rng",	"ick",		&rng_ick),
> > 
> >  	CLK(NULL,	"sha11_ick",	&sha11_ick),
> >  	CLK(NULL,	"des1_ick",	&des1_ick),
> >  	CLK(NULL,	"cam_mclk",	&cam_mclk),
> 
> Hmm are you sure the omap_rng is not available on
> any of the omap3 GP versions? If so, the omap_rng
> alias should be kept as well.
> 
> Regards,
> 
> Tony

I really do not know, but driver char/hw_random/omap-rng.c 
support only omap2 and omap4 platforms. So "omap_rng" dev id for 
omap3 is not used.

In email [1] you suggested to use clk_get instead clk_get_sys. If 
I understand correctly clk_get calling clk_get_sys with driver 
name. So dev in in CLK macro must be same as driver name. And 
because in cclock3xxx_data.c is dev id "omap_rng" and there is 
already driver with name "omap_rng", I need to rename dev in 
cclock3xxx_data.c to get new omap3-rom-rng driver working.

Or if you know better way how to do it, let me know.

[1] - https://lkml.org/lkml/2013/4/1/278

-- 
Pali Rohár
pali.rohar@gmail.com

[-- Attachment #2: This is a digitally signed message part. --]
[-- Type: application/pgp-signature, Size: 198 bytes --]

^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: [PATCH v2 1/3] omap2: Change clk dev id for rng to omap3-rom-rng
  2013-09-20 16:41                 ` Pali Rohár
@ 2013-09-20 17:46                   ` Tony Lindgren
  2013-09-20 18:24                     ` Pali Rohár
  0 siblings, 1 reply; 33+ messages in thread
From: Tony Lindgren @ 2013-09-20 17:46 UTC (permalink / raw)
  To: Pali Rohár
  Cc: Matt Mackall, Herbert Xu, Russell King, Joe Perches,
	Aaro Koskinen, linux-omap, linux-kernel

* Pali Rohár <pali.rohar@gmail.com> [130920 09:49]:
> On Friday 20 September 2013 18:23:43 Tony Lindgren wrote:
> > * Pali Rohár <pali.rohar@gmail.com> [130920 06:33]:
> > > Name omap_rng is already used by omap_rng driver which is
> > > for omap2 and omap4. For omap3 HS devices there is new
> > > driver omap3-rom-rng which needs that clk. And because
> > > there cannot be two drivers with same name, rename omap3
> > > clk dev id.
> > > 
> > > Signed-off-by: Pali Rohár <pali.rohar@gmail.com>
> > > ---
> > > 
> > >  arch/arm/mach-omap2/cclock3xxx_data.c |    2 +-
> > >  1 file changed, 1 insertion(+), 1 deletion(-)
> > > 
> > > diff --git a/arch/arm/mach-omap2/cclock3xxx_data.c
> > > b/arch/arm/mach-omap2/cclock3xxx_data.c index
> > > 334b767..5059338 100644
> > > --- a/arch/arm/mach-omap2/cclock3xxx_data.c
> > > +++ b/arch/arm/mach-omap2/cclock3xxx_data.c
> > > @@ -3274,7 +3274,7 @@ static struct omap_clk omap36xx_clks[]
> > > = {
> > > 
> > >   */
> > >  
> > >  static struct omap_clk omap34xx_omap36xx_clks[] = {
> > >  
> > >  	CLK(NULL,	"aes1_ick",	&aes1_ick),
> > > 
> > > -	CLK("omap_rng",	"ick",		&rng_ick),
> > > +	CLK("omap3-rom-rng",	"ick",		&rng_ick),
> > > 
> > >  	CLK(NULL,	"sha11_ick",	&sha11_ick),
> > >  	CLK(NULL,	"des1_ick",	&des1_ick),
> > >  	CLK(NULL,	"cam_mclk",	&cam_mclk),
> > 
> > Hmm are you sure the omap_rng is not available on
> > any of the omap3 GP versions? If so, the omap_rng
> > alias should be kept as well.
> > 
> > Regards,
> > 
> > Tony
> 
> I really do not know, but driver char/hw_random/omap-rng.c 
> support only omap2 and omap4 platforms. So "omap_rng" dev id for 
> omap3 is not used.
> 
> In email [1] you suggested to use clk_get instead clk_get_sys. If 
> I understand correctly clk_get calling clk_get_sys with driver 
> name. So dev in in CLK macro must be same as driver name. And 
> because in cclock3xxx_data.c is dev id "omap_rng" and there is 
> already driver with name "omap_rng", I need to rename dev in 
> cclock3xxx_data.c to get new omap3-rom-rng driver working.
> 
> Or if you know better way how to do it, let me know.

I think it's safest to keep the existing alias also, and
add a comment saying that it may not be available on omap3
processors.

Regards,

Tony
 
> [1] - https://lkml.org/lkml/2013/4/1/278
> 
> -- 
> Pali Rohár
> pali.rohar@gmail.com



^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: [PATCH v2 1/3] omap2: Change clk dev id for rng to omap3-rom-rng
  2013-09-20 17:46                   ` Tony Lindgren
@ 2013-09-20 18:24                     ` Pali Rohár
  2013-09-20 18:31                       ` Tony Lindgren
  0 siblings, 1 reply; 33+ messages in thread
From: Pali Rohár @ 2013-09-20 18:24 UTC (permalink / raw)
  To: Tony Lindgren
  Cc: Matt Mackall, Herbert Xu, Russell King, Joe Perches,
	Aaro Koskinen, linux-omap, linux-kernel

[-- Attachment #1: Type: Text/Plain, Size: 3302 bytes --]

On Friday 20 September 2013 19:46:41 Tony Lindgren wrote:
> * Pali Rohár <pali.rohar@gmail.com> [130920 09:49]:
> > On Friday 20 September 2013 18:23:43 Tony Lindgren wrote:
> > > * Pali Rohár <pali.rohar@gmail.com> [130920 06:33]:
> > > > Name omap_rng is already used by omap_rng driver which
> > > > is for omap2 and omap4. For omap3 HS devices there is
> > > > new driver omap3-rom-rng which needs that clk. And
> > > > because there cannot be two drivers with same name,
> > > > rename omap3 clk dev id.
> > > > 
> > > > Signed-off-by: Pali Rohár <pali.rohar@gmail.com>
> > > > ---
> > > > 
> > > >  arch/arm/mach-omap2/cclock3xxx_data.c |    2 +-
> > > >  1 file changed, 1 insertion(+), 1 deletion(-)
> > > > 
> > > > diff --git a/arch/arm/mach-omap2/cclock3xxx_data.c
> > > > b/arch/arm/mach-omap2/cclock3xxx_data.c index
> > > > 334b767..5059338 100644
> > > > --- a/arch/arm/mach-omap2/cclock3xxx_data.c
> > > > +++ b/arch/arm/mach-omap2/cclock3xxx_data.c
> > > > @@ -3274,7 +3274,7 @@ static struct omap_clk
> > > > omap36xx_clks[] = {
> > > > 
> > > >   */
> > > >  
> > > >  static struct omap_clk omap34xx_omap36xx_clks[] = {
> > > >  
> > > >  	CLK(NULL,	"aes1_ick",	&aes1_ick),
> > > > 
> > > > -	CLK("omap_rng",	"ick",		&rng_ick),
> > > > +	CLK("omap3-rom-rng",	"ick",		&rng_ick),
> > > > 
> > > >  	CLK(NULL,	"sha11_ick",	&sha11_ick),
> > > >  	CLK(NULL,	"des1_ick",	&des1_ick),
> > > >  	CLK(NULL,	"cam_mclk",	&cam_mclk),
> > > 
> > > Hmm are you sure the omap_rng is not available on
> > > any of the omap3 GP versions? If so, the omap_rng
> > > alias should be kept as well.
> > > 
> > > Regards,
> > > 
> > > Tony
> > 
> > I really do not know, but driver char/hw_random/omap-rng.c
> > support only omap2 and omap4 platforms. So "omap_rng" dev id
> > for omap3 is not used.
> > 
> > In email [1] you suggested to use clk_get instead
> > clk_get_sys. If I understand correctly clk_get calling
> > clk_get_sys with driver name. So dev in in CLK macro must
> > be same as driver name. And because in cclock3xxx_data.c is
> > dev id "omap_rng" and there is already driver with name
> > "omap_rng", I need to rename dev in cclock3xxx_data.c to
> > get new omap3-rom-rng driver working.
> > 
> > Or if you know better way how to do it, let me know.
> 
> I think it's safest to keep the existing alias also, and
> add a comment saying that it may not be available on omap3
> processors.
> 
> Regards,
> 
> Tony
> 
> > [1] - https://lkml.org/lkml/2013/4/1/278

Ok, then there is new patch which only adding omap3-rom-rng and not removing omap_rng.
It is OK to have same CLK data but with different names?

diff --git a/arch/arm/mach-omap2/cclock3xxx_data.c b/arch/arm/mach-omap2/cclock3xxx_data.c
index 334b767..03a2829 100644
--- a/arch/arm/mach-omap2/cclock3xxx_data.c
+++ b/arch/arm/mach-omap2/cclock3xxx_data.c
@@ -3275,6 +3275,7 @@ static struct omap_clk omap36xx_clks[] = {
 static struct omap_clk omap34xx_omap36xx_clks[] = {
 	CLK(NULL,	"aes1_ick",	&aes1_ick),
 	CLK("omap_rng",	"ick",		&rng_ick),
+	CLK("omap3-rom-rng",	"ick",	&rng_ick),
 	CLK(NULL,	"sha11_ick",	&sha11_ick),
 	CLK(NULL,	"des1_ick",	&des1_ick),
 	CLK(NULL,	"cam_mclk",	&cam_mclk),


-- 
Pali Rohár
pali.rohar@gmail.com

[-- Attachment #2: This is a digitally signed message part. --]
[-- Type: application/pgp-signature, Size: 198 bytes --]

^ permalink raw reply related	[flat|nested] 33+ messages in thread

* Re: [PATCH v2 1/3] omap2: Change clk dev id for rng to omap3-rom-rng
  2013-09-20 18:24                     ` Pali Rohár
@ 2013-09-20 18:31                       ` Tony Lindgren
  0 siblings, 0 replies; 33+ messages in thread
From: Tony Lindgren @ 2013-09-20 18:31 UTC (permalink / raw)
  To: Pali Rohár
  Cc: Matt Mackall, Herbert Xu, Russell King, Joe Perches,
	Aaro Koskinen, linux-omap, linux-kernel

* Pali Rohár <pali.rohar@gmail.com> [130920 11:32]:
> On Friday 20 September 2013 19:46:41 Tony Lindgren wrote:
> 
> Ok, then there is new patch which only adding omap3-rom-rng and not removing omap_rng.
> It is OK to have same CLK data but with different names?

Yes in this case it's always either omap_rng or omap3-rom-rng
so the patch below looks OK to me.

Regards,

Tony
 
> diff --git a/arch/arm/mach-omap2/cclock3xxx_data.c b/arch/arm/mach-omap2/cclock3xxx_data.c
> index 334b767..03a2829 100644
> --- a/arch/arm/mach-omap2/cclock3xxx_data.c
> +++ b/arch/arm/mach-omap2/cclock3xxx_data.c
> @@ -3275,6 +3275,7 @@ static struct omap_clk omap36xx_clks[] = {
>  static struct omap_clk omap34xx_omap36xx_clks[] = {
>  	CLK(NULL,	"aes1_ick",	&aes1_ick),
>  	CLK("omap_rng",	"ick",		&rng_ick),
> +	CLK("omap3-rom-rng",	"ick",	&rng_ick),
>  	CLK(NULL,	"sha11_ick",	&sha11_ick),
>  	CLK(NULL,	"des1_ick",	&des1_ick),
>  	CLK(NULL,	"cam_mclk",	&cam_mclk),
> 
> 
> -- 
> Pali Rohár
> pali.rohar@gmail.com



^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: [PATCH v2 2/3] hwrng: OMAP3 ROM Random Number Generator support
  2013-09-20 13:25             ` [PATCH v2 2/3] hwrng: OMAP3 ROM Random Number Generator support Pali Rohár
@ 2013-10-08 19:04               ` Tony Lindgren
  2013-10-16 12:57                 ` Herbert Xu
  0 siblings, 1 reply; 33+ messages in thread
From: Tony Lindgren @ 2013-10-08 19:04 UTC (permalink / raw)
  To: Pali Rohár
  Cc: Matt Mackall, Herbert Xu, Russell King, Joe Perches,
	Aaro Koskinen, linux-omap, linux-kernel, Juha Yrjola

* Pali Rohár <pali.rohar@gmail.com> [130920 06:33]:
> This driver provides kernel-side support for the Random Number
> Generator hardware found on OMAP34xx processors.
> 
> This driver comes from Maemo 2.6.28 kernel and was tested on Nokia RX-51.
> It is platform device because it needs board specific function for smc calls.

This one is should be merged via the hw_random patches seprately:

Acked-by: Tony Lindgren <tony@atomide.com>
 
> Signed-off-by: Pali Rohár <pali.rohar@gmail.com>
> Signed-off-by: Juha Yrjola <juha.yrjola@solidboot.com>
> ---
>  drivers/char/hw_random/Kconfig         |   13 +++
>  drivers/char/hw_random/Makefile        |    1 +
>  drivers/char/hw_random/omap3-rom-rng.c |  141 ++++++++++++++++++++++++++++++++
>  3 files changed, 155 insertions(+)
>  create mode 100644 drivers/char/hw_random/omap3-rom-rng.c
> 
> diff --git a/drivers/char/hw_random/Kconfig b/drivers/char/hw_random/Kconfig
> index 0aa9d91..0a331c3 100644
> --- a/drivers/char/hw_random/Kconfig
> +++ b/drivers/char/hw_random/Kconfig
> @@ -165,6 +165,19 @@ config HW_RANDOM_OMAP
>  
>   	  If unsure, say Y.
>  
> +config HW_RANDOM_OMAP3_ROM
> +	tristate "OMAP3 ROM Random Number Generator support"
> +	depends on HW_RANDOM && ARCH_OMAP3
> +	default HW_RANDOM
> +	---help---
> +	  This driver provides kernel-side support for the Random Number
> +	  Generator hardware found on OMAP34xx processors.
> +
> +	  To compile this driver as a module, choose M here: the
> +	  module will be called omap3-rom-rng.
> +
> +	  If unsure, say Y.
> +
>  config HW_RANDOM_OCTEON
>  	tristate "Octeon Random Number Generator support"
>  	depends on HW_RANDOM && CAVIUM_OCTEON_SOC
> diff --git a/drivers/char/hw_random/Makefile b/drivers/char/hw_random/Makefile
> index bed467c..7c8aa80 100644
> --- a/drivers/char/hw_random/Makefile
> +++ b/drivers/char/hw_random/Makefile
> @@ -15,6 +15,7 @@ n2-rng-y := n2-drv.o n2-asm.o
>  obj-$(CONFIG_HW_RANDOM_VIA) += via-rng.o
>  obj-$(CONFIG_HW_RANDOM_IXP4XX) += ixp4xx-rng.o
>  obj-$(CONFIG_HW_RANDOM_OMAP) += omap-rng.o
> +obj-$(CONFIG_HW_RANDOM_OMAP3_ROM) += omap3-rom-rng.o
>  obj-$(CONFIG_HW_RANDOM_PASEMI) += pasemi-rng.o
>  obj-$(CONFIG_HW_RANDOM_VIRTIO) += virtio-rng.o
>  obj-$(CONFIG_HW_RANDOM_TX4939) += tx4939-rng.o
> diff --git a/drivers/char/hw_random/omap3-rom-rng.c b/drivers/char/hw_random/omap3-rom-rng.c
> new file mode 100644
> index 0000000..c853e9e
> --- /dev/null
> +++ b/drivers/char/hw_random/omap3-rom-rng.c
> @@ -0,0 +1,141 @@
> +/*
> + * omap3-rom-rng.c - RNG driver for TI OMAP3 CPU family
> + *
> + * Copyright (C) 2009 Nokia Corporation
> + * Author: Juha Yrjola <juha.yrjola@solidboot.com>
> + *
> + * Copyright (C) 2013 Pali Rohár <pali.rohar@gmail.com>
> + *
> + * This file is licensed under  the terms of the GNU General Public
> + * License version 2. This program is licensed "as is" without any
> + * warranty of any kind, whether express or implied.
> + */
> +
> +#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
> +
> +#include <linux/module.h>
> +#include <linux/init.h>
> +#include <linux/random.h>
> +#include <linux/hw_random.h>
> +#include <linux/timer.h>
> +#include <linux/clk.h>
> +#include <linux/err.h>
> +#include <linux/platform_device.h>
> +
> +#define RNG_RESET			0x01
> +#define RNG_GEN_PRNG_HW_INIT		0x02
> +#define RNG_GEN_HW			0x08
> +
> +/* param1: ptr, param2: count, param3: flag */
> +static u32 (*omap3_rom_rng_call)(u32, u32, u32);
> +
> +static struct timer_list idle_timer;
> +static int rng_idle;
> +static struct clk *rng_clk;
> +
> +static void omap3_rom_rng_idle(unsigned long data)
> +{
> +	int r;
> +
> +	r = omap3_rom_rng_call(0, 0, RNG_RESET);
> +	if (r != 0) {
> +		pr_err("reset failed: %d\n", r);
> +		return;
> +	}
> +	clk_disable_unprepare(rng_clk);
> +	rng_idle = 1;
> +}
> +
> +static int omap3_rom_rng_get_random(void *buf, unsigned int count)
> +{
> +	u32 r;
> +	u32 ptr;
> +
> +	del_timer_sync(&idle_timer);
> +	if (rng_idle) {
> +		clk_prepare_enable(rng_clk);
> +		r = omap3_rom_rng_call(0, 0, RNG_GEN_PRNG_HW_INIT);
> +		if (r != 0) {
> +			clk_disable_unprepare(rng_clk);
> +			pr_err("HW init failed: %d\n", r);
> +			return -EIO;
> +		}
> +		rng_idle = 0;
> +	}
> +
> +	ptr = virt_to_phys(buf);
> +	r = omap3_rom_rng_call(ptr, count, RNG_GEN_HW);
> +	mod_timer(&idle_timer, jiffies + msecs_to_jiffies(500));
> +	if (r != 0)
> +		return -EINVAL;
> +	return 0;
> +}
> +
> +static int omap3_rom_rng_data_present(struct hwrng *rng, int wait)
> +{
> +	return 1;
> +}
> +
> +static int omap3_rom_rng_data_read(struct hwrng *rng, u32 *data)
> +{
> +	int r;
> +
> +	r = omap3_rom_rng_get_random(data, 4);
> +	if (r < 0)
> +		return r;
> +	return 4;
> +}
> +
> +static struct hwrng omap3_rom_rng_ops = {
> +	.name		= "omap3-rom",
> +	.data_present	= omap3_rom_rng_data_present,
> +	.data_read	= omap3_rom_rng_data_read,
> +};
> +
> +static int omap3_rom_rng_probe(struct platform_device *pdev)
> +{
> +	pr_info("initializing\n");
> +
> +	omap3_rom_rng_call = pdev->dev.platform_data;
> +	if (!omap3_rom_rng_call) {
> +		pr_err("omap3_rom_rng_call is NULL\n");
> +		return -EINVAL;
> +	}
> +
> +	setup_timer(&idle_timer, omap3_rom_rng_idle, 0);
> +	rng_clk = clk_get(&pdev->dev, "ick");
> +	if (IS_ERR(rng_clk)) {
> +		pr_err("unable to get RNG clock\n");
> +		return PTR_ERR(rng_clk);
> +	}
> +
> +	/* Leave the RNG in reset state. */
> +	clk_prepare_enable(rng_clk);
> +	omap3_rom_rng_idle(0);
> +
> +	return hwrng_register(&omap3_rom_rng_ops);
> +}
> +
> +static int omap3_rom_rng_remove(struct platform_device *pdev)
> +{
> +	hwrng_unregister(&omap3_rom_rng_ops);
> +	clk_disable_unprepare(rng_clk);
> +	clk_put(rng_clk);
> +	return 0;
> +}
> +
> +static struct platform_driver omap3_rom_rng_driver = {
> +	.driver = {
> +		.name		= "omap3-rom-rng",
> +		.owner		= THIS_MODULE,
> +	},
> +	.probe		= omap3_rom_rng_probe,
> +	.remove		= omap3_rom_rng_remove,
> +};
> +
> +module_platform_driver(omap3_rom_rng_driver);
> +
> +MODULE_ALIAS("platform:omap3-rom-rng");
> +MODULE_AUTHOR("Juha Yrjola");
> +MODULE_AUTHOR("Pali Rohár <pali.rohar@gmail.com>");
> +MODULE_LICENSE("GPL");
> -- 
> 1.7.10.4
> 

^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: [PATCH v2 3/3] RX-51: Add support for OMAP3 ROM Random Number Generator
  2013-09-20 13:25             ` [PATCH v2 3/3] RX-51: Add support for OMAP3 ROM Random Number Generator Pali Rohár
@ 2013-10-08 19:06               ` Tony Lindgren
  0 siblings, 0 replies; 33+ messages in thread
From: Tony Lindgren @ 2013-10-08 19:06 UTC (permalink / raw)
  To: Pali Rohár
  Cc: Matt Mackall, Herbert Xu, Russell King, Joe Perches,
	Aaro Koskinen, linux-omap, linux-kernel

* Pali Rohár <pali.rohar@gmail.com> [130920 06:33]:
> Adding this driver as platform device and only for RX-51 until somebody test if
> it working also on other OMAP3 HS devices and until there will be generic ARM
> way to deal with SMC calls.

Thanks I'll apply this with the patch #1 clock alias folded in into
omap-for-v3.13/n900 branch.

Regards,

Tony

^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: [PATCH v2 2/3] hwrng: OMAP3 ROM Random Number Generator support
  2013-10-08 19:04               ` Tony Lindgren
@ 2013-10-16 12:57                 ` Herbert Xu
  2013-11-18 21:51                   ` Pali Rohár
  0 siblings, 1 reply; 33+ messages in thread
From: Herbert Xu @ 2013-10-16 12:57 UTC (permalink / raw)
  To: Tony Lindgren
  Cc: Pali Rohár, Matt Mackall, Russell King, Joe Perches,
	Aaro Koskinen, linux-omap, linux-kernel, Juha Yrjola

On Tue, Oct 08, 2013 at 12:04:09PM -0700, Tony Lindgren wrote:
> * Pali Rohár <pali.rohar@gmail.com> [130920 06:33]:
> > This driver provides kernel-side support for the Random Number
> > Generator hardware found on OMAP34xx processors.
> > 
> > This driver comes from Maemo 2.6.28 kernel and was tested on Nokia RX-51.
> > It is platform device because it needs board specific function for smc calls.
> 
> This one is should be merged via the hw_random patches seprately:
> 
> Acked-by: Tony Lindgren <tony@atomide.com>

Patch applied.  Thanks!
-- 
Email: Herbert Xu <herbert@gondor.apana.org.au>
Home Page: http://gondor.apana.org.au/~herbert/
PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt

^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: [PATCH v2 2/3] hwrng: OMAP3 ROM Random Number Generator support
  2013-10-16 12:57                 ` Herbert Xu
@ 2013-11-18 21:51                   ` Pali Rohár
  2013-11-19  2:14                     ` Herbert Xu
  0 siblings, 1 reply; 33+ messages in thread
From: Pali Rohár @ 2013-11-18 21:51 UTC (permalink / raw)
  To: Herbert Xu
  Cc: Tony Lindgren, Matt Mackall, Russell King, Joe Perches,
	Aaro Koskinen, linux-omap, linux-kernel

On Wednesday 16 October 2013 14:57:34 Herbert Xu wrote:
> On Tue, Oct 08, 2013 at 12:04:09PM -0700, Tony Lindgren wrote:
> > * Pali Rohár <pali.rohar@gmail.com> [130920 06:33]:
> > > This driver provides kernel-side support for the Random
> > > Number Generator hardware found on OMAP34xx processors.
> > > 
> > > This driver comes from Maemo 2.6.28 kernel and was tested
> > > on Nokia RX-51. It is platform device because it needs
> > > board specific function for smc calls.
> > 
> > This one is should be merged via the hw_random patches
> > seprately:
> > 
> > Acked-by: Tony Lindgren <tony@atomide.com>
> 
> Patch applied.  Thanks!

Hello, I still do not see this patch (2/3) in linus tree. But 
patch 1/3 and 3/3 are already merged. So is there any problem?

-- 
Pali Rohár
pali.rohar@gmail.com

^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: [PATCH v2 2/3] hwrng: OMAP3 ROM Random Number Generator support
  2013-11-18 21:51                   ` Pali Rohár
@ 2013-11-19  2:14                     ` Herbert Xu
  2013-11-23  9:37                       ` Pali Rohár
  0 siblings, 1 reply; 33+ messages in thread
From: Herbert Xu @ 2013-11-19  2:14 UTC (permalink / raw)
  To: Pali Rohár
  Cc: Tony Lindgren, Matt Mackall, Russell King, Joe Perches,
	Aaro Koskinen, linux-omap, linux-kernel

On Mon, Nov 18, 2013 at 10:51:30PM +0100, Pali Rohár wrote:
> On Wednesday 16 October 2013 14:57:34 Herbert Xu wrote:
> > On Tue, Oct 08, 2013 at 12:04:09PM -0700, Tony Lindgren wrote:
> > > * Pali Rohár <pali.rohar@gmail.com> [130920 06:33]:
> > > > This driver provides kernel-side support for the Random
> > > > Number Generator hardware found on OMAP34xx processors.
> > > > 
> > > > This driver comes from Maemo 2.6.28 kernel and was tested
> > > > on Nokia RX-51. It is platform device because it needs
> > > > board specific function for smc calls.
> > > 
> > > This one is should be merged via the hw_random patches
> > > seprately:
> > > 
> > > Acked-by: Tony Lindgren <tony@atomide.com>
> > 
> > Patch applied.  Thanks!
> 
> Hello, I still do not see this patch (2/3) in linus tree. But 
> patch 1/3 and 3/3 are already merged. So is there any problem?

2/3 is still in my tree so when Linus pulls it it'll be there.

Cheers,
-- 
Email: Herbert Xu <herbert@gondor.apana.org.au>
Home Page: http://gondor.apana.org.au/~herbert/
PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt

^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: [PATCH v2 2/3] hwrng: OMAP3 ROM Random Number Generator support
  2013-11-19  2:14                     ` Herbert Xu
@ 2013-11-23  9:37                       ` Pali Rohár
  2013-11-23 12:09                         ` Sebastian Reichel
  0 siblings, 1 reply; 33+ messages in thread
From: Pali Rohár @ 2013-11-23  9:37 UTC (permalink / raw)
  To: Herbert Xu
  Cc: Tony Lindgren, Matt Mackall, Russell King, Joe Perches,
	Aaro Koskinen, linux-omap, linux-kernel

[-- Attachment #1: Type: Text/Plain, Size: 1272 bytes --]

On Tuesday 19 November 2013 03:14:09 Herbert Xu wrote:
> On Mon, Nov 18, 2013 at 10:51:30PM +0100, Pali Rohár wrote:
> > On Wednesday 16 October 2013 14:57:34 Herbert Xu wrote:
> > > On Tue, Oct 08, 2013 at 12:04:09PM -0700, Tony Lindgren 
wrote:
> > > > * Pali Rohár <pali.rohar@gmail.com> [130920 06:33]:
> > > > > This driver provides kernel-side support for the
> > > > > Random Number Generator hardware found on OMAP34xx
> > > > > processors.
> > > > > 
> > > > > This driver comes from Maemo 2.6.28 kernel and was
> > > > > tested on Nokia RX-51. It is platform device because
> > > > > it needs board specific function for smc calls.
> > > > 
> > > > This one is should be merged via the hw_random patches
> > > > seprately:
> > > > 
> > > > Acked-by: Tony Lindgren <tony@atomide.com>
> > > 
> > > Patch applied.  Thanks!
> > 
> > Hello, I still do not see this patch (2/3) in linus tree.
> > But patch 1/3 and 3/3 are already merged. So is there any
> > problem?
> 
> 2/3 is still in my tree so when Linus pulls it it'll be there.
> 
> Cheers,

Now 3.13-rc1 is out [1], but your tree was not merged. Can you 
try to ping Linus what happened?

[1] - https://lkml.org/lkml/2013/11/22/439

-- 
Pali Rohár
pali.rohar@gmail.com

[-- Attachment #2: This is a digitally signed message part. --]
[-- Type: application/pgp-signature, Size: 198 bytes --]

^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: [PATCH v2 2/3] hwrng: OMAP3 ROM Random Number Generator support
  2013-11-23  9:37                       ` Pali Rohár
@ 2013-11-23 12:09                         ` Sebastian Reichel
  0 siblings, 0 replies; 33+ messages in thread
From: Sebastian Reichel @ 2013-11-23 12:09 UTC (permalink / raw)
  To: Pali Rohár
  Cc: Herbert Xu, Tony Lindgren, Matt Mackall, Russell King,
	Joe Perches, Aaro Koskinen, linux-omap, linux-kernel

[-- Attachment #1: Type: text/plain, Size: 244 bytes --]

On Sat, Nov 23, 2013 at 10:37:13AM +0100, Pali Rohár wrote:
> Now 3.13-rc1 is out, but your tree was not merged. Can you 
> try to ping Linus what happened?

See here: http://www.spinics.net/lists/arm-kernel/msg288508.html

-- Sebastian

[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 836 bytes --]

^ permalink raw reply	[flat|nested] 33+ messages in thread

end of thread, other threads:[~2013-11-23 12:10 UTC | newest]

Thread overview: 33+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2013-02-28 18:05 [PATCH] OMAP3 ROM Random Number Generator support Pali Rohár
2013-03-24 14:15 ` Pali Rohár
2013-03-27 21:09 ` Tony Lindgren
2013-03-27 22:03   ` Pali Rohár
2013-03-27 22:25     ` Tony Lindgren
2013-03-28 17:54       ` Pali Rohár
2013-03-28 21:44         ` Tony Lindgren
2013-03-31  9:28           ` Pali Rohár
2013-04-01 16:25             ` Tony Lindgren
2013-09-18 20:05         ` [PATCH 0/2] " Pali Rohár
2013-09-18 20:05           ` [PATCH 1/2] hwrng: " Pali Rohár
2013-09-18 20:22             ` Joe Perches
2013-09-18 20:50             ` Aaro Koskinen
2013-09-18 20:05           ` [PATCH 2/2] RX-51: Add support for OMAP3 ROM Random Number Generator Pali Rohár
2013-09-18 20:39             ` Tony Lindgren
2013-09-20 13:25           ` [PATCH v2 0/3] OMAP3 ROM Random Number Generator support Pali Rohár
2013-09-20 13:25             ` [PATCH v2 1/3] omap2: Change clk dev id for rng to omap3-rom-rng Pali Rohár
2013-09-20 16:23               ` Tony Lindgren
2013-09-20 16:41                 ` Pali Rohár
2013-09-20 17:46                   ` Tony Lindgren
2013-09-20 18:24                     ` Pali Rohár
2013-09-20 18:31                       ` Tony Lindgren
2013-09-20 13:25             ` [PATCH v2 2/3] hwrng: OMAP3 ROM Random Number Generator support Pali Rohár
2013-10-08 19:04               ` Tony Lindgren
2013-10-16 12:57                 ` Herbert Xu
2013-11-18 21:51                   ` Pali Rohár
2013-11-19  2:14                     ` Herbert Xu
2013-11-23  9:37                       ` Pali Rohár
2013-11-23 12:09                         ` Sebastian Reichel
2013-09-20 13:25             ` [PATCH v2 3/3] RX-51: Add support for OMAP3 ROM Random Number Generator Pali Rohár
2013-10-08 19:06               ` Tony Lindgren
2013-03-28  9:52   ` [PATCH] OMAP3 ROM Random Number Generator support Russell King - ARM Linux
2013-03-28 17:24     ` Pali Rohár

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).