#define MAG3110_ID (0xC4)
#define MAG3110_XYZ_DATA_LEN (6)
#define MAG3110_STATUS_ZYXDR (0x08)
-#define MAG3110_IRQ_USED (1)
#define MAG3110_AC_MASK (0x01)
#define MAG3110_AC_OFFSET (0)
#define MAG3110_DR_MODE_MASK (0x7 << 5)
u8 ctl_reg1;
int active;
int position;
+ int use_irq;
};
static short MAGHAL[8][3][3] = {
{
struct mag3110_data *data;
u8 tmp_data[MAG3110_XYZ_DATA_LEN];
-#if !MAG3110_IRQ_USED
int retry = 3;
int result;
-#endif
+
if (!mag3110_pdata || mag3110_pdata->active == MAG_STANDBY)
return -EINVAL;
data = mag3110_pdata;
-#if MAG3110_IRQ_USED
- if (!wait_event_interruptible_timeout
+ if (data->use_irq && !wait_event_interruptible_timeout
(data->waitq, data->data_ready != 0,
msecs_to_jiffies(INT_TIMEOUT))) {
dev_dbg(&data->client->dev, "interrupt not received\n");
return -ETIME;
}
-#else
+
do {
msleep(1);
result = i2c_smbus_read_byte_data(data->client,
/* Clear data_ready flag after data is read out */
if (retry == 0)
return -EINVAL;
-#endif
data->data_ready = 0;
report_abs();
}
-#if MAG3110_IRQ_USED
static irqreturn_t mag3110_irq_handler(int irq, void *dev_id)
{
int result;
return IRQ_HANDLED;
}
-#endif
static ssize_t mag3110_enable_show(struct device *dev,
struct device_attribute *attr, char *buf)
const struct i2c_device_id *id)
{
struct i2c_adapter *adapter;
- struct input_dev *idev;
+ struct input_dev *idev = NULL;
struct mag3110_data *data;
int ret = 0;
struct regulator *vdd, *vdd_io;
u32 pos = 0;
struct device_node *of_node = client->dev.of_node;
-#if MAG3110_IRQ_USED
- struct irq_data *irq_data = irq_get_irq_data(client->irq);
u32 irq_flag;
+ struct irq_data *irq_data = NULL;
bool shared_irq = of_property_read_bool(of_node, "shared-interrupt");
-#endif
+
vdd = NULL;
vdd_io = NULL;
goto error_rm_dev_sysfs;
}
+ if (client->irq > 0) {
+ data->use_irq = 1;
+ irq_data = irq_get_irq_data(client->irq);
+ }
+
/*input poll device register */
data->poll_dev = input_allocate_polled_device();
if (!data->poll_dev) {
goto error_rm_poll_dev;
}
-#if MAG3110_IRQ_USED
- irq_flag = irqd_get_trigger_type(irq_data);
- irq_flag |= IRQF_ONESHOT;
- if (shared_irq)
- irq_flag |= IRQF_SHARED;
- ret = request_threaded_irq(client->irq, NULL, mag3110_irq_handler,
- irq_flag, client->dev.driver->name, idev);
- if (ret < 0) {
- dev_err(&client->dev, "failed to register irq %d!\n",
- client->irq);
- goto error_rm_dev_sysfs;
+ if (data->use_irq) {
+ irq_flag = irqd_get_trigger_type(irq_data);
+ irq_flag |= IRQF_ONESHOT;
+ if (shared_irq)
+ irq_flag |= IRQF_SHARED;
+ ret = request_threaded_irq(client->irq, NULL, mag3110_irq_handler,
+ irq_flag, client->dev.driver->name, idev);
+ if (ret < 0) {
+ dev_err(&client->dev, "failed to register irq %d!\n",
+ client->irq);
+ goto error_rm_dev_sysfs;
+ }
}
-#endif
+
/* Initialize mag3110 chip */
mag3110_init_client(client);
mag3110_pdata = data;