1*3a658f23SZhu Yi // SPDX-License-Identifier: GPL-2.0 2*3a658f23SZhu Yi /* 3*3a658f23SZhu Yi * Rohm BU21029 touchscreen controller driver 4*3a658f23SZhu Yi * 5*3a658f23SZhu Yi * Copyright (C) 2015-2018 Bosch Sicherheitssysteme GmbH 6*3a658f23SZhu Yi * 7*3a658f23SZhu Yi * This program is free software; you can redistribute it and/or modify 8*3a658f23SZhu Yi * it under the terms of the GNU General Public License version 2 as 9*3a658f23SZhu Yi * published by the Free Software Foundation. 10*3a658f23SZhu Yi */ 11*3a658f23SZhu Yi 12*3a658f23SZhu Yi #include <linux/delay.h> 13*3a658f23SZhu Yi #include <linux/gpio/consumer.h> 14*3a658f23SZhu Yi #include <linux/i2c.h> 15*3a658f23SZhu Yi #include <linux/input.h> 16*3a658f23SZhu Yi #include <linux/input/touchscreen.h> 17*3a658f23SZhu Yi #include <linux/interrupt.h> 18*3a658f23SZhu Yi #include <linux/irq.h> 19*3a658f23SZhu Yi #include <linux/module.h> 20*3a658f23SZhu Yi #include <linux/regulator/consumer.h> 21*3a658f23SZhu Yi #include <linux/timer.h> 22*3a658f23SZhu Yi 23*3a658f23SZhu Yi /* 24*3a658f23SZhu Yi * HW_ID1 Register (PAGE=0, ADDR=0x0E, Reset value=0x02, Read only) 25*3a658f23SZhu Yi * +--------+--------+--------+--------+--------+--------+--------+--------+ 26*3a658f23SZhu Yi * | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 | 27*3a658f23SZhu Yi * +--------+--------+--------+--------+--------+--------+--------+--------+ 28*3a658f23SZhu Yi * | HW_IDH | 29*3a658f23SZhu Yi * +--------+--------+--------+--------+--------+--------+--------+--------+ 30*3a658f23SZhu Yi * HW_ID2 Register (PAGE=0, ADDR=0x0F, Reset value=0x29, Read only) 31*3a658f23SZhu Yi * +--------+--------+--------+--------+--------+--------+--------+--------+ 32*3a658f23SZhu Yi * | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 | 33*3a658f23SZhu Yi * +--------+--------+--------+--------+--------+--------+--------+--------+ 34*3a658f23SZhu Yi * | HW_IDL | 35*3a658f23SZhu Yi * +--------+--------+--------+--------+--------+--------+--------+--------+ 36*3a658f23SZhu Yi * HW_IDH: high 8bits of IC's ID 37*3a658f23SZhu Yi * HW_IDL: low 8bits of IC's ID 38*3a658f23SZhu Yi */ 39*3a658f23SZhu Yi #define BU21029_HWID_REG (0x0E << 3) 40*3a658f23SZhu Yi #define SUPPORTED_HWID 0x0229 41*3a658f23SZhu Yi 42*3a658f23SZhu Yi /* 43*3a658f23SZhu Yi * CFR0 Register (PAGE=0, ADDR=0x00, Reset value=0x20) 44*3a658f23SZhu Yi * +--------+--------+--------+--------+--------+--------+--------+--------+ 45*3a658f23SZhu Yi * | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 | 46*3a658f23SZhu Yi * +--------+--------+--------+--------+--------+--------+--------+--------+ 47*3a658f23SZhu Yi * | 0 | 0 | CALIB | INTRM | 0 | 0 | 0 | 0 | 48*3a658f23SZhu Yi * +--------+--------+--------+--------+--------+--------+--------+--------+ 49*3a658f23SZhu Yi * CALIB: 0 = not to use calibration result (*) 50*3a658f23SZhu Yi * 1 = use calibration result 51*3a658f23SZhu Yi * INTRM: 0 = INT output depend on "pen down" (*) 52*3a658f23SZhu Yi * 1 = INT output always "0" 53*3a658f23SZhu Yi */ 54*3a658f23SZhu Yi #define BU21029_CFR0_REG (0x00 << 3) 55*3a658f23SZhu Yi #define CFR0_VALUE 0x00 56*3a658f23SZhu Yi 57*3a658f23SZhu Yi /* 58*3a658f23SZhu Yi * CFR1 Register (PAGE=0, ADDR=0x01, Reset value=0xA6) 59*3a658f23SZhu Yi * +--------+--------+--------+--------+--------+--------+--------+--------+ 60*3a658f23SZhu Yi * | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 | 61*3a658f23SZhu Yi * +--------+--------+--------+--------+--------+--------+--------+--------+ 62*3a658f23SZhu Yi * | MAV | AVE[2:0] | 0 | SMPL[2:0] | 63*3a658f23SZhu Yi * +--------+--------+--------+--------+--------+--------+--------+--------+ 64*3a658f23SZhu Yi * MAV: 0 = median average filter off 65*3a658f23SZhu Yi * 1 = median average filter on (*) 66*3a658f23SZhu Yi * AVE: AVE+1 = number of average samples for MAV, 67*3a658f23SZhu Yi * if AVE>SMPL, then AVE=SMPL (=3) 68*3a658f23SZhu Yi * SMPL: SMPL+1 = number of conversion samples for MAV (=7) 69*3a658f23SZhu Yi */ 70*3a658f23SZhu Yi #define BU21029_CFR1_REG (0x01 << 3) 71*3a658f23SZhu Yi #define CFR1_VALUE 0xA6 72*3a658f23SZhu Yi 73*3a658f23SZhu Yi /* 74*3a658f23SZhu Yi * CFR2 Register (PAGE=0, ADDR=0x02, Reset value=0x04) 75*3a658f23SZhu Yi * +--------+--------+--------+--------+--------+--------+--------+--------+ 76*3a658f23SZhu Yi * | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 | 77*3a658f23SZhu Yi * +--------+--------+--------+--------+--------+--------+--------+--------+ 78*3a658f23SZhu Yi * | INTVL_TIME[3:0] | TIME_ST_ADC[3:0] | 79*3a658f23SZhu Yi * +--------+--------+--------+--------+--------+--------+--------+--------+ 80*3a658f23SZhu Yi * INTVL_TIME: waiting time between completion of conversion 81*3a658f23SZhu Yi * and start of next conversion, only usable in 82*3a658f23SZhu Yi * autoscan mode (=20.480ms) 83*3a658f23SZhu Yi * TIME_ST_ADC: waiting time between application of voltage 84*3a658f23SZhu Yi * to panel and start of A/D conversion (=100us) 85*3a658f23SZhu Yi */ 86*3a658f23SZhu Yi #define BU21029_CFR2_REG (0x02 << 3) 87*3a658f23SZhu Yi #define CFR2_VALUE 0xC9 88*3a658f23SZhu Yi 89*3a658f23SZhu Yi /* 90*3a658f23SZhu Yi * CFR3 Register (PAGE=0, ADDR=0x0B, Reset value=0x72) 91*3a658f23SZhu Yi * +--------+--------+--------+--------+--------+--------+--------+--------+ 92*3a658f23SZhu Yi * | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 | 93*3a658f23SZhu Yi * +--------+--------+--------+--------+--------+--------+--------+--------+ 94*3a658f23SZhu Yi * | RM8 | STRETCH| PU90K | DUAL | PIDAC_OFS[3:0] | 95*3a658f23SZhu Yi * +--------+--------+--------+--------+--------+--------+--------+--------+ 96*3a658f23SZhu Yi * RM8: 0 = coordinate resolution is 12bit (*) 97*3a658f23SZhu Yi * 1 = coordinate resolution is 8bit 98*3a658f23SZhu Yi * STRETCH: 0 = SCL_STRETCH function off 99*3a658f23SZhu Yi * 1 = SCL_STRETCH function on (*) 100*3a658f23SZhu Yi * PU90K: 0 = internal pull-up resistance for touch detection is ~50kohms (*) 101*3a658f23SZhu Yi * 1 = internal pull-up resistance for touch detection is ~90kohms 102*3a658f23SZhu Yi * DUAL: 0 = dual touch detection off (*) 103*3a658f23SZhu Yi * 1 = dual touch detection on 104*3a658f23SZhu Yi * PIDAC_OFS: dual touch detection circuit adjustment, it is not necessary 105*3a658f23SZhu Yi * to change this from initial value 106*3a658f23SZhu Yi */ 107*3a658f23SZhu Yi #define BU21029_CFR3_REG (0x0B << 3) 108*3a658f23SZhu Yi #define CFR3_VALUE 0x42 109*3a658f23SZhu Yi 110*3a658f23SZhu Yi /* 111*3a658f23SZhu Yi * LDO Register (PAGE=0, ADDR=0x0C, Reset value=0x00) 112*3a658f23SZhu Yi * +--------+--------+--------+--------+--------+--------+--------+--------+ 113*3a658f23SZhu Yi * | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 | 114*3a658f23SZhu Yi * +--------+--------+--------+--------+--------+--------+--------+--------+ 115*3a658f23SZhu Yi * | 0 | PVDD[2:0] | 0 | AVDD[2:0] | 116*3a658f23SZhu Yi * +--------+--------+--------+--------+--------+--------+--------+--------+ 117*3a658f23SZhu Yi * PVDD: output voltage of panel output regulator (=2.000V) 118*3a658f23SZhu Yi * AVDD: output voltage of analog circuit regulator (=2.000V) 119*3a658f23SZhu Yi */ 120*3a658f23SZhu Yi #define BU21029_LDO_REG (0x0C << 3) 121*3a658f23SZhu Yi #define LDO_VALUE 0x77 122*3a658f23SZhu Yi 123*3a658f23SZhu Yi /* 124*3a658f23SZhu Yi * Serial Interface Command Byte 1 (CID=1) 125*3a658f23SZhu Yi * +--------+--------+--------+--------+--------+--------+--------+--------+ 126*3a658f23SZhu Yi * | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 | 127*3a658f23SZhu Yi * +--------+--------+--------+--------+--------+--------+--------+--------+ 128*3a658f23SZhu Yi * | 1 | CF | CMSK | PDM | STP | 129*3a658f23SZhu Yi * +--------+--------+--------+--------+--------+--------+--------+--------+ 130*3a658f23SZhu Yi * CF: conversion function, see table 3 in datasheet p6 (=0000, automatic scan) 131*3a658f23SZhu Yi * CMSK: 0 = executes convert function (*) 132*3a658f23SZhu Yi * 1 = reads the convert result 133*3a658f23SZhu Yi * PDM: 0 = power down after convert function stops (*) 134*3a658f23SZhu Yi * 1 = keep power on after convert function stops 135*3a658f23SZhu Yi * STP: 1 = abort current conversion and power down, set to "0" automatically 136*3a658f23SZhu Yi */ 137*3a658f23SZhu Yi #define BU21029_AUTOSCAN 0x80 138*3a658f23SZhu Yi 139*3a658f23SZhu Yi /* 140*3a658f23SZhu Yi * The timeout value needs to be larger than INTVL_TIME + tConv4 (sample and 141*3a658f23SZhu Yi * conversion time), where tConv4 is calculated by formula: 142*3a658f23SZhu Yi * tPON + tDLY1 + (tTIME_ST_ADC + (tADC * tSMPL) * 2 + tDLY2) * 3 143*3a658f23SZhu Yi * see figure 8 in datasheet p15 for details of each field. 144*3a658f23SZhu Yi */ 145*3a658f23SZhu Yi #define PEN_UP_TIMEOUT_MS 50 146*3a658f23SZhu Yi 147*3a658f23SZhu Yi #define STOP_DELAY_MIN_US 50 148*3a658f23SZhu Yi #define STOP_DELAY_MAX_US 1000 149*3a658f23SZhu Yi #define START_DELAY_MS 2 150*3a658f23SZhu Yi #define BUF_LEN 8 151*3a658f23SZhu Yi #define SCALE_12BIT (1 << 12) 152*3a658f23SZhu Yi #define MAX_12BIT ((1 << 12) - 1) 153*3a658f23SZhu Yi #define DRIVER_NAME "bu21029" 154*3a658f23SZhu Yi 155*3a658f23SZhu Yi struct bu21029_ts_data { 156*3a658f23SZhu Yi struct i2c_client *client; 157*3a658f23SZhu Yi struct input_dev *in_dev; 158*3a658f23SZhu Yi struct timer_list timer; 159*3a658f23SZhu Yi struct regulator *vdd; 160*3a658f23SZhu Yi struct gpio_desc *reset_gpios; 161*3a658f23SZhu Yi u32 x_plate_ohms; 162*3a658f23SZhu Yi struct touchscreen_properties prop; 163*3a658f23SZhu Yi }; 164*3a658f23SZhu Yi 165*3a658f23SZhu Yi static void bu21029_touch_report(struct bu21029_ts_data *bu21029, const u8 *buf) 166*3a658f23SZhu Yi { 167*3a658f23SZhu Yi u16 x, y, z1, z2; 168*3a658f23SZhu Yi u32 rz; 169*3a658f23SZhu Yi s32 max_pressure = input_abs_get_max(bu21029->in_dev, ABS_PRESSURE); 170*3a658f23SZhu Yi 171*3a658f23SZhu Yi /* 172*3a658f23SZhu Yi * compose upper 8 and lower 4 bits into a 12bit value: 173*3a658f23SZhu Yi * +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ 174*3a658f23SZhu Yi * | ByteH | ByteL | 175*3a658f23SZhu Yi * +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ 176*3a658f23SZhu Yi * |b07|b06|b05|b04|b03|b02|b01|b00|b07|b06|b05|b04|b03|b02|b01|b00| 177*3a658f23SZhu Yi * +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ 178*3a658f23SZhu Yi * |v11|v10|v09|v08|v07|v06|v05|v04|v03|v02|v01|v00| 0 | 0 | 0 | 0 | 179*3a658f23SZhu Yi * +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ 180*3a658f23SZhu Yi */ 181*3a658f23SZhu Yi x = (buf[0] << 4) | (buf[1] >> 4); 182*3a658f23SZhu Yi y = (buf[2] << 4) | (buf[3] >> 4); 183*3a658f23SZhu Yi z1 = (buf[4] << 4) | (buf[5] >> 4); 184*3a658f23SZhu Yi z2 = (buf[6] << 4) | (buf[7] >> 4); 185*3a658f23SZhu Yi 186*3a658f23SZhu Yi if (z1 && z2) { 187*3a658f23SZhu Yi /* 188*3a658f23SZhu Yi * calculate Rz (pressure resistance value) by equation: 189*3a658f23SZhu Yi * Rz = Rx * (x/Q) * ((z2/z1) - 1), where 190*3a658f23SZhu Yi * Rx is x-plate resistance, 191*3a658f23SZhu Yi * Q is the touch screen resolution (8bit = 256, 12bit = 4096) 192*3a658f23SZhu Yi * x, z1, z2 are the measured positions. 193*3a658f23SZhu Yi */ 194*3a658f23SZhu Yi rz = z2 - z1; 195*3a658f23SZhu Yi rz *= x; 196*3a658f23SZhu Yi rz *= bu21029->x_plate_ohms; 197*3a658f23SZhu Yi rz /= z1; 198*3a658f23SZhu Yi rz = DIV_ROUND_CLOSEST(rz, SCALE_12BIT); 199*3a658f23SZhu Yi if (rz <= max_pressure) { 200*3a658f23SZhu Yi touchscreen_report_pos(bu21029->in_dev, &bu21029->prop, 201*3a658f23SZhu Yi x, y, false); 202*3a658f23SZhu Yi input_report_abs(bu21029->in_dev, ABS_PRESSURE, 203*3a658f23SZhu Yi max_pressure - rz); 204*3a658f23SZhu Yi input_report_key(bu21029->in_dev, BTN_TOUCH, 1); 205*3a658f23SZhu Yi input_sync(bu21029->in_dev); 206*3a658f23SZhu Yi } 207*3a658f23SZhu Yi } 208*3a658f23SZhu Yi } 209*3a658f23SZhu Yi 210*3a658f23SZhu Yi static void bu21029_touch_release(struct timer_list *t) 211*3a658f23SZhu Yi { 212*3a658f23SZhu Yi struct bu21029_ts_data *bu21029 = from_timer(bu21029, t, timer); 213*3a658f23SZhu Yi 214*3a658f23SZhu Yi input_report_abs(bu21029->in_dev, ABS_PRESSURE, 0); 215*3a658f23SZhu Yi input_report_key(bu21029->in_dev, BTN_TOUCH, 0); 216*3a658f23SZhu Yi input_sync(bu21029->in_dev); 217*3a658f23SZhu Yi } 218*3a658f23SZhu Yi 219*3a658f23SZhu Yi static irqreturn_t bu21029_touch_soft_irq(int irq, void *data) 220*3a658f23SZhu Yi { 221*3a658f23SZhu Yi struct bu21029_ts_data *bu21029 = data; 222*3a658f23SZhu Yi u8 buf[BUF_LEN]; 223*3a658f23SZhu Yi int error; 224*3a658f23SZhu Yi 225*3a658f23SZhu Yi /* 226*3a658f23SZhu Yi * Read touch data and deassert interrupt (will assert again after 227*3a658f23SZhu Yi * INTVL_TIME + tConv4 for continuous touch) 228*3a658f23SZhu Yi */ 229*3a658f23SZhu Yi error = i2c_smbus_read_i2c_block_data(bu21029->client, BU21029_AUTOSCAN, 230*3a658f23SZhu Yi sizeof(buf), buf); 231*3a658f23SZhu Yi if (error < 0) 232*3a658f23SZhu Yi goto out; 233*3a658f23SZhu Yi 234*3a658f23SZhu Yi bu21029_touch_report(bu21029, buf); 235*3a658f23SZhu Yi 236*3a658f23SZhu Yi /* reset timer for pen up detection */ 237*3a658f23SZhu Yi mod_timer(&bu21029->timer, 238*3a658f23SZhu Yi jiffies + msecs_to_jiffies(PEN_UP_TIMEOUT_MS)); 239*3a658f23SZhu Yi 240*3a658f23SZhu Yi out: 241*3a658f23SZhu Yi return IRQ_HANDLED; 242*3a658f23SZhu Yi } 243*3a658f23SZhu Yi 244*3a658f23SZhu Yi static void bu21029_put_chip_in_reset(struct bu21029_ts_data *bu21029) 245*3a658f23SZhu Yi { 246*3a658f23SZhu Yi if (bu21029->reset_gpios) { 247*3a658f23SZhu Yi gpiod_set_value_cansleep(bu21029->reset_gpios, 1); 248*3a658f23SZhu Yi usleep_range(STOP_DELAY_MIN_US, STOP_DELAY_MAX_US); 249*3a658f23SZhu Yi } 250*3a658f23SZhu Yi } 251*3a658f23SZhu Yi 252*3a658f23SZhu Yi static int bu21029_start_chip(struct input_dev *dev) 253*3a658f23SZhu Yi { 254*3a658f23SZhu Yi struct bu21029_ts_data *bu21029 = input_get_drvdata(dev); 255*3a658f23SZhu Yi struct i2c_client *i2c = bu21029->client; 256*3a658f23SZhu Yi struct { 257*3a658f23SZhu Yi u8 reg; 258*3a658f23SZhu Yi u8 value; 259*3a658f23SZhu Yi } init_table[] = { 260*3a658f23SZhu Yi {BU21029_CFR0_REG, CFR0_VALUE}, 261*3a658f23SZhu Yi {BU21029_CFR1_REG, CFR1_VALUE}, 262*3a658f23SZhu Yi {BU21029_CFR2_REG, CFR2_VALUE}, 263*3a658f23SZhu Yi {BU21029_CFR3_REG, CFR3_VALUE}, 264*3a658f23SZhu Yi {BU21029_LDO_REG, LDO_VALUE} 265*3a658f23SZhu Yi }; 266*3a658f23SZhu Yi int error, i; 267*3a658f23SZhu Yi __be16 hwid; 268*3a658f23SZhu Yi 269*3a658f23SZhu Yi error = regulator_enable(bu21029->vdd); 270*3a658f23SZhu Yi if (error) { 271*3a658f23SZhu Yi dev_err(&i2c->dev, "failed to power up chip: %d", error); 272*3a658f23SZhu Yi return error; 273*3a658f23SZhu Yi } 274*3a658f23SZhu Yi 275*3a658f23SZhu Yi /* take chip out of reset */ 276*3a658f23SZhu Yi if (bu21029->reset_gpios) { 277*3a658f23SZhu Yi gpiod_set_value_cansleep(bu21029->reset_gpios, 0); 278*3a658f23SZhu Yi msleep(START_DELAY_MS); 279*3a658f23SZhu Yi } 280*3a658f23SZhu Yi 281*3a658f23SZhu Yi error = i2c_smbus_read_i2c_block_data(i2c, BU21029_HWID_REG, 282*3a658f23SZhu Yi sizeof(hwid), (u8 *)&hwid); 283*3a658f23SZhu Yi if (error < 0) { 284*3a658f23SZhu Yi dev_err(&i2c->dev, "failed to read HW ID\n"); 285*3a658f23SZhu Yi goto err_out; 286*3a658f23SZhu Yi } 287*3a658f23SZhu Yi 288*3a658f23SZhu Yi if (be16_to_cpu(hwid) != SUPPORTED_HWID) { 289*3a658f23SZhu Yi dev_err(&i2c->dev, 290*3a658f23SZhu Yi "unsupported HW ID 0x%x\n", be16_to_cpu(hwid)); 291*3a658f23SZhu Yi error = -ENODEV; 292*3a658f23SZhu Yi goto err_out; 293*3a658f23SZhu Yi } 294*3a658f23SZhu Yi 295*3a658f23SZhu Yi for (i = 0; i < ARRAY_SIZE(init_table); ++i) { 296*3a658f23SZhu Yi error = i2c_smbus_write_byte_data(i2c, 297*3a658f23SZhu Yi init_table[i].reg, 298*3a658f23SZhu Yi init_table[i].value); 299*3a658f23SZhu Yi if (error < 0) { 300*3a658f23SZhu Yi dev_err(&i2c->dev, 301*3a658f23SZhu Yi "failed to write %#02x to register %#02x: %d\n", 302*3a658f23SZhu Yi init_table[i].value, init_table[i].reg, 303*3a658f23SZhu Yi error); 304*3a658f23SZhu Yi goto err_out; 305*3a658f23SZhu Yi } 306*3a658f23SZhu Yi } 307*3a658f23SZhu Yi 308*3a658f23SZhu Yi error = i2c_smbus_write_byte(i2c, BU21029_AUTOSCAN); 309*3a658f23SZhu Yi if (error < 0) { 310*3a658f23SZhu Yi dev_err(&i2c->dev, "failed to start autoscan\n"); 311*3a658f23SZhu Yi goto err_out; 312*3a658f23SZhu Yi } 313*3a658f23SZhu Yi 314*3a658f23SZhu Yi enable_irq(bu21029->client->irq); 315*3a658f23SZhu Yi return 0; 316*3a658f23SZhu Yi 317*3a658f23SZhu Yi err_out: 318*3a658f23SZhu Yi bu21029_put_chip_in_reset(bu21029); 319*3a658f23SZhu Yi regulator_disable(bu21029->vdd); 320*3a658f23SZhu Yi return error; 321*3a658f23SZhu Yi } 322*3a658f23SZhu Yi 323*3a658f23SZhu Yi static void bu21029_stop_chip(struct input_dev *dev) 324*3a658f23SZhu Yi { 325*3a658f23SZhu Yi struct bu21029_ts_data *bu21029 = input_get_drvdata(dev); 326*3a658f23SZhu Yi 327*3a658f23SZhu Yi disable_irq(bu21029->client->irq); 328*3a658f23SZhu Yi del_timer_sync(&bu21029->timer); 329*3a658f23SZhu Yi 330*3a658f23SZhu Yi bu21029_put_chip_in_reset(bu21029); 331*3a658f23SZhu Yi regulator_disable(bu21029->vdd); 332*3a658f23SZhu Yi } 333*3a658f23SZhu Yi 334*3a658f23SZhu Yi static int bu21029_probe(struct i2c_client *client, 335*3a658f23SZhu Yi const struct i2c_device_id *id) 336*3a658f23SZhu Yi { 337*3a658f23SZhu Yi struct bu21029_ts_data *bu21029; 338*3a658f23SZhu Yi struct input_dev *in_dev; 339*3a658f23SZhu Yi int error; 340*3a658f23SZhu Yi 341*3a658f23SZhu Yi if (!i2c_check_functionality(client->adapter, 342*3a658f23SZhu Yi I2C_FUNC_SMBUS_WRITE_BYTE | 343*3a658f23SZhu Yi I2C_FUNC_SMBUS_WRITE_BYTE_DATA | 344*3a658f23SZhu Yi I2C_FUNC_SMBUS_READ_I2C_BLOCK)) { 345*3a658f23SZhu Yi dev_err(&client->dev, 346*3a658f23SZhu Yi "i2c functionality support is not sufficient\n"); 347*3a658f23SZhu Yi return -EIO; 348*3a658f23SZhu Yi } 349*3a658f23SZhu Yi 350*3a658f23SZhu Yi bu21029 = devm_kzalloc(&client->dev, sizeof(*bu21029), GFP_KERNEL); 351*3a658f23SZhu Yi if (!bu21029) 352*3a658f23SZhu Yi return -ENOMEM; 353*3a658f23SZhu Yi 354*3a658f23SZhu Yi error = device_property_read_u32(&client->dev, "rohm,x-plate-ohms", 355*3a658f23SZhu Yi &bu21029->x_plate_ohms); 356*3a658f23SZhu Yi if (error) { 357*3a658f23SZhu Yi dev_err(&client->dev, 358*3a658f23SZhu Yi "invalid 'x-plate-ohms' supplied: %d\n", error); 359*3a658f23SZhu Yi return error; 360*3a658f23SZhu Yi } 361*3a658f23SZhu Yi 362*3a658f23SZhu Yi bu21029->vdd = devm_regulator_get(&client->dev, "vdd"); 363*3a658f23SZhu Yi if (IS_ERR(bu21029->vdd)) { 364*3a658f23SZhu Yi error = PTR_ERR(bu21029->vdd); 365*3a658f23SZhu Yi if (error != -EPROBE_DEFER) 366*3a658f23SZhu Yi dev_err(&client->dev, 367*3a658f23SZhu Yi "failed to acquire 'vdd' supply: %d\n", error); 368*3a658f23SZhu Yi return error; 369*3a658f23SZhu Yi } 370*3a658f23SZhu Yi 371*3a658f23SZhu Yi bu21029->reset_gpios = devm_gpiod_get_optional(&client->dev, 372*3a658f23SZhu Yi "reset", GPIOD_OUT_HIGH); 373*3a658f23SZhu Yi if (IS_ERR(bu21029->reset_gpios)) { 374*3a658f23SZhu Yi error = PTR_ERR(bu21029->reset_gpios); 375*3a658f23SZhu Yi if (error != -EPROBE_DEFER) 376*3a658f23SZhu Yi dev_err(&client->dev, 377*3a658f23SZhu Yi "failed to acquire 'reset' gpio: %d\n", error); 378*3a658f23SZhu Yi return error; 379*3a658f23SZhu Yi } 380*3a658f23SZhu Yi 381*3a658f23SZhu Yi in_dev = devm_input_allocate_device(&client->dev); 382*3a658f23SZhu Yi if (!in_dev) { 383*3a658f23SZhu Yi dev_err(&client->dev, "unable to allocate input device\n"); 384*3a658f23SZhu Yi return -ENOMEM; 385*3a658f23SZhu Yi } 386*3a658f23SZhu Yi 387*3a658f23SZhu Yi bu21029->client = client; 388*3a658f23SZhu Yi bu21029->in_dev = in_dev; 389*3a658f23SZhu Yi timer_setup(&bu21029->timer, bu21029_touch_release, 0); 390*3a658f23SZhu Yi 391*3a658f23SZhu Yi in_dev->name = DRIVER_NAME; 392*3a658f23SZhu Yi in_dev->id.bustype = BUS_I2C; 393*3a658f23SZhu Yi in_dev->open = bu21029_start_chip; 394*3a658f23SZhu Yi in_dev->close = bu21029_stop_chip; 395*3a658f23SZhu Yi 396*3a658f23SZhu Yi input_set_capability(in_dev, EV_KEY, BTN_TOUCH); 397*3a658f23SZhu Yi input_set_abs_params(in_dev, ABS_X, 0, MAX_12BIT, 0, 0); 398*3a658f23SZhu Yi input_set_abs_params(in_dev, ABS_Y, 0, MAX_12BIT, 0, 0); 399*3a658f23SZhu Yi input_set_abs_params(in_dev, ABS_PRESSURE, 0, MAX_12BIT, 0, 0); 400*3a658f23SZhu Yi touchscreen_parse_properties(in_dev, false, &bu21029->prop); 401*3a658f23SZhu Yi 402*3a658f23SZhu Yi input_set_drvdata(in_dev, bu21029); 403*3a658f23SZhu Yi 404*3a658f23SZhu Yi irq_set_status_flags(client->irq, IRQ_NOAUTOEN); 405*3a658f23SZhu Yi error = devm_request_threaded_irq(&client->dev, client->irq, 406*3a658f23SZhu Yi NULL, bu21029_touch_soft_irq, 407*3a658f23SZhu Yi IRQF_ONESHOT, DRIVER_NAME, bu21029); 408*3a658f23SZhu Yi if (error) { 409*3a658f23SZhu Yi dev_err(&client->dev, 410*3a658f23SZhu Yi "unable to request touch irq: %d\n", error); 411*3a658f23SZhu Yi return error; 412*3a658f23SZhu Yi } 413*3a658f23SZhu Yi 414*3a658f23SZhu Yi error = input_register_device(in_dev); 415*3a658f23SZhu Yi if (error) { 416*3a658f23SZhu Yi dev_err(&client->dev, 417*3a658f23SZhu Yi "unable to register input device: %d\n", error); 418*3a658f23SZhu Yi return error; 419*3a658f23SZhu Yi } 420*3a658f23SZhu Yi 421*3a658f23SZhu Yi i2c_set_clientdata(client, bu21029); 422*3a658f23SZhu Yi 423*3a658f23SZhu Yi return 0; 424*3a658f23SZhu Yi } 425*3a658f23SZhu Yi 426*3a658f23SZhu Yi static int __maybe_unused bu21029_suspend(struct device *dev) 427*3a658f23SZhu Yi { 428*3a658f23SZhu Yi struct i2c_client *i2c = to_i2c_client(dev); 429*3a658f23SZhu Yi struct bu21029_ts_data *bu21029 = i2c_get_clientdata(i2c); 430*3a658f23SZhu Yi 431*3a658f23SZhu Yi if (!device_may_wakeup(dev)) { 432*3a658f23SZhu Yi mutex_lock(&bu21029->in_dev->mutex); 433*3a658f23SZhu Yi if (bu21029->in_dev->users) 434*3a658f23SZhu Yi bu21029_stop_chip(bu21029->in_dev); 435*3a658f23SZhu Yi mutex_unlock(&bu21029->in_dev->mutex); 436*3a658f23SZhu Yi } 437*3a658f23SZhu Yi 438*3a658f23SZhu Yi return 0; 439*3a658f23SZhu Yi } 440*3a658f23SZhu Yi 441*3a658f23SZhu Yi static int __maybe_unused bu21029_resume(struct device *dev) 442*3a658f23SZhu Yi { 443*3a658f23SZhu Yi struct i2c_client *i2c = to_i2c_client(dev); 444*3a658f23SZhu Yi struct bu21029_ts_data *bu21029 = i2c_get_clientdata(i2c); 445*3a658f23SZhu Yi 446*3a658f23SZhu Yi if (!device_may_wakeup(dev)) { 447*3a658f23SZhu Yi mutex_lock(&bu21029->in_dev->mutex); 448*3a658f23SZhu Yi if (bu21029->in_dev->users) 449*3a658f23SZhu Yi bu21029_start_chip(bu21029->in_dev); 450*3a658f23SZhu Yi mutex_unlock(&bu21029->in_dev->mutex); 451*3a658f23SZhu Yi } 452*3a658f23SZhu Yi 453*3a658f23SZhu Yi return 0; 454*3a658f23SZhu Yi } 455*3a658f23SZhu Yi static SIMPLE_DEV_PM_OPS(bu21029_pm_ops, bu21029_suspend, bu21029_resume); 456*3a658f23SZhu Yi 457*3a658f23SZhu Yi static const struct i2c_device_id bu21029_ids[] = { 458*3a658f23SZhu Yi { DRIVER_NAME, 0 }, 459*3a658f23SZhu Yi { /* sentinel */ } 460*3a658f23SZhu Yi }; 461*3a658f23SZhu Yi MODULE_DEVICE_TABLE(i2c, bu21029_ids); 462*3a658f23SZhu Yi 463*3a658f23SZhu Yi #ifdef CONFIG_OF 464*3a658f23SZhu Yi static const struct of_device_id bu21029_of_ids[] = { 465*3a658f23SZhu Yi { .compatible = "rohm,bu21029" }, 466*3a658f23SZhu Yi { /* sentinel */ } 467*3a658f23SZhu Yi }; 468*3a658f23SZhu Yi MODULE_DEVICE_TABLE(of, bu21029_of_ids); 469*3a658f23SZhu Yi #endif 470*3a658f23SZhu Yi 471*3a658f23SZhu Yi static struct i2c_driver bu21029_driver = { 472*3a658f23SZhu Yi .driver = { 473*3a658f23SZhu Yi .name = DRIVER_NAME, 474*3a658f23SZhu Yi .of_match_table = of_match_ptr(bu21029_of_ids), 475*3a658f23SZhu Yi .pm = &bu21029_pm_ops, 476*3a658f23SZhu Yi }, 477*3a658f23SZhu Yi .id_table = bu21029_ids, 478*3a658f23SZhu Yi .probe = bu21029_probe, 479*3a658f23SZhu Yi }; 480*3a658f23SZhu Yi module_i2c_driver(bu21029_driver); 481*3a658f23SZhu Yi 482*3a658f23SZhu Yi MODULE_AUTHOR("Zhu Yi <yi.zhu5@cn.bosch.com>"); 483*3a658f23SZhu Yi MODULE_DESCRIPTION("Rohm BU21029 touchscreen controller driver"); 484*3a658f23SZhu Yi MODULE_LICENSE("GPL v2"); 485