mbox series

[v2,0/5] support a new type of PMIC???including two chips(rk817 and rk809)

Message ID 1533023850-29004-1-git-send-email-tony.xie@rock-chips.com
Headers show
Series support a new type of PMIC???including two chips(rk817 and rk809) | expand

Message

Tony Xie July 31, 2018, 7:57 a.m. UTC
Most of functions and registers of the rk817 and rk808 are the same,
so they can share allmost all codes.

Their specifications are as follows:
  1) The RK809 and RK809 consist of 5 DCDCs, 9 LDOs and have the same registers
     for these components except dcdc5.
  2) The dcdc5 is a boost dcdc for RK817 and is a buck for RK809.
  3) The RK817 has one switch but The Rk809 has two.

Changes in V2:
1. initialize the pm_pwroff_fn to NULL. 
2. use EXPORT_SYMBOL_GPL to export pm_power_off_prepare.
3. change patch 2/3/4/5 subjects. 

Tony Xie (5):
  mfd: rk808: Add RK817 and RK809 support
  regulator: rk808: add RK809 and RK817 support.
  dt-bindings: mfd: rk808: Add binding informations for RK809 and RK817.
  RTC: RK808: add RK809 and RK817 support.
  clk: RK808: add RK809 and RK817 support.

 Documentation/devicetree/bindings/mfd/rk808.txt |  55 ++
 drivers/clk/Kconfig                             |   6 +-
 drivers/clk/clk-rk808.c                         |  62 ++-
 drivers/mfd/Kconfig                             |   6 +-
 drivers/mfd/rk808.c                             | 218 +++++++-
 drivers/regulator/Kconfig                       |   4 +-
 drivers/regulator/rk808-regulator.c             | 633 +++++++++++++++++++++++-
 drivers/rtc/Kconfig                             |   4 +-
 drivers/rtc/rtc-rk808.c                         |  68 ++-
 include/linux/mfd/rk808.h                       | 175 +++++++
 kernel/reboot.c                                 |   1 +
 11 files changed, 1203 insertions(+), 29 deletions(-)

Comments

Alexandre Belloni July 31, 2018, 8:10 a.m. UTC | #1
Hi,

I insist this must be a lowercase "rtc: rk808:". There has not been a
single upper case RTC in a subject since 2011.


On 31/07/2018 15:57:29+0800, Tony Xie wrote:
> RK809 and RK817 are power management IC chips for multimedia products.
> Most of their functions and registers are same, including the rtc.
> 
> Signed-off-by: Tony Xie <tony.xie@rock-chips.com>
> ---
>  drivers/rtc/Kconfig     |  4 +--
>  drivers/rtc/rtc-rk808.c | 68 +++++++++++++++++++++++++++++++++++++++----------
>  2 files changed, 56 insertions(+), 16 deletions(-)
> 
> diff --git a/drivers/rtc/Kconfig b/drivers/rtc/Kconfig
> index a2ba5db..1aaf935 100644
> --- a/drivers/rtc/Kconfig
> +++ b/drivers/rtc/Kconfig
> @@ -371,11 +371,11 @@ config RTC_DRV_MAX77686
>  	  will be called rtc-max77686.
>  
>  config RTC_DRV_RK808
> -	tristate "Rockchip RK805/RK808/RK818 RTC"
> +	tristate "Rockchip RK805/RK808/RK809/RK817/RK818 RTC"
>  	depends on MFD_RK808
>  	help
>  	  If you say yes here you will get support for the
> -	  RTC of RK805, RK808 and RK818 PMIC.
> +	  RTC of RK805, RK809 and RK817, RK808 and RK818 PMIC.
>  
>  	  This driver can also be built as a module. If so, the module
>  	  will be called rk808-rtc.
> diff --git a/drivers/rtc/rtc-rk808.c b/drivers/rtc/rtc-rk808.c
> index 739c0d4..5bacdaf 100644
> --- a/drivers/rtc/rtc-rk808.c
> +++ b/drivers/rtc/rtc-rk808.c
> @@ -50,9 +50,18 @@
>  #define NUM_TIME_REGS	(RK808_WEEKS_REG - RK808_SECONDS_REG + 1)
>  #define NUM_ALARM_REGS	(RK808_ALARM_YEARS_REG - RK808_ALARM_SECONDS_REG + 1)
>  
> +struct rk_rtc_compat_reg {
> +	unsigned int ctrl_reg;
> +	unsigned int status_reg;
> +	unsigned int alarm_seconds_reg;
> +	unsigned int int_reg;
> +	unsigned int seconds_reg;
> +};
> +
>  struct rk808_rtc {
>  	struct rk808 *rk808;
>  	struct rtc_device *rtc;
> +	struct rk_rtc_compat_reg *creg;
>  	int irq;
>  };
>  
> @@ -101,7 +110,7 @@ static int rk808_rtc_readtime(struct device *dev, struct rtc_time *tm)
>  	int ret;
>  
>  	/* Force an update of the shadowed registers right now */
> -	ret = regmap_update_bits(rk808->regmap, RK808_RTC_CTRL_REG,
> +	ret = regmap_update_bits(rk808->regmap, rk808_rtc->creg->ctrl_reg,
>  				 BIT_RTC_CTRL_REG_RTC_GET_TIME,
>  				 BIT_RTC_CTRL_REG_RTC_GET_TIME);
>  	if (ret) {
> @@ -115,7 +124,7 @@ static int rk808_rtc_readtime(struct device *dev, struct rtc_time *tm)
>  	 * 32khz. If we clear the GET_TIME bit here, the time of i2c transfer
>  	 * certainly more than 31.25us: 16 * 2.5us at 400kHz bus frequency.
>  	 */
> -	ret = regmap_update_bits(rk808->regmap, RK808_RTC_CTRL_REG,
> +	ret = regmap_update_bits(rk808->regmap, rk808_rtc->creg->ctrl_reg,
>  				 BIT_RTC_CTRL_REG_RTC_GET_TIME,
>  				 0);
>  	if (ret) {
> @@ -123,7 +132,7 @@ static int rk808_rtc_readtime(struct device *dev, struct rtc_time *tm)
>  		return ret;
>  	}
>  
> -	ret = regmap_bulk_read(rk808->regmap, RK808_SECONDS_REG,
> +	ret = regmap_bulk_read(rk808->regmap, rk808_rtc->creg->seconds_reg,
>  			       rtc_data, NUM_TIME_REGS);
>  	if (ret) {
>  		dev_err(dev, "Failed to bulk read rtc_data: %d\n", ret);
> @@ -166,7 +175,7 @@ static int rk808_rtc_set_time(struct device *dev, struct rtc_time *tm)
>  	rtc_data[6] = bin2bcd(tm->tm_wday);
>  
>  	/* Stop RTC while updating the RTC registers */
> -	ret = regmap_update_bits(rk808->regmap, RK808_RTC_CTRL_REG,
> +	ret = regmap_update_bits(rk808->regmap, rk808_rtc->creg->ctrl_reg,
>  				 BIT_RTC_CTRL_REG_STOP_RTC_M,
>  				 BIT_RTC_CTRL_REG_STOP_RTC_M);
>  	if (ret) {
> @@ -174,14 +183,14 @@ static int rk808_rtc_set_time(struct device *dev, struct rtc_time *tm)
>  		return ret;
>  	}
>  
> -	ret = regmap_bulk_write(rk808->regmap, RK808_SECONDS_REG,
> +	ret = regmap_bulk_write(rk808->regmap, rk808_rtc->creg->seconds_reg,
>  				rtc_data, NUM_TIME_REGS);
>  	if (ret) {
>  		dev_err(dev, "Failed to bull write rtc_data: %d\n", ret);
>  		return ret;
>  	}
>  	/* Start RTC again */
> -	ret = regmap_update_bits(rk808->regmap, RK808_RTC_CTRL_REG,
> +	ret = regmap_update_bits(rk808->regmap, rk808_rtc->creg->ctrl_reg,
>  				 BIT_RTC_CTRL_REG_STOP_RTC_M, 0);
>  	if (ret) {
>  		dev_err(dev, "Failed to update RTC control: %d\n", ret);
> @@ -199,8 +208,13 @@ static int rk808_rtc_readalarm(struct device *dev, struct rtc_wkalrm *alrm)
>  	uint32_t int_reg;
>  	int ret;
>  
> -	ret = regmap_bulk_read(rk808->regmap, RK808_ALARM_SECONDS_REG,
> +	ret = regmap_bulk_read(rk808->regmap,
> +			       rk808_rtc->creg->alarm_seconds_reg,
>  			       alrm_data, NUM_ALARM_REGS);
> +	if (ret) {
> +		dev_err(dev, "Failed to read RTC alarm date REG: %d\n", ret);
> +		return ret;
> +	}
>  
>  	alrm->time.tm_sec = bcd2bin(alrm_data[0] & SECONDS_REG_MSK);
>  	alrm->time.tm_min = bcd2bin(alrm_data[1] & MINUTES_REG_MAK);
> @@ -210,7 +224,7 @@ static int rk808_rtc_readalarm(struct device *dev, struct rtc_wkalrm *alrm)
>  	alrm->time.tm_year = (bcd2bin(alrm_data[5] & YEARS_REG_MSK)) + 100;
>  	rockchip_to_gregorian(&alrm->time);
>  
> -	ret = regmap_read(rk808->regmap, RK808_RTC_INT_REG, &int_reg);
> +	ret = regmap_read(rk808->regmap, rk808_rtc->creg->int_reg, &int_reg);
>  	if (ret) {
>  		dev_err(dev, "Failed to read RTC INT REG: %d\n", ret);
>  		return ret;
> @@ -231,7 +245,7 @@ static int rk808_rtc_stop_alarm(struct rk808_rtc *rk808_rtc)
>  	struct rk808 *rk808 = rk808_rtc->rk808;
>  	int ret;
>  
> -	ret = regmap_update_bits(rk808->regmap, RK808_RTC_INT_REG,
> +	ret = regmap_update_bits(rk808->regmap, rk808_rtc->creg->int_reg,
>  				 BIT_RTC_INTERRUPTS_REG_IT_ALARM_M, 0);
>  
>  	return ret;
> @@ -242,7 +256,7 @@ static int rk808_rtc_start_alarm(struct rk808_rtc *rk808_rtc)
>  	struct rk808 *rk808 = rk808_rtc->rk808;
>  	int ret;
>  
> -	ret = regmap_update_bits(rk808->regmap, RK808_RTC_INT_REG,
> +	ret = regmap_update_bits(rk808->regmap, rk808_rtc->creg->int_reg,
>  				 BIT_RTC_INTERRUPTS_REG_IT_ALARM_M,
>  				 BIT_RTC_INTERRUPTS_REG_IT_ALARM_M);
>  
> @@ -274,7 +288,8 @@ static int rk808_rtc_setalarm(struct device *dev, struct rtc_wkalrm *alrm)
>  	alrm_data[4] = bin2bcd(alrm->time.tm_mon + 1);
>  	alrm_data[5] = bin2bcd(alrm->time.tm_year - 100);
>  
> -	ret = regmap_bulk_write(rk808->regmap, RK808_ALARM_SECONDS_REG,
> +	ret = regmap_bulk_write(rk808->regmap,
> +				rk808_rtc->creg->alarm_seconds_reg,
>  				alrm_data, NUM_ALARM_REGS);
>  	if (ret) {
>  		dev_err(dev, "Failed to bulk write: %d\n", ret);
> @@ -318,7 +333,7 @@ static irqreturn_t rk808_alarm_irq(int irq, void *data)
>  	struct i2c_client *client = rk808->i2c;
>  	int ret;
>  
> -	ret = regmap_write(rk808->regmap, RK808_RTC_STATUS_REG,
> +	ret = regmap_write(rk808->regmap, rk808_rtc->creg->status_reg,
>  			   RTC_STATUS_MASK);
>  	if (ret) {
>  		dev_err(&client->dev,
> @@ -371,6 +386,22 @@ static int rk808_rtc_resume(struct device *dev)
>  static SIMPLE_DEV_PM_OPS(rk808_rtc_pm_ops,
>  	rk808_rtc_suspend, rk808_rtc_resume);
>  
> +static struct rk_rtc_compat_reg rk808_creg = {
> +	.ctrl_reg = RK808_RTC_CTRL_REG,
> +	.status_reg = RK808_RTC_STATUS_REG,
> +	.alarm_seconds_reg = RK808_ALARM_SECONDS_REG,
> +	.int_reg = RK808_RTC_INT_REG,
> +	.seconds_reg = RK808_SECONDS_REG,
> +};
> +
> +static struct rk_rtc_compat_reg rk817_creg = {
> +	.ctrl_reg = RK817_RTC_CTRL_REG,
> +	.status_reg = RK817_RTC_STATUS_REG,
> +	.alarm_seconds_reg = RK817_ALARM_SECONDS_REG,
> +	.int_reg = RK817_RTC_INT_REG,
> +	.seconds_reg = RK817_SECONDS_REG,
> +};
> +
>  static int rk808_rtc_probe(struct platform_device *pdev)
>  {
>  	struct rk808 *rk808 = dev_get_drvdata(pdev->dev.parent);
> @@ -381,11 +412,20 @@ static int rk808_rtc_probe(struct platform_device *pdev)
>  	if (rk808_rtc == NULL)
>  		return -ENOMEM;
>  
> +	switch (rk808->variant) {
> +	case RK809_ID:
> +	case RK817_ID:
> +		rk808_rtc->creg = &rk817_creg;
> +		break;
> +	default:
> +		rk808_rtc->creg = &rk808_creg;
> +		break;
> +	}
>  	platform_set_drvdata(pdev, rk808_rtc);
>  	rk808_rtc->rk808 = rk808;
>  
>  	/* start rtc running by default, and use shadowed timer. */
> -	ret = regmap_update_bits(rk808->regmap, RK808_RTC_CTRL_REG,
> +	ret = regmap_update_bits(rk808->regmap, rk808_rtc->creg->ctrl_reg,
>  				 BIT_RTC_CTRL_REG_STOP_RTC_M |
>  				 BIT_RTC_CTRL_REG_RTC_READSEL_M,
>  				 BIT_RTC_CTRL_REG_RTC_READSEL_M);
> @@ -395,7 +435,7 @@ static int rk808_rtc_probe(struct platform_device *pdev)
>  		return ret;
>  	}
>  
> -	ret = regmap_write(rk808->regmap, RK808_RTC_STATUS_REG,
> +	ret = regmap_write(rk808->regmap, rk808_rtc->creg->status_reg,
>  			   RTC_STATUS_MASK);
>  	if (ret) {
>  		dev_err(&pdev->dev,
> -- 
> 1.9.1
> 
>
Stephen Boyd Aug. 1, 2018, 3:18 p.m. UTC | #2
Quoting Tony Xie (2018-07-31 01:00:29)
> diff --git a/drivers/clk/Kconfig b/drivers/clk/Kconfig
> index 721572a..fc1427c 100644
> --- a/drivers/clk/Kconfig
> +++ b/drivers/clk/Kconfig
> @@ -46,11 +46,11 @@ config COMMON_CLK_MAX77686
>           clock.
>  
>  config COMMON_CLK_RK808
> -       tristate "Clock driver for RK805/RK808/RK818"
> +       tristate "Clock driver for RK805/RK808/RK809/RK817/RK818"
>         depends on MFD_RK808
>         ---help---
> -         This driver supports RK805, RK808 and RK818 crystal oscillator clock. These
> -         multi-function devices have two fixed-rate oscillators,
> +         This driver supports RK805, RK809 and RK817, RK808 and RK818 crystal oscillator clock.
> +          These multi-function devices have two fixed-rate oscillators,

Something got messed up with the indentation here. Please fix.

>           clocked at 32KHz each. Clkout1 is always on, Clkout2 can off
>           by control register.
>
Heiko Stübner Aug. 2, 2018, 11:16 a.m. UTC | #3
Hi Tony,

Am Dienstag, 31. Juli 2018, 09:57:28 CEST schrieb Tony Xie:
> Add device tree bindings documentation for Rockchip's RK809 & RK817 PMIC.
> 
> Signed-off-by: Tony Xie <tony.xie@rock-chips.com>

I don't see the devicetree binding maintainers listed in the recipient
list, so adding them in the next iteration might increase your chances
to get an Ack on the binding.

scripts/get_maintainer.pl -f Documentation/devicetree/bindings lists

Rob Herring <robh+dt@kernel.org>
Mark Rutland <mark.rutland@arm.com>

as the main dt maintainers.

[...]

> @@ -99,6 +147,13 @@ number as described in RK818 datasheet.
>  	- HDMI_SWITCH
>  	- OTG_SWITCH
>  
> +There are three pins needed to config, named "gpio_ts" "gpio_gt" "gpio_slp".
> +	The gpio_gt and gpio_ts pins support the gpio function.
> +	The gpio_slp pin is for controlling the pmic states, as below:
> +		- reset
> +		- power down
> +		- sleep
> +

Is this common for all rk8xx pmics or just the two new ones?
As the paragraph above makes it sound like these are present on all
and I didn't find mention of them in the datasheets for previous pmics
I have.

Also to me it is not clear in what way these should be used and I didn't
find any mention of them at all in the rest of your series.


Heiko