@@ -27,10 +27,14 @@
#include <drm/drm_edid.h>
#include <drm/drm_of.h>
#include <drm/i2c/tda998x.h>
-#include <sound/tda998x.h>
#define DBG(fmt, ...) DRM_DEBUG(fmt"\n", ##__VA_ARGS__)
+struct tda998x_audio {
+ u8 ports[2]; /* AP value */
+ u8 port_types[2]; /* AFMT_xxx */
+};
+
struct tda998x_priv {
struct i2c_client *cec;
struct i2c_client *hdmi;
@@ -1240,9 +1244,10 @@ static int tda998x_parse_ports(struct tda998x_priv *priv,
{
struct device_node *of_port;
const char *port_type;
- int ret, audio_index, reg, afmt;
+ int ret, audio_index, reg, afmt, rgb_initialized;
audio_index = 0;
+ rgb_initialized = 0;
for_each_child_of_node(np, of_port) {
if (!of_port->name
|| of_node_cmp(of_port->name, "port") != 0)
@@ -1252,11 +1257,17 @@ static int tda998x_parse_ports(struct tda998x_priv *priv,
if (ret < 0)
continue;
ret = of_property_read_u32(of_port, "reg", ®);
+ if (ret < 0) {
+ dev_err(&priv->hdmi->dev, "missing reg for %s\n",
+ port_type);
+ return ret;
+ }
if (strcmp(port_type, "rgb") == 0) {
if (!ret) { /* video reg is optional */
priv->vip_cntrl_0 = reg >> 16;
priv->vip_cntrl_1 = reg >> 8;
priv->vip_cntrl_2 = reg;
+ rgb_initialized = 1;
}
continue;
}
@@ -1266,11 +1277,6 @@ static int tda998x_parse_ports(struct tda998x_priv *priv,
afmt = AFMT_SPDIF;
else
continue;
- if (ret < 0) {
- dev_err(&priv->hdmi->dev, "missing reg for %s\n",
- port_type);
- return ret;
- }
if (audio_index >= ARRAY_SIZE(priv->audio.ports)) {
dev_err(&priv->hdmi->dev, "too many audio ports\n");
break;
@@ -1279,13 +1285,13 @@ static int tda998x_parse_ports(struct tda998x_priv *priv,
priv->audio.port_types[audio_index] = afmt;
audio_index++;
}
- return 0;
+ return rgb_initialized;
}
static int tda998x_create(struct i2c_client *client, struct tda998x_priv *priv)
{
struct device_node *np = client->dev.of_node;
- struct device_node *of_port;
+ struct device_node *ports;
u32 video;
int rev_lo, rev_hi, ret;
unsigned short cec_addr;
@@ -1392,24 +1398,15 @@ static int tda998x_create(struct i2c_client *client, struct tda998x_priv *priv)
/* get the device tree parameters */
if (np) {
- of_port = of_get_child_by_name(np, "port");
- if (of_port) { /* graph of ports */
- of_node_put(of_port);
- ret = tda998x_parse_ports(priv, np);
- if (ret < 0)
- goto fail;
-
- /* initialize the default audio configuration */
- if (priv->audio.ports[0]) {
- priv->params.audio_cfg = priv->audio.ports[0];
- priv->params.audio_format =
- priv->audio.port_types[0];
- priv->params.audio_clk_cfg =
- priv->params.audio_format ==
- AFMT_SPDIF ? 0 : 1;
- }
- } else {
-
+ ports = of_get_child_by_name(np, "ports");
+ if (!ports)
+ ports = of_node_get(np);
+ /* graph of ports */
+ ret = tda998x_parse_ports(priv, ports);
+ of_node_put(ports);
+ if (ret < 0)
+ goto fail;
+ if (ret == 0) {
/* optional video properties */
ret = of_property_read_u32(np, "video-ports", &video);
if (ret == 0) {
@@ -1418,6 +1415,14 @@ static int tda998x_create(struct i2c_client *client, struct tda998x_priv *priv)
priv->vip_cntrl_2 = video;
}
}
+ if (priv->audio.ports[0]) {
+ priv->params.audio_cfg = priv->audio.ports[0];
+ priv->params.audio_format =
+ priv->audio.port_types[0];
+ priv->params.audio_clk_cfg =
+ priv->params.audio_format ==
+ AFMT_SPDIF ? 0 : 1;
+ }
}
return 0;
deleted file mode 100644
@@ -1,8 +0,0 @@
-#ifndef SND_TDA998X_H
-#define SND_TDA998X_H
-
-struct tda998x_audio {
- u8 ports[2]; /* AP value */
- u8 port_types[2]; /* AFMT_xxx */
-};
-#endif
Move struct tda998x_audio definition to tda998x_drv.c and remove include/sound/tda998x.h. There is no external use for struct tda998x_audio. Fix graph parsing to allow ports to be inside a separate "ports"-node as specified in Documentation/devicetree/bindings/graph.txt. Signed-off-by: Jyri Sarha <jsarha@ti.com> --- drivers/gpu/drm/i2c/tda998x_drv.c | 59 +++++++++++++++++++++------------------ include/sound/tda998x.h | 8 ------ 2 files changed, 32 insertions(+), 35 deletions(-) delete mode 100644 include/sound/tda998x.h