From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-pg1-f171.google.com (mail-pg1-f171.google.com [209.85.215.171]) (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 81D3E356758 for ; Thu, 6 Aug 2026 05:52:29 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.171 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785995550; cv=none; b=DRPGQ0cQ4kv7Kv6Kbp+4hA/zFkeFs1aEmbBlb8/+MhtcmO3AuocOMNQqF/wcdGYNapqAhth1q1Bxt7A5lnlLzCZgJOFiMz2+mhLrfXKHcbDa1zbsmxIcztKtCMvMcRlvW+uVVwZcqd8/AAirfFWmECNUmH3j3TInrVmcSrQzkH0= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785995550; c=relaxed/simple; bh=2AXd0QCUkhNbgBbc180DV9AhiysthlhRHBZTSwf2bHU=; h=Date:From:To:Cc:Subject:Message-ID:MIME-Version:Content-Type: Content-Disposition; b=hd1h413aGuQxpwiu9rfAqumd1+2GcVL6y/3knTk78uTisIjpJUpUhyuy5HTW8p+nnFrj+tYKKG2PL/rioPnyX8+v5FJwZzz3XAITb1UBOoIGGrrrtfA6Zz8zD5Yj+0/8xCO4oGdTHnppfus0GStyqBoV8Wj/hxkHBTbmy0NMY8s= 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=QqNGRFEc; arc=none smtp.client-ip=209.85.215.171 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="QqNGRFEc" Received: by mail-pg1-f171.google.com with SMTP id 41be03b00d2f7-c966b9ee9cbso1205193a12.1 for ; Wed, 05 Aug 2026 22:52:29 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1785995549; x=1786600349; darn=vger.kernel.org; h=content-disposition:content-type:mime-version:message-id:subject:cc :to:from:date:from:to:cc:subject:date:message-id:reply-to :content-type; bh=/jZ23w7GfQc3eQ7VCO4oVKKe1P7gXWLzuG3JrExJvEo=; b=QqNGRFEc10nmf8knM1HbYXtTgqV8fHLQXyNlg4grADe68rYsQ8gCBERYPtiUgcNm8C 8Fs9XclUhLUoMVCkZ0lsPergS+K5knaKhuE4zwynqLhr8j0G7XC+zSBELQcYILuSJ8lo BzfYcxAvlQtAdsT/QB4UxJi7q6WidVHWjlW6M1RAZgToQ3dDiDQQ/dLfzB/cdW5YJjnN dLMOcPtzmVuM56tSX/FBEYHx8I2A5IWbQlbhKIFJA2SxufH7i13LfiChPcO/AfjncO8U ieyXVtFpi6q3v9tjdY10ohyYToWpLJS+oEpXe95L9aIe6wSyEh72OuJmZp8z7Sb15ttJ rMjg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1785995549; x=1786600349; h=content-disposition:content-type:mime-version:message-id:subject:cc :to:from:date:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to:content-type; bh=/jZ23w7GfQc3eQ7VCO4oVKKe1P7gXWLzuG3JrExJvEo=; b=SJOkNuTGPkMlX6WyYTOXqZBgkOPqDNsiqTgYkDyaegeIx+71ha1mGOxCyRNqx3PnQq 7o4Hqmmy2YIxR4jPRGAiERUzhirye0kEpRxUMpnTgStcidWEIVFYFy1w1y1Eihe4AMet 4VB955tZbfoQvkhyaOBkIUH2Mjs5EbSMcvLHH5kMHmDWNWBZ2mAd+SYtxXBI3ABmAhZx RIwil9qnIViJeLrgahiGnktwMyIf36thgewkkjjy1s8gOMtS06KKyhEeUGeghCr5WqvJ exx34N4h3FI6DuM09J6MhX7dCWFiCgQheLltTeochS/3FIphAkjeB+TvBc0fQZDPlRrY cUZg== X-Gm-Message-State: AOJu0YwiwWZD+n9k25mbE4PdEa0bxSfIFOmW6fgAmfCWvIaoCAb1qPdB rZBLkxY4RzlLJGRY+WstAtfNZRLbECMfXhHN6iXOQxL6YFZH1TXrdCDH X-Gm-Gg: AR+sD11PS+O1BahOLw+NZO+sx8Uf635wQQ4TbL/is8ZSG0kFLDSlYvQRVaJ3NGPufVh tyBkp7c9URYiojb5SSC7NIhGY5WIs7hXf8cKNiY72ujzGWwWXv5fQtkk7OeAb8IjYzaM2n6yH9c JFF4yc8jews3aduRkGjkAWuX4G7Am2SHeOq9FB6hi5iowOUJjS57GW7tai8MSyXE+zwY1zJBMfK Zd02Q4Pw1wjKvY5U8NgSvp2Ohvp4PG3jXhnnbEB6r8xJpvKJgTcmwV0jVWGpQVTQAw3Rqch8TSC KMb+QGe7+8mcS0Q3sedbGoPrUSp3elewfp3fYW1e6Umk/IdJDtnj46cJ0Uz9rNf8PGA0GP0gA+B WwoYNTY9Wfyhxt85OGUlmckigngpIOaVj91XufeHxh+iQ3h6bkpM7tCfi4IY8qqZVbmQmysUKnM dJOwKFWWtlDMpNHJJmBcXl477j8PrppT1kQtrP1v3sD2dQ7MUpaj+wwKZ253Wrotl2/bMGQhE6B QlHnz8LpDVXCadrw3mGGaX13Ba/t5zvlESlrlc= X-Received: by 2002:a05:6a21:3390:b0:3c3:93ce:663 with SMTP id adf61e73a8af0-3cb85f4a26emr13527585637.26.1785995548644; Wed, 05 Aug 2026 22:52:28 -0700 (PDT) Received: from google.com ([2a00:79e0:2ebe:8:d081:36b2:965:e66f]) by smtp.gmail.com with ESMTPSA id a92af1059eb24-13fca8df88csm18435051c88.11.2026.08.05.22.52.26 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 05 Aug 2026 22:52:27 -0700 (PDT) Date: Wed, 5 Aug 2026 22:52:24 -0700 From: Dmitry Torokhov To: linux-input@vger.kernel.org Cc: linux-kernel@vger.kernel.org Subject: [PATCH] Input: atkbd - factor out atkbd_recreate_device() helper Message-ID: Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline The sysfs attribute setters atkbd_set_extra() and atkbd_set_set() contain identical logic for unregistering the old input device, allocating a new one, updating state, and registering the new device. Factor out this common logic into an atkbd_recreate_device() helper to reduce code duplication. Signed-off-by: Dmitry Torokhov --- drivers/input/keyboard/atkbd.c | 109 ++++++++++++++------------------- 1 file changed, 46 insertions(+), 63 deletions(-) diff --git a/drivers/input/keyboard/atkbd.c b/drivers/input/keyboard/atkbd.c index 5736f4bc5a50..3ff7e9dea9fe 100644 --- a/drivers/input/keyboard/atkbd.c +++ b/drivers/input/keyboard/atkbd.c @@ -1444,6 +1444,47 @@ static ssize_t atkbd_attr_set_helper(struct device *dev, const char *buf, size_t return -EINTR; } +static int atkbd_recreate_device(struct atkbd *atkbd, + unsigned char new_set, bool new_extra) +{ + struct input_dev *new_dev, *old_dev = atkbd->dev; + bool old_extra = atkbd->extra; + u8 old_set = atkbd->set; + int err; + + /* + * Since device's properties will change we need to unregister + * the old device. But allocate and register the new one first + * to make sure we have it. + */ + new_dev = input_allocate_device(); + if (!new_dev) + return -ENOMEM; + + atkbd->dev = new_dev; + atkbd->set = atkbd_select_set(atkbd, new_set, new_extra); + atkbd_reset_state(atkbd); + atkbd_activate(atkbd); + atkbd_set_keycode_table(atkbd); + atkbd_set_device_attrs(atkbd); + + err = input_register_device(atkbd->dev); + if (err) { + input_free_device(new_dev); + + atkbd->dev = old_dev; + atkbd->set = atkbd_select_set(atkbd, old_set, old_extra); + atkbd_set_keycode_table(atkbd); + atkbd_set_device_attrs(atkbd); + + return err; + } + + input_unregister_device(old_dev); + + return 0; +} + static ssize_t atkbd_show_extra(struct atkbd *atkbd, char *buf) { return sprintf(buf, "%d\n", atkbd->extra ? 1 : 0); @@ -1451,11 +1492,8 @@ static ssize_t atkbd_show_extra(struct atkbd *atkbd, char *buf) static ssize_t atkbd_set_extra(struct atkbd *atkbd, const char *buf, size_t count) { - struct input_dev *old_dev, *new_dev; unsigned int value; int err; - bool old_extra; - u8 old_set; if (!atkbd->write) return -EIO; @@ -1468,38 +1506,9 @@ static ssize_t atkbd_set_extra(struct atkbd *atkbd, const char *buf, size_t coun return -EINVAL; if (atkbd->extra != value) { - /* - * Since device's properties will change we need to - * unregister old device. But allocate and register - * new one first to make sure we have it. - */ - old_dev = atkbd->dev; - old_extra = atkbd->extra; - old_set = atkbd->set; - - new_dev = input_allocate_device(); - if (!new_dev) - return -ENOMEM; - - atkbd->dev = new_dev; - atkbd->set = atkbd_select_set(atkbd, atkbd->set, value); - atkbd_reset_state(atkbd); - atkbd_activate(atkbd); - atkbd_set_keycode_table(atkbd); - atkbd_set_device_attrs(atkbd); - - err = input_register_device(atkbd->dev); - if (err) { - input_free_device(new_dev); - - atkbd->dev = old_dev; - atkbd->set = atkbd_select_set(atkbd, old_set, old_extra); - atkbd_set_keycode_table(atkbd); - atkbd_set_device_attrs(atkbd); - + err = atkbd_recreate_device(atkbd, atkbd->set, value); + if (err) return err; - } - input_unregister_device(old_dev); } return count; @@ -1586,11 +1595,8 @@ static ssize_t atkbd_show_set(struct atkbd *atkbd, char *buf) static ssize_t atkbd_set_set(struct atkbd *atkbd, const char *buf, size_t count) { - struct input_dev *old_dev, *new_dev; unsigned int value; int err; - u8 old_set; - bool old_extra; if (!atkbd->write) return -EIO; @@ -1603,34 +1609,11 @@ static ssize_t atkbd_set_set(struct atkbd *atkbd, const char *buf, size_t count) return -EINVAL; if (atkbd->set != value) { - old_dev = atkbd->dev; - old_extra = atkbd->extra; - old_set = atkbd->set; - - new_dev = input_allocate_device(); - if (!new_dev) - return -ENOMEM; - - atkbd->dev = new_dev; - atkbd->set = atkbd_select_set(atkbd, value, atkbd->extra); - atkbd_reset_state(atkbd); - atkbd_activate(atkbd); - atkbd_set_keycode_table(atkbd); - atkbd_set_device_attrs(atkbd); - - err = input_register_device(atkbd->dev); - if (err) { - input_free_device(new_dev); - - atkbd->dev = old_dev; - atkbd->set = atkbd_select_set(atkbd, old_set, old_extra); - atkbd_set_keycode_table(atkbd); - atkbd_set_device_attrs(atkbd); - + err = atkbd_recreate_device(atkbd, value, atkbd->extra); + if (err) return err; - } - input_unregister_device(old_dev); } + return count; } -- 2.55.0.679.g6767b8d81c-goog -- Dmitry