Received: by 2002:a25:1985:0:0:0:0:0 with SMTP id 127csp4094333ybz; Tue, 28 Apr 2020 05:46:31 -0700 (PDT) X-Google-Smtp-Source: APiQypIoGOcTHHB04EeRCQAgzjZ6cEMOezlIGaKuoweQPGwHYUjKTGTJNFW1f8xNjBt6VKnEe7ty X-Received: by 2002:aa7:d2cd:: with SMTP id k13mr6296535edr.116.1588077991505; Tue, 28 Apr 2020 05:46:31 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1588077991; cv=none; d=google.com; s=arc-20160816; b=jEEGw8Fam4ITBTffGXjepR3z9bhVLTDipBt3m8tcxesbvBjjQ6P+y/QjlddaJuj9qX XSx05jTnZ2HFhSrHnDkPUuS5hFVs9YCUkJbkCN70HEnJSAWa52uO4E8JdxCkD14PaGcJ 6KwQPEVG79u1lmmVMxhzUeurX+anRFGI+9OzDklsdOBmJeWe3GOnkRS09LGglqwa2Ekp ypeYHkaXTpj48xQDheIgLhqm5wMuDcECXwz3is91TtVnJffOxGvA9hii6DIbbY0aTzRG HYHGdc4O7R1N1GFll3+/orOUD0Ji9GnGEFOsIJ3uo8En9ZFWQxfdxX/py+l1xqs9qdOP P3ZA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:dkim-signature; bh=YYJpKvgRNwf06GUmtJtBJkQp9t7R4gewPU7zZ78LA+s=; b=AKWrHLn7Pb8F76UVkPQ2YfCrmsyUr/z18KRQJxz3mGXGC49klSe/OdewfY2x5jdxEM z6pdc2jYmCJLBqHERHXci79E4/vJoivmdukU8qF3479+w/5jL1bJzFKawg9VMgr57Dr2 8vvvQ6/z1SNb6bXIETWa6WRrwnfFOX0Kc4Or7KreKoRXA3R+ahn6032MLHKG4z7mzocI gv/3x6+OGC/EEXjIGG9u+qC7XwfQZgpa7D/uVatf6v3ilrv+Yek9A7+ncymtl4p8MWkA mdJ7u1T1jjwMZ3MvDO7ysducNEdAv3M3fw9R0KDcjRrjByqzO7RT6i0m3sst+ZlH7GSC Yl7w== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=mk2RHuyP; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id ly26si1815997ejb.190.2020.04.28.05.46.08; Tue, 28 Apr 2020 05:46:31 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=mk2RHuyP; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726828AbgD1MoY (ORCPT + 99 others); Tue, 28 Apr 2020 08:44:24 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:45892 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-FAIL-OK-FAIL) by vger.kernel.org with ESMTP id S1726678AbgD1MoX (ORCPT ); Tue, 28 Apr 2020 08:44:23 -0400 Received: from mail-lj1-x243.google.com (mail-lj1-x243.google.com [IPv6:2a00:1450:4864:20::243]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id EC9FBC03C1A9 for ; Tue, 28 Apr 2020 05:44:21 -0700 (PDT) Received: by mail-lj1-x243.google.com with SMTP id e25so21320542ljg.5 for ; Tue, 28 Apr 2020 05:44:21 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=YYJpKvgRNwf06GUmtJtBJkQp9t7R4gewPU7zZ78LA+s=; b=mk2RHuyP1dBXuBJrfAOgE4aTk4QCMyQynOZyfN/yKbZbhy4BXeuLtNyFWDHODwzeiC cZKJ0bVU4Ila7ewhdJekO1M+Wqxfp716yNDK2+Og+KI5m2rbWx57Aj0V6nqGLaBXph2W OOWSF68o4YAQpct91VaidNWsvZj83lArAOLnjGwMYsGxnFxHmNa1YdAlCpfR0tj5XxK+ 8MKWraI/EYHPVVtw/vaaxx5bFK2CH81c2JV2yoSEurhiT6jz1zgMS6zL/d5sszc6eENO TiWgE8A9eEXIojHW3wV6d8AZ7FuUF2mtZstIdmwW+DMcv/BWbMcxHYBhFddLM/NuQGIy vd+A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=YYJpKvgRNwf06GUmtJtBJkQp9t7R4gewPU7zZ78LA+s=; b=so3DFilzB22TkX1T6cS/zR73gN20zTbnt0YXXWunto7f+9zOa2yWLWExlCDfd0eIDw 1nlNM0kIp2IgcVw/WR6/EfPNkBb6Ht3swtjHMZ72KuFkW3wn2GJWbFPpkFjFU6zQsB2V eT3WSA/OL4rfJvUYUuoVVgxXJx9Fft3/BZXzOk2vu7Pfk1cEcaN66hMJ8nSfnHk47hMd 08dVtmge8tHfyKgghIm6sHQ1FgknZROIpr2WjJIOX25tJ4IPkSSmPmocLkuMxCj7GzYg hp5timyhwuGJEBcrWQJtNDeeKfWVr7DteJHSTXroTSAHknlx1BYeTJCbqZf8zOk2Z6AQ 6tzQ== X-Gm-Message-State: AGi0PuZzKxE+NX3+7ZXqmpEl/GBLySHq5knZiDUHEvW21Zg09KVA5P/o INK5XjtUBOboRSAu+1ONAbn5wZj9q9HQ+GlXKXuRIg== X-Received: by 2002:a05:651c:32e:: with SMTP id b14mr17623187ljp.277.1588077860337; Tue, 28 Apr 2020 05:44:20 -0700 (PDT) MIME-Version: 1.0 References: <20200423162548.129661-1-dianders@chromium.org> <20200423092431.v3.1.Ia50267a5549392af8b37e67092ca653a59c95886@changeid> In-Reply-To: <20200423092431.v3.1.Ia50267a5549392af8b37e67092ca653a59c95886@changeid> From: Linus Walleij Date: Tue, 28 Apr 2020 14:44:09 +0200 Message-ID: Subject: Re: [PATCH v3 1/6] drm/bridge: ti-sn65dsi86: Export bridge GPIOs to Linux To: Douglas Anderson Cc: Bartosz Golaszewski , Dave Airlie , Daniel Vetter , Rob Herring , Neil Armstrong , Andrzej Hajda , Laurent Pinchart , Sandeep Panda , Stephen Boyd , "open list:OPEN FIRMWARE AND FLATTENED DEVICE TREE BINDINGS" , "open list:GPIO SUBSYSTEM" , Jeffrey Hugo , "open list:DRM PANEL DRIVERS" , MSM , Rob Clark , Jernej Skrabec , Jonas Karlman , Bjorn Andersson , "linux-kernel@vger.kernel.org" Content-Type: text/plain; charset="UTF-8" Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Thu, Apr 23, 2020 at 6:26 PM Douglas Anderson wrote: > The ti-sn65dsi86 MIPI DSI to eDP bridge chip has 4 pins on it that can > be used as GPIOs in a system. Each pin can be configured as input, > output, or a special function for the bridge chip. These are: > - GPIO1: SUSPEND Input > - GPIO2: DSIA VSYNC > - GPIO3: DSIA HSYNC or VSYNC > - GPIO4: PWM > > Let's expose these pins as GPIOs. A few notes: > - Access to ti-sn65dsi86 is via i2c so we set "can_sleep". > - These pins can't be configured for IRQ. > - There are no programmable pulls or other fancy features. > - Keeping the bridge chip powered might be expensive. The driver is > setup such that if all used GPIOs are only inputs we'll power the > bridge chip on just long enough to read the GPIO and then power it > off again. Setting a GPIO as output will keep the bridge powered. > - If someone releases a GPIO we'll implicitly switch it to an input so > we no longer need to keep the bridge powered for it. > > Because of all of the above limitations we just need to implement a > bare-bones GPIO driver. The device tree bindings already account for > this device being a GPIO controller so we only need the driver changes > for it. > > NOTE: Despite the fact that these pins are nominally muxable I don't > believe it makes sense to expose them through the pinctrl interface as > well as the GPIO interface. The special functions are things that the > bridge chip driver itself would care about and it can just configure > the pins as needed. > > Signed-off-by: Douglas Anderson > Cc: Linus Walleij > Cc: Bartosz Golaszewski Pretty cool. I wonder if this chip could use the generic regmap GPIO helpers that we are working on when they come around? https://lore.kernel.org/linux-gpio/20200423174543.17161-11-michael@walle.cc/ > +#include > +#include Only should be needed else you are doing something wrong. > + * @gchip: If we expose our GPIOs, this is used. > + * @gchip_output: A cache of whether we've set GPIOs to output. This > + * serves double-duty of keeping track of the direction and > + * also keeping track of whether we've incremented the > + * pm_runtime reference count for this pin, which we do > + * whenever a pin is configured as an output. That sounds a bit hairy but I guess it's fine. > + */ > struct ti_sn_bridge { > struct device *dev; > struct regmap *regmap; > @@ -102,6 +136,9 @@ struct ti_sn_bridge { > struct gpio_desc *enable_gpio; > struct regulator_bulk_data supplies[SN_REGULATOR_SUPPLY_NUM]; > int dp_lanes; > + > + struct gpio_chip gchip; > + DECLARE_BITMAP(gchip_output, SN_NUM_GPIOS); Do you really need a bitmap for 4 bits? Can't you just have something like an u8 and check bit 0,1,2,3 ... well I suppose it has some elegance to it as well but... hm. > +static struct ti_sn_bridge *gchip_to_pdata(struct gpio_chip *chip) > +{ > + return container_of(chip, struct ti_sn_bridge, gchip); > +} > + > +static int ti_sn_bridge_gpio_get_direction(struct gpio_chip *chip, > + unsigned int offset) > +{ > + struct ti_sn_bridge *pdata = gchip_to_pdata(chip); Is there some specific reason why you don't just use gpiochip_get_data()? > + /* > + * We already have to keep track of the direction because we use > + * that to figure out whether we've powered the device. We can > + * just return that rather than (maybe) powering up the device > + * to ask its direction. > + */ > + return test_bit(offset, pdata->gchip_output) ? > + GPIOF_DIR_OUT : GPIOF_DIR_IN; > +} Don't use these legacy defines, they are for consumers. Use GPIO_LINE_DIRECTION_IN and GPIO_LINE_DIRECTION_OUT. from > + ret = regmap_read(pdata->regmap, SN_GPIO_IO_REG, &val); > + pm_runtime_put(pdata->dev); > + > + if (ret) > + return ret; > + > + return (val >> (SN_GPIO_INPUT_SHIFT + offset)) & 1; My preferred way to do this is: #include return !!(val & BIT(SN_GPIO_INPUT_SHIFT + offset)); > +static void ti_sn_bridge_gpio_set(struct gpio_chip *chip, unsigned int offset, > + int val) > +{ > + struct ti_sn_bridge *pdata = gchip_to_pdata(chip); > + int ret; > + > + if (!test_bit(offset, pdata->gchip_output)) { > + dev_err(pdata->dev, "Ignoring GPIO set while input\n"); > + return; > + } > + > + val &= 1; > + ret = regmap_update_bits(pdata->regmap, SN_GPIO_IO_REG, > + BIT(SN_GPIO_OUTPUT_SHIFT + offset), > + val << (SN_GPIO_OUTPUT_SHIFT + offset)); Looks like a job for the generic helper library. > +static int ti_sn_bridge_gpio_direction_input(struct gpio_chip *chip, > + unsigned int offset) > +{ > + struct ti_sn_bridge *pdata = gchip_to_pdata(chip); > + int shift = offset * 2; > + int ret; > + > + if (!test_and_clear_bit(offset, pdata->gchip_output)) > + return 0; > + > + ret = regmap_update_bits(pdata->regmap, SN_GPIO_CTRL_REG, > + 0x3 << shift, SN_GPIO_MUX_INPUT << shift); But this 0x03 does not look very generic, it's not just 1 bit but 2. Overall it looks good, just the minor things above need fixing or looking into. Yours, Linus Walleij