linux/drivers/mfd/axp20x-rsb.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-only
   2/*
   3 * RSB driver for the X-Powers' Power Management ICs
   4 *
   5 * AXP20x typically comprises an adaptive USB-Compatible PWM charger, BUCK DC-DC
   6 * converters, LDOs, multiple 12-bit ADCs of voltage, current and temperature
   7 * as well as configurable GPIOs.
   8 *
   9 * This driver supports the RSB variants.
  10 *
  11 * Copyright (C) 2015 Chen-Yu Tsai
  12 *
  13 * Author: Chen-Yu Tsai <wens@csie.org>
  14 */
  15
  16#include <linux/acpi.h>
  17#include <linux/err.h>
  18#include <linux/mfd/axp20x.h>
  19#include <linux/module.h>
  20#include <linux/of.h>
  21#include <linux/regmap.h>
  22#include <linux/slab.h>
  23#include <linux/sunxi-rsb.h>
  24
  25static int axp20x_rsb_probe(struct sunxi_rsb_device *rdev)
  26{
  27        struct axp20x_dev *axp20x;
  28        int ret;
  29
  30        axp20x = devm_kzalloc(&rdev->dev, sizeof(*axp20x), GFP_KERNEL);
  31        if (!axp20x)
  32                return -ENOMEM;
  33
  34        axp20x->dev = &rdev->dev;
  35        axp20x->irq = rdev->irq;
  36        dev_set_drvdata(&rdev->dev, axp20x);
  37
  38        ret = axp20x_match_device(axp20x);
  39        if (ret)
  40                return ret;
  41
  42        axp20x->regmap = devm_regmap_init_sunxi_rsb(rdev, axp20x->regmap_cfg);
  43        if (IS_ERR(axp20x->regmap)) {
  44                ret = PTR_ERR(axp20x->regmap);
  45                dev_err(&rdev->dev, "regmap init failed: %d\n", ret);
  46                return ret;
  47        }
  48
  49        return axp20x_device_probe(axp20x);
  50}
  51
  52static void axp20x_rsb_remove(struct sunxi_rsb_device *rdev)
  53{
  54        struct axp20x_dev *axp20x = sunxi_rsb_device_get_drvdata(rdev);
  55
  56        axp20x_device_remove(axp20x);
  57}
  58
  59static const struct of_device_id axp20x_rsb_of_match[] = {
  60        { .compatible = "x-powers,axp223", .data = (void *)AXP223_ID },
  61        { .compatible = "x-powers,axp803", .data = (void *)AXP803_ID },
  62        { .compatible = "x-powers,axp806", .data = (void *)AXP806_ID },
  63        { .compatible = "x-powers,axp809", .data = (void *)AXP809_ID },
  64        { .compatible = "x-powers,axp813", .data = (void *)AXP813_ID },
  65        { },
  66};
  67MODULE_DEVICE_TABLE(of, axp20x_rsb_of_match);
  68
  69static struct sunxi_rsb_driver axp20x_rsb_driver = {
  70        .driver = {
  71                .name   = "axp20x-rsb",
  72                .of_match_table = of_match_ptr(axp20x_rsb_of_match),
  73        },
  74        .probe  = axp20x_rsb_probe,
  75        .remove = axp20x_rsb_remove,
  76};
  77module_sunxi_rsb_driver(axp20x_rsb_driver);
  78
  79MODULE_DESCRIPTION("PMIC MFD sunXi RSB driver for AXP20X");
  80MODULE_AUTHOR("Chen-Yu Tsai <wens@csie.org>");
  81MODULE_LICENSE("GPL v2");
  82