static ssize_t adp8860_bl_ambient_light_zone_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { struct adp8860_bl *data = dev_get_drvdata(dev); unsigned long val; uint8_t reg_val; int ret; ret = strict_strtoul(buf, 10, &val); if (ret) return ret; if (val == 0) { adp8860_set_bits(data->client, ADP8860_MDCR, CMP_AUTOEN); } else if ((val > 0) && (val <= 3)) { adp8860_clr_bits(data->client, ADP8860_MDCR, CMP_AUTOEN); mutex_lock(&data->lock); adp8860_read(data->client, ADP8860_CFGR, ®_val); reg_val &= ~(CFGR_BLV_MASK << CFGR_BLV_SHIFT); reg_val |= (val - 1) << CFGR_BLV_SHIFT; adp8860_write(data->client, ADP8860_CFGR, reg_val); mutex_unlock(&data->lock); } return count; }
static ssize_t adp8860_bl_ambient_light_level_show(struct device *dev, struct device_attribute *attr, char *buf) { struct adp8860_bl *data = dev_get_drvdata(dev); int error; uint8_t reg_val; uint16_t ret_val; mutex_lock(&data->lock); error = adp8860_read(data->client, ADP8860_PH1LEVL, ®_val); ret_val = reg_val; error |= adp8860_read(data->client, ADP8860_PH1LEVH, ®_val); mutex_unlock(&data->lock); if (error < 0) return error; ret_val += (reg_val & 0x1F) << 8; return sprintf(buf, "%u\n", ret_val); }
static ssize_t adp8860_show(struct device *dev, char *buf, int reg) { struct adp8860_bl *data = dev_get_drvdata(dev); int error; uint8_t reg_val; mutex_lock(&data->lock); error = adp8860_read(data->client, reg, ®_val); mutex_unlock(&data->lock); if (error < 0) return error; return sprintf(buf, "%u\n", reg_val); }
static ssize_t adp8860_bl_ambient_light_level_show(struct device *dev, struct device_attribute *attr, char *buf) { struct adp8860_bl *data = dev_get_drvdata(dev); int error; uint8_t reg_val; uint16_t ret_val; mutex_lock(&data->lock); error = adp8860_read(data->client, ADP8860_PH1LEVL, ®_val); if (!error) { ret_val = reg_val; error = adp8860_read(data->client, ADP8860_PH1LEVH, ®_val); } mutex_unlock(&data->lock); if (error) return error; /* Return 13-bit conversion value for the first light sensor */ ret_val += (reg_val & 0x1F) << 8; return sprintf(buf, "%u\n", ret_val); }
static ssize_t adp8860_bl_ambient_light_zone_show(struct device *dev, struct device_attribute *attr, char *buf) { struct adp8860_bl *data = dev_get_drvdata(dev); int error; uint8_t reg_val; mutex_lock(&data->lock); error = adp8860_read(data->client, ADP8860_CFGR, ®_val); mutex_unlock(&data->lock); if (error < 0) return error; return sprintf(buf, "%u\n", ((reg_val >> CFGR_BLV_SHIFT) & CFGR_BLV_MASK) + 1); }
static int adp8860_clr_bits(struct i2c_client *client, int reg, uint8_t bit_mask) { struct adp8860_bl *data = i2c_get_clientdata(client); uint8_t reg_val; int ret; mutex_lock(&data->lock); ret = adp8860_read(client, reg, ®_val); if (!ret && (reg_val & bit_mask)) { reg_val &= ~bit_mask; ret = adp8860_write(client, reg, reg_val); } mutex_unlock(&data->lock); return ret; }
static int __devinit adp8860_probe(struct i2c_client *client, const struct i2c_device_id *id) { struct backlight_device *bl; struct adp8860_bl *data; struct adp8860_backlight_platform_data *pdata = client->dev.platform_data; struct backlight_properties props; uint8_t reg_val; int ret; if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_BYTE_DATA)) { dev_err(&client->dev, "SMBUS Byte Data not Supported\n"); return -EIO; } if (!pdata) { dev_err(&client->dev, "no platform data?\n"); return -EINVAL; } data = kzalloc(sizeof(*data), GFP_KERNEL); if (data == NULL) return -ENOMEM; ret = adp8860_read(client, ADP8860_MFDVID, ®_val); if (ret < 0) goto out2; switch (ADP8860_MANID(reg_val)) { case ADP8863_MANUFID: data->gdwn_dis = !!pdata->gdwn_dis; case ADP8860_MANUFID: data->en_ambl_sens = !!pdata->en_ambl_sens; break; case ADP8861_MANUFID: data->gdwn_dis = !!pdata->gdwn_dis; break; default: dev_err(&client->dev, "failed to probe\n"); ret = -ENODEV; goto out2; } data->revid = ADP8860_DEVID(reg_val); data->client = client; data->pdata = pdata; data->id = id->driver_data; data->current_brightness = 0; i2c_set_clientdata(client, data); memset(&props, 0, sizeof(props)); props.type = BACKLIGHT_RAW; props.max_brightness = ADP8860_MAX_BRIGHTNESS; mutex_init(&data->lock); bl = backlight_device_register(dev_driver_string(&client->dev), &client->dev, data, &adp8860_bl_ops, &props); if (IS_ERR(bl)) { dev_err(&client->dev, "failed to register backlight\n"); ret = PTR_ERR(bl); goto out2; } bl->props.brightness = ADP8860_MAX_BRIGHTNESS; data->bl = bl; if (data->en_ambl_sens) ret = sysfs_create_group(&bl->dev.kobj, &adp8860_bl_attr_group); if (ret) { dev_err(&client->dev, "failed to register sysfs\n"); goto out1; } ret = adp8860_bl_setup(bl); if (ret) { ret = -EIO; goto out; } backlight_update_status(bl); dev_info(&client->dev, "%s Rev.%d Backlight\n", client->name, data->revid); if (pdata->num_leds) adp8860_led_probe(client); return 0; out: if (data->en_ambl_sens) sysfs_remove_group(&data->bl->dev.kobj, &adp8860_bl_attr_group); out1: backlight_device_unregister(bl); out2: kfree(data); return ret; }