28
28
struct pwm_bl_data {
29
29
struct pwm_device * pwm ;
30
30
struct device * dev ;
31
- unsigned int period ;
32
31
unsigned int lth_brightness ;
33
32
unsigned int * levels ;
34
- bool enabled ;
35
33
struct regulator * power_supply ;
36
34
struct gpio_desc * enable_gpio ;
37
35
unsigned int scale ;
@@ -46,31 +44,35 @@ struct pwm_bl_data {
46
44
void (* exit )(struct device * );
47
45
};
48
46
49
- static void pwm_backlight_power_on (struct pwm_bl_data * pb , int brightness )
47
+ static void pwm_backlight_power_on (struct pwm_bl_data * pb )
50
48
{
49
+ struct pwm_state state ;
51
50
int err ;
52
51
53
- if (pb -> enabled )
52
+ pwm_get_state (pb -> pwm , & state );
53
+ if (state .enabled )
54
54
return ;
55
55
56
56
err = regulator_enable (pb -> power_supply );
57
57
if (err < 0 )
58
58
dev_err (pb -> dev , "failed to enable power supply\n" );
59
59
60
- pwm_enable (pb -> pwm );
60
+ state .enabled = true;
61
+ pwm_apply_state (pb -> pwm , & state );
61
62
62
63
if (pb -> post_pwm_on_delay )
63
64
msleep (pb -> post_pwm_on_delay );
64
65
65
66
if (pb -> enable_gpio )
66
67
gpiod_set_value_cansleep (pb -> enable_gpio , 1 );
67
-
68
- pb -> enabled = true;
69
68
}
70
69
71
70
static void pwm_backlight_power_off (struct pwm_bl_data * pb )
72
71
{
73
- if (!pb -> enabled )
72
+ struct pwm_state state ;
73
+
74
+ pwm_get_state (pb -> pwm , & state );
75
+ if (!state .enabled )
74
76
return ;
75
77
76
78
if (pb -> enable_gpio )
@@ -79,24 +81,27 @@ static void pwm_backlight_power_off(struct pwm_bl_data *pb)
79
81
if (pb -> pwm_off_delay )
80
82
msleep (pb -> pwm_off_delay );
81
83
82
- pwm_config (pb -> pwm , 0 , pb -> period );
83
- pwm_disable (pb -> pwm );
84
+ state .enabled = false;
85
+ state .duty_cycle = 0 ;
86
+ pwm_apply_state (pb -> pwm , & state );
84
87
85
88
regulator_disable (pb -> power_supply );
86
- pb -> enabled = false;
87
89
}
88
90
89
91
static int compute_duty_cycle (struct pwm_bl_data * pb , int brightness )
90
92
{
91
93
unsigned int lth = pb -> lth_brightness ;
94
+ struct pwm_state state ;
92
95
u64 duty_cycle ;
93
96
97
+ pwm_get_state (pb -> pwm , & state );
98
+
94
99
if (pb -> levels )
95
100
duty_cycle = pb -> levels [brightness ];
96
101
else
97
102
duty_cycle = brightness ;
98
103
99
- duty_cycle *= pb -> period - lth ;
104
+ duty_cycle *= state . period - lth ;
100
105
do_div (duty_cycle , pb -> scale );
101
106
102
107
return duty_cycle + lth ;
@@ -106,7 +111,7 @@ static int pwm_backlight_update_status(struct backlight_device *bl)
106
111
{
107
112
struct pwm_bl_data * pb = bl_get_data (bl );
108
113
int brightness = bl -> props .brightness ;
109
- int duty_cycle ;
114
+ struct pwm_state state ;
110
115
111
116
if (bl -> props .power != FB_BLANK_UNBLANK ||
112
117
bl -> props .fb_blank != FB_BLANK_UNBLANK ||
@@ -117,9 +122,10 @@ static int pwm_backlight_update_status(struct backlight_device *bl)
117
122
brightness = pb -> notify (pb -> dev , brightness );
118
123
119
124
if (brightness > 0 ) {
120
- duty_cycle = compute_duty_cycle (pb , brightness );
121
- pwm_config (pb -> pwm , duty_cycle , pb -> period );
122
- pwm_backlight_power_on (pb , brightness );
125
+ pwm_get_state (pb -> pwm , & state );
126
+ state .duty_cycle = compute_duty_cycle (pb , brightness );
127
+ pwm_apply_state (pb -> pwm , & state );
128
+ pwm_backlight_power_on (pb );
123
129
} else
124
130
pwm_backlight_power_off (pb );
125
131
@@ -447,7 +453,6 @@ static int pwm_backlight_probe(struct platform_device *pdev)
447
453
struct device_node * node = pdev -> dev .of_node ;
448
454
struct pwm_bl_data * pb ;
449
455
struct pwm_state state ;
450
- struct pwm_args pargs ;
451
456
unsigned int i ;
452
457
int ret ;
453
458
@@ -478,7 +483,6 @@ static int pwm_backlight_probe(struct platform_device *pdev)
478
483
pb -> check_fb = data -> check_fb ;
479
484
pb -> exit = data -> exit ;
480
485
pb -> dev = & pdev -> dev ;
481
- pb -> enabled = false;
482
486
pb -> post_pwm_on_delay = data -> post_pwm_on_delay ;
483
487
pb -> pwm_off_delay = data -> pwm_off_delay ;
484
488
@@ -539,10 +543,26 @@ static int pwm_backlight_probe(struct platform_device *pdev)
539
543
540
544
dev_dbg (& pdev -> dev , "got pwm for backlight\n" );
541
545
542
- if (!data -> levels ) {
543
- /* Get the PWM period (in nanoseconds) */
544
- pwm_get_state (pb -> pwm , & state );
546
+ /* Sync up PWM state. */
547
+ pwm_init_state (pb -> pwm , & state );
545
548
549
+ /*
550
+ * The DT case will set the pwm_period_ns field to 0 and store the
551
+ * period, parsed from the DT, in the PWM device. For the non-DT case,
552
+ * set the period from platform data if it has not already been set
553
+ * via the PWM lookup table.
554
+ */
555
+ if (!state .period && (data -> pwm_period_ns > 0 ))
556
+ state .period = data -> pwm_period_ns ;
557
+
558
+ ret = pwm_apply_state (pb -> pwm , & state );
559
+ if (ret ) {
560
+ dev_err (& pdev -> dev , "failed to apply initial PWM state: %d\n" ,
561
+ ret );
562
+ goto err_alloc ;
563
+ }
564
+
565
+ if (!data -> levels ) {
546
566
ret = pwm_backlight_brightness_default (& pdev -> dev , data ,
547
567
state .period );
548
568
if (ret < 0 ) {
@@ -559,24 +579,7 @@ static int pwm_backlight_probe(struct platform_device *pdev)
559
579
pb -> levels = data -> levels ;
560
580
}
561
581
562
- /*
563
- * FIXME: pwm_apply_args() should be removed when switching to
564
- * the atomic PWM API.
565
- */
566
- pwm_apply_args (pb -> pwm );
567
-
568
- /*
569
- * The DT case will set the pwm_period_ns field to 0 and store the
570
- * period, parsed from the DT, in the PWM device. For the non-DT case,
571
- * set the period from platform data if it has not already been set
572
- * via the PWM lookup table.
573
- */
574
- pwm_get_args (pb -> pwm , & pargs );
575
- pb -> period = pargs .period ;
576
- if (!pb -> period && (data -> pwm_period_ns > 0 ))
577
- pb -> period = data -> pwm_period_ns ;
578
-
579
- pb -> lth_brightness = data -> lth_brightness * (pb -> period / pb -> scale );
582
+ pb -> lth_brightness = data -> lth_brightness * (state .period / pb -> scale );
580
583
581
584
memset (& props , 0 , sizeof (struct backlight_properties ));
582
585
props .type = BACKLIGHT_RAW ;
0 commit comments