Here's a collection of primarily clk driver fixes, with a couple fixes

to the core framework. We had to revert out a commit that affected boot
 on some devices that have the CLK_OPS_PARENT_ENABLE flag set. It isn't
 critical to have that fix so we'll try again next time.
 
 Driver side fixes include:
 
  - Plug an of node refcount bug in the TI clk driver
 
  - Fix the error handling in the raspberry pi firmware get_rate
    so that errors don't look like valid frequencies
 
  - Avoid going out of bounds in the raspberry pi driver too if the
    video firmware returns something we're not expecting
 -----BEGIN PGP SIGNATURE-----
 
 iQJFBAABCAAvFiEE9L57QeeUxqYDyoaDrQKIl8bklSUFAmMS3vwRHHNib3lkQGtl
 cm5lbC5vcmcACgkQrQKIl8bklSVBaxAA10710hPmEI9EKBFJoWd3IMjk91vActqy
 hYmWpovrAHGs889Pxh6utFUhLVLppsJENn4ER5k+4YJ4mIf3aKPP/mb/73MC8npP
 Acye50mN3YN81zMzLQNNkVQ26NqtSy54jk0OkBCYaB859cbYSk7Dr6DFPX31LowR
 31JhIt5Hyi3N7ED6VLumR3utlCe8CR6fYUu4zUeBR6vhe4rcxRfsnUIg8cNKPhAP
 NqKvBmN0MPoRhqiSr+KqIPT1wJC8/DRjxG6nmYHkh7uze3+WNnMDGfX+9fxjMs0Q
 QSY0stSbXa1Op7pmRNuyJfEVHbaCymNwPaFP92XDMAwzLrZmyJ+YCvyyW9kHMHf1
 DKqClPQ/+mwm6WKUbf7Kc3WNl9XFI1kokaFz5GEAp3kgMwoEmy06g+qWzdRDL7Vp
 nPD0Z/WajSPk1eR4k/Lljzy8hUzt6C4+ovOA7vXwK5EOB+i3QEs580OoYJyU2SnK
 CPskFgwv7+bkP60AmwhzDVNQqLUJQrcqpiHSJP0TV9Z4tFVBuez6SYopa2fSRNhj
 afoAaqOSa9DMivt9UMbhXPWTZq6UUHsFJ3+mX9LOC9V1+1aCGbXjfLi/xW5yYZPT
 f879IEbRPV2YEqGjhtvAdFkEcs8seXswNfc3kuaZxJJO9wXvJ32PYpKxWr/XF87U
 v4UdQma2E50=
 =2LvU
 -----END PGP SIGNATURE-----

Merge tag 'clk-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/clk/linux

Pull clk fixes from Stephen Boyd:
 "Here's a collection of primarily clk driver fixes, with a couple fixes
  to the core framework.

  We had to revert out a commit that affected boot on some devices that
  have the CLK_OPS_PARENT_ENABLE flag set. It isn't critical to have
  that fix so we'll try again next time.

  Driver side fixes include:

   - Plug an OF-node refcount bug in the TI clk driver

   - Fix the error handling in the raspberry pi firmware get_rate so
     that errors don't look like valid frequencies

   - Avoid going out of bounds in the raspberry pi driver too if the
     video firmware returns something we're not expecting"

* tag 'clk-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/clk/linux:
  Revert "clk: core: Honor CLK_OPS_PARENT_ENABLE for clk gate ops"
  clk: bcm: rpi: Show clock id limit in error case
  clk: bcm: rpi: Add missing newline
  clk: bcm: rpi: Prevent out-of-bounds access
  clk: bcm: rpi: Fix error handling of raspberrypi_fw_get_rate
  clk: core: Fix runtime PM sequence in clk_core_unprepare()
  clk: core: Honor CLK_OPS_PARENT_ENABLE for clk gate ops
  clk: ti: Fix missing of_node_get() ti_find_clock_provider()
This commit is contained in:
Linus Torvalds 2022-09-03 10:27:25 -07:00
commit 9a61442cba
3 changed files with 13 additions and 7 deletions

View File

@ -203,7 +203,7 @@ static unsigned long raspberrypi_fw_get_rate(struct clk_hw *hw,
ret = raspberrypi_clock_property(rpi->firmware, data,
RPI_FIRMWARE_GET_CLOCK_RATE, &val);
if (ret)
return ret;
return 0;
return val;
}
@ -220,7 +220,7 @@ static int raspberrypi_fw_set_rate(struct clk_hw *hw, unsigned long rate,
ret = raspberrypi_clock_property(rpi->firmware, data,
RPI_FIRMWARE_SET_CLOCK_RATE, &_rate);
if (ret)
dev_err_ratelimited(rpi->dev, "Failed to change %s frequency: %d",
dev_err_ratelimited(rpi->dev, "Failed to change %s frequency: %d\n",
clk_hw_get_name(hw), ret);
return ret;
@ -288,7 +288,7 @@ static struct clk_hw *raspberrypi_clk_register(struct raspberrypi_clk *rpi,
RPI_FIRMWARE_GET_MIN_CLOCK_RATE,
&min_rate);
if (ret) {
dev_err(rpi->dev, "Failed to get clock %d min freq: %d",
dev_err(rpi->dev, "Failed to get clock %d min freq: %d\n",
id, ret);
return ERR_PTR(ret);
}
@ -344,8 +344,13 @@ static int raspberrypi_discover_clocks(struct raspberrypi_clk *rpi,
struct rpi_firmware_get_clocks_response *clks;
int ret;
/*
* The firmware doesn't guarantee that the last element of
* RPI_FIRMWARE_GET_CLOCKS is zeroed. So allocate an additional
* zero element as sentinel.
*/
clks = devm_kcalloc(rpi->dev,
RPI_FIRMWARE_NUM_CLK_ID, sizeof(*clks),
RPI_FIRMWARE_NUM_CLK_ID + 1, sizeof(*clks),
GFP_KERNEL);
if (!clks)
return -ENOMEM;
@ -360,7 +365,8 @@ static int raspberrypi_discover_clocks(struct raspberrypi_clk *rpi,
struct raspberrypi_clk_variant *variant;
if (clks->id > RPI_FIRMWARE_NUM_CLK_ID) {
dev_err(rpi->dev, "Unknown clock id: %u", clks->id);
dev_err(rpi->dev, "Unknown clock id: %u (max: %u)\n",
clks->id, RPI_FIRMWARE_NUM_CLK_ID);
return -EINVAL;
}

View File

@ -840,10 +840,9 @@ static void clk_core_unprepare(struct clk_core *core)
if (core->ops->unprepare)
core->ops->unprepare(core->hw);
clk_pm_runtime_put(core);
trace_clk_unprepare_complete(core);
clk_core_unprepare(core->parent);
clk_pm_runtime_put(core);
}
static void clk_core_unprepare_lock(struct clk_core *core)

View File

@ -135,6 +135,7 @@ static struct device_node *ti_find_clock_provider(struct device_node *from,
continue;
if (!strncmp(n, tmp, strlen(tmp))) {
of_node_get(np);
found = true;
break;
}