-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[S390] cio: introduce isc_(un)register functions.
This interface makes it easy for drivers to register usage of different I/O interruption subclasses without needing to worry about possible other users of the same isc. Signed-off-by: Sebastian Ott <sebott@linux.vnet.ibm.com> Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com> Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com>
- Loading branch information
Sebastian Ott
authored and
Heiko Carstens
committed
Jul 14, 2008
1 parent
da7c5af
commit fcc6ab3
Showing
3 changed files
with
76 additions
and
2 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,68 @@ | ||
/* | ||
* Functions for registration of I/O interruption subclasses on s390. | ||
* | ||
* Copyright IBM Corp. 2008 | ||
* Authors: Sebastian Ott <sebott@linux.vnet.ibm.com> | ||
*/ | ||
|
||
#include <linux/spinlock.h> | ||
#include <linux/module.h> | ||
#include <asm/isc.h> | ||
|
||
static unsigned int isc_refs[MAX_ISC + 1]; | ||
static DEFINE_SPINLOCK(isc_ref_lock); | ||
|
||
|
||
/** | ||
* isc_register - register an I/O interruption subclass. | ||
* @isc: I/O interruption subclass to register | ||
* | ||
* The number of users for @isc is increased. If this is the first user to | ||
* register @isc, the corresponding I/O interruption subclass mask is enabled. | ||
* | ||
* Context: | ||
* This function must not be called in interrupt context. | ||
*/ | ||
void isc_register(unsigned int isc) | ||
{ | ||
if (isc > MAX_ISC) { | ||
WARN_ON(1); | ||
return; | ||
} | ||
|
||
spin_lock(&isc_ref_lock); | ||
if (isc_refs[isc] == 0) | ||
ctl_set_bit(6, 31 - isc); | ||
isc_refs[isc]++; | ||
spin_unlock(&isc_ref_lock); | ||
} | ||
EXPORT_SYMBOL_GPL(isc_register); | ||
|
||
/** | ||
* isc_unregister - unregister an I/O interruption subclass. | ||
* @isc: I/O interruption subclass to unregister | ||
* | ||
* The number of users for @isc is decreased. If this is the last user to | ||
* unregister @isc, the corresponding I/O interruption subclass mask is | ||
* disabled. | ||
* Note: This function must not be called if isc_register() hasn't been called | ||
* before by the driver for @isc. | ||
* | ||
* Context: | ||
* This function must not be called in interrupt context. | ||
*/ | ||
void isc_unregister(unsigned int isc) | ||
{ | ||
spin_lock(&isc_ref_lock); | ||
/* check for misuse */ | ||
if (isc > MAX_ISC || isc_refs[isc] == 0) { | ||
WARN_ON(1); | ||
goto out_unlock; | ||
} | ||
if (isc_refs[isc] == 1) | ||
ctl_clear_bit(6, 31 - isc); | ||
isc_refs[isc]--; | ||
out_unlock: | ||
spin_unlock(&isc_ref_lock); | ||
} | ||
EXPORT_SYMBOL_GPL(isc_unregister); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters