[PATCH v4] gpio: rockchip: support acpi
Andy Shevchenko
andriy.shevchenko at linux.intel.com
Thu Sep 8 05:34:05 PDT 2022
On Thu, Sep 08, 2022 at 03:26:21PM +0800, Jianqun Xu wrote:
> This patch fix driver to support acpi by following changes:
> * support get gpio bank number from uid of acpi
> * try to get clocks for dt nodes but for acpi
> * try to get clocks by a char id first, if a dt patch applied
...
> + if (!gc->label) {
See below.
> + gc->label = kasprintf(GFP_KERNEL, "gpio%d", bank->bank_num);
> + if (!gc->label)
> + return -ENOMEM;
> + }
...
> - /*
> - * For DeviceTree-supported systems, the gpio core checks the
> - * pinctrl's device node for the "gpio-ranges" property.
> - * If it is present, it takes care of adding the pin ranges
> - * for the driver. In this case the driver can skip ahead.
> - *
> - * In order to remain compatible with older, existing DeviceTree
> - * files which don't set the "gpio-ranges" property or systems that
> - * utilize ACPI the driver has to call gpiochip_add_pin_range().
> - */
Why did you remove this comment? It's exactly an answer to what I was asking.
> + if (!device_property_read_bool(bank->dev, "gpio-ranges") && pctldev) {
> ret = gpiochip_add_pin_range(gc, dev_name(pctldev->dev), 0,
> gc->base, gc->ngpio);
> if (ret) {
> dev_err(bank->dev, "Failed to add pin range\n");
> - goto fail;
> + goto err_remove;
> }
> }
...
> + if (!bank->name)
It's not obvious check for this. Perhaps you can synchronize above to have
the same check and add a comment why bank->name presence guarantees that
label wasn't allocated by us here.
OTOH, why not to use devm_kasprintf()?
> + kfree(gc->label);
...
> +static int rockchip_gpio_get_clocks(struct rockchip_pin_bank *bank)
> +{
> + struct device *dev = bank->dev;
> + struct fwnode_handle *fwnode = dev_fwnode(dev);
> + int ret;
> +
> + if (!is_of_node(fwnode))
> + return 0;
> +
> + bank->clk = devm_clk_get(dev, "bus");
> + if (IS_ERR(bank->clk)) {
> + bank->clk = of_clk_get(to_of_node(fwnode), 0);
> + if (IS_ERR(bank->clk)) {
> + dev_err(dev, "fail to get apb clock\n");
> + return PTR_ERR(bank->clk);
> + }
> + }
> +
> + ret = clk_prepare_enable(bank->clk);
> + if (ret < 0)
> + return ret;
> +
> + bank->db_clk = devm_clk_get(dev, "db");
> + if (IS_ERR(bank->db_clk)) {
> + bank->db_clk = of_clk_get(to_of_node(fwnode), 1);
> + if (IS_ERR(bank->db_clk))
> + bank->db_clk = NULL;
> + }
> +
> + ret = clk_prepare_enable(bank->db_clk);
> + if (ret < 0) {
> + clk_disable_unprepare(bank->clk);
You can't mix devm_ with non-devm_ calls.
> + return ret;
> + }
...
> + if (!bank->name)
> + kfree(gc->label);
As per above.
--
With Best Regards,
Andy Shevchenko
More information about the Linux-rockchip
mailing list