162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * linux/arch/arm/plat-omap/ocpi.c 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Minimal OCP bus support for omap16xx 662306a36Sopenharmony_ci * 762306a36Sopenharmony_ci * Copyright (C) 2003 - 2005 Nokia Corporation 862306a36Sopenharmony_ci * Copyright (C) 2012 Texas Instruments, Inc. 962306a36Sopenharmony_ci * Written by Tony Lindgren <tony@atomide.com> 1062306a36Sopenharmony_ci * 1162306a36Sopenharmony_ci * Modified for clock framework by Paul Mundt <paul.mundt@nokia.com>. 1262306a36Sopenharmony_ci */ 1362306a36Sopenharmony_ci 1462306a36Sopenharmony_ci#include <linux/module.h> 1562306a36Sopenharmony_ci#include <linux/types.h> 1662306a36Sopenharmony_ci#include <linux/errno.h> 1762306a36Sopenharmony_ci#include <linux/kernel.h> 1862306a36Sopenharmony_ci#include <linux/init.h> 1962306a36Sopenharmony_ci#include <linux/spinlock.h> 2062306a36Sopenharmony_ci#include <linux/err.h> 2162306a36Sopenharmony_ci#include <linux/clk.h> 2262306a36Sopenharmony_ci#include <linux/io.h> 2362306a36Sopenharmony_ci#include <linux/soc/ti/omap1-io.h> 2462306a36Sopenharmony_ci 2562306a36Sopenharmony_ci#include "hardware.h" 2662306a36Sopenharmony_ci#include "common.h" 2762306a36Sopenharmony_ci 2862306a36Sopenharmony_ci#define OCPI_BASE 0xfffec320 2962306a36Sopenharmony_ci#define OCPI_FAULT (OCPI_BASE + 0x00) 3062306a36Sopenharmony_ci#define OCPI_CMD_FAULT (OCPI_BASE + 0x04) 3162306a36Sopenharmony_ci#define OCPI_SINT0 (OCPI_BASE + 0x08) 3262306a36Sopenharmony_ci#define OCPI_TABORT (OCPI_BASE + 0x0c) 3362306a36Sopenharmony_ci#define OCPI_SINT1 (OCPI_BASE + 0x10) 3462306a36Sopenharmony_ci#define OCPI_PROT (OCPI_BASE + 0x14) 3562306a36Sopenharmony_ci#define OCPI_SEC (OCPI_BASE + 0x18) 3662306a36Sopenharmony_ci 3762306a36Sopenharmony_ci/* USB OHCI OCPI access error registers */ 3862306a36Sopenharmony_ci#define HOSTUEADDR 0xfffba0e0 3962306a36Sopenharmony_ci#define HOSTUESTATUS 0xfffba0e4 4062306a36Sopenharmony_ci 4162306a36Sopenharmony_cistatic struct clk *ocpi_ck; 4262306a36Sopenharmony_ci 4362306a36Sopenharmony_ci/* 4462306a36Sopenharmony_ci * Enables device access to OMAP buses via the OCPI bridge 4562306a36Sopenharmony_ci */ 4662306a36Sopenharmony_ciint ocpi_enable(void) 4762306a36Sopenharmony_ci{ 4862306a36Sopenharmony_ci unsigned int val; 4962306a36Sopenharmony_ci 5062306a36Sopenharmony_ci if (!cpu_is_omap16xx()) 5162306a36Sopenharmony_ci return -ENODEV; 5262306a36Sopenharmony_ci 5362306a36Sopenharmony_ci /* Enable access for OHCI in OCPI */ 5462306a36Sopenharmony_ci val = omap_readl(OCPI_PROT); 5562306a36Sopenharmony_ci val &= ~0xff; 5662306a36Sopenharmony_ci /* val &= (1 << 0); Allow access only to EMIFS */ 5762306a36Sopenharmony_ci omap_writel(val, OCPI_PROT); 5862306a36Sopenharmony_ci 5962306a36Sopenharmony_ci val = omap_readl(OCPI_SEC); 6062306a36Sopenharmony_ci val &= ~0xff; 6162306a36Sopenharmony_ci omap_writel(val, OCPI_SEC); 6262306a36Sopenharmony_ci 6362306a36Sopenharmony_ci return 0; 6462306a36Sopenharmony_ci} 6562306a36Sopenharmony_ciEXPORT_SYMBOL(ocpi_enable); 6662306a36Sopenharmony_ci 6762306a36Sopenharmony_cistatic int __init omap_ocpi_init(void) 6862306a36Sopenharmony_ci{ 6962306a36Sopenharmony_ci if (!cpu_is_omap16xx()) 7062306a36Sopenharmony_ci return -ENODEV; 7162306a36Sopenharmony_ci 7262306a36Sopenharmony_ci ocpi_ck = clk_get(NULL, "l3_ocpi_ck"); 7362306a36Sopenharmony_ci if (IS_ERR(ocpi_ck)) 7462306a36Sopenharmony_ci return PTR_ERR(ocpi_ck); 7562306a36Sopenharmony_ci 7662306a36Sopenharmony_ci clk_prepare_enable(ocpi_ck); 7762306a36Sopenharmony_ci ocpi_enable(); 7862306a36Sopenharmony_ci pr_info("OMAP OCPI interconnect driver loaded\n"); 7962306a36Sopenharmony_ci 8062306a36Sopenharmony_ci return 0; 8162306a36Sopenharmony_ci} 8262306a36Sopenharmony_ci 8362306a36Sopenharmony_cistatic void __exit omap_ocpi_exit(void) 8462306a36Sopenharmony_ci{ 8562306a36Sopenharmony_ci /* REVISIT: Disable OCPI */ 8662306a36Sopenharmony_ci 8762306a36Sopenharmony_ci if (!cpu_is_omap16xx()) 8862306a36Sopenharmony_ci return; 8962306a36Sopenharmony_ci 9062306a36Sopenharmony_ci clk_disable_unprepare(ocpi_ck); 9162306a36Sopenharmony_ci clk_put(ocpi_ck); 9262306a36Sopenharmony_ci} 9362306a36Sopenharmony_ci 9462306a36Sopenharmony_ciMODULE_AUTHOR("Tony Lindgren <tony@atomide.com>"); 9562306a36Sopenharmony_ciMODULE_DESCRIPTION("OMAP OCPI bus controller module"); 9662306a36Sopenharmony_ciMODULE_LICENSE("GPL"); 9762306a36Sopenharmony_cimodule_init(omap_ocpi_init); 9862306a36Sopenharmony_cimodule_exit(omap_ocpi_exit); 99