[PATCH 5/8] media: adv748x: add an ASoC DAI definition to the driver
The definition is used to publish hardware constraints and can be used to implement in-demand device configuration. Signed-off-by: Alexander Riesen --- drivers/media/i2c/adv748x/adv748x-core.c | 33 1 file changed, 33 insertions(+) diff --git a/drivers/media/i2c/adv748x/adv748x-core.c b/drivers/media/i2c/adv748x/adv748x-core.c index b6067ffb1e0d..75e4bf144ad7 100644 --- a/drivers/media/i2c/adv748x/adv748x-core.c +++ b/drivers/media/i2c/adv748x/adv748x-core.c @@ -25,6 +25,7 @@ #include #include #include +#include #include "adv748x.h" @@ -689,6 +690,30 @@ static void adv748x_dt_cleanup(struct adv748x_state *state) of_node_put(state->endpoints[i]); } +static struct snd_soc_dai_driver adv748x_dai = { + .name = "adv748x-i2s", + .capture = { + .stream_name= "Capture", + .channels_min = 8, + .channels_max = 8, + .rates = SNDRV_PCM_RATE_48000, + .formats = SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_U24_LE, +}, +}; + +static int adv748x_of_xlate_dai_name(struct snd_soc_component *component, + struct of_phandle_args *args, + const char **dai_name) +{ + if (dai_name) + *dai_name = adv748x_dai.name; + return 0; +} + +static const struct snd_soc_component_driver adv748x_codec = { + .of_xlate_dai_name = adv748x_of_xlate_dai_name, +}; + static int adv748x_probe(struct i2c_client *client) { struct adv748x_state *state; @@ -782,8 +807,16 @@ static int adv748x_probe(struct i2c_client *client) goto err_cleanup_txa; } + ret = devm_snd_soc_register_component(state->dev, &adv748x_codec, + &adv748x_dai, 1); + if (ret < 0) { + adv_err(state, "Failed to register the codec"); + goto err_cleanup_txb; + } return 0; +err_cleanup_txb: + adv748x_csi2_cleanup(&state->txb); err_cleanup_txa: adv748x_csi2_cleanup(&state->txa); err_cleanup_afe: -- 2.24.1.508.g91d2dafee0 ___ devel mailing list de...@linuxdriverproject.org http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel
[PATCH 7/8] dt-bindings: adv748x: add information about serial audio interface (I2S/TDM)
As the driver has some support for the audio interface of the device, the bindings file should mention it. Signed-off-by: Alexander Riesen --- .../devicetree/bindings/media/i2c/adv748x.txt | 13 - 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/Documentation/devicetree/bindings/media/i2c/adv748x.txt b/Documentation/devicetree/bindings/media/i2c/adv748x.txt index 4f91686e54a6..c42dffb37a82 100644 --- a/Documentation/devicetree/bindings/media/i2c/adv748x.txt +++ b/Documentation/devicetree/bindings/media/i2c/adv748x.txt @@ -2,7 +2,9 @@ The ADV7481 and ADV7482 are multi format video decoders with an integrated HDMI receiver. They can output CSI-2 on two independent outputs TXA and TXB -from three input sources HDMI, analog and TTL. +from three input sources HDMI, analog and TTL. There is also support for an +I2S compatible interface connected to the audio processor of the HDMI decoder. +The interface has TDM capability (8 slots, 32 bits, left or right justified). Required Properties: @@ -47,6 +49,7 @@ are numbered as follows. TTL sink9 TXA source 10 TXB source 11 + I2S source 12 The digital output port nodes, when present, shall contain at least one endpoint. Each of those endpoints shall contain the data-lanes property as @@ -113,4 +116,12 @@ Example: remote-endpoint = <&csi20_in>; }; }; + + port@c { + reg = <12>; + + adv7482_i2s: endpoint { + remote-endpoint = <&i2s_in>; + }; + }; }; -- 2.24.1.508.g91d2dafee0 ___ devel mailing list de...@linuxdriverproject.org http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel
[PATCH 6/8] media: adv748x: reduce amount of code for bitwise modification of device registers
The regmap provides corresponding routine (regmap_update_bits) already wrapped for this device earlier. Signed-off-by: Alexander Riesen --- drivers/media/i2c/adv748x/adv748x.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/drivers/media/i2c/adv748x/adv748x.h b/drivers/media/i2c/adv748x/adv748x.h index 5db06410f102..ab3f754542fe 100644 --- a/drivers/media/i2c/adv748x/adv748x.h +++ b/drivers/media/i2c/adv748x/adv748x.h @@ -432,7 +432,7 @@ int adv748x_update_bits(struct adv748x_state *state, u8 page, u8 reg, #define io_read(s, r) adv748x_read(s, ADV748X_PAGE_IO, r) #define io_write(s, r, v) adv748x_write(s, ADV748X_PAGE_IO, r, v) -#define io_clrset(s, r, m, v) io_write(s, r, (io_read(s, r) & ~m) | v) +#define io_clrset(s, r, m, v) adv748x_update_bits(s, ADV748X_PAGE_IO, r, m, v) #define io_update(s, r, m, v) adv748x_update_bits(s, ADV748X_PAGE_IO, r, m, v) #define hdmi_read(s, r) adv748x_read(s, ADV748X_PAGE_HDMI, r) @@ -450,11 +450,11 @@ int adv748x_update_bits(struct adv748x_state *state, u8 page, u8 reg, #define sdp_read(s, r) adv748x_read(s, ADV748X_PAGE_SDP, r) #define sdp_write(s, r, v) adv748x_write(s, ADV748X_PAGE_SDP, r, v) -#define sdp_clrset(s, r, m, v) sdp_write(s, r, (sdp_read(s, r) & ~m) | v) +#define sdp_clrset(s, r, m, v) adv748x_update_bits(s, ADV748X_PAGE_SDP, r, m, v) #define cp_read(s, r) adv748x_read(s, ADV748X_PAGE_CP, r) #define cp_write(s, r, v) adv748x_write(s, ADV748X_PAGE_CP, r, v) -#define cp_clrset(s, r, m, v) cp_write(s, r, (cp_read(s, r) & ~m) | v) +#define cp_clrset(s, r, m, v) adv748x_update_bits(s, ADV748X_PAGE_CP, r, m, v) #define tx_read(t, r) adv748x_read(t->state, t->page, r) #define tx_write(t, r, v) adv748x_write(t->state, t->page, r, v) -- 2.24.1.508.g91d2dafee0 ___ devel mailing list de...@linuxdriverproject.org http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel
[PATCH 4/8] media: adv748x: reserve space for the audio (I2S) port in the driver structures
This allows use of the port in the device tree files. Signed-off-by: Alexander Riesen --- drivers/media/i2c/adv748x/adv748x.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/drivers/media/i2c/adv748x/adv748x.h b/drivers/media/i2c/adv748x/adv748x.h index fdda6982e437..5db06410f102 100644 --- a/drivers/media/i2c/adv748x/adv748x.h +++ b/drivers/media/i2c/adv748x/adv748x.h @@ -61,7 +61,8 @@ enum adv748x_ports { ADV748X_PORT_TTL = 9, ADV748X_PORT_TXA = 10, ADV748X_PORT_TXB = 11, - ADV748X_PORT_MAX = 12, + ADV748X_PORT_I2S = 12, + ADV748X_PORT_MAX = 13, }; enum adv748x_csi2_pads { -- 2.24.1.508.g91d2dafee0 ___ devel mailing list de...@linuxdriverproject.org http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel
[PATCH 3/8] media: adv748x: add log_status ioctl
The logged information provides insights about cable connection and the state of the HDMI decoder. It is very useful when debugging hardware problems in environments without easy access to the connectors. Signed-off-by: Alexander Riesen --- drivers/media/i2c/adv748x/adv748x-hdmi.c | 173 +++ 1 file changed, 173 insertions(+) diff --git a/drivers/media/i2c/adv748x/adv748x-hdmi.c b/drivers/media/i2c/adv748x/adv748x-hdmi.c index 9bc9237c9116..69dfafc4e0f5 100644 --- a/drivers/media/i2c/adv748x/adv748x-hdmi.c +++ b/drivers/media/i2c/adv748x/adv748x-hdmi.c @@ -613,6 +613,178 @@ static int adv748x_hdmi_audio_mute(struct adv748x_hdmi *hdmi, int enable) enable ? 0xff : 0); } +struct tmds_params { + u32 cts, n; + u16 tmdsfreq, tmdsfreq_frac; +}; + +static inline const char *cs_data_smpl_freq_str(u8 cs_data_3) +{ + switch (cs_data_3 & 0xf) { + case 0: + return "44.1"; + case 2: + return "48"; + case 3: + return "32"; + case 8: + return "88.2"; + case 10: + return "96"; + case 12: + return "176"; + case 14: + return "192"; + } + return "reserved"; +} + +static inline const char *cs_data_clk_lvl_str(u8 cs_data_3) +{ + switch (cs_data_3 & 0x30) { + case 0: + return "Level II"; + case 1: + return "Level I"; + case 2: + return "Level III, variable pitch shifted"; + } + return "reserved"; +} + +static inline const char *i2s_out_mode_str(u8 i2s_mode) +{ + switch (i2s_mode & ADV748X_HDMI_I2SOUTMODE_MASK) { + case 0 << ADV748X_HDMI_I2SOUTMODE_SHIFT: + return "I2S"; + case 1 << ADV748X_HDMI_I2SOUTMODE_SHIFT: + return "right"; + case 2 << ADV748X_HDMI_I2SOUTMODE_SHIFT: + return "left"; + case 3 << ADV748X_HDMI_I2SOUTMODE_SHIFT: + return "spdif"; + } + return ""; +} + +static int adv748x_hdmi_log_status(struct v4l2_subdev *sd) +{ + struct adv748x_hdmi *hdmi = adv748x_sd_to_hdmi(sd); + struct adv748x_state *state = adv748x_hdmi_to_state(hdmi); + u8 rv, i2s_tdm_mode_enable; + u8 cts_n[5]; + u8 cs_data[0x3a - 0x36 + 1]; + u8 tmdsfreq[2]; /* both tmdsfreq and tmdsfreq_frac */ + struct tmds_params tmds_params; + + /* Audio control and configuration */ + rv = io_read(state, 0x71); + pr_info("cable_det_a_raw %s\n", + rv & BIT(6) ? "detected" : "no cable"); + pr_info("tmds_clk_a_raw %s\n", + rv & BIT(3) ? "detected" : "no TMDS clock"); + pr_info("tmdspll_lck_a_raw %s\n", + rv & BIT(7) ? "locked to incoming clock" : "not locked"); + pr_info("hdmi_encrpt_a_raw %s\n", + rv & BIT(5) ? "current frame encrypted" : "not encrypted"); + rv = hdmi_read(state, 0x04); + pr_info("audio_pll_locked0x%02lx\n", rv & BIT(0)); + pr_info("tmds_pll_locked 0x%02lx\n", rv & BIT(1)); + rv = io_read(state, 0x6c); + pr_info("gamut_mdata_raw %s\n", + rv & BIT(0) ? "received" : "-"); + pr_info("audio_c_pckt_raw%s\n", + rv & BIT(1) ? "ACR received" : "-"); + pr_info("gen_ctl_pckt_raw%s\n", + rv & BIT(2) ? "received" : "-"); + pr_info("hdmi_mode_raw %s\n", + rv & BIT(3) ? "HDMI/MHL" : "-"); + pr_info("audio_ch_md_raw %s\n", + rv & BIT(4) ? "multichannel" : "-"); + pr_info("av_mute_raw %s\n", + rv & BIT(5) ? "received" : "-"); + pr_info("internal_mute_raw %s\n", + rv & BIT(6) ? "asserted" : "-"); + pr_info("cs_data_valid_raw %s\n", + rv & BIT(7) ? "valid" : "-"); + rv = hdmi_read(state, 0x6d); + pr_info("i2s_tdm_mode_enable %s\n", + rv & BIT(7) ? "TDM (multichannel)" : "I2S (stereo)"); + i2s_tdm_mode_enable = rv & BIT(7); + + /* i2s_tdm_mode_enable must be unset */ + if (adv748x_read_block(state, ADV748X_PAGE_HDMI, 0x36, + cs_data, ARRAY_SIZE(cs_data)) == 0) { + pr_info("... cs_data %s\n", + cs_data[0] & BIT(0) ? "pro" : "consumer"); + pr_info("... cs_data %s\n", + cs_data[0] & BIT(1) ? "other" : "L-PCM"); + pr_info("... cs_data %s copyright\n", + cs_data[0] & BIT(2) ? "no" : "asserted"); + pr_info("... cs_data %s (%lu)\n", + cs_data[0] & GENMASK(5, 3) ? + "50/15" : "no pre-emphasis", + (cs_data[0] & GENMASK(5, 3)) >> 4); + pr_info("... cs_data channels status mode %lu\n", +
[PATCH 1/8] media: adv748x: add a device-specific wrapper for register block read
Some of the devices I2C-accessible registers (for instance, cs_data for stereo channel information or tmds_params for TMDS channel information) located in adjacent cells. According to manufacturers information, these registers can be read using block transactions. Signed-off-by: Alexander Riesen --- drivers/media/i2c/adv748x/adv748x-core.c | 15 +++ drivers/media/i2c/adv748x/adv748x.h | 2 ++ 2 files changed, 17 insertions(+) diff --git a/drivers/media/i2c/adv748x/adv748x-core.c b/drivers/media/i2c/adv748x/adv748x-core.c index 23e02ff27b17..bc49aa93793c 100644 --- a/drivers/media/i2c/adv748x/adv748x-core.c +++ b/drivers/media/i2c/adv748x/adv748x-core.c @@ -97,6 +97,21 @@ static const struct adv748x_register_map adv748x_default_addresses[] = { [ADV748X_PAGE_TXA] = { "txa", 0x4a }, }; +int adv748x_read_block(struct adv748x_state *state, u8 client_page, u8 reg, + void *val, size_t reg_count) +{ + struct i2c_client *client = state->i2c_clients[client_page]; + int err; + + err = regmap_bulk_read(state->regmap[client_page], reg, val, reg_count); + if (err) { + adv_err(state, "error reading %02x, %02x-%02lx: %d\n", + client->addr, reg, reg + reg_count - 1, err); + return err; + } + return 0; +} + static int adv748x_read_check(struct adv748x_state *state, int client_page, u8 reg) { diff --git a/drivers/media/i2c/adv748x/adv748x.h b/drivers/media/i2c/adv748x/adv748x.h index 5042f9e94aee..db6346a06351 100644 --- a/drivers/media/i2c/adv748x/adv748x.h +++ b/drivers/media/i2c/adv748x/adv748x.h @@ -387,6 +387,8 @@ struct adv748x_state { /* Register handling */ int adv748x_read(struct adv748x_state *state, u8 addr, u8 reg); +int adv748x_read_block(struct adv748x_state *state, u8 page, u8 reg, + void *val, size_t reg_count); int adv748x_write(struct adv748x_state *state, u8 page, u8 reg, u8 value); int adv748x_write_block(struct adv748x_state *state, int client_page, unsigned int init_reg, const void *val, -- 2.24.1.508.g91d2dafee0 ___ devel mailing list de...@linuxdriverproject.org http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel
[PATCH 2/8] media: adv748x: add audio mute control and output selection ioctls
This change implements audio-related V4L2 ioctls for the HDMI subdevice. The master audio clock is configured for 256fs, as supported by the only device available at the moment. For the same reason, the TDM slot is formatted using left justification of its bits. Signed-off-by: Alexander Riesen --- drivers/media/i2c/adv748x/adv748x-core.c | 6 + drivers/media/i2c/adv748x/adv748x-hdmi.c | 182 +++ drivers/media/i2c/adv748x/adv748x.h | 42 ++ 3 files changed, 230 insertions(+) diff --git a/drivers/media/i2c/adv748x/adv748x-core.c b/drivers/media/i2c/adv748x/adv748x-core.c index bc49aa93793c..b6067ffb1e0d 100644 --- a/drivers/media/i2c/adv748x/adv748x-core.c +++ b/drivers/media/i2c/adv748x/adv748x-core.c @@ -150,6 +150,12 @@ static int adv748x_write_check(struct adv748x_state *state, u8 page, u8 reg, return *error; } +int adv748x_update_bits(struct adv748x_state *state, u8 page, u8 reg, u8 mask, + u8 value) +{ + return regmap_update_bits(state->regmap[page], reg, mask, value); +} + /* adv748x_write_block(): Write raw data with a maximum of I2C_SMBUS_BLOCK_MAX * size to one or more registers. * diff --git a/drivers/media/i2c/adv748x/adv748x-hdmi.c b/drivers/media/i2c/adv748x/adv748x-hdmi.c index c557f8fdf11a..9bc9237c9116 100644 --- a/drivers/media/i2c/adv748x/adv748x-hdmi.c +++ b/drivers/media/i2c/adv748x/adv748x-hdmi.c @@ -5,6 +5,7 @@ * Copyright (C) 2017 Renesas Electronics Corp. */ +#include #include #include @@ -603,11 +604,186 @@ static const struct v4l2_subdev_pad_ops adv748x_pad_ops_hdmi = { .enum_dv_timings = adv748x_hdmi_enum_dv_timings, }; +static int adv748x_hdmi_audio_mute(struct adv748x_hdmi *hdmi, int enable) +{ + struct adv748x_state *state = adv748x_hdmi_to_state(hdmi); + + return hdmi_update(state, ADV748X_HDMI_MUTE_CTRL, + ADV748X_HDMI_MUTE_CTRL_MUTE_AUDIO, + enable ? 0xff : 0); +} + + +#define HDMI_AOUT_NONE 0 +#define HDMI_AOUT_I2S 1 +#define HDMI_AOUT_I2S_TDM 2 + +static int adv748x_hdmi_enumaudout(struct adv748x_hdmi *hdmi, + struct v4l2_audioout *a) +{ + switch (a->index) { + case HDMI_AOUT_NONE: + strlcpy(a->name, "None", sizeof(a->name)); + break; + case HDMI_AOUT_I2S: + strlcpy(a->name, "I2S/stereo", sizeof(a->name)); + break; + case HDMI_AOUT_I2S_TDM: + strlcpy(a->name, "I2S-TDM/multichannel", sizeof(a->name)); + break; + default: + return -EINVAL; + } + return 0; +} + +static int adv748x_hdmi_g_audout(struct adv748x_hdmi *hdmi, +struct v4l2_audioout *a) +{ + a->index = hdmi->audio_out; + return adv748x_hdmi_enumaudout(hdmi, a); +} + +static int set_audio_pads_state(struct adv748x_state *state, int on) +{ + return io_update(state, ADV748X_IO_PAD_CONTROLS, +ADV748X_IO_PAD_CONTROLS_TRI_AUD | +ADV748X_IO_PAD_CONTROLS_PDN_AUD, +on ? 0 : 0xff); +} + +static int set_dpll_mclk_fs(struct adv748x_state *state, int fs) +{ + if (fs % 128 || fs > 768) + return -EINVAL; + return dpll_update(state, ADV748X_DPLL_MCLK_FS, + ADV748X_DPLL_MCLK_FS_N_MASK, (fs / 128) - 1); +} + +static int set_i2s_format(struct adv748x_state *state, uint outmode, + uint bitwidth) +{ + return hdmi_update(state, ADV748X_HDMI_I2S, + ADV748X_HDMI_I2SBITWIDTH_MASK | + ADV748X_HDMI_I2SOUTMODE_MASK, + (outmode << ADV748X_HDMI_I2SOUTMODE_SHIFT) | + bitwidth); +} + +static int set_i2s_tdm_mode(struct adv748x_state *state, int is_tdm) +{ + int ret; + + ret = hdmi_update(state, ADV748X_HDMI_AUDIO_MUTE_SPEED, + ADV748X_MAN_AUDIO_DL_BYPASS | + ADV748X_AUDIO_DELAY_LINE_BYPASS, + is_tdm ? 0xff : 0); + if (ret < 0) + goto fail; + ret = hdmi_update(state, ADV748X_HDMI_REG_6D, + ADV748X_I2S_TDM_MODE_ENABLE, + is_tdm ? 0xff : 0); + if (ret < 0) + goto fail; + ret = set_i2s_format(state, ADV748X_I2SOUTMODE_LEFT_J, 24); +fail: + return ret; +} + +static int set_audio_out(struct adv748x_state *state, int aout) +{ + int ret; + + switch (aout) { + case HDMI_AOUT_NONE: + ret = set_audio_pads_state(state, 0); + break; + case HDMI_AOUT_I2S: + ret = set_dpll_mclk_fs(state, 256); + if (ret < 0) + goto fail; + ret = set_i2s_tdm_mode(state, 1); + if (ret < 0) + goto fail; +
[PATCH 0/8] media: i2c: adv748x: add support for HDMI audio
This adds minimal support for controlling the audio output I2S port available on ADV7481 and ADV7482 HDMI decoder devices by ADI. The port carries audio signal from the decoded HDMI stream. An ADV7482 on the Renesas Salvator-X ES1.1 was used during development of this code. Alex Riesen (8): media: adv748x: add a device-specific wrapper for register block read media: adv748x: add audio mute control and output selection ioctls media: adv748x: add log_status ioctl media: adv748x: reserve space for the audio (I2S) port in the driver structures media: adv748x: add an ASoC DAI definition to the driver media: adv748x: reduce amount of code for bitwise modification of device registers dt-bindings: adv748x: add information about serial audio interface (I2S/TDM) arm64: dts: renesas: salvator: add a connection from adv748x codec (HDMI input) to the R-Car SoC .../devicetree/bindings/media/i2c/adv748x.txt | 13 +- .../dts/renesas/r8a7795-es1-salvator-x.dts| 24 +- .../boot/dts/renesas/salvator-common.dtsi | 35 +- drivers/media/i2c/adv748x/adv748x-core.c | 54 +++ drivers/media/i2c/adv748x/adv748x-hdmi.c | 355 ++ drivers/media/i2c/adv748x/adv748x.h | 53 ++- 6 files changed, 523 insertions(+), 11 deletions(-) -- 2.24.1.508.g91d2dafee0 ___ devel mailing list de...@linuxdriverproject.org http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel
[PATCH 8/8] arm64: dts: renesas: salvator: add a connection from adv748x codec (HDMI input) to the R-Car SoC
Not sure if all variants of the Salvator board have the HDMI decoder chip (the ADV7482) connected to the SSI4 on R-Car SoC, as it is on Salvator-X ES1, so the the ADV7482 endpoint and connection definitions are placed in the board file. I do assume though that all Salvator variants have the CLK_C clock line hard-wired to the ADV7482 HDMI decoder, and remove it from the list of clocks provided by the R-Car sound system. The I2C wiring is also likely to persist across the variants (similar to ak4613, connected to the same interface), so that is in the common file. Signed-off-by: Alexander Riesen --- .../dts/renesas/r8a7795-es1-salvator-x.dts| 24 - .../boot/dts/renesas/salvator-common.dtsi | 35 --- 2 files changed, 53 insertions(+), 6 deletions(-) diff --git a/arch/arm64/boot/dts/renesas/r8a7795-es1-salvator-x.dts b/arch/arm64/boot/dts/renesas/r8a7795-es1-salvator-x.dts index c72968623e94..10f74f7a0efe 100644 --- a/arch/arm64/boot/dts/renesas/r8a7795-es1-salvator-x.dts +++ b/arch/arm64/boot/dts/renesas/r8a7795-es1-salvator-x.dts @@ -136,9 +136,29 @@ playback = <&ssi3>; }; }; + rsnd_port3: port@3 { + reg = <3>; + rsnd_endpoint3: endpoint { + remote-endpoint = <&adv7482_i2s>; + + dai-tdm-slot-num = <8>; + dai-tdm-slot-width = <32>; + dai-format = "left_j"; + mclk-fs = <256>; + bitclock-master = <&adv7482_i2s>; + frame-master = <&adv7482_i2s>; + system-clock-direction-out; + + capture = <&ssi4>; + }; + }; }; }; +&adv7482_i2s { + remote-endpoint = <&rsnd_endpoint3>; +}; + &sata { status = "okay"; }; @@ -146,9 +166,11 @@ &sound_card { dais = <&rsnd_port0 /* ak4613 */ &rsnd_port1 /* HDMI0 */ - &rsnd_port2>; /* HDMI1 */ + &rsnd_port2 /* HDMI1 */ + &rsnd_port3>; /* adv7482 hdmi-in */ }; + &usb2_phy2 { pinctrl-0 = <&usb2_pins>; pinctrl-names = "default"; diff --git a/arch/arm64/boot/dts/renesas/salvator-common.dtsi b/arch/arm64/boot/dts/renesas/salvator-common.dtsi index 21e01056e759..e887805b16fc 100644 --- a/arch/arm64/boot/dts/renesas/salvator-common.dtsi +++ b/arch/arm64/boot/dts/renesas/salvator-common.dtsi @@ -322,6 +322,10 @@ clock-frequency = <22579200>; }; +&audio_clk_c { + clock-frequency = <12288000>; +}; + &avb { pinctrl-0 = <&avb_pins>; pinctrl-names = "default"; @@ -471,12 +475,14 @@ #address-cells = <1>; #size-cells = <0>; + #sound-dai-cells = <0>; interrupt-parent = <&gpio6>; interrupt-names = "intrq1", "intrq2"; interrupts = <30 IRQ_TYPE_LEVEL_LOW>, <31 IRQ_TYPE_LEVEL_LOW>; - + clocks = <&rcar_sound 3>, <&audio_clk_c>; + clock-names = "clk-hdmi-video", "clk-hdmi-i2s-mclk"; port@7 { reg = <7>; @@ -512,6 +518,14 @@ remote-endpoint = <&csi20_in>; }; }; + + port@c { + reg = <12>; + + adv7482_i2s: endpoint { + /* remote-endpoint defined in the board file */ + }; + }; }; csa_vdd: adc@7c { @@ -686,7 +700,8 @@ }; sound_pins: sound { - groups = "ssi01239_ctrl", "ssi0_data", "ssi1_data_a"; + groups = "ssi01239_ctrl", "ssi0_data", "ssi1_data_a", +"ssi4_data"; function = "ssi"; }; @@ -735,8 +750,8 @@ pinctrl-0 = <&sound_pins &sound_clk_pins>; pinctrl-names = "default"; - /* Single DAI */ - #sound-dai-cells = <0>; + /* multi DAI */ + #sound-dai-cells = <1>; /* audio_clkout0/1/2/3 */ #clock-cells = <1>; @@ -760,8 +775,18 @@ <&cpg CPG_MOD 1020>, <&cpg CPG_MOD 1021>, <&cpg CPG_MOD 1019>, <&cpg CPG_MOD 1018>, <&audio_clk_a>, <&cs2000>, -<&audio_clk_c>, <&cpg CPG_CORE CPG_AUDIO_CLK_I>; + clock-names = "ssi-all", + "ssi.9", "ssi.8", "ssi.7", "ssi.6", + "ssi.5", "ssi.4", "ssi.3", "ssi.2", + "ssi.1", "ssi.0", + "src.9", "src.8", "src.7", "src.6", + "src.5", "src.4", "src.3", "src.2", + "src.1", "src.0", +
[PATCH 0/8] media: i2c: adv748x: add support for HDMI audio
This adds minimal support for controlling the audio output I2S port available on ADV7481 and ADV7482 HDMI decoder devices by ADI. The port carries audio signal from the decoded HDMI stream. An ADV7482 on the Renesas Salvator-X ES1.1 was used during development of this code. Alex Riesen (8): media: adv748x: add a device-specific wrapper for register block read media: adv748x: add audio mute control and output selection ioctls media: adv748x: add log_status ioctl media: adv748x: reserve space for the audio (I2S) port in the driver structures media: adv748x: add an ASoC DAI definition to the driver media: adv748x: reduce amount of code for bitwise modification of device registers dt-bindings: adv748x: add information about serial audio interface (I2S/TDM) arm64: dts: renesas: salvator: add a connection from adv748x codec (HDMI input) to the R-Car SoC .../devicetree/bindings/media/i2c/adv748x.txt | 13 +- .../dts/renesas/r8a7795-es1-salvator-x.dts| 24 +- .../boot/dts/renesas/salvator-common.dtsi | 35 +- drivers/media/i2c/adv748x/adv748x-core.c | 54 +++ drivers/media/i2c/adv748x/adv748x-hdmi.c | 355 ++ drivers/media/i2c/adv748x/adv748x.h | 53 ++- 6 files changed, 523 insertions(+), 11 deletions(-) -- 2.24.1.508.g91d2dafee0 ___ devel mailing list de...@linuxdriverproject.org http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel
Re: [PATCH v2 3/4] dt-bindings: iio: adc: Migrate AD7606 documentation to yaml
On Wed, Aug 7, 2019 at 8:32 AM Beniamin Bia wrote: > > The documentation for ad7606 was migrated to yaml. > > Signed-off-by: Beniamin Bia > --- > Changes in v2: > -old txt file was deleted > > .../bindings/iio/adc/adi,ad7606.txt | 66 - > .../bindings/iio/adc/adi,ad7606.yaml | 134 ++ > MAINTAINERS | 2 +- > 3 files changed, 135 insertions(+), 67 deletions(-) > delete mode 100644 Documentation/devicetree/bindings/iio/adc/adi,ad7606.txt > create mode 100644 Documentation/devicetree/bindings/iio/adc/adi,ad7606.yaml > > diff --git a/Documentation/devicetree/bindings/iio/adc/adi,ad7606.txt > b/Documentation/devicetree/bindings/iio/adc/adi,ad7606.txt > deleted file mode 100644 > index d8652460198e.. > --- a/Documentation/devicetree/bindings/iio/adc/adi,ad7606.txt > +++ /dev/null > @@ -1,66 +0,0 @@ > -Analog Devices AD7606 Simultaneous Sampling ADC > - > -Required properties for the AD7606: > - > -- compatible: Must be one of > - * "adi,ad7605-4" > - * "adi,ad7606-8" > - * "adi,ad7606-6" > - * "adi,ad7606-4" > - * "adi,ad7616" > -- reg: SPI chip select number for the device > -- spi-max-frequency: Max SPI frequency to use > - see: Documentation/devicetree/bindings/spi/spi-bus.txt > -- spi-cpha: See Documentation/devicetree/bindings/spi/spi-bus.txt > -- avcc-supply: phandle to the Avcc power supply > -- interrupts: IRQ line for the ADC > - see: > Documentation/devicetree/bindings/interrupt-controller/interrupts.txt > -- adi,conversion-start-gpios: must be the device tree identifier of the > CONVST pin. > - This logic input is used to initiate conversions on the > analog > - input channels. As the line is active high, it should be > marked > - GPIO_ACTIVE_HIGH. > - > -Optional properties: > - > -- reset-gpios: must be the device tree identifier of the RESET pin. If > specified, > - it will be asserted during driver probe. As the line is active > high, > - it should be marked GPIO_ACTIVE_HIGH. > -- standby-gpios: must be the device tree identifier of the STBY pin. This > pin is used > - to place the AD7606 into one of two power-down modes, Standby > mode or > - Shutdown mode. As the line is active low, it should be marked > - GPIO_ACTIVE_LOW. > -- adi,first-data-gpios: must be the device tree identifier of the FRSTDATA > pin. > - The FRSTDATA output indicates when the first channel, V1, > is > - being read back on either the parallel, byte or serial > interface. > - As the line is active high, it should be marked > GPIO_ACTIVE_HIGH. > -- adi,range-gpios: must be the device tree identifier of the RANGE pin. The > polarity on > - this pin determines the input range of the analog input > channels. If > - this pin is tied to a logic high, the analog input range is > ±10V for > - all channels. If this pin is tied to a logic low, the analog > input range > - is ±5V for all channels. As the line is active high, it should > be marked > - GPIO_ACTIVE_HIGH. > -- adi,oversampling-ratio-gpios: must be the device tree identifier of the > over-sampling > - mode pins. As the line is active high, it > should be marked > - GPIO_ACTIVE_HIGH. > - > -Example: > - > - adc@0 { > - compatible = "adi,ad7606-8"; > - reg = <0>; > - spi-max-frequency = <100>; > - spi-cpol; > - > - avcc-supply = <&adc_vref>; > - > - interrupts = <25 IRQ_TYPE_EDGE_FALLING>; > - interrupt-parent = <&gpio>; > - > - adi,conversion-start-gpios = <&gpio 17 GPIO_ACTIVE_HIGH>; > - reset-gpios = <&gpio 27 GPIO_ACTIVE_HIGH>; > - adi,first-data-gpios = <&gpio 22 GPIO_ACTIVE_HIGH>; > - adi,oversampling-ratio-gpios = <&gpio 18 GPIO_ACTIVE_HIGH > - &gpio 23 GPIO_ACTIVE_HIGH > - &gpio 26 GPIO_ACTIVE_HIGH>; > - standby-gpios = <&gpio 24 GPIO_ACTIVE_LOW>; > - }; > diff --git a/Documentation/devicetree/bindings/iio/adc/adi,ad7606.yaml > b/Documentation/devicetree/bindings/iio/adc/adi,ad7606.yaml > new file mode 100644 > index ..509dbe9c84d2 > --- /dev/null > +++ b/Documentation/devicetree/bindings/iio/adc/adi,ad7606.yaml > @@ -0,0 +1,134 @@ > +# SPDX-License-Identifier: GPL-2.0 > +%YAML 1.2 > +--- > +$id: http://devicetree.org/schemas/iio/adc/adi,ad7606.yaml# > +$schema: http://devicetree.org/meta-schemas/core.yaml# > + > +title: Analog Devices AD7606 Simultaneous Sampling ADC > + > +maintainers: > + - Beniamin Bia > + - Stefan Popa > + > +descripti
Re: [PATCH] media: staging: rkisp1: Fix undefined reference to `phy_mipi_dphy_get_default_config' in rkisp1_mipi_csi2_start
Hi Zhang, Thank you for the patch. On 1/13/20 1:48 AM, Zhang Xiaoxu wrote: > If 'GENERIC_PHY_MIPI_DPHY' not configured, there is an error: > > drivers/staging/media/rkisp1/rkisp1-isp.o: > In function `rkisp1_mipi_csi2_start.isra.5': > rkisp1-isp.c:(.text+0x1238): > undefined reference to `phy_mipi_dphy_get_default_config' > make: *** [vmlinux] Error 1 > > Signed-off-by: Zhang Xiaoxu > --- > drivers/staging/media/rkisp1/Kconfig | 1 + > 1 file changed, 1 insertion(+) > > diff --git a/drivers/staging/media/rkisp1/Kconfig > b/drivers/staging/media/rkisp1/Kconfig > index b859a493caba..788bcb703376 100644 > --- a/drivers/staging/media/rkisp1/Kconfig > +++ b/drivers/staging/media/rkisp1/Kconfig > @@ -8,6 +8,7 @@ config VIDEO_ROCKCHIP_ISP1 > select VIDEOBUF2_VMALLOC > select V4L2_FWNODE > select PHY_ROCKCHIP_DPHY_RX0 > + select GENERIC_PHY_MIPI_DPHY > default n > help > Enable this to support the Image Signal Processing (ISP) module > How are you reproducing this? VIDEO_ROCKCHIP_ISP1 selects PHY_ROCKCHIP_DPHY_RX0 and PHY_ROCKCHIP_DPHY_RX0 already selects GENERIC_PHY_MIPI_DPHY, So it shouldn't be a problem (unless I misunderstood something, which is probably the case). Thanks Helen ___ devel mailing list de...@linuxdriverproject.org http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel
[PATCH] staging: rtl8188eu: remove unused parameters from rtw_check_network_type
Parameters 'ratelen' and 'channel' of function rtw_check_network_type are unused, remove them. Reduces object file size by 62 bytes. textdata bss dec hex filename 398525 128964688 416109 6596d drivers/staging/rtl8188eu/r8188eu.o 398463 128964688 416047 6592f drivers/staging/rtl8188eu/r8188eu.o Signed-off-by: Michael Straube --- drivers/staging/rtl8188eu/core/rtw_ap.c| 4 ++-- drivers/staging/rtl8188eu/core/rtw_ieee80211.c | 2 +- drivers/staging/rtl8188eu/include/ieee80211.h | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/drivers/staging/rtl8188eu/core/rtw_ap.c b/drivers/staging/rtl8188eu/core/rtw_ap.c index 88e42cc1d837..93283c7deec4 100644 --- a/drivers/staging/rtl8188eu/core/rtw_ap.c +++ b/drivers/staging/rtl8188eu/core/rtw_ap.c @@ -429,7 +429,7 @@ static void update_bmc_sta(struct adapter *padapter) /* prepare for add_RATid */ supportRateNum = rtw_get_rateset_len((u8 *)&pcur_network->SupportedRates); - network_type = rtw_check_network_type((u8 *)&pcur_network->SupportedRates, supportRateNum, 1); + network_type = rtw_check_network_type((u8 *)&pcur_network->SupportedRates); memcpy(psta->bssrateset, &pcur_network->SupportedRates, supportRateNum); psta->bssratelen = supportRateNum; @@ -802,7 +802,7 @@ int rtw_check_beacon_data(struct adapter *padapter, u8 *pbuf, int len) supportRateNum += ie_len; } - network_type = rtw_check_network_type(supportRate, supportRateNum, channel); + network_type = rtw_check_network_type(supportRate); rtw_set_supported_rate(pbss_network->SupportedRates, network_type); diff --git a/drivers/staging/rtl8188eu/core/rtw_ieee80211.c b/drivers/staging/rtl8188eu/core/rtw_ieee80211.c index cc1b5438c04c..1344d369e05d 100644 --- a/drivers/staging/rtl8188eu/core/rtw_ieee80211.c +++ b/drivers/staging/rtl8188eu/core/rtw_ieee80211.c @@ -98,7 +98,7 @@ bool rtw_is_cckratesonly_included(u8 *rate) return true; } -int rtw_check_network_type(unsigned char *rate, int ratelen, int channel) +int rtw_check_network_type(unsigned char *rate) { /* could be pure B, pure G, or B/G */ if (rtw_is_cckratesonly_included(rate)) diff --git a/drivers/staging/rtl8188eu/include/ieee80211.h b/drivers/staging/rtl8188eu/include/ieee80211.h index d569fe5ed8e6..75f0ebe0faf5 100644 --- a/drivers/staging/rtl8188eu/include/ieee80211.h +++ b/drivers/staging/rtl8188eu/include/ieee80211.h @@ -765,7 +765,7 @@ bool rtw_is_cckrates_included(u8 *rate); bool rtw_is_cckratesonly_included(u8 *rate); -int rtw_check_network_type(unsigned char *rate, int ratelen, int channel); +int rtw_check_network_type(unsigned char *rate); void rtw_get_bcn_info(struct wlan_network *pnetwork); -- 2.24.1 ___ devel mailing list de...@linuxdriverproject.org http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel
Re: [PATCH 7/8] dt-bindings: adv748x: add information about serial audio interface (I2S/TDM)
On Mon, 13 Jan 2020 15:15:50 +0100, Alex Riesen wrote: > As the driver has some support for the audio interface of the device, > the bindings file should mention it. > > Signed-off-by: Alexander Riesen > --- > .../devicetree/bindings/media/i2c/adv748x.txt | 13 - > 1 file changed, 12 insertions(+), 1 deletion(-) > Reviewed-by: Rob Herring ___ devel mailing list de...@linuxdriverproject.org http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel
Re: [PATCH] media: staging: rkisp1: Fix undefined reference to `phy_mipi_dphy_get_default_config' in rkisp1_mipi_csi2_start
在 2020/1/14 1:34, Helen Koike 写道: Hi Zhang, Thank you for the patch. On 1/13/20 1:48 AM, Zhang Xiaoxu wrote: If 'GENERIC_PHY_MIPI_DPHY' not configured, there is an error: drivers/staging/media/rkisp1/rkisp1-isp.o: In function `rkisp1_mipi_csi2_start.isra.5': rkisp1-isp.c:(.text+0x1238): undefined reference to `phy_mipi_dphy_get_default_config' make: *** [vmlinux] Error 1 Signed-off-by: Zhang Xiaoxu --- drivers/staging/media/rkisp1/Kconfig | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/staging/media/rkisp1/Kconfig b/drivers/staging/media/rkisp1/Kconfig index b859a493caba..788bcb703376 100644 --- a/drivers/staging/media/rkisp1/Kconfig +++ b/drivers/staging/media/rkisp1/Kconfig @@ -8,6 +8,7 @@ config VIDEO_ROCKCHIP_ISP1 select VIDEOBUF2_VMALLOC select V4L2_FWNODE select PHY_ROCKCHIP_DPHY_RX0 + select GENERIC_PHY_MIPI_DPHY default n help Enable this to support the Image Signal Processing (ISP) module How are you reproducing this? VIDEO_ROCKCHIP_ISP1 selects PHY_ROCKCHIP_DPHY_RX0 and PHY_ROCKCHIP_DPHY_RX0 already selects GENERIC_PHY_MIPI_DPHY, So it shouldn't be a problem (unless I misunderstood something, which is probably the case). Yes, you are right. This can be reproduce with the following config: # CONFIG_OF is not set # # soc_camera sensor drivers # CONFIG_PHY_ROCKCHIP_DPHY_RX0=y CONFIG_VIDEO_ROCKCHIP_ISP1=y I think the cause of the problem is: 'CONFIG_PHY_ROCKCHIP_DPHY_RX0' should also be depended on 'CONFIG_OF'. Thanks Helen ___ devel mailing list de...@linuxdriverproject.org http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel
[PATCH v2] media: staging: rkisp1: The rkisp1 should be depended on CONFIG_OF
If 'CONFIG_VIDEO_ROCKCHIP_ISP1' configured but no 'CONFIG_OF', the default configuration maybe: # CONFIG_OF is not set CONFIG_PHY_ROCKCHIP_DPHY_RX0=y CONFIG_VIDEO_ROCKCHIP_ISP1=y This will cause the following compilation errors: drivers/staging/media/rkisp1/rkisp1-isp.o: In function `rkisp1_mipi_csi2_start.isra.5': rkisp1-isp.c:(.text+0x1238): undefined reference to `phy_mipi_dphy_get_default_config' make: *** [vmlinux] Error 1 Signed-off-by: Zhang Xiaoxu --- drivers/staging/media/rkisp1/Kconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/staging/media/rkisp1/Kconfig b/drivers/staging/media/rkisp1/Kconfig index b859a493caba..23080b7f07a6 100644 --- a/drivers/staging/media/rkisp1/Kconfig +++ b/drivers/staging/media/rkisp1/Kconfig @@ -3,7 +3,7 @@ config VIDEO_ROCKCHIP_ISP1 tristate "Rockchip Image Signal Processing v1 Unit driver" depends on VIDEO_V4L2 && VIDEO_V4L2_SUBDEV_API - depends on ARCH_ROCKCHIP || COMPILE_TEST + depends on (ARCH_ROCKCHIP || COMPILE_TEST) && OF select VIDEOBUF2_DMA_CONTIG select VIDEOBUF2_VMALLOC select V4L2_FWNODE -- 2.17.2 ___ devel mailing list de...@linuxdriverproject.org http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel
Re: [PATCH] media: staging: rkisp1: Fix undefined reference to `phy_mipi_dphy_get_default_config' in rkisp1_mipi_csi2_start
On 1/13/20 11:53 PM, zhangxiaoxu (A) wrote: > > > 在 2020/1/14 1:34, Helen Koike 写道: >> Hi Zhang, >> >> Thank you for the patch. >> >> On 1/13/20 1:48 AM, Zhang Xiaoxu wrote: >>> If 'GENERIC_PHY_MIPI_DPHY' not configured, there is an error: >>> >>> drivers/staging/media/rkisp1/rkisp1-isp.o: >>> In function `rkisp1_mipi_csi2_start.isra.5': >>> rkisp1-isp.c:(.text+0x1238): >>> undefined reference to `phy_mipi_dphy_get_default_config' >>> make: *** [vmlinux] Error 1 >>> >>> Signed-off-by: Zhang Xiaoxu >>> --- >>> drivers/staging/media/rkisp1/Kconfig | 1 + >>> 1 file changed, 1 insertion(+) >>> >>> diff --git a/drivers/staging/media/rkisp1/Kconfig >>> b/drivers/staging/media/rkisp1/Kconfig >>> index b859a493caba..788bcb703376 100644 >>> --- a/drivers/staging/media/rkisp1/Kconfig >>> +++ b/drivers/staging/media/rkisp1/Kconfig >>> @@ -8,6 +8,7 @@ config VIDEO_ROCKCHIP_ISP1 >>> select VIDEOBUF2_VMALLOC >>> select V4L2_FWNODE >>> select PHY_ROCKCHIP_DPHY_RX0 >>> + select GENERIC_PHY_MIPI_DPHY >>> default n >>> help >>> Enable this to support the Image Signal Processing (ISP) module >>> >> >> How are you reproducing this? >> >> VIDEO_ROCKCHIP_ISP1 selects PHY_ROCKCHIP_DPHY_RX0 >> >> and >> >> PHY_ROCKCHIP_DPHY_RX0 already selects GENERIC_PHY_MIPI_DPHY, >> >> So it shouldn't be a problem (unless I misunderstood something, which is >> probably the case). > Yes, you are right. > > This can be reproduce with the following config: > # CONFIG_OF is not set > # > # soc_camera sensor drivers > # > CONFIG_PHY_ROCKCHIP_DPHY_RX0=y > CONFIG_VIDEO_ROCKCHIP_ISP1=y > > I think the cause of the problem is: > 'CONFIG_PHY_ROCKCHIP_DPHY_RX0' should also be depended on 'CONFIG_OF'. > You probably mean 'CONFIG_VIDEO_ROCKCHIP_ISP1' right? As the phy driver already depends on OF. Yes, if I understand correctly it should. Could you send a patching adding it? Thanks Helen ___ devel mailing list de...@linuxdriverproject.org http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel