Skip to content

Commit 6fdbe7d

Browse files
singhomeleeasus-leslieyu
authored andcommitted
mipi-dsi: rpi: use backlight device to control pwm of mcu.
After applying this commit, suspend/resume process will disabling/enabling backlight. Change-Id: I4b6170b23c246af2cab11c456447bf1bea8ecf1a
1 parent 73b508b commit 6fdbe7d

File tree

4 files changed

+90
-34
lines changed

4 files changed

+90
-34
lines changed

drivers/gpu/drm/panel/panel-asus-ili9881c.c

Lines changed: 33 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -597,26 +597,25 @@ static int ili9881c_enable(struct drm_panel *panel)
597597
msleep(120);
598598

599599
//backlight_enable(ctx->backlight);
600-
601-
#if 0
602-
if (!powering_on) {
603-
tinker_mcu_ili9881c_set_bright(0x9f);
604-
msleep(10);
605-
powering_on = 1;
606-
}
607-
608-
tinker_mcu_ili9881c_set_bright(0x9f);
609-
#else
610-
ctx->backlight->props.power = FB_BLANK_UNBLANK;
611-
if (!powering_on) {
612-
ctx->backlight->props.brightness = 50;
600+
if (ctx->backlight) {
601+
ctx->backlight->props.power = FB_BLANK_UNBLANK;
602+
if (!powering_on) {
603+
ctx->backlight->props.brightness = 50;
604+
backlight_update_status(ctx->backlight);
605+
msleep(10);
606+
powering_on = 1;
607+
ctx->backlight->props.brightness = 255;
608+
}
613609
backlight_update_status(ctx->backlight);
614-
msleep(10);
615-
powering_on = 1;
616-
ctx->backlight->props.brightness = 255;
610+
} else {
611+
if (!powering_on) {
612+
tinker_mcu_ili9881c_set_bright(0x1A);
613+
msleep(10);
614+
powering_on = 1;
615+
}
616+
tinker_mcu_ili9881c_set_bright(0x1F);
617617
}
618-
backlight_update_status(ctx->backlight);
619-
#endif
618+
620619

621620
enable = 1;
622621

@@ -630,9 +629,13 @@ static int ili9881c_disable(struct drm_panel *panel)
630629
enable = 0;
631630
pr_info("%s\n", __func__);
632631
//backlight_disable(ctx->backlight);
633-
//tinker_mcu_ili9881c_set_bright(0x00);
634-
ctx->backlight->props.power = FB_BLANK_POWERDOWN;
635-
backlight_update_status(ctx->backlight);
632+
633+
if (ctx->backlight) {
634+
ctx->backlight->props.power = FB_BLANK_POWERDOWN;
635+
backlight_update_status(ctx->backlight);
636+
} else {
637+
tinker_mcu_ili9881c_set_bright(0x00);
638+
}
636639

637640
return 0;
638641
}
@@ -747,9 +750,16 @@ int ili9881c_dsi_probe(struct mipi_dsi_device *dsi)
747750
ctx->backlight = tinker_mcu_ili9881c_get_backlightdev();
748751
if (!ctx->backlight) {
749752
printk("ili9881c_dsi_probe get backlight fail\n");
750-
return -ENODEV;
753+
//return -ENODEV;
754+
/* avoid if there is no mipi-panel case, dw_mipi_dsi_bind() will return EPROBE_DEFER
755+
to trigger deferred_probe_work_func() continue init panel driver
756+
untile panel init successful.
757+
SO, we CAN NOT return error.
758+
*/
759+
} else {
760+
printk("t ili9881c_dsi_probe get backligh device successful\n");
761+
ctx->backlight->props.brightness = 255;
751762
}
752-
ctx->backlight->props.brightness = 255;
753763

754764
ctx->dsi = dsi;
755765
drm_panel_init(&ctx->panel);

drivers/miniarm/dsi/panel-toshiba-tc358762.c

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -194,11 +194,12 @@ static int tc358762_disable(struct drm_panel *panel)
194194

195195
printk("panel disable\n");
196196

197-
tinker_mcu_set_bright(0x00);
198-
199197
if (p->backlight) {
200198
p->backlight->props.power = FB_BLANK_POWERDOWN;
201199
backlight_update_status(p->backlight);
200+
} else {
201+
printk("panel disable: no backlight device\n");
202+
tinker_mcu_set_bright(0x00);
202203
}
203204

204205
if (p->desc && p->desc->delay.disable)
@@ -295,6 +296,7 @@ static int tc358762_prepare(struct drm_panel *panel)
295296
return 0;
296297
}
297298

299+
extern struct backlight_device * tinker_mcu_get_backlightdev(void);
298300
extern void tinker_mcu_screen_power_up(void);
299301
extern void tinker_ft5406_start_polling(void);
300302
static int tc358762_enable(struct drm_panel *panel)
@@ -322,10 +324,11 @@ static int tc358762_enable(struct drm_panel *panel)
322324
if (p->backlight) {
323325
p->backlight->props.power = FB_BLANK_UNBLANK;
324326
backlight_update_status(p->backlight);
327+
} else {
328+
printk("panel enable: no backlight device\n");
329+
tinker_mcu_set_bright(0xFF);
325330
}
326331

327-
tinker_mcu_set_bright(0xFF);
328-
329332
p->enabled = true;
330333

331334
return 0;
@@ -420,6 +423,15 @@ static int tc358762_mipi_probe(struct mipi_dsi_device *dsi, const struct panel_d
420423

421424
if (!panel->backlight)
422425
return -EPROBE_DEFER;
426+
} else {
427+
panel->backlight = tinker_mcu_get_backlightdev();
428+
if (!panel->backlight) {
429+
printk("tc358762_mipi_probe get backlight fail\n");
430+
//return -ENODEV;
431+
} else {
432+
panel->backlight->props.brightness = 255;
433+
printk("tc358762_mipi_probe get backligh device successful\n");
434+
}
423435
}
424436

425437
ddc = of_parse_phandle(dev->of_node, "ddc-i2c-bus", 0);
@@ -567,6 +579,7 @@ int tc358762_dsi_probe(struct mipi_dsi_device *dsi)
567579

568580
if (!of_property_read_u32(dsi->dev.of_node, "dsi,lanes", &val))
569581
dsi->lanes = val;
582+
570583
return mipi_dsi_attach(dsi);
571584
}
572585

drivers/misc/tinker_mcu.c

Lines changed: 37 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,15 @@
2424
#include <linux/workqueue.h>
2525
#include <linux/backlight.h>
2626
#include "tinker_mcu.h"
27+
#include <linux/fb.h>
2728

2829
#define BL_DEBUG 0
2930
static struct tinker_mcu_data *g_mcu_data;
3031
static int connected = 0;
3132
static int lcd_bright_level = 0;
33+
static struct backlight_device *bl = NULL;
34+
35+
#define MAX_BRIGHENESS (255)
3236

3337
static int is_hex(char num)
3438
{
@@ -178,10 +182,40 @@ static int tinker_mcu_bl_get_brightness(struct backlight_device *bd)
178182
return lcd_bright_level;
179183
}
180184

185+
int tinker_mcu_bl_update_status(struct backlight_device * bd)
186+
{
187+
int brightness = bd->props.brightness;
188+
189+
if (brightness > MAX_BRIGHENESS)
190+
brightness = MAX_BRIGHENESS;
191+
192+
if (brightness <= 0)
193+
brightness = 1;
194+
195+
if (bd->props.power != FB_BLANK_UNBLANK)
196+
brightness = 0;
197+
198+
if (bd->props.state & BL_CORE_SUSPENDED)
199+
brightness = 0;
200+
201+
LOG_INFO("tinker_mcu_bl_update_status brightness=%d power=%d fb_blank=%d state =%d bd->props.brightness=%d\n", brightness, bd->props.power, bd->props.fb_blank, bd->props.state , bd->props.brightness);
202+
return tinker_mcu_set_bright(brightness);
203+
}
204+
181205
static const struct backlight_ops tinker_mcu_bl_ops = {
182-
.get_brightness = tinker_mcu_bl_get_brightness,
206+
.get_brightness = tinker_mcu_bl_get_brightness,//actual_brightness_show
207+
.update_status = tinker_mcu_bl_update_status,
208+
.options = BL_CORE_SUSPENDRESUME,
183209
};
184210

211+
struct backlight_device * tinker_mcu_get_backlightdev(void)
212+
{
213+
if (!connected) {
214+
printk("tinker_mcu_get_backlightdev is not ready\n");
215+
return NULL;
216+
}
217+
return bl;
218+
}
185219

186220
static ssize_t tinker_mcu_bl_show(struct device *dev, struct device_attribute *attr, char *buf)
187221
{
@@ -196,7 +230,7 @@ static ssize_t tinker_mcu_bl_store(struct device *dev, struct device_attribute *
196230

197231
value = simple_strtoul(buf, NULL, 0);
198232

199-
if((value < 0) || (value > 255)) {
233+
if((value < 0) || (value > MAX_BRIGHENESS)) {
200234
LOG_ERR("Invalid value for backlight setting, value = %d\n", value);
201235
} else
202236
tinker_mcu_set_bright(value);
@@ -217,7 +251,6 @@ static int tinker_mcu_probe(struct i2c_client *client,
217251
struct tinker_mcu_data *mcu_data;
218252
int ret;
219253
struct backlight_properties props;
220-
struct backlight_device *bl;
221254

222255
LOG_INFO("address = 0x%x\n", client->addr);
223256

@@ -245,7 +278,7 @@ static int tinker_mcu_probe(struct i2c_client *client,
245278

246279
memset(&props, 0, sizeof(props));
247280
props.type = BACKLIGHT_RAW;
248-
props.max_brightness = 255;
281+
props.max_brightness = MAX_BRIGHENESS;
249282

250283
bl = backlight_device_register("panel_backlight", NULL, NULL,
251284
&tinker_mcu_bl_ops, &props);

drivers/misc/tinker_mcu_ili9881c.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ static struct tinker_mcu_data *g_mcu_ili9881c_data;
3131
static int connected = 0;
3232
static int lcd_bright_level = 0;
3333
int lcd_size_flag = 0;
34-
struct backlight_device *bl = NULL;;
34+
static struct backlight_device *bl = NULL;
3535

3636
#define MAX_MCU_ILI9881C_PWM_WORKAROUND (9)
3737
#define MAX_MCU_ILI9881C_PWM (31)
@@ -203,8 +203,8 @@ static int tinker_mcu_ili9881c_bl_get_brightness(struct backlight_device *bd)
203203

204204
if (brightness > MAX_BRIGHENESS)
205205
brightness = MAX_BRIGHENESS;
206-
if (brightness < 0)
207-
brightness = 0;
206+
if (brightness <= 0)
207+
brightness = 1;
208208

209209
if ( brightness > 0) {
210210
brightness *= 12;

0 commit comments

Comments
 (0)