/* Only all equal current values are supported */ if (pdata->su2_auto_curr1)
ret = regmap_write(as3711->regmap, AS3711_CURR1_VALUE,
brightness); if (!ret && pdata->su2_auto_curr2)
ret = regmap_write(as3711->regmap, AS3711_CURR2_VALUE,
brightness); if (!ret && pdata->su2_auto_curr3)
ret = regmap_write(as3711->regmap, AS3711_CURR3_VALUE,
brightness);
staticint as3711_bl_su2_reset(struct as3711_bl_supply *supply)
{ struct as3711 *as3711 = supply->as3711; int ret = regmap_update_bits(as3711->regmap, AS3711_STEPUP_CONTROL_5,
3, supply->pdata->su2_fbprot); if (!ret)
ret = regmap_update_bits(as3711->regmap,
AS3711_STEPUP_CONTROL_2, 1, 0); if (!ret)
ret = regmap_update_bits(as3711->regmap,
AS3711_STEPUP_CONTROL_2, 1, 1); return ret;
}
/* * Someone with less fragile or less expensive hardware could try to simplify * the brightness adjustment procedure.
*/ staticint as3711_bl_update_status(struct backlight_device *bl)
{ struct as3711_bl_data *data = bl_get_data(bl); struct as3711_bl_supply *supply = to_supply(data); struct as3711 *as3711 = supply->as3711; int brightness; int ret = 0;
brightness = backlight_get_brightness(bl);
if (data->type == AS3711_BL_SU1) {
ret = as3711_set_brightness_v(as3711, brightness,
AS3711_STEPUP_CONTROL_1);
} else { conststruct as3711_bl_pdata *pdata = supply->pdata;
switch (pdata->su2_feedback) { case AS3711_SU2_VOLTAGE:
ret = as3711_set_brightness_v(as3711, brightness,
AS3711_STEPUP_CONTROL_2); break; case AS3711_SU2_CURR_AUTO:
ret = as3711_set_brightness_auto_i(data, brightness / 4); if (ret < 0) return ret; if (brightness) {
ret = as3711_bl_su2_reset(supply); if (ret < 0) return ret;
udelay(500);
ret = as3711_set_brightness_auto_i(data, brightness);
} else {
ret = regmap_update_bits(as3711->regmap,
AS3711_STEPUP_CONTROL_2, 1, 0);
} break; /* Manual one current feedback pin below */ case AS3711_SU2_CURR1:
ret = regmap_write(as3711->regmap, AS3711_CURR1_VALUE,
brightness); break; case AS3711_SU2_CURR2:
ret = regmap_write(as3711->regmap, AS3711_CURR2_VALUE,
brightness); break; case AS3711_SU2_CURR3:
ret = regmap_write(as3711->regmap, AS3711_CURR3_VALUE,
brightness); break; default:
ret = -EINVAL;
}
} if (!ret)
data->brightness = brightness;
bl = of_get_child_by_name(dev->parent->of_node, "backlight"); if (!bl) {
dev_dbg(dev, "backlight node not found\n"); return -ENODEV;
}
fb = of_parse_phandle(bl, "su1-dev", 0); if (fb) {
of_node_put(fb);
pdata->su1_fb = true;
ret = of_property_read_u32(bl, "su1-max-uA", &pdata->su1_max_uA); if (pdata->su1_max_uA <= 0)
ret = -EINVAL; if (ret < 0) goto err_put_bl;
}
fb = of_parse_phandle(bl, "su2-dev", 0); if (fb) { int count = 0;
of_node_put(fb);
pdata->su2_fb = true;
ret = of_property_read_u32(bl, "su2-max-uA", &pdata->su2_max_uA); if (pdata->su2_max_uA <= 0)
ret = -EINVAL; if (ret < 0) goto err_put_bl;
if (of_property_read_bool(bl, "su2-feedback-voltage")) {
pdata->su2_feedback = AS3711_SU2_VOLTAGE;
count++;
} if (of_property_read_bool(bl, "su2-feedback-curr1")) {
pdata->su2_feedback = AS3711_SU2_CURR1;
count++;
} if (of_property_read_bool(bl, "su2-feedback-curr2")) {
pdata->su2_feedback = AS3711_SU2_CURR2;
count++;
} if (of_property_read_bool(bl, "su2-feedback-curr3")) {
pdata->su2_feedback = AS3711_SU2_CURR3;
count++;
} if (of_property_read_bool(bl, "su2-feedback-curr-auto")) {
pdata->su2_feedback = AS3711_SU2_CURR_AUTO;
count++;
} if (count != 1) {
ret = -EINVAL; goto err_put_bl;
}
count = 0; if (of_property_read_bool(bl, "su2-fbprot-lx-sd4")) {
pdata->su2_fbprot = AS3711_SU2_LX_SD4;
count++;
} if (of_property_read_bool(bl, "su2-fbprot-gpio2")) {
pdata->su2_fbprot = AS3711_SU2_GPIO2;
count++;
} if (of_property_read_bool(bl, "su2-fbprot-gpio3")) {
pdata->su2_fbprot = AS3711_SU2_GPIO3;
count++;
} if (of_property_read_bool(bl, "su2-fbprot-gpio4")) {
pdata->su2_fbprot = AS3711_SU2_GPIO4;
count++;
} if (count != 1) {
ret = -EINVAL; goto err_put_bl;
}
count = 0; if (of_property_read_bool(bl, "su2-auto-curr1")) {
pdata->su2_auto_curr1 = true;
count++;
} if (of_property_read_bool(bl, "su2-auto-curr2")) {
pdata->su2_auto_curr2 = true;
count++;
} if (of_property_read_bool(bl, "su2-auto-curr3")) {
pdata->su2_auto_curr3 = true;
count++;
}
/* * At least one su2-auto-curr* must be specified iff * AS3711_SU2_CURR_AUTO is used
*/ if (!count ^ (pdata->su2_feedback != AS3711_SU2_CURR_AUTO)) {
ret = -EINVAL; goto err_put_bl;
}
}
if (!pdata) {
dev_err(&pdev->dev, "No platform data, exiting...\n"); return -ENODEV;
}
if (pdev->dev.parent->of_node) {
ret = as3711_backlight_parse_dt(&pdev->dev); if (ret < 0) return dev_err_probe(&pdev->dev, ret, "DT parsing failed\n");
}
if (!pdata->su1_fb && !pdata->su2_fb) {
dev_err(&pdev->dev, "No framebuffer specified\n"); return -EINVAL;
}
/* * Due to possible hardware damage I chose to block all modes, * unsupported on my hardware. Anyone, wishing to use any of those modes * will have to first review the code, then activate and test it.
*/ if (pdata->su1_fb ||
pdata->su2_fbprot != AS3711_SU2_GPIO4 ||
pdata->su2_feedback != AS3711_SU2_CURR_AUTO) {
dev_warn(&pdev->dev, "Attention! An untested mode has been chosen!\n" "Please, review the code, enable, test, and report success:-)\n"); return -EINVAL;
}
supply = devm_kzalloc(&pdev->dev, sizeof(*supply), GFP_KERNEL); if (!supply) return -ENOMEM;
supply->as3711 = as3711;
supply->pdata = pdata;
if (pdata->su1_fb) {
su = &supply->su1;
su->type = AS3711_BL_SU1;
max_brightness = min(pdata->su1_max_uA, 31);
ret = as3711_bl_register(pdev, max_brightness, su); if (ret < 0) return ret;
}
if (pdata->su2_fb) {
su = &supply->su2;
su->type = AS3711_BL_SU2;
switch (pdata->su2_fbprot) { case AS3711_SU2_GPIO2: case AS3711_SU2_GPIO3: case AS3711_SU2_GPIO4: case AS3711_SU2_LX_SD4: break; default: return -EINVAL;
}
switch (pdata->su2_feedback) { case AS3711_SU2_VOLTAGE:
max_brightness = min(pdata->su2_max_uA, 31); break; case AS3711_SU2_CURR1: case AS3711_SU2_CURR2: case AS3711_SU2_CURR3: case AS3711_SU2_CURR_AUTO:
max_brightness = min(pdata->su2_max_uA / 150, 255); break; default: return -EINVAL;
}
ret = as3711_bl_init_su2(supply); if (ret < 0) return ret;
ret = as3711_bl_register(pdev, max_brightness, su); if (ret < 0) return ret;
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.