cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

w1_ds28e17.c (18200B)


      1// SPDX-License-Identifier: GPL-2.0-only
      2/*
      3 *	w1_ds28e17.c - w1 family 19 (DS28E17) driver
      4 *
      5 * Copyright (c) 2016 Jan Kandziora <jjj@gmx.de>
      6 */
      7
      8#include <linux/crc16.h>
      9#include <linux/delay.h>
     10#include <linux/device.h>
     11#include <linux/i2c.h>
     12#include <linux/kernel.h>
     13#include <linux/module.h>
     14#include <linux/moduleparam.h>
     15#include <linux/slab.h>
     16#include <linux/types.h>
     17#include <linux/uaccess.h>
     18
     19#define CRC16_INIT 0
     20
     21#include <linux/w1.h>
     22
     23#define W1_FAMILY_DS28E17 0x19
     24
     25/* Module setup. */
     26MODULE_LICENSE("GPL v2");
     27MODULE_AUTHOR("Jan Kandziora <jjj@gmx.de>");
     28MODULE_DESCRIPTION("w1 family 19 driver for DS28E17, 1-wire to I2C master bridge");
     29MODULE_ALIAS("w1-family-" __stringify(W1_FAMILY_DS28E17));
     30
     31
     32/* Default I2C speed to be set when a DS28E17 is detected. */
     33static int i2c_speed = 100;
     34module_param_named(speed, i2c_speed, int, (S_IRUSR | S_IWUSR));
     35MODULE_PARM_DESC(speed, "Default I2C speed to be set when a DS28E17 is detected");
     36
     37/* Default I2C stretch value to be set when a DS28E17 is detected. */
     38static char i2c_stretch = 1;
     39module_param_named(stretch, i2c_stretch, byte, (S_IRUSR | S_IWUSR));
     40MODULE_PARM_DESC(stretch, "Default I2C stretch value to be set when a DS28E17 is detected");
     41
     42/* DS28E17 device command codes. */
     43#define W1_F19_WRITE_DATA_WITH_STOP      0x4B
     44#define W1_F19_WRITE_DATA_NO_STOP        0x5A
     45#define W1_F19_WRITE_DATA_ONLY           0x69
     46#define W1_F19_WRITE_DATA_ONLY_WITH_STOP 0x78
     47#define W1_F19_READ_DATA_WITH_STOP       0x87
     48#define W1_F19_WRITE_READ_DATA_WITH_STOP 0x2D
     49#define W1_F19_WRITE_CONFIGURATION       0xD2
     50#define W1_F19_READ_CONFIGURATION        0xE1
     51#define W1_F19_ENABLE_SLEEP_MODE         0x1E
     52#define W1_F19_READ_DEVICE_REVISION      0xC4
     53
     54/* DS28E17 status bits */
     55#define W1_F19_STATUS_CRC     0x01
     56#define W1_F19_STATUS_ADDRESS 0x02
     57#define W1_F19_STATUS_START   0x08
     58
     59/*
     60 * Maximum number of I2C bytes to transfer within one CRC16 protected onewire
     61 * command.
     62 * */
     63#define W1_F19_WRITE_DATA_LIMIT 255
     64
     65/* Maximum number of I2C bytes to read with one onewire command. */
     66#define W1_F19_READ_DATA_LIMIT 255
     67
     68/* Constants for calculating the busy sleep. */
     69#define W1_F19_BUSY_TIMEBASES { 90, 23, 10 }
     70#define W1_F19_BUSY_GRATUITY  1000
     71
     72/* Number of checks for the busy flag before timeout. */
     73#define W1_F19_BUSY_CHECKS 1000
     74
     75
     76/* Slave specific data. */
     77struct w1_f19_data {
     78	u8 speed;
     79	u8 stretch;
     80	struct i2c_adapter adapter;
     81};
     82
     83
     84/* Wait a while until the busy flag clears. */
     85static int w1_f19_i2c_busy_wait(struct w1_slave *sl, size_t count)
     86{
     87	const unsigned long timebases[3] = W1_F19_BUSY_TIMEBASES;
     88	struct w1_f19_data *data = sl->family_data;
     89	unsigned int checks;
     90
     91	/* Check the busy flag first in any case.*/
     92	if (w1_touch_bit(sl->master, 1) == 0)
     93		return 0;
     94
     95	/*
     96	 * Do a generously long sleep in the beginning,
     97	 * as we have to wait at least this time for all
     98	 * the I2C bytes at the given speed to be transferred.
     99	 */
    100	usleep_range(timebases[data->speed] * (data->stretch) * count,
    101		timebases[data->speed] * (data->stretch) * count
    102		+ W1_F19_BUSY_GRATUITY);
    103
    104	/* Now continusly check the busy flag sent by the DS28E17. */
    105	checks = W1_F19_BUSY_CHECKS;
    106	while ((checks--) > 0) {
    107		/* Return success if the busy flag is cleared. */
    108		if (w1_touch_bit(sl->master, 1) == 0)
    109			return 0;
    110
    111		/* Wait one non-streched byte timeslot. */
    112		udelay(timebases[data->speed]);
    113	}
    114
    115	/* Timeout. */
    116	dev_warn(&sl->dev, "busy timeout\n");
    117	return -ETIMEDOUT;
    118}
    119
    120
    121/* Utility function: result. */
    122static size_t w1_f19_error(struct w1_slave *sl, u8 w1_buf[])
    123{
    124	/* Warnings. */
    125	if (w1_buf[0] & W1_F19_STATUS_CRC)
    126		dev_warn(&sl->dev, "crc16 mismatch\n");
    127	if (w1_buf[0] & W1_F19_STATUS_ADDRESS)
    128		dev_warn(&sl->dev, "i2c device not responding\n");
    129	if ((w1_buf[0] & (W1_F19_STATUS_CRC | W1_F19_STATUS_ADDRESS)) == 0
    130			&& w1_buf[1] != 0) {
    131		dev_warn(&sl->dev, "i2c short write, %d bytes not acknowledged\n",
    132			w1_buf[1]);
    133	}
    134
    135	/* Check error conditions. */
    136	if (w1_buf[0] & W1_F19_STATUS_ADDRESS)
    137		return -ENXIO;
    138	if (w1_buf[0] & W1_F19_STATUS_START)
    139		return -EAGAIN;
    140	if (w1_buf[0] != 0 || w1_buf[1] != 0)
    141		return -EIO;
    142
    143	/* All ok. */
    144	return 0;
    145}
    146
    147
    148/* Utility function: write data to I2C slave, single chunk. */
    149static int __w1_f19_i2c_write(struct w1_slave *sl,
    150	const u8 *command, size_t command_count,
    151	const u8 *buffer, size_t count)
    152{
    153	u16 crc;
    154	int error;
    155	u8 w1_buf[2];
    156
    157	/* Send command and I2C data to DS28E17. */
    158	crc = crc16(CRC16_INIT, command, command_count);
    159	w1_write_block(sl->master, command, command_count);
    160
    161	w1_buf[0] = count;
    162	crc = crc16(crc, w1_buf, 1);
    163	w1_write_8(sl->master, w1_buf[0]);
    164
    165	crc = crc16(crc, buffer, count);
    166	w1_write_block(sl->master, buffer, count);
    167
    168	w1_buf[0] = ~(crc & 0xFF);
    169	w1_buf[1] = ~((crc >> 8) & 0xFF);
    170	w1_write_block(sl->master, w1_buf, 2);
    171
    172	/* Wait until busy flag clears (or timeout). */
    173	if (w1_f19_i2c_busy_wait(sl, count + 1) < 0)
    174		return -ETIMEDOUT;
    175
    176	/* Read status from DS28E17. */
    177	w1_read_block(sl->master, w1_buf, 2);
    178
    179	/* Check error conditions. */
    180	error = w1_f19_error(sl, w1_buf);
    181	if (error < 0)
    182		return error;
    183
    184	/* Return number of bytes written. */
    185	return count;
    186}
    187
    188
    189/* Write data to I2C slave. */
    190static int w1_f19_i2c_write(struct w1_slave *sl, u16 i2c_address,
    191	const u8 *buffer, size_t count, bool stop)
    192{
    193	int result;
    194	int remaining = count;
    195	const u8 *p;
    196	u8 command[2];
    197
    198	/* Check input. */
    199	if (count == 0)
    200		return -EOPNOTSUPP;
    201
    202	/* Check whether we need multiple commands. */
    203	if (count <= W1_F19_WRITE_DATA_LIMIT) {
    204		/*
    205		 * Small data amount. Data can be sent with
    206		 * a single onewire command.
    207		 */
    208
    209		/* Send all data to DS28E17. */
    210		command[0] = (stop ? W1_F19_WRITE_DATA_WITH_STOP
    211			: W1_F19_WRITE_DATA_NO_STOP);
    212		command[1] = i2c_address << 1;
    213		result = __w1_f19_i2c_write(sl, command, 2, buffer, count);
    214	} else {
    215		/* Large data amount. Data has to be sent in multiple chunks. */
    216
    217		/* Send first chunk to DS28E17. */
    218		p = buffer;
    219		command[0] = W1_F19_WRITE_DATA_NO_STOP;
    220		command[1] = i2c_address << 1;
    221		result = __w1_f19_i2c_write(sl, command, 2, p,
    222			W1_F19_WRITE_DATA_LIMIT);
    223		if (result < 0)
    224			return result;
    225
    226		/* Resume to same DS28E17. */
    227		if (w1_reset_resume_command(sl->master))
    228			return -EIO;
    229
    230		/* Next data chunk. */
    231		p += W1_F19_WRITE_DATA_LIMIT;
    232		remaining -= W1_F19_WRITE_DATA_LIMIT;
    233
    234		while (remaining > W1_F19_WRITE_DATA_LIMIT) {
    235			/* Send intermediate chunk to DS28E17. */
    236			command[0] = W1_F19_WRITE_DATA_ONLY;
    237			result = __w1_f19_i2c_write(sl, command, 1, p,
    238					W1_F19_WRITE_DATA_LIMIT);
    239			if (result < 0)
    240				return result;
    241
    242			/* Resume to same DS28E17. */
    243			if (w1_reset_resume_command(sl->master))
    244				return -EIO;
    245
    246			/* Next data chunk. */
    247			p += W1_F19_WRITE_DATA_LIMIT;
    248			remaining -= W1_F19_WRITE_DATA_LIMIT;
    249		}
    250
    251		/* Send final chunk to DS28E17. */
    252		command[0] = (stop ? W1_F19_WRITE_DATA_ONLY_WITH_STOP
    253			: W1_F19_WRITE_DATA_ONLY);
    254		result = __w1_f19_i2c_write(sl, command, 1, p, remaining);
    255	}
    256
    257	return result;
    258}
    259
    260
    261/* Read data from I2C slave. */
    262static int w1_f19_i2c_read(struct w1_slave *sl, u16 i2c_address,
    263	u8 *buffer, size_t count)
    264{
    265	u16 crc;
    266	int error;
    267	u8 w1_buf[5];
    268
    269	/* Check input. */
    270	if (count == 0)
    271		return -EOPNOTSUPP;
    272
    273	/* Send command to DS28E17. */
    274	w1_buf[0] = W1_F19_READ_DATA_WITH_STOP;
    275	w1_buf[1] = i2c_address << 1 | 0x01;
    276	w1_buf[2] = count;
    277	crc = crc16(CRC16_INIT, w1_buf, 3);
    278	w1_buf[3] = ~(crc & 0xFF);
    279	w1_buf[4] = ~((crc >> 8) & 0xFF);
    280	w1_write_block(sl->master, w1_buf, 5);
    281
    282	/* Wait until busy flag clears (or timeout). */
    283	if (w1_f19_i2c_busy_wait(sl, count + 1) < 0)
    284		return -ETIMEDOUT;
    285
    286	/* Read status from DS28E17. */
    287	w1_buf[0] = w1_read_8(sl->master);
    288	w1_buf[1] = 0;
    289
    290	/* Check error conditions. */
    291	error = w1_f19_error(sl, w1_buf);
    292	if (error < 0)
    293		return error;
    294
    295	/* Read received I2C data from DS28E17. */
    296	return w1_read_block(sl->master, buffer, count);
    297}
    298
    299
    300/* Write to, then read data from I2C slave. */
    301static int w1_f19_i2c_write_read(struct w1_slave *sl, u16 i2c_address,
    302	const u8 *wbuffer, size_t wcount, u8 *rbuffer, size_t rcount)
    303{
    304	u16 crc;
    305	int error;
    306	u8 w1_buf[3];
    307
    308	/* Check input. */
    309	if (wcount == 0 || rcount == 0)
    310		return -EOPNOTSUPP;
    311
    312	/* Send command and I2C data to DS28E17. */
    313	w1_buf[0] = W1_F19_WRITE_READ_DATA_WITH_STOP;
    314	w1_buf[1] = i2c_address << 1;
    315	w1_buf[2] = wcount;
    316	crc = crc16(CRC16_INIT, w1_buf, 3);
    317	w1_write_block(sl->master, w1_buf, 3);
    318
    319	crc = crc16(crc, wbuffer, wcount);
    320	w1_write_block(sl->master, wbuffer, wcount);
    321
    322	w1_buf[0] = rcount;
    323	crc = crc16(crc, w1_buf, 1);
    324	w1_buf[1] = ~(crc & 0xFF);
    325	w1_buf[2] = ~((crc >> 8) & 0xFF);
    326	w1_write_block(sl->master, w1_buf, 3);
    327
    328	/* Wait until busy flag clears (or timeout). */
    329	if (w1_f19_i2c_busy_wait(sl, wcount + rcount + 2) < 0)
    330		return -ETIMEDOUT;
    331
    332	/* Read status from DS28E17. */
    333	w1_read_block(sl->master, w1_buf, 2);
    334
    335	/* Check error conditions. */
    336	error = w1_f19_error(sl, w1_buf);
    337	if (error < 0)
    338		return error;
    339
    340	/* Read received I2C data from DS28E17. */
    341	return w1_read_block(sl->master, rbuffer, rcount);
    342}
    343
    344
    345/* Do an I2C master transfer. */
    346static int w1_f19_i2c_master_transfer(struct i2c_adapter *adapter,
    347	struct i2c_msg *msgs, int num)
    348{
    349	struct w1_slave *sl = (struct w1_slave *) adapter->algo_data;
    350	int i = 0;
    351	int result = 0;
    352
    353	/* Start onewire transaction. */
    354	mutex_lock(&sl->master->bus_mutex);
    355
    356	/* Select DS28E17. */
    357	if (w1_reset_select_slave(sl)) {
    358		i = -EIO;
    359		goto error;
    360	}
    361
    362	/* Loop while there are still messages to transfer. */
    363	while (i < num) {
    364		/*
    365		 * Check for special case: Small write followed
    366		 * by read to same I2C device.
    367		 */
    368		if (i < (num-1)
    369			&& msgs[i].addr == msgs[i+1].addr
    370			&& !(msgs[i].flags & I2C_M_RD)
    371			&& (msgs[i+1].flags & I2C_M_RD)
    372			&& (msgs[i].len <= W1_F19_WRITE_DATA_LIMIT)) {
    373			/*
    374			 * The DS28E17 has a combined transfer
    375			 * for small write+read.
    376			 */
    377			result = w1_f19_i2c_write_read(sl, msgs[i].addr,
    378				msgs[i].buf, msgs[i].len,
    379				msgs[i+1].buf, msgs[i+1].len);
    380			if (result < 0) {
    381				i = result;
    382				goto error;
    383			}
    384
    385			/*
    386			 * Check if we should interpret the read data
    387			 * as a length byte. The DS28E17 unfortunately
    388			 * has no read without stop, so we can just do
    389			 * another simple read in that case.
    390			 */
    391			if (msgs[i+1].flags & I2C_M_RECV_LEN) {
    392				result = w1_f19_i2c_read(sl, msgs[i+1].addr,
    393					&(msgs[i+1].buf[1]), msgs[i+1].buf[0]);
    394				if (result < 0) {
    395					i = result;
    396					goto error;
    397				}
    398			}
    399
    400			/* Eat up read message, too. */
    401			i++;
    402		} else if (msgs[i].flags & I2C_M_RD) {
    403			/* Read transfer. */
    404			result = w1_f19_i2c_read(sl, msgs[i].addr,
    405				msgs[i].buf, msgs[i].len);
    406			if (result < 0) {
    407				i = result;
    408				goto error;
    409			}
    410
    411			/*
    412			 * Check if we should interpret the read data
    413			 * as a length byte. The DS28E17 unfortunately
    414			 * has no read without stop, so we can just do
    415			 * another simple read in that case.
    416			 */
    417			if (msgs[i].flags & I2C_M_RECV_LEN) {
    418				result = w1_f19_i2c_read(sl,
    419					msgs[i].addr,
    420					&(msgs[i].buf[1]),
    421					msgs[i].buf[0]);
    422				if (result < 0) {
    423					i = result;
    424					goto error;
    425				}
    426			}
    427		} else {
    428			/*
    429			 * Write transfer.
    430			 * Stop condition only for last
    431			 * transfer.
    432			 */
    433			result = w1_f19_i2c_write(sl,
    434				msgs[i].addr,
    435				msgs[i].buf,
    436				msgs[i].len,
    437				i == (num-1));
    438			if (result < 0) {
    439				i = result;
    440				goto error;
    441			}
    442		}
    443
    444		/* Next message. */
    445		i++;
    446
    447		/* Are there still messages to send/receive? */
    448		if (i < num) {
    449			/* Yes. Resume to same DS28E17. */
    450			if (w1_reset_resume_command(sl->master)) {
    451				i = -EIO;
    452				goto error;
    453			}
    454		}
    455	}
    456
    457error:
    458	/* End onewire transaction. */
    459	mutex_unlock(&sl->master->bus_mutex);
    460
    461	/* Return number of messages processed or error. */
    462	return i;
    463}
    464
    465
    466/* Get I2C adapter functionality. */
    467static u32 w1_f19_i2c_functionality(struct i2c_adapter *adapter)
    468{
    469	/*
    470	 * Plain I2C functions only.
    471	 * SMBus is emulated by the kernel's I2C layer.
    472	 * No "I2C_FUNC_SMBUS_QUICK"
    473	 * No "I2C_FUNC_SMBUS_READ_BLOCK_DATA"
    474	 * No "I2C_FUNC_SMBUS_BLOCK_PROC_CALL"
    475	 */
    476	return I2C_FUNC_I2C |
    477		I2C_FUNC_SMBUS_BYTE |
    478		I2C_FUNC_SMBUS_BYTE_DATA |
    479		I2C_FUNC_SMBUS_WORD_DATA |
    480		I2C_FUNC_SMBUS_PROC_CALL |
    481		I2C_FUNC_SMBUS_WRITE_BLOCK_DATA |
    482		I2C_FUNC_SMBUS_I2C_BLOCK |
    483		I2C_FUNC_SMBUS_PEC;
    484}
    485
    486
    487/* I2C adapter quirks. */
    488static const struct i2c_adapter_quirks w1_f19_i2c_adapter_quirks = {
    489	.max_read_len = W1_F19_READ_DATA_LIMIT,
    490};
    491
    492/* I2C algorithm. */
    493static const struct i2c_algorithm w1_f19_i2c_algorithm = {
    494	.master_xfer    = w1_f19_i2c_master_transfer,
    495	.functionality  = w1_f19_i2c_functionality,
    496};
    497
    498
    499/* Read I2C speed from DS28E17. */
    500static int w1_f19_get_i2c_speed(struct w1_slave *sl)
    501{
    502	struct w1_f19_data *data = sl->family_data;
    503	int result = -EIO;
    504
    505	/* Start onewire transaction. */
    506	mutex_lock(&sl->master->bus_mutex);
    507
    508	/* Select slave. */
    509	if (w1_reset_select_slave(sl))
    510		goto error;
    511
    512	/* Read slave configuration byte. */
    513	w1_write_8(sl->master, W1_F19_READ_CONFIGURATION);
    514	result = w1_read_8(sl->master);
    515	if (result < 0 || result > 2) {
    516		result = -EIO;
    517		goto error;
    518	}
    519
    520	/* Update speed in slave specific data. */
    521	data->speed = result;
    522
    523error:
    524	/* End onewire transaction. */
    525	mutex_unlock(&sl->master->bus_mutex);
    526
    527	return result;
    528}
    529
    530
    531/* Set I2C speed on DS28E17. */
    532static int __w1_f19_set_i2c_speed(struct w1_slave *sl, u8 speed)
    533{
    534	struct w1_f19_data *data = sl->family_data;
    535	const int i2c_speeds[3] = { 100, 400, 900 };
    536	u8 w1_buf[2];
    537
    538	/* Select slave. */
    539	if (w1_reset_select_slave(sl))
    540		return -EIO;
    541
    542	w1_buf[0] = W1_F19_WRITE_CONFIGURATION;
    543	w1_buf[1] = speed;
    544	w1_write_block(sl->master, w1_buf, 2);
    545
    546	/* Update speed in slave specific data. */
    547	data->speed = speed;
    548
    549	dev_info(&sl->dev, "i2c speed set to %d kBaud\n", i2c_speeds[speed]);
    550
    551	return 0;
    552}
    553
    554static int w1_f19_set_i2c_speed(struct w1_slave *sl, u8 speed)
    555{
    556	int result;
    557
    558	/* Start onewire transaction. */
    559	mutex_lock(&sl->master->bus_mutex);
    560
    561	/* Set I2C speed on DS28E17. */
    562	result = __w1_f19_set_i2c_speed(sl, speed);
    563
    564	/* End onewire transaction. */
    565	mutex_unlock(&sl->master->bus_mutex);
    566
    567	return result;
    568}
    569
    570
    571/* Sysfs attributes. */
    572
    573/* I2C speed attribute for a single chip. */
    574static ssize_t speed_show(struct device *dev, struct device_attribute *attr,
    575			     char *buf)
    576{
    577	struct w1_slave *sl = dev_to_w1_slave(dev);
    578	int result;
    579
    580	/* Read current speed from slave. Updates data->speed. */
    581	result = w1_f19_get_i2c_speed(sl);
    582	if (result < 0)
    583		return result;
    584
    585	/* Return current speed value. */
    586	return sprintf(buf, "%d\n", result);
    587}
    588
    589static ssize_t speed_store(struct device *dev, struct device_attribute *attr,
    590			      const char *buf, size_t count)
    591{
    592	struct w1_slave *sl = dev_to_w1_slave(dev);
    593	int error;
    594
    595	/* Valid values are: "100", "400", "900" */
    596	if (count < 3 || count > 4 || !buf)
    597		return -EINVAL;
    598	if (count == 4 && buf[3] != '\n')
    599		return -EINVAL;
    600	if (buf[1] != '0' || buf[2] != '0')
    601		return -EINVAL;
    602
    603	/* Set speed on slave. */
    604	switch (buf[0]) {
    605	case '1':
    606		error = w1_f19_set_i2c_speed(sl, 0);
    607		break;
    608	case '4':
    609		error = w1_f19_set_i2c_speed(sl, 1);
    610		break;
    611	case '9':
    612		error = w1_f19_set_i2c_speed(sl, 2);
    613		break;
    614	default:
    615		return -EINVAL;
    616	}
    617
    618	if (error < 0)
    619		return error;
    620
    621	/* Return bytes written. */
    622	return count;
    623}
    624
    625static DEVICE_ATTR_RW(speed);
    626
    627
    628/* Busy stretch attribute for a single chip. */
    629static ssize_t stretch_show(struct device *dev, struct device_attribute *attr,
    630			     char *buf)
    631{
    632	struct w1_slave *sl = dev_to_w1_slave(dev);
    633	struct w1_f19_data *data = sl->family_data;
    634
    635	/* Return current stretch value. */
    636	return sprintf(buf, "%d\n", data->stretch);
    637}
    638
    639static ssize_t stretch_store(struct device *dev, struct device_attribute *attr,
    640			      const char *buf, size_t count)
    641{
    642	struct w1_slave *sl = dev_to_w1_slave(dev);
    643	struct w1_f19_data *data = sl->family_data;
    644
    645	/* Valid values are '1' to '9' */
    646	if (count < 1 || count > 2 || !buf)
    647		return -EINVAL;
    648	if (count == 2 && buf[1] != '\n')
    649		return -EINVAL;
    650	if (buf[0] < '1' || buf[0] > '9')
    651		return -EINVAL;
    652
    653	/* Set busy stretch value. */
    654	data->stretch = buf[0] & 0x0F;
    655
    656	/* Return bytes written. */
    657	return count;
    658}
    659
    660static DEVICE_ATTR_RW(stretch);
    661
    662
    663/* All attributes. */
    664static struct attribute *w1_f19_attrs[] = {
    665	&dev_attr_speed.attr,
    666	&dev_attr_stretch.attr,
    667	NULL,
    668};
    669
    670static const struct attribute_group w1_f19_group = {
    671	.attrs		= w1_f19_attrs,
    672};
    673
    674static const struct attribute_group *w1_f19_groups[] = {
    675	&w1_f19_group,
    676	NULL,
    677};
    678
    679
    680/* Slave add and remove functions. */
    681static int w1_f19_add_slave(struct w1_slave *sl)
    682{
    683	struct w1_f19_data *data = NULL;
    684
    685	/* Allocate memory for slave specific data. */
    686	data = devm_kzalloc(&sl->dev, sizeof(*data), GFP_KERNEL);
    687	if (!data)
    688		return -ENOMEM;
    689	sl->family_data = data;
    690
    691	/* Setup default I2C speed on slave. */
    692	switch (i2c_speed) {
    693	case 100:
    694		__w1_f19_set_i2c_speed(sl, 0);
    695		break;
    696	case 400:
    697		__w1_f19_set_i2c_speed(sl, 1);
    698		break;
    699	case 900:
    700		__w1_f19_set_i2c_speed(sl, 2);
    701		break;
    702	default:
    703		/*
    704		 * A i2c_speed module parameter of anything else
    705		 * than 100, 400, 900 means not to touch the
    706		 * speed of the DS28E17.
    707		 * We assume 400kBaud, the power-on value.
    708		 */
    709		data->speed = 1;
    710	}
    711
    712	/*
    713	 * Setup default busy stretch
    714	 * configuration for the DS28E17.
    715	 */
    716	data->stretch = i2c_stretch;
    717
    718	/* Setup I2C adapter. */
    719	data->adapter.owner      = THIS_MODULE;
    720	data->adapter.algo       = &w1_f19_i2c_algorithm;
    721	data->adapter.algo_data  = sl;
    722	strcpy(data->adapter.name, "w1-");
    723	strcat(data->adapter.name, sl->name);
    724	data->adapter.dev.parent = &sl->dev;
    725	data->adapter.quirks     = &w1_f19_i2c_adapter_quirks;
    726
    727	return i2c_add_adapter(&data->adapter);
    728}
    729
    730static void w1_f19_remove_slave(struct w1_slave *sl)
    731{
    732	struct w1_f19_data *family_data = sl->family_data;
    733
    734	/* Delete I2C adapter. */
    735	i2c_del_adapter(&family_data->adapter);
    736
    737	/* Free slave specific data. */
    738	devm_kfree(&sl->dev, family_data);
    739	sl->family_data = NULL;
    740}
    741
    742
    743/* Declarations within the w1 subsystem. */
    744static const struct w1_family_ops w1_f19_fops = {
    745	.add_slave = w1_f19_add_slave,
    746	.remove_slave = w1_f19_remove_slave,
    747	.groups = w1_f19_groups,
    748};
    749
    750static struct w1_family w1_family_19 = {
    751	.fid = W1_FAMILY_DS28E17,
    752	.fops = &w1_f19_fops,
    753};
    754
    755module_w1_family(w1_family_19);