#include <linux/of.h>
#include <linux/slab.h>
#include <linux/gpio/consumer.h>
+#include <linux/property.h>
#include <asm/unaligned.h>
#include <media/v4l2-device.h>
#include <media/v4l2-ioctl.h>
mxt_stop(data);
}
-#ifdef CONFIG_OF
-static const struct mxt_platform_data *mxt_parse_dt(struct i2c_client *client)
+static const struct mxt_platform_data *
+mxt_parse_device_properties(struct i2c_client *client)
{
+ static const char keymap_property[] = "linux,gpio-keymap";
struct mxt_platform_data *pdata;
- struct device_node *np = client->dev.of_node;
u32 *keymap;
- int proplen, ret;
-
- if (!np)
- return ERR_PTR(-ENOENT);
+ int n_keys;
+ int error;
pdata = devm_kzalloc(&client->dev, sizeof(*pdata), GFP_KERNEL);
if (!pdata)
return ERR_PTR(-ENOMEM);
- if (of_find_property(np, "linux,gpio-keymap", &proplen)) {
- pdata->t19_num_keys = proplen / sizeof(u32);
+ if (device_property_present(&client->dev, keymap_property)) {
+ n_keys = device_property_read_u32_array(&client->dev,
+ keymap_property,
+ NULL, 0);
+ if (n_keys <= 0) {
+ error = n_keys < 0 ? n_keys : -EINVAL;
+ dev_err(&client->dev,
+ "invalid/malformed '%s' property: %d\n",
+ keymap_property, error);
+ return ERR_PTR(error);
+ }
- keymap = devm_kzalloc(&client->dev,
- pdata->t19_num_keys * sizeof(keymap[0]),
- GFP_KERNEL);
+ keymap = devm_kmalloc_array(&client->dev, n_keys, sizeof(u32),
+ GFP_KERNEL);
if (!keymap)
return ERR_PTR(-ENOMEM);
- ret = of_property_read_u32_array(np, "linux,gpio-keymap",
- keymap, pdata->t19_num_keys);
- if (ret)
- dev_warn(&client->dev,
- "Couldn't read linux,gpio-keymap: %d\n", ret);
+ error = device_property_read_u32_array(&client->dev,
+ keymap_property,
+ keymap, n_keys);
+ if (error) {
+ dev_err(&client->dev,
+ "failed to parse '%s' property: %d\n",
+ keymap_property, error);
+ return ERR_PTR(error);
+ }
pdata->t19_keymap = keymap;
+ pdata->t19_num_keys = n_keys;
}
return pdata;
}
-#else
-static const struct mxt_platform_data *mxt_parse_dt(struct i2c_client *client)
-{
- return ERR_PTR(-ENOENT);
-}
-#endif
#ifdef CONFIG_ACPI
if (pdata)
return pdata;
- pdata = mxt_parse_dt(client);
- if (!IS_ERR(pdata) || PTR_ERR(pdata) != -ENOENT)
- return pdata;
-
pdata = mxt_parse_acpi(client);
if (!IS_ERR(pdata) || PTR_ERR(pdata) != -ENOENT)
return pdata;
- dev_err(&client->dev, "No platform data specified\n");
- return ERR_PTR(-EINVAL);
+ return mxt_parse_device_properties(client);
}
static const struct dmi_system_id chromebook_T9_suspend_dmi[] = {