Lines Matching refs:lpg

74 struct lpg {  struct
126 struct lpg *lpg; member
170 struct lpg *lpg; member
209 static int triled_set(struct lpg *lpg, unsigned int mask, unsigned int enable) in triled_set() argument
212 if (!lpg->triled_base) in triled_set()
215 return regmap_update_bits(lpg->map, lpg->triled_base + TRI_LED_EN_CTL, in triled_set()
219 static int lpg_lut_store(struct lpg *lpg, struct led_pattern *pattern, in lpg_lut_store() argument
226 idx = bitmap_find_next_zero_area(lpg->lut_bitmap, lpg->lut_size, in lpg_lut_store()
228 if (idx >= lpg->lut_size) in lpg_lut_store()
234 regmap_bulk_write(lpg->map, lpg->lut_base + LPG_LUT_REG(idx + i), in lpg_lut_store()
238 bitmap_set(lpg->lut_bitmap, idx, len); in lpg_lut_store()
246 static void lpg_lut_free(struct lpg *lpg, unsigned int lo_idx, unsigned int hi_idx) in lpg_lut_free() argument
254 bitmap_clear(lpg->lut_bitmap, lo_idx, len); in lpg_lut_free()
257 static int lpg_lut_sync(struct lpg *lpg, unsigned int mask) in lpg_lut_sync() argument
259 return regmap_write(lpg->map, lpg->lut_base + RAMP_CONTROL_REG, mask); in lpg_lut_sync()
398 struct lpg *lpg = chan->lpg; in lpg_apply_freq() local
422 regmap_write(lpg->map, chan->base + LPG_SIZE_CLK_REG, val); in lpg_apply_freq()
426 regmap_write(lpg->map, chan->base + LPG_PREDIV_CLK_REG, val); in lpg_apply_freq()
433 struct lpg *lpg = chan->lpg; in lpg_enable_glitch() local
435 regmap_update_bits(lpg->map, chan->base + PWM_TYPE_CONFIG_REG, in lpg_enable_glitch()
441 struct lpg *lpg = chan->lpg; in lpg_disable_glitch() local
443 regmap_update_bits(lpg->map, chan->base + PWM_TYPE_CONFIG_REG, in lpg_disable_glitch()
450 struct lpg *lpg = chan->lpg; in lpg_apply_pwm_value() local
456 regmap_bulk_write(lpg->map, chan->base + PWM_VALUE_REG, &val, sizeof(val)); in lpg_apply_pwm_value()
467 struct lpg *lpg = chan->lpg; in lpg_apply_lut_control() local
492 regmap_write(lpg->map, chan->base + LPG_PATTERN_CONFIG_REG, conf); in lpg_apply_lut_control()
493 regmap_write(lpg->map, chan->base + LPG_HI_IDX_REG, hi_idx); in lpg_apply_lut_control()
494 regmap_write(lpg->map, chan->base + LPG_LO_IDX_REG, lo_idx); in lpg_apply_lut_control()
496 regmap_bulk_write(lpg->map, chan->base + LPG_RAMP_DURATION_REG, &step, sizeof(step)); in lpg_apply_lut_control()
497 regmap_write(lpg->map, chan->base + LPG_HI_PAUSE_REG, hi_pause); in lpg_apply_lut_control()
498 regmap_write(lpg->map, chan->base + LPG_LO_PAUSE_REG, lo_pause); in lpg_apply_lut_control()
509 struct lpg *lpg = chan->lpg; in lpg_apply_control() local
521 regmap_write(lpg->map, chan->base + PWM_ENABLE_CONTROL_REG, ctrl); in lpg_apply_control()
535 struct lpg *lpg = chan->lpg; in lpg_apply_sync() local
537 regmap_write(lpg->map, chan->base + PWM_SYNC_REG, LPG_SYNC_PWM); in lpg_apply_sync()
540 static int lpg_parse_dtest(struct lpg *lpg) in lpg_parse_dtest() argument
543 struct device_node *np = lpg->dev->of_node; in lpg_parse_dtest()
554 } else if (count != lpg->data->num_channels * 2) { in lpg_parse_dtest()
555 dev_err(lpg->dev, "qcom,dtest needs to be %d items\n", in lpg_parse_dtest()
556 lpg->data->num_channels * 2); in lpg_parse_dtest()
560 for (i = 0; i < lpg->data->num_channels; i++) { in lpg_parse_dtest()
561 chan = &lpg->channels[i]; in lpg_parse_dtest()
577 dev_err(lpg->dev, "malformed qcom,dtest\n"); in lpg_parse_dtest()
583 struct lpg *lpg = chan->lpg; in lpg_apply_dtest() local
588 regmap_write(lpg->map, chan->base + PWM_SEC_ACCESS_REG, 0xa5); in lpg_apply_dtest()
589 regmap_write(lpg->map, chan->base + PWM_DTEST_REG(chan->dtest_line), in lpg_apply_dtest()
613 struct lpg *lpg = led->lpg; in lpg_brightness_set() local
649 triled_set(lpg, triled_mask, triled_enabled); in lpg_brightness_set()
653 lpg_lut_sync(lpg, lut_mask); in lpg_brightness_set()
662 mutex_lock(&led->lpg->lock); in lpg_brightness_single_set()
667 mutex_unlock(&led->lpg->lock); in lpg_brightness_single_set()
678 mutex_lock(&led->lpg->lock); in lpg_brightness_mc_set()
683 mutex_unlock(&led->lpg->lock); in lpg_brightness_mc_set()
694 struct lpg *lpg = led->lpg; in lpg_blink_set() local
721 triled_set(lpg, triled_mask, triled_mask); in lpg_blink_set()
737 mutex_lock(&led->lpg->lock); in lpg_blink_single_set()
741 mutex_unlock(&led->lpg->lock); in lpg_blink_single_set()
753 mutex_lock(&led->lpg->lock); in lpg_blink_mc_set()
757 mutex_unlock(&led->lpg->lock); in lpg_blink_mc_set()
766 struct lpg *lpg = led->lpg; in lpg_pattern_set() local
882 mutex_lock(&lpg->lock); in lpg_pattern_set()
883 ret = lpg_lut_store(lpg, pattern, actual_len, &lo_idx, &hi_idx); in lpg_pattern_set()
902 mutex_unlock(&lpg->lock); in lpg_pattern_set()
946 struct lpg *lpg = led->lpg; in lpg_pattern_clear() local
949 mutex_lock(&lpg->lock); in lpg_pattern_clear()
952 lpg_lut_free(lpg, chan->pattern_lo_idx, chan->pattern_hi_idx); in lpg_pattern_clear()
960 mutex_unlock(&lpg->lock); in lpg_pattern_clear()
982 struct lpg *lpg = container_of(chip, struct lpg, pwm); in lpg_pwm_request() local
983 struct lpg_channel *chan = &lpg->channels[pwm->hwpwm]; in lpg_pwm_request()
998 struct lpg *lpg = container_of(chip, struct lpg, pwm); in lpg_pwm_apply() local
999 struct lpg_channel *chan = &lpg->channels[pwm->hwpwm]; in lpg_pwm_apply()
1005 mutex_lock(&lpg->lock); in lpg_pwm_apply()
1018 triled_set(lpg, chan->triled_mask, chan->enabled ? chan->triled_mask : 0); in lpg_pwm_apply()
1021 mutex_unlock(&lpg->lock); in lpg_pwm_apply()
1029 struct lpg *lpg = container_of(chip, struct lpg, pwm); in lpg_pwm_get_state() local
1030 struct lpg_channel *chan = &lpg->channels[pwm->hwpwm]; in lpg_pwm_get_state()
1039 ret = regmap_read(lpg->map, chan->base + LPG_SIZE_CLK_REG, &val); in lpg_pwm_get_state()
1052 ret = regmap_read(lpg->map, chan->base + LPG_PREDIV_CLK_REG, &val); in lpg_pwm_get_state()
1059 ret = regmap_bulk_read(lpg->map, chan->base + PWM_VALUE_REG, &pwm_value, sizeof(pwm_value)); in lpg_pwm_get_state()
1071 ret = regmap_read(lpg->map, chan->base + PWM_ENABLE_CONTROL_REG, &val); in lpg_pwm_get_state()
1091 static int lpg_add_pwm(struct lpg *lpg) in lpg_add_pwm() argument
1095 lpg->pwm.dev = lpg->dev; in lpg_add_pwm()
1096 lpg->pwm.npwm = lpg->num_channels; in lpg_add_pwm()
1097 lpg->pwm.ops = &lpg_pwm_ops; in lpg_add_pwm()
1099 ret = pwmchip_add(&lpg->pwm); in lpg_add_pwm()
1101 dev_err(lpg->dev, "failed to add PWM chip: ret %d\n", ret); in lpg_add_pwm()
1106 static int lpg_parse_channel(struct lpg *lpg, struct device_node *np, in lpg_parse_channel() argument
1115 if (ret || !reg || reg > lpg->num_channels) { in lpg_parse_channel()
1116 dev_err(lpg->dev, "invalid \"reg\" of %pOFn\n", np); in lpg_parse_channel()
1120 chan = &lpg->channels[reg - 1]; in lpg_parse_channel()
1125 dev_err(lpg->dev, "failed to parse \"color\" of %pOF\n", np); in lpg_parse_channel()
1136 static int lpg_add_led(struct lpg *lpg, struct device_node *np) in lpg_add_led() argument
1151 dev_err(lpg->dev, "failed to parse \"color\" of %pOF\n", np); in lpg_add_led()
1160 led = devm_kzalloc(lpg->dev, struct_size(led, channels, num_channels), GFP_KERNEL); in lpg_add_led()
1164 led->lpg = lpg; in lpg_add_led()
1168 info = devm_kcalloc(lpg->dev, num_channels, sizeof(*info), GFP_KERNEL); in lpg_add_led()
1173 ret = lpg_parse_channel(lpg, child, &led->channels[i]); in lpg_add_led()
1192 if (lpg->lut_base) { in lpg_add_led()
1197 ret = lpg_parse_channel(lpg, np, &led->channels[0]); in lpg_add_led()
1206 if (lpg->lut_base) { in lpg_add_led()
1226 ret = devm_led_classdev_multicolor_register_ext(lpg->dev, &led->mcdev, &init_data); in lpg_add_led()
1228 ret = devm_led_classdev_register_ext(lpg->dev, &led->cdev, &init_data); in lpg_add_led()
1230 dev_err(lpg->dev, "unable to register %s\n", cdev->name); in lpg_add_led()
1235 static int lpg_init_channels(struct lpg *lpg) in lpg_init_channels() argument
1237 const struct lpg_data *data = lpg->data; in lpg_init_channels()
1241 lpg->num_channels = data->num_channels; in lpg_init_channels()
1242 lpg->channels = devm_kcalloc(lpg->dev, data->num_channels, in lpg_init_channels()
1244 if (!lpg->channels) in lpg_init_channels()
1248 chan = &lpg->channels[i]; in lpg_init_channels()
1250 chan->lpg = lpg; in lpg_init_channels()
1255 regmap_read(lpg->map, chan->base + LPG_SUBTYPE_REG, &chan->subtype); in lpg_init_channels()
1261 static int lpg_init_triled(struct lpg *lpg) in lpg_init_triled() argument
1263 struct device_node *np = lpg->dev->of_node; in lpg_init_triled()
1267 if (!lpg->data->triled_base) in lpg_init_triled()
1270 lpg->triled_base = lpg->data->triled_base; in lpg_init_triled()
1271 lpg->triled_has_atc_ctl = lpg->data->triled_has_atc_ctl; in lpg_init_triled()
1272 lpg->triled_has_src_sel = lpg->data->triled_has_src_sel; in lpg_init_triled()
1274 if (lpg->triled_has_src_sel) { in lpg_init_triled()
1275 ret = of_property_read_u32(np, "qcom,power-source", &lpg->triled_src); in lpg_init_triled()
1276 if (ret || lpg->triled_src == 2 || lpg->triled_src > 3) { in lpg_init_triled()
1277 dev_err(lpg->dev, "invalid power source\n"); in lpg_init_triled()
1283 if (lpg->triled_has_atc_ctl) in lpg_init_triled()
1284 regmap_write(lpg->map, lpg->triled_base + TRI_LED_ATC_CTL, 0); in lpg_init_triled()
1287 if (lpg->triled_has_src_sel) in lpg_init_triled()
1288 regmap_write(lpg->map, lpg->triled_base + TRI_LED_SRC_SEL, lpg->triled_src); in lpg_init_triled()
1291 regmap_write(lpg->map, lpg->triled_base + TRI_LED_EN_CTL, 0); in lpg_init_triled()
1296 static int lpg_init_lut(struct lpg *lpg) in lpg_init_lut() argument
1298 const struct lpg_data *data = lpg->data; in lpg_init_lut()
1303 lpg->lut_base = data->lut_base; in lpg_init_lut()
1304 lpg->lut_size = data->lut_size; in lpg_init_lut()
1306 lpg->lut_bitmap = devm_bitmap_zalloc(lpg->dev, lpg->lut_size, GFP_KERNEL); in lpg_init_lut()
1307 if (!lpg->lut_bitmap) in lpg_init_lut()
1316 struct lpg *lpg; in lpg_probe() local
1320 lpg = devm_kzalloc(&pdev->dev, sizeof(*lpg), GFP_KERNEL); in lpg_probe()
1321 if (!lpg) in lpg_probe()
1324 lpg->data = of_device_get_match_data(&pdev->dev); in lpg_probe()
1325 if (!lpg->data) in lpg_probe()
1328 platform_set_drvdata(pdev, lpg); in lpg_probe()
1330 lpg->dev = &pdev->dev; in lpg_probe()
1331 mutex_init(&lpg->lock); in lpg_probe()
1333 lpg->map = dev_get_regmap(pdev->dev.parent, NULL); in lpg_probe()
1334 if (!lpg->map) in lpg_probe()
1337 ret = lpg_init_channels(lpg); in lpg_probe()
1341 ret = lpg_parse_dtest(lpg); in lpg_probe()
1345 ret = lpg_init_triled(lpg); in lpg_probe()
1349 ret = lpg_init_lut(lpg); in lpg_probe()
1354 ret = lpg_add_led(lpg, np); in lpg_probe()
1361 for (i = 0; i < lpg->num_channels; i++) in lpg_probe()
1362 lpg_apply_dtest(&lpg->channels[i]); in lpg_probe()
1364 return lpg_add_pwm(lpg); in lpg_probe()
1369 struct lpg *lpg = platform_get_drvdata(pdev); in lpg_remove() local
1371 pwmchip_remove(&lpg->pwm); in lpg_remove()