From mboxrd@z Thu Jan 1 00:00:00 1970 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: base64 Subject: [v4] USB: serial: ftdi_sio: implement GPIO support for FT-X devices From: Johan Hovold Message-Id: <20180918091634.GC3943@localhost> Date: Tue, 18 Sep 2018 11:16:34 +0200 To: Karoly Pados Cc: Johan Hovold , Greg Kroah-Hartman , linux-usb@vger.kernel.org, linux-kernel@vger.kernel.org, Loic Poulain List-ID: T24gU3VuLCBTZXAgMTYsIDIwMTggYXQgMDc6NTg6NDdQTSArMDIwMCwgS2Fyb2x5IFBhZG9zIHdy b3RlOgo+IFRoaXMgcGF0Y2ggYWxsb3dzIHVzaW5nIHRoZSBDQlVTIHBpbnMgb2YgRlQtWCBkZXZp Y2VzIGFzIEdQSU8gaW4gQ0JVUwo+IGJpdGJhbmdpbmcgbW9kZS4gVGhlcmUgaXMgbm8gY29uZmxp Y3QgYmV0d2VlbiB0aGUgR1BJTyBhbmQgVkNQCj4gZnVuY3Rpb25hbGl0eSBpbiB0aGlzIG1vZGUu IFRlc3RlZCBvbiBGVDIzMFggYW5kIEZUMjMxWC4KPiAKPiBBcyB0aGVyZSBpcyBubyB3YXkgdG8g cmVxdWVzdCB0aGUgY3VycmVudCBDQlVTIHJlZ2lzdGVyIGNvbmZpZ3VyYXRpb24KPiBmcm9tIHRo ZSBkZXZpY2UsIGFsbCBDQlVTIHBpbnMgYXJlIHNldCB0byBhIGtub3duIHN0YXRlIHdoZW4gdGhl IGZpcnN0Cj4gR1BJTyBpcyByZXF1ZXN0ZWQuIFRoaXMgYWxsb3dzIHVzaW5nIGxpYmZ0ZGkgdG8g c2V0IHRoZSBHUElPIHBpbnMKPiBiZWZvcmUgbG9hZGluZyB0aGlzIG1vZHVsZSBmb3IgVUFSVCBm dW5jdGlvbmFsaXR5LCBhIGJlaGF2aW9yIHRoYXQKPiBleGlzdGluZyBhcHBsaWNhdGlvbnMgbWln aHQgYmUgcmVseWluZyB1cG9uICh0aG91Z2ggbm8gc3BlY2lmaWMgY2FzZQo+IGlzIGtub3duIHRv IHRoZSBhdXRob3JzIG9mIHRoaXMgcGF0Y2gpLgo+IAo+IFNpZ25lZC1vZmYtYnk6IEthcm9seSBQ YWRvcyA8cGFkb3NAcGFkb3MuaHU+Cj4gLS0tCj4gQ2hhbmdlbG9nOgo+IC0gdjI6IEZpeCBjb21w aWxlIGVycm9yIHdoZW4gQ09ORklHX0dQSU9MSUIgaXMgbm90IGRlZmluZWQuCj4gLSB2MzogSW5j b3Jwb3JhdGUgcmV2aWV3IGZlZWRiYWNrLgo+IC0gdjQ6IEluY2x1ZGUgbGludXgvZ3Bpby9kcml2 ZXIuaCB1bmNvbmRpdGlvbmFsbHkuCj4gICAgICAgUmVwbGFjZSBhbmQgaW52ZXJ0IGdwaW9faW5w dXQgd2l0aCBncGlvX291dHB1dC4KPiAgICAgICBNYWtlIGZ0ZGlfZ3Bpb19kaXJlY3Rpb25fZ2V0 IHJldHVybiAwLzEuCj4gICAgICAgQ2hhbmdlIGRldl9lcnIgbXNnIGluIGZ0ZGlfc2V0X2JpdG1v ZGVfcmVxLgo+ICAgICAgIENoYW5nZSBmb3JtYXR0aW5nIG9mIGVycm9yIGNoZWNraW5nIGluIGZ0 ZGlfZ3Bpb19nZXQuCj4gICAgICAgRHJvcCBkZXZfZXJyIGluIGZ0ZGlfZ3Bpb19zZXQuCj4gICAg ICAgUmVtb3ZlIHNvbWUgbGluZSBicmVha3MgYW5kIGVtcHR5IGxpbmVzLgo+ICAgICAgIENoYW5n ZSBlcnJvciBoYW5kbGluZyBpbiBmdGRpX3JlYWRfZWVwcm9tIChhbmQgYWRqdXN0IGNhbGxlciku Cj4gICAgICAgUmVwbGFjZSBTSU8tPkZUWCBpbiBGVERJX1NJT19DQlVTX01VWF9HUElPIG1hY3Jv IG5hbWUuCgpSZWFsbHkgbmljZSBqb2Igd2l0aCB0aGlzOyBsb29rcyBuaWNlIGFuZCBjbGVhbiBv dmVyIGFsbC4gSnVzdCBhIGZldwpjb21tZW50cyBiZWxvdy4KCj4gK3N0YXRpYyBpbnQgZnR4X2dw aW9jb25mX2luaXQoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCkKPiArewo+ICsJc3RydWN0 IGZ0ZGlfcHJpdmF0ZSAqcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKPiAr CXN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwgPSBwb3J0LT5zZXJpYWw7Cj4gKwljb25zdCB1MTYg Y2J1c19jZmdfYWRkciA9IDB4MWE7Cj4gKwljb25zdCB1MTYgY2J1c19jZmdfc2l6ZSA9IDg7CgpM b29rcyBsaWtlIHlvdSBvbmx5IG5lZWQgdG8gcmVhZCBmb3VyIGJ5dGVzLgoKPiArCXU4ICpjYnVz X2NmZ19idWY7Cj4gKwlpbnQgcmVzdWx0Owo+ICsJdTggaTsKPiArCj4gKwkvKiBSZWFkIGEgcGFy dCBvZiBkZXZpY2UgRUVQUk9NICovCj4gKwljYnVzX2NmZ19idWYgPSBrbWFsbG9jKGNidXNfY2Zn X3NpemUsIEdGUF9LRVJORUwpOwo+ICsJaWYgKCFjYnVzX2NmZ19idWYpCj4gKwkJcmV0dXJuIC1F Tk9NRU07Cj4gKwo+ICsJcmVzdWx0ID0gZnRkaV9yZWFkX2VlcHJvbShzZXJpYWwsIGNidXNfY2Zn X2J1ZiwKPiArCQkJCSAgY2J1c19jZmdfYWRkciwgY2J1c19jZmdfc2l6ZSk7Cj4gKwlpZiAocmVz dWx0ICE9IDApCgpyZXN1bHQgPCAwIHdvdWxkIGJlIG1vcmUgaW5mb3JtYXRpdmUgaGVyZS4KCj4g KwkJZ290byBvdXRfZnJlZTsKPiArCj4gKwkvKiBDaGlwLXR5cGUgZ3Vlc3NpbmcgbG9naWMgYmFz ZWQgb24gbGliZnRkaS4gKi8KPiArCXByaXYtPmdjLm5ncGlvID0gNDsgIC8qIEZUMjMwWCwgRlQy MzFYICovCj4gKwlpZiAobGUxNl90b19jcHUoc2VyaWFsLT5kZXYtPmRlc2NyaXB0b3IuYmNkRGV2 aWNlKSAhPSAweDEwMDApCj4gKwkJcHJpdi0+Z2MubmdwaW8gPSAxOyAgLyogRlQyMzRYRCAqLwoK QXMgSSBtZW50aW9uZWQgaW4gbXkgbGFzdCBtYWlsOiBJJ3ZlIGFza2VkIEZUREkgYWJvdXQgdGhp cywgYnV0IEkgZmVhcgp0aGF0IEZUWDIzNFhEIGhhcyBiY2REZXZpY2UgMHgxMDAwIGFuZCB3ZSBt YXkgbmVlZCB0byBqdXN0IGFsd2F5cwpyZWdpc3RlciBhbGwgZm91ciBwaW5zIGFmdGVyIGFsbC4K Cj4gKwkvKiBEZXRlcm1pbmUgd2hpY2ggcGlucyBhcmUgY29uZmlndXJlZCBmb3IgQ0JVUyBiaXRi YW5naW5nICovCj4gKwlwcml2LT5ncGlvX2FsdGZ1bmMgPSAweGZmOwo+ICsJZm9yIChpID0gMDsg aSA8IHByaXYtPmdjLm5ncGlvOyArK2kpIHsKPiArCQlpZiAoY2J1c19jZmdfYnVmW2ldID09IEZU RElfRlRYX0NCVVNfTVVYX0dQSU8pCj4gKwkJCXByaXYtPmdwaW9fYWx0ZnVuYyAmPSB+QklUKGkp Owo+ICsJfQo+ICsKPiArb3V0X2ZyZWU6Cj4gKwlrZnJlZShjYnVzX2NmZ19idWYpOwo+ICsKPiAr CXJldHVybiByZXN1bHQ7Cj4gK30KCj4gK3N0YXRpYyB2b2lkIGZ0ZGlfZ3Bpb19yZW1vdmUoc3Ry dWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCkKPiArewo+ICsJc3RydWN0IGZ0ZGlfcHJpdmF0ZSAq cHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKPiArCj4gKwlpZiAocHJpdi0+ Z3Bpb191c2VkKSB7Cj4gKwkJLyogUmVtYXJrOiBFeGl0aW5nIENCVVMtbW9kZSBkb2VzIG5vdCBy ZXNldCBwaW4gc3RhdGVzIHRvbyAqLwo+ICsJCWZ0ZGlfZXhpdF9jYnVzX21vZGUocG9ydCk7Cj4g KwkJcHJpdi0+Z3Bpb191c2VkID0gZmFsc2U7Cj4gKwl9CgpUaGlzIHNob3VsZCBnbyBhZnRlciBk ZXJlZ2lzdHJhdGlvbiBvciB3ZSBoYXZlIGEgdGlueSByYWNlIHdpbmRvdyBoZXJlLgoKPiArCWlm IChwcml2LT5ncGlvX3JlZ2lzdGVyZWQpIHsKPiArCQlncGlvY2hpcF9yZW1vdmUoJnByaXYtPmdj KTsKPiArCQlwcml2LT5ncGlvX3JlZ2lzdGVyZWQgPSBmYWxzZTsKPiArCX0KPiArfQoKPiBkaWZm IC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL2Z0ZGlfc2lvLmggYi9kcml2ZXJzL3VzYi9zZXJp YWwvZnRkaV9zaW8uaAo+IGluZGV4IGRjZDBiNmUwNWJhZi4uNjg1NmNjZGFjOWI0IDEwMDY0NAo+ IC0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC9mdGRpX3Npby5oCj4gKysrIGIvZHJpdmVycy91c2Iv c2VyaWFsL2Z0ZGlfc2lvLmgKPiBAQCAtMzUsNyArMzUsMTAgQEAKPiAgI2RlZmluZSBGVERJX1NJ T19TRVRfRVZFTlRfQ0hBUgkJNiAvKiBTZXQgdGhlIGV2ZW50IGNoYXJhY3RlciAqLwo+ICAjZGVm aW5lIEZURElfU0lPX1NFVF9FUlJPUl9DSEFSCQk3IC8qIFNldCB0aGUgZXJyb3IgY2hhcmFjdGVy ICovCj4gICNkZWZpbmUgRlRESV9TSU9fU0VUX0xBVEVOQ1lfVElNRVIJOSAvKiBTZXQgdGhlIGxh dGVuY3kgdGltZXIgKi8KPiAtI2RlZmluZSBGVERJX1NJT19HRVRfTEFURU5DWV9USU1FUgkxMCAv KiBHZXQgdGhlIGxhdGVuY3kgdGltZXIgKi8KPiArI2RlZmluZSBGVERJX1NJT19HRVRfTEFURU5D WV9USU1FUgkweDBhIC8qIEdldCB0aGUgbGF0ZW5jeSB0aW1lciAqLwo+ICsjZGVmaW5lIEZURElf U0lPX1NFVF9CSVRNT0RFCQkweDBiIC8qIFNldCBHUElPIG1vZGUgKi8KCk5pdDogIlNldCBiaXRi YW5nIG1vZGUiLCBJIHRoaW5rIHdvdWxkIGJlIG1vcmUgY29ycmVjdCBoZXJlIGFzIHRoaXMKcmVx dWVzdCBpcyBhbHNvIHVzZWQgdG8gY29uZmlndXJlIHRoZSBhc3luY2hyb25vdXMgYml0YmFuZyBt b2RlLCBldGMuCgpUaGFua3MsCkpvaGFuCg== 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 X-Spam-Level: X-Spam-Status: No, score=-8.4 required=3.0 tests=DKIM_SIGNED,INCLUDES_PATCH, MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_PASS,T_DKIM_INVALID,URIBL_BLOCKED, USER_AGENT_MUTT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 7FE39ECE565 for ; Tue, 18 Sep 2018 09:17:44 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 38A412146D for ; Tue, 18 Sep 2018 09:17:44 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="VDGXXm2o" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 38A412146D Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=kernel.org Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729578AbeIROtY (ORCPT ); Tue, 18 Sep 2018 10:49:24 -0400 Received: from mail-wm1-f66.google.com ([209.85.128.66]:51130 "EHLO mail-wm1-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726759AbeIROtY (ORCPT ); Tue, 18 Sep 2018 10:49:24 -0400 Received: by mail-wm1-f66.google.com with SMTP id s12-v6so1632989wmc.0; Tue, 18 Sep 2018 02:17:39 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:date:from:to:cc:subject:message-id:references:mime-version :content-disposition:in-reply-to:user-agent; bh=zrG7OFX/9Xt99vtwm6B2QfyZrQOPypuA0sB7U/dKv0A=; b=VDGXXm2oOc5IedZtvJP2AStpk5aDpz9XdNdGasN5qbEaspA5Qdt5BKegSsjnmeTd08 wyVUdDY0LoUTMV2mDW3kgY3QVUvMkcQGbtJ6icoi6u66hsgNRRaiNi03ubDuDu/JXpzZ 2XXTwC6Od0ZyWG7rRAKW1Yc8hWPrDd+sYyc6XrlqGG7V9LfT/qJHPG2GfpFoOqK5bNhS +nW1aZXykmH6wQhcCFrx3Mn6KIZaNCWqgZU+DlXNyD0z+Ysf3mS3YP/us6WStiFGUy/v TzBW1E8Fj0S2ZolakHUmAkkK7/m0FTY6FHcWQBiaVG0XZsXKm1KE/bqAfU7CcGl/NA0e KGLQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:date:from:to:cc:subject:message-id :references:mime-version:content-disposition:in-reply-to:user-agent; bh=zrG7OFX/9Xt99vtwm6B2QfyZrQOPypuA0sB7U/dKv0A=; b=USk5NEKBRkbNTfhXtpTk+CTZxgpSDSaFEHX3+nK1cBv762ld57RGd19VoJXqm+MXq5 P+BllqJKKNvzyPUg6lrvnlLqjc87oDOebRxQ5il8STPNf6nnyLgIMgW9SF3eMn6iXrOC UqHX4wO3J8EXWuI4vBQXlr7u6G0VIpoSUuWJj3r8pRbyEKo1z7k8z8+3wS+lpNr+Ht6Q stMf4nkWOhhTmkidPBgehk/5sTvMuE+WNpyRoUufXYXFCVXYTCqJ1JefjlKQ7kyTHraP fS4Whx86AyTBWhUPfTljRrdRcW17Ly134tRTQi+g7T+HU5mbcfAU/C8fRn4zc5GiLI7Q vxjQ== X-Gm-Message-State: APzg51BUYMmno1EH7i/yXVZWffE3LWyqe45FpRmTRp1QZZCdHp+Jgrm6 SI9g1WkXhg3C7JXT1YJ3kFg= X-Google-Smtp-Source: ANB0VdYRW8lhikm/HgqoIkiRLDpK3ER2Fq0Jppgy5WQ4JLlNtTa4d0/XUzQUQ6Dj/ucsTlK6z/GTGQ== X-Received: by 2002:a1c:e382:: with SMTP id a124-v6mr14333565wmh.121.1537262259085; Tue, 18 Sep 2018 02:17:39 -0700 (PDT) Received: from pi ([185.208.64.4]) by smtp.gmail.com with ESMTPSA id 88-v6sm15800593wrf.95.2018.09.18.02.17.37 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 18 Sep 2018 02:17:38 -0700 (PDT) X-Google-Original-Sender: Received: from johan by pi with local (Exim 4.90_1) (envelope-from ) id 1g2C7W-0003XG-Db; Tue, 18 Sep 2018 11:16:34 +0200 Date: Tue, 18 Sep 2018 11:16:34 +0200 From: Johan Hovold To: Karoly Pados Cc: Johan Hovold , Greg Kroah-Hartman , linux-usb@vger.kernel.org, linux-kernel@vger.kernel.org, Loic Poulain Subject: Re: [PATCH v4] USB: serial: ftdi_sio: implement GPIO support for FT-X devices Message-ID: <20180918091634.GC3943@localhost> References: <20180916175847.3288-1-pados@pados.hu> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20180916175847.3288-1-pados@pados.hu> User-Agent: Mutt/1.9.4 (2018-02-28) Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Sun, Sep 16, 2018 at 07:58:47PM +0200, Karoly Pados wrote: > This patch allows using the CBUS pins of FT-X devices as GPIO in CBUS > bitbanging mode. There is no conflict between the GPIO and VCP > functionality in this mode. Tested on FT230X and FT231X. > > As there is no way to request the current CBUS register configuration > from the device, all CBUS pins are set to a known state when the first > GPIO is requested. This allows using libftdi to set the GPIO pins > before loading this module for UART functionality, a behavior that > existing applications might be relying upon (though no specific case > is known to the authors of this patch). > > Signed-off-by: Karoly Pados > --- > Changelog: > - v2: Fix compile error when CONFIG_GPIOLIB is not defined. > - v3: Incorporate review feedback. > - v4: Include linux/gpio/driver.h unconditionally. > Replace and invert gpio_input with gpio_output. > Make ftdi_gpio_direction_get return 0/1. > Change dev_err msg in ftdi_set_bitmode_req. > Change formatting of error checking in ftdi_gpio_get. > Drop dev_err in ftdi_gpio_set. > Remove some line breaks and empty lines. > Change error handling in ftdi_read_eeprom (and adjust caller). > Replace SIO->FTX in FTDI_SIO_CBUS_MUX_GPIO macro name. Really nice job with this; looks nice and clean over all. Just a few comments below. > +static int ftx_gpioconf_init(struct usb_serial_port *port) > +{ > + struct ftdi_private *priv = usb_get_serial_port_data(port); > + struct usb_serial *serial = port->serial; > + const u16 cbus_cfg_addr = 0x1a; > + const u16 cbus_cfg_size = 8; Looks like you only need to read four bytes. > + u8 *cbus_cfg_buf; > + int result; > + u8 i; > + > + /* Read a part of device EEPROM */ > + cbus_cfg_buf = kmalloc(cbus_cfg_size, GFP_KERNEL); > + if (!cbus_cfg_buf) > + return -ENOMEM; > + > + result = ftdi_read_eeprom(serial, cbus_cfg_buf, > + cbus_cfg_addr, cbus_cfg_size); > + if (result != 0) result < 0 would be more informative here. > + goto out_free; > + > + /* Chip-type guessing logic based on libftdi. */ > + priv->gc.ngpio = 4; /* FT230X, FT231X */ > + if (le16_to_cpu(serial->dev->descriptor.bcdDevice) != 0x1000) > + priv->gc.ngpio = 1; /* FT234XD */ As I mentioned in my last mail: I've asked FTDI about this, but I fear that FTX234XD has bcdDevice 0x1000 and we may need to just always register all four pins after all. > + /* Determine which pins are configured for CBUS bitbanging */ > + priv->gpio_altfunc = 0xff; > + for (i = 0; i < priv->gc.ngpio; ++i) { > + if (cbus_cfg_buf[i] == FTDI_FTX_CBUS_MUX_GPIO) > + priv->gpio_altfunc &= ~BIT(i); > + } > + > +out_free: > + kfree(cbus_cfg_buf); > + > + return result; > +} > +static void ftdi_gpio_remove(struct usb_serial_port *port) > +{ > + struct ftdi_private *priv = usb_get_serial_port_data(port); > + > + if (priv->gpio_used) { > + /* Remark: Exiting CBUS-mode does not reset pin states too */ > + ftdi_exit_cbus_mode(port); > + priv->gpio_used = false; > + } This should go after deregistration or we have a tiny race window here. > + if (priv->gpio_registered) { > + gpiochip_remove(&priv->gc); > + priv->gpio_registered = false; > + } > +} > diff --git a/drivers/usb/serial/ftdi_sio.h b/drivers/usb/serial/ftdi_sio.h > index dcd0b6e05baf..6856ccdac9b4 100644 > --- a/drivers/usb/serial/ftdi_sio.h > +++ b/drivers/usb/serial/ftdi_sio.h > @@ -35,7 +35,10 @@ > #define FTDI_SIO_SET_EVENT_CHAR 6 /* Set the event character */ > #define FTDI_SIO_SET_ERROR_CHAR 7 /* Set the error character */ > #define FTDI_SIO_SET_LATENCY_TIMER 9 /* Set the latency timer */ > -#define FTDI_SIO_GET_LATENCY_TIMER 10 /* Get the latency timer */ > +#define FTDI_SIO_GET_LATENCY_TIMER 0x0a /* Get the latency timer */ > +#define FTDI_SIO_SET_BITMODE 0x0b /* Set GPIO mode */ Nit: "Set bitbang mode", I think would be more correct here as this request is also used to configure the asynchronous bitbang mode, etc. Thanks, Johan