154359Sroberto/* 254359Sroberto** dynamically loadable clk driver 354359Sroberto** 454359Sroberto** william robertson <rob@agate.berkeley.edu> 554359Sroberto*/ 654359Sroberto 754359Sroberto#include <sys/types.h> 854359Sroberto#include <sys/conf.h> 954359Sroberto#include <sys/errno.h> 1054359Sroberto#include <sys/stream.h> 1154359Sroberto#include <sys/syslog.h> 1254359Sroberto 1354359Sroberto#include <sun/openprom.h> 1454359Sroberto#include <sun/vddrv.h> 1554359Sroberto 1654359Srobertoextern int findmod(); /* os/str_io.c */ 1754359Sroberto 1854359Srobertoextern struct streamtab clkinfo; 1954359Sroberto 2054359Srobertostruct vdldrv vd = { 2154359Sroberto VDMAGIC_USER, 2254359Sroberto "clk" 2354359Sroberto }; 2454359Sroberto 2554359Sroberto 2654359Srobertoint 2754359Srobertoxxxinit(function_code, vdp, vdi, vds) 2854359Srobertounsigned int function_code; 2954359Srobertostruct vddrv *vdp; 3054359Srobertoaddr_t vdi; 3154359Srobertostruct vdstat *vds; 3254359Sroberto{ 3354359Sroberto register int i = 0; 3454359Sroberto register int j; 3554359Sroberto 3654359Sroberto switch (function_code) { 3754359Sroberto case VDLOAD: 3854359Sroberto 3954359Sroberto if (findmod("clk") >= 0) { 4054359Sroberto log(LOG_ERR, "clk stream module already loaded\n"); 4154359Sroberto return (EADDRINUSE); 4254359Sroberto } 4354359Sroberto 4454359Sroberto i = findmod("\0"); 4554359Sroberto 4654359Sroberto if (i == -1 || fmodsw[i].f_name[0] != '\0') 4754359Sroberto return(-1); 4854359Sroberto 4954359Sroberto for (j = 0; vd.Drv_name[j] != '\0'; j++) /* XXX check bounds */ 5054359Sroberto fmodsw[i].f_name[j] = vd.Drv_name[j]; 5154359Sroberto 5254359Sroberto fmodsw[i].f_name[j] = '\0'; 5354359Sroberto fmodsw[i].f_str = &clkinfo; 5454359Sroberto 5554359Sroberto vdp->vdd_vdtab = (struct vdlinkage *) &vd; 5654359Sroberto 5754359Sroberto return(0); 5854359Sroberto 5954359Sroberto case VDUNLOAD: 6054359Sroberto if ((i = findmod(vd.Drv_name)) == -1) 6154359Sroberto return(-1); 6254359Sroberto 6354359Sroberto fmodsw[i].f_name[0] = '\0'; 6454359Sroberto fmodsw[i].f_str = 0; 6554359Sroberto 6654359Sroberto return(0); 6754359Sroberto 6854359Sroberto case VDSTAT: 6954359Sroberto return(0); 7054359Sroberto 7154359Sroberto default: 7254359Sroberto return(EIO); 7354359Sroberto } 7454359Sroberto} 75