-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
reset: amlogic: split the device core and platform probe
To prepare the addition of the auxiliary device support, split out the device coomon functions from the probe of the platform device. The device core function will be common to both the platform and auxiliary driver. Signed-off-by: Jerome Brunet <jbrunet@baylibre.com> Reviewed-by: Neil Armstrong <neil.armstrong@linaro.org> Reviewed-by: Philipp Zabel <p.zabel@pengutronix.de> Link: https://lore.kernel.org/r/20240910-meson-rst-aux-v5-8-60be62635d3e@baylibre.com Signed-off-by: Philipp Zabel <p.zabel@pengutronix.de>
- Loading branch information
Jerome Brunet
authored and
Philipp Zabel
committed
Oct 1, 2024
1 parent
2c138ee
commit c38ae95
Showing
5 changed files
with
167 additions
and
108 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,2 +1,3 @@ | ||
obj-$(CONFIG_RESET_MESON) += reset-meson.o | ||
obj-$(CONFIG_RESET_MESON_COMMON) += reset-meson-common.o | ||
obj-$(CONFIG_RESET_MESON_AUDIO_ARB) += reset-meson-audio-arb.o |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,121 @@ | ||
// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause | ||
/* | ||
* Amlogic Meson Reset core functions | ||
* | ||
* Copyright (c) 2016-2024 BayLibre, SAS. | ||
* Authors: Neil Armstrong <narmstrong@baylibre.com> | ||
* Jerome Brunet <jbrunet@baylibre.com> | ||
*/ | ||
|
||
#include <linux/device.h> | ||
#include <linux/module.h> | ||
#include <linux/regmap.h> | ||
#include <linux/reset-controller.h> | ||
|
||
#include "reset-meson.h" | ||
|
||
struct meson_reset { | ||
const struct meson_reset_param *param; | ||
struct reset_controller_dev rcdev; | ||
struct regmap *map; | ||
}; | ||
|
||
static void meson_reset_offset_and_bit(struct meson_reset *data, | ||
unsigned long id, | ||
unsigned int *offset, | ||
unsigned int *bit) | ||
{ | ||
unsigned int stride = regmap_get_reg_stride(data->map); | ||
|
||
*offset = (id / (stride * BITS_PER_BYTE)) * stride; | ||
*bit = id % (stride * BITS_PER_BYTE); | ||
} | ||
|
||
static int meson_reset_reset(struct reset_controller_dev *rcdev, | ||
unsigned long id) | ||
{ | ||
struct meson_reset *data = | ||
container_of(rcdev, struct meson_reset, rcdev); | ||
unsigned int offset, bit; | ||
|
||
meson_reset_offset_and_bit(data, id, &offset, &bit); | ||
offset += data->param->reset_offset; | ||
|
||
return regmap_write(data->map, offset, BIT(bit)); | ||
} | ||
|
||
static int meson_reset_level(struct reset_controller_dev *rcdev, | ||
unsigned long id, bool assert) | ||
{ | ||
struct meson_reset *data = | ||
container_of(rcdev, struct meson_reset, rcdev); | ||
unsigned int offset, bit; | ||
|
||
meson_reset_offset_and_bit(data, id, &offset, &bit); | ||
offset += data->param->level_offset; | ||
assert ^= data->param->level_low_reset; | ||
|
||
return regmap_update_bits(data->map, offset, | ||
BIT(bit), assert ? BIT(bit) : 0); | ||
} | ||
|
||
static int meson_reset_status(struct reset_controller_dev *rcdev, | ||
unsigned long id) | ||
{ | ||
struct meson_reset *data = | ||
container_of(rcdev, struct meson_reset, rcdev); | ||
unsigned int val, offset, bit; | ||
|
||
meson_reset_offset_and_bit(data, id, &offset, &bit); | ||
offset += data->param->level_offset; | ||
|
||
regmap_read(data->map, offset, &val); | ||
val = !!(BIT(bit) & val); | ||
|
||
return val ^ data->param->level_low_reset; | ||
} | ||
|
||
static int meson_reset_assert(struct reset_controller_dev *rcdev, | ||
unsigned long id) | ||
{ | ||
return meson_reset_level(rcdev, id, true); | ||
} | ||
|
||
static int meson_reset_deassert(struct reset_controller_dev *rcdev, | ||
unsigned long id) | ||
{ | ||
return meson_reset_level(rcdev, id, false); | ||
} | ||
|
||
static const struct reset_control_ops meson_reset_ops = { | ||
.reset = meson_reset_reset, | ||
.assert = meson_reset_assert, | ||
.deassert = meson_reset_deassert, | ||
.status = meson_reset_status, | ||
}; | ||
|
||
int meson_reset_controller_register(struct device *dev, struct regmap *map, | ||
const struct meson_reset_param *param) | ||
{ | ||
struct meson_reset *data; | ||
|
||
data = devm_kzalloc(dev, sizeof(*data), GFP_KERNEL); | ||
if (!data) | ||
return -ENOMEM; | ||
|
||
data->param = param; | ||
data->map = map; | ||
data->rcdev.owner = dev->driver->owner; | ||
data->rcdev.nr_resets = param->reset_num; | ||
data->rcdev.ops = &meson_reset_ops; | ||
data->rcdev.of_node = dev->of_node; | ||
|
||
return devm_reset_controller_register(dev, &data->rcdev); | ||
} | ||
EXPORT_SYMBOL_NS_GPL(meson_reset_controller_register, MESON_RESET); | ||
|
||
MODULE_DESCRIPTION("Amlogic Meson Reset Core function"); | ||
MODULE_AUTHOR("Neil Armstrong <narmstrong@baylibre.com>"); | ||
MODULE_AUTHOR("Jerome Brunet <jbrunet@baylibre.com>"); | ||
MODULE_LICENSE("Dual BSD/GPL"); | ||
MODULE_IMPORT_NS(MESON_RESET); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,24 @@ | ||
/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */ | ||
/* | ||
* Copyright (c) 2024 BayLibre, SAS. | ||
* Author: Jerome Brunet <jbrunet@baylibre.com> | ||
*/ | ||
|
||
#ifndef __MESON_RESET_H | ||
#define __MESON_RESET_H | ||
|
||
#include <linux/module.h> | ||
#include <linux/regmap.h> | ||
#include <linux/reset-controller.h> | ||
|
||
struct meson_reset_param { | ||
unsigned int reset_num; | ||
unsigned int reset_offset; | ||
unsigned int level_offset; | ||
bool level_low_reset; | ||
}; | ||
|
||
int meson_reset_controller_register(struct device *dev, struct regmap *map, | ||
const struct meson_reset_param *param); | ||
|
||
#endif /* __MESON_RESET_H */ |