lradc
clks[lradc] = mxs_clk_fixed_factor("lradc", "clk32k", 1, 16);
struct mxs_lradc *lradc;
struct mxs_lradc *lradc = adc->lradc;
if (lradc->soc == IMX28_LRADC)
struct mxs_lradc *lradc = adc->lradc;
if (!(reg & mxs_lradc_irq_mask(lradc)))
if (reg & lradc->buffer_vchans) {
writel(reg & mxs_lradc_irq_mask(lradc),
struct mxs_lradc *lradc = adc->lradc;
if (lradc->soc == IMX28_LRADC)
writel(lradc->buffer_vchans << LRADC_CTRL1_LRADC_IRQ_EN_OFFSET,
writel(lradc->buffer_vchans,
struct mxs_lradc *lradc = adc->lradc;
writel(lradc->buffer_vchans,
if (lradc->soc == IMX28_LRADC)
writel(lradc->buffer_vchans << LRADC_CTRL1_LRADC_IRQ_EN_OFFSET,
struct mxs_lradc *lradc = adc->lradc;
if (lradc->use_touchbutton)
if (lradc->touchscreen_wire == MXS_LRADC_TOUCHSCREEN_4WIRE)
if (lradc->touchscreen_wire == MXS_LRADC_TOUCHSCREEN_5WIRE)
if (lradc->use_touchbutton)
if (lradc->touchscreen_wire)
struct mxs_lradc *lradc = dev_get_drvdata(dev->parent);
adc->lradc = lradc;
if (lradc->soc == IMX23_LRADC) {
adc->vref_mv = mxs_lradc_adc_vref_mv[lradc->soc];
struct sun4i_lradc_data *lradc = dev_id;
ints = readl(lradc->base + LRADC_INTS);
input_report_key(lradc->input, lradc->chan0_keycode, 0);
lradc->chan0_keycode = 0;
if ((ints & CHAN0_KEYDOWN_IRQ) && lradc->chan0_keycode == 0) {
val = readl(lradc->base + LRADC_DATA0) & 0x3f;
voltage = val * lradc->vref / 63;
for (i = 0; i < lradc->chan0_map_count; i++) {
diff = abs(lradc->chan0_map[i].voltage - voltage);
keycode = lradc->chan0_map[i].keycode;
lradc->chan0_keycode = keycode;
input_report_key(lradc->input, lradc->chan0_keycode, 1);
input_sync(lradc->input);
writel(ints, lradc->base + LRADC_INTS);
struct sun4i_lradc_data *lradc = input_get_drvdata(dev);
error = regulator_enable(lradc->vref_supply);
error = reset_control_deassert(lradc->reset);
error = clk_prepare_enable(lradc->clk);
lradc->vref = regulator_get_voltage(lradc->vref_supply) *
lradc->variant->divisor_numerator /
lradc->variant->divisor_denominator;
SAMPLE_RATE(0) | ENABLE(1), lradc->base + LRADC_CTRL);
writel(CHAN0_KEYUP_IRQ | CHAN0_KEYDOWN_IRQ, lradc->base + LRADC_INTC);
reset_control_assert(lradc->reset);
regulator_disable(lradc->vref_supply);
struct sun4i_lradc_data *lradc = input_get_drvdata(dev);
SAMPLE_RATE(2), lradc->base + LRADC_CTRL);
writel(0, lradc->base + LRADC_INTC);
clk_disable_unprepare(lradc->clk);
reset_control_assert(lradc->reset);
regulator_disable(lradc->vref_supply);
struct sun4i_lradc_data *lradc)
lradc->chan0_map_count = of_get_child_count(np);
if (lradc->chan0_map_count == 0) {
lradc->chan0_map = devm_kmalloc_array(dev, lradc->chan0_map_count,
if (!lradc->chan0_map)
struct sun4i_lradc_keymap *map = &lradc->chan0_map[i];
struct sun4i_lradc_data *lradc;
lradc = devm_kzalloc(dev, sizeof(struct sun4i_lradc_data), GFP_KERNEL);
if (!lradc)
error = sun4i_lradc_load_dt_keymap(dev, lradc);
lradc->variant = of_device_get_match_data(&pdev->dev);
if (!lradc->variant) {
if (lradc->variant->has_clock_reset) {
lradc->clk = devm_clk_get(dev, NULL);
if (IS_ERR(lradc->clk))
return PTR_ERR(lradc->clk);
lradc->reset = devm_reset_control_get_exclusive(dev, NULL);
if (IS_ERR(lradc->reset))
return PTR_ERR(lradc->reset);
lradc->vref_supply = devm_regulator_get(dev, "vref");
if (IS_ERR(lradc->vref_supply))
return PTR_ERR(lradc->vref_supply);
lradc->dev = dev;
lradc->input = devm_input_allocate_device(dev);
if (!lradc->input)
lradc->input->name = pdev->name;
lradc->input->phys = "sun4i_lradc/input0";
lradc->input->open = sun4i_lradc_open;
lradc->input->close = sun4i_lradc_close;
lradc->input->id.bustype = BUS_HOST;
lradc->input->id.vendor = 0x0001;
lradc->input->id.product = 0x0001;
lradc->input->id.version = 0x0100;
__set_bit(EV_KEY, lradc->input->evbit);
for (i = 0; i < lradc->chan0_map_count; i++)
__set_bit(lradc->chan0_map[i].keycode, lradc->input->keybit);
input_set_drvdata(lradc->input, lradc);
lradc->base = devm_platform_ioremap_resource(pdev, 0);
if (IS_ERR(lradc->base))
return PTR_ERR(lradc->base);
"sun4i-a10-lradc-keys", lradc);
error = input_register_device(lradc->input);
struct mxs_lradc *lradc = ts->lradc;
writel(info[lradc->soc].mask,
writel(info[lradc->soc].bit,
struct mxs_lradc *lradc = ts->lradc;
writel(info[lradc->soc].mask,
writel(info[lradc->soc].x_plate,
struct mxs_lradc *lradc = ts->lradc;
writel(info[lradc->soc].mask,
writel(info[lradc->soc].y_plate,
struct mxs_lradc *lradc = ts->lradc;
writel(info[lradc->soc].mask,
writel(info[lradc->soc].pressure,
struct mxs_lradc *lradc;
struct mxs_lradc *lradc = ts->lradc;
u32 clr_irq = mxs_lradc_irq_mask(lradc);
if (!(reg & mxs_lradc_irq_mask(lradc)))
struct mxs_lradc *lradc = ts->lradc;
writel(info[lradc->soc].mask,
writel(lradc->buffer_vchans << LRADC_CTRL1_LRADC_IRQ_EN_OFFSET,
struct mxs_lradc *lradc = ts->lradc;
if (lradc->soc == IMX28_LRADC) {
if (lradc->touchscreen_wire == MXS_LRADC_TOUCHSCREEN_5WIRE)
struct mxs_lradc *lradc = dev_get_drvdata(dev->parent);
ts->lradc = lradc;
struct mxs_lradc *lradc;
lradc = devm_kzalloc(&pdev->dev, sizeof(*lradc), GFP_KERNEL);
if (!lradc)
lradc->soc = (kernel_ulong_t)device_get_match_data(&pdev->dev);
lradc->clk = devm_clk_get(&pdev->dev, NULL);
if (IS_ERR(lradc->clk)) {
return PTR_ERR(lradc->clk);
ret = clk_prepare_enable(lradc->clk);
lradc->buffer_vchans = BUFFER_VCHANS_LIMITED;
lradc->touchscreen_wire = MXS_LRADC_TOUCHSCREEN_4WIRE;
if (lradc->soc == IMX28_LRADC) {
lradc->touchscreen_wire =
lradc->buffer_vchans = BUFFER_VCHANS_ALL;
platform_set_drvdata(pdev, lradc);
switch (lradc->soc) {
if (!lradc->touchscreen_wire)
clk_disable_unprepare(lradc->clk);
struct mxs_lradc *lradc = platform_get_drvdata(pdev);
clk_disable_unprepare(lradc->clk);
static inline u32 mxs_lradc_irq_mask(struct mxs_lradc *lradc)
switch (lradc->soc) {