static int sensor_init(struct i2c_client *client) { int status, i; struct sensor_private_data *sensor = (struct sensor_private_data *) i2c_get_clientdata(client); for (i = 0; i < 5; i++) { status = cm3218_write(client, CM3218_REG_ADDR_CMD, CM3218_CMD_ALS_SD); if (status >= 0) break; cm3218_read_ara(client); } status = cm3218_write(client, CM3218_REG_ADDR_CMD, CM3218_DEFAULT_CMD); if (status < 0) { dev_err(&client->dev, "Init CM3218 CMD fails\n"); return status; } if(sensor->pdata->irq_enable) { status = cm3218_write(client, CM3218_REG_ADDR_CMD, CM3218_DEFAULT_CMD | CM3218_CMD_ALS_INT_EN); if (status < 0) { dev_err(&client->dev, "Init CM3218 CMD fails\n"); return status; } } /* Clean interrupt status */ cm3218_read(client, CM3218_REG_ADDR_STATUS); return status; }
/** * cm3218_interrupt_config() - Enable/Disable CM3218 interrupt * @cm3218: pointer of struct cm3218. * @enable: 0 to disable; otherwise to enable * * Config CM3218 interrupt control bit. * * Return: 0 for success; otherwise for error code. */ static int cm3218_interrupt_config(struct cm3218_chip *chip, int enable) { int status; /* Force to clean interrupt */ cm3218_read_ara(chip); if (enable) chip->conf_regs[CM3218_REG_ADDR_CMD] |= CM3218_CMD_ALS_INT_EN; else chip->conf_regs[CM3218_REG_ADDR_CMD] &= ~CM3218_CMD_ALS_INT_EN; status = i2c_smbus_write_word_data( chip->als_client, CM3218_REG_ADDR_CMD, chip->conf_regs[CM3218_REG_ADDR_CMD]); if (status < 0) return -ENODEV; return status; }