/* * If the PWM channel is disabled, make sure to turn on the * clock before calling clk_get_rate() and writing to the * registers. Otherwise, just keep it enabled.
*/ if (!pwm_is_enabled(pwm)) {
ret = clk_prepare_enable(mxs->clk); if (ret) return ret;
}
/* * The data sheet the says registers must be written to in * this order (ACTIVEn, then PERIODn). Also, the new settings * only take effect at the beginning of a new period, avoiding * glitches.
*/
if (state->enabled) { if (!pwm_is_enabled(pwm)) { /* * The clock was enabled above. Just enable * the channel in the control register.
*/
writel(1 << pwm->hwpwm, mxs->base + PWM_CTRL + SET);
}
} else {
clk_disable_unprepare(mxs->clk);
} return 0;
}
mxs->base = devm_platform_ioremap_resource(pdev, 0); if (IS_ERR(mxs->base)) return PTR_ERR(mxs->base);
mxs->clk = devm_clk_get(&pdev->dev, NULL); if (IS_ERR(mxs->clk)) return PTR_ERR(mxs->clk);
chip->ops = &mxs_pwm_ops;
/* FIXME: Only do this if the PWM isn't already running */
ret = stmp_reset_block(mxs->base); if (ret) return dev_err_probe(&pdev->dev, ret, "failed to reset PWM\n");
ret = devm_pwmchip_add(&pdev->dev, chip); if (ret < 0) {
dev_err(&pdev->dev, "failed to add pwm chip %d\n", ret); return ret;
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.