> -----Original Message----- > > +static int rt5645_spk_put_volsw(struct snd_kcontrol *kcontrol, > > + struct snd_ctl_elem_value *ucontrol) > > +{ > > + struct snd_soc_component *component = snd_kcontrol_chip(kcontrol); > > + struct rt5645_priv *rt5645 = snd_soc_component_get_drvdata(component); > > + int ret; > > + > > + cancel_delayed_work_sync(&rt5645->rcclock_work); > > + > > + regmap_update_bits(rt5645->regmap, RT5645_MICBIAS, > > + RT5645_PWR_CLK25M_MASK, RT5645_PWR_CLK25M_PU); > > + > > + ret = snd_soc_put_volsw(kcontrol, ucontrol); > > + > > + queue_delayed_work(system_power_efficient_wq, &rt5645->rcclock_work, > > + msecs_to_jiffies(200)); > > A more idiomatic way of doing this is to just have the > queue_delayed_work() - there's no need to cancel a work item before > requeuing it, the workqueue code will do the right thing. Can you > please submit a followup patch cleaning that up? > Thank you for the kind advice. The "cancel_delayed_work_sync" is essential in case of the operation of kcontrol continuously. We want to make sure the RC clock can be powered up at least 200ms after the speaker volume is adjusted, so we add the "cancel_delayed_work_sync" on the top of the function and requeue it, thanks. _______________________________________________ Alsa-devel mailing list Alsa-devel@xxxxxxxxxxxxxxxx http://mailman.alsa-project.org/mailman/listinfo/alsa-devel