1 // SPDX-License-Identifier: GPL-2.0-only 2 /* 3 * Driver for MT9P031 CMOS Image Sensor from Aptina 4 * 5 * Copyright (C) 2011, Laurent Pinchart <laurent.pinchart@ideasonboard.com> 6 * Copyright (C) 2011, Javier Martin <javier.martin@vista-silicon.com> 7 * Copyright (C) 2011, Guennadi Liakhovetski <g.liakhovetski@gmx.de> 8 * 9 * Based on the MT9V032 driver and Bastian Hecht's code. 10 */ 11 12 #include <linux/clk.h> 13 #include <linux/delay.h> 14 #include <linux/device.h> 15 #include <linux/gpio/consumer.h> 16 #include <linux/i2c.h> 17 #include <linux/log2.h> 18 #include <linux/module.h> 19 #include <linux/of.h> 20 #include <linux/of_graph.h> 21 #include <linux/pm.h> 22 #include <linux/regulator/consumer.h> 23 #include <linux/slab.h> 24 #include <linux/videodev2.h> 25 26 #include <media/i2c/mt9p031.h> 27 #include <media/v4l2-async.h> 28 #include <media/v4l2-ctrls.h> 29 #include <media/v4l2-device.h> 30 #include <media/v4l2-subdev.h> 31 32 #include "aptina-pll.h" 33 34 #define MT9P031_PIXEL_ARRAY_WIDTH 2752 35 #define MT9P031_PIXEL_ARRAY_HEIGHT 2004 36 37 #define MT9P031_CHIP_VERSION 0x00 38 #define MT9P031_CHIP_VERSION_VALUE 0x1801 39 #define MT9P031_ROW_START 0x01 40 #define MT9P031_ROW_START_MIN 0 41 #define MT9P031_ROW_START_MAX 2004 42 #define MT9P031_ROW_START_DEF 54 43 #define MT9P031_COLUMN_START 0x02 44 #define MT9P031_COLUMN_START_MIN 0 45 #define MT9P031_COLUMN_START_MAX 2750 46 #define MT9P031_COLUMN_START_DEF 16 47 #define MT9P031_WINDOW_HEIGHT 0x03 48 #define MT9P031_WINDOW_HEIGHT_MIN 2 49 #define MT9P031_WINDOW_HEIGHT_MAX 2006 50 #define MT9P031_WINDOW_HEIGHT_DEF 1944 51 #define MT9P031_WINDOW_WIDTH 0x04 52 #define MT9P031_WINDOW_WIDTH_MIN 2 53 #define MT9P031_WINDOW_WIDTH_MAX 2752 54 #define MT9P031_WINDOW_WIDTH_DEF 2592 55 #define MT9P031_HORIZONTAL_BLANK 0x05 56 #define MT9P031_HORIZONTAL_BLANK_MIN 0 57 #define MT9P031_HORIZONTAL_BLANK_MAX 4095 58 #define MT9P031_VERTICAL_BLANK 0x06 59 #define MT9P031_VERTICAL_BLANK_MIN 1 60 #define MT9P031_VERTICAL_BLANK_MAX 4096 61 #define MT9P031_VERTICAL_BLANK_DEF 26 62 #define MT9P031_OUTPUT_CONTROL 0x07 63 #define MT9P031_OUTPUT_CONTROL_CEN 2 64 #define MT9P031_OUTPUT_CONTROL_SYN 1 65 #define MT9P031_OUTPUT_CONTROL_DEF 0x1f82 66 #define MT9P031_SHUTTER_WIDTH_UPPER 0x08 67 #define MT9P031_SHUTTER_WIDTH_LOWER 0x09 68 #define MT9P031_SHUTTER_WIDTH_MIN 1 69 #define MT9P031_SHUTTER_WIDTH_MAX 1048575 70 #define MT9P031_SHUTTER_WIDTH_DEF 1943 71 #define MT9P031_PLL_CONTROL 0x10 72 #define MT9P031_PLL_CONTROL_PWROFF 0x0050 73 #define MT9P031_PLL_CONTROL_PWRON 0x0051 74 #define MT9P031_PLL_CONTROL_USEPLL 0x0052 75 #define MT9P031_PLL_CONFIG_1 0x11 76 #define MT9P031_PLL_CONFIG_2 0x12 77 #define MT9P031_PIXEL_CLOCK_CONTROL 0x0a 78 #define MT9P031_PIXEL_CLOCK_INVERT (1 << 15) 79 #define MT9P031_PIXEL_CLOCK_SHIFT(n) ((n) << 8) 80 #define MT9P031_PIXEL_CLOCK_DIVIDE(n) ((n) << 0) 81 #define MT9P031_FRAME_RESTART 0x0b 82 #define MT9P031_SHUTTER_DELAY 0x0c 83 #define MT9P031_RST 0x0d 84 #define MT9P031_RST_ENABLE 1 85 #define MT9P031_RST_DISABLE 0 86 #define MT9P031_READ_MODE_1 0x1e 87 #define MT9P031_READ_MODE_2 0x20 88 #define MT9P031_READ_MODE_2_ROW_MIR (1 << 15) 89 #define MT9P031_READ_MODE_2_COL_MIR (1 << 14) 90 #define MT9P031_READ_MODE_2_ROW_BLC (1 << 6) 91 #define MT9P031_ROW_ADDRESS_MODE 0x22 92 #define MT9P031_COLUMN_ADDRESS_MODE 0x23 93 #define MT9P031_GLOBAL_GAIN 0x35 94 #define MT9P031_GLOBAL_GAIN_MIN 8 95 #define MT9P031_GLOBAL_GAIN_MAX 1024 96 #define MT9P031_GLOBAL_GAIN_DEF 8 97 #define MT9P031_GLOBAL_GAIN_MULT (1 << 6) 98 #define MT9P031_ROW_BLACK_TARGET 0x49 99 #define MT9P031_ROW_BLACK_DEF_OFFSET 0x4b 100 #define MT9P031_GREEN1_OFFSET 0x60 101 #define MT9P031_GREEN2_OFFSET 0x61 102 #define MT9P031_BLACK_LEVEL_CALIBRATION 0x62 103 #define MT9P031_BLC_MANUAL_BLC (1 << 0) 104 #define MT9P031_RED_OFFSET 0x63 105 #define MT9P031_BLUE_OFFSET 0x64 106 #define MT9P031_TEST_PATTERN 0xa0 107 #define MT9P031_TEST_PATTERN_SHIFT 3 108 #define MT9P031_TEST_PATTERN_ENABLE (1 << 0) 109 #define MT9P031_TEST_PATTERN_DISABLE (0 << 0) 110 #define MT9P031_TEST_PATTERN_GREEN 0xa1 111 #define MT9P031_TEST_PATTERN_RED 0xa2 112 #define MT9P031_TEST_PATTERN_BLUE 0xa3 113 114 enum mt9p031_model { 115 MT9P031_MODEL_COLOR, 116 MT9P031_MODEL_MONOCHROME, 117 }; 118 119 struct mt9p031 { 120 struct v4l2_subdev subdev; 121 struct media_pad pad; 122 struct v4l2_rect crop; /* Sensor window */ 123 struct v4l2_mbus_framefmt format; 124 struct mt9p031_platform_data *pdata; 125 struct mutex power_lock; /* lock to protect power_count */ 126 int power_count; 127 128 struct clk *clk; 129 struct regulator_bulk_data regulators[3]; 130 131 enum mt9p031_model model; 132 struct aptina_pll pll; 133 unsigned int clk_div; 134 bool use_pll; 135 struct gpio_desc *reset; 136 137 struct v4l2_ctrl_handler ctrls; 138 struct v4l2_ctrl *blc_auto; 139 struct v4l2_ctrl *blc_offset; 140 141 /* Registers cache */ 142 u16 output_control; 143 u16 mode2; 144 }; 145 146 static struct mt9p031 *to_mt9p031(struct v4l2_subdev *sd) 147 { 148 return container_of(sd, struct mt9p031, subdev); 149 } 150 151 static int mt9p031_read(struct i2c_client *client, u8 reg) 152 { 153 return i2c_smbus_read_word_swapped(client, reg); 154 } 155 156 static int mt9p031_write(struct i2c_client *client, u8 reg, u16 data) 157 { 158 return i2c_smbus_write_word_swapped(client, reg, data); 159 } 160 161 static int mt9p031_set_output_control(struct mt9p031 *mt9p031, u16 clear, 162 u16 set) 163 { 164 struct i2c_client *client = v4l2_get_subdevdata(&mt9p031->subdev); 165 u16 value = (mt9p031->output_control & ~clear) | set; 166 int ret; 167 168 ret = mt9p031_write(client, MT9P031_OUTPUT_CONTROL, value); 169 if (ret < 0) 170 return ret; 171 172 mt9p031->output_control = value; 173 return 0; 174 } 175 176 static int mt9p031_set_mode2(struct mt9p031 *mt9p031, u16 clear, u16 set) 177 { 178 struct i2c_client *client = v4l2_get_subdevdata(&mt9p031->subdev); 179 u16 value = (mt9p031->mode2 & ~clear) | set; 180 int ret; 181 182 ret = mt9p031_write(client, MT9P031_READ_MODE_2, value); 183 if (ret < 0) 184 return ret; 185 186 mt9p031->mode2 = value; 187 return 0; 188 } 189 190 static int mt9p031_reset(struct mt9p031 *mt9p031) 191 { 192 struct i2c_client *client = v4l2_get_subdevdata(&mt9p031->subdev); 193 int ret; 194 195 /* Disable chip output, synchronous option update */ 196 ret = mt9p031_write(client, MT9P031_RST, MT9P031_RST_ENABLE); 197 if (ret < 0) 198 return ret; 199 ret = mt9p031_write(client, MT9P031_RST, MT9P031_RST_DISABLE); 200 if (ret < 0) 201 return ret; 202 203 ret = mt9p031_write(client, MT9P031_PIXEL_CLOCK_CONTROL, 204 MT9P031_PIXEL_CLOCK_DIVIDE(mt9p031->clk_div)); 205 if (ret < 0) 206 return ret; 207 208 return mt9p031_set_output_control(mt9p031, MT9P031_OUTPUT_CONTROL_CEN, 209 0); 210 } 211 212 static int mt9p031_clk_setup(struct mt9p031 *mt9p031) 213 { 214 static const struct aptina_pll_limits limits = { 215 .ext_clock_min = 6000000, 216 .ext_clock_max = 27000000, 217 .int_clock_min = 2000000, 218 .int_clock_max = 13500000, 219 .out_clock_min = 180000000, 220 .out_clock_max = 360000000, 221 .pix_clock_max = 96000000, 222 .n_min = 1, 223 .n_max = 64, 224 .m_min = 16, 225 .m_max = 255, 226 .p1_min = 1, 227 .p1_max = 128, 228 }; 229 230 struct i2c_client *client = v4l2_get_subdevdata(&mt9p031->subdev); 231 struct mt9p031_platform_data *pdata = mt9p031->pdata; 232 int ret; 233 234 mt9p031->clk = devm_clk_get(&client->dev, NULL); 235 if (IS_ERR(mt9p031->clk)) 236 return PTR_ERR(mt9p031->clk); 237 238 ret = clk_set_rate(mt9p031->clk, pdata->ext_freq); 239 if (ret < 0) 240 return ret; 241 242 /* If the external clock frequency is out of bounds for the PLL use the 243 * pixel clock divider only and disable the PLL. 244 */ 245 if (pdata->ext_freq > limits.ext_clock_max) { 246 unsigned int div; 247 248 div = DIV_ROUND_UP(pdata->ext_freq, pdata->target_freq); 249 div = roundup_pow_of_two(div) / 2; 250 251 mt9p031->clk_div = min_t(unsigned int, div, 64); 252 mt9p031->use_pll = false; 253 254 return 0; 255 } 256 257 mt9p031->pll.ext_clock = pdata->ext_freq; 258 mt9p031->pll.pix_clock = pdata->target_freq; 259 mt9p031->use_pll = true; 260 261 return aptina_pll_calculate(&client->dev, &limits, &mt9p031->pll); 262 } 263 264 static int mt9p031_pll_enable(struct mt9p031 *mt9p031) 265 { 266 struct i2c_client *client = v4l2_get_subdevdata(&mt9p031->subdev); 267 int ret; 268 269 if (!mt9p031->use_pll) 270 return 0; 271 272 ret = mt9p031_write(client, MT9P031_PLL_CONTROL, 273 MT9P031_PLL_CONTROL_PWRON); 274 if (ret < 0) 275 return ret; 276 277 ret = mt9p031_write(client, MT9P031_PLL_CONFIG_1, 278 (mt9p031->pll.m << 8) | (mt9p031->pll.n - 1)); 279 if (ret < 0) 280 return ret; 281 282 ret = mt9p031_write(client, MT9P031_PLL_CONFIG_2, mt9p031->pll.p1 - 1); 283 if (ret < 0) 284 return ret; 285 286 usleep_range(1000, 2000); 287 ret = mt9p031_write(client, MT9P031_PLL_CONTROL, 288 MT9P031_PLL_CONTROL_PWRON | 289 MT9P031_PLL_CONTROL_USEPLL); 290 return ret; 291 } 292 293 static inline int mt9p031_pll_disable(struct mt9p031 *mt9p031) 294 { 295 struct i2c_client *client = v4l2_get_subdevdata(&mt9p031->subdev); 296 297 if (!mt9p031->use_pll) 298 return 0; 299 300 return mt9p031_write(client, MT9P031_PLL_CONTROL, 301 MT9P031_PLL_CONTROL_PWROFF); 302 } 303 304 static int mt9p031_power_on(struct mt9p031 *mt9p031) 305 { 306 int ret; 307 308 /* Ensure RESET_BAR is active */ 309 if (mt9p031->reset) { 310 gpiod_set_value(mt9p031->reset, 1); 311 usleep_range(1000, 2000); 312 } 313 314 /* Bring up the supplies */ 315 ret = regulator_bulk_enable(ARRAY_SIZE(mt9p031->regulators), 316 mt9p031->regulators); 317 if (ret < 0) 318 return ret; 319 320 /* Enable clock */ 321 if (mt9p031->clk) { 322 ret = clk_prepare_enable(mt9p031->clk); 323 if (ret) { 324 regulator_bulk_disable(ARRAY_SIZE(mt9p031->regulators), 325 mt9p031->regulators); 326 return ret; 327 } 328 } 329 330 /* Now RESET_BAR must be high */ 331 if (mt9p031->reset) { 332 gpiod_set_value(mt9p031->reset, 0); 333 usleep_range(1000, 2000); 334 } 335 336 return 0; 337 } 338 339 static void mt9p031_power_off(struct mt9p031 *mt9p031) 340 { 341 if (mt9p031->reset) { 342 gpiod_set_value(mt9p031->reset, 1); 343 usleep_range(1000, 2000); 344 } 345 346 regulator_bulk_disable(ARRAY_SIZE(mt9p031->regulators), 347 mt9p031->regulators); 348 349 if (mt9p031->clk) 350 clk_disable_unprepare(mt9p031->clk); 351 } 352 353 static int __mt9p031_set_power(struct mt9p031 *mt9p031, bool on) 354 { 355 struct i2c_client *client = v4l2_get_subdevdata(&mt9p031->subdev); 356 int ret; 357 358 if (!on) { 359 mt9p031_power_off(mt9p031); 360 return 0; 361 } 362 363 ret = mt9p031_power_on(mt9p031); 364 if (ret < 0) 365 return ret; 366 367 ret = mt9p031_reset(mt9p031); 368 if (ret < 0) { 369 dev_err(&client->dev, "Failed to reset the camera\n"); 370 return ret; 371 } 372 373 return v4l2_ctrl_handler_setup(&mt9p031->ctrls); 374 } 375 376 /* ----------------------------------------------------------------------------- 377 * V4L2 subdev video operations 378 */ 379 380 static int mt9p031_set_params(struct mt9p031 *mt9p031) 381 { 382 struct i2c_client *client = v4l2_get_subdevdata(&mt9p031->subdev); 383 struct v4l2_mbus_framefmt *format = &mt9p031->format; 384 const struct v4l2_rect *crop = &mt9p031->crop; 385 unsigned int hblank; 386 unsigned int vblank; 387 unsigned int xskip; 388 unsigned int yskip; 389 unsigned int xbin; 390 unsigned int ybin; 391 int ret; 392 393 /* Windows position and size. 394 * 395 * TODO: Make sure the start coordinates and window size match the 396 * skipping, binning and mirroring (see description of registers 2 and 4 397 * in table 13, and Binning section on page 41). 398 */ 399 ret = mt9p031_write(client, MT9P031_COLUMN_START, crop->left); 400 if (ret < 0) 401 return ret; 402 ret = mt9p031_write(client, MT9P031_ROW_START, crop->top); 403 if (ret < 0) 404 return ret; 405 ret = mt9p031_write(client, MT9P031_WINDOW_WIDTH, crop->width - 1); 406 if (ret < 0) 407 return ret; 408 ret = mt9p031_write(client, MT9P031_WINDOW_HEIGHT, crop->height - 1); 409 if (ret < 0) 410 return ret; 411 412 /* Row and column binning and skipping. Use the maximum binning value 413 * compatible with the skipping settings. 414 */ 415 xskip = DIV_ROUND_CLOSEST(crop->width, format->width); 416 yskip = DIV_ROUND_CLOSEST(crop->height, format->height); 417 xbin = 1 << (ffs(xskip) - 1); 418 ybin = 1 << (ffs(yskip) - 1); 419 420 ret = mt9p031_write(client, MT9P031_COLUMN_ADDRESS_MODE, 421 ((xbin - 1) << 4) | (xskip - 1)); 422 if (ret < 0) 423 return ret; 424 ret = mt9p031_write(client, MT9P031_ROW_ADDRESS_MODE, 425 ((ybin - 1) << 4) | (yskip - 1)); 426 if (ret < 0) 427 return ret; 428 429 /* Blanking - use minimum value for horizontal blanking and default 430 * value for vertical blanking. 431 */ 432 hblank = 346 * ybin + 64 + (80 >> min_t(unsigned int, xbin, 3)); 433 vblank = MT9P031_VERTICAL_BLANK_DEF; 434 435 ret = mt9p031_write(client, MT9P031_HORIZONTAL_BLANK, hblank - 1); 436 if (ret < 0) 437 return ret; 438 ret = mt9p031_write(client, MT9P031_VERTICAL_BLANK, vblank - 1); 439 if (ret < 0) 440 return ret; 441 442 return ret; 443 } 444 445 static int mt9p031_s_stream(struct v4l2_subdev *subdev, int enable) 446 { 447 struct mt9p031 *mt9p031 = to_mt9p031(subdev); 448 int ret; 449 450 if (!enable) { 451 /* Stop sensor readout */ 452 ret = mt9p031_set_output_control(mt9p031, 453 MT9P031_OUTPUT_CONTROL_CEN, 0); 454 if (ret < 0) 455 return ret; 456 457 return mt9p031_pll_disable(mt9p031); 458 } 459 460 ret = mt9p031_set_params(mt9p031); 461 if (ret < 0) 462 return ret; 463 464 /* Switch to master "normal" mode */ 465 ret = mt9p031_set_output_control(mt9p031, 0, 466 MT9P031_OUTPUT_CONTROL_CEN); 467 if (ret < 0) 468 return ret; 469 470 return mt9p031_pll_enable(mt9p031); 471 } 472 473 static int mt9p031_enum_mbus_code(struct v4l2_subdev *subdev, 474 struct v4l2_subdev_pad_config *cfg, 475 struct v4l2_subdev_mbus_code_enum *code) 476 { 477 struct mt9p031 *mt9p031 = to_mt9p031(subdev); 478 479 if (code->pad || code->index) 480 return -EINVAL; 481 482 code->code = mt9p031->format.code; 483 return 0; 484 } 485 486 static int mt9p031_enum_frame_size(struct v4l2_subdev *subdev, 487 struct v4l2_subdev_pad_config *cfg, 488 struct v4l2_subdev_frame_size_enum *fse) 489 { 490 struct mt9p031 *mt9p031 = to_mt9p031(subdev); 491 492 if (fse->index >= 8 || fse->code != mt9p031->format.code) 493 return -EINVAL; 494 495 fse->min_width = MT9P031_WINDOW_WIDTH_DEF 496 / min_t(unsigned int, 7, fse->index + 1); 497 fse->max_width = fse->min_width; 498 fse->min_height = MT9P031_WINDOW_HEIGHT_DEF / (fse->index + 1); 499 fse->max_height = fse->min_height; 500 501 return 0; 502 } 503 504 static struct v4l2_mbus_framefmt * 505 __mt9p031_get_pad_format(struct mt9p031 *mt9p031, struct v4l2_subdev_pad_config *cfg, 506 unsigned int pad, u32 which) 507 { 508 switch (which) { 509 case V4L2_SUBDEV_FORMAT_TRY: 510 return v4l2_subdev_get_try_format(&mt9p031->subdev, cfg, pad); 511 case V4L2_SUBDEV_FORMAT_ACTIVE: 512 return &mt9p031->format; 513 default: 514 return NULL; 515 } 516 } 517 518 static struct v4l2_rect * 519 __mt9p031_get_pad_crop(struct mt9p031 *mt9p031, struct v4l2_subdev_pad_config *cfg, 520 unsigned int pad, u32 which) 521 { 522 switch (which) { 523 case V4L2_SUBDEV_FORMAT_TRY: 524 return v4l2_subdev_get_try_crop(&mt9p031->subdev, cfg, pad); 525 case V4L2_SUBDEV_FORMAT_ACTIVE: 526 return &mt9p031->crop; 527 default: 528 return NULL; 529 } 530 } 531 532 static int mt9p031_get_format(struct v4l2_subdev *subdev, 533 struct v4l2_subdev_pad_config *cfg, 534 struct v4l2_subdev_format *fmt) 535 { 536 struct mt9p031 *mt9p031 = to_mt9p031(subdev); 537 538 fmt->format = *__mt9p031_get_pad_format(mt9p031, cfg, fmt->pad, 539 fmt->which); 540 return 0; 541 } 542 543 static int mt9p031_set_format(struct v4l2_subdev *subdev, 544 struct v4l2_subdev_pad_config *cfg, 545 struct v4l2_subdev_format *format) 546 { 547 struct mt9p031 *mt9p031 = to_mt9p031(subdev); 548 struct v4l2_mbus_framefmt *__format; 549 struct v4l2_rect *__crop; 550 unsigned int width; 551 unsigned int height; 552 unsigned int hratio; 553 unsigned int vratio; 554 555 __crop = __mt9p031_get_pad_crop(mt9p031, cfg, format->pad, 556 format->which); 557 558 /* Clamp the width and height to avoid dividing by zero. */ 559 width = clamp_t(unsigned int, ALIGN(format->format.width, 2), 560 max_t(unsigned int, __crop->width / 7, 561 MT9P031_WINDOW_WIDTH_MIN), 562 __crop->width); 563 height = clamp_t(unsigned int, ALIGN(format->format.height, 2), 564 max_t(unsigned int, __crop->height / 8, 565 MT9P031_WINDOW_HEIGHT_MIN), 566 __crop->height); 567 568 hratio = DIV_ROUND_CLOSEST(__crop->width, width); 569 vratio = DIV_ROUND_CLOSEST(__crop->height, height); 570 571 __format = __mt9p031_get_pad_format(mt9p031, cfg, format->pad, 572 format->which); 573 __format->width = __crop->width / hratio; 574 __format->height = __crop->height / vratio; 575 576 format->format = *__format; 577 578 return 0; 579 } 580 581 static int mt9p031_get_selection(struct v4l2_subdev *subdev, 582 struct v4l2_subdev_pad_config *cfg, 583 struct v4l2_subdev_selection *sel) 584 { 585 struct mt9p031 *mt9p031 = to_mt9p031(subdev); 586 587 if (sel->target != V4L2_SEL_TGT_CROP) 588 return -EINVAL; 589 590 sel->r = *__mt9p031_get_pad_crop(mt9p031, cfg, sel->pad, sel->which); 591 return 0; 592 } 593 594 static int mt9p031_set_selection(struct v4l2_subdev *subdev, 595 struct v4l2_subdev_pad_config *cfg, 596 struct v4l2_subdev_selection *sel) 597 { 598 struct mt9p031 *mt9p031 = to_mt9p031(subdev); 599 struct v4l2_mbus_framefmt *__format; 600 struct v4l2_rect *__crop; 601 struct v4l2_rect rect; 602 603 if (sel->target != V4L2_SEL_TGT_CROP) 604 return -EINVAL; 605 606 /* Clamp the crop rectangle boundaries and align them to a multiple of 2 607 * pixels to ensure a GRBG Bayer pattern. 608 */ 609 rect.left = clamp(ALIGN(sel->r.left, 2), MT9P031_COLUMN_START_MIN, 610 MT9P031_COLUMN_START_MAX); 611 rect.top = clamp(ALIGN(sel->r.top, 2), MT9P031_ROW_START_MIN, 612 MT9P031_ROW_START_MAX); 613 rect.width = clamp_t(unsigned int, ALIGN(sel->r.width, 2), 614 MT9P031_WINDOW_WIDTH_MIN, 615 MT9P031_WINDOW_WIDTH_MAX); 616 rect.height = clamp_t(unsigned int, ALIGN(sel->r.height, 2), 617 MT9P031_WINDOW_HEIGHT_MIN, 618 MT9P031_WINDOW_HEIGHT_MAX); 619 620 rect.width = min_t(unsigned int, rect.width, 621 MT9P031_PIXEL_ARRAY_WIDTH - rect.left); 622 rect.height = min_t(unsigned int, rect.height, 623 MT9P031_PIXEL_ARRAY_HEIGHT - rect.top); 624 625 __crop = __mt9p031_get_pad_crop(mt9p031, cfg, sel->pad, sel->which); 626 627 if (rect.width != __crop->width || rect.height != __crop->height) { 628 /* Reset the output image size if the crop rectangle size has 629 * been modified. 630 */ 631 __format = __mt9p031_get_pad_format(mt9p031, cfg, sel->pad, 632 sel->which); 633 __format->width = rect.width; 634 __format->height = rect.height; 635 } 636 637 *__crop = rect; 638 sel->r = rect; 639 640 return 0; 641 } 642 643 /* ----------------------------------------------------------------------------- 644 * V4L2 subdev control operations 645 */ 646 647 #define V4L2_CID_BLC_AUTO (V4L2_CID_USER_BASE | 0x1002) 648 #define V4L2_CID_BLC_TARGET_LEVEL (V4L2_CID_USER_BASE | 0x1003) 649 #define V4L2_CID_BLC_ANALOG_OFFSET (V4L2_CID_USER_BASE | 0x1004) 650 #define V4L2_CID_BLC_DIGITAL_OFFSET (V4L2_CID_USER_BASE | 0x1005) 651 652 static int mt9p031_restore_blc(struct mt9p031 *mt9p031) 653 { 654 struct i2c_client *client = v4l2_get_subdevdata(&mt9p031->subdev); 655 int ret; 656 657 if (mt9p031->blc_auto->cur.val != 0) { 658 ret = mt9p031_set_mode2(mt9p031, 0, 659 MT9P031_READ_MODE_2_ROW_BLC); 660 if (ret < 0) 661 return ret; 662 } 663 664 if (mt9p031->blc_offset->cur.val != 0) { 665 ret = mt9p031_write(client, MT9P031_ROW_BLACK_TARGET, 666 mt9p031->blc_offset->cur.val); 667 if (ret < 0) 668 return ret; 669 } 670 671 return 0; 672 } 673 674 static int mt9p031_s_ctrl(struct v4l2_ctrl *ctrl) 675 { 676 struct mt9p031 *mt9p031 = 677 container_of(ctrl->handler, struct mt9p031, ctrls); 678 struct i2c_client *client = v4l2_get_subdevdata(&mt9p031->subdev); 679 u16 data; 680 int ret; 681 682 if (ctrl->flags & V4L2_CTRL_FLAG_INACTIVE) 683 return 0; 684 685 switch (ctrl->id) { 686 case V4L2_CID_EXPOSURE: 687 ret = mt9p031_write(client, MT9P031_SHUTTER_WIDTH_UPPER, 688 (ctrl->val >> 16) & 0xffff); 689 if (ret < 0) 690 return ret; 691 692 return mt9p031_write(client, MT9P031_SHUTTER_WIDTH_LOWER, 693 ctrl->val & 0xffff); 694 695 case V4L2_CID_GAIN: 696 /* Gain is controlled by 2 analog stages and a digital stage. 697 * Valid values for the 3 stages are 698 * 699 * Stage Min Max Step 700 * ------------------------------------------ 701 * First analog stage x1 x2 1 702 * Second analog stage x1 x4 0.125 703 * Digital stage x1 x16 0.125 704 * 705 * To minimize noise, the gain stages should be used in the 706 * second analog stage, first analog stage, digital stage order. 707 * Gain from a previous stage should be pushed to its maximum 708 * value before the next stage is used. 709 */ 710 if (ctrl->val <= 32) { 711 data = ctrl->val; 712 } else if (ctrl->val <= 64) { 713 ctrl->val &= ~1; 714 data = (1 << 6) | (ctrl->val >> 1); 715 } else { 716 ctrl->val &= ~7; 717 data = ((ctrl->val - 64) << 5) | (1 << 6) | 32; 718 } 719 720 return mt9p031_write(client, MT9P031_GLOBAL_GAIN, data); 721 722 case V4L2_CID_HFLIP: 723 if (ctrl->val) 724 return mt9p031_set_mode2(mt9p031, 725 0, MT9P031_READ_MODE_2_COL_MIR); 726 else 727 return mt9p031_set_mode2(mt9p031, 728 MT9P031_READ_MODE_2_COL_MIR, 0); 729 730 case V4L2_CID_VFLIP: 731 if (ctrl->val) 732 return mt9p031_set_mode2(mt9p031, 733 0, MT9P031_READ_MODE_2_ROW_MIR); 734 else 735 return mt9p031_set_mode2(mt9p031, 736 MT9P031_READ_MODE_2_ROW_MIR, 0); 737 738 case V4L2_CID_TEST_PATTERN: 739 /* The digital side of the Black Level Calibration function must 740 * be disabled when generating a test pattern to avoid artifacts 741 * in the image. Activate (deactivate) the BLC-related controls 742 * when the test pattern is enabled (disabled). 743 */ 744 v4l2_ctrl_activate(mt9p031->blc_auto, ctrl->val == 0); 745 v4l2_ctrl_activate(mt9p031->blc_offset, ctrl->val == 0); 746 747 if (!ctrl->val) { 748 /* Restore the BLC settings. */ 749 ret = mt9p031_restore_blc(mt9p031); 750 if (ret < 0) 751 return ret; 752 753 return mt9p031_write(client, MT9P031_TEST_PATTERN, 754 MT9P031_TEST_PATTERN_DISABLE); 755 } 756 757 ret = mt9p031_write(client, MT9P031_TEST_PATTERN_GREEN, 0x05a0); 758 if (ret < 0) 759 return ret; 760 ret = mt9p031_write(client, MT9P031_TEST_PATTERN_RED, 0x0a50); 761 if (ret < 0) 762 return ret; 763 ret = mt9p031_write(client, MT9P031_TEST_PATTERN_BLUE, 0x0aa0); 764 if (ret < 0) 765 return ret; 766 767 /* Disable digital BLC when generating a test pattern. */ 768 ret = mt9p031_set_mode2(mt9p031, MT9P031_READ_MODE_2_ROW_BLC, 769 0); 770 if (ret < 0) 771 return ret; 772 773 ret = mt9p031_write(client, MT9P031_ROW_BLACK_DEF_OFFSET, 0); 774 if (ret < 0) 775 return ret; 776 777 return mt9p031_write(client, MT9P031_TEST_PATTERN, 778 ((ctrl->val - 1) << MT9P031_TEST_PATTERN_SHIFT) 779 | MT9P031_TEST_PATTERN_ENABLE); 780 781 case V4L2_CID_BLC_AUTO: 782 ret = mt9p031_set_mode2(mt9p031, 783 ctrl->val ? 0 : MT9P031_READ_MODE_2_ROW_BLC, 784 ctrl->val ? MT9P031_READ_MODE_2_ROW_BLC : 0); 785 if (ret < 0) 786 return ret; 787 788 return mt9p031_write(client, MT9P031_BLACK_LEVEL_CALIBRATION, 789 ctrl->val ? 0 : MT9P031_BLC_MANUAL_BLC); 790 791 case V4L2_CID_BLC_TARGET_LEVEL: 792 return mt9p031_write(client, MT9P031_ROW_BLACK_TARGET, 793 ctrl->val); 794 795 case V4L2_CID_BLC_ANALOG_OFFSET: 796 data = ctrl->val & ((1 << 9) - 1); 797 798 ret = mt9p031_write(client, MT9P031_GREEN1_OFFSET, data); 799 if (ret < 0) 800 return ret; 801 ret = mt9p031_write(client, MT9P031_GREEN2_OFFSET, data); 802 if (ret < 0) 803 return ret; 804 ret = mt9p031_write(client, MT9P031_RED_OFFSET, data); 805 if (ret < 0) 806 return ret; 807 return mt9p031_write(client, MT9P031_BLUE_OFFSET, data); 808 809 case V4L2_CID_BLC_DIGITAL_OFFSET: 810 return mt9p031_write(client, MT9P031_ROW_BLACK_DEF_OFFSET, 811 ctrl->val & ((1 << 12) - 1)); 812 } 813 814 return 0; 815 } 816 817 static const struct v4l2_ctrl_ops mt9p031_ctrl_ops = { 818 .s_ctrl = mt9p031_s_ctrl, 819 }; 820 821 static const char * const mt9p031_test_pattern_menu[] = { 822 "Disabled", 823 "Color Field", 824 "Horizontal Gradient", 825 "Vertical Gradient", 826 "Diagonal Gradient", 827 "Classic Test Pattern", 828 "Walking 1s", 829 "Monochrome Horizontal Bars", 830 "Monochrome Vertical Bars", 831 "Vertical Color Bars", 832 }; 833 834 static const struct v4l2_ctrl_config mt9p031_ctrls[] = { 835 { 836 .ops = &mt9p031_ctrl_ops, 837 .id = V4L2_CID_BLC_AUTO, 838 .type = V4L2_CTRL_TYPE_BOOLEAN, 839 .name = "BLC, Auto", 840 .min = 0, 841 .max = 1, 842 .step = 1, 843 .def = 1, 844 .flags = 0, 845 }, { 846 .ops = &mt9p031_ctrl_ops, 847 .id = V4L2_CID_BLC_TARGET_LEVEL, 848 .type = V4L2_CTRL_TYPE_INTEGER, 849 .name = "BLC Target Level", 850 .min = 0, 851 .max = 4095, 852 .step = 1, 853 .def = 168, 854 .flags = 0, 855 }, { 856 .ops = &mt9p031_ctrl_ops, 857 .id = V4L2_CID_BLC_ANALOG_OFFSET, 858 .type = V4L2_CTRL_TYPE_INTEGER, 859 .name = "BLC Analog Offset", 860 .min = -255, 861 .max = 255, 862 .step = 1, 863 .def = 32, 864 .flags = 0, 865 }, { 866 .ops = &mt9p031_ctrl_ops, 867 .id = V4L2_CID_BLC_DIGITAL_OFFSET, 868 .type = V4L2_CTRL_TYPE_INTEGER, 869 .name = "BLC Digital Offset", 870 .min = -2048, 871 .max = 2047, 872 .step = 1, 873 .def = 40, 874 .flags = 0, 875 } 876 }; 877 878 /* ----------------------------------------------------------------------------- 879 * V4L2 subdev core operations 880 */ 881 882 static int mt9p031_set_power(struct v4l2_subdev *subdev, int on) 883 { 884 struct mt9p031 *mt9p031 = to_mt9p031(subdev); 885 int ret = 0; 886 887 mutex_lock(&mt9p031->power_lock); 888 889 /* If the power count is modified from 0 to != 0 or from != 0 to 0, 890 * update the power state. 891 */ 892 if (mt9p031->power_count == !on) { 893 ret = __mt9p031_set_power(mt9p031, !!on); 894 if (ret < 0) 895 goto out; 896 } 897 898 /* Update the power count. */ 899 mt9p031->power_count += on ? 1 : -1; 900 WARN_ON(mt9p031->power_count < 0); 901 902 out: 903 mutex_unlock(&mt9p031->power_lock); 904 return ret; 905 } 906 907 /* ----------------------------------------------------------------------------- 908 * V4L2 subdev internal operations 909 */ 910 911 static int mt9p031_registered(struct v4l2_subdev *subdev) 912 { 913 struct i2c_client *client = v4l2_get_subdevdata(subdev); 914 struct mt9p031 *mt9p031 = to_mt9p031(subdev); 915 s32 data; 916 int ret; 917 918 ret = mt9p031_power_on(mt9p031); 919 if (ret < 0) { 920 dev_err(&client->dev, "MT9P031 power up failed\n"); 921 return ret; 922 } 923 924 /* Read out the chip version register */ 925 data = mt9p031_read(client, MT9P031_CHIP_VERSION); 926 mt9p031_power_off(mt9p031); 927 928 if (data != MT9P031_CHIP_VERSION_VALUE) { 929 dev_err(&client->dev, "MT9P031 not detected, wrong version " 930 "0x%04x\n", data); 931 return -ENODEV; 932 } 933 934 dev_info(&client->dev, "MT9P031 detected at address 0x%02x\n", 935 client->addr); 936 937 return 0; 938 } 939 940 static int mt9p031_open(struct v4l2_subdev *subdev, struct v4l2_subdev_fh *fh) 941 { 942 struct mt9p031 *mt9p031 = to_mt9p031(subdev); 943 struct v4l2_mbus_framefmt *format; 944 struct v4l2_rect *crop; 945 946 crop = v4l2_subdev_get_try_crop(subdev, fh->pad, 0); 947 crop->left = MT9P031_COLUMN_START_DEF; 948 crop->top = MT9P031_ROW_START_DEF; 949 crop->width = MT9P031_WINDOW_WIDTH_DEF; 950 crop->height = MT9P031_WINDOW_HEIGHT_DEF; 951 952 format = v4l2_subdev_get_try_format(subdev, fh->pad, 0); 953 954 if (mt9p031->model == MT9P031_MODEL_MONOCHROME) 955 format->code = MEDIA_BUS_FMT_Y12_1X12; 956 else 957 format->code = MEDIA_BUS_FMT_SGRBG12_1X12; 958 959 format->width = MT9P031_WINDOW_WIDTH_DEF; 960 format->height = MT9P031_WINDOW_HEIGHT_DEF; 961 format->field = V4L2_FIELD_NONE; 962 format->colorspace = V4L2_COLORSPACE_SRGB; 963 964 return mt9p031_set_power(subdev, 1); 965 } 966 967 static int mt9p031_close(struct v4l2_subdev *subdev, struct v4l2_subdev_fh *fh) 968 { 969 return mt9p031_set_power(subdev, 0); 970 } 971 972 static const struct v4l2_subdev_core_ops mt9p031_subdev_core_ops = { 973 .s_power = mt9p031_set_power, 974 }; 975 976 static const struct v4l2_subdev_video_ops mt9p031_subdev_video_ops = { 977 .s_stream = mt9p031_s_stream, 978 }; 979 980 static const struct v4l2_subdev_pad_ops mt9p031_subdev_pad_ops = { 981 .enum_mbus_code = mt9p031_enum_mbus_code, 982 .enum_frame_size = mt9p031_enum_frame_size, 983 .get_fmt = mt9p031_get_format, 984 .set_fmt = mt9p031_set_format, 985 .get_selection = mt9p031_get_selection, 986 .set_selection = mt9p031_set_selection, 987 }; 988 989 static const struct v4l2_subdev_ops mt9p031_subdev_ops = { 990 .core = &mt9p031_subdev_core_ops, 991 .video = &mt9p031_subdev_video_ops, 992 .pad = &mt9p031_subdev_pad_ops, 993 }; 994 995 static const struct v4l2_subdev_internal_ops mt9p031_subdev_internal_ops = { 996 .registered = mt9p031_registered, 997 .open = mt9p031_open, 998 .close = mt9p031_close, 999 }; 1000 1001 /* ----------------------------------------------------------------------------- 1002 * Driver initialization and probing 1003 */ 1004 1005 static struct mt9p031_platform_data * 1006 mt9p031_get_pdata(struct i2c_client *client) 1007 { 1008 struct mt9p031_platform_data *pdata; 1009 struct device_node *np; 1010 1011 if (!IS_ENABLED(CONFIG_OF) || !client->dev.of_node) 1012 return client->dev.platform_data; 1013 1014 np = of_graph_get_next_endpoint(client->dev.of_node, NULL); 1015 if (!np) 1016 return NULL; 1017 1018 pdata = devm_kzalloc(&client->dev, sizeof(*pdata), GFP_KERNEL); 1019 if (!pdata) 1020 goto done; 1021 1022 of_property_read_u32(np, "input-clock-frequency", &pdata->ext_freq); 1023 of_property_read_u32(np, "pixel-clock-frequency", &pdata->target_freq); 1024 1025 done: 1026 of_node_put(np); 1027 return pdata; 1028 } 1029 1030 static int mt9p031_probe(struct i2c_client *client, 1031 const struct i2c_device_id *did) 1032 { 1033 struct mt9p031_platform_data *pdata = mt9p031_get_pdata(client); 1034 struct i2c_adapter *adapter = client->adapter; 1035 struct mt9p031 *mt9p031; 1036 unsigned int i; 1037 int ret; 1038 1039 if (pdata == NULL) { 1040 dev_err(&client->dev, "No platform data\n"); 1041 return -EINVAL; 1042 } 1043 1044 if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_WORD_DATA)) { 1045 dev_warn(&client->dev, 1046 "I2C-Adapter doesn't support I2C_FUNC_SMBUS_WORD\n"); 1047 return -EIO; 1048 } 1049 1050 mt9p031 = devm_kzalloc(&client->dev, sizeof(*mt9p031), GFP_KERNEL); 1051 if (mt9p031 == NULL) 1052 return -ENOMEM; 1053 1054 mt9p031->pdata = pdata; 1055 mt9p031->output_control = MT9P031_OUTPUT_CONTROL_DEF; 1056 mt9p031->mode2 = MT9P031_READ_MODE_2_ROW_BLC; 1057 mt9p031->model = did->driver_data; 1058 1059 mt9p031->regulators[0].supply = "vdd"; 1060 mt9p031->regulators[1].supply = "vdd_io"; 1061 mt9p031->regulators[2].supply = "vaa"; 1062 1063 ret = devm_regulator_bulk_get(&client->dev, 3, mt9p031->regulators); 1064 if (ret < 0) { 1065 dev_err(&client->dev, "Unable to get regulators\n"); 1066 return ret; 1067 } 1068 1069 mutex_init(&mt9p031->power_lock); 1070 1071 v4l2_ctrl_handler_init(&mt9p031->ctrls, ARRAY_SIZE(mt9p031_ctrls) + 6); 1072 1073 v4l2_ctrl_new_std(&mt9p031->ctrls, &mt9p031_ctrl_ops, 1074 V4L2_CID_EXPOSURE, MT9P031_SHUTTER_WIDTH_MIN, 1075 MT9P031_SHUTTER_WIDTH_MAX, 1, 1076 MT9P031_SHUTTER_WIDTH_DEF); 1077 v4l2_ctrl_new_std(&mt9p031->ctrls, &mt9p031_ctrl_ops, 1078 V4L2_CID_GAIN, MT9P031_GLOBAL_GAIN_MIN, 1079 MT9P031_GLOBAL_GAIN_MAX, 1, MT9P031_GLOBAL_GAIN_DEF); 1080 v4l2_ctrl_new_std(&mt9p031->ctrls, &mt9p031_ctrl_ops, 1081 V4L2_CID_HFLIP, 0, 1, 1, 0); 1082 v4l2_ctrl_new_std(&mt9p031->ctrls, &mt9p031_ctrl_ops, 1083 V4L2_CID_VFLIP, 0, 1, 1, 0); 1084 v4l2_ctrl_new_std(&mt9p031->ctrls, &mt9p031_ctrl_ops, 1085 V4L2_CID_PIXEL_RATE, pdata->target_freq, 1086 pdata->target_freq, 1, pdata->target_freq); 1087 v4l2_ctrl_new_std_menu_items(&mt9p031->ctrls, &mt9p031_ctrl_ops, 1088 V4L2_CID_TEST_PATTERN, 1089 ARRAY_SIZE(mt9p031_test_pattern_menu) - 1, 0, 1090 0, mt9p031_test_pattern_menu); 1091 1092 for (i = 0; i < ARRAY_SIZE(mt9p031_ctrls); ++i) 1093 v4l2_ctrl_new_custom(&mt9p031->ctrls, &mt9p031_ctrls[i], NULL); 1094 1095 mt9p031->subdev.ctrl_handler = &mt9p031->ctrls; 1096 1097 if (mt9p031->ctrls.error) { 1098 printk(KERN_INFO "%s: control initialization error %d\n", 1099 __func__, mt9p031->ctrls.error); 1100 ret = mt9p031->ctrls.error; 1101 goto done; 1102 } 1103 1104 mt9p031->blc_auto = v4l2_ctrl_find(&mt9p031->ctrls, V4L2_CID_BLC_AUTO); 1105 mt9p031->blc_offset = v4l2_ctrl_find(&mt9p031->ctrls, 1106 V4L2_CID_BLC_DIGITAL_OFFSET); 1107 1108 v4l2_i2c_subdev_init(&mt9p031->subdev, client, &mt9p031_subdev_ops); 1109 mt9p031->subdev.internal_ops = &mt9p031_subdev_internal_ops; 1110 1111 mt9p031->subdev.entity.function = MEDIA_ENT_F_CAM_SENSOR; 1112 mt9p031->pad.flags = MEDIA_PAD_FL_SOURCE; 1113 ret = media_entity_pads_init(&mt9p031->subdev.entity, 1, &mt9p031->pad); 1114 if (ret < 0) 1115 goto done; 1116 1117 mt9p031->subdev.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE; 1118 1119 mt9p031->crop.width = MT9P031_WINDOW_WIDTH_DEF; 1120 mt9p031->crop.height = MT9P031_WINDOW_HEIGHT_DEF; 1121 mt9p031->crop.left = MT9P031_COLUMN_START_DEF; 1122 mt9p031->crop.top = MT9P031_ROW_START_DEF; 1123 1124 if (mt9p031->model == MT9P031_MODEL_MONOCHROME) 1125 mt9p031->format.code = MEDIA_BUS_FMT_Y12_1X12; 1126 else 1127 mt9p031->format.code = MEDIA_BUS_FMT_SGRBG12_1X12; 1128 1129 mt9p031->format.width = MT9P031_WINDOW_WIDTH_DEF; 1130 mt9p031->format.height = MT9P031_WINDOW_HEIGHT_DEF; 1131 mt9p031->format.field = V4L2_FIELD_NONE; 1132 mt9p031->format.colorspace = V4L2_COLORSPACE_SRGB; 1133 1134 mt9p031->reset = devm_gpiod_get_optional(&client->dev, "reset", 1135 GPIOD_OUT_HIGH); 1136 1137 ret = mt9p031_clk_setup(mt9p031); 1138 if (ret) 1139 goto done; 1140 1141 ret = v4l2_async_register_subdev(&mt9p031->subdev); 1142 1143 done: 1144 if (ret < 0) { 1145 v4l2_ctrl_handler_free(&mt9p031->ctrls); 1146 media_entity_cleanup(&mt9p031->subdev.entity); 1147 mutex_destroy(&mt9p031->power_lock); 1148 } 1149 1150 return ret; 1151 } 1152 1153 static int mt9p031_remove(struct i2c_client *client) 1154 { 1155 struct v4l2_subdev *subdev = i2c_get_clientdata(client); 1156 struct mt9p031 *mt9p031 = to_mt9p031(subdev); 1157 1158 v4l2_ctrl_handler_free(&mt9p031->ctrls); 1159 v4l2_async_unregister_subdev(subdev); 1160 media_entity_cleanup(&subdev->entity); 1161 mutex_destroy(&mt9p031->power_lock); 1162 1163 return 0; 1164 } 1165 1166 static const struct i2c_device_id mt9p031_id[] = { 1167 { "mt9p031", MT9P031_MODEL_COLOR }, 1168 { "mt9p031m", MT9P031_MODEL_MONOCHROME }, 1169 { } 1170 }; 1171 MODULE_DEVICE_TABLE(i2c, mt9p031_id); 1172 1173 #if IS_ENABLED(CONFIG_OF) 1174 static const struct of_device_id mt9p031_of_match[] = { 1175 { .compatible = "aptina,mt9p031", }, 1176 { .compatible = "aptina,mt9p031m", }, 1177 { /* sentinel */ }, 1178 }; 1179 MODULE_DEVICE_TABLE(of, mt9p031_of_match); 1180 #endif 1181 1182 static struct i2c_driver mt9p031_i2c_driver = { 1183 .driver = { 1184 .of_match_table = of_match_ptr(mt9p031_of_match), 1185 .name = "mt9p031", 1186 }, 1187 .probe = mt9p031_probe, 1188 .remove = mt9p031_remove, 1189 .id_table = mt9p031_id, 1190 }; 1191 1192 module_i2c_driver(mt9p031_i2c_driver); 1193 1194 MODULE_DESCRIPTION("Aptina MT9P031 Camera driver"); 1195 MODULE_AUTHOR("Bastian Hecht <hechtb@gmail.com>"); 1196 MODULE_LICENSE("GPL v2"); 1197