1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0-or-later
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun * ee1004 - driver for DDR4 SPD EEPROMs
4*4882a593Smuzhiyun *
5*4882a593Smuzhiyun * Copyright (C) 2017-2019 Jean Delvare
6*4882a593Smuzhiyun *
7*4882a593Smuzhiyun * Based on the at24 driver:
8*4882a593Smuzhiyun * Copyright (C) 2005-2007 David Brownell
9*4882a593Smuzhiyun * Copyright (C) 2008 Wolfram Sang, Pengutronix
10*4882a593Smuzhiyun */
11*4882a593Smuzhiyun
12*4882a593Smuzhiyun #include <linux/i2c.h>
13*4882a593Smuzhiyun #include <linux/init.h>
14*4882a593Smuzhiyun #include <linux/kernel.h>
15*4882a593Smuzhiyun #include <linux/mod_devicetable.h>
16*4882a593Smuzhiyun #include <linux/module.h>
17*4882a593Smuzhiyun #include <linux/mutex.h>
18*4882a593Smuzhiyun
19*4882a593Smuzhiyun /*
20*4882a593Smuzhiyun * DDR4 memory modules use special EEPROMs following the Jedec EE1004
21*4882a593Smuzhiyun * specification. These are 512-byte EEPROMs using a single I2C address
22*4882a593Smuzhiyun * in the 0x50-0x57 range for data. One of two 256-byte page is selected
23*4882a593Smuzhiyun * by writing a command to I2C address 0x36 or 0x37 on the same I2C bus.
24*4882a593Smuzhiyun *
25*4882a593Smuzhiyun * Therefore we need to request these 2 additional addresses, and serialize
26*4882a593Smuzhiyun * access to all such EEPROMs with a single mutex.
27*4882a593Smuzhiyun *
28*4882a593Smuzhiyun * We assume it is safe to read up to 32 bytes at once from these EEPROMs.
29*4882a593Smuzhiyun * We use SMBus access even if I2C is available, these EEPROMs are small
30*4882a593Smuzhiyun * enough, and reading from them infrequent enough, that we favor simplicity
31*4882a593Smuzhiyun * over performance.
32*4882a593Smuzhiyun */
33*4882a593Smuzhiyun
34*4882a593Smuzhiyun #define EE1004_ADDR_SET_PAGE 0x36
35*4882a593Smuzhiyun #define EE1004_EEPROM_SIZE 512
36*4882a593Smuzhiyun #define EE1004_PAGE_SIZE 256
37*4882a593Smuzhiyun #define EE1004_PAGE_SHIFT 8
38*4882a593Smuzhiyun
39*4882a593Smuzhiyun /*
40*4882a593Smuzhiyun * Mutex protects ee1004_set_page and ee1004_dev_count, and must be held
41*4882a593Smuzhiyun * from page selection to end of read.
42*4882a593Smuzhiyun */
43*4882a593Smuzhiyun static DEFINE_MUTEX(ee1004_bus_lock);
44*4882a593Smuzhiyun static struct i2c_client *ee1004_set_page[2];
45*4882a593Smuzhiyun static unsigned int ee1004_dev_count;
46*4882a593Smuzhiyun static int ee1004_current_page;
47*4882a593Smuzhiyun
48*4882a593Smuzhiyun static const struct i2c_device_id ee1004_ids[] = {
49*4882a593Smuzhiyun { "ee1004", 0 },
50*4882a593Smuzhiyun { }
51*4882a593Smuzhiyun };
52*4882a593Smuzhiyun MODULE_DEVICE_TABLE(i2c, ee1004_ids);
53*4882a593Smuzhiyun
54*4882a593Smuzhiyun /*-------------------------------------------------------------------------*/
55*4882a593Smuzhiyun
ee1004_get_current_page(void)56*4882a593Smuzhiyun static int ee1004_get_current_page(void)
57*4882a593Smuzhiyun {
58*4882a593Smuzhiyun int err;
59*4882a593Smuzhiyun
60*4882a593Smuzhiyun err = i2c_smbus_read_byte(ee1004_set_page[0]);
61*4882a593Smuzhiyun if (err == -ENXIO) {
62*4882a593Smuzhiyun /* Nack means page 1 is selected */
63*4882a593Smuzhiyun return 1;
64*4882a593Smuzhiyun }
65*4882a593Smuzhiyun if (err < 0) {
66*4882a593Smuzhiyun /* Anything else is a real error, bail out */
67*4882a593Smuzhiyun return err;
68*4882a593Smuzhiyun }
69*4882a593Smuzhiyun
70*4882a593Smuzhiyun /* Ack means page 0 is selected, returned value meaningless */
71*4882a593Smuzhiyun return 0;
72*4882a593Smuzhiyun }
73*4882a593Smuzhiyun
ee1004_eeprom_read(struct i2c_client * client,char * buf,unsigned int offset,size_t count)74*4882a593Smuzhiyun static ssize_t ee1004_eeprom_read(struct i2c_client *client, char *buf,
75*4882a593Smuzhiyun unsigned int offset, size_t count)
76*4882a593Smuzhiyun {
77*4882a593Smuzhiyun int status;
78*4882a593Smuzhiyun
79*4882a593Smuzhiyun if (count > I2C_SMBUS_BLOCK_MAX)
80*4882a593Smuzhiyun count = I2C_SMBUS_BLOCK_MAX;
81*4882a593Smuzhiyun /* Can't cross page boundaries */
82*4882a593Smuzhiyun if (unlikely(offset + count > EE1004_PAGE_SIZE))
83*4882a593Smuzhiyun count = EE1004_PAGE_SIZE - offset;
84*4882a593Smuzhiyun
85*4882a593Smuzhiyun if (count > I2C_SMBUS_BLOCK_MAX)
86*4882a593Smuzhiyun count = I2C_SMBUS_BLOCK_MAX;
87*4882a593Smuzhiyun
88*4882a593Smuzhiyun status = i2c_smbus_read_i2c_block_data_or_emulated(client, offset,
89*4882a593Smuzhiyun count, buf);
90*4882a593Smuzhiyun dev_dbg(&client->dev, "read %zu@%d --> %d\n", count, offset, status);
91*4882a593Smuzhiyun
92*4882a593Smuzhiyun return status;
93*4882a593Smuzhiyun }
94*4882a593Smuzhiyun
ee1004_read(struct file * filp,struct kobject * kobj,struct bin_attribute * bin_attr,char * buf,loff_t off,size_t count)95*4882a593Smuzhiyun static ssize_t ee1004_read(struct file *filp, struct kobject *kobj,
96*4882a593Smuzhiyun struct bin_attribute *bin_attr,
97*4882a593Smuzhiyun char *buf, loff_t off, size_t count)
98*4882a593Smuzhiyun {
99*4882a593Smuzhiyun struct device *dev = kobj_to_dev(kobj);
100*4882a593Smuzhiyun struct i2c_client *client = to_i2c_client(dev);
101*4882a593Smuzhiyun size_t requested = count;
102*4882a593Smuzhiyun int page;
103*4882a593Smuzhiyun
104*4882a593Smuzhiyun if (unlikely(!count))
105*4882a593Smuzhiyun return count;
106*4882a593Smuzhiyun
107*4882a593Smuzhiyun page = off >> EE1004_PAGE_SHIFT;
108*4882a593Smuzhiyun if (unlikely(page > 1))
109*4882a593Smuzhiyun return 0;
110*4882a593Smuzhiyun off &= (1 << EE1004_PAGE_SHIFT) - 1;
111*4882a593Smuzhiyun
112*4882a593Smuzhiyun /*
113*4882a593Smuzhiyun * Read data from chip, protecting against concurrent access to
114*4882a593Smuzhiyun * other EE1004 SPD EEPROMs on the same adapter.
115*4882a593Smuzhiyun */
116*4882a593Smuzhiyun mutex_lock(&ee1004_bus_lock);
117*4882a593Smuzhiyun
118*4882a593Smuzhiyun while (count) {
119*4882a593Smuzhiyun int status;
120*4882a593Smuzhiyun
121*4882a593Smuzhiyun /* Select page */
122*4882a593Smuzhiyun if (page != ee1004_current_page) {
123*4882a593Smuzhiyun /* Data is ignored */
124*4882a593Smuzhiyun status = i2c_smbus_write_byte(ee1004_set_page[page],
125*4882a593Smuzhiyun 0x00);
126*4882a593Smuzhiyun if (status == -ENXIO) {
127*4882a593Smuzhiyun /*
128*4882a593Smuzhiyun * Don't give up just yet. Some memory
129*4882a593Smuzhiyun * modules will select the page but not
130*4882a593Smuzhiyun * ack the command. Check which page is
131*4882a593Smuzhiyun * selected now.
132*4882a593Smuzhiyun */
133*4882a593Smuzhiyun if (ee1004_get_current_page() == page)
134*4882a593Smuzhiyun status = 0;
135*4882a593Smuzhiyun }
136*4882a593Smuzhiyun if (status < 0) {
137*4882a593Smuzhiyun dev_err(dev, "Failed to select page %d (%d)\n",
138*4882a593Smuzhiyun page, status);
139*4882a593Smuzhiyun mutex_unlock(&ee1004_bus_lock);
140*4882a593Smuzhiyun return status;
141*4882a593Smuzhiyun }
142*4882a593Smuzhiyun dev_dbg(dev, "Selected page %d\n", page);
143*4882a593Smuzhiyun ee1004_current_page = page;
144*4882a593Smuzhiyun }
145*4882a593Smuzhiyun
146*4882a593Smuzhiyun status = ee1004_eeprom_read(client, buf, off, count);
147*4882a593Smuzhiyun if (status < 0) {
148*4882a593Smuzhiyun mutex_unlock(&ee1004_bus_lock);
149*4882a593Smuzhiyun return status;
150*4882a593Smuzhiyun }
151*4882a593Smuzhiyun buf += status;
152*4882a593Smuzhiyun off += status;
153*4882a593Smuzhiyun count -= status;
154*4882a593Smuzhiyun
155*4882a593Smuzhiyun if (off == EE1004_PAGE_SIZE) {
156*4882a593Smuzhiyun page++;
157*4882a593Smuzhiyun off = 0;
158*4882a593Smuzhiyun }
159*4882a593Smuzhiyun }
160*4882a593Smuzhiyun
161*4882a593Smuzhiyun mutex_unlock(&ee1004_bus_lock);
162*4882a593Smuzhiyun
163*4882a593Smuzhiyun return requested;
164*4882a593Smuzhiyun }
165*4882a593Smuzhiyun
166*4882a593Smuzhiyun static const struct bin_attribute eeprom_attr = {
167*4882a593Smuzhiyun .attr = {
168*4882a593Smuzhiyun .name = "eeprom",
169*4882a593Smuzhiyun .mode = 0444,
170*4882a593Smuzhiyun },
171*4882a593Smuzhiyun .size = EE1004_EEPROM_SIZE,
172*4882a593Smuzhiyun .read = ee1004_read,
173*4882a593Smuzhiyun };
174*4882a593Smuzhiyun
ee1004_probe(struct i2c_client * client,const struct i2c_device_id * id)175*4882a593Smuzhiyun static int ee1004_probe(struct i2c_client *client,
176*4882a593Smuzhiyun const struct i2c_device_id *id)
177*4882a593Smuzhiyun {
178*4882a593Smuzhiyun int err, cnr = 0;
179*4882a593Smuzhiyun const char *slow = NULL;
180*4882a593Smuzhiyun
181*4882a593Smuzhiyun /* Make sure we can operate on this adapter */
182*4882a593Smuzhiyun if (!i2c_check_functionality(client->adapter,
183*4882a593Smuzhiyun I2C_FUNC_SMBUS_READ_BYTE |
184*4882a593Smuzhiyun I2C_FUNC_SMBUS_READ_I2C_BLOCK)) {
185*4882a593Smuzhiyun if (i2c_check_functionality(client->adapter,
186*4882a593Smuzhiyun I2C_FUNC_SMBUS_READ_BYTE |
187*4882a593Smuzhiyun I2C_FUNC_SMBUS_READ_WORD_DATA))
188*4882a593Smuzhiyun slow = "word";
189*4882a593Smuzhiyun else if (i2c_check_functionality(client->adapter,
190*4882a593Smuzhiyun I2C_FUNC_SMBUS_READ_BYTE |
191*4882a593Smuzhiyun I2C_FUNC_SMBUS_READ_BYTE_DATA))
192*4882a593Smuzhiyun slow = "byte";
193*4882a593Smuzhiyun else
194*4882a593Smuzhiyun return -EPFNOSUPPORT;
195*4882a593Smuzhiyun }
196*4882a593Smuzhiyun
197*4882a593Smuzhiyun /* Use 2 dummy devices for page select command */
198*4882a593Smuzhiyun mutex_lock(&ee1004_bus_lock);
199*4882a593Smuzhiyun if (++ee1004_dev_count == 1) {
200*4882a593Smuzhiyun for (cnr = 0; cnr < 2; cnr++) {
201*4882a593Smuzhiyun ee1004_set_page[cnr] = i2c_new_dummy_device(client->adapter,
202*4882a593Smuzhiyun EE1004_ADDR_SET_PAGE + cnr);
203*4882a593Smuzhiyun if (IS_ERR(ee1004_set_page[cnr])) {
204*4882a593Smuzhiyun dev_err(&client->dev,
205*4882a593Smuzhiyun "address 0x%02x unavailable\n",
206*4882a593Smuzhiyun EE1004_ADDR_SET_PAGE + cnr);
207*4882a593Smuzhiyun err = PTR_ERR(ee1004_set_page[cnr]);
208*4882a593Smuzhiyun goto err_clients;
209*4882a593Smuzhiyun }
210*4882a593Smuzhiyun }
211*4882a593Smuzhiyun } else if (i2c_adapter_id(client->adapter) !=
212*4882a593Smuzhiyun i2c_adapter_id(ee1004_set_page[0]->adapter)) {
213*4882a593Smuzhiyun dev_err(&client->dev,
214*4882a593Smuzhiyun "Driver only supports devices on a single I2C bus\n");
215*4882a593Smuzhiyun err = -EOPNOTSUPP;
216*4882a593Smuzhiyun goto err_clients;
217*4882a593Smuzhiyun }
218*4882a593Smuzhiyun
219*4882a593Smuzhiyun /* Remember current page to avoid unneeded page select */
220*4882a593Smuzhiyun err = ee1004_get_current_page();
221*4882a593Smuzhiyun if (err < 0)
222*4882a593Smuzhiyun goto err_clients;
223*4882a593Smuzhiyun ee1004_current_page = err;
224*4882a593Smuzhiyun dev_dbg(&client->dev, "Currently selected page: %d\n",
225*4882a593Smuzhiyun ee1004_current_page);
226*4882a593Smuzhiyun mutex_unlock(&ee1004_bus_lock);
227*4882a593Smuzhiyun
228*4882a593Smuzhiyun /* Create the sysfs eeprom file */
229*4882a593Smuzhiyun err = sysfs_create_bin_file(&client->dev.kobj, &eeprom_attr);
230*4882a593Smuzhiyun if (err)
231*4882a593Smuzhiyun goto err_clients_lock;
232*4882a593Smuzhiyun
233*4882a593Smuzhiyun dev_info(&client->dev,
234*4882a593Smuzhiyun "%u byte EE1004-compliant SPD EEPROM, read-only\n",
235*4882a593Smuzhiyun EE1004_EEPROM_SIZE);
236*4882a593Smuzhiyun if (slow)
237*4882a593Smuzhiyun dev_notice(&client->dev,
238*4882a593Smuzhiyun "Falling back to %s reads, performance will suffer\n",
239*4882a593Smuzhiyun slow);
240*4882a593Smuzhiyun
241*4882a593Smuzhiyun return 0;
242*4882a593Smuzhiyun
243*4882a593Smuzhiyun err_clients_lock:
244*4882a593Smuzhiyun mutex_lock(&ee1004_bus_lock);
245*4882a593Smuzhiyun err_clients:
246*4882a593Smuzhiyun if (--ee1004_dev_count == 0) {
247*4882a593Smuzhiyun for (cnr--; cnr >= 0; cnr--) {
248*4882a593Smuzhiyun i2c_unregister_device(ee1004_set_page[cnr]);
249*4882a593Smuzhiyun ee1004_set_page[cnr] = NULL;
250*4882a593Smuzhiyun }
251*4882a593Smuzhiyun }
252*4882a593Smuzhiyun mutex_unlock(&ee1004_bus_lock);
253*4882a593Smuzhiyun
254*4882a593Smuzhiyun return err;
255*4882a593Smuzhiyun }
256*4882a593Smuzhiyun
ee1004_remove(struct i2c_client * client)257*4882a593Smuzhiyun static int ee1004_remove(struct i2c_client *client)
258*4882a593Smuzhiyun {
259*4882a593Smuzhiyun int i;
260*4882a593Smuzhiyun
261*4882a593Smuzhiyun sysfs_remove_bin_file(&client->dev.kobj, &eeprom_attr);
262*4882a593Smuzhiyun
263*4882a593Smuzhiyun /* Remove page select clients if this is the last device */
264*4882a593Smuzhiyun mutex_lock(&ee1004_bus_lock);
265*4882a593Smuzhiyun if (--ee1004_dev_count == 0) {
266*4882a593Smuzhiyun for (i = 0; i < 2; i++) {
267*4882a593Smuzhiyun i2c_unregister_device(ee1004_set_page[i]);
268*4882a593Smuzhiyun ee1004_set_page[i] = NULL;
269*4882a593Smuzhiyun }
270*4882a593Smuzhiyun }
271*4882a593Smuzhiyun mutex_unlock(&ee1004_bus_lock);
272*4882a593Smuzhiyun
273*4882a593Smuzhiyun return 0;
274*4882a593Smuzhiyun }
275*4882a593Smuzhiyun
276*4882a593Smuzhiyun /*-------------------------------------------------------------------------*/
277*4882a593Smuzhiyun
278*4882a593Smuzhiyun static struct i2c_driver ee1004_driver = {
279*4882a593Smuzhiyun .driver = {
280*4882a593Smuzhiyun .name = "ee1004",
281*4882a593Smuzhiyun },
282*4882a593Smuzhiyun .probe = ee1004_probe,
283*4882a593Smuzhiyun .remove = ee1004_remove,
284*4882a593Smuzhiyun .id_table = ee1004_ids,
285*4882a593Smuzhiyun };
286*4882a593Smuzhiyun module_i2c_driver(ee1004_driver);
287*4882a593Smuzhiyun
288*4882a593Smuzhiyun MODULE_DESCRIPTION("Driver for EE1004-compliant DDR4 SPD EEPROMs");
289*4882a593Smuzhiyun MODULE_AUTHOR("Jean Delvare");
290*4882a593Smuzhiyun MODULE_LICENSE("GPL");
291