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()
156 * @param len length must be <= (W1_PAGE_SIZE - (addr & W1_PAGE_MASK))
158 * @return 0=Success -1=failure
164 u8 es = (addr + len - 1) & 0x1f; in w1_f1C_write()
167 struct w1_f1C_data *f1C = sl->family_data; in w1_f1C_write()
171 return -1; in w1_f1C_write()
177 w1_write_block(sl->master, wrbuf, 3); in w1_f1C_write()
178 w1_write_block(sl->master, data, len); in w1_f1C_write()
182 return -1; in w1_f1C_write()
184 w1_write_8(sl->master, W1_F1C_READ_SCRATCH); in w1_f1C_write()
185 w1_read_block(sl->master, rdbuf, len + 3); in w1_f1C_write()
190 return -1; in w1_f1C_write()
194 return -1; in w1_f1C_write()
202 if (w1_strong_pullup && i == sizeof(wrbuf)-1) in w1_f1C_write()
203 w1_next_pullup(sl->master, tm); in w1_f1C_write()
205 w1_write_8(sl->master, wrbuf[i]); in w1_f1C_write()
213 f1C->validcrc &= ~(1 << (addr >> W1_PAGE_BITS)); in w1_f1C_write()
217 w1_reset_bus(sl->master); in w1_f1C_write()
224 loff_t off, size_t count) in eeprom_write() argument
230 count = w1_f1C_fix_count(off, count, W1_EEPROM_SIZE); in eeprom_write()
236 if ((off & W1_PAGE_MASK) || (count & W1_PAGE_MASK)) { in eeprom_write()
237 dev_err(&sl->dev, "invalid offset/count off=%d cnt=%zd\n", in eeprom_write()
238 (int)off, count); in eeprom_write()
239 return -EINVAL; in eeprom_write()
246 dev_err(&sl->dev, "bad CRC at offset %d\n", in eeprom_write()
247 (int)off); in eeprom_write()
248 return -EINVAL; in eeprom_write()
253 mutex_lock(&sl->master->mutex); in eeprom_write()
258 addr = off + idx; in eeprom_write()
259 len = W1_PAGE_SIZE - (addr & W1_PAGE_MASK); in eeprom_write()
260 if (len > (count - idx)) in eeprom_write()
261 len = count - idx; in eeprom_write()
264 count = -EIO; in eeprom_write()
271 mutex_unlock(&sl->master->mutex); in eeprom_write()
279 struct bin_attribute *bin_attr, char *buf, loff_t off, in pio_read() argument
287 if (off != 0 || count != 1 || buf == NULL) in pio_read()
288 return -EINVAL; in pio_read()
290 mutex_lock(&sl->master->mutex); in pio_read()
292 mutex_unlock(&sl->master->mutex); in pio_read()
298 struct bin_attribute *bin_attr, char *buf, loff_t off, in pio_write() argument
307 if (off != 0 || count != 1 || buf == NULL) in pio_write()
308 return -EINVAL; in pio_write()
310 mutex_lock(&sl->master->mutex); in pio_write()
314 mutex_unlock(&sl->master->mutex); in pio_write()
315 return -1; in pio_write()
324 w1_write_block(sl->master, wrbuf, 3); in pio_write()
326 w1_read_block(sl->master, &ack, sizeof(ack)); in pio_write()
328 mutex_unlock(&sl->master->mutex); in pio_write()
332 return -EIO; in pio_write()
343 return -EFAULT; in crccheck_show()
354 return -EINVAL; in crccheck_store()
357 return -EFAULT; in crccheck_store()
360 val = val - 0x30; in crccheck_store()
362 return -EINVAL; in crccheck_store()
400 return -ENOMEM; in w1_f1C_add_slave()
401 sl->family_data = data; in w1_f1C_add_slave()
409 kfree(sl->family_data); in w1_f1C_remove_slave()
410 sl->family_data = NULL; in w1_f1C_remove_slave()
425 MODULE_AUTHOR("Markus Franke <franke.m@sebakmt.com>, <franm@hrz.tu-chemnitz.de>");
428 MODULE_ALIAS("w1-family-" __stringify(W1_FAMILY_DS28E04));