2010-09-23 20:28:40 +04:00
/*
* Hawkboard . org based on TI ' s OMAP - L138 Platform
*
* Initial code : Syed Mohammed Khasim
*
* Copyright ( C ) 2009 Texas Instruments Incorporated - http : //www.ti.com
*
* This file is licensed under the terms of the GNU General Public License
* version 2. This program is licensed " as is " without any warranty of
* any kind , whether express or implied .
*/
# include <linux/kernel.h>
# include <linux/init.h>
# include <linux/console.h>
2017-01-13 16:14:04 +03:00
# include <linux/interrupt.h>
2010-09-23 20:28:40 +04:00
# include <linux/gpio.h>
2016-11-24 18:04:52 +03:00
# include <linux/gpio/machine.h>
2018-06-28 12:57:41 +03:00
# include <linux/mtd/partitions.h>
# include <linux/mtd/rawnand.h>
2013-08-18 09:19:01 +04:00
# include <linux/platform_data/gpio-davinci.h>
2018-06-28 12:57:41 +03:00
# include <linux/platform_data/mtd-davinci.h>
# include <linux/platform_data/mtd-davinci-aemif.h>
# include <linux/platform_data/ti-aemif.h>
2019-04-12 15:36:38 +03:00
# include <linux/regulator/fixed.h>
2016-10-26 22:41:55 +03:00
# include <linux/regulator/machine.h>
2010-09-23 20:28:40 +04:00
# include <asm/mach-types.h>
# include <asm/mach/arch.h>
2013-08-18 09:19:01 +04:00
# include <mach/common.h>
2010-09-23 20:28:40 +04:00
# include <mach/da8xx.h>
2010-12-28 01:43:08 +03:00
# include <mach/mux.h>
2012-01-21 01:18:17 +04:00
# define HAWKBOARD_PHY_ID "davinci_mdio-0:07"
2010-12-28 01:43:08 +03:00
2010-12-28 01:43:13 +03:00
# define DA850_USB1_VBUS_PIN GPIO_TO_PIN(2, 4)
# define DA850_USB1_OC_PIN GPIO_TO_PIN(6, 13)
2010-12-28 01:43:08 +03:00
static short omapl138_hawk_mii_pins [ ] __initdata = {
DA850_MII_TXEN , DA850_MII_TXCLK , DA850_MII_COL , DA850_MII_TXD_3 ,
DA850_MII_TXD_2 , DA850_MII_TXD_1 , DA850_MII_TXD_0 , DA850_MII_RXER ,
DA850_MII_CRS , DA850_MII_RXCLK , DA850_MII_RXDV , DA850_MII_RXD_3 ,
DA850_MII_RXD_2 , DA850_MII_RXD_1 , DA850_MII_RXD_0 , DA850_MDIO_CLK ,
DA850_MDIO_D ,
- 1
} ;
static __init void omapl138_hawk_config_emac ( void )
{
void __iomem * cfgchip3 = DA8XX_SYSCFG0_VIRT ( DA8XX_CFGCHIP3_REG ) ;
int ret ;
u32 val ;
struct davinci_soc_info * soc_info = & davinci_soc_info ;
val = __raw_readl ( cfgchip3 ) ;
val & = ~ BIT ( 8 ) ;
ret = davinci_cfg_reg_list ( omapl138_hawk_mii_pins ) ;
if ( ret ) {
2013-01-11 04:23:19 +04:00
pr_warn ( " %s: CPGMAC/MII mux setup failed: %d \n " , __func__ , ret ) ;
2010-12-28 01:43:08 +03:00
return ;
}
/* configure the CFGCHIP3 register for MII */
__raw_writel ( val , cfgchip3 ) ;
pr_info ( " EMAC: MII PHY configured \n " ) ;
soc_info - > emac_pdata - > phy_id = HAWKBOARD_PHY_ID ;
ret = da8xx_register_emac ( ) ;
if ( ret )
2013-01-11 04:23:19 +04:00
pr_warn ( " %s: EMAC registration failed: %d \n " , __func__ , ret ) ;
2010-12-28 01:43:08 +03:00
}
2010-12-28 01:43:09 +03:00
/*
* The following EDMA channels / slots are not being used by drivers ( for
* example : Timer , GPIO , UART events etc ) on da850 / omap - l138 EVM / Hawkboard ,
* hence they are being reserved for codecs on the DSP side .
*/
static const s16 da850_dma0_rsv_chans [ ] [ 2 ] = {
/* (offset, number) */
{ 8 , 6 } ,
{ 24 , 4 } ,
{ 30 , 2 } ,
{ - 1 , - 1 }
} ;
static const s16 da850_dma0_rsv_slots [ ] [ 2 ] = {
/* (offset, number) */
{ 8 , 6 } ,
{ 24 , 4 } ,
{ 30 , 50 } ,
{ - 1 , - 1 }
} ;
static const s16 da850_dma1_rsv_chans [ ] [ 2 ] = {
/* (offset, number) */
{ 0 , 28 } ,
{ 30 , 2 } ,
{ - 1 , - 1 }
} ;
static const s16 da850_dma1_rsv_slots [ ] [ 2 ] = {
/* (offset, number) */
{ 0 , 28 } ,
{ 30 , 90 } ,
{ - 1 , - 1 }
} ;
static struct edma_rsv_info da850_edma_cc0_rsv = {
. rsv_chans = da850_dma0_rsv_chans ,
. rsv_slots = da850_dma0_rsv_slots ,
} ;
static struct edma_rsv_info da850_edma_cc1_rsv = {
. rsv_chans = da850_dma1_rsv_chans ,
. rsv_slots = da850_dma1_rsv_slots ,
} ;
static struct edma_rsv_info * da850_edma_rsv [ 2 ] = {
& da850_edma_cc0_rsv ,
& da850_edma_cc1_rsv ,
} ;
2010-09-23 20:28:40 +04:00
2010-12-28 01:43:11 +03:00
static const short hawk_mmcsd0_pins [ ] = {
DA850_MMCSD0_DAT_0 , DA850_MMCSD0_DAT_1 , DA850_MMCSD0_DAT_2 ,
DA850_MMCSD0_DAT_3 , DA850_MMCSD0_CLK , DA850_MMCSD0_CMD ,
DA850_GPIO3_12 , DA850_GPIO3_13 ,
- 1
} ;
2018-04-24 17:35:06 +03:00
# define DA850_HAWK_MMCSD_CD_PIN GPIO_TO_PIN(3, 12)
# define DA850_HAWK_MMCSD_WP_PIN GPIO_TO_PIN(3, 13)
2016-11-24 18:04:52 +03:00
static struct gpiod_lookup_table mmc_gpios_table = {
. dev_id = " da830-mmc.0 " ,
. table = {
2019-01-03 18:11:04 +03:00
GPIO_LOOKUP ( " davinci_gpio " , DA850_HAWK_MMCSD_CD_PIN , " cd " ,
2018-04-24 17:35:06 +03:00
GPIO_ACTIVE_LOW ) ,
2019-01-03 18:11:04 +03:00
GPIO_LOOKUP ( " davinci_gpio " , DA850_HAWK_MMCSD_WP_PIN , " wp " ,
2018-04-24 17:35:06 +03:00
GPIO_ACTIVE_LOW ) ,
2016-11-24 18:04:52 +03:00
} ,
} ;
2010-12-28 01:43:11 +03:00
static struct davinci_mmc_config da850_mmc_config = {
. wires = 4 ,
. max_freq = 50000000 ,
. caps = MMC_CAP_MMC_HIGHSPEED | MMC_CAP_SD_HIGHSPEED ,
} ;
static __init void omapl138_hawk_mmc_init ( void )
{
int ret ;
ret = davinci_cfg_reg_list ( hawk_mmcsd0_pins ) ;
if ( ret ) {
2013-01-11 04:23:19 +04:00
pr_warn ( " %s: MMC/SD0 mux setup failed: %d \n " , __func__ , ret ) ;
2010-12-28 01:43:11 +03:00
return ;
}
2016-11-24 18:04:52 +03:00
gpiod_add_lookup_table ( & mmc_gpios_table ) ;
2010-12-28 01:43:11 +03:00
ret = da8xx_register_mmcsd0 ( & da850_mmc_config ) ;
if ( ret ) {
2013-01-11 04:23:19 +04:00
pr_warn ( " %s: MMC/SD0 registration failed: %d \n " , __func__ , ret ) ;
2010-12-28 01:43:11 +03:00
goto mmc_setup_mmcsd_fail ;
}
return ;
mmc_setup_mmcsd_fail :
2016-11-24 18:04:52 +03:00
gpiod_remove_lookup_table ( & mmc_gpios_table ) ;
2010-12-28 01:43:11 +03:00
}
2018-06-28 12:57:41 +03:00
static struct mtd_partition omapl138_hawk_nandflash_partition [ ] = {
{
. name = " u-boot env " ,
. offset = 0 ,
. size = SZ_128K ,
. mask_flags = MTD_WRITEABLE ,
} ,
{
. name = " u-boot " ,
. offset = MTDPART_OFS_APPEND ,
. size = SZ_512K ,
. mask_flags = MTD_WRITEABLE ,
} ,
{
. name = " free space " ,
. offset = MTDPART_OFS_APPEND ,
. size = MTDPART_SIZ_FULL ,
. mask_flags = 0 ,
} ,
} ;
static struct davinci_aemif_timing omapl138_hawk_nandflash_timing = {
. wsetup = 24 ,
. wstrobe = 21 ,
. whold = 14 ,
. rsetup = 19 ,
. rstrobe = 50 ,
. rhold = 0 ,
. ta = 20 ,
} ;
static struct davinci_nand_pdata omapl138_hawk_nandflash_data = {
. core_chipsel = 1 ,
. parts = omapl138_hawk_nandflash_partition ,
. nr_parts = ARRAY_SIZE ( omapl138_hawk_nandflash_partition ) ,
. ecc_mode = NAND_ECC_HW ,
. ecc_bits = 4 ,
. bbt_options = NAND_BBT_USE_FLASH ,
. options = NAND_BUSWIDTH_16 ,
. timing = & omapl138_hawk_nandflash_timing ,
. mask_chipsel = 0 ,
. mask_ale = 0 ,
. mask_cle = 0 ,
} ;
static struct resource omapl138_hawk_nandflash_resource [ ] = {
{
. start = DA8XX_AEMIF_CS3_BASE ,
. end = DA8XX_AEMIF_CS3_BASE + SZ_32M ,
. flags = IORESOURCE_MEM ,
} ,
{
. start = DA8XX_AEMIF_CTL_BASE ,
. end = DA8XX_AEMIF_CTL_BASE + SZ_32K ,
. flags = IORESOURCE_MEM ,
} ,
} ;
static struct resource omapl138_hawk_aemif_resource [ ] = {
{
. start = DA8XX_AEMIF_CTL_BASE ,
. end = DA8XX_AEMIF_CTL_BASE + SZ_32K ,
. flags = IORESOURCE_MEM ,
}
} ;
static struct aemif_abus_data omapl138_hawk_aemif_abus_data [ ] = {
{
. cs = 3 ,
}
} ;
static struct platform_device omapl138_hawk_aemif_devices [ ] = {
{
. name = " davinci_nand " ,
. id = - 1 ,
. dev = {
. platform_data = & omapl138_hawk_nandflash_data ,
} ,
. resource = omapl138_hawk_nandflash_resource ,
. num_resources = ARRAY_SIZE ( omapl138_hawk_nandflash_resource ) ,
}
} ;
static struct aemif_platform_data omapl138_hawk_aemif_pdata = {
. cs_offset = 2 ,
. abus_data = omapl138_hawk_aemif_abus_data ,
. num_abus_data = ARRAY_SIZE ( omapl138_hawk_aemif_abus_data ) ,
. sub_devices = omapl138_hawk_aemif_devices ,
. num_sub_devices = ARRAY_SIZE ( omapl138_hawk_aemif_devices ) ,
} ;
static struct platform_device omapl138_hawk_aemif_device = {
. name = " ti-aemif " ,
. id = - 1 ,
. dev = {
. platform_data = & omapl138_hawk_aemif_pdata ,
} ,
. resource = omapl138_hawk_aemif_resource ,
. num_resources = ARRAY_SIZE ( omapl138_hawk_aemif_resource ) ,
} ;
static const short omapl138_hawk_nand_pins [ ] = {
DA850_EMA_WAIT_1 , DA850_NEMA_OE , DA850_NEMA_WE , DA850_NEMA_CS_3 ,
DA850_EMA_D_0 , DA850_EMA_D_1 , DA850_EMA_D_2 , DA850_EMA_D_3 ,
DA850_EMA_D_4 , DA850_EMA_D_5 , DA850_EMA_D_6 , DA850_EMA_D_7 ,
DA850_EMA_D_8 , DA850_EMA_D_9 , DA850_EMA_D_10 , DA850_EMA_D_11 ,
DA850_EMA_D_12 , DA850_EMA_D_13 , DA850_EMA_D_14 , DA850_EMA_D_15 ,
DA850_EMA_A_1 , DA850_EMA_A_2 ,
- 1
} ;
static int omapl138_hawk_register_aemif ( void )
{
int ret ;
ret = davinci_cfg_reg_list ( omapl138_hawk_nand_pins ) ;
if ( ret )
pr_warn ( " %s: NAND mux setup failed: %d \n " , __func__ , ret ) ;
return platform_device_register ( & omapl138_hawk_aemif_device ) ;
}
2010-12-28 01:43:13 +03:00
static const short da850_hawk_usb11_pins [ ] = {
DA850_GPIO2_4 , DA850_GPIO6_13 ,
- 1
} ;
2019-04-12 15:36:38 +03:00
static struct regulator_consumer_supply hawk_usb_supplies [ ] = {
REGULATOR_SUPPLY ( " vbus " , NULL ) ,
} ;
static struct regulator_init_data hawk_usb_vbus_data = {
. consumer_supplies = hawk_usb_supplies ,
. num_consumer_supplies = ARRAY_SIZE ( hawk_usb_supplies ) ,
2019-06-25 19:49:15 +03:00
. constraints = {
. valid_ops_mask = REGULATOR_CHANGE_STATUS ,
} ,
2019-04-12 15:36:38 +03:00
} ;
static struct fixed_voltage_config hawk_usb_vbus = {
. supply_name = " vbus " ,
. microvolts = 3300000 ,
. init_data = & hawk_usb_vbus_data ,
} ;
static struct platform_device hawk_usb_vbus_device = {
. name = " reg-fixed-voltage " ,
. id = 0 ,
. dev = {
. platform_data = & hawk_usb_vbus ,
} ,
} ;
static struct gpiod_lookup_table hawk_usb_oc_gpio_lookup = {
2019-02-11 13:36:57 +03:00
. dev_id = " ohci-da8xx " ,
. table = {
GPIO_LOOKUP ( " davinci_gpio " , DA850_USB1_OC_PIN , " oc " , 0 ) ,
2019-04-12 15:36:35 +03:00
{ }
2019-02-11 13:36:57 +03:00
} ,
} ;
2010-12-28 01:43:13 +03:00
2019-04-12 15:36:38 +03:00
static struct gpiod_lookup_table hawk_usb_vbus_gpio_lookup = {
. dev_id = " reg-fixed-voltage.0 " ,
. table = {
GPIO_LOOKUP ( " davinci_gpio " , DA850_USB1_VBUS_PIN , NULL , 0 ) ,
{ }
} ,
} ;
static struct gpiod_lookup_table * hawk_usb_gpio_lookups [ ] = {
& hawk_usb_oc_gpio_lookup ,
& hawk_usb_vbus_gpio_lookup ,
} ;
2010-12-28 01:43:13 +03:00
static struct da8xx_ohci_root_hub omapl138_hawk_usb11_pdata = {
/* TPS2087 switch @ 5V */
. potpgt = ( 3 + 1 ) / 2 , /* 3 ms max */
} ;
static __init void omapl138_hawk_usb_init ( void )
{
int ret ;
ret = davinci_cfg_reg_list ( da850_hawk_usb11_pins ) ;
if ( ret ) {
2013-01-11 04:23:19 +04:00
pr_warn ( " %s: USB 1.1 PinMux setup failed: %d \n " , __func__ , ret ) ;
2010-12-28 01:43:13 +03:00
return ;
}
2018-05-18 19:48:19 +03:00
2018-05-18 19:48:13 +03:00
ret = da8xx_register_usb_phy_clocks ( ) ;
if ( ret )
pr_warn ( " %s: USB PHY CLK registration failed: %d \n " ,
__func__ , ret ) ;
2010-12-28 01:43:13 +03:00
2019-04-12 15:36:38 +03:00
gpiod_add_lookup_tables ( hawk_usb_gpio_lookups ,
ARRAY_SIZE ( hawk_usb_gpio_lookups ) ) ;
2016-10-27 03:18:15 +03:00
ret = da8xx_register_usb_phy ( ) ;
if ( ret )
pr_warn ( " %s: USB PHY registration failed: %d \n " ,
__func__ , ret ) ;
2019-04-12 15:36:38 +03:00
ret = platform_device_register ( & hawk_usb_vbus_device ) ;
if ( ret ) {
pr_warn ( " %s: Unable to register the vbus supply \n " , __func__ ) ;
return ;
}
2010-12-28 01:43:13 +03:00
ret = da8xx_register_usb11 ( & omapl138_hawk_usb11_pdata ) ;
2019-02-11 13:37:00 +03:00
if ( ret )
2013-01-11 04:23:19 +04:00
pr_warn ( " %s: USB 1.1 registration failed: %d \n " , __func__ , ret ) ;
2010-12-28 01:43:13 +03:00
return ;
}
2010-09-23 20:28:40 +04:00
static __init void omapl138_hawk_init ( void )
{
int ret ;
2018-05-18 19:48:08 +03:00
da850_register_clocks ( ) ;
2013-08-18 09:19:01 +04:00
ret = da850_register_gpio ( ) ;
if ( ret )
pr_warn ( " %s: GPIO init failed: %d \n " , __func__ , ret ) ;
2013-06-19 13:15:42 +04:00
davinci_serial_init ( da8xx_serial_device ) ;
2010-09-23 20:28:40 +04:00
2010-12-28 01:43:08 +03:00
omapl138_hawk_config_emac ( ) ;
2010-12-28 01:43:09 +03:00
ret = da850_register_edma ( da850_edma_rsv ) ;
if ( ret )
2013-01-11 04:23:19 +04:00
pr_warn ( " %s: EDMA registration failed: %d \n " , __func__ , ret ) ;
2010-12-28 01:43:09 +03:00
2010-12-28 01:43:11 +03:00
omapl138_hawk_mmc_init ( ) ;
2010-12-28 01:43:13 +03:00
omapl138_hawk_usb_init ( ) ;
2018-06-28 12:57:41 +03:00
ret = omapl138_hawk_register_aemif ( ) ;
if ( ret )
pr_warn ( " %s: aemif registration failed: %d \n " , __func__ , ret ) ;
2010-09-23 20:28:40 +04:00
ret = da8xx_register_watchdog ( ) ;
if ( ret )
2013-01-11 04:23:19 +04:00
pr_warn ( " %s: watchdog registration failed: %d \n " ,
__func__ , ret ) ;
2013-03-29 05:41:47 +04:00
ret = da8xx_register_rproc ( ) ;
if ( ret )
pr_warn ( " %s: dsp/rproc registration failed: %d \n " ,
__func__ , ret ) ;
2016-10-26 22:41:55 +03:00
regulator_has_full_constraints ( ) ;
2010-09-23 20:28:40 +04:00
}
# ifdef CONFIG_SERIAL_8250_CONSOLE
static int __init omapl138_hawk_console_init ( void )
{
if ( ! machine_is_omapl138_hawkboard ( ) )
return 0 ;
return add_preferred_console ( " ttyS " , 2 , " 115200 " ) ;
}
console_initcall ( omapl138_hawk_console_init ) ;
# endif
static void __init omapl138_hawk_map_io ( void )
{
da850_init ( ) ;
}
MACHINE_START ( OMAPL138_HAWKBOARD , " AM18x/OMAP-L138 Hawkboard " )
2011-07-06 06:38:11 +04:00
. atag_offset = 0x100 ,
2010-09-23 20:28:40 +04:00
. map_io = omapl138_hawk_map_io ,
2019-02-14 17:52:18 +03:00
. init_irq = da850_init_irq ,
2018-01-20 06:20:22 +03:00
. init_time = da850_init_time ,
2010-09-23 20:28:40 +04:00
. init_machine = omapl138_hawk_init ,
2012-04-26 05:45:39 +04:00
. init_late = davinci_init_late ,
2011-07-06 06:28:08 +04:00
. dma_zone_size = SZ_128M ,
2013-03-29 05:41:47 +04:00
. reserve = da8xx_rproc_reserve_cma ,
2010-09-23 20:28:40 +04:00
MACHINE_END