12698dc22SGyungoh Yoo /* 22698dc22SGyungoh Yoo * sky81452.c SKY81452 MFD driver 32698dc22SGyungoh Yoo * 42698dc22SGyungoh Yoo * Copyright 2014 Skyworks Solutions Inc. 52698dc22SGyungoh Yoo * Author : Gyungoh Yoo <jack.yoo@skyworksinc.com> 62698dc22SGyungoh Yoo * 72698dc22SGyungoh Yoo * This program is free software; you can redistribute it and/or modify it 82698dc22SGyungoh Yoo * under the terms of the GNU General Public License version 2 92698dc22SGyungoh Yoo * as published by the Free Software Foundation. 102698dc22SGyungoh Yoo * 112698dc22SGyungoh Yoo * This program is distributed in the hope that it will be useful, but 122698dc22SGyungoh Yoo * WITHOUT ANY WARRANTY; without even the implied warranty of 132698dc22SGyungoh Yoo * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 142698dc22SGyungoh Yoo * General Public License for more details. 152698dc22SGyungoh Yoo * 162698dc22SGyungoh Yoo * You should have received a copy of the GNU General Public License along 172698dc22SGyungoh Yoo * with this program; if not, see <http://www.gnu.org/licenses/>. 182698dc22SGyungoh Yoo */ 192698dc22SGyungoh Yoo 202698dc22SGyungoh Yoo #include <linux/kernel.h> 212698dc22SGyungoh Yoo #include <linux/module.h> 222698dc22SGyungoh Yoo #include <linux/init.h> 232698dc22SGyungoh Yoo #include <linux/err.h> 242698dc22SGyungoh Yoo #include <linux/slab.h> 252698dc22SGyungoh Yoo #include <linux/i2c.h> 262698dc22SGyungoh Yoo #include <linux/regmap.h> 272698dc22SGyungoh Yoo #include <linux/mfd/core.h> 282698dc22SGyungoh Yoo #include <linux/mfd/sky81452.h> 292698dc22SGyungoh Yoo 302698dc22SGyungoh Yoo static const struct regmap_config sky81452_config = { 312698dc22SGyungoh Yoo .reg_bits = 8, 322698dc22SGyungoh Yoo .val_bits = 8, 332698dc22SGyungoh Yoo }; 342698dc22SGyungoh Yoo 352698dc22SGyungoh Yoo static int sky81452_probe(struct i2c_client *client, 362698dc22SGyungoh Yoo const struct i2c_device_id *id) 372698dc22SGyungoh Yoo { 382698dc22SGyungoh Yoo struct device *dev = &client->dev; 392698dc22SGyungoh Yoo const struct sky81452_platform_data *pdata = dev_get_platdata(dev); 402698dc22SGyungoh Yoo struct mfd_cell cells[2]; 412698dc22SGyungoh Yoo struct regmap *regmap; 422698dc22SGyungoh Yoo int ret; 432698dc22SGyungoh Yoo 442698dc22SGyungoh Yoo if (!pdata) { 452698dc22SGyungoh Yoo pdata = devm_kzalloc(dev, sizeof(*pdata), GFP_KERNEL); 462698dc22SGyungoh Yoo if (!pdata) 472698dc22SGyungoh Yoo return -ENOMEM; 482698dc22SGyungoh Yoo } 492698dc22SGyungoh Yoo 502698dc22SGyungoh Yoo regmap = devm_regmap_init_i2c(client, &sky81452_config); 512698dc22SGyungoh Yoo if (IS_ERR(regmap)) { 522698dc22SGyungoh Yoo dev_err(dev, "failed to initialize.err=%ld\n", PTR_ERR(regmap)); 532698dc22SGyungoh Yoo return PTR_ERR(regmap); 542698dc22SGyungoh Yoo } 552698dc22SGyungoh Yoo 562698dc22SGyungoh Yoo i2c_set_clientdata(client, regmap); 572698dc22SGyungoh Yoo 582698dc22SGyungoh Yoo memset(cells, 0, sizeof(cells)); 592698dc22SGyungoh Yoo cells[0].name = "sky81452-backlight"; 602698dc22SGyungoh Yoo cells[0].of_compatible = "skyworks,sky81452-backlight"; 612698dc22SGyungoh Yoo cells[0].platform_data = pdata->bl_pdata; 622698dc22SGyungoh Yoo cells[0].pdata_size = sizeof(*pdata->bl_pdata); 632698dc22SGyungoh Yoo cells[1].name = "sky81452-regulator"; 642698dc22SGyungoh Yoo cells[1].platform_data = pdata->regulator_init_data; 652698dc22SGyungoh Yoo cells[1].pdata_size = sizeof(*pdata->regulator_init_data); 662698dc22SGyungoh Yoo 6769633beaSLaxman Dewangan ret = devm_mfd_add_devices(dev, -1, cells, ARRAY_SIZE(cells), 6869633beaSLaxman Dewangan NULL, 0, NULL); 692698dc22SGyungoh Yoo if (ret) 702698dc22SGyungoh Yoo dev_err(dev, "failed to add child devices. err=%d\n", ret); 712698dc22SGyungoh Yoo 722698dc22SGyungoh Yoo return ret; 732698dc22SGyungoh Yoo } 742698dc22SGyungoh Yoo 752698dc22SGyungoh Yoo static const struct i2c_device_id sky81452_ids[] = { 762698dc22SGyungoh Yoo { "sky81452" }, 772698dc22SGyungoh Yoo { } 782698dc22SGyungoh Yoo }; 792698dc22SGyungoh Yoo MODULE_DEVICE_TABLE(i2c, sky81452_ids); 802698dc22SGyungoh Yoo 812698dc22SGyungoh Yoo #ifdef CONFIG_OF 822698dc22SGyungoh Yoo static const struct of_device_id sky81452_of_match[] = { 832698dc22SGyungoh Yoo { .compatible = "skyworks,sky81452", }, 842698dc22SGyungoh Yoo { } 852698dc22SGyungoh Yoo }; 862698dc22SGyungoh Yoo MODULE_DEVICE_TABLE(of, sky81452_of_match); 872698dc22SGyungoh Yoo #endif 882698dc22SGyungoh Yoo 892698dc22SGyungoh Yoo static struct i2c_driver sky81452_driver = { 902698dc22SGyungoh Yoo .driver = { 912698dc22SGyungoh Yoo .name = "sky81452", 922698dc22SGyungoh Yoo .of_match_table = of_match_ptr(sky81452_of_match), 932698dc22SGyungoh Yoo }, 942698dc22SGyungoh Yoo .probe = sky81452_probe, 952698dc22SGyungoh Yoo .id_table = sky81452_ids, 962698dc22SGyungoh Yoo }; 972698dc22SGyungoh Yoo 982698dc22SGyungoh Yoo module_i2c_driver(sky81452_driver); 992698dc22SGyungoh Yoo 1002698dc22SGyungoh Yoo MODULE_DESCRIPTION("Skyworks SKY81452 MFD driver"); 1012698dc22SGyungoh Yoo MODULE_AUTHOR("Gyungoh Yoo <jack.yoo@skyworksinc.com>"); 1022698dc22SGyungoh Yoo MODULE_LICENSE("GPL v2"); 103