xref: /linux/drivers/nvmem/ee1004.c (revision 67f8bc848ee31831336bd478e57d2f993551902e)
1*cf09b7a0SBartosz Golaszewski // SPDX-License-Identifier: GPL-2.0-or-later
2*cf09b7a0SBartosz Golaszewski /*
3*cf09b7a0SBartosz Golaszewski  * ee1004 - driver for DDR4 SPD EEPROMs
4*cf09b7a0SBartosz Golaszewski  *
5*cf09b7a0SBartosz Golaszewski  * Copyright (C) 2017-2019 Jean Delvare
6*cf09b7a0SBartosz Golaszewski  *
7*cf09b7a0SBartosz Golaszewski  * Based on the at24 driver:
8*cf09b7a0SBartosz Golaszewski  * Copyright (C) 2005-2007 David Brownell
9*cf09b7a0SBartosz Golaszewski  * Copyright (C) 2008 Wolfram Sang, Pengutronix
10*cf09b7a0SBartosz Golaszewski  */
11*cf09b7a0SBartosz Golaszewski 
12*cf09b7a0SBartosz Golaszewski #include <linux/device.h>
13*cf09b7a0SBartosz Golaszewski #include <linux/i2c.h>
14*cf09b7a0SBartosz Golaszewski #include <linux/init.h>
15*cf09b7a0SBartosz Golaszewski #include <linux/kernel.h>
16*cf09b7a0SBartosz Golaszewski #include <linux/module.h>
17*cf09b7a0SBartosz Golaszewski #include <linux/mutex.h>
18*cf09b7a0SBartosz Golaszewski #include <linux/nvmem-provider.h>
19*cf09b7a0SBartosz Golaszewski 
20*cf09b7a0SBartosz Golaszewski /*
21*cf09b7a0SBartosz Golaszewski  * DDR4 memory modules use special EEPROMs following the Jedec EE1004
22*cf09b7a0SBartosz Golaszewski  * specification. These are 512-byte EEPROMs using a single I2C address
23*cf09b7a0SBartosz Golaszewski  * in the 0x50-0x57 range for data. One of two 256-byte page is selected
24*cf09b7a0SBartosz Golaszewski  * by writing a command to I2C address 0x36 or 0x37 on the same I2C bus.
25*cf09b7a0SBartosz Golaszewski  *
26*cf09b7a0SBartosz Golaszewski  * Therefore we need to request these 2 additional addresses, and serialize
27*cf09b7a0SBartosz Golaszewski  * access to all such EEPROMs with a single mutex.
28*cf09b7a0SBartosz Golaszewski  *
29*cf09b7a0SBartosz Golaszewski  * We assume it is safe to read up to 32 bytes at once from these EEPROMs.
30*cf09b7a0SBartosz Golaszewski  * We use SMBus access even if I2C is available, these EEPROMs are small
31*cf09b7a0SBartosz Golaszewski  * enough, and reading from them infrequent enough, that we favor simplicity
32*cf09b7a0SBartosz Golaszewski  * over performance.
33*cf09b7a0SBartosz Golaszewski  */
34*cf09b7a0SBartosz Golaszewski 
35*cf09b7a0SBartosz Golaszewski #define EE1004_MAX_BUSSES		8
36*cf09b7a0SBartosz Golaszewski #define EE1004_ADDR_SET_PAGE		0x36
37*cf09b7a0SBartosz Golaszewski #define EE1004_NUM_PAGES		2
38*cf09b7a0SBartosz Golaszewski #define EE1004_PAGE_SIZE		256
39*cf09b7a0SBartosz Golaszewski #define EE1004_PAGE_SHIFT		8
40*cf09b7a0SBartosz Golaszewski #define EE1004_EEPROM_SIZE		(EE1004_PAGE_SIZE * EE1004_NUM_PAGES)
41*cf09b7a0SBartosz Golaszewski 
42*cf09b7a0SBartosz Golaszewski /*
43*cf09b7a0SBartosz Golaszewski  * Mutex protects ee1004_set_page and ee1004_dev_count, and must be held
44*cf09b7a0SBartosz Golaszewski  * from page selection to end of read.
45*cf09b7a0SBartosz Golaszewski  */
46*cf09b7a0SBartosz Golaszewski static DEFINE_MUTEX(ee1004_bus_lock);
47*cf09b7a0SBartosz Golaszewski 
48*cf09b7a0SBartosz Golaszewski static struct ee1004_bus_data {
49*cf09b7a0SBartosz Golaszewski 	struct i2c_adapter *adap;
50*cf09b7a0SBartosz Golaszewski 	struct i2c_client *set_page[EE1004_NUM_PAGES];
51*cf09b7a0SBartosz Golaszewski 	unsigned int dev_count;
52*cf09b7a0SBartosz Golaszewski 	int current_page;
53*cf09b7a0SBartosz Golaszewski } ee1004_bus_data[EE1004_MAX_BUSSES];
54*cf09b7a0SBartosz Golaszewski 
55*cf09b7a0SBartosz Golaszewski static const struct i2c_device_id ee1004_ids[] = {
56*cf09b7a0SBartosz Golaszewski 	{ "ee1004" },
57*cf09b7a0SBartosz Golaszewski 	{ }
58*cf09b7a0SBartosz Golaszewski };
59*cf09b7a0SBartosz Golaszewski MODULE_DEVICE_TABLE(i2c, ee1004_ids);
60*cf09b7a0SBartosz Golaszewski 
61*cf09b7a0SBartosz Golaszewski /*-------------------------------------------------------------------------*/
62*cf09b7a0SBartosz Golaszewski 
63*cf09b7a0SBartosz Golaszewski static struct ee1004_bus_data *ee1004_get_bus_data(struct i2c_adapter *adap)
64*cf09b7a0SBartosz Golaszewski {
65*cf09b7a0SBartosz Golaszewski 	int i;
66*cf09b7a0SBartosz Golaszewski 
67*cf09b7a0SBartosz Golaszewski 	for (i = 0; i < EE1004_MAX_BUSSES; i++)
68*cf09b7a0SBartosz Golaszewski 		if (ee1004_bus_data[i].adap == adap)
69*cf09b7a0SBartosz Golaszewski 			return ee1004_bus_data + i;
70*cf09b7a0SBartosz Golaszewski 
71*cf09b7a0SBartosz Golaszewski 	/* If not existent yet, create new entry */
72*cf09b7a0SBartosz Golaszewski 	for (i = 0; i < EE1004_MAX_BUSSES; i++)
73*cf09b7a0SBartosz Golaszewski 		if (!ee1004_bus_data[i].adap) {
74*cf09b7a0SBartosz Golaszewski 			ee1004_bus_data[i].adap = adap;
75*cf09b7a0SBartosz Golaszewski 			return ee1004_bus_data + i;
76*cf09b7a0SBartosz Golaszewski 		}
77*cf09b7a0SBartosz Golaszewski 
78*cf09b7a0SBartosz Golaszewski 	return NULL;
79*cf09b7a0SBartosz Golaszewski }
80*cf09b7a0SBartosz Golaszewski 
81*cf09b7a0SBartosz Golaszewski static int ee1004_get_current_page(struct ee1004_bus_data *bd)
82*cf09b7a0SBartosz Golaszewski {
83*cf09b7a0SBartosz Golaszewski 	int err;
84*cf09b7a0SBartosz Golaszewski 
85*cf09b7a0SBartosz Golaszewski 	err = i2c_smbus_read_byte(bd->set_page[0]);
86*cf09b7a0SBartosz Golaszewski 	if (err == -ENXIO) {
87*cf09b7a0SBartosz Golaszewski 		/* Nack means page 1 is selected */
88*cf09b7a0SBartosz Golaszewski 		return 1;
89*cf09b7a0SBartosz Golaszewski 	}
90*cf09b7a0SBartosz Golaszewski 	if (err < 0) {
91*cf09b7a0SBartosz Golaszewski 		/* Anything else is a real error, bail out */
92*cf09b7a0SBartosz Golaszewski 		return err;
93*cf09b7a0SBartosz Golaszewski 	}
94*cf09b7a0SBartosz Golaszewski 
95*cf09b7a0SBartosz Golaszewski 	/* Ack means page 0 is selected, returned value meaningless */
96*cf09b7a0SBartosz Golaszewski 	return 0;
97*cf09b7a0SBartosz Golaszewski }
98*cf09b7a0SBartosz Golaszewski 
99*cf09b7a0SBartosz Golaszewski static int ee1004_set_current_page(struct i2c_client *client, int page)
100*cf09b7a0SBartosz Golaszewski {
101*cf09b7a0SBartosz Golaszewski 	struct ee1004_bus_data *bd = i2c_get_clientdata(client);
102*cf09b7a0SBartosz Golaszewski 	int ret;
103*cf09b7a0SBartosz Golaszewski 
104*cf09b7a0SBartosz Golaszewski 	if (page == bd->current_page)
105*cf09b7a0SBartosz Golaszewski 		return 0;
106*cf09b7a0SBartosz Golaszewski 
107*cf09b7a0SBartosz Golaszewski 	/* Data is ignored */
108*cf09b7a0SBartosz Golaszewski 	ret = i2c_smbus_write_byte(bd->set_page[page], 0x00);
109*cf09b7a0SBartosz Golaszewski 	/*
110*cf09b7a0SBartosz Golaszewski 	 * Don't give up just yet. Some memory modules will select the page
111*cf09b7a0SBartosz Golaszewski 	 * but not ack the command. Check which page is selected now.
112*cf09b7a0SBartosz Golaszewski 	 */
113*cf09b7a0SBartosz Golaszewski 	if (ret == -ENXIO && ee1004_get_current_page(bd) == page)
114*cf09b7a0SBartosz Golaszewski 		ret = 0;
115*cf09b7a0SBartosz Golaszewski 	if (ret < 0) {
116*cf09b7a0SBartosz Golaszewski 		dev_err(&client->dev, "Failed to select page %d (%d)\n", page, ret);
117*cf09b7a0SBartosz Golaszewski 		return ret;
118*cf09b7a0SBartosz Golaszewski 	}
119*cf09b7a0SBartosz Golaszewski 
120*cf09b7a0SBartosz Golaszewski 	dev_dbg(&client->dev, "Selected page %d\n", page);
121*cf09b7a0SBartosz Golaszewski 	bd->current_page = page;
122*cf09b7a0SBartosz Golaszewski 
123*cf09b7a0SBartosz Golaszewski 	return 0;
124*cf09b7a0SBartosz Golaszewski }
125*cf09b7a0SBartosz Golaszewski 
126*cf09b7a0SBartosz Golaszewski static ssize_t ee1004_eeprom_read(struct i2c_client *client, char *buf,
127*cf09b7a0SBartosz Golaszewski 				  unsigned int offset, size_t count)
128*cf09b7a0SBartosz Golaszewski {
129*cf09b7a0SBartosz Golaszewski 	int status, page;
130*cf09b7a0SBartosz Golaszewski 
131*cf09b7a0SBartosz Golaszewski 	page = offset >> EE1004_PAGE_SHIFT;
132*cf09b7a0SBartosz Golaszewski 	offset &= (1 << EE1004_PAGE_SHIFT) - 1;
133*cf09b7a0SBartosz Golaszewski 
134*cf09b7a0SBartosz Golaszewski 	status = ee1004_set_current_page(client, page);
135*cf09b7a0SBartosz Golaszewski 	if (status)
136*cf09b7a0SBartosz Golaszewski 		return status;
137*cf09b7a0SBartosz Golaszewski 
138*cf09b7a0SBartosz Golaszewski 	/* Can't cross page boundaries */
139*cf09b7a0SBartosz Golaszewski 	if (offset + count > EE1004_PAGE_SIZE)
140*cf09b7a0SBartosz Golaszewski 		count = EE1004_PAGE_SIZE - offset;
141*cf09b7a0SBartosz Golaszewski 
142*cf09b7a0SBartosz Golaszewski 	if (count > I2C_SMBUS_BLOCK_MAX)
143*cf09b7a0SBartosz Golaszewski 		count = I2C_SMBUS_BLOCK_MAX;
144*cf09b7a0SBartosz Golaszewski 
145*cf09b7a0SBartosz Golaszewski 	return i2c_smbus_read_i2c_block_data_or_emulated(client, offset, count, buf);
146*cf09b7a0SBartosz Golaszewski }
147*cf09b7a0SBartosz Golaszewski 
148*cf09b7a0SBartosz Golaszewski static int ee1004_read(void *priv, unsigned int off, void *val, size_t count)
149*cf09b7a0SBartosz Golaszewski {
150*cf09b7a0SBartosz Golaszewski 	struct i2c_client *client = priv;
151*cf09b7a0SBartosz Golaszewski 	char *buf = val;
152*cf09b7a0SBartosz Golaszewski 	int ret;
153*cf09b7a0SBartosz Golaszewski 
154*cf09b7a0SBartosz Golaszewski 	if (unlikely(!count))
155*cf09b7a0SBartosz Golaszewski 		return count;
156*cf09b7a0SBartosz Golaszewski 
157*cf09b7a0SBartosz Golaszewski 	if (off + count > EE1004_EEPROM_SIZE)
158*cf09b7a0SBartosz Golaszewski 		return -EINVAL;
159*cf09b7a0SBartosz Golaszewski 
160*cf09b7a0SBartosz Golaszewski 	/*
161*cf09b7a0SBartosz Golaszewski 	 * Read data from chip, protecting against concurrent access to
162*cf09b7a0SBartosz Golaszewski 	 * other EE1004 SPD EEPROMs on the same adapter.
163*cf09b7a0SBartosz Golaszewski 	 */
164*cf09b7a0SBartosz Golaszewski 	mutex_lock(&ee1004_bus_lock);
165*cf09b7a0SBartosz Golaszewski 
166*cf09b7a0SBartosz Golaszewski 	while (count) {
167*cf09b7a0SBartosz Golaszewski 		ret = ee1004_eeprom_read(client, buf, off, count);
168*cf09b7a0SBartosz Golaszewski 		if (ret < 0) {
169*cf09b7a0SBartosz Golaszewski 			mutex_unlock(&ee1004_bus_lock);
170*cf09b7a0SBartosz Golaszewski 			return ret;
171*cf09b7a0SBartosz Golaszewski 		}
172*cf09b7a0SBartosz Golaszewski 
173*cf09b7a0SBartosz Golaszewski 		buf += ret;
174*cf09b7a0SBartosz Golaszewski 		off += ret;
175*cf09b7a0SBartosz Golaszewski 		count -= ret;
176*cf09b7a0SBartosz Golaszewski 	}
177*cf09b7a0SBartosz Golaszewski 
178*cf09b7a0SBartosz Golaszewski 	mutex_unlock(&ee1004_bus_lock);
179*cf09b7a0SBartosz Golaszewski 
180*cf09b7a0SBartosz Golaszewski 	return 0;
181*cf09b7a0SBartosz Golaszewski }
182*cf09b7a0SBartosz Golaszewski 
183*cf09b7a0SBartosz Golaszewski static void ee1004_probe_temp_sensor(struct i2c_client *client)
184*cf09b7a0SBartosz Golaszewski {
185*cf09b7a0SBartosz Golaszewski 	struct i2c_board_info info = { .type = "jc42" };
186*cf09b7a0SBartosz Golaszewski 	unsigned short addr = 0x18 | (client->addr & 7);
187*cf09b7a0SBartosz Golaszewski 	unsigned short addr_list[] = { addr, I2C_CLIENT_END };
188*cf09b7a0SBartosz Golaszewski 	u8 data[2];
189*cf09b7a0SBartosz Golaszewski 	int ret;
190*cf09b7a0SBartosz Golaszewski 
191*cf09b7a0SBartosz Golaszewski 	/* byte 14, bit 7 is set if temp sensor is present */
192*cf09b7a0SBartosz Golaszewski 	ret = ee1004_eeprom_read(client, data, 14, 1);
193*cf09b7a0SBartosz Golaszewski 	if (ret != 1)
194*cf09b7a0SBartosz Golaszewski 		return;
195*cf09b7a0SBartosz Golaszewski 
196*cf09b7a0SBartosz Golaszewski 	if (!(data[0] & BIT(7))) {
197*cf09b7a0SBartosz Golaszewski 		/*
198*cf09b7a0SBartosz Golaszewski 		 * If the SPD data suggests that there is no temperature
199*cf09b7a0SBartosz Golaszewski 		 * sensor, it may still be there for SPD revision 1.0.
200*cf09b7a0SBartosz Golaszewski 		 * See SPD Annex L, Revision 1 and 2, for details.
201*cf09b7a0SBartosz Golaszewski 		 * Check DIMM type and SPD revision; if it is a DDR4
202*cf09b7a0SBartosz Golaszewski 		 * with SPD revision 1.0, check the thermal sensor address
203*cf09b7a0SBartosz Golaszewski 		 * and instantiate the jc42 driver if a chip is found at
204*cf09b7a0SBartosz Golaszewski 		 * that address.
205*cf09b7a0SBartosz Golaszewski 		 * It is not necessary to check if there is a chip at the
206*cf09b7a0SBartosz Golaszewski 		 * temperature sensor address since i2c_new_scanned_device()
207*cf09b7a0SBartosz Golaszewski 		 * will do that and return silently if no chip is found.
208*cf09b7a0SBartosz Golaszewski 		 */
209*cf09b7a0SBartosz Golaszewski 		ret = ee1004_eeprom_read(client, data, 1, 2);
210*cf09b7a0SBartosz Golaszewski 		if (ret != 2 || data[0] != 0x10 || data[1] != 0x0c)
211*cf09b7a0SBartosz Golaszewski 			return;
212*cf09b7a0SBartosz Golaszewski 	}
213*cf09b7a0SBartosz Golaszewski 	i2c_new_scanned_device(client->adapter, &info, addr_list, NULL);
214*cf09b7a0SBartosz Golaszewski }
215*cf09b7a0SBartosz Golaszewski 
216*cf09b7a0SBartosz Golaszewski static void ee1004_cleanup(int idx, struct ee1004_bus_data *bd)
217*cf09b7a0SBartosz Golaszewski {
218*cf09b7a0SBartosz Golaszewski 	if (--bd->dev_count == 0) {
219*cf09b7a0SBartosz Golaszewski 		while (--idx >= 0)
220*cf09b7a0SBartosz Golaszewski 			i2c_unregister_device(bd->set_page[idx]);
221*cf09b7a0SBartosz Golaszewski 		memset(bd, 0, sizeof(struct ee1004_bus_data));
222*cf09b7a0SBartosz Golaszewski 	}
223*cf09b7a0SBartosz Golaszewski }
224*cf09b7a0SBartosz Golaszewski 
225*cf09b7a0SBartosz Golaszewski static void ee1004_cleanup_bus_data(void *data)
226*cf09b7a0SBartosz Golaszewski {
227*cf09b7a0SBartosz Golaszewski 	struct ee1004_bus_data *bd = data;
228*cf09b7a0SBartosz Golaszewski 
229*cf09b7a0SBartosz Golaszewski 	/* Remove page select clients if this is the last device */
230*cf09b7a0SBartosz Golaszewski 	mutex_lock(&ee1004_bus_lock);
231*cf09b7a0SBartosz Golaszewski 	ee1004_cleanup(EE1004_NUM_PAGES, bd);
232*cf09b7a0SBartosz Golaszewski 	mutex_unlock(&ee1004_bus_lock);
233*cf09b7a0SBartosz Golaszewski }
234*cf09b7a0SBartosz Golaszewski 
235*cf09b7a0SBartosz Golaszewski static int ee1004_init_bus_data(struct i2c_client *client)
236*cf09b7a0SBartosz Golaszewski {
237*cf09b7a0SBartosz Golaszewski 	struct ee1004_bus_data *bd;
238*cf09b7a0SBartosz Golaszewski 	int err, cnr = 0;
239*cf09b7a0SBartosz Golaszewski 
240*cf09b7a0SBartosz Golaszewski 	bd = ee1004_get_bus_data(client->adapter);
241*cf09b7a0SBartosz Golaszewski 	if (!bd)
242*cf09b7a0SBartosz Golaszewski 		return dev_err_probe(&client->dev, -ENOSPC, "Only %d busses supported",
243*cf09b7a0SBartosz Golaszewski 				     EE1004_MAX_BUSSES);
244*cf09b7a0SBartosz Golaszewski 
245*cf09b7a0SBartosz Golaszewski 	i2c_set_clientdata(client, bd);
246*cf09b7a0SBartosz Golaszewski 
247*cf09b7a0SBartosz Golaszewski 	if (++bd->dev_count == 1) {
248*cf09b7a0SBartosz Golaszewski 		/* Use 2 dummy devices for page select command */
249*cf09b7a0SBartosz Golaszewski 		for (cnr = 0; cnr < EE1004_NUM_PAGES; cnr++) {
250*cf09b7a0SBartosz Golaszewski 			struct i2c_client *cl;
251*cf09b7a0SBartosz Golaszewski 
252*cf09b7a0SBartosz Golaszewski 			cl = i2c_new_dummy_device(client->adapter, EE1004_ADDR_SET_PAGE + cnr);
253*cf09b7a0SBartosz Golaszewski 			if (IS_ERR(cl)) {
254*cf09b7a0SBartosz Golaszewski 				err = PTR_ERR(cl);
255*cf09b7a0SBartosz Golaszewski 				goto err_out;
256*cf09b7a0SBartosz Golaszewski 			}
257*cf09b7a0SBartosz Golaszewski 
258*cf09b7a0SBartosz Golaszewski 			bd->set_page[cnr] = cl;
259*cf09b7a0SBartosz Golaszewski 		}
260*cf09b7a0SBartosz Golaszewski 
261*cf09b7a0SBartosz Golaszewski 		/* Remember current page to avoid unneeded page select */
262*cf09b7a0SBartosz Golaszewski 		err = ee1004_get_current_page(bd);
263*cf09b7a0SBartosz Golaszewski 		if (err < 0)
264*cf09b7a0SBartosz Golaszewski 			goto err_out;
265*cf09b7a0SBartosz Golaszewski 
266*cf09b7a0SBartosz Golaszewski 		dev_dbg(&client->dev, "Currently selected page: %d\n", err);
267*cf09b7a0SBartosz Golaszewski 		bd->current_page = err;
268*cf09b7a0SBartosz Golaszewski 	}
269*cf09b7a0SBartosz Golaszewski 
270*cf09b7a0SBartosz Golaszewski 	return 0;
271*cf09b7a0SBartosz Golaszewski 
272*cf09b7a0SBartosz Golaszewski err_out:
273*cf09b7a0SBartosz Golaszewski 	ee1004_cleanup(cnr, bd);
274*cf09b7a0SBartosz Golaszewski 
275*cf09b7a0SBartosz Golaszewski 	return err;
276*cf09b7a0SBartosz Golaszewski }
277*cf09b7a0SBartosz Golaszewski 
278*cf09b7a0SBartosz Golaszewski static int ee1004_probe(struct i2c_client *client)
279*cf09b7a0SBartosz Golaszewski {
280*cf09b7a0SBartosz Golaszewski 	struct nvmem_config config = {
281*cf09b7a0SBartosz Golaszewski 		.dev = &client->dev,
282*cf09b7a0SBartosz Golaszewski 		.name = dev_name(&client->dev),
283*cf09b7a0SBartosz Golaszewski 		.id = NVMEM_DEVID_NONE,
284*cf09b7a0SBartosz Golaszewski 		.owner = THIS_MODULE,
285*cf09b7a0SBartosz Golaszewski 		.type = NVMEM_TYPE_EEPROM,
286*cf09b7a0SBartosz Golaszewski 		.read_only = true,
287*cf09b7a0SBartosz Golaszewski 		.root_only = false,
288*cf09b7a0SBartosz Golaszewski 		.reg_read = ee1004_read,
289*cf09b7a0SBartosz Golaszewski 		.size = EE1004_EEPROM_SIZE,
290*cf09b7a0SBartosz Golaszewski 		.word_size = 1,
291*cf09b7a0SBartosz Golaszewski 		.stride = 1,
292*cf09b7a0SBartosz Golaszewski 		.priv = client,
293*cf09b7a0SBartosz Golaszewski 		.compat = true,
294*cf09b7a0SBartosz Golaszewski 		.base_dev = &client->dev,
295*cf09b7a0SBartosz Golaszewski 	};
296*cf09b7a0SBartosz Golaszewski 	struct nvmem_device *ndev;
297*cf09b7a0SBartosz Golaszewski 	int err;
298*cf09b7a0SBartosz Golaszewski 
299*cf09b7a0SBartosz Golaszewski 	/* Make sure we can operate on this adapter */
300*cf09b7a0SBartosz Golaszewski 	if (!i2c_check_functionality(client->adapter,
301*cf09b7a0SBartosz Golaszewski 				     I2C_FUNC_SMBUS_BYTE | I2C_FUNC_SMBUS_READ_I2C_BLOCK) &&
302*cf09b7a0SBartosz Golaszewski 	    !i2c_check_functionality(client->adapter,
303*cf09b7a0SBartosz Golaszewski 				     I2C_FUNC_SMBUS_BYTE | I2C_FUNC_SMBUS_READ_BYTE_DATA))
304*cf09b7a0SBartosz Golaszewski 		return -EPFNOSUPPORT;
305*cf09b7a0SBartosz Golaszewski 
306*cf09b7a0SBartosz Golaszewski 	err = i2c_smbus_read_byte(client);
307*cf09b7a0SBartosz Golaszewski 	if (err < 0)
308*cf09b7a0SBartosz Golaszewski 		return -ENODEV;
309*cf09b7a0SBartosz Golaszewski 
310*cf09b7a0SBartosz Golaszewski 	mutex_lock(&ee1004_bus_lock);
311*cf09b7a0SBartosz Golaszewski 
312*cf09b7a0SBartosz Golaszewski 	err = ee1004_init_bus_data(client);
313*cf09b7a0SBartosz Golaszewski 	if (err < 0) {
314*cf09b7a0SBartosz Golaszewski 		mutex_unlock(&ee1004_bus_lock);
315*cf09b7a0SBartosz Golaszewski 		return err;
316*cf09b7a0SBartosz Golaszewski 	}
317*cf09b7a0SBartosz Golaszewski 
318*cf09b7a0SBartosz Golaszewski 	ee1004_probe_temp_sensor(client);
319*cf09b7a0SBartosz Golaszewski 
320*cf09b7a0SBartosz Golaszewski 	mutex_unlock(&ee1004_bus_lock);
321*cf09b7a0SBartosz Golaszewski 
322*cf09b7a0SBartosz Golaszewski 	err = devm_add_action_or_reset(&client->dev, ee1004_cleanup_bus_data,
323*cf09b7a0SBartosz Golaszewski 				       i2c_get_clientdata(client));
324*cf09b7a0SBartosz Golaszewski 	if (err < 0)
325*cf09b7a0SBartosz Golaszewski 		return err;
326*cf09b7a0SBartosz Golaszewski 
327*cf09b7a0SBartosz Golaszewski 	ndev = devm_nvmem_register(&client->dev, &config);
328*cf09b7a0SBartosz Golaszewski 	if (IS_ERR(ndev))
329*cf09b7a0SBartosz Golaszewski 		return PTR_ERR(ndev);
330*cf09b7a0SBartosz Golaszewski 
331*cf09b7a0SBartosz Golaszewski 	dev_info(&client->dev,
332*cf09b7a0SBartosz Golaszewski 		 "%u byte EE1004-compliant SPD EEPROM, read-only\n",
333*cf09b7a0SBartosz Golaszewski 		 EE1004_EEPROM_SIZE);
334*cf09b7a0SBartosz Golaszewski 
335*cf09b7a0SBartosz Golaszewski 	return 0;
336*cf09b7a0SBartosz Golaszewski }
337*cf09b7a0SBartosz Golaszewski 
338*cf09b7a0SBartosz Golaszewski /*-------------------------------------------------------------------------*/
339*cf09b7a0SBartosz Golaszewski 
340*cf09b7a0SBartosz Golaszewski static struct i2c_driver ee1004_driver = {
341*cf09b7a0SBartosz Golaszewski 	.driver = {
342*cf09b7a0SBartosz Golaszewski 		.name = "ee1004",
343*cf09b7a0SBartosz Golaszewski 	},
344*cf09b7a0SBartosz Golaszewski 	.probe = ee1004_probe,
345*cf09b7a0SBartosz Golaszewski 	.id_table = ee1004_ids,
346*cf09b7a0SBartosz Golaszewski };
347*cf09b7a0SBartosz Golaszewski module_i2c_driver(ee1004_driver);
348*cf09b7a0SBartosz Golaszewski 
349*cf09b7a0SBartosz Golaszewski MODULE_DESCRIPTION("Driver for EE1004-compliant DDR4 SPD EEPROMs");
350*cf09b7a0SBartosz Golaszewski MODULE_AUTHOR("Jean Delvare");
351*cf09b7a0SBartosz Golaszewski MODULE_LICENSE("GPL");
352