static int hmc5843_init(struct hmc5843_data *data) { int ret; u8 id[3]; ret = regmap_bulk_read(data->regmap, HMC5843_ID_REG, id, ARRAY_SIZE(id)); if (ret < 0) return ret; if (id[0] != 'H' || id[1] != '4' || id[2] != '3') { dev_err(data->dev, "no HMC5843/5883/5883L/5983 sensor\n"); return -ENODEV; } ret = hmc5843_set_meas_conf(data, HMC5843_MEAS_CONF_NORMAL); if (ret < 0) return ret; ret = hmc5843_set_samp_freq(data, HMC5843_RATE_DEFAULT); if (ret < 0) return ret; ret = hmc5843_set_range_gain(data, HMC5843_RANGE_GAIN_DEFAULT); if (ret < 0) return ret; return hmc5843_set_mode(data, HMC5843_MODE_CONVERSION_CONTINUOUS); }
static int hmc5843_resume(struct device *dev) { struct hmc5843_data *data = iio_priv(i2c_get_clientdata( to_i2c_client(dev))); return hmc5843_set_mode(data, HMC5843_MODE_CONVERSION_CONTINUOUS); }
static int hmc5843_suspend(struct device *dev) { struct hmc5843_data *data = iio_priv(i2c_get_clientdata( to_i2c_client(dev))); return hmc5843_set_mode(data, HMC5843_MODE_SLEEP); }
static int hmc5843_init(struct hmc5843_data *data) { int ret; u8 id[3]; ret = i2c_smbus_read_i2c_block_data(data->client, HMC5843_ID_REG, sizeof(id), id); if (ret < 0) return ret; if (id[0] != 'H' || id[1] != '4' || id[2] != '3') { dev_err(&data->client->dev, "no HMC5843/5883/5883L sensor\n"); return -ENODEV; } ret = hmc5843_set_meas_conf(data, HMC5843_MEAS_CONF_NORMAL); if (ret < 0) return ret; ret = hmc5843_set_samp_freq(data, HMC5843_RATE_DEFAULT); if (ret < 0) return ret; ret = hmc5843_set_range_gain(data, HMC5843_RANGE_GAIN_DEFAULT); if (ret < 0) return ret; return hmc5843_set_mode(data, HMC5843_MODE_CONVERSION_CONTINUOUS); }
int hmc5843_common_remove(struct device *dev) { struct iio_dev *indio_dev = dev_get_drvdata(dev); iio_device_unregister(indio_dev); iio_triggered_buffer_cleanup(indio_dev); /* sleep mode to save power */ hmc5843_set_mode(iio_priv(indio_dev), HMC5843_MODE_SLEEP); return 0; }
static int hmc5843_remove(struct i2c_client *client) { struct iio_dev *indio_dev = i2c_get_clientdata(client); iio_device_unregister(indio_dev); iio_triggered_buffer_cleanup(indio_dev); /* sleep mode to save power */ hmc5843_set_mode(iio_priv(indio_dev), HMC5843_MODE_SLEEP); return 0; }
int hmc5843_common_probe(struct device *dev, struct regmap *regmap, enum hmc5843_ids id, const char *name) { struct hmc5843_data *data; struct iio_dev *indio_dev; int ret; indio_dev = devm_iio_device_alloc(dev, sizeof(*data)); if (!indio_dev) return -ENOMEM; dev_set_drvdata(dev, indio_dev); /* default settings at probe */ data = iio_priv(indio_dev); data->dev = dev; data->regmap = regmap; data->variant = &hmc5843_chip_info_tbl[id]; mutex_init(&data->lock); indio_dev->dev.parent = dev; indio_dev->name = name; indio_dev->info = &hmc5843_info; indio_dev->modes = INDIO_DIRECT_MODE; indio_dev->channels = data->variant->channels; indio_dev->num_channels = 4; indio_dev->available_scan_masks = hmc5843_scan_masks; ret = hmc5843_init(data); if (ret < 0) return ret; ret = iio_triggered_buffer_setup(indio_dev, NULL, hmc5843_trigger_handler, NULL); if (ret < 0) goto buffer_setup_err; ret = iio_device_register(indio_dev); if (ret < 0) goto buffer_cleanup; return 0; buffer_cleanup: iio_triggered_buffer_cleanup(indio_dev); buffer_setup_err: hmc5843_set_mode(iio_priv(indio_dev), HMC5843_MODE_SLEEP); return ret; }
int hmc5843_common_resume(struct device *dev) { return hmc5843_set_mode(iio_priv(dev_get_drvdata(dev)), HMC5843_MODE_CONVERSION_CONTINUOUS); }
int hmc5843_common_suspend(struct device *dev) { return hmc5843_set_mode(iio_priv(dev_get_drvdata(dev)), HMC5843_MODE_SLEEP); }