From mboxrd@z Thu Jan 1 00:00:00 1970 Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.remote-ip=170.10.129.124 ARC-Seal: i=1; d=subspace.kernel.org; s=arc20261015; a=rsa-sha256; cv=none; t=1794488682; b=47wGBeijehPpsH7w3wwU+QwPiThX7fyS16eTQ9xIuyUC3JePwDYjyKyX2SsceDUQqUD8 iR+48eaMYoOoCbuYE2fpLnGKgKKCWBRPZwV6wh+HnzBnvclnMneGOS9bTTerQ76chtOv2 dXhe+FooQ/JlJWBlYADV5NVZQTnxypIF/gB5136FHnJlatPlX+myYiMllGB/JUAyuTmP/ fgRQssSRF1eqCY7r7ZoX79q2sVUnayBeK38CNxWOETzy08L3R1mC6oCYp8A8IFIzoOzaD 3FP3m9HkmzkpCmcpl72mbUfQheignKPPhWWu/sQtCp4tZsjNY2Fvg0rCCT79Z1dawjw== ARC-Message-Signature: i=1; d=subspace.kernel.org; s=arc20261015; a=rsa-sha256; c=relaxed/relaxed; t=1794488682; h=DMARC-Filter:DKIM-Signature:Received:X-MC-Unique: X-Mimecast-MFC-AGG-ID:Received:Received:From:To:Cc:Subject:Date: Message-ID:In-Reply-To:References:MIME-Version: Content-Transfer-Encoding:X-Scanned-By; bh=1mYJfJN1gOuZ4UQeeDF/8R8aHFXRBjSBZkZ4QmszLrU=; b=Bb6CBVR8rqFq60YG9oxa8t8X4ecNUO9I5hIFAKYzpmlT01Sg8UYmJiQb21EXo7kbUXdU 3ZV2xJfytdKGsrKfmewkHB+kYw8t0Gj2EBJ4E5HS7PVvRpWHy3pnskXwVRl8doXNnkw+i t+DoC4jgRe5cgZODdvqBu+4h4kzeXuP5u39bA1ZmRv2mLJhDQ/hkYP6Lu2yA2Vq7rjd8P QAhk5Jfg3Pi54j1VN6RdeavY0GLFpnQAT5mb59hqGBFBTly/nRSjWDH/1V95p+5tkbQ1f F4LxXhC8s/QC121M4COJj8dmvQi32gjlHaBuTwRh7axlEor2iAwo5W0nC8tSk71C/lw== ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass header.from=redhat.com; spf=pass smtp.mailfrom=redhat.com; dkim=pass header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256 header.s=mimecast20190719 header.b=M2Vf33Fm; arc=none smtp.remote-ip=170.10.129.124 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (prime256v1) server-digest SHA256) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 384EE606A332 for ; Thu, 12 Nov 2026 13:04:42 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.4.2 smtp.subspace.kernel.org 384EE606A332 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=redhat.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=redhat.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256 header.s=mimecast20190719 header.b=M2Vf33Fm DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1794488681; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=1mYJfJN1gOuZ4UQeeDF/8R8aHFXRBjSBZkZ4QmszLrU=; b=M2Vf33Fmyctjb7dTUS1ZW3/tKeg23tZh87bj2PqELh7oWv+wUbYGoC2Cgkj3r+cKXGjlAp DvcYfHBCZIq7TWMc2j6wCYpqfm4UVYLu/4dd8B2HfZSw9j8RizgRa4Qgw+B1feYmGcRaSw zizHub7qlxbM0NeNRH0OSu2TMQeDxCw= Received: from mx-prod-mc-08.mail-002.prod.us-west-2.aws.redhat.com (ec2-35-165-154-97.us-west-2.compute.amazonaws.com [35.165.154.97]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-479-GoEEcr5-OOa02LYX_ImAwA-1; Thu, 12 Nov 2026 08:04:39 -0500 X-MC-Unique: GoEEcr5-OOa02LYX_ImAwA-1 X-Mimecast-MFC-AGG-ID: GoEEcr5-OOa02LYX_ImAwA_1794488677 Received: from mx-prod-int-03.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-03.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.12]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-08.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id 299EC1829E3C; Thu, 12 Nov 2026 13:04:37 +0000 (UTC) Received: from poros-thinkpadp16vgen1.tpbc.com (unknown [10.44.32.7]) by mx-prod-int-03.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id AD7FA1956089; Thu, 12 Nov 2026 13:04:32 +0000 (UTC) From: Petr Oros To: netdev@vger.kernel.org Cc: Petr Oros , Ivan Vecera , Jonathan Corbet , Shuah Khan , Shuah Khan , Randy Dunlap , Jani Nikula , Vadim Fedorenko , Arkadiusz Kubalewski , Jiri Pirko , Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , linux-doc@vger.kernel.org, linux-kselftest@vger.kernel.org Subject: [PATCH net-next v4 05/14] dpll: dpllsim: Add support to set input pin state Date: Thu, 12 Nov 2026 14:03:50 +0100 Message-ID: <20261112130359.840795-6-poros@redhat.com> In-Reply-To: <20261112130359.840795-1-poros@redhat.com> References: <20261112130359.840795-1-poros@redhat.com> X-Mailing-List: netdev@vger.kernel.org List-Id: List-Post: List-Help: List-Subscribe: List-Unsubscribe: List-Owner: Precedence: list MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Scanned-By: MIMEDefang 3.0 on 10.30.177.12 Add support for setting the state of input pins on the device. Implement the state_on_dpll_set callback for input pins and advertise the state-can-change capability for them, so that userspace can move a pin between the states valid for the device mode. The core checks the capability only, the states a mode allows are up to the driver: in automatic mode a pin is selectable or disconnected, in manual mode connected or disconnected, as Documentation/driver-api/dpll.rst describes them. The device reports automatic mode, so connected is refused with -EINVAL and an extack message. The check is written for both modes already, so that manual mode has nothing to add to it when it arrives. The driver stores the requested state and reports it back unchanged, it does not act on it yet. Output pins keep reporting their state only. Reviewed-by: Ivan Vecera Signed-off-by: Petr Oros --- v4: - no change, add the Reviewed-by given to v3 (Ivan Vecera) v3: - refuse pin states that are not valid in the device mode, so that connected is refused in automatic mode, the mode the device reports, with an extack message (Ivan Vecera) - the Acked-by of v2 is not carried over, the callback changed v3: https://lore.kernel.org/all/20261109093523.931201-6-poros@redhat.com/ v2: https://lore.kernel.org/all/20261105151852.1844305-6-poros@redhat.com/ v1: https://lore.kernel.org/all/20261103093910.596225-6-poros@redhat.com/ --- drivers/dpll/dpllsim/dpll.c | 42 +++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/drivers/dpll/dpllsim/dpll.c b/drivers/dpll/dpllsim/dpll.c index a1d5921fb8d017..794020d0c112e8 100644 --- a/drivers/dpll/dpllsim/dpll.c +++ b/drivers/dpll/dpllsim/dpll.c @@ -104,10 +104,46 @@ static int dpllsim_pin_state_get(const struct dpll_pin *pin, void *pin_priv, return 0; } +/* + * The states a user may request depend on the device mode: connected and + * disconnected select and deselect the reference in manual mode, selectable + * and disconnected offer a pin to or withdraw it from the automatic + * selection. The core checks the state-can-change capability only. + */ +static bool dpllsim_pin_state_valid(const struct dpllsim_dev *sim, + enum dpll_pin_state state) +{ + if (state == DPLL_PIN_STATE_DISCONNECTED) + return true; + if (sim->mode == DPLL_MODE_MANUAL) + return state == DPLL_PIN_STATE_CONNECTED; + return state == DPLL_PIN_STATE_SELECTABLE; +} + +static int dpllsim_pin_state_set(const struct dpll_pin *pin, void *pin_priv, + const struct dpll_device *dpll, + void *dpll_priv, enum dpll_pin_state state, + struct netlink_ext_ack *extack) +{ + struct dpllsim_pin *sim_pin = pin_priv; + struct dpllsim_dev *sim = sim_pin->dev; + + guard(mutex)(&sim->lock); + if (!dpllsim_pin_state_valid(sim, state)) { + NL_SET_ERR_MSG_FMT(extack, "Pin state not valid in %s mode", + sim->mode == DPLL_MODE_MANUAL ? + "manual" : "automatic"); + return -EINVAL; + } + sim_pin->state = state; + return 0; +} + static const struct dpll_pin_ops dpllsim_input_pin_ops = { .frequency_get = dpllsim_pin_frequency_get, .direction_get = dpllsim_pin_direction_get, .state_on_dpll_get = dpllsim_pin_state_get, + .state_on_dpll_set = dpllsim_pin_state_set, }; static const struct dpll_pin_ops dpllsim_output_pin_ops = { @@ -149,6 +185,12 @@ static void dpllsim_pin_props(struct dpllsim_pin *pin, prop->freq_supported_num = ARRAY_SIZE(dpllsim_freq_ext); break; } + + /* Capabilities follow the ops the pin is served by */ + if (dpllsim_pin_select_ops(pin) == &dpllsim_input_pin_ops) + prop->capabilities = DPLL_PIN_CAPABILITIES_STATE_CAN_CHANGE; + else + prop->capabilities = 0; } static bool dpllsim_pin_frequency_valid(struct dpllsim_pin *pin) -- 2.56.0