diff options
Diffstat (limited to 'drivers/video/backlight/mp3309c.c')
-rw-r--r-- | drivers/video/backlight/mp3309c.c | 96 |
1 files changed, 40 insertions, 56 deletions
diff --git a/drivers/video/backlight/mp3309c.c b/drivers/video/backlight/mp3309c.c index 34d71259fa..4e98e60417 100644 --- a/drivers/video/backlight/mp3309c.c +++ b/drivers/video/backlight/mp3309c.c @@ -15,6 +15,8 @@ #include <linux/delay.h> #include <linux/gpio/consumer.h> #include <linux/i2c.h> +#include <linux/mod_devicetable.h> +#include <linux/property.h> #include <linux/pwm.h> #include <linux/regmap.h> @@ -131,7 +133,7 @@ static int mp3309c_bl_update_status(struct backlight_device *bl) chip->pdata->levels[brightness], chip->pdata->levels[chip->pdata->max_brightness]); pwmstate.enabled = true; - ret = pwm_apply_state(chip->pwmd, &pwmstate); + ret = pwm_apply_might_sleep(chip->pwmd, &pwmstate); if (ret) return ret; @@ -199,20 +201,16 @@ static const struct backlight_ops mp3309c_bl_ops = { .update_status = mp3309c_bl_update_status, }; -static int pm3309c_parse_dt_node(struct mp3309c_chip *chip, - struct mp3309c_platform_data *pdata) +static int mp3309c_parse_fwnode(struct mp3309c_chip *chip, + struct mp3309c_platform_data *pdata) { - struct device_node *node = chip->dev->of_node; - struct property *prop_pwms; - struct property *prop_levels = NULL; - int length = 0; int ret, i; - unsigned int num_levels, tmp_value; + unsigned int tmp_value; + struct device *dev = chip->dev; + int num_levels; - if (!node) { - dev_err(chip->dev, "failed to get DT node\n"); - return -ENODEV; - } + if (!dev_fwnode(dev)) + return dev_err_probe(dev, -ENODEV, "failed to get firmware node\n"); /* * Dimming mode: the MP3309C provides two dimming control mode: @@ -224,12 +222,10 @@ static int pm3309c_parse_dt_node(struct mp3309c_chip *chip, * found in the backlight node, the mode switches to PWM mode. */ pdata->dimming_mode = DIMMING_ANALOG_I2C; - prop_pwms = of_find_property(node, "pwms", &length); - if (prop_pwms) { - chip->pwmd = devm_pwm_get(chip->dev, NULL); + if (device_property_present(dev, "pwms")) { + chip->pwmd = devm_pwm_get(dev, NULL); if (IS_ERR(chip->pwmd)) - return dev_err_probe(chip->dev, PTR_ERR(chip->pwmd), - "error getting pwm data\n"); + return dev_err_probe(dev, PTR_ERR(chip->pwmd), "error getting pwm data\n"); pdata->dimming_mode = DIMMING_PWM; pwm_apply_args(chip->pwmd); } @@ -247,21 +243,17 @@ static int pm3309c_parse_dt_node(struct mp3309c_chip *chip, num_levels = ANALOG_I2C_NUM_LEVELS; /* Enable GPIO used in I2C dimming mode only */ - chip->enable_gpio = devm_gpiod_get(chip->dev, "enable", - GPIOD_OUT_HIGH); + chip->enable_gpio = devm_gpiod_get(dev, "enable", GPIOD_OUT_HIGH); if (IS_ERR(chip->enable_gpio)) - return dev_err_probe(chip->dev, - PTR_ERR(chip->enable_gpio), + return dev_err_probe(dev, PTR_ERR(chip->enable_gpio), "error getting enable gpio\n"); } else { /* * PWM control mode: check for brightness level in DT */ - prop_levels = of_find_property(node, "brightness-levels", - &length); - if (prop_levels) { + if (device_property_present(dev, "brightness-levels")) { /* Read brightness levels from DT */ - num_levels = length / sizeof(u32); + num_levels = device_property_count_u32(dev, "brightness-levels"); if (num_levels < 2) return -EINVAL; } else { @@ -271,14 +263,12 @@ static int pm3309c_parse_dt_node(struct mp3309c_chip *chip, } /* Fill brightness levels array */ - pdata->levels = devm_kcalloc(chip->dev, num_levels, - sizeof(*pdata->levels), GFP_KERNEL); + pdata->levels = devm_kcalloc(dev, num_levels, sizeof(*pdata->levels), GFP_KERNEL); if (!pdata->levels) return -ENOMEM; - if (prop_levels) { - ret = of_property_read_u32_array(node, "brightness-levels", - pdata->levels, - num_levels); + if (device_property_present(dev, "brightness-levels")) { + ret = device_property_read_u32_array(dev, "brightness-levels", + pdata->levels, num_levels); if (ret < 0) return ret; } else { @@ -288,13 +278,11 @@ static int pm3309c_parse_dt_node(struct mp3309c_chip *chip, pdata->max_brightness = num_levels - 1; - ret = of_property_read_u32(node, "default-brightness", - &pdata->default_brightness); + ret = device_property_read_u32(dev, "default-brightness", &pdata->default_brightness); if (ret) pdata->default_brightness = pdata->max_brightness; if (pdata->default_brightness > pdata->max_brightness) { - dev_err(chip->dev, - "default brightness exceeds max brightness\n"); + dev_err_probe(dev, -ERANGE, "default brightness exceeds max brightness\n"); pdata->default_brightness = pdata->max_brightness; } @@ -310,8 +298,8 @@ static int pm3309c_parse_dt_node(struct mp3309c_chip *chip, * If missing, the default value for OVP is 35.5V */ pdata->over_voltage_protection = REG_I2C_1_OVP1; - if (!of_property_read_u32(node, "mps,overvoltage-protection-microvolt", - &tmp_value)) { + ret = device_property_read_u32(dev, "mps,overvoltage-protection-microvolt", &tmp_value); + if (!ret) { switch (tmp_value) { case 13500000: pdata->over_voltage_protection = 0x00; @@ -328,62 +316,59 @@ static int pm3309c_parse_dt_node(struct mp3309c_chip *chip, } /* Synchronous (default) and non-synchronous mode */ - pdata->sync_mode = true; - if (of_property_read_bool(node, "mps,no-sync-mode")) - pdata->sync_mode = false; + pdata->sync_mode = !device_property_read_bool(dev, "mps,no-sync-mode"); return 0; } static int mp3309c_probe(struct i2c_client *client) { - struct mp3309c_platform_data *pdata = dev_get_platdata(&client->dev); + struct device *dev = &client->dev; + struct mp3309c_platform_data *pdata = dev_get_platdata(dev); struct mp3309c_chip *chip; struct backlight_properties props; struct pwm_state pwmstate; int ret; - if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { - dev_err(&client->dev, "failed to check i2c functionality\n"); - return -EOPNOTSUPP; - } + if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) + return dev_err_probe(dev, -EOPNOTSUPP, "failed to check i2c functionality\n"); - chip = devm_kzalloc(&client->dev, sizeof(*chip), GFP_KERNEL); + chip = devm_kzalloc(dev, sizeof(*chip), GFP_KERNEL); if (!chip) return -ENOMEM; - chip->dev = &client->dev; + chip->dev = dev; chip->regmap = devm_regmap_init_i2c(client, &mp3309c_regmap); if (IS_ERR(chip->regmap)) - return dev_err_probe(&client->dev, PTR_ERR(chip->regmap), + return dev_err_probe(dev, PTR_ERR(chip->regmap), "failed to allocate register map\n"); i2c_set_clientdata(client, chip); if (!pdata) { - pdata = devm_kzalloc(chip->dev, sizeof(*pdata), GFP_KERNEL); + pdata = devm_kzalloc(dev, sizeof(*pdata), GFP_KERNEL); if (!pdata) return -ENOMEM; - ret = pm3309c_parse_dt_node(chip, pdata); + ret = mp3309c_parse_fwnode(chip, pdata); if (ret) return ret; } chip->pdata = pdata; /* Backlight properties */ + memset(&props, 0, sizeof(struct backlight_properties)); props.brightness = pdata->default_brightness; props.max_brightness = pdata->max_brightness; props.scale = BACKLIGHT_SCALE_LINEAR; props.type = BACKLIGHT_RAW; props.power = FB_BLANK_UNBLANK; props.fb_blank = FB_BLANK_UNBLANK; - chip->bl = devm_backlight_device_register(chip->dev, "mp3309c", - chip->dev, chip, + chip->bl = devm_backlight_device_register(dev, "mp3309c", dev, chip, &mp3309c_bl_ops, &props); if (IS_ERR(chip->bl)) - return dev_err_probe(chip->dev, PTR_ERR(chip->bl), + return dev_err_probe(dev, PTR_ERR(chip->bl), "error registering backlight device\n"); /* In PWM dimming mode, enable pwm device */ @@ -393,10 +378,9 @@ static int mp3309c_probe(struct i2c_client *client) chip->pdata->default_brightness, chip->pdata->max_brightness); pwmstate.enabled = true; - ret = pwm_apply_state(chip->pwmd, &pwmstate); + ret = pwm_apply_might_sleep(chip->pwmd, &pwmstate); if (ret) - return dev_err_probe(chip->dev, ret, - "error setting pwm device\n"); + return dev_err_probe(dev, ret, "error setting pwm device\n"); } chip->pdata->status = FIRST_POWER_ON; |