예제 #1
0
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;
}
예제 #2
0
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;
}
예제 #3
0
파일: ehrpwm.c 프로젝트: BorisTw/BBB-kernel
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;
}
예제 #4
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);
}
예제 #5
0
파일: ehrpwm.c 프로젝트: BorisTw/BBB-kernel
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;
}