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

rtc: rk808: reduce 'struct rk808' usage

Reduce usage of 'struct rk808' (driver data of the parent MFD), so
that only the chip variant field is still being accessed directly.
This allows restructuring the MFD driver to support SPI based
PMICs.

Acked-by: Alexandre Belloni <alexandre.belloni@bootlin.com>
Signed-off-by: Sebastian Reichel <sebastian.reichel@collabora.com>
Link: https://lore.kernel.org/r/20221020204251.108565-4-sebastian.reichel@collabora.com
Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com>

authored by

Sebastian Reichel and committed by
Alexandre Belloni
2e830ccc 21b8a1dd

+20 -27
+20 -27
drivers/rtc/rtc-rk808.c
··· 14 14 #include <linux/bcd.h> 15 15 #include <linux/mfd/rk808.h> 16 16 #include <linux/platform_device.h> 17 - #include <linux/i2c.h> 18 17 19 18 /* RTC_CTRL_REG bitfields */ 20 19 #define BIT_RTC_CTRL_REG_STOP_RTC_M BIT(0) ··· 50 51 }; 51 52 52 53 struct rk808_rtc { 53 - struct rk808 *rk808; 54 + struct regmap *regmap; 54 55 struct rtc_device *rtc; 55 56 struct rk_rtc_compat_reg *creg; 56 57 int irq; ··· 96 97 static int rk808_rtc_readtime(struct device *dev, struct rtc_time *tm) 97 98 { 98 99 struct rk808_rtc *rk808_rtc = dev_get_drvdata(dev); 99 - struct rk808 *rk808 = rk808_rtc->rk808; 100 100 u8 rtc_data[NUM_TIME_REGS]; 101 101 int ret; 102 102 103 103 /* Force an update of the shadowed registers right now */ 104 - ret = regmap_update_bits(rk808->regmap, rk808_rtc->creg->ctrl_reg, 104 + ret = regmap_update_bits(rk808_rtc->regmap, rk808_rtc->creg->ctrl_reg, 105 105 BIT_RTC_CTRL_REG_RTC_GET_TIME, 106 106 BIT_RTC_CTRL_REG_RTC_GET_TIME); 107 107 if (ret) { ··· 114 116 * 32khz. If we clear the GET_TIME bit here, the time of i2c transfer 115 117 * certainly more than 31.25us: 16 * 2.5us at 400kHz bus frequency. 116 118 */ 117 - ret = regmap_update_bits(rk808->regmap, rk808_rtc->creg->ctrl_reg, 119 + ret = regmap_update_bits(rk808_rtc->regmap, rk808_rtc->creg->ctrl_reg, 118 120 BIT_RTC_CTRL_REG_RTC_GET_TIME, 119 121 0); 120 122 if (ret) { ··· 122 124 return ret; 123 125 } 124 126 125 - ret = regmap_bulk_read(rk808->regmap, rk808_rtc->creg->seconds_reg, 127 + ret = regmap_bulk_read(rk808_rtc->regmap, rk808_rtc->creg->seconds_reg, 126 128 rtc_data, NUM_TIME_REGS); 127 129 if (ret) { 128 130 dev_err(dev, "Failed to bulk read rtc_data: %d\n", ret); ··· 146 148 static int rk808_rtc_set_time(struct device *dev, struct rtc_time *tm) 147 149 { 148 150 struct rk808_rtc *rk808_rtc = dev_get_drvdata(dev); 149 - struct rk808 *rk808 = rk808_rtc->rk808; 150 151 u8 rtc_data[NUM_TIME_REGS]; 151 152 int ret; 152 153 ··· 160 163 rtc_data[6] = bin2bcd(tm->tm_wday); 161 164 162 165 /* Stop RTC while updating the RTC registers */ 163 - ret = regmap_update_bits(rk808->regmap, rk808_rtc->creg->ctrl_reg, 166 + ret = regmap_update_bits(rk808_rtc->regmap, rk808_rtc->creg->ctrl_reg, 164 167 BIT_RTC_CTRL_REG_STOP_RTC_M, 165 168 BIT_RTC_CTRL_REG_STOP_RTC_M); 166 169 if (ret) { ··· 168 171 return ret; 169 172 } 170 173 171 - ret = regmap_bulk_write(rk808->regmap, rk808_rtc->creg->seconds_reg, 174 + ret = regmap_bulk_write(rk808_rtc->regmap, rk808_rtc->creg->seconds_reg, 172 175 rtc_data, NUM_TIME_REGS); 173 176 if (ret) { 174 177 dev_err(dev, "Failed to bull write rtc_data: %d\n", ret); 175 178 return ret; 176 179 } 177 180 /* Start RTC again */ 178 - ret = regmap_update_bits(rk808->regmap, rk808_rtc->creg->ctrl_reg, 181 + ret = regmap_update_bits(rk808_rtc->regmap, rk808_rtc->creg->ctrl_reg, 179 182 BIT_RTC_CTRL_REG_STOP_RTC_M, 0); 180 183 if (ret) { 181 184 dev_err(dev, "Failed to update RTC control: %d\n", ret); ··· 188 191 static int rk808_rtc_readalarm(struct device *dev, struct rtc_wkalrm *alrm) 189 192 { 190 193 struct rk808_rtc *rk808_rtc = dev_get_drvdata(dev); 191 - struct rk808 *rk808 = rk808_rtc->rk808; 192 194 u8 alrm_data[NUM_ALARM_REGS]; 193 195 uint32_t int_reg; 194 196 int ret; 195 197 196 - ret = regmap_bulk_read(rk808->regmap, 198 + ret = regmap_bulk_read(rk808_rtc->regmap, 197 199 rk808_rtc->creg->alarm_seconds_reg, 198 200 alrm_data, NUM_ALARM_REGS); 199 201 if (ret) { ··· 208 212 alrm->time.tm_year = (bcd2bin(alrm_data[5] & YEARS_REG_MSK)) + 100; 209 213 rockchip_to_gregorian(&alrm->time); 210 214 211 - ret = regmap_read(rk808->regmap, rk808_rtc->creg->int_reg, &int_reg); 215 + ret = regmap_read(rk808_rtc->regmap, rk808_rtc->creg->int_reg, &int_reg); 212 216 if (ret) { 213 217 dev_err(dev, "Failed to read RTC INT REG: %d\n", ret); 214 218 return ret; ··· 224 228 225 229 static int rk808_rtc_stop_alarm(struct rk808_rtc *rk808_rtc) 226 230 { 227 - struct rk808 *rk808 = rk808_rtc->rk808; 228 231 int ret; 229 232 230 - ret = regmap_update_bits(rk808->regmap, rk808_rtc->creg->int_reg, 233 + ret = regmap_update_bits(rk808_rtc->regmap, rk808_rtc->creg->int_reg, 231 234 BIT_RTC_INTERRUPTS_REG_IT_ALARM_M, 0); 232 235 233 236 return ret; ··· 234 239 235 240 static int rk808_rtc_start_alarm(struct rk808_rtc *rk808_rtc) 236 241 { 237 - struct rk808 *rk808 = rk808_rtc->rk808; 238 242 int ret; 239 243 240 - ret = regmap_update_bits(rk808->regmap, rk808_rtc->creg->int_reg, 244 + ret = regmap_update_bits(rk808_rtc->regmap, rk808_rtc->creg->int_reg, 241 245 BIT_RTC_INTERRUPTS_REG_IT_ALARM_M, 242 246 BIT_RTC_INTERRUPTS_REG_IT_ALARM_M); 243 247 ··· 246 252 static int rk808_rtc_setalarm(struct device *dev, struct rtc_wkalrm *alrm) 247 253 { 248 254 struct rk808_rtc *rk808_rtc = dev_get_drvdata(dev); 249 - struct rk808 *rk808 = rk808_rtc->rk808; 250 255 u8 alrm_data[NUM_ALARM_REGS]; 251 256 int ret; 252 257 ··· 265 272 alrm_data[4] = bin2bcd(alrm->time.tm_mon + 1); 266 273 alrm_data[5] = bin2bcd(alrm->time.tm_year - 100); 267 274 268 - ret = regmap_bulk_write(rk808->regmap, 275 + ret = regmap_bulk_write(rk808_rtc->regmap, 269 276 rk808_rtc->creg->alarm_seconds_reg, 270 277 alrm_data, NUM_ALARM_REGS); 271 278 if (ret) { ··· 306 313 static irqreturn_t rk808_alarm_irq(int irq, void *data) 307 314 { 308 315 struct rk808_rtc *rk808_rtc = data; 309 - struct rk808 *rk808 = rk808_rtc->rk808; 310 - struct i2c_client *client = rk808->i2c; 311 316 int ret; 312 317 313 - ret = regmap_write(rk808->regmap, rk808_rtc->creg->status_reg, 318 + ret = regmap_write(rk808_rtc->regmap, rk808_rtc->creg->status_reg, 314 319 RTC_STATUS_MASK); 315 320 if (ret) { 316 - dev_err(&client->dev, 321 + dev_err(&rk808_rtc->rtc->dev, 317 322 "%s:Failed to update RTC status: %d\n", __func__, ret); 318 323 return ret; 319 324 } 320 325 321 326 rtc_update_irq(rk808_rtc->rtc, 1, RTC_IRQF | RTC_AF); 322 - dev_dbg(&client->dev, 327 + dev_dbg(&rk808_rtc->rtc->dev, 323 328 "%s:irq=%d\n", __func__, irq); 324 329 return IRQ_HANDLED; 325 330 } ··· 395 404 break; 396 405 } 397 406 platform_set_drvdata(pdev, rk808_rtc); 398 - rk808_rtc->rk808 = rk808; 407 + rk808_rtc->regmap = dev_get_regmap(pdev->dev.parent, NULL); 408 + if (!rk808_rtc->regmap) 409 + return -ENODEV; 399 410 400 411 /* start rtc running by default, and use shadowed timer. */ 401 - ret = regmap_update_bits(rk808->regmap, rk808_rtc->creg->ctrl_reg, 412 + ret = regmap_update_bits(rk808_rtc->regmap, rk808_rtc->creg->ctrl_reg, 402 413 BIT_RTC_CTRL_REG_STOP_RTC_M | 403 414 BIT_RTC_CTRL_REG_RTC_READSEL_M, 404 415 BIT_RTC_CTRL_REG_RTC_READSEL_M); ··· 410 417 return ret; 411 418 } 412 419 413 - ret = regmap_write(rk808->regmap, rk808_rtc->creg->status_reg, 420 + ret = regmap_write(rk808_rtc->regmap, rk808_rtc->creg->status_reg, 414 421 RTC_STATUS_MASK); 415 422 if (ret) { 416 423 dev_err(&pdev->dev,