14c243c8584be9fbff9e11fc37fa2449448c5d442Daniel Mack/*
2a3172e5413a06af772c6ad34c0f68a2ebbdbcf86Marek Vasut *  linux/arch/arm/mach-pxa/colibri-evalboard.c
34c243c8584be9fbff9e11fc37fa2449448c5d442Daniel Mack *
4a3172e5413a06af772c6ad34c0f68a2ebbdbcf86Marek Vasut *  Support for Toradex Colibri Evaluation Carrier Board
54c243c8584be9fbff9e11fc37fa2449448c5d442Daniel Mack *  Daniel Mack <daniel@caiaq.de>
64c243c8584be9fbff9e11fc37fa2449448c5d442Daniel Mack *  Marek Vasut <marek.vasut@gmail.com>
74c243c8584be9fbff9e11fc37fa2449448c5d442Daniel Mack *
84c243c8584be9fbff9e11fc37fa2449448c5d442Daniel Mack *  This program is free software; you can redistribute it and/or modify
94c243c8584be9fbff9e11fc37fa2449448c5d442Daniel Mack *  it under the terms of the GNU General Public License version 2 as
104c243c8584be9fbff9e11fc37fa2449448c5d442Daniel Mack *  published by the Free Software Foundation.
114c243c8584be9fbff9e11fc37fa2449448c5d442Daniel Mack */
124c243c8584be9fbff9e11fc37fa2449448c5d442Daniel Mack
134c243c8584be9fbff9e11fc37fa2449448c5d442Daniel Mack#include <linux/init.h>
144c243c8584be9fbff9e11fc37fa2449448c5d442Daniel Mack#include <linux/kernel.h>
154c243c8584be9fbff9e11fc37fa2449448c5d442Daniel Mack#include <linux/platform_device.h>
164c243c8584be9fbff9e11fc37fa2449448c5d442Daniel Mack#include <linux/interrupt.h>
174c243c8584be9fbff9e11fc37fa2449448c5d442Daniel Mack#include <linux/gpio.h>
184c243c8584be9fbff9e11fc37fa2449448c5d442Daniel Mack#include <asm/mach-types.h>
194c243c8584be9fbff9e11fc37fa2449448c5d442Daniel Mack#include <mach/hardware.h>
204c243c8584be9fbff9e11fc37fa2449448c5d442Daniel Mack#include <asm/mach/arch.h>
21072e1ae73c65496355279505de378b33c916e364Marek Vasut#include <linux/i2c.h>
22b459396ee9398bdf61e3118ca730394f58e90c9cSebastian Andrzej Siewior#include <linux/i2c/pxa-i2c.h>
234c243c8584be9fbff9e11fc37fa2449448c5d442Daniel Mack
244c243c8584be9fbff9e11fc37fa2449448c5d442Daniel Mack#include <mach/pxa27x.h>
254c243c8584be9fbff9e11fc37fa2449448c5d442Daniel Mack#include <mach/colibri.h>
264c243c8584be9fbff9e11fc37fa2449448c5d442Daniel Mack#include <mach/mmc.h>
274c243c8584be9fbff9e11fc37fa2449448c5d442Daniel Mack#include <mach/ohci.h>
284c243c8584be9fbff9e11fc37fa2449448c5d442Daniel Mack#include <mach/pxa27x-udc.h>
294c243c8584be9fbff9e11fc37fa2449448c5d442Daniel Mack
304c243c8584be9fbff9e11fc37fa2449448c5d442Daniel Mack#include "generic.h"
314c243c8584be9fbff9e11fc37fa2449448c5d442Daniel Mack#include "devices.h"
324c243c8584be9fbff9e11fc37fa2449448c5d442Daniel Mack
334c243c8584be9fbff9e11fc37fa2449448c5d442Daniel Mack/******************************************************************************
344c243c8584be9fbff9e11fc37fa2449448c5d442Daniel Mack * SD/MMC card controller
354c243c8584be9fbff9e11fc37fa2449448c5d442Daniel Mack ******************************************************************************/
364c243c8584be9fbff9e11fc37fa2449448c5d442Daniel Mack#if defined(CONFIG_MMC_PXA) || defined(CONFIG_MMC_PXA_MODULE)
37a3172e5413a06af772c6ad34c0f68a2ebbdbcf86Marek Vasutstatic struct pxamci_platform_data colibri_mci_platform_data = {
384c243c8584be9fbff9e11fc37fa2449448c5d442Daniel Mack	.ocr_mask		= MMC_VDD_32_33 | MMC_VDD_33_34,
394c243c8584be9fbff9e11fc37fa2449448c5d442Daniel Mack	.gpio_power		= -1,
404c243c8584be9fbff9e11fc37fa2449448c5d442Daniel Mack	.gpio_card_ro		= -1,
414c243c8584be9fbff9e11fc37fa2449448c5d442Daniel Mack	.detect_delay_ms	= 200,
424c243c8584be9fbff9e11fc37fa2449448c5d442Daniel Mack};
434c243c8584be9fbff9e11fc37fa2449448c5d442Daniel Mack
44a3172e5413a06af772c6ad34c0f68a2ebbdbcf86Marek Vasutstatic void __init colibri_mmc_init(void)
454c243c8584be9fbff9e11fc37fa2449448c5d442Daniel Mack{
469b6956f45132f9bf696e9f6c2e457bdfa8e08721Marek Vasut	if (machine_is_colibri())	/* PXA270 Colibri */
47a3172e5413a06af772c6ad34c0f68a2ebbdbcf86Marek Vasut		colibri_mci_platform_data.gpio_card_detect =
489b6956f45132f9bf696e9f6c2e457bdfa8e08721Marek Vasut			GPIO0_COLIBRI_PXA270_SD_DETECT;
499b6956f45132f9bf696e9f6c2e457bdfa8e08721Marek Vasut	if (machine_is_colibri300())	/* PXA300 Colibri */
50a3172e5413a06af772c6ad34c0f68a2ebbdbcf86Marek Vasut		colibri_mci_platform_data.gpio_card_detect =
5157834a722473848338b1967f7fdd9907c713b0a7Bjørn Forsman			GPIO13_COLIBRI_PXA300_SD_DETECT;
529b6956f45132f9bf696e9f6c2e457bdfa8e08721Marek Vasut	else				/* PXA320 Colibri */
53a3172e5413a06af772c6ad34c0f68a2ebbdbcf86Marek Vasut		colibri_mci_platform_data.gpio_card_detect =
549b6956f45132f9bf696e9f6c2e457bdfa8e08721Marek Vasut			GPIO28_COLIBRI_PXA320_SD_DETECT;
559b6956f45132f9bf696e9f6c2e457bdfa8e08721Marek Vasut
56a3172e5413a06af772c6ad34c0f68a2ebbdbcf86Marek Vasut	pxa_set_mci_info(&colibri_mci_platform_data);
574c243c8584be9fbff9e11fc37fa2449448c5d442Daniel Mack}
584c243c8584be9fbff9e11fc37fa2449448c5d442Daniel Mack#else
59a3172e5413a06af772c6ad34c0f68a2ebbdbcf86Marek Vasutstatic inline void colibri_mmc_init(void) {}
604c243c8584be9fbff9e11fc37fa2449448c5d442Daniel Mack#endif
614c243c8584be9fbff9e11fc37fa2449448c5d442Daniel Mack
624c243c8584be9fbff9e11fc37fa2449448c5d442Daniel Mack/******************************************************************************
634c243c8584be9fbff9e11fc37fa2449448c5d442Daniel Mack * USB Host
644c243c8584be9fbff9e11fc37fa2449448c5d442Daniel Mack ******************************************************************************/
654c243c8584be9fbff9e11fc37fa2449448c5d442Daniel Mack#if defined(CONFIG_USB_OHCI_HCD) || defined(CONFIG_USB_OHCI_HCD_MODULE)
66a3172e5413a06af772c6ad34c0f68a2ebbdbcf86Marek Vasutstatic int colibri_ohci_init(struct device *dev)
674c243c8584be9fbff9e11fc37fa2449448c5d442Daniel Mack{
684c243c8584be9fbff9e11fc37fa2449448c5d442Daniel Mack	UP2OCR = UP2OCR_HXS | UP2OCR_HXOE | UP2OCR_DPPDE | UP2OCR_DMPDE;
694c243c8584be9fbff9e11fc37fa2449448c5d442Daniel Mack	return 0;
704c243c8584be9fbff9e11fc37fa2449448c5d442Daniel Mack}
714c243c8584be9fbff9e11fc37fa2449448c5d442Daniel Mack
72a3172e5413a06af772c6ad34c0f68a2ebbdbcf86Marek Vasutstatic struct pxaohci_platform_data colibri_ohci_info = {
734c243c8584be9fbff9e11fc37fa2449448c5d442Daniel Mack	.port_mode	= PMM_PERPORT_MODE,
749b6956f45132f9bf696e9f6c2e457bdfa8e08721Marek Vasut	.flags		= ENABLE_PORT1 |
754c243c8584be9fbff9e11fc37fa2449448c5d442Daniel Mack			  POWER_CONTROL_LOW | POWER_SENSE_LOW,
76a3172e5413a06af772c6ad34c0f68a2ebbdbcf86Marek Vasut	.init		= colibri_ohci_init,
774c243c8584be9fbff9e11fc37fa2449448c5d442Daniel Mack};
784c243c8584be9fbff9e11fc37fa2449448c5d442Daniel Mack
79a3172e5413a06af772c6ad34c0f68a2ebbdbcf86Marek Vasutstatic void __init colibri_uhc_init(void)
804c243c8584be9fbff9e11fc37fa2449448c5d442Daniel Mack{
819b6956f45132f9bf696e9f6c2e457bdfa8e08721Marek Vasut	/* Colibri PXA270 has two usb ports, TBA for 320 */
829b6956f45132f9bf696e9f6c2e457bdfa8e08721Marek Vasut	if (machine_is_colibri())
83a3172e5413a06af772c6ad34c0f68a2ebbdbcf86Marek Vasut		colibri_ohci_info.flags	|= ENABLE_PORT2;
849b6956f45132f9bf696e9f6c2e457bdfa8e08721Marek Vasut
85a3172e5413a06af772c6ad34c0f68a2ebbdbcf86Marek Vasut	pxa_set_ohci_info(&colibri_ohci_info);
864c243c8584be9fbff9e11fc37fa2449448c5d442Daniel Mack}
874c243c8584be9fbff9e11fc37fa2449448c5d442Daniel Mack#else
88a3172e5413a06af772c6ad34c0f68a2ebbdbcf86Marek Vasutstatic inline void colibri_uhc_init(void) {}
894c243c8584be9fbff9e11fc37fa2449448c5d442Daniel Mack#endif
904c243c8584be9fbff9e11fc37fa2449448c5d442Daniel Mack
91072e1ae73c65496355279505de378b33c916e364Marek Vasut/******************************************************************************
92072e1ae73c65496355279505de378b33c916e364Marek Vasut * I2C RTC
93072e1ae73c65496355279505de378b33c916e364Marek Vasut ******************************************************************************/
94072e1ae73c65496355279505de378b33c916e364Marek Vasut#if defined(CONFIG_RTC_DRV_DS1307) || defined(CONFIG_RTC_DRV_DS1307_MODULE)
95a3172e5413a06af772c6ad34c0f68a2ebbdbcf86Marek Vasutstatic struct i2c_board_info __initdata colibri_i2c_devs[] = {
96072e1ae73c65496355279505de378b33c916e364Marek Vasut	{
97072e1ae73c65496355279505de378b33c916e364Marek Vasut		I2C_BOARD_INFO("m41t00", 0x68),
98072e1ae73c65496355279505de378b33c916e364Marek Vasut	},
99072e1ae73c65496355279505de378b33c916e364Marek Vasut};
100072e1ae73c65496355279505de378b33c916e364Marek Vasut
101a3172e5413a06af772c6ad34c0f68a2ebbdbcf86Marek Vasutstatic void __init colibri_rtc_init(void)
102072e1ae73c65496355279505de378b33c916e364Marek Vasut{
103072e1ae73c65496355279505de378b33c916e364Marek Vasut	pxa_set_i2c_info(NULL);
104a3172e5413a06af772c6ad34c0f68a2ebbdbcf86Marek Vasut	i2c_register_board_info(0, ARRAY_AND_SIZE(colibri_i2c_devs));
105072e1ae73c65496355279505de378b33c916e364Marek Vasut}
106072e1ae73c65496355279505de378b33c916e364Marek Vasut#else
107a3172e5413a06af772c6ad34c0f68a2ebbdbcf86Marek Vasutstatic inline void colibri_rtc_init(void) {}
108072e1ae73c65496355279505de378b33c916e364Marek Vasut#endif
109072e1ae73c65496355279505de378b33c916e364Marek Vasut
110a3172e5413a06af772c6ad34c0f68a2ebbdbcf86Marek Vasutvoid __init colibri_evalboard_init(void)
1114c243c8584be9fbff9e11fc37fa2449448c5d442Daniel Mack{
1124c243c8584be9fbff9e11fc37fa2449448c5d442Daniel Mack	pxa_set_ffuart_info(NULL);
1134c243c8584be9fbff9e11fc37fa2449448c5d442Daniel Mack	pxa_set_btuart_info(NULL);
1144c243c8584be9fbff9e11fc37fa2449448c5d442Daniel Mack	pxa_set_stuart_info(NULL);
1154c243c8584be9fbff9e11fc37fa2449448c5d442Daniel Mack
116a3172e5413a06af772c6ad34c0f68a2ebbdbcf86Marek Vasut	colibri_mmc_init();
117a3172e5413a06af772c6ad34c0f68a2ebbdbcf86Marek Vasut	colibri_uhc_init();
118a3172e5413a06af772c6ad34c0f68a2ebbdbcf86Marek Vasut	colibri_rtc_init();
1194c243c8584be9fbff9e11fc37fa2449448c5d442Daniel Mack}
120