Re: [PATCH v4 5/5] gpio: syscon: Add support for the Xylon LogiCVC GPIOs
From: Linus Walleij <hidden>
Date: 2019-11-29 09:25:14
Also in:
linux-devicetree, lkml
Hi Paul, thanks for your patch! On Thu, Nov 28, 2019 at 4:54 PM Paul Kocialkowski [off-list ref] wrote:
The LogiCVC display hardware block comes with GPIO capabilities that must be exposed separately from the main driver (as GPIOs) for use with regulators and panels. A syscon is used to share the same regmap across the two drivers. Since the GPIO capabilities are pretty simple, add them to the syscon GPIO driver. Signed-off-by: Paul Kocialkowski <redacted>
(...)
+#define LOGICVC_CTRL_REG 0x40
+#define LOGICVC_CTRL_GPIO_SHIFT 11
+#define LOGICVC_CTRL_GPIO_BITS 5
+
+#define LOGICVC_POWER_CTRL_REG 0x78
+#define LOGICVC_POWER_CTRL_GPIO_SHIFT 0
+#define LOGICVC_POWER_CTRL_GPIO_BITS 4
+
+static void logicvc_gpio_offset(struct syscon_gpio_priv *priv,
+ unsigned offset, unsigned int *reg,
+ unsigned int *bit)
+{
+ if (offset >= LOGICVC_CTRL_GPIO_BITS) {
+ *reg = LOGICVC_POWER_CTRL_REG;
+
+ /* To the (virtual) power ctrl offset. */
+ offset -= LOGICVC_CTRL_GPIO_BITS;
+ /* To the actual bit offset in reg. */
+ offset += LOGICVC_POWER_CTRL_GPIO_SHIFT;
+ } else {
+ *reg = LOGICVC_CTRL_REG;
+
+ /* To the actual bit offset in reg. */
+ offset += LOGICVC_CTRL_GPIO_SHIFT;
+ }
+
+ *bit = BIT(offset);
+}The gpio-syscon.c is for simple syscons where the lines you want to affect are nicely ordered in the registers. It is intended to be generic. This is kind of shoehorning a special case into the generic code. Isn't it more appropriate to create a specific driver for this hardware? Special get/set quirks for any possible quirky offset is certainly not the way to go, if this should be supported we need generic properties in struct syscon_gpio_data to indicate the valid bits and offsets. Yours, Linus Walleij