Lines Matching +full:pwm +full:- +full:enable
1 // SPDX-License-Identifier: GPL-2.0-only
16 #include <linux/pwm.h>
39 #define DEFAULT_BL_NAME "lcd-backlight"
72 struct pwm_device *pwm; member
74 struct regulator *enable; /* regulator for EN/VDDIO input */ member
79 return i2c_smbus_write_byte_data(lp->client, reg, data); in lp855x_write_byte()
87 ret = i2c_smbus_read_byte_data(lp->client, reg); in lp855x_update_bit()
89 dev_err(lp->dev, "failed to read 0x%.2x\n", reg); in lp855x_update_bit()
104 switch (lp->chip_id) { in lp855x_is_valid_rom_area()
171 struct lp855x_platform_data *pd = lp->pdata; in lp855x_configure()
173 switch (lp->chip_id) { in lp855x_configure()
179 lp->cfg = &lp855x_dev_cfg; in lp855x_configure()
183 lp->cfg = &lp8557_dev_cfg; in lp855x_configure()
186 return -EINVAL; in lp855x_configure()
189 if (lp->cfg->pre_init_device) { in lp855x_configure()
190 ret = lp->cfg->pre_init_device(lp); in lp855x_configure()
192 dev_err(lp->dev, "pre init device err: %d\n", ret); in lp855x_configure()
197 val = pd->initial_brightness; in lp855x_configure()
198 ret = lp855x_write_byte(lp, lp->cfg->reg_brightness, val); in lp855x_configure()
202 val = pd->device_control; in lp855x_configure()
203 ret = lp855x_write_byte(lp, lp->cfg->reg_devicectrl, val); in lp855x_configure()
207 if (pd->size_program > 0) { in lp855x_configure()
208 for (i = 0; i < pd->size_program; i++) { in lp855x_configure()
209 addr = pd->rom_data[i].addr; in lp855x_configure()
210 val = pd->rom_data[i].val; in lp855x_configure()
220 if (lp->cfg->post_init_device) { in lp855x_configure()
221 ret = lp->cfg->post_init_device(lp); in lp855x_configure()
223 dev_err(lp->dev, "post init device err: %d\n", ret); in lp855x_configure()
236 unsigned int period = lp->pdata->period_ns; in lp855x_pwm_ctrl()
238 struct pwm_device *pwm; in lp855x_pwm_ctrl() local
240 /* request pwm device with the consumer name */ in lp855x_pwm_ctrl()
241 if (!lp->pwm) { in lp855x_pwm_ctrl()
242 pwm = devm_pwm_get(lp->dev, lp->chipname); in lp855x_pwm_ctrl()
243 if (IS_ERR(pwm)) in lp855x_pwm_ctrl()
246 lp->pwm = pwm; in lp855x_pwm_ctrl()
250 * the atomic PWM API. in lp855x_pwm_ctrl()
252 pwm_apply_args(pwm); in lp855x_pwm_ctrl()
255 pwm_config(lp->pwm, duty, period); in lp855x_pwm_ctrl()
257 pwm_enable(lp->pwm); in lp855x_pwm_ctrl()
259 pwm_disable(lp->pwm); in lp855x_pwm_ctrl()
265 int brightness = bl->props.brightness; in lp855x_bl_update_status()
267 if (bl->props.state & (BL_CORE_SUSPENDED | BL_CORE_FBBLANK)) in lp855x_bl_update_status()
270 if (lp->mode == PWM_BASED) in lp855x_bl_update_status()
271 lp855x_pwm_ctrl(lp, brightness, bl->props.max_brightness); in lp855x_bl_update_status()
272 else if (lp->mode == REGISTER_BASED) in lp855x_bl_update_status()
273 lp855x_write_byte(lp, lp->cfg->reg_brightness, (u8)brightness); in lp855x_bl_update_status()
287 struct lp855x_platform_data *pdata = lp->pdata; in lp855x_backlight_register()
288 const char *name = pdata->name ? : DEFAULT_BL_NAME; in lp855x_backlight_register()
294 if (pdata->initial_brightness > props.max_brightness) in lp855x_backlight_register()
295 pdata->initial_brightness = props.max_brightness; in lp855x_backlight_register()
297 props.brightness = pdata->initial_brightness; in lp855x_backlight_register()
299 bl = devm_backlight_device_register(lp->dev, name, lp->dev, lp, in lp855x_backlight_register()
304 lp->bl = bl; in lp855x_backlight_register()
314 return scnprintf(buf, PAGE_SIZE, "%s\n", lp->chipname); in lp855x_get_chip_id()
323 if (lp->mode == PWM_BASED) in lp855x_get_bl_ctl_mode()
324 strmode = "pwm based"; in lp855x_get_bl_ctl_mode()
325 else if (lp->mode == REGISTER_BASED) in lp855x_get_bl_ctl_mode()
347 struct device *dev = lp->dev; in lp855x_parse_dt()
348 struct device_node *node = dev->of_node; in lp855x_parse_dt()
354 return -EINVAL; in lp855x_parse_dt()
359 return -ENOMEM; in lp855x_parse_dt()
361 of_property_read_string(node, "bl-name", &pdata->name); in lp855x_parse_dt()
362 of_property_read_u8(node, "dev-ctrl", &pdata->device_control); in lp855x_parse_dt()
363 of_property_read_u8(node, "init-brt", &pdata->initial_brightness); in lp855x_parse_dt()
364 of_property_read_u32(node, "pwm-period", &pdata->period_ns); in lp855x_parse_dt()
375 return -ENOMEM; in lp855x_parse_dt()
378 of_property_read_u8(child, "rom-addr", &rom[i].addr); in lp855x_parse_dt()
379 of_property_read_u8(child, "rom-val", &rom[i].val); in lp855x_parse_dt()
383 pdata->size_program = rom_length; in lp855x_parse_dt()
384 pdata->rom_data = &rom[0]; in lp855x_parse_dt()
387 lp->pdata = pdata; in lp855x_parse_dt()
394 return -EINVAL; in lp855x_parse_dt()
403 if (!i2c_check_functionality(cl->adapter, I2C_FUNC_SMBUS_I2C_BLOCK)) in lp855x_probe()
404 return -EIO; in lp855x_probe()
406 lp = devm_kzalloc(&cl->dev, sizeof(struct lp855x), GFP_KERNEL); in lp855x_probe()
408 return -ENOMEM; in lp855x_probe()
410 lp->client = cl; in lp855x_probe()
411 lp->dev = &cl->dev; in lp855x_probe()
412 lp->chipname = id->name; in lp855x_probe()
413 lp->chip_id = id->driver_data; in lp855x_probe()
414 lp->pdata = dev_get_platdata(&cl->dev); in lp855x_probe()
416 if (!lp->pdata) { in lp855x_probe()
422 if (lp->pdata->period_ns > 0) in lp855x_probe()
423 lp->mode = PWM_BASED; in lp855x_probe()
425 lp->mode = REGISTER_BASED; in lp855x_probe()
427 lp->supply = devm_regulator_get(lp->dev, "power"); in lp855x_probe()
428 if (IS_ERR(lp->supply)) { in lp855x_probe()
429 if (PTR_ERR(lp->supply) == -EPROBE_DEFER) in lp855x_probe()
430 return -EPROBE_DEFER; in lp855x_probe()
431 lp->supply = NULL; in lp855x_probe()
434 lp->enable = devm_regulator_get_optional(lp->dev, "enable"); in lp855x_probe()
435 if (IS_ERR(lp->enable)) { in lp855x_probe()
436 ret = PTR_ERR(lp->enable); in lp855x_probe()
437 if (ret == -ENODEV) { in lp855x_probe()
438 lp->enable = NULL; in lp855x_probe()
440 if (ret != -EPROBE_DEFER) in lp855x_probe()
441 dev_err(lp->dev, "error getting enable regulator: %d\n", in lp855x_probe()
447 if (lp->supply) { in lp855x_probe()
448 ret = regulator_enable(lp->supply); in lp855x_probe()
450 dev_err(&cl->dev, "failed to enable supply: %d\n", ret); in lp855x_probe()
455 if (lp->enable) { in lp855x_probe()
456 ret = regulator_enable(lp->enable); in lp855x_probe()
458 dev_err(lp->dev, "failed to enable vddio: %d\n", ret); in lp855x_probe()
473 dev_err(lp->dev, "device config err: %d", ret); in lp855x_probe()
479 dev_err(lp->dev, in lp855x_probe()
484 ret = sysfs_create_group(&lp->dev->kobj, &lp855x_attr_group); in lp855x_probe()
486 dev_err(lp->dev, "failed to register sysfs. err: %d\n", ret); in lp855x_probe()
490 backlight_update_status(lp->bl); in lp855x_probe()
495 if (lp->enable) in lp855x_probe()
496 regulator_disable(lp->enable); in lp855x_probe()
498 if (lp->supply) in lp855x_probe()
499 regulator_disable(lp->supply); in lp855x_probe()
508 lp->bl->props.brightness = 0; in lp855x_remove()
509 backlight_update_status(lp->bl); in lp855x_remove()
510 if (lp->enable) in lp855x_remove()
511 regulator_disable(lp->enable); in lp855x_remove()
512 if (lp->supply) in lp855x_remove()
513 regulator_disable(lp->supply); in lp855x_remove()
514 sysfs_remove_group(&lp->dev->kobj, &lp855x_attr_group); in lp855x_remove()