Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
omap_hwmod_2xxx_ipblock_data.c
Go to the documentation of this file.
1 /*
2  * omap_hwmod_2xxx_ipblock_data.c - common IP block data for OMAP2xxx
3  *
4  * Copyright (C) 2011 Nokia Corporation
5  * Paul Walmsley
6  *
7  * This program is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License version 2 as
9  * published by the Free Software Foundation.
10  */
11 #include <plat/omap_hwmod.h>
12 #include <plat/serial.h>
14 #include <plat/dma.h>
15 #include <plat/dmtimer.h>
17 
18 #include "omap_hwmod_common_data.h"
19 #include "cm-regbits-24xx.h"
20 #include "prm-regbits-24xx.h"
21 #include "wd_timer.h"
22 
24  { .irq = 48 + OMAP_INTC_START, },
25  { .irq = -1 },
26 };
27 
29  { .name = "dispc", .dma_req = 5 },
30  { .dma_req = -1 }
31 };
32 
33 /*
34  * 'dispc' class
35  * display controller
36  */
37 
38 static struct omap_hwmod_class_sysconfig omap2_dispc_sysc = {
39  .rev_offs = 0x0000,
40  .sysc_offs = 0x0010,
41  .syss_offs = 0x0014,
42  .sysc_flags = (SYSC_HAS_SIDLEMODE | SYSC_HAS_MIDLEMODE |
46  .sysc_fields = &omap_hwmod_sysc_type1,
47 };
48 
50  .name = "dispc",
51  .sysc = &omap2_dispc_sysc,
52 };
53 
54 /* OMAP2xxx Timer Common */
55 static struct omap_hwmod_class_sysconfig omap2xxx_timer_sysc = {
56  .rev_offs = 0x0000,
57  .sysc_offs = 0x0010,
58  .syss_offs = 0x0014,
63  .sysc_fields = &omap_hwmod_sysc_type1,
64 };
65 
67  .name = "timer",
68  .sysc = &omap2xxx_timer_sysc,
69 };
70 
71 /*
72  * 'wd_timer' class
73  * 32-bit watchdog upward counter that generates a pulse on the reset pin on
74  * overflow condition
75  */
76 
77 static struct omap_hwmod_class_sysconfig omap2xxx_wd_timer_sysc = {
78  .rev_offs = 0x0000,
79  .sysc_offs = 0x0010,
80  .syss_offs = 0x0014,
81  .sysc_flags = (SYSC_HAS_EMUFREE | SYSC_HAS_SOFTRESET |
84 };
85 
87  .name = "wd_timer",
88  .sysc = &omap2xxx_wd_timer_sysc,
89  .pre_shutdown = &omap2_wd_timer_disable,
90  .reset = &omap2_wd_timer_reset,
91 };
92 
93 /*
94  * 'gpio' class
95  * general purpose io module
96  */
97 static struct omap_hwmod_class_sysconfig omap2xxx_gpio_sysc = {
98  .rev_offs = 0x0000,
99  .sysc_offs = 0x0010,
100  .syss_offs = 0x0014,
101  .sysc_flags = (SYSC_HAS_ENAWAKEUP | SYSC_HAS_SIDLEMODE |
105  .sysc_fields = &omap_hwmod_sysc_type1,
106 };
107 
109  .name = "gpio",
110  .sysc = &omap2xxx_gpio_sysc,
111  .rev = 0,
112 };
113 
114 /* system dma */
115 static struct omap_hwmod_class_sysconfig omap2xxx_dma_sysc = {
116  .rev_offs = 0x0000,
117  .sysc_offs = 0x002c,
118  .syss_offs = 0x0028,
119  .sysc_flags = (SYSC_HAS_SOFTRESET | SYSC_HAS_MIDLEMODE |
123  .sysc_fields = &omap_hwmod_sysc_type1,
124 };
125 
127  .name = "dma",
128  .sysc = &omap2xxx_dma_sysc,
129 };
130 
131 /*
132  * 'mailbox' class
133  * mailbox module allowing communication between the on-chip processors
134  * using a queued mailbox-interrupt mechanism.
135  */
136 
137 static struct omap_hwmod_class_sysconfig omap2xxx_mailbox_sysc = {
138  .rev_offs = 0x000,
139  .sysc_offs = 0x010,
140  .syss_offs = 0x014,
141  .sysc_flags = (SYSC_HAS_CLOCKACTIVITY | SYSC_HAS_SIDLEMODE |
144  .sysc_fields = &omap_hwmod_sysc_type1,
145 };
146 
148  .name = "mailbox",
149  .sysc = &omap2xxx_mailbox_sysc,
150 };
151 
152 /*
153  * 'mcspi' class
154  * multichannel serial port interface (mcspi) / master/slave synchronous serial
155  * bus
156  */
157 
158 static struct omap_hwmod_class_sysconfig omap2xxx_mcspi_sysc = {
159  .rev_offs = 0x0000,
160  .sysc_offs = 0x0010,
161  .syss_offs = 0x0014,
162  .sysc_flags = (SYSC_HAS_CLOCKACTIVITY | SYSC_HAS_SIDLEMODE |
166  .sysc_fields = &omap_hwmod_sysc_type1,
167 };
168 
170  .name = "mcspi",
171  .sysc = &omap2xxx_mcspi_sysc,
172  .rev = OMAP2_MCSPI_REV,
173 };
174 
175 /*
176  * 'gpmc' class
177  * general purpose memory controller
178  */
179 
180 static struct omap_hwmod_class_sysconfig omap2xxx_gpmc_sysc = {
181  .rev_offs = 0x0000,
182  .sysc_offs = 0x0010,
183  .syss_offs = 0x0014,
184  .sysc_flags = (SYSC_HAS_AUTOIDLE | SYSC_HAS_SIDLEMODE |
187  .sysc_fields = &omap_hwmod_sysc_type1,
188 };
189 
190 static struct omap_hwmod_class omap2xxx_gpmc_hwmod_class = {
191  .name = "gpmc",
192  .sysc = &omap2xxx_gpmc_sysc,
193 };
194 
195 /*
196  * IP blocks
197  */
198 
199 /* L3 */
201  .name = "l3_main",
202  .class = &l3_hwmod_class,
203  .flags = HWMOD_NO_IDLEST,
204 };
205 
206 /* L4 CORE */
208  .name = "l4_core",
209  .class = &l4_hwmod_class,
210  .flags = HWMOD_NO_IDLEST,
211 };
212 
213 /* L4 WKUP */
215  .name = "l4_wkup",
216  .class = &l4_hwmod_class,
217  .flags = HWMOD_NO_IDLEST,
218 };
219 
220 /* MPU */
221 static struct omap_hwmod_irq_info omap2xxx_mpu_irqs[] = {
222  { .name = "pmu", .irq = 3 + OMAP_INTC_START },
223  { .irq = -1 }
224 };
225 
227  .name = "mpu",
228  .mpu_irqs = omap2xxx_mpu_irqs,
229  .class = &mpu_hwmod_class,
230  .main_clk = "mpu_ck",
231 };
232 
233 /* IVA2 */
235  .name = "iva",
236  .class = &iva_hwmod_class,
237 };
238 
239 /* always-on timers dev attribute */
240 static struct omap_timer_capability_dev_attr capability_alwon_dev_attr = {
241  .timer_capability = OMAP_TIMER_ALWON,
242 };
243 
244 /* pwm timers dev attribute */
245 static struct omap_timer_capability_dev_attr capability_pwm_dev_attr = {
246  .timer_capability = OMAP_TIMER_HAS_PWM,
247 };
248 
249 /* timers with DSP interrupt dev attribute */
250 static struct omap_timer_capability_dev_attr capability_dsp_dev_attr = {
251  .timer_capability = OMAP_TIMER_HAS_DSP_IRQ,
252 };
253 
254 /* timer1 */
255 
257  .name = "timer1",
258  .mpu_irqs = omap2_timer1_mpu_irqs,
259  .main_clk = "gpt1_fck",
260  .prcm = {
261  .omap2 = {
262  .prcm_reg_id = 1,
263  .module_bit = OMAP24XX_EN_GPT1_SHIFT,
264  .module_offs = WKUP_MOD,
265  .idlest_reg_id = 1,
266  .idlest_idle_bit = OMAP24XX_ST_GPT1_SHIFT,
267  },
268  },
269  .dev_attr = &capability_alwon_dev_attr,
270  .class = &omap2xxx_timer_hwmod_class,
271 };
272 
273 /* timer2 */
274 
276  .name = "timer2",
277  .mpu_irqs = omap2_timer2_mpu_irqs,
278  .main_clk = "gpt2_fck",
279  .prcm = {
280  .omap2 = {
281  .prcm_reg_id = 1,
282  .module_bit = OMAP24XX_EN_GPT2_SHIFT,
283  .module_offs = CORE_MOD,
284  .idlest_reg_id = 1,
285  .idlest_idle_bit = OMAP24XX_ST_GPT2_SHIFT,
286  },
287  },
288  .class = &omap2xxx_timer_hwmod_class,
289 };
290 
291 /* timer3 */
292 
294  .name = "timer3",
295  .mpu_irqs = omap2_timer3_mpu_irqs,
296  .main_clk = "gpt3_fck",
297  .prcm = {
298  .omap2 = {
299  .prcm_reg_id = 1,
300  .module_bit = OMAP24XX_EN_GPT3_SHIFT,
301  .module_offs = CORE_MOD,
302  .idlest_reg_id = 1,
303  .idlest_idle_bit = OMAP24XX_ST_GPT3_SHIFT,
304  },
305  },
306  .class = &omap2xxx_timer_hwmod_class,
307 };
308 
309 /* timer4 */
310 
312  .name = "timer4",
313  .mpu_irqs = omap2_timer4_mpu_irqs,
314  .main_clk = "gpt4_fck",
315  .prcm = {
316  .omap2 = {
317  .prcm_reg_id = 1,
318  .module_bit = OMAP24XX_EN_GPT4_SHIFT,
319  .module_offs = CORE_MOD,
320  .idlest_reg_id = 1,
321  .idlest_idle_bit = OMAP24XX_ST_GPT4_SHIFT,
322  },
323  },
324  .class = &omap2xxx_timer_hwmod_class,
325 };
326 
327 /* timer5 */
328 
330  .name = "timer5",
331  .mpu_irqs = omap2_timer5_mpu_irqs,
332  .main_clk = "gpt5_fck",
333  .prcm = {
334  .omap2 = {
335  .prcm_reg_id = 1,
336  .module_bit = OMAP24XX_EN_GPT5_SHIFT,
337  .module_offs = CORE_MOD,
338  .idlest_reg_id = 1,
339  .idlest_idle_bit = OMAP24XX_ST_GPT5_SHIFT,
340  },
341  },
342  .dev_attr = &capability_dsp_dev_attr,
343  .class = &omap2xxx_timer_hwmod_class,
344 };
345 
346 /* timer6 */
347 
349  .name = "timer6",
350  .mpu_irqs = omap2_timer6_mpu_irqs,
351  .main_clk = "gpt6_fck",
352  .prcm = {
353  .omap2 = {
354  .prcm_reg_id = 1,
355  .module_bit = OMAP24XX_EN_GPT6_SHIFT,
356  .module_offs = CORE_MOD,
357  .idlest_reg_id = 1,
358  .idlest_idle_bit = OMAP24XX_ST_GPT6_SHIFT,
359  },
360  },
361  .dev_attr = &capability_dsp_dev_attr,
362  .class = &omap2xxx_timer_hwmod_class,
363 };
364 
365 /* timer7 */
366 
368  .name = "timer7",
369  .mpu_irqs = omap2_timer7_mpu_irqs,
370  .main_clk = "gpt7_fck",
371  .prcm = {
372  .omap2 = {
373  .prcm_reg_id = 1,
374  .module_bit = OMAP24XX_EN_GPT7_SHIFT,
375  .module_offs = CORE_MOD,
376  .idlest_reg_id = 1,
377  .idlest_idle_bit = OMAP24XX_ST_GPT7_SHIFT,
378  },
379  },
380  .dev_attr = &capability_dsp_dev_attr,
381  .class = &omap2xxx_timer_hwmod_class,
382 };
383 
384 /* timer8 */
385 
387  .name = "timer8",
388  .mpu_irqs = omap2_timer8_mpu_irqs,
389  .main_clk = "gpt8_fck",
390  .prcm = {
391  .omap2 = {
392  .prcm_reg_id = 1,
393  .module_bit = OMAP24XX_EN_GPT8_SHIFT,
394  .module_offs = CORE_MOD,
395  .idlest_reg_id = 1,
396  .idlest_idle_bit = OMAP24XX_ST_GPT8_SHIFT,
397  },
398  },
399  .dev_attr = &capability_dsp_dev_attr,
400  .class = &omap2xxx_timer_hwmod_class,
401 };
402 
403 /* timer9 */
404 
406  .name = "timer9",
407  .mpu_irqs = omap2_timer9_mpu_irqs,
408  .main_clk = "gpt9_fck",
409  .prcm = {
410  .omap2 = {
411  .prcm_reg_id = 1,
412  .module_bit = OMAP24XX_EN_GPT9_SHIFT,
413  .module_offs = CORE_MOD,
414  .idlest_reg_id = 1,
415  .idlest_idle_bit = OMAP24XX_ST_GPT9_SHIFT,
416  },
417  },
418  .dev_attr = &capability_pwm_dev_attr,
419  .class = &omap2xxx_timer_hwmod_class,
420 };
421 
422 /* timer10 */
423 
425  .name = "timer10",
426  .mpu_irqs = omap2_timer10_mpu_irqs,
427  .main_clk = "gpt10_fck",
428  .prcm = {
429  .omap2 = {
430  .prcm_reg_id = 1,
431  .module_bit = OMAP24XX_EN_GPT10_SHIFT,
432  .module_offs = CORE_MOD,
433  .idlest_reg_id = 1,
434  .idlest_idle_bit = OMAP24XX_ST_GPT10_SHIFT,
435  },
436  },
437  .dev_attr = &capability_pwm_dev_attr,
438  .class = &omap2xxx_timer_hwmod_class,
439 };
440 
441 /* timer11 */
442 
444  .name = "timer11",
445  .mpu_irqs = omap2_timer11_mpu_irqs,
446  .main_clk = "gpt11_fck",
447  .prcm = {
448  .omap2 = {
449  .prcm_reg_id = 1,
450  .module_bit = OMAP24XX_EN_GPT11_SHIFT,
451  .module_offs = CORE_MOD,
452  .idlest_reg_id = 1,
453  .idlest_idle_bit = OMAP24XX_ST_GPT11_SHIFT,
454  },
455  },
456  .dev_attr = &capability_pwm_dev_attr,
457  .class = &omap2xxx_timer_hwmod_class,
458 };
459 
460 /* timer12 */
461 
463  .name = "timer12",
464  .mpu_irqs = omap2xxx_timer12_mpu_irqs,
465  .main_clk = "gpt12_fck",
466  .prcm = {
467  .omap2 = {
468  .prcm_reg_id = 1,
469  .module_bit = OMAP24XX_EN_GPT12_SHIFT,
470  .module_offs = CORE_MOD,
471  .idlest_reg_id = 1,
472  .idlest_idle_bit = OMAP24XX_ST_GPT12_SHIFT,
473  },
474  },
475  .dev_attr = &capability_pwm_dev_attr,
476  .class = &omap2xxx_timer_hwmod_class,
477 };
478 
479 /* wd_timer2 */
481  .name = "wd_timer2",
483  .main_clk = "mpu_wdt_fck",
484  .prcm = {
485  .omap2 = {
486  .prcm_reg_id = 1,
487  .module_bit = OMAP24XX_EN_MPU_WDT_SHIFT,
488  .module_offs = WKUP_MOD,
489  .idlest_reg_id = 1,
490  .idlest_idle_bit = OMAP24XX_ST_MPU_WDT_SHIFT,
491  },
492  },
493 };
494 
495 /* UART1 */
496 
498  .name = "uart1",
499  .mpu_irqs = omap2_uart1_mpu_irqs,
500  .sdma_reqs = omap2_uart1_sdma_reqs,
501  .main_clk = "uart1_fck",
502  .prcm = {
503  .omap2 = {
504  .module_offs = CORE_MOD,
505  .prcm_reg_id = 1,
506  .module_bit = OMAP24XX_EN_UART1_SHIFT,
507  .idlest_reg_id = 1,
508  .idlest_idle_bit = OMAP24XX_EN_UART1_SHIFT,
509  },
510  },
511  .class = &omap2_uart_class,
512 };
513 
514 /* UART2 */
515 
517  .name = "uart2",
518  .mpu_irqs = omap2_uart2_mpu_irqs,
519  .sdma_reqs = omap2_uart2_sdma_reqs,
520  .main_clk = "uart2_fck",
521  .prcm = {
522  .omap2 = {
523  .module_offs = CORE_MOD,
524  .prcm_reg_id = 1,
525  .module_bit = OMAP24XX_EN_UART2_SHIFT,
526  .idlest_reg_id = 1,
527  .idlest_idle_bit = OMAP24XX_EN_UART2_SHIFT,
528  },
529  },
530  .class = &omap2_uart_class,
531 };
532 
533 /* UART3 */
534 
536  .name = "uart3",
537  .mpu_irqs = omap2_uart3_mpu_irqs,
538  .sdma_reqs = omap2_uart3_sdma_reqs,
539  .main_clk = "uart3_fck",
540  .prcm = {
541  .omap2 = {
542  .module_offs = CORE_MOD,
543  .prcm_reg_id = 2,
544  .module_bit = OMAP24XX_EN_UART3_SHIFT,
545  .idlest_reg_id = 2,
546  .idlest_idle_bit = OMAP24XX_EN_UART3_SHIFT,
547  },
548  },
549  .class = &omap2_uart_class,
550 };
551 
552 /* dss */
553 
554 static struct omap_hwmod_opt_clk dss_opt_clks[] = {
555  /*
556  * The DSS HW needs all DSS clocks enabled during reset. The dss_core
557  * driver does not use these clocks.
558  */
559  { .role = "tv_clk", .clk = "dss_54m_fck" },
560  { .role = "sys_clk", .clk = "dss2_fck" },
561 };
562 
564  .name = "dss_core",
565  .class = &omap2_dss_hwmod_class,
566  .main_clk = "dss1_fck", /* instead of dss_fck */
567  .sdma_reqs = omap2xxx_dss_sdma_chs,
568  .prcm = {
569  .omap2 = {
570  .prcm_reg_id = 1,
571  .module_bit = OMAP24XX_EN_DSS1_SHIFT,
572  .module_offs = CORE_MOD,
573  .idlest_reg_id = 1,
574  .idlest_stdby_bit = OMAP24XX_ST_DSS_SHIFT,
575  },
576  },
577  .opt_clks = dss_opt_clks,
578  .opt_clks_cnt = ARRAY_SIZE(dss_opt_clks),
580 };
581 
583  .name = "dss_dispc",
584  .class = &omap2_dispc_hwmod_class,
585  .mpu_irqs = omap2_dispc_irqs,
586  .main_clk = "dss1_fck",
587  .prcm = {
588  .omap2 = {
589  .prcm_reg_id = 1,
590  .module_bit = OMAP24XX_EN_DSS1_SHIFT,
591  .module_offs = CORE_MOD,
592  .idlest_reg_id = 1,
593  .idlest_stdby_bit = OMAP24XX_ST_DSS_SHIFT,
594  },
595  },
596  .flags = HWMOD_NO_IDLEST,
597  .dev_attr = &omap2_3_dss_dispc_dev_attr
598 };
599 
600 static struct omap_hwmod_opt_clk dss_rfbi_opt_clks[] = {
601  { .role = "ick", .clk = "dss_ick" },
602 };
603 
605  .name = "dss_rfbi",
606  .class = &omap2_rfbi_hwmod_class,
607  .main_clk = "dss1_fck",
608  .prcm = {
609  .omap2 = {
610  .prcm_reg_id = 1,
611  .module_bit = OMAP24XX_EN_DSS1_SHIFT,
612  .module_offs = CORE_MOD,
613  },
614  },
615  .opt_clks = dss_rfbi_opt_clks,
616  .opt_clks_cnt = ARRAY_SIZE(dss_rfbi_opt_clks),
617  .flags = HWMOD_NO_IDLEST,
618 };
619 
621  .name = "dss_venc",
622  .class = &omap2_venc_hwmod_class,
623  .main_clk = "dss_54m_fck",
624  .prcm = {
625  .omap2 = {
626  .prcm_reg_id = 1,
627  .module_bit = OMAP24XX_EN_DSS1_SHIFT,
628  .module_offs = CORE_MOD,
629  },
630  },
631  .flags = HWMOD_NO_IDLEST,
632 };
633 
634 /* gpio dev_attr */
636  .bank_width = 32,
637  .dbck_flag = false,
638 };
639 
640 /* gpio1 */
642  .name = "gpio1",
644  .mpu_irqs = omap2_gpio1_irqs,
645  .main_clk = "gpios_fck",
646  .prcm = {
647  .omap2 = {
648  .prcm_reg_id = 1,
649  .module_bit = OMAP24XX_EN_GPIOS_SHIFT,
650  .module_offs = WKUP_MOD,
651  .idlest_reg_id = 1,
652  .idlest_idle_bit = OMAP24XX_ST_GPIOS_SHIFT,
653  },
654  },
655  .class = &omap2xxx_gpio_hwmod_class,
656  .dev_attr = &omap2xxx_gpio_dev_attr,
657 };
658 
659 /* gpio2 */
661  .name = "gpio2",
663  .mpu_irqs = omap2_gpio2_irqs,
664  .main_clk = "gpios_fck",
665  .prcm = {
666  .omap2 = {
667  .prcm_reg_id = 1,
668  .module_bit = OMAP24XX_EN_GPIOS_SHIFT,
669  .module_offs = WKUP_MOD,
670  .idlest_reg_id = 1,
671  .idlest_idle_bit = OMAP24XX_ST_GPIOS_SHIFT,
672  },
673  },
674  .class = &omap2xxx_gpio_hwmod_class,
675  .dev_attr = &omap2xxx_gpio_dev_attr,
676 };
677 
678 /* gpio3 */
680  .name = "gpio3",
682  .mpu_irqs = omap2_gpio3_irqs,
683  .main_clk = "gpios_fck",
684  .prcm = {
685  .omap2 = {
686  .prcm_reg_id = 1,
687  .module_bit = OMAP24XX_EN_GPIOS_SHIFT,
688  .module_offs = WKUP_MOD,
689  .idlest_reg_id = 1,
690  .idlest_idle_bit = OMAP24XX_ST_GPIOS_SHIFT,
691  },
692  },
693  .class = &omap2xxx_gpio_hwmod_class,
694  .dev_attr = &omap2xxx_gpio_dev_attr,
695 };
696 
697 /* gpio4 */
699  .name = "gpio4",
701  .mpu_irqs = omap2_gpio4_irqs,
702  .main_clk = "gpios_fck",
703  .prcm = {
704  .omap2 = {
705  .prcm_reg_id = 1,
706  .module_bit = OMAP24XX_EN_GPIOS_SHIFT,
707  .module_offs = WKUP_MOD,
708  .idlest_reg_id = 1,
709  .idlest_idle_bit = OMAP24XX_ST_GPIOS_SHIFT,
710  },
711  },
712  .class = &omap2xxx_gpio_hwmod_class,
713  .dev_attr = &omap2xxx_gpio_dev_attr,
714 };
715 
716 /* mcspi1 */
717 static struct omap2_mcspi_dev_attr omap_mcspi1_dev_attr = {
718  .num_chipselect = 4,
719 };
720 
722  .name = "mcspi1",
723  .mpu_irqs = omap2_mcspi1_mpu_irqs,
724  .sdma_reqs = omap2_mcspi1_sdma_reqs,
725  .main_clk = "mcspi1_fck",
726  .prcm = {
727  .omap2 = {
728  .module_offs = CORE_MOD,
729  .prcm_reg_id = 1,
730  .module_bit = OMAP24XX_EN_MCSPI1_SHIFT,
731  .idlest_reg_id = 1,
732  .idlest_idle_bit = OMAP24XX_ST_MCSPI1_SHIFT,
733  },
734  },
735  .class = &omap2xxx_mcspi_class,
736  .dev_attr = &omap_mcspi1_dev_attr,
737 };
738 
739 /* mcspi2 */
740 static struct omap2_mcspi_dev_attr omap_mcspi2_dev_attr = {
741  .num_chipselect = 2,
742 };
743 
745  .name = "mcspi2",
746  .mpu_irqs = omap2_mcspi2_mpu_irqs,
747  .sdma_reqs = omap2_mcspi2_sdma_reqs,
748  .main_clk = "mcspi2_fck",
749  .prcm = {
750  .omap2 = {
751  .module_offs = CORE_MOD,
752  .prcm_reg_id = 1,
753  .module_bit = OMAP24XX_EN_MCSPI2_SHIFT,
754  .idlest_reg_id = 1,
755  .idlest_idle_bit = OMAP24XX_ST_MCSPI2_SHIFT,
756  },
757  },
758  .class = &omap2xxx_mcspi_class,
759  .dev_attr = &omap_mcspi2_dev_attr,
760 };
761 
762 static struct omap_hwmod_class omap2xxx_counter_hwmod_class = {
763  .name = "counter",
764 };
765 
767  .name = "counter_32k",
768  .main_clk = "func_32k_ck",
769  .prcm = {
770  .omap2 = {
771  .module_offs = WKUP_MOD,
772  .prcm_reg_id = 1,
773  .module_bit = OMAP24XX_ST_32KSYNC_SHIFT,
774  .idlest_reg_id = 1,
775  .idlest_idle_bit = OMAP24XX_ST_32KSYNC_SHIFT,
776  },
777  },
778  .class = &omap2xxx_counter_hwmod_class,
779 };
780 
781 /* gpmc */
782 static struct omap_hwmod_irq_info omap2xxx_gpmc_irqs[] = {
783  { .irq = 20 },
784  { .irq = -1 }
785 };
786 
788  .name = "gpmc",
789  .class = &omap2xxx_gpmc_hwmod_class,
790  .mpu_irqs = omap2xxx_gpmc_irqs,
791  .main_clk = "gpmc_fck",
792  /*
793  * XXX HWMOD_INIT_NO_RESET should not be needed for this IP
794  * block. It is not being added due to any known bugs with
795  * resetting the GPMC IP block, but rather because any timings
796  * set by the bootloader are not being correctly programmed by
797  * the kernel from the board file or DT data.
798  * HWMOD_INIT_NO_RESET should be removed ASAP.
799  */
802  .prcm = {
803  .omap2 = {
804  .prcm_reg_id = 3,
805  .module_bit = OMAP24XX_EN_GPMC_MASK,
806  .module_offs = CORE_MOD,
807  },
808  },
809 };
810 
811 /* RNG */
812 
813 static struct omap_hwmod_class_sysconfig omap2_rng_sysc = {
814  .rev_offs = 0x3c,
815  .sysc_offs = 0x40,
816  .syss_offs = 0x44,
817  .sysc_flags = (SYSC_HAS_SOFTRESET | SYSC_HAS_AUTOIDLE |
820 };
821 
822 static struct omap_hwmod_class omap2_rng_hwmod_class = {
823  .name = "rng",
824  .sysc = &omap2_rng_sysc,
825 };
826 
827 static struct omap_hwmod_irq_info omap2_rng_mpu_irqs[] = {
828  { .irq = 52 },
829  { .irq = -1 }
830 };
831 
833  .name = "rng",
834  .mpu_irqs = omap2_rng_mpu_irqs,
835  .main_clk = "l4_ck",
836  .prcm = {
837  .omap2 = {
838  .module_offs = CORE_MOD,
839  .prcm_reg_id = 4,
840  .module_bit = OMAP24XX_EN_RNG_SHIFT,
841  .idlest_reg_id = 4,
842  .idlest_idle_bit = OMAP24XX_ST_RNG_SHIFT,
843  },
844  },
845  /*
846  * XXX The first read from the SYSSTATUS register of the RNG
847  * after the SYSCONFIG SOFTRESET bit is set triggers an
848  * imprecise external abort. It's unclear why this happens.
849  * Until this is analyzed, skip the IP block reset.
850  */
851  .flags = HWMOD_INIT_NO_RESET,
852  .class = &omap2_rng_hwmod_class,
853 };