145d3f186SJohn Crispin /* 245d3f186SJohn Crispin * This program is free software; you can redistribute it and/or modify it 345d3f186SJohn Crispin * under the terms of the GNU General Public License version 2 as published 445d3f186SJohn Crispin * by the Free Software Foundation. 545d3f186SJohn Crispin * 697b92108SJohn Crispin * Copyright (C) 2012 John Crispin <john@phrozen.org> 745d3f186SJohn Crispin * Copyright (C) 2010 Sameer Ahmad, Lantiq GmbH 845d3f186SJohn Crispin */ 945d3f186SJohn Crispin 1045d3f186SJohn Crispin #include <linux/ioport.h> 1145d3f186SJohn Crispin #include <linux/of_platform.h> 1245d3f186SJohn Crispin 1345d3f186SJohn Crispin #include <lantiq_soc.h> 1445d3f186SJohn Crispin 1545d3f186SJohn Crispin /* Bias and regulator Setup Register */ 1645d3f186SJohn Crispin #define DCDC_BIAS_VREG0 0xa 1745d3f186SJohn Crispin /* Bias and regulator Setup Register */ 1845d3f186SJohn Crispin #define DCDC_BIAS_VREG1 0xb 1945d3f186SJohn Crispin 2045d3f186SJohn Crispin #define dcdc_w8(x, y) ltq_w8((x), dcdc_membase + (y)) 2145d3f186SJohn Crispin #define dcdc_r8(x) ltq_r8(dcdc_membase + (x)) 2245d3f186SJohn Crispin 2345d3f186SJohn Crispin static void __iomem *dcdc_membase; 2445d3f186SJohn Crispin 2545d3f186SJohn Crispin static int dcdc_probe(struct platform_device *pdev) 2645d3f186SJohn Crispin { 2745d3f186SJohn Crispin struct resource *res; 2845d3f186SJohn Crispin 2945d3f186SJohn Crispin res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 3045d3f186SJohn Crispin dcdc_membase = devm_ioremap_resource(&pdev->dev, res); 3145d3f186SJohn Crispin if (IS_ERR(dcdc_membase)) 3245d3f186SJohn Crispin return PTR_ERR(dcdc_membase); 3345d3f186SJohn Crispin 3445d3f186SJohn Crispin dev_info(&pdev->dev, "Core Voltage : %d mV\n", 3545d3f186SJohn Crispin dcdc_r8(DCDC_BIAS_VREG1) * 8); 3645d3f186SJohn Crispin 3745d3f186SJohn Crispin return 0; 3845d3f186SJohn Crispin } 3945d3f186SJohn Crispin 4045d3f186SJohn Crispin static const struct of_device_id dcdc_match[] = { 4145d3f186SJohn Crispin { .compatible = "lantiq,dcdc-xrx200" }, 4245d3f186SJohn Crispin {}, 4345d3f186SJohn Crispin }; 4445d3f186SJohn Crispin 4545d3f186SJohn Crispin static struct platform_driver dcdc_driver = { 4645d3f186SJohn Crispin .probe = dcdc_probe, 4745d3f186SJohn Crispin .driver = { 4845d3f186SJohn Crispin .name = "dcdc-xrx200", 4945d3f186SJohn Crispin .of_match_table = dcdc_match, 5045d3f186SJohn Crispin }, 5145d3f186SJohn Crispin }; 5245d3f186SJohn Crispin 5345d3f186SJohn Crispin int __init dcdc_init(void) 5445d3f186SJohn Crispin { 5545d3f186SJohn Crispin int ret = platform_driver_register(&dcdc_driver); 5645d3f186SJohn Crispin 5745d3f186SJohn Crispin if (ret) 5845d3f186SJohn Crispin pr_info("dcdc: Error registering platform driver\n"); 5945d3f186SJohn Crispin return ret; 6045d3f186SJohn Crispin } 6145d3f186SJohn Crispin 6245d3f186SJohn Crispin arch_initcall(dcdc_init); 63