Lines Matching refs:lpg

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