mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-10-30 08:02:30 +00:00
Merge branches 'dma-omap', 'dma-pl08x' and 'dma-sa11x0' into dmaengine
This commit is contained in:
commit
0e52d987c0
11 changed files with 619 additions and 790 deletions
|
@ -120,182 +120,156 @@ struct pl08x_channel_data spear300_dma_info[] = {
|
||||||
.min_signal = 2,
|
.min_signal = 2,
|
||||||
.max_signal = 2,
|
.max_signal = 2,
|
||||||
.muxval = 0,
|
.muxval = 0,
|
||||||
.cctl = 0,
|
|
||||||
.periph_buses = PL08X_AHB1,
|
.periph_buses = PL08X_AHB1,
|
||||||
}, {
|
}, {
|
||||||
.bus_id = "uart0_tx",
|
.bus_id = "uart0_tx",
|
||||||
.min_signal = 3,
|
.min_signal = 3,
|
||||||
.max_signal = 3,
|
.max_signal = 3,
|
||||||
.muxval = 0,
|
.muxval = 0,
|
||||||
.cctl = 0,
|
|
||||||
.periph_buses = PL08X_AHB1,
|
.periph_buses = PL08X_AHB1,
|
||||||
}, {
|
}, {
|
||||||
.bus_id = "ssp0_rx",
|
.bus_id = "ssp0_rx",
|
||||||
.min_signal = 8,
|
.min_signal = 8,
|
||||||
.max_signal = 8,
|
.max_signal = 8,
|
||||||
.muxval = 0,
|
.muxval = 0,
|
||||||
.cctl = 0,
|
|
||||||
.periph_buses = PL08X_AHB1,
|
.periph_buses = PL08X_AHB1,
|
||||||
}, {
|
}, {
|
||||||
.bus_id = "ssp0_tx",
|
.bus_id = "ssp0_tx",
|
||||||
.min_signal = 9,
|
.min_signal = 9,
|
||||||
.max_signal = 9,
|
.max_signal = 9,
|
||||||
.muxval = 0,
|
.muxval = 0,
|
||||||
.cctl = 0,
|
|
||||||
.periph_buses = PL08X_AHB1,
|
.periph_buses = PL08X_AHB1,
|
||||||
}, {
|
}, {
|
||||||
.bus_id = "i2c_rx",
|
.bus_id = "i2c_rx",
|
||||||
.min_signal = 10,
|
.min_signal = 10,
|
||||||
.max_signal = 10,
|
.max_signal = 10,
|
||||||
.muxval = 0,
|
.muxval = 0,
|
||||||
.cctl = 0,
|
|
||||||
.periph_buses = PL08X_AHB1,
|
.periph_buses = PL08X_AHB1,
|
||||||
}, {
|
}, {
|
||||||
.bus_id = "i2c_tx",
|
.bus_id = "i2c_tx",
|
||||||
.min_signal = 11,
|
.min_signal = 11,
|
||||||
.max_signal = 11,
|
.max_signal = 11,
|
||||||
.muxval = 0,
|
.muxval = 0,
|
||||||
.cctl = 0,
|
|
||||||
.periph_buses = PL08X_AHB1,
|
.periph_buses = PL08X_AHB1,
|
||||||
}, {
|
}, {
|
||||||
.bus_id = "irda",
|
.bus_id = "irda",
|
||||||
.min_signal = 12,
|
.min_signal = 12,
|
||||||
.max_signal = 12,
|
.max_signal = 12,
|
||||||
.muxval = 0,
|
.muxval = 0,
|
||||||
.cctl = 0,
|
|
||||||
.periph_buses = PL08X_AHB1,
|
.periph_buses = PL08X_AHB1,
|
||||||
}, {
|
}, {
|
||||||
.bus_id = "adc",
|
.bus_id = "adc",
|
||||||
.min_signal = 13,
|
.min_signal = 13,
|
||||||
.max_signal = 13,
|
.max_signal = 13,
|
||||||
.muxval = 0,
|
.muxval = 0,
|
||||||
.cctl = 0,
|
|
||||||
.periph_buses = PL08X_AHB1,
|
.periph_buses = PL08X_AHB1,
|
||||||
}, {
|
}, {
|
||||||
.bus_id = "to_jpeg",
|
.bus_id = "to_jpeg",
|
||||||
.min_signal = 14,
|
.min_signal = 14,
|
||||||
.max_signal = 14,
|
.max_signal = 14,
|
||||||
.muxval = 0,
|
.muxval = 0,
|
||||||
.cctl = 0,
|
|
||||||
.periph_buses = PL08X_AHB1,
|
.periph_buses = PL08X_AHB1,
|
||||||
}, {
|
}, {
|
||||||
.bus_id = "from_jpeg",
|
.bus_id = "from_jpeg",
|
||||||
.min_signal = 15,
|
.min_signal = 15,
|
||||||
.max_signal = 15,
|
.max_signal = 15,
|
||||||
.muxval = 0,
|
.muxval = 0,
|
||||||
.cctl = 0,
|
|
||||||
.periph_buses = PL08X_AHB1,
|
.periph_buses = PL08X_AHB1,
|
||||||
}, {
|
}, {
|
||||||
.bus_id = "ras0_rx",
|
.bus_id = "ras0_rx",
|
||||||
.min_signal = 0,
|
.min_signal = 0,
|
||||||
.max_signal = 0,
|
.max_signal = 0,
|
||||||
.muxval = 1,
|
.muxval = 1,
|
||||||
.cctl = 0,
|
|
||||||
.periph_buses = PL08X_AHB1,
|
.periph_buses = PL08X_AHB1,
|
||||||
}, {
|
}, {
|
||||||
.bus_id = "ras0_tx",
|
.bus_id = "ras0_tx",
|
||||||
.min_signal = 1,
|
.min_signal = 1,
|
||||||
.max_signal = 1,
|
.max_signal = 1,
|
||||||
.muxval = 1,
|
.muxval = 1,
|
||||||
.cctl = 0,
|
|
||||||
.periph_buses = PL08X_AHB1,
|
.periph_buses = PL08X_AHB1,
|
||||||
}, {
|
}, {
|
||||||
.bus_id = "ras1_rx",
|
.bus_id = "ras1_rx",
|
||||||
.min_signal = 2,
|
.min_signal = 2,
|
||||||
.max_signal = 2,
|
.max_signal = 2,
|
||||||
.muxval = 1,
|
.muxval = 1,
|
||||||
.cctl = 0,
|
|
||||||
.periph_buses = PL08X_AHB1,
|
.periph_buses = PL08X_AHB1,
|
||||||
}, {
|
}, {
|
||||||
.bus_id = "ras1_tx",
|
.bus_id = "ras1_tx",
|
||||||
.min_signal = 3,
|
.min_signal = 3,
|
||||||
.max_signal = 3,
|
.max_signal = 3,
|
||||||
.muxval = 1,
|
.muxval = 1,
|
||||||
.cctl = 0,
|
|
||||||
.periph_buses = PL08X_AHB1,
|
.periph_buses = PL08X_AHB1,
|
||||||
}, {
|
}, {
|
||||||
.bus_id = "ras2_rx",
|
.bus_id = "ras2_rx",
|
||||||
.min_signal = 4,
|
.min_signal = 4,
|
||||||
.max_signal = 4,
|
.max_signal = 4,
|
||||||
.muxval = 1,
|
.muxval = 1,
|
||||||
.cctl = 0,
|
|
||||||
.periph_buses = PL08X_AHB1,
|
.periph_buses = PL08X_AHB1,
|
||||||
}, {
|
}, {
|
||||||
.bus_id = "ras2_tx",
|
.bus_id = "ras2_tx",
|
||||||
.min_signal = 5,
|
.min_signal = 5,
|
||||||
.max_signal = 5,
|
.max_signal = 5,
|
||||||
.muxval = 1,
|
.muxval = 1,
|
||||||
.cctl = 0,
|
|
||||||
.periph_buses = PL08X_AHB1,
|
.periph_buses = PL08X_AHB1,
|
||||||
}, {
|
}, {
|
||||||
.bus_id = "ras3_rx",
|
.bus_id = "ras3_rx",
|
||||||
.min_signal = 6,
|
.min_signal = 6,
|
||||||
.max_signal = 6,
|
.max_signal = 6,
|
||||||
.muxval = 1,
|
.muxval = 1,
|
||||||
.cctl = 0,
|
|
||||||
.periph_buses = PL08X_AHB1,
|
.periph_buses = PL08X_AHB1,
|
||||||
}, {
|
}, {
|
||||||
.bus_id = "ras3_tx",
|
.bus_id = "ras3_tx",
|
||||||
.min_signal = 7,
|
.min_signal = 7,
|
||||||
.max_signal = 7,
|
.max_signal = 7,
|
||||||
.muxval = 1,
|
.muxval = 1,
|
||||||
.cctl = 0,
|
|
||||||
.periph_buses = PL08X_AHB1,
|
.periph_buses = PL08X_AHB1,
|
||||||
}, {
|
}, {
|
||||||
.bus_id = "ras4_rx",
|
.bus_id = "ras4_rx",
|
||||||
.min_signal = 8,
|
.min_signal = 8,
|
||||||
.max_signal = 8,
|
.max_signal = 8,
|
||||||
.muxval = 1,
|
.muxval = 1,
|
||||||
.cctl = 0,
|
|
||||||
.periph_buses = PL08X_AHB1,
|
.periph_buses = PL08X_AHB1,
|
||||||
}, {
|
}, {
|
||||||
.bus_id = "ras4_tx",
|
.bus_id = "ras4_tx",
|
||||||
.min_signal = 9,
|
.min_signal = 9,
|
||||||
.max_signal = 9,
|
.max_signal = 9,
|
||||||
.muxval = 1,
|
.muxval = 1,
|
||||||
.cctl = 0,
|
|
||||||
.periph_buses = PL08X_AHB1,
|
.periph_buses = PL08X_AHB1,
|
||||||
}, {
|
}, {
|
||||||
.bus_id = "ras5_rx",
|
.bus_id = "ras5_rx",
|
||||||
.min_signal = 10,
|
.min_signal = 10,
|
||||||
.max_signal = 10,
|
.max_signal = 10,
|
||||||
.muxval = 1,
|
.muxval = 1,
|
||||||
.cctl = 0,
|
|
||||||
.periph_buses = PL08X_AHB1,
|
.periph_buses = PL08X_AHB1,
|
||||||
}, {
|
}, {
|
||||||
.bus_id = "ras5_tx",
|
.bus_id = "ras5_tx",
|
||||||
.min_signal = 11,
|
.min_signal = 11,
|
||||||
.max_signal = 11,
|
.max_signal = 11,
|
||||||
.muxval = 1,
|
.muxval = 1,
|
||||||
.cctl = 0,
|
|
||||||
.periph_buses = PL08X_AHB1,
|
.periph_buses = PL08X_AHB1,
|
||||||
}, {
|
}, {
|
||||||
.bus_id = "ras6_rx",
|
.bus_id = "ras6_rx",
|
||||||
.min_signal = 12,
|
.min_signal = 12,
|
||||||
.max_signal = 12,
|
.max_signal = 12,
|
||||||
.muxval = 1,
|
.muxval = 1,
|
||||||
.cctl = 0,
|
|
||||||
.periph_buses = PL08X_AHB1,
|
.periph_buses = PL08X_AHB1,
|
||||||
}, {
|
}, {
|
||||||
.bus_id = "ras6_tx",
|
.bus_id = "ras6_tx",
|
||||||
.min_signal = 13,
|
.min_signal = 13,
|
||||||
.max_signal = 13,
|
.max_signal = 13,
|
||||||
.muxval = 1,
|
.muxval = 1,
|
||||||
.cctl = 0,
|
|
||||||
.periph_buses = PL08X_AHB1,
|
.periph_buses = PL08X_AHB1,
|
||||||
}, {
|
}, {
|
||||||
.bus_id = "ras7_rx",
|
.bus_id = "ras7_rx",
|
||||||
.min_signal = 14,
|
.min_signal = 14,
|
||||||
.max_signal = 14,
|
.max_signal = 14,
|
||||||
.muxval = 1,
|
.muxval = 1,
|
||||||
.cctl = 0,
|
|
||||||
.periph_buses = PL08X_AHB1,
|
.periph_buses = PL08X_AHB1,
|
||||||
}, {
|
}, {
|
||||||
.bus_id = "ras7_tx",
|
.bus_id = "ras7_tx",
|
||||||
.min_signal = 15,
|
.min_signal = 15,
|
||||||
.max_signal = 15,
|
.max_signal = 15,
|
||||||
.muxval = 1,
|
.muxval = 1,
|
||||||
.cctl = 0,
|
|
||||||
.periph_buses = PL08X_AHB1,
|
.periph_buses = PL08X_AHB1,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
|
@ -205,182 +205,156 @@ struct pl08x_channel_data spear310_dma_info[] = {
|
||||||
.min_signal = 2,
|
.min_signal = 2,
|
||||||
.max_signal = 2,
|
.max_signal = 2,
|
||||||
.muxval = 0,
|
.muxval = 0,
|
||||||
.cctl = 0,
|
|
||||||
.periph_buses = PL08X_AHB1,
|
.periph_buses = PL08X_AHB1,
|
||||||
}, {
|
}, {
|
||||||
.bus_id = "uart0_tx",
|
.bus_id = "uart0_tx",
|
||||||
.min_signal = 3,
|
.min_signal = 3,
|
||||||
.max_signal = 3,
|
.max_signal = 3,
|
||||||
.muxval = 0,
|
.muxval = 0,
|
||||||
.cctl = 0,
|
|
||||||
.periph_buses = PL08X_AHB1,
|
.periph_buses = PL08X_AHB1,
|
||||||
}, {
|
}, {
|
||||||
.bus_id = "ssp0_rx",
|
.bus_id = "ssp0_rx",
|
||||||
.min_signal = 8,
|
.min_signal = 8,
|
||||||
.max_signal = 8,
|
.max_signal = 8,
|
||||||
.muxval = 0,
|
.muxval = 0,
|
||||||
.cctl = 0,
|
|
||||||
.periph_buses = PL08X_AHB1,
|
.periph_buses = PL08X_AHB1,
|
||||||
}, {
|
}, {
|
||||||
.bus_id = "ssp0_tx",
|
.bus_id = "ssp0_tx",
|
||||||
.min_signal = 9,
|
.min_signal = 9,
|
||||||
.max_signal = 9,
|
.max_signal = 9,
|
||||||
.muxval = 0,
|
.muxval = 0,
|
||||||
.cctl = 0,
|
|
||||||
.periph_buses = PL08X_AHB1,
|
.periph_buses = PL08X_AHB1,
|
||||||
}, {
|
}, {
|
||||||
.bus_id = "i2c_rx",
|
.bus_id = "i2c_rx",
|
||||||
.min_signal = 10,
|
.min_signal = 10,
|
||||||
.max_signal = 10,
|
.max_signal = 10,
|
||||||
.muxval = 0,
|
.muxval = 0,
|
||||||
.cctl = 0,
|
|
||||||
.periph_buses = PL08X_AHB1,
|
.periph_buses = PL08X_AHB1,
|
||||||
}, {
|
}, {
|
||||||
.bus_id = "i2c_tx",
|
.bus_id = "i2c_tx",
|
||||||
.min_signal = 11,
|
.min_signal = 11,
|
||||||
.max_signal = 11,
|
.max_signal = 11,
|
||||||
.muxval = 0,
|
.muxval = 0,
|
||||||
.cctl = 0,
|
|
||||||
.periph_buses = PL08X_AHB1,
|
.periph_buses = PL08X_AHB1,
|
||||||
}, {
|
}, {
|
||||||
.bus_id = "irda",
|
.bus_id = "irda",
|
||||||
.min_signal = 12,
|
.min_signal = 12,
|
||||||
.max_signal = 12,
|
.max_signal = 12,
|
||||||
.muxval = 0,
|
.muxval = 0,
|
||||||
.cctl = 0,
|
|
||||||
.periph_buses = PL08X_AHB1,
|
.periph_buses = PL08X_AHB1,
|
||||||
}, {
|
}, {
|
||||||
.bus_id = "adc",
|
.bus_id = "adc",
|
||||||
.min_signal = 13,
|
.min_signal = 13,
|
||||||
.max_signal = 13,
|
.max_signal = 13,
|
||||||
.muxval = 0,
|
.muxval = 0,
|
||||||
.cctl = 0,
|
|
||||||
.periph_buses = PL08X_AHB1,
|
.periph_buses = PL08X_AHB1,
|
||||||
}, {
|
}, {
|
||||||
.bus_id = "to_jpeg",
|
.bus_id = "to_jpeg",
|
||||||
.min_signal = 14,
|
.min_signal = 14,
|
||||||
.max_signal = 14,
|
.max_signal = 14,
|
||||||
.muxval = 0,
|
.muxval = 0,
|
||||||
.cctl = 0,
|
|
||||||
.periph_buses = PL08X_AHB1,
|
.periph_buses = PL08X_AHB1,
|
||||||
}, {
|
}, {
|
||||||
.bus_id = "from_jpeg",
|
.bus_id = "from_jpeg",
|
||||||
.min_signal = 15,
|
.min_signal = 15,
|
||||||
.max_signal = 15,
|
.max_signal = 15,
|
||||||
.muxval = 0,
|
.muxval = 0,
|
||||||
.cctl = 0,
|
|
||||||
.periph_buses = PL08X_AHB1,
|
.periph_buses = PL08X_AHB1,
|
||||||
}, {
|
}, {
|
||||||
.bus_id = "uart1_rx",
|
.bus_id = "uart1_rx",
|
||||||
.min_signal = 0,
|
.min_signal = 0,
|
||||||
.max_signal = 0,
|
.max_signal = 0,
|
||||||
.muxval = 1,
|
.muxval = 1,
|
||||||
.cctl = 0,
|
|
||||||
.periph_buses = PL08X_AHB1,
|
.periph_buses = PL08X_AHB1,
|
||||||
}, {
|
}, {
|
||||||
.bus_id = "uart1_tx",
|
.bus_id = "uart1_tx",
|
||||||
.min_signal = 1,
|
.min_signal = 1,
|
||||||
.max_signal = 1,
|
.max_signal = 1,
|
||||||
.muxval = 1,
|
.muxval = 1,
|
||||||
.cctl = 0,
|
|
||||||
.periph_buses = PL08X_AHB1,
|
.periph_buses = PL08X_AHB1,
|
||||||
}, {
|
}, {
|
||||||
.bus_id = "uart2_rx",
|
.bus_id = "uart2_rx",
|
||||||
.min_signal = 2,
|
.min_signal = 2,
|
||||||
.max_signal = 2,
|
.max_signal = 2,
|
||||||
.muxval = 1,
|
.muxval = 1,
|
||||||
.cctl = 0,
|
|
||||||
.periph_buses = PL08X_AHB1,
|
.periph_buses = PL08X_AHB1,
|
||||||
}, {
|
}, {
|
||||||
.bus_id = "uart2_tx",
|
.bus_id = "uart2_tx",
|
||||||
.min_signal = 3,
|
.min_signal = 3,
|
||||||
.max_signal = 3,
|
.max_signal = 3,
|
||||||
.muxval = 1,
|
.muxval = 1,
|
||||||
.cctl = 0,
|
|
||||||
.periph_buses = PL08X_AHB1,
|
.periph_buses = PL08X_AHB1,
|
||||||
}, {
|
}, {
|
||||||
.bus_id = "uart3_rx",
|
.bus_id = "uart3_rx",
|
||||||
.min_signal = 4,
|
.min_signal = 4,
|
||||||
.max_signal = 4,
|
.max_signal = 4,
|
||||||
.muxval = 1,
|
.muxval = 1,
|
||||||
.cctl = 0,
|
|
||||||
.periph_buses = PL08X_AHB1,
|
.periph_buses = PL08X_AHB1,
|
||||||
}, {
|
}, {
|
||||||
.bus_id = "uart3_tx",
|
.bus_id = "uart3_tx",
|
||||||
.min_signal = 5,
|
.min_signal = 5,
|
||||||
.max_signal = 5,
|
.max_signal = 5,
|
||||||
.muxval = 1,
|
.muxval = 1,
|
||||||
.cctl = 0,
|
|
||||||
.periph_buses = PL08X_AHB1,
|
.periph_buses = PL08X_AHB1,
|
||||||
}, {
|
}, {
|
||||||
.bus_id = "uart4_rx",
|
.bus_id = "uart4_rx",
|
||||||
.min_signal = 6,
|
.min_signal = 6,
|
||||||
.max_signal = 6,
|
.max_signal = 6,
|
||||||
.muxval = 1,
|
.muxval = 1,
|
||||||
.cctl = 0,
|
|
||||||
.periph_buses = PL08X_AHB1,
|
.periph_buses = PL08X_AHB1,
|
||||||
}, {
|
}, {
|
||||||
.bus_id = "uart4_tx",
|
.bus_id = "uart4_tx",
|
||||||
.min_signal = 7,
|
.min_signal = 7,
|
||||||
.max_signal = 7,
|
.max_signal = 7,
|
||||||
.muxval = 1,
|
.muxval = 1,
|
||||||
.cctl = 0,
|
|
||||||
.periph_buses = PL08X_AHB1,
|
.periph_buses = PL08X_AHB1,
|
||||||
}, {
|
}, {
|
||||||
.bus_id = "uart5_rx",
|
.bus_id = "uart5_rx",
|
||||||
.min_signal = 8,
|
.min_signal = 8,
|
||||||
.max_signal = 8,
|
.max_signal = 8,
|
||||||
.muxval = 1,
|
.muxval = 1,
|
||||||
.cctl = 0,
|
|
||||||
.periph_buses = PL08X_AHB1,
|
.periph_buses = PL08X_AHB1,
|
||||||
}, {
|
}, {
|
||||||
.bus_id = "uart5_tx",
|
.bus_id = "uart5_tx",
|
||||||
.min_signal = 9,
|
.min_signal = 9,
|
||||||
.max_signal = 9,
|
.max_signal = 9,
|
||||||
.muxval = 1,
|
.muxval = 1,
|
||||||
.cctl = 0,
|
|
||||||
.periph_buses = PL08X_AHB1,
|
.periph_buses = PL08X_AHB1,
|
||||||
}, {
|
}, {
|
||||||
.bus_id = "ras5_rx",
|
.bus_id = "ras5_rx",
|
||||||
.min_signal = 10,
|
.min_signal = 10,
|
||||||
.max_signal = 10,
|
.max_signal = 10,
|
||||||
.muxval = 1,
|
.muxval = 1,
|
||||||
.cctl = 0,
|
|
||||||
.periph_buses = PL08X_AHB1,
|
.periph_buses = PL08X_AHB1,
|
||||||
}, {
|
}, {
|
||||||
.bus_id = "ras5_tx",
|
.bus_id = "ras5_tx",
|
||||||
.min_signal = 11,
|
.min_signal = 11,
|
||||||
.max_signal = 11,
|
.max_signal = 11,
|
||||||
.muxval = 1,
|
.muxval = 1,
|
||||||
.cctl = 0,
|
|
||||||
.periph_buses = PL08X_AHB1,
|
.periph_buses = PL08X_AHB1,
|
||||||
}, {
|
}, {
|
||||||
.bus_id = "ras6_rx",
|
.bus_id = "ras6_rx",
|
||||||
.min_signal = 12,
|
.min_signal = 12,
|
||||||
.max_signal = 12,
|
.max_signal = 12,
|
||||||
.muxval = 1,
|
.muxval = 1,
|
||||||
.cctl = 0,
|
|
||||||
.periph_buses = PL08X_AHB1,
|
.periph_buses = PL08X_AHB1,
|
||||||
}, {
|
}, {
|
||||||
.bus_id = "ras6_tx",
|
.bus_id = "ras6_tx",
|
||||||
.min_signal = 13,
|
.min_signal = 13,
|
||||||
.max_signal = 13,
|
.max_signal = 13,
|
||||||
.muxval = 1,
|
.muxval = 1,
|
||||||
.cctl = 0,
|
|
||||||
.periph_buses = PL08X_AHB1,
|
.periph_buses = PL08X_AHB1,
|
||||||
}, {
|
}, {
|
||||||
.bus_id = "ras7_rx",
|
.bus_id = "ras7_rx",
|
||||||
.min_signal = 14,
|
.min_signal = 14,
|
||||||
.max_signal = 14,
|
.max_signal = 14,
|
||||||
.muxval = 1,
|
.muxval = 1,
|
||||||
.cctl = 0,
|
|
||||||
.periph_buses = PL08X_AHB1,
|
.periph_buses = PL08X_AHB1,
|
||||||
}, {
|
}, {
|
||||||
.bus_id = "ras7_tx",
|
.bus_id = "ras7_tx",
|
||||||
.min_signal = 15,
|
.min_signal = 15,
|
||||||
.max_signal = 15,
|
.max_signal = 15,
|
||||||
.muxval = 1,
|
.muxval = 1,
|
||||||
.cctl = 0,
|
|
||||||
.periph_buses = PL08X_AHB1,
|
.periph_buses = PL08X_AHB1,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
|
@ -213,182 +213,156 @@ struct pl08x_channel_data spear320_dma_info[] = {
|
||||||
.min_signal = 2,
|
.min_signal = 2,
|
||||||
.max_signal = 2,
|
.max_signal = 2,
|
||||||
.muxval = 0,
|
.muxval = 0,
|
||||||
.cctl = 0,
|
|
||||||
.periph_buses = PL08X_AHB1,
|
.periph_buses = PL08X_AHB1,
|
||||||
}, {
|
}, {
|
||||||
.bus_id = "uart0_tx",
|
.bus_id = "uart0_tx",
|
||||||
.min_signal = 3,
|
.min_signal = 3,
|
||||||
.max_signal = 3,
|
.max_signal = 3,
|
||||||
.muxval = 0,
|
.muxval = 0,
|
||||||
.cctl = 0,
|
|
||||||
.periph_buses = PL08X_AHB1,
|
.periph_buses = PL08X_AHB1,
|
||||||
}, {
|
}, {
|
||||||
.bus_id = "ssp0_rx",
|
.bus_id = "ssp0_rx",
|
||||||
.min_signal = 8,
|
.min_signal = 8,
|
||||||
.max_signal = 8,
|
.max_signal = 8,
|
||||||
.muxval = 0,
|
.muxval = 0,
|
||||||
.cctl = 0,
|
|
||||||
.periph_buses = PL08X_AHB1,
|
.periph_buses = PL08X_AHB1,
|
||||||
}, {
|
}, {
|
||||||
.bus_id = "ssp0_tx",
|
.bus_id = "ssp0_tx",
|
||||||
.min_signal = 9,
|
.min_signal = 9,
|
||||||
.max_signal = 9,
|
.max_signal = 9,
|
||||||
.muxval = 0,
|
.muxval = 0,
|
||||||
.cctl = 0,
|
|
||||||
.periph_buses = PL08X_AHB1,
|
.periph_buses = PL08X_AHB1,
|
||||||
}, {
|
}, {
|
||||||
.bus_id = "i2c0_rx",
|
.bus_id = "i2c0_rx",
|
||||||
.min_signal = 10,
|
.min_signal = 10,
|
||||||
.max_signal = 10,
|
.max_signal = 10,
|
||||||
.muxval = 0,
|
.muxval = 0,
|
||||||
.cctl = 0,
|
|
||||||
.periph_buses = PL08X_AHB1,
|
.periph_buses = PL08X_AHB1,
|
||||||
}, {
|
}, {
|
||||||
.bus_id = "i2c0_tx",
|
.bus_id = "i2c0_tx",
|
||||||
.min_signal = 11,
|
.min_signal = 11,
|
||||||
.max_signal = 11,
|
.max_signal = 11,
|
||||||
.muxval = 0,
|
.muxval = 0,
|
||||||
.cctl = 0,
|
|
||||||
.periph_buses = PL08X_AHB1,
|
.periph_buses = PL08X_AHB1,
|
||||||
}, {
|
}, {
|
||||||
.bus_id = "irda",
|
.bus_id = "irda",
|
||||||
.min_signal = 12,
|
.min_signal = 12,
|
||||||
.max_signal = 12,
|
.max_signal = 12,
|
||||||
.muxval = 0,
|
.muxval = 0,
|
||||||
.cctl = 0,
|
|
||||||
.periph_buses = PL08X_AHB1,
|
.periph_buses = PL08X_AHB1,
|
||||||
}, {
|
}, {
|
||||||
.bus_id = "adc",
|
.bus_id = "adc",
|
||||||
.min_signal = 13,
|
.min_signal = 13,
|
||||||
.max_signal = 13,
|
.max_signal = 13,
|
||||||
.muxval = 0,
|
.muxval = 0,
|
||||||
.cctl = 0,
|
|
||||||
.periph_buses = PL08X_AHB1,
|
.periph_buses = PL08X_AHB1,
|
||||||
}, {
|
}, {
|
||||||
.bus_id = "to_jpeg",
|
.bus_id = "to_jpeg",
|
||||||
.min_signal = 14,
|
.min_signal = 14,
|
||||||
.max_signal = 14,
|
.max_signal = 14,
|
||||||
.muxval = 0,
|
.muxval = 0,
|
||||||
.cctl = 0,
|
|
||||||
.periph_buses = PL08X_AHB1,
|
.periph_buses = PL08X_AHB1,
|
||||||
}, {
|
}, {
|
||||||
.bus_id = "from_jpeg",
|
.bus_id = "from_jpeg",
|
||||||
.min_signal = 15,
|
.min_signal = 15,
|
||||||
.max_signal = 15,
|
.max_signal = 15,
|
||||||
.muxval = 0,
|
.muxval = 0,
|
||||||
.cctl = 0,
|
|
||||||
.periph_buses = PL08X_AHB1,
|
.periph_buses = PL08X_AHB1,
|
||||||
}, {
|
}, {
|
||||||
.bus_id = "ssp1_rx",
|
.bus_id = "ssp1_rx",
|
||||||
.min_signal = 0,
|
.min_signal = 0,
|
||||||
.max_signal = 0,
|
.max_signal = 0,
|
||||||
.muxval = 1,
|
.muxval = 1,
|
||||||
.cctl = 0,
|
|
||||||
.periph_buses = PL08X_AHB2,
|
.periph_buses = PL08X_AHB2,
|
||||||
}, {
|
}, {
|
||||||
.bus_id = "ssp1_tx",
|
.bus_id = "ssp1_tx",
|
||||||
.min_signal = 1,
|
.min_signal = 1,
|
||||||
.max_signal = 1,
|
.max_signal = 1,
|
||||||
.muxval = 1,
|
.muxval = 1,
|
||||||
.cctl = 0,
|
|
||||||
.periph_buses = PL08X_AHB2,
|
.periph_buses = PL08X_AHB2,
|
||||||
}, {
|
}, {
|
||||||
.bus_id = "ssp2_rx",
|
.bus_id = "ssp2_rx",
|
||||||
.min_signal = 2,
|
.min_signal = 2,
|
||||||
.max_signal = 2,
|
.max_signal = 2,
|
||||||
.muxval = 1,
|
.muxval = 1,
|
||||||
.cctl = 0,
|
|
||||||
.periph_buses = PL08X_AHB2,
|
.periph_buses = PL08X_AHB2,
|
||||||
}, {
|
}, {
|
||||||
.bus_id = "ssp2_tx",
|
.bus_id = "ssp2_tx",
|
||||||
.min_signal = 3,
|
.min_signal = 3,
|
||||||
.max_signal = 3,
|
.max_signal = 3,
|
||||||
.muxval = 1,
|
.muxval = 1,
|
||||||
.cctl = 0,
|
|
||||||
.periph_buses = PL08X_AHB2,
|
.periph_buses = PL08X_AHB2,
|
||||||
}, {
|
}, {
|
||||||
.bus_id = "uart1_rx",
|
.bus_id = "uart1_rx",
|
||||||
.min_signal = 4,
|
.min_signal = 4,
|
||||||
.max_signal = 4,
|
.max_signal = 4,
|
||||||
.muxval = 1,
|
.muxval = 1,
|
||||||
.cctl = 0,
|
|
||||||
.periph_buses = PL08X_AHB2,
|
.periph_buses = PL08X_AHB2,
|
||||||
}, {
|
}, {
|
||||||
.bus_id = "uart1_tx",
|
.bus_id = "uart1_tx",
|
||||||
.min_signal = 5,
|
.min_signal = 5,
|
||||||
.max_signal = 5,
|
.max_signal = 5,
|
||||||
.muxval = 1,
|
.muxval = 1,
|
||||||
.cctl = 0,
|
|
||||||
.periph_buses = PL08X_AHB2,
|
.periph_buses = PL08X_AHB2,
|
||||||
}, {
|
}, {
|
||||||
.bus_id = "uart2_rx",
|
.bus_id = "uart2_rx",
|
||||||
.min_signal = 6,
|
.min_signal = 6,
|
||||||
.max_signal = 6,
|
.max_signal = 6,
|
||||||
.muxval = 1,
|
.muxval = 1,
|
||||||
.cctl = 0,
|
|
||||||
.periph_buses = PL08X_AHB2,
|
.periph_buses = PL08X_AHB2,
|
||||||
}, {
|
}, {
|
||||||
.bus_id = "uart2_tx",
|
.bus_id = "uart2_tx",
|
||||||
.min_signal = 7,
|
.min_signal = 7,
|
||||||
.max_signal = 7,
|
.max_signal = 7,
|
||||||
.muxval = 1,
|
.muxval = 1,
|
||||||
.cctl = 0,
|
|
||||||
.periph_buses = PL08X_AHB2,
|
.periph_buses = PL08X_AHB2,
|
||||||
}, {
|
}, {
|
||||||
.bus_id = "i2c1_rx",
|
.bus_id = "i2c1_rx",
|
||||||
.min_signal = 8,
|
.min_signal = 8,
|
||||||
.max_signal = 8,
|
.max_signal = 8,
|
||||||
.muxval = 1,
|
.muxval = 1,
|
||||||
.cctl = 0,
|
|
||||||
.periph_buses = PL08X_AHB2,
|
.periph_buses = PL08X_AHB2,
|
||||||
}, {
|
}, {
|
||||||
.bus_id = "i2c1_tx",
|
.bus_id = "i2c1_tx",
|
||||||
.min_signal = 9,
|
.min_signal = 9,
|
||||||
.max_signal = 9,
|
.max_signal = 9,
|
||||||
.muxval = 1,
|
.muxval = 1,
|
||||||
.cctl = 0,
|
|
||||||
.periph_buses = PL08X_AHB2,
|
.periph_buses = PL08X_AHB2,
|
||||||
}, {
|
}, {
|
||||||
.bus_id = "i2c2_rx",
|
.bus_id = "i2c2_rx",
|
||||||
.min_signal = 10,
|
.min_signal = 10,
|
||||||
.max_signal = 10,
|
.max_signal = 10,
|
||||||
.muxval = 1,
|
.muxval = 1,
|
||||||
.cctl = 0,
|
|
||||||
.periph_buses = PL08X_AHB2,
|
.periph_buses = PL08X_AHB2,
|
||||||
}, {
|
}, {
|
||||||
.bus_id = "i2c2_tx",
|
.bus_id = "i2c2_tx",
|
||||||
.min_signal = 11,
|
.min_signal = 11,
|
||||||
.max_signal = 11,
|
.max_signal = 11,
|
||||||
.muxval = 1,
|
.muxval = 1,
|
||||||
.cctl = 0,
|
|
||||||
.periph_buses = PL08X_AHB2,
|
.periph_buses = PL08X_AHB2,
|
||||||
}, {
|
}, {
|
||||||
.bus_id = "i2s_rx",
|
.bus_id = "i2s_rx",
|
||||||
.min_signal = 12,
|
.min_signal = 12,
|
||||||
.max_signal = 12,
|
.max_signal = 12,
|
||||||
.muxval = 1,
|
.muxval = 1,
|
||||||
.cctl = 0,
|
|
||||||
.periph_buses = PL08X_AHB2,
|
.periph_buses = PL08X_AHB2,
|
||||||
}, {
|
}, {
|
||||||
.bus_id = "i2s_tx",
|
.bus_id = "i2s_tx",
|
||||||
.min_signal = 13,
|
.min_signal = 13,
|
||||||
.max_signal = 13,
|
.max_signal = 13,
|
||||||
.muxval = 1,
|
.muxval = 1,
|
||||||
.cctl = 0,
|
|
||||||
.periph_buses = PL08X_AHB2,
|
.periph_buses = PL08X_AHB2,
|
||||||
}, {
|
}, {
|
||||||
.bus_id = "rs485_rx",
|
.bus_id = "rs485_rx",
|
||||||
.min_signal = 14,
|
.min_signal = 14,
|
||||||
.max_signal = 14,
|
.max_signal = 14,
|
||||||
.muxval = 1,
|
.muxval = 1,
|
||||||
.cctl = 0,
|
|
||||||
.periph_buses = PL08X_AHB2,
|
.periph_buses = PL08X_AHB2,
|
||||||
}, {
|
}, {
|
||||||
.bus_id = "rs485_tx",
|
.bus_id = "rs485_tx",
|
||||||
.min_signal = 15,
|
.min_signal = 15,
|
||||||
.max_signal = 15,
|
.max_signal = 15,
|
||||||
.muxval = 1,
|
.muxval = 1,
|
||||||
.cctl = 0,
|
|
||||||
.periph_buses = PL08X_AHB2,
|
.periph_buses = PL08X_AHB2,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
|
@ -46,7 +46,8 @@ struct pl022_ssp_controller pl022_plat_data = {
|
||||||
struct pl08x_platform_data pl080_plat_data = {
|
struct pl08x_platform_data pl080_plat_data = {
|
||||||
.memcpy_channel = {
|
.memcpy_channel = {
|
||||||
.bus_id = "memcpy",
|
.bus_id = "memcpy",
|
||||||
.cctl = (PL080_BSIZE_16 << PL080_CONTROL_SB_SIZE_SHIFT | \
|
.cctl_memcpy =
|
||||||
|
(PL080_BSIZE_16 << PL080_CONTROL_SB_SIZE_SHIFT | \
|
||||||
PL080_BSIZE_16 << PL080_CONTROL_DB_SIZE_SHIFT | \
|
PL080_BSIZE_16 << PL080_CONTROL_DB_SIZE_SHIFT | \
|
||||||
PL080_WIDTH_32BIT << PL080_CONTROL_SWIDTH_SHIFT | \
|
PL080_WIDTH_32BIT << PL080_CONTROL_SWIDTH_SHIFT | \
|
||||||
PL080_WIDTH_32BIT << PL080_CONTROL_DWIDTH_SHIFT | \
|
PL080_WIDTH_32BIT << PL080_CONTROL_DWIDTH_SHIFT | \
|
||||||
|
|
|
@ -36,336 +36,288 @@ static struct pl08x_channel_data spear600_dma_info[] = {
|
||||||
.min_signal = 0,
|
.min_signal = 0,
|
||||||
.max_signal = 0,
|
.max_signal = 0,
|
||||||
.muxval = 0,
|
.muxval = 0,
|
||||||
.cctl = 0,
|
|
||||||
.periph_buses = PL08X_AHB1,
|
.periph_buses = PL08X_AHB1,
|
||||||
}, {
|
}, {
|
||||||
.bus_id = "ssp1_tx",
|
.bus_id = "ssp1_tx",
|
||||||
.min_signal = 1,
|
.min_signal = 1,
|
||||||
.max_signal = 1,
|
.max_signal = 1,
|
||||||
.muxval = 0,
|
.muxval = 0,
|
||||||
.cctl = 0,
|
|
||||||
.periph_buses = PL08X_AHB1,
|
.periph_buses = PL08X_AHB1,
|
||||||
}, {
|
}, {
|
||||||
.bus_id = "uart0_rx",
|
.bus_id = "uart0_rx",
|
||||||
.min_signal = 2,
|
.min_signal = 2,
|
||||||
.max_signal = 2,
|
.max_signal = 2,
|
||||||
.muxval = 0,
|
.muxval = 0,
|
||||||
.cctl = 0,
|
|
||||||
.periph_buses = PL08X_AHB1,
|
.periph_buses = PL08X_AHB1,
|
||||||
}, {
|
}, {
|
||||||
.bus_id = "uart0_tx",
|
.bus_id = "uart0_tx",
|
||||||
.min_signal = 3,
|
.min_signal = 3,
|
||||||
.max_signal = 3,
|
.max_signal = 3,
|
||||||
.muxval = 0,
|
.muxval = 0,
|
||||||
.cctl = 0,
|
|
||||||
.periph_buses = PL08X_AHB1,
|
.periph_buses = PL08X_AHB1,
|
||||||
}, {
|
}, {
|
||||||
.bus_id = "uart1_rx",
|
.bus_id = "uart1_rx",
|
||||||
.min_signal = 4,
|
.min_signal = 4,
|
||||||
.max_signal = 4,
|
.max_signal = 4,
|
||||||
.muxval = 0,
|
.muxval = 0,
|
||||||
.cctl = 0,
|
|
||||||
.periph_buses = PL08X_AHB1,
|
.periph_buses = PL08X_AHB1,
|
||||||
}, {
|
}, {
|
||||||
.bus_id = "uart1_tx",
|
.bus_id = "uart1_tx",
|
||||||
.min_signal = 5,
|
.min_signal = 5,
|
||||||
.max_signal = 5,
|
.max_signal = 5,
|
||||||
.muxval = 0,
|
.muxval = 0,
|
||||||
.cctl = 0,
|
|
||||||
.periph_buses = PL08X_AHB1,
|
.periph_buses = PL08X_AHB1,
|
||||||
}, {
|
}, {
|
||||||
.bus_id = "ssp2_rx",
|
.bus_id = "ssp2_rx",
|
||||||
.min_signal = 6,
|
.min_signal = 6,
|
||||||
.max_signal = 6,
|
.max_signal = 6,
|
||||||
.muxval = 0,
|
.muxval = 0,
|
||||||
.cctl = 0,
|
|
||||||
.periph_buses = PL08X_AHB2,
|
.periph_buses = PL08X_AHB2,
|
||||||
}, {
|
}, {
|
||||||
.bus_id = "ssp2_tx",
|
.bus_id = "ssp2_tx",
|
||||||
.min_signal = 7,
|
.min_signal = 7,
|
||||||
.max_signal = 7,
|
.max_signal = 7,
|
||||||
.muxval = 0,
|
.muxval = 0,
|
||||||
.cctl = 0,
|
|
||||||
.periph_buses = PL08X_AHB2,
|
.periph_buses = PL08X_AHB2,
|
||||||
}, {
|
}, {
|
||||||
.bus_id = "ssp0_rx",
|
.bus_id = "ssp0_rx",
|
||||||
.min_signal = 8,
|
.min_signal = 8,
|
||||||
.max_signal = 8,
|
.max_signal = 8,
|
||||||
.muxval = 0,
|
.muxval = 0,
|
||||||
.cctl = 0,
|
|
||||||
.periph_buses = PL08X_AHB1,
|
.periph_buses = PL08X_AHB1,
|
||||||
}, {
|
}, {
|
||||||
.bus_id = "ssp0_tx",
|
.bus_id = "ssp0_tx",
|
||||||
.min_signal = 9,
|
.min_signal = 9,
|
||||||
.max_signal = 9,
|
.max_signal = 9,
|
||||||
.muxval = 0,
|
.muxval = 0,
|
||||||
.cctl = 0,
|
|
||||||
.periph_buses = PL08X_AHB1,
|
.periph_buses = PL08X_AHB1,
|
||||||
}, {
|
}, {
|
||||||
.bus_id = "i2c_rx",
|
.bus_id = "i2c_rx",
|
||||||
.min_signal = 10,
|
.min_signal = 10,
|
||||||
.max_signal = 10,
|
.max_signal = 10,
|
||||||
.muxval = 0,
|
.muxval = 0,
|
||||||
.cctl = 0,
|
|
||||||
.periph_buses = PL08X_AHB1,
|
.periph_buses = PL08X_AHB1,
|
||||||
}, {
|
}, {
|
||||||
.bus_id = "i2c_tx",
|
.bus_id = "i2c_tx",
|
||||||
.min_signal = 11,
|
.min_signal = 11,
|
||||||
.max_signal = 11,
|
.max_signal = 11,
|
||||||
.muxval = 0,
|
.muxval = 0,
|
||||||
.cctl = 0,
|
|
||||||
.periph_buses = PL08X_AHB1,
|
.periph_buses = PL08X_AHB1,
|
||||||
}, {
|
}, {
|
||||||
.bus_id = "irda",
|
.bus_id = "irda",
|
||||||
.min_signal = 12,
|
.min_signal = 12,
|
||||||
.max_signal = 12,
|
.max_signal = 12,
|
||||||
.muxval = 0,
|
.muxval = 0,
|
||||||
.cctl = 0,
|
|
||||||
.periph_buses = PL08X_AHB1,
|
.periph_buses = PL08X_AHB1,
|
||||||
}, {
|
}, {
|
||||||
.bus_id = "adc",
|
.bus_id = "adc",
|
||||||
.min_signal = 13,
|
.min_signal = 13,
|
||||||
.max_signal = 13,
|
.max_signal = 13,
|
||||||
.muxval = 0,
|
.muxval = 0,
|
||||||
.cctl = 0,
|
|
||||||
.periph_buses = PL08X_AHB2,
|
.periph_buses = PL08X_AHB2,
|
||||||
}, {
|
}, {
|
||||||
.bus_id = "to_jpeg",
|
.bus_id = "to_jpeg",
|
||||||
.min_signal = 14,
|
.min_signal = 14,
|
||||||
.max_signal = 14,
|
.max_signal = 14,
|
||||||
.muxval = 0,
|
.muxval = 0,
|
||||||
.cctl = 0,
|
|
||||||
.periph_buses = PL08X_AHB1,
|
.periph_buses = PL08X_AHB1,
|
||||||
}, {
|
}, {
|
||||||
.bus_id = "from_jpeg",
|
.bus_id = "from_jpeg",
|
||||||
.min_signal = 15,
|
.min_signal = 15,
|
||||||
.max_signal = 15,
|
.max_signal = 15,
|
||||||
.muxval = 0,
|
.muxval = 0,
|
||||||
.cctl = 0,
|
|
||||||
.periph_buses = PL08X_AHB1,
|
.periph_buses = PL08X_AHB1,
|
||||||
}, {
|
}, {
|
||||||
.bus_id = "ras0_rx",
|
.bus_id = "ras0_rx",
|
||||||
.min_signal = 0,
|
.min_signal = 0,
|
||||||
.max_signal = 0,
|
.max_signal = 0,
|
||||||
.muxval = 1,
|
.muxval = 1,
|
||||||
.cctl = 0,
|
|
||||||
.periph_buses = PL08X_AHB1,
|
.periph_buses = PL08X_AHB1,
|
||||||
}, {
|
}, {
|
||||||
.bus_id = "ras0_tx",
|
.bus_id = "ras0_tx",
|
||||||
.min_signal = 1,
|
.min_signal = 1,
|
||||||
.max_signal = 1,
|
.max_signal = 1,
|
||||||
.muxval = 1,
|
.muxval = 1,
|
||||||
.cctl = 0,
|
|
||||||
.periph_buses = PL08X_AHB1,
|
.periph_buses = PL08X_AHB1,
|
||||||
}, {
|
}, {
|
||||||
.bus_id = "ras1_rx",
|
.bus_id = "ras1_rx",
|
||||||
.min_signal = 2,
|
.min_signal = 2,
|
||||||
.max_signal = 2,
|
.max_signal = 2,
|
||||||
.muxval = 1,
|
.muxval = 1,
|
||||||
.cctl = 0,
|
|
||||||
.periph_buses = PL08X_AHB1,
|
.periph_buses = PL08X_AHB1,
|
||||||
}, {
|
}, {
|
||||||
.bus_id = "ras1_tx",
|
.bus_id = "ras1_tx",
|
||||||
.min_signal = 3,
|
.min_signal = 3,
|
||||||
.max_signal = 3,
|
.max_signal = 3,
|
||||||
.muxval = 1,
|
.muxval = 1,
|
||||||
.cctl = 0,
|
|
||||||
.periph_buses = PL08X_AHB1,
|
.periph_buses = PL08X_AHB1,
|
||||||
}, {
|
}, {
|
||||||
.bus_id = "ras2_rx",
|
.bus_id = "ras2_rx",
|
||||||
.min_signal = 4,
|
.min_signal = 4,
|
||||||
.max_signal = 4,
|
.max_signal = 4,
|
||||||
.muxval = 1,
|
.muxval = 1,
|
||||||
.cctl = 0,
|
|
||||||
.periph_buses = PL08X_AHB1,
|
.periph_buses = PL08X_AHB1,
|
||||||
}, {
|
}, {
|
||||||
.bus_id = "ras2_tx",
|
.bus_id = "ras2_tx",
|
||||||
.min_signal = 5,
|
.min_signal = 5,
|
||||||
.max_signal = 5,
|
.max_signal = 5,
|
||||||
.muxval = 1,
|
.muxval = 1,
|
||||||
.cctl = 0,
|
|
||||||
.periph_buses = PL08X_AHB1,
|
.periph_buses = PL08X_AHB1,
|
||||||
}, {
|
}, {
|
||||||
.bus_id = "ras3_rx",
|
.bus_id = "ras3_rx",
|
||||||
.min_signal = 6,
|
.min_signal = 6,
|
||||||
.max_signal = 6,
|
.max_signal = 6,
|
||||||
.muxval = 1,
|
.muxval = 1,
|
||||||
.cctl = 0,
|
|
||||||
.periph_buses = PL08X_AHB1,
|
.periph_buses = PL08X_AHB1,
|
||||||
}, {
|
}, {
|
||||||
.bus_id = "ras3_tx",
|
.bus_id = "ras3_tx",
|
||||||
.min_signal = 7,
|
.min_signal = 7,
|
||||||
.max_signal = 7,
|
.max_signal = 7,
|
||||||
.muxval = 1,
|
.muxval = 1,
|
||||||
.cctl = 0,
|
|
||||||
.periph_buses = PL08X_AHB1,
|
.periph_buses = PL08X_AHB1,
|
||||||
}, {
|
}, {
|
||||||
.bus_id = "ras4_rx",
|
.bus_id = "ras4_rx",
|
||||||
.min_signal = 8,
|
.min_signal = 8,
|
||||||
.max_signal = 8,
|
.max_signal = 8,
|
||||||
.muxval = 1,
|
.muxval = 1,
|
||||||
.cctl = 0,
|
|
||||||
.periph_buses = PL08X_AHB1,
|
.periph_buses = PL08X_AHB1,
|
||||||
}, {
|
}, {
|
||||||
.bus_id = "ras4_tx",
|
.bus_id = "ras4_tx",
|
||||||
.min_signal = 9,
|
.min_signal = 9,
|
||||||
.max_signal = 9,
|
.max_signal = 9,
|
||||||
.muxval = 1,
|
.muxval = 1,
|
||||||
.cctl = 0,
|
|
||||||
.periph_buses = PL08X_AHB1,
|
.periph_buses = PL08X_AHB1,
|
||||||
}, {
|
}, {
|
||||||
.bus_id = "ras5_rx",
|
.bus_id = "ras5_rx",
|
||||||
.min_signal = 10,
|
.min_signal = 10,
|
||||||
.max_signal = 10,
|
.max_signal = 10,
|
||||||
.muxval = 1,
|
.muxval = 1,
|
||||||
.cctl = 0,
|
|
||||||
.periph_buses = PL08X_AHB1,
|
.periph_buses = PL08X_AHB1,
|
||||||
}, {
|
}, {
|
||||||
.bus_id = "ras5_tx",
|
.bus_id = "ras5_tx",
|
||||||
.min_signal = 11,
|
.min_signal = 11,
|
||||||
.max_signal = 11,
|
.max_signal = 11,
|
||||||
.muxval = 1,
|
.muxval = 1,
|
||||||
.cctl = 0,
|
|
||||||
.periph_buses = PL08X_AHB1,
|
.periph_buses = PL08X_AHB1,
|
||||||
}, {
|
}, {
|
||||||
.bus_id = "ras6_rx",
|
.bus_id = "ras6_rx",
|
||||||
.min_signal = 12,
|
.min_signal = 12,
|
||||||
.max_signal = 12,
|
.max_signal = 12,
|
||||||
.muxval = 1,
|
.muxval = 1,
|
||||||
.cctl = 0,
|
|
||||||
.periph_buses = PL08X_AHB1,
|
.periph_buses = PL08X_AHB1,
|
||||||
}, {
|
}, {
|
||||||
.bus_id = "ras6_tx",
|
.bus_id = "ras6_tx",
|
||||||
.min_signal = 13,
|
.min_signal = 13,
|
||||||
.max_signal = 13,
|
.max_signal = 13,
|
||||||
.muxval = 1,
|
.muxval = 1,
|
||||||
.cctl = 0,
|
|
||||||
.periph_buses = PL08X_AHB1,
|
.periph_buses = PL08X_AHB1,
|
||||||
}, {
|
}, {
|
||||||
.bus_id = "ras7_rx",
|
.bus_id = "ras7_rx",
|
||||||
.min_signal = 14,
|
.min_signal = 14,
|
||||||
.max_signal = 14,
|
.max_signal = 14,
|
||||||
.muxval = 1,
|
.muxval = 1,
|
||||||
.cctl = 0,
|
|
||||||
.periph_buses = PL08X_AHB1,
|
.periph_buses = PL08X_AHB1,
|
||||||
}, {
|
}, {
|
||||||
.bus_id = "ras7_tx",
|
.bus_id = "ras7_tx",
|
||||||
.min_signal = 15,
|
.min_signal = 15,
|
||||||
.max_signal = 15,
|
.max_signal = 15,
|
||||||
.muxval = 1,
|
.muxval = 1,
|
||||||
.cctl = 0,
|
|
||||||
.periph_buses = PL08X_AHB1,
|
.periph_buses = PL08X_AHB1,
|
||||||
}, {
|
}, {
|
||||||
.bus_id = "ext0_rx",
|
.bus_id = "ext0_rx",
|
||||||
.min_signal = 0,
|
.min_signal = 0,
|
||||||
.max_signal = 0,
|
.max_signal = 0,
|
||||||
.muxval = 2,
|
.muxval = 2,
|
||||||
.cctl = 0,
|
|
||||||
.periph_buses = PL08X_AHB2,
|
.periph_buses = PL08X_AHB2,
|
||||||
}, {
|
}, {
|
||||||
.bus_id = "ext0_tx",
|
.bus_id = "ext0_tx",
|
||||||
.min_signal = 1,
|
.min_signal = 1,
|
||||||
.max_signal = 1,
|
.max_signal = 1,
|
||||||
.muxval = 2,
|
.muxval = 2,
|
||||||
.cctl = 0,
|
|
||||||
.periph_buses = PL08X_AHB2,
|
.periph_buses = PL08X_AHB2,
|
||||||
}, {
|
}, {
|
||||||
.bus_id = "ext1_rx",
|
.bus_id = "ext1_rx",
|
||||||
.min_signal = 2,
|
.min_signal = 2,
|
||||||
.max_signal = 2,
|
.max_signal = 2,
|
||||||
.muxval = 2,
|
.muxval = 2,
|
||||||
.cctl = 0,
|
|
||||||
.periph_buses = PL08X_AHB2,
|
.periph_buses = PL08X_AHB2,
|
||||||
}, {
|
}, {
|
||||||
.bus_id = "ext1_tx",
|
.bus_id = "ext1_tx",
|
||||||
.min_signal = 3,
|
.min_signal = 3,
|
||||||
.max_signal = 3,
|
.max_signal = 3,
|
||||||
.muxval = 2,
|
.muxval = 2,
|
||||||
.cctl = 0,
|
|
||||||
.periph_buses = PL08X_AHB2,
|
.periph_buses = PL08X_AHB2,
|
||||||
}, {
|
}, {
|
||||||
.bus_id = "ext2_rx",
|
.bus_id = "ext2_rx",
|
||||||
.min_signal = 4,
|
.min_signal = 4,
|
||||||
.max_signal = 4,
|
.max_signal = 4,
|
||||||
.muxval = 2,
|
.muxval = 2,
|
||||||
.cctl = 0,
|
|
||||||
.periph_buses = PL08X_AHB2,
|
.periph_buses = PL08X_AHB2,
|
||||||
}, {
|
}, {
|
||||||
.bus_id = "ext2_tx",
|
.bus_id = "ext2_tx",
|
||||||
.min_signal = 5,
|
.min_signal = 5,
|
||||||
.max_signal = 5,
|
.max_signal = 5,
|
||||||
.muxval = 2,
|
.muxval = 2,
|
||||||
.cctl = 0,
|
|
||||||
.periph_buses = PL08X_AHB2,
|
.periph_buses = PL08X_AHB2,
|
||||||
}, {
|
}, {
|
||||||
.bus_id = "ext3_rx",
|
.bus_id = "ext3_rx",
|
||||||
.min_signal = 6,
|
.min_signal = 6,
|
||||||
.max_signal = 6,
|
.max_signal = 6,
|
||||||
.muxval = 2,
|
.muxval = 2,
|
||||||
.cctl = 0,
|
|
||||||
.periph_buses = PL08X_AHB2,
|
.periph_buses = PL08X_AHB2,
|
||||||
}, {
|
}, {
|
||||||
.bus_id = "ext3_tx",
|
.bus_id = "ext3_tx",
|
||||||
.min_signal = 7,
|
.min_signal = 7,
|
||||||
.max_signal = 7,
|
.max_signal = 7,
|
||||||
.muxval = 2,
|
.muxval = 2,
|
||||||
.cctl = 0,
|
|
||||||
.periph_buses = PL08X_AHB2,
|
.periph_buses = PL08X_AHB2,
|
||||||
}, {
|
}, {
|
||||||
.bus_id = "ext4_rx",
|
.bus_id = "ext4_rx",
|
||||||
.min_signal = 8,
|
.min_signal = 8,
|
||||||
.max_signal = 8,
|
.max_signal = 8,
|
||||||
.muxval = 2,
|
.muxval = 2,
|
||||||
.cctl = 0,
|
|
||||||
.periph_buses = PL08X_AHB2,
|
.periph_buses = PL08X_AHB2,
|
||||||
}, {
|
}, {
|
||||||
.bus_id = "ext4_tx",
|
.bus_id = "ext4_tx",
|
||||||
.min_signal = 9,
|
.min_signal = 9,
|
||||||
.max_signal = 9,
|
.max_signal = 9,
|
||||||
.muxval = 2,
|
.muxval = 2,
|
||||||
.cctl = 0,
|
|
||||||
.periph_buses = PL08X_AHB2,
|
.periph_buses = PL08X_AHB2,
|
||||||
}, {
|
}, {
|
||||||
.bus_id = "ext5_rx",
|
.bus_id = "ext5_rx",
|
||||||
.min_signal = 10,
|
.min_signal = 10,
|
||||||
.max_signal = 10,
|
.max_signal = 10,
|
||||||
.muxval = 2,
|
.muxval = 2,
|
||||||
.cctl = 0,
|
|
||||||
.periph_buses = PL08X_AHB2,
|
.periph_buses = PL08X_AHB2,
|
||||||
}, {
|
}, {
|
||||||
.bus_id = "ext5_tx",
|
.bus_id = "ext5_tx",
|
||||||
.min_signal = 11,
|
.min_signal = 11,
|
||||||
.max_signal = 11,
|
.max_signal = 11,
|
||||||
.muxval = 2,
|
.muxval = 2,
|
||||||
.cctl = 0,
|
|
||||||
.periph_buses = PL08X_AHB2,
|
.periph_buses = PL08X_AHB2,
|
||||||
}, {
|
}, {
|
||||||
.bus_id = "ext6_rx",
|
.bus_id = "ext6_rx",
|
||||||
.min_signal = 12,
|
.min_signal = 12,
|
||||||
.max_signal = 12,
|
.max_signal = 12,
|
||||||
.muxval = 2,
|
.muxval = 2,
|
||||||
.cctl = 0,
|
|
||||||
.periph_buses = PL08X_AHB2,
|
.periph_buses = PL08X_AHB2,
|
||||||
}, {
|
}, {
|
||||||
.bus_id = "ext6_tx",
|
.bus_id = "ext6_tx",
|
||||||
.min_signal = 13,
|
.min_signal = 13,
|
||||||
.max_signal = 13,
|
.max_signal = 13,
|
||||||
.muxval = 2,
|
.muxval = 2,
|
||||||
.cctl = 0,
|
|
||||||
.periph_buses = PL08X_AHB2,
|
.periph_buses = PL08X_AHB2,
|
||||||
}, {
|
}, {
|
||||||
.bus_id = "ext7_rx",
|
.bus_id = "ext7_rx",
|
||||||
.min_signal = 14,
|
.min_signal = 14,
|
||||||
.max_signal = 14,
|
.max_signal = 14,
|
||||||
.muxval = 2,
|
.muxval = 2,
|
||||||
.cctl = 0,
|
|
||||||
.periph_buses = PL08X_AHB2,
|
.periph_buses = PL08X_AHB2,
|
||||||
}, {
|
}, {
|
||||||
.bus_id = "ext7_tx",
|
.bus_id = "ext7_tx",
|
||||||
.min_signal = 15,
|
.min_signal = 15,
|
||||||
.max_signal = 15,
|
.max_signal = 15,
|
||||||
.muxval = 2,
|
.muxval = 2,
|
||||||
.cctl = 0,
|
|
||||||
.periph_buses = PL08X_AHB2,
|
.periph_buses = PL08X_AHB2,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
@ -373,7 +325,8 @@ static struct pl08x_channel_data spear600_dma_info[] = {
|
||||||
struct pl08x_platform_data pl080_plat_data = {
|
struct pl08x_platform_data pl080_plat_data = {
|
||||||
.memcpy_channel = {
|
.memcpy_channel = {
|
||||||
.bus_id = "memcpy",
|
.bus_id = "memcpy",
|
||||||
.cctl = (PL080_BSIZE_16 << PL080_CONTROL_SB_SIZE_SHIFT | \
|
.cctl_memcpy =
|
||||||
|
(PL080_BSIZE_16 << PL080_CONTROL_SB_SIZE_SHIFT | \
|
||||||
PL080_BSIZE_16 << PL080_CONTROL_DB_SIZE_SHIFT | \
|
PL080_BSIZE_16 << PL080_CONTROL_DB_SIZE_SHIFT | \
|
||||||
PL080_WIDTH_32BIT << PL080_CONTROL_SWIDTH_SHIFT | \
|
PL080_WIDTH_32BIT << PL080_CONTROL_SWIDTH_SHIFT | \
|
||||||
PL080_WIDTH_32BIT << PL080_CONTROL_DWIDTH_SHIFT | \
|
PL080_WIDTH_32BIT << PL080_CONTROL_DWIDTH_SHIFT | \
|
||||||
|
|
|
@ -14,8 +14,8 @@
|
||||||
#ifndef __PLAT_PL080_H
|
#ifndef __PLAT_PL080_H
|
||||||
#define __PLAT_PL080_H
|
#define __PLAT_PL080_H
|
||||||
|
|
||||||
struct pl08x_dma_chan;
|
struct pl08x_channel_data;
|
||||||
int pl080_get_signal(struct pl08x_dma_chan *ch);
|
int pl080_get_signal(const struct pl08x_channel_data *cd);
|
||||||
void pl080_put_signal(struct pl08x_dma_chan *ch);
|
void pl080_put_signal(const struct pl08x_channel_data *cd, int signal);
|
||||||
|
|
||||||
#endif /* __PLAT_PL080_H */
|
#endif /* __PLAT_PL080_H */
|
||||||
|
|
|
@ -27,9 +27,8 @@ struct {
|
||||||
unsigned char val;
|
unsigned char val;
|
||||||
} signals[16] = {{0, 0}, };
|
} signals[16] = {{0, 0}, };
|
||||||
|
|
||||||
int pl080_get_signal(struct pl08x_dma_chan *ch)
|
int pl080_get_signal(const struct pl08x_channel_data *cd)
|
||||||
{
|
{
|
||||||
const struct pl08x_channel_data *cd = ch->cd;
|
|
||||||
unsigned int signal = cd->min_signal, val;
|
unsigned int signal = cd->min_signal, val;
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
|
|
||||||
|
@ -63,18 +62,17 @@ int pl080_get_signal(struct pl08x_dma_chan *ch)
|
||||||
return signal;
|
return signal;
|
||||||
}
|
}
|
||||||
|
|
||||||
void pl080_put_signal(struct pl08x_dma_chan *ch)
|
void pl080_put_signal(const struct pl08x_channel_data *cd, int signal)
|
||||||
{
|
{
|
||||||
const struct pl08x_channel_data *cd = ch->cd;
|
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
|
|
||||||
spin_lock_irqsave(&lock, flags);
|
spin_lock_irqsave(&lock, flags);
|
||||||
|
|
||||||
/* if signal is not used */
|
/* if signal is not used */
|
||||||
if (!signals[cd->min_signal].busy)
|
if (!signals[signal].busy)
|
||||||
BUG();
|
BUG();
|
||||||
|
|
||||||
signals[cd->min_signal].busy--;
|
signals[signal].busy--;
|
||||||
|
|
||||||
spin_unlock_irqrestore(&lock, flags);
|
spin_unlock_irqrestore(&lock, flags);
|
||||||
}
|
}
|
||||||
|
|
|
@ -53,6 +53,7 @@ config AMBA_PL08X
|
||||||
bool "ARM PrimeCell PL080 or PL081 support"
|
bool "ARM PrimeCell PL080 or PL081 support"
|
||||||
depends on ARM_AMBA && EXPERIMENTAL
|
depends on ARM_AMBA && EXPERIMENTAL
|
||||||
select DMA_ENGINE
|
select DMA_ENGINE
|
||||||
|
select DMA_VIRTUAL_CHANNELS
|
||||||
help
|
help
|
||||||
Platform has a PL08x DMAC device
|
Platform has a PL08x DMAC device
|
||||||
which can provide DMA engine support
|
which can provide DMA engine support
|
||||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -78,6 +78,8 @@ struct sa11x0_dma_desc {
|
||||||
|
|
||||||
u32 ddar;
|
u32 ddar;
|
||||||
size_t size;
|
size_t size;
|
||||||
|
unsigned period;
|
||||||
|
bool cyclic;
|
||||||
|
|
||||||
unsigned sglen;
|
unsigned sglen;
|
||||||
struct sa11x0_dma_sg sg[0];
|
struct sa11x0_dma_sg sg[0];
|
||||||
|
@ -178,19 +180,24 @@ static void noinline sa11x0_dma_start_sg(struct sa11x0_dma_phy *p,
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (p->sg_load == txd->sglen) {
|
if (p->sg_load == txd->sglen) {
|
||||||
struct sa11x0_dma_desc *txn = sa11x0_dma_next_desc(c);
|
if (!txd->cyclic) {
|
||||||
|
struct sa11x0_dma_desc *txn = sa11x0_dma_next_desc(c);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* We have reached the end of the current descriptor.
|
* We have reached the end of the current descriptor.
|
||||||
* Peek at the next descriptor, and if compatible with
|
* Peek at the next descriptor, and if compatible with
|
||||||
* the current, start processing it.
|
* the current, start processing it.
|
||||||
*/
|
*/
|
||||||
if (txn && txn->ddar == txd->ddar) {
|
if (txn && txn->ddar == txd->ddar) {
|
||||||
txd = txn;
|
txd = txn;
|
||||||
sa11x0_dma_start_desc(p, txn);
|
sa11x0_dma_start_desc(p, txn);
|
||||||
|
} else {
|
||||||
|
p->txd_load = NULL;
|
||||||
|
return;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
p->txd_load = NULL;
|
/* Cyclic: reset back to beginning */
|
||||||
return;
|
p->sg_load = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -224,13 +231,21 @@ static void noinline sa11x0_dma_complete(struct sa11x0_dma_phy *p,
|
||||||
struct sa11x0_dma_desc *txd = p->txd_done;
|
struct sa11x0_dma_desc *txd = p->txd_done;
|
||||||
|
|
||||||
if (++p->sg_done == txd->sglen) {
|
if (++p->sg_done == txd->sglen) {
|
||||||
vchan_cookie_complete(&txd->vd);
|
if (!txd->cyclic) {
|
||||||
|
vchan_cookie_complete(&txd->vd);
|
||||||
|
|
||||||
p->sg_done = 0;
|
p->sg_done = 0;
|
||||||
p->txd_done = p->txd_load;
|
p->txd_done = p->txd_load;
|
||||||
|
|
||||||
if (!p->txd_done)
|
if (!p->txd_done)
|
||||||
tasklet_schedule(&p->dev->task);
|
tasklet_schedule(&p->dev->task);
|
||||||
|
} else {
|
||||||
|
if ((p->sg_done % txd->period) == 0)
|
||||||
|
vchan_cyclic_callback(&txd->vd);
|
||||||
|
|
||||||
|
/* Cyclic: reset back to beginning */
|
||||||
|
p->sg_done = 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
sa11x0_dma_start_sg(p, c);
|
sa11x0_dma_start_sg(p, c);
|
||||||
|
@ -416,27 +431,47 @@ static enum dma_status sa11x0_dma_tx_status(struct dma_chan *chan,
|
||||||
struct sa11x0_dma_chan *c = to_sa11x0_dma_chan(chan);
|
struct sa11x0_dma_chan *c = to_sa11x0_dma_chan(chan);
|
||||||
struct sa11x0_dma_dev *d = to_sa11x0_dma(chan->device);
|
struct sa11x0_dma_dev *d = to_sa11x0_dma(chan->device);
|
||||||
struct sa11x0_dma_phy *p;
|
struct sa11x0_dma_phy *p;
|
||||||
struct sa11x0_dma_desc *txd;
|
struct virt_dma_desc *vd;
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
enum dma_status ret;
|
enum dma_status ret;
|
||||||
size_t bytes = 0;
|
|
||||||
|
|
||||||
ret = dma_cookie_status(&c->vc.chan, cookie, state);
|
ret = dma_cookie_status(&c->vc.chan, cookie, state);
|
||||||
if (ret == DMA_SUCCESS)
|
if (ret == DMA_SUCCESS)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
|
if (!state)
|
||||||
|
return c->status;
|
||||||
|
|
||||||
spin_lock_irqsave(&c->vc.lock, flags);
|
spin_lock_irqsave(&c->vc.lock, flags);
|
||||||
p = c->phy;
|
p = c->phy;
|
||||||
ret = c->status;
|
|
||||||
if (p) {
|
|
||||||
dma_addr_t addr = sa11x0_dma_pos(p);
|
|
||||||
|
|
||||||
dev_vdbg(d->slave.dev, "tx_status: addr:%x\n", addr);
|
/*
|
||||||
|
* If the cookie is on our issue queue, then the residue is
|
||||||
|
* its total size.
|
||||||
|
*/
|
||||||
|
vd = vchan_find_desc(&c->vc, cookie);
|
||||||
|
if (vd) {
|
||||||
|
state->residue = container_of(vd, struct sa11x0_dma_desc, vd)->size;
|
||||||
|
} else if (!p) {
|
||||||
|
state->residue = 0;
|
||||||
|
} else {
|
||||||
|
struct sa11x0_dma_desc *txd;
|
||||||
|
size_t bytes = 0;
|
||||||
|
|
||||||
txd = p->txd_done;
|
if (p->txd_done && p->txd_done->vd.tx.cookie == cookie)
|
||||||
|
txd = p->txd_done;
|
||||||
|
else if (p->txd_load && p->txd_load->vd.tx.cookie == cookie)
|
||||||
|
txd = p->txd_load;
|
||||||
|
else
|
||||||
|
txd = NULL;
|
||||||
|
|
||||||
|
ret = c->status;
|
||||||
if (txd) {
|
if (txd) {
|
||||||
|
dma_addr_t addr = sa11x0_dma_pos(p);
|
||||||
unsigned i;
|
unsigned i;
|
||||||
|
|
||||||
|
dev_vdbg(d->slave.dev, "tx_status: addr:%x\n", addr);
|
||||||
|
|
||||||
for (i = 0; i < txd->sglen; i++) {
|
for (i = 0; i < txd->sglen; i++) {
|
||||||
dev_vdbg(d->slave.dev, "tx_status: [%u] %x+%x\n",
|
dev_vdbg(d->slave.dev, "tx_status: [%u] %x+%x\n",
|
||||||
i, txd->sg[i].addr, txd->sg[i].len);
|
i, txd->sg[i].addr, txd->sg[i].len);
|
||||||
|
@ -459,18 +494,11 @@ static enum dma_status sa11x0_dma_tx_status(struct dma_chan *chan,
|
||||||
bytes += txd->sg[i].len;
|
bytes += txd->sg[i].len;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (txd != p->txd_load && p->txd_load)
|
state->residue = bytes;
|
||||||
bytes += p->txd_load->size;
|
|
||||||
}
|
|
||||||
list_for_each_entry(txd, &c->vc.desc_issued, vd.node) {
|
|
||||||
bytes += txd->size;
|
|
||||||
}
|
}
|
||||||
spin_unlock_irqrestore(&c->vc.lock, flags);
|
spin_unlock_irqrestore(&c->vc.lock, flags);
|
||||||
|
|
||||||
if (state)
|
dev_vdbg(d->slave.dev, "tx_status: bytes 0x%zx\n", state->residue);
|
||||||
state->residue = bytes;
|
|
||||||
|
|
||||||
dev_vdbg(d->slave.dev, "tx_status: bytes 0x%zx\n", bytes);
|
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -584,6 +612,65 @@ static struct dma_async_tx_descriptor *sa11x0_dma_prep_slave_sg(
|
||||||
return vchan_tx_prep(&c->vc, &txd->vd, flags);
|
return vchan_tx_prep(&c->vc, &txd->vd, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static struct dma_async_tx_descriptor *sa11x0_dma_prep_dma_cyclic(
|
||||||
|
struct dma_chan *chan, dma_addr_t addr, size_t size, size_t period,
|
||||||
|
enum dma_transfer_direction dir, void *context)
|
||||||
|
{
|
||||||
|
struct sa11x0_dma_chan *c = to_sa11x0_dma_chan(chan);
|
||||||
|
struct sa11x0_dma_desc *txd;
|
||||||
|
unsigned i, j, k, sglen, sgperiod;
|
||||||
|
|
||||||
|
/* SA11x0 channels can only operate in their native direction */
|
||||||
|
if (dir != (c->ddar & DDAR_RW ? DMA_DEV_TO_MEM : DMA_MEM_TO_DEV)) {
|
||||||
|
dev_err(chan->device->dev, "vchan %p: bad DMA direction: DDAR:%08x dir:%u\n",
|
||||||
|
&c->vc, c->ddar, dir);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
sgperiod = DIV_ROUND_UP(period, DMA_MAX_SIZE & ~DMA_ALIGN);
|
||||||
|
sglen = size * sgperiod / period;
|
||||||
|
|
||||||
|
/* Do not allow zero-sized txds */
|
||||||
|
if (sglen == 0)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
txd = kzalloc(sizeof(*txd) + sglen * sizeof(txd->sg[0]), GFP_ATOMIC);
|
||||||
|
if (!txd) {
|
||||||
|
dev_dbg(chan->device->dev, "vchan %p: kzalloc failed\n", &c->vc);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = k = 0; i < size / period; i++) {
|
||||||
|
size_t tlen, len = period;
|
||||||
|
|
||||||
|
for (j = 0; j < sgperiod; j++, k++) {
|
||||||
|
tlen = len;
|
||||||
|
|
||||||
|
if (tlen > DMA_MAX_SIZE) {
|
||||||
|
unsigned mult = DIV_ROUND_UP(tlen, DMA_MAX_SIZE & ~DMA_ALIGN);
|
||||||
|
tlen = (tlen / mult) & ~DMA_ALIGN;
|
||||||
|
}
|
||||||
|
|
||||||
|
txd->sg[k].addr = addr;
|
||||||
|
txd->sg[k].len = tlen;
|
||||||
|
addr += tlen;
|
||||||
|
len -= tlen;
|
||||||
|
}
|
||||||
|
|
||||||
|
WARN_ON(len != 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
WARN_ON(k != sglen);
|
||||||
|
|
||||||
|
txd->ddar = c->ddar;
|
||||||
|
txd->size = size;
|
||||||
|
txd->sglen = sglen;
|
||||||
|
txd->cyclic = 1;
|
||||||
|
txd->period = sgperiod;
|
||||||
|
|
||||||
|
return vchan_tx_prep(&c->vc, &txd->vd, DMA_PREP_INTERRUPT | DMA_CTRL_ACK);
|
||||||
|
}
|
||||||
|
|
||||||
static int sa11x0_dma_slave_config(struct sa11x0_dma_chan *c, struct dma_slave_config *cfg)
|
static int sa11x0_dma_slave_config(struct sa11x0_dma_chan *c, struct dma_slave_config *cfg)
|
||||||
{
|
{
|
||||||
u32 ddar = c->ddar & ((0xf << 4) | DDAR_RW);
|
u32 ddar = c->ddar & ((0xf << 4) | DDAR_RW);
|
||||||
|
@ -854,7 +941,9 @@ static int __devinit sa11x0_dma_probe(struct platform_device *pdev)
|
||||||
}
|
}
|
||||||
|
|
||||||
dma_cap_set(DMA_SLAVE, d->slave.cap_mask);
|
dma_cap_set(DMA_SLAVE, d->slave.cap_mask);
|
||||||
|
dma_cap_set(DMA_CYCLIC, d->slave.cap_mask);
|
||||||
d->slave.device_prep_slave_sg = sa11x0_dma_prep_slave_sg;
|
d->slave.device_prep_slave_sg = sa11x0_dma_prep_slave_sg;
|
||||||
|
d->slave.device_prep_dma_cyclic = sa11x0_dma_prep_dma_cyclic;
|
||||||
ret = sa11x0_dma_init_dmadev(&d->slave, &pdev->dev);
|
ret = sa11x0_dma_init_dmadev(&d->slave, &pdev->dev);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
dev_warn(d->slave.dev, "failed to register slave async device: %d\n",
|
dev_warn(d->slave.dev, "failed to register slave async device: %d\n",
|
||||||
|
|
|
@ -21,8 +21,9 @@
|
||||||
#include <linux/dmaengine.h>
|
#include <linux/dmaengine.h>
|
||||||
#include <linux/interrupt.h>
|
#include <linux/interrupt.h>
|
||||||
|
|
||||||
struct pl08x_lli;
|
|
||||||
struct pl08x_driver_data;
|
struct pl08x_driver_data;
|
||||||
|
struct pl08x_phy_chan;
|
||||||
|
struct pl08x_txd;
|
||||||
|
|
||||||
/* Bitmasks for selecting AHB ports for DMA transfers */
|
/* Bitmasks for selecting AHB ports for DMA transfers */
|
||||||
enum {
|
enum {
|
||||||
|
@ -46,169 +47,28 @@ enum {
|
||||||
* devices with static assignments
|
* devices with static assignments
|
||||||
* @muxval: a number usually used to poke into some mux regiser to
|
* @muxval: a number usually used to poke into some mux regiser to
|
||||||
* mux in the signal to this channel
|
* mux in the signal to this channel
|
||||||
* @cctl_opt: default options for the channel control register
|
* @cctl_memcpy: options for the channel control register for memcpy
|
||||||
|
* *** not used for slave channels ***
|
||||||
* @addr: source/target address in physical memory for this DMA channel,
|
* @addr: source/target address in physical memory for this DMA channel,
|
||||||
* can be the address of a FIFO register for burst requests for example.
|
* can be the address of a FIFO register for burst requests for example.
|
||||||
* This can be left undefined if the PrimeCell API is used for configuring
|
* This can be left undefined if the PrimeCell API is used for configuring
|
||||||
* this.
|
* this.
|
||||||
* @circular_buffer: whether the buffer passed in is circular and
|
|
||||||
* shall simply be looped round round (like a record baby round
|
|
||||||
* round round round)
|
|
||||||
* @single: the device connected to this channel will request single DMA
|
* @single: the device connected to this channel will request single DMA
|
||||||
* transfers, not bursts. (Bursts are default.)
|
* transfers, not bursts. (Bursts are default.)
|
||||||
* @periph_buses: the device connected to this channel is accessible via
|
* @periph_buses: the device connected to this channel is accessible via
|
||||||
* these buses (use PL08X_AHB1 | PL08X_AHB2).
|
* these buses (use PL08X_AHB1 | PL08X_AHB2).
|
||||||
*/
|
*/
|
||||||
struct pl08x_channel_data {
|
struct pl08x_channel_data {
|
||||||
char *bus_id;
|
const char *bus_id;
|
||||||
int min_signal;
|
int min_signal;
|
||||||
int max_signal;
|
int max_signal;
|
||||||
u32 muxval;
|
u32 muxval;
|
||||||
u32 cctl;
|
u32 cctl_memcpy;
|
||||||
dma_addr_t addr;
|
dma_addr_t addr;
|
||||||
bool circular_buffer;
|
|
||||||
bool single;
|
bool single;
|
||||||
u8 periph_buses;
|
u8 periph_buses;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
|
||||||
* Struct pl08x_bus_data - information of source or destination
|
|
||||||
* busses for a transfer
|
|
||||||
* @addr: current address
|
|
||||||
* @maxwidth: the maximum width of a transfer on this bus
|
|
||||||
* @buswidth: the width of this bus in bytes: 1, 2 or 4
|
|
||||||
*/
|
|
||||||
struct pl08x_bus_data {
|
|
||||||
dma_addr_t addr;
|
|
||||||
u8 maxwidth;
|
|
||||||
u8 buswidth;
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* struct pl08x_phy_chan - holder for the physical channels
|
|
||||||
* @id: physical index to this channel
|
|
||||||
* @lock: a lock to use when altering an instance of this struct
|
|
||||||
* @signal: the physical signal (aka channel) serving this physical channel
|
|
||||||
* right now
|
|
||||||
* @serving: the virtual channel currently being served by this physical
|
|
||||||
* channel
|
|
||||||
* @locked: channel unavailable for the system, e.g. dedicated to secure
|
|
||||||
* world
|
|
||||||
*/
|
|
||||||
struct pl08x_phy_chan {
|
|
||||||
unsigned int id;
|
|
||||||
void __iomem *base;
|
|
||||||
spinlock_t lock;
|
|
||||||
int signal;
|
|
||||||
struct pl08x_dma_chan *serving;
|
|
||||||
bool locked;
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* struct pl08x_sg - structure containing data per sg
|
|
||||||
* @src_addr: src address of sg
|
|
||||||
* @dst_addr: dst address of sg
|
|
||||||
* @len: transfer len in bytes
|
|
||||||
* @node: node for txd's dsg_list
|
|
||||||
*/
|
|
||||||
struct pl08x_sg {
|
|
||||||
dma_addr_t src_addr;
|
|
||||||
dma_addr_t dst_addr;
|
|
||||||
size_t len;
|
|
||||||
struct list_head node;
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* struct pl08x_txd - wrapper for struct dma_async_tx_descriptor
|
|
||||||
* @tx: async tx descriptor
|
|
||||||
* @node: node for txd list for channels
|
|
||||||
* @dsg_list: list of children sg's
|
|
||||||
* @direction: direction of transfer
|
|
||||||
* @llis_bus: DMA memory address (physical) start for the LLIs
|
|
||||||
* @llis_va: virtual memory address start for the LLIs
|
|
||||||
* @cctl: control reg values for current txd
|
|
||||||
* @ccfg: config reg values for current txd
|
|
||||||
*/
|
|
||||||
struct pl08x_txd {
|
|
||||||
struct dma_async_tx_descriptor tx;
|
|
||||||
struct list_head node;
|
|
||||||
struct list_head dsg_list;
|
|
||||||
enum dma_transfer_direction direction;
|
|
||||||
dma_addr_t llis_bus;
|
|
||||||
struct pl08x_lli *llis_va;
|
|
||||||
/* Default cctl value for LLIs */
|
|
||||||
u32 cctl;
|
|
||||||
/*
|
|
||||||
* Settings to be put into the physical channel when we
|
|
||||||
* trigger this txd. Other registers are in llis_va[0].
|
|
||||||
*/
|
|
||||||
u32 ccfg;
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* struct pl08x_dma_chan_state - holds the PL08x specific virtual channel
|
|
||||||
* states
|
|
||||||
* @PL08X_CHAN_IDLE: the channel is idle
|
|
||||||
* @PL08X_CHAN_RUNNING: the channel has allocated a physical transport
|
|
||||||
* channel and is running a transfer on it
|
|
||||||
* @PL08X_CHAN_PAUSED: the channel has allocated a physical transport
|
|
||||||
* channel, but the transfer is currently paused
|
|
||||||
* @PL08X_CHAN_WAITING: the channel is waiting for a physical transport
|
|
||||||
* channel to become available (only pertains to memcpy channels)
|
|
||||||
*/
|
|
||||||
enum pl08x_dma_chan_state {
|
|
||||||
PL08X_CHAN_IDLE,
|
|
||||||
PL08X_CHAN_RUNNING,
|
|
||||||
PL08X_CHAN_PAUSED,
|
|
||||||
PL08X_CHAN_WAITING,
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* struct pl08x_dma_chan - this structure wraps a DMA ENGINE channel
|
|
||||||
* @chan: wrappped abstract channel
|
|
||||||
* @phychan: the physical channel utilized by this channel, if there is one
|
|
||||||
* @phychan_hold: if non-zero, hold on to the physical channel even if we
|
|
||||||
* have no pending entries
|
|
||||||
* @tasklet: tasklet scheduled by the IRQ to handle actual work etc
|
|
||||||
* @name: name of channel
|
|
||||||
* @cd: channel platform data
|
|
||||||
* @runtime_addr: address for RX/TX according to the runtime config
|
|
||||||
* @runtime_direction: current direction of this channel according to
|
|
||||||
* runtime config
|
|
||||||
* @pend_list: queued transactions pending on this channel
|
|
||||||
* @at: active transaction on this channel
|
|
||||||
* @lock: a lock for this channel data
|
|
||||||
* @host: a pointer to the host (internal use)
|
|
||||||
* @state: whether the channel is idle, paused, running etc
|
|
||||||
* @slave: whether this channel is a device (slave) or for memcpy
|
|
||||||
* @device_fc: Flow Controller Settings for ccfg register. Only valid for slave
|
|
||||||
* channels. Fill with 'true' if peripheral should be flow controller. Direction
|
|
||||||
* will be selected at Runtime.
|
|
||||||
* @waiting: a TX descriptor on this channel which is waiting for a physical
|
|
||||||
* channel to become available
|
|
||||||
*/
|
|
||||||
struct pl08x_dma_chan {
|
|
||||||
struct dma_chan chan;
|
|
||||||
struct pl08x_phy_chan *phychan;
|
|
||||||
int phychan_hold;
|
|
||||||
struct tasklet_struct tasklet;
|
|
||||||
char *name;
|
|
||||||
const struct pl08x_channel_data *cd;
|
|
||||||
dma_addr_t src_addr;
|
|
||||||
dma_addr_t dst_addr;
|
|
||||||
u32 src_cctl;
|
|
||||||
u32 dst_cctl;
|
|
||||||
enum dma_transfer_direction runtime_direction;
|
|
||||||
struct list_head pend_list;
|
|
||||||
struct pl08x_txd *at;
|
|
||||||
spinlock_t lock;
|
|
||||||
struct pl08x_driver_data *host;
|
|
||||||
enum pl08x_dma_chan_state state;
|
|
||||||
bool slave;
|
|
||||||
bool device_fc;
|
|
||||||
struct pl08x_txd *waiting;
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* struct pl08x_platform_data - the platform configuration for the PL08x
|
* struct pl08x_platform_data - the platform configuration for the PL08x
|
||||||
* PrimeCells.
|
* PrimeCells.
|
||||||
|
@ -229,8 +89,8 @@ struct pl08x_platform_data {
|
||||||
const struct pl08x_channel_data *slave_channels;
|
const struct pl08x_channel_data *slave_channels;
|
||||||
unsigned int num_slave_channels;
|
unsigned int num_slave_channels;
|
||||||
struct pl08x_channel_data memcpy_channel;
|
struct pl08x_channel_data memcpy_channel;
|
||||||
int (*get_signal)(struct pl08x_dma_chan *);
|
int (*get_signal)(const struct pl08x_channel_data *);
|
||||||
void (*put_signal)(struct pl08x_dma_chan *);
|
void (*put_signal)(const struct pl08x_channel_data *, int);
|
||||||
u8 lli_buses;
|
u8 lli_buses;
|
||||||
u8 mem_buses;
|
u8 mem_buses;
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in a new issue