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