Commit | Line | Data |
---|---|---|
469dded1 AG |
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); |