xref: /openbmc/linux/arch/arm/mach-omap1/ocpi.c (revision 98e0f634)
11a59d1b8SThomas Gleixner // SPDX-License-Identifier: GPL-2.0-or-later
26f3c1af2SPaul Walmsley /*
36f3c1af2SPaul Walmsley  * linux/arch/arm/plat-omap/ocpi.c
46f3c1af2SPaul Walmsley  *
56f3c1af2SPaul Walmsley  * Minimal OCP bus support for omap16xx
66f3c1af2SPaul Walmsley  *
76f3c1af2SPaul Walmsley  * Copyright (C) 2003 - 2005 Nokia Corporation
86f3c1af2SPaul Walmsley  * Copyright (C) 2012 Texas Instruments, Inc.
96f3c1af2SPaul Walmsley  * Written by Tony Lindgren <tony@atomide.com>
106f3c1af2SPaul Walmsley  *
116f3c1af2SPaul Walmsley  * Modified for clock framework by Paul Mundt <paul.mundt@nokia.com>.
126f3c1af2SPaul Walmsley  */
136f3c1af2SPaul Walmsley 
146f3c1af2SPaul Walmsley #include <linux/module.h>
156f3c1af2SPaul Walmsley #include <linux/types.h>
166f3c1af2SPaul Walmsley #include <linux/errno.h>
176f3c1af2SPaul Walmsley #include <linux/kernel.h>
186f3c1af2SPaul Walmsley #include <linux/init.h>
196f3c1af2SPaul Walmsley #include <linux/spinlock.h>
206f3c1af2SPaul Walmsley #include <linux/err.h>
216f3c1af2SPaul Walmsley #include <linux/clk.h>
226f3c1af2SPaul Walmsley #include <linux/io.h>
237e0a9e62SArnd Bergmann #include <linux/soc/ti/omap1-io.h>
246f3c1af2SPaul Walmsley 
257e0a9e62SArnd Bergmann #include "hardware.h"
266f3c1af2SPaul Walmsley #include "common.h"
276f3c1af2SPaul Walmsley 
286f3c1af2SPaul Walmsley #define OCPI_BASE		0xfffec320
296f3c1af2SPaul Walmsley #define OCPI_FAULT		(OCPI_BASE + 0x00)
306f3c1af2SPaul Walmsley #define OCPI_CMD_FAULT		(OCPI_BASE + 0x04)
316f3c1af2SPaul Walmsley #define OCPI_SINT0		(OCPI_BASE + 0x08)
326f3c1af2SPaul Walmsley #define OCPI_TABORT		(OCPI_BASE + 0x0c)
336f3c1af2SPaul Walmsley #define OCPI_SINT1		(OCPI_BASE + 0x10)
346f3c1af2SPaul Walmsley #define OCPI_PROT		(OCPI_BASE + 0x14)
356f3c1af2SPaul Walmsley #define OCPI_SEC		(OCPI_BASE + 0x18)
366f3c1af2SPaul Walmsley 
376f3c1af2SPaul Walmsley /* USB OHCI OCPI access error registers */
386f3c1af2SPaul Walmsley #define HOSTUEADDR	0xfffba0e0
396f3c1af2SPaul Walmsley #define HOSTUESTATUS	0xfffba0e4
406f3c1af2SPaul Walmsley 
416f3c1af2SPaul Walmsley static struct clk *ocpi_ck;
426f3c1af2SPaul Walmsley 
436f3c1af2SPaul Walmsley /*
446f3c1af2SPaul Walmsley  * Enables device access to OMAP buses via the OCPI bridge
456f3c1af2SPaul Walmsley  */
ocpi_enable(void)466f3c1af2SPaul Walmsley int ocpi_enable(void)
476f3c1af2SPaul Walmsley {
486f3c1af2SPaul Walmsley 	unsigned int val;
496f3c1af2SPaul Walmsley 
506f3c1af2SPaul Walmsley 	if (!cpu_is_omap16xx())
516f3c1af2SPaul Walmsley 		return -ENODEV;
526f3c1af2SPaul Walmsley 
536f3c1af2SPaul Walmsley 	/* Enable access for OHCI in OCPI */
546f3c1af2SPaul Walmsley 	val = omap_readl(OCPI_PROT);
556f3c1af2SPaul Walmsley 	val &= ~0xff;
566f3c1af2SPaul Walmsley 	/* val &= (1 << 0);	 Allow access only to EMIFS */
576f3c1af2SPaul Walmsley 	omap_writel(val, OCPI_PROT);
586f3c1af2SPaul Walmsley 
596f3c1af2SPaul Walmsley 	val = omap_readl(OCPI_SEC);
606f3c1af2SPaul Walmsley 	val &= ~0xff;
616f3c1af2SPaul Walmsley 	omap_writel(val, OCPI_SEC);
626f3c1af2SPaul Walmsley 
636f3c1af2SPaul Walmsley 	return 0;
646f3c1af2SPaul Walmsley }
656f3c1af2SPaul Walmsley EXPORT_SYMBOL(ocpi_enable);
666f3c1af2SPaul Walmsley 
omap_ocpi_init(void)676f3c1af2SPaul Walmsley static int __init omap_ocpi_init(void)
686f3c1af2SPaul Walmsley {
696f3c1af2SPaul Walmsley 	if (!cpu_is_omap16xx())
706f3c1af2SPaul Walmsley 		return -ENODEV;
716f3c1af2SPaul Walmsley 
726f3c1af2SPaul Walmsley 	ocpi_ck = clk_get(NULL, "l3_ocpi_ck");
736f3c1af2SPaul Walmsley 	if (IS_ERR(ocpi_ck))
746f3c1af2SPaul Walmsley 		return PTR_ERR(ocpi_ck);
756f3c1af2SPaul Walmsley 
76*98e0f634SJanusz Krzysztofik 	clk_prepare_enable(ocpi_ck);
776f3c1af2SPaul Walmsley 	ocpi_enable();
786f3c1af2SPaul Walmsley 	pr_info("OMAP OCPI interconnect driver loaded\n");
796f3c1af2SPaul Walmsley 
806f3c1af2SPaul Walmsley 	return 0;
816f3c1af2SPaul Walmsley }
826f3c1af2SPaul Walmsley 
omap_ocpi_exit(void)836f3c1af2SPaul Walmsley static void __exit omap_ocpi_exit(void)
846f3c1af2SPaul Walmsley {
856f3c1af2SPaul Walmsley 	/* REVISIT: Disable OCPI */
866f3c1af2SPaul Walmsley 
876f3c1af2SPaul Walmsley 	if (!cpu_is_omap16xx())
886f3c1af2SPaul Walmsley 		return;
896f3c1af2SPaul Walmsley 
90*98e0f634SJanusz Krzysztofik 	clk_disable_unprepare(ocpi_ck);
916f3c1af2SPaul Walmsley 	clk_put(ocpi_ck);
926f3c1af2SPaul Walmsley }
936f3c1af2SPaul Walmsley 
946f3c1af2SPaul Walmsley MODULE_AUTHOR("Tony Lindgren <tony@atomide.com>");
956f3c1af2SPaul Walmsley MODULE_DESCRIPTION("OMAP OCPI bus controller module");
966f3c1af2SPaul Walmsley MODULE_LICENSE("GPL");
976f3c1af2SPaul Walmsley module_init(omap_ocpi_init);
986f3c1af2SPaul Walmsley module_exit(omap_ocpi_exit);
99