Re: [PATCH 06/19] ARM: OMAP4: Auto generate SAR layout contents

2012-04-24 Thread Tony Lindgren
* Tero Kristo t-kri...@ti.com [120420 02:38]:
 -void omap4_sar_overwrite(void)
 +void omap_sar_overwrite(void)
  {
   u32 val = 0;
 - u32 offset = 0;
 + u32 usb_offset = 0x2ec;
 + u32 usb_offset2 = 0x91c;
  
 - if (cpu_is_omap446x())
 - offset = 0x04;
 + if (cpu_is_omap446x()) {
 + usb_offset = 0x2f4;
 + usb_offset2 = 0x920;
 + }

Here too you should initialized these during __init. Otherwise
we'll end up piling more and more if else cpu_is_omap for
future omaps that again might change the offsets.

Tony
--
To unsubscribe from this list: send the line unsubscribe linux-omap in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH 06/19] ARM: OMAP4: Auto generate SAR layout contents

2012-04-20 Thread Tero Kristo
SAR layout contents are now generated automatically based on SAR ROM
contents during boot.

u32 offset  description
--  -
0   pointer to next entry
1   size of DMA transfer in bytes
2   SAR RAM address for save / restore
3   IO address for save / restore

sar_layout_generate() parses this info and stores the resulting data to
a list of sar_ram_entry structs, which in turn will be used by sar_save.

Signed-off-by: Tero Kristo t-kri...@ti.com
---
 arch/arm/mach-omap2/omap-sar.c |  290 +++-
 1 files changed, 194 insertions(+), 96 deletions(-)

diff --git a/arch/arm/mach-omap2/omap-sar.c b/arch/arm/mach-omap2/omap-sar.c
index 74e0207..da4696a 100644
--- a/arch/arm/mach-omap2/omap-sar.c
+++ b/arch/arm/mach-omap2/omap-sar.c
@@ -2,7 +2,8 @@
  * OMAP4 Save Restore source file
  *
  * Copyright (C) 2010 Texas Instruments, Inc.
- * Written by Santosh Shilimkar santosh.shilim...@ti.com
+ * Santosh Shilimkar santosh.shilim...@ti.com
+ * Tero Kristo t-kri...@ti.com
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License version 2 as
@@ -14,6 +15,7 @@
 #include linux/io.h
 #include linux/platform_device.h
 #include linux/clk.h
+#include linux/slab.h
 
 #include iomap.h
 #include pm.h
@@ -25,35 +27,18 @@
 #include cminst44xx.h
 
 static void __iomem *sar_ram_base;
-static void __iomem *omap4_sar_modules[MAX_SAR_MODULES];
 static struct powerdomain *l3init_pwrdm;
static struct clockdomain *l3init_clkdm;
 static struct clk *usb_host_ck, *usb_tll_ck;
 
-/*
- * SAR_RAM1 register layout consist of EMIF1, EMIF2, CM1, CM2,
- * CONTROL_CORE efuse, DMM and USB TLL registers.
- * The layout is arranged is a two dimentional array like
- * below,
- * const u32 sar_ramX_layout[nb_regs_sets][4] = {
- * {module_index, reg_offset, size, sar_ram_offset},
- * }
- */
-static const u32 omap443x_sar_ram1_layout[][4] = {
-};
-
-/*
- * SAR_RAM2 register layout consist of SYSCTRL_PADCONF_CORE regsiters
- */
-static const u32 omap443x_sar_ram2_layout[][4] = {
+struct sar_ram_entry {
+   void __iomem *io_base;
+   u32 offset;
+   u32 size;
+   u32 ram_addr;
 };
 
-/*
- * SAR_RAM3 and  SAR_RAM4 layout is not listed since moslty it's handle by
- * secure software.
- */
-static const u32 omap443x_sar_ram3_layout[][4] = {
-};
+static struct sar_ram_entry *sar_ram_layout[3];
 
 /*
  * omap_sar_save :
@@ -63,25 +48,20 @@ static const u32 omap443x_sar_ram3_layout[][4] = {
  * @sar_bank_offset - where to backup
  * @sar_layout - constant table containing the backup info
  */
-static void sar_save(u32 nb_regs, u32 sar_bank, const u32 
sar_layout_table[][4])
+static void sar_save(struct sar_ram_entry *entry)
 {
-   u32 reg_val, size, i, j;
+   u32 reg_val, size, i;
void __iomem *reg_read_addr, *sar_wr_addr;
 
-   for (i = 0; i  nb_regs; i++) {
-   if (omap4_sar_modules[(sar_layout_table[i][MODULE_ADDR_IDX])]) {
-   size = sar_layout_table[i][MODULE_NB_REGS_IDX];
-   reg_read_addr =
-   omap4_sar_modules[sar_layout_table[i]
- [MODULE_ADDR_IDX]]
-   + sar_layout_table[i][MODULE_OFFSET_IDX];
-   sar_wr_addr = sar_ram_base + sar_bank +
-   sar_layout_table[i][SAR_RAM_OFFSET_IDX];
-   for (j = 0; j  size; j++) {
-   reg_val = __raw_readl(reg_read_addr + j * 4);
-   __raw_writel(reg_val, sar_wr_addr + j * 4);
-   }
+   while (entry-size) {
+   size = entry-size;
+   reg_read_addr = entry-io_base + entry-offset;
+   sar_wr_addr = sar_ram_base + entry-ram_addr;
+   for (i = 0; i  size; i++) {
+   reg_val = __raw_readl(reg_read_addr + i * 4);
+   __raw_writel(reg_val, sar_wr_addr + i * 4);
}
+   entry++;
}
 }
 
@@ -100,8 +80,7 @@ static void save_sar_bank3(void)
l4_secure_clkdm = clkdm_lookup(l4_secure_clkdm);
clkdm_wakeup(l4_secure_clkdm);
 
-   sar_save(ARRAY_SIZE(omap443x_sar_ram3_layout), SAR_BANK3_OFFSET,
-omap443x_sar_ram3_layout);
+   sar_save(sar_ram_layout[2]);
 
clkdm_allow_idle(l4_secure_clkdm);
 }
@@ -116,13 +95,13 @@ static int omap4_sar_not_accessible(void)
 * registers, otherwise this will trigger an exception.
 */
usbhost_state = omap4_cminst_read_inst_reg(OMAP4430_CM2_PARTITION,
-  OMAP4430_CM2_L3INIT_INST,
-  
OMAP4_CM_L3INIT_USB_HOST_CLKCTRL_OFFSET)
+   OMAP4430_CM2_L3INIT_INST,
+