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/device.h>
14 #include <linux/spi/spi.h>
15 #include <linux/spi/eeprom.h>
16 #include <asm/txx9/spi.h>
18 #define AT250X0_PAGE_SIZE 8
20 /* register board information for at25 driver */
21 int __init
spi_eeprom_register(int busid
, int chipid
, int size
)
23 struct spi_board_info info
= {
25 .max_speed_hz
= 1500000, /* 1.5Mbps */
27 .chip_select
= chipid
,
28 /* Mode 0: High-Active, Sample-Then-Shift */
30 struct spi_eeprom
*eeprom
;
31 eeprom
= kzalloc(sizeof(*eeprom
), GFP_KERNEL
);
34 strcpy(eeprom
->name
, "at250x0");
35 eeprom
->byte_len
= size
;
36 eeprom
->page_size
= AT250X0_PAGE_SIZE
;
37 eeprom
->flags
= EE_ADDR1
;
38 info
.platform_data
= eeprom
;
39 return spi_register_board_info(&info
, 1);
42 /* simple temporary spi driver to provide early access to seeprom. */
44 static struct read_param
{
52 static int __init
early_seeprom_probe(struct spi_device
*spi
)
56 int len
= read_param
->len
;
57 char *buf
= read_param
->buf
;
58 int address
= read_param
->address
;
60 dev_info(&spi
->dev
, "spiclk %u KHz.\n",
61 (spi
->max_speed_hz
+ 500) / 1000);
62 if (read_param
->busid
!= spi
->master
->bus_num
||
63 read_param
->chipid
!= spi
->chip_select
)
66 /* spi_write_then_read can only work with small chunk */
67 int c
= len
< AT250X0_PAGE_SIZE
? len
: AT250X0_PAGE_SIZE
;
68 cmd
[0] = 0x03; /* AT25_READ */
70 stat
= spi_write_then_read(spi
, cmd
, sizeof(cmd
), buf
, c
);
78 static struct spi_driver early_seeprom_driver __initdata
= {
83 .probe
= early_seeprom_probe
,
86 int __init
spi_eeprom_read(int busid
, int chipid
, int address
,
87 unsigned char *buf
, int len
)
90 struct read_param param
= {
99 ret
= spi_register_driver(&early_seeprom_driver
);
101 spi_unregister_driver(&early_seeprom_driver
);