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