Add the rt linux 4.1.3-rt3 as base
[kvmfornfv.git] / kernel / drivers / misc / eeprom / digsy_mtc_eeprom.c
diff --git a/kernel/drivers/misc/eeprom/digsy_mtc_eeprom.c b/kernel/drivers/misc/eeprom/digsy_mtc_eeprom.c
new file mode 100644 (file)
index 0000000..66d9e1b
--- /dev/null
@@ -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);