18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci *  linux/arch/arm/mach-mmp/brownstone.c
48c2ecf20Sopenharmony_ci *
58c2ecf20Sopenharmony_ci *  Support for the Marvell Brownstone Development Platform.
68c2ecf20Sopenharmony_ci *
78c2ecf20Sopenharmony_ci *  Copyright (C) 2009-2010 Marvell International Ltd.
88c2ecf20Sopenharmony_ci */
98c2ecf20Sopenharmony_ci
108c2ecf20Sopenharmony_ci#include <linux/init.h>
118c2ecf20Sopenharmony_ci#include <linux/kernel.h>
128c2ecf20Sopenharmony_ci#include <linux/platform_device.h>
138c2ecf20Sopenharmony_ci#include <linux/io.h>
148c2ecf20Sopenharmony_ci#include <linux/gpio-pxa.h>
158c2ecf20Sopenharmony_ci#include <linux/gpio/machine.h>
168c2ecf20Sopenharmony_ci#include <linux/regulator/machine.h>
178c2ecf20Sopenharmony_ci#include <linux/regulator/max8649.h>
188c2ecf20Sopenharmony_ci#include <linux/regulator/fixed.h>
198c2ecf20Sopenharmony_ci#include <linux/mfd/max8925.h>
208c2ecf20Sopenharmony_ci
218c2ecf20Sopenharmony_ci#include <asm/mach-types.h>
228c2ecf20Sopenharmony_ci#include <asm/mach/arch.h>
238c2ecf20Sopenharmony_ci#include "addr-map.h"
248c2ecf20Sopenharmony_ci#include "mfp-mmp2.h"
258c2ecf20Sopenharmony_ci#include "mmp2.h"
268c2ecf20Sopenharmony_ci#include "irqs.h"
278c2ecf20Sopenharmony_ci
288c2ecf20Sopenharmony_ci#include "common.h"
298c2ecf20Sopenharmony_ci
308c2ecf20Sopenharmony_ci#define BROWNSTONE_NR_IRQS	(MMP_NR_IRQS + 40)
318c2ecf20Sopenharmony_ci
328c2ecf20Sopenharmony_ci#define GPIO_5V_ENABLE		(89)
338c2ecf20Sopenharmony_ci
348c2ecf20Sopenharmony_cistatic unsigned long brownstone_pin_config[] __initdata = {
358c2ecf20Sopenharmony_ci	/* UART1 */
368c2ecf20Sopenharmony_ci	GPIO29_UART1_RXD,
378c2ecf20Sopenharmony_ci	GPIO30_UART1_TXD,
388c2ecf20Sopenharmony_ci
398c2ecf20Sopenharmony_ci	/* UART3 */
408c2ecf20Sopenharmony_ci	GPIO51_UART3_RXD,
418c2ecf20Sopenharmony_ci	GPIO52_UART3_TXD,
428c2ecf20Sopenharmony_ci
438c2ecf20Sopenharmony_ci	/* DFI */
448c2ecf20Sopenharmony_ci	GPIO168_DFI_D0,
458c2ecf20Sopenharmony_ci	GPIO167_DFI_D1,
468c2ecf20Sopenharmony_ci	GPIO166_DFI_D2,
478c2ecf20Sopenharmony_ci	GPIO165_DFI_D3,
488c2ecf20Sopenharmony_ci	GPIO107_DFI_D4,
498c2ecf20Sopenharmony_ci	GPIO106_DFI_D5,
508c2ecf20Sopenharmony_ci	GPIO105_DFI_D6,
518c2ecf20Sopenharmony_ci	GPIO104_DFI_D7,
528c2ecf20Sopenharmony_ci	GPIO111_DFI_D8,
538c2ecf20Sopenharmony_ci	GPIO164_DFI_D9,
548c2ecf20Sopenharmony_ci	GPIO163_DFI_D10,
558c2ecf20Sopenharmony_ci	GPIO162_DFI_D11,
568c2ecf20Sopenharmony_ci	GPIO161_DFI_D12,
578c2ecf20Sopenharmony_ci	GPIO110_DFI_D13,
588c2ecf20Sopenharmony_ci	GPIO109_DFI_D14,
598c2ecf20Sopenharmony_ci	GPIO108_DFI_D15,
608c2ecf20Sopenharmony_ci	GPIO143_ND_nCS0,
618c2ecf20Sopenharmony_ci	GPIO144_ND_nCS1,
628c2ecf20Sopenharmony_ci	GPIO147_ND_nWE,
638c2ecf20Sopenharmony_ci	GPIO148_ND_nRE,
648c2ecf20Sopenharmony_ci	GPIO150_ND_ALE,
658c2ecf20Sopenharmony_ci	GPIO149_ND_CLE,
668c2ecf20Sopenharmony_ci	GPIO112_ND_RDY0,
678c2ecf20Sopenharmony_ci	GPIO160_ND_RDY1,
688c2ecf20Sopenharmony_ci
698c2ecf20Sopenharmony_ci	/* PMIC */
708c2ecf20Sopenharmony_ci	PMIC_PMIC_INT | MFP_LPM_EDGE_FALL,
718c2ecf20Sopenharmony_ci
728c2ecf20Sopenharmony_ci	/* MMC0 */
738c2ecf20Sopenharmony_ci	GPIO131_MMC1_DAT3 | MFP_PULL_HIGH,
748c2ecf20Sopenharmony_ci	GPIO132_MMC1_DAT2 | MFP_PULL_HIGH,
758c2ecf20Sopenharmony_ci	GPIO133_MMC1_DAT1 | MFP_PULL_HIGH,
768c2ecf20Sopenharmony_ci	GPIO134_MMC1_DAT0 | MFP_PULL_HIGH,
778c2ecf20Sopenharmony_ci	GPIO136_MMC1_CMD | MFP_PULL_HIGH,
788c2ecf20Sopenharmony_ci	GPIO139_MMC1_CLK,
798c2ecf20Sopenharmony_ci	GPIO140_MMC1_CD | MFP_PULL_LOW,
808c2ecf20Sopenharmony_ci	GPIO141_MMC1_WP | MFP_PULL_LOW,
818c2ecf20Sopenharmony_ci
828c2ecf20Sopenharmony_ci	/* MMC1 */
838c2ecf20Sopenharmony_ci	GPIO37_MMC2_DAT3 | MFP_PULL_HIGH,
848c2ecf20Sopenharmony_ci	GPIO38_MMC2_DAT2 | MFP_PULL_HIGH,
858c2ecf20Sopenharmony_ci	GPIO39_MMC2_DAT1 | MFP_PULL_HIGH,
868c2ecf20Sopenharmony_ci	GPIO40_MMC2_DAT0 | MFP_PULL_HIGH,
878c2ecf20Sopenharmony_ci	GPIO41_MMC2_CMD | MFP_PULL_HIGH,
888c2ecf20Sopenharmony_ci	GPIO42_MMC2_CLK,
898c2ecf20Sopenharmony_ci
908c2ecf20Sopenharmony_ci	/* MMC2 */
918c2ecf20Sopenharmony_ci	GPIO165_MMC3_DAT7 | MFP_PULL_HIGH,
928c2ecf20Sopenharmony_ci	GPIO162_MMC3_DAT6 | MFP_PULL_HIGH,
938c2ecf20Sopenharmony_ci	GPIO166_MMC3_DAT5 | MFP_PULL_HIGH,
948c2ecf20Sopenharmony_ci	GPIO163_MMC3_DAT4 | MFP_PULL_HIGH,
958c2ecf20Sopenharmony_ci	GPIO167_MMC3_DAT3 | MFP_PULL_HIGH,
968c2ecf20Sopenharmony_ci	GPIO164_MMC3_DAT2 | MFP_PULL_HIGH,
978c2ecf20Sopenharmony_ci	GPIO168_MMC3_DAT1 | MFP_PULL_HIGH,
988c2ecf20Sopenharmony_ci	GPIO111_MMC3_DAT0 | MFP_PULL_HIGH,
998c2ecf20Sopenharmony_ci	GPIO112_MMC3_CMD | MFP_PULL_HIGH,
1008c2ecf20Sopenharmony_ci	GPIO151_MMC3_CLK,
1018c2ecf20Sopenharmony_ci
1028c2ecf20Sopenharmony_ci	/* 5V regulator */
1038c2ecf20Sopenharmony_ci	GPIO89_GPIO,
1048c2ecf20Sopenharmony_ci};
1058c2ecf20Sopenharmony_ci
1068c2ecf20Sopenharmony_cistatic struct pxa_gpio_platform_data mmp2_gpio_pdata = {
1078c2ecf20Sopenharmony_ci	.irq_base	= MMP_GPIO_TO_IRQ(0),
1088c2ecf20Sopenharmony_ci};
1098c2ecf20Sopenharmony_ci
1108c2ecf20Sopenharmony_cistatic struct regulator_consumer_supply max8649_supply[] = {
1118c2ecf20Sopenharmony_ci	REGULATOR_SUPPLY("vcc_core", NULL),
1128c2ecf20Sopenharmony_ci};
1138c2ecf20Sopenharmony_ci
1148c2ecf20Sopenharmony_cistatic struct regulator_init_data max8649_init_data = {
1158c2ecf20Sopenharmony_ci	.constraints	= {
1168c2ecf20Sopenharmony_ci		.name		= "vcc_core range",
1178c2ecf20Sopenharmony_ci		.min_uV		= 1150000,
1188c2ecf20Sopenharmony_ci		.max_uV		= 1280000,
1198c2ecf20Sopenharmony_ci		.always_on	= 1,
1208c2ecf20Sopenharmony_ci		.boot_on	= 1,
1218c2ecf20Sopenharmony_ci		.valid_ops_mask	= REGULATOR_CHANGE_VOLTAGE,
1228c2ecf20Sopenharmony_ci	},
1238c2ecf20Sopenharmony_ci	.num_consumer_supplies	= 1,
1248c2ecf20Sopenharmony_ci	.consumer_supplies	= &max8649_supply[0],
1258c2ecf20Sopenharmony_ci};
1268c2ecf20Sopenharmony_ci
1278c2ecf20Sopenharmony_cistatic struct max8649_platform_data brownstone_max8649_info = {
1288c2ecf20Sopenharmony_ci	.mode		= 2,	/* VID1 = 1, VID0 = 0 */
1298c2ecf20Sopenharmony_ci	.extclk		= 0,
1308c2ecf20Sopenharmony_ci	.ramp_timing	= MAX8649_RAMP_32MV,
1318c2ecf20Sopenharmony_ci	.regulator	= &max8649_init_data,
1328c2ecf20Sopenharmony_ci};
1338c2ecf20Sopenharmony_ci
1348c2ecf20Sopenharmony_cistatic struct regulator_consumer_supply brownstone_v_5vp_supplies[] = {
1358c2ecf20Sopenharmony_ci	REGULATOR_SUPPLY("v_5vp", NULL),
1368c2ecf20Sopenharmony_ci};
1378c2ecf20Sopenharmony_ci
1388c2ecf20Sopenharmony_cistatic struct regulator_init_data brownstone_v_5vp_data = {
1398c2ecf20Sopenharmony_ci	.constraints	= {
1408c2ecf20Sopenharmony_ci		.valid_ops_mask		= REGULATOR_CHANGE_STATUS,
1418c2ecf20Sopenharmony_ci	},
1428c2ecf20Sopenharmony_ci	.num_consumer_supplies	= ARRAY_SIZE(brownstone_v_5vp_supplies),
1438c2ecf20Sopenharmony_ci	.consumer_supplies	= brownstone_v_5vp_supplies,
1448c2ecf20Sopenharmony_ci};
1458c2ecf20Sopenharmony_ci
1468c2ecf20Sopenharmony_cistatic struct fixed_voltage_config brownstone_v_5vp = {
1478c2ecf20Sopenharmony_ci	.supply_name		= "v_5vp",
1488c2ecf20Sopenharmony_ci	.microvolts		= 5000000,
1498c2ecf20Sopenharmony_ci	.enabled_at_boot	= 1,
1508c2ecf20Sopenharmony_ci	.init_data		= &brownstone_v_5vp_data,
1518c2ecf20Sopenharmony_ci};
1528c2ecf20Sopenharmony_ci
1538c2ecf20Sopenharmony_cistatic struct platform_device brownstone_v_5vp_device = {
1548c2ecf20Sopenharmony_ci	.name		= "reg-fixed-voltage",
1558c2ecf20Sopenharmony_ci	.id		= 1,
1568c2ecf20Sopenharmony_ci	.dev = {
1578c2ecf20Sopenharmony_ci		.platform_data = &brownstone_v_5vp,
1588c2ecf20Sopenharmony_ci	},
1598c2ecf20Sopenharmony_ci};
1608c2ecf20Sopenharmony_ci
1618c2ecf20Sopenharmony_cistatic struct gpiod_lookup_table brownstone_v_5vp_gpiod_table = {
1628c2ecf20Sopenharmony_ci	.dev_id = "reg-fixed-voltage.1", /* .id set to 1 above */
1638c2ecf20Sopenharmony_ci	.table = {
1648c2ecf20Sopenharmony_ci		GPIO_LOOKUP("gpio-pxa", GPIO_5V_ENABLE,
1658c2ecf20Sopenharmony_ci			    NULL, GPIO_ACTIVE_HIGH),
1668c2ecf20Sopenharmony_ci		{ },
1678c2ecf20Sopenharmony_ci	},
1688c2ecf20Sopenharmony_ci};
1698c2ecf20Sopenharmony_ci
1708c2ecf20Sopenharmony_cistatic struct max8925_platform_data brownstone_max8925_info = {
1718c2ecf20Sopenharmony_ci	.irq_base		= MMP_NR_IRQS,
1728c2ecf20Sopenharmony_ci};
1738c2ecf20Sopenharmony_ci
1748c2ecf20Sopenharmony_cistatic struct i2c_board_info brownstone_twsi1_info[] = {
1758c2ecf20Sopenharmony_ci	[0] = {
1768c2ecf20Sopenharmony_ci		.type		= "max8649",
1778c2ecf20Sopenharmony_ci		.addr		= 0x60,
1788c2ecf20Sopenharmony_ci		.platform_data	= &brownstone_max8649_info,
1798c2ecf20Sopenharmony_ci	},
1808c2ecf20Sopenharmony_ci	[1] = {
1818c2ecf20Sopenharmony_ci		.type		= "max8925",
1828c2ecf20Sopenharmony_ci		.addr		= 0x3c,
1838c2ecf20Sopenharmony_ci		.irq		= IRQ_MMP2_PMIC,
1848c2ecf20Sopenharmony_ci		.platform_data	= &brownstone_max8925_info,
1858c2ecf20Sopenharmony_ci	},
1868c2ecf20Sopenharmony_ci};
1878c2ecf20Sopenharmony_ci
1888c2ecf20Sopenharmony_cistatic struct sdhci_pxa_platdata mmp2_sdh_platdata_mmc0 = {
1898c2ecf20Sopenharmony_ci	.clk_delay_cycles = 0x1f,
1908c2ecf20Sopenharmony_ci};
1918c2ecf20Sopenharmony_ci
1928c2ecf20Sopenharmony_cistatic struct sdhci_pxa_platdata mmp2_sdh_platdata_mmc2 = {
1938c2ecf20Sopenharmony_ci	.clk_delay_cycles = 0x1f,
1948c2ecf20Sopenharmony_ci	.flags = PXA_FLAG_CARD_PERMANENT
1958c2ecf20Sopenharmony_ci		| PXA_FLAG_SD_8_BIT_CAPABLE_SLOT,
1968c2ecf20Sopenharmony_ci};
1978c2ecf20Sopenharmony_ci
1988c2ecf20Sopenharmony_cistatic struct sram_platdata mmp2_asram_platdata = {
1998c2ecf20Sopenharmony_ci	.pool_name	= "asram",
2008c2ecf20Sopenharmony_ci	.granularity	= SRAM_GRANULARITY,
2018c2ecf20Sopenharmony_ci};
2028c2ecf20Sopenharmony_ci
2038c2ecf20Sopenharmony_cistatic struct sram_platdata mmp2_isram_platdata = {
2048c2ecf20Sopenharmony_ci	.pool_name	= "isram",
2058c2ecf20Sopenharmony_ci	.granularity	= SRAM_GRANULARITY,
2068c2ecf20Sopenharmony_ci};
2078c2ecf20Sopenharmony_ci
2088c2ecf20Sopenharmony_cistatic void __init brownstone_init(void)
2098c2ecf20Sopenharmony_ci{
2108c2ecf20Sopenharmony_ci	mfp_config(ARRAY_AND_SIZE(brownstone_pin_config));
2118c2ecf20Sopenharmony_ci
2128c2ecf20Sopenharmony_ci	/* on-chip devices */
2138c2ecf20Sopenharmony_ci	mmp2_add_uart(1);
2148c2ecf20Sopenharmony_ci	mmp2_add_uart(3);
2158c2ecf20Sopenharmony_ci	platform_device_add_data(&mmp2_device_gpio, &mmp2_gpio_pdata,
2168c2ecf20Sopenharmony_ci				 sizeof(struct pxa_gpio_platform_data));
2178c2ecf20Sopenharmony_ci	platform_device_register(&mmp2_device_gpio);
2188c2ecf20Sopenharmony_ci	mmp2_add_twsi(1, NULL, ARRAY_AND_SIZE(brownstone_twsi1_info));
2198c2ecf20Sopenharmony_ci	mmp2_add_sdhost(0, &mmp2_sdh_platdata_mmc0); /* SD/MMC */
2208c2ecf20Sopenharmony_ci	mmp2_add_sdhost(2, &mmp2_sdh_platdata_mmc2); /* eMMC */
2218c2ecf20Sopenharmony_ci	mmp2_add_asram(&mmp2_asram_platdata);
2228c2ecf20Sopenharmony_ci	mmp2_add_isram(&mmp2_isram_platdata);
2238c2ecf20Sopenharmony_ci
2248c2ecf20Sopenharmony_ci	/* enable 5v regulator */
2258c2ecf20Sopenharmony_ci	gpiod_add_lookup_table(&brownstone_v_5vp_gpiod_table);
2268c2ecf20Sopenharmony_ci	platform_device_register(&brownstone_v_5vp_device);
2278c2ecf20Sopenharmony_ci}
2288c2ecf20Sopenharmony_ci
2298c2ecf20Sopenharmony_ciMACHINE_START(BROWNSTONE, "Brownstone Development Platform")
2308c2ecf20Sopenharmony_ci	/* Maintainer: Haojian Zhuang <haojian.zhuang@marvell.com> */
2318c2ecf20Sopenharmony_ci	.map_io		= mmp_map_io,
2328c2ecf20Sopenharmony_ci	.nr_irqs	= BROWNSTONE_NR_IRQS,
2338c2ecf20Sopenharmony_ci	.init_irq	= mmp2_init_irq,
2348c2ecf20Sopenharmony_ci	.init_time	= mmp2_timer_init,
2358c2ecf20Sopenharmony_ci	.init_machine	= brownstone_init,
2368c2ecf20Sopenharmony_ci	.restart	= mmp_restart,
2378c2ecf20Sopenharmony_ciMACHINE_END
238