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 000000000000..66d9e1baeae5 --- /dev/null +++ b/drivers/misc/eeprom/digsy_mtc_eeprom.c | |||
@@ -0,0 +1,85 @@ | |||
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); | ||