On Wed, Feb 06, 2019 at 08:16:51AM +0100, Linus Walleij wrote: > This augments the CBUS GPIO I2C driver to use GPIO > descriptors for clock, sel and data. We drop the platform > data that was only used for carrying GPIO numbers and > use machine descriptor tables instead. > > Cc: linux-omap@xxxxxxxxxxxxxxx > Cc: Tony Lindgren <tony@xxxxxxxxxxx> > Cc: Aaro Koskinen <aaro.koskinen@xxxxxx> Tested-by: Aaro Koskinen <aaro.koskinen@xxxxxx> Works now fine also on 770. Thanks, A. > Signed-off-by: Linus Walleij <linus.walleij@xxxxxxxxxx> > --- > ChangeLog v1->v2: > - Add .dev_id to the machine descriptor table so we can > actually find the right device. > - Look up GPIOs from the boardfile using proper index > instead of by name as first assumed. > - Name the dat line "CSGPIO dat" > --- > arch/arm/mach-omap1/board-nokia770.c | 18 ++--- > drivers/i2c/busses/i2c-cbus-gpio.c | 80 ++++++++------------- > include/linux/platform_data/i2c-cbus-gpio.h | 27 ------- > 3 files changed, 40 insertions(+), 85 deletions(-) > delete mode 100644 include/linux/platform_data/i2c-cbus-gpio.h > > diff --git a/arch/arm/mach-omap1/board-nokia770.c b/arch/arm/mach-omap1/board-nokia770.c > index eb41db78cd47..10848f573d37 100644 > --- a/arch/arm/mach-omap1/board-nokia770.c > +++ b/arch/arm/mach-omap1/board-nokia770.c > @@ -10,6 +10,7 @@ > #include <linux/clkdev.h> > #include <linux/irq.h> > #include <linux/gpio.h> > +#include <linux/gpio/machine.h> > #include <linux/kernel.h> > #include <linux/init.h> > #include <linux/mutex.h> > @@ -25,7 +26,6 @@ > #include <linux/platform_data/keypad-omap.h> > #include <linux/platform_data/lcd-mipid.h> > #include <linux/platform_data/gpio-omap.h> > -#include <linux/platform_data/i2c-cbus-gpio.h> > > #include <asm/mach-types.h> > #include <asm/mach/arch.h> > @@ -217,18 +217,19 @@ static inline void nokia770_mmc_init(void) > #endif > > #if IS_ENABLED(CONFIG_I2C_CBUS_GPIO) > -static struct i2c_cbus_platform_data nokia770_cbus_data = { > - .clk_gpio = OMAP_MPUIO(9), > - .dat_gpio = OMAP_MPUIO(10), > - .sel_gpio = OMAP_MPUIO(11), > +static struct gpiod_lookup_table nokia770_cbus_gpio_table = { > + .dev_id = "i2c-cbus-gpio.2", > + .table = { > + GPIO_LOOKUP_IDX("mpuio", 9, NULL, 0, 0), /* clk */ > + GPIO_LOOKUP_IDX("mpuio", 10, NULL, 1, 0), /* dat */ > + GPIO_LOOKUP_IDX("mpuio", 11, NULL, 2, 0), /* sel */ > + { }, > + }, > }; > > static struct platform_device nokia770_cbus_device = { > .name = "i2c-cbus-gpio", > .id = 2, > - .dev = { > - .platform_data = &nokia770_cbus_data, > - }, > }; > > static struct i2c_board_info nokia770_i2c_board_info_2[] __initdata = { > @@ -257,6 +258,7 @@ static void __init nokia770_cbus_init(void) > nokia770_i2c_board_info_2[1].irq = gpio_to_irq(tahvo_irq_gpio); > i2c_register_board_info(2, nokia770_i2c_board_info_2, > ARRAY_SIZE(nokia770_i2c_board_info_2)); > + gpiod_add_lookup_table(&nokia770_cbus_gpio_table); > platform_device_register(&nokia770_cbus_device); > } > #else /* CONFIG_I2C_CBUS_GPIO */ > diff --git a/drivers/i2c/busses/i2c-cbus-gpio.c b/drivers/i2c/busses/i2c-cbus-gpio.c > index b4f91e48948a..72df563477b1 100644 > --- a/drivers/i2c/busses/i2c-cbus-gpio.c > +++ b/drivers/i2c/busses/i2c-cbus-gpio.c > @@ -18,16 +18,14 @@ > > #include <linux/io.h> > #include <linux/i2c.h> > -#include <linux/gpio.h> > #include <linux/slab.h> > #include <linux/delay.h> > #include <linux/errno.h> > #include <linux/kernel.h> > #include <linux/module.h> > -#include <linux/of_gpio.h> > +#include <linux/gpio/consumer.h> > #include <linux/interrupt.h> > #include <linux/platform_device.h> > -#include <linux/platform_data/i2c-cbus-gpio.h> > > /* > * Bit counts are derived from Nokia implementation. These should be checked > @@ -39,9 +37,9 @@ > struct cbus_host { > spinlock_t lock; /* host lock */ > struct device *dev; > - int clk_gpio; > - int dat_gpio; > - int sel_gpio; > + struct gpio_desc *clk; > + struct gpio_desc *dat; > + struct gpio_desc *sel; > }; > > /** > @@ -51,9 +49,9 @@ struct cbus_host { > */ > static void cbus_send_bit(struct cbus_host *host, unsigned bit) > { > - gpio_set_value(host->dat_gpio, bit ? 1 : 0); > - gpio_set_value(host->clk_gpio, 1); > - gpio_set_value(host->clk_gpio, 0); > + gpiod_set_value(host->dat, bit ? 1 : 0); > + gpiod_set_value(host->clk, 1); > + gpiod_set_value(host->clk, 0); > } > > /** > @@ -78,9 +76,9 @@ static int cbus_receive_bit(struct cbus_host *host) > { > int ret; > > - gpio_set_value(host->clk_gpio, 1); > - ret = gpio_get_value(host->dat_gpio); > - gpio_set_value(host->clk_gpio, 0); > + gpiod_set_value(host->clk, 1); > + ret = gpiod_get_value(host->dat); > + gpiod_set_value(host->clk, 0); > return ret; > } > > @@ -123,10 +121,10 @@ static int cbus_transfer(struct cbus_host *host, char rw, unsigned dev, > spin_lock_irqsave(&host->lock, flags); > > /* Reset state and start of transfer, SEL stays down during transfer */ > - gpio_set_value(host->sel_gpio, 0); > + gpiod_set_value(host->sel, 0); > > /* Set the DAT pin to output */ > - gpio_direction_output(host->dat_gpio, 1); > + gpiod_direction_output(host->dat, 1); > > /* Send the device address */ > cbus_send_data(host, dev, CBUS_ADDR_BITS); > @@ -141,12 +139,12 @@ static int cbus_transfer(struct cbus_host *host, char rw, unsigned dev, > cbus_send_data(host, data, 16); > ret = 0; > } else { > - ret = gpio_direction_input(host->dat_gpio); > + ret = gpiod_direction_input(host->dat); > if (ret) { > dev_dbg(host->dev, "failed setting direction\n"); > goto out; > } > - gpio_set_value(host->clk_gpio, 1); > + gpiod_set_value(host->clk, 1); > > ret = cbus_receive_word(host); > if (ret < 0) { > @@ -156,9 +154,9 @@ static int cbus_transfer(struct cbus_host *host, char rw, unsigned dev, > } > > /* Indicate end of transfer, SEL goes up until next transfer */ > - gpio_set_value(host->sel_gpio, 1); > - gpio_set_value(host->clk_gpio, 1); > - gpio_set_value(host->clk_gpio, 0); > + gpiod_set_value(host->sel, 1); > + gpiod_set_value(host->clk, 1); > + gpiod_set_value(host->clk, 0); > > out: > spin_unlock_irqrestore(&host->lock, flags); > @@ -214,7 +212,6 @@ static int cbus_i2c_probe(struct platform_device *pdev) > { > struct i2c_adapter *adapter; > struct cbus_host *chost; > - int ret; > > adapter = devm_kzalloc(&pdev->dev, sizeof(struct i2c_adapter), > GFP_KERNEL); > @@ -225,22 +222,20 @@ static int cbus_i2c_probe(struct platform_device *pdev) > if (!chost) > return -ENOMEM; > > - if (pdev->dev.of_node) { > - struct device_node *dnode = pdev->dev.of_node; > - if (of_gpio_count(dnode) != 3) > - return -ENODEV; > - chost->clk_gpio = of_get_gpio(dnode, 0); > - chost->dat_gpio = of_get_gpio(dnode, 1); > - chost->sel_gpio = of_get_gpio(dnode, 2); > - } else if (dev_get_platdata(&pdev->dev)) { > - struct i2c_cbus_platform_data *pdata = > - dev_get_platdata(&pdev->dev); > - chost->clk_gpio = pdata->clk_gpio; > - chost->dat_gpio = pdata->dat_gpio; > - chost->sel_gpio = pdata->sel_gpio; > - } else { > + if (gpiod_count(&pdev->dev, NULL) != 3) > return -ENODEV; > - } > + chost->clk = devm_gpiod_get_index(&pdev->dev, NULL, 0, GPIOD_OUT_LOW); > + if (IS_ERR(chost->clk)) > + return PTR_ERR(chost->clk); > + chost->dat = devm_gpiod_get_index(&pdev->dev, NULL, 1, GPIOD_IN); > + if (IS_ERR(chost->dat)) > + return PTR_ERR(chost->dat); > + chost->sel = devm_gpiod_get_index(&pdev->dev, NULL, 2, GPIOD_OUT_HIGH); > + if (IS_ERR(chost->sel)) > + return PTR_ERR(chost->sel); > + gpiod_set_consumer_name(chost->clk, "CBUS clk"); > + gpiod_set_consumer_name(chost->dat, "CBUS dat"); > + gpiod_set_consumer_name(chost->sel, "CBUS sel"); > > adapter->owner = THIS_MODULE; > adapter->class = I2C_CLASS_HWMON; > @@ -254,21 +249,6 @@ static int cbus_i2c_probe(struct platform_device *pdev) > spin_lock_init(&chost->lock); > chost->dev = &pdev->dev; > > - ret = devm_gpio_request_one(&pdev->dev, chost->clk_gpio, > - GPIOF_OUT_INIT_LOW, "CBUS clk"); > - if (ret) > - return ret; > - > - ret = devm_gpio_request_one(&pdev->dev, chost->dat_gpio, GPIOF_IN, > - "CBUS data"); > - if (ret) > - return ret; > - > - ret = devm_gpio_request_one(&pdev->dev, chost->sel_gpio, > - GPIOF_OUT_INIT_HIGH, "CBUS sel"); > - if (ret) > - return ret; > - > i2c_set_adapdata(adapter, chost); > platform_set_drvdata(pdev, adapter); > > diff --git a/include/linux/platform_data/i2c-cbus-gpio.h b/include/linux/platform_data/i2c-cbus-gpio.h > deleted file mode 100644 > index 6faa992a9502..000000000000 > --- a/include/linux/platform_data/i2c-cbus-gpio.h > +++ /dev/null > @@ -1,27 +0,0 @@ > -/* > - * i2c-cbus-gpio.h - CBUS I2C platform_data definition > - * > - * Copyright (C) 2004-2009 Nokia Corporation > - * > - * Written by Felipe Balbi and Aaro Koskinen. > - * > - * This file is subject to the terms and conditions of the GNU General > - * Public License. See the file "COPYING" in the main directory of this > - * archive for more details. > - * > - * This program is distributed in the hope that it will be useful, > - * but WITHOUT ANY WARRANTY; without even the implied warranty of > - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > - * GNU General Public License for more details. > - */ > - > -#ifndef __INCLUDE_LINUX_I2C_CBUS_GPIO_H > -#define __INCLUDE_LINUX_I2C_CBUS_GPIO_H > - > -struct i2c_cbus_platform_data { > - int dat_gpio; > - int clk_gpio; > - int sel_gpio; > -}; > - > -#endif /* __INCLUDE_LINUX_I2C_CBUS_GPIO_H */ > -- > 2.20.1 >