linux/drivers/staging/media/atomisp/pci/atomisp2/css2400/hive_isp_css_shared/host/tag.c
<<
>>
Prefs
   1/*
   2 * Support for Intel Camera Imaging ISP subsystem.
   3 * Copyright (c) 2015, Intel Corporation.
   4 *
   5 * This program is free software; you can redistribute it and/or modify it
   6 * under the terms and conditions of the GNU General Public License,
   7 * version 2, as published by the Free Software Foundation.
   8 *
   9 * This program is distributed in the hope it will be useful, but WITHOUT
  10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
  12 * more details.
  13 */
  14
  15#include "tag.h"
  16#include <platform_support.h>   /* NULL */
  17#include <assert_support.h>
  18#include "tag_local.h"
  19
  20/*
  21 * @brief       Creates the tag description from the given parameters.
  22 * @param[in]   num_captures
  23 * @param[in]   skip
  24 * @param[in]   offset
  25 * @param[out]  tag_descr
  26 */
  27void
  28sh_css_create_tag_descr(int num_captures,
  29                        unsigned int skip,
  30                        int offset,
  31                        unsigned int exp_id,
  32                        struct sh_css_tag_descr *tag_descr)
  33{
  34        assert(tag_descr != NULL);
  35
  36        tag_descr->num_captures = num_captures;
  37        tag_descr->skip         = skip;
  38        tag_descr->offset       = offset;
  39        tag_descr->exp_id       = exp_id;
  40}
  41
  42/*
  43 * @brief       Encodes the members of tag description into a 32-bit value.
  44 * @param[in]   tag             Pointer to the tag description
  45 * @return      (unsigned int)  Encoded 32-bit tag-info
  46 */
  47unsigned int
  48sh_css_encode_tag_descr(struct sh_css_tag_descr *tag)
  49{
  50        int num_captures;
  51        unsigned int num_captures_sign;
  52        unsigned int skip;
  53        int offset;
  54        unsigned int offset_sign;
  55        unsigned int exp_id;
  56        unsigned int encoded_tag;
  57
  58        assert(tag != NULL);
  59
  60        if (tag->num_captures < 0) {
  61                num_captures = -tag->num_captures;
  62                num_captures_sign = 1;
  63        } else {
  64                num_captures = tag->num_captures;
  65                num_captures_sign = 0;
  66        }
  67        skip = tag->skip;
  68        if (tag->offset < 0) {
  69                offset = -tag->offset;
  70                offset_sign = 1;
  71        } else {
  72                offset = tag->offset;
  73                offset_sign = 0;
  74        }
  75        exp_id = tag->exp_id;
  76
  77        if (exp_id != 0)
  78        {
  79                /* we encode either an exp_id or capture data */
  80                assert((num_captures == 0) && (skip == 0) && (offset == 0));
  81
  82                encoded_tag = TAG_EXP | (exp_id & 0xFF) << TAG_EXP_ID_SHIFT;
  83        }
  84        else
  85        {
  86                encoded_tag = TAG_CAP 
  87                                | ((num_captures_sign & 0x00000001) << TAG_NUM_CAPTURES_SIGN_SHIFT)
  88                                | ((offset_sign       & 0x00000001) << TAG_OFFSET_SIGN_SHIFT)
  89                                | ((num_captures      & 0x000000FF) << TAG_NUM_CAPTURES_SHIFT)
  90                                | ((skip              & 0x000000FF) << TAG_OFFSET_SHIFT)
  91                                | ((offset            & 0x000000FF) << TAG_SKIP_SHIFT);
  92
  93        }
  94        return encoded_tag;
  95}
  96