Skip to content

Commit

Permalink
regulator: arizona-ldo1: Move pdata into a separate structure
Browse files Browse the repository at this point in the history
In preparation for sharing this driver with Madera, move the pdata
for the LDO1 regulator out of struct arizona_pdata into a dedicated
pdata struct for this driver. As a result the code in
arizona_ldo1_of_get_pdata() can be made independent of struct arizona.

This patch also updates the definition of struct arizona_pdata and
the use of this pdata in mach-crag6410-module.c

Signed-off-by: Richard Fitzgerald <[email protected]>
Acked-by: Krzysztof Kozlowski <[email protected]>
Acked-by: Lee Jones <[email protected]>
Signed-off-by: Mark Brown <[email protected]>
  • Loading branch information
Richard Fitzgerald authored and broonie committed Apr 25, 2017
1 parent 7d8d14b commit aaa84e6
Show file tree
Hide file tree
Showing 4 changed files with 53 additions and 22 deletions.
8 changes: 6 additions & 2 deletions arch/arm/mach-s3c64xx/mach-crag6410-module.c
Original file line number Diff line number Diff line change
Expand Up @@ -209,7 +209,9 @@ static const struct i2c_board_info wm1277_devs[] = {
};

static struct arizona_pdata wm5102_reva_pdata = {
.ldoena = S3C64XX_GPN(7),
.ldo1 = {
.ldoena = S3C64XX_GPN(7),
},
.gpio_base = CODEC_GPIO_BASE,
.irq_flags = IRQF_TRIGGER_HIGH,
.micd_pol_gpio = CODEC_GPIO_BASE + 4,
Expand Down Expand Up @@ -239,7 +241,9 @@ static struct spi_board_info wm5102_reva_spi_devs[] = {
};

static struct arizona_pdata wm5102_pdata = {
.ldoena = S3C64XX_GPN(7),
.ldo1 = {
.ldoena = S3C64XX_GPN(7),
},
.gpio_base = CODEC_GPIO_BASE,
.irq_flags = IRQF_TRIGGER_HIGH,
.micd_pol_gpio = CODEC_GPIO_BASE + 2,
Expand Down
39 changes: 21 additions & 18 deletions drivers/regulator/arizona-ldo1.c
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,8 @@
#include <linux/gpio.h>
#include <linux/slab.h>

#include <linux/regulator/arizona-ldo1.h>

#include <linux/mfd/arizona/core.h>
#include <linux/mfd/arizona/pdata.h>
#include <linux/mfd/arizona/registers.h>
Expand Down Expand Up @@ -186,20 +188,19 @@ static const struct regulator_init_data arizona_ldo1_wm5110 = {
.num_consumer_supplies = 1,
};

static int arizona_ldo1_of_get_pdata(struct device *dev,
struct arizona *arizona,
static int arizona_ldo1_of_get_pdata(struct arizona_ldo1_pdata *pdata,
struct regulator_config *config,
const struct regulator_desc *desc)
const struct regulator_desc *desc,
bool *external_dcvdd)
{
struct arizona_pdata *pdata = &arizona->pdata;
struct arizona_ldo1 *ldo1 = config->driver_data;
struct device_node *np = arizona->dev->of_node;
struct device_node *np = config->dev->of_node;
struct device_node *init_node, *dcvdd_node;
struct regulator_init_data *init_data;

pdata->ldoena = of_get_named_gpio(np, "wlf,ldoena", 0);
if (pdata->ldoena < 0) {
dev_warn(arizona->dev,
dev_warn(config->dev,
"LDOENA GPIO property missing/malformed: %d\n",
pdata->ldoena);
pdata->ldoena = 0;
Expand All @@ -213,19 +214,19 @@ static int arizona_ldo1_of_get_pdata(struct device *dev,
if (init_node) {
config->of_node = init_node;

init_data = of_get_regulator_init_data(dev, init_node, desc);

init_data = of_get_regulator_init_data(config->dev, init_node,
desc);
if (init_data) {
init_data->consumer_supplies = &ldo1->supply;
init_data->num_consumer_supplies = 1;

if (dcvdd_node && dcvdd_node != init_node)
arizona->external_dcvdd = true;
*external_dcvdd = true;

pdata->ldo1 = init_data;
pdata->init_data = init_data;
}
} else if (dcvdd_node) {
arizona->external_dcvdd = true;
*external_dcvdd = true;
}

of_node_put(dcvdd_node);
Expand All @@ -239,10 +240,9 @@ static int arizona_ldo1_probe(struct platform_device *pdev)
const struct regulator_desc *desc;
struct regulator_config config = { };
struct arizona_ldo1 *ldo1;
bool external_dcvdd = false;
int ret;

arizona->external_dcvdd = false;

ldo1 = devm_kzalloc(&pdev->dev, sizeof(*ldo1), GFP_KERNEL);
if (!ldo1)
return -ENOMEM;
Expand Down Expand Up @@ -283,17 +283,18 @@ static int arizona_ldo1_probe(struct platform_device *pdev)

if (IS_ENABLED(CONFIG_OF)) {
if (!dev_get_platdata(arizona->dev)) {
ret = arizona_ldo1_of_get_pdata(&pdev->dev, arizona,
&config, desc);
ret = arizona_ldo1_of_get_pdata(&arizona->pdata.ldo1,
&config, desc,
&external_dcvdd);
if (ret < 0)
return ret;
}
}

config.ena_gpio = arizona->pdata.ldoena;
config.ena_gpio = arizona->pdata.ldo1.ldoena;

if (arizona->pdata.ldo1)
config.init_data = arizona->pdata.ldo1;
if (arizona->pdata.ldo1.init_data)
config.init_data = arizona->pdata.ldo1.init_data;
else
config.init_data = &ldo1->init_data;

Expand All @@ -303,6 +304,8 @@ static int arizona_ldo1_probe(struct platform_device *pdev)
*/
if (config.init_data->num_consumer_supplies == 0)
arizona->external_dcvdd = true;
else
arizona->external_dcvdd = external_dcvdd;

ldo1->regulator = devm_regulator_register(&pdev->dev, desc, &config);

Expand Down
4 changes: 2 additions & 2 deletions include/linux/mfd/arizona/pdata.h
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
#define _ARIZONA_PDATA_H

#include <dt-bindings/mfd/arizona.h>
#include <linux/regulator/arizona-ldo1.h>
#include <linux/regulator/arizona-micsupp.h>

#define ARIZONA_GPN_DIR_MASK 0x8000 /* GPN_DIR */
Expand Down Expand Up @@ -77,13 +78,12 @@ struct arizona_micd_range {

struct arizona_pdata {
int reset; /** GPIO controlling /RESET, if any */
int ldoena; /** GPIO controlling LODENA, if any */

/** Regulator configuration for MICVDD */
struct arizona_micsupp_pdata micvdd;

/** Regulator configuration for LDO1 */
struct regulator_init_data *ldo1;
struct arizona_ldo1_pdata ldo1;

/** If a direct 32kHz clock is provided on an MCLK specify it here */
int clk32k_src;
Expand Down
24 changes: 24 additions & 0 deletions include/linux/regulator/arizona-ldo1.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
/*
* Platform data for Arizona LDO1 regulator
*
* Copyright 2017 Cirrus Logic
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*/

#ifndef ARIZONA_LDO1_H
#define ARIZONA_LDO1_H

struct regulator_init_data;

struct arizona_ldo1_pdata {
/** GPIO controlling LDOENA, if any */
int ldoena;

/** Regulator configuration for LDO1 */
const struct regulator_init_data *init_data;
};

#endif

0 comments on commit aaa84e6

Please sign in to comment.