|
@@ -360,3 +360,72 @@ int gpmc_cs_set_timings(int cs, const struct gpmc_timings *t)
|
|
|
GPMC_SET_ONE(GPMC_CS_CONFIG4, 0, 3, oe_on);
|
|
|
GPMC_SET_ONE(GPMC_CS_CONFIG4, 8, 12, oe_off);
|
|
|
GPMC_SET_ONE(GPMC_CS_CONFIG4, 16, 19, we_on);
|
|
|
+ GPMC_SET_ONE(GPMC_CS_CONFIG4, 24, 28, we_off);
|
|
|
+
|
|
|
+ GPMC_SET_ONE(GPMC_CS_CONFIG5, 0, 4, rd_cycle);
|
|
|
+ GPMC_SET_ONE(GPMC_CS_CONFIG5, 8, 12, wr_cycle);
|
|
|
+ GPMC_SET_ONE(GPMC_CS_CONFIG5, 16, 20, access);
|
|
|
+
|
|
|
+ GPMC_SET_ONE(GPMC_CS_CONFIG5, 24, 27, page_burst_access);
|
|
|
+
|
|
|
+ GPMC_SET_ONE(GPMC_CS_CONFIG6, 0, 3, bus_turnaround);
|
|
|
+ GPMC_SET_ONE(GPMC_CS_CONFIG6, 8, 11, cycle2cycle_delay);
|
|
|
+
|
|
|
+ GPMC_SET_ONE(GPMC_CS_CONFIG1, 18, 19, wait_monitoring);
|
|
|
+ GPMC_SET_ONE(GPMC_CS_CONFIG1, 25, 26, clk_activation);
|
|
|
+
|
|
|
+ if (gpmc_capability & GPMC_HAS_WR_DATA_MUX_BUS)
|
|
|
+ GPMC_SET_ONE(GPMC_CS_CONFIG6, 16, 19, wr_data_mux_bus);
|
|
|
+ if (gpmc_capability & GPMC_HAS_WR_ACCESS)
|
|
|
+ GPMC_SET_ONE(GPMC_CS_CONFIG6, 24, 28, wr_access);
|
|
|
+
|
|
|
+ /* caller is expected to have initialized CONFIG1 to cover
|
|
|
+ * at least sync vs async
|
|
|
+ */
|
|
|
+ l = gpmc_cs_read_reg(cs, GPMC_CS_CONFIG1);
|
|
|
+ if (l & (GPMC_CONFIG1_READTYPE_SYNC | GPMC_CONFIG1_WRITETYPE_SYNC)) {
|
|
|
+#ifdef DEBUG
|
|
|
+ printk(KERN_INFO "GPMC CS%d CLK period is %lu ns (div %d)\n",
|
|
|
+ cs, (div * gpmc_get_fclk_period()) / 1000, div);
|
|
|
+#endif
|
|
|
+ l &= ~0x03;
|
|
|
+ l |= (div - 1);
|
|
|
+ gpmc_cs_write_reg(cs, GPMC_CS_CONFIG1, l);
|
|
|
+ }
|
|
|
+
|
|
|
+ gpmc_cs_bool_timings(cs, &t->bool_timings);
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+static void gpmc_cs_enable_mem(int cs, u32 base, u32 size)
|
|
|
+{
|
|
|
+ u32 l;
|
|
|
+ u32 mask;
|
|
|
+
|
|
|
+ mask = (1 << GPMC_SECTION_SHIFT) - size;
|
|
|
+ l = gpmc_cs_read_reg(cs, GPMC_CS_CONFIG7);
|
|
|
+ l &= ~0x3f;
|
|
|
+ l = (base >> GPMC_CHUNK_SHIFT) & 0x3f;
|
|
|
+ l &= ~(0x0f << 8);
|
|
|
+ l |= ((mask >> GPMC_CHUNK_SHIFT) & 0x0f) << 8;
|
|
|
+ l |= GPMC_CONFIG7_CSVALID;
|
|
|
+ gpmc_cs_write_reg(cs, GPMC_CS_CONFIG7, l);
|
|
|
+}
|
|
|
+
|
|
|
+static void gpmc_cs_disable_mem(int cs)
|
|
|
+{
|
|
|
+ u32 l;
|
|
|
+
|
|
|
+ l = gpmc_cs_read_reg(cs, GPMC_CS_CONFIG7);
|
|
|
+ l &= ~GPMC_CONFIG7_CSVALID;
|
|
|
+ gpmc_cs_write_reg(cs, GPMC_CS_CONFIG7, l);
|
|
|
+}
|
|
|
+
|
|
|
+static void gpmc_cs_get_memconf(int cs, u32 *base, u32 *size)
|
|
|
+{
|
|
|
+ u32 l;
|
|
|
+ u32 mask;
|
|
|
+
|
|
|
+ l = gpmc_cs_read_reg(cs, GPMC_CS_CONFIG7);
|
|
|
+ *base = (l & 0x3f) << GPMC_CHUNK_SHIFT;
|