Message ID | 19a2be1aeb0d935b433d0b0eff0dabaeaaaa3de7.1703830854.git.hanshu-oc@zhaoxin.com |
---|---|
State | Superseded |
Headers | show |
Series | i2c: add zhaoxin i2c controller driver | expand |
Hi Hans, On Fri, Dec 29, 2023 at 02:30:32PM +0800, Hans Hu wrote: > v4->v5: > add previous prototype 'static' for wmt_i2c_init(). > > Some common initialization actions are put in the function > wmt_i2c_init(), which is convenient to share with zhaoxin. > > Signed-off-by: Hans Hu <hanshu-oc@zhaoxin.com> > --- > drivers/i2c/busses/i2c-wmt.c | 67 +++++++++++++++++++----------------- > 1 file changed, 36 insertions(+), 31 deletions(-) > > diff --git a/drivers/i2c/busses/i2c-wmt.c b/drivers/i2c/busses/i2c-wmt.c > index ec2a8da134e5..f1888f100d83 100644 > --- a/drivers/i2c/busses/i2c-wmt.c > +++ b/drivers/i2c/busses/i2c-wmt.c > @@ -286,6 +286,38 @@ static irqreturn_t wmt_i2c_isr(int irq, void *data) > return IRQ_HANDLED; > } > > +static int wmt_i2c_init(struct platform_device *pdev, struct wmt_i2c_dev **pi2c_dev) looks good, I would rather make this a static struct wmt_i2c_dev *wmt_i2c_init(struct platform_device *pdev) { struct wmt_i2c_dev *i2c_dev; ... return i2c_dev; } kind of function and call it as: i2c_dev = wmt_i2c_init(...); if (IS_ERR(i2c_dev)) return ERR_PTR(i2c_dev); Not a binding comment. It just looks nicer; in that case I would call the function wmt_i2c_dev_alloc(). In any case: Reviewed-by: Andi Shyti <andi.shyti@kernel.org> Andi > +{ > + int err; > + struct wmt_i2c_dev *i2c_dev; > + struct device_node *np = pdev->dev.of_node; > + > + i2c_dev = devm_kzalloc(&pdev->dev, sizeof(*i2c_dev), GFP_KERNEL); > + if (!i2c_dev) > + return -ENOMEM; > + > + i2c_dev->base = devm_platform_get_and_ioremap_resource(pdev, 0, NULL); > + if (IS_ERR(i2c_dev->base)) > + return PTR_ERR(i2c_dev->base); > + > + i2c_dev->irq = irq_of_parse_and_map(np, 0); > + if (!i2c_dev->irq) > + return -EINVAL; > + > + err = devm_request_irq(&pdev->dev, i2c_dev->irq, wmt_i2c_isr, > + 0, pdev->name, i2c_dev); > + if (err) > + return dev_err_probe(&pdev->dev, err, > + "failed to request irq %i\n", i2c_dev->irq); > + > + i2c_dev->dev = &pdev->dev; > + init_completion(&i2c_dev->complete); > + platform_set_drvdata(pdev, i2c_dev); > + > + *pi2c_dev = i2c_dev; > + return 0; > +} > + > static int wmt_i2c_reset_hardware(struct wmt_i2c_dev *i2c_dev) > { > int err; > @@ -327,19 +359,9 @@ static int wmt_i2c_probe(struct platform_device *pdev) > int err; > u32 clk_rate; > > - i2c_dev = devm_kzalloc(&pdev->dev, sizeof(*i2c_dev), GFP_KERNEL); > - if (!i2c_dev) > - return -ENOMEM; > - > - i2c_dev->base = devm_platform_get_and_ioremap_resource(pdev, 0, NULL); > - if (IS_ERR(i2c_dev->base)) > - return PTR_ERR(i2c_dev->base); > - > - i2c_dev->irq = irq_of_parse_and_map(np, 0); > - if (!i2c_dev->irq) { > - dev_err(&pdev->dev, "irq missing or invalid\n"); > - return -EINVAL; > - } > + err = wmt_i2c_init(pdev, &i2c_dev); > + if (err) > + return err; > > i2c_dev->clk = of_clk_get(np, 0); > if (IS_ERR(i2c_dev->clk)) { > @@ -351,15 +373,6 @@ static int wmt_i2c_probe(struct platform_device *pdev) > if (!err && (clk_rate == I2C_MAX_FAST_MODE_FREQ)) > i2c_dev->tcr = TCR_FAST_MODE; > > - i2c_dev->dev = &pdev->dev; > - > - err = devm_request_irq(&pdev->dev, i2c_dev->irq, wmt_i2c_isr, 0, > - "i2c", i2c_dev); > - if (err) { > - dev_err(&pdev->dev, "failed to request irq %i\n", i2c_dev->irq); > - return err; > - } > - > adap = &i2c_dev->adapter; > i2c_set_adapdata(adap, i2c_dev); > strscpy(adap->name, "WMT I2C adapter", sizeof(adap->name)); > @@ -368,21 +381,13 @@ static int wmt_i2c_probe(struct platform_device *pdev) > adap->dev.parent = &pdev->dev; > adap->dev.of_node = pdev->dev.of_node; > > - init_completion(&i2c_dev->complete); > - > err = wmt_i2c_reset_hardware(i2c_dev); > if (err) { > dev_err(&pdev->dev, "error initializing hardware\n"); > return err; > } > > - err = i2c_add_adapter(adap); > - if (err) > - return err; > - > - platform_set_drvdata(pdev, i2c_dev); > - > - return 0; > + return i2c_add_adapter(adap); > } > > static void wmt_i2c_remove(struct platform_device *pdev) > -- > 2.34.1 >
On 2024/1/3 20:56, Andi Shyti wrote: > Hi Hans, > > On Fri, Dec 29, 2023 at 02:30:32PM +0800, Hans Hu wrote: >> v4->v5: >> add previous prototype 'static' for wmt_i2c_init(). >> >> Some common initialization actions are put in the function >> wmt_i2c_init(), which is convenient to share with zhaoxin. >> >> Signed-off-by: Hans Hu <hanshu-oc@zhaoxin.com> >> --- >> drivers/i2c/busses/i2c-wmt.c | 67 +++++++++++++++++++----------------- >> 1 file changed, 36 insertions(+), 31 deletions(-) >> >> diff --git a/drivers/i2c/busses/i2c-wmt.c b/drivers/i2c/busses/i2c-wmt.c >> index ec2a8da134e5..f1888f100d83 100644 >> --- a/drivers/i2c/busses/i2c-wmt.c >> +++ b/drivers/i2c/busses/i2c-wmt.c >> @@ -286,6 +286,38 @@ static irqreturn_t wmt_i2c_isr(int irq, void *data) >> return IRQ_HANDLED; >> } >> >> +static int wmt_i2c_init(struct platform_device *pdev, struct wmt_i2c_dev **pi2c_dev) > looks good, I would rather make this a > > static struct wmt_i2c_dev *wmt_i2c_init(struct platform_device *pdev) > { > struct wmt_i2c_dev *i2c_dev; > ... > return i2c_dev; > } > > kind of function and call it as: > > i2c_dev = wmt_i2c_init(...); > if (IS_ERR(i2c_dev)) > return ERR_PTR(i2c_dev); > > Not a binding comment. It just looks nicer; in that case I would > call the function wmt_i2c_dev_alloc(). OK, will change it. > In any case: > > Reviewed-by: Andi Shyti <andi.shyti@kernel.org> > > Andi >
diff --git a/drivers/i2c/busses/i2c-wmt.c b/drivers/i2c/busses/i2c-wmt.c index ec2a8da134e5..f1888f100d83 100644 --- a/drivers/i2c/busses/i2c-wmt.c +++ b/drivers/i2c/busses/i2c-wmt.c @@ -286,6 +286,38 @@ static irqreturn_t wmt_i2c_isr(int irq, void *data) return IRQ_HANDLED; } +static int wmt_i2c_init(struct platform_device *pdev, struct wmt_i2c_dev **pi2c_dev) +{ + int err; + struct wmt_i2c_dev *i2c_dev; + struct device_node *np = pdev->dev.of_node; + + i2c_dev = devm_kzalloc(&pdev->dev, sizeof(*i2c_dev), GFP_KERNEL); + if (!i2c_dev) + return -ENOMEM; + + i2c_dev->base = devm_platform_get_and_ioremap_resource(pdev, 0, NULL); + if (IS_ERR(i2c_dev->base)) + return PTR_ERR(i2c_dev->base); + + i2c_dev->irq = irq_of_parse_and_map(np, 0); + if (!i2c_dev->irq) + return -EINVAL; + + err = devm_request_irq(&pdev->dev, i2c_dev->irq, wmt_i2c_isr, + 0, pdev->name, i2c_dev); + if (err) + return dev_err_probe(&pdev->dev, err, + "failed to request irq %i\n", i2c_dev->irq); + + i2c_dev->dev = &pdev->dev; + init_completion(&i2c_dev->complete); + platform_set_drvdata(pdev, i2c_dev); + + *pi2c_dev = i2c_dev; + return 0; +} + static int wmt_i2c_reset_hardware(struct wmt_i2c_dev *i2c_dev) { int err; @@ -327,19 +359,9 @@ static int wmt_i2c_probe(struct platform_device *pdev) int err; u32 clk_rate; - i2c_dev = devm_kzalloc(&pdev->dev, sizeof(*i2c_dev), GFP_KERNEL); - if (!i2c_dev) - return -ENOMEM; - - i2c_dev->base = devm_platform_get_and_ioremap_resource(pdev, 0, NULL); - if (IS_ERR(i2c_dev->base)) - return PTR_ERR(i2c_dev->base); - - i2c_dev->irq = irq_of_parse_and_map(np, 0); - if (!i2c_dev->irq) { - dev_err(&pdev->dev, "irq missing or invalid\n"); - return -EINVAL; - } + err = wmt_i2c_init(pdev, &i2c_dev); + if (err) + return err; i2c_dev->clk = of_clk_get(np, 0); if (IS_ERR(i2c_dev->clk)) { @@ -351,15 +373,6 @@ static int wmt_i2c_probe(struct platform_device *pdev) if (!err && (clk_rate == I2C_MAX_FAST_MODE_FREQ)) i2c_dev->tcr = TCR_FAST_MODE; - i2c_dev->dev = &pdev->dev; - - err = devm_request_irq(&pdev->dev, i2c_dev->irq, wmt_i2c_isr, 0, - "i2c", i2c_dev); - if (err) { - dev_err(&pdev->dev, "failed to request irq %i\n", i2c_dev->irq); - return err; - } - adap = &i2c_dev->adapter; i2c_set_adapdata(adap, i2c_dev); strscpy(adap->name, "WMT I2C adapter", sizeof(adap->name)); @@ -368,21 +381,13 @@ static int wmt_i2c_probe(struct platform_device *pdev) adap->dev.parent = &pdev->dev; adap->dev.of_node = pdev->dev.of_node; - init_completion(&i2c_dev->complete); - err = wmt_i2c_reset_hardware(i2c_dev); if (err) { dev_err(&pdev->dev, "error initializing hardware\n"); return err; } - err = i2c_add_adapter(adap); - if (err) - return err; - - platform_set_drvdata(pdev, i2c_dev); - - return 0; + return i2c_add_adapter(adap); } static void wmt_i2c_remove(struct platform_device *pdev)
v4->v5: add previous prototype 'static' for wmt_i2c_init(). Some common initialization actions are put in the function wmt_i2c_init(), which is convenient to share with zhaoxin. Signed-off-by: Hans Hu <hanshu-oc@zhaoxin.com> --- drivers/i2c/busses/i2c-wmt.c | 67 +++++++++++++++++++----------------- 1 file changed, 36 insertions(+), 31 deletions(-)