
On Tuesday 21 June 2011 11:55 AM, Aneesh V wrote:
Dear Wolfgang,
On Tuesday 21 June 2011 11:19 AM, Aneesh V wrote:
Dear Wolfgang,
On Sunday 15 May 2011 08:51 PM, Aneesh V wrote: [snip ..]
+static const u32 clk_modules_hw_auto_essential[] = {
- CM_WKUP_GPIO1_CLKCTRL,
- CM_L4PER_GPIO2_CLKCTRL,
- CM_L4PER_GPIO3_CLKCTRL,
- CM_L4PER_GPIO4_CLKCTRL,
- CM_L4PER_GPIO5_CLKCTRL,
- CM_L4PER_GPIO6_CLKCTRL,
- CM_MEMIF_EMIF_1_CLKCTRL,
- CM_MEMIF_EMIF_2_CLKCTRL,
- CM_L3INIT_HSUSBOTG_CLKCTRL,
- CM_L3INIT_USBPHY_CLKCTRL,
- CM_L4CFG_L4_CFG_CLKCTRL,
- 0
+};
In this series you asked me to convert the base + offset mode of register address definition to struct based register address definition. While doing this I am facing a problem. Please note the above array that contain register addresses. This is a group of registers that control our clock modules. All these registers have similar bit fields and they can be programmed in same manner. So, I keep them in an array and pass the array to a function that iterates through array and does similar processing on all the registers(see below).
I am finding it difficult to implement this using the struct based approach. I tried the sample code below:
struct my_regs_struct { const unsigned int reg1; const unsigned int reg2; const unsigned int reg3; };
static struct my_regs_struct *const my_regs = (struct my_regs_struct *)0x1000;
static unsigned int *const reg_arr[] = { &my_regs->reg1, &my_regs->reg3 };
Apologies for the hasty mail. Looks like I can solve it by doing something like:
static unsigned int *const reg_arr[] = { &(((struct my_regs_struct *)0x1000)->reg1), &(((struct my_regs_struct *)0x1000)->reg3), };
Analyzing this further right now. Hopefully, the issue can be solved cleanly.
Some more interesting information:
I can reproduce the problem with something as simple as this:
main.c: const int const1 = 10; const int const2 = 11;
int arr[] = { const1, const2 };
$ gcc main.c main.c:5: error: initializer element is not constant main.c:5: error: (near initialization for ‘arr[0]’) main.c:7: error: initializer element is not constant main.c:7: error: (near initialization for ‘arr[1]’)
The ARM compiler RVCT happily compiles this without an issue. GCC and Visual C++ compilers fail!
As a result, I will have to do something like this to populate my array:
static unsigned int *const reg_arr[] = { &(((struct my_regs_struct *const)OMAP4_PRCM_REG_BASE)->uart_clkctrl), &(((struct my_regs_struct *const)OMAP4_PRCM_REG_BASE)->i2c_clkctrl), };
Is this acceptable?
best regards, Aneesh