Commit 316ddb13 authored by Mark Brown's avatar Mark Brown

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.
parents 47ef3e60 448b06ba
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>;
};
};
# 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>;
};
...
......@@ -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;
}
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[] = {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment