Re: [PATCH v6 3/3] w1: add UART w1 bus driver

From: Christoph Winklhofer
Date: Tue Feb 13 2024 - 02:02:52 EST


On Mon, Feb 12, 2024 at 04:30:00PM +0100, Krzysztof Kozlowski wrote:
> On 09/02/2024 07:22, Christoph Winklhofer via B4 Relay wrote:
> > From: Christoph Winklhofer <cj.winklhofer@xxxxxxxxx>
> >
> > Add a UART 1-Wire bus driver. The driver utilizes the UART interface via
> > the Serial Device Bus to create the 1-Wire timing patterns. The driver
> > was tested on a "Raspberry Pi 3B" with a DS18B20 and on a "Variscite
> > DART-6UL" with a DS18S20 temperature sensor.
> >
> > The 1-Wire timing pattern and the corresponding UART baud-rate with the
> > interpretation of the transferred bytes are described in the document:
>
>
> > +/*
> > + * struct w1_uart_config - configuration for 1-Wire operation
> > + *
> > + * @baudrate: baud-rate returned from serdev
> > + * @delay_us: delay to complete a 1-Wire cycle (in us)
> > + * @tx_byte: byte to generate 1-Wire timing pattern
> > + */
> > +struct w1_uart_config {
> > + unsigned int baudrate;
> > + unsigned int delay_us;
> > + u8 tx_byte;
> > +};
> > +
> > +/*
> > + * struct w1_uart_config - w1-uart device data
>
> That's neither correct (device, not config) nor proper kerneldoc nor
> useful. Your comment repeats struct name. If you want to make it
> kerneldoc, go ahead, but then make it a full kerneldoc.
>

Yes, sorry - will use the correct name.

> And obviously compile with W=1.
>

You mean the padding error of mutex, I get it with W=3 and will fix it
by moving mutex up.

> > + *
> > + * @serdev: serial device
> > + * @bus: w1-bus master
> > + * @cfg_reset: config for 1-Wire reset
> > + * @cfg_touch_0: config for 1-Wire write-0 cycle
> > + * @cfg_touch_1: config for 1-Wire write-1 and read cycle
> > + * @rx_byte_received: completion for serdev receive
> > + * @rx_err: indicates an error in serdev-receive
> > + * @rx_byte: result byte from serdev-receive
> > + * @mutex: mutex to protected rx_err and rx_byte from concurrent access
> > + * in w1-callbacks and serdev-receive.
> > + */
> > +struct w1_uart_device {
> > + struct serdev_device *serdev;
> > + struct w1_bus_master bus;
> > +
> > + struct w1_uart_config cfg_reset;
> > + struct w1_uart_config cfg_touch_0;
> > + struct w1_uart_config cfg_touch_1;
> > +
> > + struct completion rx_byte_received;
> > + int rx_err;
> > + u8 rx_byte;
> > +
>
> How did you solve my comment and checkpatch warning from previous version:
>
> CHECK: struct mutex definition without comment
>

Thanks, I missed the option --strict in checkpatch.pl and dit not get
this warning. Will add a comment.

> > + struct mutex mutex;
> > +};
> > +
> > +/*
> > + * struct w1_uart_limits - limits for 1-Wire operations
> > + *
> > + * @baudrate: Requested baud-rate to create 1-Wire timing pattern
> > + * @bit_min_us: minimum time for a bit (in us)
> > + * @bit_max_us: maximum time for a bit (in us)
> > + * @sample_us: timespan to sample 1-Wire response
> > + * @cycle_us: duration of the 1-Wire cycle
> > + */
> > +struct w1_uart_limits {
> > + unsigned int baudrate;
> > + unsigned int bit_min_us;
> > + unsigned int bit_max_us;
> > + unsigned int sample_us;
> > + unsigned int cycle_us;
>
> ...
>
> > +/*
> > + * Configuration for write-1 and read cycle (touch bit 1)
> > + * - bit_min_us is 5us, add margin and use 6us
> > + * - limits for sample time 5us-15us, use 15us
> > + */
> > +static int w1_uart_set_config_touch_1(struct w1_uart_device *w1dev)
> > +{
> > + struct serdev_device *serdev = w1dev->serdev;
> > + struct device_node *np = serdev->dev.of_node;
> > +
> > + struct w1_uart_limits limits = { .baudrate = 115200,
> > + .bit_min_us = 6,
> > + .bit_max_us = 15,
> > + .sample_us = 15,
> > + .cycle_us = 70 };
> > +
> > + of_property_read_u32(np, "write-1-bps", &limits.baudrate);
> > +
> > + return w1_uart_set_config(serdev, &limits, &w1dev->cfg_touch_1);
> > +}
> > +
> > +/*
> > + * Configure and open the serial device
> > + */
> > +static int w1_uart_serdev_open(struct w1_uart_device *w1dev)
> > +{
> > + struct serdev_device *serdev = w1dev->serdev;
> > + struct device *dev = &serdev->dev;
> > + int ret;
> > +
> > + /* serdev is automatically closed on unbind or driver remove */
>
> Drop comment, that's obvious. That's what devm* functions are for.
>
>

Ok.

> > + ret = devm_serdev_device_open(dev, serdev);
>
>
> > + if (ret < 0)
> > + return ret;
> > +
> > + ret = serdev_device_set_parity(serdev, SERDEV_PARITY_NONE);
> > + if (ret < 0) {
> > + dev_err(dev, "set parity failed\n");
> > + return ret;
> > + }
>
>
> Best regards,
> Krzysztof
>

Thanks!
Christoph