• Home
  • Raw
  • Download

Lines Matching refs:ak8974

145 struct ak8974 {  struct
161 static int ak8974_set_power(struct ak8974 *ak8974, bool mode) in ak8974_set_power() argument
168 ret = regmap_write(ak8974->map, AK8974_CTRL1, val); in ak8974_set_power()
178 static int ak8974_reset(struct ak8974 *ak8974) in ak8974_reset() argument
183 ret = ak8974_set_power(ak8974, AK8974_PWR_ON); in ak8974_reset()
186 ret = regmap_write(ak8974->map, AK8974_CTRL2, AK8974_CTRL2_RESDEF); in ak8974_reset()
189 ret = regmap_write(ak8974->map, AK8974_CTRL3, AK8974_CTRL3_RESDEF); in ak8974_reset()
192 ret = regmap_write(ak8974->map, AK8974_INT_CTRL, in ak8974_reset()
198 return ak8974_set_power(ak8974, AK8974_PWR_OFF); in ak8974_reset()
201 static int ak8974_configure(struct ak8974 *ak8974) in ak8974_configure() argument
205 ret = regmap_write(ak8974->map, AK8974_CTRL2, AK8974_CTRL2_DRDY_EN | in ak8974_configure()
209 ret = regmap_write(ak8974->map, AK8974_CTRL3, 0); in ak8974_configure()
212 ret = regmap_write(ak8974->map, AK8974_INT_CTRL, AK8974_INT_CTRL_POL); in ak8974_configure()
216 return regmap_write(ak8974->map, AK8974_PRESET, 0); in ak8974_configure()
219 static int ak8974_trigmeas(struct ak8974 *ak8974) in ak8974_trigmeas() argument
227 ret = regmap_read(ak8974->map, AK8974_INT_CLEAR, &clear); in ak8974_trigmeas()
232 if (ak8974->drdy_irq) { in ak8974_trigmeas()
238 if (!ak8974->drdy_active_low) in ak8974_trigmeas()
241 init_completion(&ak8974->drdy_complete); in ak8974_trigmeas()
242 ret = regmap_update_bits(ak8974->map, AK8974_CTRL2, in ak8974_trigmeas()
249 return regmap_update_bits(ak8974->map, in ak8974_trigmeas()
255 static int ak8974_await_drdy(struct ak8974 *ak8974) in ak8974_await_drdy() argument
261 if (ak8974->drdy_irq) { in ak8974_await_drdy()
262 ret = wait_for_completion_timeout(&ak8974->drdy_complete, in ak8974_await_drdy()
265 dev_err(&ak8974->i2c->dev, in ak8974_await_drdy()
275 ret = regmap_read(ak8974->map, AK8974_STATUS, &val); in ak8974_await_drdy()
282 dev_err(&ak8974->i2c->dev, in ak8974_await_drdy()
290 static int ak8974_getresult(struct ak8974 *ak8974, s16 *result) in ak8974_getresult() argument
295 ret = ak8974_await_drdy(ak8974); in ak8974_getresult()
298 ret = regmap_read(ak8974->map, AK8974_INT_SRC, &src); in ak8974_getresult()
304 dev_err(&ak8974->i2c->dev, in ak8974_getresult()
309 ret = regmap_bulk_read(ak8974->map, AK8974_DATA_X, result, 6); in ak8974_getresult()
318 struct ak8974 *ak8974 = d; in ak8974_drdy_irq() local
320 if (!ak8974->drdy_irq) in ak8974_drdy_irq()
329 struct ak8974 *ak8974 = d; in ak8974_drdy_irq_thread() local
334 ret = regmap_read(ak8974->map, AK8974_STATUS, &val); in ak8974_drdy_irq_thread()
336 dev_err(&ak8974->i2c->dev, "error reading DRDY status\n"); in ak8974_drdy_irq_thread()
341 complete(&ak8974->drdy_complete); in ak8974_drdy_irq_thread()
349 static int ak8974_selftest(struct ak8974 *ak8974) in ak8974_selftest() argument
351 struct device *dev = &ak8974->i2c->dev; in ak8974_selftest()
355 ret = regmap_read(ak8974->map, AK8974_SELFTEST, &val); in ak8974_selftest()
364 ret = regmap_update_bits(ak8974->map, in ak8974_selftest()
375 ret = regmap_read(ak8974->map, AK8974_SELFTEST, &val); in ak8974_selftest()
383 ret = regmap_read(ak8974->map, AK8974_SELFTEST, &val); in ak8974_selftest()
395 static int ak8974_get_u16_val(struct ak8974 *ak8974, u8 reg, u16 *val) in ak8974_get_u16_val() argument
400 ret = regmap_bulk_read(ak8974->map, reg, &bulk, 2); in ak8974_get_u16_val()
408 static int ak8974_detect(struct ak8974 *ak8974) in ak8974_detect() argument
416 ret = regmap_read(ak8974->map, AK8974_WHOAMI, &whoami); in ak8974_detect()
423 ret = regmap_read(ak8974->map, AMI305_VER, &fw); in ak8974_detect()
427 ret = ak8974_get_u16_val(ak8974, AMI305_SN, &sn); in ak8974_detect()
430 dev_info(&ak8974->i2c->dev, in ak8974_detect()
436 dev_info(&ak8974->i2c->dev, "detected AK8974\n"); in ak8974_detect()
439 dev_err(&ak8974->i2c->dev, "unsupported device (%02x) ", in ak8974_detect()
444 ak8974->name = name; in ak8974_detect()
445 ak8974->variant = whoami; in ak8974_detect()
455 struct ak8974 *ak8974 = iio_priv(indio_dev); in ak8974_read_raw() local
459 pm_runtime_get_sync(&ak8974->i2c->dev); in ak8974_read_raw()
460 mutex_lock(&ak8974->lock); in ak8974_read_raw()
465 dev_err(&ak8974->i2c->dev, "faulty channel address\n"); in ak8974_read_raw()
469 ret = ak8974_trigmeas(ak8974); in ak8974_read_raw()
472 ret = ak8974_getresult(ak8974, hw_values); in ak8974_read_raw()
486 mutex_unlock(&ak8974->lock); in ak8974_read_raw()
487 pm_runtime_mark_last_busy(&ak8974->i2c->dev); in ak8974_read_raw()
488 pm_runtime_put_autosuspend(&ak8974->i2c->dev); in ak8974_read_raw()
495 struct ak8974 *ak8974 = iio_priv(indio_dev); in ak8974_fill_buffer() local
499 pm_runtime_get_sync(&ak8974->i2c->dev); in ak8974_fill_buffer()
500 mutex_lock(&ak8974->lock); in ak8974_fill_buffer()
502 ret = ak8974_trigmeas(ak8974); in ak8974_fill_buffer()
504 dev_err(&ak8974->i2c->dev, "error triggering measure\n"); in ak8974_fill_buffer()
507 ret = ak8974_getresult(ak8974, hw_values); in ak8974_fill_buffer()
509 dev_err(&ak8974->i2c->dev, "error getting measures\n"); in ak8974_fill_buffer()
517 mutex_unlock(&ak8974->lock); in ak8974_fill_buffer()
518 pm_runtime_mark_last_busy(&ak8974->i2c->dev); in ak8974_fill_buffer()
519 pm_runtime_put_autosuspend(&ak8974->i2c->dev); in ak8974_fill_buffer()
537 struct ak8974 *ak8974 = iio_priv(indio_dev); in ak8974_get_mount_matrix() local
539 return &ak8974->orientation; in ak8974_get_mount_matrix()
582 struct ak8974 *ak8974 = iio_priv(indio_dev); in ak8974_writeable_reg() local
600 if (ak8974->variant == AK8974_WHOAMI_VALUE_AK8974) in ak8974_writeable_reg()
609 if (ak8974->variant == AK8974_WHOAMI_VALUE_AMI305) in ak8974_writeable_reg()
628 struct ak8974 *ak8974; in ak8974_probe() local
634 indio_dev = devm_iio_device_alloc(&i2c->dev, sizeof(*ak8974)); in ak8974_probe()
638 ak8974 = iio_priv(indio_dev); in ak8974_probe()
640 ak8974->i2c = i2c; in ak8974_probe()
641 mutex_init(&ak8974->lock); in ak8974_probe()
645 &ak8974->orientation); in ak8974_probe()
649 ak8974->regs[0].supply = ak8974_reg_avdd; in ak8974_probe()
650 ak8974->regs[1].supply = ak8974_reg_dvdd; in ak8974_probe()
653 ARRAY_SIZE(ak8974->regs), in ak8974_probe()
654 ak8974->regs); in ak8974_probe()
660 ret = regulator_bulk_enable(ARRAY_SIZE(ak8974->regs), ak8974->regs); in ak8974_probe()
671 ak8974->map = devm_regmap_init_i2c(i2c, &ak8974_regmap_config); in ak8974_probe()
672 if (IS_ERR(ak8974->map)) { in ak8974_probe()
674 return PTR_ERR(ak8974->map); in ak8974_probe()
677 ret = ak8974_set_power(ak8974, AK8974_PWR_ON); in ak8974_probe()
683 ret = ak8974_detect(ak8974); in ak8974_probe()
689 ret = ak8974_selftest(ak8974); in ak8974_probe()
693 ret = ak8974_reset(ak8974); in ak8974_probe()
710 indio_dev->name = ak8974->name; in ak8974_probe()
726 ak8974->drdy_active_low = true; in ak8974_probe()
739 ak8974->name, in ak8974_probe()
740 ak8974); in ak8974_probe()
746 ak8974->drdy_irq = true; in ak8974_probe()
763 ak8974_set_power(ak8974, AK8974_PWR_OFF); in ak8974_probe()
765 regulator_bulk_disable(ARRAY_SIZE(ak8974->regs), ak8974->regs); in ak8974_probe()
773 struct ak8974 *ak8974 = iio_priv(indio_dev); in ak8974_remove() local
780 ak8974_set_power(ak8974, AK8974_PWR_OFF); in ak8974_remove()
781 regulator_bulk_disable(ARRAY_SIZE(ak8974->regs), ak8974->regs); in ak8974_remove()
788 struct ak8974 *ak8974 = in ak8974_runtime_suspend() local
791 ak8974_set_power(ak8974, AK8974_PWR_OFF); in ak8974_runtime_suspend()
792 regulator_bulk_disable(ARRAY_SIZE(ak8974->regs), ak8974->regs); in ak8974_runtime_suspend()
799 struct ak8974 *ak8974 = in ak8974_runtime_resume() local
803 ret = regulator_bulk_enable(ARRAY_SIZE(ak8974->regs), ak8974->regs); in ak8974_runtime_resume()
807 ret = ak8974_set_power(ak8974, AK8974_PWR_ON); in ak8974_runtime_resume()
811 ret = ak8974_configure(ak8974); in ak8974_runtime_resume()
818 ak8974_set_power(ak8974, AK8974_PWR_OFF); in ak8974_runtime_resume()
820 regulator_bulk_disable(ARRAY_SIZE(ak8974->regs), ak8974->regs); in ak8974_runtime_resume()