Primeira contribuição (tentativa) para o kernel

Para o primeiro problema, fiz a seguinte alteração na função static int ads1119_debugfs_reg_access:

+       if (!iio_device_claim_direct(indio_dev))
+               return -EBUSY;
    

O que eu achava que era um problema simples e direto se transformou numa discussão entre maintainers. Eles começaram a me questionar se essa mudança era realmente útil e me jogaram um monte de perguntas sobre detalhes ultraespecíficos do subsistema IIO — e eu simplesmente não fazia a menor ideia do que estavam falando.

Segunda contribuição (tentativa rs) para o kernel

Nessa segunda tentativa, apenas extraí uma parte repetida da função e transformei em uma função separada. Também renomeei algumas variáveis para deixá-las mais claras.

+static int apds9306_get_thresh_reg(int dir)
        {
       -       int var, ret;
       -       u8 buff[3];
       -
               if (dir == IIO_EV_DIR_RISING)
       -               var = APDS9306_ALS_THRES_UP_0_REG;
       +               return APDS9306_ALS_THRES_UP_0_REG;
               else if (dir == IIO_EV_DIR_FALLING)
       -               var = APDS9306_ALS_THRES_LOW_0_REG;
       +               return APDS9306_ALS_THRES_LOW_0_REG;
               else
                       return -EINVAL;
       +}
           
    
    
    
       +static int apds9306_event_thresh_get(struct apds9306_data *data, int dir,
       +                                    int *val)
       +{
       +       int reg, ret;
       +       u8 buff[3];
       
       -       ret = regmap_bulk_read(data->regmap, var, buff, sizeof(buff));
       +       reg = apds9306_get_thresh_reg(dir);
       +       if (reg < 0)
       +               return reg;
       +
       +       ret = regmap_bulk_read(data->regmap, reg, buff, sizeof(buff));
               if (ret)
                       return ret;
       }
    
    
    


       @@ -769,22 +776,19 @@ static int apds9306_event_thresh_get(struct apds9306_data *data, int dir,
 static int apds9306_event_thresh_set(struct apds9306_data *data, int dir,
                                     int val)
 {
-       int var;
+       int reg;
        u8 buff[3];

-       if (dir == IIO_EV_DIR_RISING)
-               var = APDS9306_ALS_THRES_UP_0_REG;
-       else if (dir == IIO_EV_DIR_FALLING)
-               var = APDS9306_ALS_THRES_LOW_0_REG;
-       else
-               return -EINVAL;
+       reg = apds9306_get_thresh_reg(dir);
+       if (reg < 0)

+               return reg;

        if (!in_range(val, 0, APDS9306_ALS_THRES_VAL_MAX))
                return -EINVAL;

        put_unaligned_le24(val, buff);

-       return regmap_bulk_write(data->regmap, var, buff, sizeof(buff));
+       return regmap_bulk_write(data->regmap, reg, buff, sizeof(buff));
 }
    
    
    
    
    

O feedback foi mais amigável (dessa vez o reviewer era o Marcelo Schmitt). Ele apontou alguns erros na minha função, incluindo o fato de que ela adicionava uma comparação desnecessária. OK, justo.

Mas aí… veio outro maintainer com o seguinte comentário:

“Existe um return com mais de um espaço em branco.”

Detalhe: minha alteração tinha 5 returns diferentes. Então eu simplesmente ignorei essa mensagem achando que o maintainer estava com mal vontade de dar um feedback decente .

Corrigi tudo, enviei a versão 2. E adivinha? O mesmo cara apontou de novo o mesmo return. A essa altura, eu já estava questionando minha sanidade.

30 minutos depois, percebi minha burrice. Era só clicar no bendito símbolo de três pontinhos (“⋯”) acima da mensagem dele — isso expandia o trecho exato com o return com dois espaços em branco. Foi nesse momento que percebi que o buraco era mais embaixo.

Pra finalizar com chave de ouro: fui tentar enviar a versão 3... mas por algum motivo (talvez um bug do kw send-patch), meu patch V3 foi enviado como resposta do patch V2. Depois disso, ninguém nunca mais me respondeu.

Acho que os maintainers riram da minha cara e decidiram nunca mais perder tempo com a minha "contribuição tão útil".