aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm/mach-omap2
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2013-05-02 12:31:45 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2013-05-02 12:31:45 -0400
commit97b1007a2924aaa9126398623f6755a8c3c6a616 (patch)
treeb65c6edb631256e64bb3c72f083fa1be048de097 /arch/arm/mach-omap2
parentdfab34aa61a0f8c14a67d7b4c1dae28e57ba592d (diff)
parente0d20b69d3fa74a21ec363989612bddd58b930b8 (diff)
Merge tag 'soc-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/arm/arm-soc
Pull ARM SoC platform updates from Olof Johansson: "This branch contains part 1 of the platform updates for 3.10. Among the highlights: - Support for the new Atmel Cortex-A5 based platforms (SAMA5D3) - New support for CSR SiRFatlas6 SoCs - A handful of updates for NVidia T114 (a.k.a. Tegra 4) - A bunch of updates for the shmobile platforms - A handful of updates for davinci - A few updates for Qualcomm MSM - Plus a handful of other patches, defconfig updates, etc." * tag 'soc-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/arm/arm-soc: (135 commits) ARM: tegra: pm: fix build error w/o PM_SLEEP ARM: davinci: ensure global variables are declared ARM: davinci: sram.c: fix incorrect type in assignment ARM: davinci: da8xx dt: make file local symbols static ARM: davinci: da8xx: add remoteproc support ARM: socfpga: Upgrade clk driver for socfpga to make use of dts clock entries ARM: socfpga: Add clock entries into device tree ARM: socfpga: Enable soft reset ARM: EXYNOS: replace cpumask by the corresponding macro ARM: EXYNOS: handle properly the return values ARM: EXYNOS: factor out the idle states ARM: OMAP4: Enable fix for Cortex-A9 erratas ARM: OMAP2+: Export SoC information to userspace ARM: OMAP2+: SoC name and revision unification ARM: OMAP2+: Move common part of late init into common function ARM: tegra: pm: remove duplicated include from pm.c ARM: davinci: da850: override mmc DT node device name ARM: davinci: da850: add mmc DT entries mmc: davinci_mmc: add DT support ARM: SAMSUNG: check processor type before cache restoration in resume ...
Diffstat (limited to 'arch/arm/mach-omap2')
-rw-r--r--arch/arm/mach-omap2/Kconfig3
-rw-r--r--arch/arm/mach-omap2/cclock2430_data.c4
-rw-r--r--arch/arm/mach-omap2/cclock33xx_data.c10
-rw-r--r--arch/arm/mach-omap2/cclock3xxx_data.c2
-rw-r--r--arch/arm/mach-omap2/common.h8
-rw-r--r--arch/arm/mach-omap2/devices.c149
-rw-r--r--arch/arm/mach-omap2/id.c95
-rw-r--r--arch/arm/mach-omap2/io.c34
-rw-r--r--arch/arm/mach-omap2/omap_hwmod_2420_data.c2
-rw-r--r--arch/arm/mach-omap2/omap_hwmod_2430_data.c2
-rw-r--r--arch/arm/mach-omap2/omap_hwmod_2xxx_interconnect_data.c36
-rw-r--r--arch/arm/mach-omap2/omap_hwmod_2xxx_ipblock_data.c81
-rw-r--r--arch/arm/mach-omap2/omap_hwmod_33xx_data.c92
-rw-r--r--arch/arm/mach-omap2/omap_hwmod_3xxx_data.c172
-rw-r--r--arch/arm/mach-omap2/omap_hwmod_common_data.h4
15 files changed, 515 insertions, 179 deletions
diff --git a/arch/arm/mach-omap2/Kconfig b/arch/arm/mach-omap2/Kconfig
index 4dc34ae6a857..5c27c4747469 100644
--- a/arch/arm/mach-omap2/Kconfig
+++ b/arch/arm/mach-omap2/Kconfig
@@ -15,6 +15,7 @@ config ARCH_OMAP2PLUS
15 select OMAP_DM_TIMER 15 select OMAP_DM_TIMER
16 select PINCTRL 16 select PINCTRL
17 select PROC_DEVICETREE if PROC_FS 17 select PROC_DEVICETREE if PROC_FS
18 select SOC_BUS
18 select SPARSE_IRQ 19 select SPARSE_IRQ
19 select USE_OF 20 select USE_OF
20 help 21 help
@@ -99,6 +100,8 @@ config ARCH_OMAP4
99 select PM_RUNTIME if CPU_IDLE 100 select PM_RUNTIME if CPU_IDLE
100 select USB_ARCH_HAS_EHCI if USB_SUPPORT 101 select USB_ARCH_HAS_EHCI if USB_SUPPORT
101 select COMMON_CLK 102 select COMMON_CLK
103 select ARM_ERRATA_754322
104 select ARM_ERRATA_775420
102 105
103config SOC_OMAP5 106config SOC_OMAP5
104 bool "TI OMAP5" 107 bool "TI OMAP5"
diff --git a/arch/arm/mach-omap2/cclock2430_data.c b/arch/arm/mach-omap2/cclock2430_data.c
index bda353b2f7d9..5e4b037bb24c 100644
--- a/arch/arm/mach-omap2/cclock2430_data.c
+++ b/arch/arm/mach-omap2/cclock2430_data.c
@@ -1978,9 +1978,11 @@ static struct omap_clk omap2430_clks[] = {
1978 CLK(NULL, "sdrc_ick", &sdrc_ick), 1978 CLK(NULL, "sdrc_ick", &sdrc_ick),
1979 CLK(NULL, "des_ick", &des_ick), 1979 CLK(NULL, "des_ick", &des_ick),
1980 CLK("omap-sham", "ick", &sha_ick), 1980 CLK("omap-sham", "ick", &sha_ick),
1981 CLK("omap_rng", "ick", &rng_ick), 1981 CLK(NULL, "sha_ick", &sha_ick),
1982 CLK("omap_rng", "ick", &rng_ick),
1982 CLK(NULL, "rng_ick", &rng_ick), 1983 CLK(NULL, "rng_ick", &rng_ick),
1983 CLK("omap-aes", "ick", &aes_ick), 1984 CLK("omap-aes", "ick", &aes_ick),
1985 CLK(NULL, "aes_ick", &aes_ick),
1984 CLK(NULL, "pka_ick", &pka_ick), 1986 CLK(NULL, "pka_ick", &pka_ick),
1985 CLK(NULL, "usb_fck", &usb_fck), 1987 CLK(NULL, "usb_fck", &usb_fck),
1986 CLK("musb-omap2430", "ick", &usbhs_ick), 1988 CLK("musb-omap2430", "ick", &usbhs_ick),
diff --git a/arch/arm/mach-omap2/cclock33xx_data.c b/arch/arm/mach-omap2/cclock33xx_data.c
index 332c6d3e55a9..6ebc7803bc3e 100644
--- a/arch/arm/mach-omap2/cclock33xx_data.c
+++ b/arch/arm/mach-omap2/cclock33xx_data.c
@@ -413,6 +413,14 @@ static struct clk smartreflex1_fck;
413DEFINE_STRUCT_CLK_HW_OMAP(smartreflex1_fck, NULL); 413DEFINE_STRUCT_CLK_HW_OMAP(smartreflex1_fck, NULL);
414DEFINE_STRUCT_CLK(smartreflex1_fck, dpll_core_ck_parents, clk_ops_null); 414DEFINE_STRUCT_CLK(smartreflex1_fck, dpll_core_ck_parents, clk_ops_null);
415 415
416static struct clk sha0_fck;
417DEFINE_STRUCT_CLK_HW_OMAP(sha0_fck, NULL);
418DEFINE_STRUCT_CLK(sha0_fck, dpll_core_ck_parents, clk_ops_null);
419
420static struct clk aes0_fck;
421DEFINE_STRUCT_CLK_HW_OMAP(aes0_fck, NULL);
422DEFINE_STRUCT_CLK(aes0_fck, dpll_core_ck_parents, clk_ops_null);
423
416/* 424/*
417 * Modules clock nodes 425 * Modules clock nodes
418 * 426 *
@@ -878,6 +886,8 @@ static struct omap_clk am33xx_clks[] = {
878 CLK(NULL, "mmu_fck", &mmu_fck), 886 CLK(NULL, "mmu_fck", &mmu_fck),
879 CLK(NULL, "smartreflex0_fck", &smartreflex0_fck), 887 CLK(NULL, "smartreflex0_fck", &smartreflex0_fck),
880 CLK(NULL, "smartreflex1_fck", &smartreflex1_fck), 888 CLK(NULL, "smartreflex1_fck", &smartreflex1_fck),
889 CLK(NULL, "sha0_fck", &sha0_fck),
890 CLK(NULL, "aes0_fck", &aes0_fck),
881 CLK(NULL, "timer1_fck", &timer1_fck), 891 CLK(NULL, "timer1_fck", &timer1_fck),
882 CLK(NULL, "timer2_fck", &timer2_fck), 892 CLK(NULL, "timer2_fck", &timer2_fck),
883 CLK(NULL, "timer3_fck", &timer3_fck), 893 CLK(NULL, "timer3_fck", &timer3_fck),
diff --git a/arch/arm/mach-omap2/cclock3xxx_data.c b/arch/arm/mach-omap2/cclock3xxx_data.c
index 438d13341e23..45cd26430d1f 100644
--- a/arch/arm/mach-omap2/cclock3xxx_data.c
+++ b/arch/arm/mach-omap2/cclock3xxx_data.c
@@ -3471,8 +3471,10 @@ static struct omap_clk omap3xxx_clks[] = {
3471 CLK("usbhs_tll", "usb_tll_hs_usb_ch1_clk", &dummy_ck), 3471 CLK("usbhs_tll", "usb_tll_hs_usb_ch1_clk", &dummy_ck),
3472 CLK(NULL, "init_60m_fclk", &dummy_ck), 3472 CLK(NULL, "init_60m_fclk", &dummy_ck),
3473 CLK(NULL, "gpt1_fck", &gpt1_fck), 3473 CLK(NULL, "gpt1_fck", &gpt1_fck),
3474 CLK(NULL, "aes2_ick", &aes2_ick),
3474 CLK(NULL, "wkup_32k_fck", &wkup_32k_fck), 3475 CLK(NULL, "wkup_32k_fck", &wkup_32k_fck),
3475 CLK(NULL, "gpio1_dbck", &gpio1_dbck), 3476 CLK(NULL, "gpio1_dbck", &gpio1_dbck),
3477 CLK(NULL, "sha12_ick", &sha12_ick),
3476 CLK(NULL, "wdt2_fck", &wdt2_fck), 3478 CLK(NULL, "wdt2_fck", &wdt2_fck),
3477 CLK("omap_wdt", "ick", &wdt2_ick), 3479 CLK("omap_wdt", "ick", &wdt2_ick),
3478 CLK(NULL, "wdt2_ick", &wdt2_ick), 3480 CLK(NULL, "wdt2_ick", &wdt2_ick),
diff --git a/arch/arm/mach-omap2/common.h b/arch/arm/mach-omap2/common.h
index 14522d077c88..df00e7580aa7 100644
--- a/arch/arm/mach-omap2/common.h
+++ b/arch/arm/mach-omap2/common.h
@@ -110,6 +110,14 @@ void am35xx_init_late(void);
110void ti81xx_init_late(void); 110void ti81xx_init_late(void);
111int omap2_common_pm_late_init(void); 111int omap2_common_pm_late_init(void);
112 112
113#ifdef CONFIG_SOC_BUS
114void omap_soc_device_init(void);
115#else
116static inline void omap_soc_device_init(void)
117{
118}
119#endif
120
113#if defined(CONFIG_SOC_OMAP2420) || defined(CONFIG_SOC_OMAP2430) 121#if defined(CONFIG_SOC_OMAP2420) || defined(CONFIG_SOC_OMAP2430)
114void omap2xxx_restart(char mode, const char *cmd); 122void omap2xxx_restart(char mode, const char *cmd);
115#else 123#else
diff --git a/arch/arm/mach-omap2/devices.c b/arch/arm/mach-omap2/devices.c
index 1ec7f0597710..4269fc145698 100644
--- a/arch/arm/mach-omap2/devices.c
+++ b/arch/arm/mach-omap2/devices.c
@@ -504,140 +504,31 @@ static void omap_init_rng(void)
504 WARN(IS_ERR(pdev), "Can't build omap_device for omap_rng\n"); 504 WARN(IS_ERR(pdev), "Can't build omap_device for omap_rng\n");
505} 505}
506 506
507#if defined(CONFIG_CRYPTO_DEV_OMAP_SHAM) || defined(CONFIG_CRYPTO_DEV_OMAP_SHAM_MODULE) 507static void __init omap_init_sham(void)
508
509#ifdef CONFIG_ARCH_OMAP2
510static struct resource omap2_sham_resources[] = {
511 {
512 .start = OMAP24XX_SEC_SHA1MD5_BASE,
513 .end = OMAP24XX_SEC_SHA1MD5_BASE + 0x64,
514 .flags = IORESOURCE_MEM,
515 },
516 {
517 .start = 51 + OMAP_INTC_START,
518 .flags = IORESOURCE_IRQ,
519 }
520};
521static int omap2_sham_resources_sz = ARRAY_SIZE(omap2_sham_resources);
522#else
523#define omap2_sham_resources NULL
524#define omap2_sham_resources_sz 0
525#endif
526
527#ifdef CONFIG_ARCH_OMAP3
528static struct resource omap3_sham_resources[] = {
529 {
530 .start = OMAP34XX_SEC_SHA1MD5_BASE,
531 .end = OMAP34XX_SEC_SHA1MD5_BASE + 0x64,
532 .flags = IORESOURCE_MEM,
533 },
534 {
535 .start = 49 + OMAP_INTC_START,
536 .flags = IORESOURCE_IRQ,
537 },
538 {
539 .start = OMAP34XX_DMA_SHA1MD5_RX,
540 .flags = IORESOURCE_DMA,
541 }
542};
543static int omap3_sham_resources_sz = ARRAY_SIZE(omap3_sham_resources);
544#else
545#define omap3_sham_resources NULL
546#define omap3_sham_resources_sz 0
547#endif
548
549static struct platform_device sham_device = {
550 .name = "omap-sham",
551 .id = -1,
552};
553
554static void omap_init_sham(void)
555{ 508{
556 if (cpu_is_omap24xx()) { 509 struct omap_hwmod *oh;
557 sham_device.resource = omap2_sham_resources; 510 struct platform_device *pdev;
558 sham_device.num_resources = omap2_sham_resources_sz;
559 } else if (cpu_is_omap34xx()) {
560 sham_device.resource = omap3_sham_resources;
561 sham_device.num_resources = omap3_sham_resources_sz;
562 } else {
563 pr_err("%s: platform not supported\n", __func__);
564 return;
565 }
566 platform_device_register(&sham_device);
567}
568#else
569static inline void omap_init_sham(void) { }
570#endif
571
572#if defined(CONFIG_CRYPTO_DEV_OMAP_AES) || defined(CONFIG_CRYPTO_DEV_OMAP_AES_MODULE)
573
574#ifdef CONFIG_ARCH_OMAP2
575static struct resource omap2_aes_resources[] = {
576 {
577 .start = OMAP24XX_SEC_AES_BASE,
578 .end = OMAP24XX_SEC_AES_BASE + 0x4C,
579 .flags = IORESOURCE_MEM,
580 },
581 {
582 .start = OMAP24XX_DMA_AES_TX,
583 .flags = IORESOURCE_DMA,
584 },
585 {
586 .start = OMAP24XX_DMA_AES_RX,
587 .flags = IORESOURCE_DMA,
588 }
589};
590static int omap2_aes_resources_sz = ARRAY_SIZE(omap2_aes_resources);
591#else
592#define omap2_aes_resources NULL
593#define omap2_aes_resources_sz 0
594#endif
595 511
596#ifdef CONFIG_ARCH_OMAP3 512 oh = omap_hwmod_lookup("sham");
597static struct resource omap3_aes_resources[] = { 513 if (!oh)
598 { 514 return;
599 .start = OMAP34XX_SEC_AES_BASE,
600 .end = OMAP34XX_SEC_AES_BASE + 0x4C,
601 .flags = IORESOURCE_MEM,
602 },
603 {
604 .start = OMAP34XX_DMA_AES2_TX,
605 .flags = IORESOURCE_DMA,
606 },
607 {
608 .start = OMAP34XX_DMA_AES2_RX,
609 .flags = IORESOURCE_DMA,
610 }
611};
612static int omap3_aes_resources_sz = ARRAY_SIZE(omap3_aes_resources);
613#else
614#define omap3_aes_resources NULL
615#define omap3_aes_resources_sz 0
616#endif
617 515
618static struct platform_device aes_device = { 516 pdev = omap_device_build("omap-sham", -1, oh, NULL, 0);
619 .name = "omap-aes", 517 WARN(IS_ERR(pdev), "Can't build omap_device for omap-sham\n");
620 .id = -1, 518}
621};
622 519
623static void omap_init_aes(void) 520static void __init omap_init_aes(void)
624{ 521{
625 if (cpu_is_omap24xx()) { 522 struct omap_hwmod *oh;
626 aes_device.resource = omap2_aes_resources; 523 struct platform_device *pdev;
627 aes_device.num_resources = omap2_aes_resources_sz; 524
628 } else if (cpu_is_omap34xx()) { 525 oh = omap_hwmod_lookup("aes");
629 aes_device.resource = omap3_aes_resources; 526 if (!oh)
630 aes_device.num_resources = omap3_aes_resources_sz;
631 } else {
632 pr_err("%s: platform not supported\n", __func__);
633 return; 527 return;
634 }
635 platform_device_register(&aes_device);
636}
637 528
638#else 529 pdev = omap_device_build("omap-aes", -1, oh, NULL, 0);
639static inline void omap_init_aes(void) { } 530 WARN(IS_ERR(pdev), "Can't build omap_device for omap-aes\n");
640#endif 531}
641 532
642/*-------------------------------------------------------------------------*/ 533/*-------------------------------------------------------------------------*/
643 534
@@ -764,11 +655,11 @@ static int __init omap2_init_devices(void)
764 omap_init_dmic(); 655 omap_init_dmic();
765 omap_init_mcpdm(); 656 omap_init_mcpdm();
766 omap_init_mcspi(); 657 omap_init_mcspi();
658 omap_init_sham();
659 omap_init_aes();
767 } 660 }
768 omap_init_sti(); 661 omap_init_sti();
769 omap_init_rng(); 662 omap_init_rng();
770 omap_init_sham();
771 omap_init_aes();
772 omap_init_vout(); 663 omap_init_vout();
773 omap_init_ocp2scp(); 664 omap_init_ocp2scp();
774 665
diff --git a/arch/arm/mach-omap2/id.c b/arch/arm/mach-omap2/id.c
index ff0bc9e51aa7..2fb17caa8683 100644
--- a/arch/arm/mach-omap2/id.c
+++ b/arch/arm/mach-omap2/id.c
@@ -18,6 +18,11 @@
18#include <linux/kernel.h> 18#include <linux/kernel.h>
19#include <linux/init.h> 19#include <linux/init.h>
20#include <linux/io.h> 20#include <linux/io.h>
21#include <linux/slab.h>
22
23#ifdef CONFIG_SOC_BUS
24#include <linux/sys_soc.h>
25#endif
21 26
22#include <asm/cputype.h> 27#include <asm/cputype.h>
23 28
@@ -31,8 +36,11 @@
31#define OMAP4_SILICON_TYPE_STANDARD 0x01 36#define OMAP4_SILICON_TYPE_STANDARD 0x01
32#define OMAP4_SILICON_TYPE_PERFORMANCE 0x02 37#define OMAP4_SILICON_TYPE_PERFORMANCE 0x02
33 38
39#define OMAP_SOC_MAX_NAME_LENGTH 16
40
34static unsigned int omap_revision; 41static unsigned int omap_revision;
35static const char *cpu_rev; 42static char soc_name[OMAP_SOC_MAX_NAME_LENGTH];
43static char soc_rev[OMAP_SOC_MAX_NAME_LENGTH];
36u32 omap_features; 44u32 omap_features;
37 45
38unsigned int omap_rev(void) 46unsigned int omap_rev(void)
@@ -169,9 +177,12 @@ void __init omap2xxx_check_revision(void)
169 j = i; 177 j = i;
170 } 178 }
171 179
172 pr_info("OMAP%04x", omap_rev() >> 16); 180 sprintf(soc_name, "OMAP%04x", omap_rev() >> 16);
181 sprintf(soc_rev, "ES%x", (omap_rev() >> 12) & 0xf);
182
183 pr_info("%s", soc_name);
173 if ((omap_rev() >> 8) & 0x0f) 184 if ((omap_rev() >> 8) & 0x0f)
174 pr_info("ES%x", (omap_rev() >> 12) & 0xf); 185 pr_info("%s", soc_rev);
175 pr_info("\n"); 186 pr_info("\n");
176} 187}
177 188
@@ -211,8 +222,10 @@ static void __init omap3_cpuinfo(void)
211 cpu_name = "OMAP3503"; 222 cpu_name = "OMAP3503";
212 } 223 }
213 224
225 sprintf(soc_name, "%s", cpu_name);
226
214 /* Print verbose information */ 227 /* Print verbose information */
215 pr_info("%s ES%s (", cpu_name, cpu_rev); 228 pr_info("%s %s (", soc_name, soc_rev);
216 229
217 OMAP3_SHOW_FEATURE(l2cache); 230 OMAP3_SHOW_FEATURE(l2cache);
218 OMAP3_SHOW_FEATURE(iva); 231 OMAP3_SHOW_FEATURE(iva);
@@ -291,6 +304,7 @@ void __init ti81xx_check_features(void)
291 304
292void __init omap3xxx_check_revision(void) 305void __init omap3xxx_check_revision(void)
293{ 306{
307 const char *cpu_rev;
294 u32 cpuid, idcode; 308 u32 cpuid, idcode;
295 u16 hawkeye; 309 u16 hawkeye;
296 u8 rev; 310 u8 rev;
@@ -438,6 +452,7 @@ void __init omap3xxx_check_revision(void)
438 cpu_rev = "1.2"; 452 cpu_rev = "1.2";
439 pr_warn("Warning: unknown chip type; assuming OMAP3630ES1.2\n"); 453 pr_warn("Warning: unknown chip type; assuming OMAP3630ES1.2\n");
440 } 454 }
455 sprintf(soc_rev, "ES%s", cpu_rev);
441} 456}
442 457
443void __init omap4xxx_check_revision(void) 458void __init omap4xxx_check_revision(void)
@@ -512,8 +527,10 @@ void __init omap4xxx_check_revision(void)
512 omap_revision = OMAP4430_REV_ES2_3; 527 omap_revision = OMAP4430_REV_ES2_3;
513 } 528 }
514 529
515 pr_info("OMAP%04x ES%d.%d\n", omap_rev() >> 16, 530 sprintf(soc_name, "OMAP%04x", omap_rev() >> 16);
516 ((omap_rev() >> 12) & 0xf), ((omap_rev() >> 8) & 0xf)); 531 sprintf(soc_rev, "ES%d.%d", (omap_rev() >> 12) & 0xf,
532 (omap_rev() >> 8) & 0xf);
533 pr_info("%s %s\n", soc_name, soc_rev);
517} 534}
518 535
519void __init omap5xxx_check_revision(void) 536void __init omap5xxx_check_revision(void)
@@ -553,8 +570,10 @@ void __init omap5xxx_check_revision(void)
553 omap_revision = OMAP5430_REV_ES2_0; 570 omap_revision = OMAP5430_REV_ES2_0;
554 } 571 }
555 572
556 pr_info("OMAP%04x ES%d.0\n", 573 sprintf(soc_name, "OMAP%04x", omap_rev() >> 16);
557 omap_rev() >> 16, ((omap_rev() >> 12) & 0xf)); 574 sprintf(soc_rev, "ES%d.0", (omap_rev() >> 12) & 0xf);
575
576 pr_info("%s %s\n", soc_name, soc_rev);
558} 577}
559 578
560/* 579/*
@@ -575,3 +594,63 @@ void __init omap2_set_globals_tap(u32 class, void __iomem *tap)
575 else 594 else
576 tap_prod_id = 0x0208; 595 tap_prod_id = 0x0208;
577} 596}
597
598#ifdef CONFIG_SOC_BUS
599
600static const char const *omap_types[] = {
601 [OMAP2_DEVICE_TYPE_TEST] = "TST",
602 [OMAP2_DEVICE_TYPE_EMU] = "EMU",
603 [OMAP2_DEVICE_TYPE_SEC] = "HS",
604 [OMAP2_DEVICE_TYPE_GP] = "GP",
605 [OMAP2_DEVICE_TYPE_BAD] = "BAD",
606};
607
608static const char * __init omap_get_family(void)
609{
610 if (cpu_is_omap24xx())
611 return kasprintf(GFP_KERNEL, "OMAP2");
612 else if (cpu_is_omap34xx())
613 return kasprintf(GFP_KERNEL, "OMAP3");
614 else if (cpu_is_omap44xx())
615 return kasprintf(GFP_KERNEL, "OMAP4");
616 else if (soc_is_omap54xx())
617 return kasprintf(GFP_KERNEL, "OMAP5");
618 else
619 return kasprintf(GFP_KERNEL, "Unknown");
620}
621
622static ssize_t omap_get_type(struct device *dev,
623 struct device_attribute *attr,
624 char *buf)
625{
626 return sprintf(buf, "%s\n", omap_types[omap_type()]);
627}
628
629static struct device_attribute omap_soc_attr =
630 __ATTR(type, S_IRUGO, omap_get_type, NULL);
631
632void __init omap_soc_device_init(void)
633{
634 struct device *parent;
635 struct soc_device *soc_dev;
636 struct soc_device_attribute *soc_dev_attr;
637
638 soc_dev_attr = kzalloc(sizeof(*soc_dev_attr), GFP_KERNEL);
639 if (!soc_dev_attr)
640 return;
641
642 soc_dev_attr->machine = soc_name;
643 soc_dev_attr->family = omap_get_family();
644 soc_dev_attr->revision = soc_rev;
645
646 soc_dev = soc_device_register(soc_dev_attr);
647 if (IS_ERR_OR_NULL(soc_dev)) {
648 kfree(soc_dev_attr);
649 return;
650 }
651
652 parent = soc_device_to_device(soc_dev);
653 if (!IS_ERR_OR_NULL(parent))
654 device_create_file(parent, &omap_soc_attr);
655}
656#endif /* CONFIG_SOC_BUS */
diff --git a/arch/arm/mach-omap2/io.c b/arch/arm/mach-omap2/io.c
index e210fa830f8d..09abf99e9e57 100644
--- a/arch/arm/mach-omap2/io.c
+++ b/arch/arm/mach-omap2/io.c
@@ -394,6 +394,13 @@ static void __init omap_hwmod_init_postsetup(void)
394 omap_pm_if_early_init(); 394 omap_pm_if_early_init();
395} 395}
396 396
397static void __init omap_common_late_init(void)
398{
399 omap_mux_late_init();
400 omap2_common_pm_late_init();
401 omap_soc_device_init();
402}
403
397#ifdef CONFIG_SOC_OMAP2420 404#ifdef CONFIG_SOC_OMAP2420
398void __init omap2420_init_early(void) 405void __init omap2420_init_early(void)
399{ 406{
@@ -417,8 +424,7 @@ void __init omap2420_init_early(void)
417 424
418void __init omap2420_init_late(void) 425void __init omap2420_init_late(void)
419{ 426{
420 omap_mux_late_init(); 427 omap_common_late_init();
421 omap2_common_pm_late_init();
422 omap2_pm_init(); 428 omap2_pm_init();
423 omap2_clk_enable_autoidle_all(); 429 omap2_clk_enable_autoidle_all();
424} 430}
@@ -447,8 +453,7 @@ void __init omap2430_init_early(void)
447 453
448void __init omap2430_init_late(void) 454void __init omap2430_init_late(void)
449{ 455{
450 omap_mux_late_init(); 456 omap_common_late_init();
451 omap2_common_pm_late_init();
452 omap2_pm_init(); 457 omap2_pm_init();
453 omap2_clk_enable_autoidle_all(); 458 omap2_clk_enable_autoidle_all();
454} 459}
@@ -520,48 +525,42 @@ void __init ti81xx_init_early(void)
520 525
521void __init omap3_init_late(void) 526void __init omap3_init_late(void)
522{ 527{
523 omap_mux_late_init(); 528 omap_common_late_init();
524 omap2_common_pm_late_init();
525 omap3_pm_init(); 529 omap3_pm_init();
526 omap2_clk_enable_autoidle_all(); 530 omap2_clk_enable_autoidle_all();
527} 531}
528 532
529void __init omap3430_init_late(void) 533void __init omap3430_init_late(void)
530{ 534{
531 omap_mux_late_init(); 535 omap_common_late_init();
532 omap2_common_pm_late_init();
533 omap3_pm_init(); 536 omap3_pm_init();
534 omap2_clk_enable_autoidle_all(); 537 omap2_clk_enable_autoidle_all();
535} 538}
536 539
537void __init omap35xx_init_late(void) 540void __init omap35xx_init_late(void)
538{ 541{
539 omap_mux_late_init(); 542 omap_common_late_init();
540 omap2_common_pm_late_init();
541 omap3_pm_init(); 543 omap3_pm_init();
542 omap2_clk_enable_autoidle_all(); 544 omap2_clk_enable_autoidle_all();
543} 545}
544 546
545void __init omap3630_init_late(void) 547void __init omap3630_init_late(void)
546{ 548{
547 omap_mux_late_init(); 549 omap_common_late_init();
548 omap2_common_pm_late_init();
549 omap3_pm_init(); 550 omap3_pm_init();
550 omap2_clk_enable_autoidle_all(); 551 omap2_clk_enable_autoidle_all();
551} 552}
552 553
553void __init am35xx_init_late(void) 554void __init am35xx_init_late(void)
554{ 555{
555 omap_mux_late_init(); 556 omap_common_late_init();
556 omap2_common_pm_late_init();
557 omap3_pm_init(); 557 omap3_pm_init();
558 omap2_clk_enable_autoidle_all(); 558 omap2_clk_enable_autoidle_all();
559} 559}
560 560
561void __init ti81xx_init_late(void) 561void __init ti81xx_init_late(void)
562{ 562{
563 omap_mux_late_init(); 563 omap_common_late_init();
564 omap2_common_pm_late_init();
565 omap3_pm_init(); 564 omap3_pm_init();
566 omap2_clk_enable_autoidle_all(); 565 omap2_clk_enable_autoidle_all();
567} 566}
@@ -613,8 +612,7 @@ void __init omap4430_init_early(void)
613 612
614void __init omap4430_init_late(void) 613void __init omap4430_init_late(void)
615{ 614{
616 omap_mux_late_init(); 615 omap_common_late_init();
617 omap2_common_pm_late_init();
618 omap4_pm_init(); 616 omap4_pm_init();
619 omap2_clk_enable_autoidle_all(); 617 omap2_clk_enable_autoidle_all();
620} 618}
diff --git a/arch/arm/mach-omap2/omap_hwmod_2420_data.c b/arch/arm/mach-omap2/omap_hwmod_2420_data.c
index 6a764af6c6d3..5137cc84b504 100644
--- a/arch/arm/mach-omap2/omap_hwmod_2420_data.c
+++ b/arch/arm/mach-omap2/omap_hwmod_2420_data.c
@@ -610,6 +610,8 @@ static struct omap_hwmod_ocp_if *omap2420_hwmod_ocp_ifs[] __initdata = {
610 &omap2420_l4_core__mcbsp2, 610 &omap2420_l4_core__mcbsp2,
611 &omap2420_l4_core__msdi1, 611 &omap2420_l4_core__msdi1,
612 &omap2xxx_l4_core__rng, 612 &omap2xxx_l4_core__rng,
613 &omap2xxx_l4_core__sham,
614 &omap2xxx_l4_core__aes,
613 &omap2420_l4_core__hdq1w, 615 &omap2420_l4_core__hdq1w,
614 &omap2420_l4_wkup__counter_32k, 616 &omap2420_l4_wkup__counter_32k,
615 &omap2420_l3__gpmc, 617 &omap2420_l3__gpmc,
diff --git a/arch/arm/mach-omap2/omap_hwmod_2430_data.c b/arch/arm/mach-omap2/omap_hwmod_2430_data.c
index d2d3840557c3..4ce999ee3ee9 100644
--- a/arch/arm/mach-omap2/omap_hwmod_2430_data.c
+++ b/arch/arm/mach-omap2/omap_hwmod_2430_data.c
@@ -963,6 +963,8 @@ static struct omap_hwmod_ocp_if *omap2430_hwmod_ocp_ifs[] __initdata = {
963 &omap2430_l4_core__mcbsp5, 963 &omap2430_l4_core__mcbsp5,
964 &omap2430_l4_core__hdq1w, 964 &omap2430_l4_core__hdq1w,
965 &omap2xxx_l4_core__rng, 965 &omap2xxx_l4_core__rng,
966 &omap2xxx_l4_core__sham,
967 &omap2xxx_l4_core__aes,
966 &omap2430_l4_wkup__counter_32k, 968 &omap2430_l4_wkup__counter_32k,
967 &omap2430_l3__gpmc, 969 &omap2430_l3__gpmc,
968 NULL, 970 NULL,
diff --git a/arch/arm/mach-omap2/omap_hwmod_2xxx_interconnect_data.c b/arch/arm/mach-omap2/omap_hwmod_2xxx_interconnect_data.c
index 47901a5e76de..5fd40d4a989e 100644
--- a/arch/arm/mach-omap2/omap_hwmod_2xxx_interconnect_data.c
+++ b/arch/arm/mach-omap2/omap_hwmod_2xxx_interconnect_data.c
@@ -138,6 +138,24 @@ static struct omap_hwmod_addr_space omap2_rng_addr_space[] = {
138 { } 138 { }
139}; 139};
140 140
141static struct omap_hwmod_addr_space omap2xxx_sham_addrs[] = {
142 {
143 .pa_start = 0x480a4000,
144 .pa_end = 0x480a4000 + 0x64 - 1,
145 .flags = ADDR_TYPE_RT
146 },
147 { }
148};
149
150static struct omap_hwmod_addr_space omap2xxx_aes_addrs[] = {
151 {
152 .pa_start = 0x480a6000,
153 .pa_end = 0x480a6000 + 0x50 - 1,
154 .flags = ADDR_TYPE_RT
155 },
156 { }
157};
158
141/* 159/*
142 * Common interconnect data 160 * Common interconnect data
143 */ 161 */
@@ -389,3 +407,21 @@ struct omap_hwmod_ocp_if omap2xxx_l4_core__rng = {
389 .addr = omap2_rng_addr_space, 407 .addr = omap2_rng_addr_space,
390 .user = OCP_USER_MPU | OCP_USER_SDMA, 408 .user = OCP_USER_MPU | OCP_USER_SDMA,
391}; 409};
410
411/* l4 core -> sham interface */
412struct omap_hwmod_ocp_if omap2xxx_l4_core__sham = {
413 .master = &omap2xxx_l4_core_hwmod,
414 .slave = &omap2xxx_sham_hwmod,
415 .clk = "sha_ick",
416 .addr = omap2xxx_sham_addrs,
417 .user = OCP_USER_MPU | OCP_USER_SDMA,
418};
419
420/* l4 core -> aes interface */
421struct omap_hwmod_ocp_if omap2xxx_l4_core__aes = {
422 .master = &omap2xxx_l4_core_hwmod,
423 .slave = &omap2xxx_aes_hwmod,
424 .clk = "aes_ick",
425 .addr = omap2xxx_aes_addrs,
426 .user = OCP_USER_MPU | OCP_USER_SDMA,
427};
diff --git a/arch/arm/mach-omap2/omap_hwmod_2xxx_ipblock_data.c b/arch/arm/mach-omap2/omap_hwmod_2xxx_ipblock_data.c
index e596117004d4..c8c64b3e1acc 100644
--- a/arch/arm/mach-omap2/omap_hwmod_2xxx_ipblock_data.c
+++ b/arch/arm/mach-omap2/omap_hwmod_2xxx_ipblock_data.c
@@ -864,3 +864,84 @@ struct omap_hwmod omap2xxx_rng_hwmod = {
864 .flags = HWMOD_INIT_NO_RESET, 864 .flags = HWMOD_INIT_NO_RESET,
865 .class = &omap2_rng_hwmod_class, 865 .class = &omap2_rng_hwmod_class,
866}; 866};
867
868/* SHAM */
869
870static struct omap_hwmod_class_sysconfig omap2_sham_sysc = {
871 .rev_offs = 0x5c,
872 .sysc_offs = 0x60,
873 .syss_offs = 0x64,
874 .sysc_flags = (SYSC_HAS_SOFTRESET | SYSC_HAS_AUTOIDLE |
875 SYSS_HAS_RESET_STATUS),
876 .sysc_fields = &omap_hwmod_sysc_type1,
877};
878
879static struct omap_hwmod_class omap2xxx_sham_class = {
880 .name = "sham",
881 .sysc = &omap2_sham_sysc,
882};
883
884static struct omap_hwmod_irq_info omap2_sham_mpu_irqs[] = {
885 { .irq = 51 + OMAP_INTC_START, },
886 { .irq = -1 }
887};
888
889static struct omap_hwmod_dma_info omap2_sham_sdma_chs[] = {
890 { .name = "rx", .dma_req = 13 },
891 { .dma_req = -1 }
892};
893
894struct omap_hwmod omap2xxx_sham_hwmod = {
895 .name = "sham",
896 .mpu_irqs = omap2_sham_mpu_irqs,
897 .sdma_reqs = omap2_sham_sdma_chs,
898 .main_clk = "l4_ck",
899 .prcm = {
900 .omap2 = {
901 .module_offs = CORE_MOD,
902 .prcm_reg_id = 4,
903 .module_bit = OMAP24XX_EN_SHA_SHIFT,
904 .idlest_reg_id = 4,
905 .idlest_idle_bit = OMAP24XX_ST_SHA_SHIFT,
906 },
907 },
908 .class = &omap2xxx_sham_class,
909};
910
911/* AES */
912
913static struct omap_hwmod_class_sysconfig omap2_aes_sysc = {
914 .rev_offs = 0x44,
915 .sysc_offs = 0x48,
916 .syss_offs = 0x4c,
917 .sysc_flags = (SYSC_HAS_SOFTRESET | SYSC_HAS_AUTOIDLE |
918 SYSS_HAS_RESET_STATUS),
919 .sysc_fields = &omap_hwmod_sysc_type1,
920};
921
922static struct omap_hwmod_class omap2xxx_aes_class = {
923 .name = "aes",
924 .sysc = &omap2_aes_sysc,
925};
926
927static struct omap_hwmod_dma_info omap2_aes_sdma_chs[] = {
928 { .name = "tx", .dma_req = 9 },
929 { .name = "rx", .dma_req = 10 },
930 { .dma_req = -1 }
931};
932
933struct omap_hwmod omap2xxx_aes_hwmod = {
934 .name = "aes",
935 .sdma_reqs = omap2_aes_sdma_chs,
936 .main_clk = "l4_ck",
937 .prcm = {
938 .omap2 = {
939 .module_offs = CORE_MOD,
940 .prcm_reg_id = 4,
941 .module_bit = OMAP24XX_EN_AES_SHIFT,
942 .idlest_reg_id = 4,
943 .idlest_idle_bit = OMAP24XX_ST_AES_SHIFT,
944 },
945 },
946 .class = &omap2xxx_aes_class,
947};
diff --git a/arch/arm/mach-omap2/omap_hwmod_33xx_data.c b/arch/arm/mach-omap2/omap_hwmod_33xx_data.c
index 31bea1ce3de1..01d8f324450a 100644
--- a/arch/arm/mach-omap2/omap_hwmod_33xx_data.c
+++ b/arch/arm/mach-omap2/omap_hwmod_33xx_data.c
@@ -418,8 +418,6 @@ static struct omap_hwmod am33xx_adc_tsc_hwmod = {
418 * - clkdiv32k 418 * - clkdiv32k
419 * - debugss 419 * - debugss
420 * - ocp watch point 420 * - ocp watch point
421 * - aes0
422 * - sha0
423 */ 421 */
424#if 0 422#if 0
425/* 423/*
@@ -500,25 +498,41 @@ static struct omap_hwmod am33xx_ocpwp_hwmod = {
500 }, 498 },
501 }, 499 },
502}; 500};
501#endif
503 502
504/* 503/*
505 * 'aes' class 504 * 'aes0' class
506 */ 505 */
507static struct omap_hwmod_class am33xx_aes_hwmod_class = { 506static struct omap_hwmod_class_sysconfig am33xx_aes0_sysc = {
508 .name = "aes", 507 .rev_offs = 0x80,
508 .sysc_offs = 0x84,
509 .syss_offs = 0x88,
510 .sysc_flags = SYSS_HAS_RESET_STATUS,
511};
512
513static struct omap_hwmod_class am33xx_aes0_hwmod_class = {
514 .name = "aes0",
515 .sysc = &am33xx_aes0_sysc,
509}; 516};
510 517
511static struct omap_hwmod_irq_info am33xx_aes0_irqs[] = { 518static struct omap_hwmod_irq_info am33xx_aes0_irqs[] = {
512 { .irq = 102 + OMAP_INTC_START, }, 519 { .irq = 103 + OMAP_INTC_START, },
513 { .irq = -1 }, 520 { .irq = -1 },
514}; 521};
515 522
523static struct omap_hwmod_dma_info am33xx_aes0_edma_reqs[] = {
524 { .name = "tx", .dma_req = 6, },
525 { .name = "rx", .dma_req = 5, },
526 { .dma_req = -1 }
527};
528
516static struct omap_hwmod am33xx_aes0_hwmod = { 529static struct omap_hwmod am33xx_aes0_hwmod = {
517 .name = "aes0", 530 .name = "aes",
518 .class = &am33xx_aes_hwmod_class, 531 .class = &am33xx_aes0_hwmod_class,
519 .clkdm_name = "l3_clkdm", 532 .clkdm_name = "l3_clkdm",
520 .mpu_irqs = am33xx_aes0_irqs, 533 .mpu_irqs = am33xx_aes0_irqs,
521 .main_clk = "l3_gclk", 534 .sdma_reqs = am33xx_aes0_edma_reqs,
535 .main_clk = "aes0_fck",
522 .prcm = { 536 .prcm = {
523 .omap4 = { 537 .omap4 = {
524 .clkctrl_offs = AM33XX_CM_PER_AES0_CLKCTRL_OFFSET, 538 .clkctrl_offs = AM33XX_CM_PER_AES0_CLKCTRL_OFFSET,
@@ -527,21 +541,35 @@ static struct omap_hwmod am33xx_aes0_hwmod = {
527 }, 541 },
528}; 542};
529 543
530/* sha0 */ 544/* sha0 HIB2 (the 'P' (public) device) */
545static struct omap_hwmod_class_sysconfig am33xx_sha0_sysc = {
546 .rev_offs = 0x100,
547 .sysc_offs = 0x110,
548 .syss_offs = 0x114,
549 .sysc_flags = SYSS_HAS_RESET_STATUS,
550};
551
531static struct omap_hwmod_class am33xx_sha0_hwmod_class = { 552static struct omap_hwmod_class am33xx_sha0_hwmod_class = {
532 .name = "sha0", 553 .name = "sha0",
554 .sysc = &am33xx_sha0_sysc,
533}; 555};
534 556
535static struct omap_hwmod_irq_info am33xx_sha0_irqs[] = { 557static struct omap_hwmod_irq_info am33xx_sha0_irqs[] = {
536 { .irq = 108 + OMAP_INTC_START, }, 558 { .irq = 109 + OMAP_INTC_START, },
537 { .irq = -1 }, 559 { .irq = -1 },
538}; 560};
539 561
562static struct omap_hwmod_dma_info am33xx_sha0_edma_reqs[] = {
563 { .name = "rx", .dma_req = 36, },
564 { .dma_req = -1 }
565};
566
540static struct omap_hwmod am33xx_sha0_hwmod = { 567static struct omap_hwmod am33xx_sha0_hwmod = {
541 .name = "sha0", 568 .name = "sham",
542 .class = &am33xx_sha0_hwmod_class, 569 .class = &am33xx_sha0_hwmod_class,
543 .clkdm_name = "l3_clkdm", 570 .clkdm_name = "l3_clkdm",
544 .mpu_irqs = am33xx_sha0_irqs, 571 .mpu_irqs = am33xx_sha0_irqs,
572 .sdma_reqs = am33xx_sha0_edma_reqs,
545 .main_clk = "l3_gclk", 573 .main_clk = "l3_gclk",
546 .prcm = { 574 .prcm = {
547 .omap4 = { 575 .omap4 = {
@@ -551,8 +579,6 @@ static struct omap_hwmod am33xx_sha0_hwmod = {
551 }, 579 },
552}; 580};
553 581
554#endif
555
556/* ocmcram */ 582/* ocmcram */
557static struct omap_hwmod_class am33xx_ocmcram_hwmod_class = { 583static struct omap_hwmod_class am33xx_ocmcram_hwmod_class = {
558 .name = "ocmcram", 584 .name = "ocmcram",
@@ -3449,6 +3475,42 @@ static struct omap_hwmod_ocp_if am33xx_l3_main__ocmc = {
3449 .user = OCP_USER_MPU | OCP_USER_SDMA, 3475 .user = OCP_USER_MPU | OCP_USER_SDMA,
3450}; 3476};
3451 3477
3478/* l3 main -> sha0 HIB2 */
3479static struct omap_hwmod_addr_space am33xx_sha0_addrs[] = {
3480 {
3481 .pa_start = 0x53100000,
3482 .pa_end = 0x53100000 + SZ_512 - 1,
3483 .flags = ADDR_TYPE_RT
3484 },
3485 { }
3486};
3487
3488static struct omap_hwmod_ocp_if am33xx_l3_main__sha0 = {
3489 .master = &am33xx_l3_main_hwmod,
3490 .slave = &am33xx_sha0_hwmod,
3491 .clk = "sha0_fck",
3492 .addr = am33xx_sha0_addrs,
3493 .user = OCP_USER_MPU | OCP_USER_SDMA,
3494};
3495
3496/* l3 main -> AES0 HIB2 */
3497static struct omap_hwmod_addr_space am33xx_aes0_addrs[] = {
3498 {
3499 .pa_start = 0x53500000,
3500 .pa_end = 0x53500000 + SZ_1M - 1,
3501 .flags = ADDR_TYPE_RT
3502 },
3503 { }
3504};
3505
3506static struct omap_hwmod_ocp_if am33xx_l3_main__aes0 = {
3507 .master = &am33xx_l3_main_hwmod,
3508 .slave = &am33xx_aes0_hwmod,
3509 .clk = "aes0_fck",
3510 .addr = am33xx_aes0_addrs,
3511 .user = OCP_USER_MPU | OCP_USER_SDMA,
3512};
3513
3452static struct omap_hwmod_ocp_if *am33xx_hwmod_ocp_ifs[] __initdata = { 3514static struct omap_hwmod_ocp_if *am33xx_hwmod_ocp_ifs[] __initdata = {
3453 &am33xx_l4_fw__emif_fw, 3515 &am33xx_l4_fw__emif_fw,
3454 &am33xx_l3_main__emif, 3516 &am33xx_l3_main__emif,
@@ -3529,6 +3591,8 @@ static struct omap_hwmod_ocp_if *am33xx_hwmod_ocp_ifs[] __initdata = {
3529 &am33xx_l3_s__usbss, 3591 &am33xx_l3_s__usbss,
3530 &am33xx_l4_hs__cpgmac0, 3592 &am33xx_l4_hs__cpgmac0,
3531 &am33xx_cpgmac0__mdio, 3593 &am33xx_cpgmac0__mdio,
3594 &am33xx_l3_main__sha0,
3595 &am33xx_l3_main__aes0,
3532 NULL, 3596 NULL,
3533}; 3597};
3534 3598
diff --git a/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c b/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c
index 5112d04e7b79..4083606ea1da 100644
--- a/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c
+++ b/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c
@@ -3550,6 +3550,132 @@ static struct omap_hwmod_ocp_if omap3xxx_l3_main__gpmc = {
3550 .user = OCP_USER_MPU | OCP_USER_SDMA, 3550 .user = OCP_USER_MPU | OCP_USER_SDMA,
3551}; 3551};
3552 3552
3553/* l4_core -> SHAM2 (SHA1/MD5) (similar to omap24xx) */
3554static struct omap_hwmod_sysc_fields omap3_sham_sysc_fields = {
3555 .sidle_shift = 4,
3556 .srst_shift = 1,
3557 .autoidle_shift = 0,
3558};
3559
3560static struct omap_hwmod_class_sysconfig omap3_sham_sysc = {
3561 .rev_offs = 0x5c,
3562 .sysc_offs = 0x60,
3563 .syss_offs = 0x64,
3564 .sysc_flags = (SYSC_HAS_SIDLEMODE | SYSC_HAS_SOFTRESET |
3565 SYSC_HAS_AUTOIDLE | SYSS_HAS_RESET_STATUS),
3566 .sysc_fields = &omap3_sham_sysc_fields,
3567};
3568
3569static struct omap_hwmod_class omap3xxx_sham_class = {
3570 .name = "sham",
3571 .sysc = &omap3_sham_sysc,
3572};
3573
3574static struct omap_hwmod_irq_info omap3_sham_mpu_irqs[] = {
3575 { .irq = 49 + OMAP_INTC_START, },
3576 { .irq = -1 }
3577};
3578
3579static struct omap_hwmod_dma_info omap3_sham_sdma_reqs[] = {
3580 { .name = "rx", .dma_req = OMAP34XX_DMA_SHA1MD5_RX, },
3581 { .dma_req = -1 }
3582};
3583
3584static struct omap_hwmod omap3xxx_sham_hwmod = {
3585 .name = "sham",
3586 .mpu_irqs = omap3_sham_mpu_irqs,
3587 .sdma_reqs = omap3_sham_sdma_reqs,
3588 .main_clk = "sha12_ick",
3589 .prcm = {
3590 .omap2 = {
3591 .module_offs = CORE_MOD,
3592 .prcm_reg_id = 1,
3593 .module_bit = OMAP3430_EN_SHA12_SHIFT,
3594 .idlest_reg_id = 1,
3595 .idlest_idle_bit = OMAP3430_ST_SHA12_SHIFT,
3596 },
3597 },
3598 .class = &omap3xxx_sham_class,
3599};
3600
3601static struct omap_hwmod_addr_space omap3xxx_sham_addrs[] = {
3602 {
3603 .pa_start = 0x480c3000,
3604 .pa_end = 0x480c3000 + 0x64 - 1,
3605 .flags = ADDR_TYPE_RT
3606 },
3607 { }
3608};
3609
3610static struct omap_hwmod_ocp_if omap3xxx_l4_core__sham = {
3611 .master = &omap3xxx_l4_core_hwmod,
3612 .slave = &omap3xxx_sham_hwmod,
3613 .clk = "sha12_ick",
3614 .addr = omap3xxx_sham_addrs,
3615 .user = OCP_USER_MPU | OCP_USER_SDMA,
3616};
3617
3618/* l4_core -> AES */
3619static struct omap_hwmod_sysc_fields omap3xxx_aes_sysc_fields = {
3620 .sidle_shift = 6,
3621 .srst_shift = 1,
3622 .autoidle_shift = 0,
3623};
3624
3625static struct omap_hwmod_class_sysconfig omap3_aes_sysc = {
3626 .rev_offs = 0x44,
3627 .sysc_offs = 0x48,
3628 .syss_offs = 0x4c,
3629 .sysc_flags = (SYSC_HAS_SIDLEMODE | SYSC_HAS_SOFTRESET |
3630 SYSC_HAS_AUTOIDLE | SYSS_HAS_RESET_STATUS),
3631 .idlemodes = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART),
3632 .sysc_fields = &omap3xxx_aes_sysc_fields,
3633};
3634
3635static struct omap_hwmod_class omap3xxx_aes_class = {
3636 .name = "aes",
3637 .sysc = &omap3_aes_sysc,
3638};
3639
3640static struct omap_hwmod_dma_info omap3_aes_sdma_reqs[] = {
3641 { .name = "tx", .dma_req = OMAP34XX_DMA_AES2_TX, },
3642 { .name = "rx", .dma_req = OMAP34XX_DMA_AES2_RX, },
3643 { .dma_req = -1 }
3644};
3645
3646static struct omap_hwmod omap3xxx_aes_hwmod = {
3647 .name = "aes",
3648 .sdma_reqs = omap3_aes_sdma_reqs,
3649 .main_clk = "aes2_ick",
3650 .prcm = {
3651 .omap2 = {
3652 .module_offs = CORE_MOD,
3653 .prcm_reg_id = 1,
3654 .module_bit = OMAP3430_EN_AES2_SHIFT,
3655 .idlest_reg_id = 1,
3656 .idlest_idle_bit = OMAP3430_ST_AES2_SHIFT,
3657 },
3658 },
3659 .class = &omap3xxx_aes_class,
3660};
3661
3662static struct omap_hwmod_addr_space omap3xxx_aes_addrs[] = {
3663 {
3664 .pa_start = 0x480c5000,
3665 .pa_end = 0x480c5000 + 0x50 - 1,
3666 .flags = ADDR_TYPE_RT
3667 },
3668 { }
3669};
3670
3671static struct omap_hwmod_ocp_if omap3xxx_l4_core__aes = {
3672 .master = &omap3xxx_l4_core_hwmod,
3673 .slave = &omap3xxx_aes_hwmod,
3674 .clk = "aes2_ick",
3675 .addr = omap3xxx_aes_addrs,
3676 .user = OCP_USER_MPU | OCP_USER_SDMA,
3677};
3678
3553static struct omap_hwmod_ocp_if *omap3xxx_hwmod_ocp_ifs[] __initdata = { 3679static struct omap_hwmod_ocp_if *omap3xxx_hwmod_ocp_ifs[] __initdata = {
3554 &omap3xxx_l3_main__l4_core, 3680 &omap3xxx_l3_main__l4_core,
3555 &omap3xxx_l3_main__l4_per, 3681 &omap3xxx_l3_main__l4_per,
@@ -3601,8 +3727,32 @@ static struct omap_hwmod_ocp_if *omap3xxx_hwmod_ocp_ifs[] __initdata = {
3601}; 3727};
3602 3728
3603/* GP-only hwmod links */ 3729/* GP-only hwmod links */
3604static struct omap_hwmod_ocp_if *omap3xxx_gp_hwmod_ocp_ifs[] __initdata = { 3730static struct omap_hwmod_ocp_if *omap34xx_gp_hwmod_ocp_ifs[] __initdata = {
3605 &omap3xxx_l4_sec__timer12, 3731 &omap3xxx_l4_sec__timer12,
3732 &omap3xxx_l4_core__sham,
3733 &omap3xxx_l4_core__aes,
3734 NULL
3735};
3736
3737static struct omap_hwmod_ocp_if *omap36xx_gp_hwmod_ocp_ifs[] __initdata = {
3738 &omap3xxx_l4_sec__timer12,
3739 &omap3xxx_l4_core__sham,
3740 &omap3xxx_l4_core__aes,
3741 NULL
3742};
3743
3744static struct omap_hwmod_ocp_if *am35xx_gp_hwmod_ocp_ifs[] __initdata = {
3745 &omap3xxx_l4_sec__timer12,
3746 /*
3747 * Apparently the SHA/MD5 and AES accelerator IP blocks are
3748 * only present on some AM35xx chips, and no one knows which
3749 * ones. See
3750 * http://www.spinics.net/lists/arm-kernel/msg215466.html So
3751 * if you need these IP blocks on an AM35xx, try uncommenting
3752 * the following lines.
3753 */
3754 /* &omap3xxx_l4_core__sham, */
3755 /* &omap3xxx_l4_core__aes, */
3606 NULL 3756 NULL
3607}; 3757};
3608 3758
@@ -3709,7 +3859,7 @@ static struct omap_hwmod_ocp_if *omap3xxx_dss_hwmod_ocp_ifs[] __initdata = {
3709int __init omap3xxx_hwmod_init(void) 3859int __init omap3xxx_hwmod_init(void)
3710{ 3860{
3711 int r; 3861 int r;
3712 struct omap_hwmod_ocp_if **h = NULL; 3862 struct omap_hwmod_ocp_if **h = NULL, **h_gp = NULL;
3713 unsigned int rev; 3863 unsigned int rev;
3714 3864
3715 omap_hwmod_init(); 3865 omap_hwmod_init();
@@ -3719,13 +3869,6 @@ int __init omap3xxx_hwmod_init(void)
3719 if (r < 0) 3869 if (r < 0)
3720 return r; 3870 return r;
3721 3871
3722 /* Register GP-only hwmod links. */
3723 if (omap_type() == OMAP2_DEVICE_TYPE_GP) {
3724 r = omap_hwmod_register_links(omap3xxx_gp_hwmod_ocp_ifs);
3725 if (r < 0)
3726 return r;
3727 }
3728
3729 rev = omap_rev(); 3872 rev = omap_rev();
3730 3873
3731 /* 3874 /*
@@ -3737,11 +3880,14 @@ int __init omap3xxx_hwmod_init(void)
3737 rev == OMAP3430_REV_ES2_1 || rev == OMAP3430_REV_ES3_0 || 3880 rev == OMAP3430_REV_ES2_1 || rev == OMAP3430_REV_ES3_0 ||
3738 rev == OMAP3430_REV_ES3_1 || rev == OMAP3430_REV_ES3_1_2) { 3881 rev == OMAP3430_REV_ES3_1 || rev == OMAP3430_REV_ES3_1_2) {
3739 h = omap34xx_hwmod_ocp_ifs; 3882 h = omap34xx_hwmod_ocp_ifs;
3883 h_gp = omap34xx_gp_hwmod_ocp_ifs;
3740 } else if (rev == AM35XX_REV_ES1_0 || rev == AM35XX_REV_ES1_1) { 3884 } else if (rev == AM35XX_REV_ES1_0 || rev == AM35XX_REV_ES1_1) {
3741 h = am35xx_hwmod_ocp_ifs; 3885 h = am35xx_hwmod_ocp_ifs;
3886 h_gp = am35xx_gp_hwmod_ocp_ifs;
3742 } else if (rev == OMAP3630_REV_ES1_0 || rev == OMAP3630_REV_ES1_1 || 3887 } else if (rev == OMAP3630_REV_ES1_0 || rev == OMAP3630_REV_ES1_1 ||
3743 rev == OMAP3630_REV_ES1_2) { 3888 rev == OMAP3630_REV_ES1_2) {
3744 h = omap36xx_hwmod_ocp_ifs; 3889 h = omap36xx_hwmod_ocp_ifs;
3890 h_gp = omap36xx_gp_hwmod_ocp_ifs;
3745 } else { 3891 } else {
3746 WARN(1, "OMAP3 hwmod family init: unknown chip type\n"); 3892 WARN(1, "OMAP3 hwmod family init: unknown chip type\n");
3747 return -EINVAL; 3893 return -EINVAL;
@@ -3751,6 +3897,14 @@ int __init omap3xxx_hwmod_init(void)
3751 if (r < 0) 3897 if (r < 0)
3752 return r; 3898 return r;
3753 3899
3900 /* Register GP-only hwmod links. */
3901 if (h_gp && omap_type() == OMAP2_DEVICE_TYPE_GP) {
3902 r = omap_hwmod_register_links(h_gp);
3903 if (r < 0)
3904 return r;
3905 }
3906
3907
3754 /* 3908 /*
3755 * Register hwmod links specific to certain ES levels of a 3909 * Register hwmod links specific to certain ES levels of a
3756 * particular family of silicon (e.g., 34xx ES1.0) 3910 * particular family of silicon (e.g., 34xx ES1.0)
diff --git a/arch/arm/mach-omap2/omap_hwmod_common_data.h b/arch/arm/mach-omap2/omap_hwmod_common_data.h
index cfcce299177c..6e04ff7065e1 100644
--- a/arch/arm/mach-omap2/omap_hwmod_common_data.h
+++ b/arch/arm/mach-omap2/omap_hwmod_common_data.h
@@ -78,6 +78,8 @@ extern struct omap_hwmod omap2xxx_mcspi2_hwmod;
78extern struct omap_hwmod omap2xxx_counter_32k_hwmod; 78extern struct omap_hwmod omap2xxx_counter_32k_hwmod;
79extern struct omap_hwmod omap2xxx_gpmc_hwmod; 79extern struct omap_hwmod omap2xxx_gpmc_hwmod;
80extern struct omap_hwmod omap2xxx_rng_hwmod; 80extern struct omap_hwmod omap2xxx_rng_hwmod;
81extern struct omap_hwmod omap2xxx_sham_hwmod;
82extern struct omap_hwmod omap2xxx_aes_hwmod;
81 83
82/* Common interface data across OMAP2xxx */ 84/* Common interface data across OMAP2xxx */
83extern struct omap_hwmod_ocp_if omap2xxx_l3_main__l4_core; 85extern struct omap_hwmod_ocp_if omap2xxx_l3_main__l4_core;
@@ -105,6 +107,8 @@ extern struct omap_hwmod_ocp_if omap2xxx_l4_core__dss_dispc;
105extern struct omap_hwmod_ocp_if omap2xxx_l4_core__dss_rfbi; 107extern struct omap_hwmod_ocp_if omap2xxx_l4_core__dss_rfbi;
106extern struct omap_hwmod_ocp_if omap2xxx_l4_core__dss_venc; 108extern struct omap_hwmod_ocp_if omap2xxx_l4_core__dss_venc;
107extern struct omap_hwmod_ocp_if omap2xxx_l4_core__rng; 109extern struct omap_hwmod_ocp_if omap2xxx_l4_core__rng;
110extern struct omap_hwmod_ocp_if omap2xxx_l4_core__sham;
111extern struct omap_hwmod_ocp_if omap2xxx_l4_core__aes;
108 112
109/* Common IP block data */ 113/* Common IP block data */
110extern struct omap_hwmod_dma_info omap2_uart1_sdma_reqs[]; 114extern struct omap_hwmod_dma_info omap2_uart1_sdma_reqs[];