Loading drivers/gpio/gpio-max732x.c +51 −11 Original line number Diff line number Diff line Loading @@ -21,6 +21,7 @@ #include <linux/irq.h> #include <linux/i2c.h> #include <linux/i2c/max732x.h> #include <linux/of.h> /* Loading Loading @@ -116,6 +117,22 @@ static const struct i2c_device_id max732x_id[] = { }; MODULE_DEVICE_TABLE(i2c, max732x_id); #ifdef CONFIG_OF static const struct of_device_id max732x_of_table[] = { { .compatible = "maxim,max7319" }, { .compatible = "maxim,max7320" }, { .compatible = "maxim,max7321" }, { .compatible = "maxim,max7322" }, { .compatible = "maxim,max7323" }, { .compatible = "maxim,max7324" }, { .compatible = "maxim,max7325" }, { .compatible = "maxim,max7326" }, { .compatible = "maxim,max7327" }, { } }; MODULE_DEVICE_TABLE(of, max732x_of_table); #endif struct max732x_chip { struct gpio_chip gpio_chip; Loading Loading @@ -457,9 +474,11 @@ static int max732x_irq_setup(struct max732x_chip *chip, int has_irq = max732x_features[id->driver_data] >> 32; int ret; if (pdata->irq_base && has_irq != INT_NONE) { if (((pdata && pdata->irq_base) || client->irq) && has_irq != INT_NONE) { int lvl; if (pdata) chip->irq_base = pdata->irq_base; chip->irq_features = has_irq; mutex_init(&chip->irq_lock); Loading Loading @@ -515,7 +534,7 @@ static int max732x_irq_setup(struct max732x_chip *chip, struct max732x_platform_data *pdata = dev_get_platdata(&client->dev); int has_irq = max732x_features[id->driver_data] >> 32; if (pdata->irq_base && has_irq != INT_NONE) if (((pdata && pdata->irq_base) || client->irq) && has_irq != INT_NONE) dev_warn(&client->dev, "interrupt support not compiled in\n"); return 0; Loading Loading @@ -574,28 +593,47 @@ static int max732x_setup_gpio(struct max732x_chip *chip, return port; } static struct max732x_platform_data *of_gpio_max732x(struct device *dev) { struct max732x_platform_data *pdata; pdata = devm_kzalloc(dev, sizeof(*pdata), GFP_KERNEL); if (!pdata) return NULL; pdata->gpio_base = -1; return pdata; } static int max732x_probe(struct i2c_client *client, const struct i2c_device_id *id) { struct max732x_platform_data *pdata; struct device_node *node; struct max732x_chip *chip; struct i2c_client *c; uint16_t addr_a, addr_b; int ret, nr_port; pdata = dev_get_platdata(&client->dev); if (pdata == NULL) { node = client->dev.of_node; if (!pdata && node) pdata = of_gpio_max732x(&client->dev); if (!pdata) { dev_dbg(&client->dev, "no platform data\n"); return -EINVAL; } chip = devm_kzalloc(&client->dev, sizeof(struct max732x_chip), GFP_KERNEL); chip = devm_kzalloc(&client->dev, sizeof(*chip), GFP_KERNEL); if (chip == NULL) return -ENOMEM; chip->client = client; nr_port = max732x_setup_gpio(chip, id, pdata->gpio_base); chip->gpio_chip.dev = &client->dev; addr_a = (client->addr & 0x0f) | 0x60; addr_b = (client->addr & 0x0f) | 0x50; Loading Loading @@ -643,7 +681,7 @@ static int max732x_probe(struct i2c_client *client, if (ret) goto out_failed; if (pdata->setup) { if (pdata && pdata->setup) { ret = pdata->setup(client, chip->gpio_chip.base, chip->gpio_chip.ngpio, pdata->context); if (ret < 0) Loading @@ -664,9 +702,10 @@ static int max732x_remove(struct i2c_client *client) { struct max732x_platform_data *pdata = dev_get_platdata(&client->dev); struct max732x_chip *chip = i2c_get_clientdata(client); if (pdata && pdata->teardown) { int ret; if (pdata->teardown) { ret = pdata->teardown(client, chip->gpio_chip.base, chip->gpio_chip.ngpio, pdata->context); if (ret < 0) { Loading @@ -691,6 +730,7 @@ static struct i2c_driver max732x_driver = { .driver = { .name = "max732x", .owner = THIS_MODULE, .of_match_table = of_match_ptr(max732x_of_table), }, .probe = max732x_probe, .remove = max732x_remove, Loading Loading
drivers/gpio/gpio-max732x.c +51 −11 Original line number Diff line number Diff line Loading @@ -21,6 +21,7 @@ #include <linux/irq.h> #include <linux/i2c.h> #include <linux/i2c/max732x.h> #include <linux/of.h> /* Loading Loading @@ -116,6 +117,22 @@ static const struct i2c_device_id max732x_id[] = { }; MODULE_DEVICE_TABLE(i2c, max732x_id); #ifdef CONFIG_OF static const struct of_device_id max732x_of_table[] = { { .compatible = "maxim,max7319" }, { .compatible = "maxim,max7320" }, { .compatible = "maxim,max7321" }, { .compatible = "maxim,max7322" }, { .compatible = "maxim,max7323" }, { .compatible = "maxim,max7324" }, { .compatible = "maxim,max7325" }, { .compatible = "maxim,max7326" }, { .compatible = "maxim,max7327" }, { } }; MODULE_DEVICE_TABLE(of, max732x_of_table); #endif struct max732x_chip { struct gpio_chip gpio_chip; Loading Loading @@ -457,9 +474,11 @@ static int max732x_irq_setup(struct max732x_chip *chip, int has_irq = max732x_features[id->driver_data] >> 32; int ret; if (pdata->irq_base && has_irq != INT_NONE) { if (((pdata && pdata->irq_base) || client->irq) && has_irq != INT_NONE) { int lvl; if (pdata) chip->irq_base = pdata->irq_base; chip->irq_features = has_irq; mutex_init(&chip->irq_lock); Loading Loading @@ -515,7 +534,7 @@ static int max732x_irq_setup(struct max732x_chip *chip, struct max732x_platform_data *pdata = dev_get_platdata(&client->dev); int has_irq = max732x_features[id->driver_data] >> 32; if (pdata->irq_base && has_irq != INT_NONE) if (((pdata && pdata->irq_base) || client->irq) && has_irq != INT_NONE) dev_warn(&client->dev, "interrupt support not compiled in\n"); return 0; Loading Loading @@ -574,28 +593,47 @@ static int max732x_setup_gpio(struct max732x_chip *chip, return port; } static struct max732x_platform_data *of_gpio_max732x(struct device *dev) { struct max732x_platform_data *pdata; pdata = devm_kzalloc(dev, sizeof(*pdata), GFP_KERNEL); if (!pdata) return NULL; pdata->gpio_base = -1; return pdata; } static int max732x_probe(struct i2c_client *client, const struct i2c_device_id *id) { struct max732x_platform_data *pdata; struct device_node *node; struct max732x_chip *chip; struct i2c_client *c; uint16_t addr_a, addr_b; int ret, nr_port; pdata = dev_get_platdata(&client->dev); if (pdata == NULL) { node = client->dev.of_node; if (!pdata && node) pdata = of_gpio_max732x(&client->dev); if (!pdata) { dev_dbg(&client->dev, "no platform data\n"); return -EINVAL; } chip = devm_kzalloc(&client->dev, sizeof(struct max732x_chip), GFP_KERNEL); chip = devm_kzalloc(&client->dev, sizeof(*chip), GFP_KERNEL); if (chip == NULL) return -ENOMEM; chip->client = client; nr_port = max732x_setup_gpio(chip, id, pdata->gpio_base); chip->gpio_chip.dev = &client->dev; addr_a = (client->addr & 0x0f) | 0x60; addr_b = (client->addr & 0x0f) | 0x50; Loading Loading @@ -643,7 +681,7 @@ static int max732x_probe(struct i2c_client *client, if (ret) goto out_failed; if (pdata->setup) { if (pdata && pdata->setup) { ret = pdata->setup(client, chip->gpio_chip.base, chip->gpio_chip.ngpio, pdata->context); if (ret < 0) Loading @@ -664,9 +702,10 @@ static int max732x_remove(struct i2c_client *client) { struct max732x_platform_data *pdata = dev_get_platdata(&client->dev); struct max732x_chip *chip = i2c_get_clientdata(client); if (pdata && pdata->teardown) { int ret; if (pdata->teardown) { ret = pdata->teardown(client, chip->gpio_chip.base, chip->gpio_chip.ngpio, pdata->context); if (ret < 0) { Loading @@ -691,6 +730,7 @@ static struct i2c_driver max732x_driver = { .driver = { .name = "max732x", .owner = THIS_MODULE, .of_match_table = of_match_ptr(max732x_of_table), }, .probe = max732x_probe, .remove = max732x_remove, Loading