Author: gonzo
Date: Wed Feb 14 21:14:28 2018
New Revision: 329278
URL: https://svnweb.freebsd.org/changeset/base/329278

Log:
  MFC r314933-r314934
  
  r314933:
  [spigen] make spigen device ready to be compiled as a module
  
  - Add flag to indicate that device is opened by userland
  - Replace "always fail" detach method with proper detach implementation
  
  r314934:
  [spigen] Add spigen module
  
  spigen provides userland API to SPI bus. Make it available as a loadable
  module so people using official ARM images can enabled it on devices like
  BBB or RPi without re-building kernel

Added:
  stable/11/sys/modules/spigen/
     - copied from r314934, head/sys/modules/spigen/
Modified:
  stable/11/sys/dev/spibus/spigen.c
  stable/11/sys/modules/Makefile
Directory Properties:
  stable/11/   (props changed)

Modified: stable/11/sys/dev/spibus/spigen.c
==============================================================================
--- stable/11/sys/dev/spibus/spigen.c   Wed Feb 14 21:02:38 2018        
(r329277)
+++ stable/11/sys/dev/spibus/spigen.c   Wed Feb 14 21:14:28 2018        
(r329278)
@@ -53,6 +53,9 @@ __FBSDID("$FreeBSD$");
 
 #include "spibus_if.h"
 
+#define        SPIGEN_OPEN             (1 << 0)
+#define        SPIGEN_MMAP_BUSY        (1 << 1)
+
 struct spigen_softc {
        device_t sc_dev;
        struct cdev *sc_cdev;
@@ -63,8 +66,8 @@ struct spigen_softc {
        vm_object_t sc_mmap_buffer;     /* command, then data */
        vm_offset_t sc_mmap_kvaddr;
        size_t sc_mmap_buffer_size;
-       int sc_mmap_busy;
        int sc_debug;
+       int sc_flags;
 };
 
 #ifdef FDT
@@ -191,10 +194,24 @@ spigen_attach(device_t dev)
 }
 
 static int 
-spigen_open(struct cdev *dev, int oflags, int devtype, struct thread *td)
+spigen_open(struct cdev *cdev, int oflags, int devtype, struct thread *td)
 {
+       int error;
+       device_t dev;
+       struct spigen_softc *sc;
 
-       return (0);
+       error = 0;
+       dev = cdev->si_drv1;
+       sc = device_get_softc(dev);
+
+       mtx_lock(&sc->sc_mtx);
+       if (sc->sc_flags & SPIGEN_OPEN)
+               error = EBUSY;
+       else
+               sc->sc_flags |= SPIGEN_OPEN;
+       mtx_unlock(&sc->sc_mtx);
+
+       return (error);
 }
 
 static int
@@ -264,7 +281,7 @@ spigen_transfer_mmapped(struct cdev *cdev, struct spig
        int error = 0;
 
        mtx_lock(&sc->sc_mtx);
-       if (sc->sc_mmap_busy)
+       if (sc->sc_flags & SPIGEN_MMAP_BUSY)
                error = EBUSY;
        else if (stm->stm_command_length > sc->sc_command_length_max ||
            stm->stm_data_length > sc->sc_data_length_max)
@@ -275,7 +292,7 @@ spigen_transfer_mmapped(struct cdev *cdev, struct spig
            stm->stm_command_length + stm->stm_data_length)
                error = ENOMEM;
        if (error == 0)
-               sc->sc_mmap_busy = 1;
+               sc->sc_flags |= SPIGEN_MMAP_BUSY;
        mtx_unlock(&sc->sc_mtx);
        if (error)
                return (error);
@@ -288,8 +305,8 @@ spigen_transfer_mmapped(struct cdev *cdev, struct spig
        error = SPIBUS_TRANSFER(device_get_parent(dev), dev, &transfer);
 
        mtx_lock(&sc->sc_mtx);
-       KASSERT(sc->sc_mmap_busy, ("mmap no longer marked busy"));
-       sc->sc_mmap_busy = 0;
+       KASSERT((sc->sc_flags & SPIGEN_MMAP_BUSY), ("mmap no longer marked 
busy"));
+       sc->sc_flags &= ~(SPIGEN_MMAP_BUSY);
        mtx_unlock(&sc->sc_mtx);
        return (error);
 }
@@ -391,6 +408,7 @@ spigen_close(struct cdev *cdev, int fflag, int devtype
                sc->sc_mmap_buffer = NULL;
                sc->sc_mmap_buffer_size = 0;
        }
+       sc->sc_flags &= ~(SPIGEN_OPEN);
        mtx_unlock(&sc->sc_mtx);
        return (0);
 }
@@ -398,8 +416,23 @@ spigen_close(struct cdev *cdev, int fflag, int devtype
 static int
 spigen_detach(device_t dev)
 {
+       struct spigen_softc *sc;
 
-       return (EIO);
+       sc = device_get_softc(dev);
+
+       mtx_lock(&sc->sc_mtx);
+       if (sc->sc_flags & SPIGEN_OPEN) {
+               mtx_unlock(&sc->sc_mtx);
+               return (EBUSY);
+       }
+       mtx_unlock(&sc->sc_mtx);
+
+       mtx_destroy(&sc->sc_mtx);
+
+        if (sc->sc_cdev)
+                destroy_dev(sc->sc_cdev);
+       
+       return (0);
 }
 
 static devclass_t spigen_devclass;

Modified: stable/11/sys/modules/Makefile
==============================================================================
--- stable/11/sys/modules/Makefile      Wed Feb 14 21:02:38 2018        
(r329277)
+++ stable/11/sys/modules/Makefile      Wed Feb 14 21:14:28 2018        
(r329278)
@@ -359,6 +359,7 @@ SUBDIR=     \
        snp \
        sound \
        ${_speaker} \
+       spigen \
        ${_splash} \
        ${_sppp} \
        ste \
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to