工作中遇到以下这种情况,当屏幕休眠的时候,无法关闭背光,pwm虽然停了,但是直流电压还在,就造成屏幕虽然无显示了,但是还有背光亮着,这时候就需要在屏幕休眠的时候把pwm切换成gpio口,然后把背光是能关闭,等休眠恢复的时候把gpio切换成pwm,直接上代码。
Index: drivers/pwm/pwm-rockchip.c
===================================================================
--- drivers/pwm/pwm-rockchip.c (revision 1877)
+++ drivers/pwm/pwm-rockchip.c (working copy)
@@ -38,6 +38,7 @@
struct clk *pclk;
struct pinctrl *pinctrl;
struct pinctrl_state *active_state;
+ struct pinctrl_state *gpio_state;
const struct rockchip_pwm_data *data;
void __iomem *base;
bool vop_pwm_en; /* indicate voppwm mirror register state */
@@ -238,7 +239,6 @@
* because of period/duty_cycle approximation.
*/
rockchip_pwm_get_state(chip, pwm, state);
-
if (state->enabled)
ret = pinctrl_select_state(pc->pinctrl, pc->active_state);
out:
@@ -246,6 +246,33 @@
return ret;
}
+int rockchip_pwm_chnange_gpio(struct pwm_chip *chip)
+{
+
+ struct rockchip_pwm_chip *pc = to_rockchip_pwm_chip(chip);
+ if(pc->gpio_state!=NULL){
+ clk_disable(pc->pclk);
+
+ //clk_unprepare(pc->pclk);
+ //clk_unprepare(pc->clk);
+ pinctrl_select_state(pc->pinctrl, pc->gpio_state);
+ printk("fan pwm0 rockchip_pwm_chnange_gpio\n");
+ }
+ return 0;
+}
+EXPORT_SYMBOL(rockchip_pwm_chnange_gpio);
+int rockchip_pwm_chnange_active(struct pwm_chip *chip)
+{
+
+ struct rockchip_pwm_chip *pc = to_rockchip_pwm_chip(chip);
+ if(pc->active_state!=NULL){
+ clk_enable(pc->clk);
+ pinctrl_select_state(pc->pinctrl, pc->active_state);
+ printk("fan pwm0 rockchip_pwm_chnange_active\n");
+ }
+ return 0;
+}
+EXPORT_SYMBOL(rockchip_pwm_chnange_active);
static const struct pwm_ops rockchip_pwm_ops = {
.get_state = rockchip_pwm_get_state,
@@ -396,6 +423,13 @@
dev_err(&pdev->dev, "No active pinctrl state\n");
return PTR_ERR(pc->active_state);
}
+ pc->gpio_state = pinctrl_lookup_state(pc->pinctrl, "gpio");
+ if (IS_ERR(pc->gpio_state)) {
+ dev_err(&pdev->dev, "No gpio pinctrl state\n");
+ return PTR_ERR(pc->gpio_state);
+ }else{
+ printk("fan pwm0 get gpio pinctrl\n");
+ }
platform_set_drvdata(pdev, pc);
Index: drivers/video/backlight/pwm_bl.c
===================================================================
--- drivers/video/backlight/pwm_bl.c (revision 1877)
+++ drivers/video/backlight/pwm_bl.c (working copy)
+extern int rockchip_pwm_chnange_gpio(struct pwm_chip *chip);
+extern int rockchip_pwm_chnange_active(struct pwm_chip *chip);
static void pwm_backlight_power_on(struct pwm_bl_data *pb, int brightness)
{
int err;
if (pb->enabled)
- return;
-
+ return;
+ rockchip_pwm_chnange_active(pb->pwm->chip);
err = regulator_enable(pb->power_supply);
if (err < 0)
dev_err(pb->dev, "failed to enable power supply\n");
@@ -58,10 +61,11 @@
if (pb->enable_gpio)
gpiod_set_value(pb->enable_gpio, 1);
-
+ PowerLedSet(1);
pwm_enable(pb->pwm);
pb->enabled = true;
- PowerLedSet(1);
+
+ printk("fan pwm_backlight_power_on\n");
}
static void pwm_backlight_power_off(struct pwm_bl_data *pb)
@@ -78,6 +82,10 @@
regulator_disable(pb->power_supply);
pb->enabled = false;
PowerLedSet(0);
+ rockchip_pwm_chnange_gpio(pb->pwm->chip);
+ msleep(2000);msleep(2000);
+ gpio_direction_output(216,1);
+ printk("fan pwm_backlight_power_off\n");
}
dts做如下修改
&pwm0{
pinctrl-names = "active","gpio";
pinctrl-0 = <&pwm0_pin>;
pinctrl-1 = <&pwm_as_gpio>;
};
&pinctrl {
mygpio {
pwm_as_gpio:mygpio{
rockchip,pins = <7 0 RK_FUNC_GPIO &pcfg_pull_up>;
};
};
};