From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 87111C072A2 for ; Sun, 19 Nov 2023 17:42:05 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229575AbjKSRmH (ORCPT ); Sun, 19 Nov 2023 12:42:07 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:50532 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229556AbjKSRmG (ORCPT ); Sun, 19 Nov 2023 12:42:06 -0500 X-Greylist: delayed 395 seconds by postgrey-1.37 at lindbergh.monkeyblade.net; Sun, 19 Nov 2023 09:42:03 PST Received: from m.b4.vu (m.b4.vu [203.16.231.148]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 8DF88F2 for ; Sun, 19 Nov 2023 09:42:03 -0800 (PST) Received: by m.b4.vu (Postfix, from userid 1000) id 3036E6144362; Mon, 20 Nov 2023 04:05:27 +1030 (ACDT) Date: Mon, 20 Nov 2023 04:05:27 +1030 From: "Geoffrey D. Bennett" To: Takashi Iwai Cc: Jaroslav Kysela , Takashi Iwai , alsa-devel@alsa-project.org, linux-sound@vger.kernel.org Subject: [PATCH RFC v2] ALSA: scarlett2: Add ioctls for user-space access Message-ID: References: <76c1526d-78be-92d2-cf2b-148278394575@perex.cz> <123242ed-c343-dab8-fed1-9f5d2da44d7a@perex.cz> <87edhtn0r2.wl-tiwai@suse.de> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <87edhtn0r2.wl-tiwai@suse.de> Precedence: bulk List-ID: X-Mailing-List: linux-sound@vger.kernel.org Hi Jaroslav, Takashi, I took your feedback onboard about not providing generic access to the scarlett2_usb() function from user-space. After a few iterations, I've come up with this hwdep interface to support reset-to-factory-defaults, reset-to-factory-firmware, and firmware-update in a safe way: -----8<-----8<-----8<-----8<-----8<-----8<-----8<-----8<-----8<----- /* Get protocol version */ #define SCARLETT2_IOCTL_PVERSION _IOR('S', 0x60, int) /* Reboot */ #define SCARLETT2_IOCTL_REBOOT _IO('S', 0x61) /* Select flash segment */ #define SCARLETT2_SEGMENT_ID_SETTINGS 0 #define SCARLETT2_SEGMENT_ID_FIRMWARE 1 #define SCARLETT2_SEGMENT_ID_COUNT 2 #define SCARLETT2_IOCTL_SELECT_FLASH_SEGMENT _IOW('S', 0x62, int) /* Erase selected flash segment */ #define SCARLETT2_IOCTL_ERASE_FLASH_SEGMENT _IO('S', 0x63) /* Get selected flash segment erase progress * 1 through to num_blocks, or 255 for complete */ struct scarlett2_flash_segment_erase_progress { unsigned char progress; unsigned char num_blocks; }; #define SCARLETT2_IOCTL_GET_ERASE_PROGRESS \ _IOR('S', 0x64, struct scarlett2_flash_segment_erase_progress) -----8<-----8<-----8<-----8<-----8<-----8<-----8<-----8<-----8<----- Does that look reasonable to you? Broadly, it's used like this: Reset to factory default configuration: - ioctl select_flash_segment SCARLETT2_SEGMENT_ID_SETTINGS - ioctl erase_flash_segment - ioctl get_erase_progress (optional) Erase firmware (reverts to factory firmware which is stored in a different flash segment, inaccessible from these ioctls): - ioctl select_flash_segment SCARLETT2_SEGMENT_ID_FIRMWARE - ioctl erase_flash_segment - ioctl get_erase_progress (optional) Upload new firmware: - write() <- a bunch of these, only permitted after the previous erase step was completed On completion: - ioctl reboot To confirm that this interface is sufficient, I have implemented it in the scarlett2 driver and written a user-space utility which can perform all the above operations. I will clean up the implementation a bit and then submit for review; just wanted to share the interface first in case you have any comments at this point. Thanks, Geoffrey.