162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * arch/arm/mach-ep93xx/ts72xx.c
462306a36Sopenharmony_ci * Technologic Systems TS72xx SBC support.
562306a36Sopenharmony_ci *
662306a36Sopenharmony_ci * Copyright (C) 2006 Lennert Buytenhek <buytenh@wantstofly.org>
762306a36Sopenharmony_ci */
862306a36Sopenharmony_ci
962306a36Sopenharmony_ci#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_ci#include <linux/kernel.h>
1262306a36Sopenharmony_ci#include <linux/init.h>
1362306a36Sopenharmony_ci#include <linux/platform_device.h>
1462306a36Sopenharmony_ci#include <linux/io.h>
1562306a36Sopenharmony_ci#include <linux/mtd/platnand.h>
1662306a36Sopenharmony_ci#include <linux/spi/spi.h>
1762306a36Sopenharmony_ci#include <linux/spi/flash.h>
1862306a36Sopenharmony_ci#include <linux/spi/mmc_spi.h>
1962306a36Sopenharmony_ci#include <linux/mmc/host.h>
2062306a36Sopenharmony_ci#include <linux/platform_data/spi-ep93xx.h>
2162306a36Sopenharmony_ci#include <linux/gpio/machine.h>
2262306a36Sopenharmony_ci
2362306a36Sopenharmony_ci#include "gpio-ep93xx.h"
2462306a36Sopenharmony_ci#include "hardware.h"
2562306a36Sopenharmony_ci
2662306a36Sopenharmony_ci#include <asm/mach-types.h>
2762306a36Sopenharmony_ci#include <asm/mach/map.h>
2862306a36Sopenharmony_ci#include <asm/mach/arch.h>
2962306a36Sopenharmony_ci
3062306a36Sopenharmony_ci#include "soc.h"
3162306a36Sopenharmony_ci#include "ts72xx.h"
3262306a36Sopenharmony_ci
3362306a36Sopenharmony_ci/*************************************************************************
3462306a36Sopenharmony_ci * IO map
3562306a36Sopenharmony_ci *************************************************************************/
3662306a36Sopenharmony_cistatic struct map_desc ts72xx_io_desc[] __initdata = {
3762306a36Sopenharmony_ci	{
3862306a36Sopenharmony_ci		.virtual	= (unsigned long)TS72XX_MODEL_VIRT_BASE,
3962306a36Sopenharmony_ci		.pfn		= __phys_to_pfn(TS72XX_MODEL_PHYS_BASE),
4062306a36Sopenharmony_ci		.length		= TS72XX_MODEL_SIZE,
4162306a36Sopenharmony_ci		.type		= MT_DEVICE,
4262306a36Sopenharmony_ci	}, {
4362306a36Sopenharmony_ci		.virtual	= (unsigned long)TS72XX_OPTIONS_VIRT_BASE,
4462306a36Sopenharmony_ci		.pfn		= __phys_to_pfn(TS72XX_OPTIONS_PHYS_BASE),
4562306a36Sopenharmony_ci		.length		= TS72XX_OPTIONS_SIZE,
4662306a36Sopenharmony_ci		.type		= MT_DEVICE,
4762306a36Sopenharmony_ci	}, {
4862306a36Sopenharmony_ci		.virtual	= (unsigned long)TS72XX_OPTIONS2_VIRT_BASE,
4962306a36Sopenharmony_ci		.pfn		= __phys_to_pfn(TS72XX_OPTIONS2_PHYS_BASE),
5062306a36Sopenharmony_ci		.length		= TS72XX_OPTIONS2_SIZE,
5162306a36Sopenharmony_ci		.type		= MT_DEVICE,
5262306a36Sopenharmony_ci	}, {
5362306a36Sopenharmony_ci		.virtual	= (unsigned long)TS72XX_CPLDVER_VIRT_BASE,
5462306a36Sopenharmony_ci		.pfn		= __phys_to_pfn(TS72XX_CPLDVER_PHYS_BASE),
5562306a36Sopenharmony_ci		.length		= TS72XX_CPLDVER_SIZE,
5662306a36Sopenharmony_ci		.type		= MT_DEVICE,
5762306a36Sopenharmony_ci	}
5862306a36Sopenharmony_ci};
5962306a36Sopenharmony_ci
6062306a36Sopenharmony_cistatic void __init ts72xx_map_io(void)
6162306a36Sopenharmony_ci{
6262306a36Sopenharmony_ci	ep93xx_map_io();
6362306a36Sopenharmony_ci	iotable_init(ts72xx_io_desc, ARRAY_SIZE(ts72xx_io_desc));
6462306a36Sopenharmony_ci}
6562306a36Sopenharmony_ci
6662306a36Sopenharmony_ci
6762306a36Sopenharmony_ci/*************************************************************************
6862306a36Sopenharmony_ci * NAND flash
6962306a36Sopenharmony_ci *************************************************************************/
7062306a36Sopenharmony_ci#define TS72XX_NAND_CONTROL_ADDR_LINE	22	/* 0xN0400000 */
7162306a36Sopenharmony_ci#define TS72XX_NAND_BUSY_ADDR_LINE	23	/* 0xN0800000 */
7262306a36Sopenharmony_ci
7362306a36Sopenharmony_cistatic void ts72xx_nand_hwcontrol(struct nand_chip *chip,
7462306a36Sopenharmony_ci				  int cmd, unsigned int ctrl)
7562306a36Sopenharmony_ci{
7662306a36Sopenharmony_ci	if (ctrl & NAND_CTRL_CHANGE) {
7762306a36Sopenharmony_ci		void __iomem *addr = chip->legacy.IO_ADDR_R;
7862306a36Sopenharmony_ci		unsigned char bits;
7962306a36Sopenharmony_ci
8062306a36Sopenharmony_ci		addr += (1 << TS72XX_NAND_CONTROL_ADDR_LINE);
8162306a36Sopenharmony_ci
8262306a36Sopenharmony_ci		bits = __raw_readb(addr) & ~0x07;
8362306a36Sopenharmony_ci		bits |= (ctrl & NAND_NCE) << 2;	/* bit 0 -> bit 2 */
8462306a36Sopenharmony_ci		bits |= (ctrl & NAND_CLE);	/* bit 1 -> bit 1 */
8562306a36Sopenharmony_ci		bits |= (ctrl & NAND_ALE) >> 2;	/* bit 2 -> bit 0 */
8662306a36Sopenharmony_ci
8762306a36Sopenharmony_ci		__raw_writeb(bits, addr);
8862306a36Sopenharmony_ci	}
8962306a36Sopenharmony_ci
9062306a36Sopenharmony_ci	if (cmd != NAND_CMD_NONE)
9162306a36Sopenharmony_ci		__raw_writeb(cmd, chip->legacy.IO_ADDR_W);
9262306a36Sopenharmony_ci}
9362306a36Sopenharmony_ci
9462306a36Sopenharmony_cistatic int ts72xx_nand_device_ready(struct nand_chip *chip)
9562306a36Sopenharmony_ci{
9662306a36Sopenharmony_ci	void __iomem *addr = chip->legacy.IO_ADDR_R;
9762306a36Sopenharmony_ci
9862306a36Sopenharmony_ci	addr += (1 << TS72XX_NAND_BUSY_ADDR_LINE);
9962306a36Sopenharmony_ci
10062306a36Sopenharmony_ci	return !!(__raw_readb(addr) & 0x20);
10162306a36Sopenharmony_ci}
10262306a36Sopenharmony_ci
10362306a36Sopenharmony_ci#define TS72XX_BOOTROM_PART_SIZE	(SZ_16K)
10462306a36Sopenharmony_ci#define TS72XX_REDBOOT_PART_SIZE	(SZ_2M + SZ_1M)
10562306a36Sopenharmony_ci
10662306a36Sopenharmony_cistatic struct mtd_partition ts72xx_nand_parts[] = {
10762306a36Sopenharmony_ci	{
10862306a36Sopenharmony_ci		.name		= "TS-BOOTROM",
10962306a36Sopenharmony_ci		.offset		= 0,
11062306a36Sopenharmony_ci		.size		= TS72XX_BOOTROM_PART_SIZE,
11162306a36Sopenharmony_ci		.mask_flags	= MTD_WRITEABLE,	/* force read-only */
11262306a36Sopenharmony_ci	}, {
11362306a36Sopenharmony_ci		.name		= "Linux",
11462306a36Sopenharmony_ci		.offset		= MTDPART_OFS_RETAIN,
11562306a36Sopenharmony_ci		.size		= TS72XX_REDBOOT_PART_SIZE,
11662306a36Sopenharmony_ci				/* leave so much for last partition */
11762306a36Sopenharmony_ci	}, {
11862306a36Sopenharmony_ci		.name		= "RedBoot",
11962306a36Sopenharmony_ci		.offset		= MTDPART_OFS_APPEND,
12062306a36Sopenharmony_ci		.size		= MTDPART_SIZ_FULL,
12162306a36Sopenharmony_ci		.mask_flags	= MTD_WRITEABLE,	/* force read-only */
12262306a36Sopenharmony_ci	},
12362306a36Sopenharmony_ci};
12462306a36Sopenharmony_ci
12562306a36Sopenharmony_cistatic struct platform_nand_data ts72xx_nand_data = {
12662306a36Sopenharmony_ci	.chip = {
12762306a36Sopenharmony_ci		.nr_chips	= 1,
12862306a36Sopenharmony_ci		.chip_offset	= 0,
12962306a36Sopenharmony_ci		.chip_delay	= 15,
13062306a36Sopenharmony_ci	},
13162306a36Sopenharmony_ci	.ctrl = {
13262306a36Sopenharmony_ci		.cmd_ctrl	= ts72xx_nand_hwcontrol,
13362306a36Sopenharmony_ci		.dev_ready	= ts72xx_nand_device_ready,
13462306a36Sopenharmony_ci	},
13562306a36Sopenharmony_ci};
13662306a36Sopenharmony_ci
13762306a36Sopenharmony_cistatic struct resource ts72xx_nand_resource[] = {
13862306a36Sopenharmony_ci	{
13962306a36Sopenharmony_ci		.start		= 0,			/* filled in later */
14062306a36Sopenharmony_ci		.end		= 0,			/* filled in later */
14162306a36Sopenharmony_ci		.flags		= IORESOURCE_MEM,
14262306a36Sopenharmony_ci	},
14362306a36Sopenharmony_ci};
14462306a36Sopenharmony_ci
14562306a36Sopenharmony_cistatic struct platform_device ts72xx_nand_flash = {
14662306a36Sopenharmony_ci	.name			= "gen_nand",
14762306a36Sopenharmony_ci	.id			= -1,
14862306a36Sopenharmony_ci	.dev.platform_data	= &ts72xx_nand_data,
14962306a36Sopenharmony_ci	.resource		= ts72xx_nand_resource,
15062306a36Sopenharmony_ci	.num_resources		= ARRAY_SIZE(ts72xx_nand_resource),
15162306a36Sopenharmony_ci};
15262306a36Sopenharmony_ci
15362306a36Sopenharmony_cistatic void __init ts72xx_register_flash(struct mtd_partition *parts, int n,
15462306a36Sopenharmony_ci				  resource_size_t start)
15562306a36Sopenharmony_ci{
15662306a36Sopenharmony_ci	/*
15762306a36Sopenharmony_ci	 * TS7200 has NOR flash all other TS72xx board have NAND flash.
15862306a36Sopenharmony_ci	 */
15962306a36Sopenharmony_ci	if (board_is_ts7200()) {
16062306a36Sopenharmony_ci		ep93xx_register_flash(2, EP93XX_CS6_PHYS_BASE, SZ_16M);
16162306a36Sopenharmony_ci	} else {
16262306a36Sopenharmony_ci		ts72xx_nand_resource[0].start = start;
16362306a36Sopenharmony_ci		ts72xx_nand_resource[0].end = start + SZ_16M - 1;
16462306a36Sopenharmony_ci
16562306a36Sopenharmony_ci		ts72xx_nand_data.chip.partitions = parts;
16662306a36Sopenharmony_ci		ts72xx_nand_data.chip.nr_partitions = n;
16762306a36Sopenharmony_ci
16862306a36Sopenharmony_ci		platform_device_register(&ts72xx_nand_flash);
16962306a36Sopenharmony_ci	}
17062306a36Sopenharmony_ci}
17162306a36Sopenharmony_ci
17262306a36Sopenharmony_ci/*************************************************************************
17362306a36Sopenharmony_ci * RTC M48T86
17462306a36Sopenharmony_ci *************************************************************************/
17562306a36Sopenharmony_ci#define TS72XX_RTC_INDEX_PHYS_BASE	(EP93XX_CS1_PHYS_BASE + 0x00800000)
17662306a36Sopenharmony_ci#define TS72XX_RTC_DATA_PHYS_BASE	(EP93XX_CS1_PHYS_BASE + 0x01700000)
17762306a36Sopenharmony_ci
17862306a36Sopenharmony_cistatic struct resource ts72xx_rtc_resources[] = {
17962306a36Sopenharmony_ci	DEFINE_RES_MEM(TS72XX_RTC_INDEX_PHYS_BASE, 0x01),
18062306a36Sopenharmony_ci	DEFINE_RES_MEM(TS72XX_RTC_DATA_PHYS_BASE, 0x01),
18162306a36Sopenharmony_ci};
18262306a36Sopenharmony_ci
18362306a36Sopenharmony_cistatic struct platform_device ts72xx_rtc_device = {
18462306a36Sopenharmony_ci	.name		= "rtc-m48t86",
18562306a36Sopenharmony_ci	.id		= -1,
18662306a36Sopenharmony_ci	.resource	= ts72xx_rtc_resources,
18762306a36Sopenharmony_ci	.num_resources 	= ARRAY_SIZE(ts72xx_rtc_resources),
18862306a36Sopenharmony_ci};
18962306a36Sopenharmony_ci
19062306a36Sopenharmony_ci/*************************************************************************
19162306a36Sopenharmony_ci * Watchdog (in CPLD)
19262306a36Sopenharmony_ci *************************************************************************/
19362306a36Sopenharmony_ci#define TS72XX_WDT_CONTROL_PHYS_BASE	(EP93XX_CS2_PHYS_BASE + 0x03800000)
19462306a36Sopenharmony_ci#define TS72XX_WDT_FEED_PHYS_BASE	(EP93XX_CS2_PHYS_BASE + 0x03c00000)
19562306a36Sopenharmony_ci
19662306a36Sopenharmony_cistatic struct resource ts72xx_wdt_resources[] = {
19762306a36Sopenharmony_ci	DEFINE_RES_MEM(TS72XX_WDT_CONTROL_PHYS_BASE, 0x01),
19862306a36Sopenharmony_ci	DEFINE_RES_MEM(TS72XX_WDT_FEED_PHYS_BASE, 0x01),
19962306a36Sopenharmony_ci};
20062306a36Sopenharmony_ci
20162306a36Sopenharmony_cistatic struct platform_device ts72xx_wdt_device = {
20262306a36Sopenharmony_ci	.name		= "ts72xx-wdt",
20362306a36Sopenharmony_ci	.id		= -1,
20462306a36Sopenharmony_ci	.resource	= ts72xx_wdt_resources,
20562306a36Sopenharmony_ci	.num_resources	= ARRAY_SIZE(ts72xx_wdt_resources),
20662306a36Sopenharmony_ci};
20762306a36Sopenharmony_ci
20862306a36Sopenharmony_ci/*************************************************************************
20962306a36Sopenharmony_ci * ETH
21062306a36Sopenharmony_ci *************************************************************************/
21162306a36Sopenharmony_cistatic struct ep93xx_eth_data __initdata ts72xx_eth_data = {
21262306a36Sopenharmony_ci	.phy_id		= 1,
21362306a36Sopenharmony_ci};
21462306a36Sopenharmony_ci
21562306a36Sopenharmony_ci/*************************************************************************
21662306a36Sopenharmony_ci * SPI SD/MMC host
21762306a36Sopenharmony_ci *************************************************************************/
21862306a36Sopenharmony_ci#define BK3_EN_SDCARD_PHYS_BASE         0x12400000
21962306a36Sopenharmony_ci#define BK3_EN_SDCARD_PWR 0x0
22062306a36Sopenharmony_ci#define BK3_DIS_SDCARD_PWR 0x0C
22162306a36Sopenharmony_cistatic void bk3_mmc_spi_setpower(struct device *dev, unsigned int vdd)
22262306a36Sopenharmony_ci{
22362306a36Sopenharmony_ci	void __iomem *pwr_sd = ioremap(BK3_EN_SDCARD_PHYS_BASE, SZ_4K);
22462306a36Sopenharmony_ci
22562306a36Sopenharmony_ci	if (!pwr_sd) {
22662306a36Sopenharmony_ci		pr_err("Failed to enable SD card power!");
22762306a36Sopenharmony_ci		return;
22862306a36Sopenharmony_ci	}
22962306a36Sopenharmony_ci
23062306a36Sopenharmony_ci	pr_debug("%s: SD card pwr %s VDD:0x%x\n", __func__,
23162306a36Sopenharmony_ci		 !!vdd ? "ON" : "OFF", vdd);
23262306a36Sopenharmony_ci
23362306a36Sopenharmony_ci	if (!!vdd)
23462306a36Sopenharmony_ci		__raw_writeb(BK3_EN_SDCARD_PWR, pwr_sd);
23562306a36Sopenharmony_ci	else
23662306a36Sopenharmony_ci		__raw_writeb(BK3_DIS_SDCARD_PWR, pwr_sd);
23762306a36Sopenharmony_ci
23862306a36Sopenharmony_ci	iounmap(pwr_sd);
23962306a36Sopenharmony_ci}
24062306a36Sopenharmony_ci
24162306a36Sopenharmony_cistatic struct mmc_spi_platform_data bk3_spi_mmc_data = {
24262306a36Sopenharmony_ci	.detect_delay	= 500,
24362306a36Sopenharmony_ci	.powerup_msecs	= 100,
24462306a36Sopenharmony_ci	.ocr_mask	= MMC_VDD_32_33 | MMC_VDD_33_34,
24562306a36Sopenharmony_ci	.caps		= MMC_CAP_NONREMOVABLE,
24662306a36Sopenharmony_ci	.setpower       = bk3_mmc_spi_setpower,
24762306a36Sopenharmony_ci};
24862306a36Sopenharmony_ci
24962306a36Sopenharmony_ci/*************************************************************************
25062306a36Sopenharmony_ci * SPI Bus - SD card access
25162306a36Sopenharmony_ci *************************************************************************/
25262306a36Sopenharmony_cistatic struct spi_board_info bk3_spi_board_info[] __initdata = {
25362306a36Sopenharmony_ci	{
25462306a36Sopenharmony_ci		.modalias		= "mmc_spi",
25562306a36Sopenharmony_ci		.platform_data		= &bk3_spi_mmc_data,
25662306a36Sopenharmony_ci		.max_speed_hz		= 7.4E6,
25762306a36Sopenharmony_ci		.bus_num		= 0,
25862306a36Sopenharmony_ci		.chip_select		= 0,
25962306a36Sopenharmony_ci		.mode			= SPI_MODE_0,
26062306a36Sopenharmony_ci	},
26162306a36Sopenharmony_ci};
26262306a36Sopenharmony_ci
26362306a36Sopenharmony_ci/*
26462306a36Sopenharmony_ci * This is a stub -> the FGPIO[3] pin is not connected on the schematic
26562306a36Sopenharmony_ci * The all work is performed automatically by !SPI_FRAME (SFRM1) and
26662306a36Sopenharmony_ci * goes through CPLD
26762306a36Sopenharmony_ci */
26862306a36Sopenharmony_cistatic struct gpiod_lookup_table bk3_spi_cs_gpio_table = {
26962306a36Sopenharmony_ci	.dev_id = "spi0",
27062306a36Sopenharmony_ci	.table = {
27162306a36Sopenharmony_ci		GPIO_LOOKUP("F", 3, "cs", GPIO_ACTIVE_LOW),
27262306a36Sopenharmony_ci		{ },
27362306a36Sopenharmony_ci	},
27462306a36Sopenharmony_ci};
27562306a36Sopenharmony_ci
27662306a36Sopenharmony_cistatic struct ep93xx_spi_info bk3_spi_master __initdata = {
27762306a36Sopenharmony_ci	.use_dma	= 1,
27862306a36Sopenharmony_ci};
27962306a36Sopenharmony_ci
28062306a36Sopenharmony_ci/*************************************************************************
28162306a36Sopenharmony_ci * TS72XX support code
28262306a36Sopenharmony_ci *************************************************************************/
28362306a36Sopenharmony_ci#if IS_ENABLED(CONFIG_FPGA_MGR_TS73XX)
28462306a36Sopenharmony_ci
28562306a36Sopenharmony_ci/* Relative to EP93XX_CS1_PHYS_BASE */
28662306a36Sopenharmony_ci#define TS73XX_FPGA_LOADER_BASE		0x03c00000
28762306a36Sopenharmony_ci
28862306a36Sopenharmony_cistatic struct resource ts73xx_fpga_resources[] = {
28962306a36Sopenharmony_ci	{
29062306a36Sopenharmony_ci		.start	= EP93XX_CS1_PHYS_BASE + TS73XX_FPGA_LOADER_BASE,
29162306a36Sopenharmony_ci		.end	= EP93XX_CS1_PHYS_BASE + TS73XX_FPGA_LOADER_BASE + 1,
29262306a36Sopenharmony_ci		.flags	= IORESOURCE_MEM,
29362306a36Sopenharmony_ci	},
29462306a36Sopenharmony_ci};
29562306a36Sopenharmony_ci
29662306a36Sopenharmony_cistatic struct platform_device ts73xx_fpga_device = {
29762306a36Sopenharmony_ci	.name	= "ts73xx-fpga-mgr",
29862306a36Sopenharmony_ci	.id	= -1,
29962306a36Sopenharmony_ci	.resource = ts73xx_fpga_resources,
30062306a36Sopenharmony_ci	.num_resources = ARRAY_SIZE(ts73xx_fpga_resources),
30162306a36Sopenharmony_ci};
30262306a36Sopenharmony_ci
30362306a36Sopenharmony_ci#endif
30462306a36Sopenharmony_ci
30562306a36Sopenharmony_ci/*************************************************************************
30662306a36Sopenharmony_ci * SPI Bus
30762306a36Sopenharmony_ci *************************************************************************/
30862306a36Sopenharmony_cistatic struct spi_board_info ts72xx_spi_devices[] __initdata = {
30962306a36Sopenharmony_ci	{
31062306a36Sopenharmony_ci		.modalias		= "tmp122",
31162306a36Sopenharmony_ci		.max_speed_hz		= 2 * 1000 * 1000,
31262306a36Sopenharmony_ci		.bus_num		= 0,
31362306a36Sopenharmony_ci		.chip_select		= 0,
31462306a36Sopenharmony_ci	},
31562306a36Sopenharmony_ci};
31662306a36Sopenharmony_ci
31762306a36Sopenharmony_cistatic struct gpiod_lookup_table ts72xx_spi_cs_gpio_table = {
31862306a36Sopenharmony_ci	.dev_id = "spi0",
31962306a36Sopenharmony_ci	.table = {
32062306a36Sopenharmony_ci		/* DIO_17 */
32162306a36Sopenharmony_ci		GPIO_LOOKUP("F", 2, "cs", GPIO_ACTIVE_LOW),
32262306a36Sopenharmony_ci		{ },
32362306a36Sopenharmony_ci	},
32462306a36Sopenharmony_ci};
32562306a36Sopenharmony_ci
32662306a36Sopenharmony_cistatic struct ep93xx_spi_info ts72xx_spi_info __initdata = {
32762306a36Sopenharmony_ci	/* Intentionally left blank */
32862306a36Sopenharmony_ci};
32962306a36Sopenharmony_ci
33062306a36Sopenharmony_cistatic void __init ts72xx_init_machine(void)
33162306a36Sopenharmony_ci{
33262306a36Sopenharmony_ci	ep93xx_init_devices();
33362306a36Sopenharmony_ci	ts72xx_register_flash(ts72xx_nand_parts, ARRAY_SIZE(ts72xx_nand_parts),
33462306a36Sopenharmony_ci			      is_ts9420_installed() ?
33562306a36Sopenharmony_ci			      EP93XX_CS7_PHYS_BASE : EP93XX_CS6_PHYS_BASE);
33662306a36Sopenharmony_ci	platform_device_register(&ts72xx_rtc_device);
33762306a36Sopenharmony_ci	platform_device_register(&ts72xx_wdt_device);
33862306a36Sopenharmony_ci
33962306a36Sopenharmony_ci	ep93xx_register_eth(&ts72xx_eth_data, 1);
34062306a36Sopenharmony_ci#if IS_ENABLED(CONFIG_FPGA_MGR_TS73XX)
34162306a36Sopenharmony_ci	if (board_is_ts7300())
34262306a36Sopenharmony_ci		platform_device_register(&ts73xx_fpga_device);
34362306a36Sopenharmony_ci#endif
34462306a36Sopenharmony_ci	gpiod_add_lookup_table(&ts72xx_spi_cs_gpio_table);
34562306a36Sopenharmony_ci	ep93xx_register_spi(&ts72xx_spi_info, ts72xx_spi_devices,
34662306a36Sopenharmony_ci			    ARRAY_SIZE(ts72xx_spi_devices));
34762306a36Sopenharmony_ci}
34862306a36Sopenharmony_ci
34962306a36Sopenharmony_ciMACHINE_START(TS72XX, "Technologic Systems TS-72xx SBC")
35062306a36Sopenharmony_ci	/* Maintainer: Lennert Buytenhek <buytenh@wantstofly.org> */
35162306a36Sopenharmony_ci	.atag_offset	= 0x100,
35262306a36Sopenharmony_ci	.nr_irqs	= NR_EP93XX_IRQS,
35362306a36Sopenharmony_ci	.map_io		= ts72xx_map_io,
35462306a36Sopenharmony_ci	.init_irq	= ep93xx_init_irq,
35562306a36Sopenharmony_ci	.init_time	= ep93xx_timer_init,
35662306a36Sopenharmony_ci	.init_machine	= ts72xx_init_machine,
35762306a36Sopenharmony_ci	.restart	= ep93xx_restart,
35862306a36Sopenharmony_ciMACHINE_END
35962306a36Sopenharmony_ci
36062306a36Sopenharmony_ci/*************************************************************************
36162306a36Sopenharmony_ci * EP93xx I2S audio peripheral handling
36262306a36Sopenharmony_ci *************************************************************************/
36362306a36Sopenharmony_cistatic struct resource ep93xx_i2s_resource[] = {
36462306a36Sopenharmony_ci	DEFINE_RES_MEM(EP93XX_I2S_PHYS_BASE, 0x100),
36562306a36Sopenharmony_ci	DEFINE_RES_IRQ_NAMED(IRQ_EP93XX_SAI, "spilink i2s slave"),
36662306a36Sopenharmony_ci};
36762306a36Sopenharmony_ci
36862306a36Sopenharmony_cistatic struct platform_device ep93xx_i2s_device = {
36962306a36Sopenharmony_ci	.name		= "ep93xx-spilink-i2s",
37062306a36Sopenharmony_ci	.id		= -1,
37162306a36Sopenharmony_ci	.num_resources	= ARRAY_SIZE(ep93xx_i2s_resource),
37262306a36Sopenharmony_ci	.resource	= ep93xx_i2s_resource,
37362306a36Sopenharmony_ci};
37462306a36Sopenharmony_ci
37562306a36Sopenharmony_ci/*************************************************************************
37662306a36Sopenharmony_ci * BK3 support code
37762306a36Sopenharmony_ci *************************************************************************/
37862306a36Sopenharmony_cistatic struct mtd_partition bk3_nand_parts[] = {
37962306a36Sopenharmony_ci	{
38062306a36Sopenharmony_ci		.name		= "System",
38162306a36Sopenharmony_ci		.offset	= 0x00000000,
38262306a36Sopenharmony_ci		.size		= 0x01e00000,
38362306a36Sopenharmony_ci	}, {
38462306a36Sopenharmony_ci		.name		= "Data",
38562306a36Sopenharmony_ci		.offset	= 0x01e00000,
38662306a36Sopenharmony_ci		.size		= 0x05f20000
38762306a36Sopenharmony_ci	}, {
38862306a36Sopenharmony_ci		.name		= "RedBoot",
38962306a36Sopenharmony_ci		.offset	= 0x07d20000,
39062306a36Sopenharmony_ci		.size		= 0x002e0000,
39162306a36Sopenharmony_ci		.mask_flags	= MTD_WRITEABLE,	/* force RO */
39262306a36Sopenharmony_ci	},
39362306a36Sopenharmony_ci};
39462306a36Sopenharmony_ci
39562306a36Sopenharmony_cistatic void __init bk3_init_machine(void)
39662306a36Sopenharmony_ci{
39762306a36Sopenharmony_ci	ep93xx_init_devices();
39862306a36Sopenharmony_ci
39962306a36Sopenharmony_ci	ts72xx_register_flash(bk3_nand_parts, ARRAY_SIZE(bk3_nand_parts),
40062306a36Sopenharmony_ci			      EP93XX_CS6_PHYS_BASE);
40162306a36Sopenharmony_ci
40262306a36Sopenharmony_ci	ep93xx_register_eth(&ts72xx_eth_data, 1);
40362306a36Sopenharmony_ci
40462306a36Sopenharmony_ci	gpiod_add_lookup_table(&bk3_spi_cs_gpio_table);
40562306a36Sopenharmony_ci	ep93xx_register_spi(&bk3_spi_master, bk3_spi_board_info,
40662306a36Sopenharmony_ci			    ARRAY_SIZE(bk3_spi_board_info));
40762306a36Sopenharmony_ci
40862306a36Sopenharmony_ci	/* Configure ep93xx's I2S to use AC97 pins */
40962306a36Sopenharmony_ci	ep93xx_devcfg_set_bits(EP93XX_SYSCON_DEVCFG_I2SONAC97);
41062306a36Sopenharmony_ci	platform_device_register(&ep93xx_i2s_device);
41162306a36Sopenharmony_ci}
41262306a36Sopenharmony_ci
41362306a36Sopenharmony_ciMACHINE_START(BK3, "Liebherr controller BK3.1")
41462306a36Sopenharmony_ci	/* Maintainer: Lukasz Majewski <lukma@denx.de> */
41562306a36Sopenharmony_ci	.atag_offset	= 0x100,
41662306a36Sopenharmony_ci	.nr_irqs	= NR_EP93XX_IRQS,
41762306a36Sopenharmony_ci	.map_io		= ts72xx_map_io,
41862306a36Sopenharmony_ci	.init_irq	= ep93xx_init_irq,
41962306a36Sopenharmony_ci	.init_time	= ep93xx_timer_init,
42062306a36Sopenharmony_ci	.init_machine	= bk3_init_machine,
42162306a36Sopenharmony_ci	.restart	= ep93xx_restart,
42262306a36Sopenharmony_ciMACHINE_END
423