// SPDX-License-Identifier: GPL-2.0-or-later /* * Copyright (c) 2004 Evgeniy Polyakov <[email protected]> */ #include <asm/io.h> #include <linux/delay.h> #include <linux/moduleparam.h> #include <linux/module.h> #include "w1_internal.h" static int w1_delay_parm = …; module_param_named(delay_coef, w1_delay_parm, int, 0); static int w1_disable_irqs = …; module_param_named(disable_irqs, w1_disable_irqs, int, 0); static u8 w1_crc8_table[] = …; static void w1_delay(unsigned long tm) { … } static void w1_write_bit(struct w1_master *dev, int bit); static u8 w1_read_bit(struct w1_master *dev); /** * w1_touch_bit() - Generates a write-0 or write-1 cycle and samples the level. * @dev: the master device * @bit: 0 - write a 0, 1 - write a 0 read the level */ u8 w1_touch_bit(struct w1_master *dev, int bit) { … } EXPORT_SYMBOL_GPL(…); /** * w1_write_bit() - Generates a write-0 or write-1 cycle. * @dev: the master device * @bit: bit to write * * Only call if dev->bus_master->touch_bit is NULL */ static void w1_write_bit(struct w1_master *dev, int bit) { … } /** * w1_pre_write() - pre-write operations * @dev: the master device * * Pre-write operation, currently only supporting strong pullups. * Program the hardware for a strong pullup, if one has been requested and * the hardware supports it. */ static void w1_pre_write(struct w1_master *dev) { … } /** * w1_post_write() - post-write options * @dev: the master device * * Post-write operation, currently only supporting strong pullups. * If a strong pullup was requested, clear it if the hardware supports * them, or execute the delay otherwise, in either case clear the request. */ static void w1_post_write(struct w1_master *dev) { … } /** * w1_write_8() - Writes 8 bits. * @dev: the master device * @byte: the byte to write */ void w1_write_8(struct w1_master *dev, u8 byte) { … } EXPORT_SYMBOL_GPL(…); /** * w1_read_bit() - Generates a write-1 cycle and samples the level. * @dev: the master device * * Only call if dev->bus_master->touch_bit is NULL */ static u8 w1_read_bit(struct w1_master *dev) { … } /** * w1_triplet() - * Does a triplet - used for searching ROM addresses. * @dev: the master device * @bdir: the bit to write if both id_bit and comp_bit are 0 * * Return bits: * bit 0 = id_bit * bit 1 = comp_bit * bit 2 = dir_taken * * If both bits 0 & 1 are set, the search should be restarted. * * Return: bit fields - see above */ u8 w1_triplet(struct w1_master *dev, int bdir) { … } EXPORT_SYMBOL_GPL(…); /** * w1_read_8() - Reads 8 bits. * @dev: the master device * * Return: the byte read */ u8 w1_read_8(struct w1_master *dev) { … } EXPORT_SYMBOL_GPL(…); /** * w1_write_block() - Writes a series of bytes. * @dev: the master device * @buf: pointer to the data to write * @len: the number of bytes to write */ void w1_write_block(struct w1_master *dev, const u8 *buf, int len) { … } EXPORT_SYMBOL_GPL(…); /** * w1_touch_block() - Touches a series of bytes. * @dev: the master device * @buf: pointer to the data to write * @len: the number of bytes to write */ void w1_touch_block(struct w1_master *dev, u8 *buf, int len) { … } EXPORT_SYMBOL_GPL(…); /** * w1_read_block() - Reads a series of bytes. * @dev: the master device * @buf: pointer to the buffer to fill * @len: the number of bytes to read * Return: the number of bytes read */ u8 w1_read_block(struct w1_master *dev, u8 *buf, int len) { … } EXPORT_SYMBOL_GPL(…); /** * w1_reset_bus() - Issues a reset bus sequence. * @dev: the master device * Return: 0=Device present, 1=No device present or error */ int w1_reset_bus(struct w1_master *dev) { … } EXPORT_SYMBOL_GPL(…); u8 w1_calc_crc8(u8 * data, int len) { … } EXPORT_SYMBOL_GPL(…); void w1_search_devices(struct w1_master *dev, u8 search_type, w1_slave_found_callback cb) { … } /** * w1_reset_select_slave() - reset and select a slave * @sl: the slave to select * * Resets the bus and then selects the slave by sending either a skip rom * or a rom match. A skip rom is issued if there is only one device * registered on the bus. * The w1 master lock must be held. * * Return: 0=success, anything else=error */ int w1_reset_select_slave(struct w1_slave *sl) { … } EXPORT_SYMBOL_GPL(…); /** * w1_reset_resume_command() - resume instead of another match ROM * @dev: the master device * * When the workflow with a slave amongst many requires several * successive commands a reset between each, this function is similar * to doing a reset then a match ROM for the last matched ROM. The * advantage being that the matched ROM step is skipped in favor of the * resume command. The slave must support the command of course. * * If the bus has only one slave, traditionnaly the match ROM is skipped * and a "SKIP ROM" is done for efficiency. On multi-slave busses, this * doesn't work of course, but the resume command is the next best thing. * * The w1 master lock must be held. */ int w1_reset_resume_command(struct w1_master *dev) { … } EXPORT_SYMBOL_GPL(…); /** * w1_next_pullup() - register for a strong pullup * @dev: the master device * @delay: time in milliseconds * * Put out a strong pull-up of the specified duration after the next write * operation. Not all hardware supports strong pullups. Hardware that * doesn't support strong pullups will sleep for the given time after the * write operation without a strong pullup. This is a one shot request for * the next write, specifying zero will clear a previous request. * The w1 master lock must be held. * * Return: 0=success, anything else=error */ void w1_next_pullup(struct w1_master *dev, int delay) { … } EXPORT_SYMBOL_GPL(…);