Path: blob/master/arch/arm/mach-kirkwood/openrd-setup.c
10817 views
/*1* arch/arm/mach-kirkwood/openrd-setup.c2*3* Marvell OpenRD (Base|Client|Ultimate) Board Setup4*5* This file is licensed under the terms of the GNU General Public6* License version 2. This program is licensed "as is" without any7* warranty of any kind, whether express or implied.8*/910#include <linux/kernel.h>11#include <linux/init.h>12#include <linux/platform_device.h>13#include <linux/mtd/nand.h>14#include <linux/mtd/partitions.h>15#include <linux/ata_platform.h>16#include <linux/mv643xx_eth.h>17#include <linux/i2c.h>18#include <linux/gpio.h>19#include <asm/mach-types.h>20#include <asm/mach/arch.h>21#include <mach/kirkwood.h>22#include <plat/mvsdio.h>23#include "common.h"24#include "mpp.h"2526static struct mtd_partition openrd_nand_parts[] = {27{28.name = "u-boot",29.offset = 0,30.size = SZ_1M,31.mask_flags = MTD_WRITEABLE32}, {33.name = "uImage",34.offset = MTDPART_OFS_NXTBLK,35.size = SZ_4M36}, {37.name = "root",38.offset = MTDPART_OFS_NXTBLK,39.size = MTDPART_SIZ_FULL40},41};4243static struct mv643xx_eth_platform_data openrd_ge00_data = {44.phy_addr = MV643XX_ETH_PHY_ADDR(8),45};4647static struct mv643xx_eth_platform_data openrd_ge01_data = {48.phy_addr = MV643XX_ETH_PHY_ADDR(24),49};5051static struct mv_sata_platform_data openrd_sata_data = {52.n_ports = 2,53};5455static struct mvsdio_platform_data openrd_mvsdio_data = {56.gpio_card_detect = 29, /* MPP29 used as SD card detect */57};5859static unsigned int openrd_mpp_config[] __initdata = {60MPP12_SD_CLK,61MPP13_SD_CMD,62MPP14_SD_D0,63MPP15_SD_D1,64MPP16_SD_D2,65MPP17_SD_D3,66MPP28_GPIO,67MPP29_GPIO,68MPP34_GPIO,69070};7172/* Configure MPP for UART1 */73static unsigned int openrd_uart1_mpp_config[] __initdata = {74MPP13_UART1_TXD,75MPP14_UART1_RXD,76077};7879static struct i2c_board_info i2c_board_info[] __initdata = {80{81I2C_BOARD_INFO("cs42l51", 0x4a),82},83};8485static int __initdata uart1;8687static int __init sd_uart_selection(char *str)88{89uart1 = -EINVAL;9091/* Default is SD. Change if required, for UART */92if (!str)93return 0;9495if (!strncmp(str, "232", 3)) {96uart1 = 232;97} else if (!strncmp(str, "485", 3)) {98/* OpenRD-Base doesn't have RS485. Treat is as an99* unknown argument & just have default setting -100* which is SD */101if (machine_is_openrd_base()) {102uart1 = -ENODEV;103return 1;104}105106uart1 = 485;107}108return 1;109}110/* Parse boot_command_line string kw_openrd_init_uart1=232/485 */111__setup("kw_openrd_init_uart1=", sd_uart_selection);112113static int __init uart1_mpp_config(void)114{115kirkwood_mpp_conf(openrd_uart1_mpp_config);116117if (gpio_request(34, "SD_UART1_SEL")) {118printk(KERN_ERR "GPIO request failed for SD/UART1 selection"119", gpio: 34\n");120return -EIO;121}122123if (gpio_request(28, "RS232_RS485_SEL")) {124printk(KERN_ERR "GPIO request failed for RS232/RS485 selection"125", gpio# 28\n");126gpio_free(34);127return -EIO;128}129130/* Select UART1131* Pin # 34: 0 => UART1, 1 => SD */132gpio_direction_output(34, 0);133134/* Select RS232 OR RS485135* Pin # 28: 0 => RS232, 1 => RS485 */136if (uart1 == 232)137gpio_direction_output(28, 0);138else139gpio_direction_output(28, 1);140141gpio_free(34);142gpio_free(28);143144return 0;145}146147static void __init openrd_init(void)148{149/*150* Basic setup. Needs to be called early.151*/152kirkwood_init();153kirkwood_mpp_conf(openrd_mpp_config);154155kirkwood_uart0_init();156kirkwood_nand_init(ARRAY_AND_SIZE(openrd_nand_parts), 25);157158kirkwood_ehci_init();159160if (machine_is_openrd_ultimate()) {161openrd_ge00_data.phy_addr = MV643XX_ETH_PHY_ADDR(0);162openrd_ge01_data.phy_addr = MV643XX_ETH_PHY_ADDR(1);163}164165kirkwood_ge00_init(&openrd_ge00_data);166if (!machine_is_openrd_base())167kirkwood_ge01_init(&openrd_ge01_data);168169kirkwood_sata_init(&openrd_sata_data);170171kirkwood_i2c_init();172173if (machine_is_openrd_client() || machine_is_openrd_ultimate()) {174i2c_register_board_info(0, i2c_board_info,175ARRAY_SIZE(i2c_board_info));176kirkwood_audio_init();177}178179if (uart1 <= 0) {180if (uart1 < 0)181printk(KERN_ERR "Invalid kernel parameter to select "182"UART1. Defaulting to SD. ERROR CODE: %d\n",183uart1);184185/* Select SD186* Pin # 34: 0 => UART1, 1 => SD */187if (gpio_request(34, "SD_UART1_SEL")) {188printk(KERN_ERR "GPIO request failed for SD/UART1 "189"selection, gpio: 34\n");190} else {191192gpio_direction_output(34, 1);193gpio_free(34);194kirkwood_sdio_init(&openrd_mvsdio_data);195}196} else {197if (!uart1_mpp_config())198kirkwood_uart1_init();199}200}201202static int __init openrd_pci_init(void)203{204if (machine_is_openrd_base() ||205machine_is_openrd_client() ||206machine_is_openrd_ultimate())207kirkwood_pcie_init(KW_PCIE0);208209return 0;210}211subsys_initcall(openrd_pci_init);212213#ifdef CONFIG_MACH_OPENRD_BASE214MACHINE_START(OPENRD_BASE, "Marvell OpenRD Base Board")215/* Maintainer: Dhaval Vasa <[email protected]> */216.boot_params = 0x00000100,217.init_machine = openrd_init,218.map_io = kirkwood_map_io,219.init_early = kirkwood_init_early,220.init_irq = kirkwood_init_irq,221.timer = &kirkwood_timer,222MACHINE_END223#endif224225#ifdef CONFIG_MACH_OPENRD_CLIENT226MACHINE_START(OPENRD_CLIENT, "Marvell OpenRD Client Board")227/* Maintainer: Dhaval Vasa <[email protected]> */228.boot_params = 0x00000100,229.init_machine = openrd_init,230.map_io = kirkwood_map_io,231.init_early = kirkwood_init_early,232.init_irq = kirkwood_init_irq,233.timer = &kirkwood_timer,234MACHINE_END235#endif236237#ifdef CONFIG_MACH_OPENRD_ULTIMATE238MACHINE_START(OPENRD_ULTIMATE, "Marvell OpenRD Ultimate Board")239/* Maintainer: Dhaval Vasa <[email protected]> */240.boot_params = 0x00000100,241.init_machine = openrd_init,242.map_io = kirkwood_map_io,243.init_early = kirkwood_init_early,244.init_irq = kirkwood_init_irq,245.timer = &kirkwood_timer,246MACHINE_END247#endif248249250