hw: allwinner-r40: Complete uart devices
R40 has eight UARTs, support both 16450 and 16550 compatible modes. Signed-off-by: qianfan Zhao <qianfanguijin@163.com> Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
parent
dc2a070d12
commit
d1e409c583
@ -45,6 +45,13 @@ const hwaddr allwinner_r40_memmap[] = {
|
|||||||
[AW_R40_DEV_CCU] = 0x01c20000,
|
[AW_R40_DEV_CCU] = 0x01c20000,
|
||||||
[AW_R40_DEV_PIT] = 0x01c20c00,
|
[AW_R40_DEV_PIT] = 0x01c20c00,
|
||||||
[AW_R40_DEV_UART0] = 0x01c28000,
|
[AW_R40_DEV_UART0] = 0x01c28000,
|
||||||
|
[AW_R40_DEV_UART1] = 0x01c28400,
|
||||||
|
[AW_R40_DEV_UART2] = 0x01c28800,
|
||||||
|
[AW_R40_DEV_UART3] = 0x01c28c00,
|
||||||
|
[AW_R40_DEV_UART4] = 0x01c29000,
|
||||||
|
[AW_R40_DEV_UART5] = 0x01c29400,
|
||||||
|
[AW_R40_DEV_UART6] = 0x01c29800,
|
||||||
|
[AW_R40_DEV_UART7] = 0x01c29c00,
|
||||||
[AW_R40_DEV_GIC_DIST] = 0x01c81000,
|
[AW_R40_DEV_GIC_DIST] = 0x01c81000,
|
||||||
[AW_R40_DEV_GIC_CPU] = 0x01c82000,
|
[AW_R40_DEV_GIC_CPU] = 0x01c82000,
|
||||||
[AW_R40_DEV_GIC_HYP] = 0x01c84000,
|
[AW_R40_DEV_GIC_HYP] = 0x01c84000,
|
||||||
@ -157,6 +164,13 @@ enum {
|
|||||||
/* Shared Processor Interrupts */
|
/* Shared Processor Interrupts */
|
||||||
enum {
|
enum {
|
||||||
AW_R40_GIC_SPI_UART0 = 1,
|
AW_R40_GIC_SPI_UART0 = 1,
|
||||||
|
AW_R40_GIC_SPI_UART1 = 2,
|
||||||
|
AW_R40_GIC_SPI_UART2 = 3,
|
||||||
|
AW_R40_GIC_SPI_UART3 = 4,
|
||||||
|
AW_R40_GIC_SPI_UART4 = 17,
|
||||||
|
AW_R40_GIC_SPI_UART5 = 18,
|
||||||
|
AW_R40_GIC_SPI_UART6 = 19,
|
||||||
|
AW_R40_GIC_SPI_UART7 = 20,
|
||||||
AW_R40_GIC_SPI_TIMER0 = 22,
|
AW_R40_GIC_SPI_TIMER0 = 22,
|
||||||
AW_R40_GIC_SPI_TIMER1 = 23,
|
AW_R40_GIC_SPI_TIMER1 = 23,
|
||||||
AW_R40_GIC_SPI_MMC0 = 32,
|
AW_R40_GIC_SPI_MMC0 = 32,
|
||||||
@ -384,9 +398,23 @@ static void allwinner_r40_realize(DeviceState *dev, Error **errp)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* UART0. For future clocktree API: All UARTS are connected to APB2_CLK. */
|
/* UART0. For future clocktree API: All UARTS are connected to APB2_CLK. */
|
||||||
serial_mm_init(get_system_memory(), s->memmap[AW_R40_DEV_UART0], 2,
|
for (int i = 0; i < AW_R40_NUM_UARTS; i++) {
|
||||||
qdev_get_gpio_in(DEVICE(&s->gic), AW_R40_GIC_SPI_UART0),
|
static const int uart_irqs[AW_R40_NUM_UARTS] = {
|
||||||
115200, serial_hd(0), DEVICE_NATIVE_ENDIAN);
|
AW_R40_GIC_SPI_UART0,
|
||||||
|
AW_R40_GIC_SPI_UART1,
|
||||||
|
AW_R40_GIC_SPI_UART2,
|
||||||
|
AW_R40_GIC_SPI_UART3,
|
||||||
|
AW_R40_GIC_SPI_UART4,
|
||||||
|
AW_R40_GIC_SPI_UART5,
|
||||||
|
AW_R40_GIC_SPI_UART6,
|
||||||
|
AW_R40_GIC_SPI_UART7,
|
||||||
|
};
|
||||||
|
const hwaddr addr = s->memmap[AW_R40_DEV_UART0 + i];
|
||||||
|
|
||||||
|
serial_mm_init(get_system_memory(), addr, 2,
|
||||||
|
qdev_get_gpio_in(DEVICE(&s->gic), uart_irqs[i]),
|
||||||
|
115200, serial_hd(i), DEVICE_NATIVE_ENDIAN);
|
||||||
|
}
|
||||||
|
|
||||||
/* Unimplemented devices */
|
/* Unimplemented devices */
|
||||||
for (i = 0; i < ARRAY_SIZE(r40_unimplemented); i++) {
|
for (i = 0; i < ARRAY_SIZE(r40_unimplemented); i++) {
|
||||||
|
@ -41,6 +41,13 @@ enum {
|
|||||||
AW_R40_DEV_CCU,
|
AW_R40_DEV_CCU,
|
||||||
AW_R40_DEV_PIT,
|
AW_R40_DEV_PIT,
|
||||||
AW_R40_DEV_UART0,
|
AW_R40_DEV_UART0,
|
||||||
|
AW_R40_DEV_UART1,
|
||||||
|
AW_R40_DEV_UART2,
|
||||||
|
AW_R40_DEV_UART3,
|
||||||
|
AW_R40_DEV_UART4,
|
||||||
|
AW_R40_DEV_UART5,
|
||||||
|
AW_R40_DEV_UART6,
|
||||||
|
AW_R40_DEV_UART7,
|
||||||
AW_R40_DEV_GIC_DIST,
|
AW_R40_DEV_GIC_DIST,
|
||||||
AW_R40_DEV_GIC_CPU,
|
AW_R40_DEV_GIC_CPU,
|
||||||
AW_R40_DEV_GIC_HYP,
|
AW_R40_DEV_GIC_HYP,
|
||||||
@ -70,6 +77,7 @@ OBJECT_DECLARE_SIMPLE_TYPE(AwR40State, AW_R40)
|
|||||||
* which are currently emulated by the R40 SoC code.
|
* which are currently emulated by the R40 SoC code.
|
||||||
*/
|
*/
|
||||||
#define AW_R40_NUM_MMCS 4
|
#define AW_R40_NUM_MMCS 4
|
||||||
|
#define AW_R40_NUM_UARTS 8
|
||||||
|
|
||||||
struct AwR40State {
|
struct AwR40State {
|
||||||
/*< private >*/
|
/*< private >*/
|
||||||
|
Loading…
Reference in New Issue
Block a user