2019-06-04 11:11:33 +03:00
// SPDX-License-Identifier: GPL-2.0-only
2010-05-22 02:29:38 +04:00
/*
2010-08-12 03:45:05 +04:00
* linux / arch / arm / mach - pxa / colibri - evalboard . c
2010-05-22 02:29:38 +04:00
*
2010-08-12 03:45:05 +04:00
* Support for Toradex Colibri Evaluation Carrier Board
2010-05-22 02:29:38 +04:00
* Daniel Mack < daniel @ caiaq . de >
* Marek Vasut < marek . vasut @ gmail . com >
*/
# include <linux/init.h>
# include <linux/kernel.h>
# include <linux/platform_device.h>
# include <linux/interrupt.h>
2018-12-02 11:43:22 +03:00
# include <linux/gpio/machine.h>
2010-05-22 02:29:38 +04:00
# include <asm/mach-types.h>
# include <mach/hardware.h>
# include <asm/mach/arch.h>
2010-08-12 03:30:39 +04:00
# include <linux/i2c.h>
2017-11-13 20:27:39 +03:00
# include <linux/platform_data/i2c-pxa.h>
2014-03-16 23:36:28 +04:00
# include <asm/io.h>
2010-05-22 02:29:38 +04:00
2015-01-30 12:45:33 +03:00
# include "pxa27x.h"
# include "colibri.h"
2012-08-24 17:16:48 +04:00
# include <linux/platform_data/mmc-pxamci.h>
# include <linux/platform_data/usb-ohci-pxa27x.h>
2015-01-30 12:45:33 +03:00
# include "pxa27x-udc.h"
2010-05-22 02:29:38 +04:00
# include "generic.h"
# include "devices.h"
/******************************************************************************
* SD / MMC card controller
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
# if defined(CONFIG_MMC_PXA) || defined(CONFIG_MMC_PXA_MODULE)
2010-08-12 03:45:05 +04:00
static struct pxamci_platform_data colibri_mci_platform_data = {
2010-05-22 02:29:38 +04:00
. ocr_mask = MMC_VDD_32_33 | MMC_VDD_33_34 ,
. detect_delay_ms = 200 ,
} ;
2018-12-02 11:43:22 +03:00
static struct gpiod_lookup_table colibri_pxa270_mci_gpio_table = {
. dev_id = " pxa2xx-mci.0 " ,
. table = {
GPIO_LOOKUP ( " gpio-pxa " , GPIO0_COLIBRI_PXA270_SD_DETECT ,
" cd " , GPIO_ACTIVE_LOW ) ,
{ } ,
} ,
} ;
static struct gpiod_lookup_table colibri_pxa300_mci_gpio_table = {
. dev_id = " pxa2xx-mci.0 " ,
. table = {
GPIO_LOOKUP ( " gpio-pxa " , GPIO13_COLIBRI_PXA300_SD_DETECT ,
" cd " , GPIO_ACTIVE_LOW ) ,
{ } ,
} ,
} ;
static struct gpiod_lookup_table colibri_pxa320_mci_gpio_table = {
. dev_id = " pxa2xx-mci.0 " ,
. table = {
GPIO_LOOKUP ( " gpio-pxa " , GPIO28_COLIBRI_PXA320_SD_DETECT ,
" cd " , GPIO_ACTIVE_LOW ) ,
{ } ,
} ,
} ;
2010-08-12 03:45:05 +04:00
static void __init colibri_mmc_init ( void )
2010-05-22 02:29:38 +04:00
{
2018-12-02 11:43:25 +03:00
if ( machine_is_colibri ( ) ) /* PXA270 Colibri */
2018-12-02 11:43:22 +03:00
gpiod_add_lookup_table ( & colibri_pxa270_mci_gpio_table ) ;
2018-12-02 11:43:25 +03:00
if ( machine_is_colibri300 ( ) ) /* PXA300 Colibri */
2018-12-02 11:43:22 +03:00
gpiod_add_lookup_table ( & colibri_pxa300_mci_gpio_table ) ;
2018-12-02 11:43:25 +03:00
else /* PXA320 Colibri */
2018-12-02 11:43:22 +03:00
gpiod_add_lookup_table ( & colibri_pxa320_mci_gpio_table ) ;
2010-08-12 03:18:38 +04:00
2010-08-12 03:45:05 +04:00
pxa_set_mci_info ( & colibri_mci_platform_data ) ;
2010-05-22 02:29:38 +04:00
}
# else
2010-08-12 03:45:05 +04:00
static inline void colibri_mmc_init ( void ) { }
2010-05-22 02:29:38 +04:00
# endif
/******************************************************************************
* USB Host
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
# if defined(CONFIG_USB_OHCI_HCD) || defined(CONFIG_USB_OHCI_HCD_MODULE)
2010-08-12 03:45:05 +04:00
static int colibri_ohci_init ( struct device * dev )
2010-05-22 02:29:38 +04:00
{
UP2OCR = UP2OCR_HXS | UP2OCR_HXOE | UP2OCR_DPPDE | UP2OCR_DMPDE ;
return 0 ;
}
2010-08-12 03:45:05 +04:00
static struct pxaohci_platform_data colibri_ohci_info = {
2010-05-22 02:29:38 +04:00
. port_mode = PMM_PERPORT_MODE ,
2010-08-12 03:18:38 +04:00
. flags = ENABLE_PORT1 |
2010-05-22 02:29:38 +04:00
POWER_CONTROL_LOW | POWER_SENSE_LOW ,
2010-08-12 03:45:05 +04:00
. init = colibri_ohci_init ,
2010-05-22 02:29:38 +04:00
} ;
2010-08-12 03:45:05 +04:00
static void __init colibri_uhc_init ( void )
2010-05-22 02:29:38 +04:00
{
2010-08-12 03:18:38 +04:00
/* Colibri PXA270 has two usb ports, TBA for 320 */
if ( machine_is_colibri ( ) )
2010-08-12 03:45:05 +04:00
colibri_ohci_info . flags | = ENABLE_PORT2 ;
2010-08-12 03:18:38 +04:00
2010-08-12 03:45:05 +04:00
pxa_set_ohci_info ( & colibri_ohci_info ) ;
2010-05-22 02:29:38 +04:00
}
# else
2010-08-12 03:45:05 +04:00
static inline void colibri_uhc_init ( void ) { }
2010-05-22 02:29:38 +04:00
# endif
2010-08-12 03:30:39 +04:00
/******************************************************************************
* I2C RTC
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
# if defined(CONFIG_RTC_DRV_DS1307) || defined(CONFIG_RTC_DRV_DS1307_MODULE)
2010-08-12 03:45:05 +04:00
static struct i2c_board_info __initdata colibri_i2c_devs [ ] = {
2010-08-12 03:30:39 +04:00
{
I2C_BOARD_INFO ( " m41t00 " , 0x68 ) ,
} ,
} ;
2010-08-12 03:45:05 +04:00
static void __init colibri_rtc_init ( void )
2010-08-12 03:30:39 +04:00
{
pxa_set_i2c_info ( NULL ) ;
2010-08-12 03:45:05 +04:00
i2c_register_board_info ( 0 , ARRAY_AND_SIZE ( colibri_i2c_devs ) ) ;
2010-08-12 03:30:39 +04:00
}
# else
2010-08-12 03:45:05 +04:00
static inline void colibri_rtc_init ( void ) { }
2010-08-12 03:30:39 +04:00
# endif
2010-08-12 03:45:05 +04:00
void __init colibri_evalboard_init ( void )
2010-05-22 02:29:38 +04:00
{
pxa_set_ffuart_info ( NULL ) ;
pxa_set_btuart_info ( NULL ) ;
pxa_set_stuart_info ( NULL ) ;
2010-08-12 03:45:05 +04:00
colibri_mmc_init ( ) ;
colibri_uhc_init ( ) ;
colibri_rtc_init ( ) ;
2010-05-22 02:29:38 +04:00
}