I2C fixes for 2.6.10-rc1
PATCH 1/1 I2C fixes for 2.6.10-rc1
Hi,
Here are a few small i2c bugfixes for 2.6.10-rc1
Please pull from: bk://kernel.bkbits.net/gregkh/linux/i2c-2.6
Individual patches will follow, sent to the sensors and linux-kernel lists.
That's it, bug fixes only from me for now till 2.6.10 is out :)
thanks,
greg k-h
Documentation/i2c/dev-interface | 4 +-- drivers/i2c/chips/rtc8564.c | 3 ++ drivers/i2c/i2c-core.c | 19 +++++++++++++++++- drivers/i2c/i2c-dev.c | 2 - drivers/i2c/i2c-sensor-detect.c | 2 - include/linux/i2c.h | 16 +++------------ sound/ppc/daca.c | 24 ++++++++++++----------- sound/ppc/pmac.h | 2 - sound/ppc/tumbler.c | 41 ++++++++++++++++++++++------------------ 9 files changed, 65 insertions(+), 48 deletions(-)
-----
Gabriel Paubert:
o I2C: Recent I2C "dead code removal" breaks pmac sound
Greg Kroah-Hartman:
o I2C: fix up rtc8564 which should not have been changed in my previous cleanups
o I2C: fix up some out of date Documentation
Jean Delvare:
o I2C: Missing newlines in debug messages
PATCH 1/1 I2C fixes for 2.6.10-rc1
ChangeSet 1.2093, 2004/11/12 11:39:51-08:00, [email protected]
I2C: fix up some out of date Documentation
Documentation/i2c/dev-interface | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-)
Documentation/i2c/dev-interface +2 -2
@@ -3,7 +3,7 @@ the /dev interface. You need to load module i2c-dev for this. Each registered i2c adapter gets a number, counting from 0. You can -examine /proc/bus/i2c to see what number corresponds to which adapter. +examine /sys/class/i2c-dev/ to see what number corresponds to which adapter. I2C device files are character device files with major device number 89 and a minor device number corresponding to the number assigned as explained above. They should be called "i2c-%d" (i2c-0, i2c-1, ...,
@@ -19,7 +19,7 @@ knows about i2c, there is not much choice. Now, you have to decide which adapter you want to access. You should -inspect /proc/bus/i2c to decide this. Adapter numbers are assigned +inspect /sys/class/i2c-dev/ to decide this. Adapter numbers are assigned somewhat dynamically, so you can not even assume /dev/i2c-0 is the first adapter.
ChangeSet 1.2094, 2004/11/12 11:40:22-08:00, [email protected]
I2C: fix up rtc8564 which should not have been changed in my previous cleanups.
This fixes a reported oops.
drivers/i2c/chips/rtc8564.c | 3 +++ 1 files changed, 3 insertions(+)
drivers/i2c/chips/rtc8564.c +3 -0
@@ -66,8 +66,11 @@static struct i2c_client_address_data addr_data = { .normal_i2c = normal_addr, + .normal_i2c_range = ignore, .probe = ignore, + .probe_range = ignore, .ignore = ignore, + .ignore_range = ignore, .force = ignore, };
ChangeSet 1.2095, 2004/11/12 13:20:15-08:00, [email protected]
[PATCH] I2C: Missing newlines in debug messages
As discussed on IRC, this simple patch fixes broken debug messages missing their trailing newlines. I just applied something similar to CVS, and will prepare patches for 2.4 as well.
drivers/i2c/i2c-core.c | 2 +- drivers/i2c/i2c-dev.c | 2 +- drivers/i2c/i2c-sensor-detect.c | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-)
drivers/i2c/i2c-core.c +1 -1
@@ -760,7 +760,7 @@if (addr == address_data->normal_i2c[i]) { found =1 ;dev_dbg (&adapter->dev,"found normal i2c entry for adapter %d, " -"addr %02x" , adap_id,addr); +"addr %02x\n" , adap_id, addr); } }
drivers/i2c/i2c-dev.c +1 -1
@@ -539,7 +539,7 @@ out_unreg_chrdev:unregister_chrdev (I2C_MAJOR ,"i2c" ); out: -printk (KERN_ERR "%s: Driver Initialisation failed" , __FILE__); +printk (KERN_ERR "%s: Driver Initialisation failed\n" , __FILE__);return res; }
drivers/i2c/i2c-sensor-detect.c +1 -1
@@ -115,7 +115,7 @@for (i =0 ; !found && (normal_i2c[i] !=I2C_CLIENT_END ); i +=1 ) {if (addr == normal_i2c[i]) { found =1 ; -dev_dbg (&adapter->dev,"found normal i2c entry for adapter %d, addr %02x" , adapter_id, addr); +dev_dbg (&adapter->dev,"found normal i2c entry for adapter %d, addr %02x\n" , adapter_id, addr); } } }
ChangeSet 1.2096, 2004/11/12 13:21:22-08:00, [email protected]
[PATCH] I2C: Recent I2C "dead code removal" breaks pmac sound.
Quoted 5 lines
Put the function back, and change the
pmac.hfile to delete the #define, and replace thesnd_pmac_keywest_writefunction with a real call toi2c_smbus_write_block_dataso things like this don't happen again.Care to write a patch to do this?
It follows, along with an update of the include/linux/i2c.h to only declare functions that actually exist, but grepping the whole sound subtree shows that at least sound/oss/dmasound/tas_common.h defines a few inline functions that call i2c_smbus_write_{byte,block}_data.
[I2C part]
Ressuscitate i2c_smbus_write_block_data since it's actually used. Update include/linux/i2c.h to reflect the existing functions.
[Sound part]
Remove snd_pmac_keywest_write* wrapper macros and directly call the i2c_smbus_* functions instead.
===== include/linux/i2c.h 1.41 vs edited =====
drivers/i2c/i2c-core.c | 17 +++++++++++++++++ include/linux/i2c.h | 16 ++++------------ sound/ppc/daca.c | 24 +++++++++++++----------- sound/ppc/pmac.h | 2 -- sound/ppc/tumbler.c | 41 +++++++++++++++++++++++------------------ 5 files changed, 57 insertions(+), 43 deletions(-)
drivers/i2c/i2c-core.c +17 -0
@@ -1021,6 +1021,22 @@ I2C_SMBUS_WORD_DATA,&data); } +/* Returns the number of bytes transferred */ +s32 i2c_smbus_write_block_data (struct i2c_client *client,u8 command, +u8 length,u8 *values) +{ +union i2c_smbus_data data; +int i; +if (length >I2C_SMBUS_BLOCK_MAX ) + length =I2C_SMBUS_BLOCK_MAX ; +for (i =1 ; i <= length; i++) + data.block[i] = values[i-1 ]; + data.block[0 ] = length; +return i2c_smbus_xfer (client->adapter,client->addr,client->flags, +I2C_SMBUS_WRITE ,command, +I2C_SMBUS_BLOCK_DATA ,&data); +} +/* Returns the number of read bytes */ s32 i2c_smbus_block_process_call (struct i2c_client *client,u8 command,u8 length,u8 *values) {
@@ -1279,6 +1295,7 @@EXPORT_SYMBOL (i2c_smbus_write_byte_data);EXPORT_SYMBOL (i2c_smbus_read_word_data);EXPORT_SYMBOL (i2c_smbus_write_word_data); +EXPORT_SYMBOL (i2c_smbus_write_block_data);EXPORT_SYMBOL (i2c_smbus_read_i2c_block_data);EXPORT_SYMBOL (i2c_get_functionality);
include/linux/i2c.h +4 -12
@@ -88,20 +88,12 @@extern s32 i2c_smbus_read_word_data (struct i2c_client * client,u8 command);extern s32 i2c_smbus_write_word_data (struct i2c_client * client,u8 command,u16 value); -extern s32 i2c_smbus_process_call (struct i2c_client * client, -u8 command,u16 value); -/* Returns the number of read bytes */ -extern s32 i2c_smbus_read_block_data (struct i2c_client * client, -u8 command,u8 *values); +/* Returns the number of bytes transferred */ extern s32 i2c_smbus_write_block_data (struct i2c_client * client, -u8 command,u8 length, -u8 *values); +u8 command,u8 length, +u8 *values);extern s32 i2c_smbus_read_i2c_block_data (struct i2c_client * client, -u8 command,u8 *values); -extern s32 i2c_smbus_write_i2c_block_data (struct i2c_client * client, -u8 command,u8 length, -u8 *values); - +u8 command,u8 *values);/* * A driver is capable of handling one or more physical devices present on
sound/ppc/daca.c +13 -11
@@ -56,10 +56,11 @@unsigned short wdata =0x00 ;/* SR: no swap, 1bit delay, 32-48kHz */ /* GCFG: power amp inverted, DAC on */ -if (snd_pmac_keywest_write_byte (i2c,DACA_REG_SR ,0x08 ) <0 || -snd_pmac_keywest_write_byte (i2c,DACA_REG_GCFG ,0x05 ) <0 ) +if (i2c_smbus_write_byte_data (i2c->client,DACA_REG_SR ,0x08 ) <0 || +i2c_smbus_write_byte_data (i2c->client,DACA_REG_GCFG ,0x05 ) <0 )return -EINVAL ; -return snd_pmac_keywest_write (i2c,DACA_REG_AVOL ,2 , (unsigned char *)&wdata); +return i2c_smbus_write_block_data (i2c->client,DACA_REG_AVOL , +2 , (unsigned char *)&wdata); }/*
@@ -81,9 +82,10 @@else data[1 ] = mix->right_vol; data[1 ] |= mix->deemphasis ?0x40 :0 ; -if (snd_pmac_keywest_write (&mix->i2c,DACA_REG_AVOL ,2 , data) <0 ) { -snd_printk ("failed to set volume \n" ); -return -EINVAL ; +if (i2c_smbus_write_block_data (mix->i2c.client,DACA_REG_AVOL , +2 , data) <0 ) { +snd_printk ("failed to set volume \n" ); +return -EINVAL ; }return 0 ; }
@@ -188,8 +190,8 @@ change = mix->amp_on != ucontrol->value.integer.value[0 ];if (change) { mix->amp_on = ucontrol->value.integer.value[0 ]; -snd_pmac_keywest_write_byte (&mix->i2c,DACA_REG_GCFG , - mix->amp_on ?0x05 :0x04 ); +i2c_smbus_write_byte_data (mix->i2c.client,DACA_REG_GCFG , + mix->amp_on ?0x05 :0x04 ); }return change; }
@@ -220,9 +222,9 @@static void daca_resume (pmac_t *chip) {pmac_daca_t *mix = chip->mixer_data; -snd_pmac_keywest_write_byte (&mix->i2c,DACA_REG_SR ,0x08 ); -snd_pmac_keywest_write_byte (&mix->i2c,DACA_REG_GCFG , - mix->amp_on ?0x05 :0x04 ); +i2c_smbus_write_byte_data (mix->i2c.client,DACA_REG_SR ,0x08 ); +i2c_smbus_write_byte_data (mix->i2c.client,DACA_REG_GCFG , + mix->amp_on ?0x05 :0x04 );daca_set_volume (mix); }#endif /* CONFIG_PMAC_PBOOK */
sound/ppc/pmac.h +0 -2
@@ -199,8 +199,6 @@int snd_pmac_keywest_init (pmac_keywest_t *i2c);void snd_pmac_keywest_cleanup (pmac_keywest_t *i2c); -#define snd_pmac_keywest_write (i2c,cmd,len,data) i2c_smbus_write_block_data((i2c)->client, cmd, len, data) -#define snd_pmac_keywest_write_byte (i2c,cmd,data) i2c_smbus_write_byte_data((i2c)->client, cmd, data)/* misc */ int snd_pmac_boolean_stereo_info (snd_kcontrol_t *kcontrol,snd_ctl_elem_info_t *uinfo);
sound/ppc/tumbler.c +23 -18
83 lines not on this page · raw message