OMAP3 clock adjustments & cleanups
authorJuha Riihimäki <juhriihi@esdhcp039194.research.nokia.com>
Wed, 11 Mar 2009 08:55:38 +0000 (10:55 +0200)
committerJuha Riihimäki <juhriihi@esdhcp039194.research.nokia.com>
Wed, 11 Mar 2009 08:55:38 +0000 (10:55 +0200)
Add support for OMAP3 SYS_CLK input selection reconfiguration support. In real life we would also need to support sys_boot pin 6 to choose between oscillator bypass mode (xtalin is square wave) or PRCM internal oscillator (xtalin). Current code is fixed to use the bypass mode with a default setting of 26MHz input. Also, added SYS_CLKOUT1 clock which was missing.

hw/beagle.c
hw/omap.h
hw/omap3.c
hw/omap_clk.c

index ecb675c..519e583 100644 (file)
@@ -1,7 +1,8 @@
 /*
  * Beagle board emulation. http://beagleboard.org/
  * 
- * Copyright (C) 2008 yajin(yajin@vm-kernel.org)
+ * Original code Copyright (C) 2008 yajin(yajin@vm-kernel.org)
+ * Rewrite 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 as
 #include "sysemu.h"
 #include "omap.h"
 #include "arm-misc.h"
-#include "irq.h"
-#include "console.h"
 #include "boards.h"
 #include "i2c.h"
 #include "devices.h"
 #include "flash.h"
-#include "hw.h"
-#include "block.h"
 
 #define BEAGLE_NAND_CS       0
 #define BEAGLE_NAND_PAGESIZE 0x800
+#define BEAGLE_SDRAM_SIZE    (128 * 1024 * 1024) /* 128MB */
 
 /* Beagle board support */
 struct beagle_s {
@@ -45,10 +43,6 @@ struct beagle_s {
     struct twl4030_s *twl4030;
 };
 
-static struct arm_boot_info beagle_binfo = {
-    .ram_size = 0x08000000,
-};
-
 static void beagle_nand_pread(struct nand_flash_s *nand,
                               uint64_t addr,
                               uint8_t *data,
@@ -97,20 +91,18 @@ static void beagle_init(ram_addr_t ram_size, int vga_ram_size,
                 const char *initrd_filename, const char *cpu_model)
 {
     struct beagle_s *s = (struct beagle_s *) qemu_mallocz(sizeof(*s));
-    int sdram_size = beagle_binfo.ram_size;
     int sdindex = drive_get_index(IF_SD, 0, 0);
     
     if (sdindex == -1) {
-        fprintf(stderr, "qemu: missing SecureDigital device\n");
+        fprintf(stderr, "%s: missing SecureDigital device\n", __FUNCTION__);
         exit(1);
     }
-    
-       if (ram_size < sdram_size +  OMAP3530_SRAM_SIZE) {
-        fprintf(stderr, "This architecture uses %i bytes of memory\n",
-                        sdram_size + OMAP3530_SRAM_SIZE);
+       if (ram_size < (beagle_machine.ram_require & ~RAMSIZE_FIXED)) {
+        fprintf(stderr, "%s: This architecture uses %lu bytes of memory\n",
+                __FUNCTION__, (beagle_machine.ram_require & ~RAMSIZE_FIXED));
         exit(1);
     }
-       s->cpu = omap3530_mpu_init(sdram_size, NULL);
+       s->cpu = omap3530_mpu_init(BEAGLE_SDRAM_SIZE, NULL);
     
     if (serial_hds[0])
         omap_uart_attach(s->cpu->uart[2], serial_hds[0]);
@@ -121,11 +113,11 @@ static void beagle_init(ram_addr_t ram_size, int vga_ram_size,
     omap3_mmc_attach(s->cpu->omap3_mmc[0], drives_table[sdindex].bdrv);
 
     s->i2c = omap_i2c_bus(s->cpu->i2c[0]);
-    s->twl4030 = twl4030_init(s->i2c, s->cpu->irq[0][OMAP_INT_35XX_SYS_NIRQ]);
+    s->twl4030 = twl4030_init(s->i2c, s->cpu->irq[0][OMAP_INT_3XXX_SYS_NIRQ]);
 
        s->lcd_panel = omap3_lcd_panel_init();
        omap3_lcd_panel_attach(s->cpu->dss, 0, s->lcd_panel);
-
+    
     if (!omap3_mmc_boot(s->cpu) 
         && !omap3_nand_boot(s->cpu, s->nand, beagle_nand_pread)) {
         fprintf(stderr, "%s: boot from MMC and NAND failed\n",
@@ -135,9 +127,11 @@ static void beagle_init(ram_addr_t ram_size, int vga_ram_size,
 }
 
 QEMUMachine beagle_machine = {
-    .name = "beagle",
-    .desc =     "Beagle board (OMAP3530)",
-    .init =     beagle_init,
-    .ram_require =     (0x08000000 +  OMAP3530_SRAM_SIZE) | RAMSIZE_FIXED,
+    .name =        "beagle",
+    .desc =        "Beagle board (OMAP3530)",
+    .init =        beagle_init,
+    .ram_require = (BEAGLE_SDRAM_SIZE
+                    + OMAP3XXX_SRAM_SIZE
+                    + OMAP3XXX_BOOTROM_SIZE) | RAMSIZE_FIXED,
 };
 
index 105a92e..8bd77a5 100644 (file)
--- a/hw/omap.h
+++ b/hw/omap.h
 # define OMAP3_Q3_BASE      0xc0000000
 # define OMAP_MPUI_BASE                0xe1000000
 
-# define OMAP730_SRAM_SIZE     0x00032000
-# define OMAP15XX_SRAM_SIZE    0x00030000
-# define OMAP16XX_SRAM_SIZE    0x00004000
-# define OMAP1611_SRAM_SIZE    0x0003e800
-# define OMAP242X_SRAM_SIZE    0x000a0000
-# define OMAP243X_SRAM_SIZE    0x00010000
-# define OMAP3530_SRAM_SIZE 0x00010000
-# define OMAP_CS0_SIZE         0x04000000
-# define OMAP_CS1_SIZE         0x04000000
-# define OMAP_CS2_SIZE         0x04000000
-# define OMAP_CS3_SIZE         0x04000000
+# define OMAP730_SRAM_SIZE      0x00032000
+# define OMAP15XX_SRAM_SIZE     0x00030000
+# define OMAP16XX_SRAM_SIZE     0x00004000
+# define OMAP1611_SRAM_SIZE     0x0003e800
+# define OMAP242X_SRAM_SIZE     0x000a0000
+# define OMAP243X_SRAM_SIZE     0x00010000
+# define OMAP3XXX_SRAM_SIZE     0x00010000
+# define OMAP3XXX_BOOTROM_SIZE  0x0001C000
+# define OMAP_CS0_SIZE          0x04000000
+# define OMAP_CS1_SIZE          0x04000000
+# define OMAP_CS2_SIZE          0x04000000
+# define OMAP_CS3_SIZE          0x04000000
 
 /* omap_clk.c */
 struct omap_mpu_state_s;
@@ -432,104 +433,104 @@ void omap_gpmc_attach(struct omap_gpmc_s *s, int cs, int iomemtype,
 # define OMAP_INT_34XX_GPTIMER12       95
 
 /*
- * OMAP-35XX common IRQ numbers
+ * OMAP-3XXX common IRQ numbers
  */
-#define OMAP_INT_35XX_EMUINT        0  /* MPU emulation */
-#define OMAP_INT_35XX_COMMTX        1  /* MPU emulation */
-#define OMAP_INT_35XX_COMMRX        2  /* MPU emulation */
-#define OMAP_INT_35XX_BENCH         3  /* MPU emulation */
-#define OMAP_INT_35XX_MCBSP2_ST_IRQ 4  /* Sidetone MCBSP2 overflow */
-#define OMAP_INT_35XX_MCBSP3_ST_IRQ 5  /* Sidetone MCBSP3 overflow */
+#define OMAP_INT_3XXX_EMUINT        0  /* MPU emulation */
+#define OMAP_INT_3XXX_COMMTX        1  /* MPU emulation */
+#define OMAP_INT_3XXX_COMMRX        2  /* MPU emulation */
+#define OMAP_INT_3XXX_BENCH         3  /* MPU emulation */
+#define OMAP_INT_3XXX_MCBSP2_ST_IRQ 4  /* Sidetone MCBSP2 overflow */
+#define OMAP_INT_3XXX_MCBSP3_ST_IRQ 5  /* Sidetone MCBSP3 overflow */
 /* IRQ6 is reserved */
-#define OMAP_INT_35XX_SYS_NIRQ      7  /* External source (active low) */
+#define OMAP_INT_3XXX_SYS_NIRQ      7  /* External source (active low) */
 /* IRQ8 is reserved */
-#define OMAP_INT_35XX_SMX_DBG_IRQ   9  /* L3 interconnect error for debug */
-#define OMAP_INT_35XX_SMX_APP_IRQ   10 /* L3 interconnect error for application */
-#define OMAP_INT_35XX_PRCM_MPU_IRQ  11 /* PRCM module IRQ */
-#define OMAP_INT_35XX_SDMA_IRQ0     12 /* System DMA request 0 */ 
-#define OMAP_INT_35XX_SDMA_IRQ1     13 /* System DMA request 1 */
-#define OMAP_INT_35XX_SDMA_IRQ2     14 /* System DMA request 2 */
-#define OMAP_INT_35XX_SDMA_IRQ3     15 /* System DMA request 3 */
-#define OMAP_INT_35XX_MCBSP1_IRQ    16 /* MCBSP module 1 IRQ */
-#define OMAP_INT_35XX_MCBSP2_IRQ    17 /* MCBSP module 2 IRQ */
+#define OMAP_INT_3XXX_SMX_DBG_IRQ   9  /* L3 interconnect error for debug */
+#define OMAP_INT_3XXX_SMX_APP_IRQ   10 /* L3 interconnect error for application */
+#define OMAP_INT_3XXX_PRCM_MPU_IRQ  11 /* PRCM module IRQ */
+#define OMAP_INT_3XXX_SDMA_IRQ0     12 /* System DMA request 0 */ 
+#define OMAP_INT_3XXX_SDMA_IRQ1     13 /* System DMA request 1 */
+#define OMAP_INT_3XXX_SDMA_IRQ2     14 /* System DMA request 2 */
+#define OMAP_INT_3XXX_SDMA_IRQ3     15 /* System DMA request 3 */
+#define OMAP_INT_3XXX_MCBSP1_IRQ    16 /* MCBSP module 1 IRQ */
+#define OMAP_INT_3XXX_MCBSP2_IRQ    17 /* MCBSP module 2 IRQ */
 /* IRQ18 is reserved */
 /* IRQ19 is reserved */
-#define OMAP_INT_35XX_GPMC_IRQ      20 /* General-purpose memory controller module */ 
-#define OMAP_INT_35XX_SGX_IRQ       21 /* 2D/3D graphics module */
-#define OMAP_INT_35XX_MCBSP3_IRQ    22 /* MCBSP module 3 */
-#define OMAP_INT_35XX_MCBSP4_IRQ    23 /* MCBSP module 4 */
-#define OMAP_INT_35XX_CAM_IRQ0      24 /* Camera interface request 0 */
-#define OMAP_INT_35XX_DSS_IRQ       25 /* Display subsystem module */
-#define OMAP_INT_35XX_MAIL_U0_MPU   26 /* Mailbox user 0 request */
-#define OMAP_INT_35XX_MCBSP5_IRQ    27 /* MCBSP module 5 */
-#define OMAP_INT_35XX_IVA2_MMU_IRQ  28 /* IVA2 MMU */
-#define OMAP_INT_35XX_GPIO1_MPU_IRQ 29 /* GPIO module 1 */
-#define OMAP_INT_35XX_GPIO2_MPU_IRQ 30 /* GPIO module 2 */
-#define OMAP_INT_35XX_GPIO3_MPU_IRQ 31 /* GPIO module 3 */
-#define OMAP_INT_35XX_GPIO4_MPU_IRQ 32 /* GPIO module 4 */
-#define OMAP_INT_35XX_GPIO5_MPU_IRQ 33 /* GPIO module 5 */
-#define OMAP_INT_35XX_GPIO6_MPU_IRQ 34 /* GPIO module 6 */
+#define OMAP_INT_3XXX_GPMC_IRQ      20 /* General-purpose memory controller module */ 
+#define OMAP_INT_3XXX_SGX_IRQ       21 /* 2D/3D graphics module */
+#define OMAP_INT_3XXX_MCBSP3_IRQ    22 /* MCBSP module 3 */
+#define OMAP_INT_3XXX_MCBSP4_IRQ    23 /* MCBSP module 4 */
+#define OMAP_INT_3XXX_CAM_IRQ0      24 /* Camera interface request 0 */
+#define OMAP_INT_3XXX_DSS_IRQ       25 /* Display subsystem module */
+#define OMAP_INT_3XXX_MAIL_U0_MPU   26 /* Mailbox user 0 request */
+#define OMAP_INT_3XXX_MCBSP5_IRQ    27 /* MCBSP module 5 */
+#define OMAP_INT_3XXX_IVA2_MMU_IRQ  28 /* IVA2 MMU */
+#define OMAP_INT_3XXX_GPIO1_MPU_IRQ 29 /* GPIO module 1 */
+#define OMAP_INT_3XXX_GPIO2_MPU_IRQ 30 /* GPIO module 2 */
+#define OMAP_INT_3XXX_GPIO3_MPU_IRQ 31 /* GPIO module 3 */
+#define OMAP_INT_3XXX_GPIO4_MPU_IRQ 32 /* GPIO module 4 */
+#define OMAP_INT_3XXX_GPIO5_MPU_IRQ 33 /* GPIO module 5 */
+#define OMAP_INT_3XXX_GPIO6_MPU_IRQ 34 /* GPIO module 6 */
 /* IRQ35 is reserved */
-#define OMAP_INT_35XX_WDT3_IRQ      36 /* Watchdog timer module 3 overflow */
-#define OMAP_INT_35XX_GPT1_IRQ      37 /* General-purpose timer module 1 */
-#define OMAP_INT_35XX_GPT2_IRQ      38 /* General-purpose timer module 2 */
-#define OMAP_INT_35XX_GPT3_IRQ      39 /* General-purpose timer module 3 */
-#define OMAP_INT_35XX_GPT4_IRQ      40 /* General-purpose timer module 4 */
-#define OMAP_INT_35XX_GPT5_IRQ      41 /* General-purpose timer module 5 */
-#define OMAP_INT_35XX_GPT6_IRQ      42 /* General-purpose timer module 6 */
-#define OMAP_INT_35XX_GPT7_IRQ      43 /* General-purpose timer module 7 */
-#define OMAP_INT_35XX_GPT8_IRQ      44 /* General-purpose timer module 8 */
-#define OMAP_INT_35XX_GPT9_IRQ      45 /* General-purpose timer module 9 */
-#define OMAP_INT_35XX_GPT10_IRQ     46 /* General-purpose timer module 10 */
-#define OMAP_INT_35XX_GPT11_IRQ     47 /* General-purpose timer module 11 */
-#define OMAP_INT_35XX_SPI4_IRQ      48 /* MCSPI module 4 */
+#define OMAP_INT_3XXX_WDT3_IRQ      36 /* Watchdog timer module 3 overflow */
+#define OMAP_INT_3XXX_GPT1_IRQ      37 /* General-purpose timer module 1 */
+#define OMAP_INT_3XXX_GPT2_IRQ      38 /* General-purpose timer module 2 */
+#define OMAP_INT_3XXX_GPT3_IRQ      39 /* General-purpose timer module 3 */
+#define OMAP_INT_3XXX_GPT4_IRQ      40 /* General-purpose timer module 4 */
+#define OMAP_INT_3XXX_GPT5_IRQ      41 /* General-purpose timer module 5 */
+#define OMAP_INT_3XXX_GPT6_IRQ      42 /* General-purpose timer module 6 */
+#define OMAP_INT_3XXX_GPT7_IRQ      43 /* General-purpose timer module 7 */
+#define OMAP_INT_3XXX_GPT8_IRQ      44 /* General-purpose timer module 8 */
+#define OMAP_INT_3XXX_GPT9_IRQ      45 /* General-purpose timer module 9 */
+#define OMAP_INT_3XXX_GPT10_IRQ     46 /* General-purpose timer module 10 */
+#define OMAP_INT_3XXX_GPT11_IRQ     47 /* General-purpose timer module 11 */
+#define OMAP_INT_3XXX_SPI4_IRQ      48 /* MCSPI module 4 */
 /* IRQ49 is reserved */
 /* IRQ50 is reserved */
 /* IRQ51 is reserved */
 /* IRQ52 is reserved */
-#define OMAP_INT_35XX_MG_IRQ        53
-#define OMAP_INT_35XX_MCBSP4_IRQ_TX 54 /* MCBSP module 4 transmit */
-#define OMAP_INT_35XX_MCBSP4_IRQ_RX 55 /* MCBSP module 4 receive */
-#define OMAP_INT_35XX_I2C1_IRQ      56 /* I2C module 1 */
-#define OMAP_INT_35XX_I2C2_IRQ      57 /* I2C module 2 */
-#define OMAP_INT_35XX_HDQ_IRQ       58 /* HDQ/1-Wire */
-#define OMAP_INT_35XX_MCBSP1_IRQ_TX 59 /* MCBSP module 1 transmit */
-#define OMAP_INT_35XX_MCBSP1_IRQ_RX 60 /* MCBSP module 1 receive */
-#define OMAP_INT_35XX_I2C3_IRQ      61 /* I2C module 3 */
-#define OMAP_INT_35XX_MCBSP2_IRQ_TX 62 /* MCBSP module 2 transmit */
-#define OMAP_INT_35XX_MCBSP2_IRQ_RX 63 /* MCBSP module 2 receive */
+#define OMAP_INT_3XXX_MG_IRQ        53
+#define OMAP_INT_3XXX_MCBSP4_IRQ_TX 54 /* MCBSP module 4 transmit */
+#define OMAP_INT_3XXX_MCBSP4_IRQ_RX 55 /* MCBSP module 4 receive */
+#define OMAP_INT_3XXX_I2C1_IRQ      56 /* I2C module 1 */
+#define OMAP_INT_3XXX_I2C2_IRQ      57 /* I2C module 2 */
+#define OMAP_INT_3XXX_HDQ_IRQ       58 /* HDQ/1-Wire */
+#define OMAP_INT_3XXX_MCBSP1_IRQ_TX 59 /* MCBSP module 1 transmit */
+#define OMAP_INT_3XXX_MCBSP1_IRQ_RX 60 /* MCBSP module 1 receive */
+#define OMAP_INT_3XXX_I2C3_IRQ      61 /* I2C module 3 */
+#define OMAP_INT_3XXX_MCBSP2_IRQ_TX 62 /* MCBSP module 2 transmit */
+#define OMAP_INT_3XXX_MCBSP2_IRQ_RX 63 /* MCBSP module 2 receive */
 /* IRQ64 is reserved */
-#define OMAP_INT_35XX_MCSPI1_IRQ    65 /* MCSPI module 1 */
-#define OMAP_INT_35XX_MCSPI2_IRQ    66 /* MCSPI module 2 */
+#define OMAP_INT_3XXX_MCSPI1_IRQ    65 /* MCSPI module 1 */
+#define OMAP_INT_3XXX_MCSPI2_IRQ    66 /* MCSPI module 2 */
 /* IRQ67 is reserved */
 /* IRQ68 is reserved */
 /* IRQ69 is reserved */
 /* IRQ70 is reserved */
 /* IRQ71 is reserved */
-#define OMAP_INT_35XX_UART1_IRQ     72 /* UART module 1 */
-#define OMAP_INT_35XX_UART2_IRQ     73 /* UART module 2 */
-#define OMAP_INT_35XX_UART3_IRQ     74 /* UART module 3 (also infrared)*/
-#define OMAP_INT_35XX_PBIAS_IRQ     75 /* Merged interrupt for PBIASlite1 and 2 */
-#define OMAP_INT_35XX_OHCI_IRQ      76 /* OHCI controller HSUSB MP Host interrupt */
-#define OMAP_INT_35XX_EHCI_IRQ      77 /* EHCI controller HSUSB MP Host interrupt */
-#define OMAP_INT_35XX_TLL_IRQ       78 /* HSUSB MP TLL interrupt */
+#define OMAP_INT_3XXX_UART1_IRQ     72 /* UART module 1 */
+#define OMAP_INT_3XXX_UART2_IRQ     73 /* UART module 2 */
+#define OMAP_INT_3XXX_UART3_IRQ     74 /* UART module 3 (also infrared)*/
+#define OMAP_INT_3XXX_PBIAS_IRQ     75 /* Merged interrupt for PBIASlite1 and 2 */
+#define OMAP_INT_3XXX_OHCI_IRQ      76 /* OHCI controller HSUSB MP Host interrupt */
+#define OMAP_INT_3XXX_EHCI_IRQ      77 /* EHCI controller HSUSB MP Host interrupt */
+#define OMAP_INT_3XXX_TLL_IRQ       78 /* HSUSB MP TLL interrupt */
 /* IRQ79 is reserved */
 /* IRQ80 is reserved */
-#define OMAP_INT_35XX_MCBSP5_IRQ_TX 81 /* MCBSP module 5 transmit */
-#define OMAP_INT_35XX_MCBSP5_IRQ_RX 82 /* MCBSP module 5 receive */
-#define OMAP_INT_35XX_MMC1_IRQ      83 /* MMC/SD module 1 */
-#define OMAP_INT_35XX_MS_IRQ           84
+#define OMAP_INT_3XXX_MCBSP5_IRQ_TX 81 /* MCBSP module 5 transmit */
+#define OMAP_INT_3XXX_MCBSP5_IRQ_RX 82 /* MCBSP module 5 receive */
+#define OMAP_INT_3XXX_MMC1_IRQ      83 /* MMC/SD module 1 */
+#define OMAP_INT_3XXX_MS_IRQ           84
 /* IRQ85 is reserved */
-#define OMAP_INT_35XX_MMC2_IRQ         86 /* MMC/SD module 2 */
-#define OMAP_INT_35XX_MPU_ICR_IRQ   87 /* MPU ICR */
-#define OMAP_INT_35XX_D2DFRINT      88 /* 3G coprocessor */
-#define OMAP_INT_35XX_MCBSP3_IRQ_TX 89 /* MCBSP module 3 transmit */
-#define OMAP_INT_35XX_MCBSP3_IRQ_RX 90 /* MCBSP module 3 receive */
-#define OMAP_INT_35XX_MCSPI3_IRQ    91 /* MCSPI module 3 */
-#define OMAP_INT_35XX_HSUSB_MC      92 /* High-Speed USB OTG controller */
-#define OMAP_INT_35XX_HSUSB_DMA     93 /* High-Speed USB OTG DMA controller */
-#define OMAP_INT_35XX_MMC3_IRQ      94 /* MMC/SD module 3 */
-#define OMAP_INT_35XX_GPT12_IRQ     95 /* General-purpose timer module 12 */
+#define OMAP_INT_3XXX_MMC2_IRQ         86 /* MMC/SD module 2 */
+#define OMAP_INT_3XXX_MPU_ICR_IRQ   87 /* MPU ICR */
+#define OMAP_INT_3XXX_D2DFRINT      88 /* 3G coprocessor */
+#define OMAP_INT_3XXX_MCBSP3_IRQ_TX 89 /* MCBSP module 3 transmit */
+#define OMAP_INT_3XXX_MCBSP3_IRQ_RX 90 /* MCBSP module 3 receive */
+#define OMAP_INT_3XXX_MCSPI3_IRQ    91 /* MCSPI module 3 */
+#define OMAP_INT_3XXX_HSUSB_MC      92 /* High-Speed USB OTG controller */
+#define OMAP_INT_3XXX_HSUSB_DMA     93 /* High-Speed USB OTG DMA controller */
+#define OMAP_INT_3XXX_MMC3_IRQ      94 /* MMC/SD module 3 */
+#define OMAP_INT_3XXX_GPT12_IRQ     95 /* General-purpose timer module 12 */
 
 /* omap_dma.c */
 enum omap_dma_model {
@@ -757,70 +758,70 @@ struct omap_dma_lcd_channel_s {
  * number plus one! Zero is a reserved value (defined as
  * NO_DEVICE here). Other missing values are reserved.
  */
-#define OMAP35XX_DMA_NO_DEVICE        0
-
-#define OMAP35XX_DMA_EXT_DMAREQ0      2
-#define OMAP35XX_DMA_EXT_DMAREQ1      3
-#define OMAP35XX_DMA_GPMC             4
-
-#define OMAP35XX_DMA_DSS_LINETRIGGER  6
-#define OMAP35XX_DMA_EXT_DMAREQ2      7
-
-#define OMAP35XX_DMA_SPI3_TX0         15
-#define OMAP35XX_DMA_SPI3_RX0         16
-#define OMAP35XX_DMA_MCBSP3_TX        17
-#define OMAP35XX_DMA_MCBSP3_RX        18
-#define OMAP35XX_DMA_MCBSP4_TX        19
-#define OMAP35XX_DMA_MCBSP4_RX        20
-#define OMAP35XX_DMA_MCBSP5_TX        21
-#define OMAP35XX_DMA_MCBSP5_RX        22
-#define OMAP35XX_DMA_SPI3_TX1         23
-#define OMAP35XX_DMA_SPI3_RX1         24
-#define OMAP35XX_DMA_I2C3_TX          25
-#define OMAP35XX_DMA_I2C3_RX          26
-#define OMAP35XX_DMA_I2C1_TX          27
-#define OMAP35XX_DMA_I2C1_RX          28
-#define OMAP35XX_DMA_I2C2_TX          29
-#define OMAP35XX_DMA_I2C2_RX          30
-#define OMAP35XX_DMA_MCBSP1_TX        31
-#define OMAP35XX_DMA_MCBSP1_RX        32
-#define OMAP35XX_DMA_MCBSP2_TX        33
-#define OMAP35XX_DMA_MCBSP2_RX        34
-#define OMAP35XX_DMA_SPI1_TX0         35
-#define OMAP35XX_DMA_SPI1_RX0         36
-#define OMAP35XX_DMA_SPI1_TX1         37
-#define OMAP35XX_DMA_SPI1_RX1         38
-#define OMAP35XX_DMA_SPI1_TX2         39
-#define OMAP35XX_DMA_SPI1_RX2         40
-#define OMAP35XX_DMA_SPI1_TX3         41
-#define OMAP35XX_DMA_SPI1_RX4         42
-#define OMAP35XX_DMA_SPI2_TX0         43
-#define OMAP35XX_DMA_SPI2_RX0         44
-#define OMAP35XX_DMA_SPI2_TX1         45
-#define OMAP35XX_DMA_SPI2_RX1         46
-#define OMAP35XX_DMA_MMC2_TX          47
-#define OMAP35XX_DMA_MMC2_RX          48
-#define OMAP35XX_DMA_UART1_TX         49
-#define OMAP35XX_DMA_UART1_RX         50
-#define OMAP35XX_DMA_UART2_TX         51
-#define OMAP35XX_DMA_UART2_RX         52
-#define OMAP35XX_DMA_UART3_TX         53
-#define OMAP35XX_DMA_UART3_RX         54
-
-#define OMAP35XX_DMA_MMC1_TX          61
-#define OMAP35XX_DMA_MMC1_RX          62
-#define OMAP35XX_DMA_MS               63
-#define OMAP35XX_DMA_EXT_DMAREQ3      64
-
-#define OMAP35XX_DMA_SPI4_TX0         70
-#define OMAP35XX_DMA_SPI4_RX0         71
-#define OMAP35XX_DMA_DSS0             72
-#define OMAP35XX_DMA_DSS1             73
-#define OMAP35XX_DMA_DSS2             74
-#define OMAP35XX_DMA_DSS3             75
-
-#define OMAP35XX_DMA_MMC3_TX          77
-#define OMAP35XX_DMA_MMC3_RX          78
+#define OMAP3XXX_DMA_NO_DEVICE        0
+
+#define OMAP3XXX_DMA_EXT_DMAREQ0      2
+#define OMAP3XXX_DMA_EXT_DMAREQ1      3
+#define OMAP3XXX_DMA_GPMC             4
+
+#define OMAP3XXX_DMA_DSS_LINETRIGGER  6
+#define OMAP3XXX_DMA_EXT_DMAREQ2      7
+
+#define OMAP3XXX_DMA_SPI3_TX0         15
+#define OMAP3XXX_DMA_SPI3_RX0         16
+#define OMAP3XXX_DMA_MCBSP3_TX        17
+#define OMAP3XXX_DMA_MCBSP3_RX        18
+#define OMAP3XXX_DMA_MCBSP4_TX        19
+#define OMAP3XXX_DMA_MCBSP4_RX        20
+#define OMAP3XXX_DMA_MCBSP5_TX        21
+#define OMAP3XXX_DMA_MCBSP5_RX        22
+#define OMAP3XXX_DMA_SPI3_TX1         23
+#define OMAP3XXX_DMA_SPI3_RX1         24
+#define OMAP3XXX_DMA_I2C3_TX          25
+#define OMAP3XXX_DMA_I2C3_RX          26
+#define OMAP3XXX_DMA_I2C1_TX          27
+#define OMAP3XXX_DMA_I2C1_RX          28
+#define OMAP3XXX_DMA_I2C2_TX          29
+#define OMAP3XXX_DMA_I2C2_RX          30
+#define OMAP3XXX_DMA_MCBSP1_TX        31
+#define OMAP3XXX_DMA_MCBSP1_RX        32
+#define OMAP3XXX_DMA_MCBSP2_TX        33
+#define OMAP3XXX_DMA_MCBSP2_RX        34
+#define OMAP3XXX_DMA_SPI1_TX0         35
+#define OMAP3XXX_DMA_SPI1_RX0         36
+#define OMAP3XXX_DMA_SPI1_TX1         37
+#define OMAP3XXX_DMA_SPI1_RX1         38
+#define OMAP3XXX_DMA_SPI1_TX2         39
+#define OMAP3XXX_DMA_SPI1_RX2         40
+#define OMAP3XXX_DMA_SPI1_TX3         41
+#define OMAP3XXX_DMA_SPI1_RX4         42
+#define OMAP3XXX_DMA_SPI2_TX0         43
+#define OMAP3XXX_DMA_SPI2_RX0         44
+#define OMAP3XXX_DMA_SPI2_TX1         45
+#define OMAP3XXX_DMA_SPI2_RX1         46
+#define OMAP3XXX_DMA_MMC2_TX          47
+#define OMAP3XXX_DMA_MMC2_RX          48
+#define OMAP3XXX_DMA_UART1_TX         49
+#define OMAP3XXX_DMA_UART1_RX         50
+#define OMAP3XXX_DMA_UART2_TX         51
+#define OMAP3XXX_DMA_UART2_RX         52
+#define OMAP3XXX_DMA_UART3_TX         53
+#define OMAP3XXX_DMA_UART3_RX         54
+
+#define OMAP3XXX_DMA_MMC1_TX          61
+#define OMAP3XXX_DMA_MMC1_RX          62
+#define OMAP3XXX_DMA_MS               63
+#define OMAP3XXX_DMA_EXT_DMAREQ3      64
+
+#define OMAP3XXX_DMA_SPI4_TX0         70
+#define OMAP3XXX_DMA_SPI4_RX0         71
+#define OMAP3XXX_DMA_DSS0             72
+#define OMAP3XXX_DMA_DSS1             73
+#define OMAP3XXX_DMA_DSS2             74
+#define OMAP3XXX_DMA_DSS3             75
+
+#define OMAP3XXX_DMA_MMC3_TX          77
+#define OMAP3XXX_DMA_MMC3_RX          78
 
 
 /* omap[123].c */
index fc2f48f..c26d554 100644 (file)
@@ -1346,39 +1346,45 @@ struct omap3_prm_s {
     uint32_t core_pm_iva2grpsel3;
     uint32_t core_pm_mpugrpsel3;
 
-    uint32_t prm_revision;
-    uint32_t prm_sysconfig;
-    uint32_t prm_irqstatus_mpu;
-    uint32_t prm_irqenable_mpu;
-
-    uint32_t prm_clksel;
-    uint32_t prm_clkout_ctrl;
-
-    uint32_t prm_vc_smps_sa;
-    uint32_t prm_vc_smps_vol_ra;
-    uint32_t prm_vc_smps_cmd_ra;
-    uint32_t prm_vc_cmd_val_0;
-    uint32_t prm_vc_cmd_val_1;
-    uint32_t prm_vc_hc_conf;
-    uint32_t prm_vc_i2c_cfg;
-    uint32_t prm_vc_bypass_val;
-    uint32_t prm_rstctrl;
-    uint32_t prm_rsttimer;
-    uint32_t prm_rstst;
-    uint32_t prm_voltctrl;
-    uint32_t prm_sram_pcharge;
-    uint32_t prm_clksrc_ctrl;
-    uint32_t prm_obs;
-    uint32_t prm_voltsetup1;
-    uint32_t prm_voltoffset;
-    uint32_t prm_clksetup;
-    uint32_t prm_polctrl;
-    uint32_t prm_voltsetup2;
+    struct {
+        uint32_t prm_revision;
+        uint32_t prm_sysconfig;
+        uint32_t prm_irqstatus_mpu;
+        uint32_t prm_irqenable_mpu;
+    } ocp;
+
+    struct {
+        uint32_t prm_clksel;
+        uint32_t prm_clkout_ctrl;
+    } ccr; /* clock_control_reg */
+
+    struct {
+        uint32_t prm_vc_smps_sa;
+        uint32_t prm_vc_smps_vol_ra;
+        uint32_t prm_vc_smps_cmd_ra;
+        uint32_t prm_vc_cmd_val_0;
+        uint32_t prm_vc_cmd_val_1;
+        uint32_t prm_vc_hc_conf;
+        uint32_t prm_vc_i2c_cfg;
+        uint32_t prm_vc_bypass_val;
+        uint32_t prm_rstctrl;
+        uint32_t prm_rsttimer;
+        uint32_t prm_rstst;
+        uint32_t prm_voltctrl;
+        uint32_t prm_sram_pcharge;
+        uint32_t prm_clksrc_ctrl;
+        uint32_t prm_obs;
+        uint32_t prm_voltsetup1;
+        uint32_t prm_voltoffset;
+        uint32_t prm_clksetup;
+        uint32_t prm_polctrl;
+        uint32_t prm_voltsetup2;
+    } gr; /* global_reg */
 };
 
 static void omap3_prm_int_update(struct omap3_prm_s *s)
 {
-    qemu_set_irq(s->mpu_irq, s->prm_irqstatus_mpu & s->prm_irqenable_mpu);
+    qemu_set_irq(s->mpu_irq, s->ocp.prm_irqstatus_mpu & s->ocp.prm_irqenable_mpu);
     qemu_set_irq(s->iva_irq, s->iva2_prm_irqstatus & s->iva2_prm_irqenable);
 }
 
@@ -1393,10 +1399,10 @@ static void omap3_prm_reset(struct omap3_prm_s *s)
     s->iva2_prm_irqstatus = 0x0;
     s->iva2_prm_irqenable = 0x0;
 
-    s->prm_revision      = 0x10;
-    s->prm_sysconfig     = 0x1;
-    s->prm_irqstatus_mpu = 0x0;
-    s->prm_irqenable_mpu = 0x0;
+    s->ocp.prm_revision      = 0x10;
+    s->ocp.prm_sysconfig     = 0x1;
+    s->ocp.prm_irqstatus_mpu = 0x0;
+    s->ocp.prm_irqenable_mpu = 0x0;
 
     s->mpu.rm_rstst       = 0x1;
     s->mpu.pm_wkdep       = 0xa5;
@@ -1432,8 +1438,8 @@ static void omap3_prm_reset(struct omap3_prm_s *s)
     s->wkup.pm_wkst      = 0x0;
     s->wkup.pm_pwstst    = 0x3; /* TODO: check on real hardware */
 
-    s->prm_clksel      = 0x4;
-    s->prm_clkout_ctrl = 0x80;
+    s->ccr.prm_clksel      = 0x3; /* TRM says 0x4, but on HW this is 0x3 */
+    s->ccr.prm_clkout_ctrl = 0x80;
 
     s->dss.rm_rstst     = 0x1;
     s->dss.pm_wken      = 0x1;
@@ -1461,26 +1467,26 @@ static void omap3_prm_reset(struct omap3_prm_s *s)
     s->emu.rm_rstst  = 0x1;
     s->emu.pm_pwstst = 0x13;
 
-    s->prm_vc_smps_sa     = 0x0;
-    s->prm_vc_smps_vol_ra = 0x0;
-    s->prm_vc_smps_cmd_ra = 0x0;
-    s->prm_vc_cmd_val_0   = 0x0;
-    s->prm_vc_cmd_val_1   = 0x0;
-    s->prm_vc_hc_conf     = 0x0;
-    s->prm_vc_i2c_cfg     = 0x18;
-    s->prm_vc_bypass_val  = 0x0;
-    s->prm_rstctrl        = 0x0;
-    s->prm_rsttimer       = 0x1006;
-    s->prm_rstst          = 0x1;
-    s->prm_voltctrl       = 0x0;
-    s->prm_sram_pcharge   = 0x50;
-    s->prm_clksrc_ctrl    = 0x43;
-    s->prm_obs            = 0x0;
-    s->prm_voltsetup1     = 0x0;
-    s->prm_voltoffset     = 0x0;
-    s->prm_clksetup       = 0x0;
-    s->prm_polctrl        = 0xa;
-    s->prm_voltsetup2     = 0x0;
+    s->gr.prm_vc_smps_sa     = 0x0;
+    s->gr.prm_vc_smps_vol_ra = 0x0;
+    s->gr.prm_vc_smps_cmd_ra = 0x0;
+    s->gr.prm_vc_cmd_val_0   = 0x0;
+    s->gr.prm_vc_cmd_val_1   = 0x0;
+    s->gr.prm_vc_hc_conf     = 0x0;
+    s->gr.prm_vc_i2c_cfg     = 0x18;
+    s->gr.prm_vc_bypass_val  = 0x0;
+    s->gr.prm_rstctrl        = 0x0;
+    s->gr.prm_rsttimer       = 0x1006;
+    s->gr.prm_rstst          = 0x1;
+    s->gr.prm_voltctrl       = 0x0;
+    s->gr.prm_sram_pcharge   = 0x50;
+    s->gr.prm_clksrc_ctrl    = 0x43;
+    s->gr.prm_obs            = 0x0;
+    s->gr.prm_voltsetup1     = 0x0;
+    s->gr.prm_voltoffset     = 0x0;
+    s->gr.prm_clksetup       = 0x0;
+    s->gr.prm_polctrl        = 0xa;
+    s->gr.prm_voltsetup2     = 0x0;
 
     s->neon.rm_rstst     = 0x1;
     s->neon.pm_wkdep     = 0x2;
@@ -1543,10 +1549,10 @@ static uint32_t omap3_prm_read(void *opaque, target_phys_addr_t addr)
     switch (addr) {
         case 0x00f8: return s->iva2_prm_irqstatus;
         case 0x00fc: return s->iva2_prm_irqenable;
-        case 0x0804: return s->prm_revision;
-        case 0x0814: return s->prm_sysconfig;
-        case 0x0818: return s->prm_irqstatus_mpu;
-        case 0x081c: return s->prm_irqenable_mpu;
+        case 0x0804: return s->ocp.prm_revision;
+        case 0x0814: return s->ocp.prm_sysconfig;
+        case 0x0818: return s->ocp.prm_irqstatus_mpu;
+        case 0x081c: return s->ocp.prm_irqenable_mpu;
         case 0x09d4: return s->mpu_pm_evgenctrl;
         case 0x09d8: return s->mpu_pm_evgenontim;
         case 0x09dc: return s->mpu_pm_evgenofftim;
@@ -1554,29 +1560,29 @@ static uint32_t omap3_prm_read(void *opaque, target_phys_addr_t addr)
         case 0x0af0: return s->core_pm_wken3;
         case 0x0af4: return s->core_pm_iva2grpsel3;
         case 0x0af8: return s->core_pm_mpugrpsel3;
-        case 0x0d40: return s->prm_clksel;
-        case 0x0d70: return s->prm_clkout_ctrl;
+        case 0x0d40: return s->ccr.prm_clksel;
+        case 0x0d70: return s->ccr.prm_clkout_ctrl;
         case 0x0de4: return 0x3; /* TODO: check on real hardware */
-        case 0x1220: return s->prm_vc_smps_sa;
-        case 0x1224: return s->prm_vc_smps_vol_ra;
-        case 0x1228: return s->prm_vc_smps_cmd_ra;
-        case 0x122c: return s->prm_vc_cmd_val_0;
-        case 0x1230: return s->prm_vc_cmd_val_1;
-        case 0x1234: return s->prm_vc_hc_conf;
-        case 0x1238: return s->prm_vc_i2c_cfg;
-        case 0x123c: return s->prm_vc_bypass_val;
-        case 0x1250: return s->prm_rstctrl;
-        case 0x1254: return s->prm_rsttimer;
-        case 0x1258: return s->prm_rstst;
-        case 0x1260: return s->prm_voltctrl;
-        case 0x1264: return s->prm_sram_pcharge;       
-        case 0x1270: return s->prm_clksrc_ctrl;
-        case 0x1280: return s->prm_obs;
-        case 0x1290: return s->prm_voltsetup1;
-        case 0x1294: return s->prm_voltoffset;
-        case 0x1298: return s->prm_clksetup;
-        case 0x129c: return s->prm_polctrl;
-        case 0x12a0: return s->prm_voltsetup2;
+        case 0x1220: return s->gr.prm_vc_smps_sa;
+        case 0x1224: return s->gr.prm_vc_smps_vol_ra;
+        case 0x1228: return s->gr.prm_vc_smps_cmd_ra;
+        case 0x122c: return s->gr.prm_vc_cmd_val_0;
+        case 0x1230: return s->gr.prm_vc_cmd_val_1;
+        case 0x1234: return s->gr.prm_vc_hc_conf;
+        case 0x1238: return s->gr.prm_vc_i2c_cfg;
+        case 0x123c: return s->gr.prm_vc_bypass_val;
+        case 0x1250: return s->gr.prm_rstctrl;
+        case 0x1254: return s->gr.prm_rsttimer;
+        case 0x1258: return s->gr.prm_rstst;
+        case 0x1260: return s->gr.prm_voltctrl;
+        case 0x1264: return s->gr.prm_sram_pcharge;            
+        case 0x1270: return s->gr.prm_clksrc_ctrl;
+        case 0x1280: return s->gr.prm_obs;
+        case 0x1290: return s->gr.prm_voltsetup1;
+        case 0x1294: return s->gr.prm_voltoffset;
+        case 0x1298: return s->gr.prm_clksetup;
+        case 0x129c: return s->gr.prm_polctrl;
+        case 0x12a0: return s->gr.prm_voltsetup2;
         default: break;
     }
 
@@ -1593,6 +1599,28 @@ static inline void omap3_prm_clksrc_ctrl_update(struct omap3_prm_s *s,
         omap_clk_setrate(omap_findclk(s->omap, "omap3_sys_clk"), 2, 1);
 }
 
+static void omap3_prm_clksel_update(struct omap3_prm_s *s)
+{
+    omap_clk newparent = 0;
+    
+    switch (s->ccr.prm_clksel & 7) {
+        case 0: newparent = omap_findclk(s->omap, "omap3_osc_sys_clk12"); break;
+        case 1: newparent = omap_findclk(s->omap, "omap3_osc_sys_clk13"); break;
+        case 2: newparent = omap_findclk(s->omap, "omap3_osc_sys_clk192"); break;
+        case 3: newparent = omap_findclk(s->omap, "omap3_osc_sys_clk26"); break;
+        case 4: newparent = omap_findclk(s->omap, "omap3_osc_sys_clk384"); break;
+        case 5: newparent = omap_findclk(s->omap, "omap3_osc_sys_clk168"); break;
+        default:
+            fprintf(stderr, "%s: invalid sys_clk input selection (%d) - ignored\n",
+                    __FUNCTION__, s->ccr.prm_clksel & 7);
+            break;
+    }
+    if (newparent) {
+        omap_clk_reparent(omap_findclk(s->omap, "omap3_sys_clk"), newparent);
+        omap_clk_reparent(omap_findclk(s->omap, "omap3_sys_clkout1"), newparent);
+    }
+}
+
 static void omap3_prm_write(void *opaque, target_phys_addr_t addr,
                             uint32_t value)
 {
@@ -1617,13 +1645,13 @@ static void omap3_prm_write(void *opaque, target_phys_addr_t addr,
             break;
         /* OCP_System_Reg_PRM */
         case 0x0804: OMAP_RO_REG(addr); break;
-        case 0x0814: s->prm_sysconfig = value & 0x1; break;
+        case 0x0814: s->ocp.prm_sysconfig = value & 0x1; break;
         case 0x0818:
-            s->prm_irqstatus_mpu &= ~(value & 0x03c003fd);
+            s->ocp.prm_irqstatus_mpu &= ~(value & 0x03c003fd);
             omap3_prm_int_update(s);
             break;
         case 0x081c:
-            s->prm_irqenable_mpu = value & 0x03c003fd;
+            s->ocp.prm_irqenable_mpu = value & 0x03c003fd;
             omap3_prm_int_update(s);
             break;
         /* MPU_PRM */
@@ -1662,16 +1690,13 @@ static void omap3_prm_write(void *opaque, target_phys_addr_t addr,
         case 0x0cb0: s->wkup.pm_wkst &= ~(value & 0x0103cb); break;
         /* Clock_Control_Reg_PRM */
         case 0x0d40: 
-            s->prm_clksel = value & 0x7;
-            fprintf(stderr, "%s PRM_CLKSEL = 0x%x\n", __FUNCTION__,
-                    s->prm_clksel);
-            /* TODO: update clocks */
+            s->ccr.prm_clksel = value & 0x7;
+            omap3_prm_clksel_update(s);
             break;
         case 0x0d70:
-            s->prm_clkout_ctrl = value & 0x80;
-            fprintf(stderr, "%s PRM_CLKOUT_CTRL = 0x%x\n", __FUNCTION__,
-                    s->prm_clkout_ctrl);
-            /* TODO: update clocks */
+            s->ccr.prm_clkout_ctrl = value & 0x80;
+            omap_clk_onoff(omap_findclk(s->omap, "omap3_sys_clkout1"),
+                           s->ccr.prm_clkout_ctrl & 0x80);
             break;
         /* DSS_PRM */
         case 0x0e58: s->dss.rm_rstst &= ~(value & 0xf); break;
@@ -1700,30 +1725,29 @@ static void omap3_prm_write(void *opaque, target_phys_addr_t addr,
         case 0x1158: s->emu.rm_rstst &= ~(value & 7); break;
         case 0x11e4: OMAP_RO_REG(addr); break;
         /* Global_Reg_PRM */
-        case 0x1220: s->prm_vc_smps_sa = value & 0x7f007f; break;
-        case 0x1224: s->prm_vc_smps_vol_ra = value & 0xff00ff; break;
-        case 0x1228: s->prm_vc_smps_cmd_ra = value & 0xff00ff; break;
-        case 0x122c: s->prm_vc_cmd_val_0 = value; break;
-        case 0x1230: s->prm_vc_cmd_val_1 = value; break;
-        case 0x1234: s->prm_vc_hc_conf = value & 0x1f001f; break;
-        case 0x1238: s->prm_vc_i2c_cfg = value & 0x3f; break;
-        case 0x123c: s->prm_vc_bypass_val = value & 0x01ffff7f; break;
-        case 0x1250: s->prm_rstctrl = 0; break; /* TODO: resets */
-        case 0x1254: s->prm_rsttimer = value & 0x1fff; break;
-        case 0x1258: s->prm_rstst &= ~(value & 0x7fb); break;
-        case 0x1260: s->prm_voltctrl = value & 0x1f; break;
-        case 0x1264: s->prm_sram_pcharge = value & 0xff; break;
+        case 0x1220: s->gr.prm_vc_smps_sa = value & 0x7f007f; break;
+        case 0x1224: s->gr.prm_vc_smps_vol_ra = value & 0xff00ff; break;
+        case 0x1228: s->gr.prm_vc_smps_cmd_ra = value & 0xff00ff; break;
+        case 0x122c: s->gr.prm_vc_cmd_val_0 = value; break;
+        case 0x1230: s->gr.prm_vc_cmd_val_1 = value; break;
+        case 0x1234: s->gr.prm_vc_hc_conf = value & 0x1f001f; break;
+        case 0x1238: s->gr.prm_vc_i2c_cfg = value & 0x3f; break;
+        case 0x123c: s->gr.prm_vc_bypass_val = value & 0x01ffff7f; break;
+        case 0x1250: s->gr.prm_rstctrl = 0; break; /* TODO: resets */
+        case 0x1254: s->gr.prm_rsttimer = value & 0x1fff; break;
+        case 0x1258: s->gr.prm_rstst &= ~(value & 0x7fb); break;
+        case 0x1260: s->gr.prm_voltctrl = value & 0x1f; break;
+        case 0x1264: s->gr.prm_sram_pcharge = value & 0xff; break;
         case 0x1270:
-            s->prm_clksrc_ctrl = value & (0xd8);
-            omap3_prm_clksrc_ctrl_update(s, s->prm_clksrc_ctrl);
-            /* TODO: update SYSCLKSEL bits */
+            s->gr.prm_clksrc_ctrl = value & 0xd8; /* set osc bypass mode */ 
+            omap3_prm_clksrc_ctrl_update(s, s->gr.prm_clksrc_ctrl);
             break;
         case 0x1280: OMAP_RO_REG(addr); break;
-        case 0x1290: s->prm_voltsetup1 = value; break;
-        case 0x1294: s->prm_voltoffset = value & 0xffff; break;
-        case 0x1298: s->prm_clksetup = value & 0xffff; break;
-        case 0x129c: s->prm_polctrl = value & 0xf; break;
-        case 0x12a0: s->prm_voltsetup2 = value & 0xffff; break;
+        case 0x1290: s->gr.prm_voltsetup1 = value; break;
+        case 0x1294: s->gr.prm_voltoffset = value & 0xffff; break;
+        case 0x1298: s->gr.prm_clksetup = value & 0xffff; break;
+        case 0x129c: s->gr.prm_polctrl = value & 0xf; break;
+        case 0x12a0: s->gr.prm_voltsetup2 = value & 0xffff; break;
         /* NEON_PRM */
         case 0x1358: s->neon.rm_rstst &= ~(value & 0xf); break;
         case 0x13c8: s->neon.pm_wkdep = value & 0x2; break;
@@ -4095,11 +4119,23 @@ static struct omap3_sms_s *omap3_sms_init(struct omap_mpu_state_s *mpu)
     return s;
 }
 
+#define OMAP3_BOOT_ROM_SIZE 0x1c000 /* 80 + 32 KB */
+static const uint8_t omap3_boot_rom[] = {
+    0x0e, 0xf0, 0xb0, 0xe1, /* movs pc, lr */
+    0x0e, 0xf0, 0xb0, 0xe1, /* movs pc, lr */
+    0x0e, 0xf0, 0xb0, 0xe1, /* movs pc, lr */
+    0x04, 0xf0, 0x5e, 0xe2, /* subs pc, lr, #4 */
+    0x08, 0xf0, 0x5e, 0xe2, /* subs pc, lr, #8 */
+    0x0e, 0xf0, 0xb0, 0xe1, /* movs pc, lr */
+    0x04, 0xf0, 0x5e, 0xe2, /* subs pc, lr, #4 */
+    0x04, 0xf0, 0x5e, 0xe2, /* subs pc, lr, #4 */
+};
+
 static const struct dma_irq_map omap3_dma_irq_map[] = {
-    {0, OMAP_INT_35XX_SDMA_IRQ0},
-    {0, OMAP_INT_35XX_SDMA_IRQ1},
-    {0, OMAP_INT_35XX_SDMA_IRQ2},
-    {0, OMAP_INT_35XX_SDMA_IRQ3},
+    {0, OMAP_INT_3XXX_SDMA_IRQ0},
+    {0, OMAP_INT_3XXX_SDMA_IRQ1},
+    {0, OMAP_INT_3XXX_SDMA_IRQ2},
+    {0, OMAP_INT_3XXX_SDMA_IRQ3},
 };
 
 static int omap3_validate_addr(struct omap_mpu_state_s *s,
@@ -4113,7 +4149,7 @@ struct omap_mpu_state_s *omap3530_mpu_init(unsigned long sdram_size,
 {
     struct omap_mpu_state_s *s = (struct omap_mpu_state_s *)
         qemu_mallocz(sizeof(struct omap_mpu_state_s));
-    ram_addr_t sram_base, q2_base;
+    ram_addr_t sram_base, q2_base, bootrom_base;
     qemu_irq *cpu_irq;
     qemu_irq dma_irqs[4];
     int i;
@@ -4125,7 +4161,7 @@ struct omap_mpu_state_s *omap3530_mpu_init(unsigned long sdram_size,
         exit(1);
     }
     s->sdram_size = sdram_size;
-    s->sram_size = OMAP3530_SRAM_SIZE;
+    s->sram_size = OMAP3XXX_SRAM_SIZE;
 
     /* Clocks */
     omap_clk_init(s);
@@ -4134,10 +4170,17 @@ struct omap_mpu_state_s *omap3530_mpu_init(unsigned long sdram_size,
 
     q2_base = qemu_ram_alloc(s->sdram_size);
     cpu_register_physical_memory(OMAP3_Q2_BASE, s->sdram_size,
-                                 (q2_base | IO_MEM_RAM));
+                                 q2_base | IO_MEM_RAM);
     sram_base = qemu_ram_alloc(s->sram_size);
     cpu_register_physical_memory(OMAP3_SRAM_BASE, s->sram_size,
-                                 (sram_base | IO_MEM_RAM));
+                                 sram_base | IO_MEM_RAM);
+    bootrom_base = qemu_ram_alloc(OMAP3XXX_BOOTROM_SIZE);
+    cpu_register_physical_memory(OMAP3_Q1_BASE, OMAP3_BOOT_ROM_SIZE,
+                                 bootrom_base | IO_MEM_ROM);
+    cpu_register_physical_memory(0, OMAP3_BOOT_ROM_SIZE,
+                                 bootrom_base | IO_MEM_ROM);
+    cpu_physical_memory_write_rom(OMAP3_Q1_BASE, omap3_boot_rom,
+                                  sizeof(omap3_boot_rom));
 
     s->l4 = omap_l4_init(OMAP3_L4_BASE, 
                          sizeof(omap3_l4_agent_info) 
@@ -4166,7 +4209,7 @@ struct omap_mpu_state_s *omap3530_mpu_init(unsigned long sdram_size,
     s->omap3_cm = omap3_cm_init(omap3_l4ta_init(s->l4, L4A_CM), NULL, NULL, NULL, s);
 
     s->omap3_prm = omap3_prm_init(omap3_l4ta_init(s->l4, L4A_PRM),
-                                  s->irq[0][OMAP_INT_35XX_PRCM_MPU_IRQ],
+                                  s->irq[0][OMAP_INT_3XXX_PRCM_MPU_IRQ],
                                   NULL, s);
 
     s->omap3_mpu_wdt = omap3_mpu_wdt_init(omap3_l4ta_init(s->l4, L4A_WDTIMER2),
@@ -4184,51 +4227,51 @@ struct omap_mpu_state_s *omap3530_mpu_init(unsigned long sdram_size,
     s->omap3_sms = omap3_sms_init(s);
 
     s->gptimer[0] = omap_gp_timer_init(omap3_l4ta_init(s->l4, L4A_GPTIMER1),
-                                       s->irq[0][OMAP_INT_35XX_GPT1_IRQ],
+                                       s->irq[0][OMAP_INT_3XXX_GPT1_IRQ],
                                        omap_findclk(s, "omap3_gp1_fclk"),
                                        omap_findclk(s, "omap3_wkup_l4_iclk"));
     s->gptimer[1] = omap_gp_timer_init(omap3_l4ta_init(s->l4, L4A_GPTIMER2),
-                                       s->irq[0][OMAP_INT_35XX_GPT2_IRQ],
+                                       s->irq[0][OMAP_INT_3XXX_GPT2_IRQ],
                                        omap_findclk(s, "omap3_gp2_fclk"),
                                        omap_findclk(s, "omap3_per_l4_iclk"));
     s->gptimer[2] = omap_gp_timer_init(omap3_l4ta_init(s->l4, L4A_GPTIMER3),
-                                       s->irq[0][OMAP_INT_35XX_GPT3_IRQ],
+                                       s->irq[0][OMAP_INT_3XXX_GPT3_IRQ],
                                        omap_findclk(s, "omap3_gp3_fclk"),
                                        omap_findclk(s, "omap3_per_l4_iclk"));
     s->gptimer[3] = omap_gp_timer_init(omap3_l4ta_init(s->l4, L4A_GPTIMER4),
-                                       s->irq[0][OMAP_INT_35XX_GPT4_IRQ],
+                                       s->irq[0][OMAP_INT_3XXX_GPT4_IRQ],
                                        omap_findclk(s, "omap3_gp4_fclk"),
                                        omap_findclk(s, "omap3_per_l4_iclk"));
     s->gptimer[4] = omap_gp_timer_init(omap3_l4ta_init(s->l4, L4A_GPTIMER5),
-                                       s->irq[0][OMAP_INT_35XX_GPT5_IRQ],
+                                       s->irq[0][OMAP_INT_3XXX_GPT5_IRQ],
                                        omap_findclk(s, "omap3_gp5_fclk"),
                                        omap_findclk(s, "omap3_per_l4_iclk"));
     s->gptimer[5] = omap_gp_timer_init(omap3_l4ta_init(s->l4, L4A_GPTIMER6),
-                                       s->irq[0][OMAP_INT_35XX_GPT6_IRQ],
+                                       s->irq[0][OMAP_INT_3XXX_GPT6_IRQ],
                                        omap_findclk(s, "omap3_gp6_fclk"),
                                        omap_findclk(s, "omap3_per_l4_iclk"));
     s->gptimer[6] = omap_gp_timer_init(omap3_l4ta_init(s->l4, L4A_GPTIMER7),
-                                       s->irq[0][OMAP_INT_35XX_GPT7_IRQ],
+                                       s->irq[0][OMAP_INT_3XXX_GPT7_IRQ],
                                        omap_findclk(s, "omap3_gp7_fclk"),
                                        omap_findclk(s, "omap3_per_l4_iclk"));
     s->gptimer[7] = omap_gp_timer_init(omap3_l4ta_init(s->l4, L4A_GPTIMER8),
-                                       s->irq[0][OMAP_INT_35XX_GPT8_IRQ],
+                                       s->irq[0][OMAP_INT_3XXX_GPT8_IRQ],
                                        omap_findclk(s, "omap3_gp8_fclk"),
                                        omap_findclk(s, "omap3_per_l4_iclk"));
     s->gptimer[8] = omap_gp_timer_init(omap3_l4ta_init(s->l4, L4A_GPTIMER9),
-                                       s->irq[0][OMAP_INT_35XX_GPT9_IRQ],
+                                       s->irq[0][OMAP_INT_3XXX_GPT9_IRQ],
                                        omap_findclk(s, "omap3_gp9_fclk"),
                                        omap_findclk(s, "omap3_per_l4_iclk"));
     s->gptimer[9] = omap_gp_timer_init(omap3_l4ta_init(s->l4, L4A_GPTIMER10),
-                                       s->irq[0][OMAP_INT_35XX_GPT10_IRQ],
+                                       s->irq[0][OMAP_INT_3XXX_GPT10_IRQ],
                                        omap_findclk(s, "omap3_gp10_fclk"),
                                        omap_findclk(s, "omap3_core_l4_iclk"));
     s->gptimer[10] = omap_gp_timer_init(omap3_l4ta_init(s->l4, L4A_GPTIMER11),
-                                       s->irq[0][OMAP_INT_35XX_GPT11_IRQ],
+                                       s->irq[0][OMAP_INT_3XXX_GPT11_IRQ],
                                        omap_findclk(s, "omap3_gp12_fclk"),
                                        omap_findclk(s, "omap3_core_l4_iclk"));
     s->gptimer[11] = omap_gp_timer_init(omap3_l4ta_init(s->l4, L4A_GPTIMER12),
-                                        s->irq[0][OMAP_INT_35XX_GPT12_IRQ],
+                                        s->irq[0][OMAP_INT_3XXX_GPT12_IRQ],
                                         omap_findclk(s, "omap3_gp12_fclk"),
                                         omap_findclk(s, "omap3_wkup_l4_iclk"));
     
@@ -4238,87 +4281,87 @@ struct omap_mpu_state_s *omap3530_mpu_init(unsigned long sdram_size,
 
     s->sdrc = omap_sdrc_init(0x6d000000);
     
-    s->gpmc = omap_gpmc_init(s, 0x6e000000, s->irq[0][OMAP_INT_35XX_GPMC_IRQ]);
+    s->gpmc = omap_gpmc_init(s, 0x6e000000, s->irq[0][OMAP_INT_3XXX_GPMC_IRQ]);
     
 
     s->uart[0] = omap2_uart_init(omap3_l4ta_init(s->l4, L4A_UART1),
-                                 s->irq[0][OMAP_INT_35XX_UART1_IRQ],
+                                 s->irq[0][OMAP_INT_3XXX_UART1_IRQ],
                                  omap_findclk(s, "omap3_uart1_fclk"),
                                  omap_findclk(s, "omap3_uart1_iclk"),
-                                 s->drq[OMAP35XX_DMA_UART1_TX],
-                                 s->drq[OMAP35XX_DMA_UART1_RX], 0);
+                                 s->drq[OMAP3XXX_DMA_UART1_TX],
+                                 s->drq[OMAP3XXX_DMA_UART1_RX], 0);
     s->uart[1] = omap2_uart_init(omap3_l4ta_init(s->l4, L4A_UART2),
-                                 s->irq[0][OMAP_INT_35XX_UART2_IRQ],
+                                 s->irq[0][OMAP_INT_3XXX_UART2_IRQ],
                                  omap_findclk(s, "omap3_uart2_fclk"),
                                  omap_findclk(s, "omap3_uart2_iclk"),
-                                 s->drq[OMAP35XX_DMA_UART2_TX],
-                                 s->drq[OMAP35XX_DMA_UART2_RX], 0);
+                                 s->drq[OMAP3XXX_DMA_UART2_TX],
+                                 s->drq[OMAP3XXX_DMA_UART2_RX], 0);
     s->uart[2] = omap2_uart_init(omap3_l4ta_init(s->l4, L4A_UART3),
-                                 s->irq[0][OMAP_INT_35XX_UART3_IRQ],
+                                 s->irq[0][OMAP_INT_3XXX_UART3_IRQ],
                                  omap_findclk(s, "omap3_uart2_fclk"),
                                  omap_findclk(s, "omap3_uart3_iclk"),
-                                 s->drq[OMAP35XX_DMA_UART3_TX],
-                                 s->drq[OMAP35XX_DMA_UART3_RX], 0);
+                                 s->drq[OMAP3XXX_DMA_UART3_TX],
+                                 s->drq[OMAP3XXX_DMA_UART3_RX], 0);
     
     s->dss = omap_dss_init(s, omap3_l4ta_init(s->l4, L4A_DSS), 
-                    s->irq[0][OMAP_INT_35XX_DSS_IRQ], s->drq[OMAP24XX_DMA_DSS],
+                    s->irq[0][OMAP_INT_3XXX_DSS_IRQ], s->drq[OMAP24XX_DMA_DSS],
                    NULL,NULL,NULL,NULL,NULL);
 
     s->gpif = omap3_gpif_init();
     omap3_gpio_init(s, s->gpif ,omap3_l4ta_init(s->l4, L4A_GPIO1),
-                    &s->irq[0][OMAP_INT_35XX_GPIO1_MPU_IRQ], 
+                    &s->irq[0][OMAP_INT_3XXX_GPIO1_MPU_IRQ], 
                     NULL,NULL,0);
     omap3_gpio_init(s, s->gpif ,omap3_l4ta_init(s->l4, L4A_GPIO2),
-                    &s->irq[0][OMAP_INT_35XX_GPIO2_MPU_IRQ], 
+                    &s->irq[0][OMAP_INT_3XXX_GPIO2_MPU_IRQ], 
                     NULL,NULL,1);
     omap3_gpio_init(s, s->gpif ,omap3_l4ta_init(s->l4, L4A_GPIO3),
-                    &s->irq[0][OMAP_INT_35XX_GPIO3_MPU_IRQ], 
+                    &s->irq[0][OMAP_INT_3XXX_GPIO3_MPU_IRQ], 
                     NULL,NULL,2);
     omap3_gpio_init(s, s->gpif ,omap3_l4ta_init(s->l4, L4A_GPIO4),
-                    &s->irq[0][OMAP_INT_35XX_GPIO4_MPU_IRQ], 
+                    &s->irq[0][OMAP_INT_3XXX_GPIO4_MPU_IRQ], 
                     NULL,NULL,3);
     omap3_gpio_init(s, s->gpif ,omap3_l4ta_init(s->l4, L4A_GPIO5),
-                    &s->irq[0][OMAP_INT_35XX_GPIO5_MPU_IRQ], 
+                    &s->irq[0][OMAP_INT_3XXX_GPIO5_MPU_IRQ], 
                     NULL,NULL,4);
     omap3_gpio_init(s, s->gpif ,omap3_l4ta_init(s->l4, L4A_GPIO6),
-                    &s->irq[0][OMAP_INT_35XX_GPIO6_MPU_IRQ], 
+                    &s->irq[0][OMAP_INT_3XXX_GPIO6_MPU_IRQ], 
                     NULL,NULL,5);
 
     omap_tap_init(omap3_l4ta_init(s->l4, L4A_TAP), s);
 
     s->omap3_mmc[0] = omap3_mmc_init(omap3_l4ta_init(s->l4, L4A_MMC1),
-                                     s->irq[0][OMAP_INT_35XX_MMC1_IRQ],
-                                     &s->drq[OMAP35XX_DMA_MMC1_TX],
+                                     s->irq[0][OMAP_INT_3XXX_MMC1_IRQ],
+                                     &s->drq[OMAP3XXX_DMA_MMC1_TX],
                                      omap_findclk(s, "omap3_mmc1_fclk"),
                                      omap_findclk(s, "omap3_mmc1_iclk"));
 
     s->omap3_mmc[1] = omap3_mmc_init(omap3_l4ta_init(s->l4, L4A_MMC2),
-                                     s->irq[0][OMAP_INT_35XX_MMC2_IRQ],
-                                     &s->drq[OMAP35XX_DMA_MMC2_TX],
+                                     s->irq[0][OMAP_INT_3XXX_MMC2_IRQ],
+                                     &s->drq[OMAP3XXX_DMA_MMC2_TX],
                                      omap_findclk(s, "omap3_mmc2_fclk"),
                                      omap_findclk(s, "omap3_mmc2_iclk"));
 
     s->omap3_mmc[2] = omap3_mmc_init(omap3_l4ta_init(s->l4, L4A_MMC3),
-                                     s->irq[0][OMAP_INT_35XX_MMC3_IRQ],
-                                     &s->drq[OMAP35XX_DMA_MMC3_TX],
+                                     s->irq[0][OMAP_INT_3XXX_MMC3_IRQ],
+                                     &s->drq[OMAP3XXX_DMA_MMC3_TX],
                                      omap_findclk(s, "omap3_mmc3_fclk"),
                                      omap_findclk(s, "omap3_mmc3_iclk"));
 
     s->i2c[0] = omap3_i2c_init(omap3_l4ta_init(s->l4, L4A_I2C1),
-                               s->irq[0][OMAP_INT_35XX_I2C1_IRQ],
-                               &s->drq[OMAP35XX_DMA_I2C1_TX],
+                               s->irq[0][OMAP_INT_3XXX_I2C1_IRQ],
+                               &s->drq[OMAP3XXX_DMA_I2C1_TX],
                                omap_findclk(s, "omap3_i2c1_fclk"),
                                omap_findclk(s, "omap3_i2c1_iclk"),
                                8);
     s->i2c[1] = omap3_i2c_init(omap3_l4ta_init(s->l4, L4A_I2C2),
-                               s->irq[0][OMAP_INT_35XX_I2C2_IRQ],
-                               &s->drq[OMAP35XX_DMA_I2C2_TX],
+                               s->irq[0][OMAP_INT_3XXX_I2C2_IRQ],
+                               &s->drq[OMAP3XXX_DMA_I2C2_TX],
                                omap_findclk(s, "omap3_i2c2_fclk"),
                                omap_findclk(s, "omap3_i2c2_iclk"),
                                8);
     s->i2c[2] = omap3_i2c_init(omap3_l4ta_init(s->l4, L4A_I2C3),
-                               s->irq[0][OMAP_INT_35XX_I2C3_IRQ],
-                               &s->drq[OMAP35XX_DMA_I2C3_TX],
+                               s->irq[0][OMAP_INT_3XXX_I2C3_IRQ],
+                               &s->drq[OMAP3XXX_DMA_I2C3_TX],
                                omap_findclk(s, "omap3_i2c3_fclk"),
                                omap_findclk(s, "omap3_i2c3_iclk"),
                                64);
@@ -4326,11 +4369,11 @@ struct omap_mpu_state_s *omap3530_mpu_init(unsigned long sdram_size,
     s->omap3_usb = omap3_hsusb_init(omap3_l4ta_init(s->l4, L4A_USBHS_OTG),
                                     omap3_l4ta_init(s->l4, L4A_USBHS_HOST),
                                     omap3_l4ta_init(s->l4, L4A_USBHS_TLL),
-                                    s->irq[0][OMAP_INT_35XX_HSUSB_MC],
-                                    s->irq[0][OMAP_INT_35XX_HSUSB_DMA],
-                                    s->irq[0][OMAP_INT_35XX_OHCI_IRQ],
-                                    s->irq[0][OMAP_INT_35XX_EHCI_IRQ],
-                                    s->irq[0][OMAP_INT_35XX_TLL_IRQ]);
+                                    s->irq[0][OMAP_INT_3XXX_HSUSB_MC],
+                                    s->irq[0][OMAP_INT_3XXX_HSUSB_DMA],
+                                    s->irq[0][OMAP_INT_3XXX_OHCI_IRQ],
+                                    s->irq[0][OMAP_INT_3XXX_EHCI_IRQ],
+                                    s->irq[0][OMAP_INT_3XXX_TLL_IRQ]);
     return s;
 }
 
index b78c25d..26a7e20 100644 (file)
@@ -36,7 +36,7 @@ struct clk {
 #define CLOCK_IN_OMAP242X      (1 << 14)
 #define CLOCK_IN_OMAP243X      (1 << 15)
 #define CLOCK_IN_OMAP343X      (1 << 16)
-#define CLOCK_IN_OMAP353X   (1 << 17)
+#define CLOCK_IN_OMAP3XXX   (1 << 17)
     uint32_t flags;
     int id;
 
@@ -945,38 +945,68 @@ static struct clk omapctrl_clk = {
     .parent    = &core_l4_iclk,
 };
 
-/*OMAP3 Clocks*/
+/* OMAP3 Clocks */
 
 static struct clk omap3_sys_32k = {
     .name      = "omap3_sys_32k",
     .rate      = 32768,
-    .flags     = CLOCK_IN_OMAP353X  | ALWAYS_ENABLED,
+    .flags     = CLOCK_IN_OMAP3XXX  | ALWAYS_ENABLED,
 };
 
-static struct clk omap3_sys_xtalin = {
-    .name      = "omap3_sys_xtalin",
+static struct clk omap3_osc_sys_clk12 = {
+    .name      = "omap3_osc_sys_clk12",
+    .rate      = 12000000,
+    .flags     = CLOCK_IN_OMAP3XXX  | ALWAYS_ENABLED,
+};
+
+static struct clk omap3_osc_sys_clk13 = {
+    .name      = "omap3_osc_sys_clk13",
+    .rate      = 13000000,
+    .flags     = CLOCK_IN_OMAP3XXX  | ALWAYS_ENABLED,
+};
+
+static struct clk omap3_osc_sys_clk168 = {
+    .name      = "omap3_osc_sys_clk168",
+    .rate      = 16800000,
+    .flags     = CLOCK_IN_OMAP3XXX  | ALWAYS_ENABLED,
+};
+
+static struct clk omap3_osc_sys_clk192 = {
+    .name      = "omap3_osc_sys_clk192",
+    .rate      = 19200000,
+    .flags     = CLOCK_IN_OMAP3XXX  | ALWAYS_ENABLED,
+};
+
+static struct clk omap3_osc_sys_clk26 = {
+    .name      = "omap3_osc_sys_clk26",
     .rate      = 26000000,
-    .flags     = CLOCK_IN_OMAP353X  | ALWAYS_ENABLED,
+    .flags     = CLOCK_IN_OMAP3XXX  | ALWAYS_ENABLED,
+};
+
+static struct clk omap3_osc_sys_clk384 = {
+    .name      = "omap3_osc_sys_clk384",
+    .rate      = 38400000,
+    .flags     = CLOCK_IN_OMAP3XXX  | ALWAYS_ENABLED,
 };
 
 /*Is the altclk is enabled in beagle board?*/
 static struct clk omap3_sys_altclk = {
     .name      = "omap3_sys_altclk",
     .rate      = 13000000,
-    .flags     = CLOCK_IN_OMAP353X  ,
+    .flags     = CLOCK_IN_OMAP3XXX  ,
 };
 
 /*PRM*/
 static struct clk omap3_sys_clk = {
     .name      = "omap3_sys_clk",
-    .flags     = CLOCK_IN_OMAP353X  | ALWAYS_ENABLED,
-    .parent = &omap3_sys_xtalin,
+    .flags     = CLOCK_IN_OMAP3XXX  | ALWAYS_ENABLED,
+    .parent = &omap3_osc_sys_clk26,
 };
 
 static struct clk omap3_32k_fclk = {
     .name      = "omap3_32k_fclk",
     .rate      = 32768,
-    .flags     = CLOCK_IN_OMAP353X  | ALWAYS_ENABLED,
+    .flags     = CLOCK_IN_OMAP3XXX  | ALWAYS_ENABLED,
     .parent = &omap3_sys_32k,
 };
 
@@ -989,19 +1019,19 @@ static struct clk omap3_32k_fclk = {
  */
 static struct clk omap3_core_clk = {
     .name      = "omap3_core_clk",
-    .flags     = CLOCK_IN_OMAP353X | ALWAYS_ENABLED,
+    .flags     = CLOCK_IN_OMAP3XXX | ALWAYS_ENABLED,
     .parent    = &omap3_sys_clk,       
 };
 
 static struct clk omap3_core2_clk = {
     .name      = "omap3_core2_clk",
-    .flags     = CLOCK_IN_OMAP353X ,
+    .flags     = CLOCK_IN_OMAP3XXX ,
     .parent    = &omap3_sys_clk,       
 };
 
 static struct clk omap3_emu_core_alwon_clk = {
     .name      = "omap3_emu_core_alwon_clk",
-    .flags     = CLOCK_IN_OMAP353X ,
+    .flags     = CLOCK_IN_OMAP3XXX ,
     .parent    = &omap3_sys_clk,       
 };
 
@@ -1014,14 +1044,14 @@ static struct clk omap3_emu_core_alwon_clk = {
  */
 static struct clk omap3_mpu_clk = {
     .name      = "omap3_mpu_clk",
-    .flags     = CLOCK_IN_OMAP353X ,
+    .flags     = CLOCK_IN_OMAP3XXX ,
     .parent    = &omap3_core_clk,         /*between sys_clk and core_clk*/
 };
 
 /*DPLL2: it is for iva2*/
 static struct clk omap3_iva2_clk = {
     .name      = "omap3_iva2_clk",
-    .flags     = CLOCK_IN_OMAP353X ,
+    .flags     = CLOCK_IN_OMAP3XXX ,
     .parent    = &omap3_core_clk,         /*between sys_clk and core_clk*/
 };
 
@@ -1036,30 +1066,30 @@ static struct clk omap3_iva2_clk = {
  */
 static struct clk omap3_96m_fclk = {
     .name      = "omap3_96m_fclk",
-    .flags     = CLOCK_IN_OMAP353X ,
+    .flags     = CLOCK_IN_OMAP3XXX ,
     .parent    = &omap3_sys_clk,                  
 };
 
 static struct clk omap3_54m_fclk = {
     .name      = "omap3_54m_fclk",
-    .flags     = CLOCK_IN_OMAP353X ,
+    .flags     = CLOCK_IN_OMAP3XXX ,
     .parent    = &omap3_sys_clk,           
 };
 
 static struct clk omap3_dss1_alwon_fclk = {
     .name      = "omap3_dss1_alwon_fclk",
-    .flags     = CLOCK_IN_OMAP353X ,
+    .flags     = CLOCK_IN_OMAP3XXX ,
     .parent    = &omap3_sys_clk,           
 };
 
 static struct clk omap3_cam_mclk = {
     .name      = "omap3_cam_mclk",
-    .flags     = CLOCK_IN_OMAP353X ,
+    .flags     = CLOCK_IN_OMAP3XXX ,
     .parent    = &omap3_sys_clk,           
 };
 static struct clk omap3_per_alwon_clk = {
     .name      = "omap3_per_alwon_clk",
-    .flags     = CLOCK_IN_OMAP353X ,
+    .flags     = CLOCK_IN_OMAP3XXX ,
     .parent    = &omap3_sys_clk,           
 };
 
@@ -1070,20 +1100,20 @@ static struct clk omap3_per_alwon_clk = {
  */
 static struct clk omap3_120m_fclk = {
     .name      = "omap3_120m_fclk",
-    .flags     = CLOCK_IN_OMAP353X ,
+    .flags     = CLOCK_IN_OMAP3XXX ,
     .parent    = &omap3_sys_clk,        
 };
 
 /*CM*/
 static struct clk omap3_48m_fclk = {
     .name      = "omap3_48m_fclk",
-    .flags     = CLOCK_IN_OMAP353X ,
+    .flags     = CLOCK_IN_OMAP3XXX ,
     .parent    = &omap3_96m_fclk,          /*omap3_96m_fclk and omap3_sys_altclk*/
 };
 
 static struct clk omap3_12m_fclk = {
     .name      = "omap3_12m_fclk",
-    .flags     = CLOCK_IN_OMAP353X ,
+    .flags     = CLOCK_IN_OMAP3XXX ,
     .parent    = &omap3_48m_fclk,          /*omap3_48m_fclk and omap3_sys_altclk*/
 };
 
@@ -1097,24 +1127,24 @@ static struct clk omap3_12m_fclk = {
  */
 static struct clk omap3_l3x2_iclk = {
     .name      = "omap3_l3x2_iclk",
-    .flags     = CLOCK_IN_OMAP353X | ALWAYS_ENABLED,
+    .flags     = CLOCK_IN_OMAP3XXX | ALWAYS_ENABLED,
     .parent    = &omap3_core_clk,
 };
 
 static struct clk omap3_l3_iclk = {
     .name      = "omap3_l3_iclk",
-    .flags     = CLOCK_IN_OMAP353X | ALWAYS_ENABLED,
+    .flags     = CLOCK_IN_OMAP3XXX | ALWAYS_ENABLED,
     .parent    = &omap3_core_clk,
 };
 
 static struct clk omap3_l4_iclk = {
     .name      = "omap3_l4_iclk",
-    .flags     = CLOCK_IN_OMAP353X | ALWAYS_ENABLED,
+    .flags     = CLOCK_IN_OMAP3XXX | ALWAYS_ENABLED,
     .parent    = &omap3_l3_iclk,
 };
 static struct clk omap3_rm_iclk = {
     .name      = "omap3_rm_iclk",
-    .flags     = CLOCK_IN_OMAP353X | ALWAYS_ENABLED,
+    .flags     = CLOCK_IN_OMAP3XXX | ALWAYS_ENABLED,
     .parent    = &omap3_l4_iclk,
 };
 
@@ -1144,88 +1174,88 @@ static struct clk omap3_rm_iclk = {
  */
 static struct clk omap3_gp10_fclk = {
     .name      = "omap3_gp10_fclk",
-    .flags     = CLOCK_IN_OMAP353X,
+    .flags     = CLOCK_IN_OMAP3XXX,
     .parent    = &omap3_32k_fclk,   /*omap3_32k_fclk and omap3_sys_clk*/
 };
 
 static struct clk omap3_gp11_fclk = {
     .name      = "omap3_gp11_fclk",
-    .flags     = CLOCK_IN_OMAP353X,
+    .flags     = CLOCK_IN_OMAP3XXX,
     .parent    = &omap3_32k_fclk,   /*omap3_32k_fclk and omap3_sys_clk*/
 };
 
 static struct clk omap3_core_32k_fclk = {
     .name      = "omap3_core_32k_fclk",
-    .flags     = CLOCK_IN_OMAP353X,
+    .flags     = CLOCK_IN_OMAP3XXX,
     .parent    = &omap3_32k_fclk, 
 };
 
 static struct clk omap3_cpefuse_fclk = {
     .name      = "omap3_cpefuse_fclk",
-    .flags     = CLOCK_IN_OMAP353X,
+    .flags     = CLOCK_IN_OMAP3XXX,
     .parent    = &omap3_sys_clk, 
 };
 
 static struct clk omap3_core_120m_fclk = {
     .name      = "omap3_core_120m_fclk",
-    .flags     = CLOCK_IN_OMAP353X,
+    .flags     = CLOCK_IN_OMAP3XXX,
     .parent    = &omap3_120m_fclk, 
 };
 
 static struct clk omap3_core_96m_fclk = {
     .name      = "omap3_core_96m_fclk",
-    .flags     = CLOCK_IN_OMAP353X,
+    .flags     = CLOCK_IN_OMAP3XXX,
     .parent    = &omap3_96m_fclk, 
 };
 
 static struct clk omap3_core_48m_fclk = {
     .name      = "omap3_core_48m_fclk",
-    .flags     = CLOCK_IN_OMAP353X,
+    .flags     = CLOCK_IN_OMAP3XXX,
     .parent    = &omap3_48m_fclk, 
 };
 
 static struct clk omap3_core_12m_fclk = {
     .name      = "omap3_core_12m_fclk",
-    .flags     = CLOCK_IN_OMAP353X,
+    .flags     = CLOCK_IN_OMAP3XXX,
     .parent    = &omap3_12m_fclk, 
 };
 
 static struct clk omap3_core_l3_iclk = {
     .name      = "omap3_core_l3_iclk",
-    .flags     = CLOCK_IN_OMAP353X | ALWAYS_ENABLED,
+    .flags     = CLOCK_IN_OMAP3XXX | ALWAYS_ENABLED,
     .parent    = &omap3_l3_iclk, 
 };
 
 
 static struct clk omap3_core_l4_iclk = {
     .name      = "omap3_core_l4_iclk",
-    .flags     = CLOCK_IN_OMAP353X | ALWAYS_ENABLED,
+    .flags     = CLOCK_IN_OMAP3XXX | ALWAYS_ENABLED,
     .parent    = &omap3_l4_iclk, 
 };
 
 /*WKUP Power Domain*/
 static struct clk omap3_wkup_32k_fclk = {
     .name      = "omap3_wkup_32k_fclk",
-    .flags     = CLOCK_IN_OMAP353X ,
+    .flags     = CLOCK_IN_OMAP3XXX ,
     .parent    = &omap3_32k_fclk, 
 };
 
 static struct clk omap3_wkup_l4_iclk = {
     .name      = "omap3_wkup_l4_iclk",
-    .flags     = CLOCK_IN_OMAP353X,
+    .flags     = CLOCK_IN_OMAP3XXX,
     .enabled = 1,
     .parent    = &omap3_sys_clk, 
 };
 
 static struct clk omap3_gp1_fclk = {
     .name      = "omap3_gp1_fclk",
-    .flags     = CLOCK_IN_OMAP353X ,
+    .flags     = CLOCK_IN_OMAP3XXX ,
     .parent    = &omap3_32k_fclk,        /*omap3_32k_fclk and omap3_sys_clk*/
 };
 
 static struct clk omap3_gp12_fclk = {
     .name      = "omap3_gp12_fclk",
-    .flags     = CLOCK_IN_OMAP353X ,
+    .flags     = CLOCK_IN_OMAP3XXX ,
     .parent    = &omap3_32k_fclk,        /*SECURE_32K_FCLK -> 32-kHz oscillator */
 };
 
@@ -1233,67 +1263,67 @@ static struct clk omap3_gp12_fclk = {
 /*gp2-gp9 timer*/
 static struct clk omap3_gp2_fclk = {
     .name      = "omap3_gp2_fclk",
-    .flags     = CLOCK_IN_OMAP353X ,
+    .flags     = CLOCK_IN_OMAP3XXX ,
     .parent    = &omap3_32k_fclk,        /*omap3_32k_fclk and omap3_sys_clk*/
 };
 
 static struct clk omap3_gp3_fclk = {
     .name      = "omap3_gp3_fclk",
-    .flags     = CLOCK_IN_OMAP353X ,
+    .flags     = CLOCK_IN_OMAP3XXX ,
     .parent    = &omap3_32k_fclk,        /*omap3_32k_fclk and omap3_sys_clk*/
 };
 
 static struct clk omap3_gp4_fclk = {
     .name      = "omap3_gp4_fclk",
-    .flags     = CLOCK_IN_OMAP353X ,
+    .flags     = CLOCK_IN_OMAP3XXX ,
     .parent    = &omap3_32k_fclk,        /*omap3_32k_fclk and omap3_sys_clk*/
 };
 
 static struct clk omap3_gp5_fclk = {
     .name      = "omap3_gp5_fclk",
-    .flags     = CLOCK_IN_OMAP353X ,
+    .flags     = CLOCK_IN_OMAP3XXX ,
     .parent    = &omap3_32k_fclk,        /*omap3_32k_fclk and omap3_sys_clk*/
 };
 
 static struct clk omap3_gp6_fclk = {
     .name      = "omap3_gp6_fclk",
-    .flags     = CLOCK_IN_OMAP353X ,
+    .flags     = CLOCK_IN_OMAP3XXX ,
     .parent    = &omap3_32k_fclk,        /*omap3_32k_fclk and omap3_sys_clk*/
 };
 
 static struct clk omap3_gp7_fclk = {
     .name      = "omap3_gp7_fclk",
-    .flags     = CLOCK_IN_OMAP353X ,
+    .flags     = CLOCK_IN_OMAP3XXX ,
     .parent    = &omap3_32k_fclk,        /*omap3_32k_fclk and omap3_sys_clk*/
 };
 
 static struct clk omap3_gp8_fclk = {
     .name      = "omap3_gp8_fclk",
-    .flags     = CLOCK_IN_OMAP353X ,
+    .flags     = CLOCK_IN_OMAP3XXX ,
     .parent    = &omap3_32k_fclk,        /*omap3_32k_fclk and omap3_sys_clk*/
 };
 
 static struct clk omap3_gp9_fclk = {
     .name      = "omap3_gp9_fclk",
-    .flags     = CLOCK_IN_OMAP353X ,
+    .flags     = CLOCK_IN_OMAP3XXX ,
     .parent    = &omap3_32k_fclk,        /*omap3_32k_fclk and omap3_sys_clk*/
 };
 
 static struct clk omap3_per_96m_fclk = {
     .name      = "omap3_per_96m_fclk",
-    .flags     = CLOCK_IN_OMAP353X ,
+    .flags     = CLOCK_IN_OMAP3XXX ,
     .parent    = &omap3_96m_fclk,        
 };
 
 static struct clk omap3_per_48m_fclk = {
     .name      = "omap3_per_48m_fclk",
-    .flags     = CLOCK_IN_OMAP353X ,
+    .flags     = CLOCK_IN_OMAP3XXX ,
     .parent    = &omap3_48m_fclk,        
 };
 
 static struct clk omap3_per_l4_iclk = {
     .name      = "omap3_per_l4_iclk",
-    .flags     = CLOCK_IN_OMAP353X,
+    .flags     = CLOCK_IN_OMAP3XXX,
     .enabled = 1,
     .parent    = &omap3_l4_iclk, 
 };
@@ -1301,51 +1331,51 @@ static struct clk omap3_per_l4_iclk = {
 /*UART Clocks*/
 static struct clk omap3_uart1_fclk = {
     .name      = "omap3_uart1_fclk",
-    .flags     = CLOCK_IN_OMAP353X ,
+    .flags     = CLOCK_IN_OMAP3XXX ,
     .parent    = &omap3_core_48m_fclk,        
 };
 
 static struct clk omap3_uart1_iclk = {
     .name      = "omap3_uart1_iclk",
-    .flags     = CLOCK_IN_OMAP353X ,
+    .flags     = CLOCK_IN_OMAP3XXX ,
     .parent    = &omap3_core_l4_iclk,        
 };
 
 static struct clk omap3_uart2_fclk = {
     .name      = "omap3_uart2_fclk",
-    .flags     = CLOCK_IN_OMAP353X ,
+    .flags     = CLOCK_IN_OMAP3XXX ,
     .parent    = &omap3_core_48m_fclk,        
 };
 
 static struct clk omap3_uart2_iclk = {
     .name      = "omap3_uart2_iclk",
-    .flags     = CLOCK_IN_OMAP353X ,
+    .flags     = CLOCK_IN_OMAP3XXX ,
     .parent    = &omap3_core_l4_iclk,        
 };
 
 static struct clk omap3_uart3_fclk = {
     .name      = "omap3_uart3_fclk",
-    .flags     = CLOCK_IN_OMAP353X ,
+    .flags     = CLOCK_IN_OMAP3XXX ,
     .parent    = &omap3_per_48m_fclk,        
 };
 
 static struct clk omap3_uart3_iclk = {
     .name      = "omap3_uart3_iclk",
-    .flags     = CLOCK_IN_OMAP353X ,
+    .flags     = CLOCK_IN_OMAP3XXX ,
     .parent    = &omap3_core_l4_iclk,        
 };
 
 /*INTC Clock*/
 static struct clk omap3_mpu_intc_fclk = {
     .name      = "omap3_mpu_intc_fclk",
-    .flags     = CLOCK_IN_OMAP353X ,
+    .flags     = CLOCK_IN_OMAP3XXX ,
     .divisor = 2,
     .parent    = &omap3_mpu_clk,        
 };
 
 static struct clk omap3_mpu_intc_iclk = {
     .name      = "omap3_mpu_intc_iclk",
-    .flags     = CLOCK_IN_OMAP353X ,
+    .flags     = CLOCK_IN_OMAP3XXX ,
     .divisor = 2,
     .parent    = &omap3_mpu_clk,        
 };
@@ -1353,94 +1383,100 @@ static struct clk omap3_mpu_intc_iclk = {
 /*SDMA clock*/
 static struct clk omap3_sdma_fclk = {
     .name      = "omap3_sdma_fclk",
-    .flags     = CLOCK_IN_OMAP353X ,
+    .flags     = CLOCK_IN_OMAP3XXX ,
     .parent    = &omap3_core_l3_iclk,        
 };
 
 static struct clk omap3_sdma_iclk = {
     .name      = "omap3_sdma_iclk",
-    .flags     = CLOCK_IN_OMAP353X ,
+    .flags     = CLOCK_IN_OMAP3XXX ,
     .parent    = &omap3_core_l4_iclk,        
 };
 
 /*CLKOUT*/
+static struct clk omap3_sys_clkout1 = {
+    .name   = "omap3_sys_clkout1",
+    .flags  = CLOCK_IN_OMAP3XXX,
+    .parent = &omap3_osc_sys_clk26, /* same parent as as SYS_CLK */
+};
+
 static struct clk omap3_sys_clkout2 = {
     .name      = "omap3_sys_clkout2",
-    .flags     = CLOCK_IN_OMAP353X ,
+    .flags     = CLOCK_IN_OMAP3XXX ,
     .parent    = &omap3_core_clk,        /*CORE_CLK CM_SYS_CLK CM_96M_FCLK 54 MHz clock*/
 };
 
 /*MMC Clock*/
 static struct clk omap3_mmc1_fclk = {
     .name      = "omap3_mmc1_fclk",
-    .flags     = CLOCK_IN_OMAP353X ,
+    .flags     = CLOCK_IN_OMAP3XXX ,
     .parent    = &omap3_per_96m_fclk,       
 };
 
 static struct clk omap3_mmc1_iclk = {
     .name      = "omap3_mmc1_iclk",
-    .flags     = CLOCK_IN_OMAP353X ,
+    .flags     = CLOCK_IN_OMAP3XXX ,
     .parent    = &omap3_per_l4_iclk,       
 };
 
 static struct clk omap3_mmc2_fclk = {
     .name      = "omap3_mmc2_fclk",
-    .flags     = CLOCK_IN_OMAP353X ,
+    .flags     = CLOCK_IN_OMAP3XXX ,
     .parent    = &omap3_per_96m_fclk,       
 };
 
 static struct clk omap3_mmc2_iclk = {
     .name      = "omap3_mmc2_iclk",
-    .flags     = CLOCK_IN_OMAP353X ,
+    .flags     = CLOCK_IN_OMAP3XXX ,
     .parent    = &omap3_per_l4_iclk,       
 };
 
 static struct clk omap3_mmc3_fclk = {
     .name      = "omap3_mmc3_fclk",
-    .flags     = CLOCK_IN_OMAP353X ,
+    .flags     = CLOCK_IN_OMAP3XXX ,
     .parent    = &omap3_per_96m_fclk,       
 };
 
 static struct clk omap3_mmc3_iclk = {
     .name      = "omap3_mmc3_iclk",
-    .flags     = CLOCK_IN_OMAP353X ,
+    .flags     = CLOCK_IN_OMAP3XXX ,
     .parent    = &omap3_per_l4_iclk,       
 };
 
 /*I2C Clocls*/
 static struct clk omap3_i2c1_fclk = {
     .name      = "omap3_i2c1_fclk",
-    .flags     = CLOCK_IN_OMAP353X ,
+    .flags     = CLOCK_IN_OMAP3XXX ,
     .parent    = &omap3_per_96m_fclk,       
 };
 
 static struct clk omap3_i2c1_iclk = {
     .name      = "omap3_i2c1_iclk",
-    .flags     = CLOCK_IN_OMAP353X ,
+    .flags     = CLOCK_IN_OMAP3XXX ,
     .parent    = &omap3_core_l4_iclk,       
 };
 
 static struct clk omap3_i2c2_fclk = {
     .name      = "omap3_i2c2_fclk",
-    .flags     = CLOCK_IN_OMAP353X ,
+    .flags     = CLOCK_IN_OMAP3XXX ,
     .parent    = &omap3_per_96m_fclk,       
 };
 
 static struct clk omap3_i2c2_iclk = {
     .name      = "omap3_i2c2_iclk",
-    .flags     = CLOCK_IN_OMAP353X ,
+    .flags     = CLOCK_IN_OMAP3XXX ,
     .parent    = &omap3_core_l4_iclk,       
 };
 
 static struct clk omap3_i2c3_fclk = {
     .name      = "omap3_i2c3_fclk",
-    .flags     = CLOCK_IN_OMAP353X ,
+    .flags     = CLOCK_IN_OMAP3XXX ,
     .parent    = &omap3_per_96m_fclk,       
 };
 
 static struct clk omap3_i2c3_iclk = {
     .name      = "omap3_i2c3_iclk",
-    .flags     = CLOCK_IN_OMAP353X ,
+    .flags     = CLOCK_IN_OMAP3XXX ,
     .parent    = &omap3_core_l4_iclk,       
 };
 
@@ -1591,7 +1627,12 @@ static struct clk *onchip_clks[] = {
     /* OMAP 3*/
 
     &omap3_sys_32k,
-    &omap3_sys_xtalin,
+    &omap3_osc_sys_clk12,
+    &omap3_osc_sys_clk13,
+    &omap3_osc_sys_clk168,
+    &omap3_osc_sys_clk192,
+    &omap3_osc_sys_clk26,
+    &omap3_osc_sys_clk384,
     &omap3_sys_altclk,
     &omap3_sys_clk,
     &omap3_32k_fclk,
@@ -1647,6 +1688,7 @@ static struct clk *onchip_clks[] = {
     &omap3_mpu_intc_iclk,
     &omap3_sdma_fclk,
     &omap3_sdma_iclk,
+    &omap3_sys_clkout1,
     &omap3_sys_clkout2,
     &omap3_mmc1_fclk,
     &omap3_mmc1_iclk,
@@ -1806,7 +1848,7 @@ void omap_clk_init(struct omap_mpu_state_s *mpu)
     else if (cpu_is_omap3430(mpu))
         flag = CLOCK_IN_OMAP243X;
     else if (cpu_is_omap3530(mpu))
-        flag = CLOCK_IN_OMAP353X;
+        flag = CLOCK_IN_OMAP3XXX;
     else
         return;