static ssize_t ep93xx_pwm_set_freq(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { struct platform_device *pdev = to_platform_device(dev); struct ep93xx_pwm *pwm = platform_get_drvdata(pdev); long val; int err; err = strict_strtol(buf, 10, &val); if (err) return -EINVAL; if (val == 0) { ep93xx_pwm_disable(pwm); } else if (val <= (clk_get_rate(pwm->clk) / 2)) { u32 term, duty; val = (clk_get_rate(pwm->clk) / val) - 1; if (val > EP93XX_PWM_MAX_COUNT) val = EP93XX_PWM_MAX_COUNT; if (val < 1) val = 1; term = ep93xx_pwm_read_tc(pwm); duty = ((val + 1) * pwm->duty_percent / 100) - 1; /* */ if (val > term) { ep93xx_pwm_write_tc(pwm, val); ep93xx_pwm_write_dc(pwm, duty); } else { ep93xx_pwm_write_dc(pwm, duty); ep93xx_pwm_write_tc(pwm, val); } if (!ep93xx_pwm_is_enabled(pwm)) ep93xx_pwm_enable(pwm); } else { return -EINVAL; } return count; }
static ssize_t ep93xx_pwm_set_duty_percent(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { struct platform_device *pdev = to_platform_device(dev); struct ep93xx_pwm *pwm = platform_get_drvdata(pdev); long val; int err; err = strict_strtol(buf, 10, &val); if (err) return -EINVAL; if (val > 0 && val < 100) { u32 term = ep93xx_pwm_read_tc(pwm); ep93xx_pwm_write_dc(pwm, ((term + 1) * val / 100) - 1); pwm->duty_percent = val; return count; } return -EINVAL; }