3 * Copyright (C) 2000-2001 Toshiba Corporation
5 * 2003-2005 (c) MontaVista Software, Inc. This file is licensed under the
6 * terms of the GNU General Public License version 2. This program is
7 * licensed "as is" without any warranty of any kind, whether express
10 * Support for TX4938 in 2.6 - Manish Lachwani (mlachwani@mvista.com)
12 #include <linux/init.h>
13 #include <linux/slab.h>
14 #include <linux/export.h>
15 #include <linux/device.h>
16 #include <linux/spi/spi.h>
17 #include <linux/spi/eeprom.h>
18 #include <asm/txx9/spi.h>
20 #define AT250X0_PAGE_SIZE 8
22 /* register board information for at25 driver */
23 int __init
spi_eeprom_register(int busid
, int chipid
, int size
)
25 struct spi_board_info info
= {
27 .max_speed_hz
= 1500000, /* 1.5Mbps */
29 .chip_select
= chipid
,
30 /* Mode 0: High-Active, Sample-Then-Shift */
32 struct spi_eeprom
*eeprom
;
33 eeprom
= kzalloc(sizeof(*eeprom
), GFP_KERNEL
);
36 strcpy(eeprom
->name
, "at250x0");
37 eeprom
->byte_len
= size
;
38 eeprom
->page_size
= AT250X0_PAGE_SIZE
;
39 eeprom
->flags
= EE_ADDR1
;
40 info
.platform_data
= eeprom
;
41 return spi_register_board_info(&info
, 1);
44 /* simple temporary spi driver to provide early access to seeprom. */
46 static struct read_param
{
54 static int __init
early_seeprom_probe(struct spi_device
*spi
)
58 int len
= read_param
->len
;
59 char *buf
= read_param
->buf
;
60 int address
= read_param
->address
;
62 dev_info(&spi
->dev
, "spiclk %u KHz.\n",
63 (spi
->max_speed_hz
+ 500) / 1000);
64 if (read_param
->busid
!= spi
->master
->bus_num
||
65 read_param
->chipid
!= spi
->chip_select
)
68 /* spi_write_then_read can only work with small chunk */
69 int c
= len
< AT250X0_PAGE_SIZE
? len
: AT250X0_PAGE_SIZE
;
70 cmd
[0] = 0x03; /* AT25_READ */
72 stat
= spi_write_then_read(spi
, cmd
, sizeof(cmd
), buf
, c
);
80 static struct spi_driver early_seeprom_driver __initdata
= {
84 .probe
= early_seeprom_probe
,
87 int __init
spi_eeprom_read(int busid
, int chipid
, int address
,
88 unsigned char *buf
, int len
)
91 struct read_param param
= {
100 ret
= spi_register_driver(&early_seeprom_driver
);
102 spi_unregister_driver(&early_seeprom_driver
);