mtd: nand: orion: fix clk handling
Subsystems (2)
PATCH 1/1 mtd: nand: orion: fix clk handling
The clk handling in orion_nand.c had two problems:
- In the probe function, clk_put() was called for an enabled clock, which violates the API (see documentation for clk_put() in include/linux/clk.h)
- In the error path of the probe function, clk_put() could be called twice for the same clock.
In order to clean this up, use the managed function devm_clk_get() and store the pointer to the clk in the driver data.
--- drivers/mtd/nand/orion_nand.c | 42 +++++++++++++++++++++--------------------- 1 file changed, 21 insertions(+), 21 deletions(-)
drivers/mtd/nand/orion_nand.c +21 -21
@@ -23,6 +23,11 @@#include <asm/sizes.h> #include <linux/platform_data/mtd-orion_nand.h> +struct orion_nand_info { +struct nand_chip chip; +struct clk *clk; +}; +static void orion_nand_cmd_ctrl (struct mtd_info *mtd,int cmd,unsigned int ctrl) {struct nand_chip *nc =mtd_to_nand (mtd);
@@ -75,20 +80,21 @@ static void orion_nand_read_buf(struct mtd_info *mtd, uint8_t *buf, int len)static int __init orion_nand_probe (struct platform_device *pdev) { +struct orion_nand_info *info;struct mtd_info *mtd;struct nand_chip *nc;struct orion_nand_data *board;struct resource *res; -struct clk *clk;void __iomem *io_base;int ret =0 ;u32 val =0 ; - nc =devm_kzalloc (&pdev->dev, -sizeof (struct nand_chip ), + info =devm_kzalloc (&pdev->dev, +sizeof (struct orion_nand_info ),GFP_KERNEL ); -if (!nc) +if (!info)return -ENOMEM ; + nc = &info->chip; mtd =nand_to_mtd (nc); res =platform_get_resource (pdev,IORESOURCE_MEM ,0 );
@@ -145,15 +151,13 @@ static int __init orion_nand_probe(struct platform_device *pdev)if (board->dev_ready) nc->dev_ready = board->dev_ready; -platform_set_drvdata (pdev, mtd); +platform_set_drvdata (pdev, info);/* Not all platforms can gate the clock, so it is not an error if the clock does not exists. */ - clk =clk_get (&pdev->dev,NULL ); -if (!IS_ERR (clk)) { -clk_prepare_enable (clk); -clk_put (clk); - } + info->clk =devm_clk_get (&pdev->dev,NULL ); +if (!IS_ERR (info->clk)) +clk_prepare_enable (info->clk); ret =nand_scan (mtd,1 );if (ret)
@@ -169,26 +173,22 @@ static int __init orion_nand_probe(struct platform_device *pdev)return 0 ; no_dev: -if (!IS_ERR (clk)) { -clk_disable_unprepare (clk); -clk_put (clk); - } +if (!IS_ERR (info->clk)) +clk_disable_unprepare (info->clk);return ret; }static int orion_nand_remove (struct platform_device *pdev) { -struct mtd_info *mtd =platform_get_drvdata (pdev); -struct clk *clk; +struct orion_nand_info *info =platform_get_drvdata (pdev); +struct nand_chip *chip = &info->chip; +struct mtd_info *mtd =nand_to_mtd (chip);nand_release (mtd); - clk =clk_get (&pdev->dev,NULL ); -if (!IS_ERR (clk)) { -clk_disable_unprepare (clk); -clk_put (clk); - } +if (!IS_ERR (info->clk)) +clk_disable_unprepare (info->clk);return 0 ; }
Signature · 1 line
2.9.3
PATCH 1/1 mtd: nand: orion: fix clk handling
Hello Simon,
Quoted 68 lines · Simon Baatz
The clk handling in
orion_nand.chad two problems:- In the probe function,
clk_put()was called for an enabled clock, which violates the API (see documentation forclk_put()ininclude/linux/clk.h)- In the error path of the probe function,
clk_put()could be called twice for the same clock.In order to clean this up, use the managed function
devm_clk_get()and store the pointer to the clk in the driver data.Fixes baffab28b13120694fa3ebab08d3e99667a851d2 ('ARM: Orion: fix driver probe error handling with respect to clk')Cc <[email protected]> # v4.5+Signed-off-by Simon Baatz <[email protected]>--- drivers/mtd/nand/orion_nand.c | 42 +++++++++++++++++++++--------------------- 1 file changed, 21 insertions(+), 21 deletions(-)drivers/mtd/nand/orion_nand.c +11
-5@@ -23,6 +23,11 @@#include <asm/sizes.h> #include <linux/platform_data/mtd-orion_nand.h> +struct orion_nand_info { +struct nand_chip chip; +struct clk *clk; +}; +static void orion_nand_cmd_ctrl (struct mtd_info *mtd,int cmd,unsigned int ctrl) {struct nand_chip *nc =mtd_to_nand (mtd);@@ -75,20 +80,21 @@ static void orion_nand_read_buf(struct mtd_info *mtd, uint8_t *buf, int len)static int __init orion_nand_probe (struct platform_device *pdev) { +struct orion_nand_info *info;struct mtd_info *mtd;struct nand_chip *nc;struct orion_nand_data *board;struct resource *res; -struct clk *clk;void __iomem *io_base;int ret =0 ;u32 val =0 ; - nc =devm_kzalloc (&pdev->dev, -sizeof (struct nand_chip ), + info =devm_kzalloc (&pdev->dev, +sizeof (struct orion_nand_info ),GFP_KERNEL ); -if (!nc) +if (!info)return -ENOMEM ; + nc = &info->chip; mtd =nand_to_mtd (nc); res =platform_get_resource (pdev,IORESOURCE_MEM ,0 );@@ -145,15 +151,13 @@ static int __init orion_nand_probe(struct platform_device *pdev)if (board->dev_ready) nc->dev_ready = board->dev_ready; -platform_set_drvdata (pdev, mtd); +platform_set_drvdata (pdev, info);
drivers/mtd/nand/orion_nand.c static int __init orion_nand_probe(struct platform_device *pdev) · line 160
Quoted 10 lines
drivers/mtd/nand/orion_nand.c +3
-5/* Not all platforms can gate the clock, so it is not an error if the clock does not exists. */ - clk =clk_get (&pdev->dev,NULL ); -if (!IS_ERR (clk)) { -clk_prepare_enable (clk); -clk_put (clk); - } + info->clk =devm_clk_get (&pdev->dev,NULL ); +if (!IS_ERR (info->clk)) +clk_prepare_enable (info->clk);
Orthogonal to your patch I suggest:
- info->clk = devm_clk_get(&pdev->dev, NULL);
- if (!IS_ERR(info->clk))
- clk_prepare_enable(info->clk);
+ info->clk = devm_clk_get_optional(&pdev->dev, NULL);
+ if (IS_ERR(info->clk)) {
+ ret = PTR_ERR(info->clk);
+ if (ret != -EPROBE_DEFER)
+ dev_err(...);
+ return ret;
+ }
to correct error handling.
(I didn't check if a plain return is right here, and also other users of info->clk need adaption.)
Best regards
Uwe
Signature · 2 lines
Pengutronix e.K. | Uwe Kleine-K?nig | Industrial Linux Solutions | http://www.pengutronix.de/ |
PATCH 1/1 mtd: nand: orion: fix clk handling
Hello Uwe,
Quoted 14 lines · Uwe Kleine-K?nig
Hello Simon,
Quoted 11 lines · Simon Baatz
The clk handling in
orion_nand.chad two problems:- In the probe function,
clk_put()was called for an enabled clock, which violates the API (see documentation forclk_put()ininclude/linux/clk.h)- In the error path of the probe function,
clk_put()could be called twice for the same clock.In order to clean this up, use the managed function
devm_clk_get()and store the pointer to the clk in the driver data.
...
Quoted 24 lines
drivers/mtd/nand/orion_nand.c static int __init orion_nand_probe(struct platform_device *pdev) · line 160
Quoted 10 lines
drivers/mtd/nand/orion_nand.c +3
-5/* Not all platforms can gate the clock, so it is not an error if the clock does not exists. */ - clk =clk_get (&pdev->dev,NULL ); -if (!IS_ERR (clk)) { -clk_prepare_enable (clk); -clk_put (clk); - } + info->clk =devm_clk_get (&pdev->dev,NULL ); +if (!IS_ERR (info->clk)) +clk_prepare_enable (info->clk);Orthogonal to your patch I suggest:
(quoted diff) +7
-3- info->clk = devm_clk_get(&pdev->dev, NULL); - if (!IS_ERR(info->clk)) - clk_prepare_enable(info->clk); + info->clk = devm_clk_get_optional(&pdev->dev, NULL); + if (IS_ERR(info->clk)) { + ret = PTR_ERR(info->clk); + if (ret != -EPROBE_DEFER) + dev_err(...); + return ret; + }
Quoted 3 lines
to correct error handling.
(I didn't check if a plain return is right here, and also other users ofinfo->clkneed adaption.)
Nice! However, I can't find a devm_clk_get_optional() anywhere(?) Is it in some upcoming patch?
- Simon
PATCH 1/1 mtd: nand: orion: fix clk handling
Hello Simon,
Quoted 44 lines · Simon Baatz
Hello Uwe,
Quoted 14 lines · Uwe Kleine-K?nig
Hello Simon,
Quoted 11 lines · Simon Baatz
The clk handling in
orion_nand.chad two problems:- In the probe function,
clk_put()was called for an enabled clock, which violates the API (see documentation forclk_put()ininclude/linux/clk.h)- In the error path of the probe function,
clk_put()could be called twice for the same clock.In order to clean this up, use the managed function
devm_clk_get()and store the pointer to the clk in the driver data....
Quoted 24 lines
drivers/mtd/nand/orion_nand.c static int __init orion_nand_probe(struct platform_device *pdev) · line 160
Quoted 10 lines
drivers/mtd/nand/orion_nand.c +3
-5/* Not all platforms can gate the clock, so it is not an error if the clock does not exists. */ - clk =clk_get (&pdev->dev,NULL ); -if (!IS_ERR (clk)) { -clk_prepare_enable (clk); -clk_put (clk); - } + info->clk =devm_clk_get (&pdev->dev,NULL ); +if (!IS_ERR (info->clk)) +clk_prepare_enable (info->clk);Orthogonal to your patch I suggest:
(quoted diff) +7
-3- info->clk = devm_clk_get(&pdev->dev, NULL); - if (!IS_ERR(info->clk)) - clk_prepare_enable(info->clk); + info->clk = devm_clk_get_optional(&pdev->dev, NULL); + if (IS_ERR(info->clk)) { + ret = PTR_ERR(info->clk); + if (ret != -EPROBE_DEFER) + dev_err(...); + return ret; + }
Quoted 6 lines
Quoted 3 lines
to correct error handling.
(I didn't check if a plain return is right here, and also other users ofinfo->clkneed adaption.)Nice! However, I can't find a
devm_clk_get_optional()anywhere(?) Is it in some upcoming patch?
Oh really. I was sure I already made use of it. Probably consfused it with the gpio or regulator API which have such variants. (But be aware, they are sematically different. If you look for a place to copy from please stick to the gpio sematic.)
Then either send a patch creating clk_get_optional and friends, or only ignore -ENODEV but propagate the other error values. (Maybe the most rational path is to do both and switch the driver once clk_get_optional is available.)
Best regards
Uwe
Signature · 2 lines
Pengutronix e.K. | Uwe Kleine-K?nig | Industrial Linux Solutions | http://www.pengutronix.de/ |
PATCH 1/1 mtd: nand: orion: fix clk handling
In reply to Uwe Kleine-KönigQuoted 85 lines · On Mon, 13 Mar 2017 08:12:41 +0100 Uwe Kleine-K?nig…
Hello Simon,
Quoted 68 lines · Simon Baatz
The clk handling in
orion_nand.chad two problems:- In the probe function,
clk_put()was called for an enabled clock, which violates the API (see documentation forclk_put()ininclude/linux/clk.h)- In the error path of the probe function,
clk_put()could be called twice for the same clock.In order to clean this up, use the managed function
devm_clk_get()and store the pointer to the clk in the driver data.Fixes baffab28b13120694fa3ebab08d3e99667a851d2 ('ARM: Orion: fix driver probe error handling with respect to clk')Cc <[email protected]> # v4.5+Signed-off-by Simon Baatz <[email protected]>--- drivers/mtd/nand/orion_nand.c | 42 +++++++++++++++++++++--------------------- 1 file changed, 21 insertions(+), 21 deletions(-)drivers/mtd/nand/orion_nand.c +11
-5@@ -23,6 +23,11 @@#include <asm/sizes.h> #include <linux/platform_data/mtd-orion_nand.h> +struct orion_nand_info { +struct nand_chip chip; +struct clk *clk; +}; +static void orion_nand_cmd_ctrl (struct mtd_info *mtd,int cmd,unsigned int ctrl) {struct nand_chip *nc =mtd_to_nand (mtd);@@ -75,20 +80,21 @@ static void orion_nand_read_buf(struct mtd_info *mtd, uint8_t *buf, int len)static int __init orion_nand_probe (struct platform_device *pdev) { +struct orion_nand_info *info;struct mtd_info *mtd;struct nand_chip *nc;struct orion_nand_data *board;struct resource *res; -struct clk *clk;void __iomem *io_base;int ret =0 ;u32 val =0 ; - nc =devm_kzalloc (&pdev->dev, -sizeof (struct nand_chip ), + info =devm_kzalloc (&pdev->dev, +sizeof (struct orion_nand_info ),GFP_KERNEL ); -if (!nc) +if (!info)return -ENOMEM ; + nc = &info->chip; mtd =nand_to_mtd (nc); res =platform_get_resource (pdev,IORESOURCE_MEM ,0 );@@ -145,15 +151,13 @@ static int __init orion_nand_probe(struct platform_device *pdev)if (board->dev_ready) nc->dev_ready = board->dev_ready; -platform_set_drvdata (pdev, mtd); +platform_set_drvdata (pdev, info);drivers/mtd/nand/orion_nand.c static int __init orion_nand_probe(struct platform_device *pdev) · line 160
Quoted 10 lines
drivers/mtd/nand/orion_nand.c +3
-5/* Not all platforms can gate the clock, so it is not an error if the clock does not exists. */ - clk =clk_get (&pdev->dev,NULL ); -if (!IS_ERR (clk)) { -clk_prepare_enable (clk); -clk_put (clk); - } + info->clk =devm_clk_get (&pdev->dev,NULL ); +if (!IS_ERR (info->clk)) +clk_prepare_enable (info->clk);Orthogonal to your patch I suggest:
Review
Quoted 10 lines
(quoted diff) +7
-3- info->clk = devm_clk_get(&pdev->dev, NULL); - if (!IS_ERR(info->clk)) - clk_prepare_enable(info->clk); + info->clk = devm_clk_get_optional(&pdev->dev, NULL); + if (IS_ERR(info->clk)) { + ret = PTR_ERR(info->clk); + if (ret != -EPROBE_DEFER) + dev_err(...); + return ret; + }
In the meantime, maybe you can do:
info->clk = devm_clk_get(&pdev->dev, NULL);
if (IS_ERR(info->clk)) {
ret = PTR_ERR(info->clk);
if (ret == -ENOENT) {
/*
* This clk is optional, assign it to NULL when
* it's not present.
*/
info->clk = NULL;
} else {
if (ret == -EPROBE_DEFER)
dev_err(...);
return ret;
}
}This way, you won't have to check the info->clk value when you call clk_prepare_enable() or clk_disable_unprepare().
PATCH 1/1 mtd: nand: orion: fix clk handling
Quoted 119 lines · Boris Brezillon
Quoted 85 lines · On Mon, 13 Mar 2017 08:12:41 +0100 Uwe Kleine-K?nig…
Hello Simon,
Quoted 68 lines · Simon Baatz
The clk handling in
orion_nand.chad two problems:- In the probe function,
clk_put()was called for an enabled clock, which violates the API (see documentation forclk_put()ininclude/linux/clk.h)- In the error path of the probe function,
clk_put()could be called twice for the same clock.In order to clean this up, use the managed function
devm_clk_get()and store the pointer to the clk in the driver data.Fixes baffab28b13120694fa3ebab08d3e99667a851d2 ('ARM: Orion: fix driver probe error handling with respect to clk')Cc <[email protected]> # v4.5+Signed-off-by Simon Baatz <[email protected]>--- drivers/mtd/nand/orion_nand.c | 42 +++++++++++++++++++++--------------------- 1 file changed, 21 insertions(+), 21 deletions(-)drivers/mtd/nand/orion_nand.c +11
-5@@ -23,6 +23,11 @@#include <asm/sizes.h> #include <linux/platform_data/mtd-orion_nand.h> +struct orion_nand_info { +struct nand_chip chip; +struct clk *clk; +}; +static void orion_nand_cmd_ctrl (struct mtd_info *mtd,int cmd,unsigned int ctrl) {struct nand_chip *nc =mtd_to_nand (mtd);@@ -75,20 +80,21 @@ static void orion_nand_read_buf(struct mtd_info *mtd, uint8_t *buf, int len)static int __init orion_nand_probe (struct platform_device *pdev) { +struct orion_nand_info *info;struct mtd_info *mtd;struct nand_chip *nc;struct orion_nand_data *board;struct resource *res; -struct clk *clk;void __iomem *io_base;int ret =0 ;u32 val =0 ; - nc =devm_kzalloc (&pdev->dev, -sizeof (struct nand_chip ), + info =devm_kzalloc (&pdev->dev, +sizeof (struct orion_nand_info ),GFP_KERNEL ); -if (!nc) +if (!info)return -ENOMEM ; + nc = &info->chip; mtd =nand_to_mtd (nc); res =platform_get_resource (pdev,IORESOURCE_MEM ,0 );@@ -145,15 +151,13 @@ static int __init orion_nand_probe(struct platform_device *pdev)if (board->dev_ready) nc->dev_ready = board->dev_ready; -platform_set_drvdata (pdev, mtd); +platform_set_drvdata (pdev, info);drivers/mtd/nand/orion_nand.c static int __init orion_nand_probe(struct platform_device *pdev) · line 160
Quoted 10 lines
drivers/mtd/nand/orion_nand.c +3
-5/* Not all platforms can gate the clock, so it is not an error if the clock does not exists. */ - clk =clk_get (&pdev->dev,NULL ); -if (!IS_ERR (clk)) { -clk_prepare_enable (clk); -clk_put (clk); - } + info->clk =devm_clk_get (&pdev->dev,NULL ); +if (!IS_ERR (info->clk)) +clk_prepare_enable (info->clk);Orthogonal to your patch I suggest:
Review
Quoted 10 lines
(quoted diff) +7
-3- info->clk = devm_clk_get(&pdev->dev, NULL); - if (!IS_ERR(info->clk)) - clk_prepare_enable(info->clk); + info->clk = devm_clk_get_optional(&pdev->dev, NULL); + if (IS_ERR(info->clk)) { + ret = PTR_ERR(info->clk); + if (ret != -EPROBE_DEFER) + dev_err(...); + return ret; + }In the meantime, maybe you can do:
info->clk = devm_clk_get(&pdev->dev, NULL); if (IS_ERR(info->clk)) { ret = PTR_ERR(info->clk); if (ret == -ENOENT) { /* * This clk is optional, assign it to NULL when * it's not present. */ info->clk = NULL; } else { if (ret == -EPROBE_DEFER) dev_err(...); return ret; } }
Quoted 3 lines
This way, you won't have to check the
info->clkvalue when you callclk_prepare_enable()orclk_disable_unprepare().
Yes, this makes things simpler. I will add a second patch improving the error handling in v2 as you and Uwe suggested.
- Simon
PATCH 1/1 mtd: nand: orion: fix clk handling
Quoted 106 lines · On Thu, 16 Mar 2017 22:50:31 +0100 Simon Baatz <[email protected]> wrote:
Quoted 105 lines · Boris Brezillon
Quoted 85 lines · On Mon, 13 Mar 2017 08:12:41 +0100 Uwe Kleine-K?nig…
Hello Simon,
Quoted 68 lines · Simon Baatz
The clk handling in
orion_nand.chad two problems:- In the probe function,
clk_put()was called for an enabled clock, which violates the API (see documentation forclk_put()ininclude/linux/clk.h)- In the error path of the probe function,
clk_put()could be called twice for the same clock.In order to clean this up, use the managed function
devm_clk_get()and store the pointer to the clk in the driver data.Fixes baffab28b13120694fa3ebab08d3e99667a851d2 ('ARM: Orion: fix driver probe error handling with respect to clk')Cc <[email protected]> # v4.5+Signed-off-by Simon Baatz <[email protected]>--- drivers/mtd/nand/orion_nand.c | 42 +++++++++++++++++++++--------------------- 1 file changed, 21 insertions(+), 21 deletions(-)drivers/mtd/nand/orion_nand.c +11
-5@@ -23,6 +23,11 @@#include <asm/sizes.h> #include <linux/platform_data/mtd-orion_nand.h> +struct orion_nand_info { +struct nand_chip chip; +struct clk *clk; +}; +static void orion_nand_cmd_ctrl (struct mtd_info *mtd,int cmd,unsigned int ctrl) {struct nand_chip *nc =mtd_to_nand (mtd);@@ -75,20 +80,21 @@ static void orion_nand_read_buf(struct mtd_info *mtd, uint8_t *buf, int len)static int __init orion_nand_probe (struct platform_device *pdev) { +struct orion_nand_info *info;struct mtd_info *mtd;struct nand_chip *nc;struct orion_nand_data *board;struct resource *res; -struct clk *clk;void __iomem *io_base;int ret =0 ;u32 val =0 ; - nc =devm_kzalloc (&pdev->dev, -sizeof (struct nand_chip ), + info =devm_kzalloc (&pdev->dev, +sizeof (struct orion_nand_info ),GFP_KERNEL ); -if (!nc) +if (!info)return -ENOMEM ; + nc = &info->chip; mtd =nand_to_mtd (nc); res =platform_get_resource (pdev,IORESOURCE_MEM ,0 );@@ -145,15 +151,13 @@ static int __init orion_nand_probe(struct platform_device *pdev)if (board->dev_ready) nc->dev_ready = board->dev_ready; -platform_set_drvdata (pdev, mtd); +platform_set_drvdata (pdev, info);drivers/mtd/nand/orion_nand.c static int __init orion_nand_probe(struct platform_device *pdev) · line 160
Quoted 10 lines
drivers/mtd/nand/orion_nand.c +3
-5/* Not all platforms can gate the clock, so it is not an error if the clock does not exists. */ - clk =clk_get (&pdev->dev,NULL ); -if (!IS_ERR (clk)) { -clk_prepare_enable (clk); -clk_put (clk); - } + info->clk =devm_clk_get (&pdev->dev,NULL ); +if (!IS_ERR (info->clk)) +clk_prepare_enable (info->clk);Orthogonal to your patch I suggest:
Review
Quoted 10 lines
(quoted diff) +7
-3- info->clk = devm_clk_get(&pdev->dev, NULL); - if (!IS_ERR(info->clk)) - clk_prepare_enable(info->clk); + info->clk = devm_clk_get_optional(&pdev->dev, NULL); + if (IS_ERR(info->clk)) { + ret = PTR_ERR(info->clk); + if (ret != -EPROBE_DEFER) + dev_err(...); + return ret; + }In the meantime, maybe you can do:
info->clk = devm_clk_get(&pdev->dev, NULL); if (IS_ERR(info->clk)) { ret = PTR_ERR(info->clk);
Quoted 8 lines
Quoted 8 lines
if (ret == -ENOENT) { /* * This clk is optional, assign it to NULL when * it's not present. */ info->clk = NULL; } else { if (ret == -EPROBE_DEFER)
I meant != -EPROBE_DEFER here.
Quoted 15 lines
Quoted 9 lines
dev_err(...); return ret; } }This way, you won't have to check the
info->clkvalue when you callclk_prepare_enable()orclk_disable_unprepare().Yes, this makes things simpler. I will add a second patch improving the error handling in v2 as you and Uwe suggested.
- Simon
PATCH 1/1 mtd: nand: orion: fix clk handling
In reply to Simon BaatzHi Simon,
Quoted 24 lines · On Sun, 12 Mar 2017 22:34:06 +0100 Simon Baatz <[email protected]> wrote:
The clk handling in
orion_nand.chad two problems:- In the probe function,
clk_put()was called for an enabled clock, which violates the API (see documentation forclk_put()ininclude/linux/clk.h)- In the error path of the probe function,
clk_put()could be called twice for the same clock.In order to clean this up, use the managed function
devm_clk_get()and store the pointer to the clk in the driver data.Fixes baffab28b13120694fa3ebab08d3e99667a851d2 ('ARM: Orion: fix driver probe error handling with respect to clk')Cc <[email protected]> # v4.5+Signed-off-by Simon Baatz <[email protected]>--- drivers/mtd/nand/orion_nand.c | 42 +++++++++++++++++++++--------------------- 1 file changed, 21 insertions(+), 21 deletions(-)drivers/mtd/nand/orion_nand.c +0
-0
drivers/mtd/nand/orion_nand.c line 28
Quoted 6 lines
drivers/mtd/nand/orion_nand.c +3
-0@@ -23,6 +23,11 @@#include <asm/sizes.h> #include <linux/platform_data/mtd-orion_nand.h> +struct orion_nand_info { +struct nand_chip chip; +struct clk *clk;
Can we avoid this kind of alignment, which will not be preserved if someone adds a new field with a type that is longer than "struct nand_chip "?
Regards,
Boris
PATCH 1/1 mtd: nand: orion: fix clk handling
Hello Boris,
Quoted 32 lines · Boris Brezillon
Hi Simon,
Quoted 27 lines · On Sun, 12 Mar 2017 22:34:06 +0100 Simon Baatz <[email protected]> wrote:
The clk handling in
orion_nand.chad two problems:- In the probe function,
clk_put()was called for an enabled clock, which violates the API (see documentation forclk_put()ininclude/linux/clk.h)- In the error path of the probe function,
clk_put()could be called twice for the same clock.In order to clean this up, use the managed function
devm_clk_get()and store the pointer to the clk in the driver data.Fixes baffab28b13120694fa3ebab08d3e99667a851d2 ('ARM: Orion: fix driver probe error handling with respect to clk')Cc <[email protected]> # v4.5+Signed-off-by Simon Baatz <[email protected]>--- drivers/mtd/nand/orion_nand.c | 42 +++++++++++++++++++++--------------------- 1 file changed, 21 insertions(+), 21 deletions(-)drivers/mtd/nand/orion_nand.c +0
-0@@ -23,6 +23,11 @@#include <asm/sizes.h> #include <linux/platform_data/mtd-orion_nand.h>
Quoted 8 lines
drivers/mtd/nand/orion_nand.c line 28
Quoted 3 lines
drivers/mtd/nand/orion_nand.c +3
-0+struct orion_nand_info { +struct nand_chip chip; +struct clk *clk;Can we avoid this kind of alignment, which will not be preserved if someone adds a new field with a type that is longer than "struct
nand_chip"?
Sure. I will change that in v2.
- Simon