Add "mclk" support for maxim,max9867

Merge series from richard.leitner@linux.dev:

This series adds support for the clocks properties in the
maxim,max9867 bindings. Furthermore the binding definitions are
converted from txt to yaml.

The clock property is needed to define the mclk for one of our
boards which uses the the i.MX8MP SAI MCLK as clock for the
maxim,max9867.
This commit is contained in:
Mark Brown 2023-03-06 13:30:21 +00:00
commit 316ddb133a
No known key found for this signature in database
GPG Key ID: 24D68B725D5487D0
3 changed files with 83 additions and 19 deletions

View File

@ -1,17 +0,0 @@
max9867 codec
This device supports I2C mode only.
Required properties:
- compatible : "maxim,max9867"
- reg : The chip select number on the I2C bus
Example:
&i2c {
max9867: max9867@18 {
compatible = "maxim,max9867";
reg = <0x18>;
};
};

View File

@ -0,0 +1,66 @@
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
%YAML 1.2
---
$id: http://devicetree.org/schemas/sound/maxim,max9867.yaml#
$schema: http://devicetree.org/meta-schemas/core.yaml#
title: Maxim Integrated MAX9867 CODEC
description: |
This device supports I2C only.
Pins on the device (for linking into audio routes):
* LOUT
* ROUT
* LINL
* LINR
* MICL
* MICR
* DMICL
* DMICR
maintainers:
- Ladislav Michl <ladis@linux-mips.org>
allOf:
- $ref: dai-common.yaml#
properties:
compatible:
enum:
- maxim,max9867
'#sound-dai-cells':
const: 0
reg:
maxItems: 1
clocks:
maxItems: 1
required:
- compatible
- reg
- clocks
additionalProperties: false
examples:
- |
i2c {
#address-cells = <1>;
#size-cells = <0>;
codec@18 {
compatible = "maxim,max9867";
#sound-dai-cells = <0>;
reg = <0x18>;
clocks = <&codec_clk>;
};
};
codec_clk: clock {
compatible = "fixed-clock";
#clock-cells = <0>;
clock-frequency = <12288000>;
};
...

View File

@ -6,6 +6,7 @@
// Copyright 2018 Ladislav Michl <ladis@linux-mips.org>
//
#include <linux/clk.h>
#include <linux/delay.h>
#include <linux/i2c.h>
#include <linux/module.h>
@ -16,6 +17,7 @@
#include "max9867.h"
struct max9867_priv {
struct clk *mclk;
struct regmap *regmap;
const struct snd_pcm_hw_constraint_list *constraints;
unsigned int sysclk, pclk;
@ -577,6 +579,11 @@ static int max9867_set_bias_level(struct snd_soc_component *component,
struct max9867_priv *max9867 = snd_soc_component_get_drvdata(component);
switch (level) {
case SND_SOC_BIAS_ON:
err = clk_prepare_enable(max9867->mclk);
if (err)
return err;
break;
case SND_SOC_BIAS_STANDBY:
if (snd_soc_component_get_bias_level(component) == SND_SOC_BIAS_OFF) {
err = regcache_sync(max9867->regmap);
@ -595,6 +602,7 @@ static int max9867_set_bias_level(struct snd_soc_component *component,
return err;
regcache_mark_dirty(max9867->regmap);
clk_disable_unprepare(max9867->mclk);
break;
default:
break;
@ -663,9 +671,16 @@ static int max9867_i2c_probe(struct i2c_client *i2c)
dev_info(&i2c->dev, "device revision: %x\n", reg);
ret = devm_snd_soc_register_component(&i2c->dev, &max9867_component,
max9867_dai, ARRAY_SIZE(max9867_dai));
if (ret < 0)
if (ret < 0) {
dev_err(&i2c->dev, "Failed to register component: %d\n", ret);
return ret;
return ret;
}
max9867->mclk = devm_clk_get(&i2c->dev, NULL);
if (IS_ERR(max9867->mclk))
return PTR_ERR(max9867->mclk);
return 0;
}
static const struct i2c_device_id max9867_i2c_id[] = {