Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

media: i2c: imx258: Replace client->dev usage

The driver needs to access the struct device in many places, and
retrieves it from the i2c_client itself retrieved with
v4l2_get_subdevdata(). Store it as a pointer in struct imx258 and access
it from there instead, to simplify the driver.

While at it, fix a mistake in the sort order of include statements.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com>
Reviewed-by: Mehdi Djait <mehdi.djait@linux.intel.com>
Signed-off-by: Hans Verkuil <hverkuil+cisco@kernel.org>

authored by

Laurent Pinchart and committed by
Mauro Carvalho Chehab
4b23f780 d2d7488b

+49 -51
+49 -51
drivers/media/i2c/imx258.c
··· 8 8 #include <linux/module.h> 9 9 #include <linux/pm_runtime.h> 10 10 #include <linux/regulator/consumer.h> 11 + #include <linux/unaligned.h> 12 + 11 13 #include <media/v4l2-cci.h> 12 14 #include <media/v4l2-ctrls.h> 13 15 #include <media/v4l2-device.h> 14 16 #include <media/v4l2-fwnode.h> 15 - #include <linux/unaligned.h> 16 17 17 18 #define IMX258_REG_MODE_SELECT CCI_REG8(0x0100) 18 19 #define IMX258_MODE_STANDBY 0x00 ··· 646 645 }; 647 646 648 647 struct imx258 { 648 + struct device *dev; 649 + 649 650 struct v4l2_subdev sd; 650 651 struct media_pad pad; 651 652 struct regmap *regmap; ··· 754 751 { 755 752 struct imx258 *imx258 = 756 753 container_of(ctrl->handler, struct imx258, ctrl_handler); 757 - struct i2c_client *client = v4l2_get_subdevdata(&imx258->sd); 758 754 int ret = 0; 759 755 760 756 /* ··· 767 765 * Applying V4L2 control value only happens 768 766 * when power is up for streaming 769 767 */ 770 - if (pm_runtime_get_if_in_use(&client->dev) == 0) 768 + if (pm_runtime_get_if_in_use(imx258->dev) == 0) 771 769 return 0; 772 770 773 771 switch (ctrl->id) { ··· 813 811 NULL); 814 812 break; 815 813 default: 816 - dev_info(&client->dev, 814 + dev_info(imx258->dev, 817 815 "ctrl(id:0x%x,val:0x%x) is not handled\n", 818 816 ctrl->id, ctrl->val); 819 817 ret = -EINVAL; 820 818 break; 821 819 } 822 820 823 - pm_runtime_put(&client->dev); 821 + pm_runtime_put(imx258->dev); 824 822 825 823 return ret; 826 824 } ··· 1015 1013 /* Start streaming */ 1016 1014 static int imx258_start_streaming(struct imx258 *imx258) 1017 1015 { 1018 - struct i2c_client *client = v4l2_get_subdevdata(&imx258->sd); 1019 1016 const struct imx258_reg_list *reg_list; 1020 1017 const struct imx258_link_freq_config *link_freq_cfg; 1021 1018 int ret, link_freq_index; 1022 1019 1023 1020 ret = cci_write(imx258->regmap, IMX258_REG_RESET, 0x01, NULL); 1024 1021 if (ret) { 1025 - dev_err(&client->dev, "%s failed to reset sensor\n", __func__); 1022 + dev_err(imx258->dev, "%s failed to reset sensor\n", __func__); 1026 1023 return ret; 1027 1024 } 1028 1025 ··· 1035 1034 reg_list = &link_freq_cfg->link_cfg[imx258->lane_mode_idx].reg_list; 1036 1035 ret = cci_multi_reg_write(imx258->regmap, reg_list->regs, reg_list->num_of_regs, NULL); 1037 1036 if (ret) { 1038 - dev_err(&client->dev, "%s failed to set plls\n", __func__); 1037 + dev_err(imx258->dev, "%s failed to set plls\n", __func__); 1039 1038 return ret; 1040 1039 } 1041 1040 1042 1041 ret = cci_multi_reg_write(imx258->regmap, mode_common_regs, 1043 1042 ARRAY_SIZE(mode_common_regs), NULL); 1044 1043 if (ret) { 1045 - dev_err(&client->dev, "%s failed to set common regs\n", __func__); 1044 + dev_err(imx258->dev, "%s failed to set common regs\n", __func__); 1046 1045 return ret; 1047 1046 } 1048 1047 1049 1048 ret = cci_multi_reg_write(imx258->regmap, imx258->variant_cfg->regs, 1050 1049 imx258->variant_cfg->num_regs, NULL); 1051 1050 if (ret) { 1052 - dev_err(&client->dev, "%s failed to set variant config\n", 1051 + dev_err(imx258->dev, "%s failed to set variant config\n", 1053 1052 __func__); 1054 1053 return ret; 1055 1054 } ··· 1058 1057 !!(imx258->csi2_flags & V4L2_MBUS_CSI2_NONCONTINUOUS_CLOCK), 1059 1058 NULL); 1060 1059 if (ret) { 1061 - dev_err(&client->dev, "%s failed to set clock lane mode\n", __func__); 1060 + dev_err(imx258->dev, "%s failed to set clock lane mode\n", __func__); 1062 1061 return ret; 1063 1062 } 1064 1063 ··· 1066 1065 reg_list = &imx258->cur_mode->reg_list; 1067 1066 ret = cci_multi_reg_write(imx258->regmap, reg_list->regs, reg_list->num_of_regs, NULL); 1068 1067 if (ret) { 1069 - dev_err(&client->dev, "%s failed to set mode\n", __func__); 1068 + dev_err(imx258->dev, "%s failed to set mode\n", __func__); 1070 1069 return ret; 1071 1070 } 1072 1071 ··· 1083 1082 /* Stop streaming */ 1084 1083 static int imx258_stop_streaming(struct imx258 *imx258) 1085 1084 { 1086 - struct i2c_client *client = v4l2_get_subdevdata(&imx258->sd); 1087 1085 int ret; 1088 1086 1089 1087 /* set stream off register */ 1090 1088 ret = cci_write(imx258->regmap, IMX258_REG_MODE_SELECT, 1091 1089 IMX258_MODE_STANDBY, NULL); 1092 1090 if (ret) 1093 - dev_err(&client->dev, "%s failed to set stream\n", __func__); 1091 + dev_err(imx258->dev, "%s failed to set stream\n", __func__); 1094 1092 1095 1093 /* 1096 1094 * Return success even if it was an error, as there is nothing the ··· 1135 1135 static int imx258_set_stream(struct v4l2_subdev *sd, int enable) 1136 1136 { 1137 1137 struct imx258 *imx258 = to_imx258(sd); 1138 - struct i2c_client *client = v4l2_get_subdevdata(sd); 1139 1138 int ret = 0; 1140 1139 1141 1140 mutex_lock(&imx258->mutex); 1142 1141 1143 1142 if (enable) { 1144 - ret = pm_runtime_resume_and_get(&client->dev); 1143 + ret = pm_runtime_resume_and_get(imx258->dev); 1145 1144 if (ret < 0) 1146 1145 goto err_unlock; 1147 1146 ··· 1153 1154 goto err_rpm_put; 1154 1155 } else { 1155 1156 imx258_stop_streaming(imx258); 1156 - pm_runtime_put(&client->dev); 1157 + pm_runtime_put(imx258->dev); 1157 1158 } 1158 1159 1159 1160 mutex_unlock(&imx258->mutex); ··· 1161 1162 return ret; 1162 1163 1163 1164 err_rpm_put: 1164 - pm_runtime_put(&client->dev); 1165 + pm_runtime_put(imx258->dev); 1165 1166 err_unlock: 1166 1167 mutex_unlock(&imx258->mutex); 1167 1168 ··· 1171 1172 /* Verify chip ID */ 1172 1173 static int imx258_identify_module(struct imx258 *imx258) 1173 1174 { 1174 - struct i2c_client *client = v4l2_get_subdevdata(&imx258->sd); 1175 1175 int ret; 1176 1176 u64 val; 1177 1177 1178 1178 ret = cci_read(imx258->regmap, IMX258_REG_CHIP_ID, 1179 1179 &val, NULL); 1180 1180 if (ret) { 1181 - dev_err(&client->dev, "failed to read chip id %x\n", 1181 + dev_err(imx258->dev, "failed to read chip id %x\n", 1182 1182 IMX258_CHIP_ID); 1183 1183 return ret; 1184 1184 } 1185 1185 1186 1186 if (val != IMX258_CHIP_ID) { 1187 - dev_err(&client->dev, "chip id mismatch: %x!=%llx\n", 1187 + dev_err(imx258->dev, "chip id mismatch: %x!=%llx\n", 1188 1188 IMX258_CHIP_ID, val); 1189 1189 return -EIO; 1190 1190 } ··· 1215 1217 /* Initialize control handlers */ 1216 1218 static int imx258_init_controls(struct imx258 *imx258) 1217 1219 { 1218 - struct i2c_client *client = v4l2_get_subdevdata(&imx258->sd); 1219 1220 const struct imx258_link_freq_config *link_freq_cfgs; 1220 1221 struct v4l2_fwnode_device_properties props; 1221 1222 struct v4l2_ctrl_handler *ctrl_hdlr; ··· 1305 1308 1306 1309 if (ctrl_hdlr->error) { 1307 1310 ret = ctrl_hdlr->error; 1308 - dev_err(&client->dev, "%s control init failed (%d)\n", 1311 + dev_err(imx258->dev, "%s control init failed (%d)\n", 1309 1312 __func__, ret); 1310 1313 goto error; 1311 1314 } 1312 1315 1313 - ret = v4l2_fwnode_device_parse(&client->dev, &props); 1316 + ret = v4l2_fwnode_device_parse(imx258->dev, &props); 1314 1317 if (ret) 1315 1318 goto error; 1316 1319 ··· 1336 1339 mutex_destroy(&imx258->mutex); 1337 1340 } 1338 1341 1339 - static int imx258_get_regulators(struct imx258 *imx258, 1340 - struct i2c_client *client) 1342 + static int imx258_get_regulators(struct imx258 *imx258) 1341 1343 { 1342 1344 unsigned int i; 1343 1345 1344 1346 for (i = 0; i < IMX258_NUM_SUPPLIES; i++) 1345 1347 imx258->supplies[i].supply = imx258_supply_name[i]; 1346 1348 1347 - return devm_regulator_bulk_get(&client->dev, 1349 + return devm_regulator_bulk_get(imx258->dev, 1348 1350 IMX258_NUM_SUPPLIES, imx258->supplies); 1349 1351 } 1350 1352 ··· 1361 1365 if (!imx258) 1362 1366 return -ENOMEM; 1363 1367 1368 + imx258->dev = &client->dev; 1369 + 1364 1370 imx258->regmap = devm_cci_regmap_init_i2c(client, 16); 1365 1371 if (IS_ERR(imx258->regmap)) { 1366 1372 ret = PTR_ERR(imx258->regmap); 1367 - dev_err(&client->dev, "failed to initialize CCI: %d\n", ret); 1373 + dev_err(imx258->dev, "failed to initialize CCI: %d\n", ret); 1368 1374 return ret; 1369 1375 } 1370 1376 1371 - ret = imx258_get_regulators(imx258, client); 1377 + ret = imx258_get_regulators(imx258); 1372 1378 if (ret) 1373 - return dev_err_probe(&client->dev, ret, 1379 + return dev_err_probe(imx258->dev, ret, 1374 1380 "failed to get regulators\n"); 1375 1381 1376 - imx258->clk = devm_clk_get_optional(&client->dev, NULL); 1382 + imx258->clk = devm_clk_get_optional(imx258->dev, NULL); 1377 1383 if (IS_ERR(imx258->clk)) 1378 - return dev_err_probe(&client->dev, PTR_ERR(imx258->clk), 1384 + return dev_err_probe(imx258->dev, PTR_ERR(imx258->clk), 1379 1385 "error getting clock\n"); 1380 1386 if (!imx258->clk) { 1381 - dev_dbg(&client->dev, 1387 + dev_dbg(imx258->dev, 1382 1388 "no clock provided, using clock-frequency property\n"); 1383 1389 1384 - device_property_read_u32(&client->dev, "clock-frequency", &val); 1390 + device_property_read_u32(imx258->dev, "clock-frequency", &val); 1385 1391 } else { 1386 1392 val = clk_get_rate(imx258->clk); 1387 1393 } ··· 1398 1400 imx258->link_freq_menu_items = link_freq_menu_items_24; 1399 1401 break; 1400 1402 default: 1401 - dev_err(&client->dev, "input clock frequency of %u not supported\n", 1403 + dev_err(imx258->dev, "input clock frequency of %u not supported\n", 1402 1404 val); 1403 1405 return -EINVAL; 1404 1406 } 1405 1407 1406 - endpoint = fwnode_graph_get_next_endpoint(dev_fwnode(&client->dev), NULL); 1408 + endpoint = fwnode_graph_get_next_endpoint(dev_fwnode(imx258->dev), NULL); 1407 1409 if (!endpoint) { 1408 - dev_err(&client->dev, "Endpoint node not found\n"); 1410 + dev_err(imx258->dev, "Endpoint node not found\n"); 1409 1411 return -EINVAL; 1410 1412 } 1411 1413 1412 1414 ret = v4l2_fwnode_endpoint_alloc_parse(endpoint, &ep); 1413 1415 fwnode_handle_put(endpoint); 1414 1416 if (ret) { 1415 - dev_err(&client->dev, "Parsing endpoint node failed\n"); 1417 + dev_err(imx258->dev, "Parsing endpoint node failed\n"); 1416 1418 return ret; 1417 1419 } 1418 1420 1419 - ret = v4l2_link_freq_to_bitmap(&client->dev, 1421 + ret = v4l2_link_freq_to_bitmap(imx258->dev, 1420 1422 ep.link_frequencies, 1421 1423 ep.nr_of_link_frequencies, 1422 1424 imx258->link_freq_menu_items, 1423 1425 ARRAY_SIZE(link_freq_menu_items_19_2), 1424 1426 &imx258->link_freq_bitmap); 1425 1427 if (ret) { 1426 - dev_err(&client->dev, "Link frequency not supported\n"); 1428 + dev_err(imx258->dev, "Link frequency not supported\n"); 1427 1429 goto error_endpoint_free; 1428 1430 } 1429 1431 ··· 1436 1438 imx258->lane_mode_idx = IMX258_4_LANE_MODE; 1437 1439 break; 1438 1440 default: 1439 - dev_err(&client->dev, "Invalid data lanes: %u\n", 1441 + dev_err(imx258->dev, "Invalid data lanes: %u\n", 1440 1442 ep.bus.mipi_csi2.num_data_lanes); 1441 1443 ret = -EINVAL; 1442 1444 goto error_endpoint_free; ··· 1444 1446 1445 1447 imx258->csi2_flags = ep.bus.mipi_csi2.flags; 1446 1448 1447 - imx258->variant_cfg = device_get_match_data(&client->dev); 1449 + imx258->variant_cfg = device_get_match_data(imx258->dev); 1448 1450 if (!imx258->variant_cfg) 1449 1451 imx258->variant_cfg = &imx258_cfg; 1450 1452 ··· 1452 1454 v4l2_i2c_subdev_init(&imx258->sd, client, &imx258_subdev_ops); 1453 1455 1454 1456 /* Will be powered off via pm_runtime_idle */ 1455 - ret = imx258_power_on(&client->dev); 1457 + ret = imx258_power_on(imx258->dev); 1456 1458 if (ret) 1457 1459 goto error_endpoint_free; 1458 1460 ··· 1484 1486 if (ret < 0) 1485 1487 goto error_media_entity; 1486 1488 1487 - pm_runtime_set_active(&client->dev); 1488 - pm_runtime_enable(&client->dev); 1489 - pm_runtime_idle(&client->dev); 1489 + pm_runtime_set_active(imx258->dev); 1490 + pm_runtime_enable(imx258->dev); 1491 + pm_runtime_idle(imx258->dev); 1490 1492 v4l2_fwnode_endpoint_free(&ep); 1491 1493 1492 1494 return 0; ··· 1498 1500 imx258_free_controls(imx258); 1499 1501 1500 1502 error_identify: 1501 - imx258_power_off(&client->dev); 1503 + imx258_power_off(imx258->dev); 1502 1504 1503 1505 error_endpoint_free: 1504 1506 v4l2_fwnode_endpoint_free(&ep); ··· 1515 1517 media_entity_cleanup(&sd->entity); 1516 1518 imx258_free_controls(imx258); 1517 1519 1518 - pm_runtime_disable(&client->dev); 1519 - if (!pm_runtime_status_suspended(&client->dev)) 1520 - imx258_power_off(&client->dev); 1521 - pm_runtime_set_suspended(&client->dev); 1520 + pm_runtime_disable(imx258->dev); 1521 + if (!pm_runtime_status_suspended(imx258->dev)) 1522 + imx258_power_off(imx258->dev); 1523 + pm_runtime_set_suspended(imx258->dev); 1522 1524 } 1523 1525 1524 1526 static const struct dev_pm_ops imx258_pm_ops = {