Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 367636e8 authored by Benjamin Herrenschmidt's avatar Benjamin Herrenschmidt Committed by Linus Torvalds
Browse files

[PATCH] powerpc: Fix sound driver use of i2c



The PowerMac sound drivers used to rely on a "bug" of the i2c-keywest
driver that implemented I2C_SMBUS_BLOCK_DATA incorrectly, that is it did
what I2C_SMBUS_I2C_BLOCK_DATA should have done. The new i2c-powermac
driver that replaces keywest has this bug fixed, thus the sound drivers
must be fixed too.

Signed-off-by: default avatarBenjamin Herrenschmidt <benh@kernel.crashing.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent fe691021
Loading
Loading
Loading
Loading
+8 −8
Original line number Diff line number Diff line
@@ -178,7 +178,7 @@ tas_write_register( struct tas_data_t *self,
	if (write_mode & WRITE_SHADOW)
		memcpy(self->shadow[reg_num],data,reg_width);
	if (write_mode & WRITE_HW) {
		rc=i2c_smbus_write_block_data(self->client,
		rc=i2c_smbus_write_i2c_block_data(self->client,
						  reg_num,
						  reg_width,
						  data);
@@ -199,7 +199,7 @@ tas_sync_register( struct tas_data_t *self,

	if (reg_width==0 || self==NULL)
		return -EINVAL;
	rc=i2c_smbus_write_block_data(self->client,
	rc=i2c_smbus_write_i2c_block_data(self->client,
					  reg_num,
					  reg_width,
					  self->shadow[reg_num]);
+2 −1
Original line number Diff line number Diff line
@@ -66,7 +66,7 @@ static int snd_pmac_dbdma_alloc(struct snd_pmac *chip, struct pmac_dbdma *rec, i

static void snd_pmac_dbdma_free(struct snd_pmac *chip, struct pmac_dbdma *rec)
{
	if (rec) {
	if (rec->space) {
		unsigned int rsize = sizeof(struct dbdma_cmd) * (rec->size + 1);

		dma_free_coherent(&chip->pdev->dev, rsize, rec->space, rec->dma_base);
@@ -881,6 +881,7 @@ static int __init snd_pmac_detect(struct snd_pmac *chip)
	chip->can_capture = 1;
	chip->num_freqs = ARRAY_SIZE(awacs_freqs);
	chip->freq_table = awacs_freqs;
	chip->pdev = NULL;

	chip->control_mask = MASK_IEPC | MASK_IEE | 0x11; /* default */

+10 −9
Original line number Diff line number Diff line
@@ -239,8 +239,8 @@ static int tumbler_set_master_volume(struct pmac_tumbler *mix)
	block[4] = (right_vol >> 8)  & 0xff;
	block[5] = (right_vol >> 0)  & 0xff;
  
	if (i2c_smbus_write_block_data(mix->i2c.client, TAS_REG_VOL,
				       6, block) < 0) {
	if (i2c_smbus_write_i2c_block_data(mix->i2c.client, TAS_REG_VOL, 6,
					   block) < 0) {
		snd_printk("failed to set volume \n");
		return -EINVAL;
	}
@@ -345,7 +345,7 @@ static int tumbler_set_drc(struct pmac_tumbler *mix)
		val[1] = 0;
	}

	if (i2c_smbus_write_block_data(mix->i2c.client, TAS_REG_DRC,
	if (i2c_smbus_write_i2c_block_data(mix->i2c.client, TAS_REG_DRC,
					   2, val) < 0) {
		snd_printk("failed to set DRC\n");
		return -EINVAL;
@@ -381,7 +381,7 @@ static int snapper_set_drc(struct pmac_tumbler *mix)
	val[4] = 0x60;
	val[5] = 0xa0;

	if (i2c_smbus_write_block_data(mix->i2c.client, TAS_REG_DRC,
	if (i2c_smbus_write_i2c_block_data(mix->i2c.client, TAS_REG_DRC,
					   6, val) < 0) {
		snd_printk("failed to set DRC\n");
		return -EINVAL;
@@ -492,7 +492,7 @@ static int tumbler_set_mono_volume(struct pmac_tumbler *mix,
	vol = info->table[vol];
	for (i = 0; i < info->bytes; i++)
		block[i] = (vol >> ((info->bytes - i - 1) * 8)) & 0xff;
	if (i2c_smbus_write_block_data(mix->i2c.client, info->reg,
	if (i2c_smbus_write_i2c_block_data(mix->i2c.client, info->reg,
					   info->bytes, block) < 0) {
		snd_printk("failed to set mono volume %d\n", info->index);
		return -EINVAL;
@@ -625,7 +625,8 @@ static int snapper_set_mix_vol1(struct pmac_tumbler *mix, int idx, int ch, int r
		for (j = 0; j < 3; j++)
			block[i * 3 + j] = (vol >> ((2 - j) * 8)) & 0xff;
	}
	if (i2c_smbus_write_block_data(mix->i2c.client, reg, 9, block) < 0) {
	if (i2c_smbus_write_i2c_block_data(mix->i2c.client, reg,
					   9, block) < 0) {
		snd_printk("failed to set mono volume %d\n", reg);
		return -EINVAL;
	}