From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-11.2 required=3.0 tests=BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI,NICE_REPLY_A, SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_SANE_1 autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 5B7B3C56201 for ; Thu, 12 Nov 2020 13:19:23 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id E4C6322248 for ; Thu, 12 Nov 2020 13:19:22 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727789AbgKLNTW (ORCPT ); Thu, 12 Nov 2020 08:19:22 -0500 Received: from mail-out.m-online.net ([212.18.0.9]:53851 "EHLO mail-out.m-online.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727790AbgKLNTV (ORCPT ); Thu, 12 Nov 2020 08:19:21 -0500 Received: from frontend01.mail.m-online.net (unknown [192.168.8.182]) by mail-out.m-online.net (Postfix) with ESMTP id 4CX2Hp4g0cz1qtdr; Thu, 12 Nov 2020 14:19:18 +0100 (CET) Received: from localhost (dynscan1.mnet-online.de [192.168.6.70]) by mail.m-online.net (Postfix) with ESMTP id 4CX2Hp40BCz1sQ4B; Thu, 12 Nov 2020 14:19:18 +0100 (CET) X-Virus-Scanned: amavisd-new at mnet-online.de Received: from mail.mnet-online.de ([192.168.8.182]) by localhost (dynscan1.mail.m-online.net [192.168.6.70]) (amavisd-new, port 10024) with ESMTP id SAoLcSUOqGdw; Thu, 12 Nov 2020 14:19:15 +0100 (CET) X-Auth-Info: G7jKRKeaB8KlWrqG5SkbojJon7wyOD+6lXSO5kngzAs= Received: from [10.88.0.186] (dslb-094-220-156-233.094.220.pools.vodafone-ip.de [94.220.156.233]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.mnet-online.de (Postfix) with ESMTPSA; Thu, 12 Nov 2020 14:19:15 +0100 (CET) Subject: Re: [PATCH v2 1/3] rtc: rx6110: add i2c support To: Alessandro Zummo , Alexandre Belloni , linux-rtc@vger.kernel.org, linux-kernel@vger.kernel.org Cc: Henning Schild , Johannes Hahn References: <20201112130734.331094-1-ch@denx.de> <20201112130734.331094-2-ch@denx.de> From: Claudius Heine Organization: Denx Software Engineering Message-ID: <18a10da6-fd57-0584-603e-5104222bc081@denx.de> Date: Thu, 12 Nov 2020 14:19:15 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.3.1 MIME-Version: 1.0 In-Reply-To: <20201112130734.331094-2-ch@denx.de> Content-Type: text/plain; charset=utf-8; format=flowed Content-Language: en-US Content-Transfer-Encoding: 7bit Precedence: bulk List-ID: X-Mailing-List: linux-rtc@vger.kernel.org Hi, Sorry, I forgot to remove some unused variables (both `err` variables in the spi and i2c probe functions). Will fix that in the next patch version. Cheers, Claudius On 2020-11-12 14:07, Claudius Heine wrote: > The RX6110 also supports I2C, so this patch adds support for it to the > driver. > > This also renames the SPI specific functions and variables to include > `_spi_` in their names. > > Signed-off-by: Claudius Heine > Signed-off-by: Henning Schild > --- > drivers/rtc/Kconfig | 20 ++--- > drivers/rtc/rtc-rx6110.c | 165 +++++++++++++++++++++++++++++++++------ > 2 files changed, 154 insertions(+), 31 deletions(-) > > diff --git a/drivers/rtc/Kconfig b/drivers/rtc/Kconfig > index 65ad9d0b47ab..1fe411ffb19c 100644 > --- a/drivers/rtc/Kconfig > +++ b/drivers/rtc/Kconfig > @@ -817,15 +817,6 @@ config RTC_DRV_RX4581 > This driver can also be built as a module. If so the module > will be called rtc-rx4581. > > -config RTC_DRV_RX6110 > - tristate "Epson RX-6110" > - select REGMAP_SPI > - help > - If you say yes here you will get support for the Epson RX-6610. > - > - This driver can also be built as a module. If so the module > - will be called rtc-rx6110. > - > config RTC_DRV_RS5C348 > tristate "Ricoh RS5C348A/B" > help > @@ -936,6 +927,17 @@ config RTC_DRV_RV3029_HWMON > Say Y here if you want to expose temperature sensor data on > rtc-rv3029. > > +config RTC_DRV_RX6110 > + tristate "Epson RX-6110" > + depends on RTC_I2C_AND_SPI > + select REGMAP_SPI if SPI_MASTER > + select REGMAP_I2C if I2C > + help > + If you say yes here you will get support for the Epson RX-6610. > + > + This driver can also be built as a module. If so the module > + will be called rtc-rx6110. > + > comment "Platform RTC drivers" > > # this 'CMOS' RTC driver is arch dependent because it requires > diff --git a/drivers/rtc/rtc-rx6110.c b/drivers/rtc/rtc-rx6110.c > index 3a9eb7043f01..1e6e9b19c81c 100644 > --- a/drivers/rtc/rtc-rx6110.c > +++ b/drivers/rtc/rtc-rx6110.c > @@ -16,6 +16,7 @@ > #include > #include > #include > +#include > > /* RX-6110 Register definitions */ > #define RX6110_REG_SEC 0x10 > @@ -310,6 +311,27 @@ static const struct rtc_class_ops rx6110_rtc_ops = { > .set_time = rx6110_set_time, > }; > > +static int rx6110_probe(struct rx6110_data *rx6110, struct device *dev) > +{ > + int err; > + > + rx6110->rtc = devm_rtc_device_register(dev, > + RX6110_DRIVER_NAME, > + &rx6110_rtc_ops, THIS_MODULE); > + > + if (IS_ERR(rx6110->rtc)) > + return PTR_ERR(rx6110->rtc); > + > + err = rx6110_init(rx6110); > + if (err) > + return err; > + > + rx6110->rtc->max_user_freq = 1; > + > + return 0; > +} > + > +#ifdef CONFIG_SPI_MASTER > static struct regmap_config regmap_spi_config = { > .reg_bits = 8, > .val_bits = 8, > @@ -318,10 +340,10 @@ static struct regmap_config regmap_spi_config = { > }; > > /** > - * rx6110_probe - initialize rtc driver > + * rx6110_spi_probe - initialize rtc driver > * @spi: pointer to spi device > */ > -static int rx6110_probe(struct spi_device *spi) > +static int rx6110_spi_probe(struct spi_device *spi) > { > struct rx6110_data *rx6110; > int err; > @@ -346,27 +368,14 @@ static int rx6110_probe(struct spi_device *spi) > > spi_set_drvdata(spi, rx6110); > > - rx6110->rtc = devm_rtc_device_register(&spi->dev, > - RX6110_DRIVER_NAME, > - &rx6110_rtc_ops, THIS_MODULE); > - > - if (IS_ERR(rx6110->rtc)) > - return PTR_ERR(rx6110->rtc); > - > - err = rx6110_init(rx6110); > - if (err) > - return err; > - > - rx6110->rtc->max_user_freq = 1; > - > - return 0; > + return rx6110_probe(rx6110, &spi->dev); > } > > -static const struct spi_device_id rx6110_id[] = { > +static const struct spi_device_id rx6110_spi_id[] = { > { "rx6110", 0 }, > { } > }; > -MODULE_DEVICE_TABLE(spi, rx6110_id); > +MODULE_DEVICE_TABLE(spi, rx6110_spi_id); > > static const struct of_device_id rx6110_spi_of_match[] = { > { .compatible = "epson,rx6110" }, > @@ -374,16 +383,128 @@ static const struct of_device_id rx6110_spi_of_match[] = { > }; > MODULE_DEVICE_TABLE(of, rx6110_spi_of_match); > > -static struct spi_driver rx6110_driver = { > +static struct spi_driver rx6110_spi_driver = { > .driver = { > .name = RX6110_DRIVER_NAME, > .of_match_table = of_match_ptr(rx6110_spi_of_match), > }, > - .probe = rx6110_probe, > - .id_table = rx6110_id, > + .probe = rx6110_spi_probe, > + .id_table = rx6110_spi_id, > }; > > -module_spi_driver(rx6110_driver); > +static int rx6110_spi_register(void) > +{ > + return spi_register_driver(&rx6110_spi_driver); > +} > + > +static void rx6110_spi_unregister(void) > +{ > + spi_unregister_driver(&rx6110_spi_driver); > +} > +#else > +static int rx6110_spi_register(void) > +{ > + return 0; > +} > + > +static void rx6110_spi_unregister(void) > +{ > +} > +#endif /* CONFIG_SPI_MASTER */ > + > +#ifdef CONFIG_I2C > +static struct regmap_config regmap_i2c_config = { > + .reg_bits = 8, > + .val_bits = 8, > + .max_register = RX6110_REG_IRQ, > + .read_flag_mask = 0x80, > +}; > + > +static int rx6110_i2c_probe(struct i2c_client *client, > + const struct i2c_device_id *id) > +{ > + struct i2c_adapter *adapter = to_i2c_adapter(client->dev.parent); > + struct rx6110_data *rx6110; > + int err; > + > + if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA > + | I2C_FUNC_SMBUS_I2C_BLOCK)) { > + dev_err(&adapter->dev, > + "doesn't support required functionality\n"); > + return -EIO; > + } > + > + rx6110 = devm_kzalloc(&client->dev, sizeof(*rx6110), GFP_KERNEL); > + if (!rx6110) > + return -ENOMEM; > + > + rx6110->regmap = devm_regmap_init_i2c(client, ®map_i2c_config); > + if (IS_ERR(rx6110->regmap)) { > + dev_err(&client->dev, "regmap init failed for rtc rx6110\n"); > + return PTR_ERR(rx6110->regmap); > + } > + > + i2c_set_clientdata(client, rx6110); > + > + return rx6110_probe(rx6110, &client->dev); > +} > + > +static const struct i2c_device_id rx6110_i2c_id[] = { > + { "rx6110", 0 }, > + { } > +}; > +MODULE_DEVICE_TABLE(i2c, rx6110_i2c_id); > + > +static struct i2c_driver rx6110_i2c_driver = { > + .driver = { > + .name = RX6110_DRIVER_NAME, > + }, > + .probe = rx6110_i2c_probe, > + .id_table = rx6110_i2c_id, > +}; > + > +static int rx6110_i2c_register(void) > +{ > + return i2c_add_driver(&rx6110_i2c_driver); > +} > + > +static void rx6110_i2c_unregister(void) > +{ > + i2c_del_driver(&rx6110_i2c_driver); > +} > +#else > +static int rx6110_i2c_register(void) > +{ > + return 0; > +} > + > +static void rx6110_i2c_unregister(void) > +{ > +} > +#endif /* CONFIG_I2C */ > + > +static int __init rx6110_module_init(void) > +{ > + int ret; > + > + ret = rx6110_spi_register(); > + if (ret) > + return ret; > + > + ret = rx6110_i2c_register(); > + if (ret) > + rx6110_spi_unregister(); > + > + return ret; > +} > +module_init(rx6110_module_init); > + > +static void __exit rx6110_module_exit(void) > +{ > + rx6110_spi_unregister(); > + rx6110_i2c_unregister(); > +} > +module_exit(rx6110_module_exit); > > MODULE_AUTHOR("Val Krutov "); > MODULE_DESCRIPTION("RX-6110 SA RTC driver"); > -- DENX Software Engineering GmbH, Managing Director: Wolfgang Denk HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany Phone: (+49)-8142-66989-54 Fax: (+49)-8142-66989-80 Email: ch@denx.de PGP key: 6FF2 E59F 00C6 BC28 31D8 64C1 1173 CB19 9808 B153 Keyserver: hkp://pool.sks-keyservers.net