// SPDX-License-Identifier: GPL-2.0-only
/*
 * linux/arch/arm/mach-pxa/mxm8x10.c
 *
 * Support for the Embedian MXM-8x10 Computer on Module
 *
 * Copyright (C) 2006 Marvell International Ltd.
 * Copyright (C) 2009 Embedian Inc.
 * Copyright (C) 2009 TMT Services & Supplies (Pty) Ltd.
 *
 * 2007-09-04: eric miao <eric.y.miao@gmail.com>
 *             rewrite to align with latest kernel
 *
 * 2010-01-09: Edwin Peer <epeer@tmtservices.co.za>
 * 	       Hennie van der Merwe <hvdmerwe@tmtservices.co.za>
 *             rework for upstream merge
 */

#include <linux/serial_8250.h>
#include <linux/dm9000.h>
#include <linux/gpio/machine.h>
#include <linux/platform_data/i2c-pxa.h>

#include <linux/platform_data/mtd-nand-pxa3xx.h>

#include <linux/platform_data/video-pxafb.h>
#include <linux/platform_data/mmc-pxamci.h>
#include <linux/platform_data/usb-ohci-pxa27x.h>
#include "pxa320.h"

#include "mxm8x10.h"

#include "devices.h"
#include "generic.h"

/* GPIO pin definition

External device stuff   - Leave unconfigured for now...
---------------------
GPIO0   -   DREQ    (External DMA Request)
GPIO3   -   nGCS2   (External Chip Select) Where is nGCS0; nGCS1; nGCS4; nGCS5 ?
GPIO4   -   nGCS3
GPIO15  -   EXT_GPIO1
GPIO16  -   EXT_GPIO2
GPIO17  -   EXT_GPIO3
GPIO24  -   EXT_GPIO4
GPIO25  -   EXT_GPIO5
GPIO26  -   EXT_GPIO6
GPIO27  -   EXT_GPIO7
GPIO28  -   EXT_GPIO8
GPIO29  -   EXT_GPIO9
GPIO30  -   EXT_GPIO10
GPIO31  -   EXT_GPIO11
GPIO57  -   EXT_GPIO12
GPIO74  -   EXT_IRQ1
GPIO75  -   EXT_IRQ2
GPIO76  -   EXT_IRQ3
GPIO77  -   EXT_IRQ4
GPIO78  -   EXT_IRQ5
GPIO79  -   EXT_IRQ6
GPIO80  -   EXT_IRQ7
GPIO81  -   EXT_IRQ8
GPIO87  -   VCCIO_PWREN (External Device PWREN)

Dallas 1-Wire   - Leave unconfigured for now...
-------------
GPIO0_2 -   DS - 1Wire

Ethernet
--------
GPIO1   -   DM9000 PWR
GPIO9   -   DM9K_nIRQ
GPIO36  -   DM9K_RESET

Keypad  - Leave unconfigured by for now...
------
GPIO1_2 -   KP_DKIN0
GPIO5_2 -   KP_MKOUT7
GPIO82  -   KP_DKIN1
GPIO85  -   KP_DKIN2
GPIO86  -   KP_DKIN3
GPIO113 -   KP_MKIN0
GPIO114 -   KP_MKIN1
GPIO115 -   KP_MKIN2
GPIO116 -   KP_MKIN3
GPIO117 -   KP_MKIN4
GPIO118 -   KP_MKIN5
GPIO119 -   KP_MKIN6
GPIO120 -   KP_MKIN7
GPIO121 -   KP_MKOUT0
GPIO122 -   KP_MKOUT1
GPIO122 -   KP_MKOUT2
GPIO123 -   KP_MKOUT3
GPIO124 -   KP_MKOUT4
GPIO125 -   KP_MKOUT5
GPIO127 -   KP_MKOUT6

Data Bus    - Leave unconfigured for now...
--------
GPIO2   -   nWait (Data Bus)

USB Device
----------
GPIO4_2 -   USBD_PULLUP
GPIO10  -   UTM_CLK (USB Device UTM Clk)
GPIO49  -   USB 2.0 Device UTM_DATA0
GPIO50  -   USB 2.0 Device UTM_DATA1
GPIO51  -   USB 2.0 Device UTM_DATA2
GPIO52  -   USB 2.0 Device UTM_DATA3
GPIO53  -   USB 2.0 Device UTM_DATA4
GPIO54  -   USB 2.0 Device UTM_DATA5
GPIO55  -   USB 2.0 Device UTM_DATA6
GPIO56  -   USB 2.0 Device UTM_DATA7
GPIO58  -   UTM_RXVALID (USB 2.0 Device)
GPIO59  -   UTM_RXACTIVE (USB 2.0 Device)
GPIO60  -   UTM_RXERROR
GPIO61  -   UTM_OPMODE0
GPIO62  -   UTM_OPMODE1
GPIO71  -   USBD_INT    (USB Device?)
GPIO73  -   UTM_TXREADY (USB 2.0 Device)
GPIO83  -   UTM_TXVALID (USB 2.0 Device)
GPIO98  -   UTM_RESET   (USB 2.0 device)
GPIO99  -   UTM_XCVR_SELECT
GPIO100 -   UTM_TERM_SELECT
GPIO101 -   UTM_SUSPENDM_X
GPIO102 -   UTM_LINESTATE0
GPIO103 -   UTM_LINESTATE1

Card-Bus Interface  - Leave unconfigured for now...
------------------
GPIO5   -   nPIOR (I/O space output enable)
GPIO6   -   nPIOW (I/O space write enable)
GPIO7   -   nIOS16 (Input from I/O space telling size of data bus)
GPIO8   -   nPWAIT (Input for inserting wait states)

LCD
---
GPIO6_2     -   LDD0
GPIO7_2     -   LDD1
GPIO8_2     -   LDD2
GPIO9_2     -   LDD3
GPIO11_2    -   LDD5
GPIO12_2    -   LDD6
GPIO13_2    -   LDD7
GPIO14_2    -   VSYNC
GPIO15_2    -   HSYNC
GPIO16_2    -   VCLK
GPIO17_2    -   HCLK
GPIO18_2    -   VDEN
GPIO63      -   LDD8    (CPU LCD)
GPIO64      -   LDD9    (CPU LCD)
GPIO65      -   LDD10   (CPU LCD)
GPIO66      -   LDD11   (CPU LCD)
GPIO67      -   LDD12   (CPU LCD)
GPIO68      -   LDD13   (CPU LCD)
GPIO69      -   LDD14   (CPU LCD)
GPIO70      -   LDD15   (CPU LCD)
GPIO88      -   VCCLCD_PWREN (LCD Panel PWREN)
GPIO97      -   BACKLIGHT_EN
GPIO104     -   LCD_PWREN

PWM   - Leave unconfigured for now...
---
GPIO11  -   PWM0
GPIO12  -   PWM1
GPIO13  -   PWM2
GPIO14  -   PWM3

SD-CARD
-------
GPIO18  -   SDDATA0
GPIO19  -   SDDATA1
GPIO20  -   SDDATA2
GPIO21  -   SDDATA3
GPIO22  -   SDCLK
GPIO23  -   SDCMD
GPIO72  -   SD_WP
GPIO84  -   SD_nIRQ_CD  (SD-Card)

I2C
---
GPIO32  -   I2CSCL
GPIO33  -   I2CSDA

AC97
----
GPIO35  -   AC97_SDATA_IN
GPIO37  -   AC97_SDATA_OUT
GPIO38  -   AC97_SYNC
GPIO39  -   AC97_BITCLK
GPIO40  -   AC97_nRESET

UART1
-----
GPIO41  -   UART_RXD1
GPIO42  -   UART_TXD1
GPIO43  -   UART_CTS1
GPIO44  -   UART_DCD1
GPIO45  -   UART_DSR1
GPIO46  -   UART_nRI1
GPIO47  -   UART_DTR1
GPIO48  -   UART_RTS1

UART2
-----
GPIO109 -   RTS2
GPIO110 -   RXD2
GPIO111 -   TXD2
GPIO112 -   nCTS2

UART3
-----
GPIO105 -   nCTS3
GPIO106 -   nRTS3
GPIO107 -   TXD3
GPIO108 -   RXD3

SSP3    - Leave unconfigured for now...
----
GPIO89  -   SSP3_CLK
GPIO90  -   SSP3_SFRM
GPIO91  -   SSP3_TXD
GPIO92  -   SSP3_RXD

SSP4
GPIO93  -   SSP4_CLK
GPIO94  -   SSP4_SFRM
GPIO95  -   SSP4_TXD
GPIO96  -   SSP4_RXD
*/

static mfp_cfg_t mfp_cfg[] __initdata = {
	/* USB */
	GPIO10_UTM_CLK,
	GPIO49_U2D_PHYDATA_0,
	GPIO50_U2D_PHYDATA_1,
	GPIO51_U2D_PHYDATA_2,
	GPIO52_U2D_PHYDATA_3,
	GPIO53_U2D_PHYDATA_4,
	GPIO54_U2D_PHYDATA_5,
	GPIO55_U2D_PHYDATA_6,
	GPIO56_U2D_PHYDATA_7,
	GPIO58_UTM_RXVALID,
	GPIO59_UTM_RXACTIVE,
	GPIO60_U2D_RXERROR,
	GPIO61_U2D_OPMODE0,
	GPIO62_U2D_OPMODE1,
	GPIO71_GPIO, /* USBD_INT */
	GPIO73_UTM_TXREADY,
	GPIO83_U2D_TXVALID,
	GPIO98_U2D_RESET,
	GPIO99_U2D_XCVR_SEL,
	GPIO100_U2D_TERM_SEL,
	GPIO101_U2D_SUSPEND,
	GPIO102_UTM_LINESTATE_0,
	GPIO103_UTM_LINESTATE_1,
	GPIO4_2_GPIO | MFP_PULL_HIGH, /* UTM_PULLUP */

	/* DM9000 */
	GPIO1_GPIO,
	GPIO9_GPIO,
	GPIO36_GPIO,

	/* AC97 */
	GPIO35_AC97_SDATA_IN_0,
	GPIO37_AC97_SDATA_OUT,
	GPIO38_AC97_SYNC,
	GPIO39_AC97_BITCLK,
	GPIO40_AC97_nACRESET,

	/* UARTS */
	GPIO41_UART1_RXD,
	GPIO42_UART1_TXD,
	GPIO43_UART1_CTS,
	GPIO44_UART1_DCD,
	GPIO45_UART1_DSR,
	GPIO46_UART1_RI,
	GPIO47_UART1_DTR,
	GPIO48_UART1_RTS,

	GPIO109_UART2_RTS,
	GPIO110_UART2_RXD,
	GPIO111_UART2_TXD,
	GPIO112_UART2_CTS,

	GPIO105_UART3_CTS,
	GPIO106_UART3_RTS,
	GPIO107_UART3_TXD,
	GPIO108_UART3_RXD,

	GPIO78_GPIO,
	GPIO79_GPIO,
	GPIO80_GPIO,
	GPIO81_GPIO,

	/* I2C */
	GPIO32_I2C_SCL,
	GPIO33_I2C_SDA,

	/* MMC */
	GPIO18_MMC1_DAT0,
	GPIO19_MMC1_DAT1,
	GPIO20_MMC1_DAT2,
	GPIO21_MMC1_DAT3,
	GPIO22_MMC1_CLK,
	GPIO23_MMC1_CMD,
	GPIO72_GPIO | MFP_PULL_HIGH, /* Card Detect */
	GPIO84_GPIO | MFP_PULL_LOW, /* Write Protect */

	/* IRQ */
	GPIO74_GPIO | MFP_LPM_EDGE_RISE, /* EXT_IRQ1 */
	GPIO75_GPIO | MFP_LPM_EDGE_RISE, /* EXT_IRQ2 */
	GPIO76_GPIO | MFP_LPM_EDGE_RISE, /* EXT_IRQ3 */
	GPIO77_GPIO | MFP_LPM_EDGE_RISE, /* EXT_IRQ4 */
	GPIO78_GPIO | MFP_LPM_EDGE_RISE, /* EXT_IRQ5 */
	GPIO79_GPIO | MFP_LPM_EDGE_RISE, /* EXT_IRQ6 */
	GPIO80_GPIO | MFP_LPM_EDGE_RISE, /* EXT_IRQ7 */
	GPIO81_GPIO | MFP_LPM_EDGE_RISE  /* EXT_IRQ8 */
};

/* MMC/MCI Support */
#if defined(CONFIG_MMC)
static struct pxamci_platform_data mxm_8x10_mci_platform_data = {
	.ocr_mask = MMC_VDD_32_33 | MMC_VDD_33_34,
	.detect_delay_ms = 10,
};

static struct gpiod_lookup_table mxm_8x10_mci_gpio_table = {
	.dev_id = "pxa2xx-mci.0",
	.table = {
		/* Card detect on GPIO 72 */
		GPIO_LOOKUP("gpio-pxa", MXM_8X10_SD_nCD,
			    "cd", GPIO_ACTIVE_LOW),
		/* Write protect on GPIO 84 */
		GPIO_LOOKUP("gpio-pxa", MXM_8X10_SD_WP,
			    "wp", GPIO_ACTIVE_LOW),
		{ },
	},
};

void __init mxm_8x10_mmc_init(void)
{
	gpiod_add_lookup_table(&mxm_8x10_mci_gpio_table);
	pxa_set_mci_info(&mxm_8x10_mci_platform_data);
}
#endif

/* USB Open Host Controller Interface */
static struct pxaohci_platform_data mxm_8x10_ohci_platform_data = {
	.port_mode = PMM_NPS_MODE,
	.flags = ENABLE_PORT_ALL
};

void __init mxm_8x10_usb_host_init(void)
{
	pxa_set_ohci_info(&mxm_8x10_ohci_platform_data);
}

/* AC97 Sound Support */
static struct platform_device mxm_8x10_ac97_device = {
	.name = "pxa2xx-ac97"
};

void __init mxm_8x10_ac97_init(void)
{
	platform_device_register(&mxm_8x10_ac97_device);
}

/* NAND flash Support */
#if IS_ENABLED(CONFIG_MTD_NAND_MARVELL)
#define NAND_BLOCK_SIZE SZ_128K
#define NB(x)           (NAND_BLOCK_SIZE * (x))
static struct mtd_partition mxm_8x10_nand_partitions[] = {
	[0] = {
	       .name = "boot",
	       .size = NB(0x002),
	       .offset = NB(0x000),
	       .mask_flags = MTD_WRITEABLE
	},
	[1] = {
	       .name = "kernel",
	       .size = NB(0x010),
	       .offset = NB(0x002),
	       .mask_flags = MTD_WRITEABLE
	},
	[2] = {
	       .name = "root",
	       .size = NB(0x36c),
	       .offset = NB(0x012)
	},
	[3] = {
	       .name = "bbt",
	       .size = NB(0x082),
	       .offset = NB(0x37e),
	       .mask_flags = MTD_WRITEABLE
	}
};

static struct pxa3xx_nand_platform_data mxm_8x10_nand_info = {
	.keep_config	= 1,
	.parts		= mxm_8x10_nand_partitions,
	.nr_parts	= ARRAY_SIZE(mxm_8x10_nand_partitions)
};

static void __init mxm_8x10_nand_init(void)
{
	pxa3xx_set_nand_info(&mxm_8x10_nand_info);
}
#else
static inline void mxm_8x10_nand_init(void) {}
#endif /* IS_ENABLED(CONFIG_MTD_NAND_MARVELL) */

/* Ethernet support: Davicom DM9000 */
static struct resource dm9k_resources[] = {
	[0] = {
	       .start = MXM_8X10_ETH_PHYS + 0x300,
	       .end = MXM_8X10_ETH_PHYS + 0x300,
	       .flags = IORESOURCE_MEM
	},
	[1] = {
	       .start = MXM_8X10_ETH_PHYS + 0x308,
	       .end = MXM_8X10_ETH_PHYS + 0x308,
	       .flags = IORESOURCE_MEM
	},
	[2] = {
	       .start = PXA_GPIO_TO_IRQ(mfp_to_gpio(MFP_PIN_GPIO9)),
	       .end = PXA_GPIO_TO_IRQ(mfp_to_gpio(MFP_PIN_GPIO9)),
	       .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHEDGE
	}
};

static struct dm9000_plat_data dm9k_plat_data = {
	.flags = DM9000_PLATF_16BITONLY
};

static struct platform_device dm9k_device = {
	.name = "dm9000",
	.id = 0,
	.num_resources = ARRAY_SIZE(dm9k_resources),
	.resource = dm9k_resources,
	.dev = {
		.platform_data = &dm9k_plat_data
	}
};

static void __init mxm_8x10_ethernet_init(void)
{
	platform_device_register(&dm9k_device);
}

/* PXA UARTs */
static void __init mxm_8x10_uarts_init(void)
{
	pxa_set_ffuart_info(NULL);
	pxa_set_btuart_info(NULL);
	pxa_set_stuart_info(NULL);
}

/* I2C and Real Time Clock */
static struct i2c_board_info __initdata mxm_8x10_i2c_devices[] = {
	{
		I2C_BOARD_INFO("ds1337", 0x68)
	}
};

static void __init mxm_8x10_i2c_init(void)
{
	i2c_register_board_info(0, mxm_8x10_i2c_devices,
				ARRAY_SIZE(mxm_8x10_i2c_devices));
	pxa_set_i2c_info(NULL);
}

void __init mxm_8x10_barebones_init(void)
{
	pxa3xx_mfp_config(ARRAY_AND_SIZE(mfp_cfg));

	mxm_8x10_uarts_init();
	mxm_8x10_nand_init();
	mxm_8x10_i2c_init();
	mxm_8x10_ethernet_init();
}
