1/* 2** dynamically loadable clk driver 3** 4** william robertson <rob@agate.berkeley.edu> 5*/ 6 7#include <sys/types.h> 8#include <sys/conf.h> 9#include <sys/errno.h> 10#include <sys/stream.h> 11#include <sys/syslog.h> 12 13#include <sun/openprom.h> 14#include <sun/vddrv.h> 15 16extern int findmod(); /* os/str_io.c */ 17 18extern struct streamtab clkinfo; 19 20struct vdldrv vd = { 21 VDMAGIC_USER, 22 "clk" 23 }; 24 25 26int 27xxxinit(function_code, vdp, vdi, vds) 28unsigned int function_code; 29struct vddrv *vdp; 30addr_t vdi; 31struct vdstat *vds; 32{ 33 register int i = 0; 34 register int j; 35 36 switch (function_code) { 37 case VDLOAD: 38 39 if (findmod("clk") >= 0) { 40 log(LOG_ERR, "clk stream module already loaded\n"); 41 return (EADDRINUSE); 42 } 43 44 i = findmod("\0"); 45 46 if (i == -1 || fmodsw[i].f_name[0] != '\0') 47 return(-1); 48 49 for (j = 0; vd.Drv_name[j] != '\0'; j++) /* XXX check bounds */ 50 fmodsw[i].f_name[j] = vd.Drv_name[j]; 51 52 fmodsw[i].f_name[j] = '\0'; 53 fmodsw[i].f_str = &clkinfo; 54 55 vdp->vdd_vdtab = (struct vdlinkage *) &vd; 56 57 return(0); 58 59 case VDUNLOAD: 60 if ((i = findmod(vd.Drv_name)) == -1) 61 return(-1); 62 63 fmodsw[i].f_name[0] = '\0'; 64 fmodsw[i].f_str = 0; 65 66 return(0); 67 68 case VDSTAT: 69 return(0); 70 71 default: 72 return(EIO); 73 } 74} 75