root/drivers/media/platform/atmel/atmel-isc-base.c

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

DEFINITIONS

This source file includes following definitions.
  1. isc_update_awb_ctrls
  2. isc_reset_awb_ctrls
  3. isc_wait_clk_stable
  4. isc_clk_prepare
  5. isc_clk_unprepare
  6. isc_clk_enable
  7. isc_clk_disable
  8. isc_clk_is_enabled
  9. isc_clk_recalc_rate
  10. isc_clk_determine_rate
  11. isc_clk_set_parent
  12. isc_clk_get_parent
  13. isc_clk_set_rate
  14. isc_clk_register
  15. isc_clk_init
  16. isc_clk_cleanup
  17. isc_queue_setup
  18. isc_buffer_prepare
  19. isc_start_dma
  20. isc_set_pipeline
  21. isc_update_profile
  22. isc_set_histogram
  23. isc_configure
  24. isc_start_streaming
  25. isc_stop_streaming
  26. isc_buffer_queue
  27. find_format_by_fourcc
  28. isc_querycap
  29. isc_enum_fmt_vid_cap
  30. isc_g_fmt_vid_cap
  31. isc_try_validate_formats
  32. isc_try_configure_rlp_dma
  33. isc_try_configure_pipeline
  34. isc_try_fmt
  35. isc_set_fmt
  36. isc_s_fmt_vid_cap
  37. isc_try_fmt_vid_cap
  38. isc_enum_input
  39. isc_g_input
  40. isc_s_input
  41. isc_g_parm
  42. isc_s_parm
  43. isc_enum_framesizes
  44. isc_enum_frameintervals
  45. isc_open
  46. isc_release
  47. isc_interrupt
  48. isc_hist_count
  49. isc_wb_update
  50. isc_awb_work
  51. isc_s_ctrl
  52. isc_ctrl_init
  53. isc_async_bound
  54. isc_async_unbind
  55. find_format_by_code
  56. isc_formats_init
  57. isc_set_default_fmt
  58. isc_async_complete
  59. isc_subdev_cleanup
  60. isc_pipeline_init

   1 // SPDX-License-Identifier: GPL-2.0-only
   2 /*
   3  * Microchip Image Sensor Controller (ISC) common driver base
   4  *
   5  * Copyright (C) 2016-2019 Microchip Technology, Inc.
   6  *
   7  * Author: Songjun Wu
   8  * Author: Eugen Hristev <eugen.hristev@microchip.com>
   9  *
  10  */
  11 
  12 #include <linux/clk.h>
  13 #include <linux/clkdev.h>
  14 #include <linux/clk-provider.h>
  15 #include <linux/delay.h>
  16 #include <linux/interrupt.h>
  17 #include <linux/math64.h>
  18 #include <linux/module.h>
  19 #include <linux/of.h>
  20 #include <linux/of_graph.h>
  21 #include <linux/platform_device.h>
  22 #include <linux/pm_runtime.h>
  23 #include <linux/regmap.h>
  24 #include <linux/videodev2.h>
  25 
  26 #include <media/v4l2-ctrls.h>
  27 #include <media/v4l2-device.h>
  28 #include <media/v4l2-event.h>
  29 #include <media/v4l2-image-sizes.h>
  30 #include <media/v4l2-ioctl.h>
  31 #include <media/v4l2-fwnode.h>
  32 #include <media/v4l2-subdev.h>
  33 #include <media/videobuf2-dma-contig.h>
  34 
  35 #include "atmel-isc-regs.h"
  36 #include "atmel-isc.h"
  37 
  38 static unsigned int debug;
  39 module_param(debug, int, 0644);
  40 MODULE_PARM_DESC(debug, "debug level (0-2)");
  41 
  42 static unsigned int sensor_preferred = 1;
  43 module_param(sensor_preferred, uint, 0644);
  44 MODULE_PARM_DESC(sensor_preferred,
  45                  "Sensor is preferred to output the specified format (1-on 0-off), default 1");
  46 
  47 /* This is a list of the formats that the ISC can *output* */
  48 const struct isc_format controller_formats[] = {
  49         {
  50                 .fourcc         = V4L2_PIX_FMT_ARGB444,
  51         },
  52         {
  53                 .fourcc         = V4L2_PIX_FMT_ARGB555,
  54         },
  55         {
  56                 .fourcc         = V4L2_PIX_FMT_RGB565,
  57         },
  58         {
  59                 .fourcc         = V4L2_PIX_FMT_ABGR32,
  60         },
  61         {
  62                 .fourcc         = V4L2_PIX_FMT_XBGR32,
  63         },
  64         {
  65                 .fourcc         = V4L2_PIX_FMT_YUV420,
  66         },
  67         {
  68                 .fourcc         = V4L2_PIX_FMT_YUYV,
  69         },
  70         {
  71                 .fourcc         = V4L2_PIX_FMT_YUV422P,
  72         },
  73         {
  74                 .fourcc         = V4L2_PIX_FMT_GREY,
  75         },
  76 };
  77 
  78 /* This is a list of formats that the ISC can receive as *input* */
  79 struct isc_format formats_list[] = {
  80         {
  81                 .fourcc         = V4L2_PIX_FMT_SBGGR8,
  82                 .mbus_code      = MEDIA_BUS_FMT_SBGGR8_1X8,
  83                 .pfe_cfg0_bps   = ISC_PFE_CFG0_BPS_EIGHT,
  84                 .cfa_baycfg     = ISC_BAY_CFG_BGBG,
  85         },
  86         {
  87                 .fourcc         = V4L2_PIX_FMT_SGBRG8,
  88                 .mbus_code      = MEDIA_BUS_FMT_SGBRG8_1X8,
  89                 .pfe_cfg0_bps   = ISC_PFE_CFG0_BPS_EIGHT,
  90                 .cfa_baycfg     = ISC_BAY_CFG_GBGB,
  91         },
  92         {
  93                 .fourcc         = V4L2_PIX_FMT_SGRBG8,
  94                 .mbus_code      = MEDIA_BUS_FMT_SGRBG8_1X8,
  95                 .pfe_cfg0_bps   = ISC_PFE_CFG0_BPS_EIGHT,
  96                 .cfa_baycfg     = ISC_BAY_CFG_GRGR,
  97         },
  98         {
  99                 .fourcc         = V4L2_PIX_FMT_SRGGB8,
 100                 .mbus_code      = MEDIA_BUS_FMT_SRGGB8_1X8,
 101                 .pfe_cfg0_bps   = ISC_PFE_CFG0_BPS_EIGHT,
 102                 .cfa_baycfg     = ISC_BAY_CFG_RGRG,
 103         },
 104         {
 105                 .fourcc         = V4L2_PIX_FMT_SBGGR10,
 106                 .mbus_code      = MEDIA_BUS_FMT_SBGGR10_1X10,
 107                 .pfe_cfg0_bps   = ISC_PFG_CFG0_BPS_TEN,
 108                 .cfa_baycfg     = ISC_BAY_CFG_RGRG,
 109         },
 110         {
 111                 .fourcc         = V4L2_PIX_FMT_SGBRG10,
 112                 .mbus_code      = MEDIA_BUS_FMT_SGBRG10_1X10,
 113                 .pfe_cfg0_bps   = ISC_PFG_CFG0_BPS_TEN,
 114                 .cfa_baycfg     = ISC_BAY_CFG_GBGB,
 115         },
 116         {
 117                 .fourcc         = V4L2_PIX_FMT_SGRBG10,
 118                 .mbus_code      = MEDIA_BUS_FMT_SGRBG10_1X10,
 119                 .pfe_cfg0_bps   = ISC_PFG_CFG0_BPS_TEN,
 120                 .cfa_baycfg     = ISC_BAY_CFG_GRGR,
 121         },
 122         {
 123                 .fourcc         = V4L2_PIX_FMT_SRGGB10,
 124                 .mbus_code      = MEDIA_BUS_FMT_SRGGB10_1X10,
 125                 .pfe_cfg0_bps   = ISC_PFG_CFG0_BPS_TEN,
 126                 .cfa_baycfg     = ISC_BAY_CFG_RGRG,
 127         },
 128         {
 129                 .fourcc         = V4L2_PIX_FMT_SBGGR12,
 130                 .mbus_code      = MEDIA_BUS_FMT_SBGGR12_1X12,
 131                 .pfe_cfg0_bps   = ISC_PFG_CFG0_BPS_TWELVE,
 132                 .cfa_baycfg     = ISC_BAY_CFG_BGBG,
 133         },
 134         {
 135                 .fourcc         = V4L2_PIX_FMT_SGBRG12,
 136                 .mbus_code      = MEDIA_BUS_FMT_SGBRG12_1X12,
 137                 .pfe_cfg0_bps   = ISC_PFG_CFG0_BPS_TWELVE,
 138                 .cfa_baycfg     = ISC_BAY_CFG_GBGB,
 139         },
 140         {
 141                 .fourcc         = V4L2_PIX_FMT_SGRBG12,
 142                 .mbus_code      = MEDIA_BUS_FMT_SGRBG12_1X12,
 143                 .pfe_cfg0_bps   = ISC_PFG_CFG0_BPS_TWELVE,
 144                 .cfa_baycfg     = ISC_BAY_CFG_GRGR,
 145         },
 146         {
 147                 .fourcc         = V4L2_PIX_FMT_SRGGB12,
 148                 .mbus_code      = MEDIA_BUS_FMT_SRGGB12_1X12,
 149                 .pfe_cfg0_bps   = ISC_PFG_CFG0_BPS_TWELVE,
 150                 .cfa_baycfg     = ISC_BAY_CFG_RGRG,
 151         },
 152         {
 153                 .fourcc         = V4L2_PIX_FMT_GREY,
 154                 .mbus_code      = MEDIA_BUS_FMT_Y8_1X8,
 155                 .pfe_cfg0_bps   = ISC_PFE_CFG0_BPS_EIGHT,
 156         },
 157         {
 158                 .fourcc         = V4L2_PIX_FMT_YUYV,
 159                 .mbus_code      = MEDIA_BUS_FMT_YUYV8_2X8,
 160                 .pfe_cfg0_bps   = ISC_PFE_CFG0_BPS_EIGHT,
 161         },
 162         {
 163                 .fourcc         = V4L2_PIX_FMT_RGB565,
 164                 .mbus_code      = MEDIA_BUS_FMT_RGB565_2X8_LE,
 165                 .pfe_cfg0_bps   = ISC_PFE_CFG0_BPS_EIGHT,
 166         },
 167 };
 168 
 169 /* Gamma table with gamma 1/2.2 */
 170 const u32 isc_gamma_table[GAMMA_MAX + 1][GAMMA_ENTRIES] = {
 171         /* 0 --> gamma 1/1.8 */
 172         {      0x65,  0x66002F,  0x950025,  0xBB0020,  0xDB001D,  0xF8001A,
 173           0x1130018, 0x12B0017, 0x1420016, 0x1580014, 0x16D0013, 0x1810012,
 174           0x1940012, 0x1A60012, 0x1B80011, 0x1C90010, 0x1DA0010, 0x1EA000F,
 175           0x1FA000F, 0x209000F, 0x218000F, 0x227000E, 0x235000E, 0x243000E,
 176           0x251000E, 0x25F000D, 0x26C000D, 0x279000D, 0x286000D, 0x293000C,
 177           0x2A0000C, 0x2AC000C, 0x2B8000C, 0x2C4000C, 0x2D0000B, 0x2DC000B,
 178           0x2E7000B, 0x2F3000B, 0x2FE000B, 0x309000B, 0x314000B, 0x31F000A,
 179           0x32A000A, 0x334000B, 0x33F000A, 0x349000A, 0x354000A, 0x35E000A,
 180           0x368000A, 0x372000A, 0x37C000A, 0x386000A, 0x3900009, 0x399000A,
 181           0x3A30009, 0x3AD0009, 0x3B60009, 0x3BF000A, 0x3C90009, 0x3D20009,
 182           0x3DB0009, 0x3E40009, 0x3ED0009, 0x3F60009 },
 183 
 184         /* 1 --> gamma 1/2 */
 185         {      0x7F,  0x800034,  0xB50028,  0xDE0021, 0x100001E, 0x11E001B,
 186           0x1390019, 0x1520017, 0x16A0015, 0x1800014, 0x1940014, 0x1A80013,
 187           0x1BB0012, 0x1CD0011, 0x1DF0010, 0x1EF0010, 0x200000F, 0x20F000F,
 188           0x21F000E, 0x22D000F, 0x23C000E, 0x24A000E, 0x258000D, 0x265000D,
 189           0x273000C, 0x27F000D, 0x28C000C, 0x299000C, 0x2A5000C, 0x2B1000B,
 190           0x2BC000C, 0x2C8000B, 0x2D3000C, 0x2DF000B, 0x2EA000A, 0x2F5000A,
 191           0x2FF000B, 0x30A000A, 0x314000B, 0x31F000A, 0x329000A, 0x333000A,
 192           0x33D0009, 0x3470009, 0x350000A, 0x35A0009, 0x363000A, 0x36D0009,
 193           0x3760009, 0x37F0009, 0x3880009, 0x3910009, 0x39A0009, 0x3A30009,
 194           0x3AC0008, 0x3B40009, 0x3BD0008, 0x3C60008, 0x3CE0008, 0x3D60009,
 195           0x3DF0008, 0x3E70008, 0x3EF0008, 0x3F70008 },
 196 
 197         /* 2 --> gamma 1/2.2 */
 198         {      0x99,  0x9B0038,  0xD4002A,  0xFF0023, 0x122001F, 0x141001B,
 199           0x15D0019, 0x1760017, 0x18E0015, 0x1A30015, 0x1B80013, 0x1CC0012,
 200           0x1DE0011, 0x1F00010, 0x2010010, 0x2110010, 0x221000F, 0x230000F,
 201           0x23F000E, 0x24D000E, 0x25B000D, 0x269000C, 0x276000C, 0x283000C,
 202           0x28F000C, 0x29B000C, 0x2A7000C, 0x2B3000B, 0x2BF000B, 0x2CA000B,
 203           0x2D5000B, 0x2E0000A, 0x2EB000A, 0x2F5000A, 0x2FF000A, 0x30A000A,
 204           0x3140009, 0x31E0009, 0x327000A, 0x3310009, 0x33A0009, 0x3440009,
 205           0x34D0009, 0x3560009, 0x35F0009, 0x3680008, 0x3710008, 0x3790009,
 206           0x3820008, 0x38A0008, 0x3930008, 0x39B0008, 0x3A30008, 0x3AB0008,
 207           0x3B30008, 0x3BB0008, 0x3C30008, 0x3CB0007, 0x3D20008, 0x3DA0007,
 208           0x3E20007, 0x3E90007, 0x3F00008, 0x3F80007 },
 209 };
 210 
 211 #define ISC_IS_FORMAT_RAW(mbus_code) \
 212         (((mbus_code) & 0xf000) == 0x3000)
 213 
 214 static inline void isc_update_awb_ctrls(struct isc_device *isc)
 215 {
 216         struct isc_ctrls *ctrls = &isc->ctrls;
 217 
 218         regmap_write(isc->regmap, ISC_WB_O_RGR,
 219                      (ISC_WB_O_ZERO_VAL - (ctrls->offset[ISC_HIS_CFG_MODE_R])) |
 220                      ((ISC_WB_O_ZERO_VAL - ctrls->offset[ISC_HIS_CFG_MODE_GR]) << 16));
 221         regmap_write(isc->regmap, ISC_WB_O_BGB,
 222                      (ISC_WB_O_ZERO_VAL - (ctrls->offset[ISC_HIS_CFG_MODE_B])) |
 223                      ((ISC_WB_O_ZERO_VAL - ctrls->offset[ISC_HIS_CFG_MODE_GB]) << 16));
 224         regmap_write(isc->regmap, ISC_WB_G_RGR,
 225                      ctrls->gain[ISC_HIS_CFG_MODE_R] |
 226                      (ctrls->gain[ISC_HIS_CFG_MODE_GR] << 16));
 227         regmap_write(isc->regmap, ISC_WB_G_BGB,
 228                      ctrls->gain[ISC_HIS_CFG_MODE_B] |
 229                      (ctrls->gain[ISC_HIS_CFG_MODE_GB] << 16));
 230 }
 231 
 232 static inline void isc_reset_awb_ctrls(struct isc_device *isc)
 233 {
 234         unsigned int c;
 235 
 236         for (c = ISC_HIS_CFG_MODE_GR; c <= ISC_HIS_CFG_MODE_B; c++) {
 237                 /* gains have a fixed point at 9 decimals */
 238                 isc->ctrls.gain[c] = 1 << 9;
 239                 /* offsets are in 2's complements, the value
 240                  * will be substracted from ISC_WB_O_ZERO_VAL to obtain
 241                  * 2's complement of a value between 0 and
 242                  * ISC_WB_O_ZERO_VAL >> 1
 243                  */
 244                 isc->ctrls.offset[c] = ISC_WB_O_ZERO_VAL;
 245         }
 246 }
 247 
 248 static int isc_wait_clk_stable(struct clk_hw *hw)
 249 {
 250         struct isc_clk *isc_clk = to_isc_clk(hw);
 251         struct regmap *regmap = isc_clk->regmap;
 252         unsigned long timeout = jiffies + usecs_to_jiffies(1000);
 253         unsigned int status;
 254 
 255         while (time_before(jiffies, timeout)) {
 256                 regmap_read(regmap, ISC_CLKSR, &status);
 257                 if (!(status & ISC_CLKSR_SIP))
 258                         return 0;
 259 
 260                 usleep_range(10, 250);
 261         }
 262 
 263         return -ETIMEDOUT;
 264 }
 265 
 266 static int isc_clk_prepare(struct clk_hw *hw)
 267 {
 268         struct isc_clk *isc_clk = to_isc_clk(hw);
 269 
 270         if (isc_clk->id == ISC_ISPCK)
 271                 pm_runtime_get_sync(isc_clk->dev);
 272 
 273         return isc_wait_clk_stable(hw);
 274 }
 275 
 276 static void isc_clk_unprepare(struct clk_hw *hw)
 277 {
 278         struct isc_clk *isc_clk = to_isc_clk(hw);
 279 
 280         isc_wait_clk_stable(hw);
 281 
 282         if (isc_clk->id == ISC_ISPCK)
 283                 pm_runtime_put_sync(isc_clk->dev);
 284 }
 285 
 286 static int isc_clk_enable(struct clk_hw *hw)
 287 {
 288         struct isc_clk *isc_clk = to_isc_clk(hw);
 289         u32 id = isc_clk->id;
 290         struct regmap *regmap = isc_clk->regmap;
 291         unsigned long flags;
 292         unsigned int status;
 293 
 294         dev_dbg(isc_clk->dev, "ISC CLK: %s, div = %d, parent id = %d\n",
 295                 __func__, isc_clk->div, isc_clk->parent_id);
 296 
 297         spin_lock_irqsave(&isc_clk->lock, flags);
 298         regmap_update_bits(regmap, ISC_CLKCFG,
 299                            ISC_CLKCFG_DIV_MASK(id) | ISC_CLKCFG_SEL_MASK(id),
 300                            (isc_clk->div << ISC_CLKCFG_DIV_SHIFT(id)) |
 301                            (isc_clk->parent_id << ISC_CLKCFG_SEL_SHIFT(id)));
 302 
 303         regmap_write(regmap, ISC_CLKEN, ISC_CLK(id));
 304         spin_unlock_irqrestore(&isc_clk->lock, flags);
 305 
 306         regmap_read(regmap, ISC_CLKSR, &status);
 307         if (status & ISC_CLK(id))
 308                 return 0;
 309         else
 310                 return -EINVAL;
 311 }
 312 
 313 static void isc_clk_disable(struct clk_hw *hw)
 314 {
 315         struct isc_clk *isc_clk = to_isc_clk(hw);
 316         u32 id = isc_clk->id;
 317         unsigned long flags;
 318 
 319         spin_lock_irqsave(&isc_clk->lock, flags);
 320         regmap_write(isc_clk->regmap, ISC_CLKDIS, ISC_CLK(id));
 321         spin_unlock_irqrestore(&isc_clk->lock, flags);
 322 }
 323 
 324 static int isc_clk_is_enabled(struct clk_hw *hw)
 325 {
 326         struct isc_clk *isc_clk = to_isc_clk(hw);
 327         u32 status;
 328 
 329         if (isc_clk->id == ISC_ISPCK)
 330                 pm_runtime_get_sync(isc_clk->dev);
 331 
 332         regmap_read(isc_clk->regmap, ISC_CLKSR, &status);
 333 
 334         if (isc_clk->id == ISC_ISPCK)
 335                 pm_runtime_put_sync(isc_clk->dev);
 336 
 337         return status & ISC_CLK(isc_clk->id) ? 1 : 0;
 338 }
 339 
 340 static unsigned long
 341 isc_clk_recalc_rate(struct clk_hw *hw, unsigned long parent_rate)
 342 {
 343         struct isc_clk *isc_clk = to_isc_clk(hw);
 344 
 345         return DIV_ROUND_CLOSEST(parent_rate, isc_clk->div + 1);
 346 }
 347 
 348 static int isc_clk_determine_rate(struct clk_hw *hw,
 349                                    struct clk_rate_request *req)
 350 {
 351         struct isc_clk *isc_clk = to_isc_clk(hw);
 352         long best_rate = -EINVAL;
 353         int best_diff = -1;
 354         unsigned int i, div;
 355 
 356         for (i = 0; i < clk_hw_get_num_parents(hw); i++) {
 357                 struct clk_hw *parent;
 358                 unsigned long parent_rate;
 359 
 360                 parent = clk_hw_get_parent_by_index(hw, i);
 361                 if (!parent)
 362                         continue;
 363 
 364                 parent_rate = clk_hw_get_rate(parent);
 365                 if (!parent_rate)
 366                         continue;
 367 
 368                 for (div = 1; div < ISC_CLK_MAX_DIV + 2; div++) {
 369                         unsigned long rate;
 370                         int diff;
 371 
 372                         rate = DIV_ROUND_CLOSEST(parent_rate, div);
 373                         diff = abs(req->rate - rate);
 374 
 375                         if (best_diff < 0 || best_diff > diff) {
 376                                 best_rate = rate;
 377                                 best_diff = diff;
 378                                 req->best_parent_rate = parent_rate;
 379                                 req->best_parent_hw = parent;
 380                         }
 381 
 382                         if (!best_diff || rate < req->rate)
 383                                 break;
 384                 }
 385 
 386                 if (!best_diff)
 387                         break;
 388         }
 389 
 390         dev_dbg(isc_clk->dev,
 391                 "ISC CLK: %s, best_rate = %ld, parent clk: %s @ %ld\n",
 392                 __func__, best_rate,
 393                 __clk_get_name((req->best_parent_hw)->clk),
 394                 req->best_parent_rate);
 395 
 396         if (best_rate < 0)
 397                 return best_rate;
 398 
 399         req->rate = best_rate;
 400 
 401         return 0;
 402 }
 403 
 404 static int isc_clk_set_parent(struct clk_hw *hw, u8 index)
 405 {
 406         struct isc_clk *isc_clk = to_isc_clk(hw);
 407 
 408         if (index >= clk_hw_get_num_parents(hw))
 409                 return -EINVAL;
 410 
 411         isc_clk->parent_id = index;
 412 
 413         return 0;
 414 }
 415 
 416 static u8 isc_clk_get_parent(struct clk_hw *hw)
 417 {
 418         struct isc_clk *isc_clk = to_isc_clk(hw);
 419 
 420         return isc_clk->parent_id;
 421 }
 422 
 423 static int isc_clk_set_rate(struct clk_hw *hw,
 424                              unsigned long rate,
 425                              unsigned long parent_rate)
 426 {
 427         struct isc_clk *isc_clk = to_isc_clk(hw);
 428         u32 div;
 429 
 430         if (!rate)
 431                 return -EINVAL;
 432 
 433         div = DIV_ROUND_CLOSEST(parent_rate, rate);
 434         if (div > (ISC_CLK_MAX_DIV + 1) || !div)
 435                 return -EINVAL;
 436 
 437         isc_clk->div = div - 1;
 438 
 439         return 0;
 440 }
 441 
 442 static const struct clk_ops isc_clk_ops = {
 443         .prepare        = isc_clk_prepare,
 444         .unprepare      = isc_clk_unprepare,
 445         .enable         = isc_clk_enable,
 446         .disable        = isc_clk_disable,
 447         .is_enabled     = isc_clk_is_enabled,
 448         .recalc_rate    = isc_clk_recalc_rate,
 449         .determine_rate = isc_clk_determine_rate,
 450         .set_parent     = isc_clk_set_parent,
 451         .get_parent     = isc_clk_get_parent,
 452         .set_rate       = isc_clk_set_rate,
 453 };
 454 
 455 static int isc_clk_register(struct isc_device *isc, unsigned int id)
 456 {
 457         struct regmap *regmap = isc->regmap;
 458         struct device_node *np = isc->dev->of_node;
 459         struct isc_clk *isc_clk;
 460         struct clk_init_data init;
 461         const char *clk_name = np->name;
 462         const char *parent_names[3];
 463         int num_parents;
 464 
 465         num_parents = of_clk_get_parent_count(np);
 466         if (num_parents < 1 || num_parents > 3)
 467                 return -EINVAL;
 468 
 469         if (num_parents > 2 && id == ISC_ISPCK)
 470                 num_parents = 2;
 471 
 472         of_clk_parent_fill(np, parent_names, num_parents);
 473 
 474         if (id == ISC_MCK)
 475                 of_property_read_string(np, "clock-output-names", &clk_name);
 476         else
 477                 clk_name = "isc-ispck";
 478 
 479         init.parent_names       = parent_names;
 480         init.num_parents        = num_parents;
 481         init.name               = clk_name;
 482         init.ops                = &isc_clk_ops;
 483         init.flags              = CLK_SET_RATE_GATE | CLK_SET_PARENT_GATE;
 484 
 485         isc_clk = &isc->isc_clks[id];
 486         isc_clk->hw.init        = &init;
 487         isc_clk->regmap         = regmap;
 488         isc_clk->id             = id;
 489         isc_clk->dev            = isc->dev;
 490         spin_lock_init(&isc_clk->lock);
 491 
 492         isc_clk->clk = clk_register(isc->dev, &isc_clk->hw);
 493         if (IS_ERR(isc_clk->clk)) {
 494                 dev_err(isc->dev, "%s: clock register fail\n", clk_name);
 495                 return PTR_ERR(isc_clk->clk);
 496         } else if (id == ISC_MCK)
 497                 of_clk_add_provider(np, of_clk_src_simple_get, isc_clk->clk);
 498 
 499         return 0;
 500 }
 501 
 502 int isc_clk_init(struct isc_device *isc)
 503 {
 504         unsigned int i;
 505         int ret;
 506 
 507         for (i = 0; i < ARRAY_SIZE(isc->isc_clks); i++)
 508                 isc->isc_clks[i].clk = ERR_PTR(-EINVAL);
 509 
 510         for (i = 0; i < ARRAY_SIZE(isc->isc_clks); i++) {
 511                 ret = isc_clk_register(isc, i);
 512                 if (ret)
 513                         return ret;
 514         }
 515 
 516         return 0;
 517 }
 518 
 519 void isc_clk_cleanup(struct isc_device *isc)
 520 {
 521         unsigned int i;
 522 
 523         of_clk_del_provider(isc->dev->of_node);
 524 
 525         for (i = 0; i < ARRAY_SIZE(isc->isc_clks); i++) {
 526                 struct isc_clk *isc_clk = &isc->isc_clks[i];
 527 
 528                 if (!IS_ERR(isc_clk->clk))
 529                         clk_unregister(isc_clk->clk);
 530         }
 531 }
 532 
 533 static int isc_queue_setup(struct vb2_queue *vq,
 534                             unsigned int *nbuffers, unsigned int *nplanes,
 535                             unsigned int sizes[], struct device *alloc_devs[])
 536 {
 537         struct isc_device *isc = vb2_get_drv_priv(vq);
 538         unsigned int size = isc->fmt.fmt.pix.sizeimage;
 539 
 540         if (*nplanes)
 541                 return sizes[0] < size ? -EINVAL : 0;
 542 
 543         *nplanes = 1;
 544         sizes[0] = size;
 545 
 546         return 0;
 547 }
 548 
 549 static int isc_buffer_prepare(struct vb2_buffer *vb)
 550 {
 551         struct vb2_v4l2_buffer *vbuf = to_vb2_v4l2_buffer(vb);
 552         struct isc_device *isc = vb2_get_drv_priv(vb->vb2_queue);
 553         unsigned long size = isc->fmt.fmt.pix.sizeimage;
 554 
 555         if (vb2_plane_size(vb, 0) < size) {
 556                 v4l2_err(&isc->v4l2_dev, "buffer too small (%lu < %lu)\n",
 557                          vb2_plane_size(vb, 0), size);
 558                 return -EINVAL;
 559         }
 560 
 561         vb2_set_plane_payload(vb, 0, size);
 562 
 563         vbuf->field = isc->fmt.fmt.pix.field;
 564 
 565         return 0;
 566 }
 567 
 568 static void isc_start_dma(struct isc_device *isc)
 569 {
 570         struct regmap *regmap = isc->regmap;
 571         u32 sizeimage = isc->fmt.fmt.pix.sizeimage;
 572         u32 dctrl_dview;
 573         dma_addr_t addr0;
 574         u32 h, w;
 575 
 576         h = isc->fmt.fmt.pix.height;
 577         w = isc->fmt.fmt.pix.width;
 578 
 579         /*
 580          * In case the sensor is not RAW, it will output a pixel (12-16 bits)
 581          * with two samples on the ISC Data bus (which is 8-12)
 582          * ISC will count each sample, so, we need to multiply these values
 583          * by two, to get the real number of samples for the required pixels.
 584          */
 585         if (!ISC_IS_FORMAT_RAW(isc->config.sd_format->mbus_code)) {
 586                 h <<= 1;
 587                 w <<= 1;
 588         }
 589 
 590         /*
 591          * We limit the column/row count that the ISC will output according
 592          * to the configured resolution that we want.
 593          * This will avoid the situation where the sensor is misconfigured,
 594          * sending more data, and the ISC will just take it and DMA to memory,
 595          * causing corruption.
 596          */
 597         regmap_write(regmap, ISC_PFE_CFG1,
 598                      (ISC_PFE_CFG1_COLMIN(0) & ISC_PFE_CFG1_COLMIN_MASK) |
 599                      (ISC_PFE_CFG1_COLMAX(w - 1) & ISC_PFE_CFG1_COLMAX_MASK));
 600 
 601         regmap_write(regmap, ISC_PFE_CFG2,
 602                      (ISC_PFE_CFG2_ROWMIN(0) & ISC_PFE_CFG2_ROWMIN_MASK) |
 603                      (ISC_PFE_CFG2_ROWMAX(h - 1) & ISC_PFE_CFG2_ROWMAX_MASK));
 604 
 605         regmap_update_bits(regmap, ISC_PFE_CFG0,
 606                            ISC_PFE_CFG0_COLEN | ISC_PFE_CFG0_ROWEN,
 607                            ISC_PFE_CFG0_COLEN | ISC_PFE_CFG0_ROWEN);
 608 
 609         addr0 = vb2_dma_contig_plane_dma_addr(&isc->cur_frm->vb.vb2_buf, 0);
 610         regmap_write(regmap, ISC_DAD0, addr0);
 611 
 612         switch (isc->config.fourcc) {
 613         case V4L2_PIX_FMT_YUV420:
 614                 regmap_write(regmap, ISC_DAD1, addr0 + (sizeimage * 2) / 3);
 615                 regmap_write(regmap, ISC_DAD2, addr0 + (sizeimage * 5) / 6);
 616                 break;
 617         case V4L2_PIX_FMT_YUV422P:
 618                 regmap_write(regmap, ISC_DAD1, addr0 + sizeimage / 2);
 619                 regmap_write(regmap, ISC_DAD2, addr0 + (sizeimage * 3) / 4);
 620                 break;
 621         default:
 622                 break;
 623         }
 624 
 625         dctrl_dview = isc->config.dctrl_dview;
 626 
 627         regmap_write(regmap, ISC_DCTRL, dctrl_dview | ISC_DCTRL_IE_IS);
 628         spin_lock(&isc->awb_lock);
 629         regmap_write(regmap, ISC_CTRLEN, ISC_CTRL_CAPTURE);
 630         spin_unlock(&isc->awb_lock);
 631 }
 632 
 633 static void isc_set_pipeline(struct isc_device *isc, u32 pipeline)
 634 {
 635         struct regmap *regmap = isc->regmap;
 636         struct isc_ctrls *ctrls = &isc->ctrls;
 637         u32 val, bay_cfg;
 638         const u32 *gamma;
 639         unsigned int i;
 640 
 641         /* WB-->CFA-->CC-->GAM-->CSC-->CBC-->SUB422-->SUB420 */
 642         for (i = 0; i < ISC_PIPE_LINE_NODE_NUM; i++) {
 643                 val = pipeline & BIT(i) ? 1 : 0;
 644                 regmap_field_write(isc->pipeline[i], val);
 645         }
 646 
 647         if (!pipeline)
 648                 return;
 649 
 650         bay_cfg = isc->config.sd_format->cfa_baycfg;
 651 
 652         if (ctrls->awb == ISC_WB_NONE)
 653                 isc_reset_awb_ctrls(isc);
 654 
 655         regmap_write(regmap, ISC_WB_CFG, bay_cfg);
 656         isc_update_awb_ctrls(isc);
 657 
 658         regmap_write(regmap, ISC_CFA_CFG, bay_cfg | ISC_CFA_CFG_EITPOL);
 659 
 660         gamma = &isc_gamma_table[ctrls->gamma_index][0];
 661         regmap_bulk_write(regmap, ISC_GAM_BENTRY, gamma, GAMMA_ENTRIES);
 662         regmap_bulk_write(regmap, ISC_GAM_GENTRY, gamma, GAMMA_ENTRIES);
 663         regmap_bulk_write(regmap, ISC_GAM_RENTRY, gamma, GAMMA_ENTRIES);
 664 
 665         /* Convert RGB to YUV */
 666         regmap_write(regmap, ISC_CSC_YR_YG, 0x42 | (0x81 << 16));
 667         regmap_write(regmap, ISC_CSC_YB_OY, 0x19 | (0x10 << 16));
 668         regmap_write(regmap, ISC_CSC_CBR_CBG, 0xFDA | (0xFB6 << 16));
 669         regmap_write(regmap, ISC_CSC_CBB_OCB, 0x70 | (0x80 << 16));
 670         regmap_write(regmap, ISC_CSC_CRR_CRG, 0x70 | (0xFA2 << 16));
 671         regmap_write(regmap, ISC_CSC_CRB_OCR, 0xFEE | (0x80 << 16));
 672 
 673         regmap_write(regmap, ISC_CBC_BRIGHT, ctrls->brightness);
 674         regmap_write(regmap, ISC_CBC_CONTRAST, ctrls->contrast);
 675 }
 676 
 677 static int isc_update_profile(struct isc_device *isc)
 678 {
 679         struct regmap *regmap = isc->regmap;
 680         u32 sr;
 681         int counter = 100;
 682 
 683         regmap_write(regmap, ISC_CTRLEN, ISC_CTRL_UPPRO);
 684 
 685         regmap_read(regmap, ISC_CTRLSR, &sr);
 686         while ((sr & ISC_CTRL_UPPRO) && counter--) {
 687                 usleep_range(1000, 2000);
 688                 regmap_read(regmap, ISC_CTRLSR, &sr);
 689         }
 690 
 691         if (counter < 0) {
 692                 v4l2_warn(&isc->v4l2_dev, "Time out to update profile\n");
 693                 return -ETIMEDOUT;
 694         }
 695 
 696         return 0;
 697 }
 698 
 699 static void isc_set_histogram(struct isc_device *isc, bool enable)
 700 {
 701         struct regmap *regmap = isc->regmap;
 702         struct isc_ctrls *ctrls = &isc->ctrls;
 703 
 704         if (enable) {
 705                 regmap_write(regmap, ISC_HIS_CFG,
 706                              ISC_HIS_CFG_MODE_GR |
 707                              (isc->config.sd_format->cfa_baycfg
 708                                         << ISC_HIS_CFG_BAYSEL_SHIFT) |
 709                                         ISC_HIS_CFG_RAR);
 710                 regmap_write(regmap, ISC_HIS_CTRL, ISC_HIS_CTRL_EN);
 711                 regmap_write(regmap, ISC_INTEN, ISC_INT_HISDONE);
 712                 ctrls->hist_id = ISC_HIS_CFG_MODE_GR;
 713                 isc_update_profile(isc);
 714                 regmap_write(regmap, ISC_CTRLEN, ISC_CTRL_HISREQ);
 715 
 716                 ctrls->hist_stat = HIST_ENABLED;
 717         } else {
 718                 regmap_write(regmap, ISC_INTDIS, ISC_INT_HISDONE);
 719                 regmap_write(regmap, ISC_HIS_CTRL, ISC_HIS_CTRL_DIS);
 720 
 721                 ctrls->hist_stat = HIST_DISABLED;
 722         }
 723 }
 724 
 725 static int isc_configure(struct isc_device *isc)
 726 {
 727         struct regmap *regmap = isc->regmap;
 728         u32 pfe_cfg0, rlp_mode, dcfg, mask, pipeline;
 729         struct isc_subdev_entity *subdev = isc->current_subdev;
 730 
 731         pfe_cfg0 = isc->config.sd_format->pfe_cfg0_bps;
 732         rlp_mode = isc->config.rlp_cfg_mode;
 733         pipeline = isc->config.bits_pipeline;
 734 
 735         dcfg = isc->config.dcfg_imode |
 736                        ISC_DCFG_YMBSIZE_BEATS8 | ISC_DCFG_CMBSIZE_BEATS8;
 737 
 738         pfe_cfg0  |= subdev->pfe_cfg0 | ISC_PFE_CFG0_MODE_PROGRESSIVE;
 739         mask = ISC_PFE_CFG0_BPS_MASK | ISC_PFE_CFG0_HPOL_LOW |
 740                ISC_PFE_CFG0_VPOL_LOW | ISC_PFE_CFG0_PPOL_LOW |
 741                ISC_PFE_CFG0_MODE_MASK | ISC_PFE_CFG0_CCIR_CRC |
 742                    ISC_PFE_CFG0_CCIR656;
 743 
 744         regmap_update_bits(regmap, ISC_PFE_CFG0, mask, pfe_cfg0);
 745 
 746         regmap_update_bits(regmap, ISC_RLP_CFG, ISC_RLP_CFG_MODE_MASK,
 747                            rlp_mode);
 748 
 749         regmap_write(regmap, ISC_DCFG, dcfg);
 750 
 751         /* Set the pipeline */
 752         isc_set_pipeline(isc, pipeline);
 753 
 754         /*
 755          * The current implemented histogram is available for RAW R, B, GB, GR
 756          * channels. We need to check if sensor is outputting RAW BAYER
 757          */
 758         if (isc->ctrls.awb &&
 759             ISC_IS_FORMAT_RAW(isc->config.sd_format->mbus_code))
 760                 isc_set_histogram(isc, true);
 761         else
 762                 isc_set_histogram(isc, false);
 763 
 764         /* Update profile */
 765         return isc_update_profile(isc);
 766 }
 767 
 768 static int isc_start_streaming(struct vb2_queue *vq, unsigned int count)
 769 {
 770         struct isc_device *isc = vb2_get_drv_priv(vq);
 771         struct regmap *regmap = isc->regmap;
 772         struct isc_buffer *buf;
 773         unsigned long flags;
 774         int ret;
 775 
 776         /* Enable stream on the sub device */
 777         ret = v4l2_subdev_call(isc->current_subdev->sd, video, s_stream, 1);
 778         if (ret && ret != -ENOIOCTLCMD) {
 779                 v4l2_err(&isc->v4l2_dev, "stream on failed in subdev %d\n",
 780                          ret);
 781                 goto err_start_stream;
 782         }
 783 
 784         pm_runtime_get_sync(isc->dev);
 785 
 786         ret = isc_configure(isc);
 787         if (unlikely(ret))
 788                 goto err_configure;
 789 
 790         /* Enable DMA interrupt */
 791         regmap_write(regmap, ISC_INTEN, ISC_INT_DDONE);
 792 
 793         spin_lock_irqsave(&isc->dma_queue_lock, flags);
 794 
 795         isc->sequence = 0;
 796         isc->stop = false;
 797         reinit_completion(&isc->comp);
 798 
 799         isc->cur_frm = list_first_entry(&isc->dma_queue,
 800                                         struct isc_buffer, list);
 801         list_del(&isc->cur_frm->list);
 802 
 803         isc_start_dma(isc);
 804 
 805         spin_unlock_irqrestore(&isc->dma_queue_lock, flags);
 806 
 807         /* if we streaming from RAW, we can do one-shot white balance adj */
 808         if (ISC_IS_FORMAT_RAW(isc->config.sd_format->mbus_code))
 809                 v4l2_ctrl_activate(isc->do_wb_ctrl, true);
 810 
 811         return 0;
 812 
 813 err_configure:
 814         pm_runtime_put_sync(isc->dev);
 815 
 816         v4l2_subdev_call(isc->current_subdev->sd, video, s_stream, 0);
 817 
 818 err_start_stream:
 819         spin_lock_irqsave(&isc->dma_queue_lock, flags);
 820         list_for_each_entry(buf, &isc->dma_queue, list)
 821                 vb2_buffer_done(&buf->vb.vb2_buf, VB2_BUF_STATE_QUEUED);
 822         INIT_LIST_HEAD(&isc->dma_queue);
 823         spin_unlock_irqrestore(&isc->dma_queue_lock, flags);
 824 
 825         return ret;
 826 }
 827 
 828 static void isc_stop_streaming(struct vb2_queue *vq)
 829 {
 830         struct isc_device *isc = vb2_get_drv_priv(vq);
 831         unsigned long flags;
 832         struct isc_buffer *buf;
 833         int ret;
 834 
 835         v4l2_ctrl_activate(isc->do_wb_ctrl, false);
 836 
 837         isc->stop = true;
 838 
 839         /* Wait until the end of the current frame */
 840         if (isc->cur_frm && !wait_for_completion_timeout(&isc->comp, 5 * HZ))
 841                 v4l2_err(&isc->v4l2_dev,
 842                          "Timeout waiting for end of the capture\n");
 843 
 844         /* Disable DMA interrupt */
 845         regmap_write(isc->regmap, ISC_INTDIS, ISC_INT_DDONE);
 846 
 847         pm_runtime_put_sync(isc->dev);
 848 
 849         /* Disable stream on the sub device */
 850         ret = v4l2_subdev_call(isc->current_subdev->sd, video, s_stream, 0);
 851         if (ret && ret != -ENOIOCTLCMD)
 852                 v4l2_err(&isc->v4l2_dev, "stream off failed in subdev\n");
 853 
 854         /* Release all active buffers */
 855         spin_lock_irqsave(&isc->dma_queue_lock, flags);
 856         if (unlikely(isc->cur_frm)) {
 857                 vb2_buffer_done(&isc->cur_frm->vb.vb2_buf,
 858                                 VB2_BUF_STATE_ERROR);
 859                 isc->cur_frm = NULL;
 860         }
 861         list_for_each_entry(buf, &isc->dma_queue, list)
 862                 vb2_buffer_done(&buf->vb.vb2_buf, VB2_BUF_STATE_ERROR);
 863         INIT_LIST_HEAD(&isc->dma_queue);
 864         spin_unlock_irqrestore(&isc->dma_queue_lock, flags);
 865 }
 866 
 867 static void isc_buffer_queue(struct vb2_buffer *vb)
 868 {
 869         struct vb2_v4l2_buffer *vbuf = to_vb2_v4l2_buffer(vb);
 870         struct isc_buffer *buf = container_of(vbuf, struct isc_buffer, vb);
 871         struct isc_device *isc = vb2_get_drv_priv(vb->vb2_queue);
 872         unsigned long flags;
 873 
 874         spin_lock_irqsave(&isc->dma_queue_lock, flags);
 875         if (!isc->cur_frm && list_empty(&isc->dma_queue) &&
 876                 vb2_is_streaming(vb->vb2_queue)) {
 877                 isc->cur_frm = buf;
 878                 isc_start_dma(isc);
 879         } else
 880                 list_add_tail(&buf->list, &isc->dma_queue);
 881         spin_unlock_irqrestore(&isc->dma_queue_lock, flags);
 882 }
 883 
 884 static struct isc_format *find_format_by_fourcc(struct isc_device *isc,
 885                                                  unsigned int fourcc)
 886 {
 887         unsigned int num_formats = isc->num_user_formats;
 888         struct isc_format *fmt;
 889         unsigned int i;
 890 
 891         for (i = 0; i < num_formats; i++) {
 892                 fmt = isc->user_formats[i];
 893                 if (fmt->fourcc == fourcc)
 894                         return fmt;
 895         }
 896 
 897         return NULL;
 898 }
 899 
 900 static const struct vb2_ops isc_vb2_ops = {
 901         .queue_setup            = isc_queue_setup,
 902         .wait_prepare           = vb2_ops_wait_prepare,
 903         .wait_finish            = vb2_ops_wait_finish,
 904         .buf_prepare            = isc_buffer_prepare,
 905         .start_streaming        = isc_start_streaming,
 906         .stop_streaming         = isc_stop_streaming,
 907         .buf_queue              = isc_buffer_queue,
 908 };
 909 
 910 static int isc_querycap(struct file *file, void *priv,
 911                          struct v4l2_capability *cap)
 912 {
 913         struct isc_device *isc = video_drvdata(file);
 914 
 915         strscpy(cap->driver, ATMEL_ISC_NAME, sizeof(cap->driver));
 916         strscpy(cap->card, "Atmel Image Sensor Controller", sizeof(cap->card));
 917         snprintf(cap->bus_info, sizeof(cap->bus_info),
 918                  "platform:%s", isc->v4l2_dev.name);
 919 
 920         return 0;
 921 }
 922 
 923 static int isc_enum_fmt_vid_cap(struct file *file, void *priv,
 924                                  struct v4l2_fmtdesc *f)
 925 {
 926         u32 index = f->index;
 927         u32 i, supported_index;
 928 
 929         if (index < ARRAY_SIZE(controller_formats)) {
 930                 f->pixelformat = controller_formats[index].fourcc;
 931                 return 0;
 932         }
 933 
 934         index -= ARRAY_SIZE(controller_formats);
 935 
 936         i = 0;
 937         supported_index = 0;
 938 
 939         for (i = 0; i < ARRAY_SIZE(formats_list); i++) {
 940                 if (!ISC_IS_FORMAT_RAW(formats_list[i].mbus_code) ||
 941                     !formats_list[i].sd_support)
 942                         continue;
 943                 if (supported_index == index) {
 944                         f->pixelformat = formats_list[i].fourcc;
 945                         return 0;
 946                 }
 947                 supported_index++;
 948         }
 949 
 950         return -EINVAL;
 951 }
 952 
 953 static int isc_g_fmt_vid_cap(struct file *file, void *priv,
 954                               struct v4l2_format *fmt)
 955 {
 956         struct isc_device *isc = video_drvdata(file);
 957 
 958         *fmt = isc->fmt;
 959 
 960         return 0;
 961 }
 962 
 963 /*
 964  * Checks the current configured format, if ISC can output it,
 965  * considering which type of format the ISC receives from the sensor
 966  */
 967 static int isc_try_validate_formats(struct isc_device *isc)
 968 {
 969         int ret;
 970         bool bayer = false, yuv = false, rgb = false, grey = false;
 971 
 972         /* all formats supported by the RLP module are OK */
 973         switch (isc->try_config.fourcc) {
 974         case V4L2_PIX_FMT_SBGGR8:
 975         case V4L2_PIX_FMT_SGBRG8:
 976         case V4L2_PIX_FMT_SGRBG8:
 977         case V4L2_PIX_FMT_SRGGB8:
 978         case V4L2_PIX_FMT_SBGGR10:
 979         case V4L2_PIX_FMT_SGBRG10:
 980         case V4L2_PIX_FMT_SGRBG10:
 981         case V4L2_PIX_FMT_SRGGB10:
 982         case V4L2_PIX_FMT_SBGGR12:
 983         case V4L2_PIX_FMT_SGBRG12:
 984         case V4L2_PIX_FMT_SGRBG12:
 985         case V4L2_PIX_FMT_SRGGB12:
 986                 ret = 0;
 987                 bayer = true;
 988                 break;
 989 
 990         case V4L2_PIX_FMT_YUV420:
 991         case V4L2_PIX_FMT_YUV422P:
 992         case V4L2_PIX_FMT_YUYV:
 993                 ret = 0;
 994                 yuv = true;
 995                 break;
 996 
 997         case V4L2_PIX_FMT_RGB565:
 998         case V4L2_PIX_FMT_ABGR32:
 999         case V4L2_PIX_FMT_XBGR32:
1000         case V4L2_PIX_FMT_ARGB444:
1001         case V4L2_PIX_FMT_ARGB555:
1002                 ret = 0;
1003                 rgb = true;
1004                 break;
1005         case V4L2_PIX_FMT_GREY:
1006                 ret = 0;
1007                 grey = true;
1008                 break;
1009         default:
1010         /* any other different formats are not supported */
1011                 ret = -EINVAL;
1012         }
1013 
1014         /* we cannot output RAW/Grey if we do not receive RAW */
1015         if ((bayer || grey) &&
1016             !ISC_IS_FORMAT_RAW(isc->try_config.sd_format->mbus_code))
1017                 return -EINVAL;
1018 
1019         v4l2_dbg(1, debug, &isc->v4l2_dev,
1020                  "Format validation, requested rgb=%u, yuv=%u, grey=%u, bayer=%u\n",
1021                  rgb, yuv, grey, bayer);
1022 
1023         return ret;
1024 }
1025 
1026 /*
1027  * Configures the RLP and DMA modules, depending on the output format
1028  * configured for the ISC.
1029  * If direct_dump == true, just dump raw data 8 bits.
1030  */
1031 static int isc_try_configure_rlp_dma(struct isc_device *isc, bool direct_dump)
1032 {
1033         if (direct_dump) {
1034                 isc->try_config.rlp_cfg_mode = ISC_RLP_CFG_MODE_DAT8;
1035                 isc->try_config.dcfg_imode = ISC_DCFG_IMODE_PACKED8;
1036                 isc->try_config.dctrl_dview = ISC_DCTRL_DVIEW_PACKED;
1037                 isc->try_config.bpp = 16;
1038                 return 0;
1039         }
1040 
1041         switch (isc->try_config.fourcc) {
1042         case V4L2_PIX_FMT_SBGGR8:
1043         case V4L2_PIX_FMT_SGBRG8:
1044         case V4L2_PIX_FMT_SGRBG8:
1045         case V4L2_PIX_FMT_SRGGB8:
1046                 isc->try_config.rlp_cfg_mode = ISC_RLP_CFG_MODE_DAT8;
1047                 isc->try_config.dcfg_imode = ISC_DCFG_IMODE_PACKED8;
1048                 isc->try_config.dctrl_dview = ISC_DCTRL_DVIEW_PACKED;
1049                 isc->try_config.bpp = 8;
1050                 break;
1051         case V4L2_PIX_FMT_SBGGR10:
1052         case V4L2_PIX_FMT_SGBRG10:
1053         case V4L2_PIX_FMT_SGRBG10:
1054         case V4L2_PIX_FMT_SRGGB10:
1055                 isc->try_config.rlp_cfg_mode = ISC_RLP_CFG_MODE_DAT10;
1056                 isc->try_config.dcfg_imode = ISC_DCFG_IMODE_PACKED16;
1057                 isc->try_config.dctrl_dview = ISC_DCTRL_DVIEW_PACKED;
1058                 isc->try_config.bpp = 16;
1059                 break;
1060         case V4L2_PIX_FMT_SBGGR12:
1061         case V4L2_PIX_FMT_SGBRG12:
1062         case V4L2_PIX_FMT_SGRBG12:
1063         case V4L2_PIX_FMT_SRGGB12:
1064                 isc->try_config.rlp_cfg_mode = ISC_RLP_CFG_MODE_DAT12;
1065                 isc->try_config.dcfg_imode = ISC_DCFG_IMODE_PACKED16;
1066                 isc->try_config.dctrl_dview = ISC_DCTRL_DVIEW_PACKED;
1067                 isc->try_config.bpp = 16;
1068                 break;
1069         case V4L2_PIX_FMT_RGB565:
1070                 isc->try_config.rlp_cfg_mode = ISC_RLP_CFG_MODE_RGB565;
1071                 isc->try_config.dcfg_imode = ISC_DCFG_IMODE_PACKED16;
1072                 isc->try_config.dctrl_dview = ISC_DCTRL_DVIEW_PACKED;
1073                 isc->try_config.bpp = 16;
1074                 break;
1075         case V4L2_PIX_FMT_ARGB444:
1076                 isc->try_config.rlp_cfg_mode = ISC_RLP_CFG_MODE_ARGB444;
1077                 isc->try_config.dcfg_imode = ISC_DCFG_IMODE_PACKED16;
1078                 isc->try_config.dctrl_dview = ISC_DCTRL_DVIEW_PACKED;
1079                 isc->try_config.bpp = 16;
1080                 break;
1081         case V4L2_PIX_FMT_ARGB555:
1082                 isc->try_config.rlp_cfg_mode = ISC_RLP_CFG_MODE_ARGB555;
1083                 isc->try_config.dcfg_imode = ISC_DCFG_IMODE_PACKED16;
1084                 isc->try_config.dctrl_dview = ISC_DCTRL_DVIEW_PACKED;
1085                 isc->try_config.bpp = 16;
1086                 break;
1087         case V4L2_PIX_FMT_ABGR32:
1088         case V4L2_PIX_FMT_XBGR32:
1089                 isc->try_config.rlp_cfg_mode = ISC_RLP_CFG_MODE_ARGB32;
1090                 isc->try_config.dcfg_imode = ISC_DCFG_IMODE_PACKED32;
1091                 isc->try_config.dctrl_dview = ISC_DCTRL_DVIEW_PACKED;
1092                 isc->try_config.bpp = 32;
1093                 break;
1094         case V4L2_PIX_FMT_YUV420:
1095                 isc->try_config.rlp_cfg_mode = ISC_RLP_CFG_MODE_YYCC;
1096                 isc->try_config.dcfg_imode = ISC_DCFG_IMODE_YC420P;
1097                 isc->try_config.dctrl_dview = ISC_DCTRL_DVIEW_PLANAR;
1098                 isc->try_config.bpp = 12;
1099                 break;
1100         case V4L2_PIX_FMT_YUV422P:
1101                 isc->try_config.rlp_cfg_mode = ISC_RLP_CFG_MODE_YYCC;
1102                 isc->try_config.dcfg_imode = ISC_DCFG_IMODE_YC422P;
1103                 isc->try_config.dctrl_dview = ISC_DCTRL_DVIEW_PLANAR;
1104                 isc->try_config.bpp = 16;
1105                 break;
1106         case V4L2_PIX_FMT_YUYV:
1107                 isc->try_config.rlp_cfg_mode = ISC_RLP_CFG_MODE_YYCC;
1108                 isc->try_config.dcfg_imode = ISC_DCFG_IMODE_PACKED32;
1109                 isc->try_config.dctrl_dview = ISC_DCTRL_DVIEW_PACKED;
1110                 isc->try_config.bpp = 16;
1111                 break;
1112         case V4L2_PIX_FMT_GREY:
1113                 isc->try_config.rlp_cfg_mode = ISC_RLP_CFG_MODE_DATY8;
1114                 isc->try_config.dcfg_imode = ISC_DCFG_IMODE_PACKED8;
1115                 isc->try_config.dctrl_dview = ISC_DCTRL_DVIEW_PACKED;
1116                 isc->try_config.bpp = 8;
1117                 break;
1118         default:
1119                 return -EINVAL;
1120         }
1121         return 0;
1122 }
1123 
1124 /*
1125  * Configuring pipeline modules, depending on which format the ISC outputs
1126  * and considering which format it has as input from the sensor.
1127  */
1128 static int isc_try_configure_pipeline(struct isc_device *isc)
1129 {
1130         switch (isc->try_config.fourcc) {
1131         case V4L2_PIX_FMT_RGB565:
1132         case V4L2_PIX_FMT_ARGB555:
1133         case V4L2_PIX_FMT_ARGB444:
1134         case V4L2_PIX_FMT_ABGR32:
1135         case V4L2_PIX_FMT_XBGR32:
1136                 /* if sensor format is RAW, we convert inside ISC */
1137                 if (ISC_IS_FORMAT_RAW(isc->try_config.sd_format->mbus_code)) {
1138                         isc->try_config.bits_pipeline = CFA_ENABLE |
1139                                 WB_ENABLE | GAM_ENABLES;
1140                 } else {
1141                         isc->try_config.bits_pipeline = 0x0;
1142                 }
1143                 break;
1144         case V4L2_PIX_FMT_YUV420:
1145                 /* if sensor format is RAW, we convert inside ISC */
1146                 if (ISC_IS_FORMAT_RAW(isc->try_config.sd_format->mbus_code)) {
1147                         isc->try_config.bits_pipeline = CFA_ENABLE |
1148                                 CSC_ENABLE | WB_ENABLE | GAM_ENABLES |
1149                                 SUB420_ENABLE | SUB422_ENABLE | CBC_ENABLE;
1150                 } else {
1151                         isc->try_config.bits_pipeline = 0x0;
1152                 }
1153                 break;
1154         case V4L2_PIX_FMT_YUV422P:
1155                 /* if sensor format is RAW, we convert inside ISC */
1156                 if (ISC_IS_FORMAT_RAW(isc->try_config.sd_format->mbus_code)) {
1157                         isc->try_config.bits_pipeline = CFA_ENABLE |
1158                                 CSC_ENABLE | WB_ENABLE | GAM_ENABLES |
1159                                 SUB422_ENABLE | CBC_ENABLE;
1160                 } else {
1161                         isc->try_config.bits_pipeline = 0x0;
1162                 }
1163                 break;
1164         case V4L2_PIX_FMT_YUYV:
1165                 /* if sensor format is RAW, we convert inside ISC */
1166                 if (ISC_IS_FORMAT_RAW(isc->try_config.sd_format->mbus_code)) {
1167                         isc->try_config.bits_pipeline = CFA_ENABLE |
1168                                 CSC_ENABLE | WB_ENABLE | GAM_ENABLES |
1169                                 SUB422_ENABLE | CBC_ENABLE;
1170                 } else {
1171                         isc->try_config.bits_pipeline = 0x0;
1172                 }
1173                 break;
1174         case V4L2_PIX_FMT_GREY:
1175                 if (ISC_IS_FORMAT_RAW(isc->try_config.sd_format->mbus_code)) {
1176                 /* if sensor format is RAW, we convert inside ISC */
1177                         isc->try_config.bits_pipeline = CFA_ENABLE |
1178                                 CSC_ENABLE | WB_ENABLE | GAM_ENABLES |
1179                                 CBC_ENABLE;
1180                 } else {
1181                         isc->try_config.bits_pipeline = 0x0;
1182                 }
1183                 break;
1184         default:
1185                 isc->try_config.bits_pipeline = 0x0;
1186         }
1187         return 0;
1188 }
1189 
1190 static int isc_try_fmt(struct isc_device *isc, struct v4l2_format *f,
1191                         u32 *code)
1192 {
1193         int i;
1194         struct isc_format *sd_fmt = NULL, *direct_fmt = NULL;
1195         struct v4l2_pix_format *pixfmt = &f->fmt.pix;
1196         struct v4l2_subdev_pad_config pad_cfg;
1197         struct v4l2_subdev_format format = {
1198                 .which = V4L2_SUBDEV_FORMAT_TRY,
1199         };
1200         u32 mbus_code;
1201         int ret;
1202         bool rlp_dma_direct_dump = false;
1203 
1204         if (f->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
1205                 return -EINVAL;
1206 
1207         /* Step 1: find a RAW format that is supported */
1208         for (i = 0; i < isc->num_user_formats; i++) {
1209                 if (ISC_IS_FORMAT_RAW(isc->user_formats[i]->mbus_code)) {
1210                         sd_fmt = isc->user_formats[i];
1211                         break;
1212                 }
1213         }
1214         /* Step 2: We can continue with this RAW format, or we can look
1215          * for better: maybe sensor supports directly what we need.
1216          */
1217         direct_fmt = find_format_by_fourcc(isc, pixfmt->pixelformat);
1218 
1219         /* Step 3: We have both. We decide given the module parameter which
1220          * one to use.
1221          */
1222         if (direct_fmt && sd_fmt && sensor_preferred)
1223                 sd_fmt = direct_fmt;
1224 
1225         /* Step 4: we do not have RAW but we have a direct format. Use it. */
1226         if (direct_fmt && !sd_fmt)
1227                 sd_fmt = direct_fmt;
1228 
1229         /* Step 5: if we are using a direct format, we need to package
1230          * everything as 8 bit data and just dump it
1231          */
1232         if (sd_fmt == direct_fmt)
1233                 rlp_dma_direct_dump = true;
1234 
1235         /* Step 6: We have no format. This can happen if the userspace
1236          * requests some weird/invalid format.
1237          * In this case, default to whatever we have
1238          */
1239         if (!sd_fmt && !direct_fmt) {
1240                 sd_fmt = isc->user_formats[isc->num_user_formats - 1];
1241                 v4l2_dbg(1, debug, &isc->v4l2_dev,
1242                          "Sensor not supporting %.4s, using %.4s\n",
1243                          (char *)&pixfmt->pixelformat, (char *)&sd_fmt->fourcc);
1244         }
1245 
1246         if (!sd_fmt) {
1247                 ret = -EINVAL;
1248                 goto isc_try_fmt_err;
1249         }
1250 
1251         /* Step 7: Print out what we decided for debugging */
1252         v4l2_dbg(1, debug, &isc->v4l2_dev,
1253                  "Preferring to have sensor using format %.4s\n",
1254                  (char *)&sd_fmt->fourcc);
1255 
1256         /* Step 8: at this moment we decided which format the subdev will use */
1257         isc->try_config.sd_format = sd_fmt;
1258 
1259         /* Limit to Atmel ISC hardware capabilities */
1260         if (pixfmt->width > ISC_MAX_SUPPORT_WIDTH)
1261                 pixfmt->width = ISC_MAX_SUPPORT_WIDTH;
1262         if (pixfmt->height > ISC_MAX_SUPPORT_HEIGHT)
1263                 pixfmt->height = ISC_MAX_SUPPORT_HEIGHT;
1264 
1265         /*
1266          * The mbus format is the one the subdev outputs.
1267          * The pixels will be transferred in this format Sensor -> ISC
1268          */
1269         mbus_code = sd_fmt->mbus_code;
1270 
1271         /*
1272          * Validate formats. If the required format is not OK, default to raw.
1273          */
1274 
1275         isc->try_config.fourcc = pixfmt->pixelformat;
1276 
1277         if (isc_try_validate_formats(isc)) {
1278                 pixfmt->pixelformat = isc->try_config.fourcc = sd_fmt->fourcc;
1279                 /* Re-try to validate the new format */
1280                 ret = isc_try_validate_formats(isc);
1281                 if (ret)
1282                         goto isc_try_fmt_err;
1283         }
1284 
1285         ret = isc_try_configure_rlp_dma(isc, rlp_dma_direct_dump);
1286         if (ret)
1287                 goto isc_try_fmt_err;
1288 
1289         ret = isc_try_configure_pipeline(isc);
1290         if (ret)
1291                 goto isc_try_fmt_err;
1292 
1293         v4l2_fill_mbus_format(&format.format, pixfmt, mbus_code);
1294         ret = v4l2_subdev_call(isc->current_subdev->sd, pad, set_fmt,
1295                                &pad_cfg, &format);
1296         if (ret < 0)
1297                 goto isc_try_fmt_subdev_err;
1298 
1299         v4l2_fill_pix_format(pixfmt, &format.format);
1300 
1301         pixfmt->field = V4L2_FIELD_NONE;
1302         pixfmt->bytesperline = (pixfmt->width * isc->try_config.bpp) >> 3;
1303         pixfmt->sizeimage = pixfmt->bytesperline * pixfmt->height;
1304 
1305         if (code)
1306                 *code = mbus_code;
1307 
1308         return 0;
1309 
1310 isc_try_fmt_err:
1311         v4l2_err(&isc->v4l2_dev, "Could not find any possible format for a working pipeline\n");
1312 isc_try_fmt_subdev_err:
1313         memset(&isc->try_config, 0, sizeof(isc->try_config));
1314 
1315         return ret;
1316 }
1317 
1318 static int isc_set_fmt(struct isc_device *isc, struct v4l2_format *f)
1319 {
1320         struct v4l2_subdev_format format = {
1321                 .which = V4L2_SUBDEV_FORMAT_ACTIVE,
1322         };
1323         u32 mbus_code = 0;
1324         int ret;
1325 
1326         ret = isc_try_fmt(isc, f, &mbus_code);
1327         if (ret)
1328                 return ret;
1329 
1330         v4l2_fill_mbus_format(&format.format, &f->fmt.pix, mbus_code);
1331         ret = v4l2_subdev_call(isc->current_subdev->sd, pad,
1332                                set_fmt, NULL, &format);
1333         if (ret < 0)
1334                 return ret;
1335 
1336         isc->fmt = *f;
1337 
1338         if (isc->try_config.sd_format && isc->config.sd_format &&
1339             isc->try_config.sd_format != isc->config.sd_format) {
1340                 isc->ctrls.hist_stat = HIST_INIT;
1341                 isc_reset_awb_ctrls(isc);
1342         }
1343         /* make the try configuration active */
1344         isc->config = isc->try_config;
1345 
1346         v4l2_dbg(1, debug, &isc->v4l2_dev, "New ISC configuration in place\n");
1347 
1348         return 0;
1349 }
1350 
1351 static int isc_s_fmt_vid_cap(struct file *file, void *priv,
1352                               struct v4l2_format *f)
1353 {
1354         struct isc_device *isc = video_drvdata(file);
1355 
1356         if (vb2_is_streaming(&isc->vb2_vidq))
1357                 return -EBUSY;
1358 
1359         return isc_set_fmt(isc, f);
1360 }
1361 
1362 static int isc_try_fmt_vid_cap(struct file *file, void *priv,
1363                                 struct v4l2_format *f)
1364 {
1365         struct isc_device *isc = video_drvdata(file);
1366 
1367         return isc_try_fmt(isc, f, NULL);
1368 }
1369 
1370 static int isc_enum_input(struct file *file, void *priv,
1371                            struct v4l2_input *inp)
1372 {
1373         if (inp->index != 0)
1374                 return -EINVAL;
1375 
1376         inp->type = V4L2_INPUT_TYPE_CAMERA;
1377         inp->std = 0;
1378         strscpy(inp->name, "Camera", sizeof(inp->name));
1379 
1380         return 0;
1381 }
1382 
1383 static int isc_g_input(struct file *file, void *priv, unsigned int *i)
1384 {
1385         *i = 0;
1386 
1387         return 0;
1388 }
1389 
1390 static int isc_s_input(struct file *file, void *priv, unsigned int i)
1391 {
1392         if (i > 0)
1393                 return -EINVAL;
1394 
1395         return 0;
1396 }
1397 
1398 static int isc_g_parm(struct file *file, void *fh, struct v4l2_streamparm *a)
1399 {
1400         struct isc_device *isc = video_drvdata(file);
1401 
1402         return v4l2_g_parm_cap(video_devdata(file), isc->current_subdev->sd, a);
1403 }
1404 
1405 static int isc_s_parm(struct file *file, void *fh, struct v4l2_streamparm *a)
1406 {
1407         struct isc_device *isc = video_drvdata(file);
1408 
1409         return v4l2_s_parm_cap(video_devdata(file), isc->current_subdev->sd, a);
1410 }
1411 
1412 static int isc_enum_framesizes(struct file *file, void *fh,
1413                                struct v4l2_frmsizeenum *fsize)
1414 {
1415         struct isc_device *isc = video_drvdata(file);
1416         struct v4l2_subdev_frame_size_enum fse = {
1417                 .index = fsize->index,
1418                 .which = V4L2_SUBDEV_FORMAT_ACTIVE,
1419         };
1420         int ret = -EINVAL;
1421         int i;
1422 
1423         for (i = 0; i < isc->num_user_formats; i++)
1424                 if (isc->user_formats[i]->fourcc == fsize->pixel_format)
1425                         ret = 0;
1426 
1427         for (i = 0; i < ARRAY_SIZE(controller_formats); i++)
1428                 if (controller_formats[i].fourcc == fsize->pixel_format)
1429                         ret = 0;
1430 
1431         if (ret)
1432                 return ret;
1433 
1434         ret = v4l2_subdev_call(isc->current_subdev->sd, pad, enum_frame_size,
1435                                NULL, &fse);
1436         if (ret)
1437                 return ret;
1438 
1439         fse.code = isc->config.sd_format->mbus_code;
1440 
1441         fsize->type = V4L2_FRMSIZE_TYPE_DISCRETE;
1442         fsize->discrete.width = fse.max_width;
1443         fsize->discrete.height = fse.max_height;
1444 
1445         return 0;
1446 }
1447 
1448 static int isc_enum_frameintervals(struct file *file, void *fh,
1449                                     struct v4l2_frmivalenum *fival)
1450 {
1451         struct isc_device *isc = video_drvdata(file);
1452         struct v4l2_subdev_frame_interval_enum fie = {
1453                 .index = fival->index,
1454                 .width = fival->width,
1455                 .height = fival->height,
1456                 .which = V4L2_SUBDEV_FORMAT_ACTIVE,
1457         };
1458         int ret = -EINVAL;
1459         unsigned int i;
1460 
1461         for (i = 0; i < isc->num_user_formats; i++)
1462                 if (isc->user_formats[i]->fourcc == fival->pixel_format)
1463                         ret = 0;
1464 
1465         for (i = 0; i < ARRAY_SIZE(controller_formats); i++)
1466                 if (controller_formats[i].fourcc == fival->pixel_format)
1467                         ret = 0;
1468 
1469         if (ret)
1470                 return ret;
1471 
1472         ret = v4l2_subdev_call(isc->current_subdev->sd, pad,
1473                                enum_frame_interval, NULL, &fie);
1474         if (ret)
1475                 return ret;
1476 
1477         fie.code = isc->config.sd_format->mbus_code;
1478         fival->type = V4L2_FRMIVAL_TYPE_DISCRETE;
1479         fival->discrete = fie.interval;
1480 
1481         return 0;
1482 }
1483 
1484 static const struct v4l2_ioctl_ops isc_ioctl_ops = {
1485         .vidioc_querycap                = isc_querycap,
1486         .vidioc_enum_fmt_vid_cap        = isc_enum_fmt_vid_cap,
1487         .vidioc_g_fmt_vid_cap           = isc_g_fmt_vid_cap,
1488         .vidioc_s_fmt_vid_cap           = isc_s_fmt_vid_cap,
1489         .vidioc_try_fmt_vid_cap         = isc_try_fmt_vid_cap,
1490 
1491         .vidioc_enum_input              = isc_enum_input,
1492         .vidioc_g_input                 = isc_g_input,
1493         .vidioc_s_input                 = isc_s_input,
1494 
1495         .vidioc_reqbufs                 = vb2_ioctl_reqbufs,
1496         .vidioc_querybuf                = vb2_ioctl_querybuf,
1497         .vidioc_qbuf                    = vb2_ioctl_qbuf,
1498         .vidioc_expbuf                  = vb2_ioctl_expbuf,
1499         .vidioc_dqbuf                   = vb2_ioctl_dqbuf,
1500         .vidioc_create_bufs             = vb2_ioctl_create_bufs,
1501         .vidioc_prepare_buf             = vb2_ioctl_prepare_buf,
1502         .vidioc_streamon                = vb2_ioctl_streamon,
1503         .vidioc_streamoff               = vb2_ioctl_streamoff,
1504 
1505         .vidioc_g_parm                  = isc_g_parm,
1506         .vidioc_s_parm                  = isc_s_parm,
1507         .vidioc_enum_framesizes         = isc_enum_framesizes,
1508         .vidioc_enum_frameintervals     = isc_enum_frameintervals,
1509 
1510         .vidioc_log_status              = v4l2_ctrl_log_status,
1511         .vidioc_subscribe_event         = v4l2_ctrl_subscribe_event,
1512         .vidioc_unsubscribe_event       = v4l2_event_unsubscribe,
1513 };
1514 
1515 static int isc_open(struct file *file)
1516 {
1517         struct isc_device *isc = video_drvdata(file);
1518         struct v4l2_subdev *sd = isc->current_subdev->sd;
1519         int ret;
1520 
1521         if (mutex_lock_interruptible(&isc->lock))
1522                 return -ERESTARTSYS;
1523 
1524         ret = v4l2_fh_open(file);
1525         if (ret < 0)
1526                 goto unlock;
1527 
1528         if (!v4l2_fh_is_singular_file(file))
1529                 goto unlock;
1530 
1531         ret = v4l2_subdev_call(sd, core, s_power, 1);
1532         if (ret < 0 && ret != -ENOIOCTLCMD) {
1533                 v4l2_fh_release(file);
1534                 goto unlock;
1535         }
1536 
1537         ret = isc_set_fmt(isc, &isc->fmt);
1538         if (ret) {
1539                 v4l2_subdev_call(sd, core, s_power, 0);
1540                 v4l2_fh_release(file);
1541         }
1542 
1543 unlock:
1544         mutex_unlock(&isc->lock);
1545         return ret;
1546 }
1547 
1548 static int isc_release(struct file *file)
1549 {
1550         struct isc_device *isc = video_drvdata(file);
1551         struct v4l2_subdev *sd = isc->current_subdev->sd;
1552         bool fh_singular;
1553         int ret;
1554 
1555         mutex_lock(&isc->lock);
1556 
1557         fh_singular = v4l2_fh_is_singular_file(file);
1558 
1559         ret = _vb2_fop_release(file, NULL);
1560 
1561         if (fh_singular)
1562                 v4l2_subdev_call(sd, core, s_power, 0);
1563 
1564         mutex_unlock(&isc->lock);
1565 
1566         return ret;
1567 }
1568 
1569 static const struct v4l2_file_operations isc_fops = {
1570         .owner          = THIS_MODULE,
1571         .open           = isc_open,
1572         .release        = isc_release,
1573         .unlocked_ioctl = video_ioctl2,
1574         .read           = vb2_fop_read,
1575         .mmap           = vb2_fop_mmap,
1576         .poll           = vb2_fop_poll,
1577 };
1578 
1579 irqreturn_t isc_interrupt(int irq, void *dev_id)
1580 {
1581         struct isc_device *isc = (struct isc_device *)dev_id;
1582         struct regmap *regmap = isc->regmap;
1583         u32 isc_intsr, isc_intmask, pending;
1584         irqreturn_t ret = IRQ_NONE;
1585 
1586         regmap_read(regmap, ISC_INTSR, &isc_intsr);
1587         regmap_read(regmap, ISC_INTMASK, &isc_intmask);
1588 
1589         pending = isc_intsr & isc_intmask;
1590 
1591         if (likely(pending & ISC_INT_DDONE)) {
1592                 spin_lock(&isc->dma_queue_lock);
1593                 if (isc->cur_frm) {
1594                         struct vb2_v4l2_buffer *vbuf = &isc->cur_frm->vb;
1595                         struct vb2_buffer *vb = &vbuf->vb2_buf;
1596 
1597                         vb->timestamp = ktime_get_ns();
1598                         vbuf->sequence = isc->sequence++;
1599                         vb2_buffer_done(vb, VB2_BUF_STATE_DONE);
1600                         isc->cur_frm = NULL;
1601                 }
1602 
1603                 if (!list_empty(&isc->dma_queue) && !isc->stop) {
1604                         isc->cur_frm = list_first_entry(&isc->dma_queue,
1605                                                      struct isc_buffer, list);
1606                         list_del(&isc->cur_frm->list);
1607 
1608                         isc_start_dma(isc);
1609                 }
1610 
1611                 if (isc->stop)
1612                         complete(&isc->comp);
1613 
1614                 ret = IRQ_HANDLED;
1615                 spin_unlock(&isc->dma_queue_lock);
1616         }
1617 
1618         if (pending & ISC_INT_HISDONE) {
1619                 schedule_work(&isc->awb_work);
1620                 ret = IRQ_HANDLED;
1621         }
1622 
1623         return ret;
1624 }
1625 
1626 static void isc_hist_count(struct isc_device *isc, u32 *min, u32 *max)
1627 {
1628         struct regmap *regmap = isc->regmap;
1629         struct isc_ctrls *ctrls = &isc->ctrls;
1630         u32 *hist_count = &ctrls->hist_count[ctrls->hist_id];
1631         u32 *hist_entry = &ctrls->hist_entry[0];
1632         u32 i;
1633 
1634         *min = 0;
1635         *max = HIST_ENTRIES;
1636 
1637         regmap_bulk_read(regmap, ISC_HIS_ENTRY, hist_entry, HIST_ENTRIES);
1638 
1639         *hist_count = 0;
1640         /*
1641          * we deliberately ignore the end of the histogram,
1642          * the most white pixels
1643          */
1644         for (i = 1; i < HIST_ENTRIES; i++) {
1645                 if (*hist_entry && !*min)
1646                         *min = i;
1647                 if (*hist_entry)
1648                         *max = i;
1649                 *hist_count += i * (*hist_entry++);
1650         }
1651 
1652         if (!*min)
1653                 *min = 1;
1654 }
1655 
1656 static void isc_wb_update(struct isc_ctrls *ctrls)
1657 {
1658         u32 *hist_count = &ctrls->hist_count[0];
1659         u32 c, offset[4];
1660         u64 avg = 0;
1661         /* We compute two gains, stretch gain and grey world gain */
1662         u32 s_gain[4], gw_gain[4];
1663 
1664         /*
1665          * According to Grey World, we need to set gains for R/B to normalize
1666          * them towards the green channel.
1667          * Thus we want to keep Green as fixed and adjust only Red/Blue
1668          * Compute the average of the both green channels first
1669          */
1670         avg = (u64)hist_count[ISC_HIS_CFG_MODE_GR] +
1671                 (u64)hist_count[ISC_HIS_CFG_MODE_GB];
1672         avg >>= 1;
1673 
1674         /* Green histogram is null, nothing to do */
1675         if (!avg)
1676                 return;
1677 
1678         for (c = ISC_HIS_CFG_MODE_GR; c <= ISC_HIS_CFG_MODE_B; c++) {
1679                 /*
1680                  * the color offset is the minimum value of the histogram.
1681                  * we stretch this color to the full range by substracting
1682                  * this value from the color component.
1683                  */
1684                 offset[c] = ctrls->hist_minmax[c][HIST_MIN_INDEX];
1685                 /*
1686                  * The offset is always at least 1. If the offset is 1, we do
1687                  * not need to adjust it, so our result must be zero.
1688                  * the offset is computed in a histogram on 9 bits (0..512)
1689                  * but the offset in register is based on
1690                  * 12 bits pipeline (0..4096).
1691                  * we need to shift with the 3 bits that the histogram is
1692                  * ignoring
1693                  */
1694                 ctrls->offset[c] = (offset[c] - 1) << 3;
1695 
1696                 /* the offset is then taken and converted to 2's complements */
1697                 if (!ctrls->offset[c])
1698                         ctrls->offset[c] = ISC_WB_O_ZERO_VAL;
1699 
1700                 /*
1701                  * the stretch gain is the total number of histogram bins
1702                  * divided by the actual range of color component (Max - Min)
1703                  * If we compute gain like this, the actual color component
1704                  * will be stretched to the full histogram.
1705                  * We need to shift 9 bits for precision, we have 9 bits for
1706                  * decimals
1707                  */
1708                 s_gain[c] = (HIST_ENTRIES << 9) /
1709                         (ctrls->hist_minmax[c][HIST_MAX_INDEX] -
1710                         ctrls->hist_minmax[c][HIST_MIN_INDEX] + 1);
1711 
1712                 /*
1713                  * Now we have to compute the gain w.r.t. the average.
1714                  * Add/lose gain to the component towards the average.
1715                  * If it happens that the component is zero, use the
1716                  * fixed point value : 1.0 gain.
1717                  */
1718                 if (hist_count[c])
1719                         gw_gain[c] = div_u64(avg << 9, hist_count[c]);
1720                 else
1721                         gw_gain[c] = 1 << 9;
1722 
1723                 /* multiply both gains and adjust for decimals */
1724                 ctrls->gain[c] = s_gain[c] * gw_gain[c];
1725                 ctrls->gain[c] >>= 9;
1726         }
1727 }
1728 
1729 static void isc_awb_work(struct work_struct *w)
1730 {
1731         struct isc_device *isc =
1732                 container_of(w, struct isc_device, awb_work);
1733         struct regmap *regmap = isc->regmap;
1734         struct isc_ctrls *ctrls = &isc->ctrls;
1735         u32 hist_id = ctrls->hist_id;
1736         u32 baysel;
1737         unsigned long flags;
1738         u32 min, max;
1739 
1740         /* streaming is not active anymore */
1741         if (isc->stop)
1742                 return;
1743 
1744         if (ctrls->hist_stat != HIST_ENABLED)
1745                 return;
1746 
1747         isc_hist_count(isc, &min, &max);
1748         ctrls->hist_minmax[hist_id][HIST_MIN_INDEX] = min;
1749         ctrls->hist_minmax[hist_id][HIST_MAX_INDEX] = max;
1750 
1751         if (hist_id != ISC_HIS_CFG_MODE_B) {
1752                 hist_id++;
1753         } else {
1754                 isc_wb_update(ctrls);
1755                 hist_id = ISC_HIS_CFG_MODE_GR;
1756         }
1757 
1758         ctrls->hist_id = hist_id;
1759         baysel = isc->config.sd_format->cfa_baycfg << ISC_HIS_CFG_BAYSEL_SHIFT;
1760 
1761         /* if no more auto white balance, reset controls. */
1762         if (ctrls->awb == ISC_WB_NONE)
1763                 isc_reset_awb_ctrls(isc);
1764 
1765         pm_runtime_get_sync(isc->dev);
1766 
1767         /*
1768          * only update if we have all the required histograms and controls
1769          * if awb has been disabled, we need to reset registers as well.
1770          */
1771         if (hist_id == ISC_HIS_CFG_MODE_GR || ctrls->awb == ISC_WB_NONE) {
1772                 /*
1773                  * It may happen that DMA Done IRQ will trigger while we are
1774                  * updating white balance registers here.
1775                  * In that case, only parts of the controls have been updated.
1776                  * We can avoid that by locking the section.
1777                  */
1778                 spin_lock_irqsave(&isc->awb_lock, flags);
1779                 isc_update_awb_ctrls(isc);
1780                 spin_unlock_irqrestore(&isc->awb_lock, flags);
1781 
1782                 /*
1783                  * if we are doing just the one time white balance adjustment,
1784                  * we are basically done.
1785                  */
1786                 if (ctrls->awb == ISC_WB_ONETIME) {
1787                         v4l2_info(&isc->v4l2_dev,
1788                                   "Completed one time white-balance adjustment.\n");
1789                         ctrls->awb = ISC_WB_NONE;
1790                 }
1791         }
1792         regmap_write(regmap, ISC_HIS_CFG, hist_id | baysel | ISC_HIS_CFG_RAR);
1793         isc_update_profile(isc);
1794         /* if awb has been disabled, we don't need to start another histogram */
1795         if (ctrls->awb)
1796                 regmap_write(regmap, ISC_CTRLEN, ISC_CTRL_HISREQ);
1797 
1798         pm_runtime_put_sync(isc->dev);
1799 }
1800 
1801 static int isc_s_ctrl(struct v4l2_ctrl *ctrl)
1802 {
1803         struct isc_device *isc = container_of(ctrl->handler,
1804                                              struct isc_device, ctrls.handler);
1805         struct isc_ctrls *ctrls = &isc->ctrls;
1806 
1807         if (ctrl->flags & V4L2_CTRL_FLAG_INACTIVE)
1808                 return 0;
1809 
1810         switch (ctrl->id) {
1811         case V4L2_CID_BRIGHTNESS:
1812                 ctrls->brightness = ctrl->val & ISC_CBC_BRIGHT_MASK;
1813                 break;
1814         case V4L2_CID_CONTRAST:
1815                 ctrls->contrast = ctrl->val & ISC_CBC_CONTRAST_MASK;
1816                 break;
1817         case V4L2_CID_GAMMA:
1818                 ctrls->gamma_index = ctrl->val;
1819                 break;
1820         case V4L2_CID_AUTO_WHITE_BALANCE:
1821                 if (ctrl->val == 1)
1822                         ctrls->awb = ISC_WB_AUTO;
1823                 else
1824                         ctrls->awb = ISC_WB_NONE;
1825 
1826                 /* we did not configure ISC yet */
1827                 if (!isc->config.sd_format)
1828                         break;
1829 
1830                 if (ctrls->hist_stat != HIST_ENABLED)
1831                         isc_reset_awb_ctrls(isc);
1832 
1833                 if (isc->ctrls.awb == ISC_WB_AUTO &&
1834                     vb2_is_streaming(&isc->vb2_vidq) &&
1835                     ISC_IS_FORMAT_RAW(isc->config.sd_format->mbus_code))
1836                         isc_set_histogram(isc, true);
1837 
1838                 break;
1839         case V4L2_CID_DO_WHITE_BALANCE:
1840                 /* if AWB is enabled, do nothing */
1841                 if (ctrls->awb == ISC_WB_AUTO)
1842                         return 0;
1843 
1844                 ctrls->awb = ISC_WB_ONETIME;
1845                 isc_set_histogram(isc, true);
1846                 v4l2_dbg(1, debug, &isc->v4l2_dev,
1847                          "One time white-balance started.\n");
1848                 break;
1849         default:
1850                 return -EINVAL;
1851         }
1852 
1853         return 0;
1854 }
1855 
1856 static const struct v4l2_ctrl_ops isc_ctrl_ops = {
1857         .s_ctrl = isc_s_ctrl,
1858 };
1859 
1860 static int isc_ctrl_init(struct isc_device *isc)
1861 {
1862         const struct v4l2_ctrl_ops *ops = &isc_ctrl_ops;
1863         struct isc_ctrls *ctrls = &isc->ctrls;
1864         struct v4l2_ctrl_handler *hdl = &ctrls->handler;
1865         int ret;
1866 
1867         ctrls->hist_stat = HIST_INIT;
1868         isc_reset_awb_ctrls(isc);
1869 
1870         ret = v4l2_ctrl_handler_init(hdl, 5);
1871         if (ret < 0)
1872                 return ret;
1873 
1874         ctrls->brightness = 0;
1875         ctrls->contrast = 256;
1876 
1877         v4l2_ctrl_new_std(hdl, ops, V4L2_CID_BRIGHTNESS, -1024, 1023, 1, 0);
1878         v4l2_ctrl_new_std(hdl, ops, V4L2_CID_CONTRAST, -2048, 2047, 1, 256);
1879         v4l2_ctrl_new_std(hdl, ops, V4L2_CID_GAMMA, 0, GAMMA_MAX, 1, 2);
1880         v4l2_ctrl_new_std(hdl, ops, V4L2_CID_AUTO_WHITE_BALANCE, 0, 1, 1, 1);
1881 
1882         /* do_white_balance is a button, so min,max,step,default are ignored */
1883         isc->do_wb_ctrl = v4l2_ctrl_new_std(hdl, ops, V4L2_CID_DO_WHITE_BALANCE,
1884                                             0, 0, 0, 0);
1885 
1886         if (!isc->do_wb_ctrl) {
1887                 ret = hdl->error;
1888                 v4l2_ctrl_handler_free(hdl);
1889                 return ret;
1890         }
1891 
1892         v4l2_ctrl_activate(isc->do_wb_ctrl, false);
1893 
1894         v4l2_ctrl_handler_setup(hdl);
1895 
1896         return 0;
1897 }
1898 
1899 static int isc_async_bound(struct v4l2_async_notifier *notifier,
1900                             struct v4l2_subdev *subdev,
1901                             struct v4l2_async_subdev *asd)
1902 {
1903         struct isc_device *isc = container_of(notifier->v4l2_dev,
1904                                               struct isc_device, v4l2_dev);
1905         struct isc_subdev_entity *subdev_entity =
1906                 container_of(notifier, struct isc_subdev_entity, notifier);
1907 
1908         if (video_is_registered(&isc->video_dev)) {
1909                 v4l2_err(&isc->v4l2_dev, "only supports one sub-device.\n");
1910                 return -EBUSY;
1911         }
1912 
1913         subdev_entity->sd = subdev;
1914 
1915         return 0;
1916 }
1917 
1918 static void isc_async_unbind(struct v4l2_async_notifier *notifier,
1919                               struct v4l2_subdev *subdev,
1920                               struct v4l2_async_subdev *asd)
1921 {
1922         struct isc_device *isc = container_of(notifier->v4l2_dev,
1923                                               struct isc_device, v4l2_dev);
1924         cancel_work_sync(&isc->awb_work);
1925         video_unregister_device(&isc->video_dev);
1926         v4l2_ctrl_handler_free(&isc->ctrls.handler);
1927 }
1928 
1929 static struct isc_format *find_format_by_code(unsigned int code, int *index)
1930 {
1931         struct isc_format *fmt = &formats_list[0];
1932         unsigned int i;
1933 
1934         for (i = 0; i < ARRAY_SIZE(formats_list); i++) {
1935                 if (fmt->mbus_code == code) {
1936                         *index = i;
1937                         return fmt;
1938                 }
1939 
1940                 fmt++;
1941         }
1942 
1943         return NULL;
1944 }
1945 
1946 static int isc_formats_init(struct isc_device *isc)
1947 {
1948         struct isc_format *fmt;
1949         struct v4l2_subdev *subdev = isc->current_subdev->sd;
1950         unsigned int num_fmts, i, j;
1951         u32 list_size = ARRAY_SIZE(formats_list);
1952         struct v4l2_subdev_mbus_code_enum mbus_code = {
1953                 .which = V4L2_SUBDEV_FORMAT_ACTIVE,
1954         };
1955 
1956         num_fmts = 0;
1957         while (!v4l2_subdev_call(subdev, pad, enum_mbus_code,
1958                NULL, &mbus_code)) {
1959                 mbus_code.index++;
1960 
1961                 fmt = find_format_by_code(mbus_code.code, &i);
1962                 if (!fmt) {
1963                         v4l2_warn(&isc->v4l2_dev, "Mbus code %x not supported\n",
1964                                   mbus_code.code);
1965                         continue;
1966                 }
1967 
1968                 fmt->sd_support = true;
1969                 num_fmts++;
1970         }
1971 
1972         if (!num_fmts)
1973                 return -ENXIO;
1974 
1975         isc->num_user_formats = num_fmts;
1976         isc->user_formats = devm_kcalloc(isc->dev,
1977                                          num_fmts, sizeof(*isc->user_formats),
1978                                          GFP_KERNEL);
1979         if (!isc->user_formats)
1980                 return -ENOMEM;
1981 
1982         fmt = &formats_list[0];
1983         for (i = 0, j = 0; i < list_size; i++) {
1984                 if (fmt->sd_support)
1985                         isc->user_formats[j++] = fmt;
1986                 fmt++;
1987         }
1988 
1989         return 0;
1990 }
1991 
1992 static int isc_set_default_fmt(struct isc_device *isc)
1993 {
1994         struct v4l2_format f = {
1995                 .type = V4L2_BUF_TYPE_VIDEO_CAPTURE,
1996                 .fmt.pix = {
1997                         .width          = VGA_WIDTH,
1998                         .height         = VGA_HEIGHT,
1999                         .field          = V4L2_FIELD_NONE,
2000                         .pixelformat    = isc->user_formats[0]->fourcc,
2001                 },
2002         };
2003         int ret;
2004 
2005         ret = isc_try_fmt(isc, &f, NULL);
2006         if (ret)
2007                 return ret;
2008 
2009         isc->fmt = f;
2010         return 0;
2011 }
2012 
2013 static int isc_async_complete(struct v4l2_async_notifier *notifier)
2014 {
2015         struct isc_device *isc = container_of(notifier->v4l2_dev,
2016                                               struct isc_device, v4l2_dev);
2017         struct video_device *vdev = &isc->video_dev;
2018         struct vb2_queue *q = &isc->vb2_vidq;
2019         int ret = 0;
2020 
2021         INIT_WORK(&isc->awb_work, isc_awb_work);
2022 
2023         ret = v4l2_device_register_subdev_nodes(&isc->v4l2_dev);
2024         if (ret < 0) {
2025                 v4l2_err(&isc->v4l2_dev, "Failed to register subdev nodes\n");
2026                 return ret;
2027         }
2028 
2029         isc->current_subdev = container_of(notifier,
2030                                            struct isc_subdev_entity, notifier);
2031         mutex_init(&isc->lock);
2032         init_completion(&isc->comp);
2033 
2034         /* Initialize videobuf2 queue */
2035         q->type                 = V4L2_BUF_TYPE_VIDEO_CAPTURE;
2036         q->io_modes             = VB2_MMAP | VB2_DMABUF | VB2_READ;
2037         q->drv_priv             = isc;
2038         q->buf_struct_size      = sizeof(struct isc_buffer);
2039         q->ops                  = &isc_vb2_ops;
2040         q->mem_ops              = &vb2_dma_contig_memops;
2041         q->timestamp_flags      = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC;
2042         q->lock                 = &isc->lock;
2043         q->min_buffers_needed   = 1;
2044         q->dev                  = isc->dev;
2045 
2046         ret = vb2_queue_init(q);
2047         if (ret < 0) {
2048                 v4l2_err(&isc->v4l2_dev,
2049                          "vb2_queue_init() failed: %d\n", ret);
2050                 goto isc_async_complete_err;
2051         }
2052 
2053         /* Init video dma queues */
2054         INIT_LIST_HEAD(&isc->dma_queue);
2055         spin_lock_init(&isc->dma_queue_lock);
2056         spin_lock_init(&isc->awb_lock);
2057 
2058         ret = isc_formats_init(isc);
2059         if (ret < 0) {
2060                 v4l2_err(&isc->v4l2_dev,
2061                          "Init format failed: %d\n", ret);
2062                 goto isc_async_complete_err;
2063         }
2064 
2065         ret = isc_set_default_fmt(isc);
2066         if (ret) {
2067                 v4l2_err(&isc->v4l2_dev, "Could not set default format\n");
2068                 goto isc_async_complete_err;
2069         }
2070 
2071         ret = isc_ctrl_init(isc);
2072         if (ret) {
2073                 v4l2_err(&isc->v4l2_dev, "Init isc ctrols failed: %d\n", ret);
2074                 goto isc_async_complete_err;
2075         }
2076 
2077         /* Register video device */
2078         strscpy(vdev->name, ATMEL_ISC_NAME, sizeof(vdev->name));
2079         vdev->release           = video_device_release_empty;
2080         vdev->fops              = &isc_fops;
2081         vdev->ioctl_ops         = &isc_ioctl_ops;
2082         vdev->v4l2_dev          = &isc->v4l2_dev;
2083         vdev->vfl_dir           = VFL_DIR_RX;
2084         vdev->queue             = q;
2085         vdev->lock              = &isc->lock;
2086         vdev->ctrl_handler      = &isc->ctrls.handler;
2087         vdev->device_caps       = V4L2_CAP_STREAMING | V4L2_CAP_VIDEO_CAPTURE;
2088         video_set_drvdata(vdev, isc);
2089 
2090         ret = video_register_device(vdev, VFL_TYPE_GRABBER, -1);
2091         if (ret < 0) {
2092                 v4l2_err(&isc->v4l2_dev,
2093                          "video_register_device failed: %d\n", ret);
2094                 goto isc_async_complete_err;
2095         }
2096 
2097         return 0;
2098 
2099 isc_async_complete_err:
2100         mutex_destroy(&isc->lock);
2101         return ret;
2102 }
2103 
2104 const struct v4l2_async_notifier_operations isc_async_ops = {
2105         .bound = isc_async_bound,
2106         .unbind = isc_async_unbind,
2107         .complete = isc_async_complete,
2108 };
2109 
2110 void isc_subdev_cleanup(struct isc_device *isc)
2111 {
2112         struct isc_subdev_entity *subdev_entity;
2113 
2114         list_for_each_entry(subdev_entity, &isc->subdev_entities, list) {
2115                 v4l2_async_notifier_unregister(&subdev_entity->notifier);
2116                 v4l2_async_notifier_cleanup(&subdev_entity->notifier);
2117         }
2118 
2119         INIT_LIST_HEAD(&isc->subdev_entities);
2120 }
2121 
2122 int isc_pipeline_init(struct isc_device *isc)
2123 {
2124         struct device *dev = isc->dev;
2125         struct regmap *regmap = isc->regmap;
2126         struct regmap_field *regs;
2127         unsigned int i;
2128 
2129         /* WB-->CFA-->CC-->GAM-->CSC-->CBC-->SUB422-->SUB420 */
2130         const struct reg_field regfields[ISC_PIPE_LINE_NODE_NUM] = {
2131                 REG_FIELD(ISC_WB_CTRL, 0, 0),
2132                 REG_FIELD(ISC_CFA_CTRL, 0, 0),
2133                 REG_FIELD(ISC_CC_CTRL, 0, 0),
2134                 REG_FIELD(ISC_GAM_CTRL, 0, 0),
2135                 REG_FIELD(ISC_GAM_CTRL, 1, 1),
2136                 REG_FIELD(ISC_GAM_CTRL, 2, 2),
2137                 REG_FIELD(ISC_GAM_CTRL, 3, 3),
2138                 REG_FIELD(ISC_CSC_CTRL, 0, 0),
2139                 REG_FIELD(ISC_CBC_CTRL, 0, 0),
2140                 REG_FIELD(ISC_SUB422_CTRL, 0, 0),
2141                 REG_FIELD(ISC_SUB420_CTRL, 0, 0),
2142         };
2143 
2144         for (i = 0; i < ISC_PIPE_LINE_NODE_NUM; i++) {
2145                 regs = devm_regmap_field_alloc(dev, regmap, regfields[i]);
2146                 if (IS_ERR(regs))
2147                         return PTR_ERR(regs);
2148 
2149                 isc->pipeline[i] =  regs;
2150         }
2151 
2152         return 0;
2153 }
2154 
2155 /* regmap configuration */
2156 #define ATMEL_ISC_REG_MAX    0xbfc
2157 const struct regmap_config isc_regmap_config = {
2158         .reg_bits       = 32,
2159         .reg_stride     = 4,
2160         .val_bits       = 32,
2161         .max_register   = ATMEL_ISC_REG_MAX,
2162 };
2163 

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