@@ -77,6 +77,7 @@ enum fixed_regulator_id {
FIXED_REG_ID_CAM_A28V,
FIXED_REG_ID_CAM_12V,
FIXED_REG_ID_CAM_VT_15V,
+ FIXED_REG_ID_TSP_2_8V,
};
static struct s3c2410_uartcfg nuri_uartcfgs[] __initdata = {
@@ -332,6 +333,32 @@ static struct i2c_board_info i2c1_devs[] __initdata = {
};
/* TSP */
+static struct regulator_consumer_supply tsp_fixed_consumer =
+ REGULATOR_SUPPLY("vdd", "3-004a");
+
+static struct regulator_init_data tsp_fixed_voltage_init_data = {
+ .constraints = {
+ .name = "TSP_2.8V",
+ },
+ .num_consumer_supplies = 1,
+ .consumer_supplies = &tsp_fixed_consumer,
+};
+
+static struct fixed_voltage_config tsp_fixed_voltage_config = {
+ .supply_name = "TSP_VDD",
+ .microvolts = 2800000,
+ .gpio = -EINVAL,
+ .init_data = &tsp_fixed_voltage_init_data,
+};
+
+static struct platform_device tsp_fixed_voltage = {
+ .name = "reg-fixed-voltage",
+ .id = FIXED_REG_ID_TSP_2_8V,
+ .dev = {
+ .platform_data = &tsp_fixed_voltage_config,
+ },
+};
+
static struct mxt_platform_data mxt_platform_data = {
.x_line = 18,
.y_line = 11,
@@ -339,7 +366,6 @@ static struct mxt_platform_data mxt_platform_data = {
.y_size = 600,
.blen = 0x1,
.threshold = 0x28,
- .voltage = 2800000, /* 2.8V */
.orient = MXT_DIAGONAL_COUNTER,
.irqflags = IRQF_TRIGGER_FALLING,
};
@@ -1303,6 +1329,7 @@ static struct platform_device *nuri_devices[] __initdata = {
&s3c_device_wdt,
&s3c_device_timer[0],
&s5p_device_ehci,
+ &tsp_fixed_voltage,
&s3c_device_i2c3,
&i2c9_gpio,
&s3c_device_adc,
@@ -561,6 +561,7 @@ enum fixed_regulator_id {
FIXED_REG_ID_CAM_S_IF,
FIXED_REG_ID_CAM_I_CORE,
FIXED_REG_ID_CAM_VT_DIO,
+ FIXED_REG_ID_TSP_2_8V,
};
static struct regulator_consumer_supply hdmi_fixed_consumer =
@@ -603,6 +604,32 @@ static struct i2c_board_info i2c5_devs[] __initdata = {
};
/* I2C3 (TSP) */
+static struct regulator_consumer_supply tsp_fixed_consumer =
+ REGULATOR_SUPPLY("vdd", "3-004a");
+
+static struct regulator_init_data tsp_fixed_voltage_init_data = {
+ .constraints = {
+ .name = "TSP_2.8V",
+ },
+ .num_consumer_supplies = 1,
+ .consumer_supplies = &tsp_fixed_consumer,
+};
+
+static struct fixed_voltage_config tsp_fixed_voltage_config = {
+ .supply_name = "TSP_VDD",
+ .microvolts = 2800000,
+ .gpio = -EINVAL,
+ .init_data = &tsp_fixed_voltage_init_data,
+};
+
+static struct platform_device tsp_fixed_voltage = {
+ .name = "reg-fixed-voltage",
+ .id = FIXED_REG_ID_TSP_2_8V,
+ .dev = {
+ .platform_data = &tsp_fixed_voltage_config,
+ },
+};
+
static struct mxt_platform_data qt602240_platform_data = {
.x_line = 19,
.y_line = 11,
@@ -610,7 +637,6 @@ static struct mxt_platform_data qt602240_platform_data = {
.y_size = 480,
.blen = 0x11,
.threshold = 0x28,
- .voltage = 2800000, /* 2.8V */
.orient = MXT_DIAGONAL,
.irqflags = IRQF_TRIGGER_FALLING,
};
@@ -1065,6 +1091,7 @@ static struct platform_device *universal_devices[] __initdata = {
&s3c_device_hsmmc2,
&s3c_device_hsmmc3,
&s3c_device_i2c0,
+ &tsp_fixed_voltage,
&s3c_device_i2c3,
&s3c_device_i2c5,
&s5p_device_i2c_hdmiphy,
@@ -238,6 +238,32 @@ static void __init goni_radio_init(void)
}
/* TSP */
+static struct regulator_consumer_supply tsp_fixed_consumer =
+ REGULATOR_SUPPLY("vdd", "2-004a");
+
+static struct regulator_init_data tsp_fixed_voltage_init_data = {
+ .constraints = {
+ .name = "TSP_2.8V",
+ },
+ .num_consumer_supplies = 1,
+ .consumer_supplies = &tsp_fixed_consumer,
+};
+
+static struct fixed_voltage_config tsp_fixed_voltage_config = {
+ .supply_name = "TSP_VDD",
+ .microvolts = 2800000,
+ .gpio = -EINVAL,
+ .init_data = &tsp_fixed_voltage_init_data,
+};
+
+static struct platform_device tsp_fixed_voltage = {
+ .name = "reg-fixed-voltage",
+ .id = 3,
+ .dev = {
+ .platform_data = &tsp_fixed_voltage_config,
+ },
+};
+
static struct mxt_platform_data qt602240_platform_data = {
.x_line = 17,
.y_line = 11,
@@ -245,7 +271,6 @@ static struct mxt_platform_data qt602240_platform_data = {
.y_size = 480,
.blen = 0x21,
.threshold = 0x28,
- .voltage = 2800000, /* 2.8V */
.orient = MXT_DIAGONAL,
.irqflags = IRQF_TRIGGER_FALLING,
};
@@ -889,6 +914,7 @@ static struct platform_device *goni_devices[] __initdata = {
&s3c_device_usb_hsotg,
&samsung_device_keypad,
&s3c_device_i2c1,
+ &tsp_fixed_voltage,
&s3c_device_i2c2,
&wm8994_fixed_voltage0,
&wm8994_fixed_voltage1,
@@ -19,6 +19,7 @@
#include <linux/i2c/atmel_mxt_ts.h>
#include <linux/input/mt.h>
#include <linux/interrupt.h>
+#include <linux/regulator/consumer.h>
#include <linux/slab.h>
/* Version */
@@ -247,6 +248,7 @@ struct mxt_message {
struct mxt_data {
struct i2c_client *client;
struct input_dev *input_dev;
+ struct regulator *regulator;
char phys[64]; /* device physical location */
const struct mxt_platform_data *pdata;
struct mxt_object *object_table;
@@ -720,13 +722,14 @@ static void mxt_handle_pdata(struct mxt_data *data)
MXT_TOUCH_YRANGE_MSB, (pdata->y_size - 1) >> 8);
/* Set touchscreen voltage */
- if (pdata->voltage) {
- if (pdata->voltage < MXT_VOLTAGE_DEFAULT) {
- voltage = (MXT_VOLTAGE_DEFAULT - pdata->voltage) /
+ if (!IS_ERR(data->regulator)) {
+ int reg_voltage = regulator_get_voltage(data->regulator);
+ if (reg_voltage < MXT_VOLTAGE_DEFAULT) {
+ voltage = (MXT_VOLTAGE_DEFAULT - reg_voltage) /
MXT_VOLTAGE_STEP;
voltage = 0xff - voltage + 1;
} else
- voltage = (pdata->voltage - MXT_VOLTAGE_DEFAULT) /
+ voltage = (reg_voltage - MXT_VOLTAGE_DEFAULT) /
MXT_VOLTAGE_STEP;
mxt_write_object(data, MXT_SPT_CTECONFIG_T28,
@@ -1151,6 +1154,13 @@ static int mxt_probe(struct i2c_client *client,
input_dev->name = (data->is_tp) ? "Atmel maXTouch Touchpad" :
"Atmel maXTouch Touchscreen";
+
+ data->regulator = devm_regulator_get(&client->dev, "vdd");
+ if (!IS_ERR(data->regulator)) {
+ regulator_enable(data->regulator);
+ msleep(100);
+ }
+
snprintf(data->phys, sizeof(data->phys), "i2c-%u-%04x/input0",
client->adapter->nr, client->addr);
@@ -1170,7 +1180,7 @@ static int mxt_probe(struct i2c_client *client,
error = mxt_initialize(data);
if (error)
- goto err_free_mem;
+ goto err_disable_regulator;
__set_bit(EV_ABS, input_dev->evbit);
__set_bit(EV_KEY, input_dev->evbit);
@@ -1253,6 +1263,9 @@ err_free_irq:
free_irq(client->irq, data);
err_free_object:
kfree(data->object_table);
+err_disable_regulator:
+ if (!IS_ERR(data->regulator))
+ regulator_disable(data->regulator);
err_free_mem:
input_free_device(input_dev);
kfree(data);
@@ -1267,6 +1280,8 @@ static int mxt_remove(struct i2c_client *client)
free_irq(data->irq, data);
input_unregister_device(data->input_dev);
kfree(data->object_table);
+ if (!IS_ERR(data->regulator))
+ regulator_disable(data->regulator);
kfree(data);
return 0;
@@ -39,7 +39,6 @@ struct mxt_platform_data {
unsigned int y_size;
unsigned int blen;
unsigned int threshold;
- unsigned int voltage;
unsigned char orient;
unsigned long irqflags;
bool is_tp;