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