Skip to contentSkip to conversation

add power-supply control to enable eeprom usage

PATCH In review Eliav Farber 3 participants 5 messages Aug 28, 2022 – Aug 31, 2022

Subsystems (4)
lore
Share & tools
lore
#0 lore raw

v3 cover add power-supply control to enable eeprom usage

First patch describes the new binding property. Second patch adds the functionality to the driver.

Change between v3 and v2:
- Apply on top of v6.0-rc1.

Change between v2 and v1:
- Use a gpio regulator for power-supply control.

Eliav Farber (2):
dt-bindings: at24: add new optional power-supply property
eeprom: at24: add support for power-supply control

 .../devicetree/bindings/eeprom/at24.yaml      |  4 ++
 drivers/misc/eeprom/at24.c                    | 40 +++++++++++++++++++
 2 files changed, 44 insertions(+)
Signature · 1 line
2.37.1
#1 lore raw

PATCH v3 1/2 dt-bindings: at24: add new optional power-supply property

Boards using the AT24 EEPROMs might have a GPIO that controls the power supply of the chip, and it must be set to enable the usage of it.

Add a new optional property to the device tree binding document, which allows to specify a GPIO regulator for the pin that controls the power.

On Linux this means that we need to enable the GPIO at the beginning of probe function, before trying to access the chip.

---
V2 -> V3:
Apply on top of v6.0-rc1

 Documentation/devicetree/bindings/eeprom/at24.yaml | 4 ++++
 1 file changed, 4 insertions(+)
Documentation/devicetree/bindings/eeprom/at24.yaml +4 -0
index d14e0accbda8..82f0046f67a9 100644
@@ -179,6 +179,10 @@ properties:
     description:
       phandle of the regulator that provides the supply voltage.
 
+  power-supply:
+    description:
+      phandle of the gpio regulator that provides the supply voltage.
+
 required:
   - compatible
   - reg
Signature · 1 line
2.37.1
#2 lore raw

Re: [PATCH v3 1/2] dt-bindings: at24: add new optional power-supply property

Quoted 23 lines · Eliav Farber

Boards using the AT24 EEPROMs might have a GPIO that controls the power supply of the chip, and it must be set to enable the usage of it.

Add a new optional property to the device tree binding document, which allows to specify a GPIO regulator for the pin that controls the power.

On Linux this means that we need to enable the GPIO at the beginning of probe function, before trying to access the chip.

---
V2 -> V3:
Apply on top of v6.0-rc1

 Documentation/devicetree/bindings/eeprom/at24.yaml | 4 ++++
 1 file changed, 4 insertions(+)
Documentation/devicetree/bindings/eeprom/at24.yaml +0 -0
index d14e0accbda8..82f0046f67a9 100644

Documentation/devicetree/bindings/eeprom/at24.yaml properties: · line 182

Quoted 4 lines
Documentation/devicetree/bindings/eeprom/at24.yaml +1 -0
@@ -179,6 +179,10 @@ properties:
     description:
       phandle of the regulator that provides the supply voltage.
 
+  power-supply:

The datasheets I looked at say the supply name is 'VCC', so vcc-supply.

Documentation/devicetree/bindings/eeprom/at24.yaml properties: · line 184

Quoted 2 lines
Documentation/devicetree/bindings/eeprom/at24.yaml +2 -0
+    description:
+      phandle of the gpio regulator that provides the supply voltage.

What the connection is is outside the scope of the binding. IOW, it might not be a GPIO controlled regulator. So drop the description.

Quoted 7 lines
Documentation/devicetree/bindings/eeprom/at24.yaml +1 -1
+
 required:
   - compatible
   - reg
--

2.37.1

#3 lore raw

PATCH v3 2/2 eeprom: at24: add support for power-supply control

In reply to Eliav Farber

Add an optional gpio regulator to support a power-supply control. If a gpio power-supply regulator is supplied in the device tree, the gpio is enabled during probe, and disabled on remove.

---
V2 -> V3:
Apply on top of v6.0-rc1

 drivers/misc/eeprom/at24.c | 40 ++++++++++++++++++++++++++++++++++++++
 1 file changed, 40 insertions(+)
drivers/misc/eeprom/at24.c +40 -0
index 633e1cf08d6e..97f16c361474 100644
@@ -87,6 +87,8 @@ struct at24_data {
 	struct regulator *vcc_reg;
 	void (*read_post)(unsigned int off, char *buf, size_t count);
 
+	struct regulator *supply;
+
 	/*
 	 * Some chips tie up multiple I2C addresses; dummy devices reserve
 	 * them for us.
@@ -581,6 +583,13 @@ static unsigned int at24_get_offset_adj(u8 flags, unsigned int byte_len)
 	}
 }
 
+static void devm_at24_regulator_disable(void *data)
+{
+	struct at24_data *at24 = data;
+
+	regulator_disable(at24->supply);
+}
+
 static int at24_probe(struct i2c_client *client)
 {
 	struct regmap_config regmap_config = { };
@@ -681,6 +690,37 @@ static int at24_probe(struct i2c_client *client)
 	if (!at24)
 		return -ENOMEM;
 
+	at24->supply = devm_regulator_get_optional(dev, "power");
+	if (IS_ERR(at24->supply)) {
+		err = PTR_ERR(at24->supply);
+		if (err == -ENODEV)
+			at24->supply = NULL;
+		else
+			return dev_err_probe(dev, err,
+					     "failed to get power-supply regulator\n");
+	}
+
+	if (at24->supply) {
+		err = regulator_enable(at24->supply);
+		if (err < 0) {
+			dev_err(dev,
+				"failed to enable power-supply regulator: %d\n",
+				err);
+			return err;
+		}
+
+		err = devm_add_action_or_reset(dev, devm_at24_regulator_disable,
+					       at24);
+		if (err < 0) {
+			dev_err(dev,
+				"failed to add action to disable power-supply regulator: %d\n",
+				err);
+			return err;
+		}
+
+		usleep_range(2000, 3000);
+	}
+
 	mutex_init(&at24->lock);
 	at24->byte_len = byte_len;
 	at24->page_size = page_size;
Signature · 1 line
2.37.1
#4 lore raw
In reply to Eliav Farber
Quoted 14 lines · Eliav Farber

First patch describes the new binding property. Second patch adds the functionality to the driver.

Change between v3 and v2:
- Apply on top of v6.0-rc1.

Change between v2 and v1:
- Use a gpio regulator for power-supply control.

Eliav Farber (2):
dt-bindings: at24: add new optional power-supply property
eeprom: at24: add support for power-supply control

Quoted 7 lines
 .../devicetree/bindings/eeprom/at24.yaml      |  4 ++
 drivers/misc/eeprom/at24.c                    | 40 +++++++++++++++++++
 2 files changed, 44 insertions(+)

--
2.37.1

What is the difference between this and the existing "vcc" regulator? Why are you going through all the hoops in probe if a regular regulator_get() will return a dummy regulator if the supply is not found?

Bart