Commit dbda961b authored by Linus Torvalds's avatar Linus Torvalds

Merge bk://kernel.bkbits.net/gregkh/linux/i2c-2.6

into ppc970.osdl.org:/home/torvalds/v2.6/linux
parents 717abc98 95e475c9
...@@ -3,7 +3,7 @@ possible to access all devices on an adapter from userspace, through ...@@ -3,7 +3,7 @@ possible to access all devices on an adapter from userspace, through
the /dev interface. You need to load module i2c-dev for this. the /dev interface. You need to load module i2c-dev for this.
Each registered i2c adapter gets a number, counting from 0. You can 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 I2C device files are character device files with major device number 89
and a minor device number corresponding to the number assigned as and a minor device number corresponding to the number assigned as
explained above. They should be called "i2c-%d" (i2c-0, i2c-1, ..., explained above. They should be called "i2c-%d" (i2c-0, i2c-1, ...,
...@@ -19,7 +19,7 @@ Yes, I know, you should never include kernel header files, but until glibc ...@@ -19,7 +19,7 @@ Yes, I know, you should never include kernel header files, but until glibc
knows about i2c, there is not much choice. knows about i2c, there is not much choice.
Now, you have to decide which adapter you want to access. You should 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 somewhat dynamically, so you can not even assume /dev/i2c-0 is the
first adapter. first adapter.
......
...@@ -66,8 +66,11 @@ static unsigned short normal_addr[] = { 0x51, I2C_CLIENT_END }; ...@@ -66,8 +66,11 @@ static unsigned short normal_addr[] = { 0x51, I2C_CLIENT_END };
static struct i2c_client_address_data addr_data = { static struct i2c_client_address_data addr_data = {
.normal_i2c = normal_addr, .normal_i2c = normal_addr,
.normal_i2c_range = ignore,
.probe = ignore, .probe = ignore,
.probe_range = ignore,
.ignore = ignore, .ignore = ignore,
.ignore_range = ignore,
.force = ignore, .force = ignore,
}; };
......
...@@ -760,7 +760,7 @@ int i2c_probe(struct i2c_adapter *adapter, ...@@ -760,7 +760,7 @@ int i2c_probe(struct i2c_adapter *adapter,
if (addr == address_data->normal_i2c[i]) { if (addr == address_data->normal_i2c[i]) {
found = 1; found = 1;
dev_dbg(&adapter->dev, "found normal i2c entry for adapter %d, " dev_dbg(&adapter->dev, "found normal i2c entry for adapter %d, "
"addr %02x", adap_id,addr); "addr %02x\n", adap_id, addr);
} }
} }
...@@ -1021,6 +1021,22 @@ s32 i2c_smbus_write_word_data(struct i2c_client *client, u8 command, u16 value) ...@@ -1021,6 +1021,22 @@ s32 i2c_smbus_write_word_data(struct i2c_client *client, u8 command, u16 value)
I2C_SMBUS_WORD_DATA,&data); 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 */ /* Returns the number of read bytes */
s32 i2c_smbus_block_process_call(struct i2c_client *client, u8 command, u8 length, u8 *values) s32 i2c_smbus_block_process_call(struct i2c_client *client, u8 command, u8 length, u8 *values)
{ {
...@@ -1279,6 +1295,7 @@ EXPORT_SYMBOL(i2c_smbus_read_byte_data); ...@@ -1279,6 +1295,7 @@ EXPORT_SYMBOL(i2c_smbus_read_byte_data);
EXPORT_SYMBOL(i2c_smbus_write_byte_data); EXPORT_SYMBOL(i2c_smbus_write_byte_data);
EXPORT_SYMBOL(i2c_smbus_read_word_data); EXPORT_SYMBOL(i2c_smbus_read_word_data);
EXPORT_SYMBOL(i2c_smbus_write_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_smbus_read_i2c_block_data);
EXPORT_SYMBOL(i2c_get_functionality); EXPORT_SYMBOL(i2c_get_functionality);
......
...@@ -539,7 +539,7 @@ static int __init i2c_dev_init(void) ...@@ -539,7 +539,7 @@ static int __init i2c_dev_init(void)
out_unreg_chrdev: out_unreg_chrdev:
unregister_chrdev(I2C_MAJOR, "i2c"); unregister_chrdev(I2C_MAJOR, "i2c");
out: out:
printk(KERN_ERR "%s: Driver Initialisation failed", __FILE__); printk(KERN_ERR "%s: Driver Initialisation failed\n", __FILE__);
return res; return res;
} }
......
...@@ -115,7 +115,7 @@ int i2c_detect(struct i2c_adapter *adapter, ...@@ -115,7 +115,7 @@ int i2c_detect(struct i2c_adapter *adapter,
for (i = 0; !found && (normal_i2c[i] != I2C_CLIENT_END); i += 1) { for (i = 0; !found && (normal_i2c[i] != I2C_CLIENT_END); i += 1) {
if (addr == normal_i2c[i]) { if (addr == normal_i2c[i]) {
found = 1; 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);
} }
} }
} }
......
...@@ -88,20 +88,12 @@ extern s32 i2c_smbus_write_byte_data(struct i2c_client * client, ...@@ -88,20 +88,12 @@ extern s32 i2c_smbus_write_byte_data(struct i2c_client * client,
extern s32 i2c_smbus_read_word_data(struct i2c_client * client, u8 command); extern s32 i2c_smbus_read_word_data(struct i2c_client * client, u8 command);
extern s32 i2c_smbus_write_word_data(struct i2c_client * client, extern s32 i2c_smbus_write_word_data(struct i2c_client * client,
u8 command, u16 value); u8 command, u16 value);
extern s32 i2c_smbus_process_call(struct i2c_client * client, /* Returns the number of bytes transferred */
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);
extern s32 i2c_smbus_write_block_data(struct i2c_client * client, extern s32 i2c_smbus_write_block_data(struct i2c_client * client,
u8 command, u8 length, u8 command, u8 length,
u8 *values); u8 *values);
extern s32 i2c_smbus_read_i2c_block_data(struct i2c_client * client, extern s32 i2c_smbus_read_i2c_block_data(struct i2c_client * client,
u8 command, u8 *values); u8 command, u8 *values);
extern s32 i2c_smbus_write_i2c_block_data(struct i2c_client * client,
u8 command, u8 length,
u8 *values);
/* /*
* A driver is capable of handling one or more physical devices present on * A driver is capable of handling one or more physical devices present on
......
...@@ -56,10 +56,11 @@ static int daca_init_client(pmac_keywest_t *i2c) ...@@ -56,10 +56,11 @@ static int daca_init_client(pmac_keywest_t *i2c)
unsigned short wdata = 0x00; unsigned short wdata = 0x00;
/* SR: no swap, 1bit delay, 32-48kHz */ /* SR: no swap, 1bit delay, 32-48kHz */
/* GCFG: power amp inverted, DAC on */ /* GCFG: power amp inverted, DAC on */
if (snd_pmac_keywest_write_byte(i2c, DACA_REG_SR, 0x08) < 0 || if (i2c_smbus_write_byte_data(i2c->client, DACA_REG_SR, 0x08) < 0 ||
snd_pmac_keywest_write_byte(i2c, DACA_REG_GCFG, 0x05) < 0) i2c_smbus_write_byte_data(i2c->client, DACA_REG_GCFG, 0x05) < 0)
return -EINVAL; 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 @@ static int daca_set_volume(pmac_daca_t *mix) ...@@ -81,9 +82,10 @@ static int daca_set_volume(pmac_daca_t *mix)
else else
data[1] = mix->right_vol; data[1] = mix->right_vol;
data[1] |= mix->deemphasis ? 0x40 : 0; data[1] |= mix->deemphasis ? 0x40 : 0;
if (snd_pmac_keywest_write(&mix->i2c, DACA_REG_AVOL, 2, data) < 0) { if (i2c_smbus_write_block_data(mix->i2c.client, DACA_REG_AVOL,
snd_printk("failed to set volume \n"); 2, data) < 0) {
return -EINVAL; snd_printk("failed to set volume \n");
return -EINVAL;
} }
return 0; return 0;
} }
...@@ -188,8 +190,8 @@ static int daca_put_amp(snd_kcontrol_t *kcontrol, snd_ctl_elem_value_t *ucontrol ...@@ -188,8 +190,8 @@ static int daca_put_amp(snd_kcontrol_t *kcontrol, snd_ctl_elem_value_t *ucontrol
change = mix->amp_on != ucontrol->value.integer.value[0]; change = mix->amp_on != ucontrol->value.integer.value[0];
if (change) { if (change) {
mix->amp_on = ucontrol->value.integer.value[0]; mix->amp_on = ucontrol->value.integer.value[0];
snd_pmac_keywest_write_byte(&mix->i2c, DACA_REG_GCFG, i2c_smbus_write_byte_data(mix->i2c.client, DACA_REG_GCFG,
mix->amp_on ? 0x05 : 0x04); mix->amp_on ? 0x05 : 0x04);
} }
return change; return change;
} }
...@@ -220,9 +222,9 @@ static snd_kcontrol_new_t daca_mixers[] = { ...@@ -220,9 +222,9 @@ static snd_kcontrol_new_t daca_mixers[] = {
static void daca_resume(pmac_t *chip) static void daca_resume(pmac_t *chip)
{ {
pmac_daca_t *mix = chip->mixer_data; pmac_daca_t *mix = chip->mixer_data;
snd_pmac_keywest_write_byte(&mix->i2c, DACA_REG_SR, 0x08); i2c_smbus_write_byte_data(mix->i2c.client, DACA_REG_SR, 0x08);
snd_pmac_keywest_write_byte(&mix->i2c, DACA_REG_GCFG, i2c_smbus_write_byte_data(mix->i2c.client, DACA_REG_GCFG,
mix->amp_on ? 0x05 : 0x04); mix->amp_on ? 0x05 : 0x04);
daca_set_volume(mix); daca_set_volume(mix);
} }
#endif /* CONFIG_PMAC_PBOOK */ #endif /* CONFIG_PMAC_PBOOK */
......
...@@ -199,8 +199,6 @@ typedef struct snd_pmac_keywest { ...@@ -199,8 +199,6 @@ typedef struct snd_pmac_keywest {
int snd_pmac_keywest_init(pmac_keywest_t *i2c); int snd_pmac_keywest_init(pmac_keywest_t *i2c);
void snd_pmac_keywest_cleanup(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 */ /* misc */
int snd_pmac_boolean_stereo_info(snd_kcontrol_t *kcontrol, snd_ctl_elem_info_t *uinfo); int snd_pmac_boolean_stereo_info(snd_kcontrol_t *kcontrol, snd_ctl_elem_info_t *uinfo);
......
...@@ -109,7 +109,8 @@ static int send_init_client(pmac_keywest_t *i2c, unsigned int *regs) ...@@ -109,7 +109,8 @@ static int send_init_client(pmac_keywest_t *i2c, unsigned int *regs)
while (*regs > 0) { while (*regs > 0) {
int err, count = 10; int err, count = 10;
do { do {
err = snd_pmac_keywest_write_byte(i2c, regs[0], regs[1]); err = i2c_smbus_write_byte_data(i2c->client,
regs[0], regs[1]);
if (err >= 0) if (err >= 0)
break; break;
mdelay(10); mdelay(10);
...@@ -220,9 +221,10 @@ static int tumbler_set_master_volume(pmac_tumbler_t *mix) ...@@ -220,9 +221,10 @@ static int tumbler_set_master_volume(pmac_tumbler_t *mix)
block[4] = (right_vol >> 8) & 0xff; block[4] = (right_vol >> 8) & 0xff;
block[5] = (right_vol >> 0) & 0xff; block[5] = (right_vol >> 0) & 0xff;
if (snd_pmac_keywest_write(&mix->i2c, TAS_REG_VOL, 6, block) < 0) { if (i2c_smbus_write_block_data(mix->i2c.client, TAS_REG_VOL,
snd_printk("failed to set volume \n"); 6, block) < 0) {
return -EINVAL; snd_printk("failed to set volume \n");
return -EINVAL;
} }
return 0; return 0;
} }
...@@ -320,9 +322,10 @@ static int tumbler_set_drc(pmac_tumbler_t *mix) ...@@ -320,9 +322,10 @@ static int tumbler_set_drc(pmac_tumbler_t *mix)
val[1] = 0; val[1] = 0;
} }
if (snd_pmac_keywest_write(&mix->i2c, TAS_REG_DRC, 2, val) < 0) { if (i2c_smbus_write_block_data(mix->i2c.client, TAS_REG_DRC,
snd_printk("failed to set DRC\n"); 2, val) < 0) {
return -EINVAL; snd_printk("failed to set DRC\n");
return -EINVAL;
} }
return 0; return 0;
} }
...@@ -355,9 +358,10 @@ static int snapper_set_drc(pmac_tumbler_t *mix) ...@@ -355,9 +358,10 @@ static int snapper_set_drc(pmac_tumbler_t *mix)
val[4] = 0x60; val[4] = 0x60;
val[5] = 0xa0; val[5] = 0xa0;
if (snd_pmac_keywest_write(&mix->i2c, TAS_REG_DRC, 6, val) < 0) { if (i2c_smbus_write_block_data(mix->i2c.client, TAS_REG_DRC,
snd_printk("failed to set DRC\n"); 6, val) < 0) {
return -EINVAL; snd_printk("failed to set DRC\n");
return -EINVAL;
} }
return 0; return 0;
} }
...@@ -459,9 +463,10 @@ static int tumbler_set_mono_volume(pmac_tumbler_t *mix, struct tumbler_mono_vol ...@@ -459,9 +463,10 @@ static int tumbler_set_mono_volume(pmac_tumbler_t *mix, struct tumbler_mono_vol
vol = info->table[vol]; vol = info->table[vol];
for (i = 0; i < info->bytes; i++) for (i = 0; i < info->bytes; i++)
block[i] = (vol >> ((info->bytes - i - 1) * 8)) & 0xff; block[i] = (vol >> ((info->bytes - i - 1) * 8)) & 0xff;
if (snd_pmac_keywest_write(&mix->i2c, info->reg, info->bytes, block) < 0) { if (i2c_smbus_write_block_data(mix->i2c.client, info->reg,
snd_printk("failed to set mono volume %d\n", info->index); info->bytes, block) < 0) {
return -EINVAL; snd_printk("failed to set mono volume %d\n", info->index);
return -EINVAL;
} }
return 0; return 0;
} }
...@@ -588,9 +593,9 @@ static int snapper_set_mix_vol1(pmac_tumbler_t *mix, int idx, int ch, int reg) ...@@ -588,9 +593,9 @@ static int snapper_set_mix_vol1(pmac_tumbler_t *mix, int idx, int ch, int reg)
for (j = 0; j < 3; j++) for (j = 0; j < 3; j++)
block[i * 3 + j] = (vol >> ((2 - j) * 8)) & 0xff; block[i * 3 + j] = (vol >> ((2 - j) * 8)) & 0xff;
} }
if (snd_pmac_keywest_write(&mix->i2c, reg, 9, block) < 0) { if (i2c_smbus_write_block_data(mix->i2c.client, reg, 9, block) < 0) {
snd_printk("failed to set mono volume %d\n", reg); snd_printk("failed to set mono volume %d\n", reg);
return -EINVAL; return -EINVAL;
} }
return 0; return 0;
} }
...@@ -689,8 +694,8 @@ static int snapper_set_capture_source(pmac_tumbler_t *mix) ...@@ -689,8 +694,8 @@ static int snapper_set_capture_source(pmac_tumbler_t *mix)
{ {
if (! mix->i2c.client) if (! mix->i2c.client)
return -ENODEV; return -ENODEV;
return snd_pmac_keywest_write_byte(&mix->i2c, TAS_REG_ACS, return i2c_smbus_write_byte_data(mix->i2c.client, TAS_REG_ACS,
mix->capture_source ? 2 : 0); mix->capture_source ? 2 : 0);
} }
static int snapper_info_capture_source(snd_kcontrol_t *kcontrol, snd_ctl_elem_info_t *uinfo) static int snapper_info_capture_source(snd_kcontrol_t *kcontrol, snd_ctl_elem_info_t *uinfo)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment