587dd448d9
The sprd_div_helper_round_rate() function calls divider_round_rate()
which calls divider_round_rate_parent() which calls
divider_determine_rate(). This call chain converts back and forth from
the rate request structure to make a determine_rate clk_op fit with a
round_rate clk_op. Simplify the code here by directly calling
divider_determine_rate() instead.
This fixes a smatch warning where an unsigned long is compared to less
than zero, which is impossible. This makes sprd_div_helper_round_rate()
unnecessary as well so simply remove it and fold it into the only caller
left.
Reported-by: Harshit Mogalapalli <harshit.m.mogalapalli@oracle.com>
Closes: https://lore.kernel.org/r/45fdc54e-7ab6-edd6-d55a-473485608473@oracle.com
Cc: Maxime Ripard <maxime@cerno.tech>
Fixes: 302d2f836d
("clk: sprd: composite: Switch to determine_rate")
Signed-off-by: Stephen Boyd <sboyd@kernel.org>
Link: https://lore.kernel.org/r/20230613195443.1555132-1-sboyd@kernel.org
Reviewed-by: Maxime Ripard <mripard@kernel.org>
60 lines
1.5 KiB
C
60 lines
1.5 KiB
C
// SPDX-License-Identifier: GPL-2.0
|
|
//
|
|
// Spreadtrum composite clock driver
|
|
//
|
|
// Copyright (C) 2017 Spreadtrum, Inc.
|
|
// Author: Chunyan Zhang <chunyan.zhang@spreadtrum.com>
|
|
|
|
#include <linux/clk-provider.h>
|
|
|
|
#include "composite.h"
|
|
|
|
static int sprd_comp_determine_rate(struct clk_hw *hw,
|
|
struct clk_rate_request *req)
|
|
{
|
|
struct sprd_comp *cc = hw_to_sprd_comp(hw);
|
|
|
|
return divider_determine_rate(hw, req, NULL, cc->div.width, 0);
|
|
}
|
|
|
|
static unsigned long sprd_comp_recalc_rate(struct clk_hw *hw,
|
|
unsigned long parent_rate)
|
|
{
|
|
struct sprd_comp *cc = hw_to_sprd_comp(hw);
|
|
|
|
return sprd_div_helper_recalc_rate(&cc->common, &cc->div, parent_rate);
|
|
}
|
|
|
|
static int sprd_comp_set_rate(struct clk_hw *hw, unsigned long rate,
|
|
unsigned long parent_rate)
|
|
{
|
|
struct sprd_comp *cc = hw_to_sprd_comp(hw);
|
|
|
|
return sprd_div_helper_set_rate(&cc->common, &cc->div,
|
|
rate, parent_rate);
|
|
}
|
|
|
|
static u8 sprd_comp_get_parent(struct clk_hw *hw)
|
|
{
|
|
struct sprd_comp *cc = hw_to_sprd_comp(hw);
|
|
|
|
return sprd_mux_helper_get_parent(&cc->common, &cc->mux);
|
|
}
|
|
|
|
static int sprd_comp_set_parent(struct clk_hw *hw, u8 index)
|
|
{
|
|
struct sprd_comp *cc = hw_to_sprd_comp(hw);
|
|
|
|
return sprd_mux_helper_set_parent(&cc->common, &cc->mux, index);
|
|
}
|
|
|
|
const struct clk_ops sprd_comp_ops = {
|
|
.get_parent = sprd_comp_get_parent,
|
|
.set_parent = sprd_comp_set_parent,
|
|
|
|
.determine_rate = sprd_comp_determine_rate,
|
|
.recalc_rate = sprd_comp_recalc_rate,
|
|
.set_rate = sprd_comp_set_rate,
|
|
};
|
|
EXPORT_SYMBOL_GPL(sprd_comp_ops);
|