// SPDX-License-Identifier: GPL-2.0+
/*
 * Renesas Europe EDOSK7760 Board Support
 *
 * Copyright (C) 2008 SPES Societa' Progettazione Elettronica e Software Ltd.
 * Author: Luca Santini <luca.santini@spesonline.com>
 */
#include <linux/init.h>
#include <linux/types.h>
#include <linux/platform_device.h>
#include <linux/smc91x.h>
#include <linux/interrupt.h>
#include <linux/sh_intc.h>
#include <linux/i2c.h>
#include <linux/mtd/physmap.h>
#include <asm/machvec.h>
#include <asm/io.h>
#include <asm/addrspace.h>
#include <asm/delay.h>
#include <asm/i2c-sh7760.h>
#include <linux/sizes.h>

/* Bus state controller registers for CS4 area */
#define BSC_CS4BCR	0xA4FD0010
#define BSC_CS4WCR	0xA4FD0030

#define SMC_IOBASE	0xA2000000
#define SMC_IO_OFFSET	0x300
#define SMC_IOADDR	(SMC_IOBASE + SMC_IO_OFFSET)

/* NOR flash */
static struct mtd_partition edosk7760_nor_flash_partitions[] = {
	{
		.name = "bootloader",
		.offset = 0,
		.size = SZ_256K,
		.mask_flags = MTD_WRITEABLE,	/* Read-only */
	}, {
		.name = "kernel",
		.offset = MTDPART_OFS_APPEND,
		.size = SZ_2M,
	}, {
		.name = "fs",
		.offset = MTDPART_OFS_APPEND,
		.size = (26 << 20),
	}, {
		.name = "other",
		.offset = MTDPART_OFS_APPEND,
		.size = MTDPART_SIZ_FULL,
	},
};

static struct physmap_flash_data edosk7760_nor_flash_data = {
	.width		= 4,
	.parts		= edosk7760_nor_flash_partitions,
	.nr_parts	= ARRAY_SIZE(edosk7760_nor_flash_partitions),
};

static struct resource edosk7760_nor_flash_resources[] = {
	[0] = {
		.name	= "NOR Flash",
		.start	= 0x00000000,
		.end	= 0x00000000 + SZ_32M - 1,
		.flags	= IORESOURCE_MEM,
	}
};

static struct platform_device edosk7760_nor_flash_device = {
	.name		= "physmap-flash",
	.resource	= edosk7760_nor_flash_resources,
	.num_resources	= ARRAY_SIZE(edosk7760_nor_flash_resources),
	.dev		= {
		.platform_data = &edosk7760_nor_flash_data,
	},
};

/* i2c initialization functions */
static struct sh7760_i2c_platdata i2c_pd = {
	.speed_khz	= 400,
};

static struct resource sh7760_i2c1_res[] = {
	{
		.start	= SH7760_I2C1_MMIO,
		.end	= SH7760_I2C1_MMIOEND,
		.flags	= IORESOURCE_MEM,
	},{
		.start	= evt2irq(0x9e0),
		.end	= evt2irq(0x9e0),
		.flags	= IORESOURCE_IRQ,
	},
};

static struct platform_device sh7760_i2c1_dev = {
	.dev    = {
		.platform_data	= &i2c_pd,
	},

	.name		= SH7760_I2C_DEVNAME,
	.id		= 1,
	.resource	= sh7760_i2c1_res,
	.num_resources	= ARRAY_SIZE(sh7760_i2c1_res),
};

static struct resource sh7760_i2c0_res[] = {
	{
		.start	= SH7760_I2C0_MMIO,
		.end	= SH7760_I2C0_MMIOEND,
		.flags	= IORESOURCE_MEM,
	}, {
		.start	= evt2irq(0x9c0),
		.end	= evt2irq(0x9c0),
		.flags	= IORESOURCE_IRQ,
	},
};

static struct platform_device sh7760_i2c0_dev = {
	.dev    = {
		.platform_data	= &i2c_pd,
	},
	.name		= SH7760_I2C_DEVNAME,
	.id		= 0,
	.resource	= sh7760_i2c0_res,
	.num_resources	= ARRAY_SIZE(sh7760_i2c0_res),
};

/* eth initialization functions */
static struct smc91x_platdata smc91x_info = {
	.flags = SMC91X_USE_16BIT | SMC91X_IO_SHIFT_1 | IORESOURCE_IRQ_LOWLEVEL,
};

static struct resource smc91x_res[] = {
	[0] = {
		.start	= SMC_IOADDR,
		.end	= SMC_IOADDR + SZ_32 - 1,
		.flags	= IORESOURCE_MEM,
	},
	[1] = {
		.start	= evt2irq(0x2a0),
		.end	= evt2irq(0x2a0),
		.flags	= IORESOURCE_IRQ ,
	}
};

static struct platform_device smc91x_dev = {
	.name		= "smc91x",
	.id		= -1,
	.num_resources	= ARRAY_SIZE(smc91x_res),
	.resource	= smc91x_res,

	.dev	= {
		.platform_data	= &smc91x_info,
	},
};

/* platform init code */
static struct platform_device *edosk7760_devices[] __initdata = {
	&smc91x_dev,
	&edosk7760_nor_flash_device,
	&sh7760_i2c0_dev,
	&sh7760_i2c1_dev,
};

static int __init init_edosk7760_devices(void)
{
	plat_irq_setup_pins(IRQ_MODE_IRQ);

	return platform_add_devices(edosk7760_devices,
				    ARRAY_SIZE(edosk7760_devices));
}
device_initcall(init_edosk7760_devices);

/*
 * The Machine Vector
 */
struct sh_machine_vector mv_edosk7760 __initmv = {
	.mv_name	= "EDOSK7760",
};
