0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011 #ifndef __MFD_MXS_LRADC_H
0012 #define __MFD_MXS_LRADC_H
0013
0014 #include <linux/bitops.h>
0015 #include <linux/io.h>
0016 #include <linux/stmp_device.h>
0017
0018 #define LRADC_MAX_DELAY_CHANS 4
0019 #define LRADC_MAX_MAPPED_CHANS 8
0020 #define LRADC_MAX_TOTAL_CHANS 16
0021
0022 #define LRADC_DELAY_TIMER_HZ 2000
0023
0024 #define LRADC_CTRL0 0x00
0025 # define LRADC_CTRL0_MX28_TOUCH_DETECT_ENABLE BIT(23)
0026 # define LRADC_CTRL0_MX28_TOUCH_SCREEN_TYPE BIT(22)
0027 # define LRADC_CTRL0_MX28_YNNSW BIT(21)
0028 # define LRADC_CTRL0_MX28_YPNSW BIT(20)
0029 # define LRADC_CTRL0_MX28_YPPSW BIT(19)
0030 # define LRADC_CTRL0_MX28_XNNSW BIT(18)
0031 # define LRADC_CTRL0_MX28_XNPSW BIT(17)
0032 # define LRADC_CTRL0_MX28_XPPSW BIT(16)
0033
0034 # define LRADC_CTRL0_MX23_TOUCH_DETECT_ENABLE BIT(20)
0035 # define LRADC_CTRL0_MX23_YM BIT(19)
0036 # define LRADC_CTRL0_MX23_XM BIT(18)
0037 # define LRADC_CTRL0_MX23_YP BIT(17)
0038 # define LRADC_CTRL0_MX23_XP BIT(16)
0039
0040 # define LRADC_CTRL0_MX28_PLATE_MASK \
0041 (LRADC_CTRL0_MX28_TOUCH_DETECT_ENABLE | \
0042 LRADC_CTRL0_MX28_YNNSW | LRADC_CTRL0_MX28_YPNSW | \
0043 LRADC_CTRL0_MX28_YPPSW | LRADC_CTRL0_MX28_XNNSW | \
0044 LRADC_CTRL0_MX28_XNPSW | LRADC_CTRL0_MX28_XPPSW)
0045
0046 # define LRADC_CTRL0_MX23_PLATE_MASK \
0047 (LRADC_CTRL0_MX23_TOUCH_DETECT_ENABLE | \
0048 LRADC_CTRL0_MX23_YM | LRADC_CTRL0_MX23_XM | \
0049 LRADC_CTRL0_MX23_YP | LRADC_CTRL0_MX23_XP)
0050
0051 #define LRADC_CTRL1 0x10
0052 #define LRADC_CTRL1_TOUCH_DETECT_IRQ_EN BIT(24)
0053 #define LRADC_CTRL1_LRADC_IRQ_EN(n) (1 << ((n) + 16))
0054 #define LRADC_CTRL1_MX28_LRADC_IRQ_EN_MASK (0x1fff << 16)
0055 #define LRADC_CTRL1_MX23_LRADC_IRQ_EN_MASK (0x01ff << 16)
0056 #define LRADC_CTRL1_LRADC_IRQ_EN_OFFSET 16
0057 #define LRADC_CTRL1_TOUCH_DETECT_IRQ BIT(8)
0058 #define LRADC_CTRL1_LRADC_IRQ(n) BIT(n)
0059 #define LRADC_CTRL1_MX28_LRADC_IRQ_MASK 0x1fff
0060 #define LRADC_CTRL1_MX23_LRADC_IRQ_MASK 0x01ff
0061 #define LRADC_CTRL1_LRADC_IRQ_OFFSET 0
0062
0063 #define LRADC_CTRL2 0x20
0064 #define LRADC_CTRL2_DIVIDE_BY_TWO_OFFSET 24
0065 #define LRADC_CTRL2_TEMPSENSE_PWD BIT(15)
0066
0067 #define LRADC_STATUS 0x40
0068 #define LRADC_STATUS_TOUCH_DETECT_RAW BIT(0)
0069
0070 #define LRADC_CH(n) (0x50 + (0x10 * (n)))
0071 #define LRADC_CH_ACCUMULATE BIT(29)
0072 #define LRADC_CH_NUM_SAMPLES_MASK (0x1f << 24)
0073 #define LRADC_CH_NUM_SAMPLES_OFFSET 24
0074 #define LRADC_CH_NUM_SAMPLES(x) \
0075 ((x) << LRADC_CH_NUM_SAMPLES_OFFSET)
0076 #define LRADC_CH_VALUE_MASK 0x3ffff
0077 #define LRADC_CH_VALUE_OFFSET 0
0078
0079 #define LRADC_DELAY(n) (0xd0 + (0x10 * (n)))
0080 #define LRADC_DELAY_TRIGGER_LRADCS_MASK (0xffUL << 24)
0081 #define LRADC_DELAY_TRIGGER_LRADCS_OFFSET 24
0082 #define LRADC_DELAY_TRIGGER(x) \
0083 (((x) << LRADC_DELAY_TRIGGER_LRADCS_OFFSET) & \
0084 LRADC_DELAY_TRIGGER_LRADCS_MASK)
0085 #define LRADC_DELAY_KICK BIT(20)
0086 #define LRADC_DELAY_TRIGGER_DELAYS_MASK (0xf << 16)
0087 #define LRADC_DELAY_TRIGGER_DELAYS_OFFSET 16
0088 #define LRADC_DELAY_TRIGGER_DELAYS(x) \
0089 (((x) << LRADC_DELAY_TRIGGER_DELAYS_OFFSET) & \
0090 LRADC_DELAY_TRIGGER_DELAYS_MASK)
0091 #define LRADC_DELAY_LOOP_COUNT_MASK (0x1f << 11)
0092 #define LRADC_DELAY_LOOP_COUNT_OFFSET 11
0093 #define LRADC_DELAY_LOOP(x) \
0094 (((x) << LRADC_DELAY_LOOP_COUNT_OFFSET) & \
0095 LRADC_DELAY_LOOP_COUNT_MASK)
0096 #define LRADC_DELAY_DELAY_MASK 0x7ff
0097 #define LRADC_DELAY_DELAY_OFFSET 0
0098 #define LRADC_DELAY_DELAY(x) \
0099 (((x) << LRADC_DELAY_DELAY_OFFSET) & \
0100 LRADC_DELAY_DELAY_MASK)
0101
0102 #define LRADC_CTRL4 0x140
0103 #define LRADC_CTRL4_LRADCSELECT_MASK(n) (0xf << ((n) * 4))
0104 #define LRADC_CTRL4_LRADCSELECT_OFFSET(n) ((n) * 4)
0105 #define LRADC_CTRL4_LRADCSELECT(n, x) \
0106 (((x) << LRADC_CTRL4_LRADCSELECT_OFFSET(n)) & \
0107 LRADC_CTRL4_LRADCSELECT_MASK(n))
0108
0109 #define LRADC_RESOLUTION 12
0110 #define LRADC_SINGLE_SAMPLE_MASK ((1 << LRADC_RESOLUTION) - 1)
0111
0112 #define BUFFER_VCHANS_LIMITED 0x3f
0113 #define BUFFER_VCHANS_ALL 0xff
0114
0115
0116
0117
0118
0119
0120
0121
0122
0123
0124
0125
0126
0127
0128
0129
0130
0131
0132
0133
0134 #define CHAN_MASK_TOUCHBUTTON (BIT(1) | BIT(0))
0135 #define CHAN_MASK_TOUCHSCREEN_4WIRE (0xf << 2)
0136 #define CHAN_MASK_TOUCHSCREEN_5WIRE (0x1f << 2)
0137
0138 enum mxs_lradc_id {
0139 IMX23_LRADC,
0140 IMX28_LRADC,
0141 };
0142
0143 enum mxs_lradc_ts_wires {
0144 MXS_LRADC_TOUCHSCREEN_NONE = 0,
0145 MXS_LRADC_TOUCHSCREEN_4WIRE,
0146 MXS_LRADC_TOUCHSCREEN_5WIRE,
0147 };
0148
0149
0150
0151
0152
0153
0154
0155
0156
0157 struct mxs_lradc {
0158 enum mxs_lradc_id soc;
0159 struct clk *clk;
0160 u8 buffer_vchans;
0161
0162 enum mxs_lradc_ts_wires touchscreen_wire;
0163 bool use_touchbutton;
0164 };
0165
0166 static inline u32 mxs_lradc_irq_mask(struct mxs_lradc *lradc)
0167 {
0168 switch (lradc->soc) {
0169 case IMX23_LRADC:
0170 return LRADC_CTRL1_MX23_LRADC_IRQ_MASK;
0171 case IMX28_LRADC:
0172 return LRADC_CTRL1_MX28_LRADC_IRQ_MASK;
0173 default:
0174 return 0;
0175 }
0176 }
0177
0178 #endif