|
@@ -68,6 +68,7 @@ static const u32 prescaler_table[] = {
|
|
struct sun4i_pwm_data {
|
|
struct sun4i_pwm_data {
|
|
bool has_prescaler_bypass;
|
|
bool has_prescaler_bypass;
|
|
bool has_rdy;
|
|
bool has_rdy;
|
|
|
|
+ unsigned int npwm;
|
|
};
|
|
};
|
|
|
|
|
|
struct sun4i_pwm_chip {
|
|
struct sun4i_pwm_chip {
|
|
@@ -262,17 +263,37 @@ static const struct pwm_ops sun4i_pwm_ops = {
|
|
static const struct sun4i_pwm_data sun4i_pwm_data_a10 = {
|
|
static const struct sun4i_pwm_data sun4i_pwm_data_a10 = {
|
|
.has_prescaler_bypass = false,
|
|
.has_prescaler_bypass = false,
|
|
.has_rdy = false,
|
|
.has_rdy = false,
|
|
|
|
+ .npwm = 2,
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+static const struct sun4i_pwm_data sun4i_pwm_data_a10s = {
|
|
|
|
+ .has_prescaler_bypass = true,
|
|
|
|
+ .has_rdy = true,
|
|
|
|
+ .npwm = 2,
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+static const struct sun4i_pwm_data sun4i_pwm_data_a13 = {
|
|
|
|
+ .has_prescaler_bypass = true,
|
|
|
|
+ .has_rdy = true,
|
|
|
|
+ .npwm = 1,
|
|
};
|
|
};
|
|
|
|
|
|
static const struct sun4i_pwm_data sun4i_pwm_data_a20 = {
|
|
static const struct sun4i_pwm_data sun4i_pwm_data_a20 = {
|
|
.has_prescaler_bypass = true,
|
|
.has_prescaler_bypass = true,
|
|
.has_rdy = true,
|
|
.has_rdy = true,
|
|
|
|
+ .npwm = 2,
|
|
};
|
|
};
|
|
|
|
|
|
static const struct of_device_id sun4i_pwm_dt_ids[] = {
|
|
static const struct of_device_id sun4i_pwm_dt_ids[] = {
|
|
{
|
|
{
|
|
.compatible = "allwinner,sun4i-a10-pwm",
|
|
.compatible = "allwinner,sun4i-a10-pwm",
|
|
.data = &sun4i_pwm_data_a10,
|
|
.data = &sun4i_pwm_data_a10,
|
|
|
|
+ }, {
|
|
|
|
+ .compatible = "allwinner,sun5i-a10s-pwm",
|
|
|
|
+ .data = &sun4i_pwm_data_a10s,
|
|
|
|
+ }, {
|
|
|
|
+ .compatible = "allwinner,sun5i-a13-pwm",
|
|
|
|
+ .data = &sun4i_pwm_data_a13,
|
|
}, {
|
|
}, {
|
|
.compatible = "allwinner,sun7i-a20-pwm",
|
|
.compatible = "allwinner,sun7i-a20-pwm",
|
|
.data = &sun4i_pwm_data_a20,
|
|
.data = &sun4i_pwm_data_a20,
|
|
@@ -305,14 +326,14 @@ static int sun4i_pwm_probe(struct platform_device *pdev)
|
|
if (IS_ERR(pwm->clk))
|
|
if (IS_ERR(pwm->clk))
|
|
return PTR_ERR(pwm->clk);
|
|
return PTR_ERR(pwm->clk);
|
|
|
|
|
|
|
|
+ pwm->data = match->data;
|
|
pwm->chip.dev = &pdev->dev;
|
|
pwm->chip.dev = &pdev->dev;
|
|
pwm->chip.ops = &sun4i_pwm_ops;
|
|
pwm->chip.ops = &sun4i_pwm_ops;
|
|
pwm->chip.base = -1;
|
|
pwm->chip.base = -1;
|
|
- pwm->chip.npwm = 2;
|
|
|
|
|
|
+ pwm->chip.npwm = pwm->data->npwm;
|
|
pwm->chip.can_sleep = true;
|
|
pwm->chip.can_sleep = true;
|
|
pwm->chip.of_xlate = of_pwm_xlate_with_flags;
|
|
pwm->chip.of_xlate = of_pwm_xlate_with_flags;
|
|
pwm->chip.of_pwm_n_cells = 3;
|
|
pwm->chip.of_pwm_n_cells = 3;
|
|
- pwm->data = match->data;
|
|
|
|
|
|
|
|
spin_lock_init(&pwm->ctrl_lock);
|
|
spin_lock_init(&pwm->ctrl_lock);
|
|
|
|
|