linux/drivers/media/platform/exynos4-is/fimc-is.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-only
   2/*
   3 * Samsung EXYNOS4x12 FIMC-IS (Imaging Subsystem) driver
   4 *
   5 * Copyright (C) 2013 Samsung Electronics Co., Ltd.
   6 *
   7 * Authors: Sylwester Nawrocki <s.nawrocki@samsung.com>
   8 *          Younghwan Joo <yhwan.joo@samsung.com>
   9 */
  10#define pr_fmt(fmt) "%s:%d " fmt, __func__, __LINE__
  11
  12#include <linux/device.h>
  13#include <linux/debugfs.h>
  14#include <linux/delay.h>
  15#include <linux/dma-contiguous.h>
  16#include <linux/errno.h>
  17#include <linux/firmware.h>
  18#include <linux/interrupt.h>
  19#include <linux/kernel.h>
  20#include <linux/module.h>
  21#include <linux/i2c.h>
  22#include <linux/of_irq.h>
  23#include <linux/of_address.h>
  24#include <linux/of_graph.h>
  25#include <linux/of_platform.h>
  26#include <linux/platform_device.h>
  27#include <linux/pm_runtime.h>
  28#include <linux/slab.h>
  29#include <linux/types.h>
  30#include <linux/videodev2.h>
  31#include <media/videobuf2-dma-contig.h>
  32
  33#include "media-dev.h"
  34#include "fimc-is.h"
  35#include "fimc-is-command.h"
  36#include "fimc-is-errno.h"
  37#include "fimc-is-i2c.h"
  38#include "fimc-is-param.h"
  39#include "fimc-is-regs.h"
  40
  41
  42static char *fimc_is_clocks[ISS_CLKS_MAX] = {
  43        [ISS_CLK_PPMUISPX]              = "ppmuispx",
  44        [ISS_CLK_PPMUISPMX]             = "ppmuispmx",
  45        [ISS_CLK_LITE0]                 = "lite0",
  46        [ISS_CLK_LITE1]                 = "lite1",
  47        [ISS_CLK_MPLL]                  = "mpll",
  48        [ISS_CLK_ISP]                   = "isp",
  49        [ISS_CLK_DRC]                   = "drc",
  50        [ISS_CLK_FD]                    = "fd",
  51        [ISS_CLK_MCUISP]                = "mcuisp",
  52        [ISS_CLK_GICISP]                = "gicisp",
  53        [ISS_CLK_PWM_ISP]               = "pwm_isp",
  54        [ISS_CLK_MCUCTL_ISP]            = "mcuctl_isp",
  55        [ISS_CLK_UART]                  = "uart",
  56        [ISS_CLK_ISP_DIV0]              = "ispdiv0",
  57        [ISS_CLK_ISP_DIV1]              = "ispdiv1",
  58        [ISS_CLK_MCUISP_DIV0]           = "mcuispdiv0",
  59        [ISS_CLK_MCUISP_DIV1]           = "mcuispdiv1",
  60        [ISS_CLK_ACLK200]               = "aclk200",
  61        [ISS_CLK_ACLK200_DIV]           = "div_aclk200",
  62        [ISS_CLK_ACLK400MCUISP]         = "aclk400mcuisp",
  63        [ISS_CLK_ACLK400MCUISP_DIV]     = "div_aclk400mcuisp",
  64};
  65
  66static void fimc_is_put_clocks(struct fimc_is *is)
  67{
  68        int i;
  69
  70        for (i = 0; i < ISS_CLKS_MAX; i++) {
  71                if (IS_ERR(is->clocks[i]))
  72                        continue;
  73                clk_put(is->clocks[i]);
  74                is->clocks[i] = ERR_PTR(-EINVAL);
  75        }
  76}
  77
  78static int fimc_is_get_clocks(struct fimc_is *is)
  79{
  80        int i, ret;
  81
  82        for (i = 0; i < ISS_CLKS_MAX; i++)
  83                is->clocks[i] = ERR_PTR(-EINVAL);
  84
  85        for (i = 0; i < ISS_CLKS_MAX; i++) {
  86                is->clocks[i] = clk_get(&is->pdev->dev, fimc_is_clocks[i]);
  87                if (IS_ERR(is->clocks[i])) {
  88                        ret = PTR_ERR(is->clocks[i]);
  89                        goto err;
  90                }
  91        }
  92
  93        return 0;
  94err:
  95        fimc_is_put_clocks(is);
  96        dev_err(&is->pdev->dev, "failed to get clock: %s\n",
  97                fimc_is_clocks[i]);
  98        return ret;
  99}
 100
 101static int fimc_is_setup_clocks(struct fimc_is *is)
 102{
 103        int ret;
 104
 105        ret = clk_set_parent(is->clocks[ISS_CLK_ACLK200],
 106                                        is->clocks[ISS_CLK_ACLK200_DIV]);
 107        if (ret < 0)
 108                return ret;
 109
 110        ret = clk_set_parent(is->clocks[ISS_CLK_ACLK400MCUISP],
 111                                        is->clocks[ISS_CLK_ACLK400MCUISP_DIV]);
 112        if (ret < 0)
 113                return ret;
 114
 115        ret = clk_set_rate(is->clocks[ISS_CLK_ISP_DIV0], ACLK_AXI_FREQUENCY);
 116        if (ret < 0)
 117                return ret;
 118
 119        ret = clk_set_rate(is->clocks[ISS_CLK_ISP_DIV1], ACLK_AXI_FREQUENCY);
 120        if (ret < 0)
 121                return ret;
 122
 123        ret = clk_set_rate(is->clocks[ISS_CLK_MCUISP_DIV0],
 124                                        ATCLK_MCUISP_FREQUENCY);
 125        if (ret < 0)
 126                return ret;
 127
 128        return clk_set_rate(is->clocks[ISS_CLK_MCUISP_DIV1],
 129                                        ATCLK_MCUISP_FREQUENCY);
 130}
 131
 132static int fimc_is_enable_clocks(struct fimc_is *is)
 133{
 134        int i, ret;
 135
 136        for (i = 0; i < ISS_GATE_CLKS_MAX; i++) {
 137                if (IS_ERR(is->clocks[i]))
 138                        continue;
 139                ret = clk_prepare_enable(is->clocks[i]);
 140                if (ret < 0) {
 141                        dev_err(&is->pdev->dev, "clock %s enable failed\n",
 142                                fimc_is_clocks[i]);
 143                        for (--i; i >= 0; i--)
 144                                clk_disable(is->clocks[i]);
 145                        return ret;
 146                }
 147                pr_debug("enabled clock: %s\n", fimc_is_clocks[i]);
 148        }
 149        return 0;
 150}
 151
 152static void fimc_is_disable_clocks(struct fimc_is *is)
 153{
 154        int i;
 155
 156        for (i = 0; i < ISS_GATE_CLKS_MAX; i++) {
 157                if (!IS_ERR(is->clocks[i])) {
 158                        clk_disable_unprepare(is->clocks[i]);
 159                        pr_debug("disabled clock: %s\n", fimc_is_clocks[i]);
 160                }
 161        }
 162}
 163
 164static int fimc_is_parse_sensor_config(struct fimc_is *is, unsigned int index,
 165                                                struct device_node *node)
 166{
 167        struct fimc_is_sensor *sensor = &is->sensor[index];
 168        struct device_node *ep, *port;
 169        u32 tmp = 0;
 170        int ret;
 171
 172        sensor->drvdata = fimc_is_sensor_get_drvdata(node);
 173        if (!sensor->drvdata) {
 174                dev_err(&is->pdev->dev, "no driver data found for: %pOF\n",
 175                                                         node);
 176                return -EINVAL;
 177        }
 178
 179        ep = of_graph_get_next_endpoint(node, NULL);
 180        if (!ep)
 181                return -ENXIO;
 182
 183        port = of_graph_get_remote_port(ep);
 184        of_node_put(ep);
 185        if (!port)
 186                return -ENXIO;
 187
 188        /* Use MIPI-CSIS channel id to determine the ISP I2C bus index. */
 189        ret = of_property_read_u32(port, "reg", &tmp);
 190        if (ret < 0) {
 191                dev_err(&is->pdev->dev, "reg property not found at: %pOF\n",
 192                                                         port);
 193                of_node_put(port);
 194                return ret;
 195        }
 196
 197        of_node_put(port);
 198        sensor->i2c_bus = tmp - FIMC_INPUT_MIPI_CSI2_0;
 199        return 0;
 200}
 201
 202static int fimc_is_register_subdevs(struct fimc_is *is)
 203{
 204        struct device_node *i2c_bus, *child;
 205        int ret, index = 0;
 206
 207        ret = fimc_isp_subdev_create(&is->isp);
 208        if (ret < 0)
 209                return ret;
 210
 211        for_each_compatible_node(i2c_bus, NULL, FIMC_IS_I2C_COMPATIBLE) {
 212                for_each_available_child_of_node(i2c_bus, child) {
 213                        ret = fimc_is_parse_sensor_config(is, index, child);
 214
 215                        if (ret < 0 || index >= FIMC_IS_SENSORS_NUM) {
 216                                of_node_put(child);
 217                                return ret;
 218                        }
 219                        index++;
 220                }
 221        }
 222        return 0;
 223}
 224
 225static int fimc_is_unregister_subdevs(struct fimc_is *is)
 226{
 227        fimc_isp_subdev_destroy(&is->isp);
 228        return 0;
 229}
 230
 231static int fimc_is_load_setfile(struct fimc_is *is, char *file_name)
 232{
 233        const struct firmware *fw;
 234        void *buf;
 235        int ret;
 236
 237        ret = request_firmware(&fw, file_name, &is->pdev->dev);
 238        if (ret < 0) {
 239                dev_err(&is->pdev->dev, "firmware request failed (%d)\n", ret);
 240                return ret;
 241        }
 242        buf = is->memory.vaddr + is->setfile.base;
 243        memcpy(buf, fw->data, fw->size);
 244        fimc_is_mem_barrier();
 245        is->setfile.size = fw->size;
 246
 247        pr_debug("mem vaddr: %p, setfile buf: %p\n", is->memory.vaddr, buf);
 248
 249        memcpy(is->fw.setfile_info,
 250                fw->data + fw->size - FIMC_IS_SETFILE_INFO_LEN,
 251                FIMC_IS_SETFILE_INFO_LEN - 1);
 252
 253        is->fw.setfile_info[FIMC_IS_SETFILE_INFO_LEN - 1] = '\0';
 254        is->setfile.state = 1;
 255
 256        pr_debug("FIMC-IS setfile loaded: base: %#x, size: %zu B\n",
 257                 is->setfile.base, fw->size);
 258
 259        release_firmware(fw);
 260        return ret;
 261}
 262
 263int fimc_is_cpu_set_power(struct fimc_is *is, int on)
 264{
 265        unsigned int timeout = FIMC_IS_POWER_ON_TIMEOUT;
 266
 267        if (on) {
 268                /* Disable watchdog */
 269                mcuctl_write(0, is, REG_WDT_ISP);
 270
 271                /* Cortex-A5 start address setting */
 272                mcuctl_write(is->memory.paddr, is, MCUCTL_REG_BBOAR);
 273
 274                /* Enable and start Cortex-A5 */
 275                pmuisp_write(0x18000, is, REG_PMU_ISP_ARM_OPTION);
 276                pmuisp_write(0x1, is, REG_PMU_ISP_ARM_CONFIGURATION);
 277        } else {
 278                /* A5 power off */
 279                pmuisp_write(0x10000, is, REG_PMU_ISP_ARM_OPTION);
 280                pmuisp_write(0x0, is, REG_PMU_ISP_ARM_CONFIGURATION);
 281
 282                while (pmuisp_read(is, REG_PMU_ISP_ARM_STATUS) & 1) {
 283                        if (timeout == 0)
 284                                return -ETIME;
 285                        timeout--;
 286                        udelay(1);
 287                }
 288        }
 289
 290        return 0;
 291}
 292
 293/* Wait until @bit of @is->state is set to @state in the interrupt handler. */
 294int fimc_is_wait_event(struct fimc_is *is, unsigned long bit,
 295                       unsigned int state, unsigned int timeout)
 296{
 297
 298        int ret = wait_event_timeout(is->irq_queue,
 299                                     !state ^ test_bit(bit, &is->state),
 300                                     timeout);
 301        if (ret == 0) {
 302                dev_WARN(&is->pdev->dev, "%s() timed out\n", __func__);
 303                return -ETIME;
 304        }
 305        return 0;
 306}
 307
 308int fimc_is_start_firmware(struct fimc_is *is)
 309{
 310        struct device *dev = &is->pdev->dev;
 311        int ret;
 312
 313        if (is->fw.f_w == NULL) {
 314                dev_err(dev, "firmware is not loaded\n");
 315                return -EINVAL;
 316        }
 317
 318        memcpy(is->memory.vaddr, is->fw.f_w->data, is->fw.f_w->size);
 319        wmb();
 320
 321        ret = fimc_is_cpu_set_power(is, 1);
 322        if (ret < 0)
 323                return ret;
 324
 325        ret = fimc_is_wait_event(is, IS_ST_A5_PWR_ON, 1,
 326                                 msecs_to_jiffies(FIMC_IS_FW_LOAD_TIMEOUT));
 327        if (ret < 0)
 328                dev_err(dev, "FIMC-IS CPU power on failed\n");
 329
 330        return ret;
 331}
 332
 333/* Allocate working memory for the FIMC-IS CPU. */
 334static int fimc_is_alloc_cpu_memory(struct fimc_is *is)
 335{
 336        struct device *dev = &is->pdev->dev;
 337
 338        is->memory.vaddr = dma_alloc_coherent(dev, FIMC_IS_CPU_MEM_SIZE,
 339                                              &is->memory.paddr, GFP_KERNEL);
 340        if (is->memory.vaddr == NULL)
 341                return -ENOMEM;
 342
 343        is->memory.size = FIMC_IS_CPU_MEM_SIZE;
 344
 345        dev_info(dev, "FIMC-IS CPU memory base: %#x\n", (u32)is->memory.paddr);
 346
 347        if (((u32)is->memory.paddr) & FIMC_IS_FW_ADDR_MASK) {
 348                dev_err(dev, "invalid firmware memory alignment: %#x\n",
 349                        (u32)is->memory.paddr);
 350                dma_free_coherent(dev, is->memory.size, is->memory.vaddr,
 351                                  is->memory.paddr);
 352                return -EIO;
 353        }
 354
 355        is->is_p_region = (struct is_region *)(is->memory.vaddr +
 356                                FIMC_IS_CPU_MEM_SIZE - FIMC_IS_REGION_SIZE);
 357
 358        is->is_dma_p_region = is->memory.paddr +
 359                                FIMC_IS_CPU_MEM_SIZE - FIMC_IS_REGION_SIZE;
 360
 361        is->is_shared_region = (struct is_share_region *)(is->memory.vaddr +
 362                                FIMC_IS_SHARED_REGION_OFFSET);
 363        return 0;
 364}
 365
 366static void fimc_is_free_cpu_memory(struct fimc_is *is)
 367{
 368        struct device *dev = &is->pdev->dev;
 369
 370        if (is->memory.vaddr == NULL)
 371                return;
 372
 373        dma_free_coherent(dev, is->memory.size, is->memory.vaddr,
 374                          is->memory.paddr);
 375}
 376
 377static void fimc_is_load_firmware(const struct firmware *fw, void *context)
 378{
 379        struct fimc_is *is = context;
 380        struct device *dev = &is->pdev->dev;
 381        void *buf;
 382        int ret;
 383
 384        if (fw == NULL) {
 385                dev_err(dev, "firmware request failed\n");
 386                return;
 387        }
 388        mutex_lock(&is->lock);
 389
 390        if (fw->size < FIMC_IS_FW_SIZE_MIN || fw->size > FIMC_IS_FW_SIZE_MAX) {
 391                dev_err(dev, "wrong firmware size: %zu\n", fw->size);
 392                goto done;
 393        }
 394
 395        is->fw.size = fw->size;
 396
 397        ret = fimc_is_alloc_cpu_memory(is);
 398        if (ret < 0) {
 399                dev_err(dev, "failed to allocate FIMC-IS CPU memory\n");
 400                goto done;
 401        }
 402
 403        memcpy(is->memory.vaddr, fw->data, fw->size);
 404        wmb();
 405
 406        /* Read firmware description. */
 407        buf = (void *)(is->memory.vaddr + fw->size - FIMC_IS_FW_DESC_LEN);
 408        memcpy(&is->fw.info, buf, FIMC_IS_FW_INFO_LEN);
 409        is->fw.info[FIMC_IS_FW_INFO_LEN] = 0;
 410
 411        buf = (void *)(is->memory.vaddr + fw->size - FIMC_IS_FW_VER_LEN);
 412        memcpy(&is->fw.version, buf, FIMC_IS_FW_VER_LEN);
 413        is->fw.version[FIMC_IS_FW_VER_LEN - 1] = 0;
 414
 415        is->fw.state = 1;
 416
 417        dev_info(dev, "loaded firmware: %s, rev. %s\n",
 418                 is->fw.info, is->fw.version);
 419        dev_dbg(dev, "FW size: %zu, paddr: %pad\n", fw->size, &is->memory.paddr);
 420
 421        is->is_shared_region->chip_id = 0xe4412;
 422        is->is_shared_region->chip_rev_no = 1;
 423
 424        fimc_is_mem_barrier();
 425
 426        /*
 427         * FIXME: The firmware is not being released for now, as it is
 428         * needed around for copying to the IS working memory every
 429         * time before the Cortex-A5 is restarted.
 430         */
 431        release_firmware(is->fw.f_w);
 432        is->fw.f_w = fw;
 433done:
 434        mutex_unlock(&is->lock);
 435}
 436
 437static int fimc_is_request_firmware(struct fimc_is *is, const char *fw_name)
 438{
 439        return request_firmware_nowait(THIS_MODULE,
 440                                FW_ACTION_HOTPLUG, fw_name, &is->pdev->dev,
 441                                GFP_KERNEL, is, fimc_is_load_firmware);
 442}
 443
 444/* General IS interrupt handler */
 445static void fimc_is_general_irq_handler(struct fimc_is *is)
 446{
 447        is->i2h_cmd.cmd = mcuctl_read(is, MCUCTL_REG_ISSR(10));
 448
 449        switch (is->i2h_cmd.cmd) {
 450        case IHC_GET_SENSOR_NUM:
 451                fimc_is_hw_get_params(is, 1);
 452                fimc_is_hw_wait_intmsr0_intmsd0(is);
 453                fimc_is_hw_set_sensor_num(is);
 454                pr_debug("ISP FW version: %#x\n", is->i2h_cmd.args[0]);
 455                break;
 456        case IHC_SET_FACE_MARK:
 457        case IHC_FRAME_DONE:
 458                fimc_is_hw_get_params(is, 2);
 459                break;
 460        case IHC_SET_SHOT_MARK:
 461        case IHC_AA_DONE:
 462        case IH_REPLY_DONE:
 463                fimc_is_hw_get_params(is, 3);
 464                break;
 465        case IH_REPLY_NOT_DONE:
 466                fimc_is_hw_get_params(is, 4);
 467                break;
 468        case IHC_NOT_READY:
 469                break;
 470        default:
 471                pr_info("unknown command: %#x\n", is->i2h_cmd.cmd);
 472        }
 473
 474        fimc_is_fw_clear_irq1(is, FIMC_IS_INT_GENERAL);
 475
 476        switch (is->i2h_cmd.cmd) {
 477        case IHC_GET_SENSOR_NUM:
 478                fimc_is_hw_set_intgr0_gd0(is);
 479                set_bit(IS_ST_A5_PWR_ON, &is->state);
 480                break;
 481
 482        case IHC_SET_SHOT_MARK:
 483                break;
 484
 485        case IHC_SET_FACE_MARK:
 486                is->fd_header.count = is->i2h_cmd.args[0];
 487                is->fd_header.index = is->i2h_cmd.args[1];
 488                is->fd_header.offset = 0;
 489                break;
 490
 491        case IHC_FRAME_DONE:
 492                break;
 493
 494        case IHC_AA_DONE:
 495                pr_debug("AA_DONE - %d, %d, %d\n", is->i2h_cmd.args[0],
 496                         is->i2h_cmd.args[1], is->i2h_cmd.args[2]);
 497                break;
 498
 499        case IH_REPLY_DONE:
 500                pr_debug("ISR_DONE: args[0]: %#x\n", is->i2h_cmd.args[0]);
 501
 502                switch (is->i2h_cmd.args[0]) {
 503                case HIC_PREVIEW_STILL...HIC_CAPTURE_VIDEO:
 504                        /* Get CAC margin */
 505                        set_bit(IS_ST_CHANGE_MODE, &is->state);
 506                        is->isp.cac_margin_x = is->i2h_cmd.args[1];
 507                        is->isp.cac_margin_y = is->i2h_cmd.args[2];
 508                        pr_debug("CAC margin (x,y): (%d,%d)\n",
 509                                 is->isp.cac_margin_x, is->isp.cac_margin_y);
 510                        break;
 511
 512                case HIC_STREAM_ON:
 513                        clear_bit(IS_ST_STREAM_OFF, &is->state);
 514                        set_bit(IS_ST_STREAM_ON, &is->state);
 515                        break;
 516
 517                case HIC_STREAM_OFF:
 518                        clear_bit(IS_ST_STREAM_ON, &is->state);
 519                        set_bit(IS_ST_STREAM_OFF, &is->state);
 520                        break;
 521
 522                case HIC_SET_PARAMETER:
 523                        is->config[is->config_index].p_region_index[0] = 0;
 524                        is->config[is->config_index].p_region_index[1] = 0;
 525                        set_bit(IS_ST_BLOCK_CMD_CLEARED, &is->state);
 526                        pr_debug("HIC_SET_PARAMETER\n");
 527                        break;
 528
 529                case HIC_GET_PARAMETER:
 530                        break;
 531
 532                case HIC_SET_TUNE:
 533                        break;
 534
 535                case HIC_GET_STATUS:
 536                        break;
 537
 538                case HIC_OPEN_SENSOR:
 539                        set_bit(IS_ST_OPEN_SENSOR, &is->state);
 540                        pr_debug("data lanes: %d, settle line: %d\n",
 541                                 is->i2h_cmd.args[2], is->i2h_cmd.args[1]);
 542                        break;
 543
 544                case HIC_CLOSE_SENSOR:
 545                        clear_bit(IS_ST_OPEN_SENSOR, &is->state);
 546                        is->sensor_index = 0;
 547                        break;
 548
 549                case HIC_MSG_TEST:
 550                        pr_debug("config MSG level completed\n");
 551                        break;
 552
 553                case HIC_POWER_DOWN:
 554                        clear_bit(IS_ST_PWR_SUBIP_ON, &is->state);
 555                        break;
 556
 557                case HIC_GET_SET_FILE_ADDR:
 558                        is->setfile.base = is->i2h_cmd.args[1];
 559                        set_bit(IS_ST_SETFILE_LOADED, &is->state);
 560                        break;
 561
 562                case HIC_LOAD_SET_FILE:
 563                        set_bit(IS_ST_SETFILE_LOADED, &is->state);
 564                        break;
 565                }
 566                break;
 567
 568        case IH_REPLY_NOT_DONE:
 569                pr_err("ISR_NDONE: %d: %#x, %s\n", is->i2h_cmd.args[0],
 570                       is->i2h_cmd.args[1],
 571                       fimc_is_strerr(is->i2h_cmd.args[1]));
 572
 573                if (is->i2h_cmd.args[1] & IS_ERROR_TIME_OUT_FLAG)
 574                        pr_err("IS_ERROR_TIME_OUT\n");
 575
 576                switch (is->i2h_cmd.args[1]) {
 577                case IS_ERROR_SET_PARAMETER:
 578                        fimc_is_mem_barrier();
 579                }
 580
 581                switch (is->i2h_cmd.args[0]) {
 582                case HIC_SET_PARAMETER:
 583                        is->config[is->config_index].p_region_index[0] = 0;
 584                        is->config[is->config_index].p_region_index[1] = 0;
 585                        set_bit(IS_ST_BLOCK_CMD_CLEARED, &is->state);
 586                        break;
 587                }
 588                break;
 589
 590        case IHC_NOT_READY:
 591                pr_err("IS control sequence error: Not Ready\n");
 592                break;
 593        }
 594
 595        wake_up(&is->irq_queue);
 596}
 597
 598static irqreturn_t fimc_is_irq_handler(int irq, void *priv)
 599{
 600        struct fimc_is *is = priv;
 601        unsigned long flags;
 602        u32 status;
 603
 604        spin_lock_irqsave(&is->slock, flags);
 605        status = mcuctl_read(is, MCUCTL_REG_INTSR1);
 606
 607        if (status & (1UL << FIMC_IS_INT_GENERAL))
 608                fimc_is_general_irq_handler(is);
 609
 610        if (status & (1UL << FIMC_IS_INT_FRAME_DONE_ISP))
 611                fimc_isp_irq_handler(is);
 612
 613        spin_unlock_irqrestore(&is->slock, flags);
 614        return IRQ_HANDLED;
 615}
 616
 617static int fimc_is_hw_open_sensor(struct fimc_is *is,
 618                                  struct fimc_is_sensor *sensor)
 619{
 620        struct sensor_open_extended *soe = (void *)&is->is_p_region->shared;
 621
 622        fimc_is_hw_wait_intmsr0_intmsd0(is);
 623
 624        soe->self_calibration_mode = 1;
 625        soe->actuator_type = 0;
 626        soe->mipi_lane_num = 0;
 627        soe->mclk = 0;
 628        soe->mipi_speed = 0;
 629        soe->fast_open_sensor = 0;
 630        soe->i2c_sclk = 88000000;
 631
 632        fimc_is_mem_barrier();
 633
 634        /*
 635         * Some user space use cases hang up here without this
 636         * empirically chosen delay.
 637         */
 638        udelay(100);
 639
 640        mcuctl_write(HIC_OPEN_SENSOR, is, MCUCTL_REG_ISSR(0));
 641        mcuctl_write(is->sensor_index, is, MCUCTL_REG_ISSR(1));
 642        mcuctl_write(sensor->drvdata->id, is, MCUCTL_REG_ISSR(2));
 643        mcuctl_write(sensor->i2c_bus, is, MCUCTL_REG_ISSR(3));
 644        mcuctl_write(is->is_dma_p_region, is, MCUCTL_REG_ISSR(4));
 645
 646        fimc_is_hw_set_intgr0_gd0(is);
 647
 648        return fimc_is_wait_event(is, IS_ST_OPEN_SENSOR, 1,
 649                                  sensor->drvdata->open_timeout);
 650}
 651
 652
 653int fimc_is_hw_initialize(struct fimc_is *is)
 654{
 655        static const int config_ids[] = {
 656                IS_SC_PREVIEW_STILL, IS_SC_PREVIEW_VIDEO,
 657                IS_SC_CAPTURE_STILL, IS_SC_CAPTURE_VIDEO
 658        };
 659        struct device *dev = &is->pdev->dev;
 660        u32 prev_id;
 661        int i, ret;
 662
 663        /* Sensor initialization. Only one sensor is currently supported. */
 664        ret = fimc_is_hw_open_sensor(is, &is->sensor[0]);
 665        if (ret < 0)
 666                return ret;
 667
 668        /* Get the setfile address. */
 669        fimc_is_hw_get_setfile_addr(is);
 670
 671        ret = fimc_is_wait_event(is, IS_ST_SETFILE_LOADED, 1,
 672                                 FIMC_IS_CONFIG_TIMEOUT);
 673        if (ret < 0) {
 674                dev_err(dev, "get setfile address timed out\n");
 675                return ret;
 676        }
 677        pr_debug("setfile.base: %#x\n", is->setfile.base);
 678
 679        /* Load the setfile. */
 680        fimc_is_load_setfile(is, FIMC_IS_SETFILE_6A3);
 681        clear_bit(IS_ST_SETFILE_LOADED, &is->state);
 682        fimc_is_hw_load_setfile(is);
 683        ret = fimc_is_wait_event(is, IS_ST_SETFILE_LOADED, 1,
 684                                 FIMC_IS_CONFIG_TIMEOUT);
 685        if (ret < 0) {
 686                dev_err(dev, "loading setfile timed out\n");
 687                return ret;
 688        }
 689
 690        pr_debug("setfile: base: %#x, size: %d\n",
 691                 is->setfile.base, is->setfile.size);
 692        pr_info("FIMC-IS Setfile info: %s\n", is->fw.setfile_info);
 693
 694        /* Check magic number. */
 695        if (is->is_p_region->shared[MAX_SHARED_COUNT - 1] !=
 696            FIMC_IS_MAGIC_NUMBER) {
 697                dev_err(dev, "magic number error!\n");
 698                return -EIO;
 699        }
 700
 701        pr_debug("shared region: %pad, parameter region: %pad\n",
 702                 &is->memory.paddr + FIMC_IS_SHARED_REGION_OFFSET,
 703                 &is->is_dma_p_region);
 704
 705        is->setfile.sub_index = 0;
 706
 707        /* Stream off. */
 708        fimc_is_hw_stream_off(is);
 709        ret = fimc_is_wait_event(is, IS_ST_STREAM_OFF, 1,
 710                                 FIMC_IS_CONFIG_TIMEOUT);
 711        if (ret < 0) {
 712                dev_err(dev, "stream off timeout\n");
 713                return ret;
 714        }
 715
 716        /* Preserve previous mode. */
 717        prev_id = is->config_index;
 718
 719        /* Set initial parameter values. */
 720        for (i = 0; i < ARRAY_SIZE(config_ids); i++) {
 721                is->config_index = config_ids[i];
 722                fimc_is_set_initial_params(is);
 723                ret = fimc_is_itf_s_param(is, true);
 724                if (ret < 0) {
 725                        is->config_index = prev_id;
 726                        return ret;
 727                }
 728        }
 729        is->config_index = prev_id;
 730
 731        set_bit(IS_ST_INIT_DONE, &is->state);
 732        dev_info(dev, "initialization sequence completed (%d)\n",
 733                                                is->config_index);
 734        return 0;
 735}
 736
 737static int fimc_is_show(struct seq_file *s, void *data)
 738{
 739        struct fimc_is *is = s->private;
 740        const u8 *buf = is->memory.vaddr + FIMC_IS_DEBUG_REGION_OFFSET;
 741
 742        if (is->memory.vaddr == NULL) {
 743                dev_err(&is->pdev->dev, "firmware memory is not initialized\n");
 744                return -EIO;
 745        }
 746
 747        seq_printf(s, "%s\n", buf);
 748        return 0;
 749}
 750
 751DEFINE_SHOW_ATTRIBUTE(fimc_is);
 752
 753static void fimc_is_debugfs_remove(struct fimc_is *is)
 754{
 755        debugfs_remove_recursive(is->debugfs_entry);
 756        is->debugfs_entry = NULL;
 757}
 758
 759static int fimc_is_debugfs_create(struct fimc_is *is)
 760{
 761        struct dentry *dentry;
 762
 763        is->debugfs_entry = debugfs_create_dir("fimc_is", NULL);
 764
 765        dentry = debugfs_create_file("fw_log", S_IRUGO, is->debugfs_entry,
 766                                     is, &fimc_is_fops);
 767        if (!dentry)
 768                fimc_is_debugfs_remove(is);
 769
 770        return is->debugfs_entry == NULL ? -EIO : 0;
 771}
 772
 773static int fimc_is_runtime_resume(struct device *dev);
 774static int fimc_is_runtime_suspend(struct device *dev);
 775
 776static int fimc_is_probe(struct platform_device *pdev)
 777{
 778        struct device *dev = &pdev->dev;
 779        struct fimc_is *is;
 780        struct resource res;
 781        struct device_node *node;
 782        int ret;
 783
 784        is = devm_kzalloc(&pdev->dev, sizeof(*is), GFP_KERNEL);
 785        if (!is)
 786                return -ENOMEM;
 787
 788        is->pdev = pdev;
 789        is->isp.pdev = pdev;
 790
 791        init_waitqueue_head(&is->irq_queue);
 792        spin_lock_init(&is->slock);
 793        mutex_init(&is->lock);
 794
 795        ret = of_address_to_resource(dev->of_node, 0, &res);
 796        if (ret < 0)
 797                return ret;
 798
 799        is->regs = devm_ioremap_resource(dev, &res);
 800        if (IS_ERR(is->regs))
 801                return PTR_ERR(is->regs);
 802
 803        node = of_get_child_by_name(dev->of_node, "pmu");
 804        if (!node)
 805                return -ENODEV;
 806
 807        is->pmu_regs = of_iomap(node, 0);
 808        of_node_put(node);
 809        if (!is->pmu_regs)
 810                return -ENOMEM;
 811
 812        is->irq = irq_of_parse_and_map(dev->of_node, 0);
 813        if (!is->irq) {
 814                dev_err(dev, "no irq found\n");
 815                ret = -EINVAL;
 816                goto err_iounmap;
 817        }
 818
 819        ret = fimc_is_get_clocks(is);
 820        if (ret < 0)
 821                goto err_iounmap;
 822
 823        platform_set_drvdata(pdev, is);
 824
 825        ret = request_irq(is->irq, fimc_is_irq_handler, 0, dev_name(dev), is);
 826        if (ret < 0) {
 827                dev_err(dev, "irq request failed\n");
 828                goto err_clk;
 829        }
 830        pm_runtime_enable(dev);
 831
 832        if (!pm_runtime_enabled(dev)) {
 833                ret = fimc_is_runtime_resume(dev);
 834                if (ret < 0)
 835                        goto err_irq;
 836        }
 837
 838        ret = pm_runtime_get_sync(dev);
 839        if (ret < 0)
 840                goto err_pm;
 841
 842        vb2_dma_contig_set_max_seg_size(dev, DMA_BIT_MASK(32));
 843
 844        ret = devm_of_platform_populate(dev);
 845        if (ret < 0)
 846                goto err_pm;
 847
 848        /*
 849         * Register FIMC-IS V4L2 subdevs to this driver. The video nodes
 850         * will be created within the subdev's registered() callback.
 851         */
 852        ret = fimc_is_register_subdevs(is);
 853        if (ret < 0)
 854                goto err_pm;
 855
 856        ret = fimc_is_debugfs_create(is);
 857        if (ret < 0)
 858                goto err_sd;
 859
 860        ret = fimc_is_request_firmware(is, FIMC_IS_FW_FILENAME);
 861        if (ret < 0)
 862                goto err_dfs;
 863
 864        pm_runtime_put_sync(dev);
 865
 866        dev_dbg(dev, "FIMC-IS registered successfully\n");
 867        return 0;
 868
 869err_dfs:
 870        fimc_is_debugfs_remove(is);
 871err_sd:
 872        fimc_is_unregister_subdevs(is);
 873err_pm:
 874        pm_runtime_put_noidle(dev);
 875        if (!pm_runtime_enabled(dev))
 876                fimc_is_runtime_suspend(dev);
 877err_irq:
 878        free_irq(is->irq, is);
 879err_clk:
 880        fimc_is_put_clocks(is);
 881err_iounmap:
 882        iounmap(is->pmu_regs);
 883        return ret;
 884}
 885
 886static int fimc_is_runtime_resume(struct device *dev)
 887{
 888        struct fimc_is *is = dev_get_drvdata(dev);
 889        int ret;
 890
 891        ret = fimc_is_setup_clocks(is);
 892        if (ret)
 893                return ret;
 894
 895        return fimc_is_enable_clocks(is);
 896}
 897
 898static int fimc_is_runtime_suspend(struct device *dev)
 899{
 900        struct fimc_is *is = dev_get_drvdata(dev);
 901
 902        fimc_is_disable_clocks(is);
 903        return 0;
 904}
 905
 906#ifdef CONFIG_PM_SLEEP
 907static int fimc_is_resume(struct device *dev)
 908{
 909        /* TODO: */
 910        return 0;
 911}
 912
 913static int fimc_is_suspend(struct device *dev)
 914{
 915        struct fimc_is *is = dev_get_drvdata(dev);
 916
 917        /* TODO: */
 918        if (test_bit(IS_ST_A5_PWR_ON, &is->state))
 919                return -EBUSY;
 920
 921        return 0;
 922}
 923#endif /* CONFIG_PM_SLEEP */
 924
 925static int fimc_is_remove(struct platform_device *pdev)
 926{
 927        struct device *dev = &pdev->dev;
 928        struct fimc_is *is = dev_get_drvdata(dev);
 929
 930        pm_runtime_disable(dev);
 931        pm_runtime_set_suspended(dev);
 932        if (!pm_runtime_status_suspended(dev))
 933                fimc_is_runtime_suspend(dev);
 934        free_irq(is->irq, is);
 935        fimc_is_unregister_subdevs(is);
 936        vb2_dma_contig_clear_max_seg_size(dev);
 937        fimc_is_put_clocks(is);
 938        iounmap(is->pmu_regs);
 939        fimc_is_debugfs_remove(is);
 940        release_firmware(is->fw.f_w);
 941        fimc_is_free_cpu_memory(is);
 942
 943        return 0;
 944}
 945
 946static const struct of_device_id fimc_is_of_match[] = {
 947        { .compatible = "samsung,exynos4212-fimc-is" },
 948        { /* sentinel */ },
 949};
 950MODULE_DEVICE_TABLE(of, fimc_is_of_match);
 951
 952static const struct dev_pm_ops fimc_is_pm_ops = {
 953        SET_SYSTEM_SLEEP_PM_OPS(fimc_is_suspend, fimc_is_resume)
 954        SET_RUNTIME_PM_OPS(fimc_is_runtime_suspend, fimc_is_runtime_resume,
 955                           NULL)
 956};
 957
 958static struct platform_driver fimc_is_driver = {
 959        .probe          = fimc_is_probe,
 960        .remove         = fimc_is_remove,
 961        .driver = {
 962                .of_match_table = fimc_is_of_match,
 963                .name           = FIMC_IS_DRV_NAME,
 964                .pm             = &fimc_is_pm_ops,
 965        }
 966};
 967
 968static int fimc_is_module_init(void)
 969{
 970        int ret;
 971
 972        ret = fimc_is_register_i2c_driver();
 973        if (ret < 0)
 974                return ret;
 975
 976        ret = platform_driver_register(&fimc_is_driver);
 977
 978        if (ret < 0)
 979                fimc_is_unregister_i2c_driver();
 980
 981        return ret;
 982}
 983
 984static void fimc_is_module_exit(void)
 985{
 986        fimc_is_unregister_i2c_driver();
 987        platform_driver_unregister(&fimc_is_driver);
 988}
 989
 990module_init(fimc_is_module_init);
 991module_exit(fimc_is_module_exit);
 992
 993MODULE_ALIAS("platform:" FIMC_IS_DRV_NAME);
 994MODULE_AUTHOR("Younghwan Joo <yhwan.joo@samsung.com>");
 995MODULE_AUTHOR("Sylwester Nawrocki <s.nawrocki@samsung.com>");
 996MODULE_LICENSE("GPL v2");
 997