162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * camss.h
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * Qualcomm MSM Camera Subsystem - Core
662306a36Sopenharmony_ci *
762306a36Sopenharmony_ci * Copyright (c) 2015, The Linux Foundation. All rights reserved.
862306a36Sopenharmony_ci * Copyright (C) 2015-2018 Linaro Ltd.
962306a36Sopenharmony_ci */
1062306a36Sopenharmony_ci#ifndef QC_MSM_CAMSS_H
1162306a36Sopenharmony_ci#define QC_MSM_CAMSS_H
1262306a36Sopenharmony_ci
1362306a36Sopenharmony_ci#include <linux/device.h>
1462306a36Sopenharmony_ci#include <linux/types.h>
1562306a36Sopenharmony_ci#include <media/v4l2-async.h>
1662306a36Sopenharmony_ci#include <media/v4l2-device.h>
1762306a36Sopenharmony_ci#include <media/v4l2-subdev.h>
1862306a36Sopenharmony_ci#include <media/media-device.h>
1962306a36Sopenharmony_ci#include <media/media-entity.h>
2062306a36Sopenharmony_ci
2162306a36Sopenharmony_ci#include "camss-csid.h"
2262306a36Sopenharmony_ci#include "camss-csiphy.h"
2362306a36Sopenharmony_ci#include "camss-ispif.h"
2462306a36Sopenharmony_ci#include "camss-vfe.h"
2562306a36Sopenharmony_ci
2662306a36Sopenharmony_ci#define to_camss(ptr_module)	\
2762306a36Sopenharmony_ci	container_of(ptr_module, struct camss, ptr_module)
2862306a36Sopenharmony_ci
2962306a36Sopenharmony_ci#define to_device(ptr_module)	\
3062306a36Sopenharmony_ci	(to_camss(ptr_module)->dev)
3162306a36Sopenharmony_ci
3262306a36Sopenharmony_ci#define module_pointer(ptr_module, index)	\
3362306a36Sopenharmony_ci	((const struct ptr_module##_device (*)[]) &(ptr_module[-(index)]))
3462306a36Sopenharmony_ci
3562306a36Sopenharmony_ci#define to_camss_index(ptr_module, index)	\
3662306a36Sopenharmony_ci	container_of(module_pointer(ptr_module, index),	\
3762306a36Sopenharmony_ci		     struct camss, ptr_module)
3862306a36Sopenharmony_ci
3962306a36Sopenharmony_ci#define to_device_index(ptr_module, index)	\
4062306a36Sopenharmony_ci	(to_camss_index(ptr_module, index)->dev)
4162306a36Sopenharmony_ci
4262306a36Sopenharmony_ci#define CAMSS_RES_MAX 17
4362306a36Sopenharmony_ci
4462306a36Sopenharmony_cistruct resources {
4562306a36Sopenharmony_ci	char *regulators[CAMSS_RES_MAX];
4662306a36Sopenharmony_ci	char *clock[CAMSS_RES_MAX];
4762306a36Sopenharmony_ci	u32 clock_rate[CAMSS_RES_MAX][CAMSS_RES_MAX];
4862306a36Sopenharmony_ci	char *reg[CAMSS_RES_MAX];
4962306a36Sopenharmony_ci	char *interrupt[CAMSS_RES_MAX];
5062306a36Sopenharmony_ci};
5162306a36Sopenharmony_ci
5262306a36Sopenharmony_cistruct resources_ispif {
5362306a36Sopenharmony_ci	char *clock[CAMSS_RES_MAX];
5462306a36Sopenharmony_ci	char *clock_for_reset[CAMSS_RES_MAX];
5562306a36Sopenharmony_ci	char *reg[CAMSS_RES_MAX];
5662306a36Sopenharmony_ci	char *interrupt;
5762306a36Sopenharmony_ci};
5862306a36Sopenharmony_ci
5962306a36Sopenharmony_cistruct icc_bw_tbl {
6062306a36Sopenharmony_ci	u32 avg;
6162306a36Sopenharmony_ci	u32 peak;
6262306a36Sopenharmony_ci};
6362306a36Sopenharmony_ci
6462306a36Sopenharmony_cistruct resources_icc {
6562306a36Sopenharmony_ci	char *name;
6662306a36Sopenharmony_ci	struct icc_bw_tbl icc_bw_tbl;
6762306a36Sopenharmony_ci};
6862306a36Sopenharmony_ci
6962306a36Sopenharmony_cienum pm_domain {
7062306a36Sopenharmony_ci	PM_DOMAIN_VFE0 = 0,
7162306a36Sopenharmony_ci	PM_DOMAIN_VFE1 = 1,
7262306a36Sopenharmony_ci	PM_DOMAIN_VFELITE = 2,		/* VFELITE / TOP GDSC */
7362306a36Sopenharmony_ci};
7462306a36Sopenharmony_ci
7562306a36Sopenharmony_cienum camss_version {
7662306a36Sopenharmony_ci	CAMSS_8x16,
7762306a36Sopenharmony_ci	CAMSS_8x96,
7862306a36Sopenharmony_ci	CAMSS_660,
7962306a36Sopenharmony_ci	CAMSS_845,
8062306a36Sopenharmony_ci	CAMSS_8250,
8162306a36Sopenharmony_ci};
8262306a36Sopenharmony_ci
8362306a36Sopenharmony_cienum icc_count {
8462306a36Sopenharmony_ci	ICC_DEFAULT_COUNT = 0,
8562306a36Sopenharmony_ci	ICC_SM8250_COUNT = 4,
8662306a36Sopenharmony_ci};
8762306a36Sopenharmony_ci
8862306a36Sopenharmony_cistruct camss {
8962306a36Sopenharmony_ci	enum camss_version version;
9062306a36Sopenharmony_ci	struct v4l2_device v4l2_dev;
9162306a36Sopenharmony_ci	struct v4l2_async_notifier notifier;
9262306a36Sopenharmony_ci	struct media_device media_dev;
9362306a36Sopenharmony_ci	struct device *dev;
9462306a36Sopenharmony_ci	int csiphy_num;
9562306a36Sopenharmony_ci	struct csiphy_device *csiphy;
9662306a36Sopenharmony_ci	int csid_num;
9762306a36Sopenharmony_ci	struct csid_device *csid;
9862306a36Sopenharmony_ci	struct ispif_device *ispif;
9962306a36Sopenharmony_ci	int vfe_num;
10062306a36Sopenharmony_ci	int vfe_lite_num;
10162306a36Sopenharmony_ci	struct vfe_device *vfe;
10262306a36Sopenharmony_ci	atomic_t ref_count;
10362306a36Sopenharmony_ci	int genpd_num;
10462306a36Sopenharmony_ci	struct device **genpd;
10562306a36Sopenharmony_ci	struct device_link **genpd_link;
10662306a36Sopenharmony_ci	struct icc_path *icc_path[ICC_SM8250_COUNT];
10762306a36Sopenharmony_ci	struct icc_bw_tbl icc_bw_tbl[ICC_SM8250_COUNT];
10862306a36Sopenharmony_ci};
10962306a36Sopenharmony_ci
11062306a36Sopenharmony_cistruct camss_camera_interface {
11162306a36Sopenharmony_ci	u8 csiphy_id;
11262306a36Sopenharmony_ci	struct csiphy_csi2_cfg csi2;
11362306a36Sopenharmony_ci};
11462306a36Sopenharmony_ci
11562306a36Sopenharmony_cistruct camss_async_subdev {
11662306a36Sopenharmony_ci	struct v4l2_async_connection asd; /* must be first */
11762306a36Sopenharmony_ci	struct camss_camera_interface interface;
11862306a36Sopenharmony_ci};
11962306a36Sopenharmony_ci
12062306a36Sopenharmony_cistruct camss_clock {
12162306a36Sopenharmony_ci	struct clk *clk;
12262306a36Sopenharmony_ci	const char *name;
12362306a36Sopenharmony_ci	u32 *freq;
12462306a36Sopenharmony_ci	u32 nfreqs;
12562306a36Sopenharmony_ci};
12662306a36Sopenharmony_ci
12762306a36Sopenharmony_civoid camss_add_clock_margin(u64 *rate);
12862306a36Sopenharmony_ciint camss_enable_clocks(int nclocks, struct camss_clock *clock,
12962306a36Sopenharmony_ci			struct device *dev);
13062306a36Sopenharmony_civoid camss_disable_clocks(int nclocks, struct camss_clock *clock);
13162306a36Sopenharmony_cistruct media_entity *camss_find_sensor(struct media_entity *entity);
13262306a36Sopenharmony_cis64 camss_get_link_freq(struct media_entity *entity, unsigned int bpp,
13362306a36Sopenharmony_ci			unsigned int lanes);
13462306a36Sopenharmony_ciint camss_get_pixel_clock(struct media_entity *entity, u64 *pixel_clock);
13562306a36Sopenharmony_ciint camss_pm_domain_on(struct camss *camss, int id);
13662306a36Sopenharmony_civoid camss_pm_domain_off(struct camss *camss, int id);
13762306a36Sopenharmony_civoid camss_delete(struct camss *camss);
13862306a36Sopenharmony_ci
13962306a36Sopenharmony_ci#endif /* QC_MSM_CAMSS_H */
140