Lines Matching +full:powered +full:- +full:off

1 // SPDX-License-Identifier: GPL-2.0-only
3 * w1_ds28e04.c - w1 family 1C (DS28E04) driver
26 * If it was disabled a parasite powered device might not get the required
28 * parasite powered devices have a better chance of getting the current
34 /* enable/disable CRC checking on DS28E04-100 memory accesses */
60 static inline size_t w1_f1C_fix_count(loff_t off, size_t count, size_t size) in w1_f1C_fix_count() argument
62 if (off > size) in w1_f1C_fix_count()
65 if ((off + count) > size) in w1_f1C_fix_count()
66 return size - off; in w1_f1C_fix_count()
75 int off = block * W1_PAGE_SIZE; in w1_f1C_refresh_block() local
77 if (data->validcrc & (1 << block)) in w1_f1C_refresh_block()
81 data->validcrc = 0; in w1_f1C_refresh_block()
82 return -EIO; in w1_f1C_refresh_block()
86 wrbuf[1] = off & 0xff; in w1_f1C_refresh_block()
87 wrbuf[2] = off >> 8; in w1_f1C_refresh_block()
88 w1_write_block(sl->master, wrbuf, 3); in w1_f1C_refresh_block()
89 w1_read_block(sl->master, &data->memory[off], W1_PAGE_SIZE); in w1_f1C_refresh_block()
92 if (crc16(CRC16_INIT, &data->memory[off], W1_PAGE_SIZE) == CRC16_VALID) in w1_f1C_refresh_block()
93 data->validcrc |= (1 << block); in w1_f1C_refresh_block()
104 return -EIO; in w1_f1C_read()
110 w1_write_block(sl->master, wrbuf, sizeof(wrbuf)); in w1_f1C_read()
111 return w1_read_block(sl->master, data, len); in w1_f1C_read()
116 loff_t off, size_t count) in eeprom_read() argument
119 struct w1_f1C_data *data = sl->family_data; in eeprom_read()
122 count = w1_f1C_fix_count(off, count, W1_EEPROM_SIZE); in eeprom_read()
126 mutex_lock(&sl->master->mutex); in eeprom_read()
129 min_page = (off >> W1_PAGE_BITS); in eeprom_read()
130 max_page = (off + count - 1) >> W1_PAGE_BITS; in eeprom_read()
133 count = -EIO; in eeprom_read()
137 memcpy(buf, &data->memory[off], count); in eeprom_read()
139 count = w1_f1C_read(sl, off, count, buf); in eeprom_read()
143 mutex_unlock(&sl->master->mutex); in eeprom_read()
149 * w1_f1C_write() - Writes to the scratchpad and reads it back for verification.
152 * @len: length must be <= (W1_PAGE_SIZE - (addr & W1_PAGE_MASK))
159 * Return: 0=Success, -1=failure
165 u8 es = (addr + len - 1) & 0x1f; in w1_f1C_write()
168 struct w1_f1C_data *f1C = sl->family_data; in w1_f1C_write()
172 return -1; in w1_f1C_write()
178 w1_write_block(sl->master, wrbuf, 3); in w1_f1C_write()
179 w1_write_block(sl->master, data, len); in w1_f1C_write()
183 return -1; in w1_f1C_write()
185 w1_write_8(sl->master, W1_F1C_READ_SCRATCH); in w1_f1C_write()
186 w1_read_block(sl->master, rdbuf, len + 3); in w1_f1C_write()
191 return -1; in w1_f1C_write()
195 return -1; in w1_f1C_write()
205 if (w1_strong_pullup && i == sizeof(wrbuf)-1) in w1_f1C_write()
206 w1_next_pullup(sl->master, tm); in w1_f1C_write()
208 w1_write_8(sl->master, wrbuf[i]); in w1_f1C_write()
216 f1C->validcrc &= ~(1 << (addr >> W1_PAGE_BITS)); in w1_f1C_write()
220 w1_reset_bus(sl->master); in w1_f1C_write()
227 loff_t off, size_t count) in eeprom_write() argument
233 count = w1_f1C_fix_count(off, count, W1_EEPROM_SIZE); in eeprom_write()
239 if ((off & W1_PAGE_MASK) || (count & W1_PAGE_MASK)) { in eeprom_write()
240 dev_err(&sl->dev, "invalid offset/count off=%d cnt=%zd\n", in eeprom_write()
241 (int)off, count); in eeprom_write()
242 return -EINVAL; in eeprom_write()
249 dev_err(&sl->dev, "bad CRC at offset %d\n", in eeprom_write()
250 (int)off); in eeprom_write()
251 return -EINVAL; in eeprom_write()
256 mutex_lock(&sl->master->mutex); in eeprom_write()
261 addr = off + idx; in eeprom_write()
262 len = W1_PAGE_SIZE - (addr & W1_PAGE_MASK); in eeprom_write()
263 if (len > (count - idx)) in eeprom_write()
264 len = count - idx; in eeprom_write()
267 count = -EIO; in eeprom_write()
274 mutex_unlock(&sl->master->mutex); in eeprom_write()
282 const struct bin_attribute *bin_attr, char *buf, loff_t off, in pio_read() argument
290 if (off != 0 || count != 1 || buf == NULL) in pio_read()
291 return -EINVAL; in pio_read()
293 mutex_lock(&sl->master->mutex); in pio_read()
295 mutex_unlock(&sl->master->mutex); in pio_read()
302 loff_t off, size_t count) in pio_write() argument
310 if (off != 0 || count != 1 || buf == NULL) in pio_write()
311 return -EINVAL; in pio_write()
313 mutex_lock(&sl->master->mutex); in pio_write()
317 mutex_unlock(&sl->master->mutex); in pio_write()
318 return -1; in pio_write()
327 w1_write_block(sl->master, wrbuf, 3); in pio_write()
329 w1_read_block(sl->master, &ack, sizeof(ack)); in pio_write()
331 mutex_unlock(&sl->master->mutex); in pio_write()
335 return -EIO; in pio_write()
389 return -ENOMEM; in w1_f1C_add_slave()
390 sl->family_data = data; in w1_f1C_add_slave()
398 kfree(sl->family_data); in w1_f1C_remove_slave()
399 sl->family_data = NULL; in w1_f1C_remove_slave()
414 MODULE_AUTHOR("Markus Franke <franke.m@sebakmt.com>, <franm@hrz.tu-chemnitz.de>");
417 MODULE_ALIAS("w1-family-" __stringify(W1_FAMILY_DS28E04));