From 24e547b88e7cfce7ee9fe2697036aed733301b5e Mon Sep 17 00:00:00 2001 From: Frodo Looijaard Date: Mon, 19 Jul 1999 11:45:27 +0000 Subject: [PATCH] First round of lm_sensors changes for the new I2C tree * The i2c package can no longer be compiled as part of the lm_sensors tree * The archive of the i2c package is removed * smbus, i2c-dev and i2c-proc modules and headers have been removed; they are now completely integrated into the i2c package * The fake i2c.h header has been removed; this also allowed us to remove the ugly LM_SENSORS and TBD defines. * A new variable I2C_HEADERS is introduced in the Makefile. This allows us to install the i2c headers in, for example, /usr/local/include/linux. * All files now include instead of "i2c.h" and "smbus.h" Status: 'make dep' works, all the right include files are found. 'make all' does not yet work. git-svn-id: http://lm-sensors.org/svn/lm-sensors/trunk@496 7894878c-1315-0410-8ee3-d5d059ff63e0 --- Makefile | 25 +- archive/mod-19990118.tar.gz | Bin 34399 -> 0 bytes kernel/Module.mk | 4 +- kernel/busses/i2c-ali15x3.c | 2 +- kernel/busses/i2c-hydra.c | 4 +- kernel/busses/i2c-isa.c | 6 +- kernel/busses/i2c-piix4.c | 2 +- kernel/busses/i2c-via.c | 4 +- kernel/busses/i2c-voodoo3.c | 2 +- kernel/chips/adm1021.c | 3 +- kernel/chips/adm9240.c | 3 +- kernel/chips/bt869.c | 3 +- kernel/chips/eeprom.c | 3 +- kernel/chips/gl518sm.c | 3 +- kernel/chips/icspll.c | 3 +- kernel/chips/lm75.c | 3 +- kernel/chips/lm78.c | 3 +- kernel/chips/lm80.c | 3 +- kernel/chips/ltc1710.c | 3 +- kernel/chips/matorb.c | 3 +- kernel/chips/maxilife.c | 3 +- kernel/chips/sis5595.c | 3 +- kernel/chips/w83781d.c | 3 +- kernel/i2c-dev.c | 545 ------------------------------------ kernel/i2c-proc.c | 501 --------------------------------- kernel/include/Module.mk | 13 +- kernel/include/i2c-dev.h | 163 ----------- kernel/include/i2c-isa.h | 11 +- kernel/include/i2c.h | 29 -- kernel/include/sensors.h | 6 - kernel/include/smbus.h | 310 -------------------- kernel/sensors.c | 3 +- kernel/smbus.c | 286 ------------------- prog/detect/i2cdetect.c | 2 +- prog/dump/i2cdump.c | 2 +- 35 files changed, 38 insertions(+), 1924 deletions(-) delete mode 100644 archive/mod-19990118.tar.gz delete mode 100644 kernel/i2c-dev.c delete mode 100644 kernel/i2c-proc.c delete mode 100644 kernel/include/i2c-dev.h delete mode 100644 kernel/include/i2c.h delete mode 100644 kernel/include/smbus.h delete mode 100644 kernel/smbus.c diff --git a/Makefile b/Makefile index 8bf63c0d..bfaaa48f 100644 --- a/Makefile +++ b/Makefile @@ -26,6 +26,12 @@ # Debian, you may want to change this to something like /usr/src/linux/include. LINUX_HEADERS=/usr/include +# If you have installed the i2c header at some other place (like +# /usr/local/include/linux), set that directory here. Please check this out +# if you get strange compilation errors; the default Linux i2c headers +# may be used mistakenly. +I2C_HEADERS=/usr/local/include + # The location of linux itself. This is only used to determine whether you # use a SMP kernel in the magic invocation just below. LINUX=/usr/src/linux @@ -44,16 +50,6 @@ MODVER := $(shell if cat $(LINUX_HEADERS)/linux/config.h $(LINUX_HEADERS)/linux/ #MODVER := 0 #MODVER := 1 -# Uncomment the second line if you do not want to compile the included -# i2c modules. WARNING! If the i2c module version does not match the -# smbus/sensor module versions, you will get into severe problems. -# If you want to use a self-compiled version of the i2c modules, make -# sure contains the *correct* i2c header file! The stock -# Linux 2.1.xxx and 2.2.x modules are *not* good enough; you really need -# Simon Vogl's version! -I2C := 1 -#I2C := 0 - # Uncomment the second line if you are a developer. This will enable many # additional warnings at compile-time #WARN := 0 @@ -129,9 +125,6 @@ MANGRP := root # The subdirectories we need to build things in SRCDIRS := kernel kernel/busses kernel/chips kernel/include lib prog/sensors \ prog/dump prog/detect etc -ifeq ($(I2C),1) -SRCDIRS += i2c i2c/detect i2c/drivers i2c/eeprom -endif # Some often-used commands with default options MKDIR := mkdir -p @@ -149,7 +142,7 @@ GREP := grep # create non-kernel object files (which are linked into executables). # ARCFLAGS are used to create archive object files (static libraries), and # LIBCFLAGS are for shared library objects. -CFLAGS := -I. -Ii2c -Ikernel/include -I$(LINUX_HEADERS) -O2 -DLM_SENSORS +CFLAGS := -I. -Ikernel/include -I$(I2C_HEADERS) -I$(LINUX_HEADERS) -O2 ifeq ($(DEBUG),1) CFLAGS += -DDEBUG @@ -160,10 +153,6 @@ CFLAGS += -Wall -Wstrict-prototypes -Wshadow -Wpointer-arith -Wcast-qual \ -Wcast-align -Wwrite-strings -Wnested-externs -Winline endif -ifeq ($(I2C),1) -CFLAGS += -DI2C -endif - MODCFLAGS := $(CFLAGS) -D__KERNEL__ -DMODULE -fomit-frame-pointer PROGCFLAGS := $(CFLAGS) ARCFLAGS := $(CFLAGS) diff --git a/archive/mod-19990118.tar.gz b/archive/mod-19990118.tar.gz deleted file mode 100644 index c02f528089767c57eaa877d91d192414f89b9a9b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34399 zcmV)8K*qlxiwFR*@}f2X1MFOTciKp@pMRxKQFam!*nk1QGA4Kru}Q{vZIgq^B)OR! zR+bu2EF`WTw%M8NXTMd|-9qAFC$mZB+`Ge>7(KeHtE;Pi_2_2CfwTR?H~zqG^F9d*7Nd`Xo_og#bUeb^G3S5550C`WfT; zpIg^r;CkX)jZv#s_jh+!u77QRzeel7Ti-dT?bUYiN%f#w{{gDsilOZ1KYaZked))1 z1a{yL+@bmRcK4!v)<5eUw|b|Yi{^F`h1*eRZ+otv+?mI(yWRFhulcwTjfCex;#*?@ z<*;a)e`L@oz}{nP=-My{LP#Rl9|DgA*COCQl+mY~*&GE$bs2M7G;)z0p zL!Wm}`j@Yt_fJl{m(TdK#xm`j%gOV#Yhmm5+g`WTKYnr6dP%b=zwv`|;wO=C zOmiecacCMi!R9|Ex6VHrP_P|%T$o#~VgsdlEdYfbjj9*GpBq-NM!|*($6eUo$ zVcniU`3C7oMvHXyR$bzXUu~6H?r4F)AoerBcXCQhVo!JiOOars0=)7 z7{TVhOf#8adt?ELW<`gWeMej+!)7&ooe?Mg?Z+aDn}{c~rnR)`OsZBSn$^4d!PDF* zaw+r^r5oEqOu}G{y(DSVbb?zo9cm_Dr?-kudN0RJZ#B2M_B1<^xa}p5Sh7^xU6O2t z*310L_D}e)C;F91r=QRC|GNh}d)4~hKH>jpNAn-CBKT=io2@|2;ncasEH=mQ!pW-Im9J@5Vt`vGdNm2@CG_%b$>mw+P5-jj>h{`QD4$j;|4;nzpW>7L`h34n7XOtoe07|A0RIp6c6J#5clLK` zwfY|8|6c7c{Qn-G?M)DO6A`*&;Umr{Kvc1>37gyIBaH#i7;P24R7OV&Z$udS!Lk<; zpqITFBeVrJy_vmQM^RTs>xN+Ob%qbn>2 z;*n6kDhaLFMH=n)t8V99PRqeq#~12RzjbobHL7=eRdfE$3;YB8X6{9=Ly_y<-c#7# z6nDs2gfgoj>9pZ_`~33szuTzKPo=8kgz%M>c(E4rSd4>kic|cjAg-_hB`&t-;&OoN z;9qy(iU=$qhvy0Gf8*K$=Vsyii00=DI~F)w%q)Gtxq*Qs;3|nKJkcl)6FZjq5U;8l z`h;&9rf%>XB|b58(qK*(IYeqk;z#b#$ML8!JBmi;p*=!l+LT=y<|jRr63{q+*vmX9dbD>i0C&Vt~YdXiWrhY>cW7Bdy7Xi80{iSMX&!EI&?vEe>T zt*_y3Z53H2xL&yO80939;8lwS(z9Yz46>Z{q3{vm>~*cuawRGiGFBtcfkVTSEDRKc ztlRX*R)lQzBjG!RjalnbA-8~=#R|JrqbV8g01DWBtyz=&5rcl9O&1C`9--;dV5ox? zU@pkyQgLZ{4=hZ_9G2RXJ19JHiX>vUgv5&q?q(nWpav&`#{Go<=1D|})bv|79w8C# zpE60HsaRwstA5CdKt8O^J)8+94lO?#h_FEGRbo9wO=Id>2C&wII;b%gn4|Gg;}EOS zcicJZ(;~k}2Yga@4&lk8 zYW;4>Uns-McPS^v#}ZlS$F1rIby3q7b$zk(LA8~)yZZT_zS!3n2Ordo)T$}PY{Iql zhy{Y%U{F|qk75a4zIfG_(RjL!x_c7{!-{H^lF$b-Zv*kzo=jD%5@dB4Rt_YI6R5GN ztH+86y+poegM7*%qa)^#QG=f%PSCgvV2))o#FASJVVCel(xP>ceN%8Tjq5=uL_v{6 zj^-HBZuqRzI_XQ;fEor71DN^p%XY8NKDv4*1l1m-m&ROj-ZkqUFLOQWy2tST9vBLM z?6ISJcme9YgRT(EY05ajo%uh7Ejl!_>fK;)??jGA!oH4@u>yS8UmBsS z*kJiwTz?QO5(dtp4S@^XHwjONu2J6I?4FF2?PRyML&=W1IYwe zSk8#jO$Y`$dW>L$JE12FlwxWE3hv%kA{ zp!Waw>jwu^|EbmXs(;mgzQ+d@w*0j|s(`^6AgdF@g91TPvJk`jam48iZHq=DcMzv$ ztAc$=<7@K-a2!mgp*tMKP&h6^?Wdpi%0C^zC6|_7R^XRl=$R%l(4*W8t$P?+W2&%F zj0sUNh;I>m8ZZhHuq_`E(LqEE-Kzv~%8jY8u#NLVdvXU;CWH?Y-w~n8NJE@C0v_GG zym$&PDJQi&c$Hjvt_o+E8Tt_?tP^??jRd)PCPZCc5Eqw<3wRMAWp>$ng{?NlyD#mJ47uPlxdtX^(=5EmIZ&-ocwzx7)hty=!oa7vNiQBP1;s(-3kFI5A8o<0-p)~Y406Q174i=F4~uu@S@X&7NBG6ogTkFYjxq(>+Y-0WxE1!DYyc_6z&o8 zfR`#1oL#tHq^AB37dIMltTnQ31TL~IP2|HYy;Fti)5D$p!|GE;gZABo zzaOtR%rB`EuPi#FSGK12mzL+>XmzKmGp8nJrx&l^_J3)2FHbuc{o~F_8;&TJt=6mP zyUa&u%bJ1}jkgn7JY>>TkXUFCi6O-|vH{1Mi*t2@Nf5?gR7Q_%1cjxw@>P{_tp+gk zf-6*3nF>Z`BXaUhPl z_zGJZ>tKXxh}Sokmxw6O7KYNj&JuDz@vvZU@g1MA)uBzsfgK=lP08YKxvZ(mS)t%# zI}uIW)V+q(q70E2+yWf{N?Vg1Ggw%d(FfPEyeDL0U#Wm0t??9OZPHbhxcD{zPdL#= zC?cFx5Jn{sR8b22xd=CMtWsoqnh>_1;5$SmZ(5O9O?$8rL`kSHnJePj-NJ1UUPl!~ zm@yI_xsxbGh%viEL?rOsYsp-R91!-Osww%v^#>nC9=l^fz>OFv_u>&YB~K69(7u>e zFU~ss(~gY%KDvV@{-gbk#_h<(cw5~)qsLoZVYIG1@g8%FApB54HJFn8i@%z%;zLXC z3*lh8&el={{-Ri(6F;`rugi)`g6|uZA%K)=!60v}&?UNGXp#o+GRbUDPD2*&k=JxQ zUSWn!m{{n31O-`#yd}h$-t2r_gCC@a=c)>WD`0}8NxFpSBg*P@1q>43Cf5|PVi}4W zb&fDBQl01Q;TE;>#|WSLY(+nY z%#?To(+LpCg`MuGG0{kQ1N;x22gWB>IOVs5Q@oe2HlWnLu$movSlfF*c5-VNGvzpi zNz*j4)2(que)(h>AhTMccPgN0W_K#UVC;p$T3*45@SA}z^=|Lz7N{VHfP%glJ!F_} z_G7?zE#*YbamGbj}_Hg%P+FXucIf7W=?aA&@>7# zF+d6^P}M{7%MO$BGK?xn^0Y4O|F!cZS1o(cp546Iqyu5;Zb>O=U;C^HO5Ccbs>`A6 z-syS!1hXr-?e`fDSPo(*7~Sw5O4eNwOLXhjMqx;T+d}KPd&ruyHB=i0(9nNweo|ifMWI~!uXJE zr9@!E>rKkTYnq0idis~J&UJr@dQ6G#7)8{bt~nADp_qIoAL;m{kQBRJ-Ny!8hMJK% zL;>!5t9{Cq)n4r7#^`o-T}W%ZzX5~ZSY|5LHi?V zwSk38p@oClG>0XGj8=$jhAPu05N1?GfVlQ6a#JqyD3Z~UH|t`J!XhM)iKB3YtCbTk z$*kEAh_2KHjz`$JS^}I;rAw+uJbY5G)Zg+>#0KxX6!nn_aGM9v0Qaa_r7yG? z2_MlFChRtBV2c_&dj>8r`eaojy5dJGbYXG*o;d5+XRTQ+&VX#TLeHu=FlBNCXms!< zmI#LPRqfsArF9{Ps}VQ@abDH8Kj9Rls0T^z*;`e zDMI-Oxw1!V@Dhhn=?e9&m~&_faxJTHpL{;eDdZA)q~b`0v20qO8fx1GJsYaWAzYrc zbY%((ev)`}E`;+?N?^5?8rZg(ogqi#On@MRYEiN$X%@zW@@z=OxKGQp#EPgp=uSxK z_!J5J3+Y0U-F~VTp!>h)b{|sRWU-~qNG#Q66A2X49?(LhYRD5F>9Y%Z2n(>2`UR%Z zFpN3#)F*B1YvIVrEjO+LNrj5E$RHi?GSvYun!M|;w&@g&d4U*dZd{8CTa=EJ^0>22 zz=*K)KZ)>dVQ6-23Sw|EhJs@bKJe!&Z(unUgA=3_F&IQ#sta0Q02XQ@6@{`3>dEwY zJ6@f&qTS)Avy)Z#+4IbrR~x1r05+RY*YGfJfqeE!wfmg|7T)X4ulJ{WW=z5JqT^%z zLoHR5H$X!qHCGH5ux*k4W}7r-vG=9ryYW)h|Ze%_g4=;zi9U zM*+zf58;g!`karp)JT}h|ENx83gn479a&Qf?Ao17xL}67R`gzd8mbwF1VS7%8^vc% z1I`9k~vu%OS_bvy`KIWsmbrZ!x|a+s+rTc znYBQ{Pb-VZ7>!{-?=9CurB87_qn`_eYm3t%vJWzi4rZ-6Zz3yMXRi<^xHJ?3t}S6a zZ|_Uyp$2U>7gDa3gC3tDX40u~E>V&d$~1_43#kQhg-_E{d=JRdFy>)tVc7Z~muB;i zNKw%?lvmam=G!mH zVmOH8eY9DCK3hy(+i|o2HnIL3>xXL7;Y?2-Q0%UUH+^=RT%jR96?nbTE*T>MJ2hp2zsW% zBtzc3Kjb}p!k07&H`Q_VOo#%R#N3c9Ev&koU2<%2q&PB|!*ZF59EL%xZEf)xNHrUI zr%%LFOrA}DaXI`Tmtx3B{h?XOQ<-IL&6VuLa&wygQ+Tr{jA%aRW zBBphwEzZCFO>*=pJsV6vx}i{$Hqh0kzHHL(XVrAfHyB$NydaoF{RtoGwP71-)oPV< z#Y|OFaie6Gt?ElHu^!aMR1cS^;iBHT{!HycN2?u5j;6=AkvzC7V{1aC6&lHul(tYR zswBLRuFkLhl&q6TaL|zWENc18@bwy?@cPMhH@m$Dwubg_Sr^O|~R7R__>wMTZ zKh_L0G?ZjbLM`yTNst9NLF*yc2y;JC+r&R5Fx8=c?H0L8lKReQL_4+ex8+Uxu~7MF z`R@nGfy{7R$4>>>b3^^8t=GON0;vc{?65Gf@QG9XyDGT=>X%Ch!&UelsVopVZ(aT! zbZv76`_!*`sC-)L(Rh8sDTq59j9lRVw)Z~3ab4$q=u#qW?Z$~E+ewthX^tq8+9emu z-Nj!50xb{#MMNNg0w5_>V%Ce@yVw;MyX)Nr0XS6Zl>Q@CQKIzqPbSUuS$5w{JLzjX zoiue{($=ZnIPFVbJ!#&IXX^HO`jUC@v)ku19Y={>^L@YXJLleW|11DfAZ1y&U zd;XvAeCIpgUsG49S$2#)ne6R0g&{*GWP=$S3+sD!Vy5;o6ygXBqU#AmhKp-8aB4wW z+gU5taIjY+;gN|VL3mPvbO_D>y&9Nr+;-b|GX2xAIAtuve6kR4)lh$$*NR(d+SE3b z7@PoFMf9gVJeZZsGj1`GZeu>e6LPyV65VZM=4G&vHVAC55r!YOCMIr!Y*M+i0bYGh zxpNX8JiFhyu{Q>Ty(TWo+zW_d69$02Y+&h!A)_OWT7|l6tgqR|vLSSX(FnggnbJQ* z-C!(aH+!;0f5$A!9Q0q947TWWYKTXpBRAE2f?Fy!FEXrt9LWQVv}w0F5#!6oF?xi1 z(3f))PYDHNxYsnF#~-CV9_@IPF_A@zrFFB|HZxsI?P1lmJe(V`^lWZ+M^+cnH8i;{ zkC(dcQA}>P`_6(ol3#VF;qJ*%UG&*5F>wj2rO-|afe@?6N?UkPq%F#BjCYv0qsDBs zn^Z-Q))+boAkmlG5j)A+2$8~iDgaU}SYSzCeYIJDf>XO$-*L^TfT2Cx-MLR#zu4H{ zg%+h4%oL2t&MsD%JG27ALTz%XpNzfXHEMIF0}90wG3KkfQ<3Q`gU?=lUvIo+dha!L zxBgq5>M;U_0pe^z3gwh7El|`SQa9T{xzHXMw-D|c-DxAXbDj!^NrKbj#O#yvg>y5@ z^waDQX>-bBJwaNw+8cwmt=wFzbw%2R_pr3|zsD2reW|&&;(w1P{N9}WY)=j>9JQ(l zzw?T>*Qc(c)+}}F@-_g6Y4?dYGh&BF*&zKf5B+MBgjd<}*D{D9x}pm8q%}wR^fLvN z$~%jLJl+%Q5k!Ktxd8;qb_bexOx4um%2s6*6Htx&SV3!i+^rJ3jm3}>ShjN`am|8W z@a8T~Uo>EE6im(emZ^JCDMsSuVpP3n(wWM)r)f@~!M1wc^|qMT-4B_}8~t!8AhhVL zX4_r&+*07H;2n>9Y%kRc*SmZ z;|_?K0;n;w(3XqQaEpgN);XZ5Ff(_4Ua_i#o^vGQ^A_?S7n&l-H1pQqW>zmjFbT2r zU?JfW8o@IV7!|?uTCFD=j`x|;HJ6*{9%Pcov-!=`(RA(X*<4DPi<IlOuaCcQ~?U6zM>n4QxD^_UU&dgEEe2a!&QgyKCAJ%KH_ zvP_`;lg8&I-+Z|TCwmyib;Dn<+b&Lr%sMptVA4e*A;Koouzljv@`d@ud zg+0-|mRWDq`s%gDhcm@err13T*ws0wrk5rcXBObcFnN^DL4D_FxxylKMO!F%^bE$x zHl#P3SXzlSeefMHK-4?e+`?GlTQ9jicFD_di(@P=T&q#w6xaiaVMdMJf3b`(P?uMn zZp;!e8tXf<-H=vj_KXuE^IHlQtEswk-KncSm8JF&w#sP+#+b^d`^A>>y3<~1cAPPF zh6mG_SaEj~+UI~c97qPJ8%h!VUZazg@w^rCPoS(LkPmW`shzF*m2K7^3WG0r)_dl9 zv(2^l{eu1f;`GGS#p%0O$8P?Ahx;x2{~YZ9v$_5Q|Bv_NnrF6Zk?BoiLQZ&PrP*$P z(o8Hv8J2b3J6+g$ufb{@PNFqi1}Fqp5hib)9mEyc!i%jD6A%__?J9jL?Stt#gn(=& z)@h-1KKy(jk(d+%g*r6~MOT_c+i!S2d^_9}IxI1jrLED?b})cPc|m7N@pzvC<6FFv z7$dk7?7yX{EgCCCG;(rw`d(7;K9)TYhJ=$7VZgZwUEM!IMRG_KTW88N5prvw^d`dO z0Nl+Z865^%&_G8TSmV{}giG0S&E@zkRBLtMWvh9f^Zz}TaT$qeiW=&vGuf=1xBGB5 z?o*d%Ce$PlKm1g&0mVwQ*e-V-Q%e`I{q>#Yokeg#hVregBryBh*g_9~S~;Co#tU>% z(qLgtG98}@7-*g|>bwkFf?Doc@lipYv>3vA`pj*oUKEp7E-w`6%ze&juht17sjzsmy7B};N4?tY zbTb5eC8z6@GL2>`LzN{a;BB-8KbzWj&t{QtVHnhKz2Ec^2&-1jA<&@B86p7ogeac& zw0}ctyig{|9u!F`kvQ*nL%=HCrFC}2Dq8G*JIX}0+ii`WKE1KAkqH%d`lq>`(?kwl zFLs^N1lxPquYmsnBu@SM-E#l3tN-8OkpGt~eI4NcdvV;0NZw56pMJADEyI73o(pm(gr)H18E~ z^5jY7thET@>P@0EVL1wYxsxZuCFQxK;nUfn({xVB3XJA+qd2_mtt8Px-MiD9o~~`8 ze8)g-t`_MwChSip>@^0M8ia%RQ{N}IG4YVw7!kTyWM8q z`Sp&QQL?!sRByr^&FvZ>`$kBMQNTxAN`Y&c^E}sb>7t(HJ_Lt?)=EK}(#u!qt(Yxp zj|7o<%SEjk9+{WkcB0?9yg~CLGKI6LQ}B;~>lNvjAQP9#VqOBa;W0kRzE)C7{E()S zY^@dY#KK<%_BTNUwG_-uAOAogv*NU(a>5=ugs&;K_jD(`Vt?%?#}LN;DfI!>uSV5K3bGpIYVg|vfOx|1om_PAz{h2m_p_IoycN7=RB%_MhupytSAX=} zrKM*q90|jVxT}-OILc!9qvTOV=l3n5o7f`Kn0iJDPJK;efS}nLNKY;=&Wfe*((L52 zDy~;hP+ZrljRXd=o?uB?ZAasCS=Yn6DYc|a<%c~RzU0&i%W~7%4~N(Gh{n6l(%Z14 z?R0ma*1gWFB<5x%%~U~bDoTApd^9dj)upFty@IsSM6jF3%cGvXkYbY|V=*M_U5iVs z<))WrV8O^!F@^StMk0`k!McI<5NL3CrrIMBsp*x9|*ufQo^Lv zcD_cc2F}%bOL&796%>UZ?d8Dzv2IYPkFa^3_J6Ga=9Ui|D^dpI{xE9{J(p0-6j4H!0CYfbHM&N zVE??W*gshI%>5bKlLO%WZr*M1R(iYNjdC^YF<18Nde>ttoS(QfyIeRov4oH@{lg<- zIl&RAMOSpL3DZkLg>ZvpBx$hR#Ij?tW0Aufh{1^lJ|FT-6J|GtyILS)ieooNV-DeQ2DHJm*&W6?n5c6YnHhQLQ|(g*}`C71(?h*y$GBb`gb4k^(~YnZWH0uq|_98P!~w`a(b6~^tvH%^}Wvn^ZLps7aCt4 zk=yUF92mKS3j{k0D1}g$h=b$MIkQ^^1C;r>cs#qA&vKqz-Z0zd;;kZ0k~xC%Tc{&2 zp>7C?jA-n^r+^9+yEHX{az~_Gbw<1~Dk>L0hU39zEKSZLeRf3JF|116c3sjFWXFAO zS#|j{b6y3x95)<0M;snxqRQv=rh-8)y~A@Ku3`#?iIioy;(I))A6JH5Z-|o+xHoF> zE#=OcQCRS;s!>176BsF;w9QOXNxzp@92Mi7jGH~_Kry~iD|KW%QKqj%ums{sWH^;e z1+(a>5C>U*j~LdU$M|#Cj?4WE z6zJ>AUJJzHjVh3Nh@QS{kbTH(rR42027N;n;9TucV%pQ-zti z$-B8jvrMcxO8!%lOD?jg{ys7CO%KIK?Tt#TGZNZ9D~y{F z^I7?r(TZHOVQq5eRBMg!a8$OPbe`EV1&0XZ#Dn8yG*=vPS}le&di^7reGah}y&>Yq z^|B8pGX^jQJ*M3H;z0|w6JC)ai{1!Pgby+HXbM_>*IVJatCFmvG?CC=^}_WYe{_>g zdC;5?1Acc3bK5Q^&^#NB3O@8y&hH8T5B%R|z1#;K#?yDH4mFS+9vtkc|3_CA{NLRLiX>yt>*m(!@ z{t?cv*j`;1`9mnj#N<<~`l+;MepL~399>Dc3KP08zK1Y{e&((nsqi*q62ec>zK4

(9Ja0#Nv-;!NvX2FdiuAh@Dr#Q? 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 diff --git a/kernel/Module.mk b/kernel/Module.mk index f2ef9344..d3dcf82e 100644 --- a/kernel/Module.mk +++ b/kernel/Module.mk @@ -22,9 +22,7 @@ MODULE_DIR := kernel # Regrettably, even 'simply expanded variables' will not put their currently # defined value verbatim into the command-list of rules... -KERNELTARGETS := $(MODULE_DIR)/smbus.o \ - $(MODULE_DIR)/i2c-proc.o \ - $(MODULE_DIR)/i2c-dev.o $(MODULE_DIR)/sensors.o +KERNELTARGETS := $(MODULE_DIR)/sensors.o # Include all dependency files INCLUDEFILES += $(KERNELTARGETS:.o=.d) diff --git a/kernel/busses/i2c-ali15x3.c b/kernel/busses/i2c-ali15x3.c index c7a84aeb..cf9ae69c 100644 --- a/kernel/busses/i2c-ali15x3.c +++ b/kernel/busses/i2c-ali15x3.c @@ -74,7 +74,7 @@ #include #include #include -#include "smbus.h" +#include #include "version.h" #include "compat.h" diff --git a/kernel/busses/i2c-hydra.c b/kernel/busses/i2c-hydra.c index be8ae5a6..a2bb2796 100644 --- a/kernel/busses/i2c-hydra.c +++ b/kernel/busses/i2c-hydra.c @@ -31,8 +31,8 @@ #include #include -#include "i2c.h" -#include "algo-bit.h" +#include +#include #include "compat.h" #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,1,54)) diff --git a/kernel/busses/i2c-isa.c b/kernel/busses/i2c-isa.c index f0d96b9c..0f564b8c 100644 --- a/kernel/busses/i2c-isa.c +++ b/kernel/busses/i2c-isa.c @@ -29,16 +29,12 @@ #include "compat.h" -#include "i2c.h" -#ifdef I2C_SPINLOCK -#include -#else +#include #if LINUX_VERSION_CODE < KERNEL_VERSION(2,0,19) #include #else #include #endif -#endif #include "version.h" #include "i2c-isa.h" diff --git a/kernel/busses/i2c-piix4.c b/kernel/busses/i2c-piix4.c index 333f3fe6..dd839a8a 100644 --- a/kernel/busses/i2c-piix4.c +++ b/kernel/busses/i2c-piix4.c @@ -28,7 +28,7 @@ #include #include #include -#include "smbus.h" +#include #include "version.h" #include "compat.h" diff --git a/kernel/busses/i2c-via.c b/kernel/busses/i2c-via.c index bdefac83..45f3ac0e 100644 --- a/kernel/busses/i2c-via.c +++ b/kernel/busses/i2c-via.c @@ -33,8 +33,8 @@ #include #endif -#include "i2c.h" -#include "algo-bit.h" +#include +#include #include "compat.h" /* PCI device */ diff --git a/kernel/busses/i2c-voodoo3.c b/kernel/busses/i2c-voodoo3.c index 6a22446f..b8130901 100644 --- a/kernel/busses/i2c-voodoo3.c +++ b/kernel/busses/i2c-voodoo3.c @@ -36,7 +36,7 @@ #include #include #include -#include "smbus.h" +#include #include "version.h" #include "compat.h" diff --git a/kernel/chips/adm1021.c b/kernel/chips/adm1021.c index b699cebc..9d4041f1 100644 --- a/kernel/chips/adm1021.c +++ b/kernel/chips/adm1021.c @@ -21,9 +21,8 @@ #include #include -#include "smbus.h" +#include #include "sensors.h" -#include "i2c.h" #include "i2c-isa.h" #include "version.h" #include "compat.h" diff --git a/kernel/chips/adm9240.c b/kernel/chips/adm9240.c index 6b07b345..2f15211d 100644 --- a/kernel/chips/adm9240.c +++ b/kernel/chips/adm9240.c @@ -54,11 +54,10 @@ #include #include #include -#include "smbus.h" +#include #include "version.h" #include "i2c-isa.h" #include "sensors.h" -#include "i2c.h" #include "compat.h" diff --git a/kernel/chips/bt869.c b/kernel/chips/bt869.c index bb0d95ed..3d3504ad 100644 --- a/kernel/chips/bt869.c +++ b/kernel/chips/bt869.c @@ -23,9 +23,8 @@ #include #include -#include "smbus.h" +#include #include "sensors.h" -#include "i2c.h" #include "i2c-isa.h" #include "version.h" #include "compat.h" diff --git a/kernel/chips/eeprom.c b/kernel/chips/eeprom.c index 16aac7c4..30235a17 100644 --- a/kernel/chips/eeprom.c +++ b/kernel/chips/eeprom.c @@ -21,9 +21,8 @@ #include #include -#include "smbus.h" +#include #include "sensors.h" -#include "i2c.h" #include "i2c-isa.h" #include "version.h" #include "compat.h" diff --git a/kernel/chips/gl518sm.c b/kernel/chips/gl518sm.c index 32b3987d..1de54872 100644 --- a/kernel/chips/gl518sm.c +++ b/kernel/chips/gl518sm.c @@ -22,9 +22,8 @@ #include #include -#include "smbus.h" +#include #include "sensors.h" -#include "i2c.h" #include "version.h" #include "compat.h" diff --git a/kernel/chips/icspll.c b/kernel/chips/icspll.c index 5b25db05..f6483a98 100644 --- a/kernel/chips/icspll.c +++ b/kernel/chips/icspll.c @@ -30,9 +30,8 @@ #include #include -#include "smbus.h" +#include #include "sensors.h" -#include "i2c.h" #include "i2c-isa.h" #include "version.h" diff --git a/kernel/chips/lm75.c b/kernel/chips/lm75.c index ce15cc5d..06209ff9 100644 --- a/kernel/chips/lm75.c +++ b/kernel/chips/lm75.c @@ -20,9 +20,8 @@ #include #include -#include "smbus.h" +#include #include "sensors.h" -#include "i2c.h" #include "i2c-isa.h" #include "version.h" #include "compat.h" diff --git a/kernel/chips/lm78.c b/kernel/chips/lm78.c index 765d4e23..8ff0adc1 100644 --- a/kernel/chips/lm78.c +++ b/kernel/chips/lm78.c @@ -26,11 +26,10 @@ #include #include #include -#include "smbus.h" +#include #include "version.h" #include "i2c-isa.h" #include "sensors.h" -#include "i2c.h" #include "compat.h" /* Addresses to scan */ diff --git a/kernel/chips/lm80.c b/kernel/chips/lm80.c index 7699bfd7..0809108b 100644 --- a/kernel/chips/lm80.c +++ b/kernel/chips/lm80.c @@ -27,11 +27,10 @@ #include #include #include -#include "smbus.h" +#include #include "version.h" #include "i2c-isa.h" #include "sensors.h" -#include "i2c.h" #include "compat.h" /* Addresses to scan */ diff --git a/kernel/chips/ltc1710.c b/kernel/chips/ltc1710.c index a8d334ed..28c2d311 100644 --- a/kernel/chips/ltc1710.c +++ b/kernel/chips/ltc1710.c @@ -43,9 +43,8 @@ #include #include -#include "smbus.h" +#include #include "sensors.h" -#include "i2c.h" #include "i2c-isa.h" #include "version.h" #include "compat.h" diff --git a/kernel/chips/matorb.c b/kernel/chips/matorb.c index 3aebffe2..33aac6f4 100644 --- a/kernel/chips/matorb.c +++ b/kernel/chips/matorb.c @@ -24,9 +24,8 @@ #include #include -#include "smbus.h" +#include #include "sensors.h" -#include "i2c.h" #include "i2c-isa.h" #include "version.h" #include "compat.h" diff --git a/kernel/chips/maxilife.c b/kernel/chips/maxilife.c index e54675e1..27da6c40 100644 --- a/kernel/chips/maxilife.c +++ b/kernel/chips/maxilife.c @@ -46,10 +46,9 @@ static const char *version_str = "1.00 25/2/99 Fons Rademakers"; #include #include #include -#include "smbus.h" +#include #include "version.h" #include "sensors.h" -#include "i2c.h" #include "compat.h" diff --git a/kernel/chips/sis5595.c b/kernel/chips/sis5595.c index 657196f7..62c537db 100644 --- a/kernel/chips/sis5595.c +++ b/kernel/chips/sis5595.c @@ -32,11 +32,10 @@ #include #include #include -#include "smbus.h" +#include #include "version.h" #include "i2c-isa.h" #include "sensors.h" -#include "i2c.h" #include "compat.h" /* Addresses to scan. diff --git a/kernel/chips/w83781d.c b/kernel/chips/w83781d.c index d532eda9..222205b6 100644 --- a/kernel/chips/w83781d.c +++ b/kernel/chips/w83781d.c @@ -38,11 +38,10 @@ #include #include #include -#include "smbus.h" +#include #include "version.h" #include "i2c-isa.h" #include "sensors.h" -#include "i2c.h" #include "compat.h" /* RT Table support #defined so we can take it out if it gets bothersome */ diff --git a/kernel/i2c-dev.c b/kernel/i2c-dev.c deleted file mode 100644 index f14f05df..00000000 --- a/kernel/i2c-dev.c +++ /dev/null @@ -1,545 +0,0 @@ -/* - i2c-dev.c - Part of lm_sensors, Linux kernel modules for hardware - monitoring - Copyright (c) 1995-1997, 1999 by Frodo Looijaard and - Simon Vogl - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -*/ - -/* Note that this is a complete rewrite of Simon Vogl's i2c-dev module. - But I have used so much of his original code and ideas that it seems - only fair to recognize him as co-author -- Frodo */ - -#include -#include -#include -#include "i2c.h" -#include "compat.h" -#include "smbus.h" -#include "i2c-isa.h" -#include "sensors.h" -#include "version.h" -#include "i2c-dev.h" - -#ifdef MODULE -extern int init_module(void); -extern int cleanup_module(void); -#endif /* def MODULE */ - -/* struct file_operations changed too often in the 2.1 series for nice code */ - -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,1,70)) -static loff_t i2cdev_lseek (struct file *file, loff_t offset, int origin); -#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(2,1,56)) -static long long i2cdev_lseek (struct file *file, long long offset, int origin); -#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(2,1,0)) -static long long i2cdev_llseek (struct inode *inode, struct file *file, - long long offset, int origin); -#else -static int i2cdev_lseek (struct inode *inode, struct file *file, off_t offset, - int origin); -#endif - -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,1,70)) -static ssize_t i2cdev_read (struct file *file, char *buf, size_t count, - loff_t *offset); -static ssize_t i2cdev_write (struct file *file, const char *buf, size_t count, - loff_t *offset); -#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(2,1,0)) -static long i2cdev_read (struct inode *inode, struct file *file, char *buf, - unsigned long count); -static long i2cdev_write (struct inode *inode, struct file *file, - const char *buf, unsigned long offset); -#else -static int i2cdev_read(struct inode *inode, struct file *file, char *buf, - int count); -static int i2cdev_write(struct inode *inode, struct file *file, - const char *buf, int count); -#endif - -static int i2cdev_ioctl (struct inode *inode, struct file *file, - unsigned int cmd, unsigned long arg); -static int i2cdev_open (struct inode *inode, struct file *file); - -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,1,31)) -static int i2cdev_release (struct inode *inode, struct file *file); -#else -static void i2cdev_release (struct inode *inode, struct file *file); -#endif - - -static int i2cdev_attach_adapter(struct i2c_adapter *adap); -static int i2cdev_detach_client(struct i2c_client *client); -static int i2cdev_command(struct i2c_client *client, unsigned int cmd, - void *arg); -static void i2cdev_inc_use(struct i2c_client *client); -static void i2cdev_dec_use(struct i2c_client *client); - -static int i2cdev_init(void); -static int i2cdev_cleanup(void); - -static struct file_operations i2cdev_fops = { - i2cdev_lseek, - i2cdev_read, - i2cdev_write, - NULL, /* i2cdev_readdir */ - NULL, /* i2cdev_select */ - i2cdev_ioctl, - NULL, /* i2cdev_mmap */ - i2cdev_open, -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,1,118) - NULL, /* i2cdev_flush */ -#endif - i2cdev_release, -}; - -#define I2CDEV_CLIENTS_MAX I2C_ADAP_MAX -static struct i2c_client *i2cdev_clients[I2CDEV_CLIENTS_MAX]; - -static struct i2c_driver i2cdev_driver = { - /* name */ "i2c-dev dummy driver", - /* id */ I2C_DRIVERID_I2CDEV, - /* flags */ DF_NOTIFY, - /* attach_adapter */ &i2cdev_attach_adapter, - /* detach_client */ &i2cdev_detach_client, - /* command */ &i2cdev_command, - /* inc_use */ &i2cdev_inc_use, - /* dec_use */ &i2cdev_dec_use -}; - -static struct i2c_client i2cdev_client_template = { - /* name */ "I2C /dev entry", - /* id */ 1, - /* flags */ 0, - /* addr */ -1, - /* adapter */ NULL, - /* driver */ &i2cdev_driver, - /* data */ NULL -}; - -static int i2cdev_initialized; - -/* Note that the lseek function is called llseek in 2.1 kernels. But things - are complicated enough as is. */ -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,1,70)) -loff_t i2cdev_lseek (struct file *file, loff_t offset, int origin) -#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(2,1,56)) -long long i2cdev_lseek (struct file *file, long long offset, int origin) -#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(2,1,0)) -long long i2cdev_llseek (struct inode *inode, struct file *file, - long long offset, int origin) -#else -int i2cdev_lseek (struct inode *inode, struct file *file, off_t offset, - int origin) -#endif -{ -#ifdef DEBUG -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,1,56)) - struct inode *inode = file->f_dentry->d_inode; -#endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(2,1,70)) */ - printk("i2c_dev,o: i2c-%d lseek to %ld bytes relative to %d.\n", - MINOR(inode->i_rdev),(long) offset,origin); -#endif /* DEBUG */ - return -ESPIPE; -} - -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,1,70)) -static ssize_t i2cdev_read (struct file *file, char *buf, size_t count, - loff_t *offset) -#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(2,1,0)) -static long i2cdev_read (struct inode *inode, struct file *file, char *buf, - unsigned long count) -#else -static int i2cdev_read(struct inode *inode, struct file *file, char *buf, - int count) -#endif -{ - char *tmp; - int ret; - -#ifdef DEBUG -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,1,70)) - struct inode *inode = file->f_dentry->d_inode; -#endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(2,1,70)) */ -#endif /* DEBUG */ - - struct i2c_client *client = (struct i2c_client *)file->private_data; - - /* copy user space data to kernel space. */ - tmp = kmalloc(count,GFP_KERNEL); - if (tmp==NULL) - return -ENOMEM; - -#ifdef DEBUG - printk("i2c_dev,o: i2c-%d reading %d bytes.\n",MINOR(inode->i_rdev),count); -#endif - - ret = i2c_master_recv(client,tmp,count); - copy_to_user(buf,tmp,count); - kfree(tmp); - return ret; -} - -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,1,70)) -static ssize_t i2cdev_write (struct file *file, const char *buf, size_t count, - loff_t *offset) -#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(2,1,0)) -static long i2cdev_write (struct inode *inode, struct file *file, - const char *buf, unsigned long offset) -#else -static int i2cdev_write(struct inode *inode, struct file *file, - const char *buf, int count) -#endif -{ - int ret; - char *tmp; - struct i2c_client *client = (struct i2c_client *)file->private_data; - -#ifdef DEBUG -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,1,70)) - struct inode *inode = file->f_dentry->d_inode; -#endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(2,1,70)) */ -#endif /* DEBUG */ - - /* copy user space data to kernel space. */ - tmp = kmalloc(count,GFP_KERNEL); - if (tmp==NULL) - return -ENOMEM; - copy_from_user(tmp,buf,count); - -#ifdef DEBUG - printk("i2c_dev,o: i2c-%d writing %d bytes.\n",MINOR(inode->i_rdev),count); -#endif - ret = i2c_master_send(client,tmp,count); - kfree(tmp); - return ret; -} - -int i2cdev_ioctl (struct inode *inode, struct file *file, unsigned int cmd, - unsigned long arg) -{ - struct i2c_client *client = (struct i2c_client *)file->private_data; - struct i2c_smbus_data data_arg; - union smbus_data temp; - int ver,datasize,res; - -#ifdef DEBUG - printk("i2c_dev.o: i2c-%d ioctl, cmd: 0x%x, arg: %lx.\n", - MINOR(inode->i_rdev),cmd, arg); -#endif /* DEBUG */ - - switch ( cmd ) { - case I2C_SLAVE: - if (arg > 0x7f) - return -EINVAL; - client->addr = arg; - return 0; - case I2C_TENBIT: - printk("i2c-dev.o: ioctl I2C_TENBIT not (yet) supported!\n"); - return -EINVAL; - case I2C_SMBUS: - if (! arg) { -#ifdef DEBUG - printk("i2c-dev.o: NULL argument pointer in ioctl I2C_SMBUS.\n"); -#endif - return -EINVAL; - } - if (verify_area(VERIFY_READ,(struct i2c_smbus_data *) arg, - sizeof(struct i2c_smbus_data))) { -#ifdef DEBUG - printk("i2c-dev.o: invalid argument pointer (%ld) " - "in IOCTL I2C_SMBUS.\n", arg); -#endif - return -EINVAL; - } - copy_from_user(&data_arg,(struct i2c_smbus_data *) arg, - sizeof(struct i2c_smbus_data)); - if ((data_arg.size != SMBUS_BYTE) && - (data_arg.size != SMBUS_QUICK) && - (data_arg.size != SMBUS_BYTE_DATA) && - (data_arg.size != SMBUS_WORD_DATA) && - (data_arg.size != SMBUS_PROC_CALL) && - (data_arg.size != SMBUS_BLOCK_DATA)) { -#ifdef DEBUG - printk("i2c-dev.o: size out of range (%x) in ioctl I2C_SMBUS.\n", - data_arg.size); -#endif - return -EINVAL; - } - /* Note that SMBUS_READ and SMBUS_WRITE are 0 and 1, so the check is - valid if size==SMBUS_QUICK too. */ - if ((data_arg.read_write != SMBUS_READ) && - (data_arg.read_write != SMBUS_WRITE)) { -#ifdef DEBUG - printk("i2c-dev.o: read_write out of range (%x) in ioctl I2C_SMBUS.\n", - data_arg.read_write); -#endif - return -EINVAL; - } - - /* Note that command values are always valid! */ - - if ((data_arg.size == SMBUS_QUICK) || - ((data_arg.size == SMBUS_BYTE) && - (data_arg.read_write == SMBUS_WRITE))) - /* These are special: we do not use data */ - return smbus_access(client->adapter, client->addr, - data_arg.read_write, data_arg.command, - data_arg.size, NULL); - - if (data_arg.data == NULL) { -#ifdef DEBUG - printk("i2c-dev.o: data is NULL pointer in ioctl I2C_SMBUS.\n"); -#endif - return -EINVAL; - } - - /* This seems unlogical but it is not: if the user wants to read a - value, we must write that value to user memory! */ - ver = ((data_arg.read_write == SMBUS_WRITE) && - (data_arg.size != SMBUS_PROC_CALL))?VERIFY_READ:VERIFY_WRITE; - - if ((data_arg.size == SMBUS_BYTE_DATA) || (data_arg.size == SMBUS_BYTE)) - datasize = sizeof(data_arg.data->byte); - else if ((data_arg.size == SMBUS_WORD_DATA) || - (data_arg.size == SMBUS_PROC_CALL)) - datasize = sizeof(data_arg.data->word); - else /* size == SMBUS_BLOCK_DATA */ - datasize = sizeof(data_arg.data->block); - - if (verify_area(ver,data_arg.data,datasize)) { -#ifdef DEBUG - printk("i2c-dev.o: invalid pointer data (%p) in ioctl I2C_SMBUS.\n", - data_arg.data); -#endif - return -EINVAL; - } - - if ((data_arg.size == SMBUS_PROC_CALL) || - (data_arg.read_write == SMBUS_WRITE)) - copy_from_user(&temp,data_arg.data,datasize); - res = smbus_access(client->adapter,client->addr,data_arg.read_write, - data_arg.command,data_arg.size,&temp); - if (! res && ((data_arg.size == SMBUS_PROC_CALL) || - (data_arg.read_write == SMBUS_READ))) - copy_to_user(data_arg.data,&temp,datasize); - return res; - - default: - return i2c_control(client,cmd,arg); - } - return 0; -} - -int i2cdev_open (struct inode *inode, struct file *file) -{ - unsigned int minor = MINOR(inode->i_rdev); - struct i2c_client *client; - - if ((minor >= I2CDEV_CLIENTS_MAX) || ! (i2cdev_clients[minor])) { -#ifdef DEBUG - printk("i2c-dev.o: Trying to open unattached adapter i2c-%d\n",minor); -#endif - return -ENODEV; - } - - /* Note that we here allocate a client for later use, but we will *not* - register this client! Yes, this is safe. No, it is not very clean. */ - if(! (client = kmalloc(sizeof(struct i2c_client),GFP_KERNEL))) - return -ENOMEM; - memcpy(client,&i2cdev_client_template,sizeof(struct i2c_client)); - client->adapter = i2cdev_clients[minor]->adapter; - file->private_data = client; - - MOD_INC_USE_COUNT; - -#ifdef DEBUG - printk("i2c-dev.o: opened i2c-%d\n",minor); -#endif - return 0; -} - -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,1,31)) -static int i2cdev_release (struct inode *inode, struct file *file) -#else -static void i2cdev_release (struct inode *inode, struct file *file) -#endif -{ - kfree(file->private_data); - file->private_data=NULL; -#ifdef DEBUG - printk("i2c-dev.o: Closed: i2c-%d\n", MINOR(inode->i_rdev)); -#endif - MOD_DEC_USE_COUNT; -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,1,31)) - return 0; -#endif -} - -int i2cdev_attach_adapter(struct i2c_adapter *adap) -{ - int i,res; - struct i2c_client *client; - - if ((i = i2c_adapter_id(adap)) < 0) { - printk("i2c-dev.o: Unknown adapter to attach?!?\n"); - return -ENODEV; - } - if (i >= I2CDEV_CLIENTS_MAX) { - printk("i2c-dev.o: Adapter number to attach too large?!? (%d)\n",i); - return -ENODEV; - } - if (i2cdev_clients[i]) { - printk("i2c-dev.o: Adapter to attach already in use?!? (%d)\n",i); - return -EBUSY; - } - if (i2c_is_isa_adapter(adap)) { -#ifdef DEBUG - printk("i2c-dev.o: Can't attach ISA adapter!\n"); -#endif - return 0; - } - - if (! (client = (struct i2c_client *)kmalloc(sizeof(struct i2c_client), - GFP_KERNEL))) - return -ENOMEM; - memcpy(client,&i2cdev_client_template,sizeof(struct i2c_client)); - client->adapter = adap; - if ((res = i2c_attach_client(client))) { - printk("i2c-dev.o: Attaching client failed.\n"); - kfree(client); - return res; - } - i2cdev_clients[i] = client; - printk("i2c-dev.o: Registered '%s' as minor %d\n",adap->name,i); - return 0; -} - -int i2cdev_detach_client(struct i2c_client *client) -{ - struct i2c_adapter *adap = client->adapter; - int i,res; - - if ((i = i2c_adapter_id(adap)) < 0) { - printk("i2c-dev.o: Detaching unknown adapter?!?\n"); - return -ENODEV; - } - if (i >= I2CDEV_CLIENTS_MAX) { - printk("i2c-dev.o: Adapter number to detach too large?!? (%d)\n",i); - return -ENODEV; - } - if (!i2cdev_clients[i]) { - printk("i2c-dev.o: Adapter to detach not in use?!? (%d)\n",i); - return -ENODEV; - } - - if ((res = i2c_detach_client(client))) { - printk("i2c-dev.o: detaching client %d failed.\n",i); - return res; - } - - kfree(i2cdev_clients[i]); - i2cdev_clients[i] = NULL; - -#ifdef DEBUG - printk("i2c-dev.o: Adapter unregistered: %s\n",adap->name); -#endif - return 0; -} - -static int i2cdev_command(struct i2c_client *client, unsigned int cmd, - void *arg) -{ - return -1; -} - - -static void i2cdev_inc_use(struct i2c_client *client) -{ -#ifdef MODULE - MOD_INC_USE_COUNT; -#endif -} - -static void i2cdev_dec_use(struct i2c_client *client) -{ -#ifdef MODULE - MOD_DEC_USE_COUNT; -#endif -} - -int i2cdev_init(void) -{ - int res; - - printk("i2c-dev.o version %s (%s)\n",LM_VERSION,LM_DATE); - i2cdev_initialized = 0; - if (register_chrdev(I2C_MAJOR,"i2c",&i2cdev_fops)) { - printk("i2c-dev.o: unable to get major %d for i2c bus\n",I2C_MAJOR); - return -EIO; - } - i2cdev_initialized ++; - - if ((res = i2c_add_driver(&i2cdev_driver))) { - printk("i2c-dev.o: Driver registration failed, module not inserted.\n"); - i2cdev_cleanup(); - return res; - } - i2cdev_initialized ++; - return 0; -} - -int i2cdev_cleanup(void) -{ - int res; - - if (i2cdev_initialized >= 2) { - if ((res = i2c_del_driver(&i2cdev_driver))) { - printk("i2c-dev.o: Driver deregistration failed, " - "module not removed.\n"); - return res; - } - i2cdev_initialized ++; - } - - if (i2cdev_initialized >= 1) { - if ((res = unregister_chrdev(I2C_MAJOR,"i2c"))) { - printk("i2c-dev.o: unable to release major %d for i2c bus\n",I2C_MAJOR); - return res; - } - i2cdev_initialized --; - } - return 0; -} - - -#ifdef MODULE - -MODULE_AUTHOR("Frodo Looijaard and Simon G. Vogl "); -MODULE_DESCRIPTION("I2C /dev entries driver"); - -int init_module(void) -{ - return i2cdev_init(); -} - -int cleanup_module(void) -{ - return i2cdev_cleanup(); -} - -#endif /* def MODULE */ - diff --git a/kernel/i2c-proc.c b/kernel/i2c-proc.c deleted file mode 100644 index b8dff185..00000000 --- a/kernel/i2c-proc.c +++ /dev/null @@ -1,501 +0,0 @@ -/* - i2c-proc.c - Part of lm_sensors, Linux kernel modules for hardware - monitoring - Copyright (c) 1998, 1999 Frodo Looijaard - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -*/ - -#include -#include - -#include "i2c.h" -#include "smbus.h" -#include "i2c-isa.h" -#include "version.h" -#include "compat.h" -#include "sensors.h" - -#ifdef MODULE -extern int init_module(void); -extern int cleanup_module(void); -#endif /* def MODULE */ - -static int i2cproc_init(void); -static int i2cproc_cleanup(void); -static int i2cproc_attach_adapter(struct i2c_adapter *adapter); -static int i2cproc_detach_client(struct i2c_client *client); -static int i2cproc_command(struct i2c_client *client, unsigned int cmd, - void *arg); -static void i2cproc_inc_use(struct i2c_client *client); -static void i2cproc_dec_use(struct i2c_client *client); - -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,1,58)) -static void monitor_bus_i2c(struct inode *inode, int fill); -#endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(2,1,58)) */ - -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,1,29)) - -static ssize_t i2cproc_bus_read(struct file * file, char * buf,size_t count, - loff_t *ppos); -static int read_bus_i2c(char *buf, char **start, off_t offset, int len, - int *eof , void *private); - -#else /* (LINUX_VERSION_CODE < KERNEL_VERSION(2,1,29)) */ - -static int i2cproc_bus_read(struct inode * inode, struct file * file, - char * buf, int count); -static int read_bus_i2c(char *buf, char **start, off_t offset, int len, - int unused); - -static struct proc_dir_entry proc_bus_dir = - { - /* low_ino */ 0, /* Set by proc_register_dynamic */ - /* namelen */ 3, - /* name */ "bus", - /* mode */ S_IRUGO | S_IXUGO | S_IFDIR, - /* nlink */ 2, /* Corrected by proc_register[_dynamic] */ - /* uid */ 0, - /* gid */ 0, - /* size */ 0, -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,0,36)) - /* ops */ &proc_dir_inode_operations, -#endif - }; - -static struct proc_dir_entry proc_bus_i2c_dir = - { - /* low_ino */ 0, /* Set by proc_register_dynamic */ - /* namelen */ 3, - /* name */ "i2c", - /* mode */ S_IRUGO | S_IFREG, - /* nlink */ 1, - /* uid */ 0, - /* gid */ 0, - /* size */ 0, - /* ops */ NULL, - /* get_info */ &read_bus_i2c - }; - -/* List of registered entries in /proc/bus */ -static struct proc_dir_entry *i2cproc_proc_entries[I2C_ADAP_MAX]; - -#endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(2,1,29)) */ - -/* To implement the dynamic /proc/bus/i2c-? files, we need our own - implementation of the read hook */ -static struct file_operations i2cproc_operations = { - NULL, - i2cproc_bus_read, -}; - -static struct inode_operations i2cproc_inode_operations = { - &i2cproc_operations -}; - - -/* Used by init/cleanup */ -static int i2cproc_initialized; - -/* This is a sorted list of all adapters that will have entries in /proc/bus */ -static struct i2c_adapter *i2cproc_adapters[I2C_ADAP_MAX]; - -/* Inodes of /dev/bus/i2c-? files */ -static int i2cproc_inodes[I2C_ADAP_MAX]; - -/* We will use a nasty trick: we register a driver, that will be notified - for each adapter. Then, we register a dummy client on the adapter, that - will get notified if the adapter is removed. This is the same trick as - used in i2c/i2c-dev.c */ -static struct i2c_driver i2cproc_driver = { - /* name */ "i2c-proc dummy driver", - /* id */ I2C_DRIVERID_I2CPROC, - /* flags */ DF_NOTIFY, - /* attach_adapter */ &i2cproc_attach_adapter, - /* detach_client */ &i2cproc_detach_client, - /* command */ &i2cproc_command, - /* inc_use */ &i2cproc_inc_use, - /* dec_use */ &i2cproc_dec_use -}; - -static struct i2c_client i2cproc_client_template = { - /* name */ "i2c-proc dummy client", - /* id */ 1, - /* flags */ 0, - /* addr */ -1, - /* adapter */ NULL, - /* driver */ &i2cproc_driver, - /* data */ NULL -}; - - -int i2cproc_init(void) -{ - int res; - -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,1,29)) - struct proc_dir_entry *proc_bus_i2c; -#endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(2,1,29)) */ - - printk("i2c-proc.o version %s (%s)\n",LM_VERSION,LM_DATE); - i2cproc_initialized = 0; - -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,1,29)) - if (! proc_bus) { - printk("i2c-proc.o: /proc/bus/ does not exist, module not inserted.\n"); - i2cproc_cleanup(); - return -ENOENT; - } - proc_bus_i2c = create_proc_entry("i2c",0,proc_bus); - if (!proc_bus_i2c) { - printk("i2c-proc.o: Could not create /proc/bus/i2c, " - "module not inserted.\n"); - i2cproc_cleanup(); - return -ENOENT; - } - proc_bus_i2c->read_proc = &read_bus_i2c; -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,1,58)) - proc_bus_i2c->fill_inode = &monitor_bus_i2c; -#endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(2,1,29)) */ - i2cproc_initialized += 2; -#else /* (LINUX_VERSION_CODE < KERNEL_VERSION(2,1,29)) */ - /* In Linux 2.0.x, there is no /proc/bus! But I hope no other module - introduced it, or we are fucked. And 2.0.35 and earlier does not - export proc_dir_inode_operations, so we grab it from proc_net, - which also uses it. Not nice. */ -/* #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,0,36) */ - proc_bus_dir.ops = proc_net.ops; -/* #endif */ - if ((res = proc_register_dynamic(&proc_root, &proc_bus_dir))) { - printk("i2c-proc.o: Could not create /proc/bus/, module not inserted.\n"); - i2cproc_cleanup(); - return res; - } - i2cproc_initialized ++; - if ((res = proc_register_dynamic(&proc_bus_dir, &proc_bus_i2c_dir))) { - printk("i2c-proc.o: Could not create /proc/bus/i2c, " - "module not inserted.\n"); - i2cproc_cleanup(); - return res; - } - i2cproc_initialized ++; -#endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(2,1,29)) */ - if ((res = i2c_add_driver(&i2cproc_driver))) { - printk("i2c-proc.o: Driver registration failed, module not inserted.\n"); - i2cproc_cleanup(); - return res; - } - i2cproc_initialized ++; - return 0; -} - -int i2cproc_cleanup(void) -{ - int res; - - if (i2cproc_initialized >= 3) { - if ((res = i2c_del_driver(&i2cproc_driver))) { - printk("i2c-proc.o: Driver deregistration failed, " - "module not removed.\n"); - return res; - } - i2cproc_initialized--; - } - if (i2cproc_initialized >= 1) { -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,1,29)) - remove_proc_entry("i2c",proc_bus); - i2cproc_initialized -= 2; -#else /* (LINUX_VERSION_CODE < KERNEL_VERSION(2,1,29)) */ - if (i2cproc_initialized >= 2) { - if ((res = proc_unregister(&proc_bus_dir,proc_bus_i2c_dir.low_ino))) { - printk("i2c-proc.o: could not delete /proc/bus/i2c, " - "module not removed."); - return res; - } - i2cproc_initialized --; - } - if ((res = proc_unregister(&proc_root,proc_bus_dir.low_ino))) { - printk("i2c-proc.o: could not delete /proc/bus/, " - "module not removed."); - return res; - } - i2cproc_initialized --; -#endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(2,1,29)) */ - } - return 0; -} - -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,1,58)) -/* Monitor access to /proc/bus/i2c*; make unloading i2c-proc.o impossible - if some process still uses it or some file in it */ -void monitor_bus_i2c(struct inode *inode, int fill) -{ - if (fill) - MOD_INC_USE_COUNT; - else - MOD_DEC_USE_COUNT; -} -#endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(2,1,58)) */ - - -/* This function generates the output for /proc/bus/i2c */ -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,1,29)) -int read_bus_i2c(char *buf, char **start, off_t offset, int len, int *eof, - void *private) -#else /* (LINUX_VERSION_CODE < KERNEL_VERSION(2,1,29)) */ -int read_bus_i2c(char *buf, char **start, off_t offset, int len, int unused) -#endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(2,1,29)) */ -{ - int i; - int nr = 0; - /* Note that it is safe to write a `little' beyond len. Yes, really. */ - for (i = 0; (i < I2C_ADAP_MAX) && (nr < len); i++) - if (i2cproc_adapters[i]) - nr += sprintf(buf+nr, "i2c-%d\t%s\t%-32s\t%-32s\n", - i2c_adapter_id(i2cproc_adapters[i]), - i2c_is_smbus_adapter(i2cproc_adapters[i])?"smbus": -#ifdef DEBUG - i2c_is_isa_adapter(i2cproc_adapters[i])?"isa": -#endif /* def DEBUG */ - "i2c", - i2cproc_adapters[i]->name, - i2cproc_adapters[i]->algo->name); - return nr; -} - -/* This function generates the output for /proc/bus/i2c-? */ -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,1,29)) -ssize_t i2cproc_bus_read(struct file * file, char * buf,size_t count, - loff_t *ppos) -{ - struct inode * inode = file->f_dentry->d_inode; -#else (LINUX_VERSION_CODE < KERNEL_VERSION(2,1,29)) -int i2cproc_bus_read(struct inode * inode, struct file * file,char * buf, - int count) -{ -#endif (LINUX_VERSION_CODE >= KERNEL_VERSION(2,1,29)) - char *kbuf; - struct i2c_client *client; - int i,j,len=0; - - if (count < 0) - return -EINVAL; - if (count > 4000) - count = 4000; - for (i = 0; i < I2C_ADAP_MAX; i++) - if (i2cproc_inodes[i] == inode->i_ino) { - /* We need a bit of slack in the kernel buffer; this makes the - sprintf safe. */ - if (! (kbuf = kmalloc(count + 80,GFP_KERNEL))) - return -ENOMEM; - for (j = 0; j < I2C_CLIENT_MAX; j++) - if ((client = i2cproc_adapters[i]->clients[j])) - /* Filter out dummy clients */ -#ifndef DEBUG - if ((client->driver->id != I2C_DRIVERID_I2CPROC) && - (client->driver->id != I2C_DRIVERID_I2CDEV)) -#endif /* ndef DEBUG */ - len += sprintf(kbuf+len,"%x\t%-32s\t%-32s\n", -#ifdef DEBUG - i2c_is_isa_client(client)? - ((struct isa_client *) client)->isa_addr&0xffffff: -#endif /* def DEBUG */ - client->addr, - client->name,client->driver->name); - if (file->f_pos+len > count) - len = count - file->f_pos; - len = len - file->f_pos; - if (len < 0) - len = 0; - copy_to_user (buf,kbuf+file->f_pos,len); - file->f_pos += len; - kfree(kbuf); - return len; - } - return -ENOENT; -} - - -/* We need to add the adapter to i2cproc_adapters, if it is interesting - enough */ -int i2cproc_attach_adapter(struct i2c_adapter *adapter) -{ - struct i2c_client *client; - int i,res; - char name[8]; - - struct proc_dir_entry *proc_entry; - -#ifndef DEBUG - if (i2c_is_isa_adapter(adapter)) - return 0; -#endif /* ndef DEBUG */ - - for (i = 0; i < I2C_ADAP_MAX; i++) - if(!i2cproc_adapters[i]) - break; - if (i == I2C_ADAP_MAX) { - printk("i2c-proc.o: Too many adapters!\n"); - return -ENOMEM; - } - -#ifndef DEBUG - if (! (client = kmalloc(sizeof(struct i2c_client),GFP_KERNEL))) { -#else /* def DEBUG */ - if (! (client = kmalloc(sizeof(struct isa_client),GFP_KERNEL))) { -#endif - printk("i2c-proc.o: Out of memory!\n"); - return -ENOMEM; - } - memcpy(client,&i2cproc_client_template,sizeof(struct i2c_client)); -#ifdef DEBUG - ((struct isa_client *) client) -> isa_addr = -1; -#endif /* def DEBUG */ - client->adapter = adapter; - if ((res = i2c_attach_client(client))) { - printk("i2c-proc.o: Attaching client failed.\n"); - kfree(client); - return res; - } - i2cproc_adapters[i] = adapter; - - sprintf(name,"i2c-%d",i2c_adapter_id(adapter)); - -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,1,29)) - proc_entry = create_proc_entry(name,0,proc_bus); - if (! proc_entry) { - printk("i2c-proc.o: Could not create /proc/bus/%s\n",name); - kfree(client); - return -ENOENT; - } - proc_entry->ops = &i2cproc_inode_operations; -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,1,58)) - proc_entry->fill_inode = &monitor_bus_i2c; -#endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(2,1,58)) */ -#else /* (LINUX_VERSION_CODE < KERNEL_VERSION(2,1,29)) */ - if (!(proc_entry = kmalloc(sizeof(struct proc_dir_entry)+strlen(name)+1, - GFP_KERNEL))) { - printk("i2c-proc.o: Out of memory!\n"); - return -ENOMEM; - } - - memset(proc_entry,0,sizeof(struct proc_dir_entry)); - proc_entry->namelen = strlen(name); - proc_entry->name = (char *) (proc_entry + 1); - proc_entry->mode = S_IRUGO | S_IFREG; - proc_entry->nlink = 1; - proc_entry->ops = &i2cproc_inode_operations; - - /* Nasty stuff to keep GCC satisfied */ - { - char *procname; - (const char *) procname = proc_entry->name; - strcpy (procname,name); - } - - if ((res = proc_register_dynamic(&proc_bus_dir, proc_entry))) { - printk("i2c-proc.o: Could not create %s.\n",name); - kfree(proc_entry); - kfree(client); - return res; - } - - i2cproc_proc_entries[i] = proc_entry; -#endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(2,1,29)) */ - - i2cproc_inodes[i] = proc_entry->low_ino; - return 0; -} - -int i2cproc_detach_client(struct i2c_client *client) -{ - int i,res; -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,1,29)) - char name[8]; -#endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(2,1,29)) */ - -#ifndef DEBUG - if (i2c_is_isa_client(client)) - return 0; -#endif /* ndef DEBUG */ - - for (i = 0; i < I2C_ADAP_MAX; i++) - if (client->adapter == i2cproc_adapters[i]) { -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,1,29)) - sprintf(name,"i2c-%d",i2c_adapter_id(i2cproc_adapters[i])); - remove_proc_entry(name,proc_bus); -#else /* (LINUX_VERSION_CODE < KERNEL_VERSION(2,1,29)) */ - if ((res = proc_unregister(&proc_bus_dir, - i2cproc_proc_entries[i]->low_ino))) { - printk("i2c-proc.o: Deregistration of /proc entry failed, " - "client not detached.\n"); - return res; - } - kfree(i2cproc_proc_entries[i]); - i2cproc_proc_entries[i] = NULL; -#endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(2,1,29)) */ - if ((res = i2c_detach_client(client))) { - printk("i2c-proc.o: Client deregistration failed, " - "client not detached.\n"); - return res; - } - i2cproc_adapters[i] = NULL; - i2cproc_inodes[i] = 0; - kfree(client); - return 0; - } - return -ENOENT; -} - -/* Nothing here yet */ -int i2cproc_command(struct i2c_client *client, unsigned int cmd, - void *arg) -{ - return -1; -} - -/* Nothing here yet */ -void i2cproc_inc_use(struct i2c_client *client) -{ -#ifdef MODULE - MOD_INC_USE_COUNT; -#endif -} - -/* Nothing here yet */ -void i2cproc_dec_use(struct i2c_client *client) -{ -#ifdef MODULE - MOD_DEC_USE_COUNT; -#endif -} - -#ifdef MODULE - -MODULE_AUTHOR("Frodo Looijaard "); -MODULE_DESCRIPTION("I2C /proc/bus entries driver"); - -int init_module(void) -{ - return i2cproc_init(); -} - -int cleanup_module(void) -{ - return i2cproc_cleanup(); -} - -#endif /* def MODULE */ - diff --git a/kernel/include/Module.mk b/kernel/include/Module.mk index 75d16030..72f945bd 100644 --- a/kernel/include/Module.mk +++ b/kernel/include/Module.mk @@ -20,18 +20,13 @@ # verbatim in the rules, until it is redefined. MODULE_DIR := kernel/include -KERNELINCLUDEFILES := $(MODULE_DIR)/sensors.h $(MODULE_DIR)/i2c-isa.h \ - $(MODULE_DIR)/smbus.h $(MODULE_DIR)/i2c-dev.h +KERNELINCLUDEFILES := $(MODULE_DIR)/sensors.h $(MODULE_DIR)/i2c-isa.h + install-all-kernel-include: $(MKDIR) $(SYSINCLUDEDIR) - for file in $(KERNELINCLUDEFILES) ; do \ - $(RM) $$file.install; \ - $(GREP) -v '/\* TBD \*/' $$file > $$file.install; \ - $(INSTALL) -o root -g root -m 644 $$file.install \ - $(SYSINCLUDEDIR)/`basename $$file`; \ - $(RM) $$file.install; \ - done + $(INSTALL) -o root -g root -m 644 $(KERNELINCLUDEFILES) $(SYSINCLUDEDIR) + install :: install-all-kernel-include clean-all-kernel-include: diff --git a/kernel/include/i2c-dev.h b/kernel/include/i2c-dev.h deleted file mode 100644 index cfbd5f4c..00000000 --- a/kernel/include/i2c-dev.h +++ /dev/null @@ -1,163 +0,0 @@ -/* - i2c-dev.h - Part of lm_sensors, Linux kernel modules for hardware - monitoring - Copyright (c) 1998, 1999 Frodo Looijaard - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -*/ - -/* Important note: */ /* TBD */ -/* Lines like these, with the 'TBD' remark (To Be Deleted) */ /* TBD */ -/* WILL BE DELETED when this file is installed. */ /* TBD */ -/* This allows us to get rid of the ugly LM_SENSORS define */ /* TBD */ - -#ifndef SENSORS_I2C_DEV_H -#define SENSORS_I2C_DEV_H - -#ifdef LM_SENSORS /* TBD */ -#include "i2c.h" /* TBD */ -#include "smbus.h" /* TBD */ -#else /* ndef LM_SENSORS */ /* TBD */ -#include -#include -#endif /* def LM_SENSORS */ /* TBD */ - -#include - -/* Some IOCTL commands are defined in */ -/* Note: 10-bit addresses are NOT supported! */ - -#define I2C_SMBUS 0x0720 - -/* This is the structure as used in the I2C_SMBUS ioctl call */ -struct i2c_smbus_data { - char read_write; - __u8 command; - int size; - union smbus_data *data; -}; - -#ifndef __KERNEL__ - -#include - -extern inline __s32 i2c_smbus_access(int file, char read_write, __u8 command, - int size, union smbus_data *data) -{ - struct i2c_smbus_data args; - - args.read_write = read_write; - args.command = command; - args.size = size; - args.data = data; - return ioctl(file,I2C_SMBUS,&args); -} - - -extern inline __s32 i2c_smbus_write_quick(int file, __u8 value) -{ - return i2c_smbus_access(file,value,0,SMBUS_QUICK,NULL); -} - -extern inline __s32 i2c_smbus_read_byte(int file) -{ - union smbus_data data; - if (i2c_smbus_access(file,SMBUS_READ,0,SMBUS_BYTE,&data)) - return -1; - else - return 0x0FF & data.byte; -} - -extern inline __s32 i2c_smbus_write_byte(int file, __u8 value) -{ - return i2c_smbus_access(file,SMBUS_WRITE,value, SMBUS_BYTE,NULL); -} - -extern inline __s32 i2c_smbus_read_byte_data(int file, __u8 command) -{ - union smbus_data data; - if (i2c_smbus_access(file,SMBUS_READ,command,SMBUS_BYTE_DATA,&data)) - return -1; - else - return 0x0FF & data.byte; -} - -extern inline __s32 i2c_smbus_write_byte_data(int file, __u8 command, - __u8 value) -{ - union smbus_data data; - data.byte = value; - return i2c_smbus_access(file,SMBUS_WRITE,command,SMBUS_BYTE_DATA,&data); -} - -extern inline __s32 i2c_smbus_read_word_data(int file, __u8 command) -{ - union smbus_data data; - if (i2c_smbus_access(file,SMBUS_READ,command,SMBUS_WORD_DATA,&data)) - return -1; - else - return 0x0FFFF & data.word; -} - -extern inline __s32 i2c_smbus_write_word_data(int file, __u8 command, - __u16 value) -{ - union smbus_data data; - data.word = value; - return i2c_smbus_access(file,SMBUS_WRITE,command,SMBUS_WORD_DATA, &data); -} - -extern inline __s32 i2c_smbus_process_call(int file, __u8 command, __u16 value) -{ - union smbus_data data; - data.word = value; - if (i2c_smbus_access(file,SMBUS_WRITE,command,SMBUS_PROC_CALL,&data)) - return -1; - else - return 0x0FFFF & data.word; -} - - -/* Returns the number of read bytes */ -extern inline __s32 i2c_smbus_read_block_data(int file, __u8 command, - __u8 *values) -{ - union smbus_data data; - int i; - if (i2c_smbus_access(file,SMBUS_READ,command,SMBUS_BLOCK_DATA,&data)) - return -1; - else { - for (i = 1; i <= data.block[0]; i++) - values[i-1] = data.block[i]; - return data.block[0]; - } -} - -extern inline __s32 i2c_smbus_write_block_data(int file, __u8 command, - __u8 length, __u8 *values) -{ - union smbus_data data; - int i; - if (length > 32) - length = 32; - for (i = 1; i <= length; i++) - data.block[i] = values[i-1]; - data.block[0] = length; - return i2c_smbus_access(file,SMBUS_WRITE,command,SMBUS_BLOCK_DATA,&data); -} - -#endif /* ndef __KERNEL__ */ - -#endif diff --git a/kernel/include/i2c-isa.h b/kernel/include/i2c-isa.h index e81b72fc..0e4e13e2 100644 --- a/kernel/include/i2c-isa.h +++ b/kernel/include/i2c-isa.h @@ -18,11 +18,6 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* Important note: */ /* TBD */ -/* Lines like these, with the 'TBD' remark (To Be Deleted) */ /* TBD */ -/* WILL BE DELETED when this file is installed. */ /* TBD */ -/* This allows us to get rid of the ugly LM_SENSORS define */ /* TBD */ - #ifndef SENSORS_SENSOR_H #define SENSORS_SENSOR_H @@ -46,11 +41,7 @@ #endif #endif -#ifdef LM_SENSORS /* TBD */ -#include "i2c.h" /* TBD */ -#else /* ndef LM_SENSORS */ /* TBD */ -#include -#endif /* def LM_SENSORS */ /* TBD */ +#include /* Note that this driver is *not* built upon smbus.c, but is parallel to it. We do not need SMBus facilities if we are on the ISA bus, after all */ diff --git a/kernel/include/i2c.h b/kernel/include/i2c.h deleted file mode 100644 index 99eb0faa..00000000 --- a/kernel/include/i2c.h +++ /dev/null @@ -1,29 +0,0 @@ -/* - i2c.h - Part of lm_sensors, Linux kernel modules for hardware - monitoring - Copyright (c) 1998, 1999 Frodo Looijaard - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -*/ - -/* This is a stub files, that either includes (the kernel - header) or "i2c/i2c.h" (the header in the i2c directory). */ - -#ifdef I2C -#include "i2c/i2c.h" -#else /* def I2C */ -#include -#endif /* def I2C */ - diff --git a/kernel/include/sensors.h b/kernel/include/sensors.h index 1e85ddff..90f18cce 100644 --- a/kernel/include/sensors.h +++ b/kernel/include/sensors.h @@ -18,12 +18,6 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* Important note: */ /* TBD */ -/* Lines like these, with the 'TBD' remark (To Be Deleted) */ /* TBD */ -/* WILL BE DELETED when this file is installed. */ /* TBD */ -/* This allows us to get rid of the ugly LM_SENSORS define */ /* TBD */ - - #ifndef SENSORS_SENSORS_H #define SENSORS_SENSORS_H diff --git a/kernel/include/smbus.h b/kernel/include/smbus.h deleted file mode 100644 index cf788292..00000000 --- a/kernel/include/smbus.h +++ /dev/null @@ -1,310 +0,0 @@ -/* - smbus.h - Part of lm_sensors, Linux kernel modules for hardware - monitoring - Copyright (c) 1998, 1999 Frodo Looijaard - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -*/ - -/* Important note: */ /* TBD */ -/* Lines like these, with the 'TBD' remark (To Be Deleted) */ /* TBD */ -/* WILL BE DELETED when this file is installed. */ /* TBD */ -/* This allows us to get rid of the ugly LM_SENSORS define */ /* TBD */ - -#ifndef SENSORS_SMBUS_H -#define SENSORS_SMBUS_H - -/* This file must interface with Simon Vogl's i2c driver. Version 19981006 is - OK, earlier versions are not; later versions will probably give problems - too. -*/ -#include - -/* This union is used within smbus_access routines */ -union smbus_data { - __u8 byte; - __u16 word; - __u8 block[33]; /* block[0] is used for length */ -}; - -/* smbus_access read or write markers */ -#define SMBUS_READ 1 -#define SMBUS_WRITE 0 - -/* SMBus transaction types (size parameter in the above functions) - Note: these no longer correspond to the (arbitrary) PIIX4 internal codes! */ -#define SMBUS_QUICK 0 -#define SMBUS_BYTE 1 -#define SMBUS_BYTE_DATA 2 -#define SMBUS_WORD_DATA 3 -#define SMBUS_PROC_CALL 4 -#define SMBUS_BLOCK_DATA 5 - -#ifdef __KERNEL__ - -/* I2C_SPINLOCK is defined in i2c.h. */ -#ifdef I2C_SPINLOCK -#include -#else -#if LINUX_VERSION_CODE < 0x020019 -#include -#else -#include -#endif -#endif - -#ifdef LM_SENSORS /* TBD */ -#include "i2c.h" /* TBD */ -#else /* TBD */ -#include -#endif /* TBD */ - -/* Declarations, to keep the compiler happy */ -struct smbus_driver; -struct smbus_client; -struct smbus_algorithm; -struct smbus_adapter; -union smbus_data; - -/* A driver tells us how we should handle a specific kind of chip. - A specific instance of such a chip is called a client. - This structure is essentially the same as i2c_driver. */ -struct smbus_driver { - char name[32]; - int id; - unsigned int flags; - int (* attach_adapter) (struct smbus_adapter *); - int (* detach_client) (struct smbus_client *); - int (* command) (struct smbus_client *, unsigned int cmd, void *arg); - void (* inc_use) (struct smbus_client *); - void (* dec_use) (struct smbus_client *); -}; - -/* A client is a specifc instance of a chip: for each detected chip, there will - be a client. Its operation is controlled by a driver. - This structure is essentially the same as i2c_client. */ -struct smbus_client { - char name[32]; - int id; - unsigned int flags; - unsigned char addr; - struct smbus_adapter *adapter; - struct smbus_driver *driver; - void *data; -}; - -/* An algorithm describes how a certain class of busses can be accessed. - A specific instance of sucj a bus is called an adapter. - This structure is essentially the same as i2c_adapter. */ -struct smbus_algorithm { - char name[32]; - unsigned int id; - int (* master_xfer) (struct smbus_adapter *adap, struct i2c_msg msgs[], - int num); - int (* slave_send) (struct smbus_adapter *,char *, int); - int (* slave_recv) (struct smbus_adapter *,char *, int); - int (* algo_control) (struct smbus_adapter *, unsigned int, unsigned long); - int (* client_register) (struct smbus_client *); - int (* client_unregister) (struct smbus_client *); -}; - -/* An adapter is a specifc instance of a bus: for each detected bus, there will - be an adapter. Its operation is controlled by an algorithm. - I2C_SPINLOCK must be the same as declared in i2c.h. - This structure is an extension of i2c_algorithm. */ -struct smbus_adapter { - char name[32]; - unsigned int id; - struct smbus_algorithm *algo; - void *data; -#ifdef I2C_SPINLOCK - spinlock_t lock; - unsigned long lockflags; -#else - struct semaphore lock; -#endif - unsigned int flags; - struct smbus_client *clients[I2C_CLIENT_MAX]; - int client_count; - int timeout; - int retries; - - /* Here ended i2c_adapter */ - s32 (* smbus_access) (u8 addr, char read_write, - u8 command, int size, union smbus_data * data); -}; - -/* We need to mark SMBus algorithms in the algorithm structure. - Note that any and all adapters using a non-i2c driver use in this - setup ALGO_SMBUS. Adapters define their own smbus access routine. - This also means that adapter->smbus_access is only available if - this flag is set! */ -#define ALGO_SMBUS 0x40000 - -/* SMBus Adapter ids */ -#define SMBUS_PIIX4 1 -#define SMBUS_VOODOO3 2 - -/* Detect whether we are on an SMBus-only bus. Note that if this returns - false, you can still use the smbus access routines, as these emulate - the SMBus on I2C. Unless they are undefined on your algorithm, of - course. */ -#define i2c_is_smbus_client(clientptr) \ - ((clientptr)->adapter->algo->id == ALGO_SMBUS) -#define i2c_is_smbus_adapter(adapptr) \ - ((adapptr)->algo->id == ALGO_SMBUS) - - -/* Declare an algorithm structure. All SMBus derived adapters should use this - algorithm! */ -extern struct smbus_algorithm smbus_algorithm; - -/* This is the very generalized SMBus access routine. You probably do not - want to use this, though; one of the functions below may be much easier, - and probably just as fast. - Note that we use i2c_adapter here, because you do not need a specific - smbus adapter to call this function. */ -extern s32 smbus_access (struct i2c_adapter * adapter, u8 addr, - char read_write, u8 command, int size, - union smbus_data * data); - -/* Now follow the 'nice' access routines. These also document the calling - conventions of smbus_access. */ - -extern inline s32 smbus_write_quick(struct i2c_adapter * adapter, u8 addr, - u8 value) -{ - return smbus_access(adapter,addr,value,0,SMBUS_QUICK,NULL); -} - -extern inline s32 smbus_read_byte(struct i2c_adapter * adapter,u8 addr) -{ - union smbus_data data; - if (smbus_access(adapter,addr,SMBUS_READ,0,SMBUS_BYTE,&data)) - return -1; - else - return 0x0FF & data.byte; -} - -extern inline s32 smbus_write_byte(struct i2c_adapter * adapter, u8 addr, - u8 value) -{ - return smbus_access(adapter,addr,SMBUS_WRITE,value, SMBUS_BYTE,NULL); -} - -extern inline s32 smbus_read_byte_data(struct i2c_adapter * adapter, - u8 addr, u8 command) -{ - union smbus_data data; - if (smbus_access(adapter,addr,SMBUS_READ,command,SMBUS_BYTE_DATA,&data)) - return -1; - else - return 0x0FF & data.byte; -} - -extern inline s32 smbus_write_byte_data(struct i2c_adapter * adapter, - u8 addr, u8 command, u8 value) -{ - union smbus_data data; - data.byte = value; - return smbus_access(adapter,addr,SMBUS_WRITE,command,SMBUS_BYTE_DATA,&data); -} - -extern inline s32 smbus_read_word_data(struct i2c_adapter * adapter, - u8 addr, u8 command) -{ - union smbus_data data; - if (smbus_access(adapter,addr,SMBUS_READ,command,SMBUS_WORD_DATA,&data)) - return -1; - else - return 0x0FFFF & data.word; -} - -extern inline s32 smbus_write_word_data(struct i2c_adapter * adapter, - u8 addr, u8 command, u16 value) -{ - union smbus_data data; - data.word = value; - return smbus_access(adapter,addr,SMBUS_WRITE,command,SMBUS_WORD_DATA,&data); -} - -extern inline s32 smbus_process_call(struct i2c_adapter * adapter, - u8 addr, u8 command, u16 value) -{ - union smbus_data data; - data.word = value; - if (smbus_access(adapter,addr,SMBUS_WRITE,command,SMBUS_PROC_CALL,&data)) - return -1; - else - return 0x0FFFF & data.word; -} - -/* Returns the number of read bytes */ -extern inline s32 smbus_read_block_data(struct i2c_adapter * adapter, - u8 addr, u8 command, u8 *values) -{ - union smbus_data data; - int i; - if (smbus_access(adapter,addr,SMBUS_READ,command,SMBUS_BLOCK_DATA,&data)) - return -1; - else { - for (i = 1; i <= data.block[0]; i++) - values[i-1] = data.block[i]; - return data.block[0]; - } -} - -extern inline s32 smbus_write_block_data(struct i2c_adapter * adapter, - u8 addr, u8 command, u8 length, - u8 *values) -{ - union smbus_data data; - int i; - if (length > 32) - length = 32; - for (i = 1; i <= length; i++) - data.block[i] = values[i-1]; - data.block[0] = length; - return smbus_access(adapter,addr,SMBUS_WRITE,command,SMBUS_BLOCK_DATA,&data); -} - - -/* Next: define SMBus variants of registering. */ - -#define smbus_add_algorithm(algoptr) \ - i2c_add_algorithm((struct i2c_algorithm *) (algoptr)) -#define smbus_del_algorithm(algoptr) \ - i2c_del_algorithm((struct i2c_algorithm *) (algoptr)) - -#define smbus_add_adapter(adapptr) \ - i2c_add_adapter((struct i2c_adapter *) (adapptr)) -#define smbus_del_adapter(adapptr) \ - i2c_del_adapter((struct i2c_adapter *) (adapptr)) - -#define smbus_add_driver(driverptr) \ - i2c_add_driver((struct i2c_driver *) (driverptr)) -#define smbus_del_driver(driverptr) \ - i2c_add_driver((struct i2c_driver *) (driverptr)) - -#define smbus_attach_client(clientptr) \ - i2c_attach_client((struct i2c_client *) (clientptr)) -#define smbus_detach_client(clientptr) \ - i2c_detach_client((struct i2c_client *) (clientptr)) - - -#endif /* def __KERNEL__ */ - -#endif /* ndef SENSORS_SMBUS_H */ - diff --git a/kernel/sensors.c b/kernel/sensors.c index d2480ada..cee2fc82 100644 --- a/kernel/sensors.c +++ b/kernel/sensors.c @@ -25,11 +25,10 @@ #include #include "version.h" -#include "i2c.h" +#include #include "i2c-isa.h" #include "sensors.h" #include "compat.h" -#include "smbus.h" #ifdef MODULE diff --git a/kernel/smbus.c b/kernel/smbus.c deleted file mode 100644 index 3a694669..00000000 --- a/kernel/smbus.c +++ /dev/null @@ -1,286 +0,0 @@ -/* - smbus.c - Part of lm_sensors, Linux kernel modules for hardware - monitoring - Copyright (c) 1998, 1999 Frodo Looijaard - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -*/ - -#include -#include -#include -#include - -#include "compat.h" - -#include "i2c.h" -#ifdef I2C_SPINLOCK -#include -#else -#if LINUX_VERSION_CODE < KERNEL_VERSION(2,0,19) -#include -#else -#include -#endif -#endif - -#include "version.h" -#include "smbus.h" - -static s32 smbus_access_i2c (struct i2c_adapter * adapter, u8 addr, - char read_write, u8 command, int size, - union smbus_data * data); - -static int smbus_master_xfer (struct smbus_adapter *adap, - struct i2c_msg msgs[], int num); -static int smbus_slave_send (struct smbus_adapter *adap, char *data, int len); -static int smbus_slave_recv (struct smbus_adapter *adap, char *data, int len); -static int smbus_algo_control (struct smbus_adapter *adap, unsigned int cmd, - unsigned long arg); -static int smbus_client_register (struct smbus_client *client); -static int smbus_client_unregister (struct smbus_client *client); - -static int smbus_init(void); -static int smbus_cleanup(void); - -#ifdef MODULE -extern int init_module(void); -extern int cleanup_module(void); -#endif /* MODULE */ - -/* This is the actual algorithm we define */ -struct smbus_algorithm smbus_algorithm = { - /* name */ "Non-I2C SMBus adapter", - /* id */ ALGO_SMBUS, - /* master_xfer */ &smbus_master_xfer, - /* slave_send */ &smbus_slave_send, - /* slave_rcv */ &smbus_slave_recv, - /* algo_control */ &smbus_algo_control, - /* client_register */ &smbus_client_register, - /* client_unregister*/&smbus_client_unregister -}; - - -/* OK, so you want to access a bus using the SMBus protocols. Well, it either - is registered as a SMBus-only adapter (like the PIIX4), or we need to - simulate the SMBus commands using the i2c access routines. - We do all locking here, so you can ignore that in the adapter-specific - smbus_accesss routine. */ -s32 smbus_access (struct i2c_adapter * adapter, u8 addr, char read_write, - u8 command, int size, union smbus_data * data) -{ - int res; - if ((adapter->id & ALGO_MASK) == ALGO_SMBUS) { -#ifdef I2C_SPINLOCK - spin_lock_irqsave(&adapter->lock,adapter->lockflags); -#else - down(&adapter->lock); -#endif - res = ((struct smbus_adapter *) adapter) -> - smbus_access(addr,read_write,command,size,data); -#ifdef I2C_SPINLOCK - spin_unlock_irqrestore(&adapter->lock,adapter->lockflags); -#else - up(&adapter->lock); -#endif - } else - res = smbus_access_i2c(adapter,addr,read_write,command,size,data); - return res; -} - -/* Simulate a SMBus command using the i2c protocol - No checking of paramters is done! */ -s32 smbus_access_i2c(struct i2c_adapter * adapter, u8 addr, char read_write, - u8 command, int size, union smbus_data * data) -{ - /* So we need to generate a series of msgs. In the case of writing, we - need to use only one message; when reading, we need two. We initialize - most things with sane defaults, to keep the code below somewhat - simpler. */ - unsigned char msgbuf0[33]; - unsigned char msgbuf1[33]; - int num = read_write == SMBUS_READ?2:1; - struct i2c_msg msg[2] = { { addr, 0, 1, msgbuf0 }, - { addr, I2C_M_RD, 0, msgbuf1 } - }; - int i; - - msgbuf0[0] = command; - switch(size) { - case SMBUS_QUICK: - msg[0].len = 0; - num = 1; /* Special case: The read/write field is used as data */ - break; - case SMBUS_BYTE: - if (read_write == SMBUS_READ) { - /* Special case: only a read! */ - msg[0].flags = I2C_M_RD; - num = 1; - } - break; - case SMBUS_BYTE_DATA: - if (read_write == SMBUS_READ) - msg[1].len = 1; - else { - msg[0].len = 2; - msgbuf0[1] = data->byte; - } - break; - case SMBUS_WORD_DATA: - if (read_write == SMBUS_READ) - msg[1].len = 2; - else { - msg[0].len=3; - msgbuf0[1] = data->word & 0xff; - msgbuf0[2] = (data->word >> 8) & 0xff; - } - break; - case SMBUS_PROC_CALL: - num = 2; /* Special case */ - msg[0].len = 3; - msg[1].len = 2; - msgbuf0[1] = data->word & 0xff; - msgbuf0[2] = (data->word >> 8) & 0xff; - break; - case SMBUS_BLOCK_DATA: - if (read_write == SMBUS_READ) { - printk("smbus.o: Block read not supported under I2C emulation!\n"); - return -1; - } else { - msg[1].len = data->block[0] + 1; - if (msg[1].len > 32) { - printk("smbus.o: smbus_access called with invalid block write " - "size (%d)\n",msg[1].len); - return -1; - } - for (i = 1; i <= msg[1].len; i++) - msgbuf0[i] = data->block[i]; - } - break; - default: - printk("smbus.o: smbus_access called with invalid size (%d)\n",size); - return -1; - } - - if (i2c_transfer(adapter, msg, num) < 0) - return -1; - - if(read_write == SMBUS_READ) - switch(size) { - case SMBUS_BYTE: - data->byte = msgbuf0[0]; - break; - case SMBUS_BYTE_DATA: - data->byte = msgbuf1[0]; - break; - case SMBUS_WORD_DATA: - case SMBUS_PROC_CALL: - data->word = msgbuf1[0] | (msgbuf1[1] << 8); - break; - } - return 0; -} - -/* Algorithm master_xfer call-back implementation. Can't do that... */ -int smbus_master_xfer (struct smbus_adapter *adap, struct i2c_msg msgs[], - int num) -{ -#ifdef DEBUG - printk("smbus.o: smbus_master_xfer called for adapter `%s' " - "(no i2c level access possible!)\n", - adap->name); -#endif - return -1; -} - -/* Algorithm slave_send call-back implementation. Can't do that... */ -int smbus_slave_send (struct smbus_adapter *adap, char *data, int len) -{ -#ifdef DEBUG - printk("smbus.o: smbus_slave_send called for adapter `%s' " - "(no i2c level access possible!)\n", - adap->name); -#endif - return -1; -} - -/* Algorithm slave_recv call-back implementation. Can't do that... */ -int smbus_slave_recv (struct smbus_adapter *adap, char *data, int len) -{ -#ifdef DEBUG - printk("smbus.o: smbus_slave_recv called for adapter `%s' " - "(no i2c level access possible!)\n", - adap->name); -#endif - return -1; -} - -/* Here we can put additional calls to modify the workings of the algorithm. - But right now, there is no need for that. */ -int smbus_algo_control (struct smbus_adapter *adap, unsigned int cmd, - unsigned long arg) -{ - return 0; -} - -/* Ehm... This is called when a client is registered to an adapter. We could - do all kinds of neat stuff here like, ehm - returning success? */ -int smbus_client_register (struct smbus_client *client) -{ - return 0; -} - -int smbus_client_unregister (struct smbus_client *client) -{ - return 0; -} - -int smbus_init(void) -{ - int res; - printk("smbus.o version %s (%s)\n",LM_VERSION,LM_DATE); - if ((res = smbus_add_algorithm(&smbus_algorithm))) - printk("smbus.o: Algorithm registration failed, module not inserted.\n"); - else - printk("smbus.o initialized\n"); - return res; -} - -int smbus_cleanup(void) -{ - int res; - if ((res = smbus_del_algorithm(&smbus_algorithm))) - printk("smbus.o: Algorithm deregistration failed, module not removed\n"); - return res; -} - -/* OK, this will for now _only_ compile as a module, but this is neat for - later, if we want to compile it straight into the kernel */ -#ifdef MODULE - -MODULE_AUTHOR("Frodo Looijaard "); -MODULE_DESCRIPTION("System Management Bus (SMBus) access"); - -int init_module(void) -{ - return smbus_init(); -} - -int cleanup_module(void) -{ - return smbus_cleanup(); -} - -#endif /* MODULE */ diff --git a/prog/detect/i2cdetect.c b/prog/detect/i2cdetect.c index b8bd58f2..e4952435 100644 --- a/prog/detect/i2cdetect.c +++ b/prog/detect/i2cdetect.c @@ -24,7 +24,7 @@ #include #include #include -#include "kernel/include/i2c-dev.h" +#include void help(void) { diff --git a/prog/dump/i2cdump.c b/prog/dump/i2cdump.c index 42ba766f..2d8af084 100644 --- a/prog/dump/i2cdump.c +++ b/prog/dump/i2cdump.c @@ -23,7 +23,7 @@ #include #include #include -#include "kernel/include/i2c-dev.h" +#include void help(void) {