mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-10-02 07:04:24 +00:00
pwm: atmel-tcb: Harmonize resource allocation order
Allocate driver data as first resource in the probe function. This way it can be used during allocation of the other resources (instead of assigning these to local variables first and update driver data only when it's allocated). Also as driver data is allocated using a devm function this should happen first to have the order of freeing resources in the error path and the remove function in reverse. Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de> Signed-off-by: Thierry Reding <thierry.reding@gmail.com>
This commit is contained in:
parent
84c33f4278
commit
0323e8fedd
1 changed files with 20 additions and 29 deletions
|
@ -421,13 +421,14 @@ static int atmel_tcb_pwm_probe(struct platform_device *pdev)
|
||||||
struct atmel_tcb_pwm_chip *tcbpwm;
|
struct atmel_tcb_pwm_chip *tcbpwm;
|
||||||
const struct atmel_tcb_config *config;
|
const struct atmel_tcb_config *config;
|
||||||
struct device_node *np = pdev->dev.of_node;
|
struct device_node *np = pdev->dev.of_node;
|
||||||
struct regmap *regmap;
|
|
||||||
struct clk *clk, *gclk = NULL;
|
|
||||||
struct clk *slow_clk;
|
|
||||||
char clk_name[] = "t0_clk";
|
char clk_name[] = "t0_clk";
|
||||||
int err;
|
int err;
|
||||||
int channel;
|
int channel;
|
||||||
|
|
||||||
|
tcbpwm = devm_kzalloc(&pdev->dev, sizeof(*tcbpwm), GFP_KERNEL);
|
||||||
|
if (tcbpwm == NULL)
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
err = of_property_read_u32(np, "reg", &channel);
|
err = of_property_read_u32(np, "reg", &channel);
|
||||||
if (err < 0) {
|
if (err < 0) {
|
||||||
dev_err(&pdev->dev,
|
dev_err(&pdev->dev,
|
||||||
|
@ -436,47 +437,37 @@ static int atmel_tcb_pwm_probe(struct platform_device *pdev)
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
regmap = syscon_node_to_regmap(np->parent);
|
tcbpwm->regmap = syscon_node_to_regmap(np->parent);
|
||||||
if (IS_ERR(regmap))
|
if (IS_ERR(tcbpwm->regmap))
|
||||||
return PTR_ERR(regmap);
|
return PTR_ERR(tcbpwm->regmap);
|
||||||
|
|
||||||
slow_clk = of_clk_get_by_name(np->parent, "slow_clk");
|
tcbpwm->slow_clk = of_clk_get_by_name(np->parent, "slow_clk");
|
||||||
if (IS_ERR(slow_clk))
|
if (IS_ERR(tcbpwm->slow_clk))
|
||||||
return PTR_ERR(slow_clk);
|
return PTR_ERR(tcbpwm->slow_clk);
|
||||||
|
|
||||||
clk_name[1] += channel;
|
clk_name[1] += channel;
|
||||||
clk = of_clk_get_by_name(np->parent, clk_name);
|
tcbpwm->clk = of_clk_get_by_name(np->parent, clk_name);
|
||||||
if (IS_ERR(clk))
|
if (IS_ERR(tcbpwm->clk))
|
||||||
clk = of_clk_get_by_name(np->parent, "t0_clk");
|
tcbpwm->clk = of_clk_get_by_name(np->parent, "t0_clk");
|
||||||
if (IS_ERR(clk))
|
if (IS_ERR(tcbpwm->clk))
|
||||||
return PTR_ERR(clk);
|
return PTR_ERR(tcbpwm->clk);
|
||||||
|
|
||||||
match = of_match_node(atmel_tcb_of_match, np->parent);
|
match = of_match_node(atmel_tcb_of_match, np->parent);
|
||||||
config = match->data;
|
config = match->data;
|
||||||
|
|
||||||
if (config->has_gclk) {
|
if (config->has_gclk) {
|
||||||
gclk = of_clk_get_by_name(np->parent, "gclk");
|
tcbpwm->gclk = of_clk_get_by_name(np->parent, "gclk");
|
||||||
if (IS_ERR(gclk))
|
if (IS_ERR(tcbpwm->gclk))
|
||||||
return PTR_ERR(gclk);
|
return PTR_ERR(tcbpwm->gclk);
|
||||||
}
|
|
||||||
|
|
||||||
tcbpwm = devm_kzalloc(&pdev->dev, sizeof(*tcbpwm), GFP_KERNEL);
|
|
||||||
if (tcbpwm == NULL) {
|
|
||||||
err = -ENOMEM;
|
|
||||||
goto err_slow_clk;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
tcbpwm->chip.dev = &pdev->dev;
|
tcbpwm->chip.dev = &pdev->dev;
|
||||||
tcbpwm->chip.ops = &atmel_tcb_pwm_ops;
|
tcbpwm->chip.ops = &atmel_tcb_pwm_ops;
|
||||||
tcbpwm->chip.npwm = NPWM;
|
tcbpwm->chip.npwm = NPWM;
|
||||||
tcbpwm->channel = channel;
|
tcbpwm->channel = channel;
|
||||||
tcbpwm->regmap = regmap;
|
|
||||||
tcbpwm->clk = clk;
|
|
||||||
tcbpwm->gclk = gclk;
|
|
||||||
tcbpwm->slow_clk = slow_clk;
|
|
||||||
tcbpwm->width = config->counter_width;
|
tcbpwm->width = config->counter_width;
|
||||||
|
|
||||||
err = clk_prepare_enable(slow_clk);
|
err = clk_prepare_enable(tcbpwm->slow_clk);
|
||||||
if (err)
|
if (err)
|
||||||
goto err_slow_clk;
|
goto err_slow_clk;
|
||||||
|
|
||||||
|
@ -494,7 +485,7 @@ static int atmel_tcb_pwm_probe(struct platform_device *pdev)
|
||||||
clk_disable_unprepare(tcbpwm->slow_clk);
|
clk_disable_unprepare(tcbpwm->slow_clk);
|
||||||
|
|
||||||
err_slow_clk:
|
err_slow_clk:
|
||||||
clk_put(slow_clk);
|
clk_put(tcbpwm->slow_clk);
|
||||||
|
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue