static ssize_t store_resolution(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { struct iio_dev *indio_dev = dev_get_drvdata(dev); struct isl29018_chip *chip = iio_priv(indio_dev); struct i2c_client *client = chip->client; int status; unsigned long lval; unsigned int new_adc_bit; if (strict_strtoul(buf, 10, &lval)) return -EINVAL; if (!(lval == 4 || lval == 8 || lval == 12 || lval == 16)) { dev_err(dev, "The resolution is not supported\n"); return -EINVAL; } mutex_lock(&chip->lock); status = isl29018_set_resolution(client, lval, &new_adc_bit); if (status < 0) { mutex_unlock(&chip->lock); dev_err(dev, "Error in setting resolution\n"); return status; } chip->adc_bit = new_adc_bit; mutex_unlock(&chip->lock); return count; }
static int isl29018_chip_init(struct i2c_client *client) { struct isl29018_chip *chip = i2c_get_clientdata(client); bool status; int i; int new_adc_bit; unsigned int new_range; for (i = 0; i < ARRAY_SIZE(chip->reg_cache); i++) { chip->reg_cache[i] = 0; } /* set defaults */ isl29018_write_data(client, ISL29018_REG_TEST, 0x00, 0xFF, 0); isl29018_write_data(client, ISL29018_REG_ADD_COMMAND1, 0x00, 0xFF, 0); msleep(1); status = isl29018_set_range(client, chip->range, &new_range); if (status) status = isl29018_set_resolution(client, chip->adc_bit, &new_adc_bit); if (!status) { dev_err(&client->dev, "Init of isl29018 fails\n"); return -ENODEV; } return 0; }
static int isl29018_chip_init(struct isl29018_chip *chip) { int status; int new_adc_bit; unsigned int new_range; /* Code added per Intersil Application Note 1534: * When VDD sinks to approximately 1.8V or below, some of * the part's registers may change their state. When VDD * recovers to 2.25V (or greater), the part may thus be in an * unknown mode of operation. The user can return the part to * a known mode of operation either by (a) setting VDD = 0V for * 1 second or more and then powering back up with a slew rate * of 0.5V/ms or greater, or (b) via I2C disable all ALS/PROX * conversions, clear the test registers, and then rewrite all * registers to the desired values. * ... * FOR ISL29011, ISL29018, ISL29021, ISL29023 * 1. Write 0x00 to register 0x08 (TEST) * 2. Write 0x00 to register 0x00 (CMD1) * 3. Rewrite all registers to the desired values * * ISL29018 Data Sheet (FN6619.1, Feb 11, 2010) essentially says * the same thing EXCEPT the data sheet asks for a 1ms delay after * writing the CMD1 register. */ status = regmap_write(chip->regmap, ISL29018_REG_TEST, 0x0); if (status < 0) { dev_err(chip->dev, "Failed to clear isl29018 TEST reg." "(%d)\n", status); return status; } /* See Intersil AN1534 comments above. * "Operating Mode" (COMMAND1) register is reprogrammed when * data is read from the device. */ status = regmap_write(chip->regmap, ISL29018_REG_ADD_COMMAND1, 0); if (status < 0) { dev_err(chip->dev, "Failed to clear isl29018 CMD1 reg." "(%d)\n", status); return status; } msleep(1); /* per data sheet, page 10 */ /* set defaults */ status = isl29018_set_range(chip, chip->range, &new_range); if (status < 0) { dev_err(chip->dev, "Init of isl29018 fails\n"); return status; } status = isl29018_set_resolution(chip, chip->adc_bit, &new_adc_bit); return 0; }