Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3ca9b1ac authored by Cory Tusar's avatar Cory Tusar Committed by Greg Kroah-Hartman
Browse files

misc: eeprom_93xx46: Add support for a GPIO 'select' line.



This commit adds support to the eeprom_93x46 driver allowing a GPIO line
to function as a 'select' or 'enable' signal prior to accessing the
EEPROM.

Signed-off-by: default avatarCory Tusar <cory.tusar@pid1solutions.com>
Tested-by: default avatarChris Healy <chris.healy@zii.aero>
Reviewed-by: default avatarVladimir Zapolskiy <vz@mleia.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent e1379b56
Loading
Loading
Loading
Loading
+35 −0
Original line number Diff line number Diff line
@@ -10,11 +10,13 @@

#include <linux/delay.h>
#include <linux/device.h>
#include <linux/gpio/consumer.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/mutex.h>
#include <linux/of.h>
#include <linux/of_device.h>
#include <linux/of_gpio.h>
#include <linux/slab.h>
#include <linux/spi/spi.h>
#include <linux/sysfs.h>
@@ -343,6 +345,20 @@ static ssize_t eeprom_93xx46_store_erase(struct device *dev,
}
static DEVICE_ATTR(erase, S_IWUSR, NULL, eeprom_93xx46_store_erase);

static void select_assert(void *context)
{
	struct eeprom_93xx46_dev *edev = context;

	gpiod_set_value_cansleep(edev->pdata->select, 1);
}

static void select_deassert(void *context)
{
	struct eeprom_93xx46_dev *edev = context;

	gpiod_set_value_cansleep(edev->pdata->select, 0);
}

static const struct of_device_id eeprom_93xx46_of_table[] = {
	{ .compatible = "eeprom-93xx46", },
	{ .compatible = "atmel,at93c46d", .data = &atmel_at93c46d_data, },
@@ -357,6 +373,8 @@ static int eeprom_93xx46_probe_dt(struct spi_device *spi)
	struct device_node *np = spi->dev.of_node;
	struct eeprom_93xx46_platform_data *pd;
	u32 tmp;
	int gpio;
	enum of_gpio_flags of_flags;
	int ret;

	pd = devm_kzalloc(&spi->dev, sizeof(*pd), GFP_KERNEL);
@@ -381,6 +399,23 @@ static int eeprom_93xx46_probe_dt(struct spi_device *spi)
	if (of_property_read_bool(np, "read-only"))
		pd->flags |= EE_READONLY;

	gpio = of_get_named_gpio_flags(np, "select-gpios", 0, &of_flags);
	if (gpio_is_valid(gpio)) {
		unsigned long flags =
			of_flags == OF_GPIO_ACTIVE_LOW ? GPIOF_ACTIVE_LOW : 0;

		ret = devm_gpio_request_one(&spi->dev, gpio, flags,
					    "eeprom_93xx46_select");
		if (ret)
			return ret;

		pd->select = gpio_to_desc(gpio);
		pd->prepare = select_assert;
		pd->finish = select_deassert;

		gpiod_direction_output(pd->select, 0);
	}

	if (of_id->data) {
		const struct eeprom_93xx46_devtype_data *data = of_id->data;

+3 −0
Original line number Diff line number Diff line
@@ -3,6 +3,8 @@
 * platform description for 93xx46 EEPROMs.
 */

struct gpio_desc;

struct eeprom_93xx46_platform_data {
	unsigned char	flags;
#define EE_ADDR8	0x01		/*  8 bit addr. cfg */
@@ -21,4 +23,5 @@ struct eeprom_93xx46_platform_data {
	 */
	void (*prepare)(void *);
	void (*finish)(void *);
	struct gpio_desc *select;
};