xref: /linux-6.15/drivers/mfd/ab8500-sysctrl.c (revision 4e36dd33)
190550d19SMattias Nilsson /*
290550d19SMattias Nilsson  * Copyright (C) ST-Ericsson SA 2010
390550d19SMattias Nilsson  * Author: Mattias Nilsson <[email protected]> for ST Ericsson.
490550d19SMattias Nilsson  * License terms: GNU General Public License (GPL) version 2
590550d19SMattias Nilsson  */
690550d19SMattias Nilsson 
790550d19SMattias Nilsson #include <linux/err.h>
8*4e36dd33SPaul Gortmaker #include <linux/module.h>
990550d19SMattias Nilsson #include <linux/platform_device.h>
1090550d19SMattias Nilsson #include <linux/mfd/ab8500.h>
1190550d19SMattias Nilsson #include <linux/mfd/abx500.h>
1290550d19SMattias Nilsson #include <linux/mfd/ab8500/sysctrl.h>
1390550d19SMattias Nilsson 
1490550d19SMattias Nilsson static struct device *sysctrl_dev;
1590550d19SMattias Nilsson 
1690550d19SMattias Nilsson static inline bool valid_bank(u8 bank)
1790550d19SMattias Nilsson {
1890550d19SMattias Nilsson 	return ((bank == AB8500_SYS_CTRL1_BLOCK) ||
1990550d19SMattias Nilsson 		(bank == AB8500_SYS_CTRL2_BLOCK));
2090550d19SMattias Nilsson }
2190550d19SMattias Nilsson 
2290550d19SMattias Nilsson int ab8500_sysctrl_read(u16 reg, u8 *value)
2390550d19SMattias Nilsson {
2490550d19SMattias Nilsson 	u8 bank;
2590550d19SMattias Nilsson 
2690550d19SMattias Nilsson 	if (sysctrl_dev == NULL)
2790550d19SMattias Nilsson 		return -EAGAIN;
2890550d19SMattias Nilsson 
2990550d19SMattias Nilsson 	bank = (reg >> 8);
3090550d19SMattias Nilsson 	if (!valid_bank(bank))
3190550d19SMattias Nilsson 		return -EINVAL;
3290550d19SMattias Nilsson 
3390550d19SMattias Nilsson 	return abx500_get_register_interruptible(sysctrl_dev, bank,
3490550d19SMattias Nilsson 		(u8)(reg & 0xFF), value);
3590550d19SMattias Nilsson }
3690550d19SMattias Nilsson 
3790550d19SMattias Nilsson int ab8500_sysctrl_write(u16 reg, u8 mask, u8 value)
3890550d19SMattias Nilsson {
3990550d19SMattias Nilsson 	u8 bank;
4090550d19SMattias Nilsson 
4190550d19SMattias Nilsson 	if (sysctrl_dev == NULL)
4290550d19SMattias Nilsson 		return -EAGAIN;
4390550d19SMattias Nilsson 
4490550d19SMattias Nilsson 	bank = (reg >> 8);
4590550d19SMattias Nilsson 	if (!valid_bank(bank))
4690550d19SMattias Nilsson 		return -EINVAL;
4790550d19SMattias Nilsson 
4890550d19SMattias Nilsson 	return abx500_mask_and_set_register_interruptible(sysctrl_dev, bank,
4990550d19SMattias Nilsson 		(u8)(reg & 0xFF), mask, value);
5090550d19SMattias Nilsson }
5190550d19SMattias Nilsson 
5290550d19SMattias Nilsson static int __devinit ab8500_sysctrl_probe(struct platform_device *pdev)
5390550d19SMattias Nilsson {
5490550d19SMattias Nilsson 	sysctrl_dev = &pdev->dev;
5590550d19SMattias Nilsson 	return 0;
5690550d19SMattias Nilsson }
5790550d19SMattias Nilsson 
5890550d19SMattias Nilsson static int __devexit ab8500_sysctrl_remove(struct platform_device *pdev)
5990550d19SMattias Nilsson {
6090550d19SMattias Nilsson 	sysctrl_dev = NULL;
6190550d19SMattias Nilsson 	return 0;
6290550d19SMattias Nilsson }
6390550d19SMattias Nilsson 
6490550d19SMattias Nilsson static struct platform_driver ab8500_sysctrl_driver = {
6590550d19SMattias Nilsson 	.driver = {
6690550d19SMattias Nilsson 		.name = "ab8500-sysctrl",
6790550d19SMattias Nilsson 		.owner = THIS_MODULE,
6890550d19SMattias Nilsson 	},
6990550d19SMattias Nilsson 	.probe = ab8500_sysctrl_probe,
7090550d19SMattias Nilsson 	.remove = __devexit_p(ab8500_sysctrl_remove),
7190550d19SMattias Nilsson };
7290550d19SMattias Nilsson 
7390550d19SMattias Nilsson static int __init ab8500_sysctrl_init(void)
7490550d19SMattias Nilsson {
7590550d19SMattias Nilsson 	return platform_driver_register(&ab8500_sysctrl_driver);
7690550d19SMattias Nilsson }
7790550d19SMattias Nilsson subsys_initcall(ab8500_sysctrl_init);
7890550d19SMattias Nilsson 
7990550d19SMattias Nilsson MODULE_AUTHOR("Mattias Nilsson <[email protected]");
8090550d19SMattias Nilsson MODULE_DESCRIPTION("AB8500 system control driver");
8190550d19SMattias Nilsson MODULE_LICENSE("GPL v2");
82