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