summaryrefslogtreecommitdiffstats
path: root/sys/dev/ppbus/pcfclock.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/dev/ppbus/pcfclock.c')
-rw-r--r--sys/dev/ppbus/pcfclock.c26
1 files changed, 13 insertions, 13 deletions
diff --git a/sys/dev/ppbus/pcfclock.c b/sys/dev/ppbus/pcfclock.c
index a969a84..e59a891 100644
--- a/sys/dev/ppbus/pcfclock.c
+++ b/sys/dev/ppbus/pcfclock.c
@@ -54,7 +54,6 @@ __FBSDID("$FreeBSD$");
struct pcfclock_data {
device_t dev;
struct cdev *cdev;
- int count;
};
static devclass_t pcfclock_devclass;
@@ -65,7 +64,6 @@ static d_read_t pcfclock_read;
static struct cdevsw pcfclock_cdevsw = {
.d_version = D_VERSION,
- .d_flags = D_NEEDGIANT,
.d_open = pcfclock_open,
.d_close = pcfclock_close,
.d_read = pcfclock_read,
@@ -159,13 +157,11 @@ pcfclock_open(struct cdev *dev, int flag, int fms, struct thread *td)
if (!sc)
return (ENXIO);
- if ((res = ppb_request_bus(ppbus, pcfclockdev,
- (flag & O_NONBLOCK) ? PPB_DONTWAIT : PPB_WAIT)))
- return (res);
-
- sc->count++;
-
- return (0);
+ ppb_lock(ppbus);
+ res = ppb_request_bus(ppbus, pcfclockdev,
+ (flag & O_NONBLOCK) ? PPB_DONTWAIT : PPB_WAIT);
+ ppb_unlock(ppbus);
+ return (res);
}
static int
@@ -175,9 +171,9 @@ pcfclock_close(struct cdev *dev, int flags, int fmt, struct thread *td)
device_t pcfclockdev = sc->dev;
device_t ppbus = device_get_parent(pcfclockdev);
- sc->count--;
- if (sc->count == 0)
- ppb_release_bus(ppbus, pcfclockdev);
+ ppb_lock(ppbus);
+ ppb_release_bus(ppbus, pcfclockdev);
+ ppb_unlock(ppbus);
return (0);
}
@@ -240,7 +236,7 @@ pcfclock_read_data(struct cdev *dev, char *buf, ssize_t bits)
waitfor = 100;
for (i = 0; i <= bits; i++) {
/* wait for clock, maximum (waitfor*100) usec */
- while(!CLOCK_OK && --waitfor > 0)
+ while (!CLOCK_OK && --waitfor > 0)
DELAY(100);
/* timed out? */
@@ -297,13 +293,17 @@ static int
pcfclock_read(struct cdev *dev, struct uio *uio, int ioflag)
{
struct pcfclock_data *sc = dev->si_drv1;
+ device_t ppbus;
char buf[18];
int error = 0;
if (uio->uio_resid < 18)
return (ERANGE);
+ ppbus = device_get_parent(sc->dev);
+ ppb_lock(ppbus);
error = pcfclock_read_dev(dev, buf, PCFCLOCK_MAX_RETRIES);
+ ppb_unlock(ppbus);
if (error) {
device_printf(sc->dev, "no PCF found\n");
OpenPOWER on IntegriCloud