cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

media-dev.h (5432B)


      1/* SPDX-License-Identifier: GPL-2.0-only */
      2/*
      3 * Copyright (C) 2011 - 2012 Samsung Electronics Co., Ltd.
      4 */
      5
      6#ifndef FIMC_MDEVICE_H_
      7#define FIMC_MDEVICE_H_
      8
      9#include <linux/clk.h>
     10#include <linux/clk-provider.h>
     11#include <linux/platform_device.h>
     12#include <linux/mutex.h>
     13#include <linux/of.h>
     14#include <linux/pinctrl/consumer.h>
     15#include <media/media-device.h>
     16#include <media/media-entity.h>
     17#include <media/v4l2-device.h>
     18#include <media/v4l2-subdev.h>
     19#include <media/drv-intf/exynos-fimc.h>
     20
     21#include "fimc-core.h"
     22#include "fimc-lite.h"
     23#include "mipi-csis.h"
     24
     25#define FIMC_OF_NODE_NAME	"fimc"
     26#define FIMC_LITE_OF_NODE_NAME	"fimc-lite"
     27#define FIMC_IS_OF_NODE_NAME	"fimc-is"
     28#define CSIS_OF_NODE_NAME	"csis"
     29
     30#define FIMC_MAX_SENSORS	4
     31#define FIMC_MAX_CAMCLKS	2
     32#define DEFAULT_SENSOR_CLK_FREQ	24000000U
     33
     34/* LCD/ISP Writeback clocks (PIXELASYNCMx) */
     35enum {
     36	CLK_IDX_WB_A,
     37	CLK_IDX_WB_B,
     38	FIMC_MAX_WBCLKS
     39};
     40
     41enum fimc_subdev_index {
     42	IDX_SENSOR,
     43	IDX_CSIS,
     44	IDX_FLITE,
     45	IDX_IS_ISP,
     46	IDX_FIMC,
     47	IDX_MAX,
     48};
     49
     50/*
     51 * This structure represents a chain of media entities, including a data
     52 * source entity (e.g. an image sensor subdevice), a data capture entity
     53 * - a video capture device node and any remaining entities.
     54 */
     55struct fimc_pipeline {
     56	struct exynos_media_pipeline ep;
     57	struct list_head list;
     58	struct media_entity *vdev_entity;
     59	struct v4l2_subdev *subdevs[IDX_MAX];
     60};
     61
     62#define to_fimc_pipeline(_ep) container_of(_ep, struct fimc_pipeline, ep)
     63
     64struct fimc_csis_info {
     65	struct v4l2_subdev *sd;
     66	int id;
     67};
     68
     69struct fimc_camclk_info {
     70	struct clk *clock;
     71	int use_count;
     72	unsigned long frequency;
     73};
     74
     75/**
     76 * struct fimc_sensor_info - image data source subdev information
     77 * @pdata: sensor's attributes passed as media device's platform data
     78 * @asd: asynchronous subdev registration data structure
     79 * @subdev: image sensor v4l2 subdev
     80 * @host: fimc device the sensor is currently linked to
     81 *
     82 * This data structure applies to image sensor and the writeback subdevs.
     83 */
     84struct fimc_sensor_info {
     85	struct fimc_source_info pdata;
     86	struct v4l2_async_subdev *asd;
     87	struct v4l2_subdev *subdev;
     88	struct fimc_dev *host;
     89};
     90
     91struct cam_clk {
     92	struct clk_hw hw;
     93	struct fimc_md *fmd;
     94};
     95#define to_cam_clk(_hw) container_of(_hw, struct cam_clk, hw)
     96
     97/**
     98 * struct fimc_md - fimc media device information
     99 * @csis: MIPI CSIS subdevs data
    100 * @sensor: array of registered sensor subdevs
    101 * @num_sensors: actual number of registered sensors
    102 * @camclk: external sensor clock information
    103 * @wbclk: external writeback clock information
    104 * @fimc_lite: array of registered fimc-lite devices
    105 * @fimc: array of registered fimc devices
    106 * @fimc_is: fimc-is data structure
    107 * @use_isp: set to true when FIMC-IS subsystem is used
    108 * @pmf: handle to the CAMCLK clock control FIMC helper device
    109 * @media_dev: top level media device
    110 * @v4l2_dev: top level v4l2_device holding up the subdevs
    111 * @pdev: platform device this media device is hooked up into
    112 * @clk_provider: CAMCLK clock provider structure
    113 * @subdev_notifier: notifier for the subdevs
    114 * @user_subdev_api: true if subdevs are not configured by the host driver
    115 * @slock: spinlock protecting @sensor array
    116 * @pipelines: list of pipelines
    117 * @link_setup_graph: graph iterator
    118 */
    119struct fimc_md {
    120	struct fimc_csis_info csis[CSIS_MAX_ENTITIES];
    121	struct fimc_sensor_info sensor[FIMC_MAX_SENSORS];
    122	int num_sensors;
    123	struct fimc_camclk_info camclk[FIMC_MAX_CAMCLKS];
    124	struct clk *wbclk[FIMC_MAX_WBCLKS];
    125	struct fimc_lite *fimc_lite[FIMC_LITE_MAX_DEVS];
    126	struct fimc_dev *fimc[FIMC_MAX_DEVS];
    127	struct fimc_is *fimc_is;
    128	bool use_isp;
    129	struct device *pmf;
    130	struct media_device media_dev;
    131	struct v4l2_device v4l2_dev;
    132	struct platform_device *pdev;
    133
    134	struct cam_clk_provider {
    135		struct clk *clks[FIMC_MAX_CAMCLKS];
    136		struct clk_onecell_data clk_data;
    137		struct device_node *of_node;
    138		struct cam_clk camclk[FIMC_MAX_CAMCLKS];
    139		int num_clocks;
    140	} clk_provider;
    141
    142	struct v4l2_async_notifier subdev_notifier;
    143
    144	bool user_subdev_api;
    145	spinlock_t slock;
    146	struct list_head pipelines;
    147	struct media_graph link_setup_graph;
    148};
    149
    150static inline
    151struct fimc_sensor_info *source_to_sensor_info(struct fimc_source_info *si)
    152{
    153	return container_of(si, struct fimc_sensor_info, pdata);
    154}
    155
    156static inline struct fimc_md *entity_to_fimc_mdev(struct media_entity *me)
    157{
    158	return me->graph_obj.mdev == NULL ? NULL :
    159		container_of(me->graph_obj.mdev, struct fimc_md, media_dev);
    160}
    161
    162static inline struct fimc_md *notifier_to_fimc_md(struct v4l2_async_notifier *n)
    163{
    164	return container_of(n, struct fimc_md, subdev_notifier);
    165}
    166
    167static inline void fimc_md_graph_lock(struct exynos_video_entity *ve)
    168{
    169	mutex_lock(&ve->vdev.entity.graph_obj.mdev->graph_mutex);
    170}
    171
    172static inline void fimc_md_graph_unlock(struct exynos_video_entity *ve)
    173{
    174	mutex_unlock(&ve->vdev.entity.graph_obj.mdev->graph_mutex);
    175}
    176
    177int fimc_md_set_camclk(struct v4l2_subdev *sd, bool on);
    178
    179#ifdef CONFIG_OF
    180static inline bool fimc_md_is_isp_available(struct device_node *node)
    181{
    182	node = of_get_child_by_name(node, FIMC_IS_OF_NODE_NAME);
    183	return node ? of_device_is_available(node) : false;
    184}
    185#else
    186#define fimc_md_is_isp_available(node) (false)
    187#endif /* CONFIG_OF */
    188
    189static inline struct v4l2_subdev *__fimc_md_get_subdev(
    190				struct exynos_media_pipeline *ep,
    191				unsigned int index)
    192{
    193	struct fimc_pipeline *p = to_fimc_pipeline(ep);
    194
    195	if (!p || index >= IDX_MAX)
    196		return NULL;
    197	else
    198		return p->subdevs[index];
    199}
    200
    201#endif