File Index
Files and directories
Sign in
FILE

ad5791.c

File preview with syntax highlighting.

linux-6.19.14/drivers/iio/dac/ad5791.c C
  1// SPDX-License-Identifier: GPL-2.0-only
  2/*
  3 * AD5760, AD5780, AD5781, AD5790, AD5791 Voltage Output Digital to Analog
  4 * Converter
  5 *
  6 * Copyright 2011 Analog Devices Inc.
  7 */
  8
  9#include <linux/bitops.h>
 10#include <linux/delay.h>
 11#include <linux/device.h>
 12#include <linux/fs.h>
 13#include <linux/interrupt.h>
 14#include <linux/kernel.h>
 15#include <linux/module.h>
 16#include <linux/regulator/consumer.h>
 17#include <linux/slab.h>
 18#include <linux/spi/offload/consumer.h>
 19#include <linux/spi/spi.h>
 20#include <linux/sysfs.h>
 21#include <linux/units.h>
 22
 23#include <linux/iio/buffer-dmaengine.h>
 24#include <linux/iio/dac/ad5791.h>
 25#include <linux/iio/iio.h>
 26#include <linux/iio/sysfs.h>
 27
 28#define AD5791_DAC_MASK			GENMASK(19, 0)
 29
 30#define AD5791_CMD_READ			BIT(23)
 31#define AD5791_CMD_WRITE		0
 32#define AD5791_ADDR(addr)		((addr) << 20)
 33
 34/* Registers */
 35#define AD5791_ADDR_NOOP		0
 36#define AD5791_ADDR_DAC0		1
 37#define AD5791_ADDR_CTRL		2
 38#define AD5791_ADDR_CLRCODE		3
 39#define AD5791_ADDR_SW_CTRL		4
 40
 41/* Control Register */
 42#define AD5791_CTRL_RBUF		BIT(1)
 43#define AD5791_CTRL_OPGND		BIT(2)
 44#define AD5791_CTRL_DACTRI		BIT(3)
 45#define AD5791_CTRL_BIN2SC		BIT(4)
 46#define AD5791_CTRL_SDODIS		BIT(5)
 47#define AD5761_CTRL_LINCOMP(x)		((x) << 6)
 48
 49#define AD5791_LINCOMP_0_10		0
 50#define AD5791_LINCOMP_10_12		1
 51#define AD5791_LINCOMP_12_16		2
 52#define AD5791_LINCOMP_16_19		3
 53#define AD5791_LINCOMP_19_20		12
 54
 55#define AD5780_LINCOMP_0_10		0
 56#define AD5780_LINCOMP_10_20		12
 57
 58/* Software Control Register */
 59#define AD5791_SWCTRL_LDAC		BIT(0)
 60#define AD5791_SWCTRL_CLR		BIT(1)
 61#define AD5791_SWCTRL_RESET		BIT(2)
 62
 63#define AD5791_DAC_PWRDN_6K		0
 64#define AD5791_DAC_PWRDN_3STATE		1
 65
 66/**
 67 * struct ad5791_chip_info - chip specific information
 68 * @name:		name of the dac chip
 69 * @channel:		channel specification
 70 * @channel_offload:	channel specification for offload
 71 * @get_lin_comp:	function pointer to the device specific function
 72 */
 73struct ad5791_chip_info {
 74	const char *name;
 75	const struct iio_chan_spec channel;
 76	const struct iio_chan_spec channel_offload;
 77	int (*get_lin_comp)(unsigned int span);
 78};
 79
 80/**
 81 * struct ad5791_state - driver instance specific data
 82 * @spi:			spi_device
 83 * @gpio_reset:		reset gpio
 84 * @gpio_clear:		clear gpio
 85 * @gpio_ldac:		load dac gpio
 86 * @chip_info:		chip model specific constants
 87 * @offload_msg:	spi message used for offload
 88 * @offload_xfer:	spi transfer used for offload
 89 * @offload:		offload device
 90 * @offload_trigger:	offload trigger
 91 * @offload_trigger_hz:	offload sample rate
 92 * @vref_mv:		actual reference voltage used
 93 * @vref_neg_mv:	voltage of the negative supply
 94 * @ctrl:		control register cache
 95 * @pwr_down_mode:	current power down mode
 96 * @pwr_down:		true if device is powered down
 97 * @data:		spi transfer buffers
 98 */
 99struct ad5791_state {
100	struct spi_device		*spi;
101	struct gpio_desc		*gpio_reset;
102	struct gpio_desc		*gpio_clear;
103	struct gpio_desc		*gpio_ldac;
104	const struct ad5791_chip_info	*chip_info;
105	struct spi_message		offload_msg;
106	struct spi_transfer		offload_xfer;
107	struct spi_offload		*offload;
108	struct spi_offload_trigger	*offload_trigger;
109	unsigned int			offload_trigger_hz;
110	unsigned short			vref_mv;
111	unsigned int			vref_neg_mv;
112	unsigned			ctrl;
113	unsigned			pwr_down_mode;
114	bool				pwr_down;
115
116	union {
117		__be32 d32;
118		u8 d8[4];
119	} data[3] __aligned(IIO_DMA_MINALIGN);
120};
121
122static int ad5791_spi_write(struct ad5791_state *st, u8 addr, u32 val)
123{
124	st->data[0].d32 = cpu_to_be32(AD5791_CMD_WRITE |
125			      AD5791_ADDR(addr) |
126			      (val & AD5791_DAC_MASK));
127
128	return spi_write(st->spi, &st->data[0].d8[1], 3);
129}
130
131static int ad5791_spi_read(struct ad5791_state *st, u8 addr, u32 *val)
132{
133	int ret;
134	struct spi_transfer xfers[] = {
135		{
136			.tx_buf = &st->data[0].d8[1],
137			.len = 3,
138			.cs_change = 1,
139		}, {
140			.tx_buf = &st->data[1].d8[1],
141			.rx_buf = &st->data[2].d8[1],
142			.len = 3,
143		},
144	};
145
146	st->data[0].d32 = cpu_to_be32(AD5791_CMD_READ |
147			      AD5791_ADDR(addr));
148	st->data[1].d32 = cpu_to_be32(AD5791_ADDR(AD5791_ADDR_NOOP));
149
150	ret = spi_sync_transfer(st->spi, xfers, ARRAY_SIZE(xfers));
151
152	*val = be32_to_cpu(st->data[2].d32);
153
154	return ret;
155}
156
157static const char * const ad5791_powerdown_modes[] = {
158	"6kohm_to_gnd",
159	"three_state",
160};
161
162static int ad5791_get_powerdown_mode(struct iio_dev *indio_dev,
163	const struct iio_chan_spec *chan)
164{
165	struct ad5791_state *st = iio_priv(indio_dev);
166
167	return st->pwr_down_mode;
168}
169
170static int ad5791_set_powerdown_mode(struct iio_dev *indio_dev,
171	const struct iio_chan_spec *chan, unsigned int mode)
172{
173	struct ad5791_state *st = iio_priv(indio_dev);
174
175	st->pwr_down_mode = mode;
176
177	return 0;
178}
179
180static const struct iio_enum ad5791_powerdown_mode_enum = {
181	.items = ad5791_powerdown_modes,
182	.num_items = ARRAY_SIZE(ad5791_powerdown_modes),
183	.get = ad5791_get_powerdown_mode,
184	.set = ad5791_set_powerdown_mode,
185};
186
187static ssize_t ad5791_read_dac_powerdown(struct iio_dev *indio_dev,
188	uintptr_t private, const struct iio_chan_spec *chan, char *buf)
189{
190	struct ad5791_state *st = iio_priv(indio_dev);
191
192	return sysfs_emit(buf, "%d\n", st->pwr_down);
193}
194
195static ssize_t ad5791_write_dac_powerdown(struct iio_dev *indio_dev,
196	 uintptr_t private, const struct iio_chan_spec *chan, const char *buf,
197	 size_t len)
198{
199	bool pwr_down;
200	int ret;
201	struct ad5791_state *st = iio_priv(indio_dev);
202
203	ret = kstrtobool(buf, &pwr_down);
204	if (ret)
205		return ret;
206
207	if (!pwr_down) {
208		st->ctrl &= ~(AD5791_CTRL_OPGND | AD5791_CTRL_DACTRI);
209	} else {
210		if (st->pwr_down_mode == AD5791_DAC_PWRDN_6K)
211			st->ctrl |= AD5791_CTRL_OPGND;
212		else if (st->pwr_down_mode == AD5791_DAC_PWRDN_3STATE)
213			st->ctrl |= AD5791_CTRL_DACTRI;
214	}
215	st->pwr_down = pwr_down;
216
217	ret = ad5791_spi_write(st, AD5791_ADDR_CTRL, st->ctrl);
218
219	return ret ? ret : len;
220}
221
222static int ad5791_get_lin_comp(unsigned int span)
223{
224	if (span <= 10000)
225		return AD5791_LINCOMP_0_10;
226	else if (span <= 12000)
227		return AD5791_LINCOMP_10_12;
228	else if (span <= 16000)
229		return AD5791_LINCOMP_12_16;
230	else if (span <= 19000)
231		return AD5791_LINCOMP_16_19;
232	else
233		return AD5791_LINCOMP_19_20;
234}
235
236static int ad5780_get_lin_comp(unsigned int span)
237{
238	if (span <= 10000)
239		return AD5780_LINCOMP_0_10;
240	else
241		return AD5780_LINCOMP_10_20;
242}
243
244static int ad5791_set_sample_freq(struct ad5791_state *st, int val)
245{
246	struct spi_offload_trigger_config config = {
247		.type = SPI_OFFLOAD_TRIGGER_PERIODIC,
248		.periodic = {
249			.frequency_hz = val,
250		},
251	};
252	int ret;
253
254	ret = spi_offload_trigger_validate(st->offload_trigger, &config);
255	if (ret)
256		return ret;
257
258	st->offload_trigger_hz = config.periodic.frequency_hz;
259
260	return 0;
261}
262
263static int ad5791_read_raw(struct iio_dev *indio_dev,
264			   struct iio_chan_spec const *chan,
265			   int *val,
266			   int *val2,
267			   long m)
268{
269	struct ad5791_state *st = iio_priv(indio_dev);
270	u64 val64;
271	int ret;
272
273	switch (m) {
274	case IIO_CHAN_INFO_RAW:
275		ret = ad5791_spi_read(st, chan->address, val);
276		if (ret)
277			return ret;
278		*val &= AD5791_DAC_MASK;
279		*val >>= chan->scan_type.shift;
280		return IIO_VAL_INT;
281	case IIO_CHAN_INFO_SCALE:
282		*val = st->vref_mv;
283		*val2 = (1 << chan->scan_type.realbits) - 1;
284		return IIO_VAL_FRACTIONAL;
285	case IIO_CHAN_INFO_OFFSET:
286		val64 = (((u64)st->vref_neg_mv) << chan->scan_type.realbits);
287		do_div(val64, st->vref_mv);
288		*val = -val64;
289		return IIO_VAL_INT;
290	case IIO_CHAN_INFO_SAMP_FREQ:
291		*val = st->offload_trigger_hz;
292		return IIO_VAL_INT;
293	default:
294		return -EINVAL;
295	}
296
297};
298
299static const struct iio_chan_spec_ext_info ad5791_ext_info[] = {
300	{
301		.name = "powerdown",
302		.shared = IIO_SHARED_BY_TYPE,
303		.read = ad5791_read_dac_powerdown,
304		.write = ad5791_write_dac_powerdown,
305	},
306	IIO_ENUM("powerdown_mode", IIO_SHARED_BY_TYPE,
307		 &ad5791_powerdown_mode_enum),
308	IIO_ENUM_AVAILABLE("powerdown_mode", IIO_SHARED_BY_TYPE, &ad5791_powerdown_mode_enum),
309	{ }
310};
311
312#define AD5791_DEFINE_CHIP_INFO(_name, bits, _shift, _lin_comp)		\
313static const struct ad5791_chip_info _name##_chip_info = {		\
314	.name = #_name,							\
315	.get_lin_comp = &(_lin_comp),					\
316	.channel = {							\
317			.type = IIO_VOLTAGE,				\
318			.output = 1,					\
319			.indexed = 1,					\
320			.address = AD5791_ADDR_DAC0,			\
321			.channel = 0,					\
322			.info_mask_separate = BIT(IIO_CHAN_INFO_RAW),	\
323			.info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE) |	\
324				BIT(IIO_CHAN_INFO_OFFSET),		\
325			.scan_type = {					\
326				.sign = 'u',				\
327				.realbits = (bits),			\
328				.storagebits = 32,			\
329				.shift = (_shift),			\
330			},						\
331			.ext_info = ad5791_ext_info,			\
332	},								\
333	.channel_offload = {						\
334			.type = IIO_VOLTAGE,				\
335			.output = 1,					\
336			.indexed = 1,					\
337			.address = AD5791_ADDR_DAC0,			\
338			.channel = 0,					\
339			.info_mask_separate = BIT(IIO_CHAN_INFO_RAW),	\
340			.info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE) |	\
341				BIT(IIO_CHAN_INFO_OFFSET),		\
342			.info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ),\
343			.scan_type = {					\
344				.sign = 'u',				\
345				.realbits = (bits),			\
346				.storagebits = 32,			\
347				.shift = (_shift),			\
348			},						\
349			.ext_info = ad5791_ext_info,			\
350	},								\
351}
352
353AD5791_DEFINE_CHIP_INFO(ad5760, 16, 4, ad5780_get_lin_comp);
354AD5791_DEFINE_CHIP_INFO(ad5780, 18, 2, ad5780_get_lin_comp);
355AD5791_DEFINE_CHIP_INFO(ad5781, 18, 2, ad5791_get_lin_comp);
356AD5791_DEFINE_CHIP_INFO(ad5790, 20, 0, ad5791_get_lin_comp);
357AD5791_DEFINE_CHIP_INFO(ad5791, 20, 0, ad5791_get_lin_comp);
358
359static int ad5791_write_raw(struct iio_dev *indio_dev,
360			    struct iio_chan_spec const *chan,
361			    int val,
362			    int val2,
363			    long mask)
364{
365	struct ad5791_state *st = iio_priv(indio_dev);
366
367	switch (mask) {
368	case IIO_CHAN_INFO_RAW:
369		val &= GENMASK(chan->scan_type.realbits - 1, 0);
370		val <<= chan->scan_type.shift;
371
372		return ad5791_spi_write(st, chan->address, val);
373
374	case IIO_CHAN_INFO_SAMP_FREQ:
375		if (val < 1)
376			return -EINVAL;
377		return ad5791_set_sample_freq(st, val);
378	default:
379		return -EINVAL;
380	}
381}
382
383static int ad5791_write_raw_get_fmt(struct iio_dev *indio_dev,
384				    struct iio_chan_spec const *chan,
385				    long mask)
386{
387	switch (mask) {
388	case IIO_CHAN_INFO_SAMP_FREQ:
389		return IIO_VAL_INT;
390	default:
391		return IIO_VAL_INT_PLUS_MICRO;
392	}
393}
394
395static int ad5791_buffer_preenable(struct iio_dev *indio_dev)
396{
397	struct ad5791_state *st = iio_priv(indio_dev);
398	struct spi_offload_trigger_config config = {
399		.type = SPI_OFFLOAD_TRIGGER_PERIODIC,
400		.periodic = {
401			.frequency_hz = st->offload_trigger_hz,
402		},
403	};
404
405	if (st->pwr_down)
406		return -EINVAL;
407
408	return spi_offload_trigger_enable(st->offload, st->offload_trigger,
409					 &config);
410}
411
412static int ad5791_buffer_postdisable(struct iio_dev *indio_dev)
413{
414	struct ad5791_state *st = iio_priv(indio_dev);
415
416	spi_offload_trigger_disable(st->offload, st->offload_trigger);
417
418	return 0;
419}
420
421static const struct iio_buffer_setup_ops ad5791_buffer_setup_ops = {
422	.preenable = &ad5791_buffer_preenable,
423	.postdisable = &ad5791_buffer_postdisable,
424};
425
426static int ad5791_offload_setup(struct iio_dev *indio_dev)
427{
428	struct ad5791_state *st = iio_priv(indio_dev);
429	struct spi_device *spi = st->spi;
430	struct dma_chan *tx_dma;
431	int ret;
432
433	st->offload_trigger = devm_spi_offload_trigger_get(&spi->dev,
434		st->offload, SPI_OFFLOAD_TRIGGER_PERIODIC);
435	if (IS_ERR(st->offload_trigger))
436		return dev_err_probe(&spi->dev, PTR_ERR(st->offload_trigger),
437				     "failed to get offload trigger\n");
438
439	ret = ad5791_set_sample_freq(st, 1 * MEGA);
440	if (ret)
441		return dev_err_probe(&spi->dev, ret,
442				     "failed to init sample rate\n");
443
444	tx_dma = devm_spi_offload_tx_stream_request_dma_chan(&spi->dev,
445							     st->offload);
446	if (IS_ERR(tx_dma))
447		return dev_err_probe(&spi->dev, PTR_ERR(tx_dma),
448				     "failed to get offload TX DMA\n");
449
450	ret = devm_iio_dmaengine_buffer_setup_with_handle(&spi->dev,
451		indio_dev, tx_dma, IIO_BUFFER_DIRECTION_OUT);
452	if (ret)
453		return ret;
454
455	st->offload_xfer.len = 4;
456	st->offload_xfer.bits_per_word = 24;
457	st->offload_xfer.offload_flags = SPI_OFFLOAD_XFER_TX_STREAM;
458
459	spi_message_init_with_transfers(&st->offload_msg, &st->offload_xfer, 1);
460	st->offload_msg.offload = st->offload;
461
462	return devm_spi_optimize_message(&spi->dev, st->spi, &st->offload_msg);
463}
464
465static const struct iio_info ad5791_info = {
466	.read_raw = &ad5791_read_raw,
467	.write_raw = &ad5791_write_raw,
468	.write_raw_get_fmt = &ad5791_write_raw_get_fmt,
469};
470
471static const struct spi_offload_config ad5791_offload_config = {
472	.capability_flags = SPI_OFFLOAD_CAP_TRIGGER |
473			    SPI_OFFLOAD_CAP_TX_STREAM_DMA,
474};
475
476static int ad5791_probe(struct spi_device *spi)
477{
478	const struct ad5791_platform_data *pdata = dev_get_platdata(&spi->dev);
479	struct iio_dev *indio_dev;
480	struct ad5791_state *st;
481	int ret, pos_voltage_uv = 0, neg_voltage_uv = 0;
482	bool use_rbuf_gain2;
483
484	indio_dev = devm_iio_device_alloc(&spi->dev, sizeof(*st));
485	if (!indio_dev)
486		return -ENOMEM;
487	st = iio_priv(indio_dev);
488
489	st->gpio_reset = devm_gpiod_get_optional(&spi->dev, "reset",
490						 GPIOD_OUT_HIGH);
491	if (IS_ERR(st->gpio_reset))
492		return PTR_ERR(st->gpio_reset);
493
494	st->gpio_clear = devm_gpiod_get_optional(&spi->dev, "clear",
495						 GPIOD_OUT_LOW);
496	if (IS_ERR(st->gpio_clear))
497		return PTR_ERR(st->gpio_clear);
498
499	st->gpio_ldac = devm_gpiod_get_optional(&spi->dev, "ldac",
500						GPIOD_OUT_HIGH);
501	if (IS_ERR(st->gpio_ldac))
502		return PTR_ERR(st->gpio_ldac);
503
504	st->pwr_down = true;
505	st->spi = spi;
506
507	if (pdata)
508		use_rbuf_gain2 = pdata->use_rbuf_gain2;
509	else
510		use_rbuf_gain2 = device_property_read_bool(&spi->dev,
511							   "adi,rbuf-gain2-en");
512
513	pos_voltage_uv = devm_regulator_get_enable_read_voltage(&spi->dev, "vdd");
514	if (pos_voltage_uv < 0 && pos_voltage_uv != -ENODEV)
515		return dev_err_probe(&spi->dev, pos_voltage_uv,
516				     "failed to get vdd voltage\n");
517
518	neg_voltage_uv = devm_regulator_get_enable_read_voltage(&spi->dev, "vss");
519	if (neg_voltage_uv < 0 && neg_voltage_uv != -ENODEV)
520		return dev_err_probe(&spi->dev, neg_voltage_uv,
521				     "failed to get vss voltage\n");
522
523	if (neg_voltage_uv >= 0 && pos_voltage_uv >= 0) {
524		st->vref_mv = (pos_voltage_uv + neg_voltage_uv) / 1000;
525		st->vref_neg_mv = neg_voltage_uv / 1000;
526	} else if (pdata) {
527		st->vref_mv = pdata->vref_pos_mv + pdata->vref_neg_mv;
528		st->vref_neg_mv = pdata->vref_neg_mv;
529	} else {
530		dev_warn(&spi->dev, "reference voltage unspecified\n");
531	}
532
533	if (st->gpio_reset) {
534		fsleep(20);
535		gpiod_set_value_cansleep(st->gpio_reset, 0);
536	} else {
537		ret = ad5791_spi_write(st, AD5791_ADDR_SW_CTRL, AD5791_SWCTRL_RESET);
538		if (ret)
539			return dev_err_probe(&spi->dev, ret, "fail to reset\n");
540	}
541
542	st->chip_info = spi_get_device_match_data(spi);
543	if (!st->chip_info)
544		return dev_err_probe(&spi->dev, -EINVAL, "no chip info\n");
545
546	st->ctrl = AD5761_CTRL_LINCOMP(st->chip_info->get_lin_comp(st->vref_mv))
547		  | (use_rbuf_gain2 ? 0 : AD5791_CTRL_RBUF) |
548		  AD5791_CTRL_BIN2SC;
549
550	ret = ad5791_spi_write(st, AD5791_ADDR_CTRL, st->ctrl |
551		AD5791_CTRL_OPGND | AD5791_CTRL_DACTRI);
552	if (ret)
553		return dev_err_probe(&spi->dev, ret, "fail to write ctrl register\n");
554
555	indio_dev->info = &ad5791_info;
556	indio_dev->modes = INDIO_DIRECT_MODE;
557	indio_dev->channels = &st->chip_info->channel;
558	indio_dev->num_channels = 1;
559	indio_dev->name = st->chip_info->name;
560
561	st->offload = devm_spi_offload_get(&spi->dev, spi, &ad5791_offload_config);
562	ret = PTR_ERR_OR_ZERO(st->offload);
563	if (ret && ret != -ENODEV)
564		return dev_err_probe(&spi->dev, ret, "failed to get offload\n");
565
566	if (ret != -ENODEV) {
567		indio_dev->channels = &st->chip_info->channel_offload;
568		indio_dev->setup_ops = &ad5791_buffer_setup_ops;
569		ret = ad5791_offload_setup(indio_dev);
570		if (ret)
571			return dev_err_probe(&spi->dev, ret,
572					     "fail to setup offload\n");
573	}
574
575	return devm_iio_device_register(&spi->dev, indio_dev);
576}
577
578static const struct of_device_id ad5791_of_match[] = {
579	{ .compatible = "adi,ad5760", .data = &ad5760_chip_info },
580	{ .compatible = "adi,ad5780", .data = &ad5780_chip_info },
581	{ .compatible = "adi,ad5781", .data = &ad5781_chip_info },
582	{ .compatible = "adi,ad5790", .data = &ad5790_chip_info },
583	{ .compatible = "adi,ad5791", .data = &ad5791_chip_info },
584	{ }
585};
586MODULE_DEVICE_TABLE(of, ad5791_of_match);
587
588static const struct spi_device_id ad5791_id[] = {
589	{ "ad5760", (kernel_ulong_t)&ad5760_chip_info },
590	{ "ad5780", (kernel_ulong_t)&ad5780_chip_info },
591	{ "ad5781", (kernel_ulong_t)&ad5781_chip_info },
592	{ "ad5790", (kernel_ulong_t)&ad5790_chip_info },
593	{ "ad5791", (kernel_ulong_t)&ad5791_chip_info },
594	{ }
595};
596MODULE_DEVICE_TABLE(spi, ad5791_id);
597
598static struct spi_driver ad5791_driver = {
599	.driver = {
600		   .name = "ad5791",
601		   .of_match_table = ad5791_of_match,
602		   },
603	.probe = ad5791_probe,
604	.id_table = ad5791_id,
605};
606module_spi_driver(ad5791_driver);
607
608MODULE_AUTHOR("Michael Hennerich <michael.hennerich@analog.com>");
609MODULE_DESCRIPTION("Analog Devices AD5760/AD5780/AD5781/AD5790/AD5791 DAC");
610MODULE_LICENSE("GPL v2");
611MODULE_IMPORT_NS("IIO_DMAENGINE_BUFFER");
~/ Read-only file preview.