|
@@ -21,6 +21,7 @@
|
|
#include <linux/err.h>
|
|
#include <linux/err.h>
|
|
#include <linux/module.h>
|
|
#include <linux/module.h>
|
|
#include <linux/interrupt.h>
|
|
#include <linux/interrupt.h>
|
|
|
|
+#include <linux/of_device.h>
|
|
#include <linux/mfd/core.h>
|
|
#include <linux/mfd/core.h>
|
|
#include <linux/mfd/max14577.h>
|
|
#include <linux/mfd/max14577.h>
|
|
#include <linux/mfd/max14577-private.h>
|
|
#include <linux/mfd/max14577-private.h>
|
|
@@ -37,6 +38,14 @@ static struct mfd_cell max14577_devs[] = {
|
|
{ .name = "max14577-charger", },
|
|
{ .name = "max14577-charger", },
|
|
};
|
|
};
|
|
|
|
|
|
|
|
+static struct of_device_id max14577_dt_match[] = {
|
|
|
|
+ {
|
|
|
|
+ .compatible = "maxim,max14577",
|
|
|
|
+ .data = (void *)MAXIM_DEVICE_TYPE_MAX14577,
|
|
|
|
+ },
|
|
|
|
+ {},
|
|
|
|
+};
|
|
|
|
+
|
|
static bool max14577_muic_volatile_reg(struct device *dev, unsigned int reg)
|
|
static bool max14577_muic_volatile_reg(struct device *dev, unsigned int reg)
|
|
{
|
|
{
|
|
switch (reg) {
|
|
switch (reg) {
|
|
@@ -83,13 +92,34 @@ static const struct regmap_irq_chip max14577_irq_chip = {
|
|
.num_irqs = ARRAY_SIZE(max14577_irqs),
|
|
.num_irqs = ARRAY_SIZE(max14577_irqs),
|
|
};
|
|
};
|
|
|
|
|
|
|
|
+static void max14577_print_dev_type(struct max14577 *max14577)
|
|
|
|
+{
|
|
|
|
+ u8 reg_data, vendor_id, device_id;
|
|
|
|
+ int ret;
|
|
|
|
+
|
|
|
|
+ ret = max14577_read_reg(max14577->regmap, MAX14577_REG_DEVICEID,
|
|
|
|
+ ®_data);
|
|
|
|
+ if (ret) {
|
|
|
|
+ dev_err(max14577->dev,
|
|
|
|
+ "Failed to read DEVICEID register: %d\n", ret);
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ vendor_id = ((reg_data & DEVID_VENDORID_MASK) >>
|
|
|
|
+ DEVID_VENDORID_SHIFT);
|
|
|
|
+ device_id = ((reg_data & DEVID_DEVICEID_MASK) >>
|
|
|
|
+ DEVID_DEVICEID_SHIFT);
|
|
|
|
+
|
|
|
|
+ dev_info(max14577->dev, "Device type: %u (ID: 0x%x, vendor: 0x%x)\n",
|
|
|
|
+ max14577->dev_type, device_id, vendor_id);
|
|
|
|
+}
|
|
|
|
+
|
|
static int max14577_i2c_probe(struct i2c_client *i2c,
|
|
static int max14577_i2c_probe(struct i2c_client *i2c,
|
|
const struct i2c_device_id *id)
|
|
const struct i2c_device_id *id)
|
|
{
|
|
{
|
|
struct max14577 *max14577;
|
|
struct max14577 *max14577;
|
|
struct max14577_platform_data *pdata = dev_get_platdata(&i2c->dev);
|
|
struct max14577_platform_data *pdata = dev_get_platdata(&i2c->dev);
|
|
struct device_node *np = i2c->dev.of_node;
|
|
struct device_node *np = i2c->dev.of_node;
|
|
- u8 reg_data;
|
|
|
|
int ret = 0;
|
|
int ret = 0;
|
|
|
|
|
|
if (np) {
|
|
if (np) {
|
|
@@ -122,19 +152,17 @@ static int max14577_i2c_probe(struct i2c_client *i2c,
|
|
return ret;
|
|
return ret;
|
|
}
|
|
}
|
|
|
|
|
|
- ret = max14577_read_reg(max14577->regmap, MAX14577_REG_DEVICEID,
|
|
|
|
- ®_data);
|
|
|
|
- if (ret) {
|
|
|
|
- dev_err(max14577->dev, "Device not found on this channel: %d\n",
|
|
|
|
- ret);
|
|
|
|
- return ret;
|
|
|
|
|
|
+ if (np) {
|
|
|
|
+ const struct of_device_id *of_id;
|
|
|
|
+
|
|
|
|
+ of_id = of_match_device(max14577_dt_match, &i2c->dev);
|
|
|
|
+ if (of_id)
|
|
|
|
+ max14577->dev_type = (unsigned int)of_id->data;
|
|
|
|
+ } else {
|
|
|
|
+ max14577->dev_type = id->driver_data;
|
|
}
|
|
}
|
|
- max14577->vendor_id = ((reg_data & DEVID_VENDORID_MASK) >>
|
|
|
|
- DEVID_VENDORID_SHIFT);
|
|
|
|
- max14577->device_id = ((reg_data & DEVID_DEVICEID_MASK) >>
|
|
|
|
- DEVID_DEVICEID_SHIFT);
|
|
|
|
- dev_info(max14577->dev, "Device ID: 0x%x, vendor: 0x%x\n",
|
|
|
|
- max14577->device_id, max14577->vendor_id);
|
|
|
|
|
|
+
|
|
|
|
+ max14577_print_dev_type(max14577);
|
|
|
|
|
|
ret = regmap_add_irq_chip(max14577->regmap, max14577->irq,
|
|
ret = regmap_add_irq_chip(max14577->regmap, max14577->irq,
|
|
IRQF_TRIGGER_FALLING | IRQF_ONESHOT, 0,
|
|
IRQF_TRIGGER_FALLING | IRQF_ONESHOT, 0,
|
|
@@ -173,7 +201,7 @@ static int max14577_i2c_remove(struct i2c_client *i2c)
|
|
}
|
|
}
|
|
|
|
|
|
static const struct i2c_device_id max14577_i2c_id[] = {
|
|
static const struct i2c_device_id max14577_i2c_id[] = {
|
|
- { "max14577", 0 },
|
|
|
|
|
|
+ { "max14577", MAXIM_DEVICE_TYPE_MAX14577, },
|
|
{ }
|
|
{ }
|
|
};
|
|
};
|
|
MODULE_DEVICE_TABLE(i2c, max14577_i2c_id);
|
|
MODULE_DEVICE_TABLE(i2c, max14577_i2c_id);
|
|
@@ -216,11 +244,6 @@ static int max14577_resume(struct device *dev)
|
|
}
|
|
}
|
|
#endif /* CONFIG_PM_SLEEP */
|
|
#endif /* CONFIG_PM_SLEEP */
|
|
|
|
|
|
-static struct of_device_id max14577_dt_match[] = {
|
|
|
|
- { .compatible = "maxim,max14577", },
|
|
|
|
- {},
|
|
|
|
-};
|
|
|
|
-
|
|
|
|
static SIMPLE_DEV_PM_OPS(max14577_pm, max14577_suspend, max14577_resume);
|
|
static SIMPLE_DEV_PM_OPS(max14577_pm, max14577_suspend, max14577_resume);
|
|
|
|
|
|
static struct i2c_driver max14577_i2c_driver = {
|
|
static struct i2c_driver max14577_i2c_driver = {
|
|
@@ -237,6 +260,9 @@ static struct i2c_driver max14577_i2c_driver = {
|
|
|
|
|
|
static int __init max14577_i2c_init(void)
|
|
static int __init max14577_i2c_init(void)
|
|
{
|
|
{
|
|
|
|
+ BUILD_BUG_ON(ARRAY_SIZE(max14577_i2c_id) != MAXIM_DEVICE_TYPE_NUM);
|
|
|
|
+ BUILD_BUG_ON(ARRAY_SIZE(max14577_dt_match) != MAXIM_DEVICE_TYPE_NUM);
|
|
|
|
+
|
|
return i2c_add_driver(&max14577_i2c_driver);
|
|
return i2c_add_driver(&max14577_i2c_driver);
|
|
}
|
|
}
|
|
subsys_initcall(max14577_i2c_init);
|
|
subsys_initcall(max14577_i2c_init);
|