misc/eeprom: add eeprom access driver for digsy_mtc board
[linux-2.6.git] / drivers / misc / eeprom / digsy_mtc_eeprom.c
1 /*
2  * EEPROMs access control driver for display configuration EEPROMs
3  * on DigsyMTC board.
4  *
5  * (C) 2011 DENX Software Engineering, Anatolij Gustschin <agust@denx.de>
6  *
7  * This program is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License version 2 as
9  * published by the Free Software Foundation.
10  */
11
12 #include <linux/gpio.h>
13 #include <linux/init.h>
14 #include <linux/platform_device.h>
15 #include <linux/spi/spi.h>
16 #include <linux/spi/spi_gpio.h>
17 #include <linux/eeprom_93xx46.h>
18
19 #define GPIO_EEPROM_CLK         216
20 #define GPIO_EEPROM_CS          210
21 #define GPIO_EEPROM_DI          217
22 #define GPIO_EEPROM_DO          249
23 #define GPIO_EEPROM_OE          255
24 #define EE_SPI_BUS_NUM  1
25
26 static void digsy_mtc_op_prepare(void *p)
27 {
28         /* enable */
29         gpio_set_value(GPIO_EEPROM_OE, 0);
30 }
31
32 static void digsy_mtc_op_finish(void *p)
33 {
34         /* disable */
35         gpio_set_value(GPIO_EEPROM_OE, 1);
36 }
37
38 struct eeprom_93xx46_platform_data digsy_mtc_eeprom_data = {
39         .flags          = EE_ADDR8,
40         .prepare        = digsy_mtc_op_prepare,
41         .finish         = digsy_mtc_op_finish,
42 };
43
44 static struct spi_gpio_platform_data eeprom_spi_gpio_data = {
45         .sck            = GPIO_EEPROM_CLK,
46         .mosi           = GPIO_EEPROM_DI,
47         .miso           = GPIO_EEPROM_DO,
48         .num_chipselect = 1,
49 };
50
51 static struct platform_device digsy_mtc_eeprom = {
52         .name   = "spi_gpio",
53         .id     = EE_SPI_BUS_NUM,
54         .dev    = {
55                 .platform_data  = &eeprom_spi_gpio_data,
56         },
57 };
58
59 static struct spi_board_info digsy_mtc_eeprom_info[] __initdata = {
60         {
61                 .modalias               = "93xx46",
62                 .max_speed_hz           = 1000000,
63                 .bus_num                = EE_SPI_BUS_NUM,
64                 .chip_select            = 0,
65                 .mode                   = SPI_MODE_0,
66                 .controller_data        = (void *)GPIO_EEPROM_CS,
67                 .platform_data          = &digsy_mtc_eeprom_data,
68         },
69 };
70
71 static int __init digsy_mtc_eeprom_devices_init(void)
72 {
73         int ret;
74
75         ret = gpio_request_one(GPIO_EEPROM_OE, GPIOF_OUT_INIT_HIGH,
76                                 "93xx46 EEPROMs OE");
77         if (ret) {
78                 pr_err("can't request gpio %d\n", GPIO_EEPROM_OE);
79                 return ret;
80         }
81         spi_register_board_info(digsy_mtc_eeprom_info,
82                                 ARRAY_SIZE(digsy_mtc_eeprom_info));
83         return platform_device_register(&digsy_mtc_eeprom);
84 }
85 device_initcall(digsy_mtc_eeprom_devices_init);