gpio: pcf857x: use client->irq for gpio_to_irq()
6e20a0a429
(gpio: pcf857x: enable gpio_to_irq() support)
added gpio_to_irq() support on pcf857x driver,
but it used pdata->irq.
This patch modifies driver to use client->irq instead of it.
It modifies kzm9g board platform settings,
and device probe information too.
This patch is tested on kzm9g board
Reported-by: Christian Engelmayer <christian.engelmayer@frequentis.com>
Acked-by: Simon Horman <horms+renesas@verge.net.au>
Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
This commit is contained in:
Родитель
86605cfe8c
Коммит
805f864ebe
|
@ -548,7 +548,6 @@ static struct platform_device fsi_ak4648_device = {
|
||||||
/* I2C */
|
/* I2C */
|
||||||
static struct pcf857x_platform_data pcf8575_pdata = {
|
static struct pcf857x_platform_data pcf8575_pdata = {
|
||||||
.gpio_base = GPIO_PCF8575_BASE,
|
.gpio_base = GPIO_PCF8575_BASE,
|
||||||
.irq = intcs_evt2irq(0x3260), /* IRQ19 */
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct i2c_board_info i2c0_devices[] = {
|
static struct i2c_board_info i2c0_devices[] = {
|
||||||
|
@ -570,6 +569,7 @@ static struct i2c_board_info i2c1_devices[] = {
|
||||||
static struct i2c_board_info i2c3_devices[] = {
|
static struct i2c_board_info i2c3_devices[] = {
|
||||||
{
|
{
|
||||||
I2C_BOARD_INFO("pcf8575", 0x20),
|
I2C_BOARD_INFO("pcf8575", 0x20),
|
||||||
|
.irq = intcs_evt2irq(0x3260), /* IRQ19 */
|
||||||
.platform_data = &pcf8575_pdata,
|
.platform_data = &pcf8575_pdata,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
|
@ -223,11 +223,11 @@ static void pcf857x_irq_domain_cleanup(struct pcf857x *gpio)
|
||||||
|
|
||||||
static int pcf857x_irq_domain_init(struct pcf857x *gpio,
|
static int pcf857x_irq_domain_init(struct pcf857x *gpio,
|
||||||
struct pcf857x_platform_data *pdata,
|
struct pcf857x_platform_data *pdata,
|
||||||
struct device *dev)
|
struct i2c_client *client)
|
||||||
{
|
{
|
||||||
int status;
|
int status;
|
||||||
|
|
||||||
gpio->irq_domain = irq_domain_add_linear(dev->of_node,
|
gpio->irq_domain = irq_domain_add_linear(client->dev.of_node,
|
||||||
gpio->chip.ngpio,
|
gpio->chip.ngpio,
|
||||||
&pcf857x_irq_domain_ops,
|
&pcf857x_irq_domain_ops,
|
||||||
NULL);
|
NULL);
|
||||||
|
@ -235,15 +235,15 @@ static int pcf857x_irq_domain_init(struct pcf857x *gpio,
|
||||||
goto fail;
|
goto fail;
|
||||||
|
|
||||||
/* enable real irq */
|
/* enable real irq */
|
||||||
status = request_irq(pdata->irq, pcf857x_irq_demux, 0,
|
status = request_irq(client->irq, pcf857x_irq_demux, 0,
|
||||||
dev_name(dev), gpio);
|
dev_name(&client->dev), gpio);
|
||||||
if (status)
|
if (status)
|
||||||
goto fail;
|
goto fail;
|
||||||
|
|
||||||
/* enable gpio_to_irq() */
|
/* enable gpio_to_irq() */
|
||||||
INIT_WORK(&gpio->work, pcf857x_irq_demux_work);
|
INIT_WORK(&gpio->work, pcf857x_irq_demux_work);
|
||||||
gpio->chip.to_irq = pcf857x_to_irq;
|
gpio->chip.to_irq = pcf857x_to_irq;
|
||||||
gpio->irq = pdata->irq;
|
gpio->irq = client->irq;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
@ -285,8 +285,8 @@ static int pcf857x_probe(struct i2c_client *client,
|
||||||
gpio->chip.ngpio = id->driver_data;
|
gpio->chip.ngpio = id->driver_data;
|
||||||
|
|
||||||
/* enable gpio_to_irq() if platform has settings */
|
/* enable gpio_to_irq() if platform has settings */
|
||||||
if (pdata && pdata->irq) {
|
if (pdata && client->irq) {
|
||||||
status = pcf857x_irq_domain_init(gpio, pdata, &client->dev);
|
status = pcf857x_irq_domain_init(gpio, pdata, client);
|
||||||
if (status < 0) {
|
if (status < 0) {
|
||||||
dev_err(&client->dev, "irq_domain init failed\n");
|
dev_err(&client->dev, "irq_domain init failed\n");
|
||||||
goto fail;
|
goto fail;
|
||||||
|
@ -368,15 +368,6 @@ static int pcf857x_probe(struct i2c_client *client,
|
||||||
if (status < 0)
|
if (status < 0)
|
||||||
goto fail;
|
goto fail;
|
||||||
|
|
||||||
/* NOTE: these chips can issue "some pin-changed" IRQs, which we
|
|
||||||
* don't yet even try to use. Among other issues, the relevant
|
|
||||||
* genirq state isn't available to modular drivers; and most irq
|
|
||||||
* methods can't be called from sleeping contexts.
|
|
||||||
*/
|
|
||||||
|
|
||||||
dev_info(&client->dev, "%s\n",
|
|
||||||
client->irq ? " (irq ignored)" : "");
|
|
||||||
|
|
||||||
/* Let platform code set up the GPIOs and their users.
|
/* Let platform code set up the GPIOs and their users.
|
||||||
* Now is the first time anyone could use them.
|
* Now is the first time anyone could use them.
|
||||||
*/
|
*/
|
||||||
|
@ -388,13 +379,15 @@ static int pcf857x_probe(struct i2c_client *client,
|
||||||
dev_warn(&client->dev, "setup --> %d\n", status);
|
dev_warn(&client->dev, "setup --> %d\n", status);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
dev_info(&client->dev, "probed\n");
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
fail:
|
fail:
|
||||||
dev_dbg(&client->dev, "probe error %d for '%s'\n",
|
dev_dbg(&client->dev, "probe error %d for '%s'\n",
|
||||||
status, client->name);
|
status, client->name);
|
||||||
|
|
||||||
if (pdata && pdata->irq)
|
if (pdata && client->irq)
|
||||||
pcf857x_irq_domain_cleanup(gpio);
|
pcf857x_irq_domain_cleanup(gpio);
|
||||||
|
|
||||||
kfree(gpio);
|
kfree(gpio);
|
||||||
|
@ -418,7 +411,7 @@ static int pcf857x_remove(struct i2c_client *client)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pdata && pdata->irq)
|
if (pdata && client->irq)
|
||||||
pcf857x_irq_domain_cleanup(gpio);
|
pcf857x_irq_domain_cleanup(gpio);
|
||||||
|
|
||||||
status = gpiochip_remove(&gpio->chip);
|
status = gpiochip_remove(&gpio->chip);
|
||||||
|
|
|
@ -10,7 +10,6 @@
|
||||||
* @setup: optional callback issued once the GPIOs are valid
|
* @setup: optional callback issued once the GPIOs are valid
|
||||||
* @teardown: optional callback issued before the GPIOs are invalidated
|
* @teardown: optional callback issued before the GPIOs are invalidated
|
||||||
* @context: optional parameter passed to setup() and teardown()
|
* @context: optional parameter passed to setup() and teardown()
|
||||||
* @irq: optional interrupt number
|
|
||||||
*
|
*
|
||||||
* In addition to the I2C_BOARD_INFO() state appropriate to each chip,
|
* In addition to the I2C_BOARD_INFO() state appropriate to each chip,
|
||||||
* the i2c_board_info used with the pcf875x driver must provide its
|
* the i2c_board_info used with the pcf875x driver must provide its
|
||||||
|
@ -40,8 +39,6 @@ struct pcf857x_platform_data {
|
||||||
int gpio, unsigned ngpio,
|
int gpio, unsigned ngpio,
|
||||||
void *context);
|
void *context);
|
||||||
void *context;
|
void *context;
|
||||||
|
|
||||||
int irq;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* __LINUX_PCF857X_H */
|
#endif /* __LINUX_PCF857X_H */
|
||||||
|
|
Загрузка…
Ссылка в новой задаче