xref: /openbmc/linux/arch/arm/mach-omap1/ocpi.c (revision 6f3c1af2)
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