Lines Matching refs:i2c
64 struct i2c_client *i2c; member
84 static int wm2000_write(struct i2c_client *i2c, unsigned int reg, in wm2000_write() argument
87 struct wm2000_priv *wm2000 = i2c_get_clientdata(i2c); in wm2000_write()
91 static unsigned int wm2000_read(struct i2c_client *i2c, unsigned int r) in wm2000_read() argument
93 struct wm2000_priv *wm2000 = i2c_get_clientdata(i2c); in wm2000_read()
106 struct i2c_client *i2c = wm2000->i2c; in wm2000_reset() local
108 wm2000_write(i2c, WM2000_REG_SYS_CTL2, WM2000_ANC_ENG_CLR); in wm2000_reset()
109 wm2000_write(i2c, WM2000_REG_SYS_CTL2, WM2000_RAM_CLR); in wm2000_reset()
110 wm2000_write(i2c, WM2000_REG_ID1, 0); in wm2000_reset()
115 static int wm2000_poll_bit(struct i2c_client *i2c, in wm2000_poll_bit() argument
121 val = wm2000_read(i2c, reg); in wm2000_poll_bit()
125 val = wm2000_read(i2c, reg); in wm2000_poll_bit()
134 static int wm2000_power_up(struct i2c_client *i2c, int analogue) in wm2000_power_up() argument
136 struct wm2000_priv *wm2000 = dev_get_drvdata(&i2c->dev); in wm2000_power_up()
143 dev_dbg(&i2c->dev, "Beginning power up\n"); in wm2000_power_up()
147 dev_err(&i2c->dev, "Failed to enable supplies: %d\n", ret); in wm2000_power_up()
153 dev_dbg(&i2c->dev, "Disabling MCLK divider\n"); in wm2000_power_up()
154 wm2000_write(i2c, WM2000_REG_SYS_CTL2, in wm2000_power_up()
157 dev_dbg(&i2c->dev, "Enabling MCLK divider\n"); in wm2000_power_up()
158 wm2000_write(i2c, WM2000_REG_SYS_CTL2, in wm2000_power_up()
162 wm2000_write(i2c, WM2000_REG_SYS_CTL2, WM2000_ANC_ENG_CLR); in wm2000_power_up()
163 wm2000_write(i2c, WM2000_REG_SYS_CTL2, WM2000_ANC_ENG_SET); in wm2000_power_up()
166 if (!wm2000_poll_bit(i2c, WM2000_REG_ANC_STAT, in wm2000_power_up()
168 dev_err(&i2c->dev, "ANC engine failed to reset\n"); in wm2000_power_up()
173 if (!wm2000_poll_bit(i2c, WM2000_REG_SYS_STATUS, in wm2000_power_up()
175 dev_err(&i2c->dev, "ANC engine failed to initialise\n"); in wm2000_power_up()
180 wm2000_write(i2c, WM2000_REG_SYS_CTL2, WM2000_RAM_SET); in wm2000_power_up()
184 dev_dbg(&i2c->dev, "Downloading %d bytes\n", in wm2000_power_up()
187 ret = i2c_master_send(i2c, wm2000->anc_download, in wm2000_power_up()
190 dev_err(&i2c->dev, "i2c_transfer() failed: %d\n", ret); in wm2000_power_up()
195 dev_err(&i2c->dev, "i2c_transfer() failed, %d != %d\n", in wm2000_power_up()
201 dev_dbg(&i2c->dev, "Download complete\n"); in wm2000_power_up()
204 wm2000_write(i2c, WM2000_REG_ANA_VMID_PU_TIME, 248 / 4); in wm2000_power_up()
206 wm2000_write(i2c, WM2000_REG_SYS_MODE_CNTRL, in wm2000_power_up()
211 wm2000_write(i2c, WM2000_REG_SYS_MODE_CNTRL, in wm2000_power_up()
216 ret = wm2000_read(i2c, WM2000_REG_SPEECH_CLARITY); in wm2000_power_up()
221 wm2000_write(i2c, WM2000_REG_SPEECH_CLARITY, ret); in wm2000_power_up()
223 wm2000_write(i2c, WM2000_REG_SYS_START0, 0x33); in wm2000_power_up()
224 wm2000_write(i2c, WM2000_REG_SYS_START1, 0x02); in wm2000_power_up()
226 wm2000_write(i2c, WM2000_REG_SYS_CTL2, WM2000_ANC_INT_N_CLR); in wm2000_power_up()
228 if (!wm2000_poll_bit(i2c, WM2000_REG_SYS_STATUS, in wm2000_power_up()
230 dev_err(&i2c->dev, "Timed out waiting for device\n"); in wm2000_power_up()
235 dev_dbg(&i2c->dev, "ANC active\n"); in wm2000_power_up()
237 dev_dbg(&i2c->dev, "Analogue active\n"); in wm2000_power_up()
243 static int wm2000_power_down(struct i2c_client *i2c, int analogue) in wm2000_power_down() argument
245 struct wm2000_priv *wm2000 = dev_get_drvdata(&i2c->dev); in wm2000_power_down()
248 wm2000_write(i2c, WM2000_REG_ANA_VMID_PD_TIME, 248 / 4); in wm2000_power_down()
249 wm2000_write(i2c, WM2000_REG_SYS_MODE_CNTRL, in wm2000_power_down()
253 wm2000_write(i2c, WM2000_REG_SYS_MODE_CNTRL, in wm2000_power_down()
257 if (!wm2000_poll_bit(i2c, WM2000_REG_SYS_STATUS, in wm2000_power_down()
259 dev_err(&i2c->dev, "Timeout waiting for ANC power down\n"); in wm2000_power_down()
263 if (!wm2000_poll_bit(i2c, WM2000_REG_ANC_STAT, in wm2000_power_down()
265 dev_err(&i2c->dev, "Timeout waiting for ANC engine idle\n"); in wm2000_power_down()
271 dev_dbg(&i2c->dev, "powered off\n"); in wm2000_power_down()
277 static int wm2000_enter_bypass(struct i2c_client *i2c, int analogue) in wm2000_enter_bypass() argument
279 struct wm2000_priv *wm2000 = dev_get_drvdata(&i2c->dev); in wm2000_enter_bypass()
285 wm2000_write(i2c, WM2000_REG_SYS_MODE_CNTRL, in wm2000_enter_bypass()
290 wm2000_write(i2c, WM2000_REG_SYS_MODE_CNTRL, in wm2000_enter_bypass()
295 if (!wm2000_poll_bit(i2c, WM2000_REG_SYS_STATUS, in wm2000_enter_bypass()
297 dev_err(&i2c->dev, "Timeout waiting for ANC disable\n"); in wm2000_enter_bypass()
301 if (!wm2000_poll_bit(i2c, WM2000_REG_ANC_STAT, in wm2000_enter_bypass()
303 dev_err(&i2c->dev, "Timeout waiting for ANC engine idle\n"); in wm2000_enter_bypass()
307 wm2000_write(i2c, WM2000_REG_SYS_CTL1, WM2000_SYS_STBY); in wm2000_enter_bypass()
308 wm2000_write(i2c, WM2000_REG_SYS_CTL2, WM2000_RAM_CLR); in wm2000_enter_bypass()
311 dev_dbg(&i2c->dev, "bypass enabled\n"); in wm2000_enter_bypass()
316 static int wm2000_exit_bypass(struct i2c_client *i2c, int analogue) in wm2000_exit_bypass() argument
318 struct wm2000_priv *wm2000 = dev_get_drvdata(&i2c->dev); in wm2000_exit_bypass()
323 wm2000_write(i2c, WM2000_REG_SYS_CTL1, 0); in wm2000_exit_bypass()
326 wm2000_write(i2c, WM2000_REG_SYS_MODE_CNTRL, in wm2000_exit_bypass()
331 wm2000_write(i2c, WM2000_REG_SYS_MODE_CNTRL, in wm2000_exit_bypass()
336 wm2000_write(i2c, WM2000_REG_SYS_CTL2, WM2000_RAM_SET); in wm2000_exit_bypass()
337 wm2000_write(i2c, WM2000_REG_SYS_CTL2, WM2000_ANC_INT_N_CLR); in wm2000_exit_bypass()
339 if (!wm2000_poll_bit(i2c, WM2000_REG_SYS_STATUS, in wm2000_exit_bypass()
341 dev_err(&i2c->dev, "Timed out waiting for MOUSE\n"); in wm2000_exit_bypass()
346 dev_dbg(&i2c->dev, "MOUSE active\n"); in wm2000_exit_bypass()
351 static int wm2000_enter_standby(struct i2c_client *i2c, int analogue) in wm2000_enter_standby() argument
353 struct wm2000_priv *wm2000 = dev_get_drvdata(&i2c->dev); in wm2000_enter_standby()
359 wm2000_write(i2c, WM2000_REG_ANA_VMID_PD_TIME, 248 / 4); in wm2000_enter_standby()
361 wm2000_write(i2c, WM2000_REG_SYS_MODE_CNTRL, in wm2000_enter_standby()
366 wm2000_write(i2c, WM2000_REG_SYS_MODE_CNTRL, in wm2000_enter_standby()
371 if (!wm2000_poll_bit(i2c, WM2000_REG_SYS_STATUS, in wm2000_enter_standby()
373 dev_err(&i2c->dev, in wm2000_enter_standby()
378 if (!wm2000_poll_bit(i2c, WM2000_REG_ANC_STAT, WM2000_ANC_ENG_IDLE)) { in wm2000_enter_standby()
379 dev_err(&i2c->dev, in wm2000_enter_standby()
384 wm2000_write(i2c, WM2000_REG_SYS_CTL1, WM2000_SYS_STBY); in wm2000_enter_standby()
385 wm2000_write(i2c, WM2000_REG_SYS_CTL2, WM2000_RAM_CLR); in wm2000_enter_standby()
388 dev_dbg(&i2c->dev, "standby\n"); in wm2000_enter_standby()
390 dev_dbg(&i2c->dev, "Analogue disabled\n"); in wm2000_enter_standby()
395 static int wm2000_exit_standby(struct i2c_client *i2c, int analogue) in wm2000_exit_standby() argument
397 struct wm2000_priv *wm2000 = dev_get_drvdata(&i2c->dev); in wm2000_exit_standby()
402 wm2000_write(i2c, WM2000_REG_SYS_CTL1, 0); in wm2000_exit_standby()
405 wm2000_write(i2c, WM2000_REG_ANA_VMID_PU_TIME, 248 / 4); in wm2000_exit_standby()
407 wm2000_write(i2c, WM2000_REG_SYS_MODE_CNTRL, in wm2000_exit_standby()
412 wm2000_write(i2c, WM2000_REG_SYS_MODE_CNTRL, in wm2000_exit_standby()
417 wm2000_write(i2c, WM2000_REG_SYS_CTL2, WM2000_RAM_SET); in wm2000_exit_standby()
418 wm2000_write(i2c, WM2000_REG_SYS_CTL2, WM2000_ANC_INT_N_CLR); in wm2000_exit_standby()
420 if (!wm2000_poll_bit(i2c, WM2000_REG_SYS_STATUS, in wm2000_exit_standby()
422 dev_err(&i2c->dev, "Timed out waiting for MOUSE\n"); in wm2000_exit_standby()
427 dev_dbg(&i2c->dev, "MOUSE active\n"); in wm2000_exit_standby()
429 dev_dbg(&i2c->dev, "Analogue enabled\n"); in wm2000_exit_standby()
434 typedef int (*wm2000_mode_fn)(struct i2c_client *i2c, int analogue);
546 struct i2c_client *i2c = wm2000->i2c; in wm2000_anc_transition() local
558 dev_err(&i2c->dev, "No transition for %d->%d\n", in wm2000_anc_transition()
567 dev_err(&i2c->dev, "Failed to enable MCLK: %d\n", ret); in wm2000_anc_transition()
575 ret = anc_transitions[i].step[j](i2c, in wm2000_anc_transition()
589 struct i2c_client *i2c = wm2000->i2c; in wm2000_anc_set_mode() local
600 dev_dbg(&i2c->dev, "Set mode %d (enabled %d, mute %d, active %d)\n", in wm2000_anc_set_mode()
816 static int wm2000_i2c_probe(struct i2c_client *i2c, in wm2000_i2c_probe() argument
827 wm2000 = devm_kzalloc(&i2c->dev, sizeof(struct wm2000_priv), in wm2000_i2c_probe()
834 dev_set_drvdata(&i2c->dev, wm2000); in wm2000_i2c_probe()
836 wm2000->regmap = devm_regmap_init_i2c(i2c, &wm2000_regmap); in wm2000_i2c_probe()
839 dev_err(&i2c->dev, "Failed to allocate register map: %d\n", in wm2000_i2c_probe()
847 ret = devm_regulator_bulk_get(&i2c->dev, WM2000_NUM_SUPPLIES, in wm2000_i2c_probe()
850 dev_err(&i2c->dev, "Failed to get supplies: %d\n", ret); in wm2000_i2c_probe()
856 dev_err(&i2c->dev, "Failed to enable supplies: %d\n", ret); in wm2000_i2c_probe()
861 reg = wm2000_read(i2c, WM2000_REG_ID1); in wm2000_i2c_probe()
863 reg = wm2000_read(i2c, WM2000_REG_ID2); in wm2000_i2c_probe()
867 dev_err(&i2c->dev, "Device is not a WM2000 - ID %x\n", id); in wm2000_i2c_probe()
872 reg = wm2000_read(i2c, WM2000_REG_REVISON); in wm2000_i2c_probe()
873 dev_info(&i2c->dev, "revision %c\n", reg + 'A'); in wm2000_i2c_probe()
875 wm2000->mclk = devm_clk_get(&i2c->dev, "MCLK"); in wm2000_i2c_probe()
878 dev_err(&i2c->dev, "Failed to get MCLK: %d\n", ret); in wm2000_i2c_probe()
883 pdata = dev_get_platdata(&i2c->dev); in wm2000_i2c_probe()
891 ret = request_firmware(&fw, filename, &i2c->dev); in wm2000_i2c_probe()
893 dev_err(&i2c->dev, "Failed to acquire ANC data: %d\n", ret); in wm2000_i2c_probe()
899 wm2000->anc_download = devm_kzalloc(&i2c->dev, in wm2000_i2c_probe()
903 dev_err(&i2c->dev, "Out of memory\n"); in wm2000_i2c_probe()
915 wm2000->i2c = i2c; in wm2000_i2c_probe()
919 ret = snd_soc_register_codec(&i2c->dev, &soc_codec_dev_wm2000, NULL, 0); in wm2000_i2c_probe()
929 static int wm2000_i2c_remove(struct i2c_client *i2c) in wm2000_i2c_remove() argument
931 snd_soc_unregister_codec(&i2c->dev); in wm2000_i2c_remove()
940 MODULE_DEVICE_TABLE(i2c, wm2000_i2c_id);