Skip to content

Commit 6cc3026

Browse files
committed
Merge branch 'i2c/for-current' of git://git.kernel.org/pub/scm/linux/kernel/git/wsa/linux
Pull i2c fixes from Wolfram Sang: "We had various reports of problems with deferred probing in the I2C subsystem, so this pull requst is a little bigger than usual. Most issues should be addressed now so devices will be found correctly. A few ususal driver bugfixes are in here, too" * 'i2c/for-current' of git://git.kernel.org/pub/scm/linux/kernel/git/wsa/linux: i2c: i2c-mux-pinctrl: use deferred probe when adapter not found i2c: i2c-arb-gpio-challenge: use deferred probe when adapter not found i2c: i2c-mux-gpio: use deferred probing i2c: i2c-mux-gpio: don't ignore of_get_named_gpio errors i2c: omap: Clear ARDY bit twice i2c: Not all adapters have a parent i2c: i2c-stu300: replace platform_driver_probe to support deferred probing i2c: i2c-mxs: replace platform_driver_probe to support deferred probing i2c: i2c-imx: replace platform_driver_probe to support deferred probing i2c: i2c-designware-platdrv: replace platform_driver_probe to support deferred probing
2 parents c786e90 + 2737de4 commit 6cc3026

File tree

9 files changed

+34
-22
lines changed

9 files changed

+34
-22
lines changed

drivers/i2c/busses/i2c-designware-platdrv.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -270,7 +270,8 @@ static SIMPLE_DEV_PM_OPS(dw_i2c_dev_pm_ops, dw_i2c_suspend, dw_i2c_resume);
270270
MODULE_ALIAS("platform:i2c_designware");
271271

272272
static struct platform_driver dw_i2c_driver = {
273-
.remove = dw_i2c_remove,
273+
.probe = dw_i2c_probe,
274+
.remove = dw_i2c_remove,
274275
.driver = {
275276
.name = "i2c_designware",
276277
.owner = THIS_MODULE,
@@ -282,7 +283,7 @@ static struct platform_driver dw_i2c_driver = {
282283

283284
static int __init dw_i2c_init_driver(void)
284285
{
285-
return platform_driver_probe(&dw_i2c_driver, dw_i2c_probe);
286+
return platform_driver_register(&dw_i2c_driver);
286287
}
287288
subsys_initcall(dw_i2c_init_driver);
288289

drivers/i2c/busses/i2c-imx.c

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -365,7 +365,7 @@ static void i2c_imx_stop(struct imx_i2c_struct *i2c_imx)
365365
clk_disable_unprepare(i2c_imx->clk);
366366
}
367367

368-
static void __init i2c_imx_set_clk(struct imx_i2c_struct *i2c_imx,
368+
static void i2c_imx_set_clk(struct imx_i2c_struct *i2c_imx,
369369
unsigned int rate)
370370
{
371371
struct imx_i2c_clk_pair *i2c_clk_div = i2c_imx->hwdata->clk_div;
@@ -589,7 +589,7 @@ static struct i2c_algorithm i2c_imx_algo = {
589589
.functionality = i2c_imx_func,
590590
};
591591

592-
static int __init i2c_imx_probe(struct platform_device *pdev)
592+
static int i2c_imx_probe(struct platform_device *pdev)
593593
{
594594
const struct of_device_id *of_id = of_match_device(i2c_imx_dt_ids,
595595
&pdev->dev);
@@ -697,7 +697,7 @@ static int __init i2c_imx_probe(struct platform_device *pdev)
697697
return 0; /* Return OK */
698698
}
699699

700-
static int __exit i2c_imx_remove(struct platform_device *pdev)
700+
static int i2c_imx_remove(struct platform_device *pdev)
701701
{
702702
struct imx_i2c_struct *i2c_imx = platform_get_drvdata(pdev);
703703

@@ -715,7 +715,8 @@ static int __exit i2c_imx_remove(struct platform_device *pdev)
715715
}
716716

717717
static struct platform_driver i2c_imx_driver = {
718-
.remove = __exit_p(i2c_imx_remove),
718+
.probe = i2c_imx_probe,
719+
.remove = i2c_imx_remove,
719720
.driver = {
720721
.name = DRIVER_NAME,
721722
.owner = THIS_MODULE,
@@ -726,7 +727,7 @@ static struct platform_driver i2c_imx_driver = {
726727

727728
static int __init i2c_adap_imx_init(void)
728729
{
729-
return platform_driver_probe(&i2c_imx_driver, i2c_imx_probe);
730+
return platform_driver_register(&i2c_imx_driver);
730731
}
731732
subsys_initcall(i2c_adap_imx_init);
732733

drivers/i2c/busses/i2c-mxs.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -780,12 +780,13 @@ static struct platform_driver mxs_i2c_driver = {
780780
.owner = THIS_MODULE,
781781
.of_match_table = mxs_i2c_dt_ids,
782782
},
783+
.probe = mxs_i2c_probe,
783784
.remove = mxs_i2c_remove,
784785
};
785786

786787
static int __init mxs_i2c_init(void)
787788
{
788-
return platform_driver_probe(&mxs_i2c_driver, mxs_i2c_probe);
789+
return platform_driver_register(&mxs_i2c_driver);
789790
}
790791
subsys_initcall(mxs_i2c_init);
791792

drivers/i2c/busses/i2c-omap.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -939,6 +939,9 @@ omap_i2c_isr_thread(int this_irq, void *dev_id)
939939
/*
940940
* ProDB0017052: Clear ARDY bit twice
941941
*/
942+
if (stat & OMAP_I2C_STAT_ARDY)
943+
omap_i2c_ack_stat(dev, OMAP_I2C_STAT_ARDY);
944+
942945
if (stat & (OMAP_I2C_STAT_ARDY | OMAP_I2C_STAT_NACK |
943946
OMAP_I2C_STAT_AL)) {
944947
omap_i2c_ack_stat(dev, (OMAP_I2C_STAT_RRDY |

drivers/i2c/busses/i2c-stu300.c

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -859,8 +859,7 @@ static const struct i2c_algorithm stu300_algo = {
859859
.functionality = stu300_func,
860860
};
861861

862-
static int __init
863-
stu300_probe(struct platform_device *pdev)
862+
static int stu300_probe(struct platform_device *pdev)
864863
{
865864
struct stu300_dev *dev;
866865
struct i2c_adapter *adap;
@@ -966,8 +965,7 @@ static SIMPLE_DEV_PM_OPS(stu300_pm, stu300_suspend, stu300_resume);
966965
#define STU300_I2C_PM NULL
967966
#endif
968967

969-
static int __exit
970-
stu300_remove(struct platform_device *pdev)
968+
static int stu300_remove(struct platform_device *pdev)
971969
{
972970
struct stu300_dev *dev = platform_get_drvdata(pdev);
973971

@@ -989,13 +987,14 @@ static struct platform_driver stu300_i2c_driver = {
989987
.pm = STU300_I2C_PM,
990988
.of_match_table = stu300_dt_match,
991989
},
992-
.remove = __exit_p(stu300_remove),
990+
.probe = stu300_probe,
991+
.remove = stu300_remove,
993992

994993
};
995994

996995
static int __init stu300_init(void)
997996
{
998-
return platform_driver_probe(&stu300_i2c_driver, stu300_probe);
997+
return platform_driver_register(&stu300_i2c_driver);
999998
}
1000999

10011000
static void __exit stu300_exit(void)

drivers/i2c/i2c-core.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1134,6 +1134,9 @@ static void acpi_i2c_register_devices(struct i2c_adapter *adap)
11341134
acpi_handle handle;
11351135
acpi_status status;
11361136

1137+
if (!adap->dev.parent)
1138+
return;
1139+
11371140
handle = ACPI_HANDLE(adap->dev.parent);
11381141
if (!handle)
11391142
return;

drivers/i2c/muxes/i2c-arb-gpio-challenge.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -200,7 +200,7 @@ static int i2c_arbitrator_probe(struct platform_device *pdev)
200200
arb->parent = of_find_i2c_adapter_by_node(parent_np);
201201
if (!arb->parent) {
202202
dev_err(dev, "Cannot find parent bus\n");
203-
return -EINVAL;
203+
return -EPROBE_DEFER;
204204
}
205205

206206
/* Actually add the mux adapter */

drivers/i2c/muxes/i2c-mux-gpio.c

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ static int i2c_mux_gpio_probe_dt(struct gpiomux *mux,
6666
struct device_node *adapter_np, *child;
6767
struct i2c_adapter *adapter;
6868
unsigned *values, *gpios;
69-
int i = 0;
69+
int i = 0, ret;
7070

7171
if (!np)
7272
return -ENODEV;
@@ -79,7 +79,7 @@ static int i2c_mux_gpio_probe_dt(struct gpiomux *mux,
7979
adapter = of_find_i2c_adapter_by_node(adapter_np);
8080
if (!adapter) {
8181
dev_err(&pdev->dev, "Cannot find parent bus\n");
82-
return -ENODEV;
82+
return -EPROBE_DEFER;
8383
}
8484
mux->data.parent = i2c_adapter_id(adapter);
8585
put_device(&adapter->dev);
@@ -116,8 +116,12 @@ static int i2c_mux_gpio_probe_dt(struct gpiomux *mux,
116116
return -ENOMEM;
117117
}
118118

119-
for (i = 0; i < mux->data.n_gpios; i++)
120-
gpios[i] = of_get_named_gpio(np, "mux-gpios", i);
119+
for (i = 0; i < mux->data.n_gpios; i++) {
120+
ret = of_get_named_gpio(np, "mux-gpios", i);
121+
if (ret < 0)
122+
return ret;
123+
gpios[i] = ret;
124+
}
121125

122126
mux->data.gpios = gpios;
123127

@@ -177,7 +181,7 @@ static int i2c_mux_gpio_probe(struct platform_device *pdev)
177181
if (!parent) {
178182
dev_err(&pdev->dev, "Parent adapter (%d) not found\n",
179183
mux->data.parent);
180-
return -ENODEV;
184+
return -EPROBE_DEFER;
181185
}
182186

183187
mux->parent = parent;

drivers/i2c/muxes/i2c-mux-pinctrl.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ static int i2c_mux_pinctrl_parse_dt(struct i2c_mux_pinctrl *mux,
113113
adapter = of_find_i2c_adapter_by_node(adapter_np);
114114
if (!adapter) {
115115
dev_err(mux->dev, "Cannot find parent bus\n");
116-
return -ENODEV;
116+
return -EPROBE_DEFER;
117117
}
118118
mux->pdata->parent_bus_num = i2c_adapter_id(adapter);
119119
put_device(&adapter->dev);
@@ -211,7 +211,7 @@ static int i2c_mux_pinctrl_probe(struct platform_device *pdev)
211211
if (!mux->parent) {
212212
dev_err(&pdev->dev, "Parent adapter (%d) not found\n",
213213
mux->pdata->parent_bus_num);
214-
ret = -ENODEV;
214+
ret = -EPROBE_DEFER;
215215
goto err;
216216
}
217217

0 commit comments

Comments
 (0)