From mboxrd@z Thu Jan 1 00:00:00 1970 Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.remote-ip=95.215.58.33 ARC-Seal: i=1; d=subspace.kernel.org; s=arc20261015; a=rsa-sha256; cv=none; t=1794583949; b=aakI0NKvtS7GCtt7O/oG4wmycqC3/PBc4NzCoVoIt3QOtDYSlHnmKtJ/qjFKQGuvuATW gWFzBcMp3ArrJcnfCs9ICZiReYUVdkx0k4OYnJw7au1w9dzKvjFx0/zrVqisRkS8I6k7+ WOV1mObkP82XA7WvRdTFA6B0DAzTETccvcQSne91Vs6+SF8nPBdKTeUsXViPQTnsY6jCL cqs7yO+KN4WIqQaQgtLhD903wc65GXz7mLPohjCZLUCBNcYdepIZsltzAXMjVYtXX74iC 7SLEvoQIjQbV7AZked9RiV7wm9HikV8vUfaaTTah49OtzbY3OAErLvbVGANqCcn+t6w== ARC-Message-Signature: i=1; d=subspace.kernel.org; s=arc20261015; a=rsa-sha256; c=relaxed/relaxed; t=1794583949; h=DMARC-Filter:X-Envelope-To:DKIM-Signature:X-Envelope-To:Received: X-Mizu-Trace-ID:X-Migadu-Flow:From:Date:Subject:MIME-Version: Content-Type:Content-Transfer-Encoding:Message-Id:References: In-Reply-To:To:Cc:X-Mailer; bh=qGZOexHAsmLP7sOQKMVbtdoZtQ5oYYFvAfxYEJxkGvE=; b=bXObGqZvMJJV4Q0Ip++tL+0Kco5lrV6ZnPfmRPIfv7/iHKe42fWyfy34sGypIHDRVoRq 65zn+WIWC7OOhfN5S8ZKxjLtghVAXaRdrrov3Ts3UC4fFzQiixLiWPUz6X4NLKD7t5iNC PCUxGp0w723ufj/VMNzxWdmQwHVRkYE9L+PHP9g2OP0lgcDMUd8yi7hZ5AUVl8Dewf6IQ 5/H9j2wZnn/v1rWC74Nv45npLbZKaUls2o6alZvAIkjrSjpGtXSs/o5zB5dRkBfgMd4Q1 22c6+BlPTFLTb5yTFLYAPWzte9MkVCpYF7QTEiatUc47xEtfr1DQ7K4KwPIBl/3/afQ== ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass header.from=linux.dev; spf=pass smtp.mailfrom=linux.dev; dkim=pass header.d=linux.dev header.i=@linux.dev header.a=rsa-sha256 header.s=key1 header.b=MqIDjjKG; arc=none smtp.remote-ip=95.215.58.33 Received: from mta1.migadu.com (out-33.mta1.migadu.com [95.215.58.33]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits) key-exchange X25519 server-signature ECDSA (prime256v1) server-digest SHA256) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 5EED6606A8B9 for ; Fri, 13 Nov 2026 15:32:28 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.4.2 smtp.subspace.kernel.org 5EED6606A8B9 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.dev Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key, unprotected) header.d=linux.dev header.i=@linux.dev header.a=rsa-sha256 header.s=key1 header.b=MqIDjjKG X-Envelope-To: linux-kernel@vger.kernel.org DKIM-Signature: a=rsa-sha256; bh=y85iK7U/g3/76IgKwKOS2Ane24vkf/ElHyE3uSBtt1g=; c=simple/simple; d=linux.dev; h=from:to:subject:date:message-id:mime-version:content-type; s=key1; t=1794583946; v=1; x=1795188746; b=MqIDjjKGp6dbMQcS1EBpvjkTJ/q6k3rVHh3CkjO3jLU0ols8TBmH1LqfLr5wvWXw76/kbHzC kSfiJYbNT4OPm1XiJslyIUq11gRQS892aEtZliFUMqafYxH5bR9ACqAFH9zPTrVP4AbBjMukrhu BdY5xj3Kd1a4LyRte5ol8c7o= X-Envelope-To: linux-kernel@vger.kernel.org Received: by smtp.migadu.com with ESMTPS id 15dd34a88933f3a7; Fri, 13 Nov 2026 15:32:26 +0000 X-Mizu-Trace-ID: 15dd34a88933f3a7 X-Migadu-Flow: FLOW_OUT From: Peng Fan Date: Fri, 13 Nov 2026 23:31:54 +0800 Subject: [PATCH v2 06/10] regmap: factor out regmap_init_ranges() X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Post: List-Help: List-Subscribe: List-Unsubscribe: List-Owner: Precedence: list MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit Message-Id: <20261113-regmap-improve-v2-6-5dfd6a89078f@nxp.com> References: <20261113-regmap-improve-v2-0-5dfd6a89078f@nxp.com> In-Reply-To: <20261113-regmap-improve-v2-0-5dfd6a89078f@nxp.com> To: Mark Brown , Greg Kroah-Hartman , "Rafael J. Wysocki" , Danilo Krummrich , Johan Hovold , Lucas Tanure Cc: linux-kernel@vger.kernel.org, driver-core@lists.linux.dev, Peng Fan X-Mailer: b4 0.14.3 From: Peng Fan Move the register range validation and rbtree construction loop out of __regmap_init() into a dedicated regmap_init_ranges() helper. This is a mechanical code movement with no functional change apart from fixing the block comment style of an existing comment that checkpatch flags when it appears in the diff context. Signed-off-by: Peng Fan --- drivers/base/regmap/regmap.c | 192 +++++++++++++++++++++++-------------------- 1 file changed, 101 insertions(+), 91 deletions(-) diff --git a/drivers/base/regmap/regmap.c b/drivers/base/regmap/regmap.c index aca63b0d03e0..eaf7555f9765 100644 --- a/drivers/base/regmap/regmap.c +++ b/drivers/base/regmap/regmap.c @@ -748,6 +748,104 @@ static int regmap_set_lock(struct regmap *map, const struct regmap_config *confi return 0; } +/* Validate config->ranges and build the range rbtree. */ +static int regmap_init_ranges(struct regmap *map, const struct regmap_config *config) +{ + int i, j; + + map->range_tree = RB_ROOT; + + for (i = 0; i < config->num_ranges; i++) { + const struct regmap_range_cfg *range_cfg = &config->ranges[i]; + struct regmap_range_node *new; + + /* Sanity check */ + if (range_cfg->range_max < range_cfg->range_min) { + dev_err(map->dev, "Invalid range %d: %u < %u\n", i, + range_cfg->range_max, range_cfg->range_min); + return -EINVAL; + } + + if (range_cfg->range_max > map->max_register) { + dev_err(map->dev, "Invalid range %d: %u > %u\n", i, + range_cfg->range_max, map->max_register); + return -EINVAL; + } + + if (range_cfg->selector_reg > map->max_register) { + dev_err(map->dev, + "Invalid range %d: selector out of map\n", i); + return -EINVAL; + } + + if (range_cfg->window_len == 0) { + dev_err(map->dev, "Invalid range %d: window_len 0\n", + i); + return -EINVAL; + } + + /* + * Make sure that this register range has no selector + * or data window within its boundary. + */ + for (j = 0; j < config->num_ranges; j++) { + unsigned int sel_reg = config->ranges[j].selector_reg; + unsigned int win_min = config->ranges[j].window_start; + unsigned int win_max = win_min + + config->ranges[j].window_len - 1; + + /* Allow data window inside its own virtual range */ + if (j == i) + continue; + + if (range_cfg->range_min <= sel_reg && + sel_reg <= range_cfg->range_max) { + dev_err(map->dev, + "Range %d: selector for %d in window\n", + i, j); + return -EINVAL; + } + + if (!(win_max < range_cfg->range_min || + win_min > range_cfg->range_max)) { + dev_err(map->dev, + "Range %d: window for %d in window\n", + i, j); + return -EINVAL; + } + } + + new = kzalloc_obj(*new); + if (new == NULL) + return -ENOMEM; + + new->map = map; + new->name = range_cfg->name; + new->range_min = range_cfg->range_min; + new->range_max = range_cfg->range_max; + new->selector_reg = range_cfg->selector_reg; + new->selector_mask = range_cfg->selector_mask; + new->selector_shift = range_cfg->selector_shift; + new->window_start = range_cfg->window_start; + new->window_len = range_cfg->window_len; + + if (!_regmap_range_add(map, new)) { + dev_err(map->dev, "Failed to add range %d\n", i); + kfree(new); + return -EINVAL; + } + + if (map->selector_work_buf == NULL) { + map->selector_work_buf = + kzalloc(map->format.buf_size, GFP_KERNEL); + if (map->selector_work_buf == NULL) + return -ENOMEM; + } + } + + return 0; +} + struct regmap *__regmap_init(struct device *dev, const struct regmap_bus *bus, void *bus_context, @@ -758,7 +856,6 @@ struct regmap *__regmap_init(struct device *dev, struct regmap *map; enum regmap_endian reg_endian, val_endian; bool fast_io; - int i, j; int ret; if (!config) { @@ -1078,96 +1175,9 @@ struct regmap *__regmap_init(struct device *dev, skip_format_initialization: - map->range_tree = RB_ROOT; - for (i = 0; i < config->num_ranges; i++) { - const struct regmap_range_cfg *range_cfg = &config->ranges[i]; - struct regmap_range_node *new; - - /* Sanity check */ - if (range_cfg->range_max < range_cfg->range_min) { - dev_err(map->dev, "Invalid range %d: %u < %u\n", i, - range_cfg->range_max, range_cfg->range_min); - goto err_range; - } - - if (range_cfg->range_max > map->max_register) { - dev_err(map->dev, "Invalid range %d: %u > %u\n", i, - range_cfg->range_max, map->max_register); - goto err_range; - } - - if (range_cfg->selector_reg > map->max_register) { - dev_err(map->dev, - "Invalid range %d: selector out of map\n", i); - goto err_range; - } - - if (range_cfg->window_len == 0) { - dev_err(map->dev, "Invalid range %d: window_len 0\n", - i); - goto err_range; - } - - /* Make sure, that this register range has no selector - or data window within its boundary */ - for (j = 0; j < config->num_ranges; j++) { - unsigned int sel_reg = config->ranges[j].selector_reg; - unsigned int win_min = config->ranges[j].window_start; - unsigned int win_max = win_min + - config->ranges[j].window_len - 1; - - /* Allow data window inside its own virtual range */ - if (j == i) - continue; - - if (range_cfg->range_min <= sel_reg && - sel_reg <= range_cfg->range_max) { - dev_err(map->dev, - "Range %d: selector for %d in window\n", - i, j); - goto err_range; - } - - if (!(win_max < range_cfg->range_min || - win_min > range_cfg->range_max)) { - dev_err(map->dev, - "Range %d: window for %d in window\n", - i, j); - goto err_range; - } - } - - new = kzalloc_obj(*new); - if (new == NULL) { - ret = -ENOMEM; - goto err_range; - } - - new->map = map; - new->name = range_cfg->name; - new->range_min = range_cfg->range_min; - new->range_max = range_cfg->range_max; - new->selector_reg = range_cfg->selector_reg; - new->selector_mask = range_cfg->selector_mask; - new->selector_shift = range_cfg->selector_shift; - new->window_start = range_cfg->window_start; - new->window_len = range_cfg->window_len; - - if (!_regmap_range_add(map, new)) { - dev_err(map->dev, "Failed to add range %d\n", i); - kfree(new); - goto err_range; - } - - if (map->selector_work_buf == NULL) { - map->selector_work_buf = - kzalloc(map->format.buf_size, GFP_KERNEL); - if (map->selector_work_buf == NULL) { - ret = -ENOMEM; - goto err_range; - } - } - } + ret = regmap_init_ranges(map, config); + if (ret) + goto err_range; ret = regcache_init(map, config); if (ret != 0) -- 2.56.0