All of lore.kernel.org
 help / color / mirror / Atom feed
From: Sakari Ailus <sakari.ailus@linux.intel.com>
To: linux-media@vger.kernel.org
Subject: [PATCH v2 087/106] ccs-pll: Add trivial dual PLL support
Date: Wed,  7 Oct 2020 11:45:38 +0300	[thread overview]
Message-ID: <20201007084557.25843-78-sakari.ailus@linux.intel.com> (raw)
In-Reply-To: <20201007084557.25843-1-sakari.ailus@linux.intel.com>

Add support for sensors that have separate VT and OP domain PLLs.

This support is trivial in the sense that it aims for the same VT pixel
rate than that on the CSI-2 bus. The vast majority of sensors is better
supported by higher frequencies in VT domain in binned and possibly scaled
configurations.

Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com>
---
 drivers/media/i2c/ccs-pll.c | 217 ++++++++++++++++++++++++++++++++----
 drivers/media/i2c/ccs-pll.h |   1 +
 2 files changed, 196 insertions(+), 22 deletions(-)

diff --git a/drivers/media/i2c/ccs-pll.c b/drivers/media/i2c/ccs-pll.c
index 8b300e786451..91b578a05a98 100644
--- a/drivers/media/i2c/ccs-pll.c
+++ b/drivers/media/i2c/ccs-pll.c
@@ -92,7 +92,8 @@ static void print_pll(struct device *dev, struct ccs_pll *pll)
 	for (i = 0, br = branches; i < ARRAY_SIZE(branches); i++, br++) {
 		const char *s = pll_string(br->which);
 
-		if (br->which == PLL_VT) {
+		if (pll->flags & CCS_PLL_FLAG_DUAL_PLL ||
+		    br->which == PLL_VT) {
 			dev_dbg(dev, "%s_pre_pll_clk_div\t\t%u\n",  s,
 				br->fr->pre_pll_clk_div);
 			dev_dbg(dev, "%s_pll_multiplier\t\t%u\n",  s,
@@ -118,7 +119,7 @@ static void print_pll(struct device *dev, struct ccs_pll *pll)
 		}
 	}
 
-	dev_dbg(dev, "flags%s%s%s%s%s%s\n",
+	dev_dbg(dev, "flags%s%s%s%s%s%s%s\n",
 		pll->flags & PLL_FL(LANE_SPEED_MODEL) ? " lane-speed" : "",
 		pll->flags & PLL_FL(LINK_DECOUPLED) ? " link-decoupled" : "",
 		pll->flags & PLL_FL(EXT_IP_PLL_DIVIDER) ?
@@ -126,7 +127,8 @@ static void print_pll(struct device *dev, struct ccs_pll *pll)
 		pll->flags & PLL_FL(FLEXIBLE_OP_PIX_CLK_DIV) ?
 		" flexible-op-pix-div" : "",
 		pll->flags & PLL_FL(FIFO_DERATING) ? " fifo-derating" : "",
-		pll->flags & PLL_FL(FIFO_OVERRATING) ? " fifo-overrating" : "");
+		pll->flags & PLL_FL(FIFO_OVERRATING) ? " fifo-overrating" : "",
+		pll->flags & PLL_FL(DUAL_PLL) ? " dual-pll" : "");
 }
 
 static int check_fr_bounds(struct device *dev,
@@ -267,6 +269,152 @@ ccs_pll_find_vt_sys_div(struct device *dev, const struct ccs_pll_limits *lim,
 #define DPHY_CONST		16
 #define PHY_CONST_DIV		16
 
+static inline int
+__ccs_pll_calculate_vt_tree(struct device *dev,
+			    const struct ccs_pll_limits *lim,
+			    struct ccs_pll *pll, uint32_t mul, uint32_t div)
+{
+	const struct ccs_pll_branch_limits_fr *lim_fr = &lim->vt_fr;
+	const struct ccs_pll_branch_limits_bk *lim_bk = &lim->vt_bk;
+	struct ccs_pll_branch_fr *pll_fr = &pll->vt_fr;
+	struct ccs_pll_branch_bk *pll_bk = &pll->vt_bk;
+	uint32_t more_mul;
+	uint16_t best_pix_div = SHRT_MAX >> 1, best_div;
+	uint16_t vt_div, min_sys_div, max_sys_div, sys_div;
+
+	pll_fr->pll_ip_clk_freq_hz =
+		pll->ext_clk_freq_hz / pll_fr->pre_pll_clk_div;
+
+	dev_dbg(dev, "vt_pll_ip_clk_freq_hz %u\n", pll_fr->pll_ip_clk_freq_hz);
+
+	more_mul = one_or_more(DIV_ROUND_UP(lim_fr->min_pll_op_clk_freq_hz,
+					    pll_fr->pll_ip_clk_freq_hz * mul));
+
+	dev_dbg(dev, "more_mul: %u\n", more_mul);
+	more_mul *= DIV_ROUND_UP(lim_fr->min_pll_multiplier, mul * more_mul);
+	dev_dbg(dev, "more_mul2: %u\n", more_mul);
+
+	pll_fr->pll_multiplier = mul * more_mul;
+
+	if (pll_fr->pll_multiplier * pll_fr->pll_ip_clk_freq_hz >
+	    lim_fr->max_pll_op_clk_freq_hz)
+		return -EINVAL;
+
+	pll_fr->pll_op_clk_freq_hz =
+		pll_fr->pll_ip_clk_freq_hz * pll_fr->pll_multiplier;
+
+	vt_div = div * more_mul;
+
+	ccs_pll_find_vt_sys_div(dev, lim, pll, pll_fr, vt_div, vt_div,
+				&min_sys_div, &max_sys_div);
+
+	max_sys_div = (vt_div & 1) ? 1 : max_sys_div;
+
+	dev_dbg(dev, "vt min/max_sys_div: %u,%u\n", min_sys_div, max_sys_div);
+
+	for (sys_div = min_sys_div; sys_div <= max_sys_div;
+	     sys_div += 2 - (sys_div & 1)) {
+		uint16_t pix_div;
+
+		if (vt_div % sys_div)
+			continue;
+
+		pix_div = vt_div / sys_div;
+
+		if (pix_div < lim_bk->min_pix_clk_div ||
+		    pix_div > lim_bk->max_pix_clk_div) {
+			dev_dbg(dev,
+				"pix_div %u too small or too big (%u--%u)\n",
+				pix_div,
+				lim_bk->min_pix_clk_div,
+				lim_bk->max_pix_clk_div);
+			continue;
+		}
+
+		if (pix_div * sys_div <= best_div) {
+			best_pix_div = pix_div;
+			best_div = pix_div * sys_div;
+		}
+	}
+	if (best_pix_div == SHRT_MAX >> 1)
+		return -EINVAL;
+
+	pll_bk->sys_clk_div = best_div / best_pix_div;
+	pll_bk->pix_clk_div = best_pix_div;
+
+	pll_bk->sys_clk_freq_hz =
+		pll_fr->pll_op_clk_freq_hz / pll_bk->sys_clk_div;
+	pll_bk->pix_clk_freq_hz =
+		pll_bk->sys_clk_freq_hz / pll_bk->pix_clk_div;
+
+	pll->pixel_rate_pixel_array =
+		pll_bk->pix_clk_freq_hz * pll->vt_lanes;
+
+	return 0;
+}
+
+static int ccs_pll_calculate_vt_tree(struct device *dev,
+				     const struct ccs_pll_limits *lim,
+				     struct ccs_pll *pll)
+{
+	const struct ccs_pll_branch_limits_fr *lim_fr = &lim->vt_fr;
+	struct ccs_pll_branch_fr *pll_fr = &pll->vt_fr;
+	uint16_t min_pre_pll_clk_div = lim_fr->min_pre_pll_clk_div;
+	uint16_t max_pre_pll_clk_div = lim_fr->max_pre_pll_clk_div;
+	uint32_t pre_mul, pre_div;
+
+	pre_div = gcd(pll->pixel_rate_csi,
+		      pll->ext_clk_freq_hz * pll->vt_lanes);
+	pre_mul = pll->pixel_rate_csi / pre_div;
+	pre_div = pll->ext_clk_freq_hz * pll->vt_lanes / pre_div;
+
+	/* Make sure PLL input frequency is within limits */
+	max_pre_pll_clk_div =
+		min_t(uint16_t, max_pre_pll_clk_div,
+		      DIV_ROUND_UP(pll->ext_clk_freq_hz,
+				   lim_fr->min_pll_ip_clk_freq_hz));
+
+	min_pre_pll_clk_div = max_t(uint16_t, min_pre_pll_clk_div,
+				    pll->ext_clk_freq_hz /
+				    lim_fr->max_pll_ip_clk_freq_hz);
+
+	dev_dbg(dev, "vt min/max_pre_pll_clk_div: %u,%u\n",
+		min_pre_pll_clk_div, max_pre_pll_clk_div);
+
+	for (pll_fr->pre_pll_clk_div = min_pre_pll_clk_div;
+	     pll_fr->pre_pll_clk_div <= max_pre_pll_clk_div;
+	     pll_fr->pre_pll_clk_div +=
+		     (pll->flags & CCS_PLL_FLAG_EXT_IP_PLL_DIVIDER) ? 1 :
+		     2 - (pll_fr->pre_pll_clk_div & 1)) {
+		uint32_t mul, div;
+		int rval;
+
+		div = gcd(pre_mul * pll_fr->pre_pll_clk_div, pre_div);
+		mul = pre_mul * pll_fr->pre_pll_clk_div / div;
+		div = pre_div / div;
+
+		dev_dbg(dev, "vt pre-div/mul/div: %u,%u,%u\n",
+			pll_fr->pre_pll_clk_div, mul, div);
+
+		rval = __ccs_pll_calculate_vt_tree(dev, lim, pll,
+						   mul, div);
+		if (rval)
+			continue;
+
+		rval = check_fr_bounds(dev, lim, pll, PLL_VT);
+		if (rval)
+			continue;
+
+		rval = check_bk_bounds(dev, lim, pll, PLL_VT);
+		if (rval)
+			continue;
+
+		return 0;
+	}
+
+	return -EINVAL;
+}
+
 static void
 ccs_pll_calculate_vt(struct device *dev, const struct ccs_pll_limits *lim,
 		     const struct ccs_pll_branch_limits_bk *op_lim_bk,
@@ -525,10 +673,10 @@ ccs_pll_calculate_op(struct device *dev, const struct ccs_pll_limits *lim,
 int ccs_pll_calculate(struct device *dev, const struct ccs_pll_limits *lim,
 		      struct ccs_pll *pll)
 {
-	const struct ccs_pll_branch_limits_fr *op_lim_fr = &lim->vt_fr;
-	const struct ccs_pll_branch_limits_bk *op_lim_bk = &lim->op_bk;
-	struct ccs_pll_branch_fr *op_pll_fr = &pll->vt_fr;
-	struct ccs_pll_branch_bk *op_pll_bk = &pll->op_bk;
+	const struct ccs_pll_branch_limits_fr *op_lim_fr;
+	const struct ccs_pll_branch_limits_bk *op_lim_bk;
+	struct ccs_pll_branch_fr *op_pll_fr;
+	struct ccs_pll_branch_bk *op_pll_bk;
 	bool cphy = pll->bus_type == CCS_PLL_BUS_TYPE_CSI2_CPHY;
 	uint32_t phy_const = cphy ? CPHY_CONST : DPHY_CONST;
 	uint16_t min_op_pre_pll_clk_div;
@@ -544,6 +692,28 @@ int ccs_pll_calculate(struct device *dev, const struct ccs_pll_limits *lim,
 		pll->vt_lanes = 1;
 	}
 
+	if (pll->flags & CCS_PLL_FLAG_DUAL_PLL) {
+		op_lim_fr = &lim->op_fr;
+		op_lim_bk = &lim->op_bk;
+		op_pll_fr = &pll->op_fr;
+		op_pll_bk = &pll->op_bk;
+	} else if (pll->flags & CCS_PLL_FLAG_NO_OP_CLOCKS) {
+		/*
+		 * If there's no OP PLL at all, use the VT values
+		 * instead. The OP values are ignored for the rest of
+		 * the PLL calculation.
+		 */
+		op_lim_fr = &lim->vt_fr;
+		op_lim_bk = &lim->vt_bk;
+		op_pll_fr = &pll->vt_fr;
+		op_pll_bk = &pll->vt_bk;
+	} else {
+		op_lim_fr = &lim->vt_fr;
+		op_lim_bk = &lim->op_bk;
+		op_pll_fr = &pll->vt_fr;
+		op_pll_bk = &pll->op_bk;
+	}
+
 	if (!pll->op_lanes || !pll->vt_lanes || !pll->bits_per_pixel ||
 	    !pll->ext_clk_freq_hz || !pll->link_freq || !pll->scale_m ||
 	    !op_lim_fr->min_pll_ip_clk_freq_hz ||
@@ -567,17 +737,6 @@ int ccs_pll_calculate(struct device *dev, const struct ccs_pll_limits *lim,
 	dev_dbg(dev, "vt_lanes: %u\n", pll->vt_lanes);
 	dev_dbg(dev, "op_lanes: %u\n", pll->op_lanes);
 
-	if (pll->flags & CCS_PLL_FLAG_NO_OP_CLOCKS) {
-		/*
-		 * If there's no OP PLL at all, use the VT values
-		 * instead. The OP values are ignored for the rest of
-		 * the PLL calculation.
-		 */
-		op_lim_fr = &lim->vt_fr;
-		op_lim_bk = &lim->vt_bk;
-		op_pll_bk = &pll->vt_bk;
-	}
-
 	dev_dbg(dev, "binning: %ux%u\n", pll->binning_horizontal,
 		pll->binning_vertical);
 
@@ -653,6 +812,9 @@ int ccs_pll_calculate(struct device *dev, const struct ccs_pll_limits *lim,
 		if (rval)
 			continue;
 
+		if (pll->flags & CCS_PLL_FLAG_DUAL_PLL)
+			break;
+
 		ccs_pll_calculate_vt(dev, lim, op_lim_bk, pll, op_pll_fr,
 				     op_pll_bk, cphy, phy_const);
 
@@ -663,14 +825,25 @@ int ccs_pll_calculate(struct device *dev, const struct ccs_pll_limits *lim,
 		if (rval)
 			continue;
 
-		print_pll(dev, pll);
+		break;
+	}
+
+	if (rval) {
+		dev_dbg(dev, "unable to compute pre_pll divisor\n");
 
-		return 0;
+		return rval;
 	}
 
-	dev_dbg(dev, "unable to compute pre_pll divisor\n");
+	if (pll->flags & CCS_PLL_FLAG_DUAL_PLL) {
+		rval = ccs_pll_calculate_vt_tree(dev, lim, pll);
 
-	return rval;
+		if (rval)
+			return rval;
+	}
+
+	print_pll(dev, pll);
+
+	return 0;
 }
 EXPORT_SYMBOL_GPL(ccs_pll_calculate);
 
diff --git a/drivers/media/i2c/ccs-pll.h b/drivers/media/i2c/ccs-pll.h
index 4fa3d4e459a0..1be8f300c860 100644
--- a/drivers/media/i2c/ccs-pll.h
+++ b/drivers/media/i2c/ccs-pll.h
@@ -29,6 +29,7 @@
 #define CCS_PLL_FLAG_FLEXIBLE_OP_PIX_CLK_DIV			BIT(5)
 #define CCS_PLL_FLAG_FIFO_DERATING				BIT(6)
 #define CCS_PLL_FLAG_FIFO_OVERRATING				BIT(7)
+#define CCS_PLL_FLAG_DUAL_PLL					BIT(8)
 
 /**
  * struct ccs_pll_branch_fr - CCS PLL configuration (front)
-- 
2.27.0


  parent reply	other threads:[~2020-10-07  8:46 UTC|newest]

Thread overview: 146+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-10-07  8:44 [PATCH v2 000/106] CCS driver Sakari Ailus
2020-10-07  8:44 ` [PATCH v2 001/106] smiapp: Generate CCS register definitions and limits Sakari Ailus
2020-10-07  8:44   ` [PATCH v2 002/106] smiapp: Use CCS register flags Sakari Ailus
2020-10-07  8:44   ` [PATCH v2 003/106] smiapp: Calculate CCS limit offsets and limit buffer size Sakari Ailus
2020-11-05  7:43     ` Mauro Carvalho Chehab
2020-11-05  7:58       ` Mauro Carvalho Chehab
2020-11-05  8:01         ` Sakari Ailus
2020-10-07  8:44   ` [PATCH v2 004/106] smiapp: Remove macros for defining registers, merge definitions Sakari Ailus
2020-10-07  8:44   ` [PATCH v2 005/106] smiapp: Add macros for accessing CCS registers Sakari Ailus
2020-10-07  8:44   ` [PATCH v2 006/106] smiapp: Use MIPI CCS version and manufacturer ID information Sakari Ailus
2020-10-07  8:44   ` [PATCH v2 007/106] smiapp: Read CCS limit values Sakari Ailus
2020-10-07  8:44   ` [PATCH v2 008/106] smiapp: Switch to CCS limits Sakari Ailus
2020-10-07  8:44   ` [PATCH v2 009/106] smiapp: Obtain frame descriptor from " Sakari Ailus
2020-10-07  8:44   ` [PATCH v2 010/106] smiapp: Use CCS limits in reading data format descriptors Sakari Ailus
2020-10-07  8:44   ` [PATCH v2 011/106] smiapp: Use CCS limits in reading binning capabilities Sakari Ailus
2020-10-07  8:44   ` [PATCH v2 012/106] smiapp: Use CCS registers Sakari Ailus
2020-10-07  8:44   ` [PATCH v2 013/106] smiapp: Remove quirk function for writing a single 8-bit register Sakari Ailus
2020-10-07  8:44   ` [PATCH v2 014/106] smiapp: Rename register access functions Sakari Ailus
2020-10-07  8:44   ` [PATCH v2 015/106] smiapp: Internal rename to CCS Sakari Ailus
2020-10-07  8:44   ` [PATCH v2 016/106] smiapp: Differentiate CCS sensors from SMIA in subdev naming Sakari Ailus
2020-10-07  8:44   ` [PATCH v2 017/106] smiapp: Rename as "ccs" Sakari Ailus
2020-10-07  8:44   ` [PATCH v2 018/106] ccs: Remove profile concept Sakari Ailus
2020-10-07  8:44   ` [PATCH v2 019/106] ccs: Give all subdevs a function Sakari Ailus
2020-10-07  8:44   ` [PATCH v2 027/106] ccs: Request for "reset" GPIO Sakari Ailus
2020-10-07  8:44   ` [PATCH v2 028/106] ccs: Add MIPI CCS compatible strings Sakari Ailus
2020-10-07  8:44   ` [PATCH v2 029/106] ccs: Remove the I²C ID table Sakari Ailus
2020-11-05  9:34     ` Mauro Carvalho Chehab
2020-11-18 22:15       ` Sakari Ailus
2020-10-07  8:44   ` [PATCH v2 030/106] ccs: Remove remaining support for platform data Sakari Ailus
2020-10-07  8:44   ` [PATCH v2 031/106] ccs: Make hwcfg part of the device specific struct Sakari Ailus
2020-10-07  8:44   ` [PATCH v2 032/106] ccs: Fix obtaining bus information from firmware Sakari Ailus
2020-10-07  8:44   ` [PATCH v2 033/106] ccs: Add CCS static data parser library Sakari Ailus
2020-11-05 10:50     ` Mauro Carvalho Chehab
2020-11-05 11:18       ` Sakari Ailus
2020-11-05 12:53         ` Mauro Carvalho Chehab
2020-11-16 12:05           ` Sakari Ailus
2020-10-07  8:44   ` [PATCH v2 034/106] ccs: Combine revision number major and minor into one Sakari Ailus
2020-10-07  8:44   ` [PATCH v2 035/106] ccs: Read CCS static data from firmware binaries Sakari Ailus
2020-11-05 10:56     ` Mauro Carvalho Chehab
2020-10-07  8:44   ` [PATCH v2 036/106] ccs: Stop reading arrays after the first zero Sakari Ailus
2020-10-07  8:44   ` [PATCH v2 037/106] ccs: The functions to get compose or crop rectangle never return NULL Sakari Ailus
2020-10-07  8:44   ` [PATCH v2 038/106] ccs: Replace somewhat harsh internal checks based on BUG with WARN_ON Sakari Ailus
2020-10-07  8:44   ` [PATCH v2 039/106] ccs: Refactor register reading a little Sakari Ailus
2020-10-07  8:44   ` [PATCH v2 040/106] ccs: Make real to integer number conversion optional Sakari Ailus
2020-10-07  8:44   ` [PATCH v2 041/106] ccs: Move limit value real to integer conversion from read to access time Sakari Ailus
2020-10-07  8:44   ` [PATCH v2 042/106] ccs: Read ireal numbers correctly Sakari Ailus
2020-10-07  8:44   ` [PATCH v2 043/106] smiapp-pll: Rename as ccs-pll Sakari Ailus
2020-10-07  8:44   ` [PATCH v2 044/106] ccs-pll: Fix MODULE_LICENSE Sakari Ailus
2020-10-07  8:44   ` [PATCH v2 045/106] ccs: Change my e-mail address Sakari Ailus
2020-10-07  8:44   ` [PATCH v2 046/106] ccs: Add support for manufacturer regs from sensor and module files Sakari Ailus
2020-11-05 11:34     ` Mauro Carvalho Chehab
2020-11-05 11:56       ` Sakari Ailus
2020-11-05 12:46         ` Mauro Carvalho Chehab
2020-10-07  8:45   ` [PATCH v2 047/106] ccs: Use static data read-only registers Sakari Ailus
2020-10-07  8:45   ` [PATCH v2 048/106] ccs: Clean up runtime PM usage Sakari Ailus
2020-10-07  8:45   ` [PATCH v2 049/106] ccs: Wrap long lines, unwrap short ones Sakari Ailus
2020-10-07  8:45   ` [PATCH v2 050/106] ccs: Add device compatible identifiers for telling SMIA and CCS apart Sakari Ailus
2020-10-07  8:45   ` [PATCH v2 051/106] ccs: Use longer pre-I²C sleep for CCS compliant devices Sakari Ailus
2020-10-07  8:45   ` [PATCH v2 052/106] ccs: Remove unnecessary delays from power-up sequence Sakari Ailus
2020-10-07  8:45   ` [PATCH v2 055/106] ccs: Use all regulators Sakari Ailus
2020-10-07  8:45   ` [PATCH v2 056/106] ccs-pll: Don't use div_u64 to divide a 32-bit number Sakari Ailus
2020-10-07  8:45   ` [PATCH v2 057/106] ccs-pll: Split limits and PLL configuration into front and back parts Sakari Ailus
2020-10-07  8:45   ` [PATCH v2 058/106] ccs-pll: Use correct VT divisor for calculating VT SYS divisor Sakari Ailus
2020-10-07  8:45   ` [PATCH v2 059/106] ccs-pll: End search if there are no better values available Sakari Ailus
2020-10-07  8:45   ` [PATCH v2 060/106] ccs-pll: Remove parallel bus support Sakari Ailus
2020-10-07  8:45   ` [PATCH v2 061/106] ccs-pll: Differentiate between CSI-2 D-PHY and C-PHY Sakari Ailus
2020-10-07  8:45   ` [PATCH v2 062/106] ccs-pll: Move the flags field down, away from 8-bit fields Sakari Ailus
2020-10-07  8:45   ` [PATCH v2 063/106] ccs-pll: Document the structs in the header as well as the function Sakari Ailus
2020-11-05 12:18     ` Mauro Carvalho Chehab
2020-12-02 18:02       ` Sakari Ailus
2020-10-07  8:45   ` [PATCH v2 064/106] ccs-pll: Use the BIT macro Sakari Ailus
2020-10-07  8:45   ` [PATCH v2 065/106] ccs-pll: Begin calculation from OP system clock frequency Sakari Ailus
2020-10-07  8:45   ` [PATCH v2 066/106] ccs-pll: Fix condition for pre-PLL divider lower bound Sakari Ailus
2020-10-07  8:45   ` [PATCH v2 067/106] ccs-pll: Avoid overflow in pre-PLL divisor lower bound search Sakari Ailus
2020-10-07  8:45   ` [PATCH v2 068/106] ccs-pll: Fix comment on check against maximum PLL multiplier Sakari Ailus
2020-10-07  8:45   ` [PATCH v2 069/106] ccs-pll: Fix check for PLL multiplier upper bound Sakari Ailus
2020-10-07  8:45   ` [PATCH v2 070/106] ccs-pll: Use explicit 32-bit unsigned type Sakari Ailus
2020-10-07  8:45   ` [PATCH v2 071/106] ccs-pll: Add support for lane speed model Sakari Ailus
2020-10-07  8:45   ` [PATCH v2 072/106] ccs: " Sakari Ailus
2020-10-07  8:45   ` [PATCH v2 073/106] ccs-pll: Add support for decoupled OP domain calculation Sakari Ailus
2020-10-07  8:45   ` [PATCH v2 074/106] ccs-pll: Add support for extended input PLL clock divider Sakari Ailus
2020-10-07  8:45   ` [PATCH v2 075/106] ccs-pll: Support two cycles per pixel on OP domain Sakari Ailus
2020-10-07  8:45   ` [PATCH v2 076/106] ccs-pll: Add support flexible OP PLL pixel clock divider Sakari Ailus
2020-10-07  8:45   ` [PATCH v2 077/106] ccs-pll: Add sanity checks Sakari Ailus
2020-10-07  8:45   ` [PATCH v2 078/106] ccs-pll: Add C-PHY support Sakari Ailus
2020-10-07  8:45   ` [PATCH v2 079/106] ccs-pll: Split off VT subtree calculation Sakari Ailus
2020-10-07  8:45   ` [PATCH v2 080/106] ccs-pll: Check for derating and overrating, support non-derating sensors Sakari Ailus
2020-10-07  8:45   ` [PATCH v2 081/106] ccs-pll: Better separate OP and VT sub-tree calculation Sakari Ailus
2020-10-07  8:45   ` [PATCH v2 082/106] ccs-pll: Print relevant information on PLL tree Sakari Ailus
2020-10-07  8:45   ` [PATCH v2 083/106] ccs-pll: Rework bounds checks Sakari Ailus
2020-10-07  8:45   ` [PATCH v2 084/106] ccs-pll: Make VT divisors 16-bit Sakari Ailus
2020-10-07  8:45   ` [PATCH v2 085/106] ccs-pll: Fix VT post-PLL divisor calculation Sakari Ailus
2020-10-07  8:45   ` [PATCH v2 086/106] ccs-pll: Separate VT divisor limit calculation from the rest Sakari Ailus
2020-10-07  8:45   ` Sakari Ailus [this message]
2020-10-07  8:45   ` [PATCH v2 088/106] ccs: Dual PLL support Sakari Ailus
2020-10-07  8:45   ` [PATCH v2 089/106] ccs-pll: Add support for DDR OP system and pixel clocks Sakari Ailus
2020-10-07  8:45   ` [PATCH v2 090/106] ccs: Add support for DDR OP SYS and OP PIX clocks Sakari Ailus
2020-10-07  8:45   ` [PATCH v2 091/106] ccs: Print written register values Sakari Ailus
2020-10-07  8:45   ` [PATCH v2 092/106] ccs-pll: Print pixel rates Sakari Ailus
2020-10-07  8:45   ` [PATCH v2 093/106] ccs: Add support for obtaining C-PHY configuration from firmware Sakari Ailus
2020-10-07  8:45   ` [PATCH v2 094/106] ccs: Add digital gain support Sakari Ailus
2020-10-07  8:45   ` [PATCH v2 095/106] ccs: Add support for old-style SMIA digital gain Sakari Ailus
2020-10-07  8:45   ` [PATCH v2 096/106] ccs: Remove analogue gain field Sakari Ailus
2020-10-07  8:45   ` [PATCH v2 097/106] ccs: Only add analogue gain control if the device supports it Sakari Ailus
2020-10-07  8:45   ` [PATCH v2 098/106] v4l: uapi: Add user control base for CCS controls Sakari Ailus
2020-10-07  8:45   ` [PATCH v2 099/106] v4l: uapi: ccs: Add controls for analogue gain constants Sakari Ailus
2020-11-05 12:41     ` Hans Verkuil
2020-11-05 12:47       ` Sakari Ailus
2020-11-05 12:56     ` Hans Verkuil
2020-11-05 12:58       ` Sakari Ailus
2020-10-07  8:45   ` [PATCH v2 100/106] ccs: Add support for analogue gain coefficient controls Sakari Ailus
2020-11-05 12:46     ` Hans Verkuil
2020-11-05 12:50       ` Hans Verkuil
2020-11-05 12:55       ` Sakari Ailus
2020-10-07  8:45   ` [PATCH v2 101/106] v4l: uapi: ccs: Add controls for CCS alternative analogue gain Sakari Ailus
2020-10-07  8:45   ` [PATCH v2 102/106] ccs: Add support for alternate analogue global gain Sakari Ailus
2020-10-07  8:45   ` [PATCH v2 103/106] ccs: Add debug prints for MSR registers Sakari Ailus
2020-10-07  8:45   ` [PATCH v2 104/106] v4l: uapi: ccs: Add CCS controls for shading correction Sakari Ailus
2020-10-07  8:45   ` [PATCH v2 105/106] ccs: Add shading correction and luminance correction level controls Sakari Ailus
2020-11-05 12:42     ` Mauro Carvalho Chehab
2020-11-05 16:29       ` Sakari Ailus
2020-11-05 13:03     ` Hans Verkuil
2020-11-16 13:50       ` Sakari Ailus
2020-10-07  8:45   ` [PATCH v2 106/106] ccs: Add CCS ACPI device ID Sakari Ailus
2020-11-05 12:44     ` Mauro Carvalho Chehab
2020-11-05  7:19   ` [PATCH v2 001/106] smiapp: Generate CCS register definitions and limits Mauro Carvalho Chehab
2020-11-05  8:01     ` Sakari Ailus
2020-11-05  9:04       ` Mauro Carvalho Chehab
2020-10-07  8:44 ` [PATCH v2 020/106] dt-bindings: nokia,smia: Fix link-frequencies documentation Sakari Ailus
2020-10-07  8:44 ` [PATCH v2 021/106] dt-bindings: nokia,smia: Make vana-supply optional Sakari Ailus
2020-10-07  8:44 ` [PATCH v2 022/106] dt-bindings: nokia,smia: Remove nokia,nvm-size property Sakari Ailus
2020-10-07 16:04   ` Rob Herring
2020-10-07  8:45 ` [PATCH v2 023/106] dt-bindings: nokia,smia: Convert to YAML Sakari Ailus
2020-10-07 16:06   ` Rob Herring
2020-10-07  8:45 ` [PATCH v2 024/106] dt-bindings: nokia,smia: Use better active polarity for reset Sakari Ailus
2020-10-07  8:45 ` [PATCH v2 025/106] dt-bindings: nokia,smia: Amend SMIA bindings with MIPI CCS support Sakari Ailus
2020-10-07 16:07   ` Rob Herring
2020-10-07  8:45 ` [PATCH v2 026/106] dt-bindings: mipi-ccs: Add bus-type for C-PHY support Sakari Ailus
2020-10-07 13:52   ` Rob Herring
2020-10-07 14:46     ` Sakari Ailus
2020-10-07 14:49     ` [PATCH v3 " Sakari Ailus
2020-10-07 16:24       ` Rob Herring
2020-10-07  8:45 ` [PATCH v2 053/106] dt-bindings: mipi,ccs: Don't mention vana voltage Sakari Ailus
2020-10-07 16:07   ` Rob Herring
2020-10-07  8:45 ` [PATCH v2 054/106] dt-bindings: mipi,ccs: Add vcore and vio supplies Sakari Ailus
2020-10-07 16:08   ` Rob Herring

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20201007084557.25843-78-sakari.ailus@linux.intel.com \
    --to=sakari.ailus@linux.intel.com \
    --cc=linux-media@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.