Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 257535
b: refs/heads/master
c: 0445bdf
h: refs/heads/master
i:
  257533: 25a259a
  257531: 657b8b8
  257527: ca2cf2d
  257519: 0382240
  257503: 6d3bdc6
  257471: 567dfc5
  257407: 218a5f8
  257279: 0a5d2c5
  257023: a14972c
v: v3
  • Loading branch information
Liam Girdwood authored and Mark Brown committed Jun 14, 2011
1 parent 1781a20 commit eb967fc
Show file tree
Hide file tree
Showing 2 changed files with 44 additions and 7 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 169d5a83f687c37104d51cbaa639bdffca8a1cd3
refs/heads/master: 0445bdf4ae2a1a3f4ac71ba6c298f3517b9ed238
49 changes: 43 additions & 6 deletions trunk/sound/soc/soc-dapm.c
Original file line number Diff line number Diff line change
Expand Up @@ -124,6 +124,43 @@ static inline struct snd_soc_dapm_widget *dapm_cnew_widget(
return kmemdup(_widget, sizeof(*_widget), GFP_KERNEL);
}

static int soc_widget_read(struct snd_soc_dapm_widget *w, int reg)
{
if (w->codec)
return snd_soc_read(w->codec, reg);
return 0;
}

static int soc_widget_write(struct snd_soc_dapm_widget *w, int reg, int val)
{
if (w->codec)
return snd_soc_write(w->codec, reg, val);
return 0;
}

static int soc_widget_update_bits(struct snd_soc_dapm_widget *w,
unsigned short reg, unsigned int mask, unsigned int value)
{
int change;
unsigned int old, new;
int ret;

ret = soc_widget_read(w, reg);
if (ret < 0)
return ret;

old = ret;
new = (old & ~mask) | (value & mask);
change = old != new;
if (change) {
ret = soc_widget_write(w, reg, new);
if (ret < 0)
return ret;
}

return change;
}

/**
* snd_soc_dapm_set_bias_level - set the bias level for the system
* @dapm: DAPM context
Expand Down Expand Up @@ -181,7 +218,7 @@ static void dapm_set_path_status(struct snd_soc_dapm_widget *w,
unsigned int mask = (1 << fls(max)) - 1;
unsigned int invert = mc->invert;

val = snd_soc_read(w->codec, reg);
val = soc_widget_read(w, reg);
val = (val >> shift) & mask;

if ((invert && !val) || (!invert && val))
Expand All @@ -197,7 +234,7 @@ static void dapm_set_path_status(struct snd_soc_dapm_widget *w,

for (bitmask = 1; bitmask < e->max; bitmask <<= 1)
;
val = snd_soc_read(w->codec, e->reg);
val = soc_widget_read(w, e->reg);
item = (val >> e->shift_l) & (bitmask - 1);

p->connect = 0;
Expand Down Expand Up @@ -227,7 +264,7 @@ static void dapm_set_path_status(struct snd_soc_dapm_widget *w,
w->kcontrol_news[i].private_value;
int val, item;

val = snd_soc_read(w->codec, e->reg);
val = soc_widget_read(w, e->reg);
val = (val >> e->shift_l) & e->mask;
for (item = 0; item < e->max; item++) {
if (val == e->values[item])
Expand Down Expand Up @@ -674,7 +711,7 @@ int dapm_reg_event(struct snd_soc_dapm_widget *w,
else
val = w->off_val;

snd_soc_update_bits(w->codec, -(w->reg + 1),
soc_widget_update_bits(w, -(w->reg + 1),
w->mask << w->shift, val << w->shift);

return 0;
Expand Down Expand Up @@ -885,7 +922,7 @@ static void dapm_seq_run_coalesced(struct snd_soc_dapm_context *dapm,
"pop test : Applying 0x%x/0x%x to %x in %dms\n",
value, mask, reg, card->pop_time);
pop_wait(card->pop_time);
snd_soc_update_bits(dapm->codec, reg, mask, value);
soc_widget_update_bits(w, reg, mask, value);
}

list_for_each_entry(w, pending, power_list) {
Expand Down Expand Up @@ -1964,7 +2001,7 @@ int snd_soc_dapm_new_widgets(struct snd_soc_dapm_context *dapm)

/* Read the initial power state from the device */
if (w->reg >= 0) {
val = snd_soc_read(w->codec, w->reg);
val = soc_widget_read(w, w->reg);
val &= 1 << w->shift;
if (w->invert)
val = !val;
Expand Down

0 comments on commit eb967fc

Please sign in to comment.