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