root/drivers/media/i2c/ov7251.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. to_ov7251
  2. ov7251_regulators_enable
  3. ov7251_regulators_disable
  4. ov7251_write_reg
  5. ov7251_write_seq_regs
  6. ov7251_read_reg
  7. ov7251_set_exposure
  8. ov7251_set_gain
  9. ov7251_set_register_array
  10. ov7251_set_power_on
  11. ov7251_set_power_off
  12. ov7251_s_power
  13. ov7251_set_hflip
  14. ov7251_set_vflip
  15. ov7251_set_test_pattern
  16. ov7251_s_ctrl
  17. ov7251_enum_mbus_code
  18. ov7251_enum_frame_size
  19. ov7251_enum_frame_ival
  20. __ov7251_get_pad_format
  21. ov7251_get_format
  22. __ov7251_get_pad_crop
  23. avg_fps
  24. ov7251_find_mode_by_ival
  25. ov7251_set_format
  26. ov7251_entity_init_cfg
  27. ov7251_get_selection
  28. ov7251_s_stream
  29. ov7251_get_frame_interval
  30. ov7251_set_frame_interval
  31. ov7251_probe
  32. ov7251_remove

   1 // SPDX-License-Identifier: GPL-2.0
   2 /*
   3  * Driver for the OV7251 camera sensor.
   4  *
   5  * Copyright (c) 2017-2018, The Linux Foundation. All rights reserved.
   6  * Copyright (c) 2017-2018, Linaro Ltd.
   7  */
   8 
   9 #include <linux/bitops.h>
  10 #include <linux/clk.h>
  11 #include <linux/delay.h>
  12 #include <linux/device.h>
  13 #include <linux/gpio/consumer.h>
  14 #include <linux/i2c.h>
  15 #include <linux/init.h>
  16 #include <linux/module.h>
  17 #include <linux/regulator/consumer.h>
  18 #include <linux/slab.h>
  19 #include <linux/types.h>
  20 #include <media/v4l2-ctrls.h>
  21 #include <media/v4l2-fwnode.h>
  22 #include <media/v4l2-subdev.h>
  23 
  24 #define OV7251_SC_MODE_SELECT           0x0100
  25 #define OV7251_SC_MODE_SELECT_SW_STANDBY        0x0
  26 #define OV7251_SC_MODE_SELECT_STREAMING         0x1
  27 
  28 #define OV7251_CHIP_ID_HIGH             0x300a
  29 #define OV7251_CHIP_ID_HIGH_BYTE        0x77
  30 #define OV7251_CHIP_ID_LOW              0x300b
  31 #define OV7251_CHIP_ID_LOW_BYTE         0x50
  32 #define OV7251_SC_GP_IO_IN1             0x3029
  33 #define OV7251_AEC_EXPO_0               0x3500
  34 #define OV7251_AEC_EXPO_1               0x3501
  35 #define OV7251_AEC_EXPO_2               0x3502
  36 #define OV7251_AEC_AGC_ADJ_0            0x350a
  37 #define OV7251_AEC_AGC_ADJ_1            0x350b
  38 #define OV7251_TIMING_FORMAT1           0x3820
  39 #define OV7251_TIMING_FORMAT1_VFLIP     BIT(2)
  40 #define OV7251_TIMING_FORMAT2           0x3821
  41 #define OV7251_TIMING_FORMAT2_MIRROR    BIT(2)
  42 #define OV7251_PRE_ISP_00               0x5e00
  43 #define OV7251_PRE_ISP_00_TEST_PATTERN  BIT(7)
  44 
  45 struct reg_value {
  46         u16 reg;
  47         u8 val;
  48 };
  49 
  50 struct ov7251_mode_info {
  51         u32 width;
  52         u32 height;
  53         const struct reg_value *data;
  54         u32 data_size;
  55         u32 pixel_clock;
  56         u32 link_freq;
  57         u16 exposure_max;
  58         u16 exposure_def;
  59         struct v4l2_fract timeperframe;
  60 };
  61 
  62 struct ov7251 {
  63         struct i2c_client *i2c_client;
  64         struct device *dev;
  65         struct v4l2_subdev sd;
  66         struct media_pad pad;
  67         struct v4l2_fwnode_endpoint ep;
  68         struct v4l2_mbus_framefmt fmt;
  69         struct v4l2_rect crop;
  70         struct clk *xclk;
  71         u32 xclk_freq;
  72 
  73         struct regulator *io_regulator;
  74         struct regulator *core_regulator;
  75         struct regulator *analog_regulator;
  76 
  77         const struct ov7251_mode_info *current_mode;
  78 
  79         struct v4l2_ctrl_handler ctrls;
  80         struct v4l2_ctrl *pixel_clock;
  81         struct v4l2_ctrl *link_freq;
  82         struct v4l2_ctrl *exposure;
  83         struct v4l2_ctrl *gain;
  84 
  85         /* Cached register values */
  86         u8 aec_pk_manual;
  87         u8 pre_isp_00;
  88         u8 timing_format1;
  89         u8 timing_format2;
  90 
  91         struct mutex lock; /* lock to protect power state, ctrls and mode */
  92         bool power_on;
  93 
  94         struct gpio_desc *enable_gpio;
  95 };
  96 
  97 static inline struct ov7251 *to_ov7251(struct v4l2_subdev *sd)
  98 {
  99         return container_of(sd, struct ov7251, sd);
 100 }
 101 
 102 static const struct reg_value ov7251_global_init_setting[] = {
 103         { 0x0103, 0x01 },
 104         { 0x303b, 0x02 },
 105 };
 106 
 107 static const struct reg_value ov7251_setting_vga_30fps[] = {
 108         { 0x3005, 0x00 },
 109         { 0x3012, 0xc0 },
 110         { 0x3013, 0xd2 },
 111         { 0x3014, 0x04 },
 112         { 0x3016, 0xf0 },
 113         { 0x3017, 0xf0 },
 114         { 0x3018, 0xf0 },
 115         { 0x301a, 0xf0 },
 116         { 0x301b, 0xf0 },
 117         { 0x301c, 0xf0 },
 118         { 0x3023, 0x05 },
 119         { 0x3037, 0xf0 },
 120         { 0x3098, 0x04 }, /* pll2 pre divider */
 121         { 0x3099, 0x28 }, /* pll2 multiplier */
 122         { 0x309a, 0x05 }, /* pll2 sys divider */
 123         { 0x309b, 0x04 }, /* pll2 adc divider */
 124         { 0x309d, 0x00 }, /* pll2 divider */
 125         { 0x30b0, 0x0a }, /* pll1 pix divider */
 126         { 0x30b1, 0x01 }, /* pll1 divider */
 127         { 0x30b3, 0x64 }, /* pll1 multiplier */
 128         { 0x30b4, 0x03 }, /* pll1 pre divider */
 129         { 0x30b5, 0x05 }, /* pll1 mipi divider */
 130         { 0x3106, 0xda },
 131         { 0x3503, 0x07 },
 132         { 0x3509, 0x10 },
 133         { 0x3600, 0x1c },
 134         { 0x3602, 0x62 },
 135         { 0x3620, 0xb7 },
 136         { 0x3622, 0x04 },
 137         { 0x3626, 0x21 },
 138         { 0x3627, 0x30 },
 139         { 0x3630, 0x44 },
 140         { 0x3631, 0x35 },
 141         { 0x3634, 0x60 },
 142         { 0x3636, 0x00 },
 143         { 0x3662, 0x01 },
 144         { 0x3663, 0x70 },
 145         { 0x3664, 0x50 },
 146         { 0x3666, 0x0a },
 147         { 0x3669, 0x1a },
 148         { 0x366a, 0x00 },
 149         { 0x366b, 0x50 },
 150         { 0x3673, 0x01 },
 151         { 0x3674, 0xff },
 152         { 0x3675, 0x03 },
 153         { 0x3705, 0xc1 },
 154         { 0x3709, 0x40 },
 155         { 0x373c, 0x08 },
 156         { 0x3742, 0x00 },
 157         { 0x3757, 0xb3 },
 158         { 0x3788, 0x00 },
 159         { 0x37a8, 0x01 },
 160         { 0x37a9, 0xc0 },
 161         { 0x3800, 0x00 },
 162         { 0x3801, 0x04 },
 163         { 0x3802, 0x00 },
 164         { 0x3803, 0x04 },
 165         { 0x3804, 0x02 },
 166         { 0x3805, 0x8b },
 167         { 0x3806, 0x01 },
 168         { 0x3807, 0xeb },
 169         { 0x3808, 0x02 }, /* width high */
 170         { 0x3809, 0x80 }, /* width low */
 171         { 0x380a, 0x01 }, /* height high */
 172         { 0x380b, 0xe0 }, /* height low */
 173         { 0x380c, 0x03 }, /* total horiz timing high */
 174         { 0x380d, 0xa0 }, /* total horiz timing low */
 175         { 0x380e, 0x06 }, /* total vertical timing high */
 176         { 0x380f, 0xbc }, /* total vertical timing low */
 177         { 0x3810, 0x00 },
 178         { 0x3811, 0x04 },
 179         { 0x3812, 0x00 },
 180         { 0x3813, 0x05 },
 181         { 0x3814, 0x11 },
 182         { 0x3815, 0x11 },
 183         { 0x3820, 0x40 },
 184         { 0x3821, 0x00 },
 185         { 0x382f, 0x0e },
 186         { 0x3832, 0x00 },
 187         { 0x3833, 0x05 },
 188         { 0x3834, 0x00 },
 189         { 0x3835, 0x0c },
 190         { 0x3837, 0x00 },
 191         { 0x3b80, 0x00 },
 192         { 0x3b81, 0xa5 },
 193         { 0x3b82, 0x10 },
 194         { 0x3b83, 0x00 },
 195         { 0x3b84, 0x08 },
 196         { 0x3b85, 0x00 },
 197         { 0x3b86, 0x01 },
 198         { 0x3b87, 0x00 },
 199         { 0x3b88, 0x00 },
 200         { 0x3b89, 0x00 },
 201         { 0x3b8a, 0x00 },
 202         { 0x3b8b, 0x05 },
 203         { 0x3b8c, 0x00 },
 204         { 0x3b8d, 0x00 },
 205         { 0x3b8e, 0x00 },
 206         { 0x3b8f, 0x1a },
 207         { 0x3b94, 0x05 },
 208         { 0x3b95, 0xf2 },
 209         { 0x3b96, 0x40 },
 210         { 0x3c00, 0x89 },
 211         { 0x3c01, 0x63 },
 212         { 0x3c02, 0x01 },
 213         { 0x3c03, 0x00 },
 214         { 0x3c04, 0x00 },
 215         { 0x3c05, 0x03 },
 216         { 0x3c06, 0x00 },
 217         { 0x3c07, 0x06 },
 218         { 0x3c0c, 0x01 },
 219         { 0x3c0d, 0xd0 },
 220         { 0x3c0e, 0x02 },
 221         { 0x3c0f, 0x0a },
 222         { 0x4001, 0x42 },
 223         { 0x4004, 0x04 },
 224         { 0x4005, 0x00 },
 225         { 0x404e, 0x01 },
 226         { 0x4300, 0xff },
 227         { 0x4301, 0x00 },
 228         { 0x4315, 0x00 },
 229         { 0x4501, 0x48 },
 230         { 0x4600, 0x00 },
 231         { 0x4601, 0x4e },
 232         { 0x4801, 0x0f },
 233         { 0x4806, 0x0f },
 234         { 0x4819, 0xaa },
 235         { 0x4823, 0x3e },
 236         { 0x4837, 0x19 },
 237         { 0x4a0d, 0x00 },
 238         { 0x4a47, 0x7f },
 239         { 0x4a49, 0xf0 },
 240         { 0x4a4b, 0x30 },
 241         { 0x5000, 0x85 },
 242         { 0x5001, 0x80 },
 243 };
 244 
 245 static const struct reg_value ov7251_setting_vga_60fps[] = {
 246         { 0x3005, 0x00 },
 247         { 0x3012, 0xc0 },
 248         { 0x3013, 0xd2 },
 249         { 0x3014, 0x04 },
 250         { 0x3016, 0x10 },
 251         { 0x3017, 0x00 },
 252         { 0x3018, 0x00 },
 253         { 0x301a, 0x00 },
 254         { 0x301b, 0x00 },
 255         { 0x301c, 0x00 },
 256         { 0x3023, 0x05 },
 257         { 0x3037, 0xf0 },
 258         { 0x3098, 0x04 }, /* pll2 pre divider */
 259         { 0x3099, 0x28 }, /* pll2 multiplier */
 260         { 0x309a, 0x05 }, /* pll2 sys divider */
 261         { 0x309b, 0x04 }, /* pll2 adc divider */
 262         { 0x309d, 0x00 }, /* pll2 divider */
 263         { 0x30b0, 0x0a }, /* pll1 pix divider */
 264         { 0x30b1, 0x01 }, /* pll1 divider */
 265         { 0x30b3, 0x64 }, /* pll1 multiplier */
 266         { 0x30b4, 0x03 }, /* pll1 pre divider */
 267         { 0x30b5, 0x05 }, /* pll1 mipi divider */
 268         { 0x3106, 0xda },
 269         { 0x3503, 0x07 },
 270         { 0x3509, 0x10 },
 271         { 0x3600, 0x1c },
 272         { 0x3602, 0x62 },
 273         { 0x3620, 0xb7 },
 274         { 0x3622, 0x04 },
 275         { 0x3626, 0x21 },
 276         { 0x3627, 0x30 },
 277         { 0x3630, 0x44 },
 278         { 0x3631, 0x35 },
 279         { 0x3634, 0x60 },
 280         { 0x3636, 0x00 },
 281         { 0x3662, 0x01 },
 282         { 0x3663, 0x70 },
 283         { 0x3664, 0x50 },
 284         { 0x3666, 0x0a },
 285         { 0x3669, 0x1a },
 286         { 0x366a, 0x00 },
 287         { 0x366b, 0x50 },
 288         { 0x3673, 0x01 },
 289         { 0x3674, 0xff },
 290         { 0x3675, 0x03 },
 291         { 0x3705, 0xc1 },
 292         { 0x3709, 0x40 },
 293         { 0x373c, 0x08 },
 294         { 0x3742, 0x00 },
 295         { 0x3757, 0xb3 },
 296         { 0x3788, 0x00 },
 297         { 0x37a8, 0x01 },
 298         { 0x37a9, 0xc0 },
 299         { 0x3800, 0x00 },
 300         { 0x3801, 0x04 },
 301         { 0x3802, 0x00 },
 302         { 0x3803, 0x04 },
 303         { 0x3804, 0x02 },
 304         { 0x3805, 0x8b },
 305         { 0x3806, 0x01 },
 306         { 0x3807, 0xeb },
 307         { 0x3808, 0x02 }, /* width high */
 308         { 0x3809, 0x80 }, /* width low */
 309         { 0x380a, 0x01 }, /* height high */
 310         { 0x380b, 0xe0 }, /* height low */
 311         { 0x380c, 0x03 }, /* total horiz timing high */
 312         { 0x380d, 0xa0 }, /* total horiz timing low */
 313         { 0x380e, 0x03 }, /* total vertical timing high */
 314         { 0x380f, 0x5c }, /* total vertical timing low */
 315         { 0x3810, 0x00 },
 316         { 0x3811, 0x04 },
 317         { 0x3812, 0x00 },
 318         { 0x3813, 0x05 },
 319         { 0x3814, 0x11 },
 320         { 0x3815, 0x11 },
 321         { 0x3820, 0x40 },
 322         { 0x3821, 0x00 },
 323         { 0x382f, 0x0e },
 324         { 0x3832, 0x00 },
 325         { 0x3833, 0x05 },
 326         { 0x3834, 0x00 },
 327         { 0x3835, 0x0c },
 328         { 0x3837, 0x00 },
 329         { 0x3b80, 0x00 },
 330         { 0x3b81, 0xa5 },
 331         { 0x3b82, 0x10 },
 332         { 0x3b83, 0x00 },
 333         { 0x3b84, 0x08 },
 334         { 0x3b85, 0x00 },
 335         { 0x3b86, 0x01 },
 336         { 0x3b87, 0x00 },
 337         { 0x3b88, 0x00 },
 338         { 0x3b89, 0x00 },
 339         { 0x3b8a, 0x00 },
 340         { 0x3b8b, 0x05 },
 341         { 0x3b8c, 0x00 },
 342         { 0x3b8d, 0x00 },
 343         { 0x3b8e, 0x00 },
 344         { 0x3b8f, 0x1a },
 345         { 0x3b94, 0x05 },
 346         { 0x3b95, 0xf2 },
 347         { 0x3b96, 0x40 },
 348         { 0x3c00, 0x89 },
 349         { 0x3c01, 0x63 },
 350         { 0x3c02, 0x01 },
 351         { 0x3c03, 0x00 },
 352         { 0x3c04, 0x00 },
 353         { 0x3c05, 0x03 },
 354         { 0x3c06, 0x00 },
 355         { 0x3c07, 0x06 },
 356         { 0x3c0c, 0x01 },
 357         { 0x3c0d, 0xd0 },
 358         { 0x3c0e, 0x02 },
 359         { 0x3c0f, 0x0a },
 360         { 0x4001, 0x42 },
 361         { 0x4004, 0x04 },
 362         { 0x4005, 0x00 },
 363         { 0x404e, 0x01 },
 364         { 0x4300, 0xff },
 365         { 0x4301, 0x00 },
 366         { 0x4315, 0x00 },
 367         { 0x4501, 0x48 },
 368         { 0x4600, 0x00 },
 369         { 0x4601, 0x4e },
 370         { 0x4801, 0x0f },
 371         { 0x4806, 0x0f },
 372         { 0x4819, 0xaa },
 373         { 0x4823, 0x3e },
 374         { 0x4837, 0x19 },
 375         { 0x4a0d, 0x00 },
 376         { 0x4a47, 0x7f },
 377         { 0x4a49, 0xf0 },
 378         { 0x4a4b, 0x30 },
 379         { 0x5000, 0x85 },
 380         { 0x5001, 0x80 },
 381 };
 382 
 383 static const struct reg_value ov7251_setting_vga_90fps[] = {
 384         { 0x3005, 0x00 },
 385         { 0x3012, 0xc0 },
 386         { 0x3013, 0xd2 },
 387         { 0x3014, 0x04 },
 388         { 0x3016, 0x10 },
 389         { 0x3017, 0x00 },
 390         { 0x3018, 0x00 },
 391         { 0x301a, 0x00 },
 392         { 0x301b, 0x00 },
 393         { 0x301c, 0x00 },
 394         { 0x3023, 0x05 },
 395         { 0x3037, 0xf0 },
 396         { 0x3098, 0x04 }, /* pll2 pre divider */
 397         { 0x3099, 0x28 }, /* pll2 multiplier */
 398         { 0x309a, 0x05 }, /* pll2 sys divider */
 399         { 0x309b, 0x04 }, /* pll2 adc divider */
 400         { 0x309d, 0x00 }, /* pll2 divider */
 401         { 0x30b0, 0x0a }, /* pll1 pix divider */
 402         { 0x30b1, 0x01 }, /* pll1 divider */
 403         { 0x30b3, 0x64 }, /* pll1 multiplier */
 404         { 0x30b4, 0x03 }, /* pll1 pre divider */
 405         { 0x30b5, 0x05 }, /* pll1 mipi divider */
 406         { 0x3106, 0xda },
 407         { 0x3503, 0x07 },
 408         { 0x3509, 0x10 },
 409         { 0x3600, 0x1c },
 410         { 0x3602, 0x62 },
 411         { 0x3620, 0xb7 },
 412         { 0x3622, 0x04 },
 413         { 0x3626, 0x21 },
 414         { 0x3627, 0x30 },
 415         { 0x3630, 0x44 },
 416         { 0x3631, 0x35 },
 417         { 0x3634, 0x60 },
 418         { 0x3636, 0x00 },
 419         { 0x3662, 0x01 },
 420         { 0x3663, 0x70 },
 421         { 0x3664, 0x50 },
 422         { 0x3666, 0x0a },
 423         { 0x3669, 0x1a },
 424         { 0x366a, 0x00 },
 425         { 0x366b, 0x50 },
 426         { 0x3673, 0x01 },
 427         { 0x3674, 0xff },
 428         { 0x3675, 0x03 },
 429         { 0x3705, 0xc1 },
 430         { 0x3709, 0x40 },
 431         { 0x373c, 0x08 },
 432         { 0x3742, 0x00 },
 433         { 0x3757, 0xb3 },
 434         { 0x3788, 0x00 },
 435         { 0x37a8, 0x01 },
 436         { 0x37a9, 0xc0 },
 437         { 0x3800, 0x00 },
 438         { 0x3801, 0x04 },
 439         { 0x3802, 0x00 },
 440         { 0x3803, 0x04 },
 441         { 0x3804, 0x02 },
 442         { 0x3805, 0x8b },
 443         { 0x3806, 0x01 },
 444         { 0x3807, 0xeb },
 445         { 0x3808, 0x02 }, /* width high */
 446         { 0x3809, 0x80 }, /* width low */
 447         { 0x380a, 0x01 }, /* height high */
 448         { 0x380b, 0xe0 }, /* height low */
 449         { 0x380c, 0x03 }, /* total horiz timing high */
 450         { 0x380d, 0xa0 }, /* total horiz timing low */
 451         { 0x380e, 0x02 }, /* total vertical timing high */
 452         { 0x380f, 0x3c }, /* total vertical timing low */
 453         { 0x3810, 0x00 },
 454         { 0x3811, 0x04 },
 455         { 0x3812, 0x00 },
 456         { 0x3813, 0x05 },
 457         { 0x3814, 0x11 },
 458         { 0x3815, 0x11 },
 459         { 0x3820, 0x40 },
 460         { 0x3821, 0x00 },
 461         { 0x382f, 0x0e },
 462         { 0x3832, 0x00 },
 463         { 0x3833, 0x05 },
 464         { 0x3834, 0x00 },
 465         { 0x3835, 0x0c },
 466         { 0x3837, 0x00 },
 467         { 0x3b80, 0x00 },
 468         { 0x3b81, 0xa5 },
 469         { 0x3b82, 0x10 },
 470         { 0x3b83, 0x00 },
 471         { 0x3b84, 0x08 },
 472         { 0x3b85, 0x00 },
 473         { 0x3b86, 0x01 },
 474         { 0x3b87, 0x00 },
 475         { 0x3b88, 0x00 },
 476         { 0x3b89, 0x00 },
 477         { 0x3b8a, 0x00 },
 478         { 0x3b8b, 0x05 },
 479         { 0x3b8c, 0x00 },
 480         { 0x3b8d, 0x00 },
 481         { 0x3b8e, 0x00 },
 482         { 0x3b8f, 0x1a },
 483         { 0x3b94, 0x05 },
 484         { 0x3b95, 0xf2 },
 485         { 0x3b96, 0x40 },
 486         { 0x3c00, 0x89 },
 487         { 0x3c01, 0x63 },
 488         { 0x3c02, 0x01 },
 489         { 0x3c03, 0x00 },
 490         { 0x3c04, 0x00 },
 491         { 0x3c05, 0x03 },
 492         { 0x3c06, 0x00 },
 493         { 0x3c07, 0x06 },
 494         { 0x3c0c, 0x01 },
 495         { 0x3c0d, 0xd0 },
 496         { 0x3c0e, 0x02 },
 497         { 0x3c0f, 0x0a },
 498         { 0x4001, 0x42 },
 499         { 0x4004, 0x04 },
 500         { 0x4005, 0x00 },
 501         { 0x404e, 0x01 },
 502         { 0x4300, 0xff },
 503         { 0x4301, 0x00 },
 504         { 0x4315, 0x00 },
 505         { 0x4501, 0x48 },
 506         { 0x4600, 0x00 },
 507         { 0x4601, 0x4e },
 508         { 0x4801, 0x0f },
 509         { 0x4806, 0x0f },
 510         { 0x4819, 0xaa },
 511         { 0x4823, 0x3e },
 512         { 0x4837, 0x19 },
 513         { 0x4a0d, 0x00 },
 514         { 0x4a47, 0x7f },
 515         { 0x4a49, 0xf0 },
 516         { 0x4a4b, 0x30 },
 517         { 0x5000, 0x85 },
 518         { 0x5001, 0x80 },
 519 };
 520 
 521 static const s64 link_freq[] = {
 522         240000000,
 523 };
 524 
 525 static const struct ov7251_mode_info ov7251_mode_info_data[] = {
 526         {
 527                 .width = 640,
 528                 .height = 480,
 529                 .data = ov7251_setting_vga_30fps,
 530                 .data_size = ARRAY_SIZE(ov7251_setting_vga_30fps),
 531                 .pixel_clock = 48000000,
 532                 .link_freq = 0, /* an index in link_freq[] */
 533                 .exposure_max = 1704,
 534                 .exposure_def = 504,
 535                 .timeperframe = {
 536                         .numerator = 100,
 537                         .denominator = 3000
 538                 }
 539         },
 540         {
 541                 .width = 640,
 542                 .height = 480,
 543                 .data = ov7251_setting_vga_60fps,
 544                 .data_size = ARRAY_SIZE(ov7251_setting_vga_60fps),
 545                 .pixel_clock = 48000000,
 546                 .link_freq = 0, /* an index in link_freq[] */
 547                 .exposure_max = 840,
 548                 .exposure_def = 504,
 549                 .timeperframe = {
 550                         .numerator = 100,
 551                         .denominator = 6014
 552                 }
 553         },
 554         {
 555                 .width = 640,
 556                 .height = 480,
 557                 .data = ov7251_setting_vga_90fps,
 558                 .data_size = ARRAY_SIZE(ov7251_setting_vga_90fps),
 559                 .pixel_clock = 48000000,
 560                 .link_freq = 0, /* an index in link_freq[] */
 561                 .exposure_max = 552,
 562                 .exposure_def = 504,
 563                 .timeperframe = {
 564                         .numerator = 100,
 565                         .denominator = 9043
 566                 }
 567         },
 568 };
 569 
 570 static int ov7251_regulators_enable(struct ov7251 *ov7251)
 571 {
 572         int ret;
 573 
 574         /* OV7251 power up sequence requires core regulator
 575          * to be enabled not earlier than io regulator
 576          */
 577 
 578         ret = regulator_enable(ov7251->io_regulator);
 579         if (ret < 0) {
 580                 dev_err(ov7251->dev, "set io voltage failed\n");
 581                 return ret;
 582         }
 583 
 584         ret = regulator_enable(ov7251->analog_regulator);
 585         if (ret) {
 586                 dev_err(ov7251->dev, "set analog voltage failed\n");
 587                 goto err_disable_io;
 588         }
 589 
 590         ret = regulator_enable(ov7251->core_regulator);
 591         if (ret) {
 592                 dev_err(ov7251->dev, "set core voltage failed\n");
 593                 goto err_disable_analog;
 594         }
 595 
 596         return 0;
 597 
 598 err_disable_analog:
 599         regulator_disable(ov7251->analog_regulator);
 600 
 601 err_disable_io:
 602         regulator_disable(ov7251->io_regulator);
 603 
 604         return ret;
 605 }
 606 
 607 static void ov7251_regulators_disable(struct ov7251 *ov7251)
 608 {
 609         int ret;
 610 
 611         ret = regulator_disable(ov7251->core_regulator);
 612         if (ret < 0)
 613                 dev_err(ov7251->dev, "core regulator disable failed\n");
 614 
 615         ret = regulator_disable(ov7251->analog_regulator);
 616         if (ret < 0)
 617                 dev_err(ov7251->dev, "analog regulator disable failed\n");
 618 
 619         ret = regulator_disable(ov7251->io_regulator);
 620         if (ret < 0)
 621                 dev_err(ov7251->dev, "io regulator disable failed\n");
 622 }
 623 
 624 static int ov7251_write_reg(struct ov7251 *ov7251, u16 reg, u8 val)
 625 {
 626         u8 regbuf[3];
 627         int ret;
 628 
 629         regbuf[0] = reg >> 8;
 630         regbuf[1] = reg & 0xff;
 631         regbuf[2] = val;
 632 
 633         ret = i2c_master_send(ov7251->i2c_client, regbuf, 3);
 634         if (ret < 0) {
 635                 dev_err(ov7251->dev, "%s: write reg error %d: reg=%x, val=%x\n",
 636                         __func__, ret, reg, val);
 637                 return ret;
 638         }
 639 
 640         return 0;
 641 }
 642 
 643 static int ov7251_write_seq_regs(struct ov7251 *ov7251, u16 reg, u8 *val,
 644                                  u8 num)
 645 {
 646         u8 regbuf[5];
 647         u8 nregbuf = sizeof(reg) + num * sizeof(*val);
 648         int ret = 0;
 649 
 650         if (nregbuf > sizeof(regbuf))
 651                 return -EINVAL;
 652 
 653         regbuf[0] = reg >> 8;
 654         regbuf[1] = reg & 0xff;
 655 
 656         memcpy(regbuf + 2, val, num);
 657 
 658         ret = i2c_master_send(ov7251->i2c_client, regbuf, nregbuf);
 659         if (ret < 0) {
 660                 dev_err(ov7251->dev,
 661                         "%s: write seq regs error %d: first reg=%x\n",
 662                         __func__, ret, reg);
 663                 return ret;
 664         }
 665 
 666         return 0;
 667 }
 668 
 669 static int ov7251_read_reg(struct ov7251 *ov7251, u16 reg, u8 *val)
 670 {
 671         u8 regbuf[2];
 672         int ret;
 673 
 674         regbuf[0] = reg >> 8;
 675         regbuf[1] = reg & 0xff;
 676 
 677         ret = i2c_master_send(ov7251->i2c_client, regbuf, 2);
 678         if (ret < 0) {
 679                 dev_err(ov7251->dev, "%s: write reg error %d: reg=%x\n",
 680                         __func__, ret, reg);
 681                 return ret;
 682         }
 683 
 684         ret = i2c_master_recv(ov7251->i2c_client, val, 1);
 685         if (ret < 0) {
 686                 dev_err(ov7251->dev, "%s: read reg error %d: reg=%x\n",
 687                         __func__, ret, reg);
 688                 return ret;
 689         }
 690 
 691         return 0;
 692 }
 693 
 694 static int ov7251_set_exposure(struct ov7251 *ov7251, s32 exposure)
 695 {
 696         u16 reg;
 697         u8 val[3];
 698 
 699         reg = OV7251_AEC_EXPO_0;
 700         val[0] = (exposure & 0xf000) >> 12; /* goes to OV7251_AEC_EXPO_0 */
 701         val[1] = (exposure & 0x0ff0) >> 4;  /* goes to OV7251_AEC_EXPO_1 */
 702         val[2] = (exposure & 0x000f) << 4;  /* goes to OV7251_AEC_EXPO_2 */
 703 
 704         return ov7251_write_seq_regs(ov7251, reg, val, 3);
 705 }
 706 
 707 static int ov7251_set_gain(struct ov7251 *ov7251, s32 gain)
 708 {
 709         u16 reg;
 710         u8 val[2];
 711 
 712         reg = OV7251_AEC_AGC_ADJ_0;
 713         val[0] = (gain & 0x0300) >> 8; /* goes to OV7251_AEC_AGC_ADJ_0 */
 714         val[1] = gain & 0xff;          /* goes to OV7251_AEC_AGC_ADJ_1 */
 715 
 716         return ov7251_write_seq_regs(ov7251, reg, val, 2);
 717 }
 718 
 719 static int ov7251_set_register_array(struct ov7251 *ov7251,
 720                                      const struct reg_value *settings,
 721                                      unsigned int num_settings)
 722 {
 723         unsigned int i;
 724         int ret;
 725 
 726         for (i = 0; i < num_settings; ++i, ++settings) {
 727                 ret = ov7251_write_reg(ov7251, settings->reg, settings->val);
 728                 if (ret < 0)
 729                         return ret;
 730         }
 731 
 732         return 0;
 733 }
 734 
 735 static int ov7251_set_power_on(struct ov7251 *ov7251)
 736 {
 737         int ret;
 738         u32 wait_us;
 739 
 740         ret = ov7251_regulators_enable(ov7251);
 741         if (ret < 0)
 742                 return ret;
 743 
 744         ret = clk_prepare_enable(ov7251->xclk);
 745         if (ret < 0) {
 746                 dev_err(ov7251->dev, "clk prepare enable failed\n");
 747                 ov7251_regulators_disable(ov7251);
 748                 return ret;
 749         }
 750 
 751         gpiod_set_value_cansleep(ov7251->enable_gpio, 1);
 752 
 753         /* wait at least 65536 external clock cycles */
 754         wait_us = DIV_ROUND_UP(65536 * 1000,
 755                                DIV_ROUND_UP(ov7251->xclk_freq, 1000));
 756         usleep_range(wait_us, wait_us + 1000);
 757 
 758         return 0;
 759 }
 760 
 761 static void ov7251_set_power_off(struct ov7251 *ov7251)
 762 {
 763         clk_disable_unprepare(ov7251->xclk);
 764         gpiod_set_value_cansleep(ov7251->enable_gpio, 0);
 765         ov7251_regulators_disable(ov7251);
 766 }
 767 
 768 static int ov7251_s_power(struct v4l2_subdev *sd, int on)
 769 {
 770         struct ov7251 *ov7251 = to_ov7251(sd);
 771         int ret = 0;
 772 
 773         mutex_lock(&ov7251->lock);
 774 
 775         /* If the power state is not modified - no work to do. */
 776         if (ov7251->power_on == !!on)
 777                 goto exit;
 778 
 779         if (on) {
 780                 ret = ov7251_set_power_on(ov7251);
 781                 if (ret < 0)
 782                         goto exit;
 783 
 784                 ret = ov7251_set_register_array(ov7251,
 785                                         ov7251_global_init_setting,
 786                                         ARRAY_SIZE(ov7251_global_init_setting));
 787                 if (ret < 0) {
 788                         dev_err(ov7251->dev, "could not set init registers\n");
 789                         ov7251_set_power_off(ov7251);
 790                         goto exit;
 791                 }
 792 
 793                 ov7251->power_on = true;
 794         } else {
 795                 ov7251_set_power_off(ov7251);
 796                 ov7251->power_on = false;
 797         }
 798 
 799 exit:
 800         mutex_unlock(&ov7251->lock);
 801 
 802         return ret;
 803 }
 804 
 805 static int ov7251_set_hflip(struct ov7251 *ov7251, s32 value)
 806 {
 807         u8 val = ov7251->timing_format2;
 808         int ret;
 809 
 810         if (value)
 811                 val |= OV7251_TIMING_FORMAT2_MIRROR;
 812         else
 813                 val &= ~OV7251_TIMING_FORMAT2_MIRROR;
 814 
 815         ret = ov7251_write_reg(ov7251, OV7251_TIMING_FORMAT2, val);
 816         if (!ret)
 817                 ov7251->timing_format2 = val;
 818 
 819         return ret;
 820 }
 821 
 822 static int ov7251_set_vflip(struct ov7251 *ov7251, s32 value)
 823 {
 824         u8 val = ov7251->timing_format1;
 825         int ret;
 826 
 827         if (value)
 828                 val |= OV7251_TIMING_FORMAT1_VFLIP;
 829         else
 830                 val &= ~OV7251_TIMING_FORMAT1_VFLIP;
 831 
 832         ret = ov7251_write_reg(ov7251, OV7251_TIMING_FORMAT1, val);
 833         if (!ret)
 834                 ov7251->timing_format1 = val;
 835 
 836         return ret;
 837 }
 838 
 839 static int ov7251_set_test_pattern(struct ov7251 *ov7251, s32 value)
 840 {
 841         u8 val = ov7251->pre_isp_00;
 842         int ret;
 843 
 844         if (value)
 845                 val |= OV7251_PRE_ISP_00_TEST_PATTERN;
 846         else
 847                 val &= ~OV7251_PRE_ISP_00_TEST_PATTERN;
 848 
 849         ret = ov7251_write_reg(ov7251, OV7251_PRE_ISP_00, val);
 850         if (!ret)
 851                 ov7251->pre_isp_00 = val;
 852 
 853         return ret;
 854 }
 855 
 856 static const char * const ov7251_test_pattern_menu[] = {
 857         "Disabled",
 858         "Vertical Pattern Bars",
 859 };
 860 
 861 static int ov7251_s_ctrl(struct v4l2_ctrl *ctrl)
 862 {
 863         struct ov7251 *ov7251 = container_of(ctrl->handler,
 864                                              struct ov7251, ctrls);
 865         int ret;
 866 
 867         /* v4l2_ctrl_lock() locks our mutex */
 868 
 869         if (!ov7251->power_on)
 870                 return 0;
 871 
 872         switch (ctrl->id) {
 873         case V4L2_CID_EXPOSURE:
 874                 ret = ov7251_set_exposure(ov7251, ctrl->val);
 875                 break;
 876         case V4L2_CID_GAIN:
 877                 ret = ov7251_set_gain(ov7251, ctrl->val);
 878                 break;
 879         case V4L2_CID_TEST_PATTERN:
 880                 ret = ov7251_set_test_pattern(ov7251, ctrl->val);
 881                 break;
 882         case V4L2_CID_HFLIP:
 883                 ret = ov7251_set_hflip(ov7251, ctrl->val);
 884                 break;
 885         case V4L2_CID_VFLIP:
 886                 ret = ov7251_set_vflip(ov7251, ctrl->val);
 887                 break;
 888         default:
 889                 ret = -EINVAL;
 890                 break;
 891         }
 892 
 893         return ret;
 894 }
 895 
 896 static const struct v4l2_ctrl_ops ov7251_ctrl_ops = {
 897         .s_ctrl = ov7251_s_ctrl,
 898 };
 899 
 900 static int ov7251_enum_mbus_code(struct v4l2_subdev *sd,
 901                                  struct v4l2_subdev_pad_config *cfg,
 902                                  struct v4l2_subdev_mbus_code_enum *code)
 903 {
 904         if (code->index > 0)
 905                 return -EINVAL;
 906 
 907         code->code = MEDIA_BUS_FMT_Y10_1X10;
 908 
 909         return 0;
 910 }
 911 
 912 static int ov7251_enum_frame_size(struct v4l2_subdev *subdev,
 913                                   struct v4l2_subdev_pad_config *cfg,
 914                                   struct v4l2_subdev_frame_size_enum *fse)
 915 {
 916         if (fse->code != MEDIA_BUS_FMT_Y10_1X10)
 917                 return -EINVAL;
 918 
 919         if (fse->index >= ARRAY_SIZE(ov7251_mode_info_data))
 920                 return -EINVAL;
 921 
 922         fse->min_width = ov7251_mode_info_data[fse->index].width;
 923         fse->max_width = ov7251_mode_info_data[fse->index].width;
 924         fse->min_height = ov7251_mode_info_data[fse->index].height;
 925         fse->max_height = ov7251_mode_info_data[fse->index].height;
 926 
 927         return 0;
 928 }
 929 
 930 static int ov7251_enum_frame_ival(struct v4l2_subdev *subdev,
 931                                   struct v4l2_subdev_pad_config *cfg,
 932                                   struct v4l2_subdev_frame_interval_enum *fie)
 933 {
 934         unsigned int index = fie->index;
 935         unsigned int i;
 936 
 937         for (i = 0; i < ARRAY_SIZE(ov7251_mode_info_data); i++) {
 938                 if (fie->width != ov7251_mode_info_data[i].width ||
 939                     fie->height != ov7251_mode_info_data[i].height)
 940                         continue;
 941 
 942                 if (index-- == 0) {
 943                         fie->interval = ov7251_mode_info_data[i].timeperframe;
 944                         return 0;
 945                 }
 946         }
 947 
 948         return -EINVAL;
 949 }
 950 
 951 static struct v4l2_mbus_framefmt *
 952 __ov7251_get_pad_format(struct ov7251 *ov7251,
 953                         struct v4l2_subdev_pad_config *cfg,
 954                         unsigned int pad,
 955                         enum v4l2_subdev_format_whence which)
 956 {
 957         switch (which) {
 958         case V4L2_SUBDEV_FORMAT_TRY:
 959                 return v4l2_subdev_get_try_format(&ov7251->sd, cfg, pad);
 960         case V4L2_SUBDEV_FORMAT_ACTIVE:
 961                 return &ov7251->fmt;
 962         default:
 963                 return NULL;
 964         }
 965 }
 966 
 967 static int ov7251_get_format(struct v4l2_subdev *sd,
 968                              struct v4l2_subdev_pad_config *cfg,
 969                              struct v4l2_subdev_format *format)
 970 {
 971         struct ov7251 *ov7251 = to_ov7251(sd);
 972 
 973         mutex_lock(&ov7251->lock);
 974         format->format = *__ov7251_get_pad_format(ov7251, cfg, format->pad,
 975                                                   format->which);
 976         mutex_unlock(&ov7251->lock);
 977 
 978         return 0;
 979 }
 980 
 981 static struct v4l2_rect *
 982 __ov7251_get_pad_crop(struct ov7251 *ov7251, struct v4l2_subdev_pad_config *cfg,
 983                       unsigned int pad, enum v4l2_subdev_format_whence which)
 984 {
 985         switch (which) {
 986         case V4L2_SUBDEV_FORMAT_TRY:
 987                 return v4l2_subdev_get_try_crop(&ov7251->sd, cfg, pad);
 988         case V4L2_SUBDEV_FORMAT_ACTIVE:
 989                 return &ov7251->crop;
 990         default:
 991                 return NULL;
 992         }
 993 }
 994 
 995 static inline u32 avg_fps(const struct v4l2_fract *t)
 996 {
 997         return (t->denominator + (t->numerator >> 1)) / t->numerator;
 998 }
 999 
1000 static const struct ov7251_mode_info *
1001 ov7251_find_mode_by_ival(struct ov7251 *ov7251, struct v4l2_fract *timeperframe)
1002 {
1003         const struct ov7251_mode_info *mode = ov7251->current_mode;
1004         unsigned int fps_req = avg_fps(timeperframe);
1005         unsigned int max_dist_match = (unsigned int) -1;
1006         unsigned int i, n = 0;
1007 
1008         for (i = 0; i < ARRAY_SIZE(ov7251_mode_info_data); i++) {
1009                 unsigned int dist;
1010                 unsigned int fps_tmp;
1011 
1012                 if (mode->width != ov7251_mode_info_data[i].width ||
1013                     mode->height != ov7251_mode_info_data[i].height)
1014                         continue;
1015 
1016                 fps_tmp = avg_fps(&ov7251_mode_info_data[i].timeperframe);
1017 
1018                 dist = abs(fps_req - fps_tmp);
1019 
1020                 if (dist < max_dist_match) {
1021                         n = i;
1022                         max_dist_match = dist;
1023                 }
1024         }
1025 
1026         return &ov7251_mode_info_data[n];
1027 }
1028 
1029 static int ov7251_set_format(struct v4l2_subdev *sd,
1030                              struct v4l2_subdev_pad_config *cfg,
1031                              struct v4l2_subdev_format *format)
1032 {
1033         struct ov7251 *ov7251 = to_ov7251(sd);
1034         struct v4l2_mbus_framefmt *__format;
1035         struct v4l2_rect *__crop;
1036         const struct ov7251_mode_info *new_mode;
1037         int ret = 0;
1038 
1039         mutex_lock(&ov7251->lock);
1040 
1041         __crop = __ov7251_get_pad_crop(ov7251, cfg, format->pad, format->which);
1042 
1043         new_mode = v4l2_find_nearest_size(ov7251_mode_info_data,
1044                                 ARRAY_SIZE(ov7251_mode_info_data),
1045                                 width, height,
1046                                 format->format.width, format->format.height);
1047 
1048         __crop->width = new_mode->width;
1049         __crop->height = new_mode->height;
1050 
1051         if (format->which == V4L2_SUBDEV_FORMAT_ACTIVE) {
1052                 ret = __v4l2_ctrl_s_ctrl_int64(ov7251->pixel_clock,
1053                                                new_mode->pixel_clock);
1054                 if (ret < 0)
1055                         goto exit;
1056 
1057                 ret = __v4l2_ctrl_s_ctrl(ov7251->link_freq,
1058                                          new_mode->link_freq);
1059                 if (ret < 0)
1060                         goto exit;
1061 
1062                 ret = __v4l2_ctrl_modify_range(ov7251->exposure,
1063                                                1, new_mode->exposure_max,
1064                                                1, new_mode->exposure_def);
1065                 if (ret < 0)
1066                         goto exit;
1067 
1068                 ret = __v4l2_ctrl_s_ctrl(ov7251->exposure,
1069                                          new_mode->exposure_def);
1070                 if (ret < 0)
1071                         goto exit;
1072 
1073                 ret = __v4l2_ctrl_s_ctrl(ov7251->gain, 16);
1074                 if (ret < 0)
1075                         goto exit;
1076 
1077                 ov7251->current_mode = new_mode;
1078         }
1079 
1080         __format = __ov7251_get_pad_format(ov7251, cfg, format->pad,
1081                                            format->which);
1082         __format->width = __crop->width;
1083         __format->height = __crop->height;
1084         __format->code = MEDIA_BUS_FMT_Y10_1X10;
1085         __format->field = V4L2_FIELD_NONE;
1086         __format->colorspace = V4L2_COLORSPACE_SRGB;
1087         __format->ycbcr_enc = V4L2_MAP_YCBCR_ENC_DEFAULT(__format->colorspace);
1088         __format->quantization = V4L2_MAP_QUANTIZATION_DEFAULT(true,
1089                                 __format->colorspace, __format->ycbcr_enc);
1090         __format->xfer_func = V4L2_MAP_XFER_FUNC_DEFAULT(__format->colorspace);
1091 
1092         format->format = *__format;
1093 
1094 exit:
1095         mutex_unlock(&ov7251->lock);
1096 
1097         return ret;
1098 }
1099 
1100 static int ov7251_entity_init_cfg(struct v4l2_subdev *subdev,
1101                                   struct v4l2_subdev_pad_config *cfg)
1102 {
1103         struct v4l2_subdev_format fmt = {
1104                 .which = cfg ? V4L2_SUBDEV_FORMAT_TRY
1105                              : V4L2_SUBDEV_FORMAT_ACTIVE,
1106                 .format = {
1107                         .width = 640,
1108                         .height = 480
1109                 }
1110         };
1111 
1112         ov7251_set_format(subdev, cfg, &fmt);
1113 
1114         return 0;
1115 }
1116 
1117 static int ov7251_get_selection(struct v4l2_subdev *sd,
1118                                 struct v4l2_subdev_pad_config *cfg,
1119                                 struct v4l2_subdev_selection *sel)
1120 {
1121         struct ov7251 *ov7251 = to_ov7251(sd);
1122 
1123         if (sel->target != V4L2_SEL_TGT_CROP)
1124                 return -EINVAL;
1125 
1126         mutex_lock(&ov7251->lock);
1127         sel->r = *__ov7251_get_pad_crop(ov7251, cfg, sel->pad,
1128                                         sel->which);
1129         mutex_unlock(&ov7251->lock);
1130 
1131         return 0;
1132 }
1133 
1134 static int ov7251_s_stream(struct v4l2_subdev *subdev, int enable)
1135 {
1136         struct ov7251 *ov7251 = to_ov7251(subdev);
1137         int ret;
1138 
1139         mutex_lock(&ov7251->lock);
1140 
1141         if (enable) {
1142                 ret = ov7251_set_register_array(ov7251,
1143                                         ov7251->current_mode->data,
1144                                         ov7251->current_mode->data_size);
1145                 if (ret < 0) {
1146                         dev_err(ov7251->dev, "could not set mode %dx%d\n",
1147                                 ov7251->current_mode->width,
1148                                 ov7251->current_mode->height);
1149                         goto exit;
1150                 }
1151                 ret = __v4l2_ctrl_handler_setup(&ov7251->ctrls);
1152                 if (ret < 0) {
1153                         dev_err(ov7251->dev, "could not sync v4l2 controls\n");
1154                         goto exit;
1155                 }
1156                 ret = ov7251_write_reg(ov7251, OV7251_SC_MODE_SELECT,
1157                                        OV7251_SC_MODE_SELECT_STREAMING);
1158         } else {
1159                 ret = ov7251_write_reg(ov7251, OV7251_SC_MODE_SELECT,
1160                                        OV7251_SC_MODE_SELECT_SW_STANDBY);
1161         }
1162 
1163 exit:
1164         mutex_unlock(&ov7251->lock);
1165 
1166         return ret;
1167 }
1168 
1169 static int ov7251_get_frame_interval(struct v4l2_subdev *subdev,
1170                                      struct v4l2_subdev_frame_interval *fi)
1171 {
1172         struct ov7251 *ov7251 = to_ov7251(subdev);
1173 
1174         mutex_lock(&ov7251->lock);
1175         fi->interval = ov7251->current_mode->timeperframe;
1176         mutex_unlock(&ov7251->lock);
1177 
1178         return 0;
1179 }
1180 
1181 static int ov7251_set_frame_interval(struct v4l2_subdev *subdev,
1182                                      struct v4l2_subdev_frame_interval *fi)
1183 {
1184         struct ov7251 *ov7251 = to_ov7251(subdev);
1185         const struct ov7251_mode_info *new_mode;
1186         int ret = 0;
1187 
1188         mutex_lock(&ov7251->lock);
1189         new_mode = ov7251_find_mode_by_ival(ov7251, &fi->interval);
1190 
1191         if (new_mode != ov7251->current_mode) {
1192                 ret = __v4l2_ctrl_s_ctrl_int64(ov7251->pixel_clock,
1193                                                new_mode->pixel_clock);
1194                 if (ret < 0)
1195                         goto exit;
1196 
1197                 ret = __v4l2_ctrl_s_ctrl(ov7251->link_freq,
1198                                          new_mode->link_freq);
1199                 if (ret < 0)
1200                         goto exit;
1201 
1202                 ret = __v4l2_ctrl_modify_range(ov7251->exposure,
1203                                                1, new_mode->exposure_max,
1204                                                1, new_mode->exposure_def);
1205                 if (ret < 0)
1206                         goto exit;
1207 
1208                 ret = __v4l2_ctrl_s_ctrl(ov7251->exposure,
1209                                          new_mode->exposure_def);
1210                 if (ret < 0)
1211                         goto exit;
1212 
1213                 ret = __v4l2_ctrl_s_ctrl(ov7251->gain, 16);
1214                 if (ret < 0)
1215                         goto exit;
1216 
1217                 ov7251->current_mode = new_mode;
1218         }
1219 
1220         fi->interval = ov7251->current_mode->timeperframe;
1221 
1222 exit:
1223         mutex_unlock(&ov7251->lock);
1224 
1225         return ret;
1226 }
1227 
1228 static const struct v4l2_subdev_core_ops ov7251_core_ops = {
1229         .s_power = ov7251_s_power,
1230 };
1231 
1232 static const struct v4l2_subdev_video_ops ov7251_video_ops = {
1233         .s_stream = ov7251_s_stream,
1234         .g_frame_interval = ov7251_get_frame_interval,
1235         .s_frame_interval = ov7251_set_frame_interval,
1236 };
1237 
1238 static const struct v4l2_subdev_pad_ops ov7251_subdev_pad_ops = {
1239         .init_cfg = ov7251_entity_init_cfg,
1240         .enum_mbus_code = ov7251_enum_mbus_code,
1241         .enum_frame_size = ov7251_enum_frame_size,
1242         .enum_frame_interval = ov7251_enum_frame_ival,
1243         .get_fmt = ov7251_get_format,
1244         .set_fmt = ov7251_set_format,
1245         .get_selection = ov7251_get_selection,
1246 };
1247 
1248 static const struct v4l2_subdev_ops ov7251_subdev_ops = {
1249         .core = &ov7251_core_ops,
1250         .video = &ov7251_video_ops,
1251         .pad = &ov7251_subdev_pad_ops,
1252 };
1253 
1254 static int ov7251_probe(struct i2c_client *client)
1255 {
1256         struct device *dev = &client->dev;
1257         struct fwnode_handle *endpoint;
1258         struct ov7251 *ov7251;
1259         u8 chip_id_high, chip_id_low, chip_rev;
1260         int ret;
1261 
1262         ov7251 = devm_kzalloc(dev, sizeof(struct ov7251), GFP_KERNEL);
1263         if (!ov7251)
1264                 return -ENOMEM;
1265 
1266         ov7251->i2c_client = client;
1267         ov7251->dev = dev;
1268 
1269         endpoint = fwnode_graph_get_next_endpoint(dev_fwnode(dev), NULL);
1270         if (!endpoint) {
1271                 dev_err(dev, "endpoint node not found\n");
1272                 return -EINVAL;
1273         }
1274 
1275         ret = v4l2_fwnode_endpoint_parse(endpoint, &ov7251->ep);
1276         fwnode_handle_put(endpoint);
1277         if (ret < 0) {
1278                 dev_err(dev, "parsing endpoint node failed\n");
1279                 return ret;
1280         }
1281 
1282         if (ov7251->ep.bus_type != V4L2_MBUS_CSI2_DPHY) {
1283                 dev_err(dev, "invalid bus type (%u), must be CSI2 (%u)\n",
1284                         ov7251->ep.bus_type, V4L2_MBUS_CSI2_DPHY);
1285                 return -EINVAL;
1286         }
1287 
1288         /* get system clock (xclk) */
1289         ov7251->xclk = devm_clk_get(dev, "xclk");
1290         if (IS_ERR(ov7251->xclk)) {
1291                 dev_err(dev, "could not get xclk");
1292                 return PTR_ERR(ov7251->xclk);
1293         }
1294 
1295         ret = fwnode_property_read_u32(dev_fwnode(dev), "clock-frequency",
1296                                        &ov7251->xclk_freq);
1297         if (ret) {
1298                 dev_err(dev, "could not get xclk frequency\n");
1299                 return ret;
1300         }
1301 
1302         /* external clock must be 24MHz, allow 1% tolerance */
1303         if (ov7251->xclk_freq < 23760000 || ov7251->xclk_freq > 24240000) {
1304                 dev_err(dev, "external clock frequency %u is not supported\n",
1305                         ov7251->xclk_freq);
1306                 return -EINVAL;
1307         }
1308 
1309         ret = clk_set_rate(ov7251->xclk, ov7251->xclk_freq);
1310         if (ret) {
1311                 dev_err(dev, "could not set xclk frequency\n");
1312                 return ret;
1313         }
1314 
1315         ov7251->io_regulator = devm_regulator_get(dev, "vdddo");
1316         if (IS_ERR(ov7251->io_regulator)) {
1317                 dev_err(dev, "cannot get io regulator\n");
1318                 return PTR_ERR(ov7251->io_regulator);
1319         }
1320 
1321         ov7251->core_regulator = devm_regulator_get(dev, "vddd");
1322         if (IS_ERR(ov7251->core_regulator)) {
1323                 dev_err(dev, "cannot get core regulator\n");
1324                 return PTR_ERR(ov7251->core_regulator);
1325         }
1326 
1327         ov7251->analog_regulator = devm_regulator_get(dev, "vdda");
1328         if (IS_ERR(ov7251->analog_regulator)) {
1329                 dev_err(dev, "cannot get analog regulator\n");
1330                 return PTR_ERR(ov7251->analog_regulator);
1331         }
1332 
1333         ov7251->enable_gpio = devm_gpiod_get(dev, "enable", GPIOD_OUT_HIGH);
1334         if (IS_ERR(ov7251->enable_gpio)) {
1335                 dev_err(dev, "cannot get enable gpio\n");
1336                 return PTR_ERR(ov7251->enable_gpio);
1337         }
1338 
1339         mutex_init(&ov7251->lock);
1340 
1341         v4l2_ctrl_handler_init(&ov7251->ctrls, 7);
1342         ov7251->ctrls.lock = &ov7251->lock;
1343 
1344         v4l2_ctrl_new_std(&ov7251->ctrls, &ov7251_ctrl_ops,
1345                           V4L2_CID_HFLIP, 0, 1, 1, 0);
1346         v4l2_ctrl_new_std(&ov7251->ctrls, &ov7251_ctrl_ops,
1347                           V4L2_CID_VFLIP, 0, 1, 1, 0);
1348         ov7251->exposure = v4l2_ctrl_new_std(&ov7251->ctrls, &ov7251_ctrl_ops,
1349                                              V4L2_CID_EXPOSURE, 1, 32, 1, 32);
1350         ov7251->gain = v4l2_ctrl_new_std(&ov7251->ctrls, &ov7251_ctrl_ops,
1351                                          V4L2_CID_GAIN, 16, 1023, 1, 16);
1352         v4l2_ctrl_new_std_menu_items(&ov7251->ctrls, &ov7251_ctrl_ops,
1353                                      V4L2_CID_TEST_PATTERN,
1354                                      ARRAY_SIZE(ov7251_test_pattern_menu) - 1,
1355                                      0, 0, ov7251_test_pattern_menu);
1356         ov7251->pixel_clock = v4l2_ctrl_new_std(&ov7251->ctrls,
1357                                                 &ov7251_ctrl_ops,
1358                                                 V4L2_CID_PIXEL_RATE,
1359                                                 1, INT_MAX, 1, 1);
1360         ov7251->link_freq = v4l2_ctrl_new_int_menu(&ov7251->ctrls,
1361                                                    &ov7251_ctrl_ops,
1362                                                    V4L2_CID_LINK_FREQ,
1363                                                    ARRAY_SIZE(link_freq) - 1,
1364                                                    0, link_freq);
1365         if (ov7251->link_freq)
1366                 ov7251->link_freq->flags |= V4L2_CTRL_FLAG_READ_ONLY;
1367 
1368         ov7251->sd.ctrl_handler = &ov7251->ctrls;
1369 
1370         if (ov7251->ctrls.error) {
1371                 dev_err(dev, "%s: control initialization error %d\n",
1372                         __func__, ov7251->ctrls.error);
1373                 ret = ov7251->ctrls.error;
1374                 goto free_ctrl;
1375         }
1376 
1377         v4l2_i2c_subdev_init(&ov7251->sd, client, &ov7251_subdev_ops);
1378         ov7251->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
1379         ov7251->pad.flags = MEDIA_PAD_FL_SOURCE;
1380         ov7251->sd.dev = &client->dev;
1381         ov7251->sd.entity.function = MEDIA_ENT_F_CAM_SENSOR;
1382 
1383         ret = media_entity_pads_init(&ov7251->sd.entity, 1, &ov7251->pad);
1384         if (ret < 0) {
1385                 dev_err(dev, "could not register media entity\n");
1386                 goto free_ctrl;
1387         }
1388 
1389         ret = ov7251_s_power(&ov7251->sd, true);
1390         if (ret < 0) {
1391                 dev_err(dev, "could not power up OV7251\n");
1392                 goto free_entity;
1393         }
1394 
1395         ret = ov7251_read_reg(ov7251, OV7251_CHIP_ID_HIGH, &chip_id_high);
1396         if (ret < 0 || chip_id_high != OV7251_CHIP_ID_HIGH_BYTE) {
1397                 dev_err(dev, "could not read ID high\n");
1398                 ret = -ENODEV;
1399                 goto power_down;
1400         }
1401         ret = ov7251_read_reg(ov7251, OV7251_CHIP_ID_LOW, &chip_id_low);
1402         if (ret < 0 || chip_id_low != OV7251_CHIP_ID_LOW_BYTE) {
1403                 dev_err(dev, "could not read ID low\n");
1404                 ret = -ENODEV;
1405                 goto power_down;
1406         }
1407 
1408         ret = ov7251_read_reg(ov7251, OV7251_SC_GP_IO_IN1, &chip_rev);
1409         if (ret < 0) {
1410                 dev_err(dev, "could not read revision\n");
1411                 ret = -ENODEV;
1412                 goto power_down;
1413         }
1414         chip_rev >>= 4;
1415 
1416         dev_info(dev, "OV7251 revision %x (%s) detected at address 0x%02x\n",
1417                  chip_rev,
1418                  chip_rev == 0x4 ? "1A / 1B" :
1419                  chip_rev == 0x5 ? "1C / 1D" :
1420                  chip_rev == 0x6 ? "1E" :
1421                  chip_rev == 0x7 ? "1F" : "unknown",
1422                  client->addr);
1423 
1424         ret = ov7251_read_reg(ov7251, OV7251_PRE_ISP_00,
1425                               &ov7251->pre_isp_00);
1426         if (ret < 0) {
1427                 dev_err(dev, "could not read test pattern value\n");
1428                 ret = -ENODEV;
1429                 goto power_down;
1430         }
1431 
1432         ret = ov7251_read_reg(ov7251, OV7251_TIMING_FORMAT1,
1433                               &ov7251->timing_format1);
1434         if (ret < 0) {
1435                 dev_err(dev, "could not read vflip value\n");
1436                 ret = -ENODEV;
1437                 goto power_down;
1438         }
1439 
1440         ret = ov7251_read_reg(ov7251, OV7251_TIMING_FORMAT2,
1441                               &ov7251->timing_format2);
1442         if (ret < 0) {
1443                 dev_err(dev, "could not read hflip value\n");
1444                 ret = -ENODEV;
1445                 goto power_down;
1446         }
1447 
1448         ov7251_s_power(&ov7251->sd, false);
1449 
1450         ret = v4l2_async_register_subdev(&ov7251->sd);
1451         if (ret < 0) {
1452                 dev_err(dev, "could not register v4l2 device\n");
1453                 goto free_entity;
1454         }
1455 
1456         ov7251_entity_init_cfg(&ov7251->sd, NULL);
1457 
1458         return 0;
1459 
1460 power_down:
1461         ov7251_s_power(&ov7251->sd, false);
1462 free_entity:
1463         media_entity_cleanup(&ov7251->sd.entity);
1464 free_ctrl:
1465         v4l2_ctrl_handler_free(&ov7251->ctrls);
1466         mutex_destroy(&ov7251->lock);
1467 
1468         return ret;
1469 }
1470 
1471 static int ov7251_remove(struct i2c_client *client)
1472 {
1473         struct v4l2_subdev *sd = i2c_get_clientdata(client);
1474         struct ov7251 *ov7251 = to_ov7251(sd);
1475 
1476         v4l2_async_unregister_subdev(&ov7251->sd);
1477         media_entity_cleanup(&ov7251->sd.entity);
1478         v4l2_ctrl_handler_free(&ov7251->ctrls);
1479         mutex_destroy(&ov7251->lock);
1480 
1481         return 0;
1482 }
1483 
1484 static const struct of_device_id ov7251_of_match[] = {
1485         { .compatible = "ovti,ov7251" },
1486         { /* sentinel */ }
1487 };
1488 MODULE_DEVICE_TABLE(of, ov7251_of_match);
1489 
1490 static struct i2c_driver ov7251_i2c_driver = {
1491         .driver = {
1492                 .of_match_table = ov7251_of_match,
1493                 .name  = "ov7251",
1494         },
1495         .probe_new  = ov7251_probe,
1496         .remove = ov7251_remove,
1497 };
1498 
1499 module_i2c_driver(ov7251_i2c_driver);
1500 
1501 MODULE_DESCRIPTION("Omnivision OV7251 Camera Driver");
1502 MODULE_AUTHOR("Todor Tomov <todor.tomov@linaro.org>");
1503 MODULE_LICENSE("GPL v2");

/* [<][>][^][v][top][bottom][index][help] */