static ssize_t lm3530_mode_set(struct device *dev, struct device_attribute *attr, const char *buf, size_t size) { struct led_classdev *led_cdev = dev_get_drvdata(dev); struct lm3530_data *drvdata; struct lm3530_pwm_data *pwm; u8 max_brightness; int mode, err; drvdata = container_of(led_cdev, struct lm3530_data, led_dev); pwm = &drvdata->pdata->pwm_data; max_brightness = led_cdev->max_brightness; mode = lm3530_get_mode_from_str(buf); if (mode < 0) { dev_err(dev, "Invalid mode\n"); return mode; } drvdata->mode = mode; /* set pwm to low if unnecessary */ if (mode != LM3530_BL_MODE_PWM && pwm->pwm_set_intensity) pwm->pwm_set_intensity(0, max_brightness); err = lm3530_init_registers(drvdata); if (err) { dev_err(dev, "Setting %s Mode failed :%d\n", buf, err); return err; } return sizeof(drvdata->mode); }
static ssize_t lm3530_mode_set(struct device *dev, struct device_attribute *attr, const char *buf, size_t size) { int err; struct i2c_client *client = container_of( dev->parent, struct i2c_client, dev); struct lm3530_data *drvdata = i2c_get_clientdata(client); int mode; mode = lm3530_get_mode_from_str(buf); if (mode < 0) { dev_err(dev, "Invalid mode\n"); return -EINVAL; } if (mode == LM3530_BL_MODE_MANUAL) drvdata->mode = LM3530_BL_MODE_MANUAL; else if (mode == LM3530_BL_MODE_ALS) drvdata->mode = LM3530_BL_MODE_ALS; else if (mode == LM3530_BL_MODE_PWM) { dev_err(dev, "PWM mode not supported\n"); return -EINVAL; } err = lm3530_init_registers(drvdata); if (err) { dev_err(dev, "Setting %s Mode failed :%d\n", buf, err); return err; } return sizeof(drvdata->mode); }
static void lm3530_brightness_set(struct led_classdev *led_cdev, enum led_brightness brt_val) { int err; struct lm3530_data *drvdata = container_of(led_cdev, struct lm3530_data, led_dev); /*pr_info("set brt %d mode %d\n", brt_val, drvdata->mode);*/ mutex_lock(&drvdata->mutex_lock); if (atomic_read(&drvdata->suspended)) { drvdata->brightness = brt_val; mutex_unlock(&drvdata->mutex_lock); return; } switch (drvdata->mode) { case LM3530_BL_MODE_MANUAL: case LM3530_BL_MODE_PWM_MAN: if (!drvdata->enable) { err = lm3530_init_registers(drvdata); if (err) { dev_err(&drvdata->client->dev, "Register Init failed: %d\n", err); break; } } /* set the brightness in brightness control register*/ err = i2c_smbus_write_byte_data(drvdata->client, LM3530_BRT_CTRL_REG, brt_val/2); if (err) dev_err(&drvdata->client->dev, "Unable to set brightness: %d\n", err); else drvdata->brightness = brt_val; if (brt_val == 0) { err = regulator_disable(drvdata->regulator); if (err) dev_err(&drvdata->client->dev, "Disable regulator failed\n"); drvdata->enable = false; } break; case LM3530_BL_MODE_ALS: break; case LM3530_BL_MODE_PWM: break; default: break; } mutex_unlock(&drvdata->mutex_lock); }
static void lm3530_brightness_set(struct led_classdev *led_cdev, enum led_brightness brt_val) { int err; struct lm3530_data *drvdata = container_of(led_cdev, struct lm3530_data, led_dev); struct lm3530_platform_data *pdata = drvdata->pdata; struct lm3530_pwm_data *pwm = &pdata->pwm_data; u8 max_brightness = led_cdev->max_brightness; switch (drvdata->mode) { case LM3530_BL_MODE_MANUAL: if (!drvdata->enable) { err = lm3530_init_registers(drvdata); if (err) { dev_err(&drvdata->client->dev, "Register Init failed: %d\n", err); break; } } /* set the brightness in brightness control register*/ err = i2c_smbus_write_byte_data(drvdata->client, LM3530_BRT_CTRL_REG, brt_val); if (err) dev_err(&drvdata->client->dev, "Unable to set brightness: %d\n", err); else drvdata->brightness = brt_val; if (brt_val == 0) { err = regulator_disable(drvdata->regulator); if (err) dev_err(&drvdata->client->dev, "Disable regulator failed\n"); drvdata->enable = false; } break; case LM3530_BL_MODE_ALS: break; case LM3530_BL_MODE_PWM: if (pwm->pwm_set_intensity) pwm->pwm_set_intensity(brt_val, max_brightness); break; default: break; } }
static ssize_t lm3530_mode_set(struct device *dev, struct device_attribute *attr, const char *buf, size_t size) { int err = 0; struct i2c_client *client = container_of( dev->parent, struct i2c_client, dev); struct lm3530_data *drvdata = i2c_get_clientdata(client); int mode; mode = lm3530_get_mode_from_str(buf); if (mode < 0) { dev_err(dev, "Invalid mode\n"); return -EINVAL; } pr_info("set mode %s, value %d\n", buf, mode); switch (mode) { case LM3530_BL_MODE_MANUAL: case LM3530_BL_MODE_ALS: case LM3530_BL_MODE_PWM: err = lcd_cabc_opr(0xff, false); break; case LM3530_BL_MODE_PWM_MAN: err = lcd_cabc_opr(0xff, true); break; default: dev_err(dev, "unsupported mode\n"); break; } if (err != 0) { dev_err(dev, "set mode fail!\n"); return 0; } drvdata->mode = mode; /* set pwm to low if unnecessary */ err = lm3530_init_registers(drvdata); if (err) { dev_err(dev, "Setting %s Mode failed :%d\n", buf, err); return err; } return size; }
static void lm3530_late_resume(struct early_suspend *h) { struct lm3530_data *drvdata = container_of(h, struct lm3530_data, early_suspend); int err = 0; mutex_lock(&drvdata->mutex_lock); atomic_set(&drvdata->suspended, 0); if (drvdata->brightness == 0) goto out; if (!drvdata->enable) { err = lm3530_init_registers(drvdata); if (err) { dev_err(&drvdata->client->dev, "Register Init failed: %d\n", err); } } out: mutex_unlock(&drvdata->mutex_lock); }
static int lm3530_probe(struct i2c_client *client, const struct i2c_device_id *id) { struct lm3530_platform_data *pdata = dev_get_platdata(&client->dev); struct lm3530_data *drvdata; int err = 0; if (pdata == NULL) { dev_err(&client->dev, "platform data required\n"); return -ENODEV; } /* BL mode */ if (pdata->mode > LM3530_BL_MODE_PWM) { dev_err(&client->dev, "Illegal Mode request\n"); return -EINVAL; } if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { dev_err(&client->dev, "I2C_FUNC_I2C not supported\n"); return -EIO; } drvdata = devm_kzalloc(&client->dev, sizeof(struct lm3530_data), GFP_KERNEL); if (drvdata == NULL) return -ENOMEM; drvdata->mode = pdata->mode; drvdata->client = client; drvdata->pdata = pdata; drvdata->brightness = LED_OFF; drvdata->enable = false; drvdata->led_dev.name = LM3530_LED_DEV; drvdata->led_dev.brightness_set = lm3530_brightness_set; drvdata->led_dev.max_brightness = MAX_BRIGHTNESS; drvdata->led_dev.groups = lm3530_groups; i2c_set_clientdata(client, drvdata); drvdata->regulator = devm_regulator_get(&client->dev, "vin"); if (IS_ERR(drvdata->regulator)) { dev_err(&client->dev, "regulator get failed\n"); err = PTR_ERR(drvdata->regulator); drvdata->regulator = NULL; return err; } if (drvdata->pdata->brt_val) { err = lm3530_init_registers(drvdata); if (err < 0) { dev_err(&client->dev, "Register Init failed: %d\n", err); return err; } } err = led_classdev_register(&client->dev, &drvdata->led_dev); if (err < 0) { dev_err(&client->dev, "Register led class failed: %d\n", err); return err; } return 0; }
static int __devinit lm3530_probe(struct i2c_client *client, const struct i2c_device_id *id) { struct lm3530_platform_data *pdata = client->dev.platform_data; struct lm3530_data *drvdata; int err = 0; if (pdata == NULL) { dev_err(&client->dev, "platform data required\n"); err = -ENODEV; goto err_out; } /* BL mode */ if (pdata->mode > LM3530_BL_MODE_PWM) { dev_err(&client->dev, "Illegal Mode request\n"); err = -EINVAL; goto err_out; } if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { dev_err(&client->dev, "I2C_FUNC_I2C not supported\n"); err = -EIO; goto err_out; } drvdata = kzalloc(sizeof(struct lm3530_data), GFP_KERNEL); if (drvdata == NULL) { err = -ENOMEM; goto err_out; } drvdata->mode = pdata->mode; drvdata->client = client; drvdata->pdata = pdata; drvdata->led_dev.name = LM3530_LED_DEV; drvdata->led_dev.brightness_set = lm3530_brightness_set; i2c_set_clientdata(client, drvdata); err = lm3530_init_registers(drvdata); if (err < 0) { dev_err(&client->dev, "Register Init failed: %d\n", err); err = -ENODEV; goto err_reg_init; } err = led_classdev_register((struct device *) &client->dev, &drvdata->led_dev); if (err < 0) { dev_err(&client->dev, "Register led class failed: %d\n", err); err = -ENODEV; goto err_class_register; } err = device_create_file(drvdata->led_dev.dev, &dev_attr_mode); if (err < 0) { dev_err(&client->dev, "File device creation failed: %d\n", err); err = -ENODEV; goto err_create_file; } return 0; err_create_file: led_classdev_unregister(&drvdata->led_dev); err_class_register: err_reg_init: kfree(drvdata); err_out: return err; }
static int __devinit lm3530_probe(struct i2c_client *client, const struct i2c_device_id *id) { struct lm3530_platform_data *pdata = client->dev.platform_data; struct lm3530_data *drvdata; int err = 0; if (pdata == NULL) { dev_err(&client->dev, "platform data required\n"); err = -ENODEV; goto err_out; } /* BL mode */ if (pdata->mode > LM3530_BL_MODE_PWM_MAN) { dev_err(&client->dev, "Illegal Mode request\n"); err = -EINVAL; goto err_out; } if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { dev_err(&client->dev, "I2C_FUNC_I2C not supported\n"); err = -EIO; goto err_out; } drvdata = kzalloc(sizeof(struct lm3530_data), GFP_KERNEL); if (drvdata == NULL) { err = -ENOMEM; goto err_out; } drvdata->mode = pdata->mode; drvdata->client = client; drvdata->pdata = pdata; drvdata->brightness = LED_OFF; drvdata->enable = false; drvdata->led_dev.name = LM3530_LED_DEV; drvdata->led_dev.brightness_set = lm3530_brightness_set; mutex_init(&drvdata->mutex_lock); i2c_set_clientdata(client, drvdata); drvdata->regulator = regulator_get(NULL, "lm3630-vol"); if (IS_ERR(drvdata->regulator)) { dev_err(&client->dev, "regulator get failed\n"); err = PTR_ERR(drvdata->regulator); drvdata->regulator = NULL; goto err_regulator_get; } if (drvdata->pdata->brt_val) { err = lm3530_init_registers(drvdata); if (err < 0) { dev_err(&client->dev, "Register Init failed: %d\n", err); err = -ENODEV; goto err_reg_init; } } err = led_classdev_register(&client->dev, &drvdata->led_dev); if (err < 0) { dev_err(&client->dev, "Register led class failed: %d\n", err); err = -ENODEV; goto err_class_register; } err = device_create_file(drvdata->led_dev.dev, &dev_attr_mode); if (err < 0) { dev_err(&client->dev, "File device creation failed: %d\n", err); err = -ENODEV; goto err_create_file; } #ifdef CONFIG_HAS_EARLYSUSPEND atomic_set(&drvdata->suspended, 0); drvdata->early_suspend.suspend = lm3530_early_suspend; drvdata->early_suspend.resume = lm3530_late_resume; drvdata->early_suspend.level = EARLY_SUSPEND_LEVEL_BLANK_SCREEN-5; register_early_suspend(&drvdata->early_suspend); drvdata->initialised = true; #endif return 0; err_create_file: led_classdev_unregister(&drvdata->led_dev); err_class_register: err_reg_init: regulator_put(drvdata->regulator); err_regulator_get: i2c_set_clientdata(client, NULL); kfree(drvdata); err_out: return err; }