#define PWM_SCALE_WIDTH 13
#define PWM_SCALE_SHIFT 0
+#define CLK_1MHz 1000000UL
+
struct tegra_pwm_soc {
unsigned int num_channels;
unsigned long max_clk_limit;
struct tegra_pwm_chip *pwm;
struct resource *r;
bool no_clk_sleeping_in_ops;
+ struct clk *parent_clk;
int ret;
pwm = devm_kzalloc(&pdev->dev, sizeof(*pwm), GFP_KERNEL);
return PTR_ERR(pwm->clk);
}
+ parent_clk = devm_clk_get(&pdev->dev, "parent");
+ if (!IS_ERR(parent_clk)) {
+ struct device *dev = &pdev->dev;
+
+ /*
+ * Set PWM frequency to lower so that it can switch
+ * to parent with higher clock rate.
+ */
+ ret = clk_set_rate(pwm->clk, CLK_1MHz);
+ if (ret < 0) {
+ dev_err(dev, "Failed to set 1M clock rate: %d\n", ret);
+ return ret;
+ }
+
+ ret = clk_set_parent(pwm->clk, parent_clk);
+ if (ret < 0) {
+ dev_err(dev, "Failed to set parent clk: %d\n", ret);
+ return ret;
+ }
+
+ /* Set clock to maximum clock limit */
+ ret = clk_set_rate(pwm->clk, pwm->soc->max_clk_limit);
+ if (ret < 0) {
+ dev_err(dev, "Failed to set max clk rate: %d\n", ret);
+ return ret;
+ }
+ }
+
/* Get clock rate */
pwm->src_rate = clk_get_rate(pwm->clk);
pwm->parent_rate = clk_get_rate(clk_get_parent(pwm->clk));