int pwm_set_period_ns(struct pwm_device *p, unsigned long period_ns) { struct pwm_config c = { .config_mask = BIT(PWM_CONFIG_PERIOD_TICKS), .period_ticks = pwm_ns_to_ticks(p, period_ns), }; spin_lock(&p->pwm_lock); p->period_ns = period_ns; spin_unlock(&p->pwm_lock); return pwm_config(p, &c); } EXPORT_SYMBOL(pwm_set_period_ns); unsigned long pwm_get_period_ns(struct pwm_device *p) { return pwm_ticks_to_ns(p, p->period_ticks); } EXPORT_SYMBOL(pwm_get_period_ns); int pwm_set_frequency(struct pwm_device *p, unsigned long freq) { struct pwm_config c; if (!freq) return -EINVAL; c.config_mask = BIT(PWM_CONFIG_PERIOD_TICKS), c.period_ticks = pwm_ns_to_ticks(p, (NSEC_PER_SEC / freq)), spin_lock(&p->pwm_lock); p->period_ns = NSEC_PER_SEC / freq; spin_unlock(&p->pwm_lock); return pwm_config(p, &c); } EXPORT_SYMBOL(pwm_set_frequency); unsigned long pwm_get_frequency(struct pwm_device *p) { unsigned long period_ns; period_ns = pwm_ticks_to_ns(p, p->period_ticks); if (!period_ns) { pr_debug("%s: frequency is zero\n", dev_name(p->dev)); return 0; } return NSEC_PER_SEC / period_ns; }
int pwm_set_duty_ns(struct pwm_device *p, unsigned long duty_ns) { struct pwm_config c = { .config_mask = BIT(PWM_CONFIG_DUTY_TICKS), .duty_ticks = pwm_ns_to_ticks(p, duty_ns), }; spin_lock(&p->pwm_lock); p->duty_ns = duty_ns; spin_unlock(&p->pwm_lock); return pwm_config(p, &c); } EXPORT_SYMBOL(pwm_set_duty_ns); unsigned long pwm_get_duty_ns(struct pwm_device *p) { return pwm_ticks_to_ns(p, p->duty_ticks); } EXPORT_SYMBOL(pwm_get_duty_ns); int pwm_set_duty_percent(struct pwm_device *p, int percent) { struct pwm_config c = { .config_mask = BIT(PWM_CONFIG_DUTY_PERCENT), .duty_percent = percent, }; spin_lock(&p->pwm_lock); p->duty_ns = p->period_ns * percent; p->duty_ns /= 100; spin_unlock(&p->pwm_lock); return pwm_config(p, &c); } EXPORT_SYMBOL(pwm_set_duty_percent); unsigned long pwm_get_duty_percent(struct pwm_device *p) { unsigned long long duty_percent; if (!p->period_ns) { pr_debug("%s: frequency is zero\n", dev_name(p->dev)); return 0; } duty_percent = pwm_ticks_to_ns(p, p->duty_ticks); duty_percent *= 100; do_div(duty_percent, p->period_ns); return duty_percent; }
int ehrpwm_db_get_delay(struct pwm_device *p, unsigned char edge, enum config_mask cfgmask, unsigned long *delay_val) { struct ehrpwm_pwm *ehrpwm = to_ehrpwm_pwm(p); unsigned long delay_ns; unsigned long delay_ticks; unsigned char offset; if (!ehrpwm) return -EINVAL; if (edge == RISING_EDGE_DELAY) offset = DBRED; else if (edge == FALLING_EDGE_DELAY) offset = DBFED; else return -EINVAL; delay_ticks = ehrpwm_read(ehrpwm, offset); /* Only least 10 bits are required */ delay_ticks = delay_ticks & 0x3ff; if (cfgmask == CONFIG_TICKS) { *delay_val = delay_ticks * ehrpwm->prescale_val; } else if (cfgmask == CONFIG_NS) { delay_ticks = delay_ticks * ehrpwm->prescale_val; delay_ns = pwm_ticks_to_ns(p, delay_ticks); debug("\n delay ns value is %lu", delay_ns); *delay_val = delay_ns; } else { return -EINVAL; } return 0; }
int pwm_set_duty_ticks(struct pwm_device *p, unsigned long ticks) { struct pwm_config c = { .config_mask = BIT(PWM_CONFIG_DUTY_TICKS), .duty_ticks = ticks, }; spin_lock(&p->pwm_lock); p->duty_ns = pwm_ticks_to_ns(p, ticks); spin_unlock(&p->pwm_lock); return pwm_config(p, &c); }
int ehrpwm_db_get_max_delay(struct pwm_device *p, enum config_mask cfgmask, unsigned long *delay_val) { struct ehrpwm_pwm *ehrpwm = to_ehrpwm_pwm(p); unsigned long delay_ns; unsigned long max_ticks; if (cfgmask == CONFIG_NS) { max_ticks = 0x3ff * ehrpwm->prescale_val; delay_ns = pwm_ticks_to_ns(p, max_ticks); *delay_val = delay_ns; } else if (cfgmask == CONFIG_TICKS) { *delay_val = 0x3ff * ehrpwm->prescale_val; } else { return -EINVAL; } return 0; }