1/* 2 * arch/arm/mach-netx/pfifo.c 3 * 4 * Copyright (c) 2005 Sascha Hauer <s.hauer@pengutronix.de>, Pengutronix 5 * 6 * This program is free software; you can redistribute it and/or modify 7 * it under the terms of the GNU General Public License version 2 8 * as published by the Free Software Foundation. 9 * 10 * This program is distributed in the hope that it will be useful, 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 * GNU General Public License for more details. 14 * 15 * You should have received a copy of the GNU General Public License 16 * along with this program; if not, write to the Free Software 17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 18 */ 19 20#include <linux/init.h> 21#include <linux/module.h> 22#include <linux/mutex.h> 23#include <linux/io.h> 24 25#include <mach/hardware.h> 26#include <mach/netx-regs.h> 27#include <mach/pfifo.h> 28 29static DEFINE_MUTEX(pfifo_lock); 30 31static unsigned int pfifo_used = 0; 32 33int pfifo_request(unsigned int pfifo_mask) 34{ 35 int err = 0; 36 unsigned int val; 37 38 mutex_lock(&pfifo_lock); 39 40 if (pfifo_mask & pfifo_used) { 41 err = -EBUSY; 42 goto out; 43 } 44 45 pfifo_used |= pfifo_mask; 46 47 val = readl(NETX_PFIFO_RESET); 48 writel(val | pfifo_mask, NETX_PFIFO_RESET); 49 writel(val, NETX_PFIFO_RESET); 50 51out: 52 mutex_unlock(&pfifo_lock); 53 return err; 54} 55 56void pfifo_free(unsigned int pfifo_mask) 57{ 58 mutex_lock(&pfifo_lock); 59 pfifo_used &= ~pfifo_mask; 60 mutex_unlock(&pfifo_lock); 61} 62 63EXPORT_SYMBOL(pfifo_push); 64EXPORT_SYMBOL(pfifo_pop); 65EXPORT_SYMBOL(pfifo_fill_level); 66EXPORT_SYMBOL(pfifo_empty); 67EXPORT_SYMBOL(pfifo_request); 68EXPORT_SYMBOL(pfifo_free); 69