|
@@ -44,6 +44,10 @@ struct pbias_regulator_data {
|
|
|
int voltage;
|
|
|
};
|
|
|
|
|
|
+struct pbias_of_data {
|
|
|
+ unsigned int offset;
|
|
|
+};
|
|
|
+
|
|
|
static const unsigned int pbias_volt_table[] = {
|
|
|
1800000,
|
|
|
3000000
|
|
@@ -98,8 +102,35 @@ static struct of_regulator_match pbias_matches[] = {
|
|
|
};
|
|
|
#define PBIAS_NUM_REGS ARRAY_SIZE(pbias_matches)
|
|
|
|
|
|
+/* Offset from SCM general area (and syscon) base */
|
|
|
+
|
|
|
+static const struct pbias_of_data pbias_of_data_omap2 = {
|
|
|
+ .offset = 0x230,
|
|
|
+};
|
|
|
+
|
|
|
+static const struct pbias_of_data pbias_of_data_omap3 = {
|
|
|
+ .offset = 0x2b0,
|
|
|
+};
|
|
|
+
|
|
|
+static const struct pbias_of_data pbias_of_data_omap4 = {
|
|
|
+ .offset = 0x60,
|
|
|
+};
|
|
|
+
|
|
|
+static const struct pbias_of_data pbias_of_data_omap5 = {
|
|
|
+ .offset = 0x60,
|
|
|
+};
|
|
|
+
|
|
|
+static const struct pbias_of_data pbias_of_data_dra7 = {
|
|
|
+ .offset = 0xe00,
|
|
|
+};
|
|
|
+
|
|
|
static const struct of_device_id pbias_of_match[] = {
|
|
|
{ .compatible = "ti,pbias-omap", },
|
|
|
+ { .compatible = "ti,pbias-omap2", .data = &pbias_of_data_omap2, },
|
|
|
+ { .compatible = "ti,pbias-omap3", .data = &pbias_of_data_omap3, },
|
|
|
+ { .compatible = "ti,pbias-omap4", .data = &pbias_of_data_omap4, },
|
|
|
+ { .compatible = "ti,pbias-omap5", .data = &pbias_of_data_omap5, },
|
|
|
+ { .compatible = "ti,pbias-dra7", .data = &pbias_of_data_dra7, },
|
|
|
{},
|
|
|
};
|
|
|
MODULE_DEVICE_TABLE(of, pbias_of_match);
|
|
@@ -114,6 +145,9 @@ static int pbias_regulator_probe(struct platform_device *pdev)
|
|
|
const struct pbias_reg_info *info;
|
|
|
int ret = 0;
|
|
|
int count, idx, data_idx = 0;
|
|
|
+ const struct of_device_id *match;
|
|
|
+ const struct pbias_of_data *data;
|
|
|
+ unsigned int offset;
|
|
|
|
|
|
count = of_regulator_match(&pdev->dev, np, pbias_matches,
|
|
|
PBIAS_NUM_REGS);
|
|
@@ -129,6 +163,20 @@ static int pbias_regulator_probe(struct platform_device *pdev)
|
|
|
if (IS_ERR(syscon))
|
|
|
return PTR_ERR(syscon);
|
|
|
|
|
|
+ match = of_match_device(of_match_ptr(pbias_of_match), &pdev->dev);
|
|
|
+ if (match && match->data) {
|
|
|
+ data = match->data;
|
|
|
+ offset = data->offset;
|
|
|
+ } else {
|
|
|
+ res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
|
|
+ if (!res)
|
|
|
+ return -EINVAL;
|
|
|
+
|
|
|
+ offset = res->start;
|
|
|
+ dev_WARN(&pdev->dev,
|
|
|
+ "using legacy dt data for pbias offset\n");
|
|
|
+ }
|
|
|
+
|
|
|
cfg.regmap = syscon;
|
|
|
cfg.dev = &pdev->dev;
|
|
|
|
|
@@ -141,10 +189,6 @@ static int pbias_regulator_probe(struct platform_device *pdev)
|
|
|
if (!info)
|
|
|
return -ENODEV;
|
|
|
|
|
|
- res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
|
|
- if (!res)
|
|
|
- return -EINVAL;
|
|
|
-
|
|
|
drvdata[data_idx].syscon = syscon;
|
|
|
drvdata[data_idx].info = info;
|
|
|
drvdata[data_idx].desc.name = info->name;
|
|
@@ -154,9 +198,9 @@ static int pbias_regulator_probe(struct platform_device *pdev)
|
|
|
drvdata[data_idx].desc.volt_table = pbias_volt_table;
|
|
|
drvdata[data_idx].desc.n_voltages = 2;
|
|
|
drvdata[data_idx].desc.enable_time = info->enable_time;
|
|
|
- drvdata[data_idx].desc.vsel_reg = res->start;
|
|
|
+ drvdata[data_idx].desc.vsel_reg = offset;
|
|
|
drvdata[data_idx].desc.vsel_mask = info->vmode;
|
|
|
- drvdata[data_idx].desc.enable_reg = res->start;
|
|
|
+ drvdata[data_idx].desc.enable_reg = offset;
|
|
|
drvdata[data_idx].desc.enable_mask = info->enable_mask;
|
|
|
drvdata[data_idx].desc.enable_val = info->enable;
|
|
|
|