16c18c91b3a6db6169998b54df12c9d53e74999f3Victor Rodriguez/* 26c18c91b3a6db6169998b54df12c9d53e74999f3Victor Rodriguez * Hawkboard.org based on TI's OMAP-L138 Platform 36c18c91b3a6db6169998b54df12c9d53e74999f3Victor Rodriguez * 46c18c91b3a6db6169998b54df12c9d53e74999f3Victor Rodriguez * Initial code: Syed Mohammed Khasim 56c18c91b3a6db6169998b54df12c9d53e74999f3Victor Rodriguez * 66c18c91b3a6db6169998b54df12c9d53e74999f3Victor Rodriguez * Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com 76c18c91b3a6db6169998b54df12c9d53e74999f3Victor Rodriguez * 86c18c91b3a6db6169998b54df12c9d53e74999f3Victor Rodriguez * This file is licensed under the terms of the GNU General Public License 96c18c91b3a6db6169998b54df12c9d53e74999f3Victor Rodriguez * version 2. This program is licensed "as is" without any warranty of 106c18c91b3a6db6169998b54df12c9d53e74999f3Victor Rodriguez * any kind, whether express or implied. 116c18c91b3a6db6169998b54df12c9d53e74999f3Victor Rodriguez */ 126c18c91b3a6db6169998b54df12c9d53e74999f3Victor Rodriguez#include <linux/kernel.h> 136c18c91b3a6db6169998b54df12c9d53e74999f3Victor Rodriguez#include <linux/init.h> 146c18c91b3a6db6169998b54df12c9d53e74999f3Victor Rodriguez#include <linux/console.h> 156c18c91b3a6db6169998b54df12c9d53e74999f3Victor Rodriguez#include <linux/gpio.h> 16b856671e8ce18122dce87c2b6b2aec12fb9dda14Philip Avinash#include <linux/platform_data/gpio-davinci.h> 176c18c91b3a6db6169998b54df12c9d53e74999f3Victor Rodriguez 186c18c91b3a6db6169998b54df12c9d53e74999f3Victor Rodriguez#include <asm/mach-types.h> 196c18c91b3a6db6169998b54df12c9d53e74999f3Victor Rodriguez#include <asm/mach/arch.h> 206c18c91b3a6db6169998b54df12c9d53e74999f3Victor Rodriguez 21b856671e8ce18122dce87c2b6b2aec12fb9dda14Philip Avinash#include <mach/common.h> 226c18c91b3a6db6169998b54df12c9d53e74999f3Victor Rodriguez#include <mach/cp_intc.h> 236c18c91b3a6db6169998b54df12c9d53e74999f3Victor Rodriguez#include <mach/da8xx.h> 24bb59b7fdc1aacde27a1d6254f1e647a794fa7735Victor Rodriguez#include <mach/mux.h> 25bb59b7fdc1aacde27a1d6254f1e647a794fa7735Victor Rodriguez 26f6f97588a42373a0181215a5f70958756f2492c2Sekhar Nori#define HAWKBOARD_PHY_ID "davinci_mdio-0:07" 27ef782d8d4e80b25a56d8cb93d648dd125e6ea95eVictor Rodriguez#define DA850_HAWK_MMCSD_CD_PIN GPIO_TO_PIN(3, 12) 28ef782d8d4e80b25a56d8cb93d648dd125e6ea95eVictor Rodriguez#define DA850_HAWK_MMCSD_WP_PIN GPIO_TO_PIN(3, 13) 29bb59b7fdc1aacde27a1d6254f1e647a794fa7735Victor Rodriguez 30f5714abba6668d2790fd2ac708aabd9506d3baf4Victor Rodriguez#define DA850_USB1_VBUS_PIN GPIO_TO_PIN(2, 4) 31f5714abba6668d2790fd2ac708aabd9506d3baf4Victor Rodriguez#define DA850_USB1_OC_PIN GPIO_TO_PIN(6, 13) 32f5714abba6668d2790fd2ac708aabd9506d3baf4Victor Rodriguez 33bb59b7fdc1aacde27a1d6254f1e647a794fa7735Victor Rodriguezstatic short omapl138_hawk_mii_pins[] __initdata = { 34bb59b7fdc1aacde27a1d6254f1e647a794fa7735Victor Rodriguez DA850_MII_TXEN, DA850_MII_TXCLK, DA850_MII_COL, DA850_MII_TXD_3, 35bb59b7fdc1aacde27a1d6254f1e647a794fa7735Victor Rodriguez DA850_MII_TXD_2, DA850_MII_TXD_1, DA850_MII_TXD_0, DA850_MII_RXER, 36bb59b7fdc1aacde27a1d6254f1e647a794fa7735Victor Rodriguez DA850_MII_CRS, DA850_MII_RXCLK, DA850_MII_RXDV, DA850_MII_RXD_3, 37bb59b7fdc1aacde27a1d6254f1e647a794fa7735Victor Rodriguez DA850_MII_RXD_2, DA850_MII_RXD_1, DA850_MII_RXD_0, DA850_MDIO_CLK, 38bb59b7fdc1aacde27a1d6254f1e647a794fa7735Victor Rodriguez DA850_MDIO_D, 39bb59b7fdc1aacde27a1d6254f1e647a794fa7735Victor Rodriguez -1 40bb59b7fdc1aacde27a1d6254f1e647a794fa7735Victor Rodriguez}; 41bb59b7fdc1aacde27a1d6254f1e647a794fa7735Victor Rodriguez 42bb59b7fdc1aacde27a1d6254f1e647a794fa7735Victor Rodriguezstatic __init void omapl138_hawk_config_emac(void) 43bb59b7fdc1aacde27a1d6254f1e647a794fa7735Victor Rodriguez{ 44bb59b7fdc1aacde27a1d6254f1e647a794fa7735Victor Rodriguez void __iomem *cfgchip3 = DA8XX_SYSCFG0_VIRT(DA8XX_CFGCHIP3_REG); 45bb59b7fdc1aacde27a1d6254f1e647a794fa7735Victor Rodriguez int ret; 46bb59b7fdc1aacde27a1d6254f1e647a794fa7735Victor Rodriguez u32 val; 47bb59b7fdc1aacde27a1d6254f1e647a794fa7735Victor Rodriguez struct davinci_soc_info *soc_info = &davinci_soc_info; 48bb59b7fdc1aacde27a1d6254f1e647a794fa7735Victor Rodriguez 49bb59b7fdc1aacde27a1d6254f1e647a794fa7735Victor Rodriguez val = __raw_readl(cfgchip3); 50bb59b7fdc1aacde27a1d6254f1e647a794fa7735Victor Rodriguez val &= ~BIT(8); 51bb59b7fdc1aacde27a1d6254f1e647a794fa7735Victor Rodriguez ret = davinci_cfg_reg_list(omapl138_hawk_mii_pins); 52bb59b7fdc1aacde27a1d6254f1e647a794fa7735Victor Rodriguez if (ret) { 536c7c23cc7f1b0d690d8c113252c19b38a2227419Robert Tivy pr_warn("%s: CPGMAC/MII mux setup failed: %d\n", __func__, ret); 54bb59b7fdc1aacde27a1d6254f1e647a794fa7735Victor Rodriguez return; 55bb59b7fdc1aacde27a1d6254f1e647a794fa7735Victor Rodriguez } 56bb59b7fdc1aacde27a1d6254f1e647a794fa7735Victor Rodriguez 57bb59b7fdc1aacde27a1d6254f1e647a794fa7735Victor Rodriguez /* configure the CFGCHIP3 register for MII */ 58bb59b7fdc1aacde27a1d6254f1e647a794fa7735Victor Rodriguez __raw_writel(val, cfgchip3); 59bb59b7fdc1aacde27a1d6254f1e647a794fa7735Victor Rodriguez pr_info("EMAC: MII PHY configured\n"); 60bb59b7fdc1aacde27a1d6254f1e647a794fa7735Victor Rodriguez 61bb59b7fdc1aacde27a1d6254f1e647a794fa7735Victor Rodriguez soc_info->emac_pdata->phy_id = HAWKBOARD_PHY_ID; 62bb59b7fdc1aacde27a1d6254f1e647a794fa7735Victor Rodriguez 63bb59b7fdc1aacde27a1d6254f1e647a794fa7735Victor Rodriguez ret = da8xx_register_emac(); 64bb59b7fdc1aacde27a1d6254f1e647a794fa7735Victor Rodriguez if (ret) 656c7c23cc7f1b0d690d8c113252c19b38a2227419Robert Tivy pr_warn("%s: EMAC registration failed: %d\n", __func__, ret); 66bb59b7fdc1aacde27a1d6254f1e647a794fa7735Victor Rodriguez} 67bb59b7fdc1aacde27a1d6254f1e647a794fa7735Victor Rodriguez 685f72f380093afd378259e4a50f9fa2380457b70bVictor Rodriguez/* 695f72f380093afd378259e4a50f9fa2380457b70bVictor Rodriguez * The following EDMA channels/slots are not being used by drivers (for 705f72f380093afd378259e4a50f9fa2380457b70bVictor Rodriguez * example: Timer, GPIO, UART events etc) on da850/omap-l138 EVM/Hawkboard, 715f72f380093afd378259e4a50f9fa2380457b70bVictor Rodriguez * hence they are being reserved for codecs on the DSP side. 725f72f380093afd378259e4a50f9fa2380457b70bVictor Rodriguez */ 735f72f380093afd378259e4a50f9fa2380457b70bVictor Rodriguezstatic const s16 da850_dma0_rsv_chans[][2] = { 745f72f380093afd378259e4a50f9fa2380457b70bVictor Rodriguez /* (offset, number) */ 755f72f380093afd378259e4a50f9fa2380457b70bVictor Rodriguez { 8, 6}, 765f72f380093afd378259e4a50f9fa2380457b70bVictor Rodriguez {24, 4}, 775f72f380093afd378259e4a50f9fa2380457b70bVictor Rodriguez {30, 2}, 785f72f380093afd378259e4a50f9fa2380457b70bVictor Rodriguez {-1, -1} 795f72f380093afd378259e4a50f9fa2380457b70bVictor Rodriguez}; 805f72f380093afd378259e4a50f9fa2380457b70bVictor Rodriguez 815f72f380093afd378259e4a50f9fa2380457b70bVictor Rodriguezstatic const s16 da850_dma0_rsv_slots[][2] = { 825f72f380093afd378259e4a50f9fa2380457b70bVictor Rodriguez /* (offset, number) */ 835f72f380093afd378259e4a50f9fa2380457b70bVictor Rodriguez { 8, 6}, 845f72f380093afd378259e4a50f9fa2380457b70bVictor Rodriguez {24, 4}, 855f72f380093afd378259e4a50f9fa2380457b70bVictor Rodriguez {30, 50}, 865f72f380093afd378259e4a50f9fa2380457b70bVictor Rodriguez {-1, -1} 875f72f380093afd378259e4a50f9fa2380457b70bVictor Rodriguez}; 885f72f380093afd378259e4a50f9fa2380457b70bVictor Rodriguez 895f72f380093afd378259e4a50f9fa2380457b70bVictor Rodriguezstatic const s16 da850_dma1_rsv_chans[][2] = { 905f72f380093afd378259e4a50f9fa2380457b70bVictor Rodriguez /* (offset, number) */ 915f72f380093afd378259e4a50f9fa2380457b70bVictor Rodriguez { 0, 28}, 925f72f380093afd378259e4a50f9fa2380457b70bVictor Rodriguez {30, 2}, 935f72f380093afd378259e4a50f9fa2380457b70bVictor Rodriguez {-1, -1} 945f72f380093afd378259e4a50f9fa2380457b70bVictor Rodriguez}; 955f72f380093afd378259e4a50f9fa2380457b70bVictor Rodriguez 965f72f380093afd378259e4a50f9fa2380457b70bVictor Rodriguezstatic const s16 da850_dma1_rsv_slots[][2] = { 975f72f380093afd378259e4a50f9fa2380457b70bVictor Rodriguez /* (offset, number) */ 985f72f380093afd378259e4a50f9fa2380457b70bVictor Rodriguez { 0, 28}, 995f72f380093afd378259e4a50f9fa2380457b70bVictor Rodriguez {30, 90}, 1005f72f380093afd378259e4a50f9fa2380457b70bVictor Rodriguez {-1, -1} 1015f72f380093afd378259e4a50f9fa2380457b70bVictor Rodriguez}; 1025f72f380093afd378259e4a50f9fa2380457b70bVictor Rodriguez 1035f72f380093afd378259e4a50f9fa2380457b70bVictor Rodriguezstatic struct edma_rsv_info da850_edma_cc0_rsv = { 1045f72f380093afd378259e4a50f9fa2380457b70bVictor Rodriguez .rsv_chans = da850_dma0_rsv_chans, 1055f72f380093afd378259e4a50f9fa2380457b70bVictor Rodriguez .rsv_slots = da850_dma0_rsv_slots, 1065f72f380093afd378259e4a50f9fa2380457b70bVictor Rodriguez}; 1075f72f380093afd378259e4a50f9fa2380457b70bVictor Rodriguez 1085f72f380093afd378259e4a50f9fa2380457b70bVictor Rodriguezstatic struct edma_rsv_info da850_edma_cc1_rsv = { 1095f72f380093afd378259e4a50f9fa2380457b70bVictor Rodriguez .rsv_chans = da850_dma1_rsv_chans, 1105f72f380093afd378259e4a50f9fa2380457b70bVictor Rodriguez .rsv_slots = da850_dma1_rsv_slots, 1115f72f380093afd378259e4a50f9fa2380457b70bVictor Rodriguez}; 1125f72f380093afd378259e4a50f9fa2380457b70bVictor Rodriguez 1135f72f380093afd378259e4a50f9fa2380457b70bVictor Rodriguezstatic struct edma_rsv_info *da850_edma_rsv[2] = { 1145f72f380093afd378259e4a50f9fa2380457b70bVictor Rodriguez &da850_edma_cc0_rsv, 1155f72f380093afd378259e4a50f9fa2380457b70bVictor Rodriguez &da850_edma_cc1_rsv, 1165f72f380093afd378259e4a50f9fa2380457b70bVictor Rodriguez}; 1176c18c91b3a6db6169998b54df12c9d53e74999f3Victor Rodriguez 118ef782d8d4e80b25a56d8cb93d648dd125e6ea95eVictor Rodriguezstatic const short hawk_mmcsd0_pins[] = { 119ef782d8d4e80b25a56d8cb93d648dd125e6ea95eVictor Rodriguez DA850_MMCSD0_DAT_0, DA850_MMCSD0_DAT_1, DA850_MMCSD0_DAT_2, 120ef782d8d4e80b25a56d8cb93d648dd125e6ea95eVictor Rodriguez DA850_MMCSD0_DAT_3, DA850_MMCSD0_CLK, DA850_MMCSD0_CMD, 121ef782d8d4e80b25a56d8cb93d648dd125e6ea95eVictor Rodriguez DA850_GPIO3_12, DA850_GPIO3_13, 122ef782d8d4e80b25a56d8cb93d648dd125e6ea95eVictor Rodriguez -1 123ef782d8d4e80b25a56d8cb93d648dd125e6ea95eVictor Rodriguez}; 124ef782d8d4e80b25a56d8cb93d648dd125e6ea95eVictor Rodriguez 125ef782d8d4e80b25a56d8cb93d648dd125e6ea95eVictor Rodriguezstatic int da850_hawk_mmc_get_ro(int index) 126ef782d8d4e80b25a56d8cb93d648dd125e6ea95eVictor Rodriguez{ 127ef782d8d4e80b25a56d8cb93d648dd125e6ea95eVictor Rodriguez return gpio_get_value(DA850_HAWK_MMCSD_WP_PIN); 128ef782d8d4e80b25a56d8cb93d648dd125e6ea95eVictor Rodriguez} 129ef782d8d4e80b25a56d8cb93d648dd125e6ea95eVictor Rodriguez 130ef782d8d4e80b25a56d8cb93d648dd125e6ea95eVictor Rodriguezstatic int da850_hawk_mmc_get_cd(int index) 131ef782d8d4e80b25a56d8cb93d648dd125e6ea95eVictor Rodriguez{ 132ef782d8d4e80b25a56d8cb93d648dd125e6ea95eVictor Rodriguez return !gpio_get_value(DA850_HAWK_MMCSD_CD_PIN); 133ef782d8d4e80b25a56d8cb93d648dd125e6ea95eVictor Rodriguez} 134ef782d8d4e80b25a56d8cb93d648dd125e6ea95eVictor Rodriguez 135ef782d8d4e80b25a56d8cb93d648dd125e6ea95eVictor Rodriguezstatic struct davinci_mmc_config da850_mmc_config = { 136ef782d8d4e80b25a56d8cb93d648dd125e6ea95eVictor Rodriguez .get_ro = da850_hawk_mmc_get_ro, 137ef782d8d4e80b25a56d8cb93d648dd125e6ea95eVictor Rodriguez .get_cd = da850_hawk_mmc_get_cd, 138ef782d8d4e80b25a56d8cb93d648dd125e6ea95eVictor Rodriguez .wires = 4, 139ef782d8d4e80b25a56d8cb93d648dd125e6ea95eVictor Rodriguez .max_freq = 50000000, 140ef782d8d4e80b25a56d8cb93d648dd125e6ea95eVictor Rodriguez .caps = MMC_CAP_MMC_HIGHSPEED | MMC_CAP_SD_HIGHSPEED, 141ef782d8d4e80b25a56d8cb93d648dd125e6ea95eVictor Rodriguez}; 142ef782d8d4e80b25a56d8cb93d648dd125e6ea95eVictor Rodriguez 143ef782d8d4e80b25a56d8cb93d648dd125e6ea95eVictor Rodriguezstatic __init void omapl138_hawk_mmc_init(void) 144ef782d8d4e80b25a56d8cb93d648dd125e6ea95eVictor Rodriguez{ 145ef782d8d4e80b25a56d8cb93d648dd125e6ea95eVictor Rodriguez int ret; 146ef782d8d4e80b25a56d8cb93d648dd125e6ea95eVictor Rodriguez 147ef782d8d4e80b25a56d8cb93d648dd125e6ea95eVictor Rodriguez ret = davinci_cfg_reg_list(hawk_mmcsd0_pins); 148ef782d8d4e80b25a56d8cb93d648dd125e6ea95eVictor Rodriguez if (ret) { 1496c7c23cc7f1b0d690d8c113252c19b38a2227419Robert Tivy pr_warn("%s: MMC/SD0 mux setup failed: %d\n", __func__, ret); 150ef782d8d4e80b25a56d8cb93d648dd125e6ea95eVictor Rodriguez return; 151ef782d8d4e80b25a56d8cb93d648dd125e6ea95eVictor Rodriguez } 152ef782d8d4e80b25a56d8cb93d648dd125e6ea95eVictor Rodriguez 153ef782d8d4e80b25a56d8cb93d648dd125e6ea95eVictor Rodriguez ret = gpio_request_one(DA850_HAWK_MMCSD_CD_PIN, 154ef782d8d4e80b25a56d8cb93d648dd125e6ea95eVictor Rodriguez GPIOF_DIR_IN, "MMC CD"); 155ef782d8d4e80b25a56d8cb93d648dd125e6ea95eVictor Rodriguez if (ret < 0) { 1566c7c23cc7f1b0d690d8c113252c19b38a2227419Robert Tivy pr_warn("%s: can not open GPIO %d\n", 157ef782d8d4e80b25a56d8cb93d648dd125e6ea95eVictor Rodriguez __func__, DA850_HAWK_MMCSD_CD_PIN); 158ef782d8d4e80b25a56d8cb93d648dd125e6ea95eVictor Rodriguez return; 159ef782d8d4e80b25a56d8cb93d648dd125e6ea95eVictor Rodriguez } 160ef782d8d4e80b25a56d8cb93d648dd125e6ea95eVictor Rodriguez 161ef782d8d4e80b25a56d8cb93d648dd125e6ea95eVictor Rodriguez ret = gpio_request_one(DA850_HAWK_MMCSD_WP_PIN, 162ef782d8d4e80b25a56d8cb93d648dd125e6ea95eVictor Rodriguez GPIOF_DIR_IN, "MMC WP"); 163ef782d8d4e80b25a56d8cb93d648dd125e6ea95eVictor Rodriguez if (ret < 0) { 1646c7c23cc7f1b0d690d8c113252c19b38a2227419Robert Tivy pr_warn("%s: can not open GPIO %d\n", 165ef782d8d4e80b25a56d8cb93d648dd125e6ea95eVictor Rodriguez __func__, DA850_HAWK_MMCSD_WP_PIN); 166ef782d8d4e80b25a56d8cb93d648dd125e6ea95eVictor Rodriguez goto mmc_setup_wp_fail; 167ef782d8d4e80b25a56d8cb93d648dd125e6ea95eVictor Rodriguez } 168ef782d8d4e80b25a56d8cb93d648dd125e6ea95eVictor Rodriguez 169ef782d8d4e80b25a56d8cb93d648dd125e6ea95eVictor Rodriguez ret = da8xx_register_mmcsd0(&da850_mmc_config); 170ef782d8d4e80b25a56d8cb93d648dd125e6ea95eVictor Rodriguez if (ret) { 1716c7c23cc7f1b0d690d8c113252c19b38a2227419Robert Tivy pr_warn("%s: MMC/SD0 registration failed: %d\n", __func__, ret); 172ef782d8d4e80b25a56d8cb93d648dd125e6ea95eVictor Rodriguez goto mmc_setup_mmcsd_fail; 173ef782d8d4e80b25a56d8cb93d648dd125e6ea95eVictor Rodriguez } 174ef782d8d4e80b25a56d8cb93d648dd125e6ea95eVictor Rodriguez 175ef782d8d4e80b25a56d8cb93d648dd125e6ea95eVictor Rodriguez return; 176ef782d8d4e80b25a56d8cb93d648dd125e6ea95eVictor Rodriguez 177ef782d8d4e80b25a56d8cb93d648dd125e6ea95eVictor Rodriguezmmc_setup_mmcsd_fail: 178ef782d8d4e80b25a56d8cb93d648dd125e6ea95eVictor Rodriguez gpio_free(DA850_HAWK_MMCSD_WP_PIN); 179ef782d8d4e80b25a56d8cb93d648dd125e6ea95eVictor Rodriguezmmc_setup_wp_fail: 180ef782d8d4e80b25a56d8cb93d648dd125e6ea95eVictor Rodriguez gpio_free(DA850_HAWK_MMCSD_CD_PIN); 181ef782d8d4e80b25a56d8cb93d648dd125e6ea95eVictor Rodriguez} 182ef782d8d4e80b25a56d8cb93d648dd125e6ea95eVictor Rodriguez 183f5714abba6668d2790fd2ac708aabd9506d3baf4Victor Rodriguezstatic irqreturn_t omapl138_hawk_usb_ocic_irq(int irq, void *dev_id); 184f5714abba6668d2790fd2ac708aabd9506d3baf4Victor Rodriguezstatic da8xx_ocic_handler_t hawk_usb_ocic_handler; 185f5714abba6668d2790fd2ac708aabd9506d3baf4Victor Rodriguez 186f5714abba6668d2790fd2ac708aabd9506d3baf4Victor Rodriguezstatic const short da850_hawk_usb11_pins[] = { 187f5714abba6668d2790fd2ac708aabd9506d3baf4Victor Rodriguez DA850_GPIO2_4, DA850_GPIO6_13, 188f5714abba6668d2790fd2ac708aabd9506d3baf4Victor Rodriguez -1 189f5714abba6668d2790fd2ac708aabd9506d3baf4Victor Rodriguez}; 190f5714abba6668d2790fd2ac708aabd9506d3baf4Victor Rodriguez 191f5714abba6668d2790fd2ac708aabd9506d3baf4Victor Rodriguezstatic int hawk_usb_set_power(unsigned port, int on) 192f5714abba6668d2790fd2ac708aabd9506d3baf4Victor Rodriguez{ 193f5714abba6668d2790fd2ac708aabd9506d3baf4Victor Rodriguez gpio_set_value(DA850_USB1_VBUS_PIN, on); 194f5714abba6668d2790fd2ac708aabd9506d3baf4Victor Rodriguez return 0; 195f5714abba6668d2790fd2ac708aabd9506d3baf4Victor Rodriguez} 196f5714abba6668d2790fd2ac708aabd9506d3baf4Victor Rodriguez 197f5714abba6668d2790fd2ac708aabd9506d3baf4Victor Rodriguezstatic int hawk_usb_get_power(unsigned port) 198f5714abba6668d2790fd2ac708aabd9506d3baf4Victor Rodriguez{ 199f5714abba6668d2790fd2ac708aabd9506d3baf4Victor Rodriguez return gpio_get_value(DA850_USB1_VBUS_PIN); 200f5714abba6668d2790fd2ac708aabd9506d3baf4Victor Rodriguez} 201f5714abba6668d2790fd2ac708aabd9506d3baf4Victor Rodriguez 202f5714abba6668d2790fd2ac708aabd9506d3baf4Victor Rodriguezstatic int hawk_usb_get_oci(unsigned port) 203f5714abba6668d2790fd2ac708aabd9506d3baf4Victor Rodriguez{ 204f5714abba6668d2790fd2ac708aabd9506d3baf4Victor Rodriguez return !gpio_get_value(DA850_USB1_OC_PIN); 205f5714abba6668d2790fd2ac708aabd9506d3baf4Victor Rodriguez} 206f5714abba6668d2790fd2ac708aabd9506d3baf4Victor Rodriguez 207f5714abba6668d2790fd2ac708aabd9506d3baf4Victor Rodriguezstatic int hawk_usb_ocic_notify(da8xx_ocic_handler_t handler) 208f5714abba6668d2790fd2ac708aabd9506d3baf4Victor Rodriguez{ 209f5714abba6668d2790fd2ac708aabd9506d3baf4Victor Rodriguez int irq = gpio_to_irq(DA850_USB1_OC_PIN); 210f5714abba6668d2790fd2ac708aabd9506d3baf4Victor Rodriguez int error = 0; 211f5714abba6668d2790fd2ac708aabd9506d3baf4Victor Rodriguez 212f5714abba6668d2790fd2ac708aabd9506d3baf4Victor Rodriguez if (handler != NULL) { 213f5714abba6668d2790fd2ac708aabd9506d3baf4Victor Rodriguez hawk_usb_ocic_handler = handler; 214f5714abba6668d2790fd2ac708aabd9506d3baf4Victor Rodriguez 215f5714abba6668d2790fd2ac708aabd9506d3baf4Victor Rodriguez error = request_irq(irq, omapl138_hawk_usb_ocic_irq, 2161091a654ac1722b6ab4fc6533925c1a02486fff4Michael Opdenacker IRQF_TRIGGER_RISING | 217f5714abba6668d2790fd2ac708aabd9506d3baf4Victor Rodriguez IRQF_TRIGGER_FALLING, 218f5714abba6668d2790fd2ac708aabd9506d3baf4Victor Rodriguez "OHCI over-current indicator", NULL); 219f5714abba6668d2790fd2ac708aabd9506d3baf4Victor Rodriguez if (error) 220f5714abba6668d2790fd2ac708aabd9506d3baf4Victor Rodriguez pr_err("%s: could not request IRQ to watch " 221f5714abba6668d2790fd2ac708aabd9506d3baf4Victor Rodriguez "over-current indicator changes\n", __func__); 222f5714abba6668d2790fd2ac708aabd9506d3baf4Victor Rodriguez } else { 223f5714abba6668d2790fd2ac708aabd9506d3baf4Victor Rodriguez free_irq(irq, NULL); 224f5714abba6668d2790fd2ac708aabd9506d3baf4Victor Rodriguez } 225f5714abba6668d2790fd2ac708aabd9506d3baf4Victor Rodriguez return error; 226f5714abba6668d2790fd2ac708aabd9506d3baf4Victor Rodriguez} 227f5714abba6668d2790fd2ac708aabd9506d3baf4Victor Rodriguez 228f5714abba6668d2790fd2ac708aabd9506d3baf4Victor Rodriguezstatic struct da8xx_ohci_root_hub omapl138_hawk_usb11_pdata = { 229f5714abba6668d2790fd2ac708aabd9506d3baf4Victor Rodriguez .set_power = hawk_usb_set_power, 230f5714abba6668d2790fd2ac708aabd9506d3baf4Victor Rodriguez .get_power = hawk_usb_get_power, 231f5714abba6668d2790fd2ac708aabd9506d3baf4Victor Rodriguez .get_oci = hawk_usb_get_oci, 232f5714abba6668d2790fd2ac708aabd9506d3baf4Victor Rodriguez .ocic_notify = hawk_usb_ocic_notify, 233f5714abba6668d2790fd2ac708aabd9506d3baf4Victor Rodriguez /* TPS2087 switch @ 5V */ 234f5714abba6668d2790fd2ac708aabd9506d3baf4Victor Rodriguez .potpgt = (3 + 1) / 2, /* 3 ms max */ 235f5714abba6668d2790fd2ac708aabd9506d3baf4Victor Rodriguez}; 236f5714abba6668d2790fd2ac708aabd9506d3baf4Victor Rodriguez 237f5714abba6668d2790fd2ac708aabd9506d3baf4Victor Rodriguezstatic irqreturn_t omapl138_hawk_usb_ocic_irq(int irq, void *dev_id) 238f5714abba6668d2790fd2ac708aabd9506d3baf4Victor Rodriguez{ 239f5714abba6668d2790fd2ac708aabd9506d3baf4Victor Rodriguez hawk_usb_ocic_handler(&omapl138_hawk_usb11_pdata, 1); 240f5714abba6668d2790fd2ac708aabd9506d3baf4Victor Rodriguez return IRQ_HANDLED; 241f5714abba6668d2790fd2ac708aabd9506d3baf4Victor Rodriguez} 242f5714abba6668d2790fd2ac708aabd9506d3baf4Victor Rodriguez 243f5714abba6668d2790fd2ac708aabd9506d3baf4Victor Rodriguezstatic __init void omapl138_hawk_usb_init(void) 244f5714abba6668d2790fd2ac708aabd9506d3baf4Victor Rodriguez{ 245f5714abba6668d2790fd2ac708aabd9506d3baf4Victor Rodriguez int ret; 246f5714abba6668d2790fd2ac708aabd9506d3baf4Victor Rodriguez u32 cfgchip2; 247f5714abba6668d2790fd2ac708aabd9506d3baf4Victor Rodriguez 248f5714abba6668d2790fd2ac708aabd9506d3baf4Victor Rodriguez ret = davinci_cfg_reg_list(da850_hawk_usb11_pins); 249f5714abba6668d2790fd2ac708aabd9506d3baf4Victor Rodriguez if (ret) { 2506c7c23cc7f1b0d690d8c113252c19b38a2227419Robert Tivy pr_warn("%s: USB 1.1 PinMux setup failed: %d\n", __func__, ret); 251f5714abba6668d2790fd2ac708aabd9506d3baf4Victor Rodriguez return; 252f5714abba6668d2790fd2ac708aabd9506d3baf4Victor Rodriguez } 253f5714abba6668d2790fd2ac708aabd9506d3baf4Victor Rodriguez 254f5714abba6668d2790fd2ac708aabd9506d3baf4Victor Rodriguez /* Setup the Ref. clock frequency for the HAWK at 24 MHz. */ 255f5714abba6668d2790fd2ac708aabd9506d3baf4Victor Rodriguez 256f5714abba6668d2790fd2ac708aabd9506d3baf4Victor Rodriguez cfgchip2 = __raw_readl(DA8XX_SYSCFG0_VIRT(DA8XX_CFGCHIP2_REG)); 257f5714abba6668d2790fd2ac708aabd9506d3baf4Victor Rodriguez cfgchip2 &= ~CFGCHIP2_REFFREQ; 258f5714abba6668d2790fd2ac708aabd9506d3baf4Victor Rodriguez cfgchip2 |= CFGCHIP2_REFFREQ_24MHZ; 259f5714abba6668d2790fd2ac708aabd9506d3baf4Victor Rodriguez __raw_writel(cfgchip2, DA8XX_SYSCFG0_VIRT(DA8XX_CFGCHIP2_REG)); 260f5714abba6668d2790fd2ac708aabd9506d3baf4Victor Rodriguez 261f5714abba6668d2790fd2ac708aabd9506d3baf4Victor Rodriguez ret = gpio_request_one(DA850_USB1_VBUS_PIN, 262f5714abba6668d2790fd2ac708aabd9506d3baf4Victor Rodriguez GPIOF_DIR_OUT, "USB1 VBUS"); 263f5714abba6668d2790fd2ac708aabd9506d3baf4Victor Rodriguez if (ret < 0) { 264f5714abba6668d2790fd2ac708aabd9506d3baf4Victor Rodriguez pr_err("%s: failed to request GPIO for USB 1.1 port " 265f5714abba6668d2790fd2ac708aabd9506d3baf4Victor Rodriguez "power control: %d\n", __func__, ret); 266f5714abba6668d2790fd2ac708aabd9506d3baf4Victor Rodriguez return; 267f5714abba6668d2790fd2ac708aabd9506d3baf4Victor Rodriguez } 268f5714abba6668d2790fd2ac708aabd9506d3baf4Victor Rodriguez 269f5714abba6668d2790fd2ac708aabd9506d3baf4Victor Rodriguez ret = gpio_request_one(DA850_USB1_OC_PIN, 270f5714abba6668d2790fd2ac708aabd9506d3baf4Victor Rodriguez GPIOF_DIR_IN, "USB1 OC"); 271f5714abba6668d2790fd2ac708aabd9506d3baf4Victor Rodriguez if (ret < 0) { 272f5714abba6668d2790fd2ac708aabd9506d3baf4Victor Rodriguez pr_err("%s: failed to request GPIO for USB 1.1 port " 273f5714abba6668d2790fd2ac708aabd9506d3baf4Victor Rodriguez "over-current indicator: %d\n", __func__, ret); 274f5714abba6668d2790fd2ac708aabd9506d3baf4Victor Rodriguez goto usb11_setup_oc_fail; 275f5714abba6668d2790fd2ac708aabd9506d3baf4Victor Rodriguez } 276f5714abba6668d2790fd2ac708aabd9506d3baf4Victor Rodriguez 277f5714abba6668d2790fd2ac708aabd9506d3baf4Victor Rodriguez ret = da8xx_register_usb11(&omapl138_hawk_usb11_pdata); 278f5714abba6668d2790fd2ac708aabd9506d3baf4Victor Rodriguez if (ret) { 2796c7c23cc7f1b0d690d8c113252c19b38a2227419Robert Tivy pr_warn("%s: USB 1.1 registration failed: %d\n", __func__, ret); 280f5714abba6668d2790fd2ac708aabd9506d3baf4Victor Rodriguez goto usb11_setup_fail; 281f5714abba6668d2790fd2ac708aabd9506d3baf4Victor Rodriguez } 282f5714abba6668d2790fd2ac708aabd9506d3baf4Victor Rodriguez 283f5714abba6668d2790fd2ac708aabd9506d3baf4Victor Rodriguez return; 284f5714abba6668d2790fd2ac708aabd9506d3baf4Victor Rodriguez 285f5714abba6668d2790fd2ac708aabd9506d3baf4Victor Rodriguezusb11_setup_fail: 286f5714abba6668d2790fd2ac708aabd9506d3baf4Victor Rodriguez gpio_free(DA850_USB1_OC_PIN); 287f5714abba6668d2790fd2ac708aabd9506d3baf4Victor Rodriguezusb11_setup_oc_fail: 288f5714abba6668d2790fd2ac708aabd9506d3baf4Victor Rodriguez gpio_free(DA850_USB1_VBUS_PIN); 289f5714abba6668d2790fd2ac708aabd9506d3baf4Victor Rodriguez} 290f5714abba6668d2790fd2ac708aabd9506d3baf4Victor Rodriguez 2916c18c91b3a6db6169998b54df12c9d53e74999f3Victor Rodriguezstatic __init void omapl138_hawk_init(void) 2926c18c91b3a6db6169998b54df12c9d53e74999f3Victor Rodriguez{ 2936c18c91b3a6db6169998b54df12c9d53e74999f3Victor Rodriguez int ret; 2946c18c91b3a6db6169998b54df12c9d53e74999f3Victor Rodriguez 295b856671e8ce18122dce87c2b6b2aec12fb9dda14Philip Avinash ret = da850_register_gpio(); 296b856671e8ce18122dce87c2b6b2aec12fb9dda14Philip Avinash if (ret) 297b856671e8ce18122dce87c2b6b2aec12fb9dda14Philip Avinash pr_warn("%s: GPIO init failed: %d\n", __func__, ret); 298b856671e8ce18122dce87c2b6b2aec12fb9dda14Philip Avinash 299fcf7157ba3b50e57653544421250ebbe81a33d81Manjunathappa, Prakash davinci_serial_init(da8xx_serial_device); 3006c18c91b3a6db6169998b54df12c9d53e74999f3Victor Rodriguez 301bb59b7fdc1aacde27a1d6254f1e647a794fa7735Victor Rodriguez omapl138_hawk_config_emac(); 302bb59b7fdc1aacde27a1d6254f1e647a794fa7735Victor Rodriguez 3035f72f380093afd378259e4a50f9fa2380457b70bVictor Rodriguez ret = da850_register_edma(da850_edma_rsv); 3045f72f380093afd378259e4a50f9fa2380457b70bVictor Rodriguez if (ret) 3056c7c23cc7f1b0d690d8c113252c19b38a2227419Robert Tivy pr_warn("%s: EDMA registration failed: %d\n", __func__, ret); 3065f72f380093afd378259e4a50f9fa2380457b70bVictor Rodriguez 307ef782d8d4e80b25a56d8cb93d648dd125e6ea95eVictor Rodriguez omapl138_hawk_mmc_init(); 308ef782d8d4e80b25a56d8cb93d648dd125e6ea95eVictor Rodriguez 309f5714abba6668d2790fd2ac708aabd9506d3baf4Victor Rodriguez omapl138_hawk_usb_init(); 310f5714abba6668d2790fd2ac708aabd9506d3baf4Victor Rodriguez 3116c18c91b3a6db6169998b54df12c9d53e74999f3Victor Rodriguez ret = da8xx_register_watchdog(); 3126c18c91b3a6db6169998b54df12c9d53e74999f3Victor Rodriguez if (ret) 3136c7c23cc7f1b0d690d8c113252c19b38a2227419Robert Tivy pr_warn("%s: watchdog registration failed: %d\n", 3146c7c23cc7f1b0d690d8c113252c19b38a2227419Robert Tivy __func__, ret); 3155428813499ea1302f032e0063e4e2d4a56b36221Robert Tivy 3165428813499ea1302f032e0063e4e2d4a56b36221Robert Tivy ret = da8xx_register_rproc(); 3175428813499ea1302f032e0063e4e2d4a56b36221Robert Tivy if (ret) 3185428813499ea1302f032e0063e4e2d4a56b36221Robert Tivy pr_warn("%s: dsp/rproc registration failed: %d\n", 3195428813499ea1302f032e0063e4e2d4a56b36221Robert Tivy __func__, ret); 3206c18c91b3a6db6169998b54df12c9d53e74999f3Victor Rodriguez} 3216c18c91b3a6db6169998b54df12c9d53e74999f3Victor Rodriguez 3226c18c91b3a6db6169998b54df12c9d53e74999f3Victor Rodriguez#ifdef CONFIG_SERIAL_8250_CONSOLE 3236c18c91b3a6db6169998b54df12c9d53e74999f3Victor Rodriguezstatic int __init omapl138_hawk_console_init(void) 3246c18c91b3a6db6169998b54df12c9d53e74999f3Victor Rodriguez{ 3256c18c91b3a6db6169998b54df12c9d53e74999f3Victor Rodriguez if (!machine_is_omapl138_hawkboard()) 3266c18c91b3a6db6169998b54df12c9d53e74999f3Victor Rodriguez return 0; 3276c18c91b3a6db6169998b54df12c9d53e74999f3Victor Rodriguez 3286c18c91b3a6db6169998b54df12c9d53e74999f3Victor Rodriguez return add_preferred_console("ttyS", 2, "115200"); 3296c18c91b3a6db6169998b54df12c9d53e74999f3Victor Rodriguez} 3306c18c91b3a6db6169998b54df12c9d53e74999f3Victor Rodriguezconsole_initcall(omapl138_hawk_console_init); 3316c18c91b3a6db6169998b54df12c9d53e74999f3Victor Rodriguez#endif 3326c18c91b3a6db6169998b54df12c9d53e74999f3Victor Rodriguez 3336c18c91b3a6db6169998b54df12c9d53e74999f3Victor Rodriguezstatic void __init omapl138_hawk_map_io(void) 3346c18c91b3a6db6169998b54df12c9d53e74999f3Victor Rodriguez{ 3356c18c91b3a6db6169998b54df12c9d53e74999f3Victor Rodriguez da850_init(); 3366c18c91b3a6db6169998b54df12c9d53e74999f3Victor Rodriguez} 3376c18c91b3a6db6169998b54df12c9d53e74999f3Victor Rodriguez 3386c18c91b3a6db6169998b54df12c9d53e74999f3Victor RodriguezMACHINE_START(OMAPL138_HAWKBOARD, "AM18x/OMAP-L138 Hawkboard") 339e7e5601458a49fdcb1b49b4696e7530c25f86f25Nicolas Pitre .atag_offset = 0x100, 3406c18c91b3a6db6169998b54df12c9d53e74999f3Victor Rodriguez .map_io = omapl138_hawk_map_io, 3416c18c91b3a6db6169998b54df12c9d53e74999f3Victor Rodriguez .init_irq = cp_intc_init, 3426bb27d7349db51b50c40534710fe164ca0d58902Stephen Warren .init_time = davinci_timer_init, 3436c18c91b3a6db6169998b54df12c9d53e74999f3Victor Rodriguez .init_machine = omapl138_hawk_init, 3443aa3e8407ae9023c5ff59bf5c81fc2553c31eb70Shawn Guo .init_late = davinci_init_late, 345f68deabf3dc6c13fb80ec28575d0153c59f7ecceNicolas Pitre .dma_zone_size = SZ_128M, 346c6121ddd1f75278ab77504af2914d07831558672Sekhar Nori .restart = da8xx_restart, 3475428813499ea1302f032e0063e4e2d4a56b36221Robert Tivy .reserve = da8xx_rproc_reserve_cma, 3486c18c91b3a6db6169998b54df12c9d53e74999f3Victor RodriguezMACHINE_END 349