^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) // SPDX-License-Identifier: GPL-2.0-only
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * linux/arch/arm/mach-mmp/flint.c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) * Support for the Marvell Flint Development Platform.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) * Copyright (C) 2009 Marvell International Ltd.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) #include <linux/init.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) #include <linux/kernel.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) #include <linux/platform_device.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) #include <linux/smc91x.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) #include <linux/io.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) #include <linux/gpio.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) #include <linux/gpio-pxa.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) #include <linux/interrupt.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) #include <asm/mach-types.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) #include <asm/mach/arch.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) #include "addr-map.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) #include "mfp-mmp2.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) #include "mmp2.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) #include "irqs.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) #include "common.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) #define FLINT_NR_IRQS (MMP_NR_IRQS + 48)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) static unsigned long flint_pin_config[] __initdata = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) /* UART1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) GPIO45_UART1_RXD,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) GPIO46_UART1_TXD,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) /* UART2 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) GPIO47_UART2_RXD,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) GPIO48_UART2_TXD,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) /* SMC */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) GPIO151_SMC_SCLK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) GPIO145_SMC_nCS0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) GPIO146_SMC_nCS1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) GPIO152_SMC_BE0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) GPIO153_SMC_BE1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) GPIO154_SMC_IRQ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) GPIO113_SMC_RDY,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) /*Ethernet*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) GPIO155_GPIO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) /* DFI */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) GPIO168_DFI_D0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) GPIO167_DFI_D1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) GPIO166_DFI_D2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) GPIO165_DFI_D3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) GPIO107_DFI_D4,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) GPIO106_DFI_D5,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) GPIO105_DFI_D6,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) GPIO104_DFI_D7,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) GPIO111_DFI_D8,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) GPIO164_DFI_D9,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) GPIO163_DFI_D10,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) GPIO162_DFI_D11,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) GPIO161_DFI_D12,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) GPIO110_DFI_D13,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) GPIO109_DFI_D14,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) GPIO108_DFI_D15,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) GPIO143_ND_nCS0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) GPIO144_ND_nCS1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) GPIO147_ND_nWE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) GPIO148_ND_nRE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) GPIO150_ND_ALE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) GPIO149_ND_CLE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) GPIO112_ND_RDY0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) GPIO160_ND_RDY1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) static struct pxa_gpio_platform_data mmp2_gpio_pdata = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) .irq_base = MMP_GPIO_TO_IRQ(0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) static struct smc91x_platdata flint_smc91x_info = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) .flags = SMC91X_USE_16BIT | SMC91X_NOWAIT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) static struct resource smc91x_resources[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) [0] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) .start = SMC_CS1_PHYS_BASE + 0x300,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) .end = SMC_CS1_PHYS_BASE + 0xfffff,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) .flags = IORESOURCE_MEM,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) [1] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) .start = MMP_GPIO_TO_IRQ(155),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) .end = MMP_GPIO_TO_IRQ(155),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHEDGE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) static struct platform_device smc91x_device = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) .name = "smc91x",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) .id = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) .dev = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) .platform_data = &flint_smc91x_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) .num_resources = ARRAY_SIZE(smc91x_resources),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) .resource = smc91x_resources,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) static void __init flint_init(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) mfp_config(ARRAY_AND_SIZE(flint_pin_config));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) /* on-chip devices */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) mmp2_add_uart(1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) mmp2_add_uart(2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) platform_device_add_data(&mmp2_device_gpio, &mmp2_gpio_pdata,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) sizeof(struct pxa_gpio_platform_data));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) platform_device_register(&mmp2_device_gpio);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) /* off-chip devices */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) platform_device_register(&smc91x_device);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) MACHINE_START(FLINT, "Flint Development Platform")
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) .map_io = mmp_map_io,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) .nr_irqs = FLINT_NR_IRQS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) .init_irq = mmp2_init_irq,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) .init_time = mmp2_timer_init,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) .init_machine = flint_init,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) .restart = mmp_restart,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) MACHINE_END