86 lines
		
	
	
	
		
			2 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			86 lines
		
	
	
	
		
			2 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								 * 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);
							 |