16f3c1af2SPaul Walmsley /* 26f3c1af2SPaul Walmsley * linux/arch/arm/plat-omap/ocpi.c 36f3c1af2SPaul Walmsley * 46f3c1af2SPaul Walmsley * Minimal OCP bus support for omap16xx 56f3c1af2SPaul Walmsley * 66f3c1af2SPaul Walmsley * Copyright (C) 2003 - 2005 Nokia Corporation 76f3c1af2SPaul Walmsley * Copyright (C) 2012 Texas Instruments, Inc. 86f3c1af2SPaul Walmsley * Written by Tony Lindgren <tony@atomide.com> 96f3c1af2SPaul Walmsley * 106f3c1af2SPaul Walmsley * Modified for clock framework by Paul Mundt <paul.mundt@nokia.com>. 116f3c1af2SPaul Walmsley * 126f3c1af2SPaul Walmsley * This program is free software; you can redistribute it and/or modify 136f3c1af2SPaul Walmsley * it under the terms of the GNU General Public License as published by 146f3c1af2SPaul Walmsley * the Free Software Foundation; either version 2 of the License, or 156f3c1af2SPaul Walmsley * (at your option) any later version. 166f3c1af2SPaul Walmsley * 176f3c1af2SPaul Walmsley * This program is distributed in the hope that it will be useful, 186f3c1af2SPaul Walmsley * but WITHOUT ANY WARRANTY; without even the implied warranty of 196f3c1af2SPaul Walmsley * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 206f3c1af2SPaul Walmsley * GNU General Public License for more details. 216f3c1af2SPaul Walmsley * 226f3c1af2SPaul Walmsley * You should have received a copy of the GNU General Public License 236f3c1af2SPaul Walmsley * along with this program; if not, write to the Free Software 246f3c1af2SPaul Walmsley * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 256f3c1af2SPaul Walmsley */ 266f3c1af2SPaul Walmsley 276f3c1af2SPaul Walmsley #include <linux/module.h> 286f3c1af2SPaul Walmsley #include <linux/types.h> 296f3c1af2SPaul Walmsley #include <linux/errno.h> 306f3c1af2SPaul Walmsley #include <linux/kernel.h> 316f3c1af2SPaul Walmsley #include <linux/init.h> 326f3c1af2SPaul Walmsley #include <linux/spinlock.h> 336f3c1af2SPaul Walmsley #include <linux/err.h> 346f3c1af2SPaul Walmsley #include <linux/clk.h> 356f3c1af2SPaul Walmsley #include <linux/io.h> 366f3c1af2SPaul Walmsley 376f3c1af2SPaul Walmsley #include <mach/hardware.h> 386f3c1af2SPaul Walmsley 396f3c1af2SPaul Walmsley #include "common.h" 406f3c1af2SPaul Walmsley 416f3c1af2SPaul Walmsley #define OCPI_BASE 0xfffec320 426f3c1af2SPaul Walmsley #define OCPI_FAULT (OCPI_BASE + 0x00) 436f3c1af2SPaul Walmsley #define OCPI_CMD_FAULT (OCPI_BASE + 0x04) 446f3c1af2SPaul Walmsley #define OCPI_SINT0 (OCPI_BASE + 0x08) 456f3c1af2SPaul Walmsley #define OCPI_TABORT (OCPI_BASE + 0x0c) 466f3c1af2SPaul Walmsley #define OCPI_SINT1 (OCPI_BASE + 0x10) 476f3c1af2SPaul Walmsley #define OCPI_PROT (OCPI_BASE + 0x14) 486f3c1af2SPaul Walmsley #define OCPI_SEC (OCPI_BASE + 0x18) 496f3c1af2SPaul Walmsley 506f3c1af2SPaul Walmsley /* USB OHCI OCPI access error registers */ 516f3c1af2SPaul Walmsley #define HOSTUEADDR 0xfffba0e0 526f3c1af2SPaul Walmsley #define HOSTUESTATUS 0xfffba0e4 536f3c1af2SPaul Walmsley 546f3c1af2SPaul Walmsley static struct clk *ocpi_ck; 556f3c1af2SPaul Walmsley 566f3c1af2SPaul Walmsley /* 576f3c1af2SPaul Walmsley * Enables device access to OMAP buses via the OCPI bridge 586f3c1af2SPaul Walmsley * FIXME: Add locking 596f3c1af2SPaul Walmsley */ 606f3c1af2SPaul Walmsley int ocpi_enable(void) 616f3c1af2SPaul Walmsley { 626f3c1af2SPaul Walmsley unsigned int val; 636f3c1af2SPaul Walmsley 646f3c1af2SPaul Walmsley if (!cpu_is_omap16xx()) 656f3c1af2SPaul Walmsley return -ENODEV; 666f3c1af2SPaul Walmsley 676f3c1af2SPaul Walmsley /* Enable access for OHCI in OCPI */ 686f3c1af2SPaul Walmsley val = omap_readl(OCPI_PROT); 696f3c1af2SPaul Walmsley val &= ~0xff; 706f3c1af2SPaul Walmsley /* val &= (1 << 0); Allow access only to EMIFS */ 716f3c1af2SPaul Walmsley omap_writel(val, OCPI_PROT); 726f3c1af2SPaul Walmsley 736f3c1af2SPaul Walmsley val = omap_readl(OCPI_SEC); 746f3c1af2SPaul Walmsley val &= ~0xff; 756f3c1af2SPaul Walmsley omap_writel(val, OCPI_SEC); 766f3c1af2SPaul Walmsley 776f3c1af2SPaul Walmsley return 0; 786f3c1af2SPaul Walmsley } 796f3c1af2SPaul Walmsley EXPORT_SYMBOL(ocpi_enable); 806f3c1af2SPaul Walmsley 816f3c1af2SPaul Walmsley static int __init omap_ocpi_init(void) 826f3c1af2SPaul Walmsley { 836f3c1af2SPaul Walmsley if (!cpu_is_omap16xx()) 846f3c1af2SPaul Walmsley return -ENODEV; 856f3c1af2SPaul Walmsley 866f3c1af2SPaul Walmsley ocpi_ck = clk_get(NULL, "l3_ocpi_ck"); 876f3c1af2SPaul Walmsley if (IS_ERR(ocpi_ck)) 886f3c1af2SPaul Walmsley return PTR_ERR(ocpi_ck); 896f3c1af2SPaul Walmsley 906f3c1af2SPaul Walmsley clk_enable(ocpi_ck); 916f3c1af2SPaul Walmsley ocpi_enable(); 926f3c1af2SPaul Walmsley pr_info("OMAP OCPI interconnect driver loaded\n"); 936f3c1af2SPaul Walmsley 946f3c1af2SPaul Walmsley return 0; 956f3c1af2SPaul Walmsley } 966f3c1af2SPaul Walmsley 976f3c1af2SPaul Walmsley static void __exit omap_ocpi_exit(void) 986f3c1af2SPaul Walmsley { 996f3c1af2SPaul Walmsley /* REVISIT: Disable OCPI */ 1006f3c1af2SPaul Walmsley 1016f3c1af2SPaul Walmsley if (!cpu_is_omap16xx()) 1026f3c1af2SPaul Walmsley return; 1036f3c1af2SPaul Walmsley 1046f3c1af2SPaul Walmsley clk_disable(ocpi_ck); 1056f3c1af2SPaul Walmsley clk_put(ocpi_ck); 1066f3c1af2SPaul Walmsley } 1076f3c1af2SPaul Walmsley 1086f3c1af2SPaul Walmsley MODULE_AUTHOR("Tony Lindgren <tony@atomide.com>"); 1096f3c1af2SPaul Walmsley MODULE_DESCRIPTION("OMAP OCPI bus controller module"); 1106f3c1af2SPaul Walmsley MODULE_LICENSE("GPL"); 1116f3c1af2SPaul Walmsley module_init(omap_ocpi_init); 1126f3c1af2SPaul Walmsley module_exit(omap_ocpi_exit); 113