xref: /OK3568_Linux_fs/kernel/arch/arm/mach-omap1/ocpi.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0-or-later
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * linux/arch/arm/plat-omap/ocpi.c
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * Minimal OCP bus support for omap16xx
6*4882a593Smuzhiyun  *
7*4882a593Smuzhiyun  * Copyright (C) 2003 - 2005 Nokia Corporation
8*4882a593Smuzhiyun  * Copyright (C) 2012 Texas Instruments, Inc.
9*4882a593Smuzhiyun  * Written by Tony Lindgren <tony@atomide.com>
10*4882a593Smuzhiyun  *
11*4882a593Smuzhiyun  * Modified for clock framework by Paul Mundt <paul.mundt@nokia.com>.
12*4882a593Smuzhiyun  */
13*4882a593Smuzhiyun 
14*4882a593Smuzhiyun #include <linux/module.h>
15*4882a593Smuzhiyun #include <linux/types.h>
16*4882a593Smuzhiyun #include <linux/errno.h>
17*4882a593Smuzhiyun #include <linux/kernel.h>
18*4882a593Smuzhiyun #include <linux/init.h>
19*4882a593Smuzhiyun #include <linux/spinlock.h>
20*4882a593Smuzhiyun #include <linux/err.h>
21*4882a593Smuzhiyun #include <linux/clk.h>
22*4882a593Smuzhiyun #include <linux/io.h>
23*4882a593Smuzhiyun 
24*4882a593Smuzhiyun #include <mach/hardware.h>
25*4882a593Smuzhiyun 
26*4882a593Smuzhiyun #include "common.h"
27*4882a593Smuzhiyun 
28*4882a593Smuzhiyun #define OCPI_BASE		0xfffec320
29*4882a593Smuzhiyun #define OCPI_FAULT		(OCPI_BASE + 0x00)
30*4882a593Smuzhiyun #define OCPI_CMD_FAULT		(OCPI_BASE + 0x04)
31*4882a593Smuzhiyun #define OCPI_SINT0		(OCPI_BASE + 0x08)
32*4882a593Smuzhiyun #define OCPI_TABORT		(OCPI_BASE + 0x0c)
33*4882a593Smuzhiyun #define OCPI_SINT1		(OCPI_BASE + 0x10)
34*4882a593Smuzhiyun #define OCPI_PROT		(OCPI_BASE + 0x14)
35*4882a593Smuzhiyun #define OCPI_SEC		(OCPI_BASE + 0x18)
36*4882a593Smuzhiyun 
37*4882a593Smuzhiyun /* USB OHCI OCPI access error registers */
38*4882a593Smuzhiyun #define HOSTUEADDR	0xfffba0e0
39*4882a593Smuzhiyun #define HOSTUESTATUS	0xfffba0e4
40*4882a593Smuzhiyun 
41*4882a593Smuzhiyun static struct clk *ocpi_ck;
42*4882a593Smuzhiyun 
43*4882a593Smuzhiyun /*
44*4882a593Smuzhiyun  * Enables device access to OMAP buses via the OCPI bridge
45*4882a593Smuzhiyun  */
ocpi_enable(void)46*4882a593Smuzhiyun int ocpi_enable(void)
47*4882a593Smuzhiyun {
48*4882a593Smuzhiyun 	unsigned int val;
49*4882a593Smuzhiyun 
50*4882a593Smuzhiyun 	if (!cpu_is_omap16xx())
51*4882a593Smuzhiyun 		return -ENODEV;
52*4882a593Smuzhiyun 
53*4882a593Smuzhiyun 	/* Enable access for OHCI in OCPI */
54*4882a593Smuzhiyun 	val = omap_readl(OCPI_PROT);
55*4882a593Smuzhiyun 	val &= ~0xff;
56*4882a593Smuzhiyun 	/* val &= (1 << 0);	 Allow access only to EMIFS */
57*4882a593Smuzhiyun 	omap_writel(val, OCPI_PROT);
58*4882a593Smuzhiyun 
59*4882a593Smuzhiyun 	val = omap_readl(OCPI_SEC);
60*4882a593Smuzhiyun 	val &= ~0xff;
61*4882a593Smuzhiyun 	omap_writel(val, OCPI_SEC);
62*4882a593Smuzhiyun 
63*4882a593Smuzhiyun 	return 0;
64*4882a593Smuzhiyun }
65*4882a593Smuzhiyun EXPORT_SYMBOL(ocpi_enable);
66*4882a593Smuzhiyun 
omap_ocpi_init(void)67*4882a593Smuzhiyun static int __init omap_ocpi_init(void)
68*4882a593Smuzhiyun {
69*4882a593Smuzhiyun 	if (!cpu_is_omap16xx())
70*4882a593Smuzhiyun 		return -ENODEV;
71*4882a593Smuzhiyun 
72*4882a593Smuzhiyun 	ocpi_ck = clk_get(NULL, "l3_ocpi_ck");
73*4882a593Smuzhiyun 	if (IS_ERR(ocpi_ck))
74*4882a593Smuzhiyun 		return PTR_ERR(ocpi_ck);
75*4882a593Smuzhiyun 
76*4882a593Smuzhiyun 	clk_enable(ocpi_ck);
77*4882a593Smuzhiyun 	ocpi_enable();
78*4882a593Smuzhiyun 	pr_info("OMAP OCPI interconnect driver loaded\n");
79*4882a593Smuzhiyun 
80*4882a593Smuzhiyun 	return 0;
81*4882a593Smuzhiyun }
82*4882a593Smuzhiyun 
omap_ocpi_exit(void)83*4882a593Smuzhiyun static void __exit omap_ocpi_exit(void)
84*4882a593Smuzhiyun {
85*4882a593Smuzhiyun 	/* REVISIT: Disable OCPI */
86*4882a593Smuzhiyun 
87*4882a593Smuzhiyun 	if (!cpu_is_omap16xx())
88*4882a593Smuzhiyun 		return;
89*4882a593Smuzhiyun 
90*4882a593Smuzhiyun 	clk_disable(ocpi_ck);
91*4882a593Smuzhiyun 	clk_put(ocpi_ck);
92*4882a593Smuzhiyun }
93*4882a593Smuzhiyun 
94*4882a593Smuzhiyun MODULE_AUTHOR("Tony Lindgren <tony@atomide.com>");
95*4882a593Smuzhiyun MODULE_DESCRIPTION("OMAP OCPI bus controller module");
96*4882a593Smuzhiyun MODULE_LICENSE("GPL");
97*4882a593Smuzhiyun module_init(omap_ocpi_init);
98*4882a593Smuzhiyun module_exit(omap_ocpi_exit);
99