[PATCH] i2c: s3c24xx: allow device core to setup default pin configuration

Thomas Abraham thomas.abraham at linaro.org
Mon Mar 4 09:12:11 EST 2013


On 4 March 2013 19:33, Heiko Stübner <heiko at sntech.de> wrote:
> Hi Thomas,
>
> Am Montag, 4. März 2013, 14:42:53 schrieb Thomas Abraham:
>> With device core now able to setup the default pin configuration,
>> the call to devm_pinctrl_get_select_default can be removed. And
>> the pin configuration code based on the deprecated Samsung specific
>> gpio bindings is also removed.
>>
>> Signed-off-by: Thomas Abraham <thomas.abraham at linaro.org>
>> ---
>>
>> Hi Heiko, Tomasz,
>>
>> We have to make a choice on the path forward for pinctrl support
>> on Samsung platforms. We have three cases to deal with.
>>
>> A. Samsung platforms without DT support.
>> B. Samsung platforms with DT support using old Samsung specific
>>    gpio bindings for pin-configuration (s3c24xx and s3x64xx).
>> C. Samsung platforms with DT support using using pinctrl based
>>    pin-configurations (Exynos4 and Exynos5).
>>
>> For [A], we just let the platform specific callbacks handle the
>> pin setup. For [B] and [C], based on Linus Walleij's pin grab
>> by device core patch and subsequent discussions with him on the
>> mailing list, would it be acceptable that we discontinue support
>> for [B] in Samsung SoC device drivers. This will impact your
>> current DT work on s3c24xx and s3c64xx platforms. Pinctrl is
>> inevitable and we have to migrate to it. Instead of workarounds
>> to maintain support for [B], it might be better that we migrate
>> s3c24xx and s3c64xx platforms to pinctrl.
>>
>> Please do let us know your opinion on this.
>
> As discusses in the other thread, I'm in favor of going forward this way and
> not to invest unnecessary energy in keeping the non-pinctrl stuff alive.
>
> Pinctrl for at least the s3c2416 [0] is already on my playground-wishlist, but
> I'm still in the process of getting to know it.
>
> So for this patch:
> Acked-by: Heiko Stuebner <heiko at sntech.de>
>
>
> Heiko
>
>
> [0] in contrast to what the gpio-samsung driver implies, the s3c24xx pin banks
> are not uniform between SoCs, making this more difficult still :-)

Hi Heiko,

Thanks for the Ack. If the common samsung pinctrl support
(pinctrl-samsung.c) is not well suited for s3c24xx platforms, we could
write a separate pinctrl driver for s3c24xx platforms. But I guess we
might be able to support s3c24xx which some changes to existing code.
If there is anything that I can help with here, please do let me know.

Thanks,
Thomas.

>
>
>>  drivers/i2c/busses/i2c-s3c2410.c |   67
>> +------------------------------------- 1 files changed, 1 insertions(+),
>> 66 deletions(-)
>>
>> diff --git a/drivers/i2c/busses/i2c-s3c2410.c
>> b/drivers/i2c/busses/i2c-s3c2410.c index f6b880b..703272c 100644
>> --- a/drivers/i2c/busses/i2c-s3c2410.c
>> +++ b/drivers/i2c/busses/i2c-s3c2410.c
>> @@ -37,8 +37,6 @@
>>  #include <linux/slab.h>
>>  #include <linux/io.h>
>>  #include <linux/of_i2c.h>
>> -#include <linux/of_gpio.h>
>> -#include <linux/pinctrl/consumer.h>
>>
>>  #include <asm/irq.h>
>>
>> @@ -84,8 +82,6 @@ struct s3c24xx_i2c {
>>       struct i2c_adapter      adap;
>>
>>       struct s3c2410_platform_i2c     *pdata;
>> -     int                     gpios[2];
>> -     struct pinctrl          *pctrl;
>>  #ifdef CONFIG_CPU_FREQ
>>       struct notifier_block   freq_transition;
>>  #endif
>> @@ -856,57 +852,6 @@ static inline void
>> s3c24xx_i2c_deregister_cpufreq(struct s3c24xx_i2c *i2c) }
>>  #endif
>>
>> -#ifdef CONFIG_OF
>> -static int s3c24xx_i2c_parse_dt_gpio(struct s3c24xx_i2c *i2c)
>> -{
>> -     int idx, gpio, ret;
>> -
>> -     if (i2c->quirks & QUIRK_NO_GPIO)
>> -             return 0;
>> -
>> -     for (idx = 0; idx < 2; idx++) {
>> -             gpio = of_get_gpio(i2c->dev->of_node, idx);
>> -             if (!gpio_is_valid(gpio)) {
>> -                     dev_err(i2c->dev, "invalid gpio[%d]: %d\n", idx, gpio);
>> -                     goto free_gpio;
>> -             }
>> -             i2c->gpios[idx] = gpio;
>> -
>> -             ret = gpio_request(gpio, "i2c-bus");
>> -             if (ret) {
>> -                     dev_err(i2c->dev, "gpio [%d] request failed\n", gpio);
>> -                     goto free_gpio;
>> -             }
>> -     }
>> -     return 0;
>> -
>> -free_gpio:
>> -     while (--idx >= 0)
>> -             gpio_free(i2c->gpios[idx]);
>> -     return -EINVAL;
>> -}
>> -
>> -static void s3c24xx_i2c_dt_gpio_free(struct s3c24xx_i2c *i2c)
>> -{
>> -     unsigned int idx;
>> -
>> -     if (i2c->quirks & QUIRK_NO_GPIO)
>> -             return;
>> -
>> -     for (idx = 0; idx < 2; idx++)
>> -             gpio_free(i2c->gpios[idx]);
>> -}
>> -#else
>> -static int s3c24xx_i2c_parse_dt_gpio(struct s3c24xx_i2c *i2c)
>> -{
>> -     return 0;
>> -}
>> -
>> -static void s3c24xx_i2c_dt_gpio_free(struct s3c24xx_i2c *i2c)
>> -{
>> -}
>> -#endif
>> -
>>  /* s3c24xx_i2c_init
>>   *
>>   * initialise the controller, set the IO lines and frequency
>> @@ -1054,15 +999,9 @@ static int s3c24xx_i2c_probe(struct platform_device
>> *pdev) i2c->adap.algo_data = i2c;
>>       i2c->adap.dev.parent = &pdev->dev;
>>
>> -     i2c->pctrl = devm_pinctrl_get_select_default(i2c->dev);
>> -
>>       /* inititalise the i2c gpio lines */
>> -
>> -     if (i2c->pdata->cfg_gpio) {
>> +     if (i2c->pdata->cfg_gpio)
>>               i2c->pdata->cfg_gpio(to_platform_device(i2c->dev));
>> -     } else if (IS_ERR(i2c->pctrl) && s3c24xx_i2c_parse_dt_gpio(i2c)) {
>> -             return -EINVAL;
>> -     }
>>
>>       /* initialise the i2c controller */
>>
>> @@ -1140,10 +1079,6 @@ static int s3c24xx_i2c_remove(struct platform_device
>> *pdev) i2c_del_adapter(&i2c->adap);
>>
>>       clk_disable_unprepare(i2c->clk);
>> -
>> -     if (pdev->dev.of_node && IS_ERR(i2c->pctrl))
>> -             s3c24xx_i2c_dt_gpio_free(i2c);
>> -
>>       return 0;
>>  }
>



More information about the linux-arm-kernel mailing list