summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAmaury Pouly <amaury.pouly@gmail.com>2013-01-12 18:58:19 +0000
committerAmaury Pouly <amaury.pouly@gmail.com>2013-01-12 18:58:19 +0000
commit0946a1e0f2c7c6491f87276cfadab5e9492313c6 (patch)
tree42a6b389fd3e444c9a4544ecd13bff8da50cbb62
parent2ef7a549d57c984fee2cd26fbaa70bbfa054dfb4 (diff)
downloadrockbox-0946a1e0f2c7c6491f87276cfadab5e9492313c6.zip
rockbox-0946a1e0f2c7c6491f87276cfadab5e9492313c6.tar.gz
rockbox-0946a1e0f2c7c6491f87276cfadab5e9492313c6.tar.bz2
rockbox-0946a1e0f2c7c6491f87276cfadab5e9492313c6.tar.xz
imx233: enable underflow recovery in lcdif (needed for freq scale)
When chaging the cpu and memory frequency we need to disable the external memory interface (EMI) for a small time. This can underflow the dma and cause some breakage. Hopefully the SSP controller handles this gracefully by stopping the clock and the I2C probably handles this naturally because the clock can be streched anyway. However the LCDIF has a special setting for this which needs to be enable, otherwise it will send garbage to the LCD. No other block is known to suffer from this currently but this issue might have more unexpected consequences. Change-Id: Ide154cad87929f2bf6cc419ac1d2ff33e30eec66
-rw-r--r--firmware/target/arm/imx233/creative-zenxfi2/lcd-zenxfi2.c1
-rw-r--r--firmware/target/arm/imx233/creative-zenxfi3/lcd-zenxfi3.c1
-rw-r--r--firmware/target/arm/imx233/lcdif-imx233.c8
-rw-r--r--firmware/target/arm/imx233/lcdif-imx233.h2
-rw-r--r--firmware/target/arm/imx233/sansa-fuzeplus/lcd-fuzeplus.c1
5 files changed, 13 insertions, 0 deletions
diff --git a/firmware/target/arm/imx233/creative-zenxfi2/lcd-zenxfi2.c b/firmware/target/arm/imx233/creative-zenxfi2/lcd-zenxfi2.c
index 370104c..f452ae0 100644
--- a/firmware/target/arm/imx233/creative-zenxfi2/lcd-zenxfi2.c
+++ b/firmware/target/arm/imx233/creative-zenxfi2/lcd-zenxfi2.c
@@ -40,6 +40,7 @@ static void setup_parameters(void)
imx233_lcdif_set_lcd_databus_width(HW_LCDIF_CTRL__LCD_DATABUS_WIDTH_18_BIT);
imx233_lcdif_set_word_length(HW_LCDIF_CTRL__WORD_LENGTH_18_BIT);
imx233_lcdif_set_timings(2, 2, 3, 3);
+ imx233_lcdif_enable_underflow_recover(true);
}
static void setup_lcd_pins(bool use_lcdif)
diff --git a/firmware/target/arm/imx233/creative-zenxfi3/lcd-zenxfi3.c b/firmware/target/arm/imx233/creative-zenxfi3/lcd-zenxfi3.c
index ea1ed6b..d042713 100644
--- a/firmware/target/arm/imx233/creative-zenxfi3/lcd-zenxfi3.c
+++ b/firmware/target/arm/imx233/creative-zenxfi3/lcd-zenxfi3.c
@@ -40,6 +40,7 @@ static void setup_parameters(void)
imx233_lcdif_set_lcd_databus_width(HW_LCDIF_CTRL__LCD_DATABUS_WIDTH_16_BIT);
imx233_lcdif_set_word_length(HW_LCDIF_CTRL__WORD_LENGTH_16_BIT);
imx233_lcdif_set_timings(2, 2, 3, 3);
+ imx233_lcdif_enable_underflow_recover(true);
}
static void setup_lcd_pins(bool use_lcdif)
diff --git a/firmware/target/arm/imx233/lcdif-imx233.c b/firmware/target/arm/imx233/lcdif-imx233.c
index 285c280..ad0931d 100644
--- a/firmware/target/arm/imx233/lcdif-imx233.c
+++ b/firmware/target/arm/imx233/lcdif-imx233.c
@@ -23,6 +23,14 @@
static unsigned lcdif_word_length = 0;
static unsigned lcdif_byte_packing = 0;
+void imx233_lcdif_enable_underflow_recover(bool enable)
+{
+ if(enable)
+ __REG_SET(HW_LCDIF_CTRL1) = HW_LCDIF_CTRL1__RECOVER_ON_UNDERFLOW;
+ else
+ __REG_CLR(HW_LCDIF_CTRL1) = HW_LCDIF_CTRL1__RECOVER_ON_UNDERFLOW;
+}
+
void imx233_lcdif_enable_bus_master(bool enable)
{
if(enable)
diff --git a/firmware/target/arm/imx233/lcdif-imx233.h b/firmware/target/arm/imx233/lcdif-imx233.h
index 3bce004..9902aaa 100644
--- a/firmware/target/arm/imx233/lcdif-imx233.h
+++ b/firmware/target/arm/imx233/lcdif-imx233.h
@@ -53,6 +53,7 @@
#define HW_LCDIF_CTRL1__IRQ_BP 8
#define HW_LCDIF_CTRL1__BYTE_PACKING_FORMAT_BM (0xf << 16)
#define HW_LCDIF_CTRL1__BYTE_PACKING_FORMAT_BP 16
+#define HW_LCDIF_CTRL1__RECOVER_ON_UNDERFLOW (1 << 24)
#define HW_LCDIF__VSYNC_EDGE_IRQ 1
#define HW_LCDIF__CUR_FRAME_DONE_IRQ 2
@@ -84,6 +85,7 @@
#define HW_LCDIF_STAT__TXFIFO_EMPTY (1 << 26)
#define HW_LCDIF_STAT__BUSY (1 << 25)
+void imx233_lcdif_enable_underflow_recover(bool enable);
void imx233_lcdif_enable_bus_master(bool enable);
void imx233_lcdif_enable(bool enable);
void imx233_lcdif_reset(void);// reset lcdif block
diff --git a/firmware/target/arm/imx233/sansa-fuzeplus/lcd-fuzeplus.c b/firmware/target/arm/imx233/sansa-fuzeplus/lcd-fuzeplus.c
index 34afc04..5f54c72 100644
--- a/firmware/target/arm/imx233/sansa-fuzeplus/lcd-fuzeplus.c
+++ b/firmware/target/arm/imx233/sansa-fuzeplus/lcd-fuzeplus.c
@@ -54,6 +54,7 @@ static void setup_parameters(void)
imx233_lcdif_set_lcd_databus_width(HW_LCDIF_CTRL__LCD_DATABUS_WIDTH_18_BIT);
imx233_lcdif_set_word_length(HW_LCDIF_CTRL__WORD_LENGTH_18_BIT);
imx233_lcdif_set_timings(1, 2, 2, 2);
+ imx233_lcdif_enable_underflow_recover(true);
}
static void setup_lcd_pins(bool use_lcdif)