From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-ed1-f43.google.com (mail-ed1-f43.google.com [209.85.208.43]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 550E4386C36 for ; Sun, 23 Aug 2026 11:20:45 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.43 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787484049; cv=none; b=ZdHzMpPzMG4AM4wHhcDx/QsexP9+8018bVZUFEADJYW+b7QXMpWyfpduf4BwwyLCWwvhbKajv+X2iZIIG0CxcHsXF53gYpGiVqd58xTVUARgvZOHUGSUlqZTLvt4e512X77r4NLN688KTyX253Ucd2EQdTz4F+gKI/EbjVcil+o= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787484049; c=relaxed/simple; bh=YCQmStD21VL0vqDdwDJHRxmOjVQaOVxz/3cF0MNYmpM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=i8mrXiw+9TZTkB2Tggv1WZ2SfowFWBD+sY9QTcK0Ds6e7JYSYKotT+YZAfPcsxtUsSGIwWfQ2qHI5+MbHFQEvI6WsM7ksZwETg2z9x45Fl9/M3lhZ1rVnfou2sRZF3HSFm8PpqL9vpXQkGm7ujPPJPGv769y3+PJcyJ94d1Pdek= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=laa0mM69; arc=none smtp.client-ip=209.85.208.43 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="laa0mM69" Received: by mail-ed1-f43.google.com with SMTP id 4fb4d7f45d1cf-6a051b737d8so3186318a12.1 for ; Sun, 23 Aug 2026 04:20:45 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1787484043; x=1788088843; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=SZlvya7+gytEhYd4eQsQn/QeDP25uctPqe5cmCgXCPc=; b=laa0mM69fk2brvxJqlJEZi5ns5YnuTVYo0/E4S+Mj+mVaXNdu/0SpWpgSUn7rbUZ6K Qtr8io+RbsE5XWHscBdkH6ReMbQR14vAdegAn7vMRS23O8KqJgUe7KJmjMDXV1tA0l4i Uj9CWd2BMokvUtfSfCdcKrHGps+kJjx0HacFw1Tu3TlSTcLmyEVWAeomYAhrdr+rGsVB 3W/GVAtV/k1OAUolrp8IC7Shi9gNiqcUdr2bKnwy1YHB5fZxkFMO5R9vfw5wzShqHrDH Xrzo6OC8hN0/1Awz/UeoF+2PTG3fskSksMFubp7Wubn6BVHWe3I3jSxGUzl1iPFVql4H Dg1Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787484043; x=1788088843; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=SZlvya7+gytEhYd4eQsQn/QeDP25uctPqe5cmCgXCPc=; b=Nqtaa6AHXzCO0UREBXOKXu196kxC1CLtiDW/BuIoeX5IuMayjYFUDUotAGoSN9jY02 vvhqN9Hk/Acw9TNMulogvf/UchKnWYt8Ivy/8NmDAb95Fau/Cxu5zJ1oCL1MdKs3lmAw QsGrUD1mbeUb/07frDrkvK8ss8LlZEDzP+MxQ+YmLh+6aq6/0H523Qab+f9WiarEnoi4 r2x7hcd9iig5A+Ilf8Il8XYcDMMkXurCBdrnWnQJUqBJvEFZbIlGNz5g0ZrGdtUQoK0D gHybF5yajR3pFezOJWUqMkvmYZR4rUXgYo/Vz7ObD9j1xRypXI0VdbLOZL8ON7b0wLe+ pRsQ== X-Forwarded-Encrypted: i=1; AHgh+RoAmy3Br9Hba3VJH9bhtdbzVB3vraMI1l2LAYxc8yuSpnY1oK8VgQKFl1yzmtfbG3TLr3nqX8/GJLVZ0L4=@vger.kernel.org X-Gm-Message-State: AFuF++l8sXAPWtb3IpteFukPFcziOxUX7H8QzZuRWKEAXuhSyDOu/KlN BWPPoiAOBiYweWiYix2s1Z4MTeY6U9S2WyFF2tM8bD69T1uTl0QuW01k X-Gm-Gg: AR+sD10fxzoZqjC+TEeDj6IY4qbr6xSoWKadDAeOgeer57dgmzZnT6j2gdnKKh3yPam tklKLGi/OjnKJLnhdoQlmlEX1hyujvguHtJ/p1+2k9mUCExOeJf7P/XLfwUHMKVR/LdOL2jN9rf OZGU0/sUxf3avswm8dBXT1Ck9gdYG4hrdZn8/awziwiyKTREZT20GhcMXtW76v1P8vQhRmMnp8l A0G4dUqSLFs86+24zfLj+iHwYsnQ4Slxp4mFscQF2WgWDDEMr5lX1lNCvimUZKdzDtJuMYjzug1 cSSGzaNW4+WFD41hwVMTvow1eoA5Sn8Kvfw3zGwwUyU2Hzo+3GrLkNEg9d7Cl0zv5uUVxEPlL5C 8IaR++OfxaC+af2lZV7tykOn7Jg727PukR9/Zz+HHDjPKDBe9u8HODdeO894Q+nToO9non+HBFN alAIylo6SE169Zy1E8hiY5HkMqY46Ezzbnoht9B41OVYYVyjPhxeW9aFf8xcrYtVoKBg== X-Received: by 2002:a17:907:72c1:b0:c24:bf0b:6b62 with SMTP id a640c23a62f3a-c24bf0b6d6fmr40013866b.4.1787484042903; Sun, 23 Aug 2026 04:20:42 -0700 (PDT) Received: from thinker ([2a13:54c2:f000:e268:6d0c:d746:2b12:231f]) by smtp.gmail.com with ESMTPSA id a640c23a62f3a-c24966f58dfsm707233866b.38.2026.08.23.04.20.39 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 23 Aug 2026 04:20:42 -0700 (PDT) From: Amit Barzilai To: javierm@redhat.com, airlied@gmail.com, simona@ffwll.ch, maarten.lankhorst@linux.intel.com, mripard@kernel.org, tzimmermann@suse.de, robh@kernel.org, krzk+dt@kernel.org, conor+dt@kernel.org Cc: andriy.shevchenko@intel.com, holofermes@gmail.com, linux-kernel@vger.kernel.org, devicetree@vger.kernel.org, dri-devel@lists.freedesktop.org, Amit Barzilai Subject: [PATCH v5 5/6] drm/ssd130x: Implement ssd130x_write_cmd() on top of ssd130x_write_cmds() Date: Sun, 23 Aug 2026 14:19:58 +0300 Message-ID: <20260823111959.17029-6-amit.barzilai22@gmail.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260823111959.17029-1-amit.barzilai22@gmail.com> References: <20260823111959.17029-1-amit.barzilai22@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit ssd130x_write_cmd() and ssd130x_write_cmds() each carried their own regmap_write() loop over SSD13XX_COMMAND, differing only in how the caller supplies the bytes. Turn ssd130x_write_cmd() into a thin variadic wrapper that collects its arguments into a small stack buffer and defers to ssd130x_write_cmds(), and move the protocol comment onto the latter, which is where the loop now lives. No functional change: the bytes sent and the bus transactions used to send them are identical for every chip on both the I2C and SPI transports. Assisted-by: Claude:claude-opus-5 Signed-off-by: Amit Barzilai --- drivers/gpu/drm/solomon/ssd130x.c | 65 +++++++++++++++---------------- 1 file changed, 31 insertions(+), 34 deletions(-) diff --git a/drivers/gpu/drm/solomon/ssd130x.c b/drivers/gpu/drm/solomon/ssd130x.c index 73e7f2a8b730..cdef0c09b050 100644 --- a/drivers/gpu/drm/solomon/ssd130x.c +++ b/drivers/gpu/drm/solomon/ssd130x.c @@ -258,41 +258,12 @@ static int ssd130x_write_data(struct ssd130x_device *ssd130x, const u8 *values, } /* - * Helper to write command (SSD13XX_COMMAND). The fist variadic argument - * is the command to write and the following are the command options. + * Helper to write a command (SSD13XX_COMMAND) from a buffer. The first byte + * is the command opcode and the following ones are its parameters. * - * Note that the ssd13xx protocol requires each command and option to be - * written as a SSD13XX_COMMAND device register value. That is why a call - * to regmap_write(..., SSD13XX_COMMAND, ...) is done for each argument. - */ -static int ssd130x_write_cmd(struct ssd130x_device *ssd130x, int count, - /* u8 cmd, u8 option, ... */...) -{ - va_list ap; - u8 value; - int ret; - - va_start(ap, count); - - do { - value = va_arg(ap, int); - ret = regmap_write(ssd130x->regmap, SSD13XX_COMMAND, value); - if (ret) - goto out_end; - } while (--count); - -out_end: - va_end(ap); - - return ret; -} - -/* - * Write a command byte sequence from a buffer. - * - * Like ssd130x_write_cmd() but takes a pre-built byte array instead of - * variadic arguments, handy when the command is already in an array or - * when the caller wants to use sizeof() for the length. + * Note that the ssd13xx protocol requires the opcode and each parameter to + * be written as a SSD13XX_COMMAND device register value. That is why a call + * to regmap_write(..., SSD13XX_COMMAND, ...) is done for each byte. */ static int ssd130x_write_cmds(struct ssd130x_device *ssd130x, const u8 *cmd, size_t len) @@ -309,6 +280,32 @@ static int ssd130x_write_cmds(struct ssd130x_device *ssd130x, const u8 *cmd, return 0; } +/* + * Variadic wrapper around ssd130x_write_cmds(). The first variadic argument + * is the command opcode and the following are its parameters. + * + * The arguments are gathered into a fixed size buffer, so at most 8 bytes + * can be sent per call, i.e. an opcode and seven parameters. That covers + * every command this driver sends through it. Commands taking more parameters, + * such as the grey scale tables, must use ssd130x_write_cmds() instead. + */ +static int ssd130x_write_cmd(struct ssd130x_device *ssd130x, int count, + /* u8 cmd, u8 param, ... */...) +{ + u8 buf[8]; + va_list ap; + + if (drm_WARN_ON(&ssd130x->drm, count > sizeof(buf))) + return -EINVAL; + + va_start(ap, count); + for (int i = 0; i < count; i++) + buf[i] = va_arg(ap, int); + va_end(ap); + + return ssd130x_write_cmds(ssd130x, buf, count); +} + /* * Run a packed command sequence. The format is a flat byte array where each * entry starts with a length byte followed by that many command bytes. A -- 2.55.0