Merge git://git.kernel.org/pub/scm/virt/kvm/kvm
[firefly-linux-kernel-4.4.55.git] / arch / arm / mach-omap2 / board-am3517crane.c
1 /*
2  * Support for AM3517/05 Craneboard
3  * http://www.mistralsolutions.com/products/craneboard.php
4  *
5  * Copyright (C) 2010 Mistral Solutions Pvt Ltd. <www.mistralsolutions.com>
6  * Author: R.Srinath <srinath@mistralsolutions.com>
7  *
8  * Based on mach-omap2/board-am3517evm.c
9  *
10  * This program is free software; you can redistribute it and/or modify it
11  * under the terms of the GNU General Public License as  published by the
12  * Free Software Foundation version 2.
13  *
14  * This program is distributed "as is" WITHOUT ANY WARRANTY of any kind,
15  * whether express or implied; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
17  * General Public License for more details.
18  */
19
20 #include <linux/kernel.h>
21 #include <linux/init.h>
22 #include <linux/gpio.h>
23 #include <linux/mfd/tps65910.h>
24 #include <linux/mtd/mtd.h>
25 #include <linux/mtd/nand.h>
26 #include <linux/mtd/partitions.h>
27
28 #include <asm/mach-types.h>
29 #include <asm/mach/arch.h>
30 #include <asm/mach/map.h>
31
32 #include "common.h"
33 #include "common-board-devices.h"
34 #include "board-flash.h"
35
36 #include "am35xx-emac.h"
37 #include "mux.h"
38 #include "control.h"
39
40 #define GPIO_USB_POWER          35
41 #define GPIO_USB_NRESET         38
42
43 #ifdef CONFIG_OMAP_MUX
44 static struct omap_board_mux board_mux[] __initdata = {
45         OMAP3_MUX(SYS_NIRQ, OMAP_MUX_MODE0 | OMAP_PIN_INPUT_PULLUP),
46         { .reg_offset = OMAP_MUX_TERMINATOR },
47 };
48 #endif
49
50 static struct usbhs_omap_platform_data usbhs_bdata __initdata = {
51         .port_mode[0] = OMAP_EHCI_PORT_MODE_PHY,
52         .port_mode[1] = OMAP_USBHS_PORT_MODE_UNUSED,
53         .port_mode[2] = OMAP_USBHS_PORT_MODE_UNUSED,
54
55         .phy_reset  = true,
56         .reset_gpio_port[0]  = GPIO_USB_NRESET,
57         .reset_gpio_port[1]  = -EINVAL,
58         .reset_gpio_port[2]  = -EINVAL
59 };
60
61 static struct mtd_partition crane_nand_partitions[] = {
62         {
63                 .name           = "X-Loader",
64                 .offset         = 0,
65                 .size           = 4 * NAND_BLOCK_SIZE,
66                 .mask_flags     = MTD_WRITEABLE,
67         },
68         {
69                 .name           = "U-Boot",
70                 .offset         = MTDPART_OFS_APPEND,
71                 .size           = 14 * NAND_BLOCK_SIZE,
72                 .mask_flags     = MTD_WRITEABLE,
73         },
74         {
75                 .name           = "U-Boot Env",
76                 .offset         = MTDPART_OFS_APPEND,
77                 .size           = 2 * NAND_BLOCK_SIZE,
78         },
79         {
80                 .name           = "Kernel",
81                 .offset         = MTDPART_OFS_APPEND,
82                 .size           = 40 * NAND_BLOCK_SIZE,
83         },
84         {
85                 .name           = "File System",
86                 .offset         = MTDPART_OFS_APPEND,
87                 .size           = MTDPART_SIZ_FULL,
88         },
89 };
90
91 static struct tps65910_board tps65910_pdata = {
92         .irq = 7 + OMAP_INTC_START,
93         .en_ck32k_xtal = true,
94 };
95
96 static struct i2c_board_info __initdata tps65910_board_info[] = {
97         {
98                 I2C_BOARD_INFO("tps65910", 0x2d),
99                 .platform_data = &tps65910_pdata,
100         },
101 };
102
103 static void __init am3517_crane_i2c_init(void)
104 {
105         omap_register_i2c_bus(1, 2600, tps65910_board_info,
106                         ARRAY_SIZE(tps65910_board_info));
107 }
108
109 static void __init am3517_crane_init(void)
110 {
111         int ret;
112
113         omap3_mux_init(board_mux, OMAP_PACKAGE_CBB);
114         omap_serial_init();
115         omap_sdrc_init(NULL, NULL);
116         board_nand_init(crane_nand_partitions,
117                         ARRAY_SIZE(crane_nand_partitions), 0,
118                         NAND_BUSWIDTH_16, NULL);
119         am3517_crane_i2c_init();
120
121         /* Configure GPIO for EHCI port */
122         if (omap_mux_init_gpio(GPIO_USB_NRESET, OMAP_PIN_OUTPUT)) {
123                 pr_err("Can not configure mux for GPIO_USB_NRESET %d\n",
124                         GPIO_USB_NRESET);
125                 return;
126         }
127
128         if (omap_mux_init_gpio(GPIO_USB_POWER, OMAP_PIN_OUTPUT)) {
129                 pr_err("Can not configure mux for GPIO_USB_POWER %d\n",
130                         GPIO_USB_POWER);
131                 return;
132         }
133
134         ret = gpio_request_one(GPIO_USB_POWER, GPIOF_OUT_INIT_HIGH,
135                                "usb_ehci_enable");
136         if (ret < 0) {
137                 pr_err("Can not request GPIO %d\n", GPIO_USB_POWER);
138                 return;
139         }
140
141         usbhs_init(&usbhs_bdata);
142         am35xx_emac_init(AM35XX_DEFAULT_MDIO_FREQUENCY, 1);
143 }
144
145 MACHINE_START(CRANEBOARD, "AM3517/05 CRANEBOARD")
146         .atag_offset    = 0x100,
147         .reserve        = omap_reserve,
148         .map_io         = omap3_map_io,
149         .init_early     = am35xx_init_early,
150         .init_irq       = omap3_init_irq,
151         .handle_irq     = omap3_intc_handle_irq,
152         .init_machine   = am3517_crane_init,
153         .init_late      = am35xx_init_late,
154         .init_time      = omap3_sync32k_timer_init,
155         .restart        = omap3xxx_restart,
156 MACHINE_END