linux/drivers/staging/media/atomisp/pci/atomisp_v4l2.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0
   2/*
   3 * Support for Medifield PNW Camera Imaging ISP subsystem.
   4 *
   5 * Copyright (c) 2010-2017 Intel Corporation. All Rights Reserved.
   6 *
   7 * Copyright (c) 2010 Silicon Hive www.siliconhive.com.
   8 *
   9 * This program is free software; you can redistribute it and/or
  10 * modify it under the terms of the GNU General Public License version
  11 * 2 as published by the Free Software Foundation.
  12 *
  13 * This program is distributed in the hope that it will be useful,
  14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  16 * GNU General Public License for more details.
  17 *
  18 *
  19 */
  20#include <linux/module.h>
  21#include <linux/pci.h>
  22#include <linux/pm_runtime.h>
  23#include <linux/pm_qos.h>
  24#include <linux/timer.h>
  25#include <linux/delay.h>
  26#include <linux/dmi.h>
  27#include <linux/interrupt.h>
  28
  29#include <asm/iosf_mbi.h>
  30
  31#include "../../include/linux/atomisp_gmin_platform.h"
  32
  33#include "atomisp_cmd.h"
  34#include "atomisp_common.h"
  35#include "atomisp_fops.h"
  36#include "atomisp_file.h"
  37#include "atomisp_ioctl.h"
  38#include "atomisp_internal.h"
  39#include "atomisp_acc.h"
  40#include "atomisp-regs.h"
  41#include "atomisp_dfs_tables.h"
  42#include "atomisp_drvfs.h"
  43#include "hmm/hmm.h"
  44#include "atomisp_trace_event.h"
  45
  46#include "sh_css_firmware.h"
  47
  48#include "device_access.h"
  49
  50/* Timeouts to wait for all subdevs to be registered */
  51#define SUBDEV_WAIT_TIMEOUT             50 /* ms */
  52#define SUBDEV_WAIT_TIMEOUT_MAX_COUNT   40 /* up to 2 seconds */
  53
  54/* G-Min addition: pull this in from intel_mid_pm.h */
  55#define CSTATE_EXIT_LATENCY_C1  1
  56
  57static uint skip_fwload;
  58module_param(skip_fwload, uint, 0644);
  59MODULE_PARM_DESC(skip_fwload, "Skip atomisp firmware load");
  60
  61/* set reserved memory pool size in page */
  62static unsigned int repool_pgnr = 32768;
  63module_param(repool_pgnr, uint, 0644);
  64MODULE_PARM_DESC(repool_pgnr,
  65                 "Set the reserved memory pool size in page (default:32768)");
  66
  67/* set dynamic memory pool size in page */
  68unsigned int dypool_pgnr = UINT_MAX;
  69module_param(dypool_pgnr, uint, 0644);
  70MODULE_PARM_DESC(dypool_pgnr,
  71                 "Set the dynamic memory pool size in page (default: unlimited)");
  72
  73bool dypool_enable = true;
  74module_param(dypool_enable, bool, 0644);
  75MODULE_PARM_DESC(dypool_enable,
  76                 "dynamic memory pool enable/disable (default:enabled)");
  77
  78/* memory optimization: deferred firmware loading */
  79bool defer_fw_load;
  80module_param(defer_fw_load, bool, 0644);
  81MODULE_PARM_DESC(defer_fw_load,
  82                 "Defer FW loading until device is opened (default:disable)");
  83
  84/* cross componnet debug message flag */
  85int dbg_level;
  86module_param(dbg_level, int, 0644);
  87MODULE_PARM_DESC(dbg_level, "debug message level (default:0)");
  88
  89/* log function switch */
  90int dbg_func = 2;
  91module_param(dbg_func, int, 0644);
  92MODULE_PARM_DESC(dbg_func,
  93                 "log function switch non/trace_printk/printk (default:printk)");
  94
  95int mipicsi_flag;
  96module_param(mipicsi_flag, int, 0644);
  97MODULE_PARM_DESC(mipicsi_flag, "mipi csi compression predictor algorithm");
  98
  99static char firmware_name[256];
 100module_param_string(firmware_name, firmware_name, sizeof(firmware_name), 0);
 101MODULE_PARM_DESC(firmware_name, "Firmware file name. Allows overriding the default firmware name.");
 102
 103/*set to 16x16 since this is the amount of lines and pixels the sensor
 104exports extra. If these are kept at the 10x8 that they were on, in yuv
 105downscaling modes incorrect resolutions where requested to the sensor
 106driver with strange outcomes as a result. The proper way tot do this
 107would be to have a list of tables the specify the sensor res, mipi rec,
 108output res, and isp output res. however since we do not have this yet,
 109the chosen solution is the next best thing. */
 110int pad_w = 16;
 111module_param(pad_w, int, 0644);
 112MODULE_PARM_DESC(pad_w, "extra data for ISP processing");
 113
 114int pad_h = 16;
 115module_param(pad_h, int, 0644);
 116MODULE_PARM_DESC(pad_h, "extra data for ISP processing");
 117
 118/*
 119 * FIXME: this is a hack to make easier to support ISP2401 variant.
 120 * As a given system will either be ISP2401 or not, we can just use
 121 * a boolean, in order to replace existing #ifdef ISP2401 everywhere.
 122 *
 123 * Once this driver gets into a better shape, however, the best would
 124 * be to replace this to something stored inside atomisp allocated
 125 * structures.
 126 */
 127
 128struct device *atomisp_dev;
 129
 130static const struct atomisp_freq_scaling_rule dfs_rules_merr[] = {
 131        {
 132                .width = ISP_FREQ_RULE_ANY,
 133                .height = ISP_FREQ_RULE_ANY,
 134                .fps = ISP_FREQ_RULE_ANY,
 135                .isp_freq = ISP_FREQ_400MHZ,
 136                .run_mode = ATOMISP_RUN_MODE_VIDEO,
 137        },
 138        {
 139                .width = ISP_FREQ_RULE_ANY,
 140                .height = ISP_FREQ_RULE_ANY,
 141                .fps = ISP_FREQ_RULE_ANY,
 142                .isp_freq = ISP_FREQ_400MHZ,
 143                .run_mode = ATOMISP_RUN_MODE_STILL_CAPTURE,
 144        },
 145        {
 146                .width = ISP_FREQ_RULE_ANY,
 147                .height = ISP_FREQ_RULE_ANY,
 148                .fps = ISP_FREQ_RULE_ANY,
 149                .isp_freq = ISP_FREQ_400MHZ,
 150                .run_mode = ATOMISP_RUN_MODE_CONTINUOUS_CAPTURE,
 151        },
 152        {
 153                .width = ISP_FREQ_RULE_ANY,
 154                .height = ISP_FREQ_RULE_ANY,
 155                .fps = ISP_FREQ_RULE_ANY,
 156                .isp_freq = ISP_FREQ_400MHZ,
 157                .run_mode = ATOMISP_RUN_MODE_PREVIEW,
 158        },
 159        {
 160                .width = ISP_FREQ_RULE_ANY,
 161                .height = ISP_FREQ_RULE_ANY,
 162                .fps = ISP_FREQ_RULE_ANY,
 163                .isp_freq = ISP_FREQ_457MHZ,
 164                .run_mode = ATOMISP_RUN_MODE_SDV,
 165        },
 166};
 167
 168/* Merrifield and Moorefield DFS rules */
 169static const struct atomisp_dfs_config dfs_config_merr = {
 170        .lowest_freq = ISP_FREQ_200MHZ,
 171        .max_freq_at_vmin = ISP_FREQ_400MHZ,
 172        .highest_freq = ISP_FREQ_457MHZ,
 173        .dfs_table = dfs_rules_merr,
 174        .dfs_table_size = ARRAY_SIZE(dfs_rules_merr),
 175};
 176
 177static const struct atomisp_freq_scaling_rule dfs_rules_merr_1179[] = {
 178        {
 179                .width = ISP_FREQ_RULE_ANY,
 180                .height = ISP_FREQ_RULE_ANY,
 181                .fps = ISP_FREQ_RULE_ANY,
 182                .isp_freq = ISP_FREQ_400MHZ,
 183                .run_mode = ATOMISP_RUN_MODE_VIDEO,
 184        },
 185        {
 186                .width = ISP_FREQ_RULE_ANY,
 187                .height = ISP_FREQ_RULE_ANY,
 188                .fps = ISP_FREQ_RULE_ANY,
 189                .isp_freq = ISP_FREQ_400MHZ,
 190                .run_mode = ATOMISP_RUN_MODE_STILL_CAPTURE,
 191        },
 192        {
 193                .width = ISP_FREQ_RULE_ANY,
 194                .height = ISP_FREQ_RULE_ANY,
 195                .fps = ISP_FREQ_RULE_ANY,
 196                .isp_freq = ISP_FREQ_400MHZ,
 197                .run_mode = ATOMISP_RUN_MODE_CONTINUOUS_CAPTURE,
 198        },
 199        {
 200                .width = ISP_FREQ_RULE_ANY,
 201                .height = ISP_FREQ_RULE_ANY,
 202                .fps = ISP_FREQ_RULE_ANY,
 203                .isp_freq = ISP_FREQ_400MHZ,
 204                .run_mode = ATOMISP_RUN_MODE_PREVIEW,
 205        },
 206        {
 207                .width = ISP_FREQ_RULE_ANY,
 208                .height = ISP_FREQ_RULE_ANY,
 209                .fps = ISP_FREQ_RULE_ANY,
 210                .isp_freq = ISP_FREQ_400MHZ,
 211                .run_mode = ATOMISP_RUN_MODE_SDV,
 212        },
 213};
 214
 215static const struct atomisp_dfs_config dfs_config_merr_1179 = {
 216        .lowest_freq = ISP_FREQ_200MHZ,
 217        .max_freq_at_vmin = ISP_FREQ_400MHZ,
 218        .highest_freq = ISP_FREQ_400MHZ,
 219        .dfs_table = dfs_rules_merr_1179,
 220        .dfs_table_size = ARRAY_SIZE(dfs_rules_merr_1179),
 221};
 222
 223static const struct atomisp_freq_scaling_rule dfs_rules_merr_117a[] = {
 224        {
 225                .width = 1920,
 226                .height = 1080,
 227                .fps = 30,
 228                .isp_freq = ISP_FREQ_266MHZ,
 229                .run_mode = ATOMISP_RUN_MODE_VIDEO,
 230        },
 231        {
 232                .width = 1080,
 233                .height = 1920,
 234                .fps = 30,
 235                .isp_freq = ISP_FREQ_266MHZ,
 236                .run_mode = ATOMISP_RUN_MODE_VIDEO,
 237        },
 238        {
 239                .width = 1920,
 240                .height = 1080,
 241                .fps = 45,
 242                .isp_freq = ISP_FREQ_320MHZ,
 243                .run_mode = ATOMISP_RUN_MODE_VIDEO,
 244        },
 245        {
 246                .width = 1080,
 247                .height = 1920,
 248                .fps = 45,
 249                .isp_freq = ISP_FREQ_320MHZ,
 250                .run_mode = ATOMISP_RUN_MODE_VIDEO,
 251        },
 252        {
 253                .width = ISP_FREQ_RULE_ANY,
 254                .height = ISP_FREQ_RULE_ANY,
 255                .fps = 60,
 256                .isp_freq = ISP_FREQ_356MHZ,
 257                .run_mode = ATOMISP_RUN_MODE_VIDEO,
 258        },
 259        {
 260                .width = ISP_FREQ_RULE_ANY,
 261                .height = ISP_FREQ_RULE_ANY,
 262                .fps = ISP_FREQ_RULE_ANY,
 263                .isp_freq = ISP_FREQ_200MHZ,
 264                .run_mode = ATOMISP_RUN_MODE_VIDEO,
 265        },
 266        {
 267                .width = ISP_FREQ_RULE_ANY,
 268                .height = ISP_FREQ_RULE_ANY,
 269                .fps = ISP_FREQ_RULE_ANY,
 270                .isp_freq = ISP_FREQ_400MHZ,
 271                .run_mode = ATOMISP_RUN_MODE_STILL_CAPTURE,
 272        },
 273        {
 274                .width = ISP_FREQ_RULE_ANY,
 275                .height = ISP_FREQ_RULE_ANY,
 276                .fps = ISP_FREQ_RULE_ANY,
 277                .isp_freq = ISP_FREQ_400MHZ,
 278                .run_mode = ATOMISP_RUN_MODE_CONTINUOUS_CAPTURE,
 279        },
 280        {
 281                .width = ISP_FREQ_RULE_ANY,
 282                .height = ISP_FREQ_RULE_ANY,
 283                .fps = ISP_FREQ_RULE_ANY,
 284                .isp_freq = ISP_FREQ_200MHZ,
 285                .run_mode = ATOMISP_RUN_MODE_PREVIEW,
 286        },
 287        {
 288                .width = ISP_FREQ_RULE_ANY,
 289                .height = ISP_FREQ_RULE_ANY,
 290                .fps = ISP_FREQ_RULE_ANY,
 291                .isp_freq = ISP_FREQ_400MHZ,
 292                .run_mode = ATOMISP_RUN_MODE_SDV,
 293        },
 294};
 295
 296static struct atomisp_dfs_config dfs_config_merr_117a = {
 297        .lowest_freq = ISP_FREQ_200MHZ,
 298        .max_freq_at_vmin = ISP_FREQ_200MHZ,
 299        .highest_freq = ISP_FREQ_400MHZ,
 300        .dfs_table = dfs_rules_merr_117a,
 301        .dfs_table_size = ARRAY_SIZE(dfs_rules_merr_117a),
 302};
 303
 304static const struct atomisp_freq_scaling_rule dfs_rules_byt[] = {
 305        {
 306                .width = ISP_FREQ_RULE_ANY,
 307                .height = ISP_FREQ_RULE_ANY,
 308                .fps = ISP_FREQ_RULE_ANY,
 309                .isp_freq = ISP_FREQ_400MHZ,
 310                .run_mode = ATOMISP_RUN_MODE_VIDEO,
 311        },
 312        {
 313                .width = ISP_FREQ_RULE_ANY,
 314                .height = ISP_FREQ_RULE_ANY,
 315                .fps = ISP_FREQ_RULE_ANY,
 316                .isp_freq = ISP_FREQ_400MHZ,
 317                .run_mode = ATOMISP_RUN_MODE_STILL_CAPTURE,
 318        },
 319        {
 320                .width = ISP_FREQ_RULE_ANY,
 321                .height = ISP_FREQ_RULE_ANY,
 322                .fps = ISP_FREQ_RULE_ANY,
 323                .isp_freq = ISP_FREQ_400MHZ,
 324                .run_mode = ATOMISP_RUN_MODE_CONTINUOUS_CAPTURE,
 325        },
 326        {
 327                .width = ISP_FREQ_RULE_ANY,
 328                .height = ISP_FREQ_RULE_ANY,
 329                .fps = ISP_FREQ_RULE_ANY,
 330                .isp_freq = ISP_FREQ_400MHZ,
 331                .run_mode = ATOMISP_RUN_MODE_PREVIEW,
 332        },
 333        {
 334                .width = ISP_FREQ_RULE_ANY,
 335                .height = ISP_FREQ_RULE_ANY,
 336                .fps = ISP_FREQ_RULE_ANY,
 337                .isp_freq = ISP_FREQ_400MHZ,
 338                .run_mode = ATOMISP_RUN_MODE_SDV,
 339        },
 340};
 341
 342static const struct atomisp_dfs_config dfs_config_byt = {
 343        .lowest_freq = ISP_FREQ_200MHZ,
 344        .max_freq_at_vmin = ISP_FREQ_400MHZ,
 345        .highest_freq = ISP_FREQ_400MHZ,
 346        .dfs_table = dfs_rules_byt,
 347        .dfs_table_size = ARRAY_SIZE(dfs_rules_byt),
 348};
 349
 350static const struct atomisp_freq_scaling_rule dfs_rules_cht[] = {
 351        {
 352                .width = ISP_FREQ_RULE_ANY,
 353                .height = ISP_FREQ_RULE_ANY,
 354                .fps = ISP_FREQ_RULE_ANY,
 355                .isp_freq = ISP_FREQ_320MHZ,
 356                .run_mode = ATOMISP_RUN_MODE_VIDEO,
 357        },
 358        {
 359                .width = ISP_FREQ_RULE_ANY,
 360                .height = ISP_FREQ_RULE_ANY,
 361                .fps = ISP_FREQ_RULE_ANY,
 362                .isp_freq = ISP_FREQ_356MHZ,
 363                .run_mode = ATOMISP_RUN_MODE_STILL_CAPTURE,
 364        },
 365        {
 366                .width = ISP_FREQ_RULE_ANY,
 367                .height = ISP_FREQ_RULE_ANY,
 368                .fps = ISP_FREQ_RULE_ANY,
 369                .isp_freq = ISP_FREQ_320MHZ,
 370                .run_mode = ATOMISP_RUN_MODE_CONTINUOUS_CAPTURE,
 371        },
 372        {
 373                .width = ISP_FREQ_RULE_ANY,
 374                .height = ISP_FREQ_RULE_ANY,
 375                .fps = ISP_FREQ_RULE_ANY,
 376                .isp_freq = ISP_FREQ_320MHZ,
 377                .run_mode = ATOMISP_RUN_MODE_PREVIEW,
 378        },
 379        {
 380                .width = 1280,
 381                .height = 720,
 382                .fps = ISP_FREQ_RULE_ANY,
 383                .isp_freq = ISP_FREQ_320MHZ,
 384                .run_mode = ATOMISP_RUN_MODE_SDV,
 385        },
 386        {
 387                .width = ISP_FREQ_RULE_ANY,
 388                .height = ISP_FREQ_RULE_ANY,
 389                .fps = ISP_FREQ_RULE_ANY,
 390                .isp_freq = ISP_FREQ_356MHZ,
 391                .run_mode = ATOMISP_RUN_MODE_SDV,
 392        },
 393};
 394
 395static const struct atomisp_freq_scaling_rule dfs_rules_cht_soc[] = {
 396        {
 397                .width = ISP_FREQ_RULE_ANY,
 398                .height = ISP_FREQ_RULE_ANY,
 399                .fps = ISP_FREQ_RULE_ANY,
 400                .isp_freq = ISP_FREQ_356MHZ,
 401                .run_mode = ATOMISP_RUN_MODE_VIDEO,
 402        },
 403        {
 404                .width = ISP_FREQ_RULE_ANY,
 405                .height = ISP_FREQ_RULE_ANY,
 406                .fps = ISP_FREQ_RULE_ANY,
 407                .isp_freq = ISP_FREQ_356MHZ,
 408                .run_mode = ATOMISP_RUN_MODE_STILL_CAPTURE,
 409        },
 410        {
 411                .width = ISP_FREQ_RULE_ANY,
 412                .height = ISP_FREQ_RULE_ANY,
 413                .fps = ISP_FREQ_RULE_ANY,
 414                .isp_freq = ISP_FREQ_320MHZ,
 415                .run_mode = ATOMISP_RUN_MODE_CONTINUOUS_CAPTURE,
 416        },
 417        {
 418                .width = ISP_FREQ_RULE_ANY,
 419                .height = ISP_FREQ_RULE_ANY,
 420                .fps = ISP_FREQ_RULE_ANY,
 421                .isp_freq = ISP_FREQ_320MHZ,
 422                .run_mode = ATOMISP_RUN_MODE_PREVIEW,
 423        },
 424        {
 425                .width = ISP_FREQ_RULE_ANY,
 426                .height = ISP_FREQ_RULE_ANY,
 427                .fps = ISP_FREQ_RULE_ANY,
 428                .isp_freq = ISP_FREQ_356MHZ,
 429                .run_mode = ATOMISP_RUN_MODE_SDV,
 430        },
 431};
 432
 433static const struct atomisp_dfs_config dfs_config_cht = {
 434        .lowest_freq = ISP_FREQ_100MHZ,
 435        .max_freq_at_vmin = ISP_FREQ_356MHZ,
 436        .highest_freq = ISP_FREQ_356MHZ,
 437        .dfs_table = dfs_rules_cht,
 438        .dfs_table_size = ARRAY_SIZE(dfs_rules_cht),
 439};
 440
 441/* This one should be visible also by atomisp_cmd.c */
 442const struct atomisp_dfs_config dfs_config_cht_soc = {
 443        .lowest_freq = ISP_FREQ_100MHZ,
 444        .max_freq_at_vmin = ISP_FREQ_356MHZ,
 445        .highest_freq = ISP_FREQ_356MHZ,
 446        .dfs_table = dfs_rules_cht_soc,
 447        .dfs_table_size = ARRAY_SIZE(dfs_rules_cht_soc),
 448};
 449
 450int atomisp_video_init(struct atomisp_video_pipe *video, const char *name)
 451{
 452        int ret;
 453        const char *direction;
 454
 455        switch (video->type) {
 456        case V4L2_BUF_TYPE_VIDEO_CAPTURE:
 457                direction = "output";
 458                video->pad.flags = MEDIA_PAD_FL_SINK;
 459                video->vdev.fops = &atomisp_fops;
 460                video->vdev.ioctl_ops = &atomisp_ioctl_ops;
 461                break;
 462        case V4L2_BUF_TYPE_VIDEO_OUTPUT:
 463                direction = "input";
 464                video->pad.flags = MEDIA_PAD_FL_SOURCE;
 465                video->vdev.fops = &atomisp_file_fops;
 466                video->vdev.ioctl_ops = &atomisp_file_ioctl_ops;
 467                break;
 468        default:
 469                return -EINVAL;
 470        }
 471
 472        ret = media_entity_pads_init(&video->vdev.entity, 1, &video->pad);
 473        if (ret < 0)
 474                return ret;
 475
 476        /* Initialize the video device. */
 477        snprintf(video->vdev.name, sizeof(video->vdev.name),
 478                 "ATOMISP ISP %s %s", name, direction);
 479        video->vdev.release = video_device_release_empty;
 480        video_set_drvdata(&video->vdev, video->isp);
 481
 482        return 0;
 483}
 484
 485void atomisp_acc_init(struct atomisp_acc_pipe *video, const char *name)
 486{
 487        video->vdev.fops = &atomisp_fops;
 488        video->vdev.ioctl_ops = &atomisp_ioctl_ops;
 489
 490        /* Initialize the video device. */
 491        snprintf(video->vdev.name, sizeof(video->vdev.name),
 492                 "ATOMISP ISP %s", name);
 493        video->vdev.release = video_device_release_empty;
 494        video_set_drvdata(&video->vdev, video->isp);
 495}
 496
 497void atomisp_video_unregister(struct atomisp_video_pipe *video)
 498{
 499        if (video_is_registered(&video->vdev)) {
 500                media_entity_cleanup(&video->vdev.entity);
 501                video_unregister_device(&video->vdev);
 502        }
 503}
 504
 505void atomisp_acc_unregister(struct atomisp_acc_pipe *video)
 506{
 507        if (video_is_registered(&video->vdev))
 508                video_unregister_device(&video->vdev);
 509}
 510
 511static int atomisp_save_iunit_reg(struct atomisp_device *isp)
 512{
 513        struct pci_dev *pdev = to_pci_dev(isp->dev);
 514
 515        dev_dbg(isp->dev, "%s\n", __func__);
 516
 517        pci_read_config_word(pdev, PCI_COMMAND, &isp->saved_regs.pcicmdsts);
 518        /* isp->saved_regs.ispmmadr is set from the atomisp_pci_probe() */
 519        pci_read_config_dword(pdev, PCI_MSI_CAPID, &isp->saved_regs.msicap);
 520        pci_read_config_dword(pdev, PCI_MSI_ADDR, &isp->saved_regs.msi_addr);
 521        pci_read_config_word(pdev, PCI_MSI_DATA,  &isp->saved_regs.msi_data);
 522        pci_read_config_byte(pdev, PCI_INTERRUPT_LINE, &isp->saved_regs.intr);
 523        pci_read_config_dword(pdev, PCI_INTERRUPT_CTRL, &isp->saved_regs.interrupt_control);
 524
 525        pci_read_config_dword(pdev, MRFLD_PCI_PMCS, &isp->saved_regs.pmcs);
 526        /* Ensure read/write combining is enabled. */
 527        pci_read_config_dword(pdev, PCI_I_CONTROL, &isp->saved_regs.i_control);
 528        isp->saved_regs.i_control |=
 529            MRFLD_PCI_I_CONTROL_ENABLE_READ_COMBINING |
 530            MRFLD_PCI_I_CONTROL_ENABLE_WRITE_COMBINING;
 531        pci_read_config_dword(pdev, MRFLD_PCI_CSI_ACCESS_CTRL_VIOL,
 532                              &isp->saved_regs.csi_access_viol);
 533        pci_read_config_dword(pdev, MRFLD_PCI_CSI_RCOMP_CONTROL,
 534                              &isp->saved_regs.csi_rcomp_config);
 535        /*
 536         * Hardware bugs require setting CSI_HS_OVR_CLK_GATE_ON_UPDATE.
 537         * ANN/CHV: RCOMP updates do not happen when using CSI2+ path
 538         * and sensor sending "continuous clock".
 539         * TNG/ANN/CHV: MIPI packets are lost if the HS entry sequence
 540         * is missed, and IUNIT can hang.
 541         * For both issues, setting this bit is a workaround.
 542         */
 543        isp->saved_regs.csi_rcomp_config |= MRFLD_PCI_CSI_HS_OVR_CLK_GATE_ON_UPDATE;
 544        pci_read_config_dword(pdev, MRFLD_PCI_CSI_AFE_TRIM_CONTROL,
 545                              &isp->saved_regs.csi_afe_dly);
 546        pci_read_config_dword(pdev, MRFLD_PCI_CSI_CONTROL,
 547                              &isp->saved_regs.csi_control);
 548        if (isp->media_dev.hw_revision >=
 549            (ATOMISP_HW_REVISION_ISP2401 << ATOMISP_HW_REVISION_SHIFT))
 550                isp->saved_regs.csi_control |= MRFLD_PCI_CSI_CONTROL_PARPATHEN;
 551        /*
 552         * On CHT CSI_READY bit should be enabled before stream on
 553         */
 554        if (IS_CHT && (isp->media_dev.hw_revision >= ((ATOMISP_HW_REVISION_ISP2401 <<
 555                       ATOMISP_HW_REVISION_SHIFT) | ATOMISP_HW_STEPPING_B0)))
 556                isp->saved_regs.csi_control |= MRFLD_PCI_CSI_CONTROL_CSI_READY;
 557        pci_read_config_dword(pdev, MRFLD_PCI_CSI_AFE_RCOMP_CONTROL,
 558                              &isp->saved_regs.csi_afe_rcomp_config);
 559        pci_read_config_dword(pdev, MRFLD_PCI_CSI_AFE_HS_CONTROL,
 560                              &isp->saved_regs.csi_afe_hs_control);
 561        pci_read_config_dword(pdev, MRFLD_PCI_CSI_DEADLINE_CONTROL,
 562                              &isp->saved_regs.csi_deadline_control);
 563        return 0;
 564}
 565
 566static int __maybe_unused atomisp_restore_iunit_reg(struct atomisp_device *isp)
 567{
 568        struct pci_dev *pdev = to_pci_dev(isp->dev);
 569
 570        dev_dbg(isp->dev, "%s\n", __func__);
 571
 572        pci_write_config_word(pdev, PCI_COMMAND, isp->saved_regs.pcicmdsts);
 573        pci_write_config_dword(pdev, PCI_BASE_ADDRESS_0, isp->saved_regs.ispmmadr);
 574        pci_write_config_dword(pdev, PCI_MSI_CAPID, isp->saved_regs.msicap);
 575        pci_write_config_dword(pdev, PCI_MSI_ADDR, isp->saved_regs.msi_addr);
 576        pci_write_config_word(pdev, PCI_MSI_DATA, isp->saved_regs.msi_data);
 577        pci_write_config_byte(pdev, PCI_INTERRUPT_LINE, isp->saved_regs.intr);
 578        pci_write_config_dword(pdev, PCI_INTERRUPT_CTRL, isp->saved_regs.interrupt_control);
 579        pci_write_config_dword(pdev, PCI_I_CONTROL, isp->saved_regs.i_control);
 580
 581        pci_write_config_dword(pdev, MRFLD_PCI_PMCS, isp->saved_regs.pmcs);
 582        pci_write_config_dword(pdev, MRFLD_PCI_CSI_ACCESS_CTRL_VIOL,
 583                               isp->saved_regs.csi_access_viol);
 584        pci_write_config_dword(pdev, MRFLD_PCI_CSI_RCOMP_CONTROL,
 585                               isp->saved_regs.csi_rcomp_config);
 586        pci_write_config_dword(pdev, MRFLD_PCI_CSI_AFE_TRIM_CONTROL,
 587                               isp->saved_regs.csi_afe_dly);
 588        pci_write_config_dword(pdev, MRFLD_PCI_CSI_CONTROL,
 589                               isp->saved_regs.csi_control);
 590        pci_write_config_dword(pdev, MRFLD_PCI_CSI_AFE_RCOMP_CONTROL,
 591                               isp->saved_regs.csi_afe_rcomp_config);
 592        pci_write_config_dword(pdev, MRFLD_PCI_CSI_AFE_HS_CONTROL,
 593                               isp->saved_regs.csi_afe_hs_control);
 594        pci_write_config_dword(pdev, MRFLD_PCI_CSI_DEADLINE_CONTROL,
 595                               isp->saved_regs.csi_deadline_control);
 596
 597        /*
 598         * for MRFLD, Software/firmware needs to write a 1 to bit0
 599         * of the register at CSI_RECEIVER_SELECTION_REG to enable
 600         * SH CSI backend write 0 will enable Arasan CSI backend,
 601         * which has bugs(like sighting:4567697 and 4567699) and
 602         * will be removed in B0
 603         */
 604        atomisp_css2_hw_store_32(MRFLD_CSI_RECEIVER_SELECTION_REG, 1);
 605        return 0;
 606}
 607
 608static int atomisp_mrfld_pre_power_down(struct atomisp_device *isp)
 609{
 610        struct pci_dev *pdev = to_pci_dev(isp->dev);
 611        u32 irq;
 612        unsigned long flags;
 613
 614        spin_lock_irqsave(&isp->lock, flags);
 615        if (isp->sw_contex.power_state == ATOM_ISP_POWER_DOWN) {
 616                spin_unlock_irqrestore(&isp->lock, flags);
 617                dev_dbg(isp->dev, "<%s %d.\n", __func__, __LINE__);
 618                return 0;
 619        }
 620        /*
 621         * MRFLD HAS requirement: cannot power off i-unit if
 622         * ISP has IRQ not serviced.
 623         * So, here we need to check if there is any pending
 624         * IRQ, if so, waiting for it to be served
 625         */
 626        pci_read_config_dword(pdev, PCI_INTERRUPT_CTRL, &irq);
 627        irq = irq & 1 << INTR_IIR;
 628        pci_write_config_dword(pdev, PCI_INTERRUPT_CTRL, irq);
 629
 630        pci_read_config_dword(pdev, PCI_INTERRUPT_CTRL, &irq);
 631        if (!(irq & (1 << INTR_IIR)))
 632                goto done;
 633
 634        atomisp_css2_hw_store_32(MRFLD_INTR_CLEAR_REG, 0xFFFFFFFF);
 635        atomisp_load_uint32(MRFLD_INTR_STATUS_REG, &irq);
 636        if (irq != 0) {
 637                dev_err(isp->dev,
 638                        "%s: fail to clear isp interrupt status reg=0x%x\n",
 639                        __func__, irq);
 640                spin_unlock_irqrestore(&isp->lock, flags);
 641                return -EAGAIN;
 642        } else {
 643                pci_read_config_dword(pdev, PCI_INTERRUPT_CTRL, &irq);
 644                irq = irq & 1 << INTR_IIR;
 645                pci_write_config_dword(pdev, PCI_INTERRUPT_CTRL, irq);
 646
 647                pci_read_config_dword(pdev, PCI_INTERRUPT_CTRL, &irq);
 648                if (!(irq & (1 << INTR_IIR))) {
 649                        atomisp_css2_hw_store_32(MRFLD_INTR_ENABLE_REG, 0x0);
 650                        goto done;
 651                }
 652                dev_err(isp->dev,
 653                        "%s: error in iunit interrupt. status reg=0x%x\n",
 654                        __func__, irq);
 655                spin_unlock_irqrestore(&isp->lock, flags);
 656                return -EAGAIN;
 657        }
 658done:
 659        /*
 660        * MRFLD WORKAROUND:
 661        * before powering off IUNIT, clear the pending interrupts
 662        * and disable the interrupt. driver should avoid writing 0
 663        * to IIR. It could block subsequent interrupt messages.
 664        * HW sighting:4568410.
 665        */
 666        pci_read_config_dword(pdev, PCI_INTERRUPT_CTRL, &irq);
 667        irq &= ~(1 << INTR_IER);
 668        pci_write_config_dword(pdev, PCI_INTERRUPT_CTRL, irq);
 669
 670        atomisp_msi_irq_uninit(isp);
 671        atomisp_freq_scaling(isp, ATOMISP_DFS_MODE_LOW, true);
 672        spin_unlock_irqrestore(&isp->lock, flags);
 673
 674        return 0;
 675}
 676
 677/*
 678* WA for DDR DVFS enable/disable
 679* By default, ISP will force DDR DVFS 1600MHz before disable DVFS
 680*/
 681static void punit_ddr_dvfs_enable(bool enable)
 682{
 683        int door_bell = 1 << 8;
 684        int max_wait = 30;
 685        int reg;
 686
 687        iosf_mbi_read(BT_MBI_UNIT_PMC, MBI_REG_READ, MRFLD_ISPSSDVFS, &reg);
 688        if (enable) {
 689                reg &= ~(MRFLD_BIT0 | MRFLD_BIT1);
 690        } else {
 691                reg |= (MRFLD_BIT1 | door_bell);
 692                reg &= ~(MRFLD_BIT0);
 693        }
 694        iosf_mbi_write(BT_MBI_UNIT_PMC, MBI_REG_WRITE, MRFLD_ISPSSDVFS, reg);
 695
 696        /* Check Req_ACK to see freq status, wait until door_bell is cleared */
 697        while ((reg & door_bell) && max_wait--) {
 698                iosf_mbi_read(BT_MBI_UNIT_PMC, MBI_REG_READ, MRFLD_ISPSSDVFS, &reg);
 699                usleep_range(100, 500);
 700        }
 701
 702        if (max_wait == -1)
 703                pr_info("DDR DVFS, door bell is not cleared within 3ms\n");
 704}
 705
 706static int atomisp_mrfld_power(struct atomisp_device *isp, bool enable)
 707{
 708        unsigned long timeout;
 709        u32 val = enable ? MRFLD_ISPSSPM0_IUNIT_POWER_ON :
 710                           MRFLD_ISPSSPM0_IUNIT_POWER_OFF;
 711
 712        dev_dbg(isp->dev, "IUNIT power-%s.\n", enable ? "on" : "off");
 713
 714        /*WA:Enable DVFS*/
 715        if (IS_CHT && enable)
 716                punit_ddr_dvfs_enable(true);
 717
 718        /*
 719         * FIXME:WA for ECS28A, with this sleep, CTS
 720         * android.hardware.camera2.cts.CameraDeviceTest#testCameraDeviceAbort
 721         * PASS, no impact on other platforms
 722        */
 723        if (IS_BYT && enable)
 724                msleep(10);
 725
 726        /* Write to ISPSSPM0 bit[1:0] to power on/off the IUNIT */
 727        iosf_mbi_modify(BT_MBI_UNIT_PMC, MBI_REG_READ, MRFLD_ISPSSPM0,
 728                        val, MRFLD_ISPSSPM0_ISPSSC_MASK);
 729
 730        /*WA:Enable DVFS*/
 731        if (IS_CHT && !enable)
 732                punit_ddr_dvfs_enable(true);
 733
 734        /*
 735         * There should be no IUNIT access while power-down is
 736         * in progress. HW sighting: 4567865.
 737         * Wait up to 50 ms for the IUNIT to shut down.
 738         * And we do the same for power on.
 739         */
 740        timeout = jiffies + msecs_to_jiffies(50);
 741        do {
 742                u32 tmp;
 743
 744                /* Wait until ISPSSPM0 bit[25:24] shows the right value */
 745                iosf_mbi_read(BT_MBI_UNIT_PMC, MBI_REG_READ, MRFLD_ISPSSPM0, &tmp);
 746                tmp = (tmp >> MRFLD_ISPSSPM0_ISPSSS_OFFSET) & MRFLD_ISPSSPM0_ISPSSC_MASK;
 747                if (tmp == val) {
 748                        trace_ipu_cstate(enable);
 749                        return 0;
 750                }
 751
 752                if (time_after(jiffies, timeout))
 753                        break;
 754
 755                /* FIXME: experienced value for delay */
 756                usleep_range(100, 150);
 757        } while (1);
 758
 759        if (enable)
 760                msleep(10);
 761
 762        dev_err(isp->dev, "IUNIT power-%s timeout.\n", enable ? "on" : "off");
 763        return -EBUSY;
 764}
 765
 766/* Workaround for pmu_nc_set_power_state not ready in MRFLD */
 767int atomisp_mrfld_power_down(struct atomisp_device *isp)
 768{
 769        return atomisp_mrfld_power(isp, false);
 770}
 771
 772/* Workaround for pmu_nc_set_power_state not ready in MRFLD */
 773int atomisp_mrfld_power_up(struct atomisp_device *isp)
 774{
 775        return atomisp_mrfld_power(isp, true);
 776}
 777
 778int atomisp_runtime_suspend(struct device *dev)
 779{
 780        struct atomisp_device *isp = (struct atomisp_device *)
 781                                     dev_get_drvdata(dev);
 782        int ret;
 783
 784        ret = atomisp_mrfld_pre_power_down(isp);
 785        if (ret)
 786                return ret;
 787
 788        /*Turn off the ISP d-phy*/
 789        ret = atomisp_ospm_dphy_down(isp);
 790        if (ret)
 791                return ret;
 792        cpu_latency_qos_update_request(&isp->pm_qos, PM_QOS_DEFAULT_VALUE);
 793        return atomisp_mrfld_power_down(isp);
 794}
 795
 796int atomisp_runtime_resume(struct device *dev)
 797{
 798        struct atomisp_device *isp = (struct atomisp_device *)
 799                                     dev_get_drvdata(dev);
 800        int ret;
 801
 802        ret = atomisp_mrfld_power_up(isp);
 803        if (ret)
 804                return ret;
 805
 806        cpu_latency_qos_update_request(&isp->pm_qos, isp->max_isr_latency);
 807        if (isp->sw_contex.power_state == ATOM_ISP_POWER_DOWN) {
 808                /*Turn on ISP d-phy */
 809                ret = atomisp_ospm_dphy_up(isp);
 810                if (ret) {
 811                        dev_err(isp->dev, "Failed to power up ISP!.\n");
 812                        return -EINVAL;
 813                }
 814        }
 815
 816        /*restore register values for iUnit and iUnitPHY registers*/
 817        if (isp->saved_regs.pcicmdsts)
 818                atomisp_restore_iunit_reg(isp);
 819
 820        atomisp_freq_scaling(isp, ATOMISP_DFS_MODE_LOW, true);
 821        return 0;
 822}
 823
 824static int __maybe_unused atomisp_suspend(struct device *dev)
 825{
 826        struct atomisp_device *isp = (struct atomisp_device *)
 827                                     dev_get_drvdata(dev);
 828        /* FIXME: only has one isp_subdev at present */
 829        struct atomisp_sub_device *asd = &isp->asd[0];
 830        unsigned long flags;
 831        int ret;
 832
 833        /*
 834         * FIXME: Suspend is not supported by sensors. Abort if any video
 835         * node was opened.
 836         */
 837        if (atomisp_dev_users(isp))
 838                return -EBUSY;
 839
 840        spin_lock_irqsave(&isp->lock, flags);
 841        if (asd->streaming != ATOMISP_DEVICE_STREAMING_DISABLED) {
 842                spin_unlock_irqrestore(&isp->lock, flags);
 843                dev_err(isp->dev, "atomisp cannot suspend at this time.\n");
 844                return -EINVAL;
 845        }
 846        spin_unlock_irqrestore(&isp->lock, flags);
 847
 848        ret = atomisp_mrfld_pre_power_down(isp);
 849        if (ret)
 850                return ret;
 851
 852        /*Turn off the ISP d-phy */
 853        ret = atomisp_ospm_dphy_down(isp);
 854        if (ret) {
 855                dev_err(isp->dev, "fail to power off ISP\n");
 856                return ret;
 857        }
 858        cpu_latency_qos_update_request(&isp->pm_qos, PM_QOS_DEFAULT_VALUE);
 859        return atomisp_mrfld_power_down(isp);
 860}
 861
 862static int __maybe_unused atomisp_resume(struct device *dev)
 863{
 864        struct atomisp_device *isp = (struct atomisp_device *)
 865                                     dev_get_drvdata(dev);
 866        int ret;
 867
 868        ret = atomisp_mrfld_power_up(isp);
 869        if (ret)
 870                return ret;
 871
 872        cpu_latency_qos_update_request(&isp->pm_qos, isp->max_isr_latency);
 873
 874        /*Turn on ISP d-phy */
 875        ret = atomisp_ospm_dphy_up(isp);
 876        if (ret) {
 877                dev_err(isp->dev, "Failed to power up ISP!.\n");
 878                return -EINVAL;
 879        }
 880
 881        /*restore register values for iUnit and iUnitPHY registers*/
 882        if (isp->saved_regs.pcicmdsts)
 883                atomisp_restore_iunit_reg(isp);
 884
 885        atomisp_freq_scaling(isp, ATOMISP_DFS_MODE_LOW, true);
 886        return 0;
 887}
 888
 889int atomisp_csi_lane_config(struct atomisp_device *isp)
 890{
 891        struct pci_dev *pdev = to_pci_dev(isp->dev);
 892        static const struct {
 893                u8 code;
 894                u8 lanes[MRFLD_PORT_NUM];
 895        } portconfigs[] = {
 896                /* Tangier/Merrifield available lane configurations */
 897                { 0x00, { 4, 1, 0 } },          /* 00000 */
 898                { 0x01, { 3, 1, 0 } },          /* 00001 */
 899                { 0x02, { 2, 1, 0 } },          /* 00010 */
 900                { 0x03, { 1, 1, 0 } },          /* 00011 */
 901                { 0x04, { 2, 1, 2 } },          /* 00100 */
 902                { 0x08, { 3, 1, 1 } },          /* 01000 */
 903                { 0x09, { 2, 1, 1 } },          /* 01001 */
 904                { 0x0a, { 1, 1, 1 } },          /* 01010 */
 905
 906                /* Anniedale/Moorefield only configurations */
 907                { 0x10, { 4, 2, 0 } },          /* 10000 */
 908                { 0x11, { 3, 2, 0 } },          /* 10001 */
 909                { 0x12, { 2, 2, 0 } },          /* 10010 */
 910                { 0x13, { 1, 2, 0 } },          /* 10011 */
 911                { 0x14, { 2, 2, 2 } },          /* 10100 */
 912                { 0x18, { 3, 2, 1 } },          /* 11000 */
 913                { 0x19, { 2, 2, 1 } },          /* 11001 */
 914                { 0x1a, { 1, 2, 1 } },          /* 11010 */
 915        };
 916
 917        unsigned int i, j;
 918        u8 sensor_lanes[MRFLD_PORT_NUM] = { 0 };
 919        u32 csi_control;
 920        int nportconfigs;
 921        u32 port_config_mask;
 922        int port3_lanes_shift;
 923
 924        if (isp->media_dev.hw_revision <
 925            ATOMISP_HW_REVISION_ISP2401_LEGACY <<
 926            ATOMISP_HW_REVISION_SHIFT) {
 927                /* Merrifield */
 928                port_config_mask = MRFLD_PORT_CONFIG_MASK;
 929                port3_lanes_shift = MRFLD_PORT3_LANES_SHIFT;
 930        } else {
 931                /* Moorefield / Cherryview */
 932                port_config_mask = CHV_PORT_CONFIG_MASK;
 933                port3_lanes_shift = CHV_PORT3_LANES_SHIFT;
 934        }
 935
 936        if (isp->media_dev.hw_revision <
 937            ATOMISP_HW_REVISION_ISP2401 <<
 938            ATOMISP_HW_REVISION_SHIFT) {
 939                /* Merrifield / Moorefield legacy input system */
 940                nportconfigs = MRFLD_PORT_CONFIG_NUM;
 941        } else {
 942                /* Moorefield / Cherryview new input system */
 943                nportconfigs = ARRAY_SIZE(portconfigs);
 944        }
 945
 946        for (i = 0; i < isp->input_cnt; i++) {
 947                struct camera_mipi_info *mipi_info;
 948
 949                if (isp->inputs[i].type != RAW_CAMERA &&
 950                    isp->inputs[i].type != SOC_CAMERA)
 951                        continue;
 952
 953                mipi_info = atomisp_to_sensor_mipi_info(isp->inputs[i].camera);
 954                if (!mipi_info)
 955                        continue;
 956
 957                switch (mipi_info->port) {
 958                case ATOMISP_CAMERA_PORT_PRIMARY:
 959                        sensor_lanes[0] = mipi_info->num_lanes;
 960                        break;
 961                case ATOMISP_CAMERA_PORT_SECONDARY:
 962                        sensor_lanes[1] = mipi_info->num_lanes;
 963                        break;
 964                case ATOMISP_CAMERA_PORT_TERTIARY:
 965                        sensor_lanes[2] = mipi_info->num_lanes;
 966                        break;
 967                default:
 968                        dev_err(isp->dev,
 969                                "%s: invalid port: %d for the %dth sensor\n",
 970                                __func__, mipi_info->port, i);
 971                        return -EINVAL;
 972                }
 973        }
 974
 975        for (i = 0; i < nportconfigs; i++) {
 976                for (j = 0; j < MRFLD_PORT_NUM; j++)
 977                        if (sensor_lanes[j] &&
 978                            sensor_lanes[j] != portconfigs[i].lanes[j])
 979                                break;
 980
 981                if (j == MRFLD_PORT_NUM)
 982                        break;                  /* Found matching setting */
 983        }
 984
 985        if (i >= nportconfigs) {
 986                dev_err(isp->dev,
 987                        "%s: could not find the CSI port setting for %d-%d-%d\n",
 988                        __func__,
 989                        sensor_lanes[0], sensor_lanes[1], sensor_lanes[2]);
 990                return -EINVAL;
 991        }
 992
 993        pci_read_config_dword(pdev, MRFLD_PCI_CSI_CONTROL, &csi_control);
 994        csi_control &= ~port_config_mask;
 995        csi_control |= (portconfigs[i].code << MRFLD_PORT_CONFIGCODE_SHIFT)
 996                       | (portconfigs[i].lanes[0] ? 0 : (1 << MRFLD_PORT1_ENABLE_SHIFT))
 997                       | (portconfigs[i].lanes[1] ? 0 : (1 << MRFLD_PORT2_ENABLE_SHIFT))
 998                       | (portconfigs[i].lanes[2] ? 0 : (1 << MRFLD_PORT3_ENABLE_SHIFT))
 999                       | (((1 << portconfigs[i].lanes[0]) - 1) << MRFLD_PORT1_LANES_SHIFT)
1000                       | (((1 << portconfigs[i].lanes[1]) - 1) << MRFLD_PORT2_LANES_SHIFT)
1001                       | (((1 << portconfigs[i].lanes[2]) - 1) << port3_lanes_shift);
1002
1003        pci_write_config_dword(pdev, MRFLD_PCI_CSI_CONTROL, csi_control);
1004
1005        dev_dbg(isp->dev,
1006                "%s: the portconfig is %d-%d-%d, CSI_CONTROL is 0x%08X\n",
1007                __func__, portconfigs[i].lanes[0], portconfigs[i].lanes[1],
1008                portconfigs[i].lanes[2], csi_control);
1009
1010        return 0;
1011}
1012
1013static int atomisp_subdev_probe(struct atomisp_device *isp)
1014{
1015        const struct atomisp_platform_data *pdata;
1016        struct intel_v4l2_subdev_table *subdevs;
1017        int ret, raw_index = -1, count;
1018
1019        pdata = atomisp_get_platform_data();
1020        if (!pdata) {
1021                dev_err(isp->dev, "no platform data available\n");
1022                return 0;
1023        }
1024
1025        /* FIXME: should return -EPROBE_DEFER if not all subdevs were probed */
1026        for (count = 0; count < SUBDEV_WAIT_TIMEOUT_MAX_COUNT; count++) {
1027                int camera_count = 0;
1028
1029                for (subdevs = pdata->subdevs; subdevs->type; ++subdevs) {
1030                        if (subdevs->type == RAW_CAMERA ||
1031                            subdevs->type == SOC_CAMERA)
1032                                camera_count++;
1033                }
1034                if (camera_count)
1035                        break;
1036                msleep(SUBDEV_WAIT_TIMEOUT);
1037        }
1038        /* Wait more time to give more time for subdev init code to finish */
1039        msleep(5 * SUBDEV_WAIT_TIMEOUT);
1040
1041        /* FIXME: should, instead, use I2C probe */
1042
1043        for (subdevs = pdata->subdevs; subdevs->type; ++subdevs) {
1044                struct v4l2_subdev *subdev;
1045                struct i2c_board_info *board_info =
1046                            &subdevs->v4l2_subdev.board_info;
1047                struct i2c_adapter *adapter =
1048                    i2c_get_adapter(subdevs->v4l2_subdev.i2c_adapter_id);
1049                int sensor_num, i;
1050
1051                dev_info(isp->dev, "Probing Subdev %s\n", board_info->type);
1052
1053                if (!adapter) {
1054                        dev_err(isp->dev,
1055                                "Failed to find i2c adapter for subdev %s\n",
1056                                board_info->type);
1057                        break;
1058                }
1059
1060                /* In G-Min, the sensor devices will already be probed
1061                 * (via ACPI) and registered, do not create new
1062                 * ones */
1063                subdev = atomisp_gmin_find_subdev(adapter, board_info);
1064                if (!subdev) {
1065                        dev_warn(isp->dev, "Subdev %s not found\n",
1066                                 board_info->type);
1067                        continue;
1068                }
1069                ret = v4l2_device_register_subdev(&isp->v4l2_dev, subdev);
1070                if (ret) {
1071                        dev_warn(isp->dev, "Subdev %s detection fail\n",
1072                                 board_info->type);
1073                        continue;
1074                }
1075
1076                if (!subdev) {
1077                        dev_warn(isp->dev, "Subdev %s detection fail\n",
1078                                 board_info->type);
1079                        continue;
1080                }
1081
1082                dev_info(isp->dev, "Subdev %s successfully register\n",
1083                         board_info->type);
1084
1085                switch (subdevs->type) {
1086                case RAW_CAMERA:
1087                        dev_dbg(isp->dev, "raw_index: %d\n", raw_index);
1088                        raw_index = isp->input_cnt;
1089                        fallthrough;
1090                case SOC_CAMERA:
1091                        dev_dbg(isp->dev, "SOC_INDEX: %d\n", isp->input_cnt);
1092                        if (isp->input_cnt >= ATOM_ISP_MAX_INPUTS) {
1093                                dev_warn(isp->dev,
1094                                         "too many atomisp inputs, ignored\n");
1095                                break;
1096                        }
1097
1098                        isp->inputs[isp->input_cnt].type = subdevs->type;
1099                        isp->inputs[isp->input_cnt].port = subdevs->port;
1100                        isp->inputs[isp->input_cnt].camera = subdev;
1101                        isp->inputs[isp->input_cnt].sensor_index = 0;
1102                        /*
1103                         * initialize the subdev frame size, then next we can
1104                         * judge whether frame_size store effective value via
1105                         * pixel_format.
1106                         */
1107                        isp->inputs[isp->input_cnt].frame_size.pixel_format = 0;
1108                        isp->inputs[isp->input_cnt].camera_caps =
1109                            atomisp_get_default_camera_caps();
1110                        sensor_num = isp->inputs[isp->input_cnt]
1111                                     .camera_caps->sensor_num;
1112                        isp->input_cnt++;
1113                        for (i = 1; i < sensor_num; i++) {
1114                                if (isp->input_cnt >= ATOM_ISP_MAX_INPUTS) {
1115                                        dev_warn(isp->dev,
1116                                                 "atomisp inputs out of range\n");
1117                                        break;
1118                                }
1119                                isp->inputs[isp->input_cnt] =
1120                                    isp->inputs[isp->input_cnt - 1];
1121                                isp->inputs[isp->input_cnt].sensor_index = i;
1122                                isp->input_cnt++;
1123                        }
1124                        break;
1125                case CAMERA_MOTOR:
1126                        if (isp->motor) {
1127                                dev_warn(isp->dev,
1128                                         "too many atomisp motors, ignored %s\n",
1129                                         board_info->type);
1130                                continue;
1131                        }
1132                        isp->motor = subdev;
1133                        break;
1134                case LED_FLASH:
1135                case XENON_FLASH:
1136                        if (isp->flash) {
1137                                dev_warn(isp->dev,
1138                                         "too many atomisp flash devices, ignored %s\n",
1139                                         board_info->type);
1140                                continue;
1141                        }
1142                        isp->flash = subdev;
1143                        break;
1144                default:
1145                        dev_dbg(isp->dev, "unknown subdev probed\n");
1146                        break;
1147                }
1148        }
1149
1150        /*
1151         * HACK: Currently VCM belongs to primary sensor only, but correct
1152         * approach must be to acquire from platform code which sensor
1153         * owns it.
1154         */
1155        if (isp->motor && raw_index >= 0)
1156                isp->inputs[raw_index].motor = isp->motor;
1157
1158        /* Proceed even if no modules detected. For COS mode and no modules. */
1159        if (!isp->input_cnt)
1160                dev_warn(isp->dev, "no camera attached or fail to detect\n");
1161        else
1162                dev_info(isp->dev, "detected %d camera sensors\n",
1163                         isp->input_cnt);
1164
1165        return atomisp_csi_lane_config(isp);
1166}
1167
1168static void atomisp_unregister_entities(struct atomisp_device *isp)
1169{
1170        unsigned int i;
1171        struct v4l2_subdev *sd, *next;
1172
1173        for (i = 0; i < isp->num_of_streams; i++)
1174                atomisp_subdev_unregister_entities(&isp->asd[i]);
1175        atomisp_tpg_unregister_entities(&isp->tpg);
1176        atomisp_file_input_unregister_entities(&isp->file_dev);
1177        for (i = 0; i < ATOMISP_CAMERA_NR_PORTS; i++)
1178                atomisp_mipi_csi2_unregister_entities(&isp->csi2_port[i]);
1179
1180        list_for_each_entry_safe(sd, next, &isp->v4l2_dev.subdevs, list)
1181        v4l2_device_unregister_subdev(sd);
1182
1183        v4l2_device_unregister(&isp->v4l2_dev);
1184        media_device_unregister(&isp->media_dev);
1185}
1186
1187static int atomisp_register_entities(struct atomisp_device *isp)
1188{
1189        int ret = 0;
1190        unsigned int i;
1191
1192        isp->media_dev.dev = isp->dev;
1193
1194        strscpy(isp->media_dev.model, "Intel Atom ISP",
1195                sizeof(isp->media_dev.model));
1196
1197        media_device_init(&isp->media_dev);
1198        isp->v4l2_dev.mdev = &isp->media_dev;
1199        ret = v4l2_device_register(isp->dev, &isp->v4l2_dev);
1200        if (ret < 0) {
1201                dev_err(isp->dev, "%s: V4L2 device registration failed (%d)\n",
1202                        __func__, ret);
1203                goto v4l2_device_failed;
1204        }
1205
1206        ret = atomisp_subdev_probe(isp);
1207        if (ret < 0)
1208                goto csi_and_subdev_probe_failed;
1209
1210        /* Register internal entities */
1211        for (i = 0; i < ATOMISP_CAMERA_NR_PORTS; i++) {
1212                ret = atomisp_mipi_csi2_register_entities(&isp->csi2_port[i],
1213                        &isp->v4l2_dev);
1214                if (ret == 0)
1215                        continue;
1216
1217                /* error case */
1218                dev_err(isp->dev, "failed to register the CSI port: %d\n", i);
1219                /* deregister all registered CSI ports */
1220                while (i--)
1221                        atomisp_mipi_csi2_unregister_entities(
1222                            &isp->csi2_port[i]);
1223
1224                goto csi_and_subdev_probe_failed;
1225        }
1226
1227        ret =
1228            atomisp_file_input_register_entities(&isp->file_dev, &isp->v4l2_dev);
1229        if (ret < 0) {
1230                dev_err(isp->dev, "atomisp_file_input_register_entities\n");
1231                goto file_input_register_failed;
1232        }
1233
1234        ret = atomisp_tpg_register_entities(&isp->tpg, &isp->v4l2_dev);
1235        if (ret < 0) {
1236                dev_err(isp->dev, "atomisp_tpg_register_entities\n");
1237                goto tpg_register_failed;
1238        }
1239
1240        for (i = 0; i < isp->num_of_streams; i++) {
1241                struct atomisp_sub_device *asd = &isp->asd[i];
1242
1243                ret = atomisp_subdev_register_entities(asd, &isp->v4l2_dev);
1244                if (ret < 0) {
1245                        dev_err(isp->dev,
1246                                "atomisp_subdev_register_entities fail\n");
1247                        for (; i > 0; i--)
1248                                atomisp_subdev_unregister_entities(
1249                                    &isp->asd[i - 1]);
1250                        goto subdev_register_failed;
1251                }
1252        }
1253
1254        for (i = 0; i < isp->num_of_streams; i++) {
1255                struct atomisp_sub_device *asd = &isp->asd[i];
1256
1257                init_completion(&asd->init_done);
1258
1259                asd->delayed_init_workq =
1260                    alloc_workqueue(isp->v4l2_dev.name, WQ_CPU_INTENSIVE,
1261                                    1);
1262                if (!asd->delayed_init_workq) {
1263                        dev_err(isp->dev,
1264                                "Failed to initialize delayed init workq\n");
1265                        ret = -ENOMEM;
1266
1267                        for (; i > 0; i--)
1268                                destroy_workqueue(isp->asd[i - 1].
1269                                                  delayed_init_workq);
1270                        goto wq_alloc_failed;
1271                }
1272                INIT_WORK(&asd->delayed_init_work, atomisp_delayed_init_work);
1273        }
1274
1275        for (i = 0; i < isp->input_cnt; i++) {
1276                if (isp->inputs[i].port >= ATOMISP_CAMERA_NR_PORTS) {
1277                        dev_err(isp->dev, "isp->inputs port %d not supported\n",
1278                                isp->inputs[i].port);
1279                        ret = -EINVAL;
1280                        goto link_failed;
1281                }
1282        }
1283
1284        dev_dbg(isp->dev,
1285                "FILE_INPUT enable, camera_cnt: %d\n", isp->input_cnt);
1286        isp->inputs[isp->input_cnt].type = FILE_INPUT;
1287        isp->inputs[isp->input_cnt].port = -1;
1288        isp->inputs[isp->input_cnt].camera_caps =
1289            atomisp_get_default_camera_caps();
1290        isp->inputs[isp->input_cnt++].camera = &isp->file_dev.sd;
1291
1292        if (isp->input_cnt < ATOM_ISP_MAX_INPUTS) {
1293                dev_dbg(isp->dev,
1294                        "TPG detected, camera_cnt: %d\n", isp->input_cnt);
1295                isp->inputs[isp->input_cnt].type = TEST_PATTERN;
1296                isp->inputs[isp->input_cnt].port = -1;
1297                isp->inputs[isp->input_cnt].camera_caps =
1298                    atomisp_get_default_camera_caps();
1299                isp->inputs[isp->input_cnt++].camera = &isp->tpg.sd;
1300        } else {
1301                dev_warn(isp->dev, "too many atomisp inputs, TPG ignored.\n");
1302        }
1303
1304        ret = v4l2_device_register_subdev_nodes(&isp->v4l2_dev);
1305        if (ret < 0)
1306                goto link_failed;
1307
1308        return media_device_register(&isp->media_dev);
1309
1310link_failed:
1311        for (i = 0; i < isp->num_of_streams; i++)
1312                destroy_workqueue(isp->asd[i].
1313                                  delayed_init_workq);
1314wq_alloc_failed:
1315        for (i = 0; i < isp->num_of_streams; i++)
1316                atomisp_subdev_unregister_entities(
1317                    &isp->asd[i]);
1318subdev_register_failed:
1319        atomisp_tpg_unregister_entities(&isp->tpg);
1320tpg_register_failed:
1321        atomisp_file_input_unregister_entities(&isp->file_dev);
1322file_input_register_failed:
1323        for (i = 0; i < ATOMISP_CAMERA_NR_PORTS; i++)
1324                atomisp_mipi_csi2_unregister_entities(&isp->csi2_port[i]);
1325csi_and_subdev_probe_failed:
1326        v4l2_device_unregister(&isp->v4l2_dev);
1327v4l2_device_failed:
1328        media_device_unregister(&isp->media_dev);
1329        media_device_cleanup(&isp->media_dev);
1330        return ret;
1331}
1332
1333static int atomisp_initialize_modules(struct atomisp_device *isp)
1334{
1335        int ret;
1336
1337        ret = atomisp_mipi_csi2_init(isp);
1338        if (ret < 0) {
1339                dev_err(isp->dev, "mipi csi2 initialization failed\n");
1340                goto error_mipi_csi2;
1341        }
1342
1343        ret = atomisp_file_input_init(isp);
1344        if (ret < 0) {
1345                dev_err(isp->dev,
1346                        "file input device initialization failed\n");
1347                goto error_file_input;
1348        }
1349
1350        ret = atomisp_tpg_init(isp);
1351        if (ret < 0) {
1352                dev_err(isp->dev, "tpg initialization failed\n");
1353                goto error_tpg;
1354        }
1355
1356        ret = atomisp_subdev_init(isp);
1357        if (ret < 0) {
1358                dev_err(isp->dev, "ISP subdev initialization failed\n");
1359                goto error_isp_subdev;
1360        }
1361
1362        return 0;
1363
1364error_isp_subdev:
1365error_tpg:
1366        atomisp_tpg_cleanup(isp);
1367error_file_input:
1368        atomisp_file_input_cleanup(isp);
1369error_mipi_csi2:
1370        atomisp_mipi_csi2_cleanup(isp);
1371        return ret;
1372}
1373
1374static void atomisp_uninitialize_modules(struct atomisp_device *isp)
1375{
1376        atomisp_tpg_cleanup(isp);
1377        atomisp_file_input_cleanup(isp);
1378        atomisp_mipi_csi2_cleanup(isp);
1379}
1380
1381const struct firmware *
1382atomisp_load_firmware(struct atomisp_device *isp)
1383{
1384        const struct firmware *fw;
1385        int rc;
1386        char *fw_path = NULL;
1387
1388        if (skip_fwload)
1389                return NULL;
1390
1391        if (firmware_name[0] != '\0') {
1392                fw_path = firmware_name;
1393        } else {
1394                if ((isp->media_dev.hw_revision  >> ATOMISP_HW_REVISION_SHIFT)
1395                    == ATOMISP_HW_REVISION_ISP2401)
1396                        fw_path = "shisp_2401a0_v21.bin";
1397
1398                if (isp->media_dev.hw_revision ==
1399                    ((ATOMISP_HW_REVISION_ISP2401_LEGACY << ATOMISP_HW_REVISION_SHIFT)
1400                    | ATOMISP_HW_STEPPING_A0))
1401                        fw_path = "shisp_2401a0_legacy_v21.bin";
1402
1403                if (isp->media_dev.hw_revision ==
1404                    ((ATOMISP_HW_REVISION_ISP2400 << ATOMISP_HW_REVISION_SHIFT)
1405                    | ATOMISP_HW_STEPPING_B0))
1406                        fw_path = "shisp_2400b0_v21.bin";
1407        }
1408
1409        if (!fw_path) {
1410                dev_err(isp->dev, "Unsupported hw_revision 0x%x\n",
1411                        isp->media_dev.hw_revision);
1412                return NULL;
1413        }
1414
1415        rc = request_firmware(&fw, fw_path, isp->dev);
1416        if (rc) {
1417                dev_err(isp->dev,
1418                        "atomisp: Error %d while requesting firmware %s\n",
1419                        rc, fw_path);
1420                return NULL;
1421        }
1422
1423        return fw;
1424}
1425
1426/*
1427 * Check for flags the driver was compiled with against the PCI
1428 * device. Always returns true on other than ISP 2400.
1429 */
1430static bool is_valid_device(struct pci_dev *pdev, const struct pci_device_id *id)
1431{
1432        unsigned int a0_max_id = 0;
1433        const char *name;
1434        const char *product;
1435
1436        product = dmi_get_system_info(DMI_PRODUCT_NAME);
1437
1438        switch (id->device & ATOMISP_PCI_DEVICE_SOC_MASK) {
1439        case ATOMISP_PCI_DEVICE_SOC_MRFLD:
1440                a0_max_id = ATOMISP_PCI_REV_MRFLD_A0_MAX;
1441                name = "Merrifield";
1442                break;
1443        case ATOMISP_PCI_DEVICE_SOC_BYT:
1444                a0_max_id = ATOMISP_PCI_REV_BYT_A0_MAX;
1445                name = "Baytrail";
1446                break;
1447        case ATOMISP_PCI_DEVICE_SOC_ANN:
1448                name = "Anniedale";
1449                break;
1450        case ATOMISP_PCI_DEVICE_SOC_CHT:
1451                name = "Cherrytrail";
1452                break;
1453        default:
1454                dev_err(&pdev->dev, "%s: unknown device ID %x04:%x04\n",
1455                        product, id->vendor, id->device);
1456                return false;
1457        }
1458
1459        if (pdev->revision <= ATOMISP_PCI_REV_BYT_A0_MAX) {
1460                dev_err(&pdev->dev, "%s revision %d is not unsupported\n",
1461                        name, pdev->revision);
1462                return false;
1463        }
1464
1465        /*
1466         * FIXME:
1467         * remove the if once the driver become generic
1468         */
1469
1470#if defined(ISP2400)
1471        if (IS_ISP2401) {
1472                dev_err(&pdev->dev, "Support for %s (ISP2401) was disabled at compile time\n",
1473                        name);
1474                return false;
1475        }
1476#else
1477        if (!IS_ISP2401) {
1478                dev_err(&pdev->dev, "Support for %s (ISP2400) was disabled at compile time\n",
1479                        name);
1480                return false;
1481        }
1482#endif
1483
1484        dev_info(&pdev->dev, "Detected %s version %d (ISP240%c) on %s\n",
1485                 name, pdev->revision, IS_ISP2401 ? '1' : '0', product);
1486
1487        return true;
1488}
1489
1490static int init_atomisp_wdts(struct atomisp_device *isp)
1491{
1492        int i, err;
1493
1494        atomic_set(&isp->wdt_work_queued, 0);
1495        isp->wdt_work_queue = alloc_workqueue(isp->v4l2_dev.name, 0, 1);
1496        if (!isp->wdt_work_queue) {
1497                dev_err(isp->dev, "Failed to initialize wdt work queue\n");
1498                err = -ENOMEM;
1499                goto alloc_fail;
1500        }
1501        INIT_WORK(&isp->wdt_work, atomisp_wdt_work);
1502
1503        for (i = 0; i < isp->num_of_streams; i++) {
1504                struct atomisp_sub_device *asd = &isp->asd[i];
1505
1506                if (!IS_ISP2401)
1507                        timer_setup(&asd->wdt, atomisp_wdt, 0);
1508                else {
1509                        timer_setup(&asd->video_out_capture.wdt,
1510                                    atomisp_wdt, 0);
1511                        timer_setup(&asd->video_out_preview.wdt,
1512                                    atomisp_wdt, 0);
1513                        timer_setup(&asd->video_out_vf.wdt, atomisp_wdt, 0);
1514                        timer_setup(&asd->video_out_video_capture.wdt,
1515                                    atomisp_wdt, 0);
1516                }
1517        }
1518        return 0;
1519alloc_fail:
1520        return err;
1521}
1522
1523#define ATOM_ISP_PCI_BAR        0
1524
1525static int atomisp_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id)
1526{
1527        const struct atomisp_platform_data *pdata;
1528        struct atomisp_device *isp;
1529        unsigned int start;
1530        int err, val;
1531        u32 irq;
1532
1533        if (!is_valid_device(pdev, id))
1534                return -ENODEV;
1535
1536        /* Pointer to struct device. */
1537        atomisp_dev = &pdev->dev;
1538
1539        pdata = atomisp_get_platform_data();
1540        if (!pdata)
1541                dev_warn(&pdev->dev, "no platform data available\n");
1542
1543        err = pcim_enable_device(pdev);
1544        if (err) {
1545                dev_err(&pdev->dev, "Failed to enable CI ISP device (%d)\n", err);
1546                return err;
1547        }
1548
1549        start = pci_resource_start(pdev, ATOM_ISP_PCI_BAR);
1550        dev_dbg(&pdev->dev, "start: 0x%x\n", start);
1551
1552        err = pcim_iomap_regions(pdev, 1 << ATOM_ISP_PCI_BAR, pci_name(pdev));
1553        if (err) {
1554                dev_err(&pdev->dev, "Failed to I/O memory remapping (%d)\n", err);
1555                goto ioremap_fail;
1556        }
1557
1558        isp = devm_kzalloc(&pdev->dev, sizeof(*isp), GFP_KERNEL);
1559        if (!isp) {
1560                err = -ENOMEM;
1561                goto atomisp_dev_alloc_fail;
1562        }
1563
1564        isp->dev = &pdev->dev;
1565        isp->base = pcim_iomap_table(pdev)[ATOM_ISP_PCI_BAR];
1566        isp->sw_contex.power_state = ATOM_ISP_POWER_UP;
1567        isp->saved_regs.ispmmadr = start;
1568
1569        dev_dbg(&pdev->dev, "atomisp mmio base: %p\n", isp->base);
1570
1571        rt_mutex_init(&isp->mutex);
1572        mutex_init(&isp->streamoff_mutex);
1573        spin_lock_init(&isp->lock);
1574
1575        /* This is not a true PCI device on SoC, so the delay is not needed. */
1576        pdev->d3_delay = 0;
1577
1578        pci_set_drvdata(pdev, isp);
1579
1580        switch (id->device & ATOMISP_PCI_DEVICE_SOC_MASK) {
1581        case ATOMISP_PCI_DEVICE_SOC_MRFLD:
1582                isp->media_dev.hw_revision =
1583                    (ATOMISP_HW_REVISION_ISP2400
1584                     << ATOMISP_HW_REVISION_SHIFT) |
1585                    ATOMISP_HW_STEPPING_B0;
1586
1587                switch (id->device) {
1588                case ATOMISP_PCI_DEVICE_SOC_MRFLD_1179:
1589                        isp->dfs = &dfs_config_merr_1179;
1590                        break;
1591                case ATOMISP_PCI_DEVICE_SOC_MRFLD_117A:
1592                        isp->dfs = &dfs_config_merr_117a;
1593
1594                        break;
1595                default:
1596                        isp->dfs = &dfs_config_merr;
1597                        break;
1598                }
1599                isp->hpll_freq = HPLL_FREQ_1600MHZ;
1600                break;
1601        case ATOMISP_PCI_DEVICE_SOC_BYT:
1602                isp->media_dev.hw_revision =
1603                    (ATOMISP_HW_REVISION_ISP2400
1604                     << ATOMISP_HW_REVISION_SHIFT) |
1605                    ATOMISP_HW_STEPPING_B0;
1606
1607                /*
1608                 * Note: some Intel-based tablets with Android use a different
1609                 * DFS table. Based on the comments at the Yocto Aero meta
1610                 * version of this driver (at the ssid.h header), they're
1611                 * identified via a "spid" var:
1612                 *
1613                 *      androidboot.spid=vend:cust:manu:plat:prod:hard
1614                 *
1615                 * As we don't have this upstream, nor we know enough details
1616                 * to use a DMI or PCI match table, the old code was just
1617                 * removed, but let's keep a note here as a reminder that,
1618                 * for certain devices, we may need to limit the max DFS
1619                 * frequency to be below certain values, adjusting the
1620                 * resolution accordingly.
1621                 */
1622                isp->dfs = &dfs_config_byt;
1623
1624                /*
1625                 * HPLL frequency is known to be device-specific, but we don't
1626                 * have specs yet for exactly how it varies.  Default to
1627                 * BYT-CR but let provisioning set it via EFI variable
1628                 */
1629                isp->hpll_freq = gmin_get_var_int(&pdev->dev, false, "HpllFreq", HPLL_FREQ_2000MHZ);
1630
1631                /*
1632                 * for BYT/CHT we are put isp into D3cold to avoid pci registers access
1633                 * in power off. Set d3cold_delay to 0 since default 100ms is not
1634                 * necessary.
1635                 */
1636                pdev->d3cold_delay = 0;
1637                break;
1638        case ATOMISP_PCI_DEVICE_SOC_ANN:
1639                isp->media_dev.hw_revision = (
1640#ifdef ISP2401_NEW_INPUT_SYSTEM
1641                                                 ATOMISP_HW_REVISION_ISP2401
1642#else
1643                                                 ATOMISP_HW_REVISION_ISP2401_LEGACY
1644#endif
1645                                                 << ATOMISP_HW_REVISION_SHIFT);
1646                isp->media_dev.hw_revision |= pdev->revision < 2 ?
1647                                              ATOMISP_HW_STEPPING_A0 : ATOMISP_HW_STEPPING_B0;
1648                isp->dfs = &dfs_config_merr;
1649                isp->hpll_freq = HPLL_FREQ_1600MHZ;
1650                break;
1651        case ATOMISP_PCI_DEVICE_SOC_CHT:
1652                isp->media_dev.hw_revision = (
1653#ifdef ISP2401_NEW_INPUT_SYSTEM
1654                                                 ATOMISP_HW_REVISION_ISP2401
1655#else
1656                                                 ATOMISP_HW_REVISION_ISP2401_LEGACY
1657#endif
1658                                                 << ATOMISP_HW_REVISION_SHIFT);
1659                isp->media_dev.hw_revision |= pdev->revision < 2 ?
1660                                              ATOMISP_HW_STEPPING_A0 : ATOMISP_HW_STEPPING_B0;
1661
1662                isp->dfs = &dfs_config_cht;
1663                pdev->d3cold_delay = 0;
1664
1665                iosf_mbi_read(BT_MBI_UNIT_CCK, MBI_REG_READ, CCK_FUSE_REG_0, &val);
1666                switch (val & CCK_FUSE_HPLL_FREQ_MASK) {
1667                case 0x00:
1668                        isp->hpll_freq = HPLL_FREQ_800MHZ;
1669                        break;
1670                case 0x01:
1671                        isp->hpll_freq = HPLL_FREQ_1600MHZ;
1672                        break;
1673                case 0x02:
1674                        isp->hpll_freq = HPLL_FREQ_2000MHZ;
1675                        break;
1676                default:
1677                        isp->hpll_freq = HPLL_FREQ_1600MHZ;
1678                        dev_warn(&pdev->dev, "read HPLL from cck failed. Default to 1600 MHz.\n");
1679                }
1680                break;
1681        default:
1682                dev_err(&pdev->dev, "un-supported IUNIT device\n");
1683                err = -ENODEV;
1684                goto atomisp_dev_alloc_fail;
1685        }
1686
1687        dev_info(&pdev->dev, "ISP HPLL frequency base = %d MHz\n", isp->hpll_freq);
1688
1689        isp->max_isr_latency = ATOMISP_MAX_ISR_LATENCY;
1690
1691        /* Load isp firmware from user space */
1692        if (!defer_fw_load) {
1693                isp->firmware = atomisp_load_firmware(isp);
1694                if (!isp->firmware) {
1695                        err = -ENOENT;
1696                        dev_dbg(&pdev->dev, "Firmware load failed\n");
1697                        goto load_fw_fail;
1698                }
1699
1700                err = sh_css_check_firmware_version(isp->dev, isp->firmware->data);
1701                if (err) {
1702                        dev_dbg(&pdev->dev, "Firmware version check failed\n");
1703                        goto fw_validation_fail;
1704                }
1705        } else {
1706                dev_info(&pdev->dev, "Firmware load will be deferred\n");
1707        }
1708
1709        pci_set_master(pdev);
1710
1711        err = pci_enable_msi(pdev);
1712        if (err) {
1713                dev_err(&pdev->dev, "Failed to enable msi (%d)\n", err);
1714                goto enable_msi_fail;
1715        }
1716
1717        atomisp_msi_irq_init(isp);
1718
1719        cpu_latency_qos_add_request(&isp->pm_qos, PM_QOS_DEFAULT_VALUE);
1720
1721        /*
1722         * for MRFLD, Software/firmware needs to write a 1 to bit 0 of
1723         * the register at CSI_RECEIVER_SELECTION_REG to enable SH CSI
1724         * backend write 0 will enable Arasan CSI backend, which has
1725         * bugs(like sighting:4567697 and 4567699) and will be removed
1726         * in B0
1727         */
1728        atomisp_css2_hw_store_32(MRFLD_CSI_RECEIVER_SELECTION_REG, 1);
1729
1730        if ((id->device & ATOMISP_PCI_DEVICE_SOC_MASK) ==
1731            ATOMISP_PCI_DEVICE_SOC_MRFLD) {
1732                u32 csi_afe_trim;
1733
1734                /*
1735                 * Workaround for imbalance data eye issue which is observed
1736                 * on TNG B0.
1737                 */
1738                pci_read_config_dword(pdev, MRFLD_PCI_CSI_AFE_TRIM_CONTROL, &csi_afe_trim);
1739                csi_afe_trim &= ~((MRFLD_PCI_CSI_HSRXCLKTRIM_MASK <<
1740                                   MRFLD_PCI_CSI1_HSRXCLKTRIM_SHIFT) |
1741                                  (MRFLD_PCI_CSI_HSRXCLKTRIM_MASK <<
1742                                   MRFLD_PCI_CSI2_HSRXCLKTRIM_SHIFT) |
1743                                  (MRFLD_PCI_CSI_HSRXCLKTRIM_MASK <<
1744                                   MRFLD_PCI_CSI3_HSRXCLKTRIM_SHIFT));
1745                csi_afe_trim |= (MRFLD_PCI_CSI1_HSRXCLKTRIM <<
1746                                 MRFLD_PCI_CSI1_HSRXCLKTRIM_SHIFT) |
1747                                (MRFLD_PCI_CSI2_HSRXCLKTRIM <<
1748                                 MRFLD_PCI_CSI2_HSRXCLKTRIM_SHIFT) |
1749                                (MRFLD_PCI_CSI3_HSRXCLKTRIM <<
1750                                 MRFLD_PCI_CSI3_HSRXCLKTRIM_SHIFT);
1751                pci_write_config_dword(pdev, MRFLD_PCI_CSI_AFE_TRIM_CONTROL, csi_afe_trim);
1752        }
1753
1754        err = atomisp_initialize_modules(isp);
1755        if (err < 0) {
1756                dev_err(&pdev->dev, "atomisp_initialize_modules (%d)\n", err);
1757                goto initialize_modules_fail;
1758        }
1759
1760        err = atomisp_register_entities(isp);
1761        if (err < 0) {
1762                dev_err(&pdev->dev, "atomisp_register_entities failed (%d)\n", err);
1763                goto register_entities_fail;
1764        }
1765        err = atomisp_create_pads_links(isp);
1766        if (err < 0)
1767                goto register_entities_fail;
1768        /* init atomisp wdts */
1769        if (init_atomisp_wdts(isp) != 0)
1770                goto wdt_work_queue_fail;
1771
1772        /* save the iunit context only once after all the values are init'ed. */
1773        atomisp_save_iunit_reg(isp);
1774
1775        pm_runtime_put_noidle(&pdev->dev);
1776        pm_runtime_allow(&pdev->dev);
1777
1778        hmm_init_mem_stat(repool_pgnr, dypool_enable, dypool_pgnr);
1779        err = hmm_pool_register(repool_pgnr, HMM_POOL_TYPE_RESERVED);
1780        if (err) {
1781                dev_err(&pdev->dev, "Failed to register reserved memory pool.\n");
1782                goto hmm_pool_fail;
1783        }
1784
1785        /* Init ISP memory management */
1786        hmm_init();
1787
1788        err = devm_request_threaded_irq(&pdev->dev, pdev->irq,
1789                                        atomisp_isr, atomisp_isr_thread,
1790                                        IRQF_SHARED, "isp_irq", isp);
1791        if (err) {
1792                dev_err(&pdev->dev, "Failed to request irq (%d)\n", err);
1793                goto request_irq_fail;
1794        }
1795
1796        /* Load firmware into ISP memory */
1797        if (!defer_fw_load) {
1798                err = atomisp_css_load_firmware(isp);
1799                if (err) {
1800                        dev_err(&pdev->dev, "Failed to init css.\n");
1801                        goto css_init_fail;
1802                }
1803        } else {
1804                dev_dbg(&pdev->dev, "Skip css init.\n");
1805        }
1806        /* Clear FW image from memory */
1807        release_firmware(isp->firmware);
1808        isp->firmware = NULL;
1809        isp->css_env.isp_css_fw.data = NULL;
1810
1811        atomisp_drvfs_init(isp);
1812
1813        return 0;
1814
1815css_init_fail:
1816        devm_free_irq(&pdev->dev, pdev->irq, isp);
1817request_irq_fail:
1818        hmm_cleanup();
1819        hmm_pool_unregister(HMM_POOL_TYPE_RESERVED);
1820hmm_pool_fail:
1821        destroy_workqueue(isp->wdt_work_queue);
1822wdt_work_queue_fail:
1823        atomisp_acc_cleanup(isp);
1824        atomisp_unregister_entities(isp);
1825register_entities_fail:
1826        atomisp_uninitialize_modules(isp);
1827initialize_modules_fail:
1828        cpu_latency_qos_remove_request(&isp->pm_qos);
1829        atomisp_msi_irq_uninit(isp);
1830        pci_disable_msi(pdev);
1831enable_msi_fail:
1832fw_validation_fail:
1833        release_firmware(isp->firmware);
1834load_fw_fail:
1835        /*
1836         * Switch off ISP, as keeping it powered on would prevent
1837         * reaching S0ix states.
1838         *
1839         * The following lines have been copied from atomisp suspend path
1840         */
1841
1842        pci_read_config_dword(pdev, PCI_INTERRUPT_CTRL, &irq);
1843        irq = irq & 1 << INTR_IIR;
1844        pci_write_config_dword(pdev, PCI_INTERRUPT_CTRL, irq);
1845
1846        pci_read_config_dword(pdev, PCI_INTERRUPT_CTRL, &irq);
1847        irq &= ~(1 << INTR_IER);
1848        pci_write_config_dword(pdev, PCI_INTERRUPT_CTRL, irq);
1849
1850        atomisp_msi_irq_uninit(isp);
1851
1852        atomisp_ospm_dphy_down(isp);
1853
1854        /* Address later when we worry about the ...field chips */
1855        if (IS_ENABLED(CONFIG_PM) && atomisp_mrfld_power_down(isp))
1856                dev_err(&pdev->dev, "Failed to switch off ISP\n");
1857
1858atomisp_dev_alloc_fail:
1859        pcim_iounmap_regions(pdev, 1 << ATOM_ISP_PCI_BAR);
1860
1861ioremap_fail:
1862        return err;
1863}
1864
1865static void atomisp_pci_remove(struct pci_dev *pdev)
1866{
1867        struct atomisp_device *isp = pci_get_drvdata(pdev);
1868
1869        dev_info(&pdev->dev, "Removing atomisp driver\n");
1870
1871        atomisp_drvfs_exit();
1872
1873        atomisp_acc_cleanup(isp);
1874
1875        ia_css_unload_firmware();
1876        hmm_cleanup();
1877
1878        pm_runtime_forbid(&pdev->dev);
1879        pm_runtime_get_noresume(&pdev->dev);
1880        cpu_latency_qos_remove_request(&isp->pm_qos);
1881
1882        atomisp_msi_irq_uninit(isp);
1883        atomisp_unregister_entities(isp);
1884
1885        destroy_workqueue(isp->wdt_work_queue);
1886        atomisp_file_input_cleanup(isp);
1887
1888        release_firmware(isp->firmware);
1889
1890        hmm_pool_unregister(HMM_POOL_TYPE_RESERVED);
1891}
1892
1893static const struct pci_device_id atomisp_pci_tbl[] = {
1894        /* Merrifield */
1895        {PCI_DEVICE(PCI_VENDOR_ID_INTEL, ATOMISP_PCI_DEVICE_SOC_MRFLD)},
1896        {PCI_DEVICE(PCI_VENDOR_ID_INTEL, ATOMISP_PCI_DEVICE_SOC_MRFLD_1179)},
1897        {PCI_DEVICE(PCI_VENDOR_ID_INTEL, ATOMISP_PCI_DEVICE_SOC_MRFLD_117A)},
1898        /* Baytrail */
1899        {PCI_DEVICE(PCI_VENDOR_ID_INTEL, ATOMISP_PCI_DEVICE_SOC_BYT)},
1900        /* Anniedale (Merrifield+ / Moorefield) */
1901        {PCI_DEVICE(PCI_VENDOR_ID_INTEL, ATOMISP_PCI_DEVICE_SOC_ANN)},
1902        /* Cherrytrail */
1903        {PCI_DEVICE(PCI_VENDOR_ID_INTEL, ATOMISP_PCI_DEVICE_SOC_CHT)},
1904        {0,}
1905};
1906
1907MODULE_DEVICE_TABLE(pci, atomisp_pci_tbl);
1908
1909static const struct dev_pm_ops atomisp_pm_ops = {
1910        .runtime_suspend = atomisp_runtime_suspend,
1911        .runtime_resume = atomisp_runtime_resume,
1912        .suspend = atomisp_suspend,
1913        .resume = atomisp_resume,
1914};
1915
1916static struct pci_driver atomisp_pci_driver = {
1917        .driver = {
1918                .pm = &atomisp_pm_ops,
1919        },
1920        .name = "atomisp-isp2",
1921        .id_table = atomisp_pci_tbl,
1922        .probe = atomisp_pci_probe,
1923        .remove = atomisp_pci_remove,
1924};
1925
1926module_pci_driver(atomisp_pci_driver);
1927
1928MODULE_AUTHOR("Wen Wang <wen.w.wang@intel.com>");
1929MODULE_AUTHOR("Xiaolin Zhang <xiaolin.zhang@intel.com>");
1930MODULE_LICENSE("GPL");
1931MODULE_DESCRIPTION("Intel ATOM Platform ISP Driver");
1932