linux/drivers/media/i2c/smiapp/smiapp-core.c
<<
>>
Prefs
   1/*
   2 * drivers/media/i2c/smiapp/smiapp-core.c
   3 *
   4 * Generic driver for SMIA/SMIA++ compliant camera modules
   5 *
   6 * Copyright (C) 2010--2012 Nokia Corporation
   7 * Contact: Sakari Ailus <sakari.ailus@iki.fi>
   8 *
   9 * Based on smiapp driver by Vimarsh Zutshi
  10 * Based on jt8ev1.c by Vimarsh Zutshi
  11 * Based on smia-sensor.c by Tuukka Toivonen <tuukkat76@gmail.com>
  12 *
  13 * This program is free software; you can redistribute it and/or
  14 * modify it under the terms of the GNU General Public License
  15 * version 2 as published by the Free Software Foundation.
  16 *
  17 * This program is distributed in the hope that it will be useful, but
  18 * WITHOUT ANY WARRANTY; without even the implied warranty of
  19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  20 * General Public License for more details.
  21 */
  22
  23#include <linux/clk.h>
  24#include <linux/delay.h>
  25#include <linux/device.h>
  26#include <linux/gpio.h>
  27#include <linux/module.h>
  28#include <linux/of_gpio.h>
  29#include <linux/regulator/consumer.h>
  30#include <linux/slab.h>
  31#include <linux/smiapp.h>
  32#include <linux/v4l2-mediabus.h>
  33#include <media/v4l2-device.h>
  34#include <media/v4l2-of.h>
  35
  36#include "smiapp.h"
  37
  38#define SMIAPP_ALIGN_DIM(dim, flags)    \
  39        ((flags) & V4L2_SEL_FLAG_GE     \
  40         ? ALIGN((dim), 2)              \
  41         : (dim) & ~1)
  42
  43/*
  44 * smiapp_module_idents - supported camera modules
  45 */
  46static const struct smiapp_module_ident smiapp_module_idents[] = {
  47        SMIAPP_IDENT_L(0x01, 0x022b, -1, "vs6555"),
  48        SMIAPP_IDENT_L(0x01, 0x022e, -1, "vw6558"),
  49        SMIAPP_IDENT_L(0x07, 0x7698, -1, "ovm7698"),
  50        SMIAPP_IDENT_L(0x0b, 0x4242, -1, "smiapp-003"),
  51        SMIAPP_IDENT_L(0x0c, 0x208a, -1, "tcm8330md"),
  52        SMIAPP_IDENT_LQ(0x0c, 0x2134, -1, "tcm8500md", &smiapp_tcm8500md_quirk),
  53        SMIAPP_IDENT_L(0x0c, 0x213e, -1, "et8en2"),
  54        SMIAPP_IDENT_L(0x0c, 0x2184, -1, "tcm8580md"),
  55        SMIAPP_IDENT_LQ(0x0c, 0x560f, -1, "jt8ew9", &smiapp_jt8ew9_quirk),
  56        SMIAPP_IDENT_LQ(0x10, 0x4141, -1, "jt8ev1", &smiapp_jt8ev1_quirk),
  57        SMIAPP_IDENT_LQ(0x10, 0x4241, -1, "imx125es", &smiapp_imx125es_quirk),
  58};
  59
  60/*
  61 *
  62 * Dynamic Capability Identification
  63 *
  64 */
  65
  66static int smiapp_read_frame_fmt(struct smiapp_sensor *sensor)
  67{
  68        struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd);
  69        u32 fmt_model_type, fmt_model_subtype, ncol_desc, nrow_desc;
  70        unsigned int i;
  71        int rval;
  72        int line_count = 0;
  73        int embedded_start = -1, embedded_end = -1;
  74        int image_start = 0;
  75
  76        rval = smiapp_read(sensor, SMIAPP_REG_U8_FRAME_FORMAT_MODEL_TYPE,
  77                           &fmt_model_type);
  78        if (rval)
  79                return rval;
  80
  81        rval = smiapp_read(sensor, SMIAPP_REG_U8_FRAME_FORMAT_MODEL_SUBTYPE,
  82                           &fmt_model_subtype);
  83        if (rval)
  84                return rval;
  85
  86        ncol_desc = (fmt_model_subtype
  87                     & SMIAPP_FRAME_FORMAT_MODEL_SUBTYPE_NCOLS_MASK)
  88                >> SMIAPP_FRAME_FORMAT_MODEL_SUBTYPE_NCOLS_SHIFT;
  89        nrow_desc = fmt_model_subtype
  90                & SMIAPP_FRAME_FORMAT_MODEL_SUBTYPE_NROWS_MASK;
  91
  92        dev_dbg(&client->dev, "format_model_type %s\n",
  93                fmt_model_type == SMIAPP_FRAME_FORMAT_MODEL_TYPE_2BYTE
  94                ? "2 byte" :
  95                fmt_model_type == SMIAPP_FRAME_FORMAT_MODEL_TYPE_4BYTE
  96                ? "4 byte" : "is simply bad");
  97
  98        for (i = 0; i < ncol_desc + nrow_desc; i++) {
  99                u32 desc;
 100                u32 pixelcode;
 101                u32 pixels;
 102                char *which;
 103                char *what;
 104
 105                if (fmt_model_type == SMIAPP_FRAME_FORMAT_MODEL_TYPE_2BYTE) {
 106                        rval = smiapp_read(
 107                                sensor,
 108                                SMIAPP_REG_U16_FRAME_FORMAT_DESCRIPTOR_2(i),
 109                                &desc);
 110                        if (rval)
 111                                return rval;
 112
 113                        pixelcode =
 114                                (desc
 115                                 & SMIAPP_FRAME_FORMAT_DESC_2_PIXELCODE_MASK)
 116                                >> SMIAPP_FRAME_FORMAT_DESC_2_PIXELCODE_SHIFT;
 117                        pixels = desc & SMIAPP_FRAME_FORMAT_DESC_2_PIXELS_MASK;
 118                } else if (fmt_model_type
 119                           == SMIAPP_FRAME_FORMAT_MODEL_TYPE_4BYTE) {
 120                        rval = smiapp_read(
 121                                sensor,
 122                                SMIAPP_REG_U32_FRAME_FORMAT_DESCRIPTOR_4(i),
 123                                &desc);
 124                        if (rval)
 125                                return rval;
 126
 127                        pixelcode =
 128                                (desc
 129                                 & SMIAPP_FRAME_FORMAT_DESC_4_PIXELCODE_MASK)
 130                                >> SMIAPP_FRAME_FORMAT_DESC_4_PIXELCODE_SHIFT;
 131                        pixels = desc & SMIAPP_FRAME_FORMAT_DESC_4_PIXELS_MASK;
 132                } else {
 133                        dev_dbg(&client->dev,
 134                                "invalid frame format model type %d\n",
 135                                fmt_model_type);
 136                        return -EINVAL;
 137                }
 138
 139                if (i < ncol_desc)
 140                        which = "columns";
 141                else
 142                        which = "rows";
 143
 144                switch (pixelcode) {
 145                case SMIAPP_FRAME_FORMAT_DESC_PIXELCODE_EMBEDDED:
 146                        what = "embedded";
 147                        break;
 148                case SMIAPP_FRAME_FORMAT_DESC_PIXELCODE_DUMMY:
 149                        what = "dummy";
 150                        break;
 151                case SMIAPP_FRAME_FORMAT_DESC_PIXELCODE_BLACK:
 152                        what = "black";
 153                        break;
 154                case SMIAPP_FRAME_FORMAT_DESC_PIXELCODE_DARK:
 155                        what = "dark";
 156                        break;
 157                case SMIAPP_FRAME_FORMAT_DESC_PIXELCODE_VISIBLE:
 158                        what = "visible";
 159                        break;
 160                default:
 161                        what = "invalid";
 162                        dev_dbg(&client->dev, "pixelcode %d\n", pixelcode);
 163                        break;
 164                }
 165
 166                dev_dbg(&client->dev, "%s pixels: %d %s\n",
 167                        what, pixels, which);
 168
 169                if (i < ncol_desc)
 170                        continue;
 171
 172                /* Handle row descriptors */
 173                if (pixelcode
 174                    == SMIAPP_FRAME_FORMAT_DESC_PIXELCODE_EMBEDDED) {
 175                        embedded_start = line_count;
 176                } else {
 177                        if (pixelcode == SMIAPP_FRAME_FORMAT_DESC_PIXELCODE_VISIBLE
 178                            || pixels >= sensor->limits[SMIAPP_LIMIT_MIN_FRAME_LENGTH_LINES] / 2)
 179                                image_start = line_count;
 180                        if (embedded_start != -1 && embedded_end == -1)
 181                                embedded_end = line_count;
 182                }
 183                line_count += pixels;
 184        }
 185
 186        if (embedded_start == -1 || embedded_end == -1) {
 187                embedded_start = 0;
 188                embedded_end = 0;
 189        }
 190
 191        dev_dbg(&client->dev, "embedded data from lines %d to %d\n",
 192                embedded_start, embedded_end);
 193        dev_dbg(&client->dev, "image data starts at line %d\n", image_start);
 194
 195        return 0;
 196}
 197
 198static int smiapp_pll_configure(struct smiapp_sensor *sensor)
 199{
 200        struct smiapp_pll *pll = &sensor->pll;
 201        int rval;
 202
 203        rval = smiapp_write(
 204                sensor, SMIAPP_REG_U16_VT_PIX_CLK_DIV, pll->vt.pix_clk_div);
 205        if (rval < 0)
 206                return rval;
 207
 208        rval = smiapp_write(
 209                sensor, SMIAPP_REG_U16_VT_SYS_CLK_DIV, pll->vt.sys_clk_div);
 210        if (rval < 0)
 211                return rval;
 212
 213        rval = smiapp_write(
 214                sensor, SMIAPP_REG_U16_PRE_PLL_CLK_DIV, pll->pre_pll_clk_div);
 215        if (rval < 0)
 216                return rval;
 217
 218        rval = smiapp_write(
 219                sensor, SMIAPP_REG_U16_PLL_MULTIPLIER, pll->pll_multiplier);
 220        if (rval < 0)
 221                return rval;
 222
 223        /* Lane op clock ratio does not apply here. */
 224        rval = smiapp_write(
 225                sensor, SMIAPP_REG_U32_REQUESTED_LINK_BIT_RATE_MBPS,
 226                DIV_ROUND_UP(pll->op.sys_clk_freq_hz, 1000000 / 256 / 256));
 227        if (rval < 0 || sensor->minfo.smiapp_profile == SMIAPP_PROFILE_0)
 228                return rval;
 229
 230        rval = smiapp_write(
 231                sensor, SMIAPP_REG_U16_OP_PIX_CLK_DIV, pll->op.pix_clk_div);
 232        if (rval < 0)
 233                return rval;
 234
 235        return smiapp_write(
 236                sensor, SMIAPP_REG_U16_OP_SYS_CLK_DIV, pll->op.sys_clk_div);
 237}
 238
 239static int smiapp_pll_try(struct smiapp_sensor *sensor,
 240                          struct smiapp_pll *pll)
 241{
 242        struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd);
 243        struct smiapp_pll_limits lim = {
 244                .min_pre_pll_clk_div = sensor->limits[SMIAPP_LIMIT_MIN_PRE_PLL_CLK_DIV],
 245                .max_pre_pll_clk_div = sensor->limits[SMIAPP_LIMIT_MAX_PRE_PLL_CLK_DIV],
 246                .min_pll_ip_freq_hz = sensor->limits[SMIAPP_LIMIT_MIN_PLL_IP_FREQ_HZ],
 247                .max_pll_ip_freq_hz = sensor->limits[SMIAPP_LIMIT_MAX_PLL_IP_FREQ_HZ],
 248                .min_pll_multiplier = sensor->limits[SMIAPP_LIMIT_MIN_PLL_MULTIPLIER],
 249                .max_pll_multiplier = sensor->limits[SMIAPP_LIMIT_MAX_PLL_MULTIPLIER],
 250                .min_pll_op_freq_hz = sensor->limits[SMIAPP_LIMIT_MIN_PLL_OP_FREQ_HZ],
 251                .max_pll_op_freq_hz = sensor->limits[SMIAPP_LIMIT_MAX_PLL_OP_FREQ_HZ],
 252
 253                .op.min_sys_clk_div = sensor->limits[SMIAPP_LIMIT_MIN_OP_SYS_CLK_DIV],
 254                .op.max_sys_clk_div = sensor->limits[SMIAPP_LIMIT_MAX_OP_SYS_CLK_DIV],
 255                .op.min_pix_clk_div = sensor->limits[SMIAPP_LIMIT_MIN_OP_PIX_CLK_DIV],
 256                .op.max_pix_clk_div = sensor->limits[SMIAPP_LIMIT_MAX_OP_PIX_CLK_DIV],
 257                .op.min_sys_clk_freq_hz = sensor->limits[SMIAPP_LIMIT_MIN_OP_SYS_CLK_FREQ_HZ],
 258                .op.max_sys_clk_freq_hz = sensor->limits[SMIAPP_LIMIT_MAX_OP_SYS_CLK_FREQ_HZ],
 259                .op.min_pix_clk_freq_hz = sensor->limits[SMIAPP_LIMIT_MIN_OP_PIX_CLK_FREQ_HZ],
 260                .op.max_pix_clk_freq_hz = sensor->limits[SMIAPP_LIMIT_MAX_OP_PIX_CLK_FREQ_HZ],
 261
 262                .vt.min_sys_clk_div = sensor->limits[SMIAPP_LIMIT_MIN_VT_SYS_CLK_DIV],
 263                .vt.max_sys_clk_div = sensor->limits[SMIAPP_LIMIT_MAX_VT_SYS_CLK_DIV],
 264                .vt.min_pix_clk_div = sensor->limits[SMIAPP_LIMIT_MIN_VT_PIX_CLK_DIV],
 265                .vt.max_pix_clk_div = sensor->limits[SMIAPP_LIMIT_MAX_VT_PIX_CLK_DIV],
 266                .vt.min_sys_clk_freq_hz = sensor->limits[SMIAPP_LIMIT_MIN_VT_SYS_CLK_FREQ_HZ],
 267                .vt.max_sys_clk_freq_hz = sensor->limits[SMIAPP_LIMIT_MAX_VT_SYS_CLK_FREQ_HZ],
 268                .vt.min_pix_clk_freq_hz = sensor->limits[SMIAPP_LIMIT_MIN_VT_PIX_CLK_FREQ_HZ],
 269                .vt.max_pix_clk_freq_hz = sensor->limits[SMIAPP_LIMIT_MAX_VT_PIX_CLK_FREQ_HZ],
 270
 271                .min_line_length_pck_bin = sensor->limits[SMIAPP_LIMIT_MIN_LINE_LENGTH_PCK_BIN],
 272                .min_line_length_pck = sensor->limits[SMIAPP_LIMIT_MIN_LINE_LENGTH_PCK],
 273        };
 274
 275        return smiapp_pll_calculate(&client->dev, &lim, pll);
 276}
 277
 278static int smiapp_pll_update(struct smiapp_sensor *sensor)
 279{
 280        struct smiapp_pll *pll = &sensor->pll;
 281        int rval;
 282
 283        pll->binning_horizontal = sensor->binning_horizontal;
 284        pll->binning_vertical = sensor->binning_vertical;
 285        pll->link_freq =
 286                sensor->link_freq->qmenu_int[sensor->link_freq->val];
 287        pll->scale_m = sensor->scale_m;
 288        pll->bits_per_pixel = sensor->csi_format->compressed;
 289
 290        rval = smiapp_pll_try(sensor, pll);
 291        if (rval < 0)
 292                return rval;
 293
 294        __v4l2_ctrl_s_ctrl_int64(sensor->pixel_rate_parray,
 295                                 pll->pixel_rate_pixel_array);
 296        __v4l2_ctrl_s_ctrl_int64(sensor->pixel_rate_csi, pll->pixel_rate_csi);
 297
 298        return 0;
 299}
 300
 301
 302/*
 303 *
 304 * V4L2 Controls handling
 305 *
 306 */
 307
 308static void __smiapp_update_exposure_limits(struct smiapp_sensor *sensor)
 309{
 310        struct v4l2_ctrl *ctrl = sensor->exposure;
 311        int max;
 312
 313        max = sensor->pixel_array->crop[SMIAPP_PA_PAD_SRC].height
 314                + sensor->vblank->val
 315                - sensor->limits[SMIAPP_LIMIT_COARSE_INTEGRATION_TIME_MAX_MARGIN];
 316
 317        __v4l2_ctrl_modify_range(ctrl, ctrl->minimum, max, ctrl->step, max);
 318}
 319
 320/*
 321 * Order matters.
 322 *
 323 * 1. Bits-per-pixel, descending.
 324 * 2. Bits-per-pixel compressed, descending.
 325 * 3. Pixel order, same as in pixel_order_str. Formats for all four pixel
 326 *    orders must be defined.
 327 */
 328static const struct smiapp_csi_data_format smiapp_csi_data_formats[] = {
 329        { MEDIA_BUS_FMT_SGRBG12_1X12, 12, 12, SMIAPP_PIXEL_ORDER_GRBG, },
 330        { MEDIA_BUS_FMT_SRGGB12_1X12, 12, 12, SMIAPP_PIXEL_ORDER_RGGB, },
 331        { MEDIA_BUS_FMT_SBGGR12_1X12, 12, 12, SMIAPP_PIXEL_ORDER_BGGR, },
 332        { MEDIA_BUS_FMT_SGBRG12_1X12, 12, 12, SMIAPP_PIXEL_ORDER_GBRG, },
 333        { MEDIA_BUS_FMT_SGRBG10_1X10, 10, 10, SMIAPP_PIXEL_ORDER_GRBG, },
 334        { MEDIA_BUS_FMT_SRGGB10_1X10, 10, 10, SMIAPP_PIXEL_ORDER_RGGB, },
 335        { MEDIA_BUS_FMT_SBGGR10_1X10, 10, 10, SMIAPP_PIXEL_ORDER_BGGR, },
 336        { MEDIA_BUS_FMT_SGBRG10_1X10, 10, 10, SMIAPP_PIXEL_ORDER_GBRG, },
 337        { MEDIA_BUS_FMT_SGRBG10_DPCM8_1X8, 10, 8, SMIAPP_PIXEL_ORDER_GRBG, },
 338        { MEDIA_BUS_FMT_SRGGB10_DPCM8_1X8, 10, 8, SMIAPP_PIXEL_ORDER_RGGB, },
 339        { MEDIA_BUS_FMT_SBGGR10_DPCM8_1X8, 10, 8, SMIAPP_PIXEL_ORDER_BGGR, },
 340        { MEDIA_BUS_FMT_SGBRG10_DPCM8_1X8, 10, 8, SMIAPP_PIXEL_ORDER_GBRG, },
 341        { MEDIA_BUS_FMT_SGRBG8_1X8, 8, 8, SMIAPP_PIXEL_ORDER_GRBG, },
 342        { MEDIA_BUS_FMT_SRGGB8_1X8, 8, 8, SMIAPP_PIXEL_ORDER_RGGB, },
 343        { MEDIA_BUS_FMT_SBGGR8_1X8, 8, 8, SMIAPP_PIXEL_ORDER_BGGR, },
 344        { MEDIA_BUS_FMT_SGBRG8_1X8, 8, 8, SMIAPP_PIXEL_ORDER_GBRG, },
 345};
 346
 347static const char *pixel_order_str[] = { "GRBG", "RGGB", "BGGR", "GBRG" };
 348
 349#define to_csi_format_idx(fmt) (((unsigned long)(fmt)                   \
 350                                 - (unsigned long)smiapp_csi_data_formats) \
 351                                / sizeof(*smiapp_csi_data_formats))
 352
 353static u32 smiapp_pixel_order(struct smiapp_sensor *sensor)
 354{
 355        struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd);
 356        int flip = 0;
 357
 358        if (sensor->hflip) {
 359                if (sensor->hflip->val)
 360                        flip |= SMIAPP_IMAGE_ORIENTATION_HFLIP;
 361
 362                if (sensor->vflip->val)
 363                        flip |= SMIAPP_IMAGE_ORIENTATION_VFLIP;
 364        }
 365
 366        flip ^= sensor->hvflip_inv_mask;
 367
 368        dev_dbg(&client->dev, "flip %d\n", flip);
 369        return sensor->default_pixel_order ^ flip;
 370}
 371
 372static void smiapp_update_mbus_formats(struct smiapp_sensor *sensor)
 373{
 374        struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd);
 375        unsigned int csi_format_idx =
 376                to_csi_format_idx(sensor->csi_format) & ~3;
 377        unsigned int internal_csi_format_idx =
 378                to_csi_format_idx(sensor->internal_csi_format) & ~3;
 379        unsigned int pixel_order = smiapp_pixel_order(sensor);
 380
 381        sensor->mbus_frame_fmts =
 382                sensor->default_mbus_frame_fmts << pixel_order;
 383        sensor->csi_format =
 384                &smiapp_csi_data_formats[csi_format_idx + pixel_order];
 385        sensor->internal_csi_format =
 386                &smiapp_csi_data_formats[internal_csi_format_idx
 387                                         + pixel_order];
 388
 389        BUG_ON(max(internal_csi_format_idx, csi_format_idx) + pixel_order
 390               >= ARRAY_SIZE(smiapp_csi_data_formats));
 391
 392        dev_dbg(&client->dev, "new pixel order %s\n",
 393                pixel_order_str[pixel_order]);
 394}
 395
 396static const char * const smiapp_test_patterns[] = {
 397        "Disabled",
 398        "Solid Colour",
 399        "Eight Vertical Colour Bars",
 400        "Colour Bars With Fade to Grey",
 401        "Pseudorandom Sequence (PN9)",
 402};
 403
 404static int smiapp_set_ctrl(struct v4l2_ctrl *ctrl)
 405{
 406        struct smiapp_sensor *sensor =
 407                container_of(ctrl->handler, struct smiapp_subdev, ctrl_handler)
 408                        ->sensor;
 409        u32 orient = 0;
 410        int exposure;
 411        int rval;
 412
 413        switch (ctrl->id) {
 414        case V4L2_CID_ANALOGUE_GAIN:
 415                return smiapp_write(
 416                        sensor,
 417                        SMIAPP_REG_U16_ANALOGUE_GAIN_CODE_GLOBAL, ctrl->val);
 418
 419        case V4L2_CID_EXPOSURE:
 420                return smiapp_write(
 421                        sensor,
 422                        SMIAPP_REG_U16_COARSE_INTEGRATION_TIME, ctrl->val);
 423
 424        case V4L2_CID_HFLIP:
 425        case V4L2_CID_VFLIP:
 426                if (sensor->streaming)
 427                        return -EBUSY;
 428
 429                if (sensor->hflip->val)
 430                        orient |= SMIAPP_IMAGE_ORIENTATION_HFLIP;
 431
 432                if (sensor->vflip->val)
 433                        orient |= SMIAPP_IMAGE_ORIENTATION_VFLIP;
 434
 435                orient ^= sensor->hvflip_inv_mask;
 436                rval = smiapp_write(sensor,
 437                                    SMIAPP_REG_U8_IMAGE_ORIENTATION,
 438                                    orient);
 439                if (rval < 0)
 440                        return rval;
 441
 442                smiapp_update_mbus_formats(sensor);
 443
 444                return 0;
 445
 446        case V4L2_CID_VBLANK:
 447                exposure = sensor->exposure->val;
 448
 449                __smiapp_update_exposure_limits(sensor);
 450
 451                if (exposure > sensor->exposure->maximum) {
 452                        sensor->exposure->val =
 453                                sensor->exposure->maximum;
 454                        rval = smiapp_set_ctrl(
 455                                sensor->exposure);
 456                        if (rval < 0)
 457                                return rval;
 458                }
 459
 460                return smiapp_write(
 461                        sensor, SMIAPP_REG_U16_FRAME_LENGTH_LINES,
 462                        sensor->pixel_array->crop[SMIAPP_PA_PAD_SRC].height
 463                        + ctrl->val);
 464
 465        case V4L2_CID_HBLANK:
 466                return smiapp_write(
 467                        sensor, SMIAPP_REG_U16_LINE_LENGTH_PCK,
 468                        sensor->pixel_array->crop[SMIAPP_PA_PAD_SRC].width
 469                        + ctrl->val);
 470
 471        case V4L2_CID_LINK_FREQ:
 472                if (sensor->streaming)
 473                        return -EBUSY;
 474
 475                return smiapp_pll_update(sensor);
 476
 477        case V4L2_CID_TEST_PATTERN: {
 478                unsigned int i;
 479
 480                for (i = 0; i < ARRAY_SIZE(sensor->test_data); i++)
 481                        v4l2_ctrl_activate(
 482                                sensor->test_data[i],
 483                                ctrl->val ==
 484                                V4L2_SMIAPP_TEST_PATTERN_MODE_SOLID_COLOUR);
 485
 486                return smiapp_write(
 487                        sensor, SMIAPP_REG_U16_TEST_PATTERN_MODE, ctrl->val);
 488        }
 489
 490        case V4L2_CID_TEST_PATTERN_RED:
 491                return smiapp_write(
 492                        sensor, SMIAPP_REG_U16_TEST_DATA_RED, ctrl->val);
 493
 494        case V4L2_CID_TEST_PATTERN_GREENR:
 495                return smiapp_write(
 496                        sensor, SMIAPP_REG_U16_TEST_DATA_GREENR, ctrl->val);
 497
 498        case V4L2_CID_TEST_PATTERN_BLUE:
 499                return smiapp_write(
 500                        sensor, SMIAPP_REG_U16_TEST_DATA_BLUE, ctrl->val);
 501
 502        case V4L2_CID_TEST_PATTERN_GREENB:
 503                return smiapp_write(
 504                        sensor, SMIAPP_REG_U16_TEST_DATA_GREENB, ctrl->val);
 505
 506        case V4L2_CID_PIXEL_RATE:
 507                /* For v4l2_ctrl_s_ctrl_int64() used internally. */
 508                return 0;
 509
 510        default:
 511                return -EINVAL;
 512        }
 513}
 514
 515static const struct v4l2_ctrl_ops smiapp_ctrl_ops = {
 516        .s_ctrl = smiapp_set_ctrl,
 517};
 518
 519static int smiapp_init_controls(struct smiapp_sensor *sensor)
 520{
 521        struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd);
 522        int rval;
 523
 524        rval = v4l2_ctrl_handler_init(&sensor->pixel_array->ctrl_handler, 12);
 525        if (rval)
 526                return rval;
 527
 528        sensor->pixel_array->ctrl_handler.lock = &sensor->mutex;
 529
 530        sensor->analog_gain = v4l2_ctrl_new_std(
 531                &sensor->pixel_array->ctrl_handler, &smiapp_ctrl_ops,
 532                V4L2_CID_ANALOGUE_GAIN,
 533                sensor->limits[SMIAPP_LIMIT_ANALOGUE_GAIN_CODE_MIN],
 534                sensor->limits[SMIAPP_LIMIT_ANALOGUE_GAIN_CODE_MAX],
 535                max(sensor->limits[SMIAPP_LIMIT_ANALOGUE_GAIN_CODE_STEP], 1U),
 536                sensor->limits[SMIAPP_LIMIT_ANALOGUE_GAIN_CODE_MIN]);
 537
 538        /* Exposure limits will be updated soon, use just something here. */
 539        sensor->exposure = v4l2_ctrl_new_std(
 540                &sensor->pixel_array->ctrl_handler, &smiapp_ctrl_ops,
 541                V4L2_CID_EXPOSURE, 0, 0, 1, 0);
 542
 543        sensor->hflip = v4l2_ctrl_new_std(
 544                &sensor->pixel_array->ctrl_handler, &smiapp_ctrl_ops,
 545                V4L2_CID_HFLIP, 0, 1, 1, 0);
 546        sensor->vflip = v4l2_ctrl_new_std(
 547                &sensor->pixel_array->ctrl_handler, &smiapp_ctrl_ops,
 548                V4L2_CID_VFLIP, 0, 1, 1, 0);
 549
 550        sensor->vblank = v4l2_ctrl_new_std(
 551                &sensor->pixel_array->ctrl_handler, &smiapp_ctrl_ops,
 552                V4L2_CID_VBLANK, 0, 1, 1, 0);
 553
 554        if (sensor->vblank)
 555                sensor->vblank->flags |= V4L2_CTRL_FLAG_UPDATE;
 556
 557        sensor->hblank = v4l2_ctrl_new_std(
 558                &sensor->pixel_array->ctrl_handler, &smiapp_ctrl_ops,
 559                V4L2_CID_HBLANK, 0, 1, 1, 0);
 560
 561        if (sensor->hblank)
 562                sensor->hblank->flags |= V4L2_CTRL_FLAG_UPDATE;
 563
 564        sensor->pixel_rate_parray = v4l2_ctrl_new_std(
 565                &sensor->pixel_array->ctrl_handler, &smiapp_ctrl_ops,
 566                V4L2_CID_PIXEL_RATE, 1, INT_MAX, 1, 1);
 567
 568        v4l2_ctrl_new_std_menu_items(&sensor->pixel_array->ctrl_handler,
 569                                     &smiapp_ctrl_ops, V4L2_CID_TEST_PATTERN,
 570                                     ARRAY_SIZE(smiapp_test_patterns) - 1,
 571                                     0, 0, smiapp_test_patterns);
 572
 573        if (sensor->pixel_array->ctrl_handler.error) {
 574                dev_err(&client->dev,
 575                        "pixel array controls initialization failed (%d)\n",
 576                        sensor->pixel_array->ctrl_handler.error);
 577                return sensor->pixel_array->ctrl_handler.error;
 578        }
 579
 580        sensor->pixel_array->sd.ctrl_handler =
 581                &sensor->pixel_array->ctrl_handler;
 582
 583        v4l2_ctrl_cluster(2, &sensor->hflip);
 584
 585        rval = v4l2_ctrl_handler_init(&sensor->src->ctrl_handler, 0);
 586        if (rval)
 587                return rval;
 588
 589        sensor->src->ctrl_handler.lock = &sensor->mutex;
 590
 591        sensor->pixel_rate_csi = v4l2_ctrl_new_std(
 592                &sensor->src->ctrl_handler, &smiapp_ctrl_ops,
 593                V4L2_CID_PIXEL_RATE, 1, INT_MAX, 1, 1);
 594
 595        if (sensor->src->ctrl_handler.error) {
 596                dev_err(&client->dev,
 597                        "src controls initialization failed (%d)\n",
 598                        sensor->src->ctrl_handler.error);
 599                return sensor->src->ctrl_handler.error;
 600        }
 601
 602        sensor->src->sd.ctrl_handler = &sensor->src->ctrl_handler;
 603
 604        return 0;
 605}
 606
 607/*
 608 * For controls that require information on available media bus codes
 609 * and linke frequencies.
 610 */
 611static int smiapp_init_late_controls(struct smiapp_sensor *sensor)
 612{
 613        unsigned long *valid_link_freqs = &sensor->valid_link_freqs[
 614                sensor->csi_format->compressed - SMIAPP_COMPRESSED_BASE];
 615        unsigned int max, i;
 616
 617        for (i = 0; i < ARRAY_SIZE(sensor->test_data); i++) {
 618                int max_value = (1 << sensor->csi_format->width) - 1;
 619
 620                sensor->test_data[i] = v4l2_ctrl_new_std(
 621                                &sensor->pixel_array->ctrl_handler,
 622                                &smiapp_ctrl_ops, V4L2_CID_TEST_PATTERN_RED + i,
 623                                0, max_value, 1, max_value);
 624        }
 625
 626        for (max = 0; sensor->platform_data->op_sys_clock[max + 1]; max++);
 627
 628        sensor->link_freq = v4l2_ctrl_new_int_menu(
 629                &sensor->src->ctrl_handler, &smiapp_ctrl_ops,
 630                V4L2_CID_LINK_FREQ, __fls(*valid_link_freqs),
 631                __ffs(*valid_link_freqs), sensor->platform_data->op_sys_clock);
 632
 633        return sensor->src->ctrl_handler.error;
 634}
 635
 636static void smiapp_free_controls(struct smiapp_sensor *sensor)
 637{
 638        unsigned int i;
 639
 640        for (i = 0; i < sensor->ssds_used; i++)
 641                v4l2_ctrl_handler_free(&sensor->ssds[i].ctrl_handler);
 642}
 643
 644static int smiapp_get_limits(struct smiapp_sensor *sensor, int const *limit,
 645                             unsigned int n)
 646{
 647        struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd);
 648        unsigned int i;
 649        u32 val;
 650        int rval;
 651
 652        for (i = 0; i < n; i++) {
 653                rval = smiapp_read(
 654                        sensor, smiapp_reg_limits[limit[i]].addr, &val);
 655                if (rval)
 656                        return rval;
 657                sensor->limits[limit[i]] = val;
 658                dev_dbg(&client->dev, "0x%8.8x \"%s\" = %u, 0x%x\n",
 659                        smiapp_reg_limits[limit[i]].addr,
 660                        smiapp_reg_limits[limit[i]].what, val, val);
 661        }
 662
 663        return 0;
 664}
 665
 666static int smiapp_get_all_limits(struct smiapp_sensor *sensor)
 667{
 668        unsigned int i;
 669        int rval;
 670
 671        for (i = 0; i < SMIAPP_LIMIT_LAST; i++) {
 672                rval = smiapp_get_limits(sensor, &i, 1);
 673                if (rval < 0)
 674                        return rval;
 675        }
 676
 677        if (sensor->limits[SMIAPP_LIMIT_SCALER_N_MIN] == 0)
 678                smiapp_replace_limit(sensor, SMIAPP_LIMIT_SCALER_N_MIN, 16);
 679
 680        return 0;
 681}
 682
 683static int smiapp_get_limits_binning(struct smiapp_sensor *sensor)
 684{
 685        struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd);
 686        static u32 const limits[] = {
 687                SMIAPP_LIMIT_MIN_FRAME_LENGTH_LINES_BIN,
 688                SMIAPP_LIMIT_MAX_FRAME_LENGTH_LINES_BIN,
 689                SMIAPP_LIMIT_MIN_LINE_LENGTH_PCK_BIN,
 690                SMIAPP_LIMIT_MAX_LINE_LENGTH_PCK_BIN,
 691                SMIAPP_LIMIT_MIN_LINE_BLANKING_PCK_BIN,
 692                SMIAPP_LIMIT_FINE_INTEGRATION_TIME_MIN_BIN,
 693                SMIAPP_LIMIT_FINE_INTEGRATION_TIME_MAX_MARGIN_BIN,
 694        };
 695        static u32 const limits_replace[] = {
 696                SMIAPP_LIMIT_MIN_FRAME_LENGTH_LINES,
 697                SMIAPP_LIMIT_MAX_FRAME_LENGTH_LINES,
 698                SMIAPP_LIMIT_MIN_LINE_LENGTH_PCK,
 699                SMIAPP_LIMIT_MAX_LINE_LENGTH_PCK,
 700                SMIAPP_LIMIT_MIN_LINE_BLANKING_PCK,
 701                SMIAPP_LIMIT_FINE_INTEGRATION_TIME_MIN,
 702                SMIAPP_LIMIT_FINE_INTEGRATION_TIME_MAX_MARGIN,
 703        };
 704        unsigned int i;
 705        int rval;
 706
 707        if (sensor->limits[SMIAPP_LIMIT_BINNING_CAPABILITY] ==
 708            SMIAPP_BINNING_CAPABILITY_NO) {
 709                for (i = 0; i < ARRAY_SIZE(limits); i++)
 710                        sensor->limits[limits[i]] =
 711                                sensor->limits[limits_replace[i]];
 712
 713                return 0;
 714        }
 715
 716        rval = smiapp_get_limits(sensor, limits, ARRAY_SIZE(limits));
 717        if (rval < 0)
 718                return rval;
 719
 720        /*
 721         * Sanity check whether the binning limits are valid. If not,
 722         * use the non-binning ones.
 723         */
 724        if (sensor->limits[SMIAPP_LIMIT_MIN_FRAME_LENGTH_LINES_BIN]
 725            && sensor->limits[SMIAPP_LIMIT_MIN_LINE_LENGTH_PCK_BIN]
 726            && sensor->limits[SMIAPP_LIMIT_MIN_LINE_BLANKING_PCK_BIN])
 727                return 0;
 728
 729        for (i = 0; i < ARRAY_SIZE(limits); i++) {
 730                dev_dbg(&client->dev,
 731                        "replace limit 0x%8.8x \"%s\" = %d, 0x%x\n",
 732                        smiapp_reg_limits[limits[i]].addr,
 733                        smiapp_reg_limits[limits[i]].what,
 734                        sensor->limits[limits_replace[i]],
 735                        sensor->limits[limits_replace[i]]);
 736                sensor->limits[limits[i]] =
 737                        sensor->limits[limits_replace[i]];
 738        }
 739
 740        return 0;
 741}
 742
 743static int smiapp_get_mbus_formats(struct smiapp_sensor *sensor)
 744{
 745        struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd);
 746        struct smiapp_pll *pll = &sensor->pll;
 747        unsigned int type, n;
 748        unsigned int i, pixel_order;
 749        int rval;
 750
 751        rval = smiapp_read(
 752                sensor, SMIAPP_REG_U8_DATA_FORMAT_MODEL_TYPE, &type);
 753        if (rval)
 754                return rval;
 755
 756        dev_dbg(&client->dev, "data_format_model_type %d\n", type);
 757
 758        rval = smiapp_read(sensor, SMIAPP_REG_U8_PIXEL_ORDER,
 759                           &pixel_order);
 760        if (rval)
 761                return rval;
 762
 763        if (pixel_order >= ARRAY_SIZE(pixel_order_str)) {
 764                dev_dbg(&client->dev, "bad pixel order %d\n", pixel_order);
 765                return -EINVAL;
 766        }
 767
 768        dev_dbg(&client->dev, "pixel order %d (%s)\n", pixel_order,
 769                pixel_order_str[pixel_order]);
 770
 771        switch (type) {
 772        case SMIAPP_DATA_FORMAT_MODEL_TYPE_NORMAL:
 773                n = SMIAPP_DATA_FORMAT_MODEL_TYPE_NORMAL_N;
 774                break;
 775        case SMIAPP_DATA_FORMAT_MODEL_TYPE_EXTENDED:
 776                n = SMIAPP_DATA_FORMAT_MODEL_TYPE_EXTENDED_N;
 777                break;
 778        default:
 779                return -EINVAL;
 780        }
 781
 782        sensor->default_pixel_order = pixel_order;
 783        sensor->mbus_frame_fmts = 0;
 784
 785        for (i = 0; i < n; i++) {
 786                unsigned int fmt, j;
 787
 788                rval = smiapp_read(
 789                        sensor,
 790                        SMIAPP_REG_U16_DATA_FORMAT_DESCRIPTOR(i), &fmt);
 791                if (rval)
 792                        return rval;
 793
 794                dev_dbg(&client->dev, "%u: bpp %u, compressed %u\n",
 795                        i, fmt >> 8, (u8)fmt);
 796
 797                for (j = 0; j < ARRAY_SIZE(smiapp_csi_data_formats); j++) {
 798                        const struct smiapp_csi_data_format *f =
 799                                &smiapp_csi_data_formats[j];
 800
 801                        if (f->pixel_order != SMIAPP_PIXEL_ORDER_GRBG)
 802                                continue;
 803
 804                        if (f->width != fmt >> 8 || f->compressed != (u8)fmt)
 805                                continue;
 806
 807                        dev_dbg(&client->dev, "jolly good! %d\n", j);
 808
 809                        sensor->default_mbus_frame_fmts |= 1 << j;
 810                }
 811        }
 812
 813        /* Figure out which BPP values can be used with which formats. */
 814        pll->binning_horizontal = 1;
 815        pll->binning_vertical = 1;
 816        pll->scale_m = sensor->scale_m;
 817
 818        for (i = 0; i < ARRAY_SIZE(smiapp_csi_data_formats); i++) {
 819                const struct smiapp_csi_data_format *f =
 820                        &smiapp_csi_data_formats[i];
 821                unsigned long *valid_link_freqs =
 822                        &sensor->valid_link_freqs[
 823                                f->compressed - SMIAPP_COMPRESSED_BASE];
 824                unsigned int j;
 825
 826                BUG_ON(f->compressed < SMIAPP_COMPRESSED_BASE);
 827                BUG_ON(f->compressed > SMIAPP_COMPRESSED_MAX);
 828
 829                if (!(sensor->default_mbus_frame_fmts & 1 << i))
 830                        continue;
 831
 832                pll->bits_per_pixel = f->compressed;
 833
 834                for (j = 0; sensor->platform_data->op_sys_clock[j]; j++) {
 835                        pll->link_freq = sensor->platform_data->op_sys_clock[j];
 836
 837                        rval = smiapp_pll_try(sensor, pll);
 838                        dev_dbg(&client->dev, "link freq %u Hz, bpp %u %s\n",
 839                                pll->link_freq, pll->bits_per_pixel,
 840                                rval ? "not ok" : "ok");
 841                        if (rval)
 842                                continue;
 843
 844                        set_bit(j, valid_link_freqs);
 845                }
 846
 847                if (!*valid_link_freqs) {
 848                        dev_info(&client->dev,
 849                                 "no valid link frequencies for %u bpp\n",
 850                                 f->compressed);
 851                        sensor->default_mbus_frame_fmts &= ~BIT(i);
 852                        continue;
 853                }
 854
 855                if (!sensor->csi_format
 856                    || f->width > sensor->csi_format->width
 857                    || (f->width == sensor->csi_format->width
 858                        && f->compressed > sensor->csi_format->compressed)) {
 859                        sensor->csi_format = f;
 860                        sensor->internal_csi_format = f;
 861                }
 862        }
 863
 864        if (!sensor->csi_format) {
 865                dev_err(&client->dev, "no supported mbus code found\n");
 866                return -EINVAL;
 867        }
 868
 869        smiapp_update_mbus_formats(sensor);
 870
 871        return 0;
 872}
 873
 874static void smiapp_update_blanking(struct smiapp_sensor *sensor)
 875{
 876        struct v4l2_ctrl *vblank = sensor->vblank;
 877        struct v4l2_ctrl *hblank = sensor->hblank;
 878        int min, max;
 879
 880        min = max_t(int,
 881                    sensor->limits[SMIAPP_LIMIT_MIN_FRAME_BLANKING_LINES],
 882                    sensor->limits[SMIAPP_LIMIT_MIN_FRAME_LENGTH_LINES_BIN] -
 883                    sensor->pixel_array->crop[SMIAPP_PA_PAD_SRC].height);
 884        max = sensor->limits[SMIAPP_LIMIT_MAX_FRAME_LENGTH_LINES_BIN] -
 885                sensor->pixel_array->crop[SMIAPP_PA_PAD_SRC].height;
 886
 887        __v4l2_ctrl_modify_range(vblank, min, max, vblank->step, min);
 888
 889        min = max_t(int,
 890                    sensor->limits[SMIAPP_LIMIT_MIN_LINE_LENGTH_PCK_BIN] -
 891                    sensor->pixel_array->crop[SMIAPP_PA_PAD_SRC].width,
 892                    sensor->limits[SMIAPP_LIMIT_MIN_LINE_BLANKING_PCK_BIN]);
 893        max = sensor->limits[SMIAPP_LIMIT_MAX_LINE_LENGTH_PCK_BIN] -
 894                sensor->pixel_array->crop[SMIAPP_PA_PAD_SRC].width;
 895
 896        __v4l2_ctrl_modify_range(hblank, min, max, hblank->step, min);
 897
 898        __smiapp_update_exposure_limits(sensor);
 899}
 900
 901static int smiapp_update_mode(struct smiapp_sensor *sensor)
 902{
 903        struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd);
 904        unsigned int binning_mode;
 905        int rval;
 906
 907        dev_dbg(&client->dev, "frame size: %dx%d\n",
 908                sensor->src->crop[SMIAPP_PAD_SRC].width,
 909                sensor->src->crop[SMIAPP_PAD_SRC].height);
 910        dev_dbg(&client->dev, "csi format width: %d\n",
 911                sensor->csi_format->width);
 912
 913        /* Binning has to be set up here; it affects limits */
 914        if (sensor->binning_horizontal == 1 &&
 915            sensor->binning_vertical == 1) {
 916                binning_mode = 0;
 917        } else {
 918                u8 binning_type =
 919                        (sensor->binning_horizontal << 4)
 920                        | sensor->binning_vertical;
 921
 922                rval = smiapp_write(
 923                        sensor, SMIAPP_REG_U8_BINNING_TYPE, binning_type);
 924                if (rval < 0)
 925                        return rval;
 926
 927                binning_mode = 1;
 928        }
 929        rval = smiapp_write(sensor, SMIAPP_REG_U8_BINNING_MODE, binning_mode);
 930        if (rval < 0)
 931                return rval;
 932
 933        /* Get updated limits due to binning */
 934        rval = smiapp_get_limits_binning(sensor);
 935        if (rval < 0)
 936                return rval;
 937
 938        rval = smiapp_pll_update(sensor);
 939        if (rval < 0)
 940                return rval;
 941
 942        /* Output from pixel array, including blanking */
 943        smiapp_update_blanking(sensor);
 944
 945        dev_dbg(&client->dev, "vblank\t\t%d\n", sensor->vblank->val);
 946        dev_dbg(&client->dev, "hblank\t\t%d\n", sensor->hblank->val);
 947
 948        dev_dbg(&client->dev, "real timeperframe\t100/%d\n",
 949                sensor->pll.pixel_rate_pixel_array /
 950                ((sensor->pixel_array->crop[SMIAPP_PA_PAD_SRC].width
 951                  + sensor->hblank->val) *
 952                 (sensor->pixel_array->crop[SMIAPP_PA_PAD_SRC].height
 953                  + sensor->vblank->val) / 100));
 954
 955        return 0;
 956}
 957
 958/*
 959 *
 960 * SMIA++ NVM handling
 961 *
 962 */
 963static int smiapp_read_nvm(struct smiapp_sensor *sensor,
 964                           unsigned char *nvm)
 965{
 966        u32 i, s, p, np, v;
 967        int rval = 0, rval2;
 968
 969        np = sensor->nvm_size / SMIAPP_NVM_PAGE_SIZE;
 970        for (p = 0; p < np; p++) {
 971                rval = smiapp_write(
 972                        sensor,
 973                        SMIAPP_REG_U8_DATA_TRANSFER_IF_1_PAGE_SELECT, p);
 974                if (rval)
 975                        goto out;
 976
 977                rval = smiapp_write(sensor,
 978                                    SMIAPP_REG_U8_DATA_TRANSFER_IF_1_CTRL,
 979                                    SMIAPP_DATA_TRANSFER_IF_1_CTRL_EN |
 980                                    SMIAPP_DATA_TRANSFER_IF_1_CTRL_RD_EN);
 981                if (rval)
 982                        goto out;
 983
 984                for (i = 0; i < 1000; i++) {
 985                        rval = smiapp_read(
 986                                sensor,
 987                                SMIAPP_REG_U8_DATA_TRANSFER_IF_1_STATUS, &s);
 988
 989                        if (rval)
 990                                goto out;
 991
 992                        if (s & SMIAPP_DATA_TRANSFER_IF_1_STATUS_RD_READY)
 993                                break;
 994
 995                        if (--i == 0) {
 996                                rval = -ETIMEDOUT;
 997                                goto out;
 998                        }
 999
1000                }
1001
1002                for (i = 0; i < SMIAPP_NVM_PAGE_SIZE; i++) {
1003                        rval = smiapp_read(
1004                                sensor,
1005                                SMIAPP_REG_U8_DATA_TRANSFER_IF_1_DATA_0 + i,
1006                                &v);
1007                        if (rval)
1008                                goto out;
1009
1010                        *nvm++ = v;
1011                }
1012        }
1013
1014out:
1015        rval2 = smiapp_write(sensor, SMIAPP_REG_U8_DATA_TRANSFER_IF_1_CTRL, 0);
1016        if (rval < 0)
1017                return rval;
1018        else
1019                return rval2;
1020}
1021
1022/*
1023 *
1024 * SMIA++ CCI address control
1025 *
1026 */
1027static int smiapp_change_cci_addr(struct smiapp_sensor *sensor)
1028{
1029        struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd);
1030        int rval;
1031        u32 val;
1032
1033        client->addr = sensor->platform_data->i2c_addr_dfl;
1034
1035        rval = smiapp_write(sensor,
1036                            SMIAPP_REG_U8_CCI_ADDRESS_CONTROL,
1037                            sensor->platform_data->i2c_addr_alt << 1);
1038        if (rval)
1039                return rval;
1040
1041        client->addr = sensor->platform_data->i2c_addr_alt;
1042
1043        /* verify addr change went ok */
1044        rval = smiapp_read(sensor, SMIAPP_REG_U8_CCI_ADDRESS_CONTROL, &val);
1045        if (rval)
1046                return rval;
1047
1048        if (val != sensor->platform_data->i2c_addr_alt << 1)
1049                return -ENODEV;
1050
1051        return 0;
1052}
1053
1054/*
1055 *
1056 * SMIA++ Mode Control
1057 *
1058 */
1059static int smiapp_setup_flash_strobe(struct smiapp_sensor *sensor)
1060{
1061        struct smiapp_flash_strobe_parms *strobe_setup;
1062        unsigned int ext_freq = sensor->platform_data->ext_clk;
1063        u32 tmp;
1064        u32 strobe_adjustment;
1065        u32 strobe_width_high_rs;
1066        int rval;
1067
1068        strobe_setup = sensor->platform_data->strobe_setup;
1069
1070        /*
1071         * How to calculate registers related to strobe length. Please
1072         * do not change, or if you do at least know what you're
1073         * doing. :-)
1074         *
1075         * Sakari Ailus <sakari.ailus@iki.fi> 2010-10-25
1076         *
1077         * flash_strobe_length [us] / 10^6 = (tFlash_strobe_width_ctrl
1078         *      / EXTCLK freq [Hz]) * flash_strobe_adjustment
1079         *
1080         * tFlash_strobe_width_ctrl E N, [1 - 0xffff]
1081         * flash_strobe_adjustment E N, [1 - 0xff]
1082         *
1083         * The formula above is written as below to keep it on one
1084         * line:
1085         *
1086         * l / 10^6 = w / e * a
1087         *
1088         * Let's mark w * a by x:
1089         *
1090         * x = w * a
1091         *
1092         * Thus, we get:
1093         *
1094         * x = l * e / 10^6
1095         *
1096         * The strobe width must be at least as long as requested,
1097         * thus rounding upwards is needed.
1098         *
1099         * x = (l * e + 10^6 - 1) / 10^6
1100         * -----------------------------
1101         *
1102         * Maximum possible accuracy is wanted at all times. Thus keep
1103         * a as small as possible.
1104         *
1105         * Calculate a, assuming maximum w, with rounding upwards:
1106         *
1107         * a = (x + (2^16 - 1) - 1) / (2^16 - 1)
1108         * -------------------------------------
1109         *
1110         * Thus, we also get w, with that a, with rounding upwards:
1111         *
1112         * w = (x + a - 1) / a
1113         * -------------------
1114         *
1115         * To get limits:
1116         *
1117         * x E [1, (2^16 - 1) * (2^8 - 1)]
1118         *
1119         * Substituting maximum x to the original formula (with rounding),
1120         * the maximum l is thus
1121         *
1122         * (2^16 - 1) * (2^8 - 1) * 10^6 = l * e + 10^6 - 1
1123         *
1124         * l = (10^6 * (2^16 - 1) * (2^8 - 1) - 10^6 + 1) / e
1125         * --------------------------------------------------
1126         *
1127         * flash_strobe_length must be clamped between 1 and
1128         * (10^6 * (2^16 - 1) * (2^8 - 1) - 10^6 + 1) / EXTCLK freq.
1129         *
1130         * Then,
1131         *
1132         * flash_strobe_adjustment = ((flash_strobe_length *
1133         *      EXTCLK freq + 10^6 - 1) / 10^6 + (2^16 - 1) - 1) / (2^16 - 1)
1134         *
1135         * tFlash_strobe_width_ctrl = ((flash_strobe_length *
1136         *      EXTCLK freq + 10^6 - 1) / 10^6 +
1137         *      flash_strobe_adjustment - 1) / flash_strobe_adjustment
1138         */
1139        tmp = div_u64(1000000ULL * ((1 << 16) - 1) * ((1 << 8) - 1) -
1140                      1000000 + 1, ext_freq);
1141        strobe_setup->strobe_width_high_us =
1142                clamp_t(u32, strobe_setup->strobe_width_high_us, 1, tmp);
1143
1144        tmp = div_u64(((u64)strobe_setup->strobe_width_high_us * (u64)ext_freq +
1145                        1000000 - 1), 1000000ULL);
1146        strobe_adjustment = (tmp + (1 << 16) - 1 - 1) / ((1 << 16) - 1);
1147        strobe_width_high_rs = (tmp + strobe_adjustment - 1) /
1148                                strobe_adjustment;
1149
1150        rval = smiapp_write(sensor, SMIAPP_REG_U8_FLASH_MODE_RS,
1151                            strobe_setup->mode);
1152        if (rval < 0)
1153                goto out;
1154
1155        rval = smiapp_write(sensor, SMIAPP_REG_U8_FLASH_STROBE_ADJUSTMENT,
1156                            strobe_adjustment);
1157        if (rval < 0)
1158                goto out;
1159
1160        rval = smiapp_write(
1161                sensor, SMIAPP_REG_U16_TFLASH_STROBE_WIDTH_HIGH_RS_CTRL,
1162                strobe_width_high_rs);
1163        if (rval < 0)
1164                goto out;
1165
1166        rval = smiapp_write(sensor, SMIAPP_REG_U16_TFLASH_STROBE_DELAY_RS_CTRL,
1167                            strobe_setup->strobe_delay);
1168        if (rval < 0)
1169                goto out;
1170
1171        rval = smiapp_write(sensor, SMIAPP_REG_U16_FLASH_STROBE_START_POINT,
1172                            strobe_setup->stobe_start_point);
1173        if (rval < 0)
1174                goto out;
1175
1176        rval = smiapp_write(sensor, SMIAPP_REG_U8_FLASH_TRIGGER_RS,
1177                            strobe_setup->trigger);
1178
1179out:
1180        sensor->platform_data->strobe_setup->trigger = 0;
1181
1182        return rval;
1183}
1184
1185/* -----------------------------------------------------------------------------
1186 * Power management
1187 */
1188
1189static int smiapp_power_on(struct smiapp_sensor *sensor)
1190{
1191        struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd);
1192        unsigned int sleep;
1193        int rval;
1194
1195        rval = regulator_enable(sensor->vana);
1196        if (rval) {
1197                dev_err(&client->dev, "failed to enable vana regulator\n");
1198                return rval;
1199        }
1200        usleep_range(1000, 1000);
1201
1202        if (sensor->platform_data->set_xclk)
1203                rval = sensor->platform_data->set_xclk(
1204                        &sensor->src->sd, sensor->platform_data->ext_clk);
1205        else
1206                rval = clk_prepare_enable(sensor->ext_clk);
1207        if (rval < 0) {
1208                dev_dbg(&client->dev, "failed to enable xclk\n");
1209                goto out_xclk_fail;
1210        }
1211        usleep_range(1000, 1000);
1212
1213        if (gpio_is_valid(sensor->platform_data->xshutdown))
1214                gpio_set_value(sensor->platform_data->xshutdown, 1);
1215
1216        sleep = SMIAPP_RESET_DELAY(sensor->platform_data->ext_clk);
1217        usleep_range(sleep, sleep);
1218
1219        /*
1220         * Failures to respond to the address change command have been noticed.
1221         * Those failures seem to be caused by the sensor requiring a longer
1222         * boot time than advertised. An additional 10ms delay seems to work
1223         * around the issue, but the SMIA++ I2C write retry hack makes the delay
1224         * unnecessary. The failures need to be investigated to find a proper
1225         * fix, and a delay will likely need to be added here if the I2C write
1226         * retry hack is reverted before the root cause of the boot time issue
1227         * is found.
1228         */
1229
1230        if (sensor->platform_data->i2c_addr_alt) {
1231                rval = smiapp_change_cci_addr(sensor);
1232                if (rval) {
1233                        dev_err(&client->dev, "cci address change error\n");
1234                        goto out_cci_addr_fail;
1235                }
1236        }
1237
1238        rval = smiapp_write(sensor, SMIAPP_REG_U8_SOFTWARE_RESET,
1239                            SMIAPP_SOFTWARE_RESET);
1240        if (rval < 0) {
1241                dev_err(&client->dev, "software reset failed\n");
1242                goto out_cci_addr_fail;
1243        }
1244
1245        if (sensor->platform_data->i2c_addr_alt) {
1246                rval = smiapp_change_cci_addr(sensor);
1247                if (rval) {
1248                        dev_err(&client->dev, "cci address change error\n");
1249                        goto out_cci_addr_fail;
1250                }
1251        }
1252
1253        rval = smiapp_write(sensor, SMIAPP_REG_U16_COMPRESSION_MODE,
1254                            SMIAPP_COMPRESSION_MODE_SIMPLE_PREDICTOR);
1255        if (rval) {
1256                dev_err(&client->dev, "compression mode set failed\n");
1257                goto out_cci_addr_fail;
1258        }
1259
1260        rval = smiapp_write(
1261                sensor, SMIAPP_REG_U16_EXTCLK_FREQUENCY_MHZ,
1262                sensor->platform_data->ext_clk / (1000000 / (1 << 8)));
1263        if (rval) {
1264                dev_err(&client->dev, "extclk frequency set failed\n");
1265                goto out_cci_addr_fail;
1266        }
1267
1268        rval = smiapp_write(sensor, SMIAPP_REG_U8_CSI_LANE_MODE,
1269                            sensor->platform_data->lanes - 1);
1270        if (rval) {
1271                dev_err(&client->dev, "csi lane mode set failed\n");
1272                goto out_cci_addr_fail;
1273        }
1274
1275        rval = smiapp_write(sensor, SMIAPP_REG_U8_FAST_STANDBY_CTRL,
1276                            SMIAPP_FAST_STANDBY_CTRL_IMMEDIATE);
1277        if (rval) {
1278                dev_err(&client->dev, "fast standby set failed\n");
1279                goto out_cci_addr_fail;
1280        }
1281
1282        rval = smiapp_write(sensor, SMIAPP_REG_U8_CSI_SIGNALLING_MODE,
1283                            sensor->platform_data->csi_signalling_mode);
1284        if (rval) {
1285                dev_err(&client->dev, "csi signalling mode set failed\n");
1286                goto out_cci_addr_fail;
1287        }
1288
1289        /* DPHY control done by sensor based on requested link rate */
1290        rval = smiapp_write(sensor, SMIAPP_REG_U8_DPHY_CTRL,
1291                            SMIAPP_DPHY_CTRL_UI);
1292        if (rval < 0)
1293                return rval;
1294
1295        rval = smiapp_call_quirk(sensor, post_poweron);
1296        if (rval) {
1297                dev_err(&client->dev, "post_poweron quirks failed\n");
1298                goto out_cci_addr_fail;
1299        }
1300
1301        /* Are we still initialising...? If yes, return here. */
1302        if (!sensor->pixel_array)
1303                return 0;
1304
1305        rval = v4l2_ctrl_handler_setup(
1306                &sensor->pixel_array->ctrl_handler);
1307        if (rval)
1308                goto out_cci_addr_fail;
1309
1310        rval = v4l2_ctrl_handler_setup(&sensor->src->ctrl_handler);
1311        if (rval)
1312                goto out_cci_addr_fail;
1313
1314        mutex_lock(&sensor->mutex);
1315        rval = smiapp_update_mode(sensor);
1316        mutex_unlock(&sensor->mutex);
1317        if (rval < 0)
1318                goto out_cci_addr_fail;
1319
1320        return 0;
1321
1322out_cci_addr_fail:
1323        if (gpio_is_valid(sensor->platform_data->xshutdown))
1324                gpio_set_value(sensor->platform_data->xshutdown, 0);
1325        if (sensor->platform_data->set_xclk)
1326                sensor->platform_data->set_xclk(&sensor->src->sd, 0);
1327        else
1328                clk_disable_unprepare(sensor->ext_clk);
1329
1330out_xclk_fail:
1331        regulator_disable(sensor->vana);
1332        return rval;
1333}
1334
1335static void smiapp_power_off(struct smiapp_sensor *sensor)
1336{
1337        /*
1338         * Currently power/clock to lens are enable/disabled separately
1339         * but they are essentially the same signals. So if the sensor is
1340         * powered off while the lens is powered on the sensor does not
1341         * really see a power off and next time the cci address change
1342         * will fail. So do a soft reset explicitly here.
1343         */
1344        if (sensor->platform_data->i2c_addr_alt)
1345                smiapp_write(sensor,
1346                             SMIAPP_REG_U8_SOFTWARE_RESET,
1347                             SMIAPP_SOFTWARE_RESET);
1348
1349        if (gpio_is_valid(sensor->platform_data->xshutdown))
1350                gpio_set_value(sensor->platform_data->xshutdown, 0);
1351        if (sensor->platform_data->set_xclk)
1352                sensor->platform_data->set_xclk(&sensor->src->sd, 0);
1353        else
1354                clk_disable_unprepare(sensor->ext_clk);
1355        usleep_range(5000, 5000);
1356        regulator_disable(sensor->vana);
1357        sensor->streaming = false;
1358}
1359
1360static int smiapp_set_power(struct v4l2_subdev *subdev, int on)
1361{
1362        struct smiapp_sensor *sensor = to_smiapp_sensor(subdev);
1363        int ret = 0;
1364
1365        mutex_lock(&sensor->power_mutex);
1366
1367        if (on && !sensor->power_count) {
1368                /* Power on and perform initialisation. */
1369                ret = smiapp_power_on(sensor);
1370                if (ret < 0)
1371                        goto out;
1372        } else if (!on && sensor->power_count == 1) {
1373                smiapp_power_off(sensor);
1374        }
1375
1376        /* Update the power count. */
1377        sensor->power_count += on ? 1 : -1;
1378        WARN_ON(sensor->power_count < 0);
1379
1380out:
1381        mutex_unlock(&sensor->power_mutex);
1382        return ret;
1383}
1384
1385/* -----------------------------------------------------------------------------
1386 * Video stream management
1387 */
1388
1389static int smiapp_start_streaming(struct smiapp_sensor *sensor)
1390{
1391        struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd);
1392        int rval;
1393
1394        mutex_lock(&sensor->mutex);
1395
1396        rval = smiapp_write(sensor, SMIAPP_REG_U16_CSI_DATA_FORMAT,
1397                            (sensor->csi_format->width << 8) |
1398                            sensor->csi_format->compressed);
1399        if (rval)
1400                goto out;
1401
1402        rval = smiapp_pll_configure(sensor);
1403        if (rval)
1404                goto out;
1405
1406        /* Analog crop start coordinates */
1407        rval = smiapp_write(sensor, SMIAPP_REG_U16_X_ADDR_START,
1408                            sensor->pixel_array->crop[SMIAPP_PA_PAD_SRC].left);
1409        if (rval < 0)
1410                goto out;
1411
1412        rval = smiapp_write(sensor, SMIAPP_REG_U16_Y_ADDR_START,
1413                            sensor->pixel_array->crop[SMIAPP_PA_PAD_SRC].top);
1414        if (rval < 0)
1415                goto out;
1416
1417        /* Analog crop end coordinates */
1418        rval = smiapp_write(
1419                sensor, SMIAPP_REG_U16_X_ADDR_END,
1420                sensor->pixel_array->crop[SMIAPP_PA_PAD_SRC].left
1421                + sensor->pixel_array->crop[SMIAPP_PA_PAD_SRC].width - 1);
1422        if (rval < 0)
1423                goto out;
1424
1425        rval = smiapp_write(
1426                sensor, SMIAPP_REG_U16_Y_ADDR_END,
1427                sensor->pixel_array->crop[SMIAPP_PA_PAD_SRC].top
1428                + sensor->pixel_array->crop[SMIAPP_PA_PAD_SRC].height - 1);
1429        if (rval < 0)
1430                goto out;
1431
1432        /*
1433         * Output from pixel array, including blanking, is set using
1434         * controls below. No need to set here.
1435         */
1436
1437        /* Digital crop */
1438        if (sensor->limits[SMIAPP_LIMIT_DIGITAL_CROP_CAPABILITY]
1439            == SMIAPP_DIGITAL_CROP_CAPABILITY_INPUT_CROP) {
1440                rval = smiapp_write(
1441                        sensor, SMIAPP_REG_U16_DIGITAL_CROP_X_OFFSET,
1442                        sensor->scaler->crop[SMIAPP_PAD_SINK].left);
1443                if (rval < 0)
1444                        goto out;
1445
1446                rval = smiapp_write(
1447                        sensor, SMIAPP_REG_U16_DIGITAL_CROP_Y_OFFSET,
1448                        sensor->scaler->crop[SMIAPP_PAD_SINK].top);
1449                if (rval < 0)
1450                        goto out;
1451
1452                rval = smiapp_write(
1453                        sensor, SMIAPP_REG_U16_DIGITAL_CROP_IMAGE_WIDTH,
1454                        sensor->scaler->crop[SMIAPP_PAD_SINK].width);
1455                if (rval < 0)
1456                        goto out;
1457
1458                rval = smiapp_write(
1459                        sensor, SMIAPP_REG_U16_DIGITAL_CROP_IMAGE_HEIGHT,
1460                        sensor->scaler->crop[SMIAPP_PAD_SINK].height);
1461                if (rval < 0)
1462                        goto out;
1463        }
1464
1465        /* Scaling */
1466        if (sensor->limits[SMIAPP_LIMIT_SCALING_CAPABILITY]
1467            != SMIAPP_SCALING_CAPABILITY_NONE) {
1468                rval = smiapp_write(sensor, SMIAPP_REG_U16_SCALING_MODE,
1469                                    sensor->scaling_mode);
1470                if (rval < 0)
1471                        goto out;
1472
1473                rval = smiapp_write(sensor, SMIAPP_REG_U16_SCALE_M,
1474                                    sensor->scale_m);
1475                if (rval < 0)
1476                        goto out;
1477        }
1478
1479        /* Output size from sensor */
1480        rval = smiapp_write(sensor, SMIAPP_REG_U16_X_OUTPUT_SIZE,
1481                            sensor->src->crop[SMIAPP_PAD_SRC].width);
1482        if (rval < 0)
1483                goto out;
1484        rval = smiapp_write(sensor, SMIAPP_REG_U16_Y_OUTPUT_SIZE,
1485                            sensor->src->crop[SMIAPP_PAD_SRC].height);
1486        if (rval < 0)
1487                goto out;
1488
1489        if ((sensor->limits[SMIAPP_LIMIT_FLASH_MODE_CAPABILITY] &
1490             (SMIAPP_FLASH_MODE_CAPABILITY_SINGLE_STROBE |
1491              SMIAPP_FLASH_MODE_CAPABILITY_MULTIPLE_STROBE)) &&
1492            sensor->platform_data->strobe_setup != NULL &&
1493            sensor->platform_data->strobe_setup->trigger != 0) {
1494                rval = smiapp_setup_flash_strobe(sensor);
1495                if (rval)
1496                        goto out;
1497        }
1498
1499        rval = smiapp_call_quirk(sensor, pre_streamon);
1500        if (rval) {
1501                dev_err(&client->dev, "pre_streamon quirks failed\n");
1502                goto out;
1503        }
1504
1505        rval = smiapp_write(sensor, SMIAPP_REG_U8_MODE_SELECT,
1506                            SMIAPP_MODE_SELECT_STREAMING);
1507
1508out:
1509        mutex_unlock(&sensor->mutex);
1510
1511        return rval;
1512}
1513
1514static int smiapp_stop_streaming(struct smiapp_sensor *sensor)
1515{
1516        struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd);
1517        int rval;
1518
1519        mutex_lock(&sensor->mutex);
1520        rval = smiapp_write(sensor, SMIAPP_REG_U8_MODE_SELECT,
1521                            SMIAPP_MODE_SELECT_SOFTWARE_STANDBY);
1522        if (rval)
1523                goto out;
1524
1525        rval = smiapp_call_quirk(sensor, post_streamoff);
1526        if (rval)
1527                dev_err(&client->dev, "post_streamoff quirks failed\n");
1528
1529out:
1530        mutex_unlock(&sensor->mutex);
1531        return rval;
1532}
1533
1534/* -----------------------------------------------------------------------------
1535 * V4L2 subdev video operations
1536 */
1537
1538static int smiapp_set_stream(struct v4l2_subdev *subdev, int enable)
1539{
1540        struct smiapp_sensor *sensor = to_smiapp_sensor(subdev);
1541        int rval;
1542
1543        if (sensor->streaming == enable)
1544                return 0;
1545
1546        if (enable) {
1547                sensor->streaming = true;
1548                rval = smiapp_start_streaming(sensor);
1549                if (rval < 0)
1550                        sensor->streaming = false;
1551        } else {
1552                rval = smiapp_stop_streaming(sensor);
1553                sensor->streaming = false;
1554        }
1555
1556        return rval;
1557}
1558
1559static int smiapp_enum_mbus_code(struct v4l2_subdev *subdev,
1560                                 struct v4l2_subdev_pad_config *cfg,
1561                                 struct v4l2_subdev_mbus_code_enum *code)
1562{
1563        struct i2c_client *client = v4l2_get_subdevdata(subdev);
1564        struct smiapp_sensor *sensor = to_smiapp_sensor(subdev);
1565        unsigned int i;
1566        int idx = -1;
1567        int rval = -EINVAL;
1568
1569        mutex_lock(&sensor->mutex);
1570
1571        dev_err(&client->dev, "subdev %s, pad %d, index %d\n",
1572                subdev->name, code->pad, code->index);
1573
1574        if (subdev != &sensor->src->sd || code->pad != SMIAPP_PAD_SRC) {
1575                if (code->index)
1576                        goto out;
1577
1578                code->code = sensor->internal_csi_format->code;
1579                rval = 0;
1580                goto out;
1581        }
1582
1583        for (i = 0; i < ARRAY_SIZE(smiapp_csi_data_formats); i++) {
1584                if (sensor->mbus_frame_fmts & (1 << i))
1585                        idx++;
1586
1587                if (idx == code->index) {
1588                        code->code = smiapp_csi_data_formats[i].code;
1589                        dev_err(&client->dev, "found index %d, i %d, code %x\n",
1590                                code->index, i, code->code);
1591                        rval = 0;
1592                        break;
1593                }
1594        }
1595
1596out:
1597        mutex_unlock(&sensor->mutex);
1598
1599        return rval;
1600}
1601
1602static u32 __smiapp_get_mbus_code(struct v4l2_subdev *subdev,
1603                                  unsigned int pad)
1604{
1605        struct smiapp_sensor *sensor = to_smiapp_sensor(subdev);
1606
1607        if (subdev == &sensor->src->sd && pad == SMIAPP_PAD_SRC)
1608                return sensor->csi_format->code;
1609        else
1610                return sensor->internal_csi_format->code;
1611}
1612
1613static int __smiapp_get_format(struct v4l2_subdev *subdev,
1614                               struct v4l2_subdev_pad_config *cfg,
1615                               struct v4l2_subdev_format *fmt)
1616{
1617        struct smiapp_subdev *ssd = to_smiapp_subdev(subdev);
1618
1619        if (fmt->which == V4L2_SUBDEV_FORMAT_TRY) {
1620                fmt->format = *v4l2_subdev_get_try_format(subdev, cfg, fmt->pad);
1621        } else {
1622                struct v4l2_rect *r;
1623
1624                if (fmt->pad == ssd->source_pad)
1625                        r = &ssd->crop[ssd->source_pad];
1626                else
1627                        r = &ssd->sink_fmt;
1628
1629                fmt->format.code = __smiapp_get_mbus_code(subdev, fmt->pad);
1630                fmt->format.width = r->width;
1631                fmt->format.height = r->height;
1632                fmt->format.field = V4L2_FIELD_NONE;
1633        }
1634
1635        return 0;
1636}
1637
1638static int smiapp_get_format(struct v4l2_subdev *subdev,
1639                             struct v4l2_subdev_pad_config *cfg,
1640                             struct v4l2_subdev_format *fmt)
1641{
1642        struct smiapp_sensor *sensor = to_smiapp_sensor(subdev);
1643        int rval;
1644
1645        mutex_lock(&sensor->mutex);
1646        rval = __smiapp_get_format(subdev, cfg, fmt);
1647        mutex_unlock(&sensor->mutex);
1648
1649        return rval;
1650}
1651
1652static void smiapp_get_crop_compose(struct v4l2_subdev *subdev,
1653                                    struct v4l2_subdev_pad_config *cfg,
1654                                    struct v4l2_rect **crops,
1655                                    struct v4l2_rect **comps, int which)
1656{
1657        struct smiapp_subdev *ssd = to_smiapp_subdev(subdev);
1658        unsigned int i;
1659
1660        if (which == V4L2_SUBDEV_FORMAT_ACTIVE) {
1661                if (crops)
1662                        for (i = 0; i < subdev->entity.num_pads; i++)
1663                                crops[i] = &ssd->crop[i];
1664                if (comps)
1665                        *comps = &ssd->compose;
1666        } else {
1667                if (crops) {
1668                        for (i = 0; i < subdev->entity.num_pads; i++) {
1669                                crops[i] = v4l2_subdev_get_try_crop(subdev, cfg, i);
1670                                BUG_ON(!crops[i]);
1671                        }
1672                }
1673                if (comps) {
1674                        *comps = v4l2_subdev_get_try_compose(subdev, cfg,
1675                                                             SMIAPP_PAD_SINK);
1676                        BUG_ON(!*comps);
1677                }
1678        }
1679}
1680
1681/* Changes require propagation only on sink pad. */
1682static void smiapp_propagate(struct v4l2_subdev *subdev,
1683                             struct v4l2_subdev_pad_config *cfg, int which,
1684                             int target)
1685{
1686        struct smiapp_sensor *sensor = to_smiapp_sensor(subdev);
1687        struct smiapp_subdev *ssd = to_smiapp_subdev(subdev);
1688        struct v4l2_rect *comp, *crops[SMIAPP_PADS];
1689
1690        smiapp_get_crop_compose(subdev, cfg, crops, &comp, which);
1691
1692        switch (target) {
1693        case V4L2_SEL_TGT_CROP:
1694                comp->width = crops[SMIAPP_PAD_SINK]->width;
1695                comp->height = crops[SMIAPP_PAD_SINK]->height;
1696                if (which == V4L2_SUBDEV_FORMAT_ACTIVE) {
1697                        if (ssd == sensor->scaler) {
1698                                sensor->scale_m =
1699                                        sensor->limits[
1700                                                SMIAPP_LIMIT_SCALER_N_MIN];
1701                                sensor->scaling_mode =
1702                                        SMIAPP_SCALING_MODE_NONE;
1703                        } else if (ssd == sensor->binner) {
1704                                sensor->binning_horizontal = 1;
1705                                sensor->binning_vertical = 1;
1706                        }
1707                }
1708                /* Fall through */
1709        case V4L2_SEL_TGT_COMPOSE:
1710                *crops[SMIAPP_PAD_SRC] = *comp;
1711                break;
1712        default:
1713                BUG();
1714        }
1715}
1716
1717static const struct smiapp_csi_data_format
1718*smiapp_validate_csi_data_format(struct smiapp_sensor *sensor, u32 code)
1719{
1720        const struct smiapp_csi_data_format *csi_format = sensor->csi_format;
1721        unsigned int i;
1722
1723        for (i = 0; i < ARRAY_SIZE(smiapp_csi_data_formats); i++) {
1724                if (sensor->mbus_frame_fmts & (1 << i)
1725                    && smiapp_csi_data_formats[i].code == code)
1726                        return &smiapp_csi_data_formats[i];
1727        }
1728
1729        return csi_format;
1730}
1731
1732static int smiapp_set_format_source(struct v4l2_subdev *subdev,
1733                                    struct v4l2_subdev_pad_config *cfg,
1734                                    struct v4l2_subdev_format *fmt)
1735{
1736        struct smiapp_sensor *sensor = to_smiapp_sensor(subdev);
1737        const struct smiapp_csi_data_format *csi_format,
1738                *old_csi_format = sensor->csi_format;
1739        unsigned long *valid_link_freqs;
1740        u32 code = fmt->format.code;
1741        unsigned int i;
1742        int rval;
1743
1744        rval = __smiapp_get_format(subdev, cfg, fmt);
1745        if (rval)
1746                return rval;
1747
1748        /*
1749         * Media bus code is changeable on src subdev's source pad. On
1750         * other source pads we just get format here.
1751         */
1752        if (subdev != &sensor->src->sd)
1753                return 0;
1754
1755        csi_format = smiapp_validate_csi_data_format(sensor, code);
1756
1757        fmt->format.code = csi_format->code;
1758
1759        if (fmt->which != V4L2_SUBDEV_FORMAT_ACTIVE)
1760                return 0;
1761
1762        sensor->csi_format = csi_format;
1763
1764        if (csi_format->width != old_csi_format->width)
1765                for (i = 0; i < ARRAY_SIZE(sensor->test_data); i++)
1766                        __v4l2_ctrl_modify_range(
1767                                sensor->test_data[i], 0,
1768                                (1 << csi_format->width) - 1, 1, 0);
1769
1770        if (csi_format->compressed == old_csi_format->compressed)
1771                return 0;
1772
1773        valid_link_freqs = 
1774                &sensor->valid_link_freqs[sensor->csi_format->compressed
1775                                          - SMIAPP_COMPRESSED_BASE];
1776
1777        __v4l2_ctrl_modify_range(
1778                sensor->link_freq, 0,
1779                __fls(*valid_link_freqs), ~*valid_link_freqs,
1780                __ffs(*valid_link_freqs));
1781
1782        return smiapp_pll_update(sensor);
1783}
1784
1785static int smiapp_set_format(struct v4l2_subdev *subdev,
1786                             struct v4l2_subdev_pad_config *cfg,
1787                             struct v4l2_subdev_format *fmt)
1788{
1789        struct smiapp_sensor *sensor = to_smiapp_sensor(subdev);
1790        struct smiapp_subdev *ssd = to_smiapp_subdev(subdev);
1791        struct v4l2_rect *crops[SMIAPP_PADS];
1792
1793        mutex_lock(&sensor->mutex);
1794
1795        if (fmt->pad == ssd->source_pad) {
1796                int rval;
1797
1798                rval = smiapp_set_format_source(subdev, cfg, fmt);
1799
1800                mutex_unlock(&sensor->mutex);
1801
1802                return rval;
1803        }
1804
1805        /* Sink pad. Width and height are changeable here. */
1806        fmt->format.code = __smiapp_get_mbus_code(subdev, fmt->pad);
1807        fmt->format.width &= ~1;
1808        fmt->format.height &= ~1;
1809        fmt->format.field = V4L2_FIELD_NONE;
1810
1811        fmt->format.width =
1812                clamp(fmt->format.width,
1813                      sensor->limits[SMIAPP_LIMIT_MIN_X_OUTPUT_SIZE],
1814                      sensor->limits[SMIAPP_LIMIT_MAX_X_OUTPUT_SIZE]);
1815        fmt->format.height =
1816                clamp(fmt->format.height,
1817                      sensor->limits[SMIAPP_LIMIT_MIN_Y_OUTPUT_SIZE],
1818                      sensor->limits[SMIAPP_LIMIT_MAX_Y_OUTPUT_SIZE]);
1819
1820        smiapp_get_crop_compose(subdev, cfg, crops, NULL, fmt->which);
1821
1822        crops[ssd->sink_pad]->left = 0;
1823        crops[ssd->sink_pad]->top = 0;
1824        crops[ssd->sink_pad]->width = fmt->format.width;
1825        crops[ssd->sink_pad]->height = fmt->format.height;
1826        if (fmt->which == V4L2_SUBDEV_FORMAT_ACTIVE)
1827                ssd->sink_fmt = *crops[ssd->sink_pad];
1828        smiapp_propagate(subdev, cfg, fmt->which,
1829                         V4L2_SEL_TGT_CROP);
1830
1831        mutex_unlock(&sensor->mutex);
1832
1833        return 0;
1834}
1835
1836/*
1837 * Calculate goodness of scaled image size compared to expected image
1838 * size and flags provided.
1839 */
1840#define SCALING_GOODNESS                100000
1841#define SCALING_GOODNESS_EXTREME        100000000
1842static int scaling_goodness(struct v4l2_subdev *subdev, int w, int ask_w,
1843                            int h, int ask_h, u32 flags)
1844{
1845        struct smiapp_sensor *sensor = to_smiapp_sensor(subdev);
1846        struct i2c_client *client = v4l2_get_subdevdata(subdev);
1847        int val = 0;
1848
1849        w &= ~1;
1850        ask_w &= ~1;
1851        h &= ~1;
1852        ask_h &= ~1;
1853
1854        if (flags & V4L2_SEL_FLAG_GE) {
1855                if (w < ask_w)
1856                        val -= SCALING_GOODNESS;
1857                if (h < ask_h)
1858                        val -= SCALING_GOODNESS;
1859        }
1860
1861        if (flags & V4L2_SEL_FLAG_LE) {
1862                if (w > ask_w)
1863                        val -= SCALING_GOODNESS;
1864                if (h > ask_h)
1865                        val -= SCALING_GOODNESS;
1866        }
1867
1868        val -= abs(w - ask_w);
1869        val -= abs(h - ask_h);
1870
1871        if (w < sensor->limits[SMIAPP_LIMIT_MIN_X_OUTPUT_SIZE])
1872                val -= SCALING_GOODNESS_EXTREME;
1873
1874        dev_dbg(&client->dev, "w %d ask_w %d h %d ask_h %d goodness %d\n",
1875                w, ask_h, h, ask_h, val);
1876
1877        return val;
1878}
1879
1880static void smiapp_set_compose_binner(struct v4l2_subdev *subdev,
1881                                      struct v4l2_subdev_pad_config *cfg,
1882                                      struct v4l2_subdev_selection *sel,
1883                                      struct v4l2_rect **crops,
1884                                      struct v4l2_rect *comp)
1885{
1886        struct smiapp_sensor *sensor = to_smiapp_sensor(subdev);
1887        unsigned int i;
1888        unsigned int binh = 1, binv = 1;
1889        int best = scaling_goodness(
1890                subdev,
1891                crops[SMIAPP_PAD_SINK]->width, sel->r.width,
1892                crops[SMIAPP_PAD_SINK]->height, sel->r.height, sel->flags);
1893
1894        for (i = 0; i < sensor->nbinning_subtypes; i++) {
1895                int this = scaling_goodness(
1896                        subdev,
1897                        crops[SMIAPP_PAD_SINK]->width
1898                        / sensor->binning_subtypes[i].horizontal,
1899                        sel->r.width,
1900                        crops[SMIAPP_PAD_SINK]->height
1901                        / sensor->binning_subtypes[i].vertical,
1902                        sel->r.height, sel->flags);
1903
1904                if (this > best) {
1905                        binh = sensor->binning_subtypes[i].horizontal;
1906                        binv = sensor->binning_subtypes[i].vertical;
1907                        best = this;
1908                }
1909        }
1910        if (sel->which == V4L2_SUBDEV_FORMAT_ACTIVE) {
1911                sensor->binning_vertical = binv;
1912                sensor->binning_horizontal = binh;
1913        }
1914
1915        sel->r.width = (crops[SMIAPP_PAD_SINK]->width / binh) & ~1;
1916        sel->r.height = (crops[SMIAPP_PAD_SINK]->height / binv) & ~1;
1917}
1918
1919/*
1920 * Calculate best scaling ratio and mode for given output resolution.
1921 *
1922 * Try all of these: horizontal ratio, vertical ratio and smallest
1923 * size possible (horizontally).
1924 *
1925 * Also try whether horizontal scaler or full scaler gives a better
1926 * result.
1927 */
1928static void smiapp_set_compose_scaler(struct v4l2_subdev *subdev,
1929                                      struct v4l2_subdev_pad_config *cfg,
1930                                      struct v4l2_subdev_selection *sel,
1931                                      struct v4l2_rect **crops,
1932                                      struct v4l2_rect *comp)
1933{
1934        struct i2c_client *client = v4l2_get_subdevdata(subdev);
1935        struct smiapp_sensor *sensor = to_smiapp_sensor(subdev);
1936        u32 min, max, a, b, max_m;
1937        u32 scale_m = sensor->limits[SMIAPP_LIMIT_SCALER_N_MIN];
1938        int mode = SMIAPP_SCALING_MODE_HORIZONTAL;
1939        u32 try[4];
1940        u32 ntry = 0;
1941        unsigned int i;
1942        int best = INT_MIN;
1943
1944        sel->r.width = min_t(unsigned int, sel->r.width,
1945                             crops[SMIAPP_PAD_SINK]->width);
1946        sel->r.height = min_t(unsigned int, sel->r.height,
1947                              crops[SMIAPP_PAD_SINK]->height);
1948
1949        a = crops[SMIAPP_PAD_SINK]->width
1950                * sensor->limits[SMIAPP_LIMIT_SCALER_N_MIN] / sel->r.width;
1951        b = crops[SMIAPP_PAD_SINK]->height
1952                * sensor->limits[SMIAPP_LIMIT_SCALER_N_MIN] / sel->r.height;
1953        max_m = crops[SMIAPP_PAD_SINK]->width
1954                * sensor->limits[SMIAPP_LIMIT_SCALER_N_MIN]
1955                / sensor->limits[SMIAPP_LIMIT_MIN_X_OUTPUT_SIZE];
1956
1957        a = clamp(a, sensor->limits[SMIAPP_LIMIT_SCALER_M_MIN],
1958                  sensor->limits[SMIAPP_LIMIT_SCALER_M_MAX]);
1959        b = clamp(b, sensor->limits[SMIAPP_LIMIT_SCALER_M_MIN],
1960                  sensor->limits[SMIAPP_LIMIT_SCALER_M_MAX]);
1961        max_m = clamp(max_m, sensor->limits[SMIAPP_LIMIT_SCALER_M_MIN],
1962                      sensor->limits[SMIAPP_LIMIT_SCALER_M_MAX]);
1963
1964        dev_dbg(&client->dev, "scaling: a %d b %d max_m %d\n", a, b, max_m);
1965
1966        min = min(max_m, min(a, b));
1967        max = min(max_m, max(a, b));
1968
1969        try[ntry] = min;
1970        ntry++;
1971        if (min != max) {
1972                try[ntry] = max;
1973                ntry++;
1974        }
1975        if (max != max_m) {
1976                try[ntry] = min + 1;
1977                ntry++;
1978                if (min != max) {
1979                        try[ntry] = max + 1;
1980                        ntry++;
1981                }
1982        }
1983
1984        for (i = 0; i < ntry; i++) {
1985                int this = scaling_goodness(
1986                        subdev,
1987                        crops[SMIAPP_PAD_SINK]->width
1988                        / try[i]
1989                        * sensor->limits[SMIAPP_LIMIT_SCALER_N_MIN],
1990                        sel->r.width,
1991                        crops[SMIAPP_PAD_SINK]->height,
1992                        sel->r.height,
1993                        sel->flags);
1994
1995                dev_dbg(&client->dev, "trying factor %d (%d)\n", try[i], i);
1996
1997                if (this > best) {
1998                        scale_m = try[i];
1999                        mode = SMIAPP_SCALING_MODE_HORIZONTAL;
2000                        best = this;
2001                }
2002
2003                if (sensor->limits[SMIAPP_LIMIT_SCALING_CAPABILITY]
2004                    == SMIAPP_SCALING_CAPABILITY_HORIZONTAL)
2005                        continue;
2006
2007                this = scaling_goodness(
2008                        subdev, crops[SMIAPP_PAD_SINK]->width
2009                        / try[i]
2010                        * sensor->limits[SMIAPP_LIMIT_SCALER_N_MIN],
2011                        sel->r.width,
2012                        crops[SMIAPP_PAD_SINK]->height
2013                        / try[i]
2014                        * sensor->limits[SMIAPP_LIMIT_SCALER_N_MIN],
2015                        sel->r.height,
2016                        sel->flags);
2017
2018                if (this > best) {
2019                        scale_m = try[i];
2020                        mode = SMIAPP_SCALING_MODE_BOTH;
2021                        best = this;
2022                }
2023        }
2024
2025        sel->r.width =
2026                (crops[SMIAPP_PAD_SINK]->width
2027                 / scale_m
2028                 * sensor->limits[SMIAPP_LIMIT_SCALER_N_MIN]) & ~1;
2029        if (mode == SMIAPP_SCALING_MODE_BOTH)
2030                sel->r.height =
2031                        (crops[SMIAPP_PAD_SINK]->height
2032                         / scale_m
2033                         * sensor->limits[SMIAPP_LIMIT_SCALER_N_MIN])
2034                        & ~1;
2035        else
2036                sel->r.height = crops[SMIAPP_PAD_SINK]->height;
2037
2038        if (sel->which == V4L2_SUBDEV_FORMAT_ACTIVE) {
2039                sensor->scale_m = scale_m;
2040                sensor->scaling_mode = mode;
2041        }
2042}
2043/* We're only called on source pads. This function sets scaling. */
2044static int smiapp_set_compose(struct v4l2_subdev *subdev,
2045                              struct v4l2_subdev_pad_config *cfg,
2046                              struct v4l2_subdev_selection *sel)
2047{
2048        struct smiapp_sensor *sensor = to_smiapp_sensor(subdev);
2049        struct smiapp_subdev *ssd = to_smiapp_subdev(subdev);
2050        struct v4l2_rect *comp, *crops[SMIAPP_PADS];
2051
2052        smiapp_get_crop_compose(subdev, cfg, crops, &comp, sel->which);
2053
2054        sel->r.top = 0;
2055        sel->r.left = 0;
2056
2057        if (ssd == sensor->binner)
2058                smiapp_set_compose_binner(subdev, cfg, sel, crops, comp);
2059        else
2060                smiapp_set_compose_scaler(subdev, cfg, sel, crops, comp);
2061
2062        *comp = sel->r;
2063        smiapp_propagate(subdev, cfg, sel->which,
2064                         V4L2_SEL_TGT_COMPOSE);
2065
2066        if (sel->which == V4L2_SUBDEV_FORMAT_ACTIVE)
2067                return smiapp_update_mode(sensor);
2068
2069        return 0;
2070}
2071
2072static int __smiapp_sel_supported(struct v4l2_subdev *subdev,
2073                                  struct v4l2_subdev_selection *sel)
2074{
2075        struct smiapp_sensor *sensor = to_smiapp_sensor(subdev);
2076        struct smiapp_subdev *ssd = to_smiapp_subdev(subdev);
2077
2078        /* We only implement crop in three places. */
2079        switch (sel->target) {
2080        case V4L2_SEL_TGT_CROP:
2081        case V4L2_SEL_TGT_CROP_BOUNDS:
2082                if (ssd == sensor->pixel_array
2083                    && sel->pad == SMIAPP_PA_PAD_SRC)
2084                        return 0;
2085                if (ssd == sensor->src
2086                    && sel->pad == SMIAPP_PAD_SRC)
2087                        return 0;
2088                if (ssd == sensor->scaler
2089                    && sel->pad == SMIAPP_PAD_SINK
2090                    && sensor->limits[SMIAPP_LIMIT_DIGITAL_CROP_CAPABILITY]
2091                    == SMIAPP_DIGITAL_CROP_CAPABILITY_INPUT_CROP)
2092                        return 0;
2093                return -EINVAL;
2094        case V4L2_SEL_TGT_NATIVE_SIZE:
2095                if (ssd == sensor->pixel_array
2096                    && sel->pad == SMIAPP_PA_PAD_SRC)
2097                        return 0;
2098                return -EINVAL;
2099        case V4L2_SEL_TGT_COMPOSE:
2100        case V4L2_SEL_TGT_COMPOSE_BOUNDS:
2101                if (sel->pad == ssd->source_pad)
2102                        return -EINVAL;
2103                if (ssd == sensor->binner)
2104                        return 0;
2105                if (ssd == sensor->scaler
2106                    && sensor->limits[SMIAPP_LIMIT_SCALING_CAPABILITY]
2107                    != SMIAPP_SCALING_CAPABILITY_NONE)
2108                        return 0;
2109                /* Fall through */
2110        default:
2111                return -EINVAL;
2112        }
2113}
2114
2115static int smiapp_set_crop(struct v4l2_subdev *subdev,
2116                           struct v4l2_subdev_pad_config *cfg,
2117                           struct v4l2_subdev_selection *sel)
2118{
2119        struct smiapp_sensor *sensor = to_smiapp_sensor(subdev);
2120        struct smiapp_subdev *ssd = to_smiapp_subdev(subdev);
2121        struct v4l2_rect *src_size, *crops[SMIAPP_PADS];
2122        struct v4l2_rect _r;
2123
2124        smiapp_get_crop_compose(subdev, cfg, crops, NULL, sel->which);
2125
2126        if (sel->which == V4L2_SUBDEV_FORMAT_ACTIVE) {
2127                if (sel->pad == ssd->sink_pad)
2128                        src_size = &ssd->sink_fmt;
2129                else
2130                        src_size = &ssd->compose;
2131        } else {
2132                if (sel->pad == ssd->sink_pad) {
2133                        _r.left = 0;
2134                        _r.top = 0;
2135                        _r.width = v4l2_subdev_get_try_format(subdev, cfg, sel->pad)
2136                                ->width;
2137                        _r.height = v4l2_subdev_get_try_format(subdev, cfg, sel->pad)
2138                                ->height;
2139                        src_size = &_r;
2140                } else {
2141                        src_size =
2142                                v4l2_subdev_get_try_compose(
2143                                        subdev, cfg, ssd->sink_pad);
2144                }
2145        }
2146
2147        if (ssd == sensor->src && sel->pad == SMIAPP_PAD_SRC) {
2148                sel->r.left = 0;
2149                sel->r.top = 0;
2150        }
2151
2152        sel->r.width = min(sel->r.width, src_size->width);
2153        sel->r.height = min(sel->r.height, src_size->height);
2154
2155        sel->r.left = min_t(int, sel->r.left, src_size->width - sel->r.width);
2156        sel->r.top = min_t(int, sel->r.top, src_size->height - sel->r.height);
2157
2158        *crops[sel->pad] = sel->r;
2159
2160        if (ssd != sensor->pixel_array && sel->pad == SMIAPP_PAD_SINK)
2161                smiapp_propagate(subdev, cfg, sel->which,
2162                                 V4L2_SEL_TGT_CROP);
2163
2164        return 0;
2165}
2166
2167static int __smiapp_get_selection(struct v4l2_subdev *subdev,
2168                                  struct v4l2_subdev_pad_config *cfg,
2169                                  struct v4l2_subdev_selection *sel)
2170{
2171        struct smiapp_sensor *sensor = to_smiapp_sensor(subdev);
2172        struct smiapp_subdev *ssd = to_smiapp_subdev(subdev);
2173        struct v4l2_rect *comp, *crops[SMIAPP_PADS];
2174        struct v4l2_rect sink_fmt;
2175        int ret;
2176
2177        ret = __smiapp_sel_supported(subdev, sel);
2178        if (ret)
2179                return ret;
2180
2181        smiapp_get_crop_compose(subdev, cfg, crops, &comp, sel->which);
2182
2183        if (sel->which == V4L2_SUBDEV_FORMAT_ACTIVE) {
2184                sink_fmt = ssd->sink_fmt;
2185        } else {
2186                struct v4l2_mbus_framefmt *fmt =
2187                        v4l2_subdev_get_try_format(subdev, cfg, ssd->sink_pad);
2188
2189                sink_fmt.left = 0;
2190                sink_fmt.top = 0;
2191                sink_fmt.width = fmt->width;
2192                sink_fmt.height = fmt->height;
2193        }
2194
2195        switch (sel->target) {
2196        case V4L2_SEL_TGT_CROP_BOUNDS:
2197        case V4L2_SEL_TGT_NATIVE_SIZE:
2198                if (ssd == sensor->pixel_array) {
2199                        sel->r.left = sel->r.top = 0;
2200                        sel->r.width =
2201                                sensor->limits[SMIAPP_LIMIT_X_ADDR_MAX] + 1;
2202                        sel->r.height =
2203                                sensor->limits[SMIAPP_LIMIT_Y_ADDR_MAX] + 1;
2204                } else if (sel->pad == ssd->sink_pad) {
2205                        sel->r = sink_fmt;
2206                } else {
2207                        sel->r = *comp;
2208                }
2209                break;
2210        case V4L2_SEL_TGT_CROP:
2211        case V4L2_SEL_TGT_COMPOSE_BOUNDS:
2212                sel->r = *crops[sel->pad];
2213                break;
2214        case V4L2_SEL_TGT_COMPOSE:
2215                sel->r = *comp;
2216                break;
2217        }
2218
2219        return 0;
2220}
2221
2222static int smiapp_get_selection(struct v4l2_subdev *subdev,
2223                                struct v4l2_subdev_pad_config *cfg,
2224                                struct v4l2_subdev_selection *sel)
2225{
2226        struct smiapp_sensor *sensor = to_smiapp_sensor(subdev);
2227        int rval;
2228
2229        mutex_lock(&sensor->mutex);
2230        rval = __smiapp_get_selection(subdev, cfg, sel);
2231        mutex_unlock(&sensor->mutex);
2232
2233        return rval;
2234}
2235static int smiapp_set_selection(struct v4l2_subdev *subdev,
2236                                struct v4l2_subdev_pad_config *cfg,
2237                                struct v4l2_subdev_selection *sel)
2238{
2239        struct smiapp_sensor *sensor = to_smiapp_sensor(subdev);
2240        int ret;
2241
2242        ret = __smiapp_sel_supported(subdev, sel);
2243        if (ret)
2244                return ret;
2245
2246        mutex_lock(&sensor->mutex);
2247
2248        sel->r.left = max(0, sel->r.left & ~1);
2249        sel->r.top = max(0, sel->r.top & ~1);
2250        sel->r.width = SMIAPP_ALIGN_DIM(sel->r.width, sel->flags);
2251        sel->r.height = SMIAPP_ALIGN_DIM(sel->r.height, sel->flags);
2252
2253        sel->r.width = max_t(unsigned int,
2254                             sensor->limits[SMIAPP_LIMIT_MIN_X_OUTPUT_SIZE],
2255                             sel->r.width);
2256        sel->r.height = max_t(unsigned int,
2257                              sensor->limits[SMIAPP_LIMIT_MIN_Y_OUTPUT_SIZE],
2258                              sel->r.height);
2259
2260        switch (sel->target) {
2261        case V4L2_SEL_TGT_CROP:
2262                ret = smiapp_set_crop(subdev, cfg, sel);
2263                break;
2264        case V4L2_SEL_TGT_COMPOSE:
2265                ret = smiapp_set_compose(subdev, cfg, sel);
2266                break;
2267        default:
2268                ret = -EINVAL;
2269        }
2270
2271        mutex_unlock(&sensor->mutex);
2272        return ret;
2273}
2274
2275static int smiapp_get_skip_frames(struct v4l2_subdev *subdev, u32 *frames)
2276{
2277        struct smiapp_sensor *sensor = to_smiapp_sensor(subdev);
2278
2279        *frames = sensor->frame_skip;
2280        return 0;
2281}
2282
2283/* -----------------------------------------------------------------------------
2284 * sysfs attributes
2285 */
2286
2287static ssize_t
2288smiapp_sysfs_nvm_read(struct device *dev, struct device_attribute *attr,
2289                      char *buf)
2290{
2291        struct v4l2_subdev *subdev = i2c_get_clientdata(to_i2c_client(dev));
2292        struct i2c_client *client = v4l2_get_subdevdata(subdev);
2293        struct smiapp_sensor *sensor = to_smiapp_sensor(subdev);
2294        unsigned int nbytes;
2295
2296        if (!sensor->dev_init_done)
2297                return -EBUSY;
2298
2299        if (!sensor->nvm_size) {
2300                /* NVM not read yet - read it now */
2301                sensor->nvm_size = sensor->platform_data->nvm_size;
2302                if (smiapp_set_power(subdev, 1) < 0)
2303                        return -ENODEV;
2304                if (smiapp_read_nvm(sensor, sensor->nvm)) {
2305                        dev_err(&client->dev, "nvm read failed\n");
2306                        return -ENODEV;
2307                }
2308                smiapp_set_power(subdev, 0);
2309        }
2310        /*
2311         * NVM is still way below a PAGE_SIZE, so we can safely
2312         * assume this for now.
2313         */
2314        nbytes = min_t(unsigned int, sensor->nvm_size, PAGE_SIZE);
2315        memcpy(buf, sensor->nvm, nbytes);
2316
2317        return nbytes;
2318}
2319static DEVICE_ATTR(nvm, S_IRUGO, smiapp_sysfs_nvm_read, NULL);
2320
2321static ssize_t
2322smiapp_sysfs_ident_read(struct device *dev, struct device_attribute *attr,
2323                        char *buf)
2324{
2325        struct v4l2_subdev *subdev = i2c_get_clientdata(to_i2c_client(dev));
2326        struct smiapp_sensor *sensor = to_smiapp_sensor(subdev);
2327        struct smiapp_module_info *minfo = &sensor->minfo;
2328
2329        return snprintf(buf, PAGE_SIZE, "%2.2x%4.4x%2.2x\n",
2330                        minfo->manufacturer_id, minfo->model_id,
2331                        minfo->revision_number_major) + 1;
2332}
2333
2334static DEVICE_ATTR(ident, S_IRUGO, smiapp_sysfs_ident_read, NULL);
2335
2336/* -----------------------------------------------------------------------------
2337 * V4L2 subdev core operations
2338 */
2339
2340static int smiapp_identify_module(struct smiapp_sensor *sensor)
2341{
2342        struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd);
2343        struct smiapp_module_info *minfo = &sensor->minfo;
2344        unsigned int i;
2345        int rval = 0;
2346
2347        minfo->name = SMIAPP_NAME;
2348
2349        /* Module info */
2350        rval = smiapp_read_8only(sensor, SMIAPP_REG_U8_MANUFACTURER_ID,
2351                                 &minfo->manufacturer_id);
2352        if (!rval)
2353                rval = smiapp_read_8only(sensor, SMIAPP_REG_U16_MODEL_ID,
2354                                         &minfo->model_id);
2355        if (!rval)
2356                rval = smiapp_read_8only(sensor,
2357                                         SMIAPP_REG_U8_REVISION_NUMBER_MAJOR,
2358                                         &minfo->revision_number_major);
2359        if (!rval)
2360                rval = smiapp_read_8only(sensor,
2361                                         SMIAPP_REG_U8_REVISION_NUMBER_MINOR,
2362                                         &minfo->revision_number_minor);
2363        if (!rval)
2364                rval = smiapp_read_8only(sensor,
2365                                         SMIAPP_REG_U8_MODULE_DATE_YEAR,
2366                                         &minfo->module_year);
2367        if (!rval)
2368                rval = smiapp_read_8only(sensor,
2369                                         SMIAPP_REG_U8_MODULE_DATE_MONTH,
2370                                         &minfo->module_month);
2371        if (!rval)
2372                rval = smiapp_read_8only(sensor, SMIAPP_REG_U8_MODULE_DATE_DAY,
2373                                         &minfo->module_day);
2374
2375        /* Sensor info */
2376        if (!rval)
2377                rval = smiapp_read_8only(sensor,
2378                                         SMIAPP_REG_U8_SENSOR_MANUFACTURER_ID,
2379                                         &minfo->sensor_manufacturer_id);
2380        if (!rval)
2381                rval = smiapp_read_8only(sensor,
2382                                         SMIAPP_REG_U16_SENSOR_MODEL_ID,
2383                                         &minfo->sensor_model_id);
2384        if (!rval)
2385                rval = smiapp_read_8only(sensor,
2386                                         SMIAPP_REG_U8_SENSOR_REVISION_NUMBER,
2387                                         &minfo->sensor_revision_number);
2388        if (!rval)
2389                rval = smiapp_read_8only(sensor,
2390                                         SMIAPP_REG_U8_SENSOR_FIRMWARE_VERSION,
2391                                         &minfo->sensor_firmware_version);
2392
2393        /* SMIA */
2394        if (!rval)
2395                rval = smiapp_read_8only(sensor, SMIAPP_REG_U8_SMIA_VERSION,
2396                                         &minfo->smia_version);
2397        if (!rval)
2398                rval = smiapp_read_8only(sensor, SMIAPP_REG_U8_SMIAPP_VERSION,
2399                                         &minfo->smiapp_version);
2400
2401        if (rval) {
2402                dev_err(&client->dev, "sensor detection failed\n");
2403                return -ENODEV;
2404        }
2405
2406        dev_dbg(&client->dev, "module 0x%2.2x-0x%4.4x\n",
2407                minfo->manufacturer_id, minfo->model_id);
2408
2409        dev_dbg(&client->dev,
2410                "module revision 0x%2.2x-0x%2.2x date %2.2d-%2.2d-%2.2d\n",
2411                minfo->revision_number_major, minfo->revision_number_minor,
2412                minfo->module_year, minfo->module_month, minfo->module_day);
2413
2414        dev_dbg(&client->dev, "sensor 0x%2.2x-0x%4.4x\n",
2415                minfo->sensor_manufacturer_id, minfo->sensor_model_id);
2416
2417        dev_dbg(&client->dev,
2418                "sensor revision 0x%2.2x firmware version 0x%2.2x\n",
2419                minfo->sensor_revision_number, minfo->sensor_firmware_version);
2420
2421        dev_dbg(&client->dev, "smia version %2.2d smiapp version %2.2d\n",
2422                minfo->smia_version, minfo->smiapp_version);
2423
2424        /*
2425         * Some modules have bad data in the lvalues below. Hope the
2426         * rvalues have better stuff. The lvalues are module
2427         * parameters whereas the rvalues are sensor parameters.
2428         */
2429        if (!minfo->manufacturer_id && !minfo->model_id) {
2430                minfo->manufacturer_id = minfo->sensor_manufacturer_id;
2431                minfo->model_id = minfo->sensor_model_id;
2432                minfo->revision_number_major = minfo->sensor_revision_number;
2433        }
2434
2435        for (i = 0; i < ARRAY_SIZE(smiapp_module_idents); i++) {
2436                if (smiapp_module_idents[i].manufacturer_id
2437                    != minfo->manufacturer_id)
2438                        continue;
2439                if (smiapp_module_idents[i].model_id != minfo->model_id)
2440                        continue;
2441                if (smiapp_module_idents[i].flags
2442                    & SMIAPP_MODULE_IDENT_FLAG_REV_LE) {
2443                        if (smiapp_module_idents[i].revision_number_major
2444                            < minfo->revision_number_major)
2445                                continue;
2446                } else {
2447                        if (smiapp_module_idents[i].revision_number_major
2448                            != minfo->revision_number_major)
2449                                continue;
2450                }
2451
2452                minfo->name = smiapp_module_idents[i].name;
2453                minfo->quirk = smiapp_module_idents[i].quirk;
2454                break;
2455        }
2456
2457        if (i >= ARRAY_SIZE(smiapp_module_idents))
2458                dev_warn(&client->dev,
2459                         "no quirks for this module; let's hope it's fully compliant\n");
2460
2461        dev_dbg(&client->dev, "the sensor is called %s, ident %2.2x%4.4x%2.2x\n",
2462                minfo->name, minfo->manufacturer_id, minfo->model_id,
2463                minfo->revision_number_major);
2464
2465        return 0;
2466}
2467
2468static const struct v4l2_subdev_ops smiapp_ops;
2469static const struct v4l2_subdev_internal_ops smiapp_internal_ops;
2470static const struct media_entity_operations smiapp_entity_ops;
2471
2472static int smiapp_register_subdevs(struct smiapp_sensor *sensor)
2473{
2474        struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd);
2475        struct smiapp_subdev *ssds[] = {
2476                sensor->scaler,
2477                sensor->binner,
2478                sensor->pixel_array,
2479        };
2480        unsigned int i;
2481        int rval;
2482
2483        for (i = 0; i < SMIAPP_SUBDEVS - 1; i++) {
2484                struct smiapp_subdev *this = ssds[i + 1];
2485                struct smiapp_subdev *last = ssds[i];
2486
2487                if (!last)
2488                        continue;
2489
2490                rval = media_entity_init(&this->sd.entity,
2491                                         this->npads, this->pads, 0);
2492                if (rval) {
2493                        dev_err(&client->dev,
2494                                "media_entity_init failed\n");
2495                        return rval;
2496                }
2497
2498                rval = media_entity_create_link(&this->sd.entity,
2499                                                this->source_pad,
2500                                                &last->sd.entity,
2501                                                last->sink_pad,
2502                                                MEDIA_LNK_FL_ENABLED |
2503                                                MEDIA_LNK_FL_IMMUTABLE);
2504                if (rval) {
2505                        dev_err(&client->dev,
2506                                "media_entity_create_link failed\n");
2507                        return rval;
2508                }
2509
2510                rval = v4l2_device_register_subdev(sensor->src->sd.v4l2_dev,
2511                                                   &this->sd);
2512                if (rval) {
2513                        dev_err(&client->dev,
2514                                "v4l2_device_register_subdev failed\n");
2515                        return rval;
2516                }
2517        }
2518
2519        return 0;
2520}
2521
2522static void smiapp_cleanup(struct smiapp_sensor *sensor)
2523{
2524        struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd);
2525
2526        device_remove_file(&client->dev, &dev_attr_nvm);
2527        device_remove_file(&client->dev, &dev_attr_ident);
2528
2529        smiapp_free_controls(sensor);
2530}
2531
2532static int smiapp_init(struct smiapp_sensor *sensor)
2533{
2534        struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd);
2535        struct smiapp_pll *pll = &sensor->pll;
2536        struct smiapp_subdev *last = NULL;
2537        unsigned int i;
2538        int rval;
2539
2540        sensor->vana = devm_regulator_get(&client->dev, "vana");
2541        if (IS_ERR(sensor->vana)) {
2542                dev_err(&client->dev, "could not get regulator for vana\n");
2543                return PTR_ERR(sensor->vana);
2544        }
2545
2546        if (!sensor->platform_data->set_xclk) {
2547                sensor->ext_clk = devm_clk_get(&client->dev, NULL);
2548                if (IS_ERR(sensor->ext_clk)) {
2549                        dev_err(&client->dev, "could not get clock\n");
2550                        return PTR_ERR(sensor->ext_clk);
2551                }
2552
2553                rval = clk_set_rate(sensor->ext_clk,
2554                                    sensor->platform_data->ext_clk);
2555                if (rval < 0) {
2556                        dev_err(&client->dev,
2557                                "unable to set clock freq to %u\n",
2558                                sensor->platform_data->ext_clk);
2559                        return rval;
2560                }
2561        }
2562
2563        if (gpio_is_valid(sensor->platform_data->xshutdown)) {
2564                rval = devm_gpio_request_one(
2565                        &client->dev, sensor->platform_data->xshutdown, 0,
2566                        "SMIA++ xshutdown");
2567                if (rval < 0) {
2568                        dev_err(&client->dev,
2569                                "unable to acquire reset gpio %d\n",
2570                                sensor->platform_data->xshutdown);
2571                        return rval;
2572                }
2573        }
2574
2575        rval = smiapp_power_on(sensor);
2576        if (rval)
2577                return -ENODEV;
2578
2579        rval = smiapp_identify_module(sensor);
2580        if (rval) {
2581                rval = -ENODEV;
2582                goto out_power_off;
2583        }
2584
2585        rval = smiapp_get_all_limits(sensor);
2586        if (rval) {
2587                rval = -ENODEV;
2588                goto out_power_off;
2589        }
2590
2591        /*
2592         * Handle Sensor Module orientation on the board.
2593         *
2594         * The application of H-FLIP and V-FLIP on the sensor is modified by
2595         * the sensor orientation on the board.
2596         *
2597         * For SMIAPP_BOARD_SENSOR_ORIENT_180 the default behaviour is to set
2598         * both H-FLIP and V-FLIP for normal operation which also implies
2599         * that a set/unset operation for user space HFLIP and VFLIP v4l2
2600         * controls will need to be internally inverted.
2601         *
2602         * Rotation also changes the bayer pattern.
2603         */
2604        if (sensor->platform_data->module_board_orient ==
2605            SMIAPP_MODULE_BOARD_ORIENT_180)
2606                sensor->hvflip_inv_mask = SMIAPP_IMAGE_ORIENTATION_HFLIP |
2607                                          SMIAPP_IMAGE_ORIENTATION_VFLIP;
2608
2609        rval = smiapp_call_quirk(sensor, limits);
2610        if (rval) {
2611                dev_err(&client->dev, "limits quirks failed\n");
2612                goto out_power_off;
2613        }
2614
2615        if (sensor->limits[SMIAPP_LIMIT_BINNING_CAPABILITY]) {
2616                u32 val;
2617
2618                rval = smiapp_read(sensor,
2619                                   SMIAPP_REG_U8_BINNING_SUBTYPES, &val);
2620                if (rval < 0) {
2621                        rval = -ENODEV;
2622                        goto out_power_off;
2623                }
2624                sensor->nbinning_subtypes = min_t(u8, val,
2625                                                  SMIAPP_BINNING_SUBTYPES);
2626
2627                for (i = 0; i < sensor->nbinning_subtypes; i++) {
2628                        rval = smiapp_read(
2629                                sensor, SMIAPP_REG_U8_BINNING_TYPE_n(i), &val);
2630                        if (rval < 0) {
2631                                rval = -ENODEV;
2632                                goto out_power_off;
2633                        }
2634                        sensor->binning_subtypes[i] =
2635                                *(struct smiapp_binning_subtype *)&val;
2636
2637                        dev_dbg(&client->dev, "binning %xx%x\n",
2638                                sensor->binning_subtypes[i].horizontal,
2639                                sensor->binning_subtypes[i].vertical);
2640                }
2641        }
2642        sensor->binning_horizontal = 1;
2643        sensor->binning_vertical = 1;
2644
2645        if (device_create_file(&client->dev, &dev_attr_ident) != 0) {
2646                dev_err(&client->dev, "sysfs ident entry creation failed\n");
2647                rval = -ENOENT;
2648                goto out_power_off;
2649        }
2650        /* SMIA++ NVM initialization - it will be read from the sensor
2651         * when it is first requested by userspace.
2652         */
2653        if (sensor->minfo.smiapp_version && sensor->platform_data->nvm_size) {
2654                sensor->nvm = devm_kzalloc(&client->dev,
2655                                sensor->platform_data->nvm_size, GFP_KERNEL);
2656                if (sensor->nvm == NULL) {
2657                        dev_err(&client->dev, "nvm buf allocation failed\n");
2658                        rval = -ENOMEM;
2659                        goto out_cleanup;
2660                }
2661
2662                if (device_create_file(&client->dev, &dev_attr_nvm) != 0) {
2663                        dev_err(&client->dev, "sysfs nvm entry failed\n");
2664                        rval = -EBUSY;
2665                        goto out_cleanup;
2666                }
2667        }
2668
2669        /* We consider this as profile 0 sensor if any of these are zero. */
2670        if (!sensor->limits[SMIAPP_LIMIT_MIN_OP_SYS_CLK_DIV] ||
2671            !sensor->limits[SMIAPP_LIMIT_MAX_OP_SYS_CLK_DIV] ||
2672            !sensor->limits[SMIAPP_LIMIT_MIN_OP_PIX_CLK_DIV] ||
2673            !sensor->limits[SMIAPP_LIMIT_MAX_OP_PIX_CLK_DIV]) {
2674                sensor->minfo.smiapp_profile = SMIAPP_PROFILE_0;
2675        } else if (sensor->limits[SMIAPP_LIMIT_SCALING_CAPABILITY]
2676                   != SMIAPP_SCALING_CAPABILITY_NONE) {
2677                if (sensor->limits[SMIAPP_LIMIT_SCALING_CAPABILITY]
2678                    == SMIAPP_SCALING_CAPABILITY_HORIZONTAL)
2679                        sensor->minfo.smiapp_profile = SMIAPP_PROFILE_1;
2680                else
2681                        sensor->minfo.smiapp_profile = SMIAPP_PROFILE_2;
2682                sensor->scaler = &sensor->ssds[sensor->ssds_used];
2683                sensor->ssds_used++;
2684        } else if (sensor->limits[SMIAPP_LIMIT_DIGITAL_CROP_CAPABILITY]
2685                   == SMIAPP_DIGITAL_CROP_CAPABILITY_INPUT_CROP) {
2686                sensor->scaler = &sensor->ssds[sensor->ssds_used];
2687                sensor->ssds_used++;
2688        }
2689        sensor->binner = &sensor->ssds[sensor->ssds_used];
2690        sensor->ssds_used++;
2691        sensor->pixel_array = &sensor->ssds[sensor->ssds_used];
2692        sensor->ssds_used++;
2693
2694        sensor->scale_m = sensor->limits[SMIAPP_LIMIT_SCALER_N_MIN];
2695
2696        /* prepare PLL configuration input values */
2697        pll->bus_type = SMIAPP_PLL_BUS_TYPE_CSI2;
2698        pll->csi2.lanes = sensor->platform_data->lanes;
2699        pll->ext_clk_freq_hz = sensor->platform_data->ext_clk;
2700        pll->scale_n = sensor->limits[SMIAPP_LIMIT_SCALER_N_MIN];
2701        /* Profile 0 sensors have no separate OP clock branch. */
2702        if (sensor->minfo.smiapp_profile == SMIAPP_PROFILE_0)
2703                pll->flags |= SMIAPP_PLL_FLAG_NO_OP_CLOCKS;
2704
2705        for (i = 0; i < SMIAPP_SUBDEVS; i++) {
2706                struct {
2707                        struct smiapp_subdev *ssd;
2708                        char *name;
2709                } const __this[] = {
2710                        { sensor->scaler, "scaler", },
2711                        { sensor->binner, "binner", },
2712                        { sensor->pixel_array, "pixel array", },
2713                }, *_this = &__this[i];
2714                struct smiapp_subdev *this = _this->ssd;
2715
2716                if (!this)
2717                        continue;
2718
2719                if (this != sensor->src)
2720                        v4l2_subdev_init(&this->sd, &smiapp_ops);
2721
2722                this->sensor = sensor;
2723
2724                if (this == sensor->pixel_array) {
2725                        this->npads = 1;
2726                } else {
2727                        this->npads = 2;
2728                        this->source_pad = 1;
2729                }
2730
2731                snprintf(this->sd.name,
2732                         sizeof(this->sd.name), "%s %s %d-%4.4x",
2733                         sensor->minfo.name, _this->name,
2734                         i2c_adapter_id(client->adapter), client->addr);
2735
2736                this->sink_fmt.width =
2737                        sensor->limits[SMIAPP_LIMIT_X_ADDR_MAX] + 1;
2738                this->sink_fmt.height =
2739                        sensor->limits[SMIAPP_LIMIT_Y_ADDR_MAX] + 1;
2740                this->compose.width = this->sink_fmt.width;
2741                this->compose.height = this->sink_fmt.height;
2742                this->crop[this->source_pad] = this->compose;
2743                this->pads[this->source_pad].flags = MEDIA_PAD_FL_SOURCE;
2744                if (this != sensor->pixel_array) {
2745                        this->crop[this->sink_pad] = this->compose;
2746                        this->pads[this->sink_pad].flags = MEDIA_PAD_FL_SINK;
2747                }
2748
2749                this->sd.entity.ops = &smiapp_entity_ops;
2750
2751                if (last == NULL) {
2752                        last = this;
2753                        continue;
2754                }
2755
2756                this->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
2757                this->sd.internal_ops = &smiapp_internal_ops;
2758                this->sd.owner = THIS_MODULE;
2759                v4l2_set_subdevdata(&this->sd, client);
2760
2761                last = this;
2762        }
2763
2764        dev_dbg(&client->dev, "profile %d\n", sensor->minfo.smiapp_profile);
2765
2766        sensor->pixel_array->sd.entity.type = MEDIA_ENT_T_V4L2_SUBDEV_SENSOR;
2767
2768        /* final steps */
2769        smiapp_read_frame_fmt(sensor);
2770        rval = smiapp_init_controls(sensor);
2771        if (rval < 0)
2772                goto out_cleanup;
2773
2774        rval = smiapp_call_quirk(sensor, init);
2775        if (rval)
2776                goto out_cleanup;
2777
2778        rval = smiapp_get_mbus_formats(sensor);
2779        if (rval) {
2780                rval = -ENODEV;
2781                goto out_cleanup;
2782        }
2783
2784        rval = smiapp_init_late_controls(sensor);
2785        if (rval) {
2786                rval = -ENODEV;
2787                goto out_cleanup;
2788        }
2789
2790        mutex_lock(&sensor->mutex);
2791        rval = smiapp_update_mode(sensor);
2792        mutex_unlock(&sensor->mutex);
2793        if (rval) {
2794                dev_err(&client->dev, "update mode failed\n");
2795                goto out_cleanup;
2796        }
2797
2798        sensor->streaming = false;
2799        sensor->dev_init_done = true;
2800
2801        smiapp_power_off(sensor);
2802
2803        return 0;
2804
2805out_cleanup:
2806        smiapp_cleanup(sensor);
2807
2808out_power_off:
2809        smiapp_power_off(sensor);
2810        return rval;
2811}
2812
2813static int smiapp_registered(struct v4l2_subdev *subdev)
2814{
2815        struct smiapp_sensor *sensor = to_smiapp_sensor(subdev);
2816        struct i2c_client *client = v4l2_get_subdevdata(subdev);
2817        int rval;
2818
2819        if (!client->dev.of_node) {
2820                rval = smiapp_init(sensor);
2821                if (rval)
2822                        return rval;
2823        }
2824
2825        rval = smiapp_register_subdevs(sensor);
2826        if (rval)
2827                smiapp_cleanup(sensor);
2828
2829        return rval;
2830}
2831
2832static int smiapp_open(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh)
2833{
2834        struct smiapp_subdev *ssd = to_smiapp_subdev(sd);
2835        struct smiapp_sensor *sensor = ssd->sensor;
2836        u32 mbus_code =
2837                smiapp_csi_data_formats[smiapp_pixel_order(sensor)].code;
2838        unsigned int i;
2839
2840        mutex_lock(&sensor->mutex);
2841
2842        for (i = 0; i < ssd->npads; i++) {
2843                struct v4l2_mbus_framefmt *try_fmt =
2844                        v4l2_subdev_get_try_format(sd, fh->pad, i);
2845                struct v4l2_rect *try_crop = v4l2_subdev_get_try_crop(sd, fh->pad, i);
2846                struct v4l2_rect *try_comp;
2847
2848                try_fmt->width = sensor->limits[SMIAPP_LIMIT_X_ADDR_MAX] + 1;
2849                try_fmt->height = sensor->limits[SMIAPP_LIMIT_Y_ADDR_MAX] + 1;
2850                try_fmt->code = mbus_code;
2851                try_fmt->field = V4L2_FIELD_NONE;
2852
2853                try_crop->top = 0;
2854                try_crop->left = 0;
2855                try_crop->width = try_fmt->width;
2856                try_crop->height = try_fmt->height;
2857
2858                if (ssd != sensor->pixel_array)
2859                        continue;
2860
2861                try_comp = v4l2_subdev_get_try_compose(sd, fh->pad, i);
2862                *try_comp = *try_crop;
2863        }
2864
2865        mutex_unlock(&sensor->mutex);
2866
2867        return smiapp_set_power(sd, 1);
2868}
2869
2870static int smiapp_close(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh)
2871{
2872        return smiapp_set_power(sd, 0);
2873}
2874
2875static const struct v4l2_subdev_video_ops smiapp_video_ops = {
2876        .s_stream = smiapp_set_stream,
2877};
2878
2879static const struct v4l2_subdev_core_ops smiapp_core_ops = {
2880        .s_power = smiapp_set_power,
2881};
2882
2883static const struct v4l2_subdev_pad_ops smiapp_pad_ops = {
2884        .enum_mbus_code = smiapp_enum_mbus_code,
2885        .get_fmt = smiapp_get_format,
2886        .set_fmt = smiapp_set_format,
2887        .get_selection = smiapp_get_selection,
2888        .set_selection = smiapp_set_selection,
2889};
2890
2891static const struct v4l2_subdev_sensor_ops smiapp_sensor_ops = {
2892        .g_skip_frames = smiapp_get_skip_frames,
2893};
2894
2895static const struct v4l2_subdev_ops smiapp_ops = {
2896        .core = &smiapp_core_ops,
2897        .video = &smiapp_video_ops,
2898        .pad = &smiapp_pad_ops,
2899        .sensor = &smiapp_sensor_ops,
2900};
2901
2902static const struct media_entity_operations smiapp_entity_ops = {
2903        .link_validate = v4l2_subdev_link_validate,
2904};
2905
2906static const struct v4l2_subdev_internal_ops smiapp_internal_src_ops = {
2907        .registered = smiapp_registered,
2908        .open = smiapp_open,
2909        .close = smiapp_close,
2910};
2911
2912static const struct v4l2_subdev_internal_ops smiapp_internal_ops = {
2913        .open = smiapp_open,
2914        .close = smiapp_close,
2915};
2916
2917/* -----------------------------------------------------------------------------
2918 * I2C Driver
2919 */
2920
2921#ifdef CONFIG_PM
2922
2923static int smiapp_suspend(struct device *dev)
2924{
2925        struct i2c_client *client = to_i2c_client(dev);
2926        struct v4l2_subdev *subdev = i2c_get_clientdata(client);
2927        struct smiapp_sensor *sensor = to_smiapp_sensor(subdev);
2928        bool streaming;
2929
2930        BUG_ON(mutex_is_locked(&sensor->mutex));
2931
2932        if (sensor->power_count == 0)
2933                return 0;
2934
2935        if (sensor->streaming)
2936                smiapp_stop_streaming(sensor);
2937
2938        streaming = sensor->streaming;
2939
2940        smiapp_power_off(sensor);
2941
2942        /* save state for resume */
2943        sensor->streaming = streaming;
2944
2945        return 0;
2946}
2947
2948static int smiapp_resume(struct device *dev)
2949{
2950        struct i2c_client *client = to_i2c_client(dev);
2951        struct v4l2_subdev *subdev = i2c_get_clientdata(client);
2952        struct smiapp_sensor *sensor = to_smiapp_sensor(subdev);
2953        int rval;
2954
2955        if (sensor->power_count == 0)
2956                return 0;
2957
2958        rval = smiapp_power_on(sensor);
2959        if (rval)
2960                return rval;
2961
2962        if (sensor->streaming)
2963                rval = smiapp_start_streaming(sensor);
2964
2965        return rval;
2966}
2967
2968#else
2969
2970#define smiapp_suspend  NULL
2971#define smiapp_resume   NULL
2972
2973#endif /* CONFIG_PM */
2974
2975static struct smiapp_platform_data *smiapp_get_pdata(struct device *dev)
2976{
2977        struct smiapp_platform_data *pdata;
2978        struct v4l2_of_endpoint *bus_cfg;
2979        struct device_node *ep;
2980        int i;
2981        int rval;
2982
2983        if (!dev->of_node)
2984                return dev->platform_data;
2985
2986        ep = of_graph_get_next_endpoint(dev->of_node, NULL);
2987        if (!ep)
2988                return NULL;
2989
2990        bus_cfg = v4l2_of_alloc_parse_endpoint(ep);
2991        if (IS_ERR(bus_cfg))
2992                goto out_err;
2993
2994        pdata = devm_kzalloc(dev, sizeof(*pdata), GFP_KERNEL);
2995        if (!pdata)
2996                goto out_err;
2997
2998        switch (bus_cfg->bus_type) {
2999        case V4L2_MBUS_CSI2:
3000                pdata->csi_signalling_mode = SMIAPP_CSI_SIGNALLING_MODE_CSI2;
3001                break;
3002                /* FIXME: add CCP2 support. */
3003        default:
3004                goto out_err;
3005        }
3006
3007        pdata->lanes = bus_cfg->bus.mipi_csi2.num_data_lanes;
3008        dev_dbg(dev, "lanes %u\n", pdata->lanes);
3009
3010        /* xshutdown GPIO is optional */
3011        pdata->xshutdown = of_get_named_gpio(dev->of_node, "reset-gpios", 0);
3012
3013        /* NVM size is not mandatory */
3014        of_property_read_u32(dev->of_node, "nokia,nvm-size",
3015                                    &pdata->nvm_size);
3016
3017        rval = of_property_read_u32(dev->of_node, "clock-frequency",
3018                                    &pdata->ext_clk);
3019        if (rval) {
3020                dev_warn(dev, "can't get clock-frequency\n");
3021                goto out_err;
3022        }
3023
3024        dev_dbg(dev, "reset %d, nvm %d, clk %d, csi %d\n", pdata->xshutdown,
3025                pdata->nvm_size, pdata->ext_clk, pdata->csi_signalling_mode);
3026
3027        if (!bus_cfg->nr_of_link_frequencies) {
3028                dev_warn(dev, "no link frequencies defined\n");
3029                goto out_err;
3030        }
3031
3032        pdata->op_sys_clock = devm_kcalloc(
3033                dev, bus_cfg->nr_of_link_frequencies + 1 /* guardian */,
3034                sizeof(*pdata->op_sys_clock), GFP_KERNEL);
3035        if (!pdata->op_sys_clock) {
3036                rval = -ENOMEM;
3037                goto out_err;
3038        }
3039
3040        for (i = 0; i < bus_cfg->nr_of_link_frequencies; i++) {
3041                pdata->op_sys_clock[i] = bus_cfg->link_frequencies[i];
3042                dev_dbg(dev, "freq %d: %lld\n", i, pdata->op_sys_clock[i]);
3043        }
3044
3045        v4l2_of_free_endpoint(bus_cfg);
3046        of_node_put(ep);
3047        return pdata;
3048
3049out_err:
3050        v4l2_of_free_endpoint(bus_cfg);
3051        of_node_put(ep);
3052        return NULL;
3053}
3054
3055static int smiapp_probe(struct i2c_client *client,
3056                        const struct i2c_device_id *devid)
3057{
3058        struct smiapp_sensor *sensor;
3059        struct smiapp_platform_data *pdata = smiapp_get_pdata(&client->dev);
3060        int rval;
3061
3062        if (pdata == NULL)
3063                return -ENODEV;
3064
3065        sensor = devm_kzalloc(&client->dev, sizeof(*sensor), GFP_KERNEL);
3066        if (sensor == NULL)
3067                return -ENOMEM;
3068
3069        sensor->platform_data = pdata;
3070        mutex_init(&sensor->mutex);
3071        mutex_init(&sensor->power_mutex);
3072        sensor->src = &sensor->ssds[sensor->ssds_used];
3073
3074        v4l2_i2c_subdev_init(&sensor->src->sd, client, &smiapp_ops);
3075        sensor->src->sd.internal_ops = &smiapp_internal_src_ops;
3076        sensor->src->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
3077        sensor->src->sensor = sensor;
3078
3079        sensor->src->pads[0].flags = MEDIA_PAD_FL_SOURCE;
3080        rval = media_entity_init(&sensor->src->sd.entity, 2,
3081                                 sensor->src->pads, 0);
3082        if (rval < 0)
3083                return rval;
3084
3085        if (client->dev.of_node) {
3086                rval = smiapp_init(sensor);
3087                if (rval)
3088                        goto out_media_entity_cleanup;
3089        }
3090
3091        rval = v4l2_async_register_subdev(&sensor->src->sd);
3092        if (rval < 0)
3093                goto out_media_entity_cleanup;
3094
3095        return 0;
3096
3097out_media_entity_cleanup:
3098        media_entity_cleanup(&sensor->src->sd.entity);
3099
3100        return rval;
3101}
3102
3103static int smiapp_remove(struct i2c_client *client)
3104{
3105        struct v4l2_subdev *subdev = i2c_get_clientdata(client);
3106        struct smiapp_sensor *sensor = to_smiapp_sensor(subdev);
3107        unsigned int i;
3108
3109        v4l2_async_unregister_subdev(subdev);
3110
3111        if (sensor->power_count) {
3112                if (gpio_is_valid(sensor->platform_data->xshutdown))
3113                        gpio_set_value(sensor->platform_data->xshutdown, 0);
3114                if (sensor->platform_data->set_xclk)
3115                        sensor->platform_data->set_xclk(&sensor->src->sd, 0);
3116                else
3117                        clk_disable_unprepare(sensor->ext_clk);
3118                sensor->power_count = 0;
3119        }
3120
3121        for (i = 0; i < sensor->ssds_used; i++) {
3122                v4l2_device_unregister_subdev(&sensor->ssds[i].sd);
3123                media_entity_cleanup(&sensor->ssds[i].sd.entity);
3124        }
3125        smiapp_cleanup(sensor);
3126
3127        return 0;
3128}
3129
3130static const struct of_device_id smiapp_of_table[] = {
3131        { .compatible = "nokia,smia" },
3132        { },
3133};
3134MODULE_DEVICE_TABLE(of, smiapp_of_table);
3135
3136static const struct i2c_device_id smiapp_id_table[] = {
3137        { SMIAPP_NAME, 0 },
3138        { },
3139};
3140MODULE_DEVICE_TABLE(i2c, smiapp_id_table);
3141
3142static const struct dev_pm_ops smiapp_pm_ops = {
3143        .suspend        = smiapp_suspend,
3144        .resume         = smiapp_resume,
3145};
3146
3147static struct i2c_driver smiapp_i2c_driver = {
3148        .driver = {
3149                .of_match_table = smiapp_of_table,
3150                .name = SMIAPP_NAME,
3151                .pm = &smiapp_pm_ops,
3152        },
3153        .probe  = smiapp_probe,
3154        .remove = smiapp_remove,
3155        .id_table = smiapp_id_table,
3156};
3157
3158module_i2c_driver(smiapp_i2c_driver);
3159
3160MODULE_AUTHOR("Sakari Ailus <sakari.ailus@iki.fi>");
3161MODULE_DESCRIPTION("Generic SMIA/SMIA++ camera module driver");
3162MODULE_LICENSE("GPL");
3163