Linux Back Light driver

来源:互联网 发布:园长妈妈软件下载 编辑:程序博客网 时间:2024/06/05 03:12

/linux/drvices/leds/leds-lm3530.c

1、prob

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;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;}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);return err;}

2、brightness_set

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);elsedrvdata->brightness = brt_val;if (brt_val == 0)lm3530_led_disable(drvdata);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;}}

/linux/drvices/leds/leds-class.c
3、led_classdev_register

/** * led_classdev_register - register a new object of led_classdev class. * @parent: The device to register. * @led_cdev: the led_classdev structure for this device. */int led_classdev_register(struct device *parent, struct led_classdev *led_cdev){led_cdev->dev = device_create(leds_class, parent, 0, led_cdev,      "%s", led_cdev->name);if (IS_ERR(led_cdev->dev))return PTR_ERR(led_cdev->dev);#ifdef CONFIG_LEDS_TRIGGERSinit_rwsem(&led_cdev->trigger_lock);#endif/* add to the list of leds */down_write(&leds_list_lock);list_add_tail(&led_cdev->node, &leds_list);up_write(&leds_list_lock);if (!led_cdev->max_brightness)led_cdev->max_brightness = LED_FULL;led_update_brightness(led_cdev);INIT_WORK(&led_cdev->set_brightness_work, set_brightness_delayed);init_timer(&led_cdev->blink_timer);led_cdev->blink_timer.function = led_timer_function;led_cdev->blink_timer.data = (unsigned long)led_cdev;#ifdef CONFIG_LEDS_TRIGGERSled_trigger_set_default(led_cdev);#endifdev_dbg(parent, "Registered led device: %s\n",led_cdev->name);return 0;}EXPORT_SYMBOL_GPL(led_classdev_register);


0 0