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

mfd: sta2x11-mfd: Add scr (otp registers) platform driver

Signed-off-by: Davide Ciminaghi <ciminaghi@gnudd.com>
Acked-by: Alessandro Rubini <rubini@gnudd.com>
Signed-off-by: Samuel Ortiz <sameo@linux.intel.com>

authored by

Davide Ciminaghi and committed by
Samuel Ortiz
dba6c1ae e885ba29

+58 -1
+51 -1
drivers/mfd/sta2x11-mfd.c
··· 175 175 spin_unlock(lock); 176 176 } 177 177 178 + /* OTP (one time programmable registers do not require locking */ 179 + static void sta2x11_regmap_nolock(void *__lock) 180 + { 181 + } 182 + 178 183 static const char *sta2x11_mfd_names[sta2x11_n_mfd_plat_devs] = { 179 184 [sta2x11_sctl] = STA2X11_MFD_SCTL_NAME, 180 185 [sta2x11_apbreg] = STA2X11_MFD_APBREG_NAME, 181 186 [sta2x11_apb_soc_regs] = STA2X11_MFD_APB_SOC_REGS_NAME, 187 + [sta2x11_scr] = STA2X11_MFD_SCR_NAME, 182 188 }; 183 189 184 190 static bool sta2x11_sctl_writeable_reg(struct device *dev, unsigned int reg) ··· 200 194 .unlock = sta2x11_regmap_unlock, 201 195 .max_register = SCTL_SCRSTSTA, 202 196 .writeable_reg = sta2x11_sctl_writeable_reg, 197 + }; 198 + 199 + static bool sta2x11_scr_readable_reg(struct device *dev, unsigned int reg) 200 + { 201 + return (reg == STA2X11_SECR_CR) || 202 + __reg_within_range(reg, STA2X11_SECR_FVR0, STA2X11_SECR_FVR1); 203 + } 204 + 205 + static bool sta2x11_scr_writeable_reg(struct device *dev, unsigned int reg) 206 + { 207 + return false; 208 + } 209 + 210 + static struct regmap_config sta2x11_scr_regmap_config = { 211 + .reg_bits = 32, 212 + .reg_stride = 4, 213 + .val_bits = 32, 214 + .lock = sta2x11_regmap_nolock, 215 + .unlock = sta2x11_regmap_nolock, 216 + .max_register = STA2X11_SECR_FVR1, 217 + .readable_reg = sta2x11_scr_readable_reg, 218 + .writeable_reg = sta2x11_scr_writeable_reg, 203 219 }; 204 220 205 221 static bool sta2x11_apbreg_readable_reg(struct device *dev, unsigned int reg) ··· 307 279 [sta2x11_sctl] = &sta2x11_sctl_regmap_config, 308 280 [sta2x11_apbreg] = &sta2x11_apbreg_regmap_config, 309 281 [sta2x11_apb_soc_regs] = &sta2x11_apb_soc_regs_regmap_config, 282 + [sta2x11_scr] = &sta2x11_scr_regmap_config, 310 283 }; 311 284 312 - /* Probe for the three platform devices */ 285 + /* Probe for the four platform devices */ 313 286 314 287 static int sta2x11_mfd_platform_probe(struct platform_device *dev, 315 288 enum sta2x11_mfd_plat_dev index) ··· 368 339 return sta2x11_mfd_platform_probe(dev, sta2x11_apb_soc_regs); 369 340 } 370 341 342 + static int sta2x11_scr_probe(struct platform_device *dev) 343 + { 344 + return sta2x11_mfd_platform_probe(dev, sta2x11_scr); 345 + } 346 + 371 347 /* The three platform drivers */ 372 348 static struct platform_driver sta2x11_sctl_platform_driver = { 373 349 .driver = { ··· 415 381 pr_info("%s\n", __func__); 416 382 return platform_driver_register(&sta2x11_apb_soc_regs_platform_driver); 417 383 } 384 + 385 + static struct platform_driver sta2x11_scr_platform_driver = { 386 + .driver = { 387 + .name = STA2X11_MFD_SCR_NAME, 388 + .owner = THIS_MODULE, 389 + }, 390 + .probe = sta2x11_scr_probe, 391 + }; 392 + 393 + static int __init sta2x11_scr_init(void) 394 + { 395 + pr_info("%s\n", __func__); 396 + return platform_driver_register(&sta2x11_scr_platform_driver); 397 + } 398 + 418 399 419 400 /* 420 401 * What follows are the PCI devices that host the above pdevs. ··· 680 631 subsys_initcall(sta2x11_apbreg_init); 681 632 subsys_initcall(sta2x11_sctl_init); 682 633 subsys_initcall(sta2x11_apb_soc_regs_init); 634 + subsys_initcall(sta2x11_scr_init); 683 635 rootfs_initcall(sta2x11_mfd_init); 684 636 685 637 MODULE_LICENSE("GPL v2");
+7
include/linux/mfd/sta2x11-mfd.h
··· 482 482 #define COMPENSATION_REG3 0x3cc 483 483 #define TEST_CTL_REG 0x3d0 484 484 485 + /* 486 + * SECR (OTP) registers 487 + */ 488 + #define STA2X11_SECR_CR 0x00 489 + #define STA2X11_SECR_FVR0 0x10 490 + #define STA2X11_SECR_FVR1 0x14 491 + 485 492 extern int sta2x11_mfd_get_regs_data(struct platform_device *pdev, 486 493 enum sta2x11_mfd_plat_dev index, 487 494 void __iomem **regs,