Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

clk: bd718x7: Support ROHM BD71828 clk block

BD71828GW is a single-chip power management IC for battery-powered portable
devices. Add support for controlling BD71828 clk using bd718x7 driver.

Signed-off-by: Matti Vaittinen <matti.vaittinen@fi.rohmeurope.com>
Acked-by: Stephen Boyd <sboyd@kernel.org>
Signed-off-by: Lee Jones <lee.jones@linaro.org>

authored by

Matti Vaittinen and committed by
Lee Jones
ae866dec e795bf72

+31 -29
+3 -3
drivers/clk/Kconfig
··· 305 305 Support for Marvell MMP2 and MMP3 SoC clocks 306 306 307 307 config COMMON_CLK_BD718XX 308 - tristate "Clock driver for ROHM BD718x7 PMIC" 309 - depends on MFD_ROHM_BD718XX || MFD_ROHM_BD70528 308 + tristate "Clock driver for 32K clk gates on ROHM PMICs" 309 + depends on MFD_ROHM_BD718XX || MFD_ROHM_BD70528 || MFD_ROHM_BD71828 310 310 help 311 - This driver supports ROHM BD71837, ROHM BD71847 and 311 + This driver supports ROHM BD71837, ROHM BD71847, ROHM BD71828 and 312 312 ROHM BD70528 PMICs clock gates. 313 313 314 314 config COMMON_CLK_FIXED_MMIO
+28 -10
drivers/clk/clk-bd718x7.c
··· 7 7 #include <linux/err.h> 8 8 #include <linux/platform_device.h> 9 9 #include <linux/slab.h> 10 - #include <linux/mfd/rohm-bd718x7.h> 11 - #include <linux/mfd/rohm-bd70528.h> 10 + #include <linux/mfd/rohm-generic.h> 12 11 #include <linux/clk-provider.h> 13 12 #include <linux/clkdev.h> 14 13 #include <linux/regmap.h> 14 + 15 + /* clk control registers */ 16 + /* BD70528 */ 17 + #define BD70528_REG_OUT32K 0x2c 18 + /* BD71828 */ 19 + #define BD71828_REG_OUT32K 0x4B 20 + /* BD71837 and BD71847 */ 21 + #define BD718XX_REG_OUT32K 0x2E 22 + 23 + /* 24 + * BD71837, BD71847, BD70528 and BD71828 all use bit [0] to clk output control 25 + */ 26 + #define CLK_OUT_EN_MASK BIT(0) 27 + 15 28 16 29 struct bd718xx_clk { 17 30 struct clk_hw hw; ··· 34 21 struct rohm_regmap_dev *mfd; 35 22 }; 36 23 37 - static int bd71837_clk_set(struct clk_hw *hw, int status) 24 + static int bd71837_clk_set(struct bd718xx_clk *c, unsigned int status) 38 25 { 39 - struct bd718xx_clk *c = container_of(hw, struct bd718xx_clk, hw); 40 - 41 26 return regmap_update_bits(c->mfd->regmap, c->reg, c->mask, status); 42 27 } 43 28 ··· 44 33 int rv; 45 34 struct bd718xx_clk *c = container_of(hw, struct bd718xx_clk, hw); 46 35 47 - rv = bd71837_clk_set(hw, 0); 36 + rv = bd71837_clk_set(c, 0); 48 37 if (rv) 49 38 dev_dbg(&c->pdev->dev, "Failed to disable 32K clk (%d)\n", rv); 50 39 } 51 40 52 41 static int bd71837_clk_enable(struct clk_hw *hw) 53 42 { 54 - return bd71837_clk_set(hw, 1); 43 + struct bd718xx_clk *c = container_of(hw, struct bd718xx_clk, hw); 44 + 45 + return bd71837_clk_set(c, 0xffffffff); 55 46 } 56 47 57 48 static int bd71837_clk_is_enabled(struct clk_hw *hw) ··· 105 92 case ROHM_CHIP_TYPE_BD71837: 106 93 case ROHM_CHIP_TYPE_BD71847: 107 94 c->reg = BD718XX_REG_OUT32K; 108 - c->mask = BD718XX_OUT32K_EN; 95 + c->mask = CLK_OUT_EN_MASK; 96 + break; 97 + case ROHM_CHIP_TYPE_BD71828: 98 + c->reg = BD71828_REG_OUT32K; 99 + c->mask = CLK_OUT_EN_MASK; 109 100 break; 110 101 case ROHM_CHIP_TYPE_BD70528: 111 - c->reg = BD70528_REG_CLK_OUT; 112 - c->mask = BD70528_CLK_OUT_EN_MASK; 102 + c->reg = BD70528_REG_OUT32K; 103 + c->mask = CLK_OUT_EN_MASK; 113 104 break; 114 105 default: 115 106 dev_err(&pdev->dev, "Unknown clk chip\n"); ··· 143 126 { "bd71837-clk", ROHM_CHIP_TYPE_BD71837 }, 144 127 { "bd71847-clk", ROHM_CHIP_TYPE_BD71847 }, 145 128 { "bd70528-clk", ROHM_CHIP_TYPE_BD70528 }, 129 + { "bd71828-clk", ROHM_CHIP_TYPE_BD71828 }, 146 130 { }, 147 131 }; 148 132 MODULE_DEVICE_TABLE(platform, bd718x7_clk_id);
-6
include/linux/mfd/rohm-bd70528.h
··· 89 89 #define BD70528_REG_GPIO3_OUT 0x52 90 90 #define BD70528_REG_GPIO4_OUT 0x54 91 91 92 - /* clk control */ 93 - 94 - #define BD70528_REG_CLK_OUT 0x2c 95 - 96 92 /* RTC */ 97 93 98 94 #define BD70528_REG_RTC_COUNT_H 0x2d ··· 304 308 #define BD70528_GPIO_OUT_MASK 0x1 305 309 306 310 #define BD70528_GPIO_IN_STATE_BASE 1 307 - 308 - #define BD70528_CLK_OUT_EN_MASK 0x1 309 311 310 312 /* RTC masks to mask out reserved bits */ 311 313
-4
include/linux/mfd/rohm-bd71828.h
··· 183 183 #define BD71828_REG_CHG_STATE 0x65 184 184 #define BD71828_REG_CHG_FULL 0xd2 185 185 186 - /* CLK */ 187 - #define BD71828_REG_OUT32K 0x4B 188 - 189 186 /* LEDs */ 190 187 #define BD71828_REG_LED_CTRL 0x4A 191 188 #define BD71828_MASK_LED_AMBER 0x80 ··· 414 417 #define BD71828_INT_RTC1_MASK 0x2 415 418 #define BD71828_INT_RTC2_MASK 0x4 416 419 417 - #define BD71828_OUT32K_EN 0x1 418 420 #define BD71828_OUT_TYPE_MASK 0x2 419 421 #define BD71828_OUT_TYPE_OPEN_DRAIN 0x0 420 422 #define BD71828_OUT_TYPE_CMOS 0x2
-6
include/linux/mfd/rohm-bd718x7.h
··· 191 191 #define IRQ_ON_REQ 0x02 192 192 #define IRQ_STBY_REQ 0x01 193 193 194 - /* BD718XX_REG_OUT32K bits */ 195 - #define BD718XX_OUT32K_EN 0x01 196 - 197 - /* BD7183XX gated clock rate */ 198 - #define BD718XX_CLK_RATE 32768 199 - 200 194 /* ROHM BD718XX irqs */ 201 195 enum { 202 196 BD718XX_INT_STBY_REQ,