xref: /openbmc/linux/arch/sh/boards/board-apsh4ad0a.c (revision c39f2d9db0fd81ea20bb5cce9b3f082ca63753e2)
1aaf9128aSKuninori Morimoto // SPDX-License-Identifier: GPL-2.0
28a453cacSPaul Mundt /*
38a453cacSPaul Mundt  * ALPHAPROJECT AP-SH4AD-0A Support.
48a453cacSPaul Mundt  *
58a453cacSPaul Mundt  * Copyright (C) 2010 ALPHAPROJECT Co.,Ltd.
68a453cacSPaul Mundt  * Copyright (C) 2010  Matt Fleming
78a453cacSPaul Mundt  * Copyright (C) 2010  Paul Mundt
88a453cacSPaul Mundt  */
98a453cacSPaul Mundt #include <linux/init.h>
108a453cacSPaul Mundt #include <linux/platform_device.h>
118a453cacSPaul Mundt #include <linux/io.h>
121f8eca12SGuennadi Liakhovetski #include <linux/regulator/fixed.h>
131f8eca12SGuennadi Liakhovetski #include <linux/regulator/machine.h>
148a453cacSPaul Mundt #include <linux/smsc911x.h>
158a453cacSPaul Mundt #include <linux/irq.h>
168a453cacSPaul Mundt #include <linux/clk.h>
178a453cacSPaul Mundt #include <asm/machvec.h>
18*87dfb311SMasahiro Yamada #include <linux/sizes.h>
198a453cacSPaul Mundt 
201f8eca12SGuennadi Liakhovetski /* Dummy supplies, where voltage doesn't matter */
211f8eca12SGuennadi Liakhovetski static struct regulator_consumer_supply dummy_supplies[] = {
221f8eca12SGuennadi Liakhovetski 	REGULATOR_SUPPLY("vddvario", "smsc911x"),
231f8eca12SGuennadi Liakhovetski 	REGULATOR_SUPPLY("vdd33a", "smsc911x"),
241f8eca12SGuennadi Liakhovetski };
251f8eca12SGuennadi Liakhovetski 
268a453cacSPaul Mundt static struct resource smsc911x_resources[] = {
278a453cacSPaul Mundt 	[0] = {
288a453cacSPaul Mundt 		.name		= "smsc911x-memory",
298a453cacSPaul Mundt 		.start		= 0xA4000000,
308a453cacSPaul Mundt 		.end		= 0xA4000000 + SZ_256 - 1,
318a453cacSPaul Mundt 		.flags		= IORESOURCE_MEM,
328a453cacSPaul Mundt 	},
338a453cacSPaul Mundt 	[1] = {
348a453cacSPaul Mundt 		.name		= "smsc911x-irq",
358a453cacSPaul Mundt 		.start		= evt2irq(0x200),
368a453cacSPaul Mundt 		.end		= evt2irq(0x200),
378a453cacSPaul Mundt 		.flags		= IORESOURCE_IRQ,
388a453cacSPaul Mundt 	},
398a453cacSPaul Mundt };
408a453cacSPaul Mundt 
418a453cacSPaul Mundt static struct smsc911x_platform_config smsc911x_config = {
428a453cacSPaul Mundt 	.irq_polarity	= SMSC911X_IRQ_POLARITY_ACTIVE_LOW,
438a453cacSPaul Mundt 	.irq_type	= SMSC911X_IRQ_TYPE_OPEN_DRAIN,
448a453cacSPaul Mundt 	.flags		= SMSC911X_USE_16BIT,
458a453cacSPaul Mundt 	.phy_interface	= PHY_INTERFACE_MODE_MII,
468a453cacSPaul Mundt };
478a453cacSPaul Mundt 
488a453cacSPaul Mundt static struct platform_device smsc911x_device = {
498a453cacSPaul Mundt 	.name		= "smsc911x",
508a453cacSPaul Mundt 	.id		= -1,
518a453cacSPaul Mundt 	.num_resources	= ARRAY_SIZE(smsc911x_resources),
528a453cacSPaul Mundt 	.resource	= smsc911x_resources,
538a453cacSPaul Mundt 	.dev = {
548a453cacSPaul Mundt 		.platform_data = &smsc911x_config,
558a453cacSPaul Mundt 	},
568a453cacSPaul Mundt };
578a453cacSPaul Mundt 
588a453cacSPaul Mundt static struct platform_device *apsh4ad0a_devices[] __initdata = {
598a453cacSPaul Mundt 	&smsc911x_device,
608a453cacSPaul Mundt };
618a453cacSPaul Mundt 
apsh4ad0a_devices_setup(void)628a453cacSPaul Mundt static int __init apsh4ad0a_devices_setup(void)
638a453cacSPaul Mundt {
641f8eca12SGuennadi Liakhovetski 	regulator_register_fixed(0, dummy_supplies, ARRAY_SIZE(dummy_supplies));
651f8eca12SGuennadi Liakhovetski 
668a453cacSPaul Mundt 	return platform_add_devices(apsh4ad0a_devices,
678a453cacSPaul Mundt 				    ARRAY_SIZE(apsh4ad0a_devices));
688a453cacSPaul Mundt }
698a453cacSPaul Mundt device_initcall(apsh4ad0a_devices_setup);
708a453cacSPaul Mundt 
apsh4ad0a_mode_pins(void)718a453cacSPaul Mundt static int apsh4ad0a_mode_pins(void)
728a453cacSPaul Mundt {
738a453cacSPaul Mundt 	int value = 0;
748a453cacSPaul Mundt 
758a453cacSPaul Mundt 	/* These are the factory default settings of SW1 and SW2.
768a453cacSPaul Mundt 	 * If you change these dip switches then you will need to
778a453cacSPaul Mundt 	 * adjust the values below as well.
788a453cacSPaul Mundt 	 */
798a453cacSPaul Mundt 	value |=  MODE_PIN0;  /* Clock Mode 3 */
808a453cacSPaul Mundt 	value |=  MODE_PIN1;
818a453cacSPaul Mundt 	value &= ~MODE_PIN2;
828a453cacSPaul Mundt 	value &= ~MODE_PIN3;
838a453cacSPaul Mundt 	value &= ~MODE_PIN4;  /* 16-bit Area0 bus width  */
848a453cacSPaul Mundt 	value |=  MODE_PIN5;
858a453cacSPaul Mundt 	value |=  MODE_PIN6;
868a453cacSPaul Mundt 	value |=  MODE_PIN7;  /* Normal mode */
878a453cacSPaul Mundt 	value |=  MODE_PIN8;  /* Little Endian */
888a453cacSPaul Mundt 	value |=  MODE_PIN9;  /* Crystal resonator */
898a453cacSPaul Mundt 	value &= ~MODE_PIN10; /* 29-bit address mode */
908a453cacSPaul Mundt 	value &= ~MODE_PIN11; /* PCI-E Root port */
918a453cacSPaul Mundt 	value &= ~MODE_PIN12; /* 4 lane + 1 lane */
928a453cacSPaul Mundt 	value |=  MODE_PIN13; /* AUD Enable */
938a453cacSPaul Mundt 	value &= ~MODE_PIN14; /* Normal Operation */
948a453cacSPaul Mundt 
958a453cacSPaul Mundt 	return value;
968a453cacSPaul Mundt }
978a453cacSPaul Mundt 
apsh4ad0a_clk_init(void)988a453cacSPaul Mundt static int apsh4ad0a_clk_init(void)
998a453cacSPaul Mundt {
1008a453cacSPaul Mundt 	struct clk *clk;
1018a453cacSPaul Mundt 	int ret;
1028a453cacSPaul Mundt 
1038a453cacSPaul Mundt 	clk = clk_get(NULL, "extal");
1047912825dSPaul Mundt 	if (IS_ERR(clk))
1058a453cacSPaul Mundt 		return PTR_ERR(clk);
1068a453cacSPaul Mundt 	ret = clk_set_rate(clk, 33333000);
1078a453cacSPaul Mundt 	clk_put(clk);
1088a453cacSPaul Mundt 
1098a453cacSPaul Mundt 	return ret;
1108a453cacSPaul Mundt }
1118a453cacSPaul Mundt 
1128a453cacSPaul Mundt /* Initialize the board */
apsh4ad0a_setup(char ** cmdline_p)1138a453cacSPaul Mundt static void __init apsh4ad0a_setup(char **cmdline_p)
1148a453cacSPaul Mundt {
1158a453cacSPaul Mundt 	pr_info("Alpha Project AP-SH4AD-0A support:\n");
1168a453cacSPaul Mundt }
1178a453cacSPaul Mundt 
apsh4ad0a_init_irq(void)1188a453cacSPaul Mundt static void __init apsh4ad0a_init_irq(void)
1198a453cacSPaul Mundt {
1208a453cacSPaul Mundt 	plat_irq_setup_pins(IRQ_MODE_IRQ3210);
1218a453cacSPaul Mundt }
1228a453cacSPaul Mundt 
1238a453cacSPaul Mundt /*
1248a453cacSPaul Mundt  * The Machine Vector
1258a453cacSPaul Mundt  */
1268a453cacSPaul Mundt static struct sh_machine_vector mv_apsh4ad0a __initmv = {
1278a453cacSPaul Mundt 	.mv_name		= "AP-SH4AD-0A",
1288a453cacSPaul Mundt 	.mv_setup		= apsh4ad0a_setup,
1298a453cacSPaul Mundt 	.mv_mode_pins		= apsh4ad0a_mode_pins,
1308a453cacSPaul Mundt 	.mv_clk_init		= apsh4ad0a_clk_init,
1318a453cacSPaul Mundt 	.mv_init_irq		= apsh4ad0a_init_irq,
1328a453cacSPaul Mundt };
133