aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/arm/include/asm/hardirq.h4
-rw-r--r--arch/arm/mach-nomadik/clock.c1
-rw-r--r--arch/arm/mach-w90x900/dev.c28
-rw-r--r--arch/arm/mach-w90x900/include/mach/mfp.h24
-rw-r--r--arch/arm/mach-w90x900/mfp.c6
-rw-r--r--drivers/char/hw_random/nomadik-rng.c17
6 files changed, 79 insertions, 1 deletions
diff --git a/arch/arm/include/asm/hardirq.h b/arch/arm/include/asm/hardirq.h
index 182310b99195..6d7485aff955 100644
--- a/arch/arm/include/asm/hardirq.h
+++ b/arch/arm/include/asm/hardirq.h
@@ -12,7 +12,9 @@ typedef struct {
12 12
13#include <linux/irq_cpustat.h> /* Standard mappings for irq_cpustat_t above */ 13#include <linux/irq_cpustat.h> /* Standard mappings for irq_cpustat_t above */
14 14
15#if NR_IRQS > 256 15#if NR_IRQS > 512
16#define HARDIRQ_BITS 10
17#elif NR_IRQS > 256
16#define HARDIRQ_BITS 9 18#define HARDIRQ_BITS 9
17#else 19#else
18#define HARDIRQ_BITS 8 20#define HARDIRQ_BITS 8
diff --git a/arch/arm/mach-nomadik/clock.c b/arch/arm/mach-nomadik/clock.c
index 60f5bee09f2e..2c471fc451d7 100644
--- a/arch/arm/mach-nomadik/clock.c
+++ b/arch/arm/mach-nomadik/clock.c
@@ -56,6 +56,7 @@ static struct clk_lookup lookups[] = {
56 CLK(&clk_default, "gpio.1"), 56 CLK(&clk_default, "gpio.1"),
57 CLK(&clk_default, "gpio.2"), 57 CLK(&clk_default, "gpio.2"),
58 CLK(&clk_default, "gpio.3"), 58 CLK(&clk_default, "gpio.3"),
59 CLK(&clk_default, "rng"),
59}; 60};
60 61
61static int __init clk_init(void) 62static int __init clk_init(void)
diff --git a/arch/arm/mach-w90x900/dev.c b/arch/arm/mach-w90x900/dev.c
index e2958eb567f9..b2eda4dc1c34 100644
--- a/arch/arm/mach-w90x900/dev.c
+++ b/arch/arm/mach-w90x900/dev.c
@@ -423,6 +423,33 @@ void nuc900_fb_set_platdata(struct nuc900fb_mach_info *pd)
423} 423}
424#endif 424#endif
425 425
426/* AUDIO controller*/
427static u64 nuc900_device_audio_dmamask = -1;
428static struct resource nuc900_ac97_resource[] = {
429 [0] = {
430 .start = W90X900_PA_ACTL,
431 .end = W90X900_PA_ACTL + W90X900_SZ_ACTL - 1,
432 .flags = IORESOURCE_MEM,
433 },
434 [1] = {
435 .start = IRQ_ACTL,
436 .end = IRQ_ACTL,
437 .flags = IORESOURCE_IRQ,
438 }
439
440};
441
442struct platform_device nuc900_device_audio = {
443 .name = "nuc900-audio",
444 .id = -1,
445 .num_resources = ARRAY_SIZE(nuc900_ac97_resource),
446 .resource = nuc900_ac97_resource,
447 .dev = {
448 .dma_mask = &nuc900_device_audio_dmamask,
449 .coherent_dma_mask = -1,
450 }
451};
452
426/*Here should be your evb resourse,such as LCD*/ 453/*Here should be your evb resourse,such as LCD*/
427 454
428static struct platform_device *nuc900_public_dev[] __initdata = { 455static struct platform_device *nuc900_public_dev[] __initdata = {
@@ -434,6 +461,7 @@ static struct platform_device *nuc900_public_dev[] __initdata = {
434 &nuc900_device_emc, 461 &nuc900_device_emc,
435 &nuc900_device_spi, 462 &nuc900_device_spi,
436 &nuc900_device_wdt, 463 &nuc900_device_wdt,
464 &nuc900_device_audio,
437}; 465};
438 466
439/* Provide adding specific CPU platform devices API */ 467/* Provide adding specific CPU platform devices API */
diff --git a/arch/arm/mach-w90x900/include/mach/mfp.h b/arch/arm/mach-w90x900/include/mach/mfp.h
new file mode 100644
index 000000000000..94c0e71617c6
--- /dev/null
+++ b/arch/arm/mach-w90x900/include/mach/mfp.h
@@ -0,0 +1,24 @@
1/*
2 * arch/arm/mach-w90x900/include/mach/mfp.h
3 *
4 * Copyright (c) 2010 Nuvoton technology corporation.
5 *
6 * Wan ZongShun <mcuos.com@gmail.com>
7 *
8 * Based on arch/arm/mach-s3c2410/include/mach/map.h
9 *
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation;version 2 of the License.
13 *
14 */
15
16#ifndef __ASM_ARCH_MFP_H
17#define __ASM_ARCH_MFP_H
18
19extern void mfp_set_groupf(struct device *dev);
20extern void mfp_set_groupc(struct device *dev);
21extern void mfp_set_groupi(struct device *dev);
22extern void mfp_set_groupg(struct device *dev);
23
24#endif /* __ASM_ARCH_MFP_H */
diff --git a/arch/arm/mach-w90x900/mfp.c b/arch/arm/mach-w90x900/mfp.c
index a47dc9a708ee..fb7fb627b1a5 100644
--- a/arch/arm/mach-w90x900/mfp.c
+++ b/arch/arm/mach-w90x900/mfp.c
@@ -36,9 +36,12 @@
36 36
37#define GPIOG0TO1 (0x03 << 14) 37#define GPIOG0TO1 (0x03 << 14)
38#define GPIOG2TO3 (0x03 << 16) 38#define GPIOG2TO3 (0x03 << 16)
39#define GPIOG22TO23 (0x03 << 22)
40
39#define ENSPI (0x0a << 14) 41#define ENSPI (0x0a << 14)
40#define ENI2C0 (0x01 << 14) 42#define ENI2C0 (0x01 << 14)
41#define ENI2C1 (0x01 << 16) 43#define ENI2C1 (0x01 << 16)
44#define ENAC97 (0x02 << 22)
42 45
43static DEFINE_MUTEX(mfp_mutex); 46static DEFINE_MUTEX(mfp_mutex);
44 47
@@ -146,6 +149,9 @@ void mfp_set_groupg(struct device *dev)
146 } else if (strcmp(dev_id, "nuc900-i2c1") == 0) { 149 } else if (strcmp(dev_id, "nuc900-i2c1") == 0) {
147 mfpen &= ~(GPIOG2TO3); 150 mfpen &= ~(GPIOG2TO3);
148 mfpen |= ENI2C1;/*enable i2c1*/ 151 mfpen |= ENI2C1;/*enable i2c1*/
152 } else if (strcmp(dev_id, "nuc900-audio") == 0) {
153 mfpen &= ~(GPIOG22TO23);
154 mfpen |= ENAC97;/*enable AC97*/
149 } else { 155 } else {
150 mfpen &= ~(GPIOG0TO1 | GPIOG2TO3);/*GPIOG[3:0]*/ 156 mfpen &= ~(GPIOG0TO1 | GPIOG2TO3);/*GPIOG[3:0]*/
151 } 157 }
diff --git a/drivers/char/hw_random/nomadik-rng.c b/drivers/char/hw_random/nomadik-rng.c
index a8b4c4010144..a348c7e9aa0b 100644
--- a/drivers/char/hw_random/nomadik-rng.c
+++ b/drivers/char/hw_random/nomadik-rng.c
@@ -15,6 +15,10 @@
15#include <linux/amba/bus.h> 15#include <linux/amba/bus.h>
16#include <linux/hw_random.h> 16#include <linux/hw_random.h>
17#include <linux/io.h> 17#include <linux/io.h>
18#include <linux/clk.h>
19#include <linux/err.h>
20
21static struct clk *rng_clk;
18 22
19static int nmk_rng_read(struct hwrng *rng, void *data, size_t max, bool wait) 23static int nmk_rng_read(struct hwrng *rng, void *data, size_t max, bool wait)
20{ 24{
@@ -40,6 +44,15 @@ static int nmk_rng_probe(struct amba_device *dev, struct amba_id *id)
40 void __iomem *base; 44 void __iomem *base;
41 int ret; 45 int ret;
42 46
47 rng_clk = clk_get(&dev->dev, NULL);
48 if (IS_ERR(rng_clk)) {
49 dev_err(&dev->dev, "could not get rng clock\n");
50 ret = PTR_ERR(rng_clk);
51 return ret;
52 }
53
54 clk_enable(rng_clk);
55
43 ret = amba_request_regions(dev, dev->dev.init_name); 56 ret = amba_request_regions(dev, dev->dev.init_name);
44 if (ret) 57 if (ret)
45 return ret; 58 return ret;
@@ -57,6 +70,8 @@ out_unmap:
57 iounmap(base); 70 iounmap(base);
58out_release: 71out_release:
59 amba_release_regions(dev); 72 amba_release_regions(dev);
73 clk_disable(rng_clk);
74 clk_put(rng_clk);
60 return ret; 75 return ret;
61} 76}
62 77
@@ -66,6 +81,8 @@ static int nmk_rng_remove(struct amba_device *dev)
66 hwrng_unregister(&nmk_rng); 81 hwrng_unregister(&nmk_rng);
67 iounmap(base); 82 iounmap(base);
68 amba_release_regions(dev); 83 amba_release_regions(dev);
84 clk_disable(rng_clk);
85 clk_put(rng_clk);
69 return 0; 86 return 0;
70} 87}
71 88