Lines Matching full:i2c

31 #include <linux/i2c.h>
54 struct i2c_client *i2c; member
70 static int wm2000_write(struct i2c_client *i2c, unsigned int reg, in wm2000_write() argument
73 struct wm2000_priv *wm2000 = i2c_get_clientdata(i2c); in wm2000_write()
77 static unsigned int wm2000_read(struct i2c_client *i2c, unsigned int r) in wm2000_read() argument
79 struct wm2000_priv *wm2000 = i2c_get_clientdata(i2c); in wm2000_read()
92 struct i2c_client *i2c = wm2000->i2c; in wm2000_reset() local
94 wm2000_write(i2c, WM2000_REG_SYS_CTL2, WM2000_ANC_ENG_CLR); in wm2000_reset()
95 wm2000_write(i2c, WM2000_REG_SYS_CTL2, WM2000_RAM_CLR); in wm2000_reset()
96 wm2000_write(i2c, WM2000_REG_ID1, 0); in wm2000_reset()
101 static int wm2000_poll_bit(struct i2c_client *i2c, in wm2000_poll_bit() argument
106 val = wm2000_read(i2c, reg); in wm2000_poll_bit()
110 val = wm2000_read(i2c, reg); in wm2000_poll_bit()
119 static int wm2000_power_up(struct i2c_client *i2c, int analogue) in wm2000_power_up() argument
121 struct wm2000_priv *wm2000 = dev_get_drvdata(&i2c->dev); in wm2000_power_up()
126 dev_dbg(&i2c->dev, "Beginning power up\n"); in wm2000_power_up()
129 dev_dbg(&i2c->dev, "Disabling MCLK divider\n"); in wm2000_power_up()
130 wm2000_write(i2c, WM2000_REG_SYS_CTL2, in wm2000_power_up()
133 dev_dbg(&i2c->dev, "Enabling MCLK divider\n"); in wm2000_power_up()
134 wm2000_write(i2c, WM2000_REG_SYS_CTL2, in wm2000_power_up()
138 wm2000_write(i2c, WM2000_REG_SYS_CTL2, WM2000_ANC_ENG_CLR); in wm2000_power_up()
139 wm2000_write(i2c, WM2000_REG_SYS_CTL2, WM2000_ANC_ENG_SET); in wm2000_power_up()
142 if (!wm2000_poll_bit(i2c, WM2000_REG_ANC_STAT, in wm2000_power_up()
144 dev_err(&i2c->dev, "ANC engine failed to reset\n"); in wm2000_power_up()
148 if (!wm2000_poll_bit(i2c, WM2000_REG_SYS_STATUS, in wm2000_power_up()
150 dev_err(&i2c->dev, "ANC engine failed to initialise\n"); in wm2000_power_up()
154 wm2000_write(i2c, WM2000_REG_SYS_CTL2, WM2000_RAM_SET); in wm2000_power_up()
158 dev_dbg(&i2c->dev, "Downloading %d bytes\n", in wm2000_power_up()
161 ret = i2c_master_send(i2c, wm2000->anc_download, in wm2000_power_up()
164 dev_err(&i2c->dev, "i2c_transfer() failed: %d\n", ret); in wm2000_power_up()
168 dev_err(&i2c->dev, "i2c_transfer() failed, %d != %d\n", in wm2000_power_up()
173 dev_dbg(&i2c->dev, "Download complete\n"); in wm2000_power_up()
177 wm2000_write(i2c, WM2000_REG_ANA_VMID_PU_TIME, timeout / 4); in wm2000_power_up()
179 wm2000_write(i2c, WM2000_REG_SYS_MODE_CNTRL, in wm2000_power_up()
186 wm2000_write(i2c, WM2000_REG_SYS_MODE_CNTRL, in wm2000_power_up()
191 ret = wm2000_read(i2c, WM2000_REG_SPEECH_CLARITY); in wm2000_power_up()
196 wm2000_write(i2c, WM2000_REG_SPEECH_CLARITY, ret); in wm2000_power_up()
198 wm2000_write(i2c, WM2000_REG_SYS_START0, 0x33); in wm2000_power_up()
199 wm2000_write(i2c, WM2000_REG_SYS_START1, 0x02); in wm2000_power_up()
201 wm2000_write(i2c, WM2000_REG_SYS_CTL2, WM2000_ANC_INT_N_CLR); in wm2000_power_up()
203 if (!wm2000_poll_bit(i2c, WM2000_REG_SYS_STATUS, in wm2000_power_up()
205 dev_err(&i2c->dev, "Timed out waiting for device after %dms\n", in wm2000_power_up()
210 dev_dbg(&i2c->dev, "ANC active\n"); in wm2000_power_up()
212 dev_dbg(&i2c->dev, "Analogue active\n"); in wm2000_power_up()
218 static int wm2000_power_down(struct i2c_client *i2c, int analogue) in wm2000_power_down() argument
220 struct wm2000_priv *wm2000 = dev_get_drvdata(&i2c->dev); in wm2000_power_down()
225 wm2000_write(i2c, WM2000_REG_ANA_VMID_PD_TIME, timeout / 4); in wm2000_power_down()
226 wm2000_write(i2c, WM2000_REG_SYS_MODE_CNTRL, in wm2000_power_down()
231 wm2000_write(i2c, WM2000_REG_SYS_MODE_CNTRL, in wm2000_power_down()
235 if (!wm2000_poll_bit(i2c, WM2000_REG_SYS_STATUS, in wm2000_power_down()
237 dev_err(&i2c->dev, "Timeout waiting for ANC power down\n"); in wm2000_power_down()
241 if (!wm2000_poll_bit(i2c, WM2000_REG_ANC_STAT, in wm2000_power_down()
243 dev_err(&i2c->dev, "Timeout waiting for ANC engine idle\n"); in wm2000_power_down()
247 dev_dbg(&i2c->dev, "powered off\n"); in wm2000_power_down()
253 static int wm2000_enter_bypass(struct i2c_client *i2c, int analogue) in wm2000_enter_bypass() argument
255 struct wm2000_priv *wm2000 = dev_get_drvdata(&i2c->dev); in wm2000_enter_bypass()
260 wm2000_write(i2c, WM2000_REG_SYS_MODE_CNTRL, in wm2000_enter_bypass()
265 wm2000_write(i2c, WM2000_REG_SYS_MODE_CNTRL, in wm2000_enter_bypass()
270 if (!wm2000_poll_bit(i2c, WM2000_REG_SYS_STATUS, in wm2000_enter_bypass()
272 dev_err(&i2c->dev, "Timeout waiting for ANC disable\n"); in wm2000_enter_bypass()
276 if (!wm2000_poll_bit(i2c, WM2000_REG_ANC_STAT, in wm2000_enter_bypass()
278 dev_err(&i2c->dev, "Timeout waiting for ANC engine idle\n"); in wm2000_enter_bypass()
282 wm2000_write(i2c, WM2000_REG_SYS_CTL1, WM2000_SYS_STBY); in wm2000_enter_bypass()
283 wm2000_write(i2c, WM2000_REG_SYS_CTL2, WM2000_RAM_CLR); in wm2000_enter_bypass()
286 dev_dbg(&i2c->dev, "bypass enabled\n"); in wm2000_enter_bypass()
291 static int wm2000_exit_bypass(struct i2c_client *i2c, int analogue) in wm2000_exit_bypass() argument
293 struct wm2000_priv *wm2000 = dev_get_drvdata(&i2c->dev); in wm2000_exit_bypass()
297 wm2000_write(i2c, WM2000_REG_SYS_CTL1, 0); in wm2000_exit_bypass()
300 wm2000_write(i2c, WM2000_REG_SYS_MODE_CNTRL, in wm2000_exit_bypass()
305 wm2000_write(i2c, WM2000_REG_SYS_MODE_CNTRL, in wm2000_exit_bypass()
310 wm2000_write(i2c, WM2000_REG_SYS_CTL2, WM2000_RAM_SET); in wm2000_exit_bypass()
311 wm2000_write(i2c, WM2000_REG_SYS_CTL2, WM2000_ANC_INT_N_CLR); in wm2000_exit_bypass()
313 if (!wm2000_poll_bit(i2c, WM2000_REG_SYS_STATUS, in wm2000_exit_bypass()
315 dev_err(&i2c->dev, "Timed out waiting for MOUSE\n"); in wm2000_exit_bypass()
320 dev_dbg(&i2c->dev, "MOUSE active\n"); in wm2000_exit_bypass()
325 static int wm2000_enter_standby(struct i2c_client *i2c, int analogue) in wm2000_enter_standby() argument
327 struct wm2000_priv *wm2000 = dev_get_drvdata(&i2c->dev); in wm2000_enter_standby()
334 wm2000_write(i2c, WM2000_REG_ANA_VMID_PD_TIME, timeout / 4); in wm2000_enter_standby()
336 wm2000_write(i2c, WM2000_REG_SYS_MODE_CNTRL, in wm2000_enter_standby()
343 wm2000_write(i2c, WM2000_REG_SYS_MODE_CNTRL, in wm2000_enter_standby()
348 if (!wm2000_poll_bit(i2c, WM2000_REG_SYS_STATUS, in wm2000_enter_standby()
350 dev_err(&i2c->dev, in wm2000_enter_standby()
355 if (!wm2000_poll_bit(i2c, WM2000_REG_ANC_STAT, WM2000_ANC_ENG_IDLE, in wm2000_enter_standby()
357 dev_err(&i2c->dev, in wm2000_enter_standby()
363 wm2000_write(i2c, WM2000_REG_SYS_CTL1, WM2000_SYS_STBY); in wm2000_enter_standby()
364 wm2000_write(i2c, WM2000_REG_SYS_CTL2, WM2000_RAM_CLR); in wm2000_enter_standby()
367 dev_dbg(&i2c->dev, "standby\n"); in wm2000_enter_standby()
369 dev_dbg(&i2c->dev, "Analogue disabled\n"); in wm2000_enter_standby()
374 static int wm2000_exit_standby(struct i2c_client *i2c, int analogue) in wm2000_exit_standby() argument
376 struct wm2000_priv *wm2000 = dev_get_drvdata(&i2c->dev); in wm2000_exit_standby()
381 wm2000_write(i2c, WM2000_REG_SYS_CTL1, 0); in wm2000_exit_standby()
385 wm2000_write(i2c, WM2000_REG_ANA_VMID_PU_TIME, timeout / 4); in wm2000_exit_standby()
387 wm2000_write(i2c, WM2000_REG_SYS_MODE_CNTRL, in wm2000_exit_standby()
394 wm2000_write(i2c, WM2000_REG_SYS_MODE_CNTRL, in wm2000_exit_standby()
399 wm2000_write(i2c, WM2000_REG_SYS_CTL2, WM2000_RAM_SET); in wm2000_exit_standby()
400 wm2000_write(i2c, WM2000_REG_SYS_CTL2, WM2000_ANC_INT_N_CLR); in wm2000_exit_standby()
402 if (!wm2000_poll_bit(i2c, WM2000_REG_SYS_STATUS, in wm2000_exit_standby()
404 dev_err(&i2c->dev, "Timed out waiting for MOUSE after %dms\n", in wm2000_exit_standby()
410 dev_dbg(&i2c->dev, "MOUSE active\n"); in wm2000_exit_standby()
412 dev_dbg(&i2c->dev, "Analogue enabled\n"); in wm2000_exit_standby()
417 typedef int (*wm2000_mode_fn)(struct i2c_client *i2c, int analogue);
529 struct i2c_client *i2c = wm2000->i2c; in wm2000_anc_transition() local
541 dev_err(&i2c->dev, "No transition for %d->%d\n", in wm2000_anc_transition()
549 ret = anc_transitions[i].step[j](i2c, in wm2000_anc_transition()
560 struct i2c_client *i2c = wm2000->i2c; in wm2000_anc_set_mode() local
571 dev_dbg(&i2c->dev, "Set mode %d (enabled %d, mute %d, active %d)\n", in wm2000_anc_set_mode()
730 static int __devinit wm2000_i2c_probe(struct i2c_client *i2c, in wm2000_i2c_probe() argument
741 wm2000 = devm_kzalloc(&i2c->dev, sizeof(struct wm2000_priv), in wm2000_i2c_probe()
744 dev_err(&i2c->dev, "Unable to allocate private data\n"); in wm2000_i2c_probe()
748 dev_set_drvdata(&i2c->dev, wm2000); in wm2000_i2c_probe()
750 wm2000->regmap = regmap_init_i2c(i2c, &wm2000_regmap); in wm2000_i2c_probe()
753 dev_err(&i2c->dev, "Failed to allocate register map: %d\n", in wm2000_i2c_probe()
759 reg = wm2000_read(i2c, WM2000_REG_ID1); in wm2000_i2c_probe()
761 reg = wm2000_read(i2c, WM2000_REG_ID2); in wm2000_i2c_probe()
765 dev_err(&i2c->dev, "Device is not a WM2000 - ID %x\n", id); in wm2000_i2c_probe()
770 reg = wm2000_read(i2c, WM2000_REG_REVISON); in wm2000_i2c_probe()
771 dev_info(&i2c->dev, "revision %c\n", reg + 'A'); in wm2000_i2c_probe()
774 pdata = dev_get_platdata(&i2c->dev); in wm2000_i2c_probe()
783 ret = request_firmware(&fw, filename, &i2c->dev); in wm2000_i2c_probe()
785 dev_err(&i2c->dev, "Failed to acquire ANC data: %d\n", ret); in wm2000_i2c_probe()
791 wm2000->anc_download = devm_kzalloc(&i2c->dev, in wm2000_i2c_probe()
795 dev_err(&i2c->dev, "Out of memory\n"); in wm2000_i2c_probe()
807 wm2000->i2c = i2c; in wm2000_i2c_probe()
811 ret = snd_soc_register_codec(&i2c->dev, &soc_codec_dev_wm2000, NULL, 0); in wm2000_i2c_probe()
822 static __devexit int wm2000_i2c_remove(struct i2c_client *i2c) in wm2000_i2c_remove() argument
824 struct wm2000_priv *wm2000 = dev_get_drvdata(&i2c->dev); in wm2000_i2c_remove()
826 snd_soc_unregister_codec(&i2c->dev); in wm2000_i2c_remove()
836 MODULE_DEVICE_TABLE(i2c, wm2000_i2c_id);