diff options
Diffstat (limited to 'drivers/misc/eeprom/digsy_mtc_eeprom.c')
| -rw-r--r-- | drivers/misc/eeprom/digsy_mtc_eeprom.c | 85 | 
1 files changed, 85 insertions, 0 deletions
| diff --git a/drivers/misc/eeprom/digsy_mtc_eeprom.c b/drivers/misc/eeprom/digsy_mtc_eeprom.c new file mode 100644 index 00000000000..66d9e1baeae --- /dev/null +++ b/drivers/misc/eeprom/digsy_mtc_eeprom.c @@ -0,0 +1,85 @@ +/* + * EEPROMs access control driver for display configuration EEPROMs + * on DigsyMTC board. + * + * (C) 2011 DENX Software Engineering, Anatolij Gustschin <agust@denx.de> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#include <linux/gpio.h> +#include <linux/init.h> +#include <linux/platform_device.h> +#include <linux/spi/spi.h> +#include <linux/spi/spi_gpio.h> +#include <linux/eeprom_93xx46.h> + +#define GPIO_EEPROM_CLK		216 +#define GPIO_EEPROM_CS		210 +#define GPIO_EEPROM_DI		217 +#define GPIO_EEPROM_DO		249 +#define GPIO_EEPROM_OE		255 +#define EE_SPI_BUS_NUM	1 + +static void digsy_mtc_op_prepare(void *p) +{ +	/* enable */ +	gpio_set_value(GPIO_EEPROM_OE, 0); +} + +static void digsy_mtc_op_finish(void *p) +{ +	/* disable */ +	gpio_set_value(GPIO_EEPROM_OE, 1); +} + +struct eeprom_93xx46_platform_data digsy_mtc_eeprom_data = { +	.flags		= EE_ADDR8, +	.prepare	= digsy_mtc_op_prepare, +	.finish		= digsy_mtc_op_finish, +}; + +static struct spi_gpio_platform_data eeprom_spi_gpio_data = { +	.sck		= GPIO_EEPROM_CLK, +	.mosi		= GPIO_EEPROM_DI, +	.miso		= GPIO_EEPROM_DO, +	.num_chipselect	= 1, +}; + +static struct platform_device digsy_mtc_eeprom = { +	.name	= "spi_gpio", +	.id	= EE_SPI_BUS_NUM, +	.dev	= { +		.platform_data	= &eeprom_spi_gpio_data, +	}, +}; + +static struct spi_board_info digsy_mtc_eeprom_info[] __initdata = { +	{ +		.modalias		= "93xx46", +		.max_speed_hz		= 1000000, +		.bus_num		= EE_SPI_BUS_NUM, +		.chip_select		= 0, +		.mode			= SPI_MODE_0, +		.controller_data	= (void *)GPIO_EEPROM_CS, +		.platform_data		= &digsy_mtc_eeprom_data, +	}, +}; + +static int __init digsy_mtc_eeprom_devices_init(void) +{ +	int ret; + +	ret = gpio_request_one(GPIO_EEPROM_OE, GPIOF_OUT_INIT_HIGH, +				"93xx46 EEPROMs OE"); +	if (ret) { +		pr_err("can't request gpio %d\n", GPIO_EEPROM_OE); +		return ret; +	} +	spi_register_board_info(digsy_mtc_eeprom_info, +				ARRAY_SIZE(digsy_mtc_eeprom_info)); +	return platform_device_register(&digsy_mtc_eeprom); +} +device_initcall(digsy_mtc_eeprom_devices_init); | 
