Linux Audio

Check our new training course

Loading...
Note: File does not exist in v6.13.7.
  1/*
  2 * Board support file for OMAP4430 based PandaBoard.
  3 *
  4 * Copyright (C) 2010 Texas Instruments
  5 *
  6 * Author: David Anders <x0132446@ti.com>
  7 *
  8 * Based on mach-omap2/board-4430sdp.c
  9 *
 10 * Author: Santosh Shilimkar <santosh.shilimkar@ti.com>
 11 *
 12 * Based on mach-omap2/board-3430sdp.c
 13 *
 14 * This program is free software; you can redistribute it and/or modify
 15 * it under the terms of the GNU General Public License version 2 as
 16 * published by the Free Software Foundation.
 17 */
 18
 19#include <linux/kernel.h>
 20#include <linux/init.h>
 21#include <linux/platform_device.h>
 22#include <linux/clk.h>
 23#include <linux/io.h>
 24#include <linux/leds.h>
 25#include <linux/gpio.h>
 26#include <linux/usb/otg.h>
 27#include <linux/i2c/twl.h>
 28#include <linux/regulator/machine.h>
 29#include <linux/regulator/fixed.h>
 30#include <linux/wl12xx.h>
 31
 32#include <mach/hardware.h>
 33#include <mach/omap4-common.h>
 34#include <asm/mach-types.h>
 35#include <asm/mach/arch.h>
 36#include <asm/mach/map.h>
 37#include <video/omapdss.h>
 38
 39#include <plat/board.h>
 40#include <plat/common.h>
 41#include <plat/usb.h>
 42#include <plat/mmc.h>
 43#include <video/omap-panel-generic-dpi.h>
 44
 45#include "hsmmc.h"
 46#include "control.h"
 47#include "mux.h"
 48#include "common-board-devices.h"
 49
 50#define GPIO_HUB_POWER		1
 51#define GPIO_HUB_NRESET		62
 52#define GPIO_WIFI_PMENA		43
 53#define GPIO_WIFI_IRQ		53
 54#define HDMI_GPIO_HPD 60 /* Hot plug pin for HDMI */
 55#define HDMI_GPIO_LS_OE 41 /* Level shifter for HDMI */
 56
 57/* wl127x BT, FM, GPS connectivity chip */
 58static int wl1271_gpios[] = {46, -1, -1};
 59static struct platform_device wl1271_device = {
 60	.name	= "kim",
 61	.id	= -1,
 62	.dev	= {
 63		.platform_data	= &wl1271_gpios,
 64	},
 65};
 66
 67static struct gpio_led gpio_leds[] = {
 68	{
 69		.name			= "pandaboard::status1",
 70		.default_trigger	= "heartbeat",
 71		.gpio			= 7,
 72	},
 73	{
 74		.name			= "pandaboard::status2",
 75		.default_trigger	= "mmc0",
 76		.gpio			= 8,
 77	},
 78};
 79
 80static struct gpio_led_platform_data gpio_led_info = {
 81	.leds		= gpio_leds,
 82	.num_leds	= ARRAY_SIZE(gpio_leds),
 83};
 84
 85static struct platform_device leds_gpio = {
 86	.name	= "leds-gpio",
 87	.id	= -1,
 88	.dev	= {
 89		.platform_data	= &gpio_led_info,
 90	},
 91};
 92
 93static struct platform_device *panda_devices[] __initdata = {
 94	&leds_gpio,
 95	&wl1271_device,
 96};
 97
 98static void __init omap4_panda_init_early(void)
 99{
100	omap2_init_common_infrastructure();
101	omap2_init_common_devices(NULL, NULL);
102}
103
104static const struct usbhs_omap_board_data usbhs_bdata __initconst = {
105	.port_mode[0] = OMAP_EHCI_PORT_MODE_PHY,
106	.port_mode[1] = OMAP_USBHS_PORT_MODE_UNUSED,
107	.port_mode[2] = OMAP_USBHS_PORT_MODE_UNUSED,
108	.phy_reset  = false,
109	.reset_gpio_port[0]  = -EINVAL,
110	.reset_gpio_port[1]  = -EINVAL,
111	.reset_gpio_port[2]  = -EINVAL
112};
113
114static struct gpio panda_ehci_gpios[] __initdata = {
115	{ GPIO_HUB_POWER,	GPIOF_OUT_INIT_LOW,  "hub_power"  },
116	{ GPIO_HUB_NRESET,	GPIOF_OUT_INIT_LOW,  "hub_nreset" },
117};
118
119static void __init omap4_ehci_init(void)
120{
121	int ret;
122	struct clk *phy_ref_clk;
123
124	/* FREF_CLK3 provides the 19.2 MHz reference clock to the PHY */
125	phy_ref_clk = clk_get(NULL, "auxclk3_ck");
126	if (IS_ERR(phy_ref_clk)) {
127		pr_err("Cannot request auxclk3\n");
128		return;
129	}
130	clk_set_rate(phy_ref_clk, 19200000);
131	clk_enable(phy_ref_clk);
132
133	/* disable the power to the usb hub prior to init and reset phy+hub */
134	ret = gpio_request_array(panda_ehci_gpios,
135				 ARRAY_SIZE(panda_ehci_gpios));
136	if (ret) {
137		pr_err("Unable to initialize EHCI power/reset\n");
138		return;
139	}
140
141	gpio_export(GPIO_HUB_POWER, 0);
142	gpio_export(GPIO_HUB_NRESET, 0);
143	gpio_set_value(GPIO_HUB_NRESET, 1);
144
145	usbhs_init(&usbhs_bdata);
146
147	/* enable power to hub */
148	gpio_set_value(GPIO_HUB_POWER, 1);
149}
150
151static struct omap_musb_board_data musb_board_data = {
152	.interface_type		= MUSB_INTERFACE_UTMI,
153	.mode			= MUSB_OTG,
154	.power			= 100,
155};
156
157static struct omap2_hsmmc_info mmc[] = {
158	{
159		.mmc		= 1,
160		.caps		= MMC_CAP_4_BIT_DATA | MMC_CAP_8_BIT_DATA,
161		.gpio_wp	= -EINVAL,
162		.gpio_cd	= -EINVAL,
163	},
164	{
165		.name		= "wl1271",
166		.mmc		= 5,
167		.caps		= MMC_CAP_4_BIT_DATA | MMC_CAP_POWER_OFF_CARD,
168		.gpio_wp	= -EINVAL,
169		.gpio_cd	= -EINVAL,
170		.ocr_mask	= MMC_VDD_165_195,
171		.nonremovable	= true,
172	},
173	{}	/* Terminator */
174};
175
176static struct regulator_consumer_supply omap4_panda_vmmc5_supply[] = {
177	REGULATOR_SUPPLY("vmmc", "omap_hsmmc.4"),
178};
179
180static struct regulator_init_data panda_vmmc5 = {
181	.constraints = {
182		.valid_ops_mask = REGULATOR_CHANGE_STATUS,
183	},
184	.num_consumer_supplies = ARRAY_SIZE(omap4_panda_vmmc5_supply),
185	.consumer_supplies = omap4_panda_vmmc5_supply,
186};
187
188static struct fixed_voltage_config panda_vwlan = {
189	.supply_name = "vwl1271",
190	.microvolts = 1800000, /* 1.8V */
191	.gpio = GPIO_WIFI_PMENA,
192	.startup_delay = 70000, /* 70msec */
193	.enable_high = 1,
194	.enabled_at_boot = 0,
195	.init_data = &panda_vmmc5,
196};
197
198static struct platform_device omap_vwlan_device = {
199	.name		= "reg-fixed-voltage",
200	.id		= 1,
201	.dev = {
202		.platform_data = &panda_vwlan,
203	},
204};
205
206struct wl12xx_platform_data omap_panda_wlan_data  __initdata = {
207	.irq = OMAP_GPIO_IRQ(GPIO_WIFI_IRQ),
208	/* PANDA ref clock is 38.4 MHz */
209	.board_ref_clock = 2,
210};
211
212static int omap4_twl6030_hsmmc_late_init(struct device *dev)
213{
214	int ret = 0;
215	struct platform_device *pdev = container_of(dev,
216				struct platform_device, dev);
217	struct omap_mmc_platform_data *pdata = dev->platform_data;
218
219	if (!pdata) {
220		dev_err(dev, "%s: NULL platform data\n", __func__);
221		return -EINVAL;
222	}
223	/* Setting MMC1 Card detect Irq */
224	if (pdev->id == 0) {
225		ret = twl6030_mmc_card_detect_config();
226		 if (ret)
227			dev_err(dev, "%s: Error card detect config(%d)\n",
228				__func__, ret);
229		 else
230			pdata->slots[0].card_detect = twl6030_mmc_card_detect;
231	}
232	return ret;
233}
234
235static __init void omap4_twl6030_hsmmc_set_late_init(struct device *dev)
236{
237	struct omap_mmc_platform_data *pdata;
238
239	/* dev can be null if CONFIG_MMC_OMAP_HS is not set */
240	if (!dev) {
241		pr_err("Failed omap4_twl6030_hsmmc_set_late_init\n");
242		return;
243	}
244	pdata = dev->platform_data;
245
246	pdata->init =	omap4_twl6030_hsmmc_late_init;
247}
248
249static int __init omap4_twl6030_hsmmc_init(struct omap2_hsmmc_info *controllers)
250{
251	struct omap2_hsmmc_info *c;
252
253	omap2_hsmmc_init(controllers);
254	for (c = controllers; c->mmc; c++)
255		omap4_twl6030_hsmmc_set_late_init(c->dev);
256
257	return 0;
258}
259
260/* Panda board uses the common PMIC configuration */
261static struct twl4030_platform_data omap4_panda_twldata;
262
263/*
264 * Display monitor features are burnt in their EEPROM as EDID data. The EEPROM
265 * is connected as I2C slave device, and can be accessed at address 0x50
266 */
267static struct i2c_board_info __initdata panda_i2c_eeprom[] = {
268	{
269		I2C_BOARD_INFO("eeprom", 0x50),
270	},
271};
272
273static int __init omap4_panda_i2c_init(void)
274{
275	omap4_pmic_get_config(&omap4_panda_twldata, TWL_COMMON_PDATA_USB,
276			TWL_COMMON_REGULATOR_VDAC |
277			TWL_COMMON_REGULATOR_VAUX2 |
278			TWL_COMMON_REGULATOR_VAUX3 |
279			TWL_COMMON_REGULATOR_VMMC |
280			TWL_COMMON_REGULATOR_VPP |
281			TWL_COMMON_REGULATOR_VANA |
282			TWL_COMMON_REGULATOR_VCXIO |
283			TWL_COMMON_REGULATOR_VUSB |
284			TWL_COMMON_REGULATOR_CLK32KG);
285	omap4_pmic_init("twl6030", &omap4_panda_twldata);
286	omap_register_i2c_bus(2, 400, NULL, 0);
287	/*
288	 * Bus 3 is attached to the DVI port where devices like the pico DLP
289	 * projector don't work reliably with 400kHz
290	 */
291	omap_register_i2c_bus(3, 100, panda_i2c_eeprom,
292					ARRAY_SIZE(panda_i2c_eeprom));
293	omap_register_i2c_bus(4, 400, NULL, 0);
294	return 0;
295}
296
297#ifdef CONFIG_OMAP_MUX
298static struct omap_board_mux board_mux[] __initdata = {
299	/* WLAN IRQ - GPIO 53 */
300	OMAP4_MUX(GPMC_NCS3, OMAP_MUX_MODE3 | OMAP_PIN_INPUT),
301	/* WLAN POWER ENABLE - GPIO 43 */
302	OMAP4_MUX(GPMC_A19, OMAP_MUX_MODE3 | OMAP_PIN_OUTPUT),
303	/* WLAN SDIO: MMC5 CMD */
304	OMAP4_MUX(SDMMC5_CMD, OMAP_MUX_MODE0 | OMAP_PIN_INPUT_PULLUP),
305	/* WLAN SDIO: MMC5 CLK */
306	OMAP4_MUX(SDMMC5_CLK, OMAP_MUX_MODE0 | OMAP_PIN_INPUT_PULLUP),
307	/* WLAN SDIO: MMC5 DAT[0-3] */
308	OMAP4_MUX(SDMMC5_DAT0, OMAP_MUX_MODE0 | OMAP_PIN_INPUT_PULLUP),
309	OMAP4_MUX(SDMMC5_DAT1, OMAP_MUX_MODE0 | OMAP_PIN_INPUT_PULLUP),
310	OMAP4_MUX(SDMMC5_DAT2, OMAP_MUX_MODE0 | OMAP_PIN_INPUT_PULLUP),
311	OMAP4_MUX(SDMMC5_DAT3, OMAP_MUX_MODE0 | OMAP_PIN_INPUT_PULLUP),
312	/* gpio 0 - TFP410 PD */
313	OMAP4_MUX(KPD_COL1, OMAP_PIN_OUTPUT | OMAP_MUX_MODE3),
314	/* dispc2_data23 */
315	OMAP4_MUX(USBB2_ULPITLL_STP, OMAP_PIN_OUTPUT | OMAP_MUX_MODE5),
316	/* dispc2_data22 */
317	OMAP4_MUX(USBB2_ULPITLL_DIR, OMAP_PIN_OUTPUT | OMAP_MUX_MODE5),
318	/* dispc2_data21 */
319	OMAP4_MUX(USBB2_ULPITLL_NXT, OMAP_PIN_OUTPUT | OMAP_MUX_MODE5),
320	/* dispc2_data20 */
321	OMAP4_MUX(USBB2_ULPITLL_DAT0, OMAP_PIN_OUTPUT | OMAP_MUX_MODE5),
322	/* dispc2_data19 */
323	OMAP4_MUX(USBB2_ULPITLL_DAT1, OMAP_PIN_OUTPUT | OMAP_MUX_MODE5),
324	/* dispc2_data18 */
325	OMAP4_MUX(USBB2_ULPITLL_DAT2, OMAP_PIN_OUTPUT | OMAP_MUX_MODE5),
326	/* dispc2_data15 */
327	OMAP4_MUX(USBB2_ULPITLL_DAT3, OMAP_PIN_OUTPUT | OMAP_MUX_MODE5),
328	/* dispc2_data14 */
329	OMAP4_MUX(USBB2_ULPITLL_DAT4, OMAP_PIN_OUTPUT | OMAP_MUX_MODE5),
330	/* dispc2_data13 */
331	OMAP4_MUX(USBB2_ULPITLL_DAT5, OMAP_PIN_OUTPUT | OMAP_MUX_MODE5),
332	/* dispc2_data12 */
333	OMAP4_MUX(USBB2_ULPITLL_DAT6, OMAP_PIN_OUTPUT | OMAP_MUX_MODE5),
334	/* dispc2_data11 */
335	OMAP4_MUX(USBB2_ULPITLL_DAT7, OMAP_PIN_OUTPUT | OMAP_MUX_MODE5),
336	/* dispc2_data10 */
337	OMAP4_MUX(DPM_EMU3, OMAP_PIN_OUTPUT | OMAP_MUX_MODE5),
338	/* dispc2_data9 */
339	OMAP4_MUX(DPM_EMU4, OMAP_PIN_OUTPUT | OMAP_MUX_MODE5),
340	/* dispc2_data16 */
341	OMAP4_MUX(DPM_EMU5, OMAP_PIN_OUTPUT | OMAP_MUX_MODE5),
342	/* dispc2_data17 */
343	OMAP4_MUX(DPM_EMU6, OMAP_PIN_OUTPUT | OMAP_MUX_MODE5),
344	/* dispc2_hsync */
345	OMAP4_MUX(DPM_EMU7, OMAP_PIN_OUTPUT | OMAP_MUX_MODE5),
346	/* dispc2_pclk */
347	OMAP4_MUX(DPM_EMU8, OMAP_PIN_OUTPUT | OMAP_MUX_MODE5),
348	/* dispc2_vsync */
349	OMAP4_MUX(DPM_EMU9, OMAP_PIN_OUTPUT | OMAP_MUX_MODE5),
350	/* dispc2_de */
351	OMAP4_MUX(DPM_EMU10, OMAP_PIN_OUTPUT | OMAP_MUX_MODE5),
352	/* dispc2_data8 */
353	OMAP4_MUX(DPM_EMU11, OMAP_PIN_OUTPUT | OMAP_MUX_MODE5),
354	/* dispc2_data7 */
355	OMAP4_MUX(DPM_EMU12, OMAP_PIN_OUTPUT | OMAP_MUX_MODE5),
356	/* dispc2_data6 */
357	OMAP4_MUX(DPM_EMU13, OMAP_PIN_OUTPUT | OMAP_MUX_MODE5),
358	/* dispc2_data5 */
359	OMAP4_MUX(DPM_EMU14, OMAP_PIN_OUTPUT | OMAP_MUX_MODE5),
360	/* dispc2_data4 */
361	OMAP4_MUX(DPM_EMU15, OMAP_PIN_OUTPUT | OMAP_MUX_MODE5),
362	/* dispc2_data3 */
363	OMAP4_MUX(DPM_EMU16, OMAP_PIN_OUTPUT | OMAP_MUX_MODE5),
364	/* dispc2_data2 */
365	OMAP4_MUX(DPM_EMU17, OMAP_PIN_OUTPUT | OMAP_MUX_MODE5),
366	/* dispc2_data1 */
367	OMAP4_MUX(DPM_EMU18, OMAP_PIN_OUTPUT | OMAP_MUX_MODE5),
368	/* dispc2_data0 */
369	OMAP4_MUX(DPM_EMU19, OMAP_PIN_OUTPUT | OMAP_MUX_MODE5),
370	{ .reg_offset = OMAP_MUX_TERMINATOR },
371};
372
373static struct omap_device_pad serial2_pads[] __initdata = {
374	OMAP_MUX_STATIC("uart2_cts.uart2_cts",
375			 OMAP_PIN_INPUT_PULLUP | OMAP_MUX_MODE0),
376	OMAP_MUX_STATIC("uart2_rts.uart2_rts",
377			 OMAP_PIN_OUTPUT | OMAP_MUX_MODE0),
378	OMAP_MUX_STATIC("uart2_rx.uart2_rx",
379			 OMAP_PIN_INPUT_PULLUP | OMAP_MUX_MODE0),
380	OMAP_MUX_STATIC("uart2_tx.uart2_tx",
381			 OMAP_PIN_OUTPUT | OMAP_MUX_MODE0),
382};
383
384static struct omap_device_pad serial3_pads[] __initdata = {
385	OMAP_MUX_STATIC("uart3_cts_rctx.uart3_cts_rctx",
386			 OMAP_PIN_INPUT_PULLUP | OMAP_MUX_MODE0),
387	OMAP_MUX_STATIC("uart3_rts_sd.uart3_rts_sd",
388			 OMAP_PIN_OUTPUT | OMAP_MUX_MODE0),
389	OMAP_MUX_STATIC("uart3_rx_irrx.uart3_rx_irrx",
390			 OMAP_PIN_INPUT | OMAP_MUX_MODE0),
391	OMAP_MUX_STATIC("uart3_tx_irtx.uart3_tx_irtx",
392			 OMAP_PIN_OUTPUT | OMAP_MUX_MODE0),
393};
394
395static struct omap_device_pad serial4_pads[] __initdata = {
396	OMAP_MUX_STATIC("uart4_rx.uart4_rx",
397			 OMAP_PIN_INPUT | OMAP_MUX_MODE0),
398	OMAP_MUX_STATIC("uart4_tx.uart4_tx",
399			 OMAP_PIN_OUTPUT | OMAP_MUX_MODE0),
400};
401
402static struct omap_board_data serial2_data __initdata = {
403	.id             = 1,
404	.pads           = serial2_pads,
405	.pads_cnt       = ARRAY_SIZE(serial2_pads),
406};
407
408static struct omap_board_data serial3_data __initdata = {
409	.id             = 2,
410	.pads           = serial3_pads,
411	.pads_cnt       = ARRAY_SIZE(serial3_pads),
412};
413
414static struct omap_board_data serial4_data __initdata = {
415	.id             = 3,
416	.pads           = serial4_pads,
417	.pads_cnt       = ARRAY_SIZE(serial4_pads),
418};
419
420static inline void board_serial_init(void)
421{
422	struct omap_board_data bdata;
423	bdata.flags     = 0;
424	bdata.pads      = NULL;
425	bdata.pads_cnt  = 0;
426	bdata.id        = 0;
427	/* pass dummy data for UART1 */
428	omap_serial_init_port(&bdata);
429
430	omap_serial_init_port(&serial2_data);
431	omap_serial_init_port(&serial3_data);
432	omap_serial_init_port(&serial4_data);
433}
434#else
435#define board_mux	NULL
436
437static inline void board_serial_init(void)
438{
439	omap_serial_init();
440}
441#endif
442
443/* Display DVI */
444#define PANDA_DVI_TFP410_POWER_DOWN_GPIO	0
445
446static int omap4_panda_enable_dvi(struct omap_dss_device *dssdev)
447{
448	gpio_set_value(dssdev->reset_gpio, 1);
449	return 0;
450}
451
452static void omap4_panda_disable_dvi(struct omap_dss_device *dssdev)
453{
454	gpio_set_value(dssdev->reset_gpio, 0);
455}
456
457/* Using generic display panel */
458static struct panel_generic_dpi_data omap4_dvi_panel = {
459	.name			= "generic",
460	.platform_enable	= omap4_panda_enable_dvi,
461	.platform_disable	= omap4_panda_disable_dvi,
462};
463
464struct omap_dss_device omap4_panda_dvi_device = {
465	.type			= OMAP_DISPLAY_TYPE_DPI,
466	.name			= "dvi",
467	.driver_name		= "generic_dpi_panel",
468	.data			= &omap4_dvi_panel,
469	.phy.dpi.data_lines	= 24,
470	.reset_gpio		= PANDA_DVI_TFP410_POWER_DOWN_GPIO,
471	.channel		= OMAP_DSS_CHANNEL_LCD2,
472};
473
474int __init omap4_panda_dvi_init(void)
475{
476	int r;
477
478	/* Requesting TFP410 DVI GPIO and disabling it, at bootup */
479	r = gpio_request_one(omap4_panda_dvi_device.reset_gpio,
480				GPIOF_OUT_INIT_LOW, "DVI PD");
481	if (r)
482		pr_err("Failed to get DVI powerdown GPIO\n");
483
484	return r;
485}
486
487
488static void omap4_panda_hdmi_mux_init(void)
489{
490	/* PAD0_HDMI_HPD_PAD1_HDMI_CEC */
491	omap_mux_init_signal("hdmi_hpd",
492			OMAP_PIN_INPUT_PULLUP);
493	omap_mux_init_signal("hdmi_cec",
494			OMAP_PIN_INPUT_PULLUP);
495	/* PAD0_HDMI_DDC_SCL_PAD1_HDMI_DDC_SDA */
496	omap_mux_init_signal("hdmi_ddc_scl",
497			OMAP_PIN_INPUT_PULLUP);
498	omap_mux_init_signal("hdmi_ddc_sda",
499			OMAP_PIN_INPUT_PULLUP);
500}
501
502static struct gpio panda_hdmi_gpios[] = {
503	{ HDMI_GPIO_HPD,	GPIOF_OUT_INIT_HIGH, "hdmi_gpio_hpd"   },
504	{ HDMI_GPIO_LS_OE,	GPIOF_OUT_INIT_HIGH, "hdmi_gpio_ls_oe" },
505};
506
507static int omap4_panda_panel_enable_hdmi(struct omap_dss_device *dssdev)
508{
509	int status;
510
511	status = gpio_request_array(panda_hdmi_gpios,
512				    ARRAY_SIZE(panda_hdmi_gpios));
513	if (status)
514		pr_err("Cannot request HDMI GPIOs\n");
515
516	return status;
517}
518
519static void omap4_panda_panel_disable_hdmi(struct omap_dss_device *dssdev)
520{
521	gpio_free(HDMI_GPIO_LS_OE);
522	gpio_free(HDMI_GPIO_HPD);
523}
524
525static struct omap_dss_device  omap4_panda_hdmi_device = {
526	.name = "hdmi",
527	.driver_name = "hdmi_panel",
528	.type = OMAP_DISPLAY_TYPE_HDMI,
529	.platform_enable = omap4_panda_panel_enable_hdmi,
530	.platform_disable = omap4_panda_panel_disable_hdmi,
531	.channel = OMAP_DSS_CHANNEL_DIGIT,
532};
533
534static struct omap_dss_device *omap4_panda_dss_devices[] = {
535	&omap4_panda_dvi_device,
536	&omap4_panda_hdmi_device,
537};
538
539static struct omap_dss_board_info omap4_panda_dss_data = {
540	.num_devices	= ARRAY_SIZE(omap4_panda_dss_devices),
541	.devices	= omap4_panda_dss_devices,
542	.default_device	= &omap4_panda_dvi_device,
543};
544
545void omap4_panda_display_init(void)
546{
547	int r;
548
549	r = omap4_panda_dvi_init();
550	if (r)
551		pr_err("error initializing panda DVI\n");
552
553	omap4_panda_hdmi_mux_init();
554	omap_display_init(&omap4_panda_dss_data);
555}
556
557static void __init omap4_panda_init(void)
558{
559	int package = OMAP_PACKAGE_CBS;
560
561	if (omap_rev() == OMAP4430_REV_ES1_0)
562		package = OMAP_PACKAGE_CBL;
563	omap4_mux_init(board_mux, NULL, package);
564
565	if (wl12xx_set_platform_data(&omap_panda_wlan_data))
566		pr_err("error setting wl12xx data\n");
567
568	omap4_panda_i2c_init();
569	platform_add_devices(panda_devices, ARRAY_SIZE(panda_devices));
570	platform_device_register(&omap_vwlan_device);
571	board_serial_init();
572	omap4_twl6030_hsmmc_init(mmc);
573	omap4_ehci_init();
574	usb_musb_init(&musb_board_data);
575	omap4_panda_display_init();
576}
577
578static void __init omap4_panda_map_io(void)
579{
580	omap2_set_globals_443x();
581	omap44xx_map_common_io();
582}
583
584MACHINE_START(OMAP4_PANDA, "OMAP4 Panda board")
585	/* Maintainer: David Anders - Texas Instruments Inc */
586	.boot_params	= 0x80000100,
587	.reserve	= omap_reserve,
588	.map_io		= omap4_panda_map_io,
589	.init_early	= omap4_panda_init_early,
590	.init_irq	= gic_init_irq,
591	.init_machine	= omap4_panda_init,
592	.timer		= &omap4_timer,
593MACHINE_END