/* Regulators not mandatory, but if requested we should enable them. */
err = devm_regulator_bulk_get_enable(parent,
ARRAY_SIZE(regulator_names),
regulator_names); if (err) return dev_err_probe(parent, err, "unable to enable supplies\n");
/* Sensor does not support interrupts */ if (!sdata->sensor_settings->drdy_irq.int1.addr &&
!sdata->sensor_settings->drdy_irq.int2.addr) { if (pdata->drdy_int_pin)
dev_info(parent, "DRDY on pin INT%d specified, but sensor does not support interrupts\n",
pdata->drdy_int_pin); return 0;
}
switch (pdata->drdy_int_pin) { case 1: if (!sdata->sensor_settings->drdy_irq.int1.mask) {
dev_err(parent, "DRDY on INT1 not available.\n"); return -EINVAL;
}
sdata->drdy_int_pin = 1; break; case 2: if (!sdata->sensor_settings->drdy_irq.int2.mask) {
dev_err(parent, "DRDY on INT2 not available.\n"); return -EINVAL;
}
sdata->drdy_int_pin = 2; break; default:
dev_err(parent, "DRDY on pdata not valid.\n"); return -EINVAL;
}
if (pdata->open_drain) { if (!sdata->sensor_settings->drdy_irq.int1.addr_od &&
!sdata->sensor_settings->drdy_irq.int2.addr_od)
dev_err(parent, "open drain requested but unsupported.\n"); else
sdata->int_pin_open_drain = true;
}
/** * st_sensors_dev_name_probe() - device probe for ST sensor name * @dev: driver model representation of the device. * @name: device name buffer reference. * @len: device name buffer length. * * In effect this function matches an ID to an internal kernel * name for a certain sensor device, so that the rest of the autodetection can * rely on that name from this point on. I2C/SPI devices will be renamed * to match the internal kernel convention.
*/ void st_sensors_dev_name_probe(struct device *dev, char *name, int len)
{ constvoid *match;
match = device_get_match_data(dev); if (!match) return;
/* The name from the match takes precedence if present */
strscpy(name, match, len);
}
EXPORT_SYMBOL_NS(st_sensors_dev_name_probe, "IIO_ST_SENSORS");
/* If OF/DT pdata exists, it will take precedence of anything else */
of_pdata = st_sensors_dev_probe(parent, pdata); if (IS_ERR(of_pdata)) return PTR_ERR(of_pdata); if (of_pdata)
pdata = of_pdata;
if (pdata) {
err = st_sensors_set_drdy_int_pin(indio_dev, pdata); if (err < 0) return err;
}
err = st_sensors_set_enable(indio_dev, false); if (err < 0) return err;
/* Disable DRDY, this might be still be enabled after reboot. */
err = st_sensors_set_dataready_irq(indio_dev, false); if (err < 0) return err;
if (sdata->current_fullscale) {
err = st_sensors_set_fullscale(indio_dev,
sdata->current_fullscale->num); if (err < 0) return err;
} else
dev_info(parent, "Full-scale not possible\n");
err = st_sensors_set_odr(indio_dev, sdata->odr); if (err < 0) return err;
/* set BDU */ if (sdata->sensor_settings->bdu.addr) {
err = st_sensors_write_data_with_mask(indio_dev,
sdata->sensor_settings->bdu.addr,
sdata->sensor_settings->bdu.mask, true); if (err < 0) return err;
}
/* set DAS */ if (sdata->sensor_settings->das.addr) {
err = st_sensors_write_data_with_mask(indio_dev,
sdata->sensor_settings->das.addr,
sdata->sensor_settings->das.mask, 1); if (err < 0) return err;
}
dev_info(parent, "set interrupt line to open drain mode on pin %d\n",
sdata->drdy_int_pin);
err = st_sensors_write_data_with_mask(indio_dev, addr,
mask, 1); if (err < 0) return err;
}
int st_sensors_set_dataready_irq(struct iio_dev *indio_dev, bool enable)
{ int err;
u8 drdy_addr, drdy_mask; struct st_sensor_data *sdata = iio_priv(indio_dev);
if (!sdata->sensor_settings->drdy_irq.int1.addr &&
!sdata->sensor_settings->drdy_irq.int2.addr) { /* * there are some devices (e.g. LIS3MDL) where drdy line is * routed to a given pin and it is not possible to select a * different one. Take into account irq status register * to understand if irq trigger can be properly supported
*/ if (sdata->sensor_settings->drdy_irq.stat_drdy.addr)
sdata->hw_irq_trigger = enable; return 0;
}
/* Enable/Disable the interrupt generator 1. */ if (sdata->sensor_settings->drdy_irq.ig1.en_addr > 0) {
err = st_sensors_write_data_with_mask(indio_dev,
sdata->sensor_settings->drdy_irq.ig1.en_addr,
sdata->sensor_settings->drdy_irq.ig1.en_mask,
(int)enable); if (err < 0) goto st_accel_set_dataready_irq_error;
}
/* * st_sensors_get_settings_index() - get index of the sensor settings for a * specific device from list of settings * @name: device name buffer reference. * @list: sensor settings list. * @list_length: length of sensor settings list. * * Return: non negative number on success (valid index), * negative error code otherwise.
*/ int st_sensors_get_settings_index(constchar *name, conststruct st_sensor_settings *list, constint list_length)
{ int i, n;
for (i = 0; i < list_length; i++) { for (n = 0; n < ST_SENSORS_MAX_4WAI; n++) { if (strcmp(name, list[i].sensors_supported[n]) == 0) return i;
}
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.