13337744aSKuninori Morimoto /* 23337744aSKuninori Morimoto * Renesas R-Car Gen1 SRU/SSI support 33337744aSKuninori Morimoto * 43337744aSKuninori Morimoto * Copyright (C) 2013 Renesas Solutions Corp. 53337744aSKuninori Morimoto * Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> 63337744aSKuninori Morimoto * 73337744aSKuninori Morimoto * This program is free software; you can redistribute it and/or modify 83337744aSKuninori Morimoto * it under the terms of the GNU General Public License version 2 as 93337744aSKuninori Morimoto * published by the Free Software Foundation. 103337744aSKuninori Morimoto */ 113337744aSKuninori Morimoto #include "rsnd.h" 123337744aSKuninori Morimoto 133337744aSKuninori Morimoto struct rsnd_gen { 143337744aSKuninori Morimoto void __iomem *base[RSND_BASE_MAX]; 153337744aSKuninori Morimoto 163337744aSKuninori Morimoto struct rsnd_gen_ops *ops; 1755e5b6fdSKuninori Morimoto 1855e5b6fdSKuninori Morimoto struct regmap *regmap; 1955e5b6fdSKuninori Morimoto struct regmap_field *regs[RSND_REG_MAX]; 203337744aSKuninori Morimoto }; 213337744aSKuninori Morimoto 223337744aSKuninori Morimoto #define rsnd_priv_to_gen(p) ((struct rsnd_gen *)(p)->gen) 233337744aSKuninori Morimoto 2455e5b6fdSKuninori Morimoto #define RSND_REG_SET(gen, id, reg_id, offset, _id_offset, _id_size) \ 2555e5b6fdSKuninori Morimoto [id] = { \ 2655e5b6fdSKuninori Morimoto .reg = (unsigned int)gen->base[reg_id] + offset, \ 2755e5b6fdSKuninori Morimoto .lsb = 0, \ 2855e5b6fdSKuninori Morimoto .msb = 31, \ 2955e5b6fdSKuninori Morimoto .id_size = _id_size, \ 3055e5b6fdSKuninori Morimoto .id_offset = _id_offset, \ 3155e5b6fdSKuninori Morimoto } 3255e5b6fdSKuninori Morimoto 3355e5b6fdSKuninori Morimoto /* 3455e5b6fdSKuninori Morimoto * basic function 3555e5b6fdSKuninori Morimoto */ 3655e5b6fdSKuninori Morimoto static int rsnd_regmap_write32(void *context, const void *_data, size_t count) 3755e5b6fdSKuninori Morimoto { 3855e5b6fdSKuninori Morimoto struct rsnd_priv *priv = context; 3955e5b6fdSKuninori Morimoto struct device *dev = rsnd_priv_to_dev(priv); 4055e5b6fdSKuninori Morimoto u32 *data = (u32 *)_data; 4155e5b6fdSKuninori Morimoto u32 val = data[1]; 4255e5b6fdSKuninori Morimoto void __iomem *reg = (void *)data[0]; 4355e5b6fdSKuninori Morimoto 4455e5b6fdSKuninori Morimoto iowrite32(val, reg); 4555e5b6fdSKuninori Morimoto 4655e5b6fdSKuninori Morimoto dev_dbg(dev, "w %p : %08x\n", reg, val); 4755e5b6fdSKuninori Morimoto 4855e5b6fdSKuninori Morimoto return 0; 4955e5b6fdSKuninori Morimoto } 5055e5b6fdSKuninori Morimoto 5155e5b6fdSKuninori Morimoto static int rsnd_regmap_read32(void *context, 5255e5b6fdSKuninori Morimoto const void *_data, size_t reg_size, 5355e5b6fdSKuninori Morimoto void *_val, size_t val_size) 5455e5b6fdSKuninori Morimoto { 5555e5b6fdSKuninori Morimoto struct rsnd_priv *priv = context; 5655e5b6fdSKuninori Morimoto struct device *dev = rsnd_priv_to_dev(priv); 5755e5b6fdSKuninori Morimoto u32 *data = (u32 *)_data; 5855e5b6fdSKuninori Morimoto u32 *val = (u32 *)_val; 5955e5b6fdSKuninori Morimoto void __iomem *reg = (void *)data[0]; 6055e5b6fdSKuninori Morimoto 6155e5b6fdSKuninori Morimoto *val = ioread32(reg); 6255e5b6fdSKuninori Morimoto 6355e5b6fdSKuninori Morimoto dev_dbg(dev, "r %p : %08x\n", reg, *val); 6455e5b6fdSKuninori Morimoto 6555e5b6fdSKuninori Morimoto return 0; 6655e5b6fdSKuninori Morimoto } 6755e5b6fdSKuninori Morimoto 6855e5b6fdSKuninori Morimoto static struct regmap_bus rsnd_regmap_bus = { 6955e5b6fdSKuninori Morimoto .write = rsnd_regmap_write32, 7055e5b6fdSKuninori Morimoto .read = rsnd_regmap_read32, 7155e5b6fdSKuninori Morimoto .reg_format_endian_default = REGMAP_ENDIAN_NATIVE, 7255e5b6fdSKuninori Morimoto .val_format_endian_default = REGMAP_ENDIAN_NATIVE, 7355e5b6fdSKuninori Morimoto }; 7455e5b6fdSKuninori Morimoto 7542ee5d22SKuninori Morimoto static int rsnd_is_accessible_reg(struct rsnd_priv *priv, 7642ee5d22SKuninori Morimoto struct rsnd_gen *gen, enum rsnd_reg reg) 7742ee5d22SKuninori Morimoto { 7842ee5d22SKuninori Morimoto if (!gen->regs[reg]) { 7942ee5d22SKuninori Morimoto struct device *dev = rsnd_priv_to_dev(priv); 8042ee5d22SKuninori Morimoto 8142ee5d22SKuninori Morimoto dev_err(dev, "unsupported register access %x\n", reg); 8242ee5d22SKuninori Morimoto return 0; 8342ee5d22SKuninori Morimoto } 8442ee5d22SKuninori Morimoto 8542ee5d22SKuninori Morimoto return 1; 8642ee5d22SKuninori Morimoto } 8742ee5d22SKuninori Morimoto 8855e5b6fdSKuninori Morimoto u32 rsnd_read(struct rsnd_priv *priv, 8955e5b6fdSKuninori Morimoto struct rsnd_mod *mod, enum rsnd_reg reg) 9055e5b6fdSKuninori Morimoto { 9155e5b6fdSKuninori Morimoto struct rsnd_gen *gen = rsnd_priv_to_gen(priv); 9255e5b6fdSKuninori Morimoto u32 val; 9355e5b6fdSKuninori Morimoto 9442ee5d22SKuninori Morimoto if (!rsnd_is_accessible_reg(priv, gen, reg)) 9542ee5d22SKuninori Morimoto return 0; 9642ee5d22SKuninori Morimoto 9755e5b6fdSKuninori Morimoto regmap_fields_read(gen->regs[reg], rsnd_mod_id(mod), &val); 9855e5b6fdSKuninori Morimoto 9955e5b6fdSKuninori Morimoto return val; 10055e5b6fdSKuninori Morimoto } 10155e5b6fdSKuninori Morimoto 10255e5b6fdSKuninori Morimoto void rsnd_write(struct rsnd_priv *priv, 10355e5b6fdSKuninori Morimoto struct rsnd_mod *mod, 10455e5b6fdSKuninori Morimoto enum rsnd_reg reg, u32 data) 10555e5b6fdSKuninori Morimoto { 10655e5b6fdSKuninori Morimoto struct rsnd_gen *gen = rsnd_priv_to_gen(priv); 10755e5b6fdSKuninori Morimoto 10842ee5d22SKuninori Morimoto if (!rsnd_is_accessible_reg(priv, gen, reg)) 10942ee5d22SKuninori Morimoto return; 11042ee5d22SKuninori Morimoto 11155e5b6fdSKuninori Morimoto regmap_fields_write(gen->regs[reg], rsnd_mod_id(mod), data); 11255e5b6fdSKuninori Morimoto } 11355e5b6fdSKuninori Morimoto 11455e5b6fdSKuninori Morimoto void rsnd_bset(struct rsnd_priv *priv, struct rsnd_mod *mod, 11555e5b6fdSKuninori Morimoto enum rsnd_reg reg, u32 mask, u32 data) 11655e5b6fdSKuninori Morimoto { 11755e5b6fdSKuninori Morimoto struct rsnd_gen *gen = rsnd_priv_to_gen(priv); 11855e5b6fdSKuninori Morimoto 11942ee5d22SKuninori Morimoto if (!rsnd_is_accessible_reg(priv, gen, reg)) 12042ee5d22SKuninori Morimoto return; 12142ee5d22SKuninori Morimoto 12255e5b6fdSKuninori Morimoto regmap_fields_update_bits(gen->regs[reg], rsnd_mod_id(mod), 12355e5b6fdSKuninori Morimoto mask, data); 12455e5b6fdSKuninori Morimoto } 12555e5b6fdSKuninori Morimoto 126c1e6cc5eSKuninori Morimoto static int rsnd_gen_regmap_init(struct rsnd_priv *priv, 127c1e6cc5eSKuninori Morimoto struct rsnd_gen *gen, 128c1e6cc5eSKuninori Morimoto struct reg_field *regf) 129c1e6cc5eSKuninori Morimoto { 130c1e6cc5eSKuninori Morimoto int i; 131c1e6cc5eSKuninori Morimoto struct device *dev = rsnd_priv_to_dev(priv); 132c1e6cc5eSKuninori Morimoto struct regmap_config regc; 133c1e6cc5eSKuninori Morimoto 134c1e6cc5eSKuninori Morimoto memset(®c, 0, sizeof(regc)); 135c1e6cc5eSKuninori Morimoto regc.reg_bits = 32; 136c1e6cc5eSKuninori Morimoto regc.val_bits = 32; 137c1e6cc5eSKuninori Morimoto 138c1e6cc5eSKuninori Morimoto gen->regmap = devm_regmap_init(dev, &rsnd_regmap_bus, priv, ®c); 139c1e6cc5eSKuninori Morimoto if (IS_ERR(gen->regmap)) { 140c1e6cc5eSKuninori Morimoto dev_err(dev, "regmap error %ld\n", PTR_ERR(gen->regmap)); 141c1e6cc5eSKuninori Morimoto return PTR_ERR(gen->regmap); 142c1e6cc5eSKuninori Morimoto } 143c1e6cc5eSKuninori Morimoto 144c1e6cc5eSKuninori Morimoto for (i = 0; i < RSND_REG_MAX; i++) { 14542ee5d22SKuninori Morimoto gen->regs[i] = NULL; 14642ee5d22SKuninori Morimoto if (!regf[i].reg) 14742ee5d22SKuninori Morimoto continue; 14842ee5d22SKuninori Morimoto 149c1e6cc5eSKuninori Morimoto gen->regs[i] = devm_regmap_field_alloc(dev, gen->regmap, regf[i]); 150c1e6cc5eSKuninori Morimoto if (IS_ERR(gen->regs[i])) 151c1e6cc5eSKuninori Morimoto return PTR_ERR(gen->regs[i]); 152c1e6cc5eSKuninori Morimoto 153c1e6cc5eSKuninori Morimoto } 154c1e6cc5eSKuninori Morimoto 155c1e6cc5eSKuninori Morimoto return 0; 156c1e6cc5eSKuninori Morimoto } 1573337744aSKuninori Morimoto 158994a9df1SKuninori Morimoto int rsnd_gen_path_init(struct rsnd_priv *priv, 15907539c1dSKuninori Morimoto struct rsnd_dai *rdai, 16007539c1dSKuninori Morimoto struct rsnd_dai_stream *io) 16107539c1dSKuninori Morimoto { 16207539c1dSKuninori Morimoto struct rsnd_mod *mod; 16307539c1dSKuninori Morimoto int ret; 16407539c1dSKuninori Morimoto int id; 16507539c1dSKuninori Morimoto 16607539c1dSKuninori Morimoto /* 16707539c1dSKuninori Morimoto * Gen1 is created by SRU/SSI, and this SRU is base module of 16807539c1dSKuninori Morimoto * Gen2's SCU/SSIU/SSI. (Gen2 SCU/SSIU came from SRU) 16907539c1dSKuninori Morimoto * 17007539c1dSKuninori Morimoto * Easy image is.. 17107539c1dSKuninori Morimoto * Gen1 SRU = Gen2 SCU + SSIU + etc 17207539c1dSKuninori Morimoto * 17307539c1dSKuninori Morimoto * Gen2 SCU path is very flexible, but, Gen1 SRU (SCU parts) is 17407539c1dSKuninori Morimoto * using fixed path. 17507539c1dSKuninori Morimoto * 17607539c1dSKuninori Morimoto * Then, SSI id = SCU id here 17707539c1dSKuninori Morimoto */ 17807539c1dSKuninori Morimoto 1794b4dab82SKuninori Morimoto /* get SSI's ID */ 1804b4dab82SKuninori Morimoto mod = rsnd_ssi_mod_get_frm_dai(priv, 1814b4dab82SKuninori Morimoto rsnd_dai_id(priv, rdai), 1824b4dab82SKuninori Morimoto rsnd_dai_is_play(rdai, io)); 1834b4dab82SKuninori Morimoto id = rsnd_mod_id(mod); 18407539c1dSKuninori Morimoto 185ae5c3223SKuninori Morimoto /* SSI */ 186ae5c3223SKuninori Morimoto mod = rsnd_ssi_mod_get(priv, id); 187ae5c3223SKuninori Morimoto ret = rsnd_dai_connect(rdai, mod, io); 188ae5c3223SKuninori Morimoto if (ret < 0) 189ae5c3223SKuninori Morimoto return ret; 190ae5c3223SKuninori Morimoto 19107539c1dSKuninori Morimoto /* SCU */ 19207539c1dSKuninori Morimoto mod = rsnd_scu_mod_get(priv, id); 19307539c1dSKuninori Morimoto ret = rsnd_dai_connect(rdai, mod, io); 19407539c1dSKuninori Morimoto 19507539c1dSKuninori Morimoto return ret; 19607539c1dSKuninori Morimoto } 19707539c1dSKuninori Morimoto 198994a9df1SKuninori Morimoto int rsnd_gen_path_exit(struct rsnd_priv *priv, 19907539c1dSKuninori Morimoto struct rsnd_dai *rdai, 20007539c1dSKuninori Morimoto struct rsnd_dai_stream *io) 20107539c1dSKuninori Morimoto { 20207539c1dSKuninori Morimoto struct rsnd_mod *mod, *n; 20307539c1dSKuninori Morimoto int ret = 0; 20407539c1dSKuninori Morimoto 20507539c1dSKuninori Morimoto /* 20607539c1dSKuninori Morimoto * remove all mod from rdai 20707539c1dSKuninori Morimoto */ 20807539c1dSKuninori Morimoto for_each_rsnd_mod(mod, n, io) 20907539c1dSKuninori Morimoto ret |= rsnd_dai_disconnect(mod); 21007539c1dSKuninori Morimoto 21107539c1dSKuninori Morimoto return ret; 21207539c1dSKuninori Morimoto } 21307539c1dSKuninori Morimoto 214994a9df1SKuninori Morimoto /* 215994a9df1SKuninori Morimoto * Gen2 216994a9df1SKuninori Morimoto * will be filled in the future 217994a9df1SKuninori Morimoto */ 218994a9df1SKuninori Morimoto 219994a9df1SKuninori Morimoto /* 220994a9df1SKuninori Morimoto * Gen1 221994a9df1SKuninori Morimoto */ 222994a9df1SKuninori Morimoto 22355e5b6fdSKuninori Morimoto /* single address mapping */ 22455e5b6fdSKuninori Morimoto #define RSND_GEN1_S_REG(gen, reg, id, offset) \ 22555e5b6fdSKuninori Morimoto RSND_REG_SET(gen, RSND_REG_##id, RSND_GEN1_##reg, offset, 0, 9) 22607539c1dSKuninori Morimoto 22755e5b6fdSKuninori Morimoto /* multi address mapping */ 22855e5b6fdSKuninori Morimoto #define RSND_GEN1_M_REG(gen, reg, id, offset, _id_offset) \ 22955e5b6fdSKuninori Morimoto RSND_REG_SET(gen, RSND_REG_##id, RSND_GEN1_##reg, offset, _id_offset, 9) 23055e5b6fdSKuninori Morimoto 23155e5b6fdSKuninori Morimoto static int rsnd_gen1_regmap_init(struct rsnd_priv *priv, struct rsnd_gen *gen) 23207539c1dSKuninori Morimoto { 23355e5b6fdSKuninori Morimoto struct reg_field regf[RSND_REG_MAX] = { 23455e5b6fdSKuninori Morimoto RSND_GEN1_S_REG(gen, SRU, SRC_ROUTE_SEL, 0x00), 23555e5b6fdSKuninori Morimoto RSND_GEN1_S_REG(gen, SRU, SRC_TMG_SEL0, 0x08), 23655e5b6fdSKuninori Morimoto RSND_GEN1_S_REG(gen, SRU, SRC_TMG_SEL1, 0x0c), 23755e5b6fdSKuninori Morimoto RSND_GEN1_S_REG(gen, SRU, SRC_TMG_SEL2, 0x10), 23855e5b6fdSKuninori Morimoto RSND_GEN1_S_REG(gen, SRU, SRC_CTRL, 0xc0), 23955e5b6fdSKuninori Morimoto RSND_GEN1_S_REG(gen, SRU, SSI_MODE0, 0xD0), 24055e5b6fdSKuninori Morimoto RSND_GEN1_S_REG(gen, SRU, SSI_MODE1, 0xD4), 24155e5b6fdSKuninori Morimoto RSND_GEN1_M_REG(gen, SRU, BUSIF_MODE, 0x20, 0x4), 24255e5b6fdSKuninori Morimoto RSND_GEN1_M_REG(gen, SRU, BUSIF_ADINR, 0x214, 0x40), 243dfc9403bSKuninori Morimoto 24455e5b6fdSKuninori Morimoto RSND_GEN1_S_REG(gen, ADG, BRRA, 0x00), 24555e5b6fdSKuninori Morimoto RSND_GEN1_S_REG(gen, ADG, BRRB, 0x04), 24655e5b6fdSKuninori Morimoto RSND_GEN1_S_REG(gen, ADG, SSICKR, 0x08), 24755e5b6fdSKuninori Morimoto RSND_GEN1_S_REG(gen, ADG, AUDIO_CLK_SEL0, 0x0c), 24855e5b6fdSKuninori Morimoto RSND_GEN1_S_REG(gen, ADG, AUDIO_CLK_SEL1, 0x10), 249ae5c3223SKuninori Morimoto 25055e5b6fdSKuninori Morimoto RSND_GEN1_M_REG(gen, SSI, SSICR, 0x00, 0x40), 25155e5b6fdSKuninori Morimoto RSND_GEN1_M_REG(gen, SSI, SSISR, 0x04, 0x40), 25255e5b6fdSKuninori Morimoto RSND_GEN1_M_REG(gen, SSI, SSITDR, 0x08, 0x40), 25355e5b6fdSKuninori Morimoto RSND_GEN1_M_REG(gen, SSI, SSIRDR, 0x0c, 0x40), 25455e5b6fdSKuninori Morimoto RSND_GEN1_M_REG(gen, SSI, SSIWSR, 0x20, 0x40), 25555e5b6fdSKuninori Morimoto }; 25655e5b6fdSKuninori Morimoto 257c1e6cc5eSKuninori Morimoto return rsnd_gen_regmap_init(priv, gen, regf); 25807539c1dSKuninori Morimoto } 25907539c1dSKuninori Morimoto 2603337744aSKuninori Morimoto static int rsnd_gen1_probe(struct platform_device *pdev, 2613337744aSKuninori Morimoto struct rcar_snd_info *info, 2623337744aSKuninori Morimoto struct rsnd_priv *priv) 2633337744aSKuninori Morimoto { 26407539c1dSKuninori Morimoto struct device *dev = rsnd_priv_to_dev(priv); 26507539c1dSKuninori Morimoto struct rsnd_gen *gen = rsnd_priv_to_gen(priv); 26607539c1dSKuninori Morimoto struct resource *sru_res; 267dfc9403bSKuninori Morimoto struct resource *adg_res; 268ae5c3223SKuninori Morimoto struct resource *ssi_res; 26955e5b6fdSKuninori Morimoto int ret; 27007539c1dSKuninori Morimoto 27107539c1dSKuninori Morimoto /* 27207539c1dSKuninori Morimoto * map address 27307539c1dSKuninori Morimoto */ 27407539c1dSKuninori Morimoto sru_res = platform_get_resource(pdev, IORESOURCE_MEM, RSND_GEN1_SRU); 275dfc9403bSKuninori Morimoto adg_res = platform_get_resource(pdev, IORESOURCE_MEM, RSND_GEN1_ADG); 276ae5c3223SKuninori Morimoto ssi_res = platform_get_resource(pdev, IORESOURCE_MEM, RSND_GEN1_SSI); 27707539c1dSKuninori Morimoto 27807539c1dSKuninori Morimoto gen->base[RSND_GEN1_SRU] = devm_ioremap_resource(dev, sru_res); 279dfc9403bSKuninori Morimoto gen->base[RSND_GEN1_ADG] = devm_ioremap_resource(dev, adg_res); 280ae5c3223SKuninori Morimoto gen->base[RSND_GEN1_SSI] = devm_ioremap_resource(dev, ssi_res); 28170263cb4SWei Yongjun if (IS_ERR(gen->base[RSND_GEN1_SRU]) || 28270263cb4SWei Yongjun IS_ERR(gen->base[RSND_GEN1_ADG]) || 28370263cb4SWei Yongjun IS_ERR(gen->base[RSND_GEN1_SSI])) 28407539c1dSKuninori Morimoto return -ENODEV; 28507539c1dSKuninori Morimoto 28655e5b6fdSKuninori Morimoto ret = rsnd_gen1_regmap_init(priv, gen); 28755e5b6fdSKuninori Morimoto if (ret < 0) 28855e5b6fdSKuninori Morimoto return ret; 28907539c1dSKuninori Morimoto 29007539c1dSKuninori Morimoto dev_dbg(dev, "Gen1 device probed\n"); 29107539c1dSKuninori Morimoto dev_dbg(dev, "SRU : %08x => %p\n", sru_res->start, 29207539c1dSKuninori Morimoto gen->base[RSND_GEN1_SRU]); 293dfc9403bSKuninori Morimoto dev_dbg(dev, "ADG : %08x => %p\n", adg_res->start, 294dfc9403bSKuninori Morimoto gen->base[RSND_GEN1_ADG]); 295ae5c3223SKuninori Morimoto dev_dbg(dev, "SSI : %08x => %p\n", ssi_res->start, 296ae5c3223SKuninori Morimoto gen->base[RSND_GEN1_SSI]); 29707539c1dSKuninori Morimoto 2983337744aSKuninori Morimoto return 0; 299ae5c3223SKuninori Morimoto 3003337744aSKuninori Morimoto } 3013337744aSKuninori Morimoto 3023337744aSKuninori Morimoto /* 3033337744aSKuninori Morimoto * Gen 3043337744aSKuninori Morimoto */ 3053337744aSKuninori Morimoto int rsnd_gen_probe(struct platform_device *pdev, 3063337744aSKuninori Morimoto struct rcar_snd_info *info, 3073337744aSKuninori Morimoto struct rsnd_priv *priv) 3083337744aSKuninori Morimoto { 3093337744aSKuninori Morimoto struct device *dev = rsnd_priv_to_dev(priv); 3103337744aSKuninori Morimoto struct rsnd_gen *gen; 311531eaf49SKuninori Morimoto int ret; 3123337744aSKuninori Morimoto 3133337744aSKuninori Morimoto gen = devm_kzalloc(dev, sizeof(*gen), GFP_KERNEL); 3143337744aSKuninori Morimoto if (!gen) { 3153337744aSKuninori Morimoto dev_err(dev, "GEN allocate failed\n"); 3163337744aSKuninori Morimoto return -ENOMEM; 3173337744aSKuninori Morimoto } 3183337744aSKuninori Morimoto 319531eaf49SKuninori Morimoto priv->gen = gen; 320072188b6SKuninori Morimoto 321531eaf49SKuninori Morimoto if (rsnd_is_gen1(priv)) { 322531eaf49SKuninori Morimoto ret = rsnd_gen1_probe(pdev, info, priv); 323531eaf49SKuninori Morimoto } else { 324072188b6SKuninori Morimoto dev_err(dev, "unknown generation R-Car sound device\n"); 325072188b6SKuninori Morimoto return -ENODEV; 326072188b6SKuninori Morimoto } 327072188b6SKuninori Morimoto 328531eaf49SKuninori Morimoto return ret; 3293337744aSKuninori Morimoto } 3303337744aSKuninori Morimoto 3313337744aSKuninori Morimoto void rsnd_gen_remove(struct platform_device *pdev, 3323337744aSKuninori Morimoto struct rsnd_priv *priv) 3333337744aSKuninori Morimoto { 3343337744aSKuninori Morimoto } 335