CINXE.COM

LKML: Greg KH: [PATCH] I2C: Fix a common race condition in hardware monitoring

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /><title>LKML: Greg KH: [PATCH] I2C: Fix a common race condition in hardware monitoring</title><link href="/css/message.css" rel="stylesheet" type="text/css" /><link href="/css/wrap.css" rel="alternate stylesheet" type="text/css" title="wrap" /><link href="/css/nowrap.css" rel="stylesheet" type="text/css" title="nowrap" /><link href="/favicon.ico" rel="shortcut icon" /><script src="/js/simple-calendar.js" type="text/javascript"></script><script src="/js/styleswitcher.js" type="text/javascript"></script><link rel="alternate" type="application/rss+xml" title="lkml.org : last 100 messages" href="/rss.php" /><link rel="alternate" type="application/rss+xml" title="lkml.org : last messages by Greg KH" href="/groupie.php?aid=45" /><!--Matomo--><script> var _paq = window._paq = window._paq || []; /* tracker methods like "setCustomDimension" should be called before "trackPageView" */ _paq.push(["setDoNotTrack", true]); _paq.push(["disableCookies"]); _paq.push(['trackPageView']); _paq.push(['enableLinkTracking']); (function() { var u="//m.lkml.org/"; _paq.push(['setTrackerUrl', u+'matomo.php']); _paq.push(['setSiteId', '1']); var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0]; g.async=true; g.src=u+'matomo.js'; s.parentNode.insertBefore(g,s); })(); </script><!--End Matomo Code--></head><body onload="es.jasper.simpleCalendar.init();" itemscope="itemscope" itemtype="http://schema.org/BlogPosting"><table border="0" cellpadding="0" cellspacing="0"><tr><td width="180" align="center"><a href="/"><img style="border:0;width:135px;height:32px" src="/images/toprowlk.gif" alt="lkml.org" /></a></td><td width="32">聽</td><td class="nb"><div><a class="nb" href="/lkml"> [lkml]</a> 聽 <a class="nb" href="/lkml/2005"> [2005]</a> 聽 <a class="nb" href="/lkml/2005/4"> [Apr]</a> 聽 <a class="nb" href="/lkml/2005/4/1"> [1]</a> 聽 <a class="nb" href="/lkml/last100"> [last100]</a> 聽 <a href="/rss.php"><img src="/images/rss-or.gif" border="0" alt="RSS Feed" /></a></div><div>Views: <a href="#" class="nowrap" onclick="setActiveStyleSheet('wrap');return false;">[wrap]</a><a href="#" class="wrap" onclick="setActiveStyleSheet('nowrap');return false;">[no wrap]</a> 聽 <a class="nb" href="/lkml/mheaders/2005/4/1/206" onclick="this.href='/lkml/headers'+'/2005/4/1/206';">[headers]</a>聽 <a href="/lkml/bounce/2005/4/1/206">[forward]</a>聽 </div></td><td width="32">聽</td></tr><tr><td valign="top"><div class="es-jasper-simpleCalendar" baseurl="/lkml/"></div><div class="threadlist">Messages in this thread</div><ul class="threadlist"><li class="root"><a href="/lkml/2005/4/1/203">First message in thread</a></li><li><a href="/lkml/2005/4/1/205">Greg KH</a><ul><li><a href="/lkml/2005/4/1/204">Greg KH</a><ul><li class="origin"><a href="">Greg KH</a></li></ul></li></ul></li></ul><div class="threadlist">Patch in this message</div><ul class="threadlist"><li><a href="/lkml/diff/2005/4/1/206/1">Get diff 1</a></li></ul></td><td width="32" rowspan="2" class="c" valign="top"><img src="/images/icornerl.gif" width="32" height="32" alt="/" /></td><td class="c" rowspan="2" valign="top" style="padding-top: 1em"><table><tr><td><table><tr><td class="lp">Subject</td><td class="rp" itemprop="name">[PATCH] I2C: Fix a common race condition in hardware monitoring</td></tr><tr><td class="lp">Date</td><td class="rp" itemprop="datePublished">Fri, 1 Apr 2005 12:04:15 -0800</td></tr><tr><td class="lp">From</td><td class="rp" itemprop="author">Greg KH &lt;&gt;</td></tr></table></td><td></td></tr></table><pre itemprop="articleBody">ChangeSet 1.2341, 2005/04/01 11:50:04-08:00, khali&#64;linux-fr.org<br /><br />[PATCH] I2C: Fix a common race condition in hardware monitoring<br /><br />Grant Coady noticed that most hardware monitoring drivers are exposed to<br />a race condition when one writes to the sysfs files they create. While<br />the read calls properly request a lock on the internal data, write calls<br />manipulate the internal data without proper locking. This big patch<br />fixes that by adding locking wherever needed.<br /><br />Affected drivers: adm1021, adm1025, asb100, ds1621, fscher, fscpos,<br />gl518sm, gl520sm, it87, lm63, lm75, lm77, lm78, lm80, lm83, lm87, lm90,<br />lm92, max1619, pc87360, pcf8591, sis5595, smsc47m1, via686a, w83627hf<br />and w83781d<br /><br />The adm1026, adm1031 and lm85 were already locking on write calls, but<br />held the lock for code that did not require it, so they have been<br />modified too.<br /><br />The smsc47b397 and w83l785ts drivers were not affected, because they are<br />read-only.<br /><br />The patch should apply just fine on top of your stack, provided that you<br />applied all previous patches in order (in particular, there is one lm87<br />indentation patch which is needed).<br /><br /><br />Signed-off-by: Grant Coady &lt;gcoady&#64;gmail.com&gt;<br />Signed-off-by: Jean Delvare &lt;khali&#64;linux-fr.org&gt;<br />Signed-off-by: Greg Kroah-Hartman &lt;gregkh&#64;suse.de&gt;<br /><br /><br /> drivers/i2c/chips/adm1021.c | 2 +<br /> drivers/i2c/chips/adm1025.c | 12 +++++++++<br /> drivers/i2c/chips/adm1026.c | 55 ++++++++++++++-----------------------------<br /> drivers/i2c/chips/adm1031.c | 23 +++++++----------<br /> drivers/i2c/chips/asb100.c | 25 +++++++++++++++++--<br /> drivers/i2c/chips/ds1621.c | 6 +++-<br /> drivers/i2c/chips/fscher.c | 34 ++++++++++++++++++++------<br /> drivers/i2c/chips/fscpos.c | 18 ++++++++++----<br /> drivers/i2c/chips/gl518sm.c | 25 +++++++++++++++----<br /> drivers/i2c/chips/gl520sm.c | 43 ++++++++++++++++++++++-----------<br /> drivers/i2c/chips/it87.c | 44 +++++++++++++++++++++++++++++-----<br /> drivers/i2c/chips/lm63.c | 19 +++++++++++++-<br /> drivers/i2c/chips/lm75.c | 3 ++<br /> drivers/i2c/chips/lm77.c | 21 +++++++++++++---<br /> drivers/i2c/chips/lm78.c | 30 +++++++++++++++++++++--<br /> drivers/i2c/chips/lm80.c | 16 ++++++++++--<br /> drivers/i2c/chips/lm83.c | 3 ++<br /> drivers/i2c/chips/lm85.c | 44 ++++++++++++----------------------<br /> drivers/i2c/chips/lm87.c | 31 +++++++++++++++++++++---<br /> drivers/i2c/chips/lm90.c | 14 +++++++++-<br /> drivers/i2c/chips/lm92.c | 10 ++++++-<br /> drivers/i2c/chips/max1619.c | 3 ++<br /> drivers/i2c/chips/pc87360.c | 29 ++++++++++++++++++++++<br /> drivers/i2c/chips/pcf8591.c | 6 +++-<br /> drivers/i2c/chips/sis5595.c | 28 +++++++++++++++++++--<br /> drivers/i2c/chips/smsc47m1.c | 24 ++++++++++++++----<br /> drivers/i2c/chips/via686a.c | 21 +++++++++++++++-<br /> drivers/i2c/chips/w83627hf.c | 32 ++++++++++++++++++++++++-<br /> drivers/i2c/chips/w83781d.c | 29 ++++++++++++++++++++--<br /> 29 files changed, 499 insertions(+), 151 deletions(-)<br /><br /><br />diff -Nru a/drivers/i2c/chips/adm1021.c b/drivers/i2c/chips/adm1021.c<br />--- a/drivers/i2c/chips/adm1021.c 2005-04-01 11:52:47 -08:00<br />+++ b/drivers/i2c/chips/adm1021.c 2005-04-01 11:52:47 -08:00<br />&#64;&#64; -165,8 +165,10 &#64;&#64;<br /> struct adm1021_data *data = i2c_get_clientdata(client); \<br /> int temp = simple_strtoul(buf, NULL, 10); \<br /> \<br />+ down(&amp;data-&gt;update_lock); \<br /> data-&gt;value = TEMP_TO_REG(temp); \<br /> adm1021_write_value(client, reg, data-&gt;value); \<br />+ up(&amp;data-&gt;update_lock); \<br /> return count; \<br /> }<br /> set(temp_max, ADM1021_REG_TOS_W);<br />diff -Nru a/drivers/i2c/chips/adm1025.c b/drivers/i2c/chips/adm1025.c<br />--- a/drivers/i2c/chips/adm1025.c 2005-04-01 11:52:47 -08:00<br />+++ b/drivers/i2c/chips/adm1025.c 2005-04-01 11:52:47 -08:00<br />&#64;&#64; -206,9 +206,12 &#64;&#64;<br /> struct i2c_client *client = to_i2c_client(dev); \<br /> struct adm1025_data *data = i2c_get_clientdata(client); \<br /> long val = simple_strtol(buf, NULL, 10); \<br />+ \<br />+ down(&amp;data-&gt;update_lock); \<br /> data-&gt;in_min[offset] = IN_TO_REG(val, in_scale[offset]); \<br /> i2c_smbus_write_byte_data(client, ADM1025_REG_IN_MIN(offset), \<br /> data-&gt;in_min[offset]); \<br />+ up(&amp;data-&gt;update_lock); \<br /> return count; \<br /> } \<br /> static ssize_t set_in##offset##_max(struct device *dev, const char *buf, \<br />&#64;&#64; -217,9 +220,12 &#64;&#64;<br /> struct i2c_client *client = to_i2c_client(dev); \<br /> struct adm1025_data *data = i2c_get_clientdata(client); \<br /> long val = simple_strtol(buf, NULL, 10); \<br />+ \<br />+ down(&amp;data-&gt;update_lock); \<br /> data-&gt;in_max[offset] = IN_TO_REG(val, in_scale[offset]); \<br /> i2c_smbus_write_byte_data(client, ADM1025_REG_IN_MAX(offset), \<br /> data-&gt;in_max[offset]); \<br />+ up(&amp;data-&gt;update_lock); \<br /> return count; \<br /> } \<br /> static DEVICE_ATTR(in##offset##_min, S_IWUSR | S_IRUGO, \<br />&#64;&#64; -240,9 +246,12 &#64;&#64;<br /> struct i2c_client *client = to_i2c_client(dev); \<br /> struct adm1025_data *data = i2c_get_clientdata(client); \<br /> long val = simple_strtol(buf, NULL, 10); \<br />+ \<br />+ down(&amp;data-&gt;update_lock); \<br /> data-&gt;temp_min[offset-1] = TEMP_TO_REG(val); \<br /> i2c_smbus_write_byte_data(client, ADM1025_REG_TEMP_LOW(offset-1), \<br /> data-&gt;temp_min[offset-1]); \<br />+ up(&amp;data-&gt;update_lock); \<br /> return count; \<br /> } \<br /> static ssize_t set_temp##offset##_max(struct device *dev, const char *buf, \<br />&#64;&#64; -251,9 +260,12 &#64;&#64;<br /> struct i2c_client *client = to_i2c_client(dev); \<br /> struct adm1025_data *data = i2c_get_clientdata(client); \<br /> long val = simple_strtol(buf, NULL, 10); \<br />+ \<br />+ down(&amp;data-&gt;update_lock); \<br /> data-&gt;temp_max[offset-1] = TEMP_TO_REG(val); \<br /> i2c_smbus_write_byte_data(client, ADM1025_REG_TEMP_HIGH(offset-1), \<br /> data-&gt;temp_max[offset-1]); \<br />+ up(&amp;data-&gt;update_lock); \<br /> return count; \<br /> } \<br /> static DEVICE_ATTR(temp##offset##_min, S_IWUSR | S_IRUGO, \<br />diff -Nru a/drivers/i2c/chips/adm1026.c b/drivers/i2c/chips/adm1026.c<br />--- a/drivers/i2c/chips/adm1026.c 2005-04-01 11:52:47 -08:00<br />+++ b/drivers/i2c/chips/adm1026.c 2005-04-01 11:52:47 -08:00<br />&#64;&#64; -726,10 +726,9 &#64;&#64;<br /> {<br /> struct i2c_client *client = to_i2c_client(dev);<br /> struct adm1026_data *data = i2c_get_clientdata(client);<br />- int val;<br />+ int val = simple_strtol(buf, NULL, 10);<br /> <br /> down(&amp;data-&gt;update_lock);<br />- val = simple_strtol(buf, NULL, 10);<br /> data-&gt;in_min[nr] = INS_TO_REG(nr, val);<br /> adm1026_write_value(client, ADM1026_REG_IN_MIN[nr], data-&gt;in_min[nr]);<br /> up(&amp;data-&gt;update_lock);<br />&#64;&#64; -745,10 +744,9 &#64;&#64;<br /> {<br /> struct i2c_client *client = to_i2c_client(dev);<br /> struct adm1026_data *data = i2c_get_clientdata(client);<br />- int val;<br />+ int val = simple_strtol(buf, NULL, 10);<br /> <br /> down(&amp;data-&gt;update_lock);<br />- val = simple_strtol(buf, NULL, 10);<br /> data-&gt;in_max[nr] = INS_TO_REG(nr, val);<br /> adm1026_write_value(client, ADM1026_REG_IN_MAX[nr], data-&gt;in_max[nr]);<br /> up(&amp;data-&gt;update_lock);<br />&#64;&#64; -818,10 +816,9 &#64;&#64;<br /> {<br /> struct i2c_client *client = to_i2c_client(dev);<br /> struct adm1026_data *data = i2c_get_clientdata(client);<br />- int val;<br />+ int val = simple_strtol(buf, NULL, 10);<br /> <br /> down(&amp;data-&gt;update_lock);<br />- val = simple_strtol(buf, NULL, 10);<br /> data-&gt;in_min[16] = INS_TO_REG(16, val + NEG12_OFFSET);<br /> adm1026_write_value(client, ADM1026_REG_IN_MIN[16], data-&gt;in_min[16]);<br /> up(&amp;data-&gt;update_lock);<br />&#64;&#64; -837,10 +834,9 &#64;&#64;<br /> {<br /> struct i2c_client *client = to_i2c_client(dev);<br /> struct adm1026_data *data = i2c_get_clientdata(client);<br />- int val;<br />+ int val = simple_strtol(buf, NULL, 10);<br /> <br /> down(&amp;data-&gt;update_lock);<br />- val = simple_strtol(buf, NULL, 10);<br /> data-&gt;in_max[16] = INS_TO_REG(16, val+NEG12_OFFSET);<br /> adm1026_write_value(client, ADM1026_REG_IN_MAX[16], data-&gt;in_max[16]);<br /> up(&amp;data-&gt;update_lock);<br />&#64;&#64; -873,10 +869,9 &#64;&#64;<br /> {<br /> struct i2c_client *client = to_i2c_client(dev);<br /> struct adm1026_data *data = i2c_get_clientdata(client);<br />- int val;<br />+ int val = simple_strtol(buf, NULL, 10);<br /> <br /> down(&amp;data-&gt;update_lock);<br />- val = simple_strtol(buf, NULL, 10);<br /> data-&gt;fan_min[nr] = FAN_TO_REG(val, data-&gt;fan_div[nr]);<br /> adm1026_write_value(client, ADM1026_REG_FAN_MIN(nr),<br /> data-&gt;fan_min[nr]);<br />&#64;&#64; -1009,10 +1004,9 &#64;&#64;<br /> {<br /> struct i2c_client *client = to_i2c_client(dev);<br /> struct adm1026_data *data = i2c_get_clientdata(client);<br />- int val;<br />+ int val = simple_strtol(buf, NULL, 10);<br /> <br /> down(&amp;data-&gt;update_lock);<br />- val = simple_strtol(buf, NULL, 10);<br /> data-&gt;temp_min[nr] = TEMP_TO_REG(val);<br /> adm1026_write_value(client, ADM1026_REG_TEMP_MIN[nr],<br /> data-&gt;temp_min[nr]);<br />&#64;&#64; -1029,10 +1023,9 &#64;&#64;<br /> {<br /> struct i2c_client *client = to_i2c_client(dev);<br /> struct adm1026_data *data = i2c_get_clientdata(client);<br />- int val;<br />+ int val = simple_strtol(buf, NULL, 10);<br /> <br /> down(&amp;data-&gt;update_lock);<br />- val = simple_strtol(buf, NULL, 10);<br /> data-&gt;temp_max[nr] = TEMP_TO_REG(val);<br /> adm1026_write_value(client, ADM1026_REG_TEMP_MAX[nr],<br /> data-&gt;temp_max[nr]);<br />&#64;&#64; -1083,10 +1076,9 &#64;&#64;<br /> {<br /> struct i2c_client *client = to_i2c_client(dev);<br /> struct adm1026_data *data = i2c_get_clientdata(client);<br />- int val;<br />+ int val = simple_strtol(buf, NULL, 10);<br /> <br /> down(&amp;data-&gt;update_lock);<br />- val = simple_strtol(buf, NULL, 10);<br /> data-&gt;temp_offset[nr] = TEMP_TO_REG(val);<br /> adm1026_write_value(client, ADM1026_REG_TEMP_OFFSET[nr],<br /> data-&gt;temp_offset[nr]);<br />&#64;&#64; -1136,10 +1128,9 &#64;&#64;<br /> {<br /> struct i2c_client *client = to_i2c_client(dev);<br /> struct adm1026_data *data = i2c_get_clientdata(client);<br />- int val;<br />+ int val = simple_strtol(buf, NULL, 10);<br /> <br /> down(&amp;data-&gt;update_lock);<br />- val = simple_strtol(buf, NULL, 10);<br /> data-&gt;temp_tmin[nr] = TEMP_TO_REG(val);<br /> adm1026_write_value(client, ADM1026_REG_TEMP_TMIN[nr],<br /> data-&gt;temp_tmin[nr]);<br />&#64;&#64; -1190,9 +1181,8 &#64;&#64;<br /> {<br /> struct i2c_client *client = to_i2c_client(dev);<br /> struct adm1026_data *data = i2c_get_clientdata(client);<br />- int val;<br />+ int val = simple_strtol(buf, NULL, 10);<br /> <br />- val = simple_strtol(buf, NULL, 10);<br /> if ((val == 1) || (val==0)) {<br /> down(&amp;data-&gt;update_lock);<br /> data-&gt;config1 = (data-&gt;config1 &amp; ~CFG1_THERM_HOT) | (val &lt;&lt; 4);<br />&#64;&#64; -1223,10 +1213,9 &#64;&#64;<br /> {<br /> struct i2c_client *client = to_i2c_client(dev);<br /> struct adm1026_data *data = i2c_get_clientdata(client);<br />- int val;<br />+ int val = simple_strtol(buf, NULL, 10);<br /> <br /> down(&amp;data-&gt;update_lock);<br />- val = simple_strtol(buf, NULL, 10);<br /> data-&gt;temp_crit[nr] = TEMP_TO_REG(val);<br /> adm1026_write_value(client, ADM1026_REG_TEMP_THERM[nr],<br /> data-&gt;temp_crit[nr]);<br />&#64;&#64; -1261,10 +1250,9 &#64;&#64;<br /> {<br /> struct i2c_client *client = to_i2c_client(dev);<br /> struct adm1026_data *data = i2c_get_clientdata(client);<br />- int val;<br />+ int val = simple_strtol(buf, NULL, 10);<br /> <br /> down(&amp;data-&gt;update_lock);<br />- val = simple_strtol(buf, NULL, 10);<br /> data-&gt;analog_out = DAC_TO_REG(val);<br /> adm1026_write_value(client, ADM1026_REG_DAC, data-&gt;analog_out);<br /> up(&amp;data-&gt;update_lock);<br />&#64;&#64; -1317,11 +1305,10 &#64;&#64;<br /> {<br /> struct i2c_client *client = to_i2c_client(dev);<br /> struct adm1026_data *data = i2c_get_clientdata(client);<br />- int val;<br />+ int val = simple_strtol(buf, NULL, 10);<br /> unsigned long mask;<br /> <br /> down(&amp;data-&gt;update_lock);<br />- val = simple_strtol(buf, NULL, 10);<br /> data-&gt;alarm_mask = val &amp; 0x7fffffff;<br /> mask = data-&gt;alarm_mask<br /> | (data-&gt;gpio_mask &amp; 0x10000 ? 0x80000000 : 0);<br />&#64;&#64; -1354,11 +1341,10 &#64;&#64;<br /> {<br /> struct i2c_client *client = to_i2c_client(dev);<br /> struct adm1026_data *data = i2c_get_clientdata(client);<br />- int val;<br />+ int val = simple_strtol(buf, NULL, 10);<br /> long gpio;<br /> <br /> down(&amp;data-&gt;update_lock);<br />- val = simple_strtol(buf, NULL, 10);<br /> data-&gt;gpio = val &amp; 0x1ffff;<br /> gpio = data-&gt;gpio;<br /> adm1026_write_value(client, ADM1026_REG_GPIO_STATUS_0_7,gpio &amp; 0xff);<br />&#64;&#64; -1383,11 +1369,10 &#64;&#64;<br /> {<br /> struct i2c_client *client = to_i2c_client(dev);<br /> struct adm1026_data *data = i2c_get_clientdata(client);<br />- int val;<br />+ int val = simple_strtol(buf, NULL, 10);<br /> long mask;<br /> <br /> down(&amp;data-&gt;update_lock);<br />- val = simple_strtol(buf, NULL, 10);<br /> data-&gt;gpio_mask = val &amp; 0x1ffff;<br /> mask = data-&gt;gpio_mask;<br /> adm1026_write_value(client, ADM1026_REG_GPIO_MASK_0_7,mask &amp; 0xff);<br />&#64;&#64; -1411,11 +1396,11 &#64;&#64;<br /> {<br /> struct i2c_client *client = to_i2c_client(dev);<br /> struct adm1026_data *data = i2c_get_clientdata(client);<br />- int val;<br /> <br /> if (data-&gt;pwm1.enable == 1) {<br />+ int val = simple_strtol(buf, NULL, 10);<br />+<br /> down(&amp;data-&gt;update_lock);<br />- val = simple_strtol(buf, NULL, 10);<br /> data-&gt;pwm1.pwm = PWM_TO_REG(val);<br /> adm1026_write_value(client, ADM1026_REG_PWM, data-&gt;pwm1.pwm);<br /> up(&amp;data-&gt;update_lock);<br />&#64;&#64; -1432,10 +1417,9 &#64;&#64;<br /> {<br /> struct i2c_client *client = to_i2c_client(dev);<br /> struct adm1026_data *data = i2c_get_clientdata(client);<br />- int val;<br />+ int val = simple_strtol(buf, NULL, 10);<br /> <br /> down(&amp;data-&gt;update_lock);<br />- val = simple_strtol(buf, NULL, 10);<br /> data-&gt;pwm1.auto_pwm_min = SENSORS_LIMIT(val,0,255);<br /> if (data-&gt;pwm1.enable == 2) { /* apply immediately */<br /> data-&gt;pwm1.pwm = PWM_TO_REG((data-&gt;pwm1.pwm &amp; 0x0f) |<br />&#64;&#64; -1459,10 +1443,9 &#64;&#64;<br /> {<br /> struct i2c_client *client = to_i2c_client(dev);<br /> struct adm1026_data *data = i2c_get_clientdata(client);<br />- int val;<br />+ int val = simple_strtol(buf, NULL, 10);<br /> int old_enable;<br /> <br />- val = simple_strtol(buf, NULL, 10);<br /> if ((val &gt;= 0) &amp;&amp; (val &lt; 3)) {<br /> down(&amp;data-&gt;update_lock);<br /> old_enable = data-&gt;pwm1.enable;<br />diff -Nru a/drivers/i2c/chips/adm1031.c b/drivers/i2c/chips/adm1031.c<br />--- a/drivers/i2c/chips/adm1031.c 2005-04-01 11:52:47 -08:00<br />+++ b/drivers/i2c/chips/adm1031.c 2005-04-01 11:52:47 -08:00<br />&#64;&#64; -254,7 +254,7 &#64;&#64;<br /> {<br /> struct i2c_client *client = to_i2c_client(dev);<br /> struct adm1031_data *data = i2c_get_clientdata(client);<br />- int val;<br />+ int val = simple_strtol(buf, NULL, 10);<br /> u8 reg;<br /> int ret;<br /> u8 old_fan_mode;<br />&#64;&#64; -262,7 +262,6 &#64;&#64;<br /> old_fan_mode = data-&gt;conf1;<br /> <br /> down(&amp;data-&gt;update_lock);<br />- val = simple_strtol(buf, NULL, 10);<br /> <br /> if ((ret = get_fan_auto_nearest(data, nr, val, data-&gt;conf1, &amp;reg))) {<br /> up(&amp;data-&gt;update_lock);<br />&#64;&#64; -327,10 +326,9 &#64;&#64;<br /> {<br /> struct i2c_client *client = to_i2c_client(dev);<br /> struct adm1031_data *data = i2c_get_clientdata(client);<br />- int val;<br />+ int val = simple_strtol(buf, NULL, 10);<br /> <br /> down(&amp;data-&gt;update_lock);<br />- val = simple_strtol(buf, NULL, 10);<br /> data-&gt;auto_temp[nr] = AUTO_TEMP_MIN_TO_REG(val, data-&gt;auto_temp[nr]);<br /> adm1031_write_value(client, ADM1031_REG_AUTO_TEMP(nr),<br /> data-&gt;auto_temp[nr]);<br />&#64;&#64; -348,10 +346,9 &#64;&#64;<br /> {<br /> struct i2c_client *client = to_i2c_client(dev);<br /> struct adm1031_data *data = i2c_get_clientdata(client);<br />- int val;<br />+ int val = simple_strtol(buf, NULL, 10);<br /> <br /> down(&amp;data-&gt;update_lock);<br />- val = simple_strtol(buf, NULL, 10);<br /> data-&gt;temp_max[nr] = AUTO_TEMP_MAX_TO_REG(val, data-&gt;auto_temp[nr], data-&gt;pwm[nr]);<br /> adm1031_write_value(client, ADM1031_REG_AUTO_TEMP(nr),<br /> data-&gt;temp_max[nr]);<br />&#64;&#64; -404,10 +401,10 &#64;&#64;<br /> {<br /> struct i2c_client *client = to_i2c_client(dev);<br /> struct adm1031_data *data = i2c_get_clientdata(client);<br />- int val;<br />+ int val = simple_strtol(buf, NULL, 10);<br /> int reg;<br />+<br /> down(&amp;data-&gt;update_lock);<br />- val = simple_strtol(buf, NULL, 10);<br /> if ((data-&gt;conf1 &amp; ADM1031_CONF1_AUTO_MODE) &amp;&amp; <br /> (((val&gt;&gt;4) &amp; 0xf) != 5)) {<br /> /* In automatic mode, the only PWM accepted is 33% */<br />&#64;&#64; -511,10 +508,9 &#64;&#64;<br /> {<br /> struct i2c_client *client = to_i2c_client(dev);<br /> struct adm1031_data *data = i2c_get_clientdata(client);<br />- int val;<br />+ int val = simple_strtol(buf, NULL, 10);<br /> <br /> down(&amp;data-&gt;update_lock);<br />- val = simple_strtol(buf, NULL, 10);<br /> if (val) {<br /> data-&gt;fan_min[nr] = <br /> FAN_TO_REG(val, FAN_DIV_FROM_REG(data-&gt;fan_div[nr]));<br />&#64;&#64; -530,12 +526,11 &#64;&#64;<br /> {<br /> struct i2c_client *client = to_i2c_client(dev);<br /> struct adm1031_data *data = i2c_get_clientdata(client);<br />- int val;<br />+ int val = simple_strtol(buf, NULL, 10);<br /> u8 tmp;<br />- int old_div = FAN_DIV_FROM_REG(data-&gt;fan_div[nr]);<br />+ int old_div;<br /> int new_min;<br /> <br />- val = simple_strtol(buf, NULL, 10);<br /> tmp = val == 8 ? 0xc0 :<br /> val == 4 ? 0x80 :<br /> val == 2 ? 0x40 : <br />&#64;&#64; -543,7 +538,9 &#64;&#64;<br /> 0xff;<br /> if (tmp == 0xff)<br /> return -EINVAL;<br />+ <br /> down(&amp;data-&gt;update_lock);<br />+ old_div = FAN_DIV_FROM_REG(data-&gt;fan_div[nr]);<br /> data-&gt;fan_div[nr] = (tmp &amp; 0xC0) | (0x3f &amp; data-&gt;fan_div[nr]);<br /> new_min = data-&gt;fan_min[nr] * old_div / <br /> FAN_DIV_FROM_REG(data-&gt;fan_div[nr]);<br />diff -Nru a/drivers/i2c/chips/asb100.c b/drivers/i2c/chips/asb100.c<br />--- a/drivers/i2c/chips/asb100.c 2005-04-01 11:52:47 -08:00<br />+++ b/drivers/i2c/chips/asb100.c 2005-04-01 11:52:47 -08:00<br />&#64;&#64; -246,9 +246,12 &#64;&#64;<br /> struct i2c_client *client = to_i2c_client(dev); \<br /> struct asb100_data *data = i2c_get_clientdata(client); \<br /> unsigned long val = simple_strtoul(buf, NULL, 10); \<br />+ \<br />+ down(&amp;data-&gt;update_lock); \<br /> data-&gt;in_##reg[nr] = IN_TO_REG(val); \<br /> asb100_write_value(client, ASB100_REG_IN_##REG(nr), \<br /> data-&gt;in_##reg[nr]); \<br />+ up(&amp;data-&gt;update_lock); \<br /> return count; \<br /> }<br /> <br />&#64;&#64; -329,8 +332,11 &#64;&#64;<br /> struct i2c_client *client = to_i2c_client(dev);<br /> struct asb100_data *data = i2c_get_clientdata(client);<br /> u32 val = simple_strtoul(buf, NULL, 10);<br />+<br />+ down(&amp;data-&gt;update_lock);<br /> data-&gt;fan_min[nr] = FAN_TO_REG(val, DIV_FROM_REG(data-&gt;fan_div[nr]));<br /> asb100_write_value(client, ASB100_REG_FAN_MIN(nr), data-&gt;fan_min[nr]);<br />+ up(&amp;data-&gt;update_lock);<br /> return count;<br /> }<br /> <br />&#64;&#64; -343,11 +349,14 &#64;&#64;<br /> {<br /> struct i2c_client *client = to_i2c_client(dev);<br /> struct asb100_data *data = i2c_get_clientdata(client);<br />- unsigned long min = FAN_FROM_REG(data-&gt;fan_min[nr],<br />- DIV_FROM_REG(data-&gt;fan_div[nr]));<br />+ unsigned long min;<br /> unsigned long val = simple_strtoul(buf, NULL, 10);<br /> int reg;<br /> <br />+ down(&amp;data-&gt;update_lock);<br />+<br />+ min = FAN_FROM_REG(data-&gt;fan_min[nr],<br />+ DIV_FROM_REG(data-&gt;fan_div[nr]));<br /> data-&gt;fan_div[nr] = DIV_TO_REG(val);<br /> <br /> switch(nr) {<br />&#64;&#64; -373,6 +382,9 &#64;&#64;<br /> data-&gt;fan_min[nr] =<br /> FAN_TO_REG(min, DIV_FROM_REG(data-&gt;fan_div[nr]));<br /> asb100_write_value(client, ASB100_REG_FAN_MIN(nr), data-&gt;fan_min[nr]);<br />+<br />+ up(&amp;data-&gt;update_lock);<br />+<br /> return count;<br /> }<br /> <br />&#64;&#64; -450,6 +462,8 &#64;&#64;<br /> struct i2c_client *client = to_i2c_client(dev); \<br /> struct asb100_data *data = i2c_get_clientdata(client); \<br /> unsigned long val = simple_strtoul(buf, NULL, 10); \<br />+ \<br />+ down(&amp;data-&gt;update_lock); \<br /> switch (nr) { \<br /> case 1: case 2: \<br /> data-&gt;reg[nr] = LM75_TEMP_TO_REG(val); \<br />&#64;&#64; -460,6 +474,7 &#64;&#64;<br /> } \<br /> asb100_write_value(client, ASB100_REG_TEMP_##REG(nr+1), \<br /> data-&gt;reg[nr]); \<br />+ up(&amp;data-&gt;update_lock); \<br /> return count; \<br /> }<br /> <br />&#64;&#64; -560,9 +575,12 &#64;&#64;<br /> struct i2c_client *client = to_i2c_client(dev);<br /> struct asb100_data *data = i2c_get_clientdata(client);<br /> unsigned long val = simple_strtoul(buf, NULL, 10);<br />+<br />+ down(&amp;data-&gt;update_lock);<br /> data-&gt;pwm &amp;= 0x80; /* keep the enable bit */<br /> data-&gt;pwm |= (0x0f &amp; ASB100_PWM_TO_REG(val));<br /> asb100_write_value(client, ASB100_REG_PWM1, data-&gt;pwm);<br />+ up(&amp;data-&gt;update_lock);<br /> return count;<br /> }<br /> <br />&#64;&#64; -578,9 +596,12 &#64;&#64;<br /> struct i2c_client *client = to_i2c_client(dev);<br /> struct asb100_data *data = i2c_get_clientdata(client);<br /> unsigned long val = simple_strtoul(buf, NULL, 10);<br />+<br />+ down(&amp;data-&gt;update_lock);<br /> data-&gt;pwm &amp;= 0x0f; /* keep the duty cycle bits */<br /> data-&gt;pwm |= (val ? 0x80 : 0x00);<br /> asb100_write_value(client, ASB100_REG_PWM1, data-&gt;pwm);<br />+ up(&amp;data-&gt;update_lock);<br /> return count;<br /> }<br /> <br />diff -Nru a/drivers/i2c/chips/ds1621.c b/drivers/i2c/chips/ds1621.c<br />--- a/drivers/i2c/chips/ds1621.c 2005-04-01 11:52:47 -08:00<br />+++ b/drivers/i2c/chips/ds1621.c 2005-04-01 11:52:47 -08:00<br />&#64;&#64; -153,8 +153,12 &#64;&#64;<br /> { \<br /> struct i2c_client *client = to_i2c_client(dev); \<br /> struct ds1621_data *data = ds1621_update_client(dev); \<br />- data-&gt;value = LM75_TEMP_TO_REG(simple_strtoul(buf, NULL, 10)); \<br />+ u16 val = LM75_TEMP_TO_REG(simple_strtoul(buf, NULL, 10)); \<br />+ \<br />+ down(&amp;data-&gt;update_lock); \<br />+ data-&gt;value = val; \<br /> ds1621_write_value(client, reg, data-&gt;value); \<br />+ up(&amp;data-&gt;update_lock); \<br /> return count; \<br /> }<br /> <br />diff -Nru a/drivers/i2c/chips/fscher.c b/drivers/i2c/chips/fscher.c<br />--- a/drivers/i2c/chips/fscher.c 2005-04-01 11:52:47 -08:00<br />+++ b/drivers/i2c/chips/fscher.c 2005-04-01 11:52:47 -08:00<br />&#64;&#64; -464,9 +464,11 &#64;&#64;<br /> {<br /> /* bits 0..1, 3..7 reserved =&gt; mask with 0x04 */ <br /> unsigned long v = simple_strtoul(buf, NULL, 10) &amp; 0x04;<br />+ <br />+ down(&amp;data-&gt;update_lock);<br /> data-&gt;fan_status[FAN_INDEX_FROM_NUM(nr)] &amp;= ~v;<br />-<br /> fscher_write_value(client, reg, v);<br />+ up(&amp;data-&gt;update_lock);<br /> return count;<br /> }<br /> <br />&#64;&#64; -480,9 +482,11 &#64;&#64;<br /> const char *buf, size_t count, int nr, int reg)<br /> {<br /> unsigned long v = simple_strtoul(buf, NULL, 10);<br />- data-&gt;fan_min[FAN_INDEX_FROM_NUM(nr)] = v &gt; 0xff ? 0xff : v;<br /> <br />+ down(&amp;data-&gt;update_lock);<br />+ data-&gt;fan_min[FAN_INDEX_FROM_NUM(nr)] = v &gt; 0xff ? 0xff : v;<br /> fscher_write_value(client, reg, data-&gt;fan_min[FAN_INDEX_FROM_NUM(nr)]);<br />+ up(&amp;data-&gt;update_lock);<br /> return count;<br /> }<br /> <br />&#64;&#64; -507,11 +511,14 &#64;&#64;<br /> return -EINVAL;<br /> }<br /> <br />+ down(&amp;data-&gt;update_lock);<br />+<br /> /* bits 2..7 reserved =&gt; mask with 0x03 */<br /> data-&gt;fan_ripple[FAN_INDEX_FROM_NUM(nr)] &amp;= ~0x03;<br /> data-&gt;fan_ripple[FAN_INDEX_FROM_NUM(nr)] |= v;<br /> <br /> fscher_write_value(client, reg, data-&gt;fan_ripple[FAN_INDEX_FROM_NUM(nr)]);<br />+ up(&amp;data-&gt;update_lock);<br /> return count;<br /> }<br /> <br />&#64;&#64; -537,9 +544,11 &#64;&#64;<br /> {<br /> /* bits 2..7 reserved, 0 read only =&gt; mask with 0x02 */ <br /> unsigned long v = simple_strtoul(buf, NULL, 10) &amp; 0x02;<br />- data-&gt;temp_status[TEMP_INDEX_FROM_NUM(nr)] &amp;= ~v;<br /> <br />+ down(&amp;data-&gt;update_lock);<br />+ data-&gt;temp_status[TEMP_INDEX_FROM_NUM(nr)] &amp;= ~v;<br /> fscher_write_value(client, reg, v);<br />+ up(&amp;data-&gt;update_lock);<br /> return count;<br /> }<br /> <br />&#64;&#64; -592,9 +601,11 &#64;&#64;<br /> {<br /> /* bits 1..7 reserved =&gt; mask with 0x01 */ <br /> unsigned long v = simple_strtoul(buf, NULL, 10) &amp; 0x01;<br />- data-&gt;global_control &amp;= ~v;<br /> <br />+ down(&amp;data-&gt;update_lock);<br />+ data-&gt;global_control &amp;= ~v;<br /> fscher_write_value(client, reg, v);<br />+ up(&amp;data-&gt;update_lock);<br /> return count;<br /> }<br /> <br />&#64;&#64; -612,10 +623,12 &#64;&#64;<br /> {<br /> /* bits 0..3 reserved =&gt; mask with 0xf0 */ <br /> unsigned long v = simple_strtoul(buf, NULL, 10) &amp; 0xf0;<br />+<br />+ down(&amp;data-&gt;update_lock);<br /> data-&gt;watchdog[2] &amp;= ~0xf0;<br /> data-&gt;watchdog[2] |= v;<br />-<br /> fscher_write_value(client, reg, data-&gt;watchdog[2]);<br />+ up(&amp;data-&gt;update_lock);<br /> return count;<br /> }<br /> <br />&#64;&#64; -630,9 +643,11 &#64;&#64;<br /> {<br /> /* bits 0, 2..7 reserved =&gt; mask with 0x02 */ <br /> unsigned long v = simple_strtoul(buf, NULL, 10) &amp; 0x02;<br />- data-&gt;watchdog[1] &amp;= ~v;<br /> <br />+ down(&amp;data-&gt;update_lock);<br />+ data-&gt;watchdog[1] &amp;= ~v;<br /> fscher_write_value(client, reg, v);<br />+ up(&amp;data-&gt;update_lock);<br /> return count;<br /> }<br /> <br />&#64;&#64; -645,9 +660,12 &#64;&#64;<br /> static ssize_t set_watchdog_preset(struct i2c_client *client, struct fscher_data *data,<br /> const char *buf, size_t count, int nr, int reg)<br /> {<br />- data-&gt;watchdog[0] = simple_strtoul(buf, NULL, 10) &amp; 0xff;<br />-<br />+ unsigned long v = simple_strtoul(buf, NULL, 10) &amp; 0xff;<br />+ <br />+ down(&amp;data-&gt;update_lock);<br />+ data-&gt;watchdog[0] = v;<br /> fscher_write_value(client, reg, data-&gt;watchdog[0]);<br />+ up(&amp;data-&gt;update_lock);<br /> return count;<br /> }<br /> <br />diff -Nru a/drivers/i2c/chips/fscpos.c b/drivers/i2c/chips/fscpos.c<br />--- a/drivers/i2c/chips/fscpos.c 2005-04-01 11:52:47 -08:00<br />+++ b/drivers/i2c/chips/fscpos.c 2005-04-01 11:52:47 -08:00<br />&#64;&#64; -206,11 +206,13 &#64;&#64;<br /> return -EINVAL;<br /> }<br /> <br />+ down(&amp;data-&gt;update_lock);<br /> /* bits 2..7 reserved =&gt; mask with 0x03 */<br /> data-&gt;fan_ripple[nr - 1] &amp;= ~0x03;<br /> data-&gt;fan_ripple[nr - 1] |= v;<br /> <br /> fscpos_write_value(client, reg, data-&gt;fan_ripple[nr - 1]);<br />+ up(&amp;data-&gt;update_lock);<br /> return count;<br /> }<br /> <br />&#64;&#64; -228,8 +230,10 &#64;&#64;<br /> if (v &lt; 0) v = 0;<br /> if (v &gt; 255) v = 255;<br /> <br />+ down(&amp;data-&gt;update_lock);<br /> data-&gt;pwm[nr - 1] = v;<br /> fscpos_write_value(client, reg, data-&gt;pwm[nr - 1]);<br />+ up(&amp;data-&gt;update_lock);<br /> return count;<br /> }<br /> <br />&#64;&#64; -271,10 +275,12 &#64;&#64;<br /> {<br /> /* bits 0..3 reserved =&gt; mask with 0xf0 */<br /> unsigned long v = simple_strtoul(buf, NULL, 10) &amp; 0xf0;<br />+<br />+ down(&amp;data-&gt;update_lock);<br /> data-&gt;wdog_control &amp;= ~0xf0;<br /> data-&gt;wdog_control |= v;<br />- <br /> fscpos_write_value(client, reg, data-&gt;wdog_control);<br />+ up(&amp;data-&gt;update_lock);<br /> return count;<br /> }<br /> <br />&#64;&#64; -296,9 +302,10 &#64;&#64;<br /> return -EINVAL;<br /> }<br /> <br />+ down(&amp;data-&gt;update_lock);<br /> data-&gt;wdog_state &amp;= ~v;<br />- <br /> fscpos_write_value(client, reg, v);<br />+ up(&amp;data-&gt;update_lock);<br /> return count;<br /> }<br /> <br />&#64;&#64; -310,9 +317,12 &#64;&#64;<br /> static ssize_t set_wdog_preset(struct i2c_client *client, struct fscpos_data<br /> *data, const char *buf, size_t count, int reg)<br /> {<br />- data-&gt;wdog_preset = simple_strtoul(buf, NULL, 10) &amp; 0xff;<br />- <br />+ unsigned long v = simple_strtoul(buf, NULL, 10) &amp; 0xff;<br />+<br />+ down(&amp;data-&gt;update_lock);<br />+ data-&gt;wdog_preset = v;<br /> fscpos_write_value(client, reg, data-&gt;wdog_preset);<br />+ up(&amp;data-&gt;update_lock);<br /> return count;<br /> }<br /> <br />diff -Nru a/drivers/i2c/chips/gl518sm.c b/drivers/i2c/chips/gl518sm.c<br />--- a/drivers/i2c/chips/gl518sm.c 2005-04-01 11:52:47 -08:00<br />+++ b/drivers/i2c/chips/gl518sm.c 2005-04-01 11:52:47 -08:00<br />&#64;&#64; -211,8 +211,11 &#64;&#64;<br /> struct i2c_client *client = to_i2c_client(dev); \<br /> struct gl518_data *data = i2c_get_clientdata(client); \<br /> long val = simple_strtol(buf, NULL, 10); \<br />+ \<br />+ down(&amp;data-&gt;update_lock); \<br /> data-&gt;value = type##_TO_REG(val); \<br /> gl518_write_value(client, reg, data-&gt;value); \<br />+ up(&amp;data-&gt;update_lock); \<br /> return count; \<br /> }<br /> <br />&#64;&#64; -222,11 +225,15 &#64;&#64;<br /> { \<br /> struct i2c_client *client = to_i2c_client(dev); \<br /> struct gl518_data *data = i2c_get_clientdata(client); \<br />- int regvalue = gl518_read_value(client, reg); \<br />+ int regvalue; \<br /> unsigned long val = simple_strtoul(buf, NULL, 10); \<br />+ \<br />+ down(&amp;data-&gt;update_lock); \<br />+ regvalue = gl518_read_value(client, reg); \<br /> data-&gt;value = type##_TO_REG(val); \<br /> regvalue = (regvalue &amp; ~mask) | (data-&gt;value &lt;&lt; shift); \<br /> gl518_write_value(client, reg, regvalue); \<br />+ up(&amp;data-&gt;update_lock); \<br /> return count; \<br /> }<br /> <br />&#64;&#64; -255,9 +262,12 &#64;&#64;<br /> {<br /> struct i2c_client *client = to_i2c_client(dev);<br /> struct gl518_data *data = i2c_get_clientdata(client);<br />- int regvalue = gl518_read_value(client, GL518_REG_FAN_LIMIT);<br />+ int regvalue;<br />+ unsigned long val = simple_strtoul(buf, NULL, 10);<br /> <br />- data-&gt;fan_min[0] = FAN_TO_REG(simple_strtoul(buf, NULL, 10),<br />+ down(&amp;data-&gt;update_lock);<br />+ regvalue = gl518_read_value(client, GL518_REG_FAN_LIMIT);<br />+ data-&gt;fan_min[0] = FAN_TO_REG(val,<br /> DIV_FROM_REG(data-&gt;fan_div[0]));<br /> regvalue = (regvalue &amp; 0x00ff) | (data-&gt;fan_min[0] &lt;&lt; 8);<br /> gl518_write_value(client, GL518_REG_FAN_LIMIT, regvalue);<br />&#64;&#64; -270,6 +280,7 &#64;&#64;<br /> data-&gt;beep_mask &amp;= data-&gt;alarm_mask;<br /> gl518_write_value(client, GL518_REG_ALARM, data-&gt;beep_mask);<br /> <br />+ up(&amp;data-&gt;update_lock);<br /> return count;<br /> }<br /> <br />&#64;&#64; -277,9 +288,12 &#64;&#64;<br /> {<br /> struct i2c_client *client = to_i2c_client(dev);<br /> struct gl518_data *data = i2c_get_clientdata(client);<br />- int regvalue = gl518_read_value(client, GL518_REG_FAN_LIMIT);<br />+ int regvalue;<br />+ unsigned long val = simple_strtoul(buf, NULL, 10);<br /> <br />- data-&gt;fan_min[1] = FAN_TO_REG(simple_strtoul(buf, NULL, 10),<br />+ down(&amp;data-&gt;update_lock);<br />+ regvalue = gl518_read_value(client, GL518_REG_FAN_LIMIT);<br />+ data-&gt;fan_min[1] = FAN_TO_REG(val,<br /> DIV_FROM_REG(data-&gt;fan_div[1]));<br /> regvalue = (regvalue &amp; 0xff00) | data-&gt;fan_min[1];<br /> gl518_write_value(client, GL518_REG_FAN_LIMIT, regvalue);<br />&#64;&#64; -292,6 +306,7 &#64;&#64;<br /> data-&gt;beep_mask &amp;= data-&gt;alarm_mask;<br /> gl518_write_value(client, GL518_REG_ALARM, data-&gt;beep_mask);<br /> <br />+ up(&amp;data-&gt;update_lock);<br /> return count;<br /> }<br /> <br />diff -Nru a/drivers/i2c/chips/gl520sm.c b/drivers/i2c/chips/gl520sm.c<br />--- a/drivers/i2c/chips/gl520sm.c 2005-04-01 11:52:47 -08:00<br />+++ b/drivers/i2c/chips/gl520sm.c 2005-04-01 11:52:47 -08:00<br />&#64;&#64; -301,6 +301,8 &#64;&#64;<br /> long v = simple_strtol(buf, NULL, 10);<br /> u8 r;<br /> <br />+ down(&amp;data-&gt;update_lock);<br />+<br /> if (n == 0)<br /> r = VDD_TO_REG(v);<br /> else<br />&#64;&#64; -313,6 +315,7 &#64;&#64;<br /> else<br /> gl520_write_value(client, reg, r);<br /> <br />+ up(&amp;data-&gt;update_lock);<br /> return count;<br /> }<br /> <br />&#64;&#64; -326,6 +329,8 &#64;&#64;<br /> else<br /> r = IN_TO_REG(v);<br /> <br />+ down(&amp;data-&gt;update_lock);<br />+<br /> data-&gt;in_max[n] = r;<br /> <br /> if (n &lt; 4)<br />&#64;&#64; -333,6 +338,7 &#64;&#64;<br /> else<br /> gl520_write_value(client, reg, r);<br /> <br />+ up(&amp;data-&gt;update_lock);<br /> return count;<br /> }<br /> <br />&#64;&#64; -363,8 +369,10 &#64;&#64;<br /> static ssize_t set_fan_min(struct i2c_client *client, struct gl520_data *data, const char *buf, size_t count, int n, int reg)<br /> {<br /> unsigned long v = simple_strtoul(buf, NULL, 10);<br />- u8 r = FAN_TO_REG(v, data-&gt;fan_div[n - 1]);<br />+ u8 r;<br /> <br />+ down(&amp;data-&gt;update_lock);<br />+ r = FAN_TO_REG(v, data-&gt;fan_div[n - 1]);<br /> data-&gt;fan_min[n - 1] = r;<br /> <br /> if (n == 1)<br />&#64;&#64; -380,6 +388,7 &#64;&#64;<br /> data-&gt;beep_mask &amp;= data-&gt;alarm_mask;<br /> gl520_write_value(client, GL520_REG_BEEP_MASK, data-&gt;beep_mask);<br /> <br />+ up(&amp;data-&gt;update_lock);<br /> return count;<br /> }<br /> <br />&#64;&#64; -398,6 +407,7 &#64;&#64;<br /> return -EINVAL;<br /> }<br /> <br />+ down(&amp;data-&gt;update_lock);<br /> data-&gt;fan_div[n - 1] = r;<br /> <br /> if (n == 1)<br />&#64;&#64; -405,6 +415,7 &#64;&#64;<br /> else<br /> gl520_write_value(client, reg, (gl520_read_value(client, reg) &amp; ~0x30) | (r &lt;&lt; 4));<br /> <br />+ up(&amp;data-&gt;update_lock);<br /> return count;<br /> }<br /> <br />&#64;&#64; -412,9 +423,10 &#64;&#64;<br /> {<br /> u8 r = simple_strtoul(buf, NULL, 10)?1:0;<br /> <br />+ down(&amp;data-&gt;update_lock);<br /> data-&gt;fan_off = r;<br /> gl520_write_value(client, reg, (gl520_read_value(client, reg) &amp; ~0x0c) | (r &lt;&lt; 2));<br />-<br />+ up(&amp;data-&gt;update_lock);<br /> return count;<br /> }<br /> <br />&#64;&#64; -439,22 +451,22 &#64;&#64;<br /> static ssize_t set_temp_max(struct i2c_client *client, struct gl520_data *data, const char *buf, size_t count, int n, int reg)<br /> {<br /> long v = simple_strtol(buf, NULL, 10);<br />- u8 r = TEMP_TO_REG(v);<br />-<br />- data-&gt;temp_max[n - 1] = r;<br />- gl520_write_value(client, reg, r);<br /> <br />+ down(&amp;data-&gt;update_lock);<br />+ data-&gt;temp_max[n - 1] = TEMP_TO_REG(v);;<br />+ gl520_write_value(client, reg, data-&gt;temp_max[n - 1]);<br />+ up(&amp;data-&gt;update_lock);<br /> return count;<br /> }<br /> <br /> static ssize_t set_temp_max_hyst(struct i2c_client *client, struct gl520_data *data, const char *buf, size_t count, int n, int reg)<br /> {<br /> long v = simple_strtol(buf, NULL, 10);<br />- u8 r = TEMP_TO_REG(v);<br />-<br />- data-&gt;temp_max_hyst[n - 1] = r;<br />- gl520_write_value(client, reg, r);<br /> <br />+ down(&amp;data-&gt;update_lock);<br />+ data-&gt;temp_max_hyst[n - 1] = TEMP_TO_REG(v);<br />+ gl520_write_value(client, reg, data-&gt;temp_max_hyst[n - 1]);<br />+ up(&amp;data-&gt;update_lock);<br /> return count;<br /> }<br /> <br />&#64;&#64; -477,19 +489,22 &#64;&#64;<br /> {<br /> u8 r = simple_strtoul(buf, NULL, 10)?0:1;<br /> <br />+ down(&amp;data-&gt;update_lock);<br /> data-&gt;beep_enable = !r;<br /> gl520_write_value(client, reg, (gl520_read_value(client, reg) &amp; ~0x04) | (r &lt;&lt; 2));<br />-<br />+ up(&amp;data-&gt;update_lock);<br /> return count;<br /> }<br /> <br /> static ssize_t set_beep_mask(struct i2c_client *client, struct gl520_data *data, const char *buf, size_t count, int n, int reg)<br /> {<br />- u8 r = simple_strtoul(buf, NULL, 10) &amp; data-&gt;alarm_mask;<br />-<br />+ u8 r = simple_strtoul(buf, NULL, 10);<br />+ <br />+ down(&amp;data-&gt;update_lock);<br />+ r &amp;= data-&gt;alarm_mask;<br /> data-&gt;beep_mask = r;<br /> gl520_write_value(client, reg, r);<br />-<br />+ up(&amp;data-&gt;update_lock);<br /> return count;<br /> }<br /> <br />diff -Nru a/drivers/i2c/chips/it87.c b/drivers/i2c/chips/it87.c<br />--- a/drivers/i2c/chips/it87.c 2005-04-01 11:52:47 -08:00<br />+++ b/drivers/i2c/chips/it87.c 2005-04-01 11:52:47 -08:00<br />&#64;&#64; -265,9 +265,12 &#64;&#64;<br /> struct i2c_client *client = to_i2c_client(dev);<br /> struct it87_data *data = i2c_get_clientdata(client);<br /> unsigned long val = simple_strtoul(buf, NULL, 10);<br />+<br />+ down(&amp;data-&gt;update_lock);<br /> data-&gt;in_min[nr] = IN_TO_REG(val);<br /> it87_write_value(client, IT87_REG_VIN_MIN(nr), <br /> data-&gt;in_min[nr]);<br />+ up(&amp;data-&gt;update_lock);<br /> return count;<br /> }<br /> static ssize_t set_in_max(struct device *dev, const char *buf, <br />&#64;&#64; -276,9 +279,12 &#64;&#64;<br /> struct i2c_client *client = to_i2c_client(dev);<br /> struct it87_data *data = i2c_get_clientdata(client);<br /> unsigned long val = simple_strtoul(buf, NULL, 10);<br />+<br />+ down(&amp;data-&gt;update_lock);<br /> data-&gt;in_max[nr] = IN_TO_REG(val);<br /> it87_write_value(client, IT87_REG_VIN_MAX(nr), <br /> data-&gt;in_max[nr]);<br />+ up(&amp;data-&gt;update_lock);<br /> return count;<br /> }<br /> <br />&#64;&#64; -356,8 +362,11 &#64;&#64;<br /> struct i2c_client *client = to_i2c_client(dev);<br /> struct it87_data *data = i2c_get_clientdata(client);<br /> int val = simple_strtol(buf, NULL, 10);<br />+<br />+ down(&amp;data-&gt;update_lock);<br /> data-&gt;temp_high[nr] = TEMP_TO_REG(val);<br /> it87_write_value(client, IT87_REG_TEMP_HIGH(nr), data-&gt;temp_high[nr]);<br />+ up(&amp;data-&gt;update_lock);<br /> return count;<br /> }<br /> static ssize_t set_temp_min(struct device *dev, const char *buf, <br />&#64;&#64; -366,8 +375,11 &#64;&#64;<br /> struct i2c_client *client = to_i2c_client(dev);<br /> struct it87_data *data = i2c_get_clientdata(client);<br /> int val = simple_strtol(buf, NULL, 10);<br />+<br />+ down(&amp;data-&gt;update_lock);<br /> data-&gt;temp_low[nr] = TEMP_TO_REG(val);<br /> it87_write_value(client, IT87_REG_TEMP_LOW(nr), data-&gt;temp_low[nr]);<br />+ up(&amp;data-&gt;update_lock);<br /> return count;<br /> }<br /> #define show_temp_offset(offset) \<br />&#64;&#64; -408,9 +420,11 &#64;&#64;<br /> static ssize_t show_sensor(struct device *dev, char *buf, int nr)<br /> {<br /> struct it87_data *data = it87_update_device(dev);<br />- if (data-&gt;sensor &amp; (1 &lt;&lt; nr))<br />+ u8 reg = data-&gt;sensor; /* In case the value is updated while we use it */<br />+ <br />+ if (reg &amp; (1 &lt;&lt; nr))<br /> return sprintf(buf, "3\n"); /* thermal diode */<br />- if (data-&gt;sensor &amp; (8 &lt;&lt; nr))<br />+ if (reg &amp; (8 &lt;&lt; nr))<br /> return sprintf(buf, "2\n"); /* thermistor */<br /> return sprintf(buf, "0\n"); /* disabled */<br /> }<br />&#64;&#64; -421,6 +435,8 &#64;&#64;<br /> struct it87_data *data = i2c_get_clientdata(client);<br /> int val = simple_strtol(buf, NULL, 10);<br /> <br />+ down(&amp;data-&gt;update_lock);<br />+<br /> data-&gt;sensor &amp;= ~(1 &lt;&lt; nr);<br /> data-&gt;sensor &amp;= ~(8 &lt;&lt; nr);<br /> /* 3 = thermal diode; 2 = thermistor; 0 = disabled */<br />&#64;&#64; -428,9 +444,12 &#64;&#64;<br /> data-&gt;sensor |= 1 &lt;&lt; nr;<br /> else if (val == 2)<br /> data-&gt;sensor |= 8 &lt;&lt; nr;<br />- else if (val != 0)<br />+ else if (val != 0) {<br />+ up(&amp;data-&gt;update_lock);<br /> return -EINVAL;<br />+ }<br /> it87_write_value(client, IT87_REG_TEMP_ENABLE, data-&gt;sensor);<br />+ up(&amp;data-&gt;update_lock);<br /> return count;<br /> }<br /> #define show_sensor_offset(offset) \<br />&#64;&#64; -484,8 +503,11 &#64;&#64;<br /> struct i2c_client *client = to_i2c_client(dev);<br /> struct it87_data *data = i2c_get_clientdata(client);<br /> int val = simple_strtol(buf, NULL, 10);<br />+<br />+ down(&amp;data-&gt;update_lock);<br /> data-&gt;fan_min[nr] = FAN_TO_REG(val, DIV_FROM_REG(data-&gt;fan_div[nr]));<br /> it87_write_value(client, IT87_REG_FAN_MIN(nr), data-&gt;fan_min[nr]);<br />+ up(&amp;data-&gt;update_lock);<br /> return count;<br /> }<br /> static ssize_t set_fan_div(struct device *dev, const char *buf, <br />&#64;&#64; -495,7 +517,10 &#64;&#64;<br /> struct it87_data *data = i2c_get_clientdata(client);<br /> int val = simple_strtol(buf, NULL, 10);<br /> int i, min[3];<br />- u8 old = it87_read_value(client, IT87_REG_FAN_DIV);<br />+ u8 old;<br />+<br />+ down(&amp;data-&gt;update_lock);<br />+ old = it87_read_value(client, IT87_REG_FAN_DIV);<br /> <br /> for (i = 0; i &lt; 3; i++)<br /> min[i] = FAN_FROM_REG(data-&gt;fan_min[i], DIV_FROM_REG(data-&gt;fan_div[i]));<br />&#64;&#64; -522,6 +547,7 &#64;&#64;<br /> data-&gt;fan_min[i]=FAN_TO_REG(min[i], DIV_FROM_REG(data-&gt;fan_div[i]));<br /> it87_write_value(client, IT87_REG_FAN_MIN(i), data-&gt;fan_min[i]);<br /> }<br />+ up(&amp;data-&gt;update_lock);<br /> return count;<br /> }<br /> static ssize_t set_pwm_enable(struct device *dev, const char *buf,<br />&#64;&#64; -531,6 +557,8 &#64;&#64;<br /> struct it87_data *data = i2c_get_clientdata(client);<br /> int val = simple_strtol(buf, NULL, 10);<br /> <br />+ down(&amp;data-&gt;update_lock);<br />+<br /> if (val == 0) {<br /> int tmp;<br /> /* make sure the fan is on when in on/off mode */<br />&#64;&#64; -545,9 +573,12 &#64;&#64;<br /> it87_write_value(client, IT87_REG_FAN_MAIN_CTRL, data-&gt;fan_main_ctrl);<br /> /* set saved pwm value, clear FAN_CTLX PWM mode bit */<br /> it87_write_value(client, IT87_REG_PWM(nr), PWM_TO_REG(data-&gt;manual_pwm_ctl[nr]));<br />- } else<br />+ } else {<br />+ up(&amp;data-&gt;update_lock);<br /> return -EINVAL;<br />+ }<br /> <br />+ up(&amp;data-&gt;update_lock);<br /> return count;<br /> }<br /> static ssize_t set_pwm(struct device *dev, const char *buf,<br />&#64;&#64; -560,10 +591,11 &#64;&#64;<br /> if (val &lt; 0 || val &gt; 255)<br /> return -EINVAL;<br /> <br />+ down(&amp;data-&gt;update_lock);<br /> data-&gt;manual_pwm_ctl[nr] = val;<br /> if (data-&gt;fan_main_ctrl &amp; (1 &lt;&lt; nr))<br /> it87_write_value(client, IT87_REG_PWM(nr), PWM_TO_REG(data-&gt;manual_pwm_ctl[nr]));<br />-<br />+ up(&amp;data-&gt;update_lock);<br /> return count;<br /> }<br /> <br />diff -Nru a/drivers/i2c/chips/lm63.c b/drivers/i2c/chips/lm63.c<br />--- a/drivers/i2c/chips/lm63.c 2005-04-01 11:52:47 -08:00<br />+++ b/drivers/i2c/chips/lm63.c 2005-04-01 11:52:47 -08:00<br />&#64;&#64; -191,11 +191,14 &#64;&#64;<br /> struct i2c_client *client = to_i2c_client(dev);<br /> struct lm63_data *data = i2c_get_clientdata(client);<br /> unsigned long val = simple_strtoul(buf, NULL, 10);<br />+<br />+ down(&amp;data-&gt;update_lock);<br /> data-&gt;fan1_low = FAN_TO_REG(val);<br /> i2c_smbus_write_byte_data(client, LM63_REG_TACH_LIMIT_LSB,<br /> data-&gt;fan1_low &amp; 0xFF);<br /> i2c_smbus_write_byte_data(client, LM63_REG_TACH_LIMIT_MSB,<br /> data-&gt;fan1_low &gt;&gt; 8);<br />+ up(&amp;data-&gt;update_lock);<br /> return count;<br /> }<br /> <br />&#64;&#64; -217,10 +220,12 &#64;&#64;<br /> return -EPERM;<br /> <br /> val = simple_strtoul(buf, NULL, 10);<br />+ down(&amp;data-&gt;update_lock);<br /> data-&gt;pwm1_value = val &lt;= 0 ? 0 :<br /> val &gt;= 255 ? 2 * data-&gt;pwm1_freq :<br /> (val * data-&gt;pwm1_freq * 2 + 127) / 255;<br /> i2c_smbus_write_byte_data(client, LM63_REG_PWM_VALUE, data-&gt;pwm1_value);<br />+ up(&amp;data-&gt;update_lock);<br /> return count;<br /> }<br /> <br />&#64;&#64; -256,8 +261,11 &#64;&#64;<br /> struct i2c_client *client = to_i2c_client(dev); \<br /> struct lm63_data *data = i2c_get_clientdata(client); \<br /> long val = simple_strtol(buf, NULL, 10); \<br />+ \<br />+ down(&amp;data-&gt;update_lock); \<br /> data-&gt;value = TEMP8_TO_REG(val); \<br /> i2c_smbus_write_byte_data(client, reg, data-&gt;value); \<br />+ up(&amp;data-&gt;update_lock); \<br /> return count; \<br /> }<br /> #define set_temp11(value, reg_msb, reg_lsb) \<br />&#64;&#64; -267,9 +275,12 &#64;&#64;<br /> struct i2c_client *client = to_i2c_client(dev); \<br /> struct lm63_data *data = i2c_get_clientdata(client); \<br /> long val = simple_strtol(buf, NULL, 10); \<br />+ \<br />+ down(&amp;data-&gt;update_lock); \<br /> data-&gt;value = TEMP11_TO_REG(val); \<br /> i2c_smbus_write_byte_data(client, reg_msb, data-&gt;value &gt;&gt; 8); \<br /> i2c_smbus_write_byte_data(client, reg_lsb, data-&gt;value &amp; 0xff); \<br />+ up(&amp;data-&gt;update_lock); \<br /> return count; \<br /> }<br /> set_temp8(temp1_high, LM63_REG_LOCAL_HIGH);<br />&#64;&#64; -292,10 +303,14 &#64;&#64;<br /> {<br /> struct i2c_client *client = to_i2c_client(dev);<br /> struct lm63_data *data = i2c_get_clientdata(client);<br />- int hyst = TEMP8_FROM_REG(data-&gt;temp2_crit) -<br />- simple_strtol(buf, NULL, 10);<br />+ long val = simple_strtol(buf, NULL, 10);<br />+ long hyst;<br />+<br />+ down(&amp;data-&gt;update_lock);<br />+ hyst = TEMP8_FROM_REG(data-&gt;temp2_crit) - val;<br /> i2c_smbus_write_byte_data(client, LM63_REG_REMOTE_TCRIT_HYST,<br /> HYST_TO_REG(hyst));<br />+ up(&amp;data-&gt;update_lock);<br /> return count;<br /> }<br /> <br />diff -Nru a/drivers/i2c/chips/lm75.c b/drivers/i2c/chips/lm75.c<br />--- a/drivers/i2c/chips/lm75.c 2005-04-01 11:52:47 -08:00<br />+++ b/drivers/i2c/chips/lm75.c 2005-04-01 11:52:47 -08:00<br />&#64;&#64; -90,8 +90,11 &#64;&#64;<br /> struct i2c_client *client = to_i2c_client(dev); \<br /> struct lm75_data *data = i2c_get_clientdata(client); \<br /> int temp = simple_strtoul(buf, NULL, 10); \<br />+ \<br />+ down(&amp;data-&gt;update_lock); \<br /> data-&gt;value = LM75_TEMP_TO_REG(temp); \<br /> lm75_write_value(client, reg, data-&gt;value); \<br />+ up(&amp;data-&gt;update_lock); \<br /> return count; \<br /> }<br /> set(temp_max, LM75_REG_TEMP_OS);<br />diff -Nru a/drivers/i2c/chips/lm77.c b/drivers/i2c/chips/lm77.c<br />--- a/drivers/i2c/chips/lm77.c 2005-04-01 11:52:47 -08:00<br />+++ b/drivers/i2c/chips/lm77.c 2005-04-01 11:52:47 -08:00<br />&#64;&#64; -138,8 +138,12 &#64;&#64;<br /> { \<br /> struct i2c_client *client = to_i2c_client(dev); \<br /> struct lm77_data *data = i2c_get_clientdata(client); \<br />- data-&gt;value = simple_strtoul(buf, NULL, 10); \<br />+ long val = simple_strtoul(buf, NULL, 10); \<br />+ \<br />+ down(&amp;data-&gt;update_lock); \<br />+ data-&gt;value = val; \<br /> lm77_write_value(client, reg, LM77_TEMP_TO_REG(data-&gt;value)); \<br />+ up(&amp;data-&gt;update_lock); \<br /> return count; \<br /> }<br /> <br />&#64;&#64; -152,9 +156,13 &#64;&#64;<br /> {<br /> struct i2c_client *client = to_i2c_client(dev);<br /> struct lm77_data *data = i2c_get_clientdata(client);<br />- data-&gt;temp_hyst = data-&gt;temp_crit - simple_strtoul(buf, NULL, 10);<br />+ unsigned long val = simple_strtoul(buf, NULL, 10);<br />+<br />+ down(&amp;data-&gt;update_lock);<br />+ data-&gt;temp_hyst = data-&gt;temp_crit - val;<br /> lm77_write_value(client, LM77_REG_TEMP_HYST,<br /> LM77_TEMP_TO_REG(data-&gt;temp_hyst));<br />+ up(&amp;data-&gt;update_lock);<br /> return count;<br /> }<br /> <br />&#64;&#64; -163,13 +171,18 &#64;&#64;<br /> {<br /> struct i2c_client *client = to_i2c_client(dev);<br /> struct lm77_data *data = i2c_get_clientdata(client);<br />- int oldcrithyst = data-&gt;temp_crit - data-&gt;temp_hyst;<br />- data-&gt;temp_crit = simple_strtoul(buf, NULL, 10);<br />+ long val = simple_strtoul(buf, NULL, 10);<br />+ int oldcrithyst;<br />+ <br />+ down(&amp;data-&gt;update_lock);<br />+ oldcrithyst = data-&gt;temp_crit - data-&gt;temp_hyst;<br />+ data-&gt;temp_crit = val;<br /> data-&gt;temp_hyst = data-&gt;temp_crit - oldcrithyst;<br /> lm77_write_value(client, LM77_REG_TEMP_CRIT,<br /> LM77_TEMP_TO_REG(data-&gt;temp_crit));<br /> lm77_write_value(client, LM77_REG_TEMP_HYST,<br /> LM77_TEMP_TO_REG(data-&gt;temp_hyst));<br />+ up(&amp;data-&gt;update_lock);<br /> return count;<br /> }<br /> <br />diff -Nru a/drivers/i2c/chips/lm78.c b/drivers/i2c/chips/lm78.c<br />--- a/drivers/i2c/chips/lm78.c 2005-04-01 11:52:47 -08:00<br />+++ b/drivers/i2c/chips/lm78.c 2005-04-01 11:52:47 -08:00<br />&#64;&#64; -200,8 +200,11 &#64;&#64;<br /> struct i2c_client *client = to_i2c_client(dev);<br /> struct lm78_data *data = i2c_get_clientdata(client);<br /> unsigned long val = simple_strtoul(buf, NULL, 10);<br />+<br />+ down(&amp;data-&gt;update_lock);<br /> data-&gt;in_min[nr] = IN_TO_REG(val);<br /> lm78_write_value(client, LM78_REG_IN_MIN(nr), data-&gt;in_min[nr]);<br />+ up(&amp;data-&gt;update_lock);<br /> return count;<br /> }<br /> <br />&#64;&#64; -211,8 +214,11 &#64;&#64;<br /> struct i2c_client *client = to_i2c_client(dev);<br /> struct lm78_data *data = i2c_get_clientdata(client);<br /> unsigned long val = simple_strtoul(buf, NULL, 10);<br />+<br />+ down(&amp;data-&gt;update_lock);<br /> data-&gt;in_max[nr] = IN_TO_REG(val);<br /> lm78_write_value(client, LM78_REG_IN_MAX(nr), data-&gt;in_max[nr]);<br />+ up(&amp;data-&gt;update_lock);<br /> return count;<br /> }<br /> <br />&#64;&#64; -275,8 +281,11 &#64;&#64;<br /> struct i2c_client *client = to_i2c_client(dev);<br /> struct lm78_data *data = i2c_get_clientdata(client);<br /> long val = simple_strtol(buf, NULL, 10);<br />+<br />+ down(&amp;data-&gt;update_lock);<br /> data-&gt;temp_over = TEMP_TO_REG(val);<br /> lm78_write_value(client, LM78_REG_TEMP_OVER, data-&gt;temp_over);<br />+ up(&amp;data-&gt;update_lock);<br /> return count;<br /> }<br /> <br />&#64;&#64; -291,8 +300,11 &#64;&#64;<br /> struct i2c_client *client = to_i2c_client(dev);<br /> struct lm78_data *data = i2c_get_clientdata(client);<br /> long val = simple_strtol(buf, NULL, 10);<br />+<br />+ down(&amp;data-&gt;update_lock);<br /> data-&gt;temp_hyst = TEMP_TO_REG(val);<br /> lm78_write_value(client, LM78_REG_TEMP_HYST, data-&gt;temp_hyst);<br />+ up(&amp;data-&gt;update_lock);<br /> return count;<br /> }<br /> <br />&#64;&#64; -323,8 +335,11 &#64;&#64;<br /> struct i2c_client *client = to_i2c_client(dev);<br /> struct lm78_data *data = i2c_get_clientdata(client);<br /> unsigned long val = simple_strtoul(buf, NULL, 10);<br />+<br />+ down(&amp;data-&gt;update_lock);<br /> data-&gt;fan_min[nr] = FAN_TO_REG(val, DIV_FROM_REG(data-&gt;fan_div[nr]));<br /> lm78_write_value(client, LM78_REG_FAN_MIN(nr), data-&gt;fan_min[nr]);<br />+ up(&amp;data-&gt;update_lock);<br /> return count;<br /> }<br /> <br />&#64;&#64; -343,10 +358,14 &#64;&#64;<br /> {<br /> struct i2c_client *client = to_i2c_client(dev);<br /> struct lm78_data *data = i2c_get_clientdata(client);<br />- unsigned long min = FAN_FROM_REG(data-&gt;fan_min[nr],<br />- DIV_FROM_REG(data-&gt;fan_div[nr]));<br /> unsigned long val = simple_strtoul(buf, NULL, 10);<br />- int reg = lm78_read_value(client, LM78_REG_VID_FANDIV);<br />+ unsigned long min;<br />+ u8 reg;<br />+<br />+ down(&amp;data-&gt;update_lock);<br />+ min = FAN_FROM_REG(data-&gt;fan_min[nr],<br />+ DIV_FROM_REG(data-&gt;fan_div[nr]));<br />+<br /> switch (val) {<br /> case 1: data-&gt;fan_div[nr] = 0; break;<br /> case 2: data-&gt;fan_div[nr] = 1; break;<br />&#64;&#64; -355,9 +374,11 &#64;&#64;<br /> default:<br /> dev_err(&amp;client-&gt;dev, "fan_div value %ld not "<br /> "supported. Choose one of 1, 2, 4 or 8!\n", val);<br />+ up(&amp;data-&gt;update_lock);<br /> return -EINVAL;<br /> }<br /> <br />+ reg = lm78_read_value(client, LM78_REG_VID_FANDIV);<br /> switch (nr) {<br /> case 0:<br /> reg = (reg &amp; 0xcf) | (data-&gt;fan_div[nr] &lt;&lt; 4);<br />&#64;&#64; -367,9 +388,12 &#64;&#64;<br /> break;<br /> }<br /> lm78_write_value(client, LM78_REG_VID_FANDIV, reg);<br />+<br /> data-&gt;fan_min[nr] =<br /> FAN_TO_REG(min, DIV_FROM_REG(data-&gt;fan_div[nr]));<br /> lm78_write_value(client, LM78_REG_FAN_MIN(nr), data-&gt;fan_min[nr]);<br />+ up(&amp;data-&gt;update_lock);<br />+<br /> return count;<br /> }<br /> <br />diff -Nru a/drivers/i2c/chips/lm80.c b/drivers/i2c/chips/lm80.c<br />--- a/drivers/i2c/chips/lm80.c 2005-04-01 11:52:47 -08:00<br />+++ b/drivers/i2c/chips/lm80.c 2005-04-01 11:52:47 -08:00<br />&#64;&#64; -190,8 +190,11 &#64;&#64;<br /> struct i2c_client *client = to_i2c_client(dev); \<br /> struct lm80_data *data = i2c_get_clientdata(client); \<br /> long val = simple_strtol(buf, NULL, 10); \<br />+ \<br />+ down(&amp;data-&gt;update_lock);\<br /> data-&gt;value = IN_TO_REG(val); \<br /> lm80_write_value(client, reg, data-&gt;value); \<br />+ up(&amp;data-&gt;update_lock);\<br /> return count; \<br /> }<br /> set_in(min0, in_min[0], LM80_REG_IN_MIN(0));<br />&#64;&#64; -237,8 +240,11 &#64;&#64;<br /> struct i2c_client *client = to_i2c_client(dev); \<br /> struct lm80_data *data = i2c_get_clientdata(client); \<br /> long val = simple_strtoul(buf, NULL, 10); \<br />+ \<br />+ down(&amp;data-&gt;update_lock);\<br /> data-&gt;value = FAN_TO_REG(val, DIV_FROM_REG(data-&gt;div)); \<br /> lm80_write_value(client, reg, data-&gt;value); \<br />+ up(&amp;data-&gt;update_lock);\<br /> return count; \<br /> }<br /> set_fan(min1, fan_min[0], LM80_REG_FAN_MIN(1), fan_div[0]);<br />&#64;&#64; -253,15 +259,14 &#64;&#64;<br /> {<br /> struct i2c_client *client = to_i2c_client(dev);<br /> struct lm80_data *data = i2c_get_clientdata(client);<br />- unsigned long min, val;<br />+ unsigned long min, val = simple_strtoul(buf, NULL, 10);<br /> u8 reg;<br /> <br /> /* Save fan_min */<br />+ down(&amp;data-&gt;update_lock);<br /> min = FAN_FROM_REG(data-&gt;fan_min[nr],<br /> DIV_FROM_REG(data-&gt;fan_div[nr]));<br /> <br />- val = simple_strtoul(buf, NULL, 10);<br />-<br /> switch (val) {<br /> case 1: data-&gt;fan_div[nr] = 0; break;<br /> case 2: data-&gt;fan_div[nr] = 1; break;<br />&#64;&#64; -270,6 +275,7 &#64;&#64;<br /> default:<br /> dev_err(&amp;client-&gt;dev, "fan_div value %ld not "<br /> "supported. Choose one of 1, 2, 4 or 8!\n", val);<br />+ up(&amp;data-&gt;update_lock);<br /> return -EINVAL;<br /> }<br /> <br />&#64;&#64; -280,6 +286,7 &#64;&#64;<br /> /* Restore fan_min */<br /> data-&gt;fan_min[nr] = FAN_TO_REG(min, DIV_FROM_REG(data-&gt;fan_div[nr]));<br /> lm80_write_value(client, LM80_REG_FAN_MIN(nr + 1), data-&gt;fan_min[nr]);<br />+ up(&amp;data-&gt;update_lock);<br /> <br /> return count;<br /> }<br />&#64;&#64; -317,8 +324,11 &#64;&#64;<br /> struct i2c_client *client = to_i2c_client(dev); \<br /> struct lm80_data *data = i2c_get_clientdata(client); \<br /> long val = simple_strtoul(buf, NULL, 10); \<br />+ \<br />+ down(&amp;data-&gt;update_lock); \<br /> data-&gt;value = TEMP_LIMIT_TO_REG(val); \<br /> lm80_write_value(client, reg, data-&gt;value); \<br />+ up(&amp;data-&gt;update_lock); \<br /> return count; \<br /> }<br /> set_temp(hot_max, temp_hot_max, LM80_REG_TEMP_HOT_MAX);<br />diff -Nru a/drivers/i2c/chips/lm83.c b/drivers/i2c/chips/lm83.c<br />--- a/drivers/i2c/chips/lm83.c 2005-04-01 11:52:47 -08:00<br />+++ b/drivers/i2c/chips/lm83.c 2005-04-01 11:52:47 -08:00<br />&#64;&#64; -177,8 +177,11 &#64;&#64;<br /> struct i2c_client *client = to_i2c_client(dev); \<br /> struct lm83_data *data = i2c_get_clientdata(client); \<br /> long val = simple_strtol(buf, NULL, 10); \<br />+ \<br />+ down(&amp;data-&gt;update_lock); \<br /> data-&gt;value = TEMP_TO_REG(val); \<br /> i2c_smbus_write_byte_data(client, reg, data-&gt;value); \<br />+ up(&amp;data-&gt;update_lock); \<br /> return count; \<br /> }<br /> set_temp(high1, temp_high[0], LM83_REG_W_LOCAL_HIGH);<br />diff -Nru a/drivers/i2c/chips/lm85.c b/drivers/i2c/chips/lm85.c<br />--- a/drivers/i2c/chips/lm85.c 2005-04-01 11:52:47 -08:00<br />+++ b/drivers/i2c/chips/lm85.c 2005-04-01 11:52:47 -08:00<br />&#64;&#64; -416,10 +416,9 &#64;&#64;<br /> {<br /> struct i2c_client *client = to_i2c_client(dev);<br /> struct lm85_data *data = i2c_get_clientdata(client);<br />- int val;<br />+ long val = simple_strtol(buf, NULL, 10);<br /> <br /> down(&amp;data-&gt;update_lock);<br />- val = simple_strtol(buf, NULL, 10);<br /> data-&gt;fan_min[nr] = FAN_TO_REG(val);<br /> lm85_write_value(client, LM85_REG_FAN_MIN(nr), data-&gt;fan_min[nr]);<br /> up(&amp;data-&gt;update_lock);<br />&#64;&#64; -499,10 +498,9 &#64;&#64;<br /> {<br /> struct i2c_client *client = to_i2c_client(dev);<br /> struct lm85_data *data = i2c_get_clientdata(client);<br />- int val;<br />+ long val = simple_strtol(buf, NULL, 10);<br /> <br /> down(&amp;data-&gt;update_lock);<br />- val = simple_strtol(buf, NULL, 10);<br /> data-&gt;pwm[nr] = PWM_TO_REG(val);<br /> lm85_write_value(client, LM85_REG_PWM(nr), data-&gt;pwm[nr]);<br /> up(&amp;data-&gt;update_lock);<br />&#64;&#64; -560,10 +558,9 &#64;&#64;<br /> {<br /> struct i2c_client *client = to_i2c_client(dev);<br /> struct lm85_data *data = i2c_get_clientdata(client);<br />- int val;<br />+ long val = simple_strtol(buf, NULL, 10);<br /> <br /> down(&amp;data-&gt;update_lock);<br />- val = simple_strtol(buf, NULL, 10);<br /> data-&gt;in_min[nr] = INS_TO_REG(nr, val);<br /> lm85_write_value(client, LM85_REG_IN_MIN(nr), data-&gt;in_min[nr]);<br /> up(&amp;data-&gt;update_lock);<br />&#64;&#64; -579,10 +576,9 &#64;&#64;<br /> {<br /> struct i2c_client *client = to_i2c_client(dev);<br /> struct lm85_data *data = i2c_get_clientdata(client);<br />- int val;<br />+ long val = simple_strtol(buf, NULL, 10);<br /> <br /> down(&amp;data-&gt;update_lock);<br />- val = simple_strtol(buf, NULL, 10);<br /> data-&gt;in_max[nr] = INS_TO_REG(nr, val);<br /> lm85_write_value(client, LM85_REG_IN_MAX(nr), data-&gt;in_max[nr]);<br /> up(&amp;data-&gt;update_lock);<br />&#64;&#64; -643,10 +639,9 &#64;&#64;<br /> {<br /> struct i2c_client *client = to_i2c_client(dev);<br /> struct lm85_data *data = i2c_get_clientdata(client);<br />- int val;<br />+ long val = simple_strtol(buf, NULL, 10);<br /> <br /> down(&amp;data-&gt;update_lock);<br />- val = simple_strtol(buf, NULL, 10);<br /> data-&gt;temp_min[nr] = TEMP_TO_REG(val);<br /> lm85_write_value(client, LM85_REG_TEMP_MIN(nr), data-&gt;temp_min[nr]);<br /> up(&amp;data-&gt;update_lock);<br />&#64;&#64; -662,10 +657,9 &#64;&#64;<br /> {<br /> struct i2c_client *client = to_i2c_client(dev);<br /> struct lm85_data *data = i2c_get_clientdata(client);<br />- int val;<br />+ long val = simple_strtol(buf, NULL, 10); <br /> <br /> down(&amp;data-&gt;update_lock);<br />- val = simple_strtol(buf, NULL, 10);<br /> data-&gt;temp_max[nr] = TEMP_TO_REG(val);<br /> lm85_write_value(client, LM85_REG_TEMP_MAX(nr), data-&gt;temp_max[nr]);<br /> up(&amp;data-&gt;update_lock);<br />&#64;&#64; -718,10 +712,9 &#64;&#64;<br /> {<br /> struct i2c_client *client = to_i2c_client(dev);<br /> struct lm85_data *data = i2c_get_clientdata(client);<br />- int val;<br />+ long val = simple_strtol(buf, NULL, 10); <br /> <br /> down(&amp;data-&gt;update_lock);<br />- val = simple_strtol(buf, NULL, 10);<br /> data-&gt;autofan[nr].config = (data-&gt;autofan[nr].config &amp; (~0xe0))<br /> | ZONE_TO_REG(val) ;<br /> lm85_write_value(client, LM85_REG_AFAN_CONFIG(nr),<br />&#64;&#64; -739,10 +732,9 &#64;&#64;<br /> {<br /> struct i2c_client *client = to_i2c_client(dev);<br /> struct lm85_data *data = i2c_get_clientdata(client);<br />- int val;<br />+ long val = simple_strtol(buf, NULL, 10);<br /> <br /> down(&amp;data-&gt;update_lock);<br />- val = simple_strtol(buf, NULL, 10);<br /> data-&gt;autofan[nr].min_pwm = PWM_TO_REG(val);<br /> lm85_write_value(client, LM85_REG_AFAN_MINPWM(nr),<br /> data-&gt;autofan[nr].min_pwm);<br />&#64;&#64; -759,10 +751,9 &#64;&#64;<br /> {<br /> struct i2c_client *client = to_i2c_client(dev);<br /> struct lm85_data *data = i2c_get_clientdata(client);<br />- int val;<br />+ long val = simple_strtol(buf, NULL, 10);<br /> <br /> down(&amp;data-&gt;update_lock);<br />- val = simple_strtol(buf, NULL, 10);<br /> data-&gt;autofan[nr].min_off = val;<br /> lm85_write_value(client, LM85_REG_AFAN_SPIKE1, data-&gt;smooth[0]<br /> | data-&gt;syncpwm3<br />&#64;&#64; -783,10 +774,9 &#64;&#64;<br /> {<br /> struct i2c_client *client = to_i2c_client(dev);<br /> struct lm85_data *data = i2c_get_clientdata(client);<br />- int val;<br />+ long val = simple_strtol(buf, NULL, 10);<br /> <br /> down(&amp;data-&gt;update_lock);<br />- val = simple_strtol(buf, NULL, 10);<br /> data-&gt;autofan[nr].freq = FREQ_TO_REG(val);<br /> lm85_write_value(client, LM85_REG_AFAN_RANGE(nr),<br /> (data-&gt;zone[nr].range &lt;&lt; 4)<br />&#64;&#64; -865,10 +855,10 &#64;&#64;<br /> {<br /> struct i2c_client *client = to_i2c_client(dev);<br /> struct lm85_data *data = i2c_get_clientdata(client);<br />- int min, val;<br />+ int min;<br />+ long val = simple_strtol(buf, NULL, 10);<br /> <br /> down(&amp;data-&gt;update_lock);<br />- val = simple_strtol(buf, NULL, 10);<br /> min = TEMP_FROM_REG(data-&gt;zone[nr].limit);<br /> data-&gt;zone[nr].off_desired = TEMP_TO_REG(val);<br /> data-&gt;zone[nr].hyst = HYST_TO_REG(min - val);<br />&#64;&#64; -895,10 +885,9 &#64;&#64;<br /> {<br /> struct i2c_client *client = to_i2c_client(dev);<br /> struct lm85_data *data = i2c_get_clientdata(client);<br />- int val;<br />+ long val = simple_strtol(buf, NULL, 10);<br /> <br /> down(&amp;data-&gt;update_lock);<br />- val = simple_strtol(buf, NULL, 10);<br /> data-&gt;zone[nr].limit = TEMP_TO_REG(val);<br /> lm85_write_value(client, LM85_REG_AFAN_LIMIT(nr),<br /> data-&gt;zone[nr].limit);<br />&#64;&#64; -939,11 +928,11 &#64;&#64;<br /> {<br /> struct i2c_client *client = to_i2c_client(dev);<br /> struct lm85_data *data = i2c_get_clientdata(client);<br />- int min, val;<br />+ int min;<br />+ long val = simple_strtol(buf, NULL, 10);<br /> <br /> down(&amp;data-&gt;update_lock);<br /> min = TEMP_FROM_REG(data-&gt;zone[nr].limit);<br />- val = simple_strtol(buf, NULL, 10);<br /> data-&gt;zone[nr].max_desired = TEMP_TO_REG(val);<br /> data-&gt;zone[nr].range = RANGE_TO_REG(<br /> val - min);<br />&#64;&#64; -963,10 +952,9 &#64;&#64;<br /> {<br /> struct i2c_client *client = to_i2c_client(dev);<br /> struct lm85_data *data = i2c_get_clientdata(client);<br />- int val;<br />+ long val = simple_strtol(buf, NULL, 10);<br /> <br /> down(&amp;data-&gt;update_lock);<br />- val = simple_strtol(buf, NULL, 10);<br /> data-&gt;zone[nr].critical = TEMP_TO_REG(val);<br /> lm85_write_value(client, LM85_REG_AFAN_CRITICAL(nr),<br /> data-&gt;zone[nr].critical);<br />diff -Nru a/drivers/i2c/chips/lm87.c b/drivers/i2c/chips/lm87.c<br />--- a/drivers/i2c/chips/lm87.c 2005-04-01 11:52:47 -08:00<br />+++ b/drivers/i2c/chips/lm87.c 2005-04-01 11:52:47 -08:00<br />&#64;&#64; -252,9 +252,12 &#64;&#64;<br /> struct i2c_client *client = to_i2c_client(dev);<br /> struct lm87_data *data = i2c_get_clientdata(client);<br /> long val = simple_strtol(buf, NULL, 10);<br />+<br />+ down(&amp;data-&gt;update_lock);<br /> data-&gt;in_min[nr] = IN_TO_REG(val, data-&gt;in_scale[nr]);<br /> lm87_write_value(client, nr&lt;6 ? LM87_REG_IN_MIN(nr) :<br /> LM87_REG_AIN_MIN(nr-6), data-&gt;in_min[nr]);<br />+ up(&amp;data-&gt;update_lock);<br /> }<br /> <br /> static void set_in_max(struct device *dev, const char *buf, int nr)<br />&#64;&#64; -262,9 +265,12 &#64;&#64;<br /> struct i2c_client *client = to_i2c_client(dev);<br /> struct lm87_data *data = i2c_get_clientdata(client);<br /> long val = simple_strtol(buf, NULL, 10);<br />+<br />+ down(&amp;data-&gt;update_lock);<br /> data-&gt;in_max[nr] = IN_TO_REG(val, data-&gt;in_scale[nr]);<br /> lm87_write_value(client, nr&lt;6 ? LM87_REG_IN_MAX(nr) :<br /> LM87_REG_AIN_MAX(nr-6), data-&gt;in_max[nr]);<br />+ up(&amp;data-&gt;update_lock);<br /> }<br /> <br /> #define set_in(offset) \<br />&#64;&#64; -320,8 +326,11 &#64;&#64;<br /> struct i2c_client *client = to_i2c_client(dev);<br /> struct lm87_data *data = i2c_get_clientdata(client);<br /> long val = simple_strtol(buf, NULL, 10);<br />+<br />+ down(&amp;data-&gt;update_lock);<br /> data-&gt;temp_low[nr] = TEMP_TO_REG(val);<br /> lm87_write_value(client, LM87_REG_TEMP_LOW[nr], data-&gt;temp_low[nr]);<br />+ up(&amp;data-&gt;update_lock);<br /> }<br /> <br /> static void set_temp_high(struct device *dev, const char *buf, int nr)<br />&#64;&#64; -329,8 +338,11 &#64;&#64;<br /> struct i2c_client *client = to_i2c_client(dev);<br /> struct lm87_data *data = i2c_get_clientdata(client);<br /> long val = simple_strtol(buf, NULL, 10);<br />+<br />+ down(&amp;data-&gt;update_lock);<br /> data-&gt;temp_high[nr] = TEMP_TO_REG(val);<br /> lm87_write_value(client, LM87_REG_TEMP_HIGH[nr], data-&gt;temp_high[nr]);<br />+ up(&amp;data-&gt;update_lock);<br /> }<br /> <br /> #define set_temp(offset) \<br />&#64;&#64; -398,9 +410,12 &#64;&#64;<br /> struct i2c_client *client = to_i2c_client(dev);<br /> struct lm87_data *data = i2c_get_clientdata(client);<br /> long val = simple_strtol(buf, NULL, 10);<br />+<br />+ down(&amp;data-&gt;update_lock);<br /> data-&gt;fan_min[nr] = FAN_TO_REG(val,<br /> FAN_DIV_FROM_REG(data-&gt;fan_div[nr]));<br /> lm87_write_value(client, LM87_REG_FAN_MIN(nr), data-&gt;fan_min[nr]);<br />+ up(&amp;data-&gt;update_lock);<br /> }<br /> <br /> /* Note: we save and restore the fan minimum here, because its value is<br />&#64;&#64; -413,16 +428,21 &#64;&#64;<br /> struct i2c_client *client = to_i2c_client(dev);<br /> struct lm87_data *data = i2c_get_clientdata(client);<br /> long val = simple_strtol(buf, NULL, 10);<br />- unsigned long min = FAN_FROM_REG(data-&gt;fan_min[nr],<br />- FAN_DIV_FROM_REG(data-&gt;fan_div[nr]));<br />+ unsigned long min;<br /> u8 reg;<br /> <br />+ down(&amp;data-&gt;update_lock);<br />+ min = FAN_FROM_REG(data-&gt;fan_min[nr],<br />+ FAN_DIV_FROM_REG(data-&gt;fan_div[nr]));<br />+<br /> switch (val) {<br /> case 1: data-&gt;fan_div[nr] = 0; break;<br /> case 2: data-&gt;fan_div[nr] = 1; break;<br /> case 4: data-&gt;fan_div[nr] = 2; break;<br /> case 8: data-&gt;fan_div[nr] = 3; break;<br />- default: return -EINVAL;<br />+ default:<br />+ up(&amp;data-&gt;update_lock);<br />+ return -EINVAL;<br /> }<br /> <br /> reg = lm87_read_value(client, LM87_REG_VID_FAN_DIV);<br />&#64;&#64; -439,6 +459,8 &#64;&#64;<br /> data-&gt;fan_min[nr] = FAN_TO_REG(min, val);<br /> lm87_write_value(client, LM87_REG_FAN_MIN(nr),<br /> data-&gt;fan_min[nr]);<br />+ up(&amp;data-&gt;update_lock);<br />+<br /> return count;<br /> }<br /> <br />&#64;&#64; -499,8 +521,11 &#64;&#64;<br /> struct i2c_client *client = to_i2c_client(dev);<br /> struct lm87_data *data = i2c_get_clientdata(client);<br /> long val = simple_strtol(buf, NULL, 10);<br />+<br />+ down(&amp;data-&gt;update_lock);<br /> data-&gt;aout = AOUT_TO_REG(val);<br /> lm87_write_value(client, LM87_REG_AOUT, data-&gt;aout);<br />+ up(&amp;data-&gt;update_lock);<br /> return count;<br /> }<br /> static DEVICE_ATTR(aout_output, S_IRUGO | S_IWUSR, show_aout, set_aout);<br />diff -Nru a/drivers/i2c/chips/lm90.c b/drivers/i2c/chips/lm90.c<br />--- a/drivers/i2c/chips/lm90.c 2005-04-01 11:52:47 -08:00<br />+++ b/drivers/i2c/chips/lm90.c 2005-04-01 11:52:47 -08:00<br />&#64;&#64; -239,11 +239,14 &#64;&#64;<br /> struct i2c_client *client = to_i2c_client(dev); \<br /> struct lm90_data *data = i2c_get_clientdata(client); \<br /> long val = simple_strtol(buf, NULL, 10); \<br />+ \<br />+ down(&amp;data-&gt;update_lock); \<br /> if (data-&gt;kind == adt7461) \<br /> data-&gt;value = TEMP1_TO_REG_ADT7461(val); \<br /> else \<br /> data-&gt;value = TEMP1_TO_REG(val); \<br /> i2c_smbus_write_byte_data(client, reg, data-&gt;value); \<br />+ up(&amp;data-&gt;update_lock); \<br /> return count; \<br /> }<br /> #define set_temp2(value, regh, regl) \<br />&#64;&#64; -253,12 +256,15 &#64;&#64;<br /> struct i2c_client *client = to_i2c_client(dev); \<br /> struct lm90_data *data = i2c_get_clientdata(client); \<br /> long val = simple_strtol(buf, NULL, 10); \<br />+ \<br />+ down(&amp;data-&gt;update_lock); \<br /> if (data-&gt;kind == adt7461) \<br /> data-&gt;value = TEMP2_TO_REG_ADT7461(val); \<br /> else \<br /> data-&gt;value = TEMP2_TO_REG(val); \<br /> i2c_smbus_write_byte_data(client, regh, data-&gt;value &gt;&gt; 8); \<br /> i2c_smbus_write_byte_data(client, regl, data-&gt;value &amp; 0xff); \<br />+ up(&amp;data-&gt;update_lock); \<br /> return count; \<br /> }<br /> set_temp1(temp_low1, LM90_REG_W_LOCAL_LOW);<br />&#64;&#64; -283,10 +289,14 &#64;&#64;<br /> {<br /> struct i2c_client *client = to_i2c_client(dev);<br /> struct lm90_data *data = i2c_get_clientdata(client);<br />- int hyst = TEMP1_FROM_REG(data-&gt;temp_crit1) -<br />- simple_strtol(buf, NULL, 10);<br />+ long val = simple_strtol(buf, NULL, 10);<br />+ long hyst;<br />+<br />+ down(&amp;data-&gt;update_lock);<br />+ hyst = TEMP1_FROM_REG(data-&gt;temp_crit1) - val;<br /> i2c_smbus_write_byte_data(client, LM90_REG_W_TCRIT_HYST,<br /> HYST_TO_REG(hyst));<br />+ up(&amp;data-&gt;update_lock);<br /> return count;<br /> }<br /> <br />diff -Nru a/drivers/i2c/chips/lm92.c b/drivers/i2c/chips/lm92.c<br />--- a/drivers/i2c/chips/lm92.c 2005-04-01 11:52:47 -08:00<br />+++ b/drivers/i2c/chips/lm92.c 2005-04-01 11:52:47 -08:00<br />&#64;&#64; -157,8 +157,11 &#64;&#64;<br /> struct i2c_client *client = to_i2c_client(dev); \<br /> struct lm92_data *data = i2c_get_clientdata(client); \<br /> long val = simple_strtol(buf, NULL, 10); \<br />+ \<br />+ down(&amp;data-&gt;update_lock); \<br /> data-&gt;value = TEMP_TO_REG(val); \<br /> i2c_smbus_write_word_data(client, reg, swab16(data-&gt;value)); \<br />+ up(&amp;data-&gt;update_lock); \<br /> return count; \<br /> }<br /> set_temp(temp1_crit, LM92_REG_TEMP_CRIT);<br />&#64;&#64; -189,10 +192,13 &#64;&#64;<br /> {<br /> struct i2c_client *client = to_i2c_client(dev);<br /> struct lm92_data *data = i2c_get_clientdata(client);<br />- data-&gt;temp1_hyst = TEMP_FROM_REG(data-&gt;temp1_crit) -<br />- simple_strtol(buf, NULL, 10);<br />+ long val = simple_strtol(buf, NULL, 10);<br />+<br />+ down(&amp;data-&gt;update_lock);<br />+ data-&gt;temp1_hyst = TEMP_FROM_REG(data-&gt;temp1_crit) - val;<br /> i2c_smbus_write_word_data(client, LM92_REG_TEMP_HYST,<br /> swab16(TEMP_TO_REG(data-&gt;temp1_hyst)));<br />+ up(&amp;data-&gt;update_lock);<br /> return count;<br /> }<br /> <br />diff -Nru a/drivers/i2c/chips/max1619.c b/drivers/i2c/chips/max1619.c<br />--- a/drivers/i2c/chips/max1619.c 2005-04-01 11:52:47 -08:00<br />+++ b/drivers/i2c/chips/max1619.c 2005-04-01 11:52:47 -08:00<br />&#64;&#64; -141,8 +141,11 &#64;&#64;<br /> struct i2c_client *client = to_i2c_client(dev); \<br /> struct max1619_data *data = i2c_get_clientdata(client); \<br /> long val = simple_strtol(buf, NULL, 10); \<br />+ \<br />+ down(&amp;data-&gt;update_lock); \<br /> data-&gt;value = TEMP_TO_REG(val); \<br /> i2c_smbus_write_byte_data(client, reg, data-&gt;value); \<br />+ up(&amp;data-&gt;update_lock); \<br /> return count; \<br /> }<br /> <br />diff -Nru a/drivers/i2c/chips/pc87360.c b/drivers/i2c/chips/pc87360.c<br />--- a/drivers/i2c/chips/pc87360.c 2005-04-01 11:52:47 -08:00<br />+++ b/drivers/i2c/chips/pc87360.c 2005-04-01 11:52:47 -08:00<br />&#64;&#64; -259,6 +259,7 &#64;&#64;<br /> struct pc87360_data *data = i2c_get_clientdata(client);<br /> long fan_min = simple_strtol(buf, NULL, 10);<br /> <br />+ down(&amp;data-&gt;update_lock);<br /> fan_min = FAN_TO_REG(fan_min, FAN_DIV_FROM_REG(data-&gt;fan_status[nr]));<br /> <br /> /* If it wouldn't fit, change clock divisor */<br />&#64;&#64; -275,6 +276,7 &#64;&#64;<br /> /* Write new divider, preserve alarm bits */<br /> pc87360_write_value(data, LD_FAN, NO_BANK, PC87360_REG_FAN_STATUS(nr),<br /> data-&gt;fan_status[nr] &amp; 0xF9);<br />+ up(&amp;data-&gt;update_lock);<br /> <br /> return count;<br /> }<br />&#64;&#64; -336,10 +338,13 &#64;&#64;<br /> struct i2c_client *client = to_i2c_client(dev); \<br /> struct pc87360_data *data = i2c_get_clientdata(client); \<br /> long val = simple_strtol(buf, NULL, 10); \<br />+ \<br />+ down(&amp;data-&gt;update_lock); \<br /> data-&gt;pwm[offset-1] = PWM_TO_REG(val, \<br /> FAN_CONFIG_INVERT(data-&gt;fan_conf, offset-1)); \<br /> pc87360_write_value(data, LD_FAN, NO_BANK, PC87360_REG_PWM(offset-1), \<br /> data-&gt;pwm[offset-1]); \<br />+ up(&amp;data-&gt;update_lock); \<br /> return count; \<br /> } \<br /> static DEVICE_ATTR(pwm##offset, S_IWUSR | S_IRUGO, \<br />&#64;&#64; -378,9 +383,12 &#64;&#64;<br /> struct i2c_client *client = to_i2c_client(dev); \<br /> struct pc87360_data *data = i2c_get_clientdata(client); \<br /> long val = simple_strtol(buf, NULL, 10); \<br />+ \<br />+ down(&amp;data-&gt;update_lock); \<br /> data-&gt;in_min[offset] = IN_TO_REG(val, data-&gt;in_vref); \<br /> pc87360_write_value(data, LD_IN, offset, PC87365_REG_IN_MIN, \<br /> data-&gt;in_min[offset]); \<br />+ up(&amp;data-&gt;update_lock); \<br /> return count; \<br /> } \<br /> static ssize_t set_in##offset##_max(struct device *dev, const char *buf, \<br />&#64;&#64; -389,10 +397,13 &#64;&#64;<br /> struct i2c_client *client = to_i2c_client(dev); \<br /> struct pc87360_data *data = i2c_get_clientdata(client); \<br /> long val = simple_strtol(buf, NULL, 10); \<br />+ \<br />+ down(&amp;data-&gt;update_lock); \<br /> data-&gt;in_max[offset] = IN_TO_REG(val, \<br /> data-&gt;in_vref); \<br /> pc87360_write_value(data, LD_IN, offset, PC87365_REG_IN_MAX, \<br /> data-&gt;in_max[offset]); \<br />+ up(&amp;data-&gt;update_lock); \<br /> return count; \<br /> } \<br /> static DEVICE_ATTR(in##offset##_input, S_IRUGO, \<br />&#64;&#64; -451,9 +462,12 &#64;&#64;<br /> struct i2c_client *client = to_i2c_client(dev); \<br /> struct pc87360_data *data = i2c_get_clientdata(client); \<br /> long val = simple_strtol(buf, NULL, 10); \<br />+ \<br />+ down(&amp;data-&gt;update_lock); \<br /> data-&gt;in_min[offset+7] = IN_TO_REG(val, data-&gt;in_vref); \<br /> pc87360_write_value(data, LD_IN, offset+7, PC87365_REG_TEMP_MIN, \<br /> data-&gt;in_min[offset+7]); \<br />+ up(&amp;data-&gt;update_lock); \<br /> return count; \<br /> } \<br /> static ssize_t set_temp##offset##_max(struct device *dev, const char *buf, \<br />&#64;&#64; -462,9 +476,12 &#64;&#64;<br /> struct i2c_client *client = to_i2c_client(dev); \<br /> struct pc87360_data *data = i2c_get_clientdata(client); \<br /> long val = simple_strtol(buf, NULL, 10); \<br />+ \<br />+ down(&amp;data-&gt;update_lock); \<br /> data-&gt;in_max[offset+7] = IN_TO_REG(val, data-&gt;in_vref); \<br /> pc87360_write_value(data, LD_IN, offset+7, PC87365_REG_TEMP_MAX, \<br /> data-&gt;in_max[offset+7]); \<br />+ up(&amp;data-&gt;update_lock); \<br /> return count; \<br /> } \<br /> static ssize_t set_temp##offset##_crit(struct device *dev, const char *buf, \<br />&#64;&#64; -473,9 +490,12 &#64;&#64;<br /> struct i2c_client *client = to_i2c_client(dev); \<br /> struct pc87360_data *data = i2c_get_clientdata(client); \<br /> long val = simple_strtol(buf, NULL, 10); \<br />+ \<br />+ down(&amp;data-&gt;update_lock); \<br /> data-&gt;in_crit[offset-4] = IN_TO_REG(val, data-&gt;in_vref); \<br /> pc87360_write_value(data, LD_IN, offset+7, PC87365_REG_TEMP_CRIT, \<br /> data-&gt;in_crit[offset-4]); \<br />+ up(&amp;data-&gt;update_lock); \<br /> return count; \<br /> } \<br /> static DEVICE_ATTR(temp##offset##_input, S_IRUGO, \<br />&#64;&#64; -552,9 +572,12 &#64;&#64;<br /> struct i2c_client *client = to_i2c_client(dev); \<br /> struct pc87360_data *data = i2c_get_clientdata(client); \<br /> long val = simple_strtol(buf, NULL, 10); \<br />+ \<br />+ down(&amp;data-&gt;update_lock); \<br /> data-&gt;temp_min[offset-1] = TEMP_TO_REG(val); \<br /> pc87360_write_value(data, LD_TEMP, offset-1, PC87365_REG_TEMP_MIN, \<br /> data-&gt;temp_min[offset-1]); \<br />+ up(&amp;data-&gt;update_lock); \<br /> return count; \<br /> } \<br /> static ssize_t set_temp##offset##_max(struct device *dev, const char *buf, \<br />&#64;&#64; -563,9 +586,12 &#64;&#64;<br /> struct i2c_client *client = to_i2c_client(dev); \<br /> struct pc87360_data *data = i2c_get_clientdata(client); \<br /> long val = simple_strtol(buf, NULL, 10); \<br />+ \<br />+ down(&amp;data-&gt;update_lock); \<br /> data-&gt;temp_max[offset-1] = TEMP_TO_REG(val); \<br /> pc87360_write_value(data, LD_TEMP, offset-1, PC87365_REG_TEMP_MAX, \<br /> data-&gt;temp_max[offset-1]); \<br />+ up(&amp;data-&gt;update_lock); \<br /> return count; \<br /> } \<br /> static ssize_t set_temp##offset##_crit(struct device *dev, const char *buf, \<br />&#64;&#64; -574,9 +600,12 &#64;&#64;<br /> struct i2c_client *client = to_i2c_client(dev); \<br /> struct pc87360_data *data = i2c_get_clientdata(client); \<br /> long val = simple_strtol(buf, NULL, 10); \<br />+ \<br />+ down(&amp;data-&gt;update_lock); \<br /> data-&gt;temp_crit[offset-1] = TEMP_TO_REG(val); \<br /> pc87360_write_value(data, LD_TEMP, offset-1, PC87365_REG_TEMP_CRIT, \<br /> data-&gt;temp_crit[offset-1]); \<br />+ up(&amp;data-&gt;update_lock); \<br /> return count; \<br /> } \<br /> static DEVICE_ATTR(temp##offset##_input, S_IRUGO, \<br />diff -Nru a/drivers/i2c/chips/pcf8591.c b/drivers/i2c/chips/pcf8591.c<br />--- a/drivers/i2c/chips/pcf8591.c 2005-04-01 11:52:47 -08:00<br />+++ b/drivers/i2c/chips/pcf8591.c 2005-04-01 11:52:47 -08:00<br />&#64;&#64; -144,11 +144,15 &#64;&#64;<br /> {<br /> struct i2c_client *client = to_i2c_client(dev);<br /> struct pcf8591_data *data = i2c_get_clientdata(client);<br />- if (simple_strtoul(buf, NULL, 10))<br />+ unsigned long val = simple_strtoul(buf, NULL, 10);<br />+<br />+ down(&amp;data-&gt;update_lock);<br />+ if (val)<br /> data-&gt;control |= PCF8591_CONTROL_AOEF;<br /> else<br /> data-&gt;control &amp;= ~PCF8591_CONTROL_AOEF;<br /> i2c_smbus_write_byte(client, data-&gt;control);<br />+ up(&amp;data-&gt;update_lock);<br /> return count;<br /> }<br /> <br />diff -Nru a/drivers/i2c/chips/sis5595.c b/drivers/i2c/chips/sis5595.c<br />--- a/drivers/i2c/chips/sis5595.c 2005-04-01 11:52:47 -08:00<br />+++ b/drivers/i2c/chips/sis5595.c 2005-04-01 11:52:47 -08:00<br />&#64;&#64; -232,8 +232,11 &#64;&#64;<br /> struct i2c_client *client = to_i2c_client(dev);<br /> struct sis5595_data *data = i2c_get_clientdata(client);<br /> unsigned long val = simple_strtoul(buf, NULL, 10);<br />+<br />+ down(&amp;data-&gt;update_lock);<br /> data-&gt;in_min[nr] = IN_TO_REG(val);<br /> sis5595_write_value(client, SIS5595_REG_IN_MIN(nr), data-&gt;in_min[nr]);<br />+ up(&amp;data-&gt;update_lock);<br /> return count;<br /> }<br /> <br />&#64;&#64; -243,8 +246,11 &#64;&#64;<br /> struct i2c_client *client = to_i2c_client(dev);<br /> struct sis5595_data *data = i2c_get_clientdata(client);<br /> unsigned long val = simple_strtoul(buf, NULL, 10);<br />+<br />+ down(&amp;data-&gt;update_lock);<br /> data-&gt;in_max[nr] = IN_TO_REG(val);<br /> sis5595_write_value(client, SIS5595_REG_IN_MAX(nr), data-&gt;in_max[nr]);<br />+ up(&amp;data-&gt;update_lock);<br /> return count;<br /> }<br /> <br />&#64;&#64; -305,8 +311,11 &#64;&#64;<br /> struct i2c_client *client = to_i2c_client(dev);<br /> struct sis5595_data *data = i2c_get_clientdata(client);<br /> long val = simple_strtol(buf, NULL, 10);<br />+<br />+ down(&amp;data-&gt;update_lock);<br /> data-&gt;temp_over = TEMP_TO_REG(val);<br /> sis5595_write_value(client, SIS5595_REG_TEMP_OVER, data-&gt;temp_over);<br />+ up(&amp;data-&gt;update_lock);<br /> return count;<br /> }<br /> <br />&#64;&#64; -321,8 +330,11 &#64;&#64;<br /> struct i2c_client *client = to_i2c_client(dev);<br /> struct sis5595_data *data = i2c_get_clientdata(client);<br /> long val = simple_strtol(buf, NULL, 10);<br />+<br />+ down(&amp;data-&gt;update_lock);<br /> data-&gt;temp_hyst = TEMP_TO_REG(val);<br /> sis5595_write_value(client, SIS5595_REG_TEMP_HYST, data-&gt;temp_hyst);<br />+ up(&amp;data-&gt;update_lock);<br /> return count;<br /> }<br /> <br />&#64;&#64; -353,8 +365,11 &#64;&#64;<br /> struct i2c_client *client = to_i2c_client(dev);<br /> struct sis5595_data *data = i2c_get_clientdata(client);<br /> unsigned long val = simple_strtoul(buf, NULL, 10);<br />+<br />+ down(&amp;data-&gt;update_lock);<br /> data-&gt;fan_min[nr] = FAN_TO_REG(val, DIV_FROM_REG(data-&gt;fan_div[nr]));<br /> sis5595_write_value(client, SIS5595_REG_FAN_MIN(nr), data-&gt;fan_min[nr]);<br />+ up(&amp;data-&gt;update_lock);<br /> return count;<br /> }<br /> <br />&#64;&#64; -373,10 +388,15 &#64;&#64;<br /> {<br /> struct i2c_client *client = to_i2c_client(dev);<br /> struct sis5595_data *data = i2c_get_clientdata(client);<br />- unsigned long min = FAN_FROM_REG(data-&gt;fan_min[nr],<br />- DIV_FROM_REG(data-&gt;fan_div[nr]));<br />+ unsigned long min;<br /> unsigned long val = simple_strtoul(buf, NULL, 10);<br />- int reg = sis5595_read_value(client, SIS5595_REG_FANDIV);<br />+ int reg;<br />+<br />+ down(&amp;data-&gt;update_lock);<br />+ min = FAN_FROM_REG(data-&gt;fan_min[nr],<br />+ DIV_FROM_REG(data-&gt;fan_div[nr]));<br />+ reg = sis5595_read_value(client, SIS5595_REG_FANDIV);<br />+<br /> switch (val) {<br /> case 1: data-&gt;fan_div[nr] = 0; break;<br /> case 2: data-&gt;fan_div[nr] = 1; break;<br />&#64;&#64; -385,6 +405,7 &#64;&#64;<br /> default:<br /> dev_err(&amp;client-&gt;dev, "fan_div value %ld not "<br /> "supported. Choose one of 1, 2, 4 or 8!\n", val);<br />+ up(&amp;data-&gt;update_lock);<br /> return -EINVAL;<br /> }<br /> <br />&#64;&#64; -400,6 +421,7 &#64;&#64;<br /> data-&gt;fan_min[nr] =<br /> FAN_TO_REG(min, DIV_FROM_REG(data-&gt;fan_div[nr]));<br /> sis5595_write_value(client, SIS5595_REG_FAN_MIN(nr), data-&gt;fan_min[nr]);<br />+ up(&amp;data-&gt;update_lock);<br /> return count;<br /> }<br /> <br />diff -Nru a/drivers/i2c/chips/smsc47m1.c b/drivers/i2c/chips/smsc47m1.c<br />--- a/drivers/i2c/chips/smsc47m1.c 2005-04-01 11:52:47 -08:00<br />+++ b/drivers/i2c/chips/smsc47m1.c 2005-04-01 11:52:47 -08:00<br />&#64;&#64; -195,16 +195,20 &#64;&#64;<br /> {<br /> struct i2c_client *client = to_i2c_client(dev);<br /> struct smsc47m1_data *data = i2c_get_clientdata(client);<br />+ long rpmdiv, val = simple_strtol(buf, NULL, 10);<br /> <br />- long rpmdiv = simple_strtol(buf, NULL, 10)<br />- * DIV_FROM_REG(data-&gt;fan_div[nr]);<br />+ down(&amp;data-&gt;update_lock);<br />+ rpmdiv = val * DIV_FROM_REG(data-&gt;fan_div[nr]);<br /> <br />- if (983040 &gt; 192 * rpmdiv || 2 * rpmdiv &gt; 983040)<br />+ if (983040 &gt; 192 * rpmdiv || 2 * rpmdiv &gt; 983040) {<br />+ up(&amp;data-&gt;update_lock);<br /> return -EINVAL;<br />+ }<br /> <br /> data-&gt;fan_preload[nr] = 192 - ((983040 + rpmdiv / 2) / rpmdiv);<br /> smsc47m1_write_value(client, SMSC47M1_REG_FAN_PRELOAD(nr),<br /> data-&gt;fan_preload[nr]);<br />+ up(&amp;data-&gt;update_lock);<br /> <br /> return count;<br /> }<br />&#64;&#64; -224,12 +228,16 &#64;&#64;<br /> <br /> if (new_div == old_div) /* No change */<br /> return count;<br />+<br />+ down(&amp;data-&gt;update_lock);<br /> switch (new_div) {<br /> case 1: data-&gt;fan_div[nr] = 0; break;<br /> case 2: data-&gt;fan_div[nr] = 1; break;<br /> case 4: data-&gt;fan_div[nr] = 2; break;<br /> case 8: data-&gt;fan_div[nr] = 3; break;<br />- default: return -EINVAL;<br />+ default:<br />+ up(&amp;data-&gt;update_lock);<br />+ return -EINVAL;<br /> }<br /> <br /> tmp = smsc47m1_read_value(client, SMSC47M1_REG_FANDIV) &amp; 0x0F;<br />&#64;&#64; -242,6 +250,7 &#64;&#64;<br /> data-&gt;fan_preload[nr] = SENSORS_LIMIT(tmp, 0, 191);<br /> smsc47m1_write_value(client, SMSC47M1_REG_FAN_PRELOAD(nr),<br /> data-&gt;fan_preload[nr]);<br />+ up(&amp;data-&gt;update_lock);<br /> <br /> return count;<br /> }<br />&#64;&#64; -257,11 +266,13 &#64;&#64;<br /> if (val &lt; 0 || val &gt; 255)<br /> return -EINVAL;<br /> <br />+ down(&amp;data-&gt;update_lock);<br /> data-&gt;pwm[nr] &amp;= 0x81; /* Preserve additional bits */<br /> data-&gt;pwm[nr] |= PWM_TO_REG(val);<br />-<br /> smsc47m1_write_value(client, SMSC47M1_REG_PWM(nr),<br /> data-&gt;pwm[nr]);<br />+ up(&amp;data-&gt;update_lock);<br />+<br /> return count;<br /> }<br /> <br />&#64;&#64; -276,11 +287,12 &#64;&#64;<br /> if (val != 0 &amp;&amp; val != 1)<br /> return -EINVAL;<br /> <br />+ down(&amp;data-&gt;update_lock);<br /> data-&gt;pwm[nr] &amp;= 0xFE; /* preserve the other bits */<br /> data-&gt;pwm[nr] |= !val;<br />-<br /> smsc47m1_write_value(client, SMSC47M1_REG_PWM(nr),<br /> data-&gt;pwm[nr]);<br />+ up(&amp;data-&gt;update_lock);<br /> <br /> return count;<br /> }<br />diff -Nru a/drivers/i2c/chips/via686a.c b/drivers/i2c/chips/via686a.c<br />--- a/drivers/i2c/chips/via686a.c 2005-04-01 11:52:47 -08:00<br />+++ b/drivers/i2c/chips/via686a.c 2005-04-01 11:52:47 -08:00<br />&#64;&#64; -363,9 +363,12 &#64;&#64;<br /> struct i2c_client *client = to_i2c_client(dev);<br /> struct via686a_data *data = i2c_get_clientdata(client);<br /> unsigned long val = simple_strtoul(buf, NULL, 10);<br />+<br />+ down(&amp;data-&gt;update_lock);<br /> data-&gt;in_min[nr] = IN_TO_REG(val,nr);<br /> via686a_write_value(client, VIA686A_REG_IN_MIN(nr), <br /> data-&gt;in_min[nr]);<br />+ up(&amp;data-&gt;update_lock);<br /> return count;<br /> }<br /> static ssize_t set_in_max(struct device *dev, const char *buf, <br />&#64;&#64; -373,9 +376,12 &#64;&#64;<br /> struct i2c_client *client = to_i2c_client(dev);<br /> struct via686a_data *data = i2c_get_clientdata(client);<br /> unsigned long val = simple_strtoul(buf, NULL, 10);<br />+<br />+ down(&amp;data-&gt;update_lock);<br /> data-&gt;in_max[nr] = IN_TO_REG(val,nr);<br /> via686a_write_value(client, VIA686A_REG_IN_MAX(nr), <br /> data-&gt;in_max[nr]);<br />+ up(&amp;data-&gt;update_lock);<br /> return count;<br /> }<br /> #define show_in_offset(offset) \<br />&#64;&#64; -434,8 +440,11 &#64;&#64;<br /> struct i2c_client *client = to_i2c_client(dev);<br /> struct via686a_data *data = i2c_get_clientdata(client);<br /> int val = simple_strtol(buf, NULL, 10);<br />+<br />+ down(&amp;data-&gt;update_lock);<br /> data-&gt;temp_over[nr] = TEMP_TO_REG(val);<br /> via686a_write_value(client, VIA686A_REG_TEMP_OVER(nr), data-&gt;temp_over[nr]);<br />+ up(&amp;data-&gt;update_lock);<br /> return count;<br /> }<br /> static ssize_t set_temp_hyst(struct device *dev, const char *buf, <br />&#64;&#64; -443,8 +452,11 &#64;&#64;<br /> struct i2c_client *client = to_i2c_client(dev);<br /> struct via686a_data *data = i2c_get_clientdata(client);<br /> int val = simple_strtol(buf, NULL, 10);<br />+<br />+ down(&amp;data-&gt;update_lock);<br /> data-&gt;temp_hyst[nr] = TEMP_TO_REG(val);<br /> via686a_write_value(client, VIA686A_REG_TEMP_HYST(nr), data-&gt;temp_hyst[nr]);<br />+ up(&amp;data-&gt;update_lock);<br /> return count;<br /> }<br /> #define show_temp_offset(offset) \<br />&#64;&#64; -502,8 +514,11 &#64;&#64;<br /> struct i2c_client *client = to_i2c_client(dev);<br /> struct via686a_data *data = i2c_get_clientdata(client);<br /> int val = simple_strtol(buf, NULL, 10);<br />+<br />+ down(&amp;data-&gt;update_lock);<br /> data-&gt;fan_min[nr] = FAN_TO_REG(val, DIV_FROM_REG(data-&gt;fan_div[nr]));<br /> via686a_write_value(client, VIA686A_REG_FAN_MIN(nr+1), data-&gt;fan_min[nr]);<br />+ up(&amp;data-&gt;update_lock);<br /> return count;<br /> }<br /> static ssize_t set_fan_div(struct device *dev, const char *buf, <br />&#64;&#64; -511,10 +526,14 &#64;&#64;<br /> struct i2c_client *client = to_i2c_client(dev);<br /> struct via686a_data *data = i2c_get_clientdata(client);<br /> int val = simple_strtol(buf, NULL, 10);<br />- int old = via686a_read_value(client, VIA686A_REG_FANDIV);<br />+ int old;<br />+<br />+ down(&amp;data-&gt;update_lock);<br />+ old = via686a_read_value(client, VIA686A_REG_FANDIV);<br /> data-&gt;fan_div[nr] = DIV_TO_REG(val);<br /> old = (old &amp; 0x0f) | (data-&gt;fan_div[1] &lt;&lt; 6) | (data-&gt;fan_div[0] &lt;&lt; 4);<br /> via686a_write_value(client, VIA686A_REG_FANDIV, old);<br />+ up(&amp;data-&gt;update_lock);<br /> return count;<br /> }<br /> <br />diff -Nru a/drivers/i2c/chips/w83627hf.c b/drivers/i2c/chips/w83627hf.c<br />--- a/drivers/i2c/chips/w83627hf.c 2005-04-01 11:52:47 -08:00<br />+++ b/drivers/i2c/chips/w83627hf.c 2005-04-01 11:52:47 -08:00<br />&#64;&#64; -354,10 +354,13 &#64;&#64;<br /> u32 val; \<br /> \<br /> val = simple_strtoul(buf, NULL, 10); \<br />+ \<br />+ down(&amp;data-&gt;update_lock); \<br /> data-&gt;in_##reg[nr] = IN_TO_REG(val); \<br /> w83627hf_write_value(client, W83781D_REG_IN_##REG(nr), \<br /> data-&gt;in_##reg[nr]); \<br /> \<br />+ up(&amp;data-&gt;update_lock); \<br /> return count; \<br /> }<br /> store_in_reg(MIN, min)<br />&#64;&#64; -442,6 +445,9 &#64;&#64;<br /> u32 val;<br /> <br /> val = simple_strtoul(buf, NULL, 10);<br />+<br />+ down(&amp;data-&gt;update_lock);<br />+ <br /> if ((data-&gt;vrm_ovt &amp; 0x01) &amp;&amp;<br /> (w83627thf == data-&gt;type || w83637hf == data-&gt;type))<br /> <br />&#64;&#64; -452,6 +458,7 &#64;&#64;<br /> data-&gt;in_min[0] = IN_TO_REG(val);<br /> <br /> w83627hf_write_value(client, W83781D_REG_IN_MIN(0), data-&gt;in_min[0]);<br />+ up(&amp;data-&gt;update_lock);<br /> return count;<br /> }<br /> <br />&#64;&#64; -463,6 +470,9 &#64;&#64;<br /> u32 val;<br /> <br /> val = simple_strtoul(buf, NULL, 10);<br />+<br />+ down(&amp;data-&gt;update_lock);<br />+<br /> if ((data-&gt;vrm_ovt &amp; 0x01) &amp;&amp;<br /> (w83627thf == data-&gt;type || w83637hf == data-&gt;type))<br /> <br />&#64;&#64; -473,6 +483,7 &#64;&#64;<br /> data-&gt;in_max[0] = IN_TO_REG(val);<br /> <br /> w83627hf_write_value(client, W83781D_REG_IN_MAX(0), data-&gt;in_max[0]);<br />+ up(&amp;data-&gt;update_lock);<br /> return count;<br /> }<br /> <br />&#64;&#64; -508,11 +519,14 &#64;&#64;<br /> u32 val;<br /> <br /> val = simple_strtoul(buf, NULL, 10);<br />+<br />+ down(&amp;data-&gt;update_lock);<br /> data-&gt;fan_min[nr - 1] =<br /> FAN_TO_REG(val, DIV_FROM_REG(data-&gt;fan_div[nr - 1]));<br /> w83627hf_write_value(client, W83781D_REG_FAN_MIN(nr),<br /> data-&gt;fan_min[nr - 1]);<br /> <br />+ up(&amp;data-&gt;update_lock);<br /> return count;<br /> }<br /> <br />&#64;&#64; -574,6 +588,8 &#64;&#64;<br /> \<br /> val = simple_strtoul(buf, NULL, 10); \<br /> \<br />+ down(&amp;data-&gt;update_lock); \<br />+ \<br /> if (nr &gt;= 2) { /* TEMP2 and TEMP3 */ \<br /> data-&gt;temp_##reg##_add[nr-2] = LM75_TEMP_TO_REG(val); \<br /> w83627hf_write_value(client, W83781D_REG_TEMP_##REG(nr), \<br />&#64;&#64; -584,6 +600,7 &#64;&#64;<br /> data-&gt;temp_##reg); \<br /> } \<br /> \<br />+ up(&amp;data-&gt;update_lock); \<br /> return count; \<br /> }<br /> store_temp_reg(OVER, max);<br />&#64;&#64; -692,6 +709,8 &#64;&#64;<br /> <br /> val = simple_strtoul(buf, NULL, 10);<br /> <br />+ down(&amp;data-&gt;update_lock);<br />+<br /> if (update_mask == BEEP_MASK) { /* We are storing beep_mask */<br /> data-&gt;beep_mask = BEEP_MASK_TO_REG(val);<br /> w83627hf_write_value(client, W83781D_REG_BEEP_INTS1,<br />&#64;&#64; -708,6 +727,7 &#64;&#64;<br /> w83627hf_write_value(client, W83781D_REG_BEEP_INTS2,<br /> val2 | data-&gt;beep_enable &lt;&lt; 7);<br /> <br />+ up(&amp;data-&gt;update_lock);<br /> return count;<br /> }<br /> <br />&#64;&#64; -752,12 +772,15 &#64;&#64;<br /> struct w83627hf_data *data = i2c_get_clientdata(client);<br /> unsigned long min;<br /> u8 reg;<br />+ unsigned long val = simple_strtoul(buf, NULL, 10);<br />+<br />+ down(&amp;data-&gt;update_lock);<br /> <br /> /* Save fan_min */<br /> min = FAN_FROM_REG(data-&gt;fan_min[nr],<br /> DIV_FROM_REG(data-&gt;fan_div[nr]));<br /> <br />- data-&gt;fan_div[nr] = DIV_TO_REG(simple_strtoul(buf, NULL, 10));<br />+ data-&gt;fan_div[nr] = DIV_TO_REG(val);<br /> <br /> reg = (w83627hf_read_value(client, nr==2 ? W83781D_REG_PIN : W83781D_REG_VID_FANDIV)<br /> &amp; (nr==0 ? 0xcf : 0x3f))<br />&#64;&#64; -773,6 +796,7 &#64;&#64;<br /> data-&gt;fan_min[nr] = FAN_TO_REG(min, DIV_FROM_REG(data-&gt;fan_div[nr]));<br /> w83627hf_write_value(client, W83781D_REG_FAN_MIN(nr+1), data-&gt;fan_min[nr]);<br /> <br />+ up(&amp;data-&gt;update_lock);<br /> return count;<br /> }<br /> <br />&#64;&#64; -815,6 +839,8 &#64;&#64;<br /> <br /> val = simple_strtoul(buf, NULL, 10);<br /> <br />+ down(&amp;data-&gt;update_lock);<br />+<br /> if (data-&gt;type == w83627thf) {<br /> /* bits 0-3 are reserved in 627THF */<br /> data-&gt;pwm[nr - 1] = PWM_TO_REG(val) &amp; 0xf0;<br />&#64;&#64; -830,6 +856,7 &#64;&#64;<br /> data-&gt;pwm[nr - 1]);<br /> }<br /> <br />+ up(&amp;data-&gt;update_lock);<br /> return count;<br /> }<br /> <br />&#64;&#64; -871,6 +898,8 &#64;&#64;<br /> <br /> val = simple_strtoul(buf, NULL, 10);<br /> <br />+ down(&amp;data-&gt;update_lock);<br />+<br /> switch (val) {<br /> case 1: /* PII/Celeron diode */<br /> tmp = w83627hf_read_value(client, W83781D_REG_SCFG1);<br />&#64;&#64; -903,6 +932,7 &#64;&#64;<br /> break;<br /> }<br /> <br />+ up(&amp;data-&gt;update_lock);<br /> return count;<br /> }<br /> <br />diff -Nru a/drivers/i2c/chips/w83781d.c b/drivers/i2c/chips/w83781d.c<br />--- a/drivers/i2c/chips/w83781d.c 2005-04-01 11:52:47 -08:00<br />+++ b/drivers/i2c/chips/w83781d.c 2005-04-01 11:52:47 -08:00<br />&#64;&#64; -296,9 +296,12 &#64;&#64;<br /> u32 val; \<br /> \<br /> val = simple_strtoul(buf, NULL, 10) / 10; \<br />+ \<br />+ down(&amp;data-&gt;update_lock); \<br /> data-&gt;in_##reg[nr] = IN_TO_REG(val); \<br /> w83781d_write_value(client, W83781D_REG_IN_##REG(nr), data-&gt;in_##reg[nr]); \<br /> \<br />+ up(&amp;data-&gt;update_lock); \<br /> return count; \<br /> }<br /> store_in_reg(MIN, min);<br />&#64;&#64; -363,11 +366,14 &#64;&#64;<br /> u32 val;<br /> <br /> val = simple_strtoul(buf, NULL, 10);<br />+<br />+ down(&amp;data-&gt;update_lock);<br /> data-&gt;fan_min[nr - 1] =<br /> FAN_TO_REG(val, DIV_FROM_REG(data-&gt;fan_div[nr - 1]));<br /> w83781d_write_value(client, W83781D_REG_FAN_MIN(nr),<br /> data-&gt;fan_min[nr - 1]);<br /> <br />+ up(&amp;data-&gt;update_lock);<br /> return count;<br /> }<br /> <br />&#64;&#64; -426,6 +432,8 &#64;&#64;<br /> \<br /> val = simple_strtol(buf, NULL, 10); \<br /> \<br />+ down(&amp;data-&gt;update_lock); \<br />+ \<br /> if (nr &gt;= 2) { /* TEMP2 and TEMP3 */ \<br /> data-&gt;temp_##reg##_add[nr-2] = LM75_TEMP_TO_REG(val); \<br /> w83781d_write_value(client, W83781D_REG_TEMP_##REG(nr), \<br />&#64;&#64; -436,6 +444,7 &#64;&#64;<br /> data-&gt;temp_##reg); \<br /> } \<br /> \<br />+ up(&amp;data-&gt;update_lock); \<br /> return count; \<br /> }<br /> store_temp_reg(OVER, max);<br />&#64;&#64; -548,6 +557,8 &#64;&#64;<br /> <br /> val = simple_strtoul(buf, NULL, 10);<br /> <br />+ down(&amp;data-&gt;update_lock);<br />+<br /> if (update_mask == BEEP_MASK) { /* We are storing beep_mask */<br /> data-&gt;beep_mask = BEEP_MASK_TO_REG(val, data-&gt;type);<br /> w83781d_write_value(client, W83781D_REG_BEEP_INTS1,<br />&#64;&#64; -567,6 +578,7 &#64;&#64;<br /> w83781d_write_value(client, W83781D_REG_BEEP_INTS2,<br /> val2 | data-&gt;beep_enable &lt;&lt; 7);<br /> <br />+ up(&amp;data-&gt;update_lock);<br /> return count;<br /> }<br /> <br />&#64;&#64; -609,13 +621,15 &#64;&#64;<br /> struct w83781d_data *data = i2c_get_clientdata(client);<br /> unsigned long min;<br /> u8 reg;<br />+ unsigned long val = simple_strtoul(buf, NULL, 10);<br /> <br />+ down(&amp;data-&gt;update_lock);<br />+ <br /> /* Save fan_min */<br /> min = FAN_FROM_REG(data-&gt;fan_min[nr],<br /> DIV_FROM_REG(data-&gt;fan_div[nr]));<br /> <br />- data-&gt;fan_div[nr] = DIV_TO_REG(simple_strtoul(buf, NULL, 10),<br />- data-&gt;type);<br />+ data-&gt;fan_div[nr] = DIV_TO_REG(val, data-&gt;type);<br /> <br /> reg = (w83781d_read_value(client, nr==2 ? W83781D_REG_PIN : W83781D_REG_VID_FANDIV)<br /> &amp; (nr==0 ? 0xcf : 0x3f))<br />&#64;&#64; -634,6 +648,7 &#64;&#64;<br /> data-&gt;fan_min[nr] = FAN_TO_REG(min, DIV_FROM_REG(data-&gt;fan_div[nr]));<br /> w83781d_write_value(client, W83781D_REG_FAN_MIN(nr+1), data-&gt;fan_min[nr]);<br /> <br />+ up(&amp;data-&gt;update_lock);<br /> return count;<br /> }<br /> <br />&#64;&#64; -680,9 +695,10 &#64;&#64;<br /> <br /> val = simple_strtoul(buf, NULL, 10);<br /> <br />+ down(&amp;data-&gt;update_lock);<br /> data-&gt;pwm[nr - 1] = PWM_TO_REG(val);<br /> w83781d_write_value(client, W83781D_REG_PWM(nr), data-&gt;pwm[nr - 1]);<br />-<br />+ up(&amp;data-&gt;update_lock);<br /> return count;<br /> }<br /> <br />&#64;&#64; -695,6 +711,8 &#64;&#64;<br /> <br /> val = simple_strtoul(buf, NULL, 10);<br /> <br />+ down(&amp;data-&gt;update_lock);<br />+<br /> switch (val) {<br /> case 0:<br /> case 1:<br />&#64;&#64; -710,9 +728,11 &#64;&#64;<br /> break;<br /> <br /> default:<br />+ up(&amp;data-&gt;update_lock);<br /> return -EINVAL;<br /> }<br /> <br />+ up(&amp;data-&gt;update_lock);<br /> return count;<br /> }<br /> <br />&#64;&#64; -774,6 +794,8 &#64;&#64;<br /> <br /> val = simple_strtoul(buf, NULL, 10);<br /> <br />+ down(&amp;data-&gt;update_lock);<br />+<br /> switch (val) {<br /> case 1: /* PII/Celeron diode */<br /> tmp = w83781d_read_value(client, W83781D_REG_SCFG1);<br />&#64;&#64; -805,6 +827,7 &#64;&#64;<br /> break;<br /> }<br /> <br />+ up(&amp;data-&gt;update_lock);<br /> return count;<br /> }<br /> <br />-<br />To unsubscribe from this list: send the line "unsubscribe linux-kernel" in<br />the body of a message to majordomo&#64;vger.kernel.org<br />More majordomo info at <a href="http://vger.kernel.org/majordomo-info.html">http://vger.kernel.org/majordomo-info.html</a><br />Please read the FAQ at <a href="http://www.tux.org/lkml/">http://www.tux.org/lkml/</a><br /><br /></pre></td><td width="32" rowspan="2" class="c" valign="top"><img src="/images/icornerr.gif" width="32" height="32" alt="\" /></td></tr><tr><td align="right" valign="bottom"> 聽 </td></tr><tr><td align="right" valign="bottom">聽</td><td class="c" valign="bottom" style="padding-bottom: 0px"><img src="/images/bcornerl.gif" width="32" height="32" alt="\" /></td><td class="c">聽</td><td class="c" valign="bottom" style="padding-bottom: 0px"><img src="/images/bcornerr.gif" width="32" height="32" alt="/" /></td></tr><tr><td align="right" valign="top" colspan="2"> 聽 </td><td class="lm">Last update: 2005-04-06 13:31 聽聽 [from the cache]<br />漏2003-2020 <a href="http://blog.jasper.es/"><span itemprop="editor">Jasper Spaans</span></a>|hosted at <a href="https://www.digitalocean.com/?refcode=9a8e99d24cf9">Digital Ocean</a> and my Meterkast|<a href="http://blog.jasper.es/categories.html#lkml-ref">Read the blog</a></td><td>聽</td></tr></table><script language="javascript" src="/js/styleswitcher.js" type="text/javascript"></script></body></html>

Pages: 1 2 3 4 5 6 7 8 9 10