All of lore.kernel.org
 help / color / mirror / Atom feed
From: Kieran Bingham <kieran.bingham@ideasonboard.com>
To: Jacopo Mondi <jacopo@jmondi.org>, linux-renesas-soc@vger.kernel.org
Cc: Kieran Bingham <kieran.bingham@ideasonboard.com>
Subject: [PATCH 2/3] media: i2c: max9286: Add GPIO chip controller
Date: Fri,  6 Dec 2019 14:05:19 +0000	[thread overview]
Message-ID: <20191206140520.10457-2-kieran.bingham@ideasonboard.com> (raw)
In-Reply-To: <20191206140520.10457-1-kieran.bingham@ideasonboard.com>

Provide a GPIO chip to control the two output lines available on the
MAX9286.

Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
---
 drivers/media/i2c/max9286.c | 68 +++++++++++++++++++++++++++++++++++++
 1 file changed, 68 insertions(+)

diff --git a/drivers/media/i2c/max9286.c b/drivers/media/i2c/max9286.c
index 6ea08fd87811..c34e7b5c7447 100644
--- a/drivers/media/i2c/max9286.c
+++ b/drivers/media/i2c/max9286.c
@@ -13,6 +13,7 @@
 #include <linux/delay.h>
 #include <linux/device.h>
 #include <linux/fwnode.h>
+#include <linux/gpio/driver.h>
 #include <linux/i2c.h>
 #include <linux/i2c-mux.h>
 #include <linux/module.h>
@@ -58,6 +59,8 @@
 #define MAX9286_HVSRC_D0		(2 << 0)
 #define MAX9286_HVSRC_D14		(1 << 0)
 #define MAX9286_HVSRC_D18		(0 << 0)
+/* Register 0x0f */
+#define MAX9286_0X0F_RESERVED		BIT(3)
 /* Register 0x12 */
 #define MAX9286_CSILANECNT(n)		(((n) - 1) << 6)
 #define MAX9286_CSIDBL			BIT(5)
@@ -145,6 +148,9 @@ struct max9286_priv {
 	struct regulator *regulator;
 	bool poc_enabled;
 
+	struct gpio_chip gpio;
+	u8 gpio_state;
+
 	struct i2c_mux_core *mux;
 	unsigned int mux_channel;
 	bool mux_open;
@@ -712,6 +718,60 @@ static const struct of_device_id max9286_dt_ids[] = {
 };
 MODULE_DEVICE_TABLE(of, max9286_dt_ids);
 
+static void max9286_gpio_set(struct gpio_chip *chip,
+			     unsigned int offset, int value)
+{
+	struct max9286_priv *priv = gpiochip_get_data(chip);
+
+	if (value)
+		priv->gpio_state |= BIT(offset);
+	else
+		priv->gpio_state &= ~BIT(offset);
+
+	max9286_write(priv, 0x0f, MAX9286_0X0F_RESERVED | priv->gpio_state);
+}
+
+static int max9286_gpio_get(struct gpio_chip *chip, unsigned int offset)
+{
+	struct max9286_priv *priv = gpiochip_get_data(chip);
+
+	return priv->gpio_state & BIT(offset);
+}
+
+static int max9286_gpio(struct max9286_priv *priv)
+{
+	struct device *dev = &priv->client->dev;
+	struct gpio_chip *gpio = &priv->gpio;
+	int ret;
+
+	static const char * const names[] = {
+		"GPIO0OUT",
+		"GPIO1OUT",
+	};
+
+	/* Configure the GPIO */
+	gpio->label = dev_name(dev);
+	gpio->parent = dev;
+	gpio->owner = THIS_MODULE;
+	gpio->of_node = dev->of_node;
+	gpio->ngpio = 2;
+	gpio->set = max9286_gpio_set;
+	gpio->get = max9286_gpio_get;
+	gpio->can_sleep = true;
+	gpio->names = names;
+
+	/* GPIO values default to high */
+	priv->gpio_state = BIT(0) | BIT(1);
+
+	ret = devm_gpiochip_add_data(dev, gpio, priv);
+	if (ret)
+		dev_err(dev, "Unable to create gpio_chip\n");
+
+	dev_err(dev, "Created gpio_chip for MAX9286\n");
+
+	return ret;
+}
+
 static int max9286_init(struct device *dev)
 {
 	struct max9286_priv *priv;
@@ -984,6 +1044,14 @@ static int max9286_probe(struct i2c_client *client)
 	if (ret)
 		return ret;
 
+	/*
+	 * It is possible to set up the power regulator from the GPIO lines,
+	 * so it needs to be set up early.
+	 */
+	ret = max9286_gpio(priv);
+	if (ret)
+		return ret;
+
 	priv->regulator = regulator_get(&client->dev, "poc");
 	if (IS_ERR(priv->regulator)) {
 		if (PTR_ERR(priv->regulator) != -EPROBE_DEFER)
-- 
2.20.1


  reply	other threads:[~2019-12-06 14:05 UTC|newest]

Thread overview: 29+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-11-16 16:50 [RFT 0/4] GMSL Refresh (would be v6) Jacopo Mondi
2019-11-16 16:50 ` [RFT 1/4] dt-bindings: media: i2c: Add bindings for Maxim Integrated MAX9286 Jacopo Mondi
2019-11-16 16:50 ` [RFT 2/4] max9286: Add MAX9286 driver Jacopo Mondi
2019-11-16 16:50 ` [RFT 3/4] arm64: dts: renesas: Add Maxim GMSL expansion board Jacopo Mondi
2019-11-16 16:50 ` [RFT 4/4] arm64: dts: renesas: r8a7796=salvator-x: Include GMSL Jacopo Mondi
2019-11-17  9:19   ` Geert Uytterhoeven
2019-11-20 16:33 ` [RFT 0/4] GMSL Refresh (would be v6) Kieran Bingham
2019-11-21 12:04   ` Jacopo Mondi
2019-11-21 16:56 ` [PATCH] max9286: simplify i2c-mux parsing Kieran Bingham
2019-11-21 17:35   ` Jacopo Mondi
2019-11-29 11:45     ` Kieran Bingham
2019-11-28 16:27 ` [PATCH] max9286: Improve mux-state readbility Kieran Bingham
2019-11-29  9:14   ` Jacopo Mondi
2019-11-29 11:13     ` Kieran Bingham
2019-11-29 11:35       ` Jacopo Mondi
2019-11-29 12:36         ` Kieran Bingham
2019-11-29 13:26   ` [PATCH] max9286: Improve mux-state readbility [v2] Kieran Bingham
2019-12-03  8:19     ` Jacopo Mondi
2019-12-06 13:52       ` Kieran Bingham
2019-12-06 14:05 ` [PATCH 1/3] media: i2c: max9286: Remove redundant max9286_i2c_mux_state Kieran Bingham
2019-12-06 14:05   ` Kieran Bingham [this message]
2019-12-06 14:08     ` [PATCH 2/3] media: i2c: max9286: Add GPIO chip controller Kieran Bingham
2019-12-10 10:24       ` Kieran Bingham
2019-12-06 14:05   ` [PATCH 3/3] media: i2c: max9286: Provide optional enable-gpio Kieran Bingham
2019-12-10 10:21     ` Kieran Bingham
2019-12-06 14:10   ` [PATCH 1/3] media: i2c: max9286: Remove redundant max9286_i2c_mux_state Geert Uytterhoeven
2019-12-06 14:22     ` Kieran Bingham
2019-12-10 10:26       ` Kieran Bingham
2019-12-11  9:00 ` [PATCH] dt-bindings: media: i2c: max9286: Specify 'type' Jacopo Mondi

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20191206140520.10457-2-kieran.bingham@ideasonboard.com \
    --to=kieran.bingham@ideasonboard.com \
    --cc=jacopo@jmondi.org \
    --cc=linux-renesas-soc@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.