Re: [PATCH 2/5] clk: qcom: Add a driver for PDM GP_MN fractional clock divider

From: Taniya Das

Date: Thu Oct 15 2026 - 03:20:00 EST




On 6/8/2026 9:01 AM, Dmitry Baryshkov wrote:
>> +static int gp_mnd_clk_set_rate(struct clk_hw *hw, unsigned long rate,
>> + unsigned long parent_rate)
>> +{
>> + struct clk_gp_mnd *gp = to_clk_gp_mnd(hw);
>> + unsigned long m = 0, n = 0;
>> + unsigned int d_val, n_val;
>> + int ret;
>> +
>> + rational_best_approximation(rate, parent_rate,
>> + (unsigned long)GP_MND_MAX_M,
>> + (unsigned long)GP_MND_MAX_N,
>> + &m, &n);
>> +
>> + if (!m || !n)
>> + return -EINVAL;
>> +
>> + /*
>> + * When N = 2M + 1 the valid D range [M+1, M] is empty; no duty
>> + * cycle can satisfy M < D < (N - M). Reject before touching hw.
>> + */
>> + if (n == 2 * m + 1)
>> + return -EINVAL;
>> +
>> + ret = clk_prepare_enable(gp->pdm_ahb_clk);
> Can we use CLK_OPS_PARENT_ENABLE or pm_clk instead? Having to manually
> toggle the clock looks like a coomplete overkill.
>

Sorry for the delayed response. Yes, I will model it as pm_clk.


>> + if (ret)
>> + return ret;
>> +
>> +
>> + ret = of_property_read_string_index(dev->of_node,
>> + "clock-output-names", 0,
>> + &init.name);
> Do we need it? Can we generate the name instead?

Yes, I will generate the name.

>
>> + if (ret)
>> + return dev_err_probe(dev, ret, "missing clock-output-names\n");
>> +
>> + gp->hw.init = &init;
>> +
>> + pin = devm_pinctrl_get(dev);
>> + if (IS_ERR(pin))
>> + return dev_err_probe(dev, PTR_ERR(pin), "missing pinctrl device\n");
>> +
>> + pin_default_state = pinctrl_lookup_state(pin, "active");
>> + if (IS_ERR(pin_default_state))
>> + return dev_err_probe(dev, PTR_ERR(pin_default_state),
>> + "missing pinctrl default state\n");
> Isn't it done by default for you?
>

Yeah, I will move it to default.

>> +
>> + ret = pinctrl_select_state(pin, pin_default_state);
>> + if (ret)
>> + return dev_err_probe(dev, ret,
>> + "failed to select pinctrl default state\n");
>> +
>> + ret = devm_clk_hw_register(dev, &gp->hw);
>> + if (ret)
>> + return dev_err_probe(dev, ret,
>> + "failed to register gp_mnd clock\n");
>> +
>> + return devm_of_clk_add_hw_provider(dev, of_clk_hw_simple_get, &gp->hw);
>> +}
>> +
>> +static const struct of_device_id clk_gp_mnd_match_table[] = {
>> + { .compatible = "qcom,clk-gp-mnd" },
>> + { }
>> +};
>> +MODULE_DEVICE_TABLE(of, clk_gp_mnd_match_table);
>> +
>> +static struct platform_driver clk_gp_mnd_driver = {
>> + .probe = clk_gp_mnd_probe,
>> + .driver = {
>> + .name = "qcom-clk-gp-mnd",
>> + .of_match_table = clk_gp_mnd_match_table,
>> + },
>> +};
>> +module_platform_driver(clk_gp_mnd_driver);
>> +
>> +MODULE_DESCRIPTION("Qualcomm PDM GP_MND clock divider driver");
>> +MODULE_LICENSE("GPL");

--
Thanks,
Taniya Das