[alsa-devel] Need help with WM8960
Timur Tabi
timur at freescale.com
Thu Sep 13 17:44:51 CEST 2012
Timur Tabi wrote:
> Also, how do I get the platform data to the codec driver? Do I need to
> create some arch code that reads the device tree properties and parses
> them into a wm8960_data object, and then (somehow) injects that into the
> wm8960 driver?
So, I'm guessing that there is no magical way to inject platform data into
an OF-initialized driver. What do you think about this patch:
@@ -1029,6 +1030,7 @@ static const struct regmap_config wm8960_regmap = {
static __devinit int wm8960_i2c_probe(struct i2c_client *i2c,
const struct i2c_device_id *id)
{
+ struct device_node *np = i2c->dev.of_node;
struct wm8960_data *pdata = dev_get_platdata(&i2c->dev);
struct wm8960_priv *wm8960;
int ret;
@@ -1038,6 +1040,31 @@ static __devinit int wm8960_i2c_probe(struct
i2c_client *i2c,
if (wm8960 == NULL)
return -ENOMEM;
+ /*
+ * Are we running on an OF platform? If so, then parse the device
+ * tree node for properties and create the platform data object
+ * ourselves.
+ */
+ if (np && !pdata) {
+ const __be32 *iprop;
+ int len;
+
+ pdata = devm_kzalloc(&i2c->dev, sizeof(struct wm8960_data),
+ GFP_KERNEL);
+ if (!pdata)
+ return -ENOMEM;
+
+ if (of_find_property(np, "wlf,capless", NULL))
+ pdata->capless = true;
+
+ iprop = of_get_property(np, "wlf,discharge-resistance", &len);
+ if (iprop && len == sizeof(uint32_t))
+ pdata->dres = be32_to_cpup(iprop);
+
+ if (of_find_property(np, "wlf,shared-lrclk", NULL))
+ pdata->shared_lrclk = true;
+
+ i2c->dev.platform_data = pdata;
+ }
+
wm8960->regmap = regmap_init_i2c(i2c, &wm8960_regmap);
if (IS_ERR(wm8960->regmap))
return PTR_ERR(wm8960->regmap);
--
Timur Tabi
Linux kernel developer at Freescale
More information about the Alsa-devel
mailing list