From owner-dev-commits-src-main@freebsd.org Wed May 12 19:44:23 2021 Return-Path: Delivered-To: dev-commits-src-main@mailman.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mailman.nyi.freebsd.org (Postfix) with ESMTP id 9717E64A5B3; Wed, 12 May 2021 19:44:23 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4FgQGb3t5yz3Gbd; Wed, 12 May 2021 19:44:23 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 77DB211810; Wed, 12 May 2021 19:44:23 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.16.1/8.16.1) with ESMTP id 14CJiNiZ046675; Wed, 12 May 2021 19:44:23 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.16.1/8.16.1/Submit) id 14CJiNHQ046674; Wed, 12 May 2021 19:44:23 GMT (envelope-from git) Date: Wed, 12 May 2021 19:44:23 GMT Message-Id: <202105121944.14CJiNHQ046674@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Poul-Henning Kamp Subject: git: 38a4732f395b - main - Centralize open/close of /dev/iic%d devices MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: phk X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 38a4732f395b1a529bf2358326a458c2c8c90cf0 Auto-Submitted: auto-generated X-BeenThere: dev-commits-src-main@freebsd.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: Commit messages for the main branch of the src repository List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 12 May 2021 19:44:23 -0000 The branch main has been updated by phk: URL: https://cgit.FreeBSD.org/src/commit/?id=38a4732f395b1a529bf2358326a458c2c8c90cf0 commit 38a4732f395b1a529bf2358326a458c2c8c90cf0 Author: Poul-Henning Kamp AuthorDate: 2021-05-12 19:43:44 +0000 Commit: Poul-Henning Kamp CommitDate: 2021-05-12 19:43:44 +0000 Centralize open/close of /dev/iic%d devices --- usr.sbin/i2c/i2c.c | 77 +++++++++++++++++++----------------------------------- 1 file changed, 27 insertions(+), 50 deletions(-) diff --git a/usr.sbin/i2c/i2c.c b/usr.sbin/i2c/i2c.c index 23613ee744f9..604460625ecf 100644 --- a/usr.sbin/i2c/i2c.c +++ b/usr.sbin/i2c/i2c.c @@ -123,23 +123,16 @@ skip_get_tokens(char *skip_addr, int *sk_addr, int max_index) } static int -scan_bus(const char *dev, int skip, char *skip_addr) +scan_bus(const char *dev, int fd, int skip, char *skip_addr) { struct iiccmd cmd; struct iic_msg rdmsg; struct iic_rdwr_data rdwrdata; struct skip_range addr_range = { 0, 0 }; - int *tokens = NULL, fd, error, i, idx = 0, j; + int *tokens = NULL, error, i, idx = 0, j; int len = 0, do_skip = 0, no_range = 1, num_found = 0, use_read_xfer = 0; uint8_t rdbyte; - fd = open(dev, O_RDWR); - if (fd == -1) { - fprintf(stderr, "Error opening I2C controller (%s) for " - "scanning: %s\n", dev, strerror(errno)); - return (EX_NOINPUT); - } - if (skip) { assert(skip_addr != NULL); len = strlen(skip_addr); @@ -220,7 +213,7 @@ start_over: use_read_xfer = 1; goto start_over; } - ioctl(fd, I2CSTOP); + (void)ioctl(fd, I2CSTOP); } if (error == 0) { ++num_found; @@ -243,7 +236,6 @@ start_over: error = ioctl(fd, I2CRSTCARD, &cmd); out: - close(fd); if (skip && no_range) free(tokens); else @@ -258,21 +250,13 @@ out: } static int -reset_bus(const char *dev) +reset_bus(const char *dev, int fd) { struct iiccmd cmd; - int fd, error; - - fd = open(dev, O_RDWR); - if (fd == -1) { - fprintf(stderr, "Error opening I2C controller (%s) for " - "resetting: %s\n", dev, strerror(errno)); - return (EX_NOINPUT); - } + int error; printf("Resetting I2C controller on %s: ", dev); error = ioctl(fd, I2CRSTCARD, &cmd); - close (fd); if (error) { printf("error: %s\n", strerror(errno)); @@ -303,19 +287,13 @@ prepare_buf(int size, uint32_t off) } static int -i2c_write(const char *dev, struct options i2c_opt, char *i2c_buf) +i2c_write(int fd, struct options i2c_opt, char *i2c_buf) { struct iiccmd cmd; - int error, fd, bufsize; + int error, bufsize; char *buf; const char *err_msg; - fd = open(dev, O_RDWR); - if (fd == -1) { - free(i2c_buf); - err(1, "open failed"); - } - cmd.slave = i2c_opt.addr; error = ioctl(fd, I2CSTART, &cmd); if (error == -1) { @@ -441,7 +419,6 @@ i2c_write(const char *dev, struct options i2c_opt, char *i2c_buf) goto err2; } - close(fd); return (0); err1: @@ -452,22 +429,17 @@ err2: if (err_msg) fprintf(stderr, "%s\n", err_msg); - close(fd); return (1); } static int -i2c_read(const char *dev, struct options i2c_opt, char *i2c_buf) +i2c_read(int fd, struct options i2c_opt, char *i2c_buf) { struct iiccmd cmd; - int fd, error, bufsize; + int error, bufsize; char data = 0, *buf; const char *err_msg; - fd = open(dev, O_RDWR); - if (fd == -1) - err(1, "open failed"); - bzero(&cmd, sizeof(cmd)); if (i2c_opt.width) { @@ -539,7 +511,6 @@ i2c_read(const char *dev, struct options i2c_opt, char *i2c_buf) goto err2; } - close(fd); return (0); err1: @@ -550,7 +521,6 @@ err2: if (err_msg) fprintf(stderr, "%s\n", err_msg); - close(fd); return (1); } @@ -566,11 +536,11 @@ err2: * driver to be handled as a single transfer. */ static int -i2c_rdwr_transfer(const char *dev, struct options i2c_opt, char *i2c_buf) +i2c_rdwr_transfer(int fd, struct options i2c_opt, char *i2c_buf) { struct iic_msg msgs[2]; struct iic_rdwr_data xfer; - int fd, i; + int i; uint8_t off_buf[2]; i = 0; @@ -607,11 +577,8 @@ i2c_rdwr_transfer(const char *dev, struct options i2c_opt, char *i2c_buf) xfer.msgs = msgs; xfer.nmsgs = i; - if ((fd = open(dev, O_RDWR)) == -1) - err(1, "open(%s) failed", dev); if (ioctl(fd, I2CRDWR, &xfer) == -1 ) err(1, "ioctl(I2CRDWR) failed"); - close(fd); return (0); } @@ -622,7 +589,7 @@ main(int argc, char** argv) struct options i2c_opt; char *skip_addr = NULL, *i2c_buf; const char *dev; - int error, chunk_size, i, j, ch; + int fd, error, chunk_size, i, j, ch; errno = 0; error = 0; @@ -741,11 +708,18 @@ main(int argc, char** argv) i2c_opt.addr >> 1, i2c_opt.dir, i2c_opt.off, i2c_opt.width, i2c_opt.count); + fd = open(dev, O_RDWR); + if (fd == -1) { + fprintf(stderr, "Error opening I2C controller (%s): %s\n", + dev, strerror(errno)); + return (EX_NOINPUT); + } + if (i2c_opt.scan) - exit(scan_bus(dev, i2c_opt.skip, skip_addr)); + exit(scan_bus(dev, fd, i2c_opt.skip, skip_addr)); if (i2c_opt.reset) - exit(reset_bus(dev)); + exit(reset_bus(dev, fd)); i2c_buf = malloc(i2c_opt.count); if (i2c_buf == NULL) @@ -769,17 +743,20 @@ main(int argc, char** argv) } if (i2c_opt.mode == I2C_MODE_TRANSFER) - error = i2c_rdwr_transfer(dev, i2c_opt, i2c_buf); + error = i2c_rdwr_transfer(fd, i2c_opt, i2c_buf); else if (i2c_opt.dir == 'w') - error = i2c_write(dev, i2c_opt, i2c_buf); + error = i2c_write(fd, i2c_opt, i2c_buf); else - error = i2c_read(dev, i2c_opt, i2c_buf); + error = i2c_read(fd, i2c_opt, i2c_buf); if (error != 0) { free(i2c_buf); return (1); } + error = close(fd); + assert(error == 0); + if (i2c_opt.verbose) fprintf(stderr, "\nData %s (hex):\n", i2c_opt.dir == 'r' ? "read" : "written");