/* SPDX-License-Identifier: GPL-2.0-or-later */
/*
* Freescale MXS Low Resolution Analog - to - Digital Converter driver
*
* Copyright ( c ) 2012 DENX Software Engineering , GmbH .
* Copyright ( c ) 2016 Ksenija Stanojevic < ksenija . stanojevic @ gmail . com >
*
* Author : Marek Vasut < marex @ denx . de >
*/
#ifndef __MFD_MXS_LRADC_H
#define __MFD_MXS_LRADC_H
#include <linux/bitops.h>
#include <linux/io.h>
#include <linux/stmp_device.h>
#define LRADC_MAX_DELAY_CHANS 4
#define LRADC_MAX_MAPPED_CHANS 8
#define LRADC_MAX_TOTAL_CHANS 16
#define LRADC_DELAY_TIMER_HZ 2000
#define LRADC_CTRL0 0 x00
# define LRADC_CTRL0_MX28_TOUCH_DETECT_ENABLE BIT(23 )
# define LRADC_CTRL0_MX28_TOUCH_SCREEN_TYPE BIT(22 )
# define LRADC_CTRL0_MX28_YNNSW /* YM */ BIT(21)
# define LRADC_CTRL0_MX28_YPNSW /* YP */ BIT(20)
# define LRADC_CTRL0_MX28_YPPSW /* YP */ BIT(19)
# define LRADC_CTRL0_MX28_XNNSW /* XM */ BIT(18)
# define LRADC_CTRL0_MX28_XNPSW /* XM */ BIT(17)
# define LRADC_CTRL0_MX28_XPPSW /* XP */ BIT(16)
# define LRADC_CTRL0_MX23_TOUCH_DETECT_ENABLE BIT(20 )
# define LRADC_CTRL0_MX23_YM BIT(19 )
# define LRADC_CTRL0_MX23_XM BIT(18 )
# define LRADC_CTRL0_MX23_YP BIT(17 )
# define LRADC_CTRL0_MX23_XP BIT(16 )
# define LRADC_CTRL0_MX28_PLATE_MASK \
(LRADC_CTRL0_MX28_TOUCH_DETECT_ENABLE | \
LRADC_CTRL0_MX28_YNNSW | LRADC_CTRL0_MX28_YPNSW | \
LRADC_CTRL0_MX28_YPPSW | LRADC_CTRL0_MX28_XNNSW | \
LRADC_CTRL0_MX28_XNPSW | LRADC_CTRL0_MX28_XPPSW)
# define LRADC_CTRL0_MX23_PLATE_MASK \
(LRADC_CTRL0_MX23_TOUCH_DETECT_ENABLE | \
LRADC_CTRL0_MX23_YM | LRADC_CTRL0_MX23_XM | \
LRADC_CTRL0_MX23_YP | LRADC_CTRL0_MX23_XP)
#define LRADC_CTRL1 0 x10
#define LRADC_CTRL1_TOUCH_DETECT_IRQ_EN BIT(24 )
#define LRADC_CTRL1_LRADC_IRQ_EN(n) (1 << ((n) + 16 ))
#define LRADC_CTRL1_MX28_LRADC_IRQ_EN_MASK (0 x1fff << 16 )
#define LRADC_CTRL1_MX23_LRADC_IRQ_EN_MASK (0 x01ff << 16 )
#define LRADC_CTRL1_LRADC_IRQ_EN_OFFSET 16
#define LRADC_CTRL1_TOUCH_DETECT_IRQ BIT(8 )
#define LRADC_CTRL1_LRADC_IRQ(n) BIT(n)
#define LRADC_CTRL1_MX28_LRADC_IRQ_MASK 0 x1fff
#define LRADC_CTRL1_MX23_LRADC_IRQ_MASK 0 x01ff
#define LRADC_CTRL1_LRADC_IRQ_OFFSET 0
#define LRADC_CTRL2 0 x20
#define LRADC_CTRL2_DIVIDE_BY_TWO_OFFSET 24
#define LRADC_CTRL2_TEMPSENSE_PWD BIT(15 )
#define LRADC_STATUS 0 x40
#define LRADC_STATUS_TOUCH_DETECT_RAW BIT(0 )
#define LRADC_CH(n) (0 x50 + (0 x10 * (n)))
#define LRADC_CH_ACCUMULATE BIT(29 )
#define LRADC_CH_NUM_SAMPLES_MASK (0 x1f << 24 )
#define LRADC_CH_NUM_SAMPLES_OFFSET 24
#define LRADC_CH_NUM_SAMPLES(x) \
((x) << LRADC_CH_NUM_SAMPLES_OFFSET)
#define LRADC_CH_VALUE_MASK 0 x3ffff
#define LRADC_CH_VALUE_OFFSET 0
#define LRADC_DELAY(n) (0 xd0 + (0 x10 * (n)))
#define LRADC_DELAY_TRIGGER_LRADCS_MASK (0 xffUL << 24 )
#define LRADC_DELAY_TRIGGER_LRADCS_OFFSET 24
#define LRADC_DELAY_TRIGGER(x) \
(((x) << LRADC_DELAY_TRIGGER_LRADCS_OFFSET) & \
LRADC_DELAY_TRIGGER_LRADCS_MASK)
#define LRADC_DELAY_KICK BIT(20 )
#define LRADC_DELAY_TRIGGER_DELAYS_MASK (0 xf << 16 )
#define LRADC_DELAY_TRIGGER_DELAYS_OFFSET 16
#define LRADC_DELAY_TRIGGER_DELAYS(x) \
(((x) << LRADC_DELAY_TRIGGER_DELAYS_OFFSET) & \
LRADC_DELAY_TRIGGER_DELAYS_MASK)
#define LRADC_DELAY_LOOP_COUNT_MASK (0 x1f << 11 )
#define LRADC_DELAY_LOOP_COUNT_OFFSET 11
#define LRADC_DELAY_LOOP(x) \
(((x) << LRADC_DELAY_LOOP_COUNT_OFFSET) & \
LRADC_DELAY_LOOP_COUNT_MASK)
#define LRADC_DELAY_DELAY_MASK 0 x7ff
#define LRADC_DELAY_DELAY_OFFSET 0
#define LRADC_DELAY_DELAY(x) \
(((x) << LRADC_DELAY_DELAY_OFFSET) & \
LRADC_DELAY_DELAY_MASK)
#define LRADC_CTRL4 0 x140
#define LRADC_CTRL4_LRADCSELECT_MASK(n) (0 xf << ((n) * 4 ))
#define LRADC_CTRL4_LRADCSELECT_OFFSET(n) ((n) * 4 )
#define LRADC_CTRL4_LRADCSELECT(n, x) \
(((x) << LRADC_CTRL4_LRADCSELECT_OFFSET(n)) & \
LRADC_CTRL4_LRADCSELECT_MASK(n))
#define LRADC_RESOLUTION 12
#define LRADC_SINGLE_SAMPLE_MASK ((1 << LRADC_RESOLUTION) - 1 )
#define BUFFER_VCHANS_LIMITED 0 x3f
#define BUFFER_VCHANS_ALL 0 xff
/*
* Certain LRADC channels are shared between touchscreen
* and / or touch - buttons and generic LRADC block . Therefore when using
* either of these , these channels are not available for the regular
* sampling . The shared channels are as follows :
*
* CH0 - - Touch button # 0
* CH1 - - Touch button # 1
* CH2 - - Touch screen XPUL
* CH3 - - Touch screen YPLL
* CH4 - - Touch screen XNUL
* CH5 - - Touch screen YNLR
* CH6 - - Touch screen WIPER ( 5 - wire only )
*
* The bit fields below represents which parts of the LRADC block are
* switched into special mode of operation . These channels can not
* be sampled as regular LRADC channels . The driver will refuse any
* attempt to sample these channels .
*/
#define CHAN_MASK_TOUCHBUTTON (BIT(1 ) | BIT(0 ))
#define CHAN_MASK_TOUCHSCREEN_4WIRE (0 xf << 2 )
#define CHAN_MASK_TOUCHSCREEN_5WIRE (0 x1f << 2 )
enum mxs_lradc_id {
IMX23_LRADC,
IMX28_LRADC,
};
enum mxs_lradc_ts_wires {
MXS_LRADC_TOUCHSCREEN_NONE = 0 ,
MXS_LRADC_TOUCHSCREEN_4WIRE,
MXS_LRADC_TOUCHSCREEN_5WIRE,
};
/**
* struct mxs_lradc
* @ soc : soc type ( IMX23 or IMX28 )
* @ clk : 2 kHz clock for delay units
* @ buffer_vchans : channels that can be used during buffered capture
* @ touchscreen_wire : touchscreen type ( 4 - wire or 5 - wire )
* @ use_touchbutton : button state ( on or off )
*/
struct mxs_lradc {
enum mxs_lradc_id soc;
struct clk *clk;
u8 buffer_vchans;
enum mxs_lradc_ts_wires touchscreen_wire;
bool use_touchbutton;
};
static inline u32 mxs_lradc_irq_mask(struct mxs_lradc *lradc)
{
switch (lradc->soc) {
case IMX23_LRADC:
return LRADC_CTRL1_MX23_LRADC_IRQ_MASK;
case IMX28_LRADC:
return LRADC_CTRL1_MX28_LRADC_IRQ_MASK;
default :
return 0 ;
}
}
#endif /* __MXS_LRADC_H */
Messung V0.5 in Prozent C=94 H=100 G=96
¤ Dauer der Verarbeitung: 0.11 Sekunden
(vorverarbeitet am 2026-09-30)
¤
*© Formatika GbR, Deutschland