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

media: i2c: imx208: 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 imx208 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
5fa4f866 2753de70

+33 -35
+33 -35
drivers/media/i2c/imx208.c
··· 6 6 #include <linux/i2c.h> 7 7 #include <linux/module.h> 8 8 #include <linux/pm_runtime.h> 9 + #include <linux/unaligned.h> 10 + 9 11 #include <media/v4l2-ctrls.h> 10 12 #include <media/v4l2-device.h> 11 - #include <linux/unaligned.h> 12 13 13 14 #define IMX208_REG_MODE_SELECT 0x0100 14 15 #define IMX208_MODE_STANDBY 0x00 ··· 269 268 }; 270 269 271 270 struct imx208 { 271 + struct device *dev; 272 + 272 273 struct v4l2_subdev sd; 273 274 struct media_pad pad; 274 275 ··· 375 372 static int imx208_write_regs(struct imx208 *imx208, 376 373 const struct imx208_reg *regs, u32 len) 377 374 { 378 - struct i2c_client *client = v4l2_get_subdevdata(&imx208->sd); 379 375 unsigned int i; 380 376 int ret; 381 377 ··· 382 380 ret = imx208_write_reg(imx208, regs[i].address, 1, 383 381 regs[i].val); 384 382 if (ret) { 385 - dev_err_ratelimited(&client->dev, 383 + dev_err_ratelimited(imx208->dev, 386 384 "Failed to write reg 0x%4.4x. error = %d\n", 387 385 regs[i].address, ret); 388 386 ··· 433 431 { 434 432 struct imx208 *imx208 = 435 433 container_of(ctrl->handler, struct imx208, ctrl_handler); 436 - struct i2c_client *client = v4l2_get_subdevdata(&imx208->sd); 437 434 int ret; 438 435 439 436 /* 440 437 * Applying V4L2 control value only happens 441 438 * when power is up for streaming 442 439 */ 443 - if (!pm_runtime_get_if_in_use(&client->dev)) 440 + if (!pm_runtime_get_if_in_use(imx208->dev)) 444 441 return 0; 445 442 446 443 switch (ctrl->id) { ··· 472 471 break; 473 472 default: 474 473 ret = -EINVAL; 475 - dev_err(&client->dev, 474 + dev_err(imx208->dev, 476 475 "ctrl(id:0x%x,val:0x%x) is not handled\n", 477 476 ctrl->id, ctrl->val); 478 477 break; 479 478 } 480 479 481 - pm_runtime_put(&client->dev); 480 + pm_runtime_put(imx208->dev); 482 481 483 482 return ret; 484 483 } ··· 621 620 622 621 static int imx208_identify_module(struct imx208 *imx208) 623 622 { 624 - struct i2c_client *client = v4l2_get_subdevdata(&imx208->sd); 625 623 int ret; 626 624 u32 val; 627 625 ··· 630 630 ret = imx208_read_reg(imx208, IMX208_REG_CHIP_ID, 631 631 2, &val); 632 632 if (ret) { 633 - dev_err(&client->dev, "failed to read chip id %x\n", 633 + dev_err(imx208->dev, "failed to read chip id %x\n", 634 634 IMX208_CHIP_ID); 635 635 return ret; 636 636 } 637 637 638 638 if (val != IMX208_CHIP_ID) { 639 - dev_err(&client->dev, "chip id mismatch: %x!=%x\n", 639 + dev_err(imx208->dev, "chip id mismatch: %x!=%x\n", 640 640 IMX208_CHIP_ID, val); 641 641 return -EIO; 642 642 } ··· 649 649 /* Start streaming */ 650 650 static int imx208_start_streaming(struct imx208 *imx208) 651 651 { 652 - struct i2c_client *client = v4l2_get_subdevdata(&imx208->sd); 653 652 const struct imx208_reg_list *reg_list; 654 653 int ret, link_freq_index; 655 654 ··· 661 662 reg_list = &link_freq_configs[link_freq_index].reg_list; 662 663 ret = imx208_write_regs(imx208, reg_list->regs, reg_list->num_of_regs); 663 664 if (ret) { 664 - dev_err(&client->dev, "%s failed to set plls\n", __func__); 665 + dev_err(imx208->dev, "%s failed to set plls\n", __func__); 665 666 return ret; 666 667 } 667 668 ··· 669 670 reg_list = &imx208->cur_mode->reg_list; 670 671 ret = imx208_write_regs(imx208, reg_list->regs, reg_list->num_of_regs); 671 672 if (ret) { 672 - dev_err(&client->dev, "%s failed to set mode\n", __func__); 673 + dev_err(imx208->dev, "%s failed to set mode\n", __func__); 673 674 return ret; 674 675 } 675 676 ··· 686 687 /* Stop streaming */ 687 688 static int imx208_stop_streaming(struct imx208 *imx208) 688 689 { 689 - struct i2c_client *client = v4l2_get_subdevdata(&imx208->sd); 690 690 int ret; 691 691 692 692 /* set stream off register */ 693 693 ret = imx208_write_reg(imx208, IMX208_REG_MODE_SELECT, 694 694 1, IMX208_MODE_STANDBY); 695 695 if (ret) 696 - dev_err(&client->dev, "%s failed to set stream\n", __func__); 696 + dev_err(imx208->dev, "%s failed to set stream\n", __func__); 697 697 698 698 /* 699 699 * Return success even if it was an error, as there is nothing the ··· 704 706 static int imx208_set_stream(struct v4l2_subdev *sd, int enable) 705 707 { 706 708 struct imx208 *imx208 = to_imx208(sd); 707 - struct i2c_client *client = v4l2_get_subdevdata(sd); 708 709 int ret = 0; 709 710 710 711 mutex_lock(&imx208->imx208_mx); 711 712 712 713 if (enable) { 713 - ret = pm_runtime_resume_and_get(&client->dev); 714 + ret = pm_runtime_resume_and_get(imx208->dev); 714 715 if (ret) { 715 716 mutex_unlock(&imx208->imx208_mx); 716 717 return ret; ··· 724 727 goto err_rpm_put; 725 728 } else { 726 729 imx208_stop_streaming(imx208); 727 - pm_runtime_put(&client->dev); 730 + pm_runtime_put(imx208->dev); 728 731 } 729 732 730 733 mutex_unlock(&imx208->imx208_mx); ··· 736 739 return ret; 737 740 738 741 err_rpm_put: 739 - pm_runtime_put(&client->dev); 742 + pm_runtime_put(imx208->dev); 740 743 mutex_unlock(&imx208->imx208_mx); 741 744 742 745 return ret; ··· 775 778 if (imx208->otp_read) 776 779 goto out_unlock; 777 780 778 - ret = pm_runtime_resume_and_get(&client->dev); 781 + ret = pm_runtime_resume_and_get(imx208->dev); 779 782 if (ret) 780 783 goto out_unlock; 781 784 ··· 802 805 } 803 806 804 807 out_pm_put: 805 - pm_runtime_put(&client->dev); 808 + pm_runtime_put(imx208->dev); 806 809 807 810 out_unlock: 808 811 mutex_unlock(&imx208->imx208_mx); ··· 832 835 /* Initialize control handlers */ 833 836 static int imx208_init_controls(struct imx208 *imx208) 834 837 { 835 - struct i2c_client *client = v4l2_get_subdevdata(&imx208->sd); 836 838 struct v4l2_ctrl_handler *ctrl_hdlr = &imx208->ctrl_handler; 837 839 s64 exposure_max; 838 840 s64 vblank_def; ··· 910 914 911 915 if (ctrl_hdlr->error) { 912 916 ret = ctrl_hdlr->error; 913 - dev_err(&client->dev, "%s control init failed (%d)\n", 917 + dev_err(imx208->dev, "%s control init failed (%d)\n", 914 918 __func__, ret); 915 919 goto error; 916 920 } ··· 950 954 if (!imx208) 951 955 return -ENOMEM; 952 956 957 + imx208->dev = &client->dev; 958 + 953 959 /* Initialize subdev */ 954 960 v4l2_i2c_subdev_init(&imx208->sd, client, &imx208_subdev_ops); 955 961 956 - full_power = acpi_dev_state_d0(&client->dev); 962 + full_power = acpi_dev_state_d0(imx208->dev); 957 963 if (full_power) { 958 964 /* Check module identity */ 959 965 ret = imx208_identify_module(imx208); 960 966 if (ret) { 961 - dev_err(&client->dev, "failed to find sensor: %d", ret); 967 + dev_err(imx208->dev, "failed to find sensor: %d", ret); 962 968 goto error_probe; 963 969 } 964 970 } ··· 970 972 971 973 ret = imx208_init_controls(imx208); 972 974 if (ret) { 973 - dev_err(&client->dev, "failed to init controls: %d", ret); 975 + dev_err(imx208->dev, "failed to init controls: %d", ret); 974 976 goto error_probe; 975 977 } 976 978 ··· 983 985 imx208->pad.flags = MEDIA_PAD_FL_SOURCE; 984 986 ret = media_entity_pads_init(&imx208->sd.entity, 1, &imx208->pad); 985 987 if (ret) { 986 - dev_err(&client->dev, "%s failed:%d\n", __func__, ret); 988 + dev_err(imx208->dev, "%s failed:%d\n", __func__, ret); 987 989 goto error_handler_free; 988 990 } 989 991 ··· 991 993 if (ret < 0) 992 994 goto error_media_entity; 993 995 994 - ret = device_create_bin_file(&client->dev, &bin_attr_otp); 996 + ret = device_create_bin_file(imx208->dev, &bin_attr_otp); 995 997 if (ret) { 996 - dev_err(&client->dev, "sysfs otp creation failed\n"); 998 + dev_err(imx208->dev, "sysfs otp creation failed\n"); 997 999 goto error_async_subdev; 998 1000 } 999 1001 1000 1002 /* Set the device's state to active if it's in D0 state. */ 1001 1003 if (full_power) 1002 - pm_runtime_set_active(&client->dev); 1003 - pm_runtime_enable(&client->dev); 1004 - pm_runtime_idle(&client->dev); 1004 + pm_runtime_set_active(imx208->dev); 1005 + pm_runtime_enable(imx208->dev); 1006 + pm_runtime_idle(imx208->dev); 1005 1007 1006 1008 return 0; 1007 1009 ··· 1025 1027 struct v4l2_subdev *sd = i2c_get_clientdata(client); 1026 1028 struct imx208 *imx208 = to_imx208(sd); 1027 1029 1028 - device_remove_bin_file(&client->dev, &bin_attr_otp); 1030 + device_remove_bin_file(imx208->dev, &bin_attr_otp); 1029 1031 v4l2_async_unregister_subdev(sd); 1030 1032 media_entity_cleanup(&sd->entity); 1031 1033 imx208_free_controls(imx208); 1032 1034 1033 - pm_runtime_disable(&client->dev); 1034 - pm_runtime_set_suspended(&client->dev); 1035 + pm_runtime_disable(imx208->dev); 1036 + pm_runtime_set_suspended(imx208->dev); 1035 1037 1036 1038 mutex_destroy(&imx208->imx208_mx); 1037 1039 }