static int pwm_backlight_update_status(struct backlight_device *bl) { struct pwm_bl_data *pb = dev_get_drvdata(&bl->dev); int brightness = bl->props.brightness; int max = bl->props.max_brightness; if (bl->props.power != FB_BLANK_UNBLANK) brightness = 0; if (bl->props.fb_blank != FB_BLANK_UNBLANK) brightness = 0; if (pb->notify) brightness = pb->notify(pb->dev, brightness); pwm_set_period_ns(pb->pwm, pb->period); if (brightness == 0) { pwm_set_duty_ns(pb->pwm, 0); if(pb->pwm_started != 0){ pwm_stop(pb->pwm); pb->pwm_started = 0; } } else { pwm_set_duty_ns(pb->pwm, brightness * pb->period / max); if(pb->pwm_started == 0){ pwm_start(pb->pwm); pb->pwm_started = 1; } } return 0; }
void vibtonz_pwm(int nForce) { static int prev_duty=0; t_vib_desc *vib_iter =&vib_desc; int pwm_period=0, pwm_duty = 0; printk("%s : %d \n", __func__, nForce); if( vib_iter->initialized == 0) return; pwm_period = vib_iter->pwm_period; pwm_duty = pwm_period/2 + ((pwm_period/2 - 2) *nForce) /127; if(pwm_duty > vib_iter->pwm_duty) { pwm_duty = vib_iter->pwm_duty; } else if(pwm_period - pwm_duty > vib_iter->pwm_duty) { pwm_duty = pwm_period - vib_iter->pwm_duty; } pwm_set_period_ns(vib_iter->pwm,vib_iter->pwm_period); pwm_set_polarity(vib_iter->pwm, vib_iter->pwm_polarity); pwm_set_duty_ns(vib_iter->pwm, pwm_duty); }
static int ehrpwm_freq_transition_cb(struct pwm_device *p) { struct ehrpwm_pwm *ehrpwm = to_ehrpwm_pwm(p); unsigned long duty_ns; p->tick_hz = clk_get_rate(ehrpwm->clk); duty_ns = p->duty_ns; if (pwm_is_running(p)) { pwm_stop(p); pwm_set_duty_ns(p, 0); pwm_set_period_ns(p, p->period_ns); pwm_set_duty_ns(p, duty_ns); pwm_start(p); } else { pwm_set_duty_ns(p, 0); pwm_set_period_ns(p, p->period_ns); pwm_set_duty_ns(p, duty_ns); } return 0; }
/* * sun4i: 0-16 * sun5i: 0-256 */ __s32 BSP_disp_lcd_set_bright(__u32 sel, __u32 bright #ifdef CONFIG_ARCH_SUN5I , __u32 from_iep #endif ) { __u32 duty_ns; if (!sunxi_is_version_A() && (gpanel_info[sel].lcd_pwm_not_used == 0)) { #ifdef CONFIG_ARCH_SUN4I if (bright != 0) bright += 1; #endif #ifdef CONFIG_ARCH_SUN4I if (gpanel_info[sel].lcd_pwm_pol == 0) duty_ns = (bright * gdisp.pwm[gpanel_info[sel].lcd_pwm_ch].period_ns + 128) / 256; else duty_ns = ((256 - bright) * gdisp.pwm[gpanel_info[sel].lcd_pwm_ch].period_ns + 128) / 256; #else if (gpanel_info[sel].lcd_pwm_pol == 0) duty_ns = (bright * gdisp.screen[sel].lcd_bright_dimming * gdisp.pwm[gpanel_info[sel].lcd_pwm_ch].period_ns / 256 + 128) / 256; else duty_ns = ((256 - bright * gdisp.screen[sel].lcd_bright_dimming / 256) * gdisp.pwm[gpanel_info[sel].lcd_pwm_ch].period_ns + 128) / 256; #endif pwm_set_duty_ns(gpanel_info[sel].lcd_pwm_ch, duty_ns); } #ifdef CONFIG_ARCH_SUN5I if (!from_iep) #endif gdisp.screen[sel].lcd_bright = bright; return DIS_SUCCESS; }
static int ecap_frequency_transition_cb(struct pwm_device *p) { struct ecap_pwm *ep = to_ecap_pwm(p); unsigned long duty_ns, rate; rate = clk_get_rate(ep->clk); if (rate == p->tick_hz) return 0; p->tick_hz = rate; duty_ns = p->duty_ns; if (pwm_is_running(p)) { pwm_stop(p); pwm_set_duty_ns(p, 0); pwm_set_period_ns(p, p->period_ns); pwm_set_duty_ns(p, duty_ns); pwm_start(p); } else { pwm_set_duty_ns(p, 0); pwm_set_period_ns(p, p->period_ns); pwm_set_duty_ns(p, duty_ns); } return 0; }
static int pwm_backlight_suspend(struct platform_device *pdev, pm_message_t state) { struct backlight_device *bl = platform_get_drvdata(pdev); struct pwm_bl_data *pb = dev_get_drvdata(&bl->dev); if (pb->notify) pb->notify(pb->dev, 0); pwm_set_duty_ns(pb->pwm, 0); if(pb->pwm_started != 0){ pwm_stop(pb->pwm); pb->pwm_started = 0; } return 0; }
static int pwm_backlight_remove(struct platform_device *pdev) { struct platform_pwm_backlight_data *data = pdev->dev.platform_data; struct backlight_device *bl = platform_get_drvdata(pdev); struct pwm_bl_data *pb = dev_get_drvdata(&bl->dev); backlight_device_unregister(bl); pwm_set_duty_ns(pb->pwm, 0); pwm_stop(pb->pwm); pwm_release(pb->pwm); kfree(pb); if (data->exit) data->exit(&pdev->dev); return 0; }
static ssize_t pwm_duty_ns_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t len) { unsigned long duty_ns; struct pwm_device *p = dev_get_drvdata(dev); int ret; if (!kstrtoul(buf, 10, &duty_ns)) { ret = pwm_set_duty_ns(p, duty_ns); if (ret < 0) return ret; } return len; }
//setting: 0, 1, 2,.... 255, 256 //pol==0: 0, 1, 2,.... 255, 256 //pol==1: 256, 255, 254, ... 1, 0 __s32 BSP_disp_lcd_set_bright(__u32 sel, __u32 bright) { __u32 duty_ns; if((OSAL_sw_get_ic_ver() != 0xA) && (gpanel_info[sel].lcd_pwm_not_used == 0)) { if(gpanel_info[sel].lcd_pwm_pol == 0) { duty_ns = (bright * gdisp.pwm[gpanel_info[sel].lcd_pwm_ch].period_ns + 128) / 256; } else { duty_ns = ((256- bright) * gdisp.pwm[gpanel_info[sel].lcd_pwm_ch].period_ns + 128) / 256; } pwm_set_duty_ns(gpanel_info[sel].lcd_pwm_ch, duty_ns); } gdisp.screen[sel].lcd_bright = bright; return DIS_SUCCESS; }