summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWolfram Sang <wsa+renesas@sang-engineering.com>2019-08-09 11:40:47 -0400
committerWolfram Sang <wsa@the-dreams.de>2019-08-14 08:54:55 -0400
commitaf80559b4d9cd481c63505edbe425ff6bad4ab8d (patch)
tree0efb9a5c6681c7abb60769cc13aae08ab4ce6205
parentbbeb6b6c07960b8d33bed5352ef462228110c5ab (diff)
i2c: replace i2c_new_secondary_device with an ERR_PTR variant
In the general move to have i2c_new_*_device functions which return ERR_PTR instead of NULL, this patch converts i2c_new_secondary_device(). There are only few users, so this patch converts the I2C core and all users in one go. The function gets renamed to i2c_new_ancillary_device() so out-of-tree users will get a build failure to understand they need to adapt their error checking code. Signed-off-by: Wolfram Sang <wsa+renesas@sang-engineering.com> Reviewed-by: Kieran Bingham <kieran.bingham+renesas@ideasonboard.com> # adv748x Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> # adv7511 + adv7604 Reviewed-by: Hans Verkuil <hverkuil-cisco@xs4all.nl> # adv7604 Signed-off-by: Wolfram Sang <wsa@the-dreams.de>
-rw-r--r--drivers/gpu/drm/bridge/adv7511/adv7511_drv.c18
-rw-r--r--drivers/i2c/i2c-core-base.c10
-rw-r--r--drivers/media/i2c/adv748x/adv748x-core.c6
-rw-r--r--drivers/media/i2c/adv7604.c22
-rw-r--r--include/linux/i2c.h2
5 files changed, 30 insertions, 28 deletions
diff --git a/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c b/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c
index f6d2681f6927..9e13e466e72c 100644
--- a/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c
+++ b/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c
@@ -981,10 +981,10 @@ static int adv7511_init_cec_regmap(struct adv7511 *adv)
981{ 981{
982 int ret; 982 int ret;
983 983
984 adv->i2c_cec = i2c_new_secondary_device(adv->i2c_main, "cec", 984 adv->i2c_cec = i2c_new_ancillary_device(adv->i2c_main, "cec",
985 ADV7511_CEC_I2C_ADDR_DEFAULT); 985 ADV7511_CEC_I2C_ADDR_DEFAULT);
986 if (!adv->i2c_cec) 986 if (IS_ERR(adv->i2c_cec))
987 return -EINVAL; 987 return PTR_ERR(adv->i2c_cec);
988 i2c_set_clientdata(adv->i2c_cec, adv); 988 i2c_set_clientdata(adv->i2c_cec, adv);
989 989
990 adv->regmap_cec = devm_regmap_init_i2c(adv->i2c_cec, 990 adv->regmap_cec = devm_regmap_init_i2c(adv->i2c_cec,
@@ -1165,20 +1165,20 @@ static int adv7511_probe(struct i2c_client *i2c, const struct i2c_device_id *id)
1165 1165
1166 adv7511_packet_disable(adv7511, 0xffff); 1166 adv7511_packet_disable(adv7511, 0xffff);
1167 1167
1168 adv7511->i2c_edid = i2c_new_secondary_device(i2c, "edid", 1168 adv7511->i2c_edid = i2c_new_ancillary_device(i2c, "edid",
1169 ADV7511_EDID_I2C_ADDR_DEFAULT); 1169 ADV7511_EDID_I2C_ADDR_DEFAULT);
1170 if (!adv7511->i2c_edid) { 1170 if (IS_ERR(adv7511->i2c_edid)) {
1171 ret = -EINVAL; 1171 ret = PTR_ERR(adv7511->i2c_edid);
1172 goto uninit_regulators; 1172 goto uninit_regulators;
1173 } 1173 }
1174 1174
1175 regmap_write(adv7511->regmap, ADV7511_REG_EDID_I2C_ADDR, 1175 regmap_write(adv7511->regmap, ADV7511_REG_EDID_I2C_ADDR,
1176 adv7511->i2c_edid->addr << 1); 1176 adv7511->i2c_edid->addr << 1);
1177 1177
1178 adv7511->i2c_packet = i2c_new_secondary_device(i2c, "packet", 1178 adv7511->i2c_packet = i2c_new_ancillary_device(i2c, "packet",
1179 ADV7511_PACKET_I2C_ADDR_DEFAULT); 1179 ADV7511_PACKET_I2C_ADDR_DEFAULT);
1180 if (!adv7511->i2c_packet) { 1180 if (IS_ERR(adv7511->i2c_packet)) {
1181 ret = -EINVAL; 1181 ret = PTR_ERR(adv7511->i2c_packet);
1182 goto err_i2c_unregister_edid; 1182 goto err_i2c_unregister_edid;
1183 } 1183 }
1184 1184
diff --git a/drivers/i2c/i2c-core-base.c b/drivers/i2c/i2c-core-base.c
index b4d84bd475da..ca10525e6d94 100644
--- a/drivers/i2c/i2c-core-base.c
+++ b/drivers/i2c/i2c-core-base.c
@@ -964,7 +964,7 @@ struct i2c_client *devm_i2c_new_dummy_device(struct device *dev,
964EXPORT_SYMBOL_GPL(devm_i2c_new_dummy_device); 964EXPORT_SYMBOL_GPL(devm_i2c_new_dummy_device);
965 965
966/** 966/**
967 * i2c_new_secondary_device - Helper to get the instantiated secondary address 967 * i2c_new_ancillary_device - Helper to get the instantiated secondary address
968 * and create the associated device 968 * and create the associated device
969 * @client: Handle to the primary client 969 * @client: Handle to the primary client
970 * @name: Handle to specify which secondary address to get 970 * @name: Handle to specify which secondary address to get
@@ -983,9 +983,9 @@ EXPORT_SYMBOL_GPL(devm_i2c_new_dummy_device);
983 * cell whose "reg-names" value matches the slave name. 983 * cell whose "reg-names" value matches the slave name.
984 * 984 *
985 * This returns the new i2c client, which should be saved for later use with 985 * This returns the new i2c client, which should be saved for later use with
986 * i2c_unregister_device(); or NULL to indicate an error. 986 * i2c_unregister_device(); or an ERR_PTR to describe the error.
987 */ 987 */
988struct i2c_client *i2c_new_secondary_device(struct i2c_client *client, 988struct i2c_client *i2c_new_ancillary_device(struct i2c_client *client,
989 const char *name, 989 const char *name,
990 u16 default_addr) 990 u16 default_addr)
991{ 991{
@@ -1000,9 +1000,9 @@ struct i2c_client *i2c_new_secondary_device(struct i2c_client *client,
1000 } 1000 }
1001 1001
1002 dev_dbg(&client->adapter->dev, "Address for %s : 0x%x\n", name, addr); 1002 dev_dbg(&client->adapter->dev, "Address for %s : 0x%x\n", name, addr);
1003 return i2c_new_dummy(client->adapter, addr); 1003 return i2c_new_dummy_device(client->adapter, addr);
1004} 1004}
1005EXPORT_SYMBOL_GPL(i2c_new_secondary_device); 1005EXPORT_SYMBOL_GPL(i2c_new_ancillary_device);
1006 1006
1007/* ------------------------------------------------------------------------- */ 1007/* ------------------------------------------------------------------------- */
1008 1008
diff --git a/drivers/media/i2c/adv748x/adv748x-core.c b/drivers/media/i2c/adv748x/adv748x-core.c
index f57cd77a32fa..2567de2b0037 100644
--- a/drivers/media/i2c/adv748x/adv748x-core.c
+++ b/drivers/media/i2c/adv748x/adv748x-core.c
@@ -183,14 +183,14 @@ static int adv748x_initialise_clients(struct adv748x_state *state)
183 int ret; 183 int ret;
184 184
185 for (i = ADV748X_PAGE_DPLL; i < ADV748X_PAGE_MAX; ++i) { 185 for (i = ADV748X_PAGE_DPLL; i < ADV748X_PAGE_MAX; ++i) {
186 state->i2c_clients[i] = i2c_new_secondary_device( 186 state->i2c_clients[i] = i2c_new_ancillary_device(
187 state->client, 187 state->client,
188 adv748x_default_addresses[i].name, 188 adv748x_default_addresses[i].name,
189 adv748x_default_addresses[i].default_addr); 189 adv748x_default_addresses[i].default_addr);
190 190
191 if (state->i2c_clients[i] == NULL) { 191 if (IS_ERR(state->i2c_clients[i])) {
192 adv_err(state, "failed to create i2c client %u\n", i); 192 adv_err(state, "failed to create i2c client %u\n", i);
193 return -ENOMEM; 193 return PTR_ERR(state->i2c_clients[i]);
194 } 194 }
195 195
196 ret = adv748x_configure_regmap(state, i); 196 ret = adv748x_configure_regmap(state, i);
diff --git a/drivers/media/i2c/adv7604.c b/drivers/media/i2c/adv7604.c
index 28a84bf9f8a9..2dedd6ebb236 100644
--- a/drivers/media/i2c/adv7604.c
+++ b/drivers/media/i2c/adv7604.c
@@ -2862,10 +2862,8 @@ static void adv76xx_unregister_clients(struct adv76xx_state *state)
2862{ 2862{
2863 unsigned int i; 2863 unsigned int i;
2864 2864
2865 for (i = 1; i < ARRAY_SIZE(state->i2c_clients); ++i) { 2865 for (i = 1; i < ARRAY_SIZE(state->i2c_clients); ++i)
2866 if (state->i2c_clients[i]) 2866 i2c_unregister_device(state->i2c_clients[i]);
2867 i2c_unregister_device(state->i2c_clients[i]);
2868 }
2869} 2867}
2870 2868
2871static struct i2c_client *adv76xx_dummy_client(struct v4l2_subdev *sd, 2869static struct i2c_client *adv76xx_dummy_client(struct v4l2_subdev *sd,
@@ -2878,14 +2876,14 @@ static struct i2c_client *adv76xx_dummy_client(struct v4l2_subdev *sd,
2878 struct i2c_client *new_client; 2876 struct i2c_client *new_client;
2879 2877
2880 if (pdata && pdata->i2c_addresses[page]) 2878 if (pdata && pdata->i2c_addresses[page])
2881 new_client = i2c_new_dummy(client->adapter, 2879 new_client = i2c_new_dummy_device(client->adapter,
2882 pdata->i2c_addresses[page]); 2880 pdata->i2c_addresses[page]);
2883 else 2881 else
2884 new_client = i2c_new_secondary_device(client, 2882 new_client = i2c_new_ancillary_device(client,
2885 adv76xx_default_addresses[page].name, 2883 adv76xx_default_addresses[page].name,
2886 adv76xx_default_addresses[page].default_addr); 2884 adv76xx_default_addresses[page].default_addr);
2887 2885
2888 if (new_client) 2886 if (!IS_ERR(new_client))
2889 io_write(sd, io_reg, new_client->addr << 1); 2887 io_write(sd, io_reg, new_client->addr << 1);
2890 2888
2891 return new_client; 2889 return new_client;
@@ -3516,15 +3514,19 @@ static int adv76xx_probe(struct i2c_client *client,
3516 } 3514 }
3517 3515
3518 for (i = 1; i < ADV76XX_PAGE_MAX; ++i) { 3516 for (i = 1; i < ADV76XX_PAGE_MAX; ++i) {
3517 struct i2c_client *dummy_client;
3518
3519 if (!(BIT(i) & state->info->page_mask)) 3519 if (!(BIT(i) & state->info->page_mask))
3520 continue; 3520 continue;
3521 3521
3522 state->i2c_clients[i] = adv76xx_dummy_client(sd, i); 3522 dummy_client = adv76xx_dummy_client(sd, i);
3523 if (!state->i2c_clients[i]) { 3523 if (IS_ERR(dummy_client)) {
3524 err = -EINVAL; 3524 err = PTR_ERR(dummy_client);
3525 v4l2_err(sd, "failed to create i2c client %u\n", i); 3525 v4l2_err(sd, "failed to create i2c client %u\n", i);
3526 goto err_i2c; 3526 goto err_i2c;
3527 } 3527 }
3528
3529 state->i2c_clients[i] = dummy_client;
3528 } 3530 }
3529 3531
3530 INIT_DELAYED_WORK(&state->delayed_work_enable_hotplug, 3532 INIT_DELAYED_WORK(&state->delayed_work_enable_hotplug,
diff --git a/include/linux/i2c.h b/include/linux/i2c.h
index fa5552c2307b..ebbe024dd9e0 100644
--- a/include/linux/i2c.h
+++ b/include/linux/i2c.h
@@ -473,7 +473,7 @@ extern struct i2c_client *
473devm_i2c_new_dummy_device(struct device *dev, struct i2c_adapter *adap, u16 address); 473devm_i2c_new_dummy_device(struct device *dev, struct i2c_adapter *adap, u16 address);
474 474
475extern struct i2c_client * 475extern struct i2c_client *
476i2c_new_secondary_device(struct i2c_client *client, 476i2c_new_ancillary_device(struct i2c_client *client,
477 const char *name, 477 const char *name,
478 u16 default_addr); 478 u16 default_addr);
479 479