Thank you
I have worked a bit on the mu.c, and now I can change the used Reigster by changing the used Index and not changing a bunch of bits. It have worked for me. I know its kinda dirty but I want to share it in case it could be useful for you.
I am using embedded Linux 4.1.15 2.0.0
To change the Register you just have to increase the MU_LPM_HANDSHAKE_INDEX and the MU_RPMSG_HANDSHAKE_INDEX.
diff --git a/arch/arm/mach-imx/mu.c b/arch/arm/mach-imx/mu.c
index 643fee8c3cfb..04341175e23d 100644
--- a/arch/arm/mach-imx/mu.c
+++ b/arch/arm/mach-imx/mu.c
@@ -267,7 +267,7 @@ static void mu_work_handler(struct work_struct *work)
}
m4_message = 0;
/* enable RIE3 interrupt */
- writel_relaxed(readl_relaxed(mu_base + MU_ACR) | BIT(27),
+ writel_relaxed(readl_relaxed(mu_base + MU_ACR) | BIT(27 - MU_LPM_HANDSHAKE_INDEX),
mu_base + MU_ACR);
}
@@ -330,17 +330,17 @@ static irqreturn_t imx_mu_isr(int irq, void *param)
irqs = readl_relaxed(mu_base + MU_ASR);
/* RPMSG */
- if (irqs & (1 << 26)) {
+ if (irqs & (1 << (26 - MU_LPM_HANDSHAKE_INDEX))) {
/* get message from receive buffer */
- m4_message = readl_relaxed(mu_base + MU_ARR1_OFFSET);
+ m4_message = readl_relaxed(mu_base + MU_ARR1_OFFSET + 0x4 * MU_LPM_HANDSHAKE_INDEX);
//0x14 --> 0x18 bei verwendung von Reg2
schedule_delayed_work(&rpmsg_work, 0);
}
- if (irqs & (1 << 27)) {
+ if (irqs & (1 << (27 - MU_LPM_HANDSHAKE_INDEX))) {
/* get message from receive buffer */
- m4_message = readl_relaxed(mu_base + MU_ARR0_OFFSET);
+ m4_message = readl_relaxed(mu_base + MU_ARR0_OFFSET + 0x4 * MU_LPM_HANDSHAKE_INDEX);
//0x10 --> 0x14 bei verwendung von Reg2
/* disable RIE3 interrupt */
- writel_relaxed(readl_relaxed(mu_base + MU_ACR) & (~BIT(27)),
+ writel_relaxed(readl_relaxed(mu_base + MU_ACR) & (~BIT(27 - MU_LPM_HANDSHAKE_INDEX)),
mu_base + MU_ACR);
schedule_delayed_work(&mu_work, 0);
}
@@ -387,7 +387,7 @@ static int imx_mu_probe(struct platform_device *pdev)
INIT_DELAYED_WORK(&mu_work, mu_work_handler);
/* enable the bit26(RIE1) of MU_ACR */
writel_relaxed(readl_relaxed(mu_base + MU_ACR) |
- BIT(26) | BIT(27), mu_base + MU_ACR);
+ BIT(26 - MU_LPM_HANDSHAKE_INDEX) | BIT(27 - MU_LPM_HANDSHAKE_INDEX), mu_base + MU_ACR);
/* MU always as a wakeup source for low power mode */
imx_gpcv2_add_m4_wake_up_irq(irq_to_desc(irq)->irq_data.hwirq,
true);
@@ -397,10 +397,10 @@ static int imx_mu_probe(struct platform_device *pdev)
INIT_DELAYED_WORK(&mu_work, mu_work_handler);
/* enable the bit27(RIE3) of MU_ACR */
- writel_relaxed(readl_relaxed(mu_base + MU_ACR) | BIT(27),
+ writel_relaxed(readl_relaxed(mu_base + MU_ACR) | BIT(27 - MU_LPM_HANDSHAKE_INDEX),
mu_base + MU_ACR);
/* enable the bit31(GIE3) of MU_ACR, used for MCC */
- writel_relaxed(readl_relaxed(mu_base + MU_ACR) | BIT(31),
+ writel_relaxed(readl_relaxed(mu_base + MU_ACR) | BIT(31 - MU_LPM_HANDSHAKE_INDEX),
mu_base + MU_ACR);
/* MU always as a wakeup source for low power mode */
@@ -409,7 +409,7 @@ static int imx_mu_probe(struct platform_device *pdev)
INIT_DELAYED_WORK(&rpmsg_work, rpmsg_work_handler);
/* enable the bit26(RIE1) of MU_ACR */
- writel_relaxed(readl_relaxed(mu_base + MU_ACR) | BIT(26),
+ writel_relaxed(readl_relaxed(mu_base + MU_ACR) | BIT(26 - MU_LPM_HANDSHAKE_INDEX),
mu_base + MU_ACR);
BLOCKING_INIT_NOTIFIER_HEAD(&(mu_rpmsg_box.notifier));