Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0-only
0002 /*
0003  *  linux/arch/arm/mach-mmp/brownstone.c
0004  *
0005  *  Support for the Marvell Brownstone Development Platform.
0006  *
0007  *  Copyright (C) 2009-2010 Marvell International Ltd.
0008  */
0009 
0010 #include <linux/init.h>
0011 #include <linux/kernel.h>
0012 #include <linux/platform_device.h>
0013 #include <linux/io.h>
0014 #include <linux/gpio-pxa.h>
0015 #include <linux/gpio/machine.h>
0016 #include <linux/regulator/machine.h>
0017 #include <linux/regulator/max8649.h>
0018 #include <linux/regulator/fixed.h>
0019 #include <linux/mfd/max8925.h>
0020 
0021 #include <asm/mach-types.h>
0022 #include <asm/mach/arch.h>
0023 #include "addr-map.h"
0024 #include "mfp-mmp2.h"
0025 #include "mmp2.h"
0026 #include "irqs.h"
0027 
0028 #include "common.h"
0029 
0030 #define BROWNSTONE_NR_IRQS  (MMP_NR_IRQS + 40)
0031 
0032 #define GPIO_5V_ENABLE      (89)
0033 
0034 static unsigned long brownstone_pin_config[] __initdata = {
0035     /* UART1 */
0036     GPIO29_UART1_RXD,
0037     GPIO30_UART1_TXD,
0038 
0039     /* UART3 */
0040     GPIO51_UART3_RXD,
0041     GPIO52_UART3_TXD,
0042 
0043     /* DFI */
0044     GPIO168_DFI_D0,
0045     GPIO167_DFI_D1,
0046     GPIO166_DFI_D2,
0047     GPIO165_DFI_D3,
0048     GPIO107_DFI_D4,
0049     GPIO106_DFI_D5,
0050     GPIO105_DFI_D6,
0051     GPIO104_DFI_D7,
0052     GPIO111_DFI_D8,
0053     GPIO164_DFI_D9,
0054     GPIO163_DFI_D10,
0055     GPIO162_DFI_D11,
0056     GPIO161_DFI_D12,
0057     GPIO110_DFI_D13,
0058     GPIO109_DFI_D14,
0059     GPIO108_DFI_D15,
0060     GPIO143_ND_nCS0,
0061     GPIO144_ND_nCS1,
0062     GPIO147_ND_nWE,
0063     GPIO148_ND_nRE,
0064     GPIO150_ND_ALE,
0065     GPIO149_ND_CLE,
0066     GPIO112_ND_RDY0,
0067     GPIO160_ND_RDY1,
0068 
0069     /* PMIC */
0070     PMIC_PMIC_INT | MFP_LPM_EDGE_FALL,
0071 
0072     /* MMC0 */
0073     GPIO131_MMC1_DAT3 | MFP_PULL_HIGH,
0074     GPIO132_MMC1_DAT2 | MFP_PULL_HIGH,
0075     GPIO133_MMC1_DAT1 | MFP_PULL_HIGH,
0076     GPIO134_MMC1_DAT0 | MFP_PULL_HIGH,
0077     GPIO136_MMC1_CMD | MFP_PULL_HIGH,
0078     GPIO139_MMC1_CLK,
0079     GPIO140_MMC1_CD | MFP_PULL_LOW,
0080     GPIO141_MMC1_WP | MFP_PULL_LOW,
0081 
0082     /* MMC1 */
0083     GPIO37_MMC2_DAT3 | MFP_PULL_HIGH,
0084     GPIO38_MMC2_DAT2 | MFP_PULL_HIGH,
0085     GPIO39_MMC2_DAT1 | MFP_PULL_HIGH,
0086     GPIO40_MMC2_DAT0 | MFP_PULL_HIGH,
0087     GPIO41_MMC2_CMD | MFP_PULL_HIGH,
0088     GPIO42_MMC2_CLK,
0089 
0090     /* MMC2 */
0091     GPIO165_MMC3_DAT7 | MFP_PULL_HIGH,
0092     GPIO162_MMC3_DAT6 | MFP_PULL_HIGH,
0093     GPIO166_MMC3_DAT5 | MFP_PULL_HIGH,
0094     GPIO163_MMC3_DAT4 | MFP_PULL_HIGH,
0095     GPIO167_MMC3_DAT3 | MFP_PULL_HIGH,
0096     GPIO164_MMC3_DAT2 | MFP_PULL_HIGH,
0097     GPIO168_MMC3_DAT1 | MFP_PULL_HIGH,
0098     GPIO111_MMC3_DAT0 | MFP_PULL_HIGH,
0099     GPIO112_MMC3_CMD | MFP_PULL_HIGH,
0100     GPIO151_MMC3_CLK,
0101 
0102     /* 5V regulator */
0103     GPIO89_GPIO,
0104 };
0105 
0106 static struct pxa_gpio_platform_data mmp2_gpio_pdata = {
0107     .irq_base   = MMP_GPIO_TO_IRQ(0),
0108 };
0109 
0110 static struct regulator_consumer_supply max8649_supply[] = {
0111     REGULATOR_SUPPLY("vcc_core", NULL),
0112 };
0113 
0114 static struct regulator_init_data max8649_init_data = {
0115     .constraints    = {
0116         .name       = "vcc_core range",
0117         .min_uV     = 1150000,
0118         .max_uV     = 1280000,
0119         .always_on  = 1,
0120         .boot_on    = 1,
0121         .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE,
0122     },
0123     .num_consumer_supplies  = 1,
0124     .consumer_supplies  = &max8649_supply[0],
0125 };
0126 
0127 static struct max8649_platform_data brownstone_max8649_info = {
0128     .mode       = 2,    /* VID1 = 1, VID0 = 0 */
0129     .extclk     = 0,
0130     .ramp_timing    = MAX8649_RAMP_32MV,
0131     .regulator  = &max8649_init_data,
0132 };
0133 
0134 static struct regulator_consumer_supply brownstone_v_5vp_supplies[] = {
0135     REGULATOR_SUPPLY("v_5vp", NULL),
0136 };
0137 
0138 static struct regulator_init_data brownstone_v_5vp_data = {
0139     .constraints    = {
0140         .valid_ops_mask     = REGULATOR_CHANGE_STATUS,
0141     },
0142     .num_consumer_supplies  = ARRAY_SIZE(brownstone_v_5vp_supplies),
0143     .consumer_supplies  = brownstone_v_5vp_supplies,
0144 };
0145 
0146 static struct fixed_voltage_config brownstone_v_5vp = {
0147     .supply_name        = "v_5vp",
0148     .microvolts     = 5000000,
0149     .enabled_at_boot    = 1,
0150     .init_data      = &brownstone_v_5vp_data,
0151 };
0152 
0153 static struct platform_device brownstone_v_5vp_device = {
0154     .name       = "reg-fixed-voltage",
0155     .id     = 1,
0156     .dev = {
0157         .platform_data = &brownstone_v_5vp,
0158     },
0159 };
0160 
0161 static struct gpiod_lookup_table brownstone_v_5vp_gpiod_table = {
0162     .dev_id = "reg-fixed-voltage.1", /* .id set to 1 above */
0163     .table = {
0164         GPIO_LOOKUP("gpio-pxa", GPIO_5V_ENABLE,
0165                 NULL, GPIO_ACTIVE_HIGH),
0166         { },
0167     },
0168 };
0169 
0170 static struct max8925_platform_data brownstone_max8925_info = {
0171     .irq_base       = MMP_NR_IRQS,
0172 };
0173 
0174 static struct i2c_board_info brownstone_twsi1_info[] = {
0175     [0] = {
0176         .type       = "max8649",
0177         .addr       = 0x60,
0178         .platform_data  = &brownstone_max8649_info,
0179     },
0180     [1] = {
0181         .type       = "max8925",
0182         .addr       = 0x3c,
0183         .irq        = IRQ_MMP2_PMIC,
0184         .platform_data  = &brownstone_max8925_info,
0185     },
0186 };
0187 
0188 static struct sdhci_pxa_platdata mmp2_sdh_platdata_mmc0 = {
0189     .clk_delay_cycles = 0x1f,
0190 };
0191 
0192 static struct sdhci_pxa_platdata mmp2_sdh_platdata_mmc2 = {
0193     .clk_delay_cycles = 0x1f,
0194     .flags = PXA_FLAG_CARD_PERMANENT
0195         | PXA_FLAG_SD_8_BIT_CAPABLE_SLOT,
0196 };
0197 
0198 static struct sram_platdata mmp2_asram_platdata = {
0199     .pool_name  = "asram",
0200     .granularity    = SRAM_GRANULARITY,
0201 };
0202 
0203 static struct sram_platdata mmp2_isram_platdata = {
0204     .pool_name  = "isram",
0205     .granularity    = SRAM_GRANULARITY,
0206 };
0207 
0208 static void __init brownstone_init(void)
0209 {
0210     mfp_config(ARRAY_AND_SIZE(brownstone_pin_config));
0211 
0212     /* on-chip devices */
0213     mmp2_add_uart(1);
0214     mmp2_add_uart(3);
0215     platform_device_add_data(&mmp2_device_gpio, &mmp2_gpio_pdata,
0216                  sizeof(struct pxa_gpio_platform_data));
0217     platform_device_register(&mmp2_device_gpio);
0218     mmp2_add_twsi(1, NULL, ARRAY_AND_SIZE(brownstone_twsi1_info));
0219     mmp2_add_sdhost(0, &mmp2_sdh_platdata_mmc0); /* SD/MMC */
0220     mmp2_add_sdhost(2, &mmp2_sdh_platdata_mmc2); /* eMMC */
0221     mmp2_add_asram(&mmp2_asram_platdata);
0222     mmp2_add_isram(&mmp2_isram_platdata);
0223 
0224     /* enable 5v regulator */
0225     gpiod_add_lookup_table(&brownstone_v_5vp_gpiod_table);
0226     platform_device_register(&brownstone_v_5vp_device);
0227 }
0228 
0229 MACHINE_START(BROWNSTONE, "Brownstone Development Platform")
0230     /* Maintainer: Haojian Zhuang <haojian.zhuang@marvell.com> */
0231     .map_io     = mmp_map_io,
0232     .nr_irqs    = BROWNSTONE_NR_IRQS,
0233     .init_irq   = mmp2_init_irq,
0234     .init_time  = mmp2_timer_init,
0235     .init_machine   = brownstone_init,
0236     .restart    = mmp_restart,
0237 MACHINE_END